[N.name], "
var/atom/disk_loc = N.loc
while(!istype(disk_loc, /turf))
diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm
index c1aec2bcf8..245296084c 100644
--- a/code/game/antagonist/outsider/ert.dm
+++ b/code/game/antagonist/outsider/ert.dm
@@ -25,7 +25,8 @@ var/datum/antagonist/ert/ert
initial_spawn_req = 5
initial_spawn_target = 7
- can_use_aooc = FALSE // They're the good guys.
+ can_hear_aooc = FALSE // They're the good guys.
+ can_speak_aooc = FALSE // Just in case the above var bugs, or gets touched.
/datum/antagonist/ert/create_default(var/mob/source)
var/mob/living/carbon/human/M = ..()
diff --git a/code/game/antagonist/outsider/trader.dm b/code/game/antagonist/outsider/trader.dm
index 9603b49523..69af3883b9 100644
--- a/code/game/antagonist/outsider/trader.dm
+++ b/code/game/antagonist/outsider/trader.dm
@@ -24,7 +24,7 @@ var/datum/antagonist/trader/traders
initial_spawn_req = 5
initial_spawn_target = 7
- can_use_aooc = FALSE // They're not real antags.
+ can_speak_aooc = FALSE // They're not real antags.
/datum/antagonist/trader/create_default(var/mob/source)
var/mob/living/carbon/human/M = ..()
diff --git a/code/game/antagonist/station/infiltrator.dm b/code/game/antagonist/station/infiltrator.dm
index 8ca6f4ac4d..b51e7e74fb 100644
--- a/code/game/antagonist/station/infiltrator.dm
+++ b/code/game/antagonist/station/infiltrator.dm
@@ -13,6 +13,7 @@ var/datum/antagonist/traitor/infiltrator/infiltrators
welcome_text = "To speak on your team's private channel, use :t."
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director")
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
+ can_speak_aooc = TRUE
/datum/antagonist/traitor/infiltrator/New()
..()
diff --git a/code/game/antagonist/station/renegade.dm b/code/game/antagonist/station/renegade.dm
index 6f7ec89322..3e8afae32d 100644
--- a/code/game/antagonist/station/renegade.dm
+++ b/code/game/antagonist/station/renegade.dm
@@ -17,7 +17,7 @@ var/datum/antagonist/renegade/renegades
Think through your actions and make the roleplay immersive! Please remember all \
rules aside from those without explicit exceptions apply to antagonists."
flags = ANTAG_SUSPICIOUS | ANTAG_IMPLANT_IMMUNE | ANTAG_RANDSPAWN | ANTAG_VOTABLE
- can_use_aooc = FALSE
+ can_speak_aooc = FALSE // They aren't 'true' antags, but they still need to hear blanket antag instructions
hard_cap = 8
hard_cap_round = 12
@@ -61,8 +61,6 @@ var/datum/antagonist/renegade/renegades
list(/obj/item/weapon/gun/projectile/luger,/obj/item/weapon/gun/projectile/luger/brown)
)
- can_use_aooc = FALSE // They aren't 'true' antags.
-
/datum/antagonist/renegade/New()
..()
renegades = src
diff --git a/code/game/antagonist/station/thug.dm b/code/game/antagonist/station/thug.dm
index 8810fca7d0..61d92e1646 100644
--- a/code/game/antagonist/station/thug.dm
+++ b/code/game/antagonist/station/thug.dm
@@ -15,4 +15,4 @@ var/datum/antagonist/thug/thugs
Think through your actions and make the roleplay immersive! Please remember all \
rules aside from those with explicit exceptions apply to antagonists."
flags = ANTAG_SUSPICIOUS | ANTAG_IMPLANT_IMMUNE | ANTAG_RANDSPAWN | ANTAG_VOTABLE
- can_use_aooc = FALSE
+ can_speak_aooc = FALSE
diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm
index d0a1f54ed2..3681cf236d 100644
--- a/code/game/antagonist/station/traitor.dm
+++ b/code/game/antagonist/station/traitor.dm
@@ -5,7 +5,7 @@ var/datum/antagonist/traitor/traitors
id = MODE_TRAITOR
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director")
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
- can_use_aooc = FALSE
+ can_speak_aooc = FALSE // If they want to plot and plan as this sort of traitor, they'll need to do it ICly.
/datum/antagonist/traitor/auto
id = MODE_AUTOTRAITOR
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
old mode 100755
new mode 100644
index 337adfb7a3..c7f64f225c
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -28,10 +28,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
power_light = 0
power_equip = 0
power_environ = 0
- ambience = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/main.ogg','sound/music/traitor.ogg','sound/ambience/serspaceamb1.ogg')
base_turf = /turf/space
+ ambience = AMBIENCE_SPACE
-area/space/atmosalert()
+/area/space/atmosalert()
return
/area/space/fire_alert()
@@ -74,6 +74,7 @@ area/space/atmosalert()
/area/shuttle/arrival
name = "\improper Arrival Shuttle"
+ ambience = AMBIENCE_ARRIVALS
/area/shuttle/arrival/pre_game
icon_state = "shuttle2"
@@ -81,6 +82,7 @@ area/space/atmosalert()
/area/shuttle/arrival/station
icon_state = "shuttle"
dynamic_lighting = 0
+ ambience = AMBIENCE_ARRIVALS
/area/shuttle/escape
name = "\improper Emergency Shuttle"
@@ -384,9 +386,11 @@ area/space/atmosalert()
/area/centcom/terminal
name = "\improper Docking Terminal"
icon_state = "centcom_dock"
+ ambience = AMBIENCE_ARRIVALS
/area/centcom/tram
name = "\improper Tram Station"
+ ambience = AMBIENCE_ARRIVALS
/area/centcom/security
name = "\improper CentCom Security"
@@ -399,6 +403,7 @@ area/space/atmosalert()
/area/centcom/command
name = "\improper CentCom Command" //Central Command Command totally isn't RAS Syndrome in action.
icon_state = "centcom_command"
+ ambience = AMBIENCE_HIGHSEC
/area/centcom/main_hall
name = "\improper Main Hallway"
@@ -423,6 +428,7 @@ area/space/atmosalert()
icon_state = "syndie-ship"
requires_power = 0
dynamic_lighting = 0
+ ambience = AMBIENCE_HIGHSEC
/area/syndicate_mothership/control
name = "\improper Mercenary Control Room"
@@ -451,20 +457,6 @@ area/space/atmosalert()
icon_state = "cave"
sound_env = SMALL_ENCLOSED
-
-
-
-
-
-
-
-
-
-
-
-
-
-
/area/planet/clown
name = "\improper Clown Planet"
icon_state = "honk"
@@ -502,6 +494,7 @@ area/space/atmosalert()
requires_power = 0
flags = RAD_SHIELDED
base_turf = /turf/space
+ ambience = AMBIENCE_HIGHSEC
/area/syndicate_station/start
name = "\improper Mercenary Forward Operating Base"
@@ -556,12 +549,14 @@ area/space/atmosalert()
icon_state = "yellow"
requires_power = 0
dynamic_lighting = 0
+ ambience = AMBIENCE_OTHERWORLDLY
/area/skipjack_station
name = "\improper Skipjack"
icon_state = "yellow"
requires_power = 0
base_turf = /turf/space
+ ambience = AMBIENCE_HIGHSEC
/area/skipjack_station/start
name = "\improper Skipjack"
@@ -595,6 +590,7 @@ area/space/atmosalert()
/area/prison
name = "\improper Prison Station"
icon_state = "brig"
+ ambience = AMBIENCE_HIGHSEC
/area/prison/arrival_airlock
name = "\improper Prison Station Airlock"
@@ -678,12 +674,16 @@ area/space/atmosalert()
//SPACE STATION 13//
////////////////////
+/area
+ ambience = AMBIENCE_GENERIC
+
//Maintenance
/area/maintenance
flags = RAD_SHIELDED
sound_env = TUNNEL_ENCLOSED
turf_initializer = new /datum/turf_initializer/maintenance()
+ ambience = AMBIENCE_MAINTENANCE
/area/maintenance/aft
name = "Aft Maintenance"
@@ -906,13 +906,11 @@ area/space/atmosalert()
/area/maintenance/substation/security // Security, Brig, Permabrig, etc.
name = "Security Substation"
-
-
-
//Hallway
/area/hallway/primary/
sound_env = LARGE_ENCLOSED
+ ambience = AMBIENCE_GENERIC
/area/hallway/primary/fore
name = "\improper Fore Primary Hallway"
@@ -1115,12 +1113,13 @@ area/space/atmosalert()
name = "\improper Research Server Room"
icon_state = "server"
-//Crew
+//Civilian
/area/crew_quarters
name = "\improper Dormitories"
icon_state = "Sleep"
flags = RAD_SHIELDED
+ ambience = AMBIENCE_GENERIC
/area/crew_quarters/toilet
name = "\improper Dormitory Toilets"
@@ -1379,10 +1378,12 @@ area/space/atmosalert()
name = "\improper Library Conference Room"
icon_state = "library_conference_room"
+/area/chapel
+ ambience = AMBIENCE_CHAPEL
+
/area/chapel/main
name = "\improper Chapel"
icon_state = "chapel"
- ambience = list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/music/traitor.ogg')
sound_env = LARGE_ENCLOSED
/area/chapel/office
@@ -1486,7 +1487,7 @@ area/space/atmosalert()
/area/engineering/
name = "\improper Engineering"
icon_state = "engineering"
- ambience = list('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg')
+ ambience = AMBIENCE_ENGINEERING
/area/engineering/atmos
name = "\improper Atmospherics"
@@ -1570,6 +1571,7 @@ area/space/atmosalert()
requires_power = 1
always_unpowered = 1
dynamic_lighting = 0
+ ambience = AMBIENCE_SPACE
auxport
name = "\improper Fore Port Solar Array"
@@ -1655,7 +1657,6 @@ area/space/atmosalert()
name = "\improper AI Satellite Teleporter Room"
icon_state = "teleporter"
music = "signal"
- ambience = list('sound/ambience/ambimalf.ogg')
//MedBay
@@ -1765,7 +1766,6 @@ area/space/atmosalert()
/area/medical/morgue
name = "\improper Morgue"
icon_state = "morgue"
- ambience = list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg','sound/music/main.ogg')
/area/medical/chemistry
name = "\improper Chemistry"
@@ -1866,6 +1866,7 @@ area/space/atmosalert()
/area/security/armoury
name = "\improper Security - Armory"
icon_state = "armory"
+ ambience = AMBIENCE_HIGHSEC
/area/security/briefing_room
name = "\improper Security - Briefing Room"
@@ -1923,6 +1924,7 @@ area/space/atmosalert()
/area/security/tactical
name = "\improper Security - Tactical Equipment"
icon_state = "Tactical"
+ ambience = AMBIENCE_HIGHSEC
/*
@@ -1945,6 +1947,7 @@ area/space/atmosalert()
/area/security/nuke_storage
name = "\improper Vault"
icon_state = "nuke_storage"
+ ambience = AMBIENCE_HIGHSEC
/area/security/checkpoint
name = "\improper Security Checkpoint"
@@ -1953,6 +1956,7 @@ area/space/atmosalert()
/area/security/checkpoint2
name = "\improper Security - Arrival Checkpoint"
icon_state = "security"
+ ambience = AMBIENCE_ARRIVALS
/area/security/checkpoint/supply
name = "Security Post - Cargo Bay"
@@ -1978,6 +1982,24 @@ area/space/atmosalert()
name = "\improper Vacant Office"
icon_state = "security"
+/area/janitor/
+ name = "\improper Custodial Closet"
+ icon_state = "janitor"
+
+/area/hydroponics
+ name = "\improper Hydroponics"
+ icon_state = "hydro"
+
+/area/hydroponics/cafegarden
+ name = "\improper Cafeteria Garden"
+ icon_state = "cafe_garden"
+
+/area/hydroponics/garden
+ name = "\improper Garden"
+ icon_state = "garden"
+
+// SUPPLY
+
/area/quartermaster
name = "\improper Quartermasters"
icon_state = "quart"
@@ -2011,23 +2033,20 @@ area/space/atmosalert()
name = "\improper Cargo Mining Dock"
icon_state = "mining"
-/area/janitor/
- name = "\improper Custodial Closet"
- icon_state = "janitor"
+/area/supply/station
+ name = "Supply Shuttle"
+ icon_state = "shuttle3"
+ requires_power = 0
+ base_turf = /turf/space
-/area/hydroponics
- name = "\improper Hydroponics"
- icon_state = "hydro"
+/area/supply/dock
+ name = "Supply Shuttle"
+ icon_state = "shuttle3"
+ requires_power = 0
+ base_turf = /turf/space
-/area/hydroponics/cafegarden
- name = "\improper Cafeteria Garden"
- icon_state = "cafe_garden"
+// SCIENCE
-/area/hydroponics/garden
- name = "\improper Garden"
- icon_state = "garden"
-
-//rnd (Research and Development
/area/rnd/research
name = "\improper Research and Development"
icon_state = "research"
@@ -2168,16 +2187,19 @@ area/space/atmosalert()
/area/djstation
name = "\improper Listening Post"
icon_state = "LP"
+ ambience = AMBIENCE_TECH_RUINS
/area/djstation/solars
name = "\improper Listening Post Solars"
icon_state = "LPS"
+ ambience = AMBIENCE_TECH_RUINS
//DERELICT
/area/derelict
name = "\improper Derelict Station"
icon_state = "storage"
+ ambience = AMBIENCE_RUINS
/area/derelict/hallway/primary
name = "\improper Derelict Primary Hallway"
@@ -2376,6 +2398,7 @@ area/space/atmosalert()
/area/ai_monitored/storage/secure
name = "Secure Storage"
icon_state = "storage"
+ ambience = AMBIENCE_HIGHSEC
/area/ai_monitored/storage/emergency
name = "Emergency Storage"
@@ -2388,74 +2411,85 @@ area/space/atmosalert()
/area/ai_upload
name = "\improper AI Upload Chamber"
icon_state = "ai_upload"
- ambience = list('sound/ambience/ambimalf.ogg')
+ ambience = AMBIENCE_AI
/area/ai_upload_foyer
name = "AI Upload Access"
icon_state = "ai_foyer"
- ambience = list('sound/ambience/ambimalf.ogg')
sound_env = SMALL_ENCLOSED
+ ambience = AMBIENCE_AI
/area/ai_server_room
name = "Messaging Server Room"
icon_state = "ai_server"
sound_env = SMALL_ENCLOSED
+ ambience = AMBIENCE_AI
/area/ai
name = "\improper AI Chamber"
icon_state = "ai_chamber"
- ambience = list('sound/ambience/ambimalf.ogg')
+ ambience = AMBIENCE_AI
/area/ai_cyborg_station
name = "\improper Cyborg Station"
icon_state = "ai_cyborg"
sound_env = SMALL_ENCLOSED
+ ambience = AMBIENCE_AI
/area/aisat
name = "\improper AI Satellite"
icon_state = "ai"
+ ambience = AMBIENCE_AI
/area/aisat_interior
name = "\improper AI Satellite"
icon_state = "ai"
+ ambience = AMBIENCE_AI // The lack of inheritence hurts my soul.
/area/AIsatextFP
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
dynamic_lighting = 0
+ ambience = AMBIENCE_AI
/area/AIsatextFS
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
dynamic_lighting = 0
+ ambience = AMBIENCE_AI
/area/AIsatextAS
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
dynamic_lighting = 0
+ ambience = AMBIENCE_AI
/area/AIsatextAP
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
dynamic_lighting = 0
+ ambience = AMBIENCE_AI
/area/NewAIMain
name = "\improper AI Main New"
icon_state = "storage"
+ ambience = AMBIENCE_AI
//Misc
-
+/area/wreck
+ ambience = AMBIENCE_RUINS
/area/wreck/ai
name = "\improper AI Chamber"
icon_state = "ai"
+ ambience = AMBIENCE_TECH_RUINS
/area/wreck/main
name = "\improper Wreck"
@@ -2464,10 +2498,12 @@ area/space/atmosalert()
/area/wreck/engineering
name = "\improper Power Room"
icon_state = "engine"
+ ambience = AMBIENCE_TECH_RUINS
/area/wreck/bridge
name = "\improper Bridge"
icon_state = "bridge"
+ ambience = AMBIENCE_TECH_RUINS
/area/generic
name = "Unknown"
@@ -2477,7 +2513,7 @@ area/space/atmosalert()
// Telecommunications Satellite
/area/tcommsat/
- ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+ ambience = AMBIENCE_ENGINEERING
/area/tcommsat/entrance
name = "\improper Telecomms Teleporter"
@@ -2490,22 +2526,22 @@ area/space/atmosalert()
/area/tcomsat
name = "\improper Telecomms Satellite"
icon_state = "tcomsatlob"
- ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+ ambience = AMBIENCE_ENGINEERING
/area/tcomfoyer
name = "\improper Telecomms Foyer"
icon_state = "tcomsatfoyer"
- ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+ ambience = AMBIENCE_ENGINEERING
/area/tcomwest
name = "\improper Telecommunications Satellite West Wing"
icon_state = "tcomsatwest"
- ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+ ambience = AMBIENCE_ENGINEERING
/area/tcomeast
name = "\improper Telecommunications Satellite East Wing"
icon_state = "tcomsateast"
- ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+ ambience = AMBIENCE_ENGINEERING
/area/tcommsat/computer
name = "\improper Telecomms Control Room"
@@ -2524,6 +2560,7 @@ area/space/atmosalert()
/area/awaymission
name = "\improper Strange Location"
icon_state = "away"
+ ambience = AMBIENCE_FOREBODING
/area/awaymission/example
name = "\improper Strange Station"
@@ -2617,56 +2654,6 @@ area/space/atmosalert()
luminosity = 1
dynamic_lighting = 0
requires_power = 0
- ambience = list()
- var/sound/mysound = null
-
- New()
- ..()
- var/sound/S = new/sound()
- mysound = S
- S.file = 'sound/ambience/shore.ogg'
- S.repeat = 1
- S.wait = 0
- S.channel = 123
- S.volume = 100
- S.priority = 255
- S.status = SOUND_UPDATE
- process()
-
- Entered(atom/movable/Obj,atom/OldLoc)
- if(ismob(Obj))
- if(Obj:client)
- mysound.status = SOUND_UPDATE
- Obj << mysound
- return
-
- Exited(atom/movable/Obj)
- if(ismob(Obj))
- if(Obj:client)
- mysound.status = SOUND_PAUSED | SOUND_UPDATE
- Obj << mysound
-
- proc/process()
- set background = 1
-
- var/sound/S = null
- var/sound_delay = 0
- if(prob(25))
- S = sound(file=pick('sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag3.ogg'), volume=100)
- sound_delay = rand(0, 50)
-
- for(var/mob/living/carbon/human/H in src)
- if(H.s_tone > -55)
- H.s_tone--
- H.update_icons_body()
- if(H.client)
- mysound.status = SOUND_UPDATE
- H << mysound
- if(S)
- spawn(sound_delay)
- H << S
-
- spawn(60) .()
/////////////////////////////////////////////////////////////////////
/*
@@ -2739,53 +2726,3 @@ var/list/the_station_areas = list (
luminosity = 1
dynamic_lighting = 0
requires_power = 0
- var/sound/mysound = null
-/*
- New()
- ..()
- var/sound/S = new/sound()
- mysound = S
- S.file = 'sound/ambience/shore.ogg'
- S.repeat = 1
- S.wait = 0
- S.channel = 123
- S.volume = 100
- S.priority = 255
- S.status = SOUND_UPDATE
- process()
-
- Entered(atom/movable/Obj,atom/OldLoc)
- if(ismob(Obj))
- if(Obj:client)
- mysound.status = SOUND_UPDATE
- Obj << mysound
- return
-
- Exited(atom/movable/Obj)
- if(ismob(Obj))
- if(Obj:client)
- mysound.status = SOUND_PAUSED | SOUND_UPDATE
- Obj << mysound
-
- proc/process()
- set background = 1
-
- var/sound/S = null
- var/sound_delay = 0
- if(prob(25))
- S = sound(file=pick('sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag3.ogg'), volume=100)
- sound_delay = rand(0, 50)
-
- for(var/mob/living/carbon/human/H in src)
-// if(H.s_tone > -55) //ugh...nice/novel idea but please no.
-// H.s_tone--
-// H.update_icons_body()
- if(H.client)
- mysound.status = SOUND_UPDATE
- H << mysound
- if(S)
- spawn(sound_delay)
- H << S
-
- spawn(60) .()
-*/
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index c7a653a4c3..31f6da1603 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -35,7 +35,7 @@
// var/list/lights // list of all lights on this area
var/list/all_doors = null //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area
var/firedoors_closed = 0
- var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
+ var/list/ambience = list()
var/list/forced_ambience = null
var/sound_env = STANDARD_STATION
var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf
@@ -285,10 +285,6 @@ var/list/mob/living/forced_ambiance_list = new
L << sound(null, channel = CHANNEL_AMBIENCE_FORCED)
forced_ambiance_list -= L
- if(!L.client.ambience_playing)
- L.client.ambience_playing = 1
- L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_AMBIENCE)
-
if(forced_ambience)
if(forced_ambience.len)
forced_ambiance_list |= L
@@ -299,10 +295,10 @@ var/list/mob/living/forced_ambiance_list = new
else
L << sound(null, channel = CHANNEL_AMBIENCE_FORCED)
else if(src.ambience.len && prob(35))
- if((world.time >= L.client.played + 600))
+ if((world.time >= L.client.time_last_ambience_played + 1 MINUTE))
var/sound = pick(ambience)
- L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE)
- L.client.played = world.time
+ L << sound(sound, repeat = 0, wait = 0, volume = 50, channel = CHANNEL_AMBIENCE)
+ L.client.time_last_ambience_played = world.time
/area/proc/gravitychange(var/gravitystate = 0, var/area/A)
A.has_gravity = gravitystate
@@ -373,7 +369,7 @@ var/list/mob/living/forced_ambiance_list = new
var/list/teleportlocs = list()
/hook/startup/proc/setupTeleportLocs()
- for(var/area/AR in world)
+ for(var/area/AR in all_areas)
if(istype(AR, /area/shuttle) || istype(AR, /area/syndicate_station) || istype(AR, /area/wizard_station)) continue
if(teleportlocs.Find(AR.name)) continue
var/turf/picked = pick(get_area_turfs(AR.type))
@@ -388,7 +384,7 @@ var/list/teleportlocs = list()
var/list/ghostteleportlocs = list()
/hook/startup/proc/setupGhostTeleportLocs()
- for(var/area/AR in world)
+ for(var/area/AR in all_areas)
if(ghostteleportlocs.Find(AR.name)) continue
if(istype(AR, /area/aisat) || istype(AR, /area/derelict) || istype(AR, /area/tdome) || istype(AR, /area/shuttle/specops/centcom))
ghostteleportlocs += AR.name
diff --git a/code/game/area/asteroid_areas.dm b/code/game/area/asteroid_areas.dm
index 66a7e86913..e5f22a77d7 100644
--- a/code/game/area/asteroid_areas.dm
+++ b/code/game/area/asteroid_areas.dm
@@ -2,28 +2,23 @@
/area/mine
icon_state = "mining"
- music = 'sound/ambience/song_game.ogg'
sound_env = ASTEROID
/area/mine/explored
name = "Mine"
icon_state = "explored"
- ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg')
/area/mine/unexplored
name = "Mine"
icon_state = "unexplored"
- ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg')
/area/mine/explored/upper_level
name = "Upper Level Mine"
icon_state = "explored"
- ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg')
/area/mine/unexplored/upper_level
name = "Upper Level Mine"
icon_state = "unexplored"
- ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg')
// OUTPOSTS
diff --git a/code/game/gamemodes/changeling/absorbed_dna.dm b/code/game/gamemodes/changeling/absorbed_dna.dm
index 3c23f0270c..26d433cd8c 100644
--- a/code/game/gamemodes/changeling/absorbed_dna.dm
+++ b/code/game/gamemodes/changeling/absorbed_dna.dm
@@ -5,12 +5,14 @@
var/list/languages
var/identifying_gender
var/list/flavour_texts
+ var/list/genMods
-/datum/absorbed_dna/New(var/newName, var/newDNA, var/newSpecies, var/newLanguages, var/newIdentifying_Gender, var/list/newFlavour)
+/datum/absorbed_dna/New(var/newName, var/newDNA, var/newSpecies, var/newLanguages, var/newIdentifying_Gender, var/list/newFlavour, var/list/newGenMods)
..()
name = newName
dna = newDNA
speciesName = newSpecies
languages = newLanguages
identifying_gender = newIdentifying_Gender
- flavour_texts = newFlavour ? newFlavour.Copy() : null
\ No newline at end of file
+ flavour_texts = newFlavour ? newFlavour.Copy() : null
+ genMods = newGenMods ? newGenMods.Copy() : null
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index f76fd5ca47..45b230b00c 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -78,7 +78,7 @@
src << "We can now re-adapt, reverting our evolution so that we may start anew, if needed."
- var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages, T.identifying_gender, T.flavor_texts)
+ var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages, T.identifying_gender, T.flavor_texts, T.modifiers)
absorbDNA(newDNA)
if(T.mind && T.mind.changeling)
diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm
index 9225792575..6dd16061a1 100644
--- a/code/game/gamemodes/changeling/powers/transform.dm
+++ b/code/game/gamemodes/changeling/powers/transform.dm
@@ -48,6 +48,13 @@
src.UpdateAppearance()
domutcheck(src, null)
changeling_update_languages(changeling.absorbed_languages)
+ if(chosen_dna.genMods)
+ var/mob/living/carbon/human/self = src
+ for(var/datum/modifier/mod in self.modifiers)
+ self.modifiers.Remove(mod.type)
+
+ for(var/datum/modifier/mod in chosen_dna.genMods)
+ self.modifiers.Add(mod.type)
src.verbs -= /mob/proc/changeling_transform
spawn(10)
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 9d8eb8dc91..082404b271 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -84,7 +84,6 @@
/obj/item/clothing/suit/cultrobes/alt
icon_state = "cultrobesalt"
- item_state = "cultrobes"
/obj/item/clothing/suit/cultrobes/magusred
name = "magus robes"
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index d91e2e1f47..0bc165adff 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -319,7 +319,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
runerandom()
if(iscultist(user))
var/C = 0
- for(var/obj/effect/rune/N in world)
+ for(var/obj/effect/rune/N in rune_list)
C++
if (!istype(user.loc,/turf))
user << "You do not have enough space to write a proper rune."
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index d7579698d1..40008c5ecc 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -21,7 +21,7 @@ var/list/sacrificed = list()
allrunesloc = new/list()
var/index = 0
// var/tempnum = 0
- for(var/obj/effect/rune/R in world)
+ for(var/obj/effect/rune/R in rune_list)
if(R == src)
continue
if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && isPlayerLevel(R.z))
@@ -59,7 +59,7 @@ var/list/sacrificed = list()
var/runecount = 0
var/obj/effect/rune/IP = null
var/mob/living/user = usr
- for(var/obj/effect/rune/R in world)
+ for(var/obj/effect/rune/R in rune_list)
if(R == src)
continue
if(R.word1 == cultwords["travel"] && R.word2 == cultwords["other"] && R.word3 == key)
@@ -243,7 +243,7 @@ var/list/sacrificed = list()
drain()
var/drain = 0
- for(var/obj/effect/rune/R in world)
+ for(var/obj/effect/rune/R in rune_list)
if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"])
for(var/mob/living/carbon/D in R.loc)
if(D.stat!=2)
@@ -343,7 +343,7 @@ var/list/sacrificed = list()
is_sacrifice_target = 0
find_sacrifice:
- for(var/obj/effect/rune/R in world)
+ for(var/obj/effect/rune/R in rune_list)
if(R.word1==cultwords["blood"] && R.word2==cultwords["join"] && R.word3==cultwords["hell"])
for(var/mob/living/carbon/human/N in R.loc)
if(cult && N.mind && N.mind == cult.sacrifice_target)
@@ -374,7 +374,7 @@ var/list/sacrificed = list()
sleep(10 SECONDS)
if(corpse_to_raise.client)
-
+
var/datum/gender/TU = gender_datums[corpse_to_raise.get_visible_gender()]
var/datum/gender/TT = gender_datums[body_to_sacrifice.get_visible_gender()]
@@ -1049,7 +1049,7 @@ var/list/sacrificed = list()
if(iscultist(C) && !C.stat)
culcount++
if(culcount >= 5)
- for(var/obj/effect/rune/R in world)
+ for(var/obj/effect/rune/R in rune_list)
if(R.blood_DNA == src.blood_DNA)
for(var/mob/living/M in orange(2,R))
M.take_overall_damage(0,15)
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index 0169cd3f00..fafae070ec 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -54,11 +54,7 @@
if(3) //Leaving the code in so someone can try and delag it, but this event can no longer occur randomly, per SoS's request. --NEO
command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert")
world << sound('sound/AI/spanomalies.ogg')
- var/list/turfs = new
var/turf/picked
- for(var/turf/simulated/floor/T in world)
- if(T.z in station_levels)
- turfs += T
for(var/turf/simulated/floor/T in turfs)
if(prob(20))
spawn(50+rand(0,3000))
@@ -135,12 +131,12 @@ var/hadevent = 0
spawncount--
spawn(rand(5000, 6000)) //Delayed announcements to keep the crew on their toes.
- 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')
+ command_announcement.Announce("Unidentified lifesigns detected coming aboard \the [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
/proc/high_radiation_event()
/* // Haha, this is way too laggy. I'll keep the prison break though.
- for(var/obj/machinery/light/L in world)
+ for(var/obj/machinery/light/L in machines)
if(isNotStationLevel(L.z)) continue
L.flicker(50)
@@ -164,7 +160,7 @@ var/hadevent = 0
randmutg(H)
domutcheck(H,null,MUTCHK_FORCED)
sleep(100)
- command_announcement.Announce("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg')
+ command_announcement.Announce("High levels of radiation detected near \the [station_name()]. Please report to the Med-bay if you feel strange.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg')
@@ -173,7 +169,7 @@ var/hadevent = 0
var/list/area/areas = list()
- for(var/area/A in world)
+ for(var/area/A in all_areas)
if(istype(A, /area/security/prison) || istype(A, /area/security/brig))
areas += A
@@ -213,7 +209,7 @@ var/hadevent = 0
new /mob/living/simple_animal/hostile/carp(C.loc)
//sleep(100)
spawn(rand(300, 600)) //Delayed announcements to keep the crew on their toes.
- command_announcement.Announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert", new_sound = 'sound/AI/commandreport.ogg')
+ command_announcement.Announce("Unknown biological entities have been detected near \the [station_name()], please stand-by.", "Lifesign Alert", new_sound = 'sound/AI/commandreport.ogg')
/proc/lightsout(isEvent = 0, lightsoutAmount = 1,lightsoutRange = 25) //leave lightsoutAmount as 0 to break ALL lights
if(isEvent)
@@ -366,21 +362,21 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
spawn(0)
world << "Started processing APCs"
- for (var/obj/machinery/power/apc/APC in world)
+ for (var/obj/machinery/power/apc/APC in machines)
if(APC.z in station_levels)
APC.ion_act()
apcnum++
world << "Finished processing APCs. Processed: [apcnum]"
spawn(0)
world << "Started processing SMES"
- for (var/obj/machinery/power/smes/SMES in world)
+ for (var/obj/machinery/power/smes/SMES in machines)
if(SMES.z in station_levels)
SMES.ion_act()
smesnum++
world << "Finished processing SMES. Processed: [smesnum]"
spawn(0)
world << "Started processing AIRLOCKS"
- for (var/obj/machinery/door/airlock/D in world)
+ for (var/obj/machinery/door/airlock/D in machines)
if(D.z in station_levels)
//if(length(D.req_access) > 0 && !(12 in D.req_access)) //not counting general access and maintenance airlocks
airlocknum++
@@ -389,7 +385,7 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
world << "Finished processing AIRLOCKS. Processed: [airlocknum]"
spawn(0)
world << "Started processing FIREDOORS"
- for (var/obj/machinery/door/firedoor/D in world)
+ for (var/obj/machinery/door/firedoor/D in machines)
if(D.z in station_levels)
firedoornum++;
spawn(0)
diff --git a/code/game/gamemodes/events/power_failure.dm b/code/game/gamemodes/events/power_failure.dm
index baba0ea4bb..2cd257e0bb 100644
--- a/code/game/gamemodes/events/power_failure.dm
+++ b/code/game/gamemodes/events/power_failure.dm
@@ -5,7 +5,7 @@
var/list/skipped_areas = list(/area/ai)
- for(var/obj/machinery/power/smes/S in world)
+ for(var/obj/machinery/power/smes/S in machines)
var/area/current_area = get_area(S)
if(current_area.type in skipped_areas || !(S.z in using_map.station_levels))
continue
@@ -19,7 +19,7 @@
S.power_change()
- for(var/obj/machinery/power/apc/C in world)
+ for(var/obj/machinery/power/apc/C in machines)
if(!C.is_critical && C.cell && (C.z in using_map.station_levels))
C.cell.charge = 0
@@ -28,10 +28,10 @@
if(announce)
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 world)
+ for(var/obj/machinery/power/apc/C in machines)
if(C.cell && (C.z in using_map.station_levels))
C.cell.charge = C.cell.maxcharge
- for(var/obj/machinery/power/smes/S in world)
+ for(var/obj/machinery/power/smes/S in machines)
var/area/current_area = get_area(S)
if(current_area.type in skipped_areas || isNotStationLevel(S.z))
continue
@@ -45,7 +45,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 world)
+ for(var/obj/machinery/power/smes/S in machines)
if(isNotStationLevel(S.z))
continue
S.charge = S.capacity
diff --git a/code/game/gamemodes/events/wormholes.dm b/code/game/gamemodes/events/wormholes.dm
index dd9e72ce08..cece3f67f9 100644
--- a/code/game/gamemodes/events/wormholes.dm
+++ b/code/game/gamemodes/events/wormholes.dm
@@ -1,7 +1,7 @@
/proc/wormhole_event()
spawn()
var/list/pick_turfs = list()
- for(var/turf/simulated/floor/T in world)
+ for(var/turf/simulated/floor/T in turfs)
if(T.z in using_map.station_levels)
pick_turfs += T
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
index dd809002e8..b8b15974db 100644
--- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
@@ -82,7 +82,7 @@
if(!target)
var/list/robots = list()
var/list/robot_names = list()
- for(var/mob/living/silicon/robot/R in world)
+ for(var/mob/living/silicon/robot/R in silicon_mob_list)
if(istype(R, /mob/living/silicon/robot/drone)) // No drones.
continue
if(R.connected_ai != user) // No robots linked to other AIs
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index f7233c1266..fd9653a323 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -37,7 +37,7 @@ var/list/nuke_disks = list()
..()
return
var/disk_rescued = 1
- for(var/obj/item/weapon/disk/nuclear/D in world)
+ for(var/obj/item/weapon/disk/nuclear/D in nuke_disks)
var/disk_area = get_area(D)
if(!is_type_in_list(disk_area, centcom_areas))
disk_rescued = 0
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index bd140c3061..f6e113c5b2 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -45,7 +45,7 @@
examine(mob/user)
..(user)
- for(var/obj/machinery/nuclearbomb/bomb in world)
+ for(var/obj/machinery/nuclearbomb/bomb in machines)
if(bomb.timing)
user << "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]"
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 5d5e3f1379..c458b9c00a 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -524,7 +524,7 @@ datum/objective/steal
if(istype(M, /mob/living/silicon/ai) && M.stat != 2) //See if any AI's are alive inside that card.
return 1
- for(var/mob/living/silicon/ai/ai in world)
+ for(var/mob/living/silicon/ai/ai in mob_list)
var/turf/T = get_turf(ai)
if(istype(T))
var/area/check_area = get_area(ai)
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index 6e9f040f5c..e919be9527 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -121,7 +121,7 @@ datum/hSB
var/obj/item/weapon/storage/hsb = new/obj/item/weapon/storage/toolbox/mechanical
for(var/obj/item/device/radio/T in hsb)
qdel(T)
- new/obj/item/weapon/crowbar (hsb)
+ new/obj/item/weapon/tool/crowbar (hsb)
hsb.loc = usr.loc
if("hsbmedkit")
var/obj/item/weapon/storage/firstaid/hsb = new/obj/item/weapon/storage/firstaid/regular
diff --git a/code/game/gamemodes/technomancer/spell_objs_helpers.dm b/code/game/gamemodes/technomancer/spell_objs_helpers.dm
index f11c027566..105b3b3e9c 100644
--- a/code/game/gamemodes/technomancer/spell_objs_helpers.dm
+++ b/code/game/gamemodes/technomancer/spell_objs_helpers.dm
@@ -31,7 +31,7 @@
return TRUE
/obj/item/weapon/spell/proc/within_range(var/atom/target, var/max_range = 7) // Beyond 7 is off the screen.
- if(range(get_dist(owner, target) <= max_range))
+ if(target in view(max_range, owner))
return TRUE
return FALSE
diff --git a/code/game/gamemodes/technomancer/spells/apportation.dm b/code/game/gamemodes/technomancer/spells/apportation.dm
index 9fafc47ae3..452ddc52fa 100644
--- a/code/game/gamemodes/technomancer/spells/apportation.dm
+++ b/code/game/gamemodes/technomancer/spells/apportation.dm
@@ -21,11 +21,13 @@
if(!AM.loc) //Don't teleport HUD telements to us.
return
if(AM.anchored)
- user << "\The [hit_atom] is firmly secured and anchored, you can't move it!"
+ to_chat(user, "\The [hit_atom] is firmly secured and anchored, you can't move it!")
return
+
if(!within_range(hit_atom) && !check_for_scepter())
- user << "\The [hit_atom] is too far away."
+ to_chat(user, "\The [hit_atom] is too far away.")
return
+
//Teleporting an item.
if(istype(hit_atom, /obj/item))
var/obj/item/I = hit_atom
@@ -47,7 +49,7 @@
//Now let's try to teleport a living mob.
else if(istype(hit_atom, /mob/living))
var/mob/living/L = hit_atom
- L << "You are teleported towards \the [user]."
+ to_chat(L, "You are teleported towards \the [user].")
var/datum/effect/effect/system/spark_spread/s1 = new /datum/effect/effect/system/spark_spread
var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/spark_spread
s1.set_up(2, 1, user)
@@ -60,7 +62,7 @@
spawn(1 SECOND)
if(!user.Adjacent(L))
- user << "\The [L] is out of your reach."
+ to_chat(user, "\The [L] is out of your reach.")
qdel(src)
return
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index c5c92c842f..598fb956f2 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -12,7 +12,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
- supervisors = "the head of personnel"
+ supervisors = "the Head of Personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/bartender
access = list(access_hydroponics, access_bar, access_kitchen)
@@ -44,7 +44,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
- supervisors = "the head of personnel"
+ supervisors = "the Head of Personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/chef
access = list(access_hydroponics, access_bar, access_kitchen)
@@ -74,7 +74,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 1
- supervisors = "the head of personnel"
+ supervisors = "the Head of Personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/botanist
access = list(access_hydroponics, access_bar, access_kitchen)
@@ -103,7 +103,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
- supervisors = "the head of personnel"
+ supervisors = "the Head of Personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/janitor
access = list(access_janitor, access_maint_tunnels)
@@ -119,7 +119,6 @@
/datum/alt_title/custodian
title = "Custodian"
- title_blurb = "Ahelp if you see this"
//////////////////////////////////
// Librarian
@@ -132,7 +131,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
- supervisors = "the head of personnel"
+ supervisors = "the Head of Personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/librarian
access = list(access_library, access_maint_tunnels)
@@ -167,7 +166,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
- supervisors = "the head of personnel"
+ supervisors = "the Head of Personnel"
selection_color = "#7a4f33"
idtype = /obj/item/weapon/card/id/cargo/head
economic_modifier = 5
@@ -198,7 +197,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
- supervisors = "the quartermaster and the head of personnel"
+ supervisors = "the Quartermaster and the Head of Personnel"
selection_color = "#9b633e"
idtype = /obj/item/weapon/card/id/cargo/cargo_tech
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
@@ -224,7 +223,7 @@
faction = "Station"
total_positions = 3
spawn_positions = 3
- supervisors = "the quartermaster and the head of personnel"
+ supervisors = "the Quartermaster and the Head of Personnel"
selection_color = "#9b633e"
idtype = /obj/item/weapon/card/id/cargo/mining
economic_modifier = 5
diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm
index 4fd38fd617..b35a83f066 100644
--- a/code/game/jobs/job/civilian_chaplain.dm
+++ b/code/game/jobs/job/civilian_chaplain.dm
@@ -7,7 +7,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
- supervisors = "the head of personnel"
+ supervisors = "the Head of Personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/chaplain
access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels)
@@ -158,5 +158,7 @@
feedback_set_details("religion_book","[new_book_style]")
return 1
+/* If you uncomment this, every time the mob preview updates it makes a new PDA. It seems to work just fine and display without it, so why this exists, haven't a clue. -Hawk
/datum/job/chaplain/equip_preview(var/mob/living/carbon/human/H, var/alt_title)
return equip(H, alt_title, FALSE)
+*/
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index a0faf97031..a3e09e8f75 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -50,7 +50,7 @@
faction = "Station"
total_positions = 5
spawn_positions = 5
- supervisors = "the chief engineer"
+ supervisors = "the Chief Engineer"
selection_color = "#5B4D20"
idtype = /obj/item/weapon/card/id/engineering/engineer
economic_modifier = 5
@@ -95,7 +95,7 @@
faction = "Station"
total_positions = 3
spawn_positions = 2
- supervisors = "the chief engineer"
+ supervisors = "the Chief Engineer"
selection_color = "#5B4D20"
idtype = /obj/item/weapon/card/id/engineering/atmos
economic_modifier = 5
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 4035a9d686..49bad27a0c 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -47,7 +47,7 @@
faction = "Station"
total_positions = 5
spawn_positions = 3
- supervisors = "the chief medical officer"
+ supervisors = "the Chief Medical Officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/doctor
economic_modifier = 7
@@ -69,7 +69,7 @@
/datum/alt_title/surgeon
title = "Surgeon"
- title_blurb = "A surgeon specializes in providing surgical aid to injured patients, up to and including amputation and limb re-attachement. They are expected \
+ title_blurb = "A Surgeon specializes in providing surgical aid to injured patients, up to and including amputation and limb re-attachement. They are expected \
to know the ins and outs of anesthesia and surgery."
title_outfit = /decl/hierarchy/outfit/job/medical/doctor/surgeon
@@ -105,7 +105,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
- supervisors = "the chief medical officer"
+ supervisors = "the Chief Medical Officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/chemist
economic_modifier = 5
@@ -138,7 +138,7 @@
faction = "Station"
total_positions = 0
spawn_positions = 0
- supervisors = "the chief medical officer and research director"
+ supervisors = "the Chief Medical Officer and Research Director"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/geneticist
economic_modifier = 7
@@ -166,7 +166,7 @@
total_positions = 1
spawn_positions = 1
economic_modifier = 5
- supervisors = "the chief medical officer"
+ supervisors = "the Chief Medical Officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/psychiatrist
access = list(access_medical, access_medical_equip, access_morgue, access_psychiatrist)
@@ -197,7 +197,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
- supervisors = "the chief medical officer"
+ supervisors = "the Chief Medical Officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/paramedic
economic_modifier = 4
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 2841b13642..76c8c34b4d 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -50,7 +50,7 @@
faction = "Station"
total_positions = 5
spawn_positions = 3
- supervisors = "the research director"
+ supervisors = "the Research Director"
selection_color = "#633D63"
idtype = /obj/item/weapon/card/id/science/scientist
economic_modifier = 7
@@ -97,7 +97,7 @@
faction = "Station"
total_positions = 3
spawn_positions = 2
- supervisors = "the research director"
+ supervisors = "the Research Director"
selection_color = "#633D63"
idtype = /obj/item/weapon/card/id/science/xenobiologist
economic_modifier = 7
@@ -131,7 +131,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
- supervisors = "research director"
+ supervisors = "the Research Director"
selection_color = "#633D63"
idtype = /obj/item/weapon/card/id/science/roboticist
economic_modifier = 5
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index af8c516b72..1f98905ac2 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -53,7 +53,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
- supervisors = "the head of security"
+ supervisors = "the Head of Security"
selection_color = "#601C1C"
idtype = /obj/item/weapon/card/id/security/warden
economic_modifier = 5
@@ -82,7 +82,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
- supervisors = "the head of security"
+ supervisors = "the Head of Security"
selection_color = "#601C1C"
idtype = /obj/item/weapon/card/id/security/detective
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks)
@@ -115,7 +115,7 @@
faction = "Station"
total_positions = 4
spawn_positions = 4
- supervisors = "the head of security"
+ supervisors = "the Head of Security"
selection_color = "#601C1C"
idtype = /obj/item/weapon/card/id/security/officer
economic_modifier = 4
diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm
index 118cc813d7..d9f6a8ad77 100644
--- a/code/game/jobs/job/silicon.dm
+++ b/code/game/jobs/job/silicon.dm
@@ -9,7 +9,7 @@
total_positions = 0 // Not used for AI, see is_position_available below and modules/mob/living/silicon/ai/latejoin.dm
spawn_positions = 1
selection_color = "#3F823F"
- supervisors = "your laws"
+ supervisors = "your Laws"
req_admin_notify = 1
minimal_player_age = 7
account_allowed = 0
@@ -54,7 +54,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
- supervisors = "your laws and the AI" //Nodrak
+ supervisors = "your Laws and the AI" //Nodrak
selection_color = "#254C25"
minimal_player_age = 1
account_allowed = 0
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index efd749e54d..da759a580e 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -379,7 +379,8 @@ var/global/datum/controller/occupations/job_master
H.amend_exploitable(G.path)
if(G.slot == "implant")
- H.implant_loadout(G)
+ var/obj/item/weapon/implant/I = G.spawn_item(H)
+ I.implant_loadout(H)
continue
if(G.slot && !(G.slot in custom_equip_slots))
@@ -420,6 +421,7 @@ var/global/datum/controller/occupations/job_master
H << "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator."
H.job = rank
+ log_game("JOINED [key_name(H)] as \"[rank]\"")
// If they're head, give them the account info for their department
if(H.mind && job.head_position)
diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm
index a6c161982d..659377281e 100644
--- a/code/game/machinery/CableLayer.dm
+++ b/code/game/machinery/CableLayer.dm
@@ -35,7 +35,7 @@
user << "You load [result] lengths of cable into [src]."
return
- if(istype(O, /obj/item/weapon/wirecutters))
+ if(O.is_wirecutter())
if(cable && cable.amount)
var/m = round(input(usr,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1)
m = min(m, cable.amount)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index b3657ba3d3..3fb9cc82e6 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -345,3 +345,9 @@
to_chat(user, "The subject has too many chemicals in their bloodstream.")
else
to_chat(user, "There's no suitable occupant in \the [src].")
+
+//Survival/Stasis sleepers
+/obj/machinery/sleeper/survival_pod
+ desc = "A limited functionality sleeper, all it can do is put patients into stasis. It lacks the medication and configuration of the larger units."
+ icon_state = "sleeper"
+ stasis_level = 100 //Just one setting
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index a2115d9fdd..cc33d36798 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -36,6 +36,8 @@
name = "alarm"
icon = 'icons/obj/monitors.dmi'
icon_state = "alarm0"
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
anchored = 1
use_power = 1
idle_power_usage = 80
@@ -322,7 +324,7 @@
icon_state = "alarm1"
new_color = "#DA0205"
- set_light(l_range = 2, l_power = 0.5, l_color = new_color)
+ set_light(l_range = 2, l_power = 0.25, l_color = new_color)
/obj/machinery/alarm/receive_signal(datum/signal/signal)
if(stat & (NOPOWER|BROKEN))
@@ -803,6 +805,8 @@ FIRE ALARM
desc = "\"Pull this in case of emergency\". Thus, keep pulling it forever."
icon = 'icons/obj/monitors.dmi'
icon_state = "fire0"
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
var/detecting = 1.0
var/working = 1.0
var/time = 10.0
@@ -838,14 +842,14 @@ FIRE ALARM
else
if(!detecting)
icon_state = "fire1"
- set_light(l_range = 4, l_power = 2, l_color = "#ff0000")
+ set_light(l_range = 4, l_power = 0.9, l_color = "#ff0000")
else
icon_state = "fire0"
switch(seclevel)
- if("green") set_light(l_range = 2, l_power = 0.5, l_color = "#00ff00")
- if("blue") set_light(l_range = 2, l_power = 0.5, l_color = "#1024A9")
- if("red") set_light(l_range = 4, l_power = 2, l_color = "#ff0000")
- if("delta") set_light(l_range = 4, l_power = 2, l_color = "#FF6633")
+ if("green") set_light(l_range = 2, l_power = 0.25, l_color = "#00ff00")
+ if("blue") set_light(l_range = 2, l_power = 0.25, l_color = "#1024A9")
+ if("red") set_light(l_range = 4, l_power = 0.9, l_color = "#ff0000")
+ if("delta") set_light(l_range = 4, l_power = 0.9, l_color = "#FF6633")
add_overlay("overlay_[seclevel]")
/obj/machinery/firealarm/fire_act(datum/gas_mixture/air, temperature, volume)
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index de0d7975c3..e19fc5c17c 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -7,6 +7,8 @@
flags = CONDUCT
w_class = ITEMSIZE_HUGE
+ layer = TABLE_LAYER // Above catwalks, hopefully below other things
+
var/valve_open = 0
var/release_pressure = ONE_ATMOSPHERE
var/release_flow_rate = ATMOS_DEFAULT_VOLUME_PUMP //in L/s
@@ -238,7 +240,7 @@ update_flag
..()
/obj/machinery/portable_atmospherics/canister/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
- if(!istype(W, /obj/item/weapon/wrench) && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda))
+ if(!W.is_wrench() && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda))
visible_message("\The [user] hits \the [src] with \a [W]!")
src.health -= W.force
src.add_fingerprint(user)
diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm
index 71755cc246..0b1f4c3d77 100644
--- a/code/game/machinery/atmoalter/meter.dm
+++ b/code/game/machinery/atmoalter/meter.dm
@@ -105,7 +105,7 @@
return ..()
/obj/machinery/meter/attackby(var/obj/item/W, var/mob/user)
- if(iswrench(W))
+ if(W.is_wrench())
playsound(src, W.usesound, 50, 1)
to_chat(user, "You begin to unfasten \the [src]...")
if(do_after(user, 40 * W.toolspeed))
@@ -117,7 +117,7 @@
qdel(src)
return
- if(ismultitool(W))
+ if(istype(W, /obj/item/device/multitool))
for(var/obj/machinery/atmospherics/pipe/P in loc)
pipes_on_turf |= P
if(!pipes_on_turf.len)
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 84d00eff04..477353e739 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -113,10 +113,10 @@
update_icon()
return
- else if (istype(W, /obj/item/weapon/wrench))
+ else if (W.is_wrench())
if(connected_port)
disconnect()
- user << "You disconnect \the [src] from the port."
+ to_chat(user, "You disconnect \the [src] from the port.")
update_icon()
playsound(src, W.usesound, 50, 1)
return
@@ -124,15 +124,15 @@
var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector/) in loc
if(possible_port)
if(connect(possible_port))
- user << "You connect \the [src] to the port."
+ to_chat(user, "You connect \the [src] to the port.")
update_icon()
playsound(src, W.usesound, 50, 1)
return
else
- user << "\The [src] failed to connect to the port."
+ to_chat(user, "\The [src] failed to connect to the port.")
return
else
- user << "Nothing happens."
+ to_chat(user, "Nothing happens.")
return
else if ((istype(W, /obj/item/device/analyzer)) && Adjacent(user))
@@ -160,7 +160,7 @@
/obj/machinery/portable_atmospherics/powered/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/cell))
if(cell)
- user << "There is already a power cell installed."
+ to_chat(user, "There is already a power cell installed.")
return
var/obj/item/weapon/cell/C = I
@@ -173,9 +173,9 @@
power_change()
return
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
if(!cell)
- user << "There is no power cell installed."
+ to_chat(user, "There is no power cell installed.")
return
user.visible_message("[user] opens the panel on [src] and removes [cell].", "You open the panel on [src] and remove [cell].")
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index 860a1135a1..eb453ab2ba 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -166,7 +166,7 @@
name = "[name] (ID [id])"
/obj/machinery/portable_atmospherics/powered/scrubber/huge/attack_hand(var/mob/user as mob)
- usr << "You can't directly interact with this machine. Use the scrubber control console."
+ to_chat(user, "You can't directly interact with this machine. Use the scrubber control console.")
/obj/machinery/portable_atmospherics/powered/scrubber/huge/update_icon()
src.overlays = 0
@@ -205,21 +205,21 @@
update_connected_network()
/obj/machinery/portable_atmospherics/powered/scrubber/huge/attackby(var/obj/item/I as obj, var/mob/user as mob)
- if(istype(I, /obj/item/weapon/wrench))
+ if(I.is_wrench())
if(on)
- user << "Turn \the [src] off first!"
+ to_chat(user, "Turn \the [src] off first!")
return
anchored = !anchored
playsound(src.loc, I.usesound, 50, 1)
- user << "You [anchored ? "wrench" : "unwrench"] \the [src]."
+ to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
return
//doesn't use power cells
if(istype(I, /obj/item/weapon/cell))
return
- if (istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
return
//doesn't hold tanks
@@ -233,8 +233,8 @@
name = "Stationary Air Scrubber"
/obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary/attackby(var/obj/item/I as obj, var/mob/user as mob)
- if(istype(I, /obj/item/weapon/wrench))
- user << "The bolts are too tight for you to unscrew!"
+ if(I.is_wrench())
+ to_chat(user, "The bolts are too tight for you to unscrew!")
return
..()
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 4daf8392de..02fb2f6b4d 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -50,7 +50,7 @@
update_recipe_list()
if(..() || (disabled && !panel_open))
- user << "\The [src] is disabled!"
+ to_chat(user, "\The [src] is disabled!")
return
if(shocked)
@@ -118,7 +118,7 @@
/obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(busy)
- user << "\The [src] is busy. Please wait for completion of previous operation."
+ to_chat(user, "\The [src] is busy. Please wait for completion of previous operation.")
return
if(default_deconstruction_screwdriver(user, O))
@@ -134,7 +134,7 @@
if(panel_open)
//Don't eat multitools or wirecutters used on an open lathe.
- if(istype(O, /obj/item/device/multitool) || istype(O, /obj/item/weapon/wirecutters))
+ if(istype(O, /obj/item/device/multitool) || O.is_wirecutter())
attack_hand(user)
return
@@ -145,25 +145,25 @@
return 0
if(istype(O,/obj/item/ammo_magazine/clip) || istype(O,/obj/item/ammo_magazine/s357) || istype(O,/obj/item/ammo_magazine/s38)) // Prevents ammo recycling exploit with speedloaders.
- user << "\The [O] is too hazardous to recycle with the autolathe!"
+ to_chat(user, "\The [O] is too hazardous to recycle with the autolathe!")
return
/* ToDo: Make this actually check for ammo and change the value of the magazine if it's empty. -Spades
var/obj/item/ammo_magazine/speedloader = O
if(speedloader.stored_ammo)
- user << "\The [speedloader] is too hazardous to put back into the autolathe while there's ammunition inside of it!"
+ to_chat(user, "\The [speedloader] is too hazardous to put back into the autolathe while there's ammunition inside of it!")
return
else
speedloader.matter = list(DEFAULT_WALL_MATERIAL = 75) // It's just a hunk of scrap metal now.
if(istype(O,/obj/item/ammo_magazine)) // This was just for immersion consistency with above.
var/obj/item/ammo_magazine/mag = O
if(mag.stored_ammo)
- user << "\The [mag] is too hazardous to put back into the autolathe while there's ammunition inside of it!"
+ to_chat(user, "\The [mag] is too hazardous to put back into the autolathe while there's ammunition inside of it!")
return*/
//Resources are being loaded.
var/obj/item/eating = O
if(!eating.matter)
- user << "\The [eating] does not contain significant amounts of useful materials and cannot be accepted."
+ to_chat(user, "\The [eating] does not contain significant amounts of useful materials and cannot be accepted.")
return
var/filltype = 0 // Used to determine message.
@@ -196,12 +196,12 @@
mass_per_sheet += eating.matter[material]
if(!filltype)
- user << "\The [src] is full. Please remove material from the autolathe in order to insert more."
+ to_chat(user, "\The [src] is full. Please remove material from the autolathe in order to insert more.")
return
else if(filltype == 1)
- user << "You fill \the [src] to capacity with \the [eating]."
+ to_chat(user, "You fill \the [src] to capacity with \the [eating].")
else
- user << "You fill \the [src] with \the [eating]."
+ to_chat(user, "You fill \the [src] with \the [eating].")
flick("autolathe_o", src) // Plays metal insertion animation. Work out a good way to work out a fitting animation. ~Z
@@ -227,7 +227,7 @@
add_fingerprint(usr)
if(busy)
- usr << "The autolathe is busy. Please wait for completion of previous operation."
+ to_chat(usr, "The autolathe is busy. Please wait for completion of previous operation.")
return
if(href_list["change_category"])
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index 4ad8d06a5a..346e26370f 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -50,43 +50,43 @@
return
if(istype(O, /obj/item/weapon/reagent_containers/glass))
if(beaker)
- user << "]The [src] is already loaded."
+ to_chat(user, "]The [src] is already loaded.")
else
user.remove_from_mob(O)
O.loc = src
beaker = O
updateUsrDialog()
else if(processing)
- user << "\The [src] is currently processing."
+ to_chat(user, "\The [src] is currently processing.")
else if(istype(O, /obj/item/weapon/storage/bag/plants))
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
if(i >= 10)
- user << "\The [src] is already full! Activate it."
+ to_chat(user, "\The [src] is already full! Activate it.")
else
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents)
G.loc = src
i++
if(i >= 10)
- user << "You fill \the [src] to its capacity."
+ to_chat(user, "You fill \the [src] to its capacity.")
break
if(i < 10)
- user << "You empty \the [O] into \the [src]."
+ to_chat(user, "You empty \the [O] into \the [src].")
else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
- user << "You cannot put this in \the [src]."
+ to_chat(user, "You cannot put this in \the [src].")
else
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
if(i >= 10)
- user << "\The [src] is full! Activate it."
+ to_chat(user, "\The [src] is full! Activate it.")
else
user.remove_from_mob(O)
O.loc = src
- user << "You put \the [O] in \the [src]"
+ to_chat(user, "You put \the [O] in \the [src]")
update_icon()
return
@@ -151,7 +151,7 @@
if(stat) //NOPOWER etc
return
if(processing)
- usr << "The biogenerator is in the process of working."
+ to_chat(usr, "The biogenerator is in the process of working.")
return
var/S = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/I in contents)
diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm
index 0a43acb172..f66b580c52 100644
--- a/code/game/machinery/bioprinter.dm
+++ b/code/game/machinery/bioprinter.dm
@@ -13,27 +13,29 @@
idle_power_usage = 40
active_power_usage = 300
- var/stored_matter = 0
- var/max_stored_matter = 0
+ var/obj/item/weapon/reagent_containers/container = null // This is the beaker that holds all of the biomass
+
var/print_delay = 100
+ var/base_print_delay = 100 // For Adminbus reasons
var/printing
var/loaded_dna //Blood sample for DNA hashing.
// These should be subtypes of /obj/item/organ
+ // Costs roughly 20u Phoron (1 sheet) per internal organ, limbs are 60u for limb and extremity
var/list/products = list(
- "Heart" = list(/obj/item/organ/internal/heart, 25),
- "Lungs" = list(/obj/item/organ/internal/lungs, 25),
+ "Heart" = list(/obj/item/organ/internal/heart, 20),
+ "Lungs" = list(/obj/item/organ/internal/lungs, 20),
"Kidneys" = list(/obj/item/organ/internal/kidneys,20),
"Eyes" = list(/obj/item/organ/internal/eyes, 20),
- "Liver" = list(/obj/item/organ/internal/liver, 25),
- "Arm, Left" = list(/obj/item/organ/external/arm, 65),
- "Arm, Right" = list(/obj/item/organ/external/arm/right, 65),
- "Leg, Left" = list(/obj/item/organ/external/leg, 65),
- "Leg, Right" = list(/obj/item/organ/external/leg/right, 65),
- "Foot, Left" = list(/obj/item/organ/external/foot, 40),
- "Foot, Right" = list(/obj/item/organ/external/foot/right, 40),
- "Hand, Left" = list(/obj/item/organ/external/hand, 40),
- "Hand, Right" = list(/obj/item/organ/external/hand/right, 40)
+ "Liver" = list(/obj/item/organ/internal/liver, 20),
+ "Arm, Left" = list(/obj/item/organ/external/arm, 40),
+ "Arm, Right" = list(/obj/item/organ/external/arm/right, 40),
+ "Leg, Left" = list(/obj/item/organ/external/leg, 40),
+ "Leg, Right" = list(/obj/item/organ/external/leg/right, 40),
+ "Foot, Left" = list(/obj/item/organ/external/foot, 20),
+ "Foot, Right" = list(/obj/item/organ/external/foot/right, 20),
+ "Hand, Left" = list(/obj/item/organ/external/hand, 20),
+ "Hand, Right" = list(/obj/item/organ/external/hand/right, 20)
)
/obj/machinery/organ_printer/attackby(var/obj/item/O, var/mob/user)
@@ -57,25 +59,27 @@
/obj/machinery/organ_printer/New()
..()
+
component_parts = list()
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
RefreshParts()
/obj/machinery/organ_printer/examine(var/mob/user)
. = ..()
- to_chat(user, "It is loaded with [stored_matter]/[max_stored_matter] matter units.")
+ var/biomass = get_biomass_volume()
+ if(biomass)
+ to_chat(user, "It is loaded with [biomass] units of biomass.")
+ else
+ to_chat(user, "It is not loaded with any biomass.")
/obj/machinery/organ_printer/RefreshParts()
- print_delay = initial(print_delay)
- max_stored_matter = 0
- for(var/obj/item/weapon/stock_parts/matter_bin/bin in component_parts)
- max_stored_matter += bin.rating * 100
+ // Print Delay updating
+ print_delay = base_print_delay
for(var/obj/item/weapon/stock_parts/manipulator/manip in component_parts)
print_delay -= (manip.rating-1)*10
print_delay = max(0,print_delay)
+
. = ..()
/obj/machinery/organ_printer/attack_hand(mob/user)
@@ -91,6 +95,14 @@
to_chat(user, "\The [src] is busy!")
return
+ if(container)
+ var/response = alert(user, "What do you want to do?", "Bioprinter Menu", "Print Limbs", "Cancel")
+ if(response == "Print Limbs")
+ printing_menu(user)
+ else
+ to_chat(user, "\The [src] can't operate without a reagent reservoir!")
+
+/obj/machinery/organ_printer/proc/printing_menu(mob/user)
var/choice = input("What would you like to print?") as null|anything in products
if(!choice || printing || (stat & (BROKEN|NOPOWER)))
@@ -99,7 +111,7 @@
if(!can_print(choice))
return
- stored_matter -= products[choice][2]
+ container.reagents.remove_reagent("biomass", products[choice][2])
use_power = 2
printing = 1
@@ -118,9 +130,42 @@
print_organ(choice)
+ return
+
+/obj/machinery/organ_printer/verb/eject_beaker()
+ set name = "Eject Beaker"
+ set category = "Object"
+ set src in oview(1)
+
+ if(usr.stat != 0)
+ return
+ add_fingerprint(usr)
+ remove_beaker()
+ return
+
+// Does exactly what it says it does
+// Returns 1 if it succeeds, 0 if it fails. Added in case someone wants to add messages to the user.
+/obj/machinery/organ_printer/proc/remove_beaker()
+ if(container)
+ container.forceMove(get_turf(src))
+ container = null
+ return 1
+ return 0
+
+// Checks for reagents, then reports how much biomass it has in it
+/obj/machinery/organ_printer/proc/get_biomass_volume()
+ var/biomass_count = 0
+ if(container && container.reagents)
+ for(var/datum/reagent/R in container.reagents.reagent_list)
+ if(R.id == "biomass")
+ biomass_count += R.volume
+
+ return biomass_count
+
/obj/machinery/organ_printer/proc/can_print(var/choice)
- if(stored_matter < products[choice][2])
- visible_message("\The [src] displays a warning: 'Not enough matter. [stored_matter] stored and [products[choice][2]] needed.'")
+ var/biomass = get_biomass_volume()
+ if(biomass < products[choice][2])
+ visible_message("\The [src] displays a warning: 'Not enough biomass. [biomass] stored and [products[choice][2]] needed.'")
return 0
if(!loaded_dna || !loaded_dna["donor"])
@@ -162,6 +207,59 @@
/obj/item/weapon/stock_parts/matter_bin = 2,
/obj/item/weapon/stock_parts/manipulator = 2)
+// FLESH ORGAN PRINTER
+/obj/machinery/organ_printer/flesh
+ name = "bioprinter"
+ desc = "It's a machine that prints replacement organs."
+ icon_state = "bioprinter"
+ circuit = /obj/item/weapon/circuitboard/bioprinter
+
+/obj/machinery/organ_printer/flesh/full/New()
+ . = ..()
+ container = new /obj/item/weapon/reagent_containers/glass/bottle/biomass(src)
+
+/obj/machinery/organ_printer/flesh/dismantle()
+ var/turf/T = get_turf(src)
+ if(T)
+ if(container)
+ container.forceMove(T)
+ container = null
+ return ..()
+
+/obj/machinery/organ_printer/flesh/print_organ(var/choice)
+ var/obj/item/organ/O = ..()
+
+ playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
+ visible_message("\The [src] dings, then spits out \a [O].")
+ return O
+
+/obj/machinery/organ_printer/flesh/attackby(obj/item/weapon/W, mob/user)
+ // DNA sample from syringe.
+ if(istype(W,/obj/item/weapon/reagent_containers/syringe)) //TODO: Make this actually empty the syringe
+ var/obj/item/weapon/reagent_containers/syringe/S = W
+ var/datum/reagent/blood/injected = locate() in S.reagents.reagent_list //Grab some blood
+ if(injected && injected.data)
+ loaded_dna = injected.data
+ S.reagents.remove_reagent("blood", injected.volume)
+ to_chat(user, "You scan the blood sample into the bioprinter.")
+ return
+ else if(istype(W,/obj/item/weapon/reagent_containers/glass))
+ var/obj/item/weapon/reagent_containers/glass/G = W
+ if(container)
+ to_chat(user, "\The [src] already has a container loaded!")
+ return
+ else if(do_after(user, 1 SECOND))
+ user.visible_message("[user] has loaded \the [G] into \the [src].", "You load \the [G] into \the [src].")
+ container = G
+ user.drop_item()
+ G.forceMove(src)
+ return
+
+ return ..()
+// END FLESH ORGAN PRINTER
+
+
+/* Roboprinter is made obsolete by the system already in place and mapped into Robotics
/obj/item/weapon/circuitboard/roboprinter
name = "roboprinter circuit"
build_path = /obj/machinery/organ_printer/robot
@@ -224,53 +322,4 @@
return
return ..()
// END ROBOT ORGAN PRINTER
-
-// FLESH ORGAN PRINTER
-/obj/machinery/organ_printer/flesh
- name = "bioprinter"
- desc = "It's a machine that prints replacement organs."
- icon_state = "bioprinter"
- circuit = /obj/item/weapon/circuitboard/bioprinter
-
- var/amount_per_slab = 50
-
-/obj/machinery/organ_printer/flesh/full/New()
- . = ..()
- stored_matter = max_stored_matter
-
-/obj/machinery/organ_printer/flesh/dismantle()
- var/turf/T = get_turf(src)
- if(T)
- while(stored_matter >= amount_per_slab)
- stored_matter -= amount_per_slab
- new /obj/item/weapon/reagent_containers/food/snacks/meat(T)
- return ..()
-
-/obj/machinery/organ_printer/flesh/print_organ(var/choice)
- var/obj/item/organ/O = ..()
-
- playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
- visible_message("\The [src] dings, then spits out \a [O].")
- return O
-
-/obj/machinery/organ_printer/flesh/attackby(obj/item/weapon/W, mob/user)
- // Load with matter for printing.
- if(istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
- if((max_stored_matter - stored_matter) < amount_per_slab)
- to_chat(user, "\The [src] is too full.")
- return
- stored_matter += amount_per_slab
- user.drop_item()
- to_chat(user, "\The [src] processes \the [W]. Levels of stored biomass now: [stored_matter]")
- qdel(W)
- return
- // DNA sample from syringe.
- else if(istype(W,/obj/item/weapon/reagent_containers/syringe)) //TODO: Make this actually empty the syringe
- var/obj/item/weapon/reagent_containers/syringe/S = W
- var/datum/reagent/blood/injected = locate() in S.reagents.reagent_list //Grab some blood
- if(injected && injected.data)
- loaded_dna = injected.data
- to_chat(user, "You scan the blood sample into the bioprinter.")
- return
- return ..()
-// END FLESH ORGAN PRINTER
\ No newline at end of file
+*/
\ No newline at end of file
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 39c3aafe5c..484adf6068 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -83,9 +83,8 @@
/obj/machinery/camera/emp_act(severity)
if(!isEmpProof() && prob(100/severity))
- if(!affected_by_emp_until || (world.time < affected_by_emp_until))
+ if(!affected_by_emp_until || (world.time > affected_by_emp_until))
affected_by_emp_until = max(affected_by_emp_until, world.time + (90 SECONDS / severity))
- else
stat |= EMPED
set_light(0)
triggerCameraAlarm()
@@ -152,7 +151,7 @@
/obj/machinery/camera/attackby(obj/item/W as obj, mob/living/user as mob)
update_coverage()
// DECONSTRUCTION
- if(isscrewdriver(W))
+ if(W.is_screwdriver())
//user << "You start to [panel_open ? "close" : "open"] the camera's panel."
//if(toggle_panel(user)) // No delay because no one likes screwdrivers trying to be hip and have a duration cooldown
panel_open = !panel_open
@@ -160,10 +159,10 @@
"You screw the camera's panel [panel_open ? "open" : "closed"].")
playsound(src.loc, W.usesound, 50, 1)
- else if((iswirecutter(W) || ismultitool(W)) && panel_open)
+ else if((W.is_wirecutter() || istype(W, /obj/item/device/multitool)) && panel_open)
interact(user)
- else if(iswelder(W) && (wires.CanDeconstruct() || (stat & BROKEN)))
+ else if(istype(W, /obj/item/weapon/weldingtool) && (wires.CanDeconstruct() || (stat & BROKEN)))
if(weld(W, user))
if(assembly)
assembly.loc = src.loc
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index 44cd61d1d9..72b32b95d3 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -29,7 +29,7 @@
if(0)
// State 0
- if(iswrench(W) && isturf(src.loc))
+ if(W.is_wrench() && isturf(src.loc))
playsound(src, W.usesound, 50, 1)
user << "You wrench the assembly into place."
anchored = 1
@@ -40,14 +40,14 @@
if(1)
// State 1
- if(iswelder(W))
+ if(istype(W, /obj/item/weapon/weldingtool))
if(weld(W, user))
user << "You weld the assembly securely into place."
anchored = 1
state = 2
return
- else if(iswrench(W))
+ else if(W.is_wrench())
playsound(src, W.usesound, 50, 1)
user << "You unattach the assembly from its place."
anchored = 0
@@ -57,7 +57,7 @@
if(2)
// State 2
- if(iscoil(W))
+ if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = W
if(C.use(2))
user << "You add wires to the assembly."
@@ -66,7 +66,7 @@
user << "You need 2 coils of wire to wire the assembly."
return
- else if(iswelder(W))
+ else if(istype(W, /obj/item/weapon/weldingtool))
if(weld(W, user))
user << "You unweld the assembly from its place."
@@ -77,7 +77,7 @@
if(3)
// State 3
- if(isscrewdriver(W))
+ if(W.is_screwdriver())
playsound(src.loc, W.usesound, 50, 1)
var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: "+using_map.station_short+",Security,Secret ", "Set Network", camera_network ? camera_network : NETWORK_DEFAULT))
@@ -115,7 +115,7 @@
break
return
- else if(iswirecutter(W))
+ else if(W.is_wirecutter())
new/obj/item/stack/cable_coil(get_turf(src), 2)
playsound(src.loc, W.usesound, 50, 1)
@@ -132,7 +132,7 @@
return
// Taking out upgrades
- else if(iscrowbar(W) && upgrades.len)
+ else if(W.is_crowbar() && upgrades.len)
var/obj/U = locate(/obj) in upgrades
if(U)
user << "You unattach an upgrade from the assembly."
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index e210119445..d4b29b217e 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -162,7 +162,7 @@ var/global/list/engineering_networks = list(
number = 1
var/area/A = get_area(src)
if(A)
- for(var/obj/machinery/camera/autoname/C in world)
+ for(var/obj/machinery/camera/autoname/C in machines)
if(C == src) continue
var/area/CA = get_area(C)
if(CA.type == A.type)
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index 6cb9e63eb5..bad819a985 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -61,7 +61,7 @@
user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger.")
chargelevel = -1
update_icon()
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
if(charging)
user << "Remove the cell first!"
return
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 4e1d015033..69681d1775 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -23,7 +23,7 @@
break
return selected
-#define CLONE_BIOMASS 150
+#define CLONE_BIOMASS 60
/obj/machinery/clonepod
name = "cloning pod"
@@ -33,17 +33,18 @@
circuit = /obj/item/weapon/circuitboard/clonepod
icon = 'icons/obj/cloning.dmi'
icon_state = "pod_0"
- req_access = list(access_genetics) //For premature unlocking.
+ req_access = list(access_genetics) // For premature unlocking.
var/mob/living/occupant
- var/heal_level = 20 //The clone is released once its health reaches this level.
+ var/heal_level = 20 // The clone is released once its health reaches this level.
var/heal_rate = 1
- var/notoxin = 0
var/locked = 0
var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine.
- var/mess = 0 //Need to clean out it if it's full of exploded clone.
- var/attempting = 0 //One clone attempt at a time thanks
- var/eject_wait = 0 //Don't eject them as soon as they are created fuckkk
- var/biomass = CLONE_BIOMASS * 3
+ var/mess = 0 // Need to clean out it if it's full of exploded clone.
+ var/attempting = 0 // One clone attempt at a time thanks
+ var/eject_wait = 0 // Don't eject them as soon as they are created fuckkk
+
+ var/list/containers = list() // Beakers for our liquid biomass
+ var/container_limit = 3 // How many beakers can the machine hold?
/obj/machinery/clonepod/New()
..()
@@ -68,11 +69,9 @@
return
if((!isnull(occupant)) && (occupant.stat != 2))
var/completion = (100 * ((occupant.health + 50) / (heal_level + 100))) // Clones start at -150 health
- user << "Current clone cycle is [round(completion)]% complete."
+ to_chat(user, "Current clone cycle is [round(completion)]% complete.")
return
-//Clonepod
-
//Start growing a human clone in the pod!
/obj/machinery/clonepod/proc/growclone(var/datum/dna2/record/R)
if(mess || attempting)
@@ -98,6 +97,9 @@
if(istype(modifier_type, /datum/modifier/no_clone))
return 0
+ // Remove biomass when the cloning is started, rather than when the guy pops out
+ remove_biomass(CLONE_BIOMASS)
+
attempting = 1 //One at a time!!
locked = 1
@@ -164,6 +166,7 @@
for(var/datum/language/L in R.languages)
H.add_language(L.name)
+
H.flavor_texts = R.flavor.Copy()
H.suiciding = 0
attempting = 0
@@ -171,16 +174,6 @@
//Grow clones to maturity then kick them out. FREELOADERS
/obj/machinery/clonepod/process()
-
- var/visible_message = 0
- for(var/obj/item/weapon/reagent_containers/food/snacks/meat/meat in range(1, src))
- qdel(meat)
- biomass += 50
- visible_message = 1 // Prevent chatspam when multiple meat are near
-
- if(visible_message)
- visible_message("[src] sucks in and processes the nearby biomass.")
-
if(stat & NOPOWER) //Autoeject if power is lost
if(occupant)
locked = 0
@@ -240,25 +233,28 @@
return
if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
if(!check_access(W))
- user << "Access Denied."
+ to_chat(user, "Access Denied.")
return
if((!locked) || (isnull(occupant)))
return
if((occupant.health < -20) && (occupant.stat != 2))
- user << "Access Refused."
+ to_chat(user, "Access Refused.")
return
else
locked = 0
- user << "System unlocked."
- else if(istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
- user << "\The [src] processes \the [W]."
- biomass += 50
- user.drop_item()
- qdel(W)
+ to_chat(user, "System unlocked.")
+ else if(istype(W,/obj/item/weapon/reagent_containers/glass))
+ if(LAZYLEN(containers) >= container_limit)
+ to_chat(user, "\The [src] has too many containers loaded!")
+ else if(do_after(user, 1 SECOND))
+ user.visible_message("[user] has loaded \the [W] into \the [src].", "You load \the [W] into \the [src].")
+ containers += W
+ user.drop_item()
+ W.forceMove(src)
return
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
if(locked && (anchored || occupant))
- user << "Can not do that while [src] is in use."
+ to_chat(user, "Can not do that while [src] is in use.")
else
if(anchored)
anchored = 0
@@ -274,7 +270,7 @@
else if(istype(W, /obj/item/device/multitool))
var/obj/item/device/multitool/M = W
M.connecting = src
- user << "You load connection data from [src] to [M]."
+ to_chat(user, "You load connection data from [src] to [M].")
M.update_icon()
return
else
@@ -283,7 +279,7 @@
/obj/machinery/clonepod/emag_act(var/remaining_charges, var/mob/user)
if(isnull(occupant))
return
- user << "You force an emergency ejection."
+ to_chat(user, "You force an emergency ejection.")
locked = 0
go_out()
return 1
@@ -308,10 +304,6 @@
heal_level = rating * 10 - 20
heal_rate = round(rating / 4)
- if(rating >= 8)
- notoxin = 1
- else
- notoxin = 0
/obj/machinery/clonepod/verb/eject()
set name = "Eject Cloner"
@@ -348,10 +340,66 @@
domutcheck(occupant) //Waiting until they're out before possible transforming.
occupant = null
- biomass -= CLONE_BIOMASS
update_icon()
return
+// Returns the total amount of biomass reagent in all of the pod's stored containers
+/obj/machinery/clonepod/proc/get_biomass()
+ var/biomass_count = 0
+ if(LAZYLEN(containers))
+ for(var/obj/item/weapon/reagent_containers/glass/G in containers)
+ for(var/datum/reagent/R in G.reagents.reagent_list)
+ if(R.id == "biomass")
+ biomass_count += R.volume
+
+ return biomass_count
+
+// Removes [amount] biomass, spread across all containers. Doesn't have any check that you actually HAVE enough biomass, though.
+/obj/machinery/clonepod/proc/remove_biomass(var/amount = CLONE_BIOMASS) //Just in case it doesn't get passed a new amount, assume one clone
+ var/to_remove = 0 // Tracks how much biomass has been found so far
+ if(LAZYLEN(containers))
+ for(var/obj/item/weapon/reagent_containers/glass/G in containers)
+ if(to_remove < amount) //If we have what we need, we can stop. Checked every time we switch beakers
+ for(var/datum/reagent/R in G.reagents.reagent_list)
+ if(R.id == "biomass") // Finds Biomass
+ var/need_remove = max(0, amount - to_remove) //Figures out how much biomass is in this container
+ if(R.volume >= need_remove) //If we have more than enough in this beaker, only take what we need
+ R.remove_self(need_remove)
+ to_remove = amount
+ else //Otherwise, take everything and move on
+ to_remove += R.volume
+ R.remove_self(R.volume)
+ else
+ continue
+ else
+ return 1
+ return 0
+
+// Empties all of the beakers from the cloning pod, used to refill it
+/obj/machinery/clonepod/verb/empty_beakers()
+ set name = "Eject Beakers"
+ set category = "Object"
+ set src in oview(1)
+
+ if(usr.stat != 0)
+ return
+
+ add_fingerprint(usr)
+ drop_beakers()
+ return
+
+// Actually does all of the beaker dropping
+// Returns 1 if it succeeds, 0 if it fails. Added in case someone wants to add messages to the user.
+/obj/machinery/clonepod/proc/drop_beakers()
+ if(LAZYLEN(containers))
+ var/turf/T = get_turf(src)
+ if(T)
+ for(var/obj/item/weapon/reagent_containers/glass/G in containers)
+ G.forceMove(T)
+ containers -= G
+ return 1
+ return 0
+
/obj/machinery/clonepod/proc/malfunction()
if(occupant)
connected_message("Critical Error!")
@@ -406,6 +454,12 @@
else if(mess)
icon_state = "pod_g"
+
+/obj/machinery/clonepod/full/New()
+ ..()
+ for(var/i = 1 to container_limit)
+ containers += new /obj/item/weapon/reagent_containers/glass/bottle/biomass(src)
+
//Health Tracker Implant
/obj/item/weapon/implant/health
@@ -475,11 +529,11 @@
/obj/item/weapon/disk/data/attack_self(mob/user as mob)
read_only = !read_only
- user << "You flip the write-protect tab to [read_only ? "protected" : "unprotected"]."
+ to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].")
/obj/item/weapon/disk/data/examine(mob/user)
..(user)
- user << text("The write-protect tab is set to [read_only ? "protected" : "unprotected"].")
+ to_chat(user, text("The write-protect tab is set to [read_only ? "protected" : "unprotected"]."))
return
/*
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 5c7ece8d05..bc6da68332 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -14,75 +14,75 @@
switch(state)
if(0)
- if(istype(P, /obj/item/weapon/wrench))
+ if(P.is_wrench())
playsound(loc, P.usesound, 50, 1)
if(do_after(user, 20 * P.toolspeed))
- user << "You wrench the frame into place."
+ to_chat(user, "You wrench the frame into place.")
anchored = 1
state = 1
if(istype(P, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = P
if(!WT.isOn())
- user << "The welder must be on for this task."
+ to_chat(user, "The welder must be on for this task.")
return
playsound(loc, WT.usesound, 50, 1)
if(do_after(user, 20 * WT.toolspeed))
if(!src || !WT.remove_fuel(0, user)) return
- user << "You deconstruct the frame."
+ to_chat(user, "You deconstruct the frame.")
new /obj/item/stack/material/plasteel( loc, 4)
qdel(src)
if(1)
- if(istype(P, /obj/item/weapon/wrench))
+ if(P.is_wrench())
playsound(loc, P.usesound, 50, 1)
if(do_after(user, 20 * P.toolspeed))
- user << "You unfasten the frame."
+ to_chat(user, "You unfasten the frame.")
anchored = 0
state = 0
if(istype(P, /obj/item/weapon/circuitboard/aicore) && !circuit)
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
- user << "You place the circuit board inside the frame."
+ to_chat(user, "You place the circuit board inside the frame.")
icon_state = "1"
circuit = P
user.drop_item()
P.loc = src
- if(istype(P, /obj/item/weapon/screwdriver) && circuit)
+ if(P.is_screwdriver() && circuit)
playsound(loc, P.usesound, 50, 1)
- user << "You screw the circuit board into place."
+ to_chat(user, "You screw the circuit board into place.")
state = 2
icon_state = "2"
- if(istype(P, /obj/item/weapon/crowbar) && circuit)
+ if(P.is_crowbar() && circuit)
playsound(loc, P.usesound, 50, 1)
- user << "You remove the circuit board."
+ to_chat(user, "You remove the circuit board.")
state = 1
icon_state = "0"
circuit.loc = loc
circuit = null
if(2)
- if(istype(P, /obj/item/weapon/screwdriver) && circuit)
+ if(P.is_screwdriver() && circuit)
playsound(loc, P.usesound, 50, 1)
- user << "You unfasten the circuit board."
+ to_chat(user, "You unfasten the circuit board.")
state = 1
icon_state = "1"
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = P
if (C.get_amount() < 5)
- user << "You need five coils of wire to add them to the frame."
+ to_chat(user, "You need five coils of wire to add them to the frame.")
return
- user << "You start to add cables to the frame."
+ to_chat(user, "You start to add cables to the frame.")
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
if (do_after(user, 20) && state == 2)
if (C.use(5))
state = 3
icon_state = "3"
- user << "You add cables to the frame."
+ to_chat(user, "You add cables to the frame.")
return
if(3)
- if(istype(P, /obj/item/weapon/wirecutters))
+ if(P.is_wirecutter())
if (brain)
- user << "Get that brain out of there first"
+ to_chat(user, "Get that brain out of there first")
else
playsound(loc, P.usesound, 50, 1)
- user << "You remove the cables."
+ to_chat(user, "You remove the cables.")
state = 2
icon_state = "2"
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc )
@@ -91,13 +91,13 @@
if(istype(P, /obj/item/stack/material) && P.get_material_name() == "rglass")
var/obj/item/stack/RG = P
if (RG.get_amount() < 2)
- user << "You need two sheets of glass to put in the glass panel."
+ to_chat(user, "You need two sheets of glass to put in the glass panel.")
return
- user << "You start to put in the glass panel."
+ to_chat(user, "You start to put in the glass panel.")
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
if (do_after(user, 20) && state == 3)
if(RG.use(2))
- user << "You put in the glass panel."
+ to_chat(user, "You put in the glass panel.")
state = 4
icon_state = "4"
@@ -126,14 +126,14 @@
if(istype(P, /obj/item/device/mmi))
var/obj/item/device/mmi/M = P
if(!M.brainmob)
- user << "Sticking an empty [P] into the frame would sort of defeat the purpose."
+ to_chat(user, "Sticking an empty [P] into the frame would sort of defeat the purpose.")
return
if(M.brainmob.stat == 2)
- user << "Sticking a dead [P] into the frame would sort of defeat the purpose."
+ to_chat(user, "Sticking a dead [P] into the frame would sort of defeat the purpose.")
return
if(jobban_isbanned(M.brainmob, "AI"))
- user << "This [P] does not seem to fit."
+ to_chat(user, "This [P] does not seem to fit.")
return
if(M.brainmob.mind)
@@ -145,17 +145,17 @@
usr << "Added [P]."
icon_state = "3b"
- if(istype(P, /obj/item/weapon/crowbar) && brain)
+ if(P.is_crowbar() && brain)
playsound(loc, P.usesound, 50, 1)
- user << "You remove the brain."
+ to_chat(user, "You remove the brain.")
brain.loc = loc
brain = null
icon_state = "3"
if(4)
- if(istype(P, /obj/item/weapon/crowbar))
+ if(P.is_crowbar())
playsound(loc, P.usesound, 50, 1)
- user << "You remove the glass panel."
+ to_chat(user, "You remove the glass panel.")
state = 3
if (brain)
icon_state = "3b"
@@ -164,9 +164,9 @@
new /obj/item/stack/material/glass/reinforced( loc, 2 )
return
- if(istype(P, /obj/item/weapon/screwdriver))
+ if(P.is_screwdriver())
playsound(loc, P.usesound, 50, 1)
- user << "You connect the monitor."
+ to_chat(user, "You connect the monitor.")
if(!brain)
var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes"
var/obj/structure/AIcore/deactivated/D = new(loc)
@@ -181,6 +181,8 @@
feedback_inc("cyborg_ais_created",1)
qdel(src)
+GLOBAL_LIST_BOILERPLATE(all_deactivated_AI_cores, /obj/structure/AIcore/deactivated)
+
/obj/structure/AIcore/deactivated
name = "inactive AI"
icon = 'icons/mob/AI.dmi'
@@ -198,14 +200,16 @@
if(!istype(transfer) || locate(/mob/living/silicon/ai) in src)
return
+ if(transfer.controlling_drone)
+ transfer.controlling_drone.release_ai_control("Unit control lost. Core transfer completed.")
transfer.aiRestorePowerRoutine = 0
transfer.control_disabled = 0
transfer.aiRadio.disabledAi = 0
transfer.loc = get_turf(src)
transfer.create_eyeobj()
transfer.cancel_camera()
- user << "Transfer successful: [transfer.name] placed within stationary core."
- transfer << "You have been transferred into a stationary core. Remote device connection restored."
+ to_chat(user, "Transfer successful: [transfer.name] placed within stationary core.")
+ to_chat(transfer, "You have been transferred into a stationary core. Remote device connection restored.")
if(card)
card.clear()
@@ -226,9 +230,9 @@
if(transfer)
load_ai(transfer,card,user)
else
- user << "ERROR: Unable to locate artificial intelligence."
+ to_chat(user, "ERROR: Unable to locate artificial intelligence.")
return
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
if(anchored)
user.visible_message("\The [user] starts to unbolt \the [src] from the plating...")
playsound(src, W.usesound, 50, 1)
@@ -255,7 +259,7 @@
set category = "Admin"
var/list/cores = list()
- for(var/obj/structure/AIcore/deactivated/D in world)
+ for(var/obj/structure/AIcore/deactivated/D in all_deactivated_AI_cores)
cores["[D] ([D.loc.loc])"] = D
var/id = input("Which core?", "Toggle AI Core Latejoin", null) as null|anything in cores
@@ -266,7 +270,7 @@
if(D in empty_playable_ai_cores)
empty_playable_ai_cores -= D
- src << "\The [id] is now not available for latejoining AIs."
+ to_chat(src, "\The [id] is now not available for latejoining AIs.")
else
empty_playable_ai_cores += D
- src << "\The [id] is now available for latejoining AIs."
+ to_chat(src, "\The [id] is now available for latejoining AIs.")
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index bdf4e95fe0..0724cd15be 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -45,7 +45,7 @@
qdel(src)
/obj/machinery/computer/arcade/proc/prizevend()
- if(!contents.len)
+ if(!(contents-circuit).len)
var/prizeselect = pickweight(prizes)
new prizeselect(src.loc)
@@ -53,7 +53,7 @@
new /obj/item/clothing/head/syndicatefake(src.loc)
else
- var/atom/movable/prize = pick(contents)
+ var/atom/movable/prize = pick(contents-circuit)
prize.loc = src.loc
/obj/machinery/computer/arcade/attack_ai(mob/user as mob)
@@ -272,7 +272,7 @@
/obj/machinery/computer/arcade/battle/emag_act(var/charges, var/mob/user)
if(!emagged)
to_chat(user, span("notice","You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Hyper-Lethal Mode."))
-
+
temp = "If you die in the game, you die for real!"
player_hp = 30
player_mp = 10
@@ -407,7 +407,7 @@
if(emagged)
var/mob/living/M = user
M.adjust_fire_stacks(5)
- M.IgniteMob() //flew into a star, so you're on fire
+ M.IgniteMob() //flew into a star, so you're on fire
to_chat(user,span("danger", "You feel an immense wave of heat emanate from \the [src]. Your skin bursts into flames."))
dat += "
OK... "
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 6d7243c36c..960ce3dc35 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -13,75 +13,75 @@
/obj/structure/computerframe/attackby(obj/item/P as obj, mob/user as mob)
switch(state)
if(0)
- if(istype(P, /obj/item/weapon/wrench))
+ if(P.is_wrench())
playsound(src.loc, P.usesound, 50, 1)
if(do_after(user, 20 * P.toolspeed))
- user << "You wrench the frame into place."
+ to_chat(user, "You wrench the frame into place.")
src.anchored = 1
src.state = 1
if(istype(P, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = P
if(!WT.remove_fuel(0, user))
- user << "The welding tool must be on to complete this task."
+ to_chat(user, "The welding tool must be on to complete this task.")
return
playsound(src.loc, WT.usesound, 50, 1)
if(do_after(user, 20 * WT.toolspeed))
if(!src || !WT.isOn()) return
- user << "You deconstruct the frame."
+ to_chat(user, "You deconstruct the frame.")
new /obj/item/stack/material/steel( src.loc, 5 )
qdel(src)
if(1)
- if(istype(P, /obj/item/weapon/wrench))
+ if(P.is_wrench())
playsound(src.loc, P.usesound, 50, 1)
if(do_after(user, 20 * P.toolspeed))
- user << "You unfasten the frame."
+ to_chat(user, "You unfasten the frame.")
src.anchored = 0
src.state = 0
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "computer")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- user << "You place the circuit board inside the frame."
+ to_chat(user, "You place the circuit board inside the frame.")
src.icon_state = "1"
src.circuit = P
user.drop_item()
P.loc = src
else
- user << "This frame does not accept circuit boards of this type!"
- if(istype(P, /obj/item/weapon/screwdriver) && circuit)
+ to_chat(user, "This frame does not accept circuit boards of this type!")
+ if(P.is_screwdriver() && circuit)
playsound(src.loc, P.usesound, 50, 1)
- user << "You screw the circuit board into place."
+ to_chat(user, "You screw the circuit board into place.")
src.state = 2
src.icon_state = "2"
- if(istype(P, /obj/item/weapon/crowbar) && circuit)
+ if(P.is_crowbar()) && circuit)
playsound(src.loc, P.usesound, 50, 1)
- user << "You remove the circuit board."
+ to_chat(user, "You remove the circuit board.")
src.state = 1
src.icon_state = "0"
circuit.loc = src.loc
src.circuit = null
if(2)
- if(istype(P, /obj/item/weapon/screwdriver) && circuit)
+ if(P.is_screwdriver() && circuit)
playsound(src.loc, P.usesound, 50, 1)
- user << "You unfasten the circuit board."
+ to_chat(user, "You unfasten the circuit board.")
src.state = 1
src.icon_state = "1"
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = P
if (C.get_amount() < 5)
- user << "You need five coils of wire to add them to the frame."
+ to_chat(user, "You need five coils of wire to add them to the frame.")
return
- user << "You start to add cables to the frame."
+ to_chat(user, "You start to add cables to the frame.")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 20) && state == 2)
if (C.use(5))
- user << "You add cables to the frame."
+ to_chat(user, "You add cables to the frame.")
state = 3
icon_state = "3"
if(3)
- if(istype(P, /obj/item/weapon/wirecutters))
+ if(P.is_wirecutter())
playsound(src.loc, P.usesound, 50, 1)
- user << "You remove the cables."
+ to_chat(user, "You remove the cables.")
src.state = 2
src.icon_state = "2"
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc )
@@ -90,25 +90,25 @@
if(istype(P, /obj/item/stack/material) && P.get_material_name() == "glass")
var/obj/item/stack/G = P
if (G.get_amount() < 2)
- user << "You need two sheets of glass to put in the glass panel."
+ to_chat(user, "You need two sheets of glass to put in the glass panel.")
return
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- user << "You start to put in the glass panel."
+ to_chat(user, "You start to put in the glass panel.")
if(do_after(user, 20) && state == 3)
if (G.use(2))
- user << "You put in the glass panel."
+ to_chat(user, "You put in the glass panel.")
src.state = 4
src.icon_state = "4"
if(4)
- if(istype(P, /obj/item/weapon/crowbar))
+ if(P.is_crowbar())
playsound(src.loc, P.usesound, 50, 1)
- user << "You remove the glass panel."
+ to_chat(user, "You remove the glass panel.")
src.state = 3
src.icon_state = "3"
new /obj/item/stack/material/glass( src.loc, 2 )
- if(istype(P, /obj/item/weapon/screwdriver))
+ if(P.is_screwdriver())
playsound(src.loc, P.usesound, 50, 1)
- user << "You connect the monitor."
+ to_chat(user, "You connect the monitor.")
var/B = new src.circuit.build_path ( src.loc )
src.circuit.construct(B)
qdel(src)
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 2b8d069f51..817c5a7a56 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -205,6 +205,8 @@
name = "Telescreen"
desc = "Used for watching an empty arena."
icon_state = "wallframe"
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
icon_keyboard = null
icon_screen = null
light_range_on = 0
diff --git a/code/game/machinery/computer/camera_circuit.dm b/code/game/machinery/computer/camera_circuit.dm
index 436703f724..347eb145c4 100644
--- a/code/game/machinery/computer/camera_circuit.dm
+++ b/code/game/machinery/computer/camera_circuit.dm
@@ -38,7 +38,7 @@
attackby(var/obj/item/I, var/mob/user)//if(health > 50)
..()
- else if(istype(I,/obj/item/weapon/screwdriver))
+ else if(I.is_screwdriver())
secured = !secured
user.visible_message("The [src] can [secured ? "no longer" : "now"] be modified.")
playsound(src, I.usesound, 50, 1)
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 4935a2a552..9660eca8bc 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -67,7 +67,7 @@
user.drop_item()
W.loc = src
diskette = W
- user << "You insert [W]."
+ to_chat(user, "You insert [W].")
updateUsrDialog()
return
else if(istype(W, /obj/item/device/multitool))
@@ -77,7 +77,7 @@
pods += P
P.connected = src
P.name = "[initial(P.name)] #[pods.len]"
- user << "You connect [P] to [src]."
+ to_chat(user, "You connect [P] to [src].")
else if (menu == 4 && (istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)))
if(check_access(W))
@@ -116,7 +116,7 @@
var/pods_list_ui[0]
for(var/obj/machinery/clonepod/pod in pods)
- pods_list_ui[++pods_list_ui.len] = list("pod" = pod, "biomass" = pod.biomass)
+ pods_list_ui[++pods_list_ui.len] = list("pod" = pod, "biomass" = pod.get_biomass())
if(pods)
data["pods"] = pods_list_ui
@@ -244,7 +244,7 @@
//Look for that player! They better be dead!
if(istype(C))
//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
- if(!pods.len)
+ if(!LAZYLEN(pods))
temp = "Error: No clone pods detected."
else
var/obj/machinery/clonepod/pod = pods[1]
@@ -252,13 +252,12 @@
pod = input(usr,"Select a cloning pod to use", "Pod selection") as anything in pods
if(pod.occupant)
temp = "Error: Clonepod is currently occupied."
- else if(pod.biomass < CLONE_BIOMASS)
+ else if(pod.get_biomass() < CLONE_BIOMASS)
temp = "Error: Not enough biomass."
else if(pod.mess)
temp = "Error: Clonepod malfunction."
else if(!config.revival_cloning)
temp = "Error: Unable to initiate cloning cycle."
-
else if(pod.growclone(C))
temp = "Initiating cloning cycle..."
records.Remove(C)
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index c95bd9879c..1f3b615cce 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -420,7 +420,7 @@
return dat
/proc/enable_prison_shuttle(var/mob/user)
- for(var/obj/machinery/computer/prison_shuttle/PS in world)
+ for(var/obj/machinery/computer/prison_shuttle/PS in machines)
PS.allowedtocall = !(PS.allowedtocall)
/proc/call_shuttle_proc(var/mob/user)
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 92f69a70e1..36c2a894e7 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -106,11 +106,11 @@
if(istype(I,/obj/item/weapon/gripper)) //Behold, Grippers and their horribleness. If ..() is called by any computers' attackby() now or in the future, this should let grippers work with them appropriately.
var/obj/item/weapon/gripper/B = I //B, for Borg.
if(!B.wrapped)
- user << "\The [B] is not holding anything."
+ to_chat(user, "\The [B] is not holding anything.")
return
else
var/B_held = B.wrapped
- user << "You use \the [B] to use \the [B_held] with \the [src]."
+ to_chat(user, "You use \the [B] to use \the [B_held] with \the [src].")
playsound(src, "keyboard", 100, 1, 0)
return
attack_hand(user)
diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index 3a70d57173..3345e30ab7 100644
--- a/code/game/machinery/computer/guestpass.dm
+++ b/code/game/machinery/computer/guestpass.dm
@@ -78,6 +78,8 @@
/obj/machinery/computer/guestpass
name = "guest pass terminal"
icon_state = "guest"
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
icon_keyboard = null
icon_screen = "pass"
density = 0
diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm
index 5703c90c8a..7a241cdd7f 100644
--- a/code/game/machinery/computer/law.dm
+++ b/code/game/machinery/computer/law.dm
@@ -10,50 +10,50 @@
var/opened = 0
- verb/AccessInternals()
- set category = "Object"
- set name = "Access Computer's Internals"
- set src in oview(1)
- if(get_dist(src, usr) > 1 || usr.restrained() || usr.lying || usr.stat || istype(usr, /mob/living/silicon))
- return
-
- opened = !opened
- if(opened)
- usr << "The access panel is now open."
- else
- usr << "The access panel is now closed."
+/obj/machinery/computer/aiupload/verb/AccessInternals()
+ set category = "Object"
+ set name = "Access Computer's Internals"
+ set src in oview(1)
+ if(get_dist(src, usr) > 1 || usr.restrained() || usr.lying || usr.stat || istype(usr, /mob/living/silicon))
return
-
- attackby(obj/item/weapon/O as obj, mob/user as mob)
- if (using_map && !(user.z in using_map.contact_levels))
- user << "Unable to establish a connection: You're too far away from the station!"
- return
- if(istype(O, /obj/item/weapon/aiModule))
- var/obj/item/weapon/aiModule/M = O
- M.install(src, user)
- else
- ..()
+ opened = !opened
+ if(opened)
+ to_chat(usr, "The access panel is now open.")
+ else
+ to_chat(usr, "The access panel is now closed.")
+ return
- attack_hand(var/mob/user as mob)
- if(src.stat & NOPOWER)
- usr << "The upload computer has no power!"
- return
- if(src.stat & BROKEN)
- usr << "The upload computer is broken!"
- return
+/obj/machinery/computer/aiupload/attackby(obj/item/weapon/O as obj, mob/user as mob)
+ if (using_map && !(user.z in using_map.contact_levels))
+ to_chat(user, "Unable to establish a connection: You're too far away from the station!")
+ return
+ if(istype(O, /obj/item/weapon/aiModule))
+ var/obj/item/weapon/aiModule/M = O
+ M.install(src, user)
+ else
+ ..()
- src.current = select_active_ai(user)
- if (!src.current)
- usr << "No active AIs detected."
- else
- usr << "[src.current.name] selected for law changes."
+/obj/machinery/computer/aiupload/attack_hand(var/mob/user as mob)
+ if(src.stat & NOPOWER)
+ to_chat(user, "The upload computer has no power!")
+ return
+ if(src.stat & BROKEN)
+ to_chat(user, "The upload computer is broken!")
return
- attack_ghost(user as mob)
- return 1
+ src.current = select_active_ai(user)
+
+ if (!src.current)
+ to_chat(user, "No active AIs detected.")
+ else
+ to_chat(user, "[src.current.name] selected for law changes.")
+ return
+
+/obj/machinery/computer/aiupload/attack_ghost(user as mob)
+ return 1
/obj/machinery/computer/borgupload
@@ -65,28 +65,28 @@
var/mob/living/silicon/robot/current = null
- attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob)
- if(istype(module, /obj/item/weapon/aiModule))
- module.install(src)
- else
- return ..()
+/obj/machinery/computer/borgupload/attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob)
+ if(istype(module, /obj/item/weapon/aiModule))
+ module.install(src, user)
+ else
+ return ..()
- attack_hand(var/mob/user as mob)
- if(src.stat & NOPOWER)
- usr << "The upload computer has no power!"
- return
- if(src.stat & BROKEN)
- usr << "The upload computer is broken!"
- return
-
- src.current = freeborg()
-
- if (!src.current)
- usr << "No free cyborgs detected."
- else
- usr << "[src.current.name] selected for law changes."
+/obj/machinery/computer/borgupload/attack_hand(var/mob/user as mob)
+ if(src.stat & NOPOWER)
+ to_chat(user, "The upload computer has no power!")
+ return
+ if(src.stat & BROKEN)
+ to_chat(user, "The upload computer is broken!")
return
- attack_ghost(user as mob)
- return 1
+ src.current = freeborg()
+
+ if (!src.current)
+ to_chat(user, "No free cyborgs detected.")
+ else
+ to_chat(user, "[src.current.name] selected for law changes.")
+ return
+
+/obj/machinery/computer/borgupload/attack_ghost(user as mob)
+ return 1
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index b51fa788ab..30182937d4 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -122,7 +122,7 @@
dat += "Back"
dat += " Medical Robots:"
var/bdat = null
- for(var/mob/living/bot/medbot/M in world)
+ for(var/mob/living/bot/medbot/M in mob_list)
if(M.z != src.z) continue //only find medibots on the same z-level as the computer
var/turf/bl = get_turf(M)
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index fd82940b6d..670b637152 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -36,7 +36,7 @@
return
if(!istype(user))
return
- if(isscrewdriver(O) && emag)
+ if(O.is_screwdriver() && emag)
//Stops people from just unscrewing the monitor and putting it back to get the console working again.
user << "It is too hot to mess with!"
return
diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm
index 7b34c026d4..1d210787de 100644
--- a/code/game/machinery/computer/pod.dm
+++ b/code/game/machinery/computer/pod.dm
@@ -16,7 +16,7 @@
/obj/machinery/computer/pod/New()
..()
spawn( 5 )
- for(var/obj/machinery/mass_driver/M in world)
+ for(var/obj/machinery/mass_driver/M in machines)
if(M.id == id)
connected = M
else
@@ -32,19 +32,19 @@
viewers(null, null) << "Cannot locate mass driver connector. Cancelling firing sequence!"
return
- for(var/obj/machinery/door/blast/M in world)
+ for(var/obj/machinery/door/blast/M in machines)
if(M.id == id)
M.open()
sleep(20)
- for(var/obj/machinery/mass_driver/M in world)
+ for(var/obj/machinery/mass_driver/M in machines)
if(M.id == id)
M.power = connected.power
M.drive()
sleep(50)
- for(var/obj/machinery/door/blast/M in world)
+ for(var/obj/machinery/door/blast/M in machines)
if(M.id == id)
M.close()
return
@@ -52,11 +52,11 @@
/*
/obj/machinery/computer/pod/attackby(I as obj, user as mob)
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
playsound(src.loc, W.usesound, 50, 1)
if(do_after(user, 20))
if(stat & BROKEN)
- user << "The broken glass falls out."
+ to_chat(user, "The broken glass falls out.")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( loc )
new /obj/item/weapon/material/shard( loc )
@@ -80,7 +80,7 @@
A.anchored = 1
qdel(src)
else
- user << "You disconnect the monitor."
+ to_chat(user << "You disconnect the monitor.")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( loc )
//generate appropriate circuitboard. Accounts for /pod/old computer types
@@ -182,7 +182,7 @@
time += tp
time = min(max(round(time), 0), 120)
if(href_list["door"])
- for(var/obj/machinery/door/blast/M in world)
+ for(var/obj/machinery/door/blast/M in machines)
if(M.id == id)
if(M.density)
M.open()
@@ -210,7 +210,7 @@
/obj/machinery/computer/pod/old/syndicate/attack_hand(var/mob/user as mob)
if(!allowed(user))
- user << "Access Denied"
+ to_chat(user, "Access Denied")
return
else
..()
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index 1b34283d14..cc1d5d0482 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -29,7 +29,7 @@
else if(screen == 1)
dat += " Chemical Implants "
var/turf/Tr = null
- for(var/obj/item/weapon/implant/chem/C in world)
+ for(var/obj/item/weapon/implant/chem/C in all_chem_implants)
Tr = get_turf(C)
if(!Tr) continue//Out of range
if(!C.implanted) continue
@@ -39,7 +39,7 @@
dat += "((10)) "
dat += "******************************** "
dat += " Tracking Implants "
- for(var/obj/item/weapon/implant/tracking/T in world)
+ for(var/obj/item/weapon/implant/tracking/T in all_tracking_implants)
Tr = get_turf(T)
if(!Tr) continue//Out of range
if(!T.implanted) continue
diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm
index 0a337f4df8..1f7c959db5 100644
--- a/code/game/machinery/computer/specops_shuttle.dm
+++ b/code/game/machinery/computer/specops_shuttle.dm
@@ -92,7 +92,7 @@ var/specops_shuttle_timeleft = 0
specops_shuttle_at_station = 0
- for(var/obj/machinery/computer/specops_shuttle/S in world)
+ for(var/obj/machinery/computer/specops_shuttle/S in machines)
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
qdel(announcer)
@@ -159,10 +159,10 @@ var/specops_shuttle_timeleft = 0
sleep(10)
var/spawn_marauder[] = new()
- for(var/obj/effect/landmark/L in world)
+ for(var/obj/effect/landmark/L in landmarks_list)
if(L.name == "Marauder Entry")
spawn_marauder.Add(L)
- for(var/obj/effect/landmark/L in world)
+ for(var/obj/effect/landmark/L in landmarks_list)
if(L.name == "Marauder Exit")
var/obj/effect/portal/P = new(L.loc)
P.invisibility = 101//So it is not seen by anyone.
@@ -233,7 +233,7 @@ var/specops_shuttle_timeleft = 0
var/mob/M = locate(/mob) in T
M << "You have arrived to [station_name()]. Commence operation!"
- for(var/obj/machinery/computer/specops_shuttle/S in world)
+ for(var/obj/machinery/computer/specops_shuttle/S in machines)
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
qdel(announcer)
@@ -241,7 +241,7 @@ var/specops_shuttle_timeleft = 0
/proc/specops_can_move()
if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom)
return 0
- for(var/obj/machinery/computer/specops_shuttle/S in world)
+ for(var/obj/machinery/computer/specops_shuttle/S in machines)
if(world.timeofday <= S.specops_shuttle_timereset)
return 0
return 1
diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm
index e76f4db468..81bd96e6fb 100644
--- a/code/game/machinery/computer/supply.dm
+++ b/code/game/machinery/computer/supply.dm
@@ -1,226 +1,202 @@
+// While it initially feels like the ordering console should be a subtype of the main console,
+// their function is similar enough that the ordering console emerges as the less specialized,
+// and therefore more deserving of parent-class status -- Ater
+
+// Supply requests console
/obj/machinery/computer/supplycomp
+ name = "supply ordering console"
+ icon_screen = "request"
+ circuit = /obj/item/weapon/circuitboard/supplycomp
+ var/authorization = 0
+ var/temp = null
+ var/reqtime = 0 //Cooldown for requisitions - Quarxink
+ var/can_order_contraband = 0
+ var/last_viewed_group = "categories"
+ var/menu_tab = 0
+ var/list/expanded_packs = list()
+
+// Supply control console
+/obj/machinery/computer/supplycomp/control
name = "supply control console"
icon_keyboard = "tech_key"
icon_screen = "supply"
light_color = "#b88b2e"
req_access = list(access_cargo)
circuit = /obj/item/weapon/circuitboard/supplycomp
- var/temp = null
- var/reqtime = 0 //Cooldown for requisitions - Quarxink
- var/can_order_contraband = 0
- var/last_viewed_group = "categories"
-
-/obj/machinery/computer/ordercomp
- name = "supply ordering console"
- icon_screen = "request"
- circuit = /obj/item/weapon/circuitboard/ordercomp
- var/temp = null
- var/reqtime = 0 //Cooldown for requisitions - Quarxink
- var/last_viewed_group = "categories"
-
-/obj/machinery/computer/ordercomp/attack_ai(var/mob/user as mob)
- return attack_hand(user)
+ authorization = SUP_SEND_SHUTTLE | SUP_ACCEPT_ORDERS
/obj/machinery/computer/supplycomp/attack_ai(var/mob/user as mob)
return attack_hand(user)
-/obj/machinery/computer/ordercomp/attack_hand(var/mob/user as mob)
- if(..())
- return
- user.set_machine(src)
- var/dat
- if(temp)
- dat = temp
- else
- var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
- if (shuttle)
- dat += {" Supply shuttle
- Location: [shuttle.has_arrive_time() ? "Moving to station ([shuttle.eta_minutes()] Mins.)":shuttle.at_station() ? "Docked":"Away"]
- Supply points: [supply_controller.points]
- \nRequest items
- View approved orders
- View requests
- \nView export report
- Close"}
-
- user << browse(dat, "window=computer;size=575x450")
- onclose(user, "computer")
- return
-
-/obj/machinery/computer/ordercomp/Topic(href, href_list)
- if(..())
- return 1
-
- if( isturf(loc) && (in_range(src, usr) || istype(usr, /mob/living/silicon)) )
- usr.set_machine(src)
-
- if(href_list["order"])
- if(href_list["order"] == "categories")
- //all_supply_groups
- //Request what?
- last_viewed_group = "categories"
- temp = "Supply points: [supply_controller.points] "
- temp += "Main Menu
"
- temp += "Select a category
"
- for(var/supply_group_name in all_supply_groups )
- temp += "[supply_group_name] "
- else
- last_viewed_group = href_list["order"]
- temp = "Supply points: [supply_controller.points] "
- temp += "Back to all categories
"
- temp += "Request from: [last_viewed_group]
"
- for(var/supply_name in supply_controller.supply_packs )
- var/datum/supply_packs/N = supply_controller.supply_packs[supply_name]
- if(N.hidden || N.contraband || N.group != last_viewed_group) continue //Have to send the type instead of a reference to
- temp += "[supply_name] Cost: [N.cost] " //the obj because it would get caught by the garbage
-
- else if (href_list["doorder"])
- if(world.time < reqtime)
- for(var/mob/V in hearers(src))
- V.show_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"")
- return
-
- //Find the correct supply_pack datum
- var/datum/supply_packs/P = supply_controller.supply_packs[href_list["doorder"]]
- if(!istype(P)) return
-
- var/timeout = world.time + 600
- var/reason = sanitize(input(usr,"Reason:","Why do you require this item?","") as null|text)
- if(world.time > timeout) return
- if(!reason) return
-
- var/idname = "*None Provided*"
- var/idrank = "*None Provided*"
- if(ishuman(usr))
- var/mob/living/carbon/human/H = usr
- idname = H.get_authentification_name()
- idrank = H.get_assignment()
- else if(issilicon(usr))
- idname = usr.real_name
-
- supply_controller.ordernum++
- var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(loc)
- reqform.name = "Requisition Form - [P.name]"
- reqform.info += "[station_name()] Supply Requisition Form "
- reqform.info += "INDEX: #[supply_controller.ordernum] "
- reqform.info += "REQUESTED BY: [idname] "
- reqform.info += "RANK: [idrank] "
- reqform.info += "REASON: [reason] "
- reqform.info += "SUPPLY CRATE TYPE: [P.name] "
- reqform.info += "ACCESS RESTRICTION: [get_access_desc(P.access)] "
- reqform.info += "CONTENTS: "
- reqform.info += P.manifest
- reqform.info += " "
- reqform.info += "STAMP BELOW TO APPROVE THIS REQUISITION: "
-
- reqform.update_icon() //Fix for appearing blank when printed.
- reqtime = (world.time + 5) % 1e5
-
- //make our supply_order datum
- var/datum/supply_order/O = new /datum/supply_order()
- O.ordernum = supply_controller.ordernum
- O.object = P
- O.orderedby = idname
- supply_controller.requestlist += O
-
- temp = "Thanks for your request. The cargo team will process it as soon as possible. "
- temp += " Back Main Menu"
-
- else if (href_list["vieworders"])
- temp = "Current approved orders:
"
- for(var/S in supply_controller.shoppinglist)
- var/datum/supply_order/SO = S
- temp += "[SO.object.name] approved by [SO.orderedby] [SO.comment ? "([SO.comment])":""] "
- temp += " OK"
-
- else if (href_list["viewrequests"])
- temp = "Current requests:
"
- for(var/S in supply_controller.requestlist)
- var/datum/supply_order/SO = S
- temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby] "
- temp += " OK"
-
- else if (href_list["mainmenu"])
- temp = null
-
- add_fingerprint(usr)
- updateUsrDialog()
- return
-
/obj/machinery/computer/supplycomp/attack_hand(var/mob/user as mob)
- if(!allowed(user))
- user << "Access Denied."
- return
-
if(..())
return
user.set_machine(src)
- post_signal("supply")
- var/dat
- if (temp)
- dat = temp
- else
- var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
- if (shuttle)
- dat += " Supply shuttle "
- dat += "\nLocation: "
- if (shuttle.has_arrive_time())
- dat += "In transit ([shuttle.eta_minutes()] Mins.) "
- else
- if (shuttle.at_station())
- if (shuttle.docking_controller)
- switch(shuttle.docking_controller.get_docking_status())
- if ("docked") dat += "Docked at station "
- if ("undocked") dat += "Undocked from station "
- if ("docking") dat += "Docking with station [shuttle.can_force()? "Force Launch" : ""] "
- if ("undocking") dat += "Undocking from station [shuttle.can_force()? "Force Launch" : ""] "
- else
- dat += "Station "
-
- if (shuttle.can_launch())
- dat += "Send away"
- else if (shuttle.can_cancel())
- dat += "Cancel launch"
- else
- dat += "*Shuttle is busy*"
- dat += " \n "
- else
- dat += "Away "
- if (shuttle.can_launch())
- dat += "Request supply shuttle"
- else if (shuttle.can_cancel())
- dat += "Cancel request"
- else
- dat += "*Shuttle is busy*"
- dat += " \n "
-
-
- dat += {" \nSupply points: [supply_controller.points] \n
- \nOrder items \n
- \nView requests \n
- \nView orders \n
- \nView export report \n
- \nClose"}
-
-
- user << browse(dat, "window=computer;size=575x450")
- onclose(user, "computer")
+ ui_interact(user)
return
/obj/machinery/computer/supplycomp/emag_act(var/remaining_charges, var/mob/user)
if(!can_order_contraband)
- user << "Special supplies unlocked."
- can_order_contraband = 1
+ to_chat(user, "Special supplies unlocked.")
+ authorization |= SUP_CONTRABAND
req_access = list()
return 1
+
+
+
+/obj/machinery/computer/supplycomp/ui_interact(mob/user, ui_key = "supply_records", var/datum/nanoui/ui = null, var/force_open = 1, var/key_state = null)
+ var/data[0]
+ var/shuttle_status[0] // Supply shuttle status
+ var/supply_pack[0] // List of supply packs, sorted by category
+ var/sorted_pack[0] // List of supply packs, sorted by category, with numerical indices for nanoUI iteration
+ var/orders[0]
+ var/receipts[0]
+
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
+ if(shuttle)
+ if(shuttle.has_arrive_time())
+ shuttle_status["location"] = "In transit"
+ shuttle_status["mode"] = SUP_SHUTTLE_TRANSIT
+ shuttle_status["time"] = shuttle.eta_minutes()
+
+ else
+ shuttle_status["time"] = 0
+ if(shuttle.at_station())
+ if(shuttle.docking_controller)
+ switch(shuttle.docking_controller.get_docking_status())
+ if("docked")
+ shuttle_status["location"] = "Docked"
+ shuttle_status["mode"] = SUP_SHUTTLE_DOCKED
+ if("undocked")
+ shuttle_status["location"] = "Undocked"
+ shuttle_status["mode"] = SUP_SHUTTLE_UNDOCKED
+ if("docking")
+ shuttle_status["location"] = "Docking"
+ shuttle_status["mode"] = SUP_SHUTTLE_DOCKING
+ shuttle_status["force"] = shuttle.can_force()
+ if("undocking")
+ shuttle_status["location"] = "Undocking"
+ shuttle_status["mode"] = SUP_SHUTTLE_UNDOCKING
+ shuttle_status["force"] = shuttle.can_force()
+
+ else
+ shuttle_status["location"] = "Station"
+ shuttle_status["mode"] = SUP_SHUTTLE_DOCKED
+
+ else
+ shuttle_status["location"] = "Away"
+ shuttle_status["mode"] = SUP_SHUTTLE_AWAY
+
+ if(shuttle.can_launch())
+ shuttle_status["launch"] = 1
+ else if(shuttle.can_cancel())
+ shuttle_status["launch"] = 2
+ else
+ shuttle_status["launch"] = 0
+
+ switch(shuttle.moving_status)
+ if(SHUTTLE_IDLE)
+ shuttle_status["engine"] = "Idle"
+ if(SHUTTLE_WARMUP)
+ shuttle_status["engine"] = "Warming up"
+ if(SHUTTLE_INTRANSIT)
+ shuttle_status["engine"] = "Engaged"
+
+ else
+ shuttle["mode"] = SUP_SHUTTLE_ERROR
+
+ // Uses two separate lists, one of which indexes on the category for easy insertion
+ for(var/cat in all_supply_groups) // Global list of supply categories
+ supply_pack[cat] = list() // Create an index for the category
+
+ for(var/pack_name in supply_controller.supply_pack)
+ var/datum/supply_pack/P = supply_controller.supply_pack[pack_name]
+ var/list/pack = list(
+ "name" = P.name,
+ "cost" = P.cost,
+ "contraband" = P.contraband,
+ "manifest" = uniquelist(P.manifest),
+ "random" = P.num_contained,
+ "expand" = 0,
+ "ref" = "\ref[P]"
+ )
+
+
+ if(P in expanded_packs)
+ pack["expand"] = 1
+
+ supply_pack[P.group][++supply_pack[P.group].len] = pack
+
+ for(var/index in supply_pack)
+ sorted_pack[++sorted_pack.len] = list("name" = index, "category_packs" = supply_pack[index])
+
+ // Compile user-side orders
+ // Status determines which menus the entry will display in
+ // Organized in field-entry list for iterative display
+ // List is nested so both the list of orders, and the list of elements in each order, can be iterated over
+ for(var/datum/supply_order/S in supply_controller.order_history)
+ orders[++orders.len] = list(
+ "ref" = "\ref[S]",
+ "status" = S.status,
+ "entries" = list(
+ list("field" = "Supply Pack", "entry" = S.name),
+ list("field" = "Cost", "entry" = S.cost),
+ list("field" = "Index", "entry" = S.index),
+ list("field" = "Reason", "entry" = S.comment),
+ list("field" = "Ordered by", "entry" = S.ordered_by),
+ list("field" = "Ordered at", "entry" = S.ordered_at),
+ list("field" = "Approved by", "entry" = S.approved_by),
+ list("field" = "Approved at", "entry" = S.approved_at)
+ )
+ )
+
+ // Compile exported crates
+ for(var/datum/exported_crate/E in supply_controller.exported_crates)
+ receipts[++receipts.len] = list(
+ "ref" = "\ref[E]",
+ "contents" = E.contents,
+ "error" = E.contents["error"],
+ "title" = list(
+ list("field" = "Name", "entry" = E.name),
+ list("field" = "Value", "entry" = E.value)
+ )
+ )
+
+ data["user"] = "\ref[user]"
+ data["currentTab"] = menu_tab // Communicator compatibility, controls which menu is in use
+ data["shuttle_auth"] = (authorization & SUP_SEND_SHUTTLE) // Whether this ui is permitted to control the supply shuttle
+ data["order_auth"] = (authorization & SUP_ACCEPT_ORDERS) // Whether this ui is permitted to accept/deny requested orders
+ data["shuttle"] = shuttle_status
+ data["supply_points"] = supply_controller.points
+ data["supply_packs"] = sorted_pack
+ data["orders"] = orders
+ data["receipts"] = receipts
+ data["contraband"] = can_order_contraband
+
+ // update the ui if it exists, returns null if no ui is passed/found
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ // the ui does not exist, so we'll create a new() one
+ // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
+ ui = new(user, src, ui_key, "supply_records.tmpl", "Supply Console", 475, 700, state = key_state)
+ // when the ui is first opened this is the data it will use
+ ui.set_initial_data(data)
+ // open the new ui window
+ ui.open()
+ // auto update every five Master Controller tick
+ ui.set_auto_update(5)
+
+
+
+
/obj/machinery/computer/supplycomp/Topic(href, href_list)
if(!supply_controller)
- world.log << "## ERROR: Eek. The supply_controller controller datum is missing somehow."
+ world.log << "## ERROR: The supply_controller datum is missing."
return
var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
if (!shuttle)
- world.log << "## ERROR: Eek. The supply/shuttle datum is missing somehow."
+ world.log << "## ERROR: The supply shuttle datum is missing."
return
if(..())
return 1
@@ -228,177 +204,210 @@
if(isturf(loc) && ( in_range(src, usr) || istype(usr, /mob/living/silicon) ) )
usr.set_machine(src)
- //Calling the shuttle
- if(href_list["send"])
- if(shuttle.at_station())
- if (shuttle.forbidden_atoms_check())
- temp = "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.
OK"
- else
- shuttle.launch(src)
- temp = "Initiating launch sequence. \[Force Launch\]
OK"
- else
- shuttle.launch(src)
- temp = "The supply shuttle has been called and will arrive in approximately [round(supply_controller.movetime/600,1)] minutes.
OK"
- post_signal("supply")
+ // NEW TOPIC
- if (href_list["force_send"])
- shuttle.force_launch(src)
+ // Switch menu
+ if(href_list["switch_tab"])
+ menu_tab = href_list["switch_tab"]
- if (href_list["cancel_send"])
- shuttle.cancel_launch(src)
+ if(href_list["pack_ref"])
+ var/datum/supply_pack/S = locate(href_list["pack_ref"])
- else if (href_list["order"])
- //if(!shuttle.idle()) return //this shouldn't be necessary it seems
- if(href_list["order"] == "categories")
- //all_supply_groups
- //Request what?
- last_viewed_group = "categories"
- temp = "Supply points: [supply_controller.points] "
- temp += "Main Menu
"
- temp += "Select a category
"
- for(var/supply_group_name in all_supply_groups )
- temp += "[supply_group_name] "
- else
- last_viewed_group = href_list["order"]
- temp = "Supply points: [supply_controller.points] "
- temp += "Back to all categories
"
- temp += "Request from: [last_viewed_group]
"
- for(var/supply_name in supply_controller.supply_packs )
- var/datum/supply_packs/N = supply_controller.supply_packs[supply_name]
- if((N.contraband && !can_order_contraband) || N.group != last_viewed_group) continue //Have to send the type instead of a reference to
- temp += "[supply_name] Cost: [N.cost] " //the obj because it would get caught by the garbage
-
- else if (href_list["doorder"])
- if(world.time < reqtime)
- for(var/mob/V in hearers(src))
- V.show_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"")
+ // Invalid ref
+ if(!istype(S))
return
- //Find the correct supply_pack datum
- var/datum/supply_packs/P = supply_controller.supply_packs[href_list["doorder"]]
- if(!istype(P)) return
+ // Expand the supply pack's contents
+ if(href_list["expand"])
+ expanded_packs ^= S
- var/timeout = world.time + 600
- var/reason = sanitize(input(usr,"Reason:","Why do you require this item?","") as null|text)
- if(world.time > timeout) return
- if(!reason) return
+ // Make a request for the pack
+ if(href_list["request"])
+ var/mob/user = locate(href_list["user"])
+ if(!istype(user)) // Invalid ref
+ return
- var/idname = "*None Provided*"
- var/idrank = "*None Provided*"
- if(ishuman(usr))
- var/mob/living/carbon/human/H = usr
- idname = H.get_authentification_name()
- idrank = H.get_assignment()
- else if(issilicon(usr))
- idname = usr.real_name
+ if(world.time < reqtime)
+ visible_message("[src]'s monitor flashes, \"[reqtime - world.time] seconds remaining until another requisition form may be printed.\"")
+ return
- supply_controller.ordernum++
- var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(loc)
- reqform.name = "Requisition Form - [P.name]"
- reqform.info += "[station_name()] Supply Requisition Form "
- reqform.info += "INDEX: #[supply_controller.ordernum] "
- reqform.info += "REQUESTED BY: [idname] "
- reqform.info += "RANK: [idrank] "
- reqform.info += "REASON: [reason] "
- reqform.info += "SUPPLY CRATE TYPE: [P.name] "
- reqform.info += "ACCESS RESTRICTION: [get_access_desc(P.access)] "
- reqform.info += "CONTENTS: "
- reqform.info += P.manifest
- reqform.info += " "
- reqform.info += "STAMP BELOW TO APPROVE THIS REQUISITION: "
+ var/timeout = world.time + 600
+ var/reason = sanitize(input(user, "Reason:","Why do you require this item?","") as null|text)
+ if(world.time > timeout)
+ to_chat(user, "Error. Request timed out.")
+ return
+ if(!reason)
+ return
- reqform.update_icon() //Fix for appearing blank when printed.
- reqtime = (world.time + 5) % 1e5
+ supply_controller.create_order(S, user, reason)
- //make our supply_order datum
- var/datum/supply_order/O = new /datum/supply_order()
- O.ordernum = supply_controller.ordernum
- O.object = P
- O.orderedby = idname
- supply_controller.requestlist += O
+ var/idname = "*None Provided*"
+ var/idrank = "*None Provided*"
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ idname = H.get_authentification_name()
+ idrank = H.get_assignment()
+ else if(issilicon(user))
+ idname = user.real_name
+ idrank = "Stationbound synthetic"
- temp = "Order request placed. "
- temp += " Back | Main Menu | Authorize Order"
+ var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(loc)
+ reqform.name = "Requisition Form - [S.name]"
+ reqform.info += "[station_name()] Supply Requisition Form "
+ reqform.info += "INDEX: #[supply_controller.ordernum] "
+ reqform.info += "REQUESTED BY: [idname] "
+ reqform.info += "RANK: [idrank] "
+ reqform.info += "REASON: [reason] "
+ reqform.info += "SUPPLY CRATE TYPE: [S.name] "
+ reqform.info += "ACCESS RESTRICTION: [get_access_desc(S.access)] "
+ reqform.info += "CONTENTS: "
+ reqform.info += S.get_html_manifest()
+ reqform.info += " "
+ reqform.info += "STAMP BELOW TO APPROVE THIS REQUISITION: "
- else if(href_list["confirmorder"])
- //Find the correct supply_order datum
- var/ordernum = text2num(href_list["confirmorder"])
- var/datum/supply_order/O
- var/datum/supply_packs/P
- temp = "Invalid Request"
- for(var/i=1, i<=supply_controller.requestlist.len, i++)
- var/datum/supply_order/SO = supply_controller.requestlist[i]
- if(SO.ordernum == ordernum)
- O = SO
- P = O.object
- if(supply_controller.points >= P.cost)
- supply_controller.requestlist.Cut(i,i+1)
- supply_controller.points -= P.cost
- supply_controller.shoppinglist += O
- temp = "Thanks for your order. "
- temp += " Back Main Menu"
- else
- temp = "Not enough supply points. "
- temp += " Back Main Menu"
- break
+ reqform.update_icon() //Fix for appearing blank when printed.
+ reqtime = (world.time + 5) % 1e5
- else if (href_list["vieworders"])
- temp = "Current approved orders:
"
- for(var/S in supply_controller.shoppinglist)
- var/datum/supply_order/SO = S
- temp += "#[SO.ordernum] - [SO.object.name] approved by [SO.orderedby][SO.comment ? " ([SO.comment])":""] "// (Cancel) "
- temp += " OK"
-/*
- else if (href_list["cancelorder"])
- var/datum/supply_order/remove_supply = href_list["cancelorder"]
- supply_shuttle_shoppinglist -= remove_supply
- supply_shuttle_points += remove_supply.object.cost
- temp += "Canceled: [remove_supply.object.name]
"
+ if(href_list["order_ref"])
+ var/datum/supply_order/O = locate(href_list["order_ref"])
- for(var/S in supply_shuttle_shoppinglist)
- var/datum/supply_order/SO = S
- temp += "[SO.object.name] approved by [SO.orderedby][SO.comment ? " ([SO.comment])":""] (Cancel) "
- temp += " OK"
-*/
- else if (href_list["viewrequests"])
- temp = "Current requests:
"
- for(var/S in supply_controller.requestlist)
- var/datum/supply_order/SO = S
- temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby] Approve Remove "
+ // Invalid ref
+ if(!istype(O))
+ return
- temp += " Clear list"
- temp += " OK"
+ var/mob/user = locate(href_list["user"])
+ if(!istype(user)) // Invalid ref
+ return
- else if (href_list["viewexport"])
- temp = "Previous shuttle export report:
"
- var/cratecount = 0
- var/totalvalue = 0
- for(var/S in supply_controller.exported_crates)
- var/datum/exported_crate/EC = S
- cratecount += 1
- totalvalue += EC.value
- temp += "[EC.name] exported for [EC.value] supply points "
- temp += " Shipment of [cratecount] crates exported for [totalvalue] supply points. "
- temp += " OK"
+ if(href_list["edit"])
+ var/new_val = sanitize(input(user, href_list["edit"], "Enter the new value for this field:", href_list["default"]) as null|text)
+ if(!new_val)
+ return
- else if (href_list["rreq"])
- var/ordernum = text2num(href_list["rreq"])
- temp = "Invalid Request. "
- for(var/i=1, i<=supply_controller.requestlist.len, i++)
- var/datum/supply_order/SO = supply_controller.requestlist[i]
- if(SO.ordernum == ordernum)
- supply_controller.requestlist.Cut(i,i+1)
- temp = "Request removed. "
- break
- temp += " Back Main Menu"
+ switch(href_list["edit"])
+ if("Supply Pack")
+ O.name = new_val
- else if (href_list["clearreq"])
- supply_controller.requestlist.Cut()
- temp = "List cleared. "
- temp += " OK"
+ if("Cost")
+ var/num = text2num(new_val)
+ if(num)
+ O.cost = num
- else if (href_list["mainmenu"])
- temp = null
+ if("Index")
+ var/num = text2num(new_val)
+ if(num)
+ O.index = num
+
+ if("Reason")
+ O.comment = new_val
+
+ if("Ordered by")
+ O.ordered_by = new_val
+
+ if("Ordered at")
+ O.ordered_at = new_val
+
+ if("Approved by")
+ O.approved_by = new_val
+
+ if("Approved at")
+ O.approved_at = new_val
+
+ if(href_list["approve"])
+ supply_controller.approve_order(O, user)
+
+ if(href_list["deny"])
+ supply_controller.deny_order(O, user)
+
+ if(href_list["delete"])
+ supply_controller.delete_order(O, user)
+
+ if(href_list["clear_all_requests"])
+ var/mob/user = locate(href_list["user"])
+ if(!istype(user)) // Invalid ref
+ return
+
+ supply_controller.deny_all_pending(user)
+
+ if(href_list["export_ref"])
+ var/datum/exported_crate/E = locate(href_list["export_ref"])
+
+ // Invalid ref
+ if(!istype(E))
+ return
+
+ var/mob/user = locate(href_list["user"])
+ if(!istype(user)) // Invalid ref
+ return
+
+ if(href_list["index"])
+ var/list/L = E.contents[href_list["index"]]
+
+ if(href_list["edit"])
+ var/field = alert(user, "Select which field to edit", , "Name", "Quantity", "Value")
+
+ var/new_val = sanitize(input(user, href_list["edit"], "Enter the new value for this field:", href_list["default"]) as null|text)
+ if(!new_val)
+ return
+
+ switch(field)
+ if("Name")
+ L["object"] = new_val
+
+ if("Quantity")
+ var/num = text2num(new_val)
+ if(num)
+ L["quantity"] = num
+
+ if("Value")
+ var/num = text2num(new_val)
+ if(num)
+ L["value"] = num
+
+ if(href_list["delete"])
+ E.contents.Cut(href_list["index"], href_list["index"] + 1)
+
+ // Else clause means they're editing/deleting the whole export report, rather than a specific item in it
+ else if(href_list["edit"])
+ var/new_val = sanitize(input(user, href_list["edit"], "Enter the new value for this field:", href_list["default"]) as null|text)
+ if(!new_val)
+ return
+
+ switch(href_list["edit"])
+ if("Name")
+ E.name = new_val
+
+ if("Value")
+ var/num = text2num(new_val)
+ if(num)
+ E.value = num
+
+ else if(href_list["delete"])
+ supply_controller.delete_export(E, user)
+
+ else if(href_list["add_item"])
+ supply_controller.add_export_item(E, user)
+
+
+
+ switch(href_list["send_shuttle"])
+ if("send_away")
+ if (shuttle.forbidden_atoms_check())
+ to_chat(usr, "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.")
+ else
+ shuttle.launch(src)
+ to_chat(usr, "Initiating launch sequence.")
+
+ if("send_to_station")
+ shuttle.launch(src)
+ to_chat(usr, "The supply shuttle has been called and will arrive in approximately [round(supply_controller.movetime/600,1)] minutes.")
+ post_signal("supply")
+
+ if("cancel_shuttle")
+ shuttle.cancel_launch(src)
+
+ if("force_shuttle")
+ shuttle.force_launch(src)
add_fingerprint(usr)
updateUsrDialog()
diff --git a/code/game/machinery/computer3/NTOS.dm b/code/game/machinery/computer3/NTOS.dm
index 8b37c23732..a9068a634f 100644
--- a/code/game/machinery/computer3/NTOS.dm
+++ b/code/game/machinery/computer3/NTOS.dm
@@ -209,8 +209,8 @@
return
if("viewperipheral" in href_list) // open drive, show status of peripheral
- var/obj/item/part/computer/C = locate(href_list["viewperipheral"])
- if(!istype(C) || (C.loc != src.computer))
+ var/obj/item/part/computer/C = locate(href_list["viewperipheral"]) in src.computer
+ if(!istype(C))
return
if(istype(C,/obj/item/part/computer/storage))
@@ -219,13 +219,7 @@
return
// else ???
if(istype(C,/obj/item/part/computer/cardslot))
- if(computer.cardslot.reader != null)
- computer.cardslot.remove()
- if(istype(C,/obj/item/part/computer/cardslot/dual))
- if(computer.cardslot.writer != null)
- computer.cardslot.remove(computer.cardslot.writer)
- if(computer.cardslot.reader != null)
- computer.cardslot.remove(computer.cardslot.reader)
+ computer.cardslot.remove(usr)
interact()
return
diff --git a/code/game/machinery/computer3/bios.dm b/code/game/machinery/computer3/bios.dm
index ebcacdce76..c5b69e755b 100644
--- a/code/game/machinery/computer3/bios.dm
+++ b/code/game/machinery/computer3/bios.dm
@@ -13,147 +13,137 @@
interactable(user): performs all standard sanity checks
Call in topic() and interact().
*/
- proc/interactable(var/mob/user)
- if( !src || !user || stat || user.stat || user.lying || user.blinded )
- return 0
- if(!program)
- return 0
+/obj/machinery/computer3/proc/interactable(var/mob/user)
+ if( !src || !user || stat || user.stat || user.lying || user.blinded )
+ return 0
+ if(!program)
+ return 0
+ if(!isturf(loc) || !isturf(user.loc)) // todo handheld maybe
+ return 0
+ if(user.restrained())
+ to_chat(user, "You need a free hand!")
+ return 0
- if(!istype(loc,/turf) || !istype(user.loc,/turf)) // todo handheld maybe
- return 0
+ if(issilicon(user) &&!program.ai_allowed )
+ to_chat(user, "You are forbidden from accessing this program.")
+ return 0
+ if(!ishuman(user) && program.human_controls)
+ to_chat(user, "Your body can't work the controls!")
+ return 0
- if(istype(user,/mob/living/silicon))
- if(!program.ai_allowed)
- user << "You are forbidden from accessing this program."
- return 0
- else
- if(program.human_controls)
- if(!ishuman(user))
- user << "Your body can't work the controls!"
- return 0
- if(user.restrained())
- user << "You need a free hand!"
- return 0
- if(!in_range(src,user))
- // telekinesis check
- if(ishuman(user) && istype(user.get_active_hand(),/obj/item/tk_grab))
- if(program.human_controls)
- user << "It's too complicated to work at a distance!"
- return 0
- add_fingerprint(user)
- user.set_machine(src)
- return 1
- return 0
+ if(!in_range(src,user) && (!program.human_controls || !istype(user.get_active_hand(),/obj/item/tk_grab)))
+ // telekinesis check
+ to_chat(user, "It's too complicated to work at a distance!")
+ return 0
- add_fingerprint(user)
- user.set_machine(src)
- return 1
+ add_fingerprint(user)
+ user.set_machine(src)
+ return 1
/*
Deduplicates an item list and gives you range and direction.
This is used for networking so you can determine which of several
identically named objects you're referring to.
*/
- proc/format_atomlist(var/list/atoms)
- var/list/output = list()
- for(var/atom/A in atoms)
- var/title = "[A] (Range [get_dist(A,src)] meters, [dir2text(get_dir(src,A))])"
- output[title] = A
- return output
+/obj/machinery/computer3/proc/format_atomlist(var/list/atoms)
+ var/list/output = list()
+ for(var/atom/A in atoms)
+ var/title = "[A] (Range [get_dist(A,src)] meters, [dir2text(get_dir(src,A))])"
+ output[title] = A
+ return output
/*
This is used by the camera monitoring program to see if you're still in range
*/
- check_eye(var/mob/user as mob)
- if(!interactable(user) || user.machine != src)
- if(user.machine == src)
- user.unset_machine()
- return -1
+/obj/machinery/computer3/check_eye(var/mob/user as mob)
+ if(!interactable(user) || user.machine != src)
+ if(user.machine == src)
+ user.unset_machine()
+ return -1
- var/datum/file/program/security/S = program
- if( !istype(S) || !S.current || !S.current.status || !camnet )
- if( user.machine == src )
- user.unset_machine()
- return -1
+ var/datum/file/program/security/S = program
+ if( !istype(S) || !S.current || !S.current.status || !camnet )
+ if( user.machine == src )
+ user.unset_machine()
+ return -1
- user.reset_view(S.current, 0)
- return 0
+ user.reset_view(S.current, 0)
+ return 0
/*
List all files, including removable disks and data cards
(I don't know why but I don't want to rip data cards out.
It just seems... interesting?)
*/
- proc/list_files(var/typekey = null)
- var/list/files = list()
- if(hdd)
- files += hdd.files
- if(floppy && floppy.inserted)
- files += floppy.inserted.files
- if(cardslot && istype(cardslot.reader,/obj/item/weapon/card/data))
- files += cardslot.reader:files
- if(!ispath(typekey))
- return files
-
- var/i = 1
- while(i<=files.len)
- if(istype(files[i],typekey))
- i++
- continue
- files.Cut(i,i+1)
+/obj/machinery/computer3/proc/list_files(var/typekey = null)
+ var/list/files = list()
+ if(hdd)
+ files += hdd.files
+ if(floppy && floppy.inserted)
+ files += floppy.inserted.files
+ if(cardslot && istype(cardslot.reader,/obj/item/weapon/card/data))
+ files += cardslot.reader:files
+ if(!ispath(typekey))
return files
+ var/i = 1
+ while(i<=files.len)
+ if(istype(files[i],typekey))
+ i++
+ continue
+ files.Cut(i,i+1)
+ return files
+
/*
Crash the computer with an error.
Todo: redo
*/
- proc/Crash(var/errorcode = PROG_CRASH)
- if(!src)
- return null
-
- switch(errorcode)
- if(PROG_CRASH)
- if(usr)
- usr << "The program crashed!"
- usr << browse(null,"\ref[src]")
- Reset()
-
- if(MISSING_PERIPHERAL)
- Reset()
- if(usr)
- usr << browse("ERROR: Missing or disabled componentA hardware failure has occured. Please insert or replace the missing or damaged component and restart the computer.","window=\ref[src]")
-
- if(BUSTED_ASS_COMPUTER)
- Reset()
- os.error = BUSTED_ASS_COMPUTER
- if(usr)
- usr << browse("ERROR: Missing or disabled componentA hardware failure has occured. Please insert or replace the missing or damaged component and restart the computer.","window=\ref[src]")
-
- if(MISSING_PROGRAM)
- Reset()
- if(usr)
- usr << browse("ERROR: No associated programThis file requires a specific program to open, which cannot be located. Please install the related program and try again.","window=\ref[src]")
-
- if(FILE_DRM)
- Reset()
- if(usr)
- usr << browse("ERROR: File operation prohibitedCopy protection exception: missing authorization token.","window=\ref[src]")
-
- if(NETWORK_FAILURE)
- Reset()
- if(usr)
- usr << browse("ERROR: Networking exception: Unable to connect to remote host.","window=\ref[src]")
-
-
- else
- if(usr)
- usr << "The program crashed!"
- usr << browse(null,"\ref[src]")
- testing("computer/Crash() - unknown error code [errorcode]")
- Reset()
+/obj/machinery/computer3/proc/Crash(var/errorcode = PROG_CRASH)
+ if(!src)
return null
+ switch(errorcode)
+ if(PROG_CRASH)
+ if(usr)
+ usr << "The program crashed!"
+ usr << browse(null,"\ref[src]")
+ Reset()
+
+ if(MISSING_PERIPHERAL)
+ Reset()
+ if(usr)
+ usr << browse("ERROR: Missing or disabled componentA hardware failure has occured. Please insert or replace the missing or damaged component and restart the computer.","window=\ref[src]")
+
+ if(BUSTED_ASS_COMPUTER)
+ Reset()
+ os.error = BUSTED_ASS_COMPUTER
+ if(usr)
+ usr << browse("ERROR: Missing or disabled componentA hardware failure has occured. Please insert or replace the missing or damaged component and restart the computer.","window=\ref[src]")
+
+ if(MISSING_PROGRAM)
+ Reset()
+ if(usr)
+ usr << browse("ERROR: No associated programThis file requires a specific program to open, which cannot be located. Please install the related program and try again.","window=\ref[src]")
+
+ if(FILE_DRM)
+ Reset()
+ if(usr)
+ usr << browse("ERROR: File operation prohibitedCopy protection exception: missing authorization token.","window=\ref[src]")
+
+ if(NETWORK_FAILURE)
+ Reset()
+ if(usr)
+ usr << browse("ERROR: Networking exception: Unable to connect to remote host.","window=\ref[src]")
+
+ else
+ if(usr)
+ usr << "The program crashed!"
+ usr << browse(null,"\ref[src]")
+ testing("computer/Crash() - unknown error code [errorcode]")
+ Reset()
+ return null
+
#define ANY_DRIVE 0
#define PREFER_FLOPPY 1
#define PREFER_CARD 2
@@ -161,22 +151,26 @@
// required_location: only put on preferred devices
- proc/writefile(var/datum/file/F, var/where = ANY_DRIVE, var/required_location = 0)
- if(where != ANY_DRIVE)
- if((where&PREFER_FLOPPY) && floppy && floppy.addfile(F))
- return 1
- if((where&PREFER_CARD) && cardslot && cardslot.addfile(F))
- return 1
- if((where&PREFER_HDD) && hdd && hdd.addfile(F))
+/obj/machinery/computer3/proc/writefile(var/datum/file/F, var/where = ANY_DRIVE, var/required_location = 0)
+ if(where != ANY_DRIVE)
+ if((where&PREFER_FLOPPY) && floppy && floppy.addfile(F))
+ return 1
+ if((where&PREFER_CARD) && istype(cardslot, /obj/item/part/computer/cardslot/dual))
+ var/obj/item/part/computer/cardslot/dual/D = cardslot
+ if(D.addfile(F))
return 1
+ if((where&PREFER_HDD) && hdd && hdd.addfile(F))
+ return 1
- if(required_location)
- return 0
+ if(required_location)
+ return 0
- if(floppy && floppy.addfile(F))
+ if(floppy && floppy.addfile(F))
+ return 1
+ if(istype(cardslot, /obj/item/part/computer/cardslot/dual))
+ var/obj/item/part/computer/cardslot/dual/D = cardslot
+ if(D.addfile(F))
return 1
- if(cardslot && cardslot.addfile(F))
- return 1
- if(hdd && hdd.addfile(F))
- return 1
- return 0
+ if(hdd && hdd.addfile(F))
+ return 1
+ return 0
diff --git a/code/game/machinery/computer3/buildandrepair.dm b/code/game/machinery/computer3/buildandrepair.dm
index f780e42b27..928675769c 100644
--- a/code/game/machinery/computer3/buildandrepair.dm
+++ b/code/game/machinery/computer3/buildandrepair.dm
@@ -78,69 +78,69 @@
/obj/structure/computer3frame/attackby(obj/item/P as obj, mob/user as mob)
switch(state)
if(0)
- if(istype(P, /obj/item/weapon/wrench))
+ if(P.is_wrench())
playsound(src.loc, P.usesound, 50, 1)
if(do_after(user, 20 * P.toolspeed))
- user << "You wrench the frame into place."
+ to_chat(user, "You wrench the frame into place.")
src.anchored = 1
src.state = 1
if(istype(P, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = P
if(!WT.remove_fuel(0, user))
- user << "The welding tool must be on to complete this task."
+ to_chat(user, "The welding tool must be on to complete this task.")
return
playsound(src.loc, WT.usesound, 50, 1)
if(do_after(user, 20 * WT.toolspeed))
if(!src || !WT.isOn()) return
- user << "You deconstruct the frame."
+ to_chat(user, "You deconstruct the frame.")
new /obj/item/stack/material/steel( src.loc, 5 )
qdel(src)
if(1)
- if(istype(P, /obj/item/weapon/wrench))
+ if(P.is_wrench())
playsound(src.loc, P.usesound, 50, 1)
if(do_after(user, 20 * P.toolspeed))
- user << "You unfasten the frame."
+ to_chat(user, "You unfasten the frame.")
src.anchored = 0
src.state = 0
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "computer")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- user << "You place the circuit board inside the frame."
+ to_chat(user, "You place the circuit board inside the frame.")
src.icon_state = "1"
src.circuit = P
user.drop_item()
P.loc = src
else
- user << "This frame does not accept circuit boards of this type!"
- if(istype(P, /obj/item/weapon/screwdriver) && circuit)
+ to_chat(user, "This frame does not accept circuit boards of this type!")
+ if(P.is_screwdriver() && circuit)
playsound(src.loc, P.usesound, 50, 1)
- user << "You screw the circuit board into place."
+ to_chat(user, "You screw the circuit board into place.")
src.state = 2
src.icon_state = "2"
- if(istype(P, /obj/item/weapon/crowbar) && circuit)
+ if(P.is_crowbar() && circuit)
playsound(src.loc, P.usesound, 50, 1)
- user << "You remove the circuit board."
+ to_chat(user, "You remove the circuit board.")
src.state = 1
src.icon_state = "0"
circuit.loc = src.loc
src.circuit = null
if(2)
- if(istype(P, /obj/item/weapon/screwdriver) && circuit)
+ if(P.is_screwdriver() && circuit)
playsound(src.loc, P.usesound, 50, 1)
- user << "You unfasten the circuit board."
+ to_chat(user, "You unfasten the circuit board.")
src.state = 1
src.icon_state = "1"
- if(istype(P, /obj/item/weapon/crowbar))
+ if(P.is_crowbar())
if(battery)
playsound(src.loc, P.usesound, 50, 1)
if(do_after(10 * P.toolspeed))
battery.loc = loc
- user << "You remove [battery]."
+ to_chat(user, "You remove [battery].")
battery = null
else
- user << "There's no battery to remove!"
+ to_chat(user, "There's no battery to remove!")
if(istype(P, /obj/item/weapon/cell))
if(!battery)
@@ -148,9 +148,9 @@
if(do_after(5))
battery = P
P.loc = src
- user << "You insert [battery]."
+ to_chat(user, "You insert [battery].")
else
- user << "There's already \an [battery] in [src]!"
+ to_chat(user, "There's already \an [battery] in [src]!")
if(istype(P, /obj/item/stack/cable_coil))
@@ -160,22 +160,22 @@
if(P)
P:amount -= 5
if(!P:amount) qdel(P)
- user << "You add cables to the frame."
+ to_chat(user, "You add cables to the frame.")
src.state = 3
src.icon_state = "3"
if(3)
- if(istype(P, /obj/item/weapon/wirecutters))
+ if(P.is_wirecutter())
if(components.len)
- user << "There are parts in the way!"
+ to_chat(user, "There are parts in the way!")
return
playsound(src.loc, P.usesound, 50, 1)
- user << "You remove the cables."
+ to_chat(user, "You remove the cables.")
src.state = 2
src.icon_state = "2"
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc )
A.amount = 5
- if(istype(P, /obj/item/weapon/crowbar)) // complicated check
+ if(P.is_crowbar())
remove_peripheral()
if(istype(P, /obj/item/stack/material) && P.get_material_name() == "glass")
@@ -185,19 +185,19 @@
if(do_after(user, 20))
if(S)
S.use(2)
- user << "You put in the glass panel."
+ to_chat(user, "You put in the glass panel.")
src.state = 4
src.icon_state = "4"
if(4)
- if(istype(P, /obj/item/weapon/crowbar))
+ if(P.is_crowbar())
playsound(src.loc, P.usesound, 50, 1)
- user << "You remove the glass panel."
+ to_chat(user, "You remove the glass panel.")
src.state = 3
src.icon_state = "3"
new /obj/item/stack/material/glass( src.loc, 2 )
- if(istype(P, /obj/item/weapon/screwdriver))
+ if(P.is_screwdriver())
playsound(src.loc, P.usesound, 50, 1)
- user << "You connect the monitor."
+ to_chat(user, "You connect the monitor.")
var/obj/machinery/computer3/B = new src.circuit.build_path ( src.loc, built=1 )
/*if(circuit.powernet) B:powernet = circuit.powernet
if(circuit.id) B:id = circuit.id
@@ -220,7 +220,7 @@
*/
/obj/structure/computer3frame/proc/remove_peripheral(var/obj/item/I = null)
if(!components || !components.len)
- usr << "There are no components in [src] to take out!"
+ to_chat(usr, "There are no components in [src] to take out!")
return 0
if(!I)
I = input(usr, "Remove which component?","Remove component", null) as null|obj in components
@@ -259,44 +259,45 @@
else
warning("Erronous component in computerframe/remove_peripheral: [I]")
I.loc = loc
- usr << "You remove [I]"
+ to_chat(usr, "You remove [I]")
return 1
return 0
+
/obj/structure/computer3frame/proc/insert_peripheral(var/obj/item/I)
if(components.len >= max_components)
- usr << "There isn't room in [src] for another component!"
+ to_chat(usr, "There isn't room in [src] for another component!")
return 0
switch(I.type)
if(/obj/item/part/computer/storage/hdd)
if(hdd)
- usr << "There is already \an [hdd] in [src]!"
+ to_chat(usr, "There is already \an [hdd] in [src]!")
return 0
hdd = I
components += hdd
hdd.loc = src
if(/obj/item/part/computer/storage/removable)
if(floppy)
- usr << "There is already \an [floppy] in [src]!"
+ to_chat(usr, "There is already \an [floppy] in [src]!")
return 0
floppy = I
components += floppy
floppy.loc = src
if(/obj/item/part/computer/networking/radio)
if(radio)
- usr << "There is already \an [radio] in [src]!"
+ to_chat(usr, "There is already \an [radio] in [src]!")
return 0
radio = I
components += radio
radio.loc = src
if(/obj/item/part/computer/networking/cameras)
if(camnet)
- usr << "There is already \an [camnet] in [src]!"
+ to_chat(usr, "There is already \an [camnet] in [src]!")
return 0
camnet = I
components += camnet
camnet.loc = src
if(/obj/item/part/computer/networking)
if(net)
- usr << "There is already \an [net] in [src]!"
+ to_chat(usr, "There is already \an [net] in [src]!")
diff --git a/code/game/machinery/computer3/component.dm b/code/game/machinery/computer3/component.dm
index 44540a9299..3c8d972825 100644
--- a/code/game/machinery/computer3/component.dm
+++ b/code/game/machinery/computer3/component.dm
@@ -23,14 +23,14 @@
// If the computer is attacked by an item it will reference this to decide which peripheral(s) are affected.
var/list/attackby_types = list()
- proc/allow_attackby(var/obj/item/I as obj,var/mob/user as mob)
- for(var/typekey in attackby_types)
- if(istype(I,typekey))
- return 1
- return 0
+/obj/item/part/computer/proc/allow_attackby(var/obj/item/I, var/mob/user)
+ for(var/typepath in attackby_types)
+ if(istype(I, typepath))
+ return 1
+ return 0
- proc/init(var/obj/machinery/computer/target)
+/obj/item/part/computer/proc/init(var/obj/machinery/computer/target)
computer = target
// continue to handle all other type-specific procedures
@@ -49,40 +49,39 @@
var/mob/living/silicon/ai/occupant = null
var/busy = 0
- attackby(obj/I as obj,mob/user as mob)
- if(computer && !computer.stat)
+/obj/item/part/computer/ai_holder/attackby(obj/I as obj,mob/user as mob)
+ if(computer && !computer.stat)
+ if(istype(I, /obj/item/device/aicard))
+ var/obj/item/device/aicard/card = I
+ var/mob/living/silicon/ai/comp_ai = locate() in src
+ var/mob/living/silicon/ai/card_ai = locate() in card
- if(istype(I, /obj/item/device/aicard))
+ if(istype(comp_ai))
+ if(busy)
+ to_chat(user, "ERROR: Reconstruction in progress.")
+ return
- var/obj/item/device/aicard/card = I
- var/mob/living/silicon/ai/comp_ai = locate() in src
- var/mob/living/silicon/ai/card_ai = locate() in card
+ if(card.grab_ai(comp_ai, user))
+ occupant = null
- if(istype(comp_ai))
- if(busy)
- user << "ERROR: Reconstruction in progress."
- return
- card.grab_ai(comp_ai, user)
- if(!(locate(/mob/living/silicon/ai) in src)) occupant = null
- else if(istype(card_ai))
- load_ai(card_ai,card,user)
- occupant = locate(/mob/living/silicon/ai) in src
+ else if(istype(card_ai))
+ load_ai(card_ai,card,user)
- if(computer.program)
- computer.program.update_icon()
- computer.update_icon()
- computer.occupant = occupant
- ..()
- return
+ if(computer.program)
+ computer.program.update_icon()
+
+ computer.update_icon()
+ ..()
+ return
/obj/item/part/computer/ai_holder/proc/load_ai(var/mob/living/silicon/ai/transfer, var/obj/item/device/aicard/card, var/mob/user)
- if(!transfer)
+ if(!istype(transfer))
return
// Transfer over the AI.
- transfer << "You have been transferred into a mobile terminal. Sadly, there is no remote access from here."
- user << "Transfer successful: [transfer.name] placed within mobile terminal."
+ to_chat(transfer, "You have been transferred into a mobile terminal. Sadly, there is no remote access from here.")
+ to_chat(user, "Transfer successful: [transfer.name] placed within mobile terminal.")
transfer.loc = src
transfer.cancel_camera()
@@ -102,228 +101,130 @@
desc = "Contains a slot for reading magnetic swipe cards."
var/obj/item/weapon/card/reader = null
- var/obj/item/weapon/card/writer = null // so that you don't need to typecast dual cardslots, but pretend it's not here
- // alternately pretend they did it to save money on manufacturing somehow
- var/dualslot = 0 // faster than typechecking
+
attackby_types = list(/obj/item/weapon/card)
- attackby(var/obj/item/I as obj, var/mob/user as mob)
- if(istype(I,/obj/item/weapon/card))
- insert(I)
+/obj/item/part/computer/cardslot/attackby(var/obj/item/I as obj, var/mob/user)
+ if(istype(I,/obj/item/weapon/card) && computer)
+ if(istype(I,/obj/item/weapon/card/emag) && !reader) // emag reader slot
+ user.visible_message("[computer]'s screen flickers for a moment.","You insert \the [I]. After a moment, the card ejects itself, and [computer] beeps.","[computer] beeps.")
+ computer.emagged = 1
return
- ..(I,user)
+
+ insert(I, user)
+ return
+ ..(I,user)
// cardslot.insert(card, slot)
// card: The card obj you want to insert (usually your ID)
- // slot: Which slot to insert into (1: reader, 2: writer, 3: auto), 3 default
- proc/insert(var/obj/item/weapon/card/card, var/slot = 3)
- if(!computer)
- return 0
- // This shouldn't happen, just in case..
- if(slot == 2 && !dualslot)
- usr << "This device has only one card slot"
- return 0
-
- if(istype(card,/obj/item/weapon/card/emag)) // emag reader slot
- if(!writer)
- usr << "You insert \the [card], and the computer grinds, sparks, and beeps. After a moment, the card ejects itself."
- computer.emagged = 1
- return 1
- else
- usr << "You are unable to insert \the [card], as the reader slot is occupied"
-
- var/mob/living/L = usr
- switch(slot)
- if(1)
- if(equip_to_reader(card, L))
- usr << "You insert the card into reader slot"
- else
- usr << "There is already something in the reader slot."
- if(2)
- if(equip_to_writer(card, L))
- usr << "You insert the card into writer slot"
- else
- usr << "There is already something in the reader slot."
- if(3)
- if(equip_to_reader(card, L))
- usr << "You insert the card into reader slot"
- else if (equip_to_writer(card, L) && dualslot)
- usr << "You insert the card into writer slot"
- else if (dualslot)
- usr << "There is already something in both slots."
- else
- usr << "There is already something in the reader slot."
+ // user: The mob inserting the card
+/obj/item/part/computer/cardslot/proc/insert(var/obj/item/weapon/card/card, var/mob/user)
+ if(equip_to_reader(card, user))
+ to_chat(user, "You insert the card into reader slot")
+ return 1
+ to_chat(user, "There is already something in the reader slot.")
+ return 0
// Usage of insert() preferred, as it also tells result to the user.
- proc/equip_to_reader(var/obj/item/weapon/card/card, var/mob/living/L)
- if(!reader)
- L.drop_item()
- card.loc = src
- reader = card
- return 1
- return 0
-
- proc/equip_to_writer(var/obj/item/weapon/card/card, var/mob/living/L)
- if(!writer && dualslot)
- L.drop_item()
- card.loc = src
- writer = card
- return 1
- return 0
+/obj/item/part/computer/cardslot/proc/equip_to_reader(var/obj/item/weapon/card/card, var/mob/living/L)
+ if(!reader)
+ L.drop_item()
+ card.loc = src
+ reader = card
+ return 1
+ return 0
// cardslot.remove(slot)
- // slot: Which slot to remove card(s) from (1: reader only, 2: writer only, 3: both [works even with one card], 4: reader and if empty then writer ), 3 default
- proc/remove(var/slot = 3)
- var/mob/living/L = usr
- switch(slot)
- if(1)
- if (remove_reader(L))
- L << "You remove the card from reader slot"
- else
- L << "There is no card in the reader slot"
- if(2)
- if (remove_writer(L))
- L << "You remove the card from writer slot"
- else
- L << "There is no card in the writer slot"
- if(3)
- if (remove_reader(L))
- if (remove_writer(L))
- L << "You remove cards from both slots"
- else
- L << "You remove the card from reader slot"
- else
- if(remove_writer(L))
- L << "You remove the card from writer slot"
- else
- L << "There are no cards in both slots"
- if(4)
- if (!remove_reader(L))
- if (remove_writer(L))
- L << "You remove the card from writer slot"
- else if (!dualslot)
- L << "There is no card in the reader slot"
- else
- L << "There are no cards in both slots"
- else
- L << "You remove the card from reader slot"
+ // user: The mob removing the card
+/obj/item/part/computer/cardslot/proc/remove(var/mob/user)
+ if(remove_reader(user))
+ to_chat(user, "You remove the card from reader slot")
+ return 1
+ to_chat(user, "There is nothing in the reader slot")
+ return 0
-
- proc/remove_reader(var/mob/living/L)
- if(reader)
- reader.loc = loc
- if(istype(L) && !L.get_active_hand())
- if(istype(L,/mob/living/carbon/human))
- L.put_in_hands(reader)
- else
- reader.loc = get_turf(computer)
- else
- reader.loc = get_turf(computer)
- reader = null
- return 1
- return 0
-
- proc/remove_writer(var/mob/living/L)
- if(writer && dualslot)
- writer.loc = loc
- if(istype(L) && !L.get_active_hand())
- if(istype(L,/mob/living/carbon/human))
- L.put_in_hands(writer)
- else
- writer.loc = get_turf(computer)
- else
- writer.loc = get_turf(computer)
- writer = null
- return 1
- return 0
+/obj/item/part/computer/cardslot/proc/remove_reader(var/mob/living/L)
+ if(reader)
+ if(ishuman(L) && !L.get_active_hand())
+ L.put_in_hands(reader)
+ else
+ reader.loc = get_turf(computer)
+ reader = null
+ return 1
+ return 0
// Authorizes the user based on the computer's requirements
- proc/authenticate()
+/obj/item/part/computer/cardslot/proc/authenticate()
return computer.check_access(reader)
- proc/addfile(var/datum/file/F)
- if(!dualslot || !istype(writer,/obj/item/weapon/card/data))
- return 0
- var/obj/item/weapon/card/data/D = writer
- if(D.files.len > 3)
- return 0
- D.files += F
- return 1
/obj/item/part/computer/cardslot/dual
name = "magnetic card reader"
desc = "Contains slots for inserting magnetic swipe cards for reading and writing."
- dualslot = 1
+
+ var/obj/item/weapon/card/writer = null
- /*
- // Atlantis: Reworked card manipulation a bit.
- // No need for separated code for dual and single readers.
- // Both is handled in single-slot reader code now, thanks to the "dualslot" var.
- // Leaving this code here if someone wants to somehow use it, just uncomment.
+ // Ater: Single- and dual-slot card readers have separate functions.
+ // According to OOP principles, they should be separate classes and use inheritance, polymorphism.
- insert(var/obj/item/weapon/card/card,var/slot = 0)
- if(!computer)
- return 0
- if(istype(card,/obj/item/weapon/card/emag) && !reader) // emag reader slot
- usr.visible_message("[computer]'s screen flickers for a moment.","You insert \the [card]. After a moment, the card ejects itself, and [computer] beeps.","[computer] beeps.")
- computer.emagged = 1
- return 1
+/obj/item/part/computer/cardslot/dual/proc/equip_to_writer(var/obj/item/weapon/card/card, var/mob/living/L)
+ if(!writer)
+ L.drop_item()
+ card.loc = src
+ writer = card
+ return 1
+ return 0
- if(slot == 1) // 1: writer
- if(writer != null)
- usr << "There's already a card in that slot!"
- return 0
- var/mob/living/L = usr
- L.drop_item()
- card.loc = src
- writer = card
- return 1
- else if(slot == 2) // 2: reader
- if(reader != null)
- usr << "There's already a card in that slot!"
- return 0
- var/mob/living/L = usr
- L.drop_item()
- card.loc = src
- reader = card
- return 1
- else // 0: auto
- if(reader && writer)
- usr << "Both slots are full!"
- return 0
- var/mob/living/L = usr
- L.drop_item()
- card.loc = src
- if(reader)
- writer = card
- computer.updateUsrDialog()
- return 1
- if(istype(card,/obj/item/weapon/card/id) && !(access_change_ids in card:access) && !writer) // not authorized
- writer = card
- computer.updateUsrDialog()
- return 1
- if(!reader)
- reader = card
- computer.updateUsrDialog()
- return 1
- return 0
-
- remove(var/obj/item/weapon/card/card)
- if(card != reader && card != writer)
- return
-
- if(card == reader) reader = null
- if(card == writer) writer = null
- card.loc = loc
-
- var/mob/living/carbon/human/user = usr
- if(ishuman(user) && !user.get_active_hand())
- user.put_in_hands(card)
+/obj/item/part/computer/cardslot/dual/proc/remove_from_writer(var/mob/living/L)
+ if(writer)
+ if(ishuman(L) && !L.get_active_hand())
+ L.put_in_hands(writer)
else
- card.loc = computer.loc
-*/
+ writer.loc = get_turf(computer)
+ writer = null
+ return 1
+ return 0
+ // cardslot.insert(card, slot)
+ // card: The card obj you want to insert (usually your ID)
+ // user: The mob inserting the card
+ // slot: Which slot to insert into (1->Reader, 2->Writer, 3->Auto) Default 3
+/obj/item/part/computer/cardslot/dual/insert(var/obj/item/weapon/card/card, var/mob/user, var/slot = 3)
+ if(slot != 2)
+ if(..(card, user))
+ return 1
+ if(slot != 1)
+ if(equip_to_writer(card, user))
+ to_chat(user, "You insert the card into writer slot")
+ return 1
+ else
+ to_chat(user, "There is already something in the writer slot.")
+ return 0
+
+ // cardslot/dual.insert(card, slot)
+ // user: The mob removing the card
+ // slot: Which slot to remove from (1->Reader, 2->Writer, 3->Both, 4->Reader and if empty, Writer) Default 3
+/obj/item/part/computer/cardslot/dual/remove(var/mob/user, var/slot = 3)
+ if(slot != 2)
+ if(..(user) && slot != 3) // ..() probes reader
+ return 1 // slot is either 1 or 4, where we only probe reader if there's anything in it
+
+ if(slot != 1) // If slot is 1, then we only probe reader
+ if(remove_from_writer(user)) // Probe writer
+ to_chat(user, "You remove the card from the writer slot")
+ return 1
+ to_chat(user, "There is nothing in the writer slot.")
+ return 0
+
+/obj/item/part/computer/cardslot/dual/proc/addfile(var/datum/file/F)
+ if(!istype(writer,/obj/item/weapon/card/data))
+ return 0
+ var/obj/item/weapon/card/data/D = writer
+ if(D.files.len > 3)
+ return 0
+ D.files += F
+ return 1
diff --git a/code/game/machinery/computer3/computer.dm b/code/game/machinery/computer3/computer.dm
index e0040a6d83..c9d8eb22de 100644
--- a/code/game/machinery/computer3/computer.dm
+++ b/code/game/machinery/computer3/computer.dm
@@ -45,7 +45,6 @@
// Misc & special purpose
var/obj/item/part/computer/ai_holder/cradle = null
var/obj/item/part/computer/toybox/toybox = null
- var/mob/living/silicon/ai/occupant = null
// Legacy variables
@@ -70,160 +69,171 @@
var/obj/item/weapon/cell/battery = null // uninterruptible power supply aka battery
+/obj/machinery/computer3/New(var/L, var/built = 0)
+ ..()
+ spawn(2)
+ power_change()
- verb/ResetComputer()
- set name = "Reset Computer"
- set category = "Object"
- set src in view(1)
+ if(show_keyboard)
+ var/kb_state = "kb[rand(1,15)]"
+ kb = image('icons/obj/computer3.dmi',icon_state=kb_state)
+ overlays += kb
- if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living))
- usr << "You can't do that."
- return
+ if(!built)
+ if(!circuitb || !istype(circuitb))
+ circuitb = new(src)
+ if(circuitb.OS)
+ os = circuitb.OS
+ circuitb.OS.computer = src
+ else
+ os = null
- if(!Adjacent(usr))
- usr << "You can't reach it."
- return
+ // separated into its own function because blech
+ spawn_parts()
- Reset()
-
- New(var/L, var/built = 0)
- ..()
- spawn(2)
- power_change()
-
- if(show_keyboard)
- var/kb_state = "kb[rand(1,15)]"
- kb = image('icons/obj/computer3.dmi',icon_state=kb_state)
- overlays += kb
-
- if(!built)
- if(!circuitb || !istype(circuitb))
- circuitb = new(src)
- if(circuitb.OS)
- os = circuitb.OS
- circuitb.OS.computer = src
+ if(default_prog) // Add the default software if applicable
+ var/datum/file/program/P = new default_prog
+ if(hdd)
+ hdd.addfile(P,1)
+ program = P
+ if(!os)
+ os = P
+ else if(floppy)
+ floppy.inserted = new(floppy)
+ floppy.files = floppy.inserted.files
+ floppy.addfile(P)
+ program = P
else
- os = null
+ circuitb.OS = P
+ circuitb.OS.computer = src
+ os = circuitb.OS
+ circuitb.name = "Circuitboard ([P])"
- // separated into its own function because blech
- spawn_parts()
+ if(hdd) // Spawn files
+ for(var/typekey in spawn_files)
+ hdd.addfile(new typekey,1)
- if(default_prog) // Add the default software if applicable
- var/datum/file/program/P = new default_prog
- if(hdd)
- hdd.addfile(P,1)
- program = P
- if(!os)
- os = P
- else if(floppy)
- floppy.inserted = new(floppy)
- floppy.files = floppy.inserted.files
- floppy.addfile(P)
- program = P
- else
- circuitb.OS = P
- circuitb.OS.computer = src
- os = circuitb.OS
- circuitb.name = "Circuitboard ([P])"
+ update_icon()
+/obj/machinery/computer3/verb/ResetComputer()
+ set name = "Reset Computer"
+ set category = "Object"
+ set src in view(1)
- if(hdd) // Spawn files
- for(var/typekey in spawn_files)
- hdd.addfile(new typekey,1)
+ if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living))
+ to_chat(usr, "You can't do that.")
+ return
- update_icon()
+ if(!Adjacent(usr))
+ to_chat(usr, "You can't reach it.")
+ return
+ Reset()
- proc/update_spawn_files()
- for(var/typekey in spawn_files)
- hdd.addfile(new typekey,1)
+/obj/machinery/computer3/proc/update_spawn_files()
+ for(var/typekey in spawn_files)
+ hdd.addfile(new typekey,1)
- proc/spawn_parts()
- for(var/typekey in spawn_parts)
-
- if(ispath(typekey,/obj/item/part/computer/storage/removable))
- if(floppy) continue
- floppy = new typekey(src)
- floppy.init(src)
+/obj/machinery/computer3/proc/spawn_parts()
+ for(var/typekey in spawn_parts)
+ if(ispath(typekey,/obj/item/part/computer/storage/removable))
+ if(floppy)
continue
- if(ispath(typekey,/obj/item/part/computer/storage/hdd))
- if(hdd) continue
- hdd = new typekey(src)
- hdd.init(src)
+ floppy = new typekey(src)
+ floppy.init(src)
+ continue
+
+ if(ispath(typekey,/obj/item/part/computer/storage/hdd))
+ if(hdd)
continue
+ hdd = new typekey(src)
+ hdd.init(src)
+ continue
- if(ispath(typekey,/obj/item/part/computer/networking/cameras))
- if(camnet) continue
- camnet = new typekey(src)
- camnet.init(src)
+ if(ispath(typekey,/obj/item/part/computer/networking/cameras))
+ if(camnet)
continue
- if(ispath(typekey,/obj/item/part/computer/networking/radio))
- if(radio) continue
- radio = new typekey(src)
- radio.init(src)
+ camnet = new typekey(src)
+ camnet.init(src)
+ continue
+
+ if(ispath(typekey,/obj/item/part/computer/networking/radio))
+ if(radio)
continue
- if(ispath(typekey,/obj/item/part/computer/networking))
- if(net) continue
- net = new typekey(src)
- net.init(src)
+ radio = new typekey(src)
+ radio.init(src)
+ continue
+
+ if(ispath(typekey,/obj/item/part/computer/networking))
+ if(net)
continue
+ net = new typekey(src)
+ net.init(src)
+ continue
- if(ispath(typekey,/obj/item/part/computer/cardslot))
- if(cardslot) continue
- cardslot = new typekey(src)
- cardslot.init(src)
+ if(ispath(typekey,/obj/item/part/computer/cardslot))
+ if(cardslot)
continue
- if(ispath(typekey,/obj/item/part/computer/ai_holder))
- if(cradle) continue
- cradle = new typekey(src)
- cradle.init(src)
- if(ispath(typekey,/obj/item/part/computer/toybox))
- if(toybox) continue
- toybox = new typekey(src)
- toybox.init(src)
+ cardslot = new typekey(src)
+ cardslot.init(src)
+ continue
+
+ if(ispath(typekey,/obj/item/part/computer/ai_holder))
+ if(cradle)
continue
+ cradle = new typekey(src)
+ cradle.init(src)
+ continue
- if(ispath(typekey,/obj/item/weapon/cell))
- if(battery) continue
- battery = new typekey(src)
+ if(ispath(typekey,/obj/item/part/computer/toybox))
+ if(toybox)
continue
+ toybox = new typekey(src)
+ toybox.init(src)
+ continue
- proc/Reset(var/error = 0)
- for(var/mob/living/M in range(1))
- M << browse(null,"window=\ref[src]")
- if(program)
- program.Reset()
- program = null
- req_access = os.req_access
- update_icon()
+ if(ispath(typekey,/obj/item/weapon/cell))
+ if(battery)
+ continue
+ battery = new typekey(src)
+ continue
- // todo does this do enough
+/obj/machinery/computer3/proc/Reset(var/error = 0)
+ for(var/mob/living/M in range(1))
+ M << browse(null,"window=\ref[src]")
+ if(program)
+ program.Reset()
+ program = null
+ req_access = os.req_access
+ update_icon()
- emp_act(severity)
- if(prob(20/severity)) set_broken()
- ..()
+ // todo does this do enough
+
+/obj/machinery/computer3/emp_act(severity)
+ if(prob(20/severity)) set_broken()
+ ..()
- ex_act(severity)
- switch(severity)
- if(1.0)
+/obj/machinery/computer3/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ qdel(src)
+ return
+ if(2.0)
+ if (prob(25))
qdel(src)
return
- if(2.0)
- if (prob(25))
- qdel(src)
- return
- if (prob(50))
- for(var/x in verbs)
- verbs -= x
- set_broken()
- if(3.0)
- if (prob(25))
- for(var/x in verbs)
- verbs -= x
- set_broken()
- else
- return
+ if (prob(50))
+ for(var/x in verbs)
+ verbs -= x
+ set_broken()
+ if(3.0)
+ if (prob(25))
+ for(var/x in verbs)
+ verbs -= x
+ set_broken()
+ else
+ return
/*
Computers have the capability to use a battery backup.
@@ -244,201 +254,199 @@
Make sure to use use_power() a bunch in peripherals code
*/
- auto_use_power()
- if(!powered(power_channel))
- if(battery && battery.charge > 0)
- if(use_power == 1)
- battery.use(idle_power_usage)
- else
- battery.use(active_power_usage)
- return 1
- return 0
- if(src.use_power == 1)
- use_power(idle_power_usage,power_channel)
- else if(src.use_power >= 2)
- use_power(active_power_usage,power_channel)
- return 1
-
- use_power(var/amount, var/chan = -1)
- if(chan == -1)
- chan = power_channel
-
- var/area/A = get_area(loc)
- if(istype(A) && A.powered(chan))
- A.use_power(amount, chan)
- else if(battery && battery.charge > 0)
- battery.use(amount)
-
- power_change()
- if( !powered(power_channel) && (!battery || battery.charge <= 0) )
- stat |= NOPOWER
- else
- stat &= ~NOPOWER
-
- process()
- auto_use_power()
- power_change()
- update_icon()
- if(stat & (NOPOWER|BROKEN))
- return
-
- if(program)
- program.process()
- return
-
- if(os)
- program = os
- os.process()
- return
-
-
- proc/set_broken()
- icon_state = "computer_b"
- stat |= BROKEN
- if(program)
- program.error = BUSTED_ASS_COMPUTER
- if(os)
- os.error = BUSTED_ASS_COMPUTER
-
- attackby(I as obj, mob/user as mob)
- if(istype(I, /obj/item/weapon/screwdriver) && allow_disassemble)
- disassemble(user)
- return
-
- /*
- +++++++++++
- |IMPORTANT| If you add a peripheral, put it in this list
- +++++++++++ --------------------------------------------
- */
- var/list/peripherals = list(hdd,floppy,radio,net,cardslot,cradle) //camnet, toybox removed
-
- var/list/p_list = list()
- for(var/obj/item/part/computer/C in peripherals)
- if(!isnull(C) && C.allow_attackby(I,user))
- p_list += C
- if(p_list.len)
- var/obj/item/part/computer/P = null
- if(p_list.len == 1)
- P = p_list[1]
+/obj/machinery/computer3/auto_use_power()
+ if(!powered(power_channel))
+ if(battery && battery.charge > 0)
+ if(use_power == 1)
+ battery.use(idle_power_usage)
else
- P = input(user,"Which component?") as null|anything in p_list
+ battery.use(active_power_usage)
+ return 1
+ return 0
+ if(src.use_power == 1)
+ use_power(idle_power_usage,power_channel)
+ else if(src.use_power >= 2)
+ use_power(active_power_usage,power_channel)
+ return 1
- if(P)
- P.attackby(I,user)
- return
- ..()
+/obj/machinery/computer3/use_power(var/amount, var/chan = -1)
+ if(chan == -1)
+ chan = power_channel
- attack_hand(var/mob/user as mob)
- if(stat)
- Reset()
- return
+ var/area/A = get_area(loc)
+ if(istype(A) && A.powered(chan))
+ A.use_power(amount, chan)
+ else if(battery && battery.charge > 0)
+ battery.use(amount)
- // I don't want to deal with computers that you can't walk up to and use
- // there is still cardauth anyway
- //if(!allowed(user))
- // return
-
- if(program)
- if(program.computer != src) // floppy disk may have been removed, etc
- Reset()
- attack_hand(user)
- return
- if(program.error)
- Crash(program.error)
- return
- user.set_machine(src)
- program.attack_hand(user) // will normally translate to program/interact()
- return
-
- if(os)
- program = os
- user.set_machine(src)
- os.attack_hand(user)
- return
-
- user << "\The [src] won't boot!"
-
- attack_ai(var/mob/user as mob) // copypasta because server racks lose attack_hand()
- if(stat)
- Reset()
- return
-
- if(program)
- if(program.computer != src) // floppy disk may have been removed, etc
- Reset()
- attack_ai(user)
- return
- if(program.error)
- Crash(program.error)
- return
- user.set_machine(src)
- program.attack_hand(user) // will normally translate to program/interact()
- return
-
- if(os)
- program = os
- user.set_machine(src)
- os.attack_hand(user)
- return
-
- user << "\The [src] won't boot!"
-
- interact()
- if(stat)
- Reset()
- return
- if(!allowed(usr) || !usr in view(1))
- usr.unset_machine()
- return
-
- if(program)
- program.interact()
- return
-
- if(os)
- program = os
- os.interact()
- return
+/obj/machinery/computer3/power_change()
+ if( !powered(power_channel) && (!battery || battery.charge <= 0) )
+ stat |= NOPOWER
+ else
+ stat &= ~NOPOWER
+/obj/machinery/computer3/process()
+ auto_use_power()
+ power_change()
update_icon()
- if(legacy_icon)
+ if(stat & (NOPOWER|BROKEN))
+ return
+
+ if(program)
+ program.process()
+ return
+
+ if(os)
+ program = os
+ os.process()
+ return
+
+/obj/machinery/computer3/proc/set_broken()
+ icon_state = "computer_b"
+ stat |= BROKEN
+ if(program)
+ program.error = BUSTED_ASS_COMPUTER
+ if(os)
+ os.error = BUSTED_ASS_COMPUTER
+
+/obj/machinery/computer3/attackby(obj/item/I as obj, mob/user as mob)
+ if(I.is_screwdriver() && allow_disassemble)
+ disassemble(user)
+ return
+
+ /*
+ +++++++++++
+ |IMPORTANT| If you add a peripheral, put it in this list
+ +++++++++++ --------------------------------------------
+ */
+
+ var/list/p_list = list()
+ for(var/obj/item/part/computer/C in src)
+ if(!isnull(C) && C.allow_attackby(I,user))
+ p_list += C
+ if(p_list.len)
+ var/obj/item/part/computer/P = null
+ if(p_list.len == 1)
+ P = p_list[1]
+ else
+ P = input(user,"Which component?") as null|anything in p_list
+
+ if(P)
+ P.attackby(I,user)
+ return
+ ..()
+
+/obj/machinery/computer3/attack_hand(var/mob/user as mob)
+ if(stat)
+ Reset()
+ return
+
+ // I don't want to deal with computers that you can't walk up to and use
+ // there is still cardauth anyway
+ //if(!allowed(user))
+ // return
+
+ if(program)
+ if(program.computer != src) // floppy disk may have been removed, etc
+ Reset()
+ attack_hand(user)
+ return
+ if(program.error)
+ Crash(program.error)
+ return
+ user.set_machine(src)
+ program.attack_hand(user) // will normally translate to program/interact()
+ return
+
+ if(os)
+ program = os
+ user.set_machine(src)
+ os.attack_hand(user)
+ return
+
+ to_chat(user, "\The [src] won't boot!")
+
+/obj/machinery/computer3/attack_ai(var/mob/user as mob) // copypasta because server racks lose attack_hand()
+ if(stat)
+ Reset()
+ return
+
+ if(program)
+ if(program.computer != src) // floppy disk may have been removed, etc
+ Reset()
+ attack_ai(user)
+ return
+ if(program.error)
+ Crash(program.error)
+ return
+ user.set_machine(src)
+ program.attack_hand(user) // will normally translate to program/interact()
+ return
+
+ if(os)
+ program = os
+ user.set_machine(src)
+ os.attack_hand(user)
+ return
+
+ to_chat(user, "\The [src] won't boot!")
+
+/obj/machinery/computer3/interact()
+ if(stat)
+ Reset()
+ return
+ if(!allowed(usr) || !usr in view(1))
+ usr.unset_machine()
+ return
+
+ if(program)
+ program.interact()
+ return
+
+ if(os)
+ program = os
+ os.interact()
+ return
+
+/obj/machinery/computer3/update_icon()
+ if(legacy_icon)
+ icon_state = initial(icon_state)
+ // Broken
+ if(stat & BROKEN)
+ icon_state += "b"
+
+ // Powered
+ else if(stat & NOPOWER)
icon_state = initial(icon_state)
- // Broken
- if(stat & BROKEN)
- icon_state += "b"
+ icon_state += "0"
+ return
+ if(stat)
+ overlays.Cut()
+ return
+ if(program)
+ overlays = list(program.overlay)
+ if(show_keyboard)
+ overlays += kb
+ name = "[program.name] [initial(name)]"
+ else if(os)
+ overlays = list(os.overlay)
+ if(show_keyboard)
+ overlays += kb
+ name = initial(name)
+ else
+ var/global/image/generic = image('icons/obj/computer3.dmi',icon_state="osod") // orange screen of death
+ overlays = list(generic)
+ if(show_keyboard)
+ overlays += kb
+ name = initial(name) + " (orange screen of death)"
- // Powered
- else if(stat & NOPOWER)
- icon_state = initial(icon_state)
- icon_state += "0"
- return
- if(stat)
- overlays.Cut()
- return
- if(program)
- overlays = list(program.overlay)
- if(show_keyboard)
- overlays += kb
- name = "[program.name] [initial(name)]"
- else if(os)
- overlays = list(os.overlay)
- if(show_keyboard)
- overlays += kb
- name = initial(name)
- else
- var/global/image/generic = image('icons/obj/computer3.dmi',icon_state="osod") // orange screen of death
- overlays = list(generic)
- if(show_keyboard)
- overlays += kb
- name = initial(name) + " (orange screen of death)"
-
- //Returns percentage of battery charge remaining. Returns -1 if no battery is installed.
- proc/check_battery_status()
- if (battery)
- var/obj/item/weapon/cell/B = battery
- return round(B.charge / (B.maxcharge / 100))
- else
- return -1
+//Returns percentage of battery charge remaining. Returns -1 if no battery is installed.
+/obj/machinery/computer3/proc/check_battery_status()
+ if (battery)
+ var/obj/item/weapon/cell/B = battery
+ return round(B.charge / (B.maxcharge / 100))
+ else
+ return -1
diff --git a/code/game/machinery/computer3/computers/HolodeckControl.dm b/code/game/machinery/computer3/computers/HolodeckControl.dm
index a629354d7b..fcff13c968 100644
--- a/code/game/machinery/computer3/computers/HolodeckControl.dm
+++ b/code/game/machinery/computer3/computers/HolodeckControl.dm
@@ -22,206 +22,153 @@
var/emagged = 0
- interact()
- if(!interactable())
- return
- var/dat = "Current Loaded Programs"
- dat += "((Empty Court)) "
- dat += "((Boxing Court)) "
- dat += "((Basketball Court)) "
- dat += "((Thunderdome Court)) "
- dat += "((Beach)) "
-// dat += "((Shutdown System)) "
+/datum/file/program/holodeck/interact()
+ if(!interactable())
+ return
+ var/dat = "Current Loaded Programs"
+ dat += "((Empty Court)) "
+ dat += "((Boxing Court)) "
+ dat += "((Basketball Court)) "
+ dat += "((Thunderdome Court)) "
+ dat += "((Beach)) "
+// dat += "((Shutdown System)) "
- dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded. "
+ dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded. "
- if(emagged)
- dat += "(Begin Atmospheric Burn Simulation) "
- dat += "Ensure the holodeck is empty before testing. "
- dat += " "
- dat += "(Begin Wildlife Simulation) "
- dat += "Ensure the holodeck is empty before testing. "
- dat += " "
- if(issilicon(usr))
- dat += "(Re-Enable Safety Protocols?) "
- dat += "Safety Protocols are DISABLED "
- else
- if(issilicon(usr))
- dat += "(Override Safety Protocols?) "
- dat += " "
- dat += "Safety Protocols are ENABLED "
+ if(emagged)
+ dat += "(Begin Atmospheric Burn Simulation) "
+ dat += "Ensure the holodeck is empty before testing. "
+ dat += " "
+ dat += "(Begin Wildlife Simulation) "
+ dat += "Ensure the holodeck is empty before testing. "
+ dat += " "
+ if(issilicon(usr))
+ dat += "(Re-Enable Safety Protocols?) "
+ dat += "Safety Protocols are DISABLED "
+ else
+ if(issilicon(usr))
+ dat += "(Override Safety Protocols?) "
+ dat += " "
+ dat += "Safety Protocols are ENABLED "
- popup.set_content(dat)
- popup.open()
+ popup.set_content(dat)
+ popup.open()
+ return
+
+/datum/file/program/holodeck/Topic(var/href, var/list/href_list)
+ if(!interactable() || ..(href,href_list))
return
+ if("emptycourt" in href_list)
+ target = locate(/area/holodeck/source_emptycourt)
+ if(target)
+ loadProgram(target)
- Topic(var/href, var/list/href_list)
- if(!interactable() || ..(href,href_list))
+ else if("boxingcourt" in href_list)
+ target = locate(/area/holodeck/source_boxingcourt)
+ if(target)
+ loadProgram(target)
+
+ else if("basketball" in href_list)
+ target = locate(/area/holodeck/source_basketball)
+ if(target)
+ loadProgram(target)
+
+ else if("thunderdomecourt" in href_list)
+ target = locate(/area/holodeck/source_thunderdomecourt)
+ if(target)
+ loadProgram(target)
+
+ else if("beach" in href_list)
+ target = locate(/area/holodeck/source_beach)
+ if(target)
+ loadProgram(target)
+
+ else if("turnoff" in href_list)
+ target = locate(/area/holodeck/source_plating)
+ if(target)
+ loadProgram(target)
+
+ else if("burntest" in href_list)
+ if(!emagged)
return
+ target = locate(/area/holodeck/source_burntest)
+ if(target)
+ loadProgram(target)
- if("emptycourt" in href_list)
- target = locate(/area/holodeck/source_emptycourt)
- if(target)
- loadProgram(target)
+ else if("wildlifecarp" in href_list)
+ if(!emagged)
+ return
+ target = locate(/area/holodeck/source_wildlife)
+ if(target)
+ loadProgram(target)
- else if("boxingcourt" in href_list)
- target = locate(/area/holodeck/source_boxingcourt)
- if(target)
- loadProgram(target)
+ else if("AIoverride" in href_list)
+ if(!issilicon(usr))
+ return
+ emagged = !emagged
+ if(emagged)
+ message_admins("[key_name_admin(usr)] overrode the holodeck's safeties")
+ log_game("[key_name(usr)] overrided the holodeck's safeties")
+ else
+ message_admins("[key_name_admin(usr)] restored the holodeck's safeties")
+ log_game("[key_name(usr)] restored the holodeck's safeties")
- else if("basketball" in href_list)
- target = locate(/area/holodeck/source_basketball)
- if(target)
- loadProgram(target)
+ interact()
+ return
- else if("thunderdomecourt" in href_list)
- target = locate(/area/holodeck/source_thunderdomecourt)
- if(target)
- loadProgram(target)
+/datum/file/program/holodeck/Reset()
+ emergencyShutdown()
- else if("beach" in href_list)
- target = locate(/area/holodeck/source_beach)
- if(target)
- loadProgram(target)
-
- else if("turnoff" in href_list)
+/datum/file/program/holodeck/process()
+ if(active)
+ if(!checkInteg(linkedholodeck))
+ damaged = 1
target = locate(/area/holodeck/source_plating)
if(target)
loadProgram(target)
-
- else if("burntest" in href_list)
- if(!emagged) return
- target = locate(/area/holodeck/source_burntest)
- if(target)
- loadProgram(target)
-
- else if("wildlifecarp" in href_list)
- if(!emagged) return
- target = locate(/area/holodeck/source_wildlife)
- if(target)
- loadProgram(target)
-
- else if("AIoverride" in href_list)
- if(!issilicon(usr)) return
- emagged = !emagged
- if(emagged)
- message_admins("[key_name_admin(usr)] overrode the holodeck's safeties")
- log_game("[key_name(usr)] overrided the holodeck's safeties")
- else
- message_admins("[key_name_admin(usr)] restored the holodeck's safeties")
- log_game("[key_name(usr)] restored the holodeck's safeties")
-
- interact()
- return
-
- Reset()
- emergencyShutdown()
-
- process()
- if(active)
- if(!checkInteg(linkedholodeck))
- damaged = 1
- target = locate(/area/holodeck/source_plating)
- if(target)
- loadProgram(target)
- active = 0
- for(var/mob/M in range(10,src))
- M.show_message("The holodeck overloads!")
-
-
- for(var/turf/T in linkedholodeck)
- if(prob(30))
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(2, 1, T)
- s.start()
- T.ex_act(3)
- T.hotspot_expose(1000,500,1)
-
-
- for(var/item in holographic_items)
- if(!(get_turf(item) in linkedholodeck))
- derez(item, 0)
-
-
-
- proc/derez(var/obj/obj , var/silent = 1)
- holographic_items.Remove(obj)
-
- if(obj == null)
- return
-
- if(isobj(obj))
- var/mob/M = obj.loc
- if(ismob(M))
- M.remove_from_mob(obj)
-
- if(!silent)
- var/obj/oldobj = obj
- obj.visible_message("The [oldobj.name] fades away!")
- qdel(obj)
-
- proc/checkInteg(var/area/A)
- for(var/turf/T in A)
- if(istype(T, /turf/space))
- return 0
-
- return 1
-
- proc/togglePower(var/toggleOn = 0)
-
- if(toggleOn)
- var/area/targetsource = locate(/area/holodeck/source_emptycourt)
- holographic_items = targetsource.copy_contents_to(linkedholodeck)
-
- spawn(30)
- for(var/obj/effect/landmark/L in linkedholodeck)
- if(L.name=="Atmospheric Test Start")
- spawn(20)
- var/turf/T = get_turf(L)
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(2, 1, T)
- s.start()
- if(T)
- T.temperature = 5000
- T.hotspot_expose(50000,50000,1)
-
- active = 1
- else
- for(var/item in holographic_items)
- derez(item)
- var/area/targetsource = locate(/area/holodeck/source_plating)
- targetsource.copy_contents_to(linkedholodeck , 1)
active = 0
+ for(var/mob/M in range(10,src))
+ M.show_message("The holodeck overloads!")
-
- proc/loadProgram(var/area/A)
-
- if(world.time < (last_change + 25))
- if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve
- return
- for(var/mob/M in range(3,src))
- M.show_message("ERROR. Recalibrating projetion apparatus.")
- last_change = world.time
- return
-
- last_change = world.time
- active = 1
+ for(var/turf/T in linkedholodeck)
+ if(prob(30))
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, T)
+ s.start()
+ T.ex_act(3)
+ T.hotspot_expose(1000,500,1)
for(var/item in holographic_items)
- derez(item)
+ if(!(get_turf(item) in linkedholodeck))
+ derez(item, 0)
- for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck)
- qdel(B)
+/datum/file/program/holodeck/proc/derez(var/obj/obj , var/silent = 1)
+ holographic_items.Remove(obj)
- for(var/mob/living/simple_animal/hostile/carp/C in linkedholodeck)
- qdel(C)
+ if(obj == null)
+ return
- holographic_items = A.copy_contents_to(linkedholodeck , 1)
+ if(isobj(obj))
+ var/mob/M = obj.loc
+ if(ismob(M))
+ M.remove_from_mob(obj)
- if(emagged)
- for(var/obj/item/weapon/holo/esword/H in linkedholodeck)
- H.damtype = BRUTE
+ if(!silent)
+ var/obj/oldobj = obj
+ obj.visible_message("The [oldobj.name] fades away!")
+ qdel(obj)
+
+/datum/file/program/holodeck/proc/checkInteg(var/area/A)
+ for(var/turf/T in A)
+ if(istype(T, /turf/space))
+ return 0
+ return 1
+
+/datum/file/program/holodeck/proc/togglePower(var/toggleOn = 0)
+ if(toggleOn)
+ var/area/targetsource = locate(/area/holodeck/source_emptycourt)
+ holographic_items = targetsource.copy_contents_to(linkedholodeck)
spawn(30)
for(var/obj/effect/landmark/L in linkedholodeck)
@@ -234,20 +181,65 @@
if(T)
T.temperature = 5000
T.hotspot_expose(50000,50000,1)
- if(L.name=="Holocarp Spawn")
- new /mob/living/simple_animal/hostile/carp(L.loc)
-
-
- proc/emergencyShutdown()
- //Get rid of any items
+ active = 1
+ else
for(var/item in holographic_items)
derez(item)
- //Turn it back to the regular non-holographic room
- target = locate(/area/holodeck/source_plating)
- if(target)
- loadProgram(target)
-
var/area/targetsource = locate(/area/holodeck/source_plating)
targetsource.copy_contents_to(linkedholodeck , 1)
active = 0
+/datum/file/program/holodeck/proc/loadProgram(var/area/A)
+ if(world.time < (last_change + 25))
+ if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve
+ return
+ for(var/mob/M in range(3,src))
+ M.show_message("ERROR. Recalibrating projetion apparatus.")
+ last_change = world.time
+ return
+
+ last_change = world.time
+ active = 1
+
+ for(var/item in holographic_items)
+ derez(item)
+
+ for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck)
+ qdel(B)
+
+ for(var/mob/living/simple_animal/hostile/carp/C in linkedholodeck)
+ qdel(C)
+
+ holographic_items = A.copy_contents_to(linkedholodeck , 1)
+
+ if(emagged)
+ for(var/obj/item/weapon/holo/esword/H in linkedholodeck)
+ H.damtype = BRUTE
+
+ spawn(30)
+ for(var/obj/effect/landmark/L in linkedholodeck)
+ if(L.name=="Atmospheric Test Start")
+ spawn(20)
+ var/turf/T = get_turf(L)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, T)
+ s.start()
+ if(T)
+ T.temperature = 5000
+ T.hotspot_expose(50000,50000,1)
+ if(L.name=="Holocarp Spawn")
+ new /mob/living/simple_animal/hostile/carp(L.loc)
+
+
+/datum/file/program/holodeck/proc/emergencyShutdown()
+ //Get rid of any items
+ for(var/item in holographic_items)
+ derez(item)
+ //Turn it back to the regular non-holographic room
+ target = locate(/area/holodeck/source_plating)
+ if(target)
+ loadProgram(target)
+
+ var/area/targetsource = locate(/area/holodeck/source_plating)
+ targetsource.copy_contents_to(linkedholodeck , 1)
+ active = 0
diff --git a/code/game/machinery/computer3/computers/arcade.dm b/code/game/machinery/computer3/computers/arcade.dm
index 3e778cf132..6b235659cf 100644
--- a/code/game/machinery/computer3/computers/arcade.dm
+++ b/code/game/machinery/computer3/computers/arcade.dm
@@ -24,17 +24,20 @@
/obj/item/toy/prize/odysseus = 1,
/obj/item/toy/prize/phazon = 1
)
- proc/dispense()
- if(computer && !computer.stat)
- var/prizeselect = pickweight(prizes)
- new prizeselect(computer.loc)
- if(istype(prizeselect, /obj/item/weapon/gun/projectile/revolver/capgun)) //Ammo comes with the gun
- new /obj/item/projectile/bullet/pistol/cap(src.loc)
- else if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit
- new /obj/item/clothing/head/syndicatefake(computer.loc)
- feedback_inc("arcade_win_normal")
- computer.use_power(500)
+/obj/item/part/computer/toybox/allow_attackby(var/obj/item/I, var/mob/user)
+ return 0
+
+/obj/item/part/computer/toybox/proc/dispense()
+ if(computer && !computer.stat)
+ var/prizeselect = pickweight(prizes)
+ new prizeselect(computer.loc)
+ if(istype(prizeselect, /obj/item/weapon/gun/projectile/revolver/capgun)) //Ammo comes with the gun
+ new /obj/item/projectile/bullet/pistol/cap(src.loc)
+ else if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit
+ new /obj/item/clothing/head/syndicatefake(computer.loc)
+ feedback_inc("arcade_win_normal")
+ computer.use_power(500)
/datum/file/program/arcade
desc = "The best arcade game ever produced by the Company's short-lived entertainment divison."
@@ -66,7 +69,6 @@
enemy_name = replacetext(name_part1, "the ", "") + name_part2
name = (name_action + name_part1 + name_part2)
-
/datum/file/program/arcade/interact()
if(!interactable())
return
diff --git a/code/game/machinery/computer3/computers/atmos_alert.dm b/code/game/machinery/computer3/computers/atmos_alert.dm
index f3f17f892d..aaa677974c 100644
--- a/code/game/machinery/computer3/computers/atmos_alert.dm
+++ b/code/game/machinery/computer3/computers/atmos_alert.dm
@@ -9,91 +9,92 @@
active_state = "alert:2"
refresh = 1
- execute(var/datum/file/program/source)
- ..(source)
+/datum/file/program/atmos_alert/execute(var/datum/file/program/source)
+ ..(source)
- if(!computer.radio)
- computer.Crash(MISSING_PERIPHERAL)
+ if(!computer.radio)
+ computer.Crash(MISSING_PERIPHERAL)
- computer.radio.set_frequency(1437,RADIO_ATMOSIA)
+ computer.radio.set_frequency(1437,RADIO_ATMOSIA)
- // This will be called as long as the program is running on the parent computer
- // and the computer has the radio peripheral
- receive_signal(datum/signal/signal)
- if(!signal || signal.encryption) return
-
- var/zone = signal.data["zone"]
- var/severity = signal.data["alert"]
- if(!zone || !severity) return
-
- minor_air_alarms -= zone
- priority_air_alarms -= zone
- if(severity=="severe")
- priority_air_alarms += zone
- else if (severity=="minor")
- minor_air_alarms += zone
- update_icon()
+// This will be called as long as the program is running on the parent computer
+// and the computer has the radio peripheral
+/datum/file/program/atmos_alert/receive_signal(datum/signal/signal)
+ if(!signal || signal.encryption)
return
+ var/zone = signal.data["zone"]
+ var/severity = signal.data["alert"]
+ if(!zone || !severity)
+ return
- interact()
- if(!interactable())
- return
- if(!computer.radio)
- computer.Crash(MISSING_PERIPHERAL)
-
- popup.set_content(return_text())
- popup.open()
-
-
+ minor_air_alarms -= zone
+ priority_air_alarms -= zone
+ if(severity=="severe")
+ priority_air_alarms += zone
+ else if (severity=="minor")
+ minor_air_alarms += zone
update_icon()
- ..()
- if(priority_air_alarms.len > 0)
- overlay.icon_state = "alert:2"
- else if(minor_air_alarms.len > 0)
- overlay.icon_state = "alert:1"
- else
- overlay.icon_state = "alert:0"
-
- if(computer)
- computer.update_icon()
+ return
- proc/return_text()
- var/priority_text = "Priority Alerts:"
- var/minor_text = "Minor Alerts:"
+/datum/file/program/atmos_alert/interact()
+ if(!interactable())
+ return
+ if(!computer.radio)
+ computer.Crash(MISSING_PERIPHERAL)
- if(priority_air_alarms.len)
- for(var/zone in priority_air_alarms)
- priority_text += "[format_text(zone)] [topic_link(src,"priority_clear=[ckey(zone)]","X")] "
- else
- priority_text += "No priority alerts detected. "
+ popup.set_content(return_text())
+ popup.open()
- if(minor_air_alarms.len)
- for(var/zone in minor_air_alarms)
- minor_text += "[format_text(zone)] [topic_link(src,"minor_clear=[ckey(zone)]","X")] "
- else
- minor_text += "No minor alerts detected. "
+/datum/file/program/atmos_alert/update_icon()
+ ..()
+ if(priority_air_alarms.len > 0)
+ overlay.icon_state = "alert:2"
+ else if(minor_air_alarms.len > 0)
+ overlay.icon_state = "alert:1"
+ else
+ overlay.icon_state = "alert:0"
- return "[priority_text]
[minor_text] [topic_link(src,"close","Close")]"
+ if(computer)
+ computer.update_icon()
- Topic(var/href, var/list/href_list)
- if(!interactable() || ..(href,href_list))
- return
+/datum/file/program/atmos_alert/proc/return_text()
+ var/priority_text = "Priority Alerts:"
+ var/minor_text = "Minor Alerts:"
- if("priority_clear" in href_list)
- var/removing_zone = href_list["priority_clear"]
- for(var/zone in priority_air_alarms)
- if(ckey(zone) == removing_zone)
- usr << "Priority Alert for area [zone] cleared."
- priority_air_alarms -= zone
+ if(priority_air_alarms.len)
+ for(var/zone in priority_air_alarms)
+ priority_text += "[format_text(zone)] [topic_link(src,"priority_clear=[ckey(zone)]","X")] "
+ else
+ priority_text += "No priority alerts detected. "
- if("minor_clear" in href_list)
- var/removing_zone = href_list["minor_clear"]
- for(var/zone in minor_air_alarms)
- if(ckey(zone) == removing_zone)
- usr << "Minor Alert for area [zone] cleared."
- minor_air_alarms -= zone
+ if(minor_air_alarms.len)
+ for(var/zone in minor_air_alarms)
+ minor_text += "[format_text(zone)] [topic_link(src,"minor_clear=[ckey(zone)]","X")] "
+ else
+ minor_text += "No minor alerts detected. "
- computer.updateUsrDialog()
+ return "[priority_text]
[minor_text] [topic_link(src,"close","Close")]"
+
+
+/datum/file/program/atmos_alert/Topic(var/href, var/list/href_list)
+ if(!interactable() || ..(href,href_list))
+ return
+
+ if("priority_clear" in href_list)
+ var/removing_zone = href_list["priority_clear"]
+ for(var/zone in priority_air_alarms)
+ if(ckey(zone) == removing_zone)
+ to_chat(usr, "Priority Alert for area [zone] cleared.")
+ priority_air_alarms -= zone
+
+ if("minor_clear" in href_list)
+ var/removing_zone = href_list["minor_clear"]
+ for(var/zone in minor_air_alarms)
+ if(ckey(zone) == removing_zone)
+ to_chat(usr, "Minor Alert for area [zone] cleared.")
+ minor_air_alarms -= zone
+
+ computer.updateUsrDialog()
diff --git a/code/game/machinery/computer3/computers/camera.dm b/code/game/machinery/computer3/computers/camera.dm
index abe96d57c0..0017a83531 100644
--- a/code/game/machinery/computer3/computers/camera.dm
+++ b/code/game/machinery/computer3/computers/camera.dm
@@ -23,10 +23,10 @@
allow_disassemble = 0
// No operating system
- New()
- ..(built=0)
- os = program
- circuitb.OS = os
+/obj/machinery/computer3/security/wooden_tv/New()
+ ..(built=0)
+ os = program
+ circuitb.OS = os
/obj/machinery/computer3/security/mining
@@ -59,22 +59,22 @@
var/networks = list("ALL") // A little workaround as it is not possible to place station_networks here
var/screen = "cameras"
- execute(var/datum/file/source)
- if(istype(source,/datum/file/program/security))
- var/datum/file/program/security/prog = source
- prog.key = src
- prog.camera_list = null
- return
- if(istype(source,/datum/file/program/ntos))
- for(var/obj/item/part/computer/storage/S in list(computer.hdd,computer.floppy))
- for(var/datum/file/F in S.files)
- if(istype(F,/datum/file/program/security))
- var/datum/file/program/security/Sec = F
- Sec.key = src
- Sec.camera_list = null
- Sec.execute(source)
- return
- computer.Crash(MISSING_PROGRAM)
+/datum/file/camnet_key/execute(var/datum/file/source)
+ if(istype(source,/datum/file/program/security))
+ var/datum/file/program/security/prog = source
+ prog.key = src
+ prog.camera_list = null
+ return
+ if(istype(source,/datum/file/program/ntos))
+ for(var/obj/item/part/computer/storage/S in list(computer.hdd,computer.floppy))
+ for(var/datum/file/F in S.files)
+ if(istype(F,/datum/file/program/security))
+ var/datum/file/program/security/Sec = F
+ Sec.key = src
+ Sec.camera_list = null
+ Sec.execute(source)
+ return
+ computer.Crash(MISSING_PROGRAM)
/datum/file/camnet_key/New()
for(var/N in networks)
@@ -150,28 +150,29 @@
var/mapping = 0//For the overview file, interesting bit of code.
//proc/camera_list(var/datum/file/camnet_key/key)
- get_machines(var/datum/file/camnet_key/key)
- if (!computer || computer.z > 6)
- return null
+/obj/item/part/computer/networking/cameras/get_machines(var/datum/file/camnet_key/key)
+ if (!computer || computer.z > 6)
+ return null
- cameranet.process_sort()
+ cameranet.process_sort()
- var/list/L = list()
- for(var/obj/machinery/camera/C in cameranet.cameras)
- var/list/temp = C.network & key.networks
- if(temp.len)
- L.Add(C)
+ var/list/L = list()
+ for(var/obj/machinery/camera/C in cameranet.cameras)
+ var/list/temp = C.network & key.networks
+ if(temp.len)
+ L.Add(C)
- return L
- verify_machine(var/obj/machinery/camera/C,var/datum/file/camnet_key/key = null)
- if(!istype(C) || !C.can_use())
+ return L
+
+/obj/item/part/computer/networking/cameras/verify_machine(var/obj/machinery/camera/C,var/datum/file/camnet_key/key = null)
+ if(!istype(C) || !C.can_use())
+ return 0
+
+ if(key)
+ var/list/temp = C.network & key.networks
+ if(!temp.len)
return 0
-
- if(key)
- var/list/temp = C.network & key.networks
- if(!temp.len)
- return 0
- return 1
+ return 1
/*
Camera monitoring program
@@ -198,96 +199,96 @@
var/obj/machinery/camera/current = null
- execute(var/datum/file/program/caller)
- ..(caller)
- if(computer && !key)
- var/list/fkeys = computer.list_files(/datum/file/camnet_key)
- if(fkeys && fkeys.len)
- key = fkeys[1]
- update_icon()
- computer.update_icon()
- for(var/mob/living/L in viewers(1))
- if(!istype(L,/mob/living/silicon/ai) && L.machine == src)
- L.reset_view(null)
-
-
- Reset()
- ..()
- reset_current()
+/datum/file/program/security/execute(var/datum/file/program/caller)
+ ..(caller)
+ if(computer && !key)
+ var/list/fkeys = computer.list_files(/datum/file/camnet_key)
+ if(fkeys && fkeys.len)
+ key = fkeys[1]
+ update_icon()
+ computer.update_icon()
for(var/mob/living/L in viewers(1))
if(!istype(L,/mob/living/silicon/ai) && L.machine == src)
L.reset_view(null)
- interact()
- if(!interactable())
- return
- if(!computer.camnet)
- computer.Crash(MISSING_PERIPHERAL)
- return
+/datum/file/program/security/Reset()
+ ..()
+ reset_current()
+ for(var/mob/living/L in viewers(1))
+ if(!istype(L,/mob/living/silicon/ai) && L.machine == src)
+ L.reset_view(null)
+/datum/file/program/security/interact()
+ if(!interactable())
+ return
+
+ if(!computer.camnet)
+ computer.Crash(MISSING_PERIPHERAL)
+ return
+
+ if(!key)
+ var/list/fkeys = computer.list_files(/datum/file/camnet_key)
+ if(fkeys && fkeys.len)
+ key = fkeys[1]
+ update_icon()
+ computer.update_icon()
if(!key)
- var/list/fkeys = computer.list_files(/datum/file/camnet_key)
- if(fkeys && fkeys.len)
- key = fkeys[1]
- update_icon()
- computer.update_icon()
- if(!key)
- return
-
- if(computer.camnet.verify_machine(current))
- usr.reset_view(current)
-
- if(world.time - last_camera_refresh > 50 || !camera_list)
- last_camera_refresh = world.time
-
- var/list/temp_list = computer.camnet.get_machines(key)
-
- camera_list = "Network Key: [key.title] [topic_link(src,"keyselect","\[ Select key \]")] "
- for(var/obj/machinery/camera/C in temp_list)
- if(C.can_use())
- camera_list += "[C.c_tag] - [topic_link(src,"show=\ref[C]","Show")] "
- else
- camera_list += "[C.c_tag] - DEACTIVATED "
- //camera_list += " " + topic_link(src,"close","Close")
-
- popup.set_content(camera_list)
- popup.open()
-
-
- update_icon()
- if(key)
- overlay.icon_state = key.screen
- name = key.title + " Camera Monitor"
- else
- overlay.icon_state = "camera-static"
- name = initial(name)
-
-
-
- Topic(var/href,var/list/href_list)
- if(!interactable() || !computer.camnet || ..(href,href_list))
return
- if("show" in href_list)
- var/obj/machinery/camera/C = locate(href_list["show"])
- if(istype(C) && C.can_use())
- set_current(C)
- usr.reset_view(C)
- interact()
- return
+ if(computer.camnet.verify_machine(current))
+ usr.reset_view(current)
- if("keyselect" in href_list)
- reset_current()
- usr.reset_view(null)
- key = input(usr,"Select a camera network key:", "Key Select", null) as null|anything in computer.list_files(/datum/file/camnet_key)
- select_key(key)
- if(key)
- interact()
+ if(world.time - last_camera_refresh > 50 || !camera_list)
+ last_camera_refresh = world.time
+
+ var/list/temp_list = computer.camnet.get_machines(key)
+
+ camera_list = "Network Key: [key.title] [topic_link(src,"keyselect","\[ Select key \]")] "
+ for(var/obj/machinery/camera/C in temp_list)
+ if(C.can_use())
+ camera_list += "[C.c_tag] - [topic_link(src,"show=\ref[C]","Show")] "
else
- usr << "The screen turns to static."
+ camera_list += "[C.c_tag] - DEACTIVATED "
+ //camera_list += " " + topic_link(src,"close","Close")
+
+ popup.set_content(camera_list)
+ popup.open()
+
+
+/datum/file/program/security/update_icon()
+ if(key)
+ overlay.icon_state = key.screen
+ name = key.title + " Camera Monitor"
+ else
+ overlay.icon_state = "camera-static"
+ name = initial(name)
+
+
+
+/datum/file/program/security/Topic(var/href,var/list/href_list)
+ if(!interactable() || !computer.camnet || ..(href,href_list))
+ return
+
+ if("show" in href_list)
+ var/obj/machinery/camera/C = locate(href_list["show"])
+ if(istype(C) && C.can_use())
+ set_current(C)
+ usr.reset_view(C)
+ interact()
return
+ if("keyselect" in href_list)
+ reset_current()
+ usr.reset_view(null)
+ key = input(usr,"Select a camera network key:", "Key Select", null) as null|anything in computer.list_files(/datum/file/camnet_key)
+ select_key(key)
+ if(key)
+ interact()
+ else
+ to_chat(usr, "The screen turns to static.")
+ return
+
/datum/file/program/security/proc/select_key(var/selected_key)
key = selected_key
camera_list = null
@@ -332,20 +333,20 @@
var/special_key = new/datum/file/camnet_key/syndicate
var/camera_conn = null
- interact()
- if(!interactable())
- return
+/datum/file/program/security/syndicate/interact()
+ if(!interactable())
+ return
- if(!computer.net)
- computer.Crash(MISSING_PERIPHERAL)
- return
+ if(!computer.net)
+ computer.Crash(MISSING_PERIPHERAL)
+ return
- camera_conn = computer.net.connect_to(/obj/machinery/camera,camera_conn)
+ camera_conn = computer.net.connect_to(/obj/machinery/camera,camera_conn)
- if(!camera_conn)
- computer.Crash(NETWORK_FAILURE)
- return
+ if(!camera_conn)
+ computer.Crash(NETWORK_FAILURE)
+ return
- // On interact, override camera key selection
- select_key(special_key)
- ..()
+ // On interact, override camera key selection
+ select_key(special_key)
+ ..()
diff --git a/code/game/machinery/computer3/computers/card.dm b/code/game/machinery/computer3/computers/card.dm
index 3a902c29f4..60d56b1c45 100644
--- a/code/game/machinery/computer3/computers/card.dm
+++ b/code/game/machinery/computer3/computers/card.dm
@@ -23,329 +23,325 @@
var/auth = 0
var/printing = 0
- proc/list_jobs()
- return get_all_jobs() + "Custom"
+/datum/file/program/card_comp/proc/list_jobs()
+ return get_all_jobs() + "Custom"
- // creates the block with the script in it
- // cache the result since it's almost constant but not quite
- // the list of jobs won't change after all...
- proc/scriptblock()
- var/global/dat = null
- var/counter = 0
- var jobs_all = ""
- jobs_all += " | Command | "
+// creates the block with the script in it
+// cache the result since it's almost constant but not quite
+// the list of jobs won't change after all...
+/datum/file/program/card_comp/proc/scriptblock()
+ var/global/dat = null
+ var/counter = 0
+ var jobs_all = ""
+ jobs_all += " | Command | "
- jobs_all += " | Special | "//Colony Director in special because he is head of heads ~Intercross21
- jobs_all += "Colony Director | "
- jobs_all += "Custom | "
+ jobs_all += " | Special | "//Colony Director in special because he is head of heads ~Intercross21
+ jobs_all += "Colony Director | "
+ jobs_all += "Custom | "
- counter = 0
- jobs_all += " | Security | "//Red
- for(var/job in security_positions)
- counter++
- if(counter >= 6)
- jobs_all += " | | "
- counter = 0
- jobs_all += "[replacetext(job, " ", " ")] | "
+ counter = 0
+ jobs_all += " | Security | "//Red
+ for(var/job in security_positions)
+ counter++
+ if(counter >= 6)
+ jobs_all += " | | "
+ counter = 0
+ jobs_all += "[replacetext(job, " ", " ")] | "
- counter = 0
- jobs_all += " | Engineering | "//Orange
- for(var/job in engineering_positions)
- counter++
- if(counter >= 6)
- jobs_all += " | | "
- counter = 0
- jobs_all += "[replacetext(job, " ", " ")] | "
+ counter = 0
+ jobs_all += " | Engineering | "//Orange
+ for(var/job in engineering_positions)
+ counter++
+ if(counter >= 6)
+ jobs_all += " | | "
+ counter = 0
+ jobs_all += "[replacetext(job, " ", " ")] | "
- counter = 0
- jobs_all += " | Medical | "//Green
- for(var/job in medical_positions)
- counter++
- if(counter >= 6)
- jobs_all += " | | "
- counter = 0
- jobs_all += "[replacetext(job, " ", " ")] | "
+ counter = 0
+ jobs_all += " | Medical | "//Green
+ for(var/job in medical_positions)
+ counter++
+ if(counter >= 6)
+ jobs_all += " | | "
+ counter = 0
+ jobs_all += "[replacetext(job, " ", " ")] | "
- counter = 0
- jobs_all += " | Science | "//Purple
- for(var/job in science_positions)
- counter++
- if(counter >= 6)
- jobs_all += " | | "
- counter = 0
- jobs_all += "[replacetext(job, " ", " ")] | "
+ counter = 0
+ jobs_all += " | Science | "//Purple
+ for(var/job in science_positions)
+ counter++
+ if(counter >= 6)
+ jobs_all += " | | "
+ counter = 0
+ jobs_all += "[replacetext(job, " ", " ")] | "
- counter = 0
- jobs_all += " | Civilian | "//Grey
- for(var/job in civilian_positions)
- counter++
- if(counter >= 6)
- jobs_all += " | | "
- counter = 0
- jobs_all += "[replacetext(job, " ", " ")] | "
+ counter = 0
+ jobs_all += " | Civilian | "//Grey
+ for(var/job in civilian_positions)
+ counter++
+ if(counter >= 6)
+ jobs_all += " | | "
+ counter = 0
+ jobs_all += "[replacetext(job, " ", " ")] | "
- dat = {""}
- return dat
+ dat = {""}
+ return dat
- // creates the list of access rights on the card
- proc/accessblock()
- var/accesses = "Access "
- accesses += ""
- accesses += ""
- for(var/i = 1; i <= 7; i++)
- accesses += "| [get_region_accesses_name(i)]: | "
- accesses += " "
- for(var/i = 1; i <= 7; i++)
- accesses += ""
- for(var/A in get_region_accesses(i))
- if(A in writer.access)
- accesses += topic_link(src,"access=[A]","[replacetext(get_access_desc(A), " ", " ")]") + " "
- else
- accesses += topic_link(src,"access=[A]",replacetext(get_access_desc(A), " ", " ")) + " "
- accesses += " "
- accesses += " | "
- accesses += " "
- return accesses
+// creates the list of access rights on the card
+/datum/file/program/card_comp/proc/accessblock()
+ var/accesses = "Access "
+ accesses += ""
+ accesses += ""
+ for(var/i = 1; i <= 7; i++)
+ accesses += "| [get_region_accesses_name(i)]: | "
+ accesses += " "
+ for(var/i = 1; i <= 7; i++)
+ accesses += ""
+ for(var/A in get_region_accesses(i))
+ if(A in writer.access)
+ accesses += topic_link(src,"access=[A]","[replacetext(get_access_desc(A), " ", " ")]") + " "
+ else
+ accesses += topic_link(src,"access=[A]",replacetext(get_access_desc(A), " ", " ")) + " "
+ accesses += " "
+ accesses += " | "
+ accesses += " "
+ return accesses
- proc/card_modify_menu()
- //assume peripherals and cards, do checks for them in interact
+/datum/file/program/card_comp/proc/card_modify_menu()
+ //assume peripherals and cards, do checks for them in interact
- // Header
- var/dat = " "
- dat += topic_link(src,"remove=writer","Remove [writer.name]") + " || "
- dat += topic_link(src,"remove=reader","Remove [reader.name]") + " "
- dat += topic_link(src,"mode=1","Access Crew Manifest") + " || "
- dat += topic_link(src,"logout","Log Out") + " "
- dat += " " + scriptblock()
+ // Header
+ var/dat = " "
+ dat += topic_link(src,"remove=writer","Remove [writer.name]") + " || "
+ dat += topic_link(src,"remove=reader","Remove [reader.name]") + " "
+ dat += topic_link(src,"mode=1","Access Crew Manifest") + " || "
+ dat += topic_link(src,"logout","Log Out") + " "
+ dat += " " + scriptblock()
- // form for renaming the ID
- dat += ""
+ // form for renaming the ID
+ dat += ""
- // form for changing assignment, taken care of by scriptblock() mostly
- var/assign_temp = writer.assignment
- if(!assign_temp || assign_temp == "") assign_temp = "Unassigned"
- dat += "Assignment: [assign_temp] change"
+ // form for changing assignment, taken care of by scriptblock() mostly
+ var/assign_temp = writer.assignment
+ if(!assign_temp || assign_temp == "") assign_temp = "Unassigned"
+ dat += "Assignment: [assign_temp] change"
- // list of access rights
- dat += accessblock()
+ // list of access rights
+ dat += accessblock()
+ return dat
- return dat
+/datum/file/program/card_comp/proc/login_menu()
+ //assume peripherals and cards, do checks for them in interact
+ var/dat = " Please insert the cards into the slots "
- proc/login_menu()
- //assume peripherals and cards, do checks for them in interact
- var/dat = " Please insert the cards into the slots "
+ if(istype(writer))
+ dat += "Target: [topic_link(src,"remove=writer",writer.name)] "
+ else
+ dat += "Target: [topic_link(src,"insert=writer","--------")] "
- if(istype(writer))
- dat += "Target: [topic_link(src,"remove=writer",writer.name)] "
+ if(istype(reader))
+ dat += "Confirm Identity: [topic_link(src,"remove=reader",reader.name)] "
+ else
+ dat += "Confirm Identity: [topic_link(src,"insert=reader","--------")] "
+ dat += "[topic_link(src,"auth","{Log in}")]
"
+ dat += topic_link(src,"mode=1","Access Crew Manifest")
+ return dat
+
+/datum/file/program/card_comp/proc/show_manifest()
+ // assume linked_db since called by interact()
+ var/crew = ""
+ var/list/L = list()
+ for (var/datum/data/record/t in data_core.general)
+ var/R = t.fields["name"] + " - " + t.fields["rank"]
+ L += R
+ for(var/R in sortList(L))
+ crew += "[R] "
+ return "Crew Manifest: Please use security record computer to modify entries.
[crew][topic_link(src,"print","Print")]
[topic_link(src,"mode=0","Access ID modification console.")] "
+
+// These are here partly in order to be overwritten by the centcom card computer code
+/datum/file/program/card_comp/proc/authenticate()
+ if(access_change_ids in reader.access)
+ return 1
+ if(istype(usr,/mob/living/silicon/ai))
+ return 1
+ return 0
+
+/datum/file/program/card_comp/proc/set_default_access(var/jobname)
+ var/datum/job/jobdatum
+ for(var/jobtype in typesof(/datum/job))
+ var/datum/job/J = new jobtype
+ if(ckey(J.title) == ckey(jobname))
+ jobdatum = J
+ break
+ if(jobdatum)
+ writer.access = jobdatum.get_access() // ( istype(src,/obj/machinery/computer/card/centcom) ? get_centcom_access(t1)
+
+
+/datum/file/program/card_comp/interact()
+ if(!interactable())
+ return
+
+ if(!istype(computer.cardslot, /obj/item/part/computer/cardslot/dual))
+ computer.Crash(MISSING_PERIPHERAL)
+ return
+
+ var/obj/item/part/computer/cardslot/dual/D = computer.cardslot
+ reader = D.reader
+ writer = D.writer
+
+ var/dat
+
+ switch(mode)
+ if(0)
+ if( !istype(writer) || !istype(reader) )
+ auth = 0
+ if( !auth )
+ dat = login_menu()
+ else
+ dat = card_modify_menu()
+ if(1)
+ dat = show_manifest()
+
+
+ popup.width = 940
+ popup.height = 520
+ popup.set_content(dat)
+ popup.open()
+ return
+
+
+/datum/file/program/card_comp/Topic(href, list/href_list)
+ if(!interactable() || !computer.cardslot || ..(href,href_list))
+ return
+ // todo distance/disability checks
+
+ if("mode" in href_list)
+ mode = text2num(href_list["mode"])
+ if(mode != 0 && mode != 1)
+ mode = 0
+
+ auth = 0 // always log out if switching modes just in case
+
+ if("remove" in href_list)
+ var/which = href_list["remove"]
+ if(which == "writer")
+ computer.cardslot.remove(usr, 2)
else
- dat += "Target: [topic_link(src,"insert=writer","--------")] "
+ computer.cardslot.remove(usr, 1)
+ auth = 0
- if(istype(reader))
- dat += "Confirm Identity: [topic_link(src,"remove=reader",reader.name)] "
+ if("insert" in href_list)
+ var/obj/item/weapon/card/card = usr.get_active_hand()
+ if(!istype(card)) return
+
+ var/which = href_list["insert"]
+ if(which == "writer")
+ computer.cardslot.insert(card, usr, 2)
else
- dat += "Confirm Identity: [topic_link(src,"insert=reader","--------")] "
- dat += "[topic_link(src,"auth","{Log in}")]
"
- dat += topic_link(src,"mode=1","Access Crew Manifest")
- return dat
+ computer.cardslot.insert(card,usr)
- proc/show_manifest()
- // assume linked_db since called by interact()
- var/crew = ""
+ if("print" in href_list)
+ if (printing)
+ return
+
+ printing = 1
+ sleep(50)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc )
+ P.info = "Crew Manifest: "
var/list/L = list()
for (var/datum/data/record/t in data_core.general)
var/R = t.fields["name"] + " - " + t.fields["rank"]
L += R
for(var/R in sortList(L))
- crew += "[R] "
- return "Crew Manifest: Please use security record computer to modify entries.
[crew][topic_link(src,"print","Print")]
[topic_link(src,"mode=0","Access ID modification console.")] "
+ P.info += "[R] "
+ P.name = "paper- 'Crew Manifest'"
+ printing = 0
- // These are here partly in order to be overwritten by the centcom card computer code
- proc/authenticate()
- if(access_change_ids in reader.access)
- return 1
- if(istype(usr,/mob/living/silicon/ai))
- return 1
- return 0
+ if("auth" in href_list)
+ auth = 0
+ if(istype(reader) && istype(writer) && authenticate())
+ auth = 1
- proc/set_default_access(var/jobname)
- var/datum/job/jobdatum
- for(var/jobtype in typesof(/datum/job))
- var/datum/job/J = new jobtype
- if(ckey(J.title) == ckey(jobname))
- jobdatum = J
- break
- if(jobdatum)
- writer.access = jobdatum.get_access() // ( istype(src,/obj/machinery/computer/card/centcom) ? get_centcom_access(t1)
+ if("logout" in href_list)
+ auth = 0
+ // Actual ID changing
- interact()
- if(!interactable()) return
-
- if(!computer.cardslot || !computer.cardslot.dualslot)
- computer.Crash(MISSING_PERIPHERAL)
- return
-
- reader = computer.cardslot.reader
- writer = computer.cardslot.writer
-
- var/dat
-
- switch(mode)
- if(0)
- if( !istype(writer) || !istype(reader) )
- auth = 0
- if( !auth )
- dat = login_menu()
- else
- dat = card_modify_menu()
- if(1)
- dat = show_manifest()
-
-
- popup.width = 940
- popup.height = 520
- popup.set_content(dat)
- popup.open()
- return
-
-
- Topic(href, list/href_list)
- if(!interactable() || !computer.cardslot || ..(href,href_list))
- return
- // todo distance/disability checks
-
- if("mode" in href_list)
- mode = text2num(href_list["mode"])
- if(mode != 0 && mode != 1)
- mode = 0
-
- auth = 0 // always log out if switching modes just in case
-
- if("remove" in href_list)
- var/which = href_list["remove"]
- if(which == "writer")
- computer.cardslot.remove(2)
- else
- computer.cardslot.remove(1)
- auth = 0
-
- if("insert" in href_list)
- var/obj/item/weapon/card/card = usr.get_active_hand()
- if(!istype(card)) return
-
- var/which = href_list["insert"]
- if(which == "writer")
- computer.cardslot.insert(card,2)
- else
- computer.cardslot.insert(card,1)
-
- if("print" in href_list)
- if (printing)
- return
-
- printing = 1
- sleep(50)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc )
- P.info = "Crew Manifest: "
- var/list/L = list()
- for (var/datum/data/record/t in data_core.general)
- var/R = t.fields["name"] + " - " + t.fields["rank"]
- L += R
- for(var/R in sortList(L))
- P.info += "[R] "
- P.name = "paper- 'Crew Manifest'"
- printing = 0
-
- if("auth" in href_list)
- auth = 0
- if(istype(reader) && istype(writer) && authenticate())
- auth = 1
-
- if("logout" in href_list)
- auth = 0
-
- // Actual ID changing
-
- if("access" in href_list)
- if(auth)
- var/access_type = text2num(href_list["access"])
- writer.access ^= list(access_type) //logical xor: remove if present, add if not
-
- if("assign" in href_list)
- if(auth)
- var/t1 = href_list["assign"]
- if(t1 == "Custom")
- var/temp_t = sanitize(input("Enter a custom job assignment.","Assignment"))
- if(temp_t)
- t1 = temp_t
- set_default_access(t1)
-
- writer.assignment = t1
- writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])")
- data_core.manifest_modify(writer.registered_name, writer.assignment)
- callHook("reassign_employee", list(writer))
-
- if("reg" in href_list)
- if(auth)
- writer.registered_name = href_list["reg"]
- writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])")
- data_core.manifest_modify(writer.registered_name, writer.assignment)
- callHook("reassign_employee", list(writer))
-
- computer.updateUsrDialog()
- return
-
+ if("access" in href_list)
+ if(auth)
+ var/access_type = text2num(href_list["access"])
+ writer.access ^= list(access_type) //logical xor: remove if present, add if not
+ if("assign" in href_list)
+ if(auth)
+ var/t1 = href_list["assign"]
+ if(t1 == "Custom")
+ var/temp_t = sanitize(input("Enter a custom job assignment.","Assignment"))
+ if(temp_t)
+ t1 = temp_t
+ set_default_access(t1)
+ writer.assignment = t1
+ writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])")
+ data_core.manifest_modify(writer.registered_name, writer.assignment)
+ callHook("reassign_employee", list(writer))
+ if("reg" in href_list)
+ if(auth)
+ writer.registered_name = href_list["reg"]
+ writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])")
+ data_core.manifest_modify(writer.registered_name, writer.assignment)
+ callHook("reassign_employee", list(writer))
+ computer.updateUsrDialog()
+ return
/datum/file/program/card_comp/centcom
name = "CentCom identification console"
drm = 1
- list_jobs()
- return get_all_centcom_jobs() + "Custom"
+/datum/file/program/card_comp/centcom/list_jobs()
+ return get_all_centcom_jobs() + "Custom"
- accessblock()
- var/accesses = "[using_map.boss_name]:"
- for(var/A in get_all_centcom_access())
- if(A in writer.access)
- accesses += topic_link(src,"access=[A]","[replacetext(get_centcom_access_desc(A), " ", " ")]") + " "
- else
- accesses += topic_link(src,"access=[A]",replacetext(get_centcom_access_desc(A), " ", " ")) + " "
- return accesses
+/datum/file/program/card_comp/centcom/accessblock()
+ var/accesses = "[using_map.boss_name]:"
+ for(var/A in get_all_centcom_access())
+ if(A in writer.access)
+ accesses += topic_link(src,"access=[A]","[replacetext(get_centcom_access_desc(A), " ", " ")]") + " "
+ else
+ accesses += topic_link(src,"access=[A]",replacetext(get_centcom_access_desc(A), " ", " ")) + " "
+ return accesses
- authenticate()
- if(access_cent_captain in reader.access)
- return 1
- return 0
\ No newline at end of file
+/datum/file/program/card_comp/centcom/authenticate()
+ if(access_cent_captain in reader.access)
+ return 1
+ return 0
\ No newline at end of file
diff --git a/code/game/machinery/computer3/computers/communications.dm b/code/game/machinery/computer3/computers/communications.dm
index acd66ebde1..94e5fee647 100644
--- a/code/game/machinery/computer3/computers/communications.dm
+++ b/code/game/machinery/computer3/computers/communications.dm
@@ -45,349 +45,369 @@
var/datum/announcement/priority/crew_announcement = new
- New()
- ..()
- crew_announcement.newscast = 1
+/datum/file/program/communications/New()
+ ..()
+ crew_announcement.newscast = 1
- Reset()
- ..()
- authenticated = 0
+/datum/file/program/communications/Reset()
+ ..()
+ authenticated = 0
+ state = STATE_DEFAULT
+ aistate = STATE_DEFAULT
+
+
+/datum/file/program/communications/Topic(var/href, var/list/href_list)
+ if(!interactable() || !computer.radio || ..(href,href_list) )
+ return
+ if (computer.z > 1)
+ to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
+ return
+
+ if("main" in href_list)
state = STATE_DEFAULT
- aistate = STATE_DEFAULT
-
- Topic(var/href, var/list/href_list)
- if(!interactable() || !computer.radio || ..(href,href_list) )
- return
- if (computer.z > 1)
- usr << "Unable to establish a connection: You're too far away from the station!"
- return
-
- if("main" in href_list)
- state = STATE_DEFAULT
- if("login" in href_list)
- var/mob/M = usr
- var/obj/item/I = M.get_active_hand()
- if(I)
- I = I.GetID()
- if(istype(I,/obj/item/weapon/card/id) && check_access(I))
- authenticated = 1
- if(access_captain in I.GetAccess())
- authenticated = 2
- crew_announcement.announcer = GetNameAndAssignmentFromId(I)
- if(istype(I,/obj/item/weapon/card/emag))
- authenticated = 2
- computer.emagged = 1
- if("logout" in href_list)
- authenticated = 0
- crew_announcement.announcer = ""
-
- if("swipeidseclevel" in href_list)
- var/mob/M = usr
- var/obj/item/I = M.get_active_hand()
+ if("login" in href_list)
+ var/mob/M = usr
+ var/obj/item/I = M.get_active_hand()
+ if(I)
I = I.GetID()
+ if(istype(I,/obj/item/weapon/card/id) && check_access(I))
+ authenticated = 1
+ if(access_captain in I.GetAccess())
+ authenticated = 2
+ crew_announcement.announcer = GetNameAndAssignmentFromId(I)
+ if(istype(I,/obj/item/weapon/card/emag))
+ authenticated = 2
+ computer.emagged = 1
- if (istype(I,/obj/item/weapon/card/id))
- if(access_captain in I.GetAccess())
- var/old_level = security_level
- if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN
- if(tmp_alertlevel < SEC_LEVEL_GREEN) tmp_alertlevel = SEC_LEVEL_GREEN
- if(tmp_alertlevel > SEC_LEVEL_BLUE) tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this
- set_security_level(tmp_alertlevel)
- if(security_level != old_level)
- //Only notify the admins if an actual change happened
- log_game("[key_name(usr)] has changed the security level to [get_security_level()].")
- message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].")
- switch(security_level)
- if(SEC_LEVEL_GREEN)
- feedback_inc("alert_comms_green",1)
- if(SEC_LEVEL_BLUE)
- feedback_inc("alert_comms_blue",1)
- tmp_alertlevel = 0
- else:
- usr << "You are not authorized to do this."
- tmp_alertlevel = 0
- state = STATE_DEFAULT
+ if("logout" in href_list)
+ authenticated = 0
+ crew_announcement.announcer = ""
+
+ if("swipeidseclevel" in href_list)
+ var/mob/M = usr
+ var/obj/item/I = M.get_active_hand()
+ I = I.GetID()
+
+ if (istype(I,/obj/item/weapon/card/id))
+ if(access_captain in I.GetAccess())
+ var/old_level = security_level
+ if(!tmp_alertlevel)
+ tmp_alertlevel = SEC_LEVEL_GREEN
+ if(tmp_alertlevel < SEC_LEVEL_GREEN)
+ tmp_alertlevel = SEC_LEVEL_GREEN
+ if(tmp_alertlevel > SEC_LEVEL_BLUE)
+ tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this
+ set_security_level(tmp_alertlevel)
+ if(security_level != old_level)
+ //Only notify the admins if an actual change happened
+ log_game("[key_name(usr)] has changed the security level to [get_security_level()].")
+ message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].")
+ switch(security_level)
+ if(SEC_LEVEL_GREEN)
+ feedback_inc("alert_comms_green",1)
+ if(SEC_LEVEL_BLUE)
+ feedback_inc("alert_comms_blue",1)
+ tmp_alertlevel = 0
else
- usr << "You need to swipe your ID."
- if("announce" in href_list)
- if(authenticated==2)
- if(message_cooldown)
- usr << "Please allow at least one minute to pass between announcements"
- return
- var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement")
- if(!input || !interactable())
- return
- crew_announcement.Announce(input)
- message_cooldown = 1
- spawn(600)//One minute cooldown
- message_cooldown = 0
-
- if("callshuttle" in href_list)
+ to_chat(usr, "You are not authorized to do this.")
+ tmp_alertlevel = 0
state = STATE_DEFAULT
- if(authenticated)
- state = STATE_CALLSHUTTLE
- if("callshuttle2" in href_list)
- if(!computer.radio.subspace)
+ else
+ to_chat(usr, "You need to swipe your ID.")
+
+ if("announce" in href_list)
+ if(authenticated==2)
+ if(message_cooldown)
+ usr << "Please allow at least one minute to pass between announcements"
return
- if(authenticated)
- call_shuttle_proc(usr)
- if(emergency_shuttle.online())
- post_status("shuttle")
- state = STATE_DEFAULT
- if("cancelshuttle" in href_list)
- state = STATE_DEFAULT
- if(authenticated)
- state = STATE_CANCELSHUTTLE
- if("messagelist" in href_list)
- currmsg = 0
- state = STATE_MESSAGELIST
- if("viewmessage" in href_list)
- state = STATE_VIEWMESSAGE
- if (!currmsg)
- if(href_list["message-num"])
- currmsg = text2num(href_list["message-num"])
- else
- state = STATE_MESSAGELIST
- if("delmessage" in href_list)
- state = (currmsg) ? STATE_DELMESSAGE : STATE_MESSAGELIST
- if("delmessage2" in href_list)
- if(authenticated)
- if(currmsg)
- var/title = messagetitle[currmsg]
- var/text = messagetext[currmsg]
- messagetitle.Remove(title)
- messagetext.Remove(text)
- if(currmsg == aicurrmsg)
- aicurrmsg = 0
- currmsg = 0
- state = STATE_MESSAGELIST
- else
- state = STATE_VIEWMESSAGE
- if("status" in href_list)
- state = STATE_STATUSDISPLAY
-
- // Status display stuff
- if("setstat" in href_list)
- switch(href_list["statdisp"])
- if("message")
- post_status("message", stat_msg1, stat_msg2)
- if("alert")
- post_status("alert", href_list["alert"])
- else
- post_status(href_list["statdisp"])
-
- if("setmsg1" in href_list)
- stat_msg1 = reject_bad_text(sanitize(input("Line 1", "Enter Message Text", stat_msg1) as text|null, 40), 40)
- computer.updateDialog()
- if("setmsg2" in href_list)
- stat_msg2 = reject_bad_text(sanitize(input("Line 2", "Enter Message Text", stat_msg2) as text|null, 40), 40)
- computer.updateDialog()
-
- // OMG CENTCOM LETTERHEAD
- if("MessageCentCom" in href_list)
- if(!computer.radio.subspace)
+ var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement")
+ if(!input || !interactable())
return
- if(authenticated==2)
- if(centcomm_message_cooldown)
- usr << "Arrays recycling. Please stand by."
- return
- var/input = sanitize(input("Please choose a message to transmit to [using_map.boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", ""))
- if(!input || !interactable())
- return
- CentCom_announce(input, usr)
- usr << "Message transmitted."
- log_game("[key_name(usr)] has made a [using_map.boss_short] announcement: [input]")
- centcomm_message_cooldown = 1
- spawn(600)//10 minute cooldown
- centcomm_message_cooldown = 0
+ crew_announcement.Announce(input)
+ message_cooldown = 1
+ spawn(600)//One minute cooldown
+ message_cooldown = 0
+ if("callshuttle" in href_list)
+ state = STATE_DEFAULT
+ if(authenticated)
+ state = STATE_CALLSHUTTLE
- // OMG SYNDICATE ...LETTERHEAD
- if("MessageSyndicate" in href_list)
- if((authenticated==2) && (computer.emagged))
- if(centcomm_message_cooldown)
- usr << "Arrays recycling. Please stand by."
- return
- var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", ""))
- if(!input || !interactable())
- return
- Syndicate_announce(input, usr)
- usr << "Message transmitted."
- log_game("[key_name(usr)] has made an illegal announcement: [input]")
- centcomm_message_cooldown = 1
- spawn(600)//10 minute cooldown
- centcomm_message_cooldown = 0
-
- if("RestoreBackup" in href_list)
- usr << "Backup routing data restored!"
- computer.emagged = 0
- computer.updateDialog()
-
-
-
- // AI interface
- if("ai-main" in href_list)
- aicurrmsg = 0
- aistate = STATE_DEFAULT
- if("ai-callshuttle" in href_list)
- aistate = STATE_CALLSHUTTLE
- if("ai-callshuttle2" in href_list)
- if(!computer.radio.subspace)
- return
+ if("callshuttle2" in href_list)
+ if(!computer.radio.subspace)
+ return
+ if(authenticated)
call_shuttle_proc(usr)
- aistate = STATE_DEFAULT
- if("ai-messagelist" in href_list)
- aicurrmsg = 0
- aistate = STATE_MESSAGELIST
- if("ai-viewmessage" in href_list)
- aistate = STATE_VIEWMESSAGE
- if (!aicurrmsg)
- if(href_list["message-num"])
- aicurrmsg = text2num(href_list["message-num"])
- else
- aistate = STATE_MESSAGELIST
- if("ai-delmessage" in href_list)
- aistate = (aicurrmsg) ? STATE_DELMESSAGE : STATE_MESSAGELIST
- if("ai-delmessage2" in href_list)
- if(aicurrmsg)
- var/title = messagetitle[aicurrmsg]
- var/text = messagetext[aicurrmsg]
+ if(emergency_shuttle.online())
+ post_status("shuttle")
+ state = STATE_DEFAULT
+
+ if("cancelshuttle" in href_list)
+ state = STATE_DEFAULT
+ if(authenticated)
+ state = STATE_CANCELSHUTTLE
+
+ if("messagelist" in href_list)
+ currmsg = 0
+ state = STATE_MESSAGELIST
+
+ if("viewmessage" in href_list)
+ state = STATE_VIEWMESSAGE
+ if (!currmsg)
+ if(href_list["message-num"])
+ currmsg = text2num(href_list["message-num"])
+ else
+ state = STATE_MESSAGELIST
+
+ if("delmessage" in href_list)
+ state = (currmsg) ? STATE_DELMESSAGE : STATE_MESSAGELIST
+
+ if("delmessage2" in href_list)
+ if(authenticated)
+ if(currmsg)
+ var/title = messagetitle[currmsg]
+ var/text = messagetext[currmsg]
messagetitle.Remove(title)
messagetext.Remove(text)
if(currmsg == aicurrmsg)
- currmsg = 0
- aicurrmsg = 0
- aistate = STATE_MESSAGELIST
- if("ai-status" in href_list)
- aistate = STATE_STATUSDISPLAY
-
- if("securitylevel" in href_list)
- tmp_alertlevel = text2num( href_list["newalertlevel"] )
- if(!tmp_alertlevel) tmp_alertlevel = 0
- state = STATE_CONFIRM_LEVEL
-
- if("changeseclevel" in href_list)
- state = STATE_ALERT_LEVEL
-
- computer.updateUsrDialog()
-
-
-
- proc/main_menu()
- var/dat = ""
- if (computer.radio.subspace)
- if(emergency_shuttle.online() && emergency_shuttle.location())
- var/timeleft = emergency_shuttle.estimate_arrival_time()
- dat += "Emergency shuttle\n \nETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)] "
- refresh = 1
- else
- refresh = 0
- if (authenticated)
- dat += " \[ Log Out \]"
- if (authenticated==2)
- dat += " \[ Make An Announcement \]"
- if(computer.emagged == 0)
- dat += " \[ Send an emergency message to [using_map.boss_short] \]"
- else
- dat += " \[ Send an emergency message to \[UNKNOWN\] \]"
- dat += " \[ Restore Backup Routing Data \]"
-
- dat += " \[ Change alert level \]"
- if(emergency_shuttle.location())
- if (emergency_shuttle.online())
- dat += " \[ Cancel Shuttle Call \]"
- else
- dat += " \[ Call Emergency Shuttle \]"
-
- dat += " \[ Set Status Display \]"
+ aicurrmsg = 0
+ currmsg = 0
+ state = STATE_MESSAGELIST
else
- dat += " \[ Log In \]"
- dat += " \[ Message List \]"
- return dat
+ state = STATE_VIEWMESSAGE
- proc/confirm_menu(var/prompt,var/yes_option)
- return "Are you sure you want to [prompt]? \[ [topic_link(src,yes_option,"OK")] | [topic_link(src,"main","Cancel")] \]"
+ if("status" in href_list)
+ state = STATE_STATUSDISPLAY
- interact()
- if(!interactable())
- return
- if(!computer.radio)
- computer.Crash(MISSING_PERIPHERAL)
- return
-
- var/dat = ""
- switch(state)
- if(STATE_DEFAULT)
- dat = main_menu()
- if(STATE_CALLSHUTTLE)
- dat = confirm_menu("call the shuttle","callshuttle2")
- if(STATE_CANCELSHUTTLE)
- dat = confirm_menu("cancel the shuttle","cancelshuttle2")
- if(STATE_MESSAGELIST)
- dat += "Messages:"
- for(var/i = 1; i<=messagetitle.len; i++)
- dat += " [messagetitle[i]]"
- if(STATE_VIEWMESSAGE)
- if (currmsg)
- dat += "[messagetitle[currmsg]]
[messagetext[currmsg]]"
- if (authenticated)
- dat += "
\[ Delete \]"
- else
- state = STATE_MESSAGELIST
- interact()
- return
- if(STATE_DELMESSAGE)
- if (currmsg)
- dat += "Are you sure you want to delete this message? \[ OK | Cancel \]"
- else
- state = STATE_MESSAGELIST
- interact()
- return
- if(STATE_STATUSDISPLAY)
- dat += "\[ Back \] "
- dat += "Set Status Displays "
- dat += "\[ Clear \] "
- dat += "\[ Station Time \]"
- dat += "\[ Shuttle ETA \] "
- dat += "\[ Message \]"
- dat += " "
- dat += "\[ Alert: None |"
- dat += " Red Alert |"
- dat += " Lockdown |"
- dat += " Biohazard \]
"
- if(STATE_ALERT_LEVEL)
- dat += "Current alert level: [get_security_level()] "
- if(security_level == SEC_LEVEL_DELTA)
- dat += "The self-destruct mechanism is active. Find a way to deactivate the mechanism to lower the alert level or evacuate."
- else
- dat += "Blue "
- dat += "Green"
- if(STATE_CONFIRM_LEVEL)
- dat += "Current alert level: [get_security_level()] "
- dat += "Confirm the change to: [num2seclevel(tmp_alertlevel)] "
- dat += "Swipe ID to confirm change. "
-
- popup.set_content(dat)
- popup.open()
-
-
- proc/post_status(var/command, var/data1, var/data2)
- var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435)
-
- if(!frequency) return
-
- var/datum/signal/status_signal = new
- status_signal.source = src
- status_signal.transmission_method = 1
- status_signal.data["command"] = command
-
- switch(command)
+ // Status display stuff
+ if("setstat" in href_list)
+ switch(href_list["statdisp"])
if("message")
- status_signal.data["msg1"] = data1
- status_signal.data["msg2"] = data2
+ post_status("message", stat_msg1, stat_msg2)
if("alert")
- status_signal.data["picture_state"] = data1
+ post_status("alert", href_list["alert"])
+ else
+ post_status(href_list["statdisp"])
- frequency.post_signal(src, status_signal)
+ if("setmsg1" in href_list)
+ stat_msg1 = reject_bad_text(sanitize(input("Line 1", "Enter Message Text", stat_msg1) as text|null, 40), 40)
+ computer.updateDialog()
+
+ if("setmsg2" in href_list)
+ stat_msg2 = reject_bad_text(sanitize(input("Line 2", "Enter Message Text", stat_msg2) as text|null, 40), 40)
+ computer.updateDialog()
+
+ // OMG CENTCOM LETTERHEAD
+ if("MessageCentCom" in href_list)
+ if(!computer.radio.subspace)
+ return
+ if(authenticated==2)
+ if(centcomm_message_cooldown)
+ to_chat(usr, "Arrays recycling. Please stand by.")
+ return
+ var/input = sanitize(input("Please choose a message to transmit to [using_map.boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", ""))
+ if(!input || !interactable())
+ return
+ CentCom_announce(input, usr)
+ to_chat(usr, "Message transmitted.")
+ log_game("[key_name(usr)] has made a [using_map.boss_short] announcement: [input]")
+ centcomm_message_cooldown = 1
+ spawn(600)//10 minute cooldown
+ centcomm_message_cooldown = 0
+
+ // OMG SYNDICATE ...LETTERHEAD
+ if("MessageSyndicate" in href_list)
+ if((authenticated==2) && (computer.emagged))
+ if(centcomm_message_cooldown)
+ to_chat(usr, "Arrays recycling. Please stand by.")
+ return
+ var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", ""))
+ if(!input || !interactable())
+ return
+ Syndicate_announce(input, usr)
+ to_chat(usr, "Message transmitted.")
+ log_game("[key_name(usr)] has made an illegal announcement: [input]")
+ centcomm_message_cooldown = 1
+ spawn(600)//10 minute cooldown
+ centcomm_message_cooldown = 0
+
+ if("RestoreBackup" in href_list)
+ to_chat(usr, "Backup routing data restored!")
+ computer.emagged = 0
+ computer.updateDialog()
+
+
+ // AI interface
+ if("ai-main" in href_list)
+ aicurrmsg = 0
+ aistate = STATE_DEFAULT
+
+ if("ai-callshuttle" in href_list)
+ aistate = STATE_CALLSHUTTLE
+
+ if("ai-callshuttle2" in href_list)
+ if(!computer.radio.subspace)
+ return
+ call_shuttle_proc(usr)
+ aistate = STATE_DEFAULT
+
+ if("ai-messagelist" in href_list)
+ aicurrmsg = 0
+ aistate = STATE_MESSAGELIST
+
+ if("ai-viewmessage" in href_list)
+ aistate = STATE_VIEWMESSAGE
+ if (!aicurrmsg)
+ if(href_list["message-num"])
+ aicurrmsg = text2num(href_list["message-num"])
+ else
+ aistate = STATE_MESSAGELIST
+
+ if("ai-delmessage" in href_list)
+ aistate = (aicurrmsg) ? STATE_DELMESSAGE : STATE_MESSAGELIST
+
+ if("ai-delmessage2" in href_list)
+ if(aicurrmsg)
+ var/title = messagetitle[aicurrmsg]
+ var/text = messagetext[aicurrmsg]
+ messagetitle.Remove(title)
+ messagetext.Remove(text)
+ if(currmsg == aicurrmsg)
+ currmsg = 0
+ aicurrmsg = 0
+ aistate = STATE_MESSAGELIST
+
+ if("ai-status" in href_list)
+ aistate = STATE_STATUSDISPLAY
+
+ if("securitylevel" in href_list)
+ tmp_alertlevel = text2num( href_list["newalertlevel"] )
+ if(!tmp_alertlevel) tmp_alertlevel = 0
+ state = STATE_CONFIRM_LEVEL
+
+ if("changeseclevel" in href_list)
+ state = STATE_ALERT_LEVEL
+
+ computer.updateUsrDialog()
+
+
+
+/datum/file/program/communications/proc/main_menu()
+ var/dat = ""
+ if (computer.radio.subspace)
+ if(emergency_shuttle.online() && emergency_shuttle.location())
+ var/timeleft = emergency_shuttle.estimate_arrival_time()
+ dat += "Emergency shuttle\n \nETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)] "
+ refresh = 1
+ else
+ refresh = 0
+ if (authenticated)
+ dat += " \[ Log Out \]"
+ if (authenticated==2)
+ dat += " \[ Make An Announcement \]"
+ if(computer.emagged == 0)
+ dat += " \[ Send an emergency message to [using_map.boss_short] \]"
+ else
+ dat += " \[ Send an emergency message to \[UNKNOWN\] \]"
+ dat += " \[ Restore Backup Routing Data \]"
+
+ dat += " \[ Change alert level \]"
+ if(emergency_shuttle.location())
+ if (emergency_shuttle.online())
+ dat += " \[ Cancel Shuttle Call \]"
+ else
+ dat += " \[ Call Emergency Shuttle \]"
+
+ dat += " \[ Set Status Display \]"
+ else
+ dat += " \[ Log In \]"
+ dat += " \[ Message List \]"
+ return dat
+
+/datum/file/program/communications/proc/confirm_menu(var/prompt,var/yes_option)
+ return "Are you sure you want to [prompt]? \[ [topic_link(src,yes_option,"OK")] | [topic_link(src,"main","Cancel")] \]"
+
+/datum/file/program/communications/interact()
+ if(!interactable())
+ return
+ if(!computer.radio)
+ computer.Crash(MISSING_PERIPHERAL)
+ return
+
+ var/dat = ""
+ switch(state)
+ if(STATE_DEFAULT)
+ dat = main_menu()
+ if(STATE_CALLSHUTTLE)
+ dat = confirm_menu("call the shuttle","callshuttle2")
+ if(STATE_CANCELSHUTTLE)
+ dat = confirm_menu("cancel the shuttle","cancelshuttle2")
+ if(STATE_MESSAGELIST)
+ dat += "Messages:"
+ for(var/i = 1; i<=messagetitle.len; i++)
+ dat += " [messagetitle[i]]"
+ if(STATE_VIEWMESSAGE)
+ if (currmsg)
+ dat += "[messagetitle[currmsg]]
[messagetext[currmsg]]"
+ if (authenticated)
+ dat += "
\[ Delete \]"
+ else
+ state = STATE_MESSAGELIST
+ interact()
+ return
+ if(STATE_DELMESSAGE)
+ if (currmsg)
+ dat += "Are you sure you want to delete this message? \[ OK | Cancel \]"
+ else
+ state = STATE_MESSAGELIST
+ interact()
+ return
+ if(STATE_STATUSDISPLAY)
+ dat += "\[ Back \] "
+ dat += "Set Status Displays "
+ dat += "\[ Clear \] "
+ dat += "\[ Station Time \]"
+ dat += "\[ Shuttle ETA \] "
+ dat += "\[ Message \]"
+ dat += " "
+ dat += "\[ Alert: None |"
+ dat += " Red Alert |"
+ dat += " Lockdown |"
+ dat += " Biohazard \]
"
+ if(STATE_ALERT_LEVEL)
+ dat += "Current alert level: [get_security_level()] "
+ if(security_level == SEC_LEVEL_DELTA)
+ dat += "The self-destruct mechanism is active. Find a way to deactivate the mechanism to lower the alert level or evacuate."
+ else
+ dat += "Blue "
+ dat += "Green"
+ if(STATE_CONFIRM_LEVEL)
+ dat += "Current alert level: [get_security_level()] "
+ dat += "Confirm the change to: [num2seclevel(tmp_alertlevel)] "
+ dat += "Swipe ID to confirm change. "
+
+ popup.set_content(dat)
+ popup.open()
+
+
+/datum/file/program/communications/proc/post_status(var/command, var/data1, var/data2)
+ var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435)
+
+ if(!frequency)
+ return
+
+ var/datum/signal/status_signal = new
+ status_signal.source = src
+ status_signal.transmission_method = 1
+ status_signal.data["command"] = command
+
+ switch(command)
+ if("message")
+ status_signal.data["msg1"] = data1
+ status_signal.data["msg2"] = data2
+ if("alert")
+ status_signal.data["picture_state"] = data1
+
+ frequency.post_signal(src, status_signal)
diff --git a/code/game/machinery/computer3/computers/crew.dm b/code/game/machinery/computer3/computers/crew.dm
index 2098d79f02..e0112532dd 100644
--- a/code/game/machinery/computer3/computers/crew.dm
+++ b/code/game/machinery/computer3/computers/crew.dm
@@ -9,67 +9,68 @@
active_state = "crew"
var/list/tracked = list( )
- interact(mob/user)
- if(!interactable())
- return
+/datum/file/program/crew/interact(mob/user)
+ if(!interactable())
+ return
- scan()
- var/t = "Crew Monitoring "
- t += " Refresh "
- t += "Close "
- t += "| Name | Vitals | Position | "
- var/list/logs = list()
- for(var/obj/item/clothing/under/C in src.tracked)
- var/log = ""
- var/turf/pos = get_turf(C)
- if((C) && (C.has_sensor) && (pos) && (pos.z == computer.z) && C.sensor_mode)
- if(istype(C.loc, /mob/living/carbon/human))
+ scan()
+ var/t = "Crew Monitoring "
+ t += " Refresh "
+ t += "Close "
+ t += "| Name | Vitals | Position | "
+ var/list/logs = list()
+ for(var/obj/item/clothing/under/C in src.tracked)
+ var/log = ""
+ var/turf/pos = get_turf(C)
+ if((C) && (C.has_sensor) && (pos) && (pos.z == computer.z) && C.sensor_mode)
+ if(istype(C.loc, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = C.loc
- var/mob/living/carbon/human/H = C.loc
+ var/dam1 = round(H.getOxyLoss(),1)
+ var/dam2 = round(H.getToxLoss(),1)
+ var/dam3 = round(H.getFireLoss(),1)
+ var/dam4 = round(H.getBruteLoss(),1)
- var/dam1 = round(H.getOxyLoss(),1)
- var/dam2 = round(H.getToxLoss(),1)
- var/dam3 = round(H.getFireLoss(),1)
- var/dam4 = round(H.getBruteLoss(),1)
+ var/life_status = "[H.stat > 1 ? "Deceased" : "Living"]"
+ var/damage_report = "([dam1]/[dam2]/[dam3]/[dam4])"
- var/life_status = "[H.stat > 1 ? "Deceased" : "Living"]"
- var/damage_report = "([dam1]/[dam2]/[dam3]/[dam4])"
+ log += "| [H.get_authentification_name()] ([H.get_assignment()]) | "
- log += " | [H.get_authentification_name()] ([H.get_assignment()]) | "
+ switch(C.sensor_mode)
+ if(1)
+ log += "[life_status] | Not Available | "
+ if(2)
+ log += "[life_status] [damage_report] | Not Available | "
+ if(3)
+ var/area/player_area = get_area(H)
+ log += "[life_status] [damage_report] | [sanitize(player_area.name)] ([pos.x], [pos.y]) | "
+ logs += log
+ logs = sortList(logs)
+ for(var/log in logs)
+ t += log
+ t += " "
+ t += ""
- switch(C.sensor_mode)
- if(1)
- log += "[life_status] | Not Available | "
- if(2)
- log += "[life_status] [damage_report] | Not Available | "
- if(3)
- var/area/player_area = get_area(H)
- log += "[life_status] [damage_report] | [sanitize(player_area.name)] ([pos.x], [pos.y]) | "
- logs += log
- logs = sortList(logs)
- for(var/log in logs)
- t += log
- t += " "
- t += ""
-
- popup.set_content(t)
- popup.open()
+ popup.set_content(t)
+ popup.open()
- proc/scan()
- for(var/obj/item/clothing/under/C in world)
- if((C.has_sensor) && (istype(C.loc, /mob/living/carbon/human)))
- tracked |= C
- return 1
+/datum/file/program/crew/proc/scan()
+ for(var/obj/item/clothing/under/C in world)
+ if((C.has_sensor) && (istype(C.loc, /mob/living/carbon/human)))
+ tracked |= C
+ return 1
- Topic(href, list/href_list)
- if(!interactable() || !computer.cardslot || ..(href,href_list))
- return
- if( href_list["close"] )
- usr << browse(null, "window=crewcomp")
- usr.unset_machine()
- return
- if(href_list["update"])
- interact()
- //src.updateUsrDialog()
- return
+/datum/file/program/crew/Topic(href, list/href_list)
+ if(!interactable() || !computer.cardslot || ..(href,href_list))
+ return
+
+ if( href_list["close"] )
+ usr << browse(null, "window=crewcomp")
+ usr.unset_machine()
+ return
+
+ if(href_list["update"])
+ interact()
+ //src.updateUsrDialog()
+ return
diff --git a/code/game/machinery/computer3/computers/law.dm b/code/game/machinery/computer3/computers/law.dm
index 7d9b47ff0b..e79b09c9e9 100644
--- a/code/game/machinery/computer3/computers/law.dm
+++ b/code/game/machinery/computer3/computers/law.dm
@@ -9,46 +9,46 @@
var/opened = 0
- verb/AccessInternals()
- set category = "Object"
- set name = "Access Computer's Internals"
- set src in oview(1)
- if(!Adjacent(usr) || usr.restrained() || usr.lying || usr.stat || istype(usr, /mob/living/silicon) || !istype(usr, /mob/living))
- return
-
- opened = !opened
- if(opened)
- usr << "The access panel is now open."
- else
- usr << "The access panel is now closed."
+/obj/machinery/computer3/aiupload/verb/AccessInternals()
+ set category = "Object"
+ set name = "Access Computer's Internals"
+ set src in oview(1)
+ if(!Adjacent(usr) || usr.restrained() || usr.lying || usr.stat || istype(usr, /mob/living/silicon) || !istype(usr, /mob/living))
return
-
- attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob)
- if (user.z > 6)
- user << "Unable to establish a connection: You're too far away from the station!"
- return
- if(istype(module, /obj/item/weapon/aiModule))
- module.install(src)
- else
- return ..()
+ opened = !opened
+ if(opened)
+ to_chat(usr, "The access panel is now open.")
+ else
+ to_chat(usr, "The access panel is now closed.")
+ return
- attack_hand(var/mob/user as mob)
- if(src.stat & NOPOWER)
- usr << "The upload computer has no power!"
- return
- if(src.stat & BROKEN)
- usr << "The upload computer is broken!"
- return
-
- src.current = select_active_ai(user)
-
- if (!src.current)
- usr << "No active AIs detected."
- else
- usr << "[src.current.name] selected for law changes."
+/obj/machinery/computer3/aiupload/attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob)
+ if (user.z > 6)
+ to_chat(user, "Unable to establish a connection: You're too far away from the station!")
return
+ if(istype(module, /obj/item/weapon/aiModule))
+ module.install(src, user)
+ else
+ return ..()
+
+
+/obj/machinery/computer3/aiupload/attack_hand(var/mob/user as mob)
+ if(src.stat & NOPOWER)
+ to_chat(user, "The upload computer has no power!")
+ return
+ if(src.stat & BROKEN)
+ to_chat(user, "The upload computer is broken!")
+ return
+
+ src.current = select_active_ai(user)
+
+ if (!src.current)
+ to_chat(user, "No active AIs detected.")
+ else
+ to_chat(user, "[src.current.name] selected for law changes.")
+ return
@@ -60,25 +60,25 @@
var/mob/living/silicon/robot/current = null
- attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob)
- if(istype(module, /obj/item/weapon/aiModule))
- module.install(src)
- else
- return ..()
+/obj/machinery/computer3/borgupload/attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob)
+ if(istype(module, /obj/item/weapon/aiModule))
+ module.install(src, user)
+ else
+ return ..()
- attack_hand(var/mob/user as mob)
- if(src.stat & NOPOWER)
- usr << "The upload computer has no power!"
- return
- if(src.stat & BROKEN)
- usr << "The upload computer is broken!"
- return
-
- src.current = freeborg()
-
- if (!src.current)
- usr << "No free cyborgs detected."
- else
- usr << "[src.current.name] selected for law changes."
+/obj/machinery/computer3/borgupload/attack_hand(var/mob/user as mob)
+ if(src.stat & NOPOWER)
+ to_chat(user, "The upload computer has no power!")
return
+ if(src.stat & BROKEN)
+ to_chat(user, "The upload computer is broken!")
+ return
+
+ src.current = freeborg()
+
+ if (!src.current)
+ to_chat(user, "No free cyborgs detected.")
+ else
+ to_chat(user, "[src.current.name] selected for law changes.")
+ return
diff --git a/code/game/machinery/computer3/computers/medical.dm b/code/game/machinery/computer3/computers/medical.dm
index bb4228397d..d1f20c7363 100644
--- a/code/game/machinery/computer3/computers/medical.dm
+++ b/code/game/machinery/computer3/computers/medical.dm
@@ -34,490 +34,479 @@
var/printing = null
- proc/authenticate()
- if(access_medical in scan.access)
- return 1
- if(istype(usr,/mob/living/silicon/ai))
- return 1
- return 0
+/datum/file/program/med_data/proc/authenticate()
+ if(isAI(usr) || access_medical in scan.access)
+ return 1
+ return 0
- interact()
- if(!computer.cardslot)
- computer.Crash(MISSING_PERIPHERAL)
- return
- usr.set_machine(src)
- scan = computer.cardslot.reader
- if(!interactable())
- return
- if (computer.z > 6)
- usr << "Unable to establish a connection: You're too far away from the station!"
- return
- var/dat
-
- if (temp)
- dat = text("[src.temp]
Clear Screen")
- else
- dat = text("Confirm Identity (R): [] ", src, (scan ? text("[]", scan.name) : "----------"))
- if (computer.cardslot.dualslot)
- dat += text("Check Identity (W): [] ", src, (scan2 ? text("[]", scan2.name) : "----------"))
- if(scan2 && !scan)
- dat += text("Insert card into reader slot to log in. ")
-
- if (src.authenticated)
- switch(src.screen)
- if(1.0)
- dat += {"
-Search Records
- List Records
-
- Virus Database
- Medbot Tracking
-
- Record Maintenance
- {Log Out}
-"}
- if(2.0)
- dat += "Record List: "
- if(!isnull(data_core.general))
- for(var/datum/data/record/R in sortRecord(data_core.general))
- dat += text("[]: [] ", src, R, R.fields["id"], R.fields["name"])
- //Foreach goto(132)
- dat += text(" Back", src)
- if(3.0)
- dat += text("Records Maintenance \nBackup To Disk \nUpload From disk \nDelete All Records \n \nBack", src, src, src, src)
- if(4.0)
- dat += "Medical Record "
- if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
- var/icon/front = active1.fields["photo_front"]
- var/icon/side = active1.fields["photo_side"]
- usr << browse_rsc(front, "front.png")
- usr << browse_rsc(side, "side.png")
-
- dat += ""
- else
- dat += "General Record Lost! "
- if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
- dat += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src, src.active2.fields["b_type"], src, src.active2.fields["b_dna"], src, src.active2.fields["mi_dis"], src, src.active2.fields["mi_dis_d"], src, src.active2.fields["ma_dis"], src, src.active2.fields["ma_dis_d"], src, src.active2.fields["alg"], src, src.active2.fields["alg_d"], src, src.active2.fields["cdi"], src, src.active2.fields["cdi_d"], src, decode(src.active2.fields["notes"]))
- var/counter = 1
- while(src.active2.fields[text("com_[]", counter)])
- dat += text("[] Delete Entry
", src.active2.fields[text("com_[]", counter)], src, counter)
- counter++
- dat += text("Add Entry
", src)
- dat += text("Delete Record (Medical Only)
", src)
- else
- dat += "Medical Record Lost! "
- dat += text("New Record
")
- dat += text("\nPrint Record \nBack ", src, src)
- if(5.0)
- dat += "Virus Database"
- for (var/ID in virusDB)
- var/datum/data/record/v = virusDB[ID]
- dat += " [v.fields["name"]]"
-
- dat += " Back"
- if(6.0)
- dat += "Medical Robot Monitor"
- dat += "Back"
- dat += " Medical Robots:"
- var/bdat = null
- for(var/mob/living/bot/medbot/M in world)
-
- if(M.z != computer.z) continue //only find medibots on the same z-level as the computer
- var/turf/bl = get_turf(M)
- if(bl) //if it can't find a turf for the medibot, then it probably shouldn't be showing up
- bdat += "[M.name] - \[[bl.x],[bl.y]\] - [M.on ? "Online" : "Offline"] "
- if((!isnull(M.reagent_glass)) && M.use_beaker)
- bdat += "Reservoir: \[[M.reagent_glass.reagents.total_volume]/[M.reagent_glass.reagents.maximum_volume]\] "
- else
- bdat += "Using Internal Synthesizer. "
- if(!bdat)
- dat += " None detected"
- else
- dat += " [bdat]"
-
- else
- else
- dat += text("{Log In}", src)
- popup.width = 600
- popup.height = 400
- popup.set_content(dat)
- popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
- popup.open()
+/datum/file/program/med_data/interact()
+ if(!computer.cardslot)
+ computer.Crash(MISSING_PERIPHERAL)
return
+ usr.set_machine(src)
+ scan = computer.cardslot.reader
+ if(!interactable())
+ return
+ if(computer.z > 6)
+ to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
+ return
+ var/dat
- Topic(href, href_list)
- if(!interactable() || !computer.cardslot || ..(href,href_list))
- return
- if (!( data_core.general.Find(src.active1) ))
- src.active1 = null
- if (!( data_core.medical.Find(src.active2) ))
- src.active2 = null
-
- if (href_list["temp"])
- src.temp = null
-
- if (href_list["cardr"])
- if (scan)
- if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
- computer.cardslot.remove(1)
- else
- scan.loc = get_turf(src)
- scan = null
- else
- var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I))
- computer.cardslot.insert(I, 1)
- scan = I
-
- if (href_list["cardw"])
- if (scan2)
- if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
- computer.cardslot.remove(2)
- else
- scan2.loc = get_turf(src)
- scan2 = null
- else
- var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I))
- computer.cardslot.insert(I, 2)
- scan2 = I
-
- else if (href_list["logout"])
- src.authenticated = null
- src.screen = null
- src.active1 = null
- src.active2 = null
-
- else if (href_list["login"])
-
- if (istype(usr, /mob/living/silicon/ai))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- src.rank = "AI"
- src.screen = 1
-
- else if (istype(usr, /mob/living/silicon/robot))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- var/mob/living/silicon/robot/R = usr
- src.rank = "[R.modtype] [R.braintype]"
- src.screen = 1
-
- else if (istype(src.scan, /obj/item/weapon/card/id))
- src.active1 = null
- src.active2 = null
-
- if (src.check_access(src.scan))
- src.authenticated = src.scan.registered_name
- src.rank = src.scan.assignment
- src.screen = 1
+ if (temp)
+ dat = text("[src.temp]
Clear Screen")
+ else
+ dat = text("Confirm Identity (R): [] ", src, (scan ? text("[]", scan.name) : "----------"))
+ if (istype(computer.cardslot, /obj/item/part/computer/cardslot/dual))
+ dat += text("Check Identity (W): [] ", src, (scan2 ? text("[]", scan2.name) : "----------"))
+ if(scan2 && !scan)
+ dat += text("Insert card into reader slot to log in. ")
if (src.authenticated)
+ switch(src.screen)
+ if(1.0)
+ dat += {"
+ Search Records
+ List Records
+
+ Virus Database
+ Medbot Tracking
+
+ Record Maintenance
+ {Log Out}
+ "}
+ if(2.0)
+ dat += "Record List: "
+ if(!isnull(data_core.general))
+ for(var/datum/data/record/R in sortRecord(data_core.general))
+ dat += text("[]: [] ", src, R, R.fields["id"], R.fields["name"])
+ //Foreach goto(132)
+ dat += text(" Back", src)
+ if(3.0)
+ dat += text("Records Maintenance \nBackup To Disk \nUpload From disk \nDelete All Records \n \nBack", src, src, src, src)
+ if(4.0)
+ dat += "Medical Record "
+ if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
+ var/icon/front = active1.fields["photo_front"]
+ var/icon/side = active1.fields["photo_side"]
+ usr << browse_rsc(front, "front.png")
+ usr << browse_rsc(side, "side.png")
- if(href_list["screen"])
- src.screen = text2num(href_list["screen"])
- if(src.screen < 1)
- src.screen = 1
+ dat += ""
+ else
+ dat += "General Record Lost! "
+ if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
+ dat += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src, src.active2.fields["b_type"], src, src.active2.fields["b_dna"], src, src.active2.fields["mi_dis"], src, src.active2.fields["mi_dis_d"], src, src.active2.fields["ma_dis"], src, src.active2.fields["ma_dis_d"], src, src.active2.fields["alg"], src, src.active2.fields["alg_d"], src, src.active2.fields["cdi"], src, src.active2.fields["cdi_d"], src, decode(src.active2.fields["notes"]))
+ var/counter = 1
+ while(src.active2.fields[text("com_[]", counter)])
+ dat += text("[] Delete Entry
", src.active2.fields[text("com_[]", counter)], src, counter)
+ counter++
+ dat += text("Add Entry
", src)
+ dat += text("Delete Record (Medical Only)
", src)
+ else
+ dat += "Medical Record Lost! "
+ dat += text("New Record
")
+ dat += text("\nPrint Record \nBack ", src, src)
+ if(5.0)
+ dat += "Virus Database"
+ for (var/ID in virusDB)
+ var/datum/data/record/v = virusDB[ID]
+ dat += " [v.fields["name"]]"
- src.active1 = null
- src.active2 = null
+ dat += " Back"
+ if(6.0)
+ dat += "Medical Robot Monitor"
+ dat += "Back"
+ dat += " Medical Robots:"
+ var/bdat = null
+ for(var/mob/living/bot/medbot/M in mob_list)
- if(href_list["vir"])
- var/datum/data/record/v = locate(href_list["vir"])
- src.temp = "GNAv2 based virus lifeform V-[v.fields["id"]]"
- src.temp += " Name: [v.fields["name"]]"
- src.temp += " Antigen: [v.fields["antigen"]]"
- src.temp += " Spread: [v.fields["spread type"]] "
- src.temp += " Details: [v.fields["description"]]"
-
- if (href_list["del_all"])
- src.temp = text("Are you sure you wish to delete all records? \n\tYes \n\tNo ", src, src)
-
- if (href_list["del_all2"])
- for(var/datum/data/record/R in data_core.medical)
- //R = null
- qdel(R)
- //Foreach goto(494)
- src.temp = "All records deleted."
-
- if (href_list["field"])
- var/a1 = src.active1
- var/a2 = src.active2
- switch(href_list["field"])
- if("fingerprint")
- if (istype(src.active1, /datum/data/record))
- var/t1 = sanitize(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- src.active1.fields["fingerprint"] = t1
- if("sex")
- if (istype(src.active1, /datum/data/record))
- if (src.active1.fields["sex"] == "Male")
- src.active1.fields["sex"] = "Female"
+ if(M.z != computer.z) continue //only find medibots on the same z-level as the computer
+ var/turf/bl = get_turf(M)
+ if(bl) //if it can't find a turf for the medibot, then it probably shouldn't be showing up
+ bdat += "[M.name] - \[[bl.x],[bl.y]\] - [M.on ? "Online" : "Offline"] "
+ if((!isnull(M.reagent_glass)) && M.use_beaker)
+ bdat += "Reservoir: \[[M.reagent_glass.reagents.total_volume]/[M.reagent_glass.reagents.maximum_volume]\] "
else
- src.active1.fields["sex"] = "Male"
- if("age")
- if (istype(src.active1, /datum/data/record))
- var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- src.active1.fields["age"] = t1
- if("mi_dis")
- if (istype(src.active2, /datum/data/record))
- var/t1 = sanitize(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["mi_dis"] = t1
- if("mi_dis_d")
- if (istype(src.active2, /datum/data/record))
- var/t1 = sanitize(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["mi_dis_d"] = t1
- if("ma_dis")
- if (istype(src.active2, /datum/data/record))
- var/t1 = sanitize(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["ma_dis"] = t1
- if("ma_dis_d")
- if (istype(src.active2, /datum/data/record))
- var/t1 = sanitize(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["ma_dis_d"] = t1
- if("alg")
- if (istype(src.active2, /datum/data/record))
- var/t1 = sanitize(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["alg"] = t1
- if("alg_d")
- if (istype(src.active2, /datum/data/record))
- var/t1 = sanitize(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["alg_d"] = t1
- if("cdi")
- if (istype(src.active2, /datum/data/record))
- var/t1 = sanitize(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["cdi"] = t1
- if("cdi_d")
- if (istype(src.active2, /datum/data/record))
- var/t1 = sanitize(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["cdi_d"] = t1
- if("notes")
- if (istype(src.active2, /datum/data/record))
- var/t1 = sanitize(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message, extra = 0)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["notes"] = t1
- if("p_stat")
- if (istype(src.active1, /datum/data/record))
- src.temp = text("Physical Condition: \n\t*Deceased* \n\t*SSD* \n\tActive \n\tPhysically Unfit \n\tDisabled ", src, src, src, src, src)
- if("m_stat")
- if (istype(src.active1, /datum/data/record))
- src.temp = text("Mental Condition: \n\t*Insane* \n\t*Unstable* \n\t*Watch* \n\tStable ", src, src, src, src)
- if("b_type")
- if (istype(src.active2, /datum/data/record))
- src.temp = text("Blood Type: \n\tA- A+ \n\tB- B+ \n\tAB- AB+ \n\tO- O+ ", src, src, src, src, src, src, src, src)
- if("b_dna")
- if (istype(src.active2, /datum/data/record))
- var/t1 = sanitize(input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null) as text)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["b_dna"] = t1
- if("vir_name")
- var/datum/data/record/v = locate(href_list["edit_vir"])
- if (v)
- var/t1 = sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- v.fields["name"] = t1
- if("vir_desc")
- var/datum/data/record/v = locate(href_list["edit_vir"])
- if (v)
- var/t1 = sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- v.fields["description"] = t1
+ bdat += "Using Internal Synthesizer. "
+ if(!bdat)
+ dat += " None detected"
else
+ dat += " [bdat]"
- if (href_list["p_stat"])
- if (src.active1)
- switch(href_list["p_stat"])
- if("deceased")
- src.active1.fields["p_stat"] = "*Deceased*"
- if("ssd")
- src.active1.fields["p_stat"] = "*SSD*"
- if("active")
- src.active1.fields["p_stat"] = "Active"
- if("unfit")
- src.active1.fields["p_stat"] = "Physically Unfit"
- if("disabled")
- src.active1.fields["p_stat"] = "Disabled"
- if(PDA_Manifest.len)
- PDA_Manifest.Cut()
+ else
+ dat += text("{Log In}", src)
+ popup.width = 600
+ popup.height = 400
+ popup.set_content(dat)
+ popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
+ popup.open()
+ return
- if (href_list["m_stat"])
- if (src.active1)
- switch(href_list["m_stat"])
- if("insane")
- src.active1.fields["m_stat"] = "*Insane*"
- if("unstable")
- src.active1.fields["m_stat"] = "*Unstable*"
- if("watch")
- src.active1.fields["m_stat"] = "*Watch*"
- if("stable")
- src.active1.fields["m_stat"] = "Stable"
+/datum/file/program/med_data/Topic(href, href_list)
+ if(!interactable() || !computer.cardslot || ..(href,href_list))
+ return
+ if(!data_core.general.Find(src.active1))
+ src.active1 = null
+ if(!data_core.medical.Find(src.active2))
+ src.active2 = null
+ if(href_list["temp"])
+ src.temp = null
- if (href_list["b_type"])
- if (src.active2)
- switch(href_list["b_type"])
- if("an")
- src.active2.fields["b_type"] = "A-"
- if("bn")
- src.active2.fields["b_type"] = "B-"
- if("abn")
- src.active2.fields["b_type"] = "AB-"
- if("on")
- src.active2.fields["b_type"] = "O-"
- if("ap")
- src.active2.fields["b_type"] = "A+"
- if("bp")
- src.active2.fields["b_type"] = "B+"
- if("abp")
- src.active2.fields["b_type"] = "AB+"
- if("op")
- src.active2.fields["b_type"] = "O+"
+ if(href_list["cardr"])
+ if(scan)
+ if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
+ computer.cardslot.remove(usr, 1)
+ else
+ scan.loc = get_turf(src)
+ scan = null
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/weapon/card/id))
+ computer.cardslot.insert(I, usr)
+ scan = I
+ if(href_list["cardw"])
+ if(scan2)
+ if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
+ computer.cardslot.remove(usr, 2)
+ else
+ scan2.loc = get_turf(src)
+ scan2 = null
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/weapon/card/id))
+ computer.cardslot.insert(I, usr, 2)
+ scan2 = I
- if (href_list["del_r"])
- if (src.active2)
- src.temp = text("Are you sure you wish to delete the record (Medical Portion Only)? \n\tYes \n\tNo ", src, src)
+ else if(href_list["logout"])
+ src.authenticated = null
+ src.screen = null
+ src.active1 = null
+ src.active2 = null
- if (href_list["del_r2"])
- if (src.active2)
- //src.active2 = null
- qdel(src.active2)
+ else if(href_list["login"])
- if (href_list["d_rec"])
- var/datum/data/record/R = locate(href_list["d_rec"])
- var/datum/data/record/M = locate(href_list["d_rec"])
- if (!( data_core.general.Find(R) ))
- src.temp = "Record Not Found!"
- return
- for(var/datum/data/record/E in data_core.medical)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- M = E
- else
- //Foreach continue //goto(2540)
- src.active1 = R
- src.active2 = M
+ if(isAI(usr))
+ src.active1 = null
+ src.active2 = null
+ src.authenticated = usr.name
+ src.rank = "AI"
+ src.screen = 1
+
+ else if(isrobot(usr))
+ src.active1 = null
+ src.active2 = null
+ src.authenticated = usr.name
+ var/mob/living/silicon/robot/R = usr
+ src.rank = "[R.modtype] [R.braintype]"
+ src.screen = 1
+
+ else if(istype(src.scan, /obj/item/weapon/card/id))
+ src.active1 = null
+ src.active2 = null
+
+ if(src.check_access(src.scan))
+ src.authenticated = src.scan.registered_name
+ src.rank = src.scan.assignment
+ src.screen = 1
+
+ if(src.authenticated)
+
+ if(href_list["screen"])
+ src.screen = text2num(href_list["screen"])
+ if(src.screen < 1)
+ src.screen = 1
+
+ src.active1 = null
+ src.active2 = null
+
+ if(href_list["vir"])
+ var/datum/data/record/v = locate(href_list["vir"])
+ src.temp = "GNAv2 based virus lifeform V-[v.fields["id"]]"
+ src.temp += " Name: [v.fields["name"]]"
+ src.temp += " Antigen: [v.fields["antigen"]]"
+ src.temp += " Spread: [v.fields["spread type"]] "
+ src.temp += " Details: [v.fields["description"]]"
+
+ if(href_list["del_all"])
+ src.temp = text("Are you sure you wish to delete all records? \n\tYes \n\tNo ", src, src)
+
+ if(href_list["del_all2"])
+ for(var/datum/data/record/R in data_core.medical)
+ //R = null
+ qdel(R)
+ //Foreach goto(494)
+ src.temp = "All records deleted."
+
+ if(href_list["field"])
+ var/a1 = src.active1
+ var/a2 = src.active2
+ switch(href_list["field"])
+ if("fingerprint")
+ if(istype(src.active1, /datum/data/record))
+ var/t1 = sanitize(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text)
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active1 != a1)
+ return
+ src.active1.fields["fingerprint"] = t1
+ if("sex")
+ if(istype(src.active1, /datum/data/record))
+ if (src.active1.fields["sex"] == "Male")
+ src.active1.fields["sex"] = "Female"
+ else
+ src.active1.fields["sex"] = "Male"
+ if("age")
+ if(istype(src.active1, /datum/data/record))
+ var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active1 != a1)
+ return
+ src.active1.fields["age"] = t1
+ if("mi_dis")
+ if(istype(src.active2, /datum/data/record))
+ var/t1 = sanitize(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text)
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active2 != a2)
+ return
+ src.active2.fields["mi_dis"] = t1
+ if("mi_dis_d")
+ if(istype(src.active2, /datum/data/record))
+ var/t1 = sanitize(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message)
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active2 != a2)
+ return
+ src.active2.fields["mi_dis_d"] = t1
+ if("ma_dis")
+ if(istype(src.active2, /datum/data/record))
+ var/t1 = sanitize(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text)
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active2 != a2)
+ return
+ src.active2.fields["ma_dis"] = t1
+ if("ma_dis_d")
+ if(istype(src.active2, /datum/data/record))
+ var/t1 = sanitize(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message)
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active2 != a2)
+ return
+ src.active2.fields["ma_dis_d"] = t1
+ if("alg")
+ if(istype(src.active2, /datum/data/record))
+ var/t1 = sanitize(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text)
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active2 != a2)
+ return
+ src.active2.fields["alg"] = t1
+ if("alg_d")
+ if(istype(src.active2, /datum/data/record))
+ var/t1 = sanitize(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message)
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active2 != a2)
+ return
+ src.active2.fields["alg_d"] = t1
+ if("cdi")
+ if(istype(src.active2, /datum/data/record))
+ var/t1 = sanitize(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text)
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active2 != a2)
+ return
+ src.active2.fields["cdi"] = t1
+ if("cdi_d")
+ if(istype(src.active2, /datum/data/record))
+ var/t1 = sanitize(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message)
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active2 != a2)
+ return
+ src.active2.fields["cdi_d"] = t1
+ if("notes")
+ if(istype(src.active2, /datum/data/record))
+ var/t1 = sanitize(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message, extra = 0)
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active2 != a2)
+ return
+ src.active2.fields["notes"] = t1
+ if("p_stat")
+ if (istype(src.active1, /datum/data/record))
+ src.temp = text("Physical Condition: \n\t*Deceased* \n\t*SSD* \n\tActive \n\tPhysically Unfit \n\tDisabled ", src, src, src, src, src)
+ if("m_stat")
+ if (istype(src.active1, /datum/data/record))
+ src.temp = text("Mental Condition: \n\t*Insane* \n\t*Unstable* \n\t*Watch* \n\tStable ", src, src, src, src)
+ if("b_type")
+ if (istype(src.active2, /datum/data/record))
+ src.temp = text("Blood Type: \n\tA- A+ \n\tB- B+ \n\tAB- AB+ \n\tO- O+ ", src, src, src, src, src, src, src, src)
+ if("b_dna")
+ if(istype(src.active2, /datum/data/record))
+ var/t1 = sanitize(input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null) as text)
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active2 != a2)
+ return
+ src.active2.fields["b_dna"] = t1
+ if("vir_name")
+ var/datum/data/record/v = locate(href_list["edit_vir"])
+ if(v)
+ var/t1 = sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text)
+ if (!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active1 != a1)
+ return
+ v.fields["name"] = t1
+ if("vir_desc")
+ var/datum/data/record/v = locate(href_list["edit_vir"])
+ if(v)
+ var/t1 = sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message)
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active1 != a1)
+ return
+ v.fields["description"] = t1
+
+ if(href_list["p_stat"])
+ if(src.active1)
+ switch(href_list["p_stat"])
+ if("deceased")
+ src.active1.fields["p_stat"] = "*Deceased*"
+ if("ssd")
+ src.active1.fields["p_stat"] = "*SSD*"
+ if("active")
+ src.active1.fields["p_stat"] = "Active"
+ if("unfit")
+ src.active1.fields["p_stat"] = "Physically Unfit"
+ if("disabled")
+ src.active1.fields["p_stat"] = "Disabled"
+ if(PDA_Manifest.len)
+ PDA_Manifest.Cut()
+
+ if(href_list["m_stat"])
+ if(src.active1)
+ switch(href_list["m_stat"])
+ if("insane")
+ src.active1.fields["m_stat"] = "*Insane*"
+ if("unstable")
+ src.active1.fields["m_stat"] = "*Unstable*"
+ if("watch")
+ src.active1.fields["m_stat"] = "*Watch*"
+ if("stable")
+ src.active1.fields["m_stat"] = "Stable"
+
+ if(href_list["b_type"])
+ if(src.active2)
+ switch(href_list["b_type"])
+ if("an")
+ src.active2.fields["b_type"] = "A-"
+ if("bn")
+ src.active2.fields["b_type"] = "B-"
+ if("abn")
+ src.active2.fields["b_type"] = "AB-"
+ if("on")
+ src.active2.fields["b_type"] = "O-"
+ if("ap")
+ src.active2.fields["b_type"] = "A+"
+ if("bp")
+ src.active2.fields["b_type"] = "B+"
+ if("abp")
+ src.active2.fields["b_type"] = "AB+"
+ if("op")
+ src.active2.fields["b_type"] = "O+"
+
+ if(href_list["del_r"])
+ if(src.active2)
+ src.temp = text("Are you sure you wish to delete the record (Medical Portion Only)? \n\tYes \n\tNo ", src, src)
+
+ if(href_list["del_r2"])
+ if(src.active2)
+ //src.active2 = null
+ qdel(src.active2)
+
+ if(href_list["d_rec"])
+ var/datum/data/record/R = locate(href_list["d_rec"])
+ var/datum/data/record/M = locate(href_list["d_rec"])
+ if(!data_core.general.Find(R))
+ src.temp = "Record Not Found!"
+ return
+ for(var/datum/data/record/E in data_core.medical)
+ if(E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])
+ M = E
+ else
+ //Foreach continue //goto(2540)
+ src.active1 = R
+ src.active2 = M
+ src.screen = 4
+
+ if(href_list["new"])
+ if(istype(src.active1, /datum/data/record) && !istype(src.active2, /datum/data/record))
+ var/datum/data/record/R = new /datum/data/record( )
+ R.fields["name"] = src.active1.fields["name"]
+ R.fields["id"] = src.active1.fields["id"]
+ R.name = text("Medical Record #[]", R.fields["id"])
+ R.fields["b_type"] = "Unknown"
+ R.fields["b_dna"] = "Unknown"
+ R.fields["mi_dis"] = "None"
+ R.fields["mi_dis_d"] = "No minor disabilities have been declared."
+ R.fields["ma_dis"] = "None"
+ R.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
+ R.fields["alg"] = "None"
+ R.fields["alg_d"] = "No allergies have been detected in this patient."
+ R.fields["cdi"] = "None"
+ R.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
+ R.fields["notes"] = "No notes."
+ data_core.medical += R
+ src.active2 = R
src.screen = 4
- if (href_list["new"])
- if ((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) )))
- var/datum/data/record/R = new /datum/data/record( )
- R.fields["name"] = src.active1.fields["name"]
- R.fields["id"] = src.active1.fields["id"]
- R.name = text("Medical Record #[]", R.fields["id"])
- R.fields["b_type"] = "Unknown"
- R.fields["b_dna"] = "Unknown"
- R.fields["mi_dis"] = "None"
- R.fields["mi_dis_d"] = "No minor disabilities have been declared."
- R.fields["ma_dis"] = "None"
- R.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
- R.fields["alg"] = "None"
- R.fields["alg_d"] = "No allergies have been detected in this patient."
- R.fields["cdi"] = "None"
- R.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
- R.fields["notes"] = "No notes."
- data_core.medical += R
+ if(href_list["add_c"])
+ if(!istype(src.active2, /datum/data/record))
+ return
+ var/a2 = src.active2
+ var/t1 = sanitize(input("Add Comment:", "Med. records", null, null) as message)
+ if(!t1 || !src.authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || src.active2 != a2)
+ return
+ var/counter = 1
+ while(src.active2.fields[text("com_[]", counter)])
+ counter++
+ src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [stationtime2text()], [game_year] [t1]")
+
+ if(href_list["del_c"])
+ if(istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])
+ src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted"
+
+ if(href_list["search"])
+ var/t1 = input("Search String: (Name, DNA, or ID)", "Med. records", null, null) as text
+ if(!t1 || usr.stat || !src.authenticated || usr.restrained() || (!interactable() && !issilicon(usr)))
+ return
+ src.active1 = null
+ src.active2 = null
+ t1 = lowertext(t1)
+ for(var/datum/data/record/R in data_core.medical)
+ if(lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"]))
src.active2 = R
- src.screen = 4
+ if (!src.active2)
+ src.temp = text("Could not locate record [].", t1)
+ else
+ for(var/datum/data/record/E in data_core.general)
+ if(E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"])
+ src.active1 = E
+ src.screen = 4
- if (href_list["add_c"])
- if (!( istype(src.active2, /datum/data/record) ))
- return
- var/a2 = src.active2
- var/t1 = sanitize(input("Add Comment:", "Med. records", null, null) as message)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- var/counter = 1
- while(src.active2.fields[text("com_[]", counter)])
- counter++
- src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [stationtime2text()], [game_year] [t1]")
-
- if (href_list["del_c"])
- if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))
- src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted"
-
- if (href_list["search"])
- var/t1 = input("Search String: (Name, DNA, or ID)", "Med. records", null, null) as text
- if ((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!interactable()) && (!istype(usr, /mob/living/silicon)))))
- return
- src.active1 = null
- src.active2 = null
- t1 = lowertext(t1)
- for(var/datum/data/record/R in data_core.medical)
- if ((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"])))
- src.active2 = R
- else
- //Foreach continue //goto(3229)
- if (!( src.active2 ))
- src.temp = text("Could not locate record [].", t1)
+ if(href_list["print_p"])
+ if(!src.printing)
+ src.printing = 1
+ var/datum/data/record/record1 = null
+ var/datum/data/record/record2 = null
+ if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
+ record1 = active1
+ if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
+ record2 = active2
+ sleep(50)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc )
+ P.info = "Medical Record "
+ if(record1)
+ P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", record1.fields["name"], record1.fields["id"], record1.fields["sex"], record1.fields["age"], record1.fields["fingerprint"], record1.fields["p_stat"], record1.fields["m_stat"])
+ P.name = text("Medical Record ([])", record1.fields["name"])
else
- for(var/datum/data/record/E in data_core.general)
- if ((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
- src.active1 = E
- else
- //Foreach continue //goto(3334)
- src.screen = 4
-
- if (href_list["print_p"])
- if (!( src.printing ))
- src.printing = 1
- var/datum/data/record/record1 = null
- var/datum/data/record/record2 = null
- if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
- record1 = active1
- if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
- record2 = active2
- sleep(50)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc )
- P.info = "Medical Record "
- if (record1)
- P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", record1.fields["name"], record1.fields["id"], record1.fields["sex"], record1.fields["age"], record1.fields["fingerprint"], record1.fields["p_stat"], record1.fields["m_stat"])
- P.name = text("Medical Record ([])", record1.fields["name"])
- else
- P.info += "General Record Lost! "
- P.name = "Medical Record"
- if (record2)
- P.info += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", record2.fields["b_type"], record2.fields["b_dna"], record2.fields["mi_dis"], record2.fields["mi_dis_d"], record2.fields["ma_dis"], record2.fields["ma_dis_d"], record2.fields["alg"], record2.fields["alg_d"], record2.fields["cdi"], record2.fields["cdi_d"], decode(record2.fields["notes"]))
- var/counter = 1
- while(record2.fields[text("com_[]", counter)])
- P.info += text("[] ", record2.fields[text("com_[]", counter)])
- counter++
- else
- P.info += "Medical Record Lost! "
- P.info += ""
- src.printing = null
-
- interact()
- return
+ P.info += "General Record Lost! "
+ P.name = "Medical Record"
+ if(record2)
+ P.info += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", record2.fields["b_type"], record2.fields["b_dna"], record2.fields["mi_dis"], record2.fields["mi_dis_d"], record2.fields["ma_dis"], record2.fields["ma_dis_d"], record2.fields["alg"], record2.fields["alg_d"], record2.fields["cdi"], record2.fields["cdi_d"], decode(record2.fields["notes"]))
+ var/counter = 1
+ while(record2.fields[text("com_[]", counter)])
+ P.info += text("[] ", record2.fields[text("com_[]", counter)])
+ counter++
+ else
+ P.info += "Medical Record Lost! "
+ P.info += ""
+ src.printing = null
+ interact()
+ return
diff --git a/code/game/machinery/computer3/computers/power.dm b/code/game/machinery/computer3/computers/power.dm
index 6e27da0568..b6830a4cd3 100644
--- a/code/game/machinery/computer3/computers/power.dm
+++ b/code/game/machinery/computer3/computers/power.dm
@@ -8,41 +8,41 @@
desc = "It monitors APC status."
active_state = "power"
- proc/format(var/obj/machinery/power/apc/A)
- var/static/list/S = list(" Off","AOff"," On", " AOn")
- var/static/list/chg = list("N","C","F")
- return "[copytext(add_tspace("\The [A.area]", 30), 1, 30)] [S[A.equipment+1]] [S[A.lighting+1]] [S[A.environ+1]] \
- [add_lspace(A.lastused_total, 6)] [A.cell ? "[add_lspace(round(A.cell.percent()), 3)]% [chg[A.charging+1]]" : " N/C"] "
+/datum/file/program/powermon/proc/format(var/obj/machinery/power/apc/A)
+ var/static/list/S = list(" Off","AOff"," On", " AOn")
+ var/static/list/chg = list("N","C","F")
+ return "[copytext(add_tspace("\The [A.area]", 30), 1, 30)] [S[A.equipment+1]] [S[A.lighting+1]] [S[A.environ+1]] \
+ [add_lspace(A.lastused_total, 6)] [A.cell ? "[add_lspace(round(A.cell.percent()), 3)]% [chg[A.charging+1]]" : " N/C"] "
- interact()
- if(!interactable())
- return
- if(!computer.net)
- computer.Crash(MISSING_PERIPHERAL)
- return
- var/list/L = computer.net.get_machines(/obj/machinery/power/apc)
- var/t = ""
- t += "Refresh
"
- if(!L || !L.len)
- t += "No connection"
+/datum/file/program/powermon/interact()
+ if(!interactable())
+ return
+ if(!computer.net)
+ computer.Crash(MISSING_PERIPHERAL)
+ return
+ var/list/L = computer.net.get_machines(/obj/machinery/power/apc)
+ var/t = ""
+ t += "Refresh
"
+ if(!L || !L.len)
+ t += "No connection"
+ else
+ var/datum/powernet/powernet = computer.net.connect_to(/datum/powernet,null)
+ if(powernet)
+ t += "Total power: [powernet.avail] W Total load: [num2text(powernet.viewload,10)] W "
else
- var/datum/powernet/powernet = computer.net.connect_to(/datum/powernet,null)
- if(powernet)
- t += "Total power: [powernet.avail] W Total load: [num2text(powernet.viewload,10)] W "
- else
- t += "Power statistics unavailable "
- t += ""
+ t += "Power statistics unavailable "
+ t += ""
- if(L.len > 0)
- t += "Area Eqp./Lgt./Env. Load Cell "
- for(var/obj/machinery/power/apc/A in L)
- t += src.format(A)
- t += " "
+ if(L.len > 0)
+ t += "Area Eqp./Lgt./Env. Load Cell "
+ for(var/obj/machinery/power/apc/A in L)
+ t += src.format(A)
+ t += " "
- popup.set_content(t)
- popup.open()
+ popup.set_content(t)
+ popup.open()
- Topic(var/href, var/list/href_list)
- if(!interactable() || ..(href,href_list))
- return
- interact()
+/datum/file/program/powermon/Topic(var/href, var/list/href_list)
+ if(!interactable() || ..(href,href_list))
+ return
+ interact()
diff --git a/code/game/machinery/computer3/computers/prisoner.dm b/code/game/machinery/computer3/computers/prisoner.dm
index 27943bb353..b702c25ba2 100644
--- a/code/game/machinery/computer3/computers/prisoner.dm
+++ b/code/game/machinery/computer3/computers/prisoner.dm
@@ -17,88 +17,90 @@
var/screen = 0 // 0 - No Access Denied, 1 - Access allowed
- interact()
- if(!interactable())
- return
- var/dat
- dat += "Prisoner Implant Manager System "
- if(screen == 0)
- dat += " Unlock Console"
- else if(screen == 1)
- dat += " Chemical Implants "
- var/turf/Tr = null
- for(var/obj/item/weapon/implant/chem/C in world)
- Tr = get_turf(C)
- if((Tr) && (Tr.z != computer.z)) continue//Out of range
- if(!C.implanted) continue
- dat += "[C.imp_in.name] | Remaining Units: [C.reagents.total_volume] | Inject: "
- dat += "((1))"
- dat += "((5))"
- dat += "((10)) "
- dat += "******************************** "
- dat += " Tracking Implants "
- for(var/obj/item/weapon/implant/tracking/T in world)
- Tr = get_turf(T)
- if((Tr) && (Tr.z != computer.z)) continue//Out of range
- if(!T.implanted) continue
- var/loc_display = "Unknown"
- var/mob/living/carbon/M = T.imp_in
- if(M.z in using_map.station_levels && !istype(M.loc, /turf/space))
- var/turf/mob_loc = get_turf(M)
- loc_display = mob_loc.loc
- if(T.malfunction)
- loc_display = pick(teleportlocs)
- dat += "ID: [T.id] | Location: [loc_display] "
- dat += "(Send Message) | "
- dat += "******************************** "
- dat += " Lock Console"
-
- popup.width = 400
- popup.height = 500
- popup.set_content(dat)
- popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
- popup.open()
+/datum/file/program/prisoner/interact()
+ if(!interactable())
return
+ var/dat
+ dat += "Prisoner Implant Manager System "
+ if(screen == 0)
+ dat += " Unlock Console"
+ else if(screen == 1)
+ dat += " Chemical Implants "
+ var/turf/Tr = null
+ for(var/obj/item/weapon/implant/chem/C in all_chem_implants)
+ Tr = get_turf(C)
+ if((Tr) && (Tr.z != computer.z))
+ continue //Out of range
+ if(!C.implanted)
+ continue
+ dat += "[C.imp_in.name] | Remaining Units: [C.reagents.total_volume] | Inject: "
+ dat += "((1))"
+ dat += "((5))"
+ dat += "((10)) "
+ dat += "******************************** "
+ dat += " Tracking Implants "
+ for(var/obj/item/weapon/implant/tracking/T in all_tracking_implants)
+ Tr = get_turf(T)
+ if((Tr) && (Tr.z != computer.z))
+ continue //Out of range
+ if(!T.implanted)
+ continue
+ var/loc_display = "Unknown"
+ var/mob/living/carbon/M = T.imp_in
+ if(M.z in using_map.station_levels && !istype(M.loc, /turf/space))
+ var/turf/mob_loc = get_turf(M)
+ loc_display = mob_loc.loc
+ if(T.malfunction)
+ loc_display = pick(teleportlocs)
+ dat += "ID: [T.id] | Location: [loc_display] "
+ dat += "(Send Message) | "
+ dat += "******************************** "
+ dat += " Lock Console"
+ popup.width = 400
+ popup.height = 500
+ popup.set_content(dat)
+ popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
+ popup.open()
+ return
- process()
- if(!..())
- interact()
- return
-
-
- Topic(href, href_list)
- if(!interactable() || ..(href,href_list))
- return
-
- if(href_list["inject1"])
- var/obj/item/weapon/implant/I = locate(href_list["inject1"])
- if(istype(I))
- I.activate(1)
-
- else if(href_list["inject5"])
- var/obj/item/weapon/implant/I = locate(href_list["inject5"])
- if(istype(I))
- I.activate(5)
-
- else if(href_list["inject10"])
- var/obj/item/weapon/implant/I = locate(href_list["inject10"])
- if(istype(I))
- I.activate(10)
-
- else if(href_list["lock"])
- screen = !screen
-
- else if(href_list["warn"])
- var/warning = sanitize(input(usr,"Message:","Enter your message here!",""))
- if(!warning) return
- var/obj/item/weapon/implant/I = locate(href_list["warn"])
- if( istype(I) && I.imp_in)
- var/mob/living/carbon/R = I.imp_in
- log_game("PrisonComputer3 message: [key_name(usr)]->[key_name(R)] : [warning]")
- R << "You hear a voice in your head saying: '[warning]'"
-
+/datum/file/program/prisoner/process()
+ if(!..())
interact()
+ return
+
+/datum/file/program/prisoner/Topic(href, href_list)
+ if(!interactable() || ..(href,href_list))
return
+ if(href_list["inject1"])
+ var/obj/item/weapon/implant/I = locate(href_list["inject1"])
+ if(istype(I))
+ I.activate(1)
+
+ else if(href_list["inject5"])
+ var/obj/item/weapon/implant/I = locate(href_list["inject5"])
+ if(istype(I))
+ I.activate(5)
+
+ else if(href_list["inject10"])
+ var/obj/item/weapon/implant/I = locate(href_list["inject10"])
+ if(istype(I))
+ I.activate(10)
+
+ else if(href_list["lock"])
+ screen = !screen
+
+ else if(href_list["warn"])
+ var/warning = sanitize(input(usr,"Message:","Enter your message here!",""))
+ if(!warning) return
+ var/obj/item/weapon/implant/I = locate(href_list["warn"])
+ if(istype(I) && I.imp_in)
+ var/mob/living/carbon/R = I.imp_in
+ log_game("PrisonComputer3 message: [key_name(usr)]->[key_name(R)] : [warning]")
+ to_chat(R, "You hear a voice in your head saying: '[warning]'")
+
+ interact()
+ return
+
diff --git a/code/game/machinery/computer3/computers/robot.dm b/code/game/machinery/computer3/computers/robot.dm
index 0cf9c7ac5a..35c1090f67 100644
--- a/code/game/machinery/computer3/computers/robot.dm
+++ b/code/game/machinery/computer3/computers/robot.dm
@@ -15,197 +15,196 @@
var/screen = 0 // 0 - Main Menu, 1 - Cyborg Status, 2 - Kill 'em All! -- In text
req_access = list(access_robotics)
- proc/start_sequence()
- do
- if(src.stop)
- src.stop = 0
- return
- src.timeleft--
- sleep(10)
- while(src.timeleft)
+/datum/file/program/borg_control/proc/start_sequence()
+ do
+ if(src.stop)
+ src.stop = 0
+ return
+ src.timeleft--
+ sleep(10)
+ while(src.timeleft)
- for(var/mob/living/silicon/robot/R in mob_list)
- if(!R.scrambledcodes)
- R.self_destruct()
+ for(var/mob/living/silicon/robot/R in mob_list)
+ if(!R.scrambledcodes)
+ R.self_destruct()
+ return
+
+
+/datum/file/program/borg_control/interact()
+ if(!interactable() || computer.z > 6)
+ return
+ var/dat
+ if (src.temp)
+ dat = "[src.temp]
Clear Screen"
+ else
+ if(screen == 0)
+ //dat += "Cyborg Control Console "
+ dat += "1. Cyborg Status "
+ dat += "2. Emergency Full Destruct "
+ if(screen == 1)
+ for(var/mob/living/silicon/robot/R in mob_list)
+ if(istype(usr, /mob/living/silicon/ai))
+ if (R.connected_ai != usr)
+ continue
+ if(istype(usr, /mob/living/silicon/robot))
+ if (R != usr)
+ continue
+ if(R.scrambledcodes)
+ continue
+
+ dat += "[R.name] |"
+ if(R.stat)
+ dat += " Not Responding |"
+ else if (!R.canmove)
+ dat += " Locked Down |"
+ else
+ dat += " Operating Normally |"
+ if (!R.canmove)
+ else if(R.cell)
+ dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |"
+ else
+ dat += " No Cell Installed |"
+ if(R.module)
+ dat += " Module Installed ([R.module.name]) |"
+ else
+ dat += " No Module Installed |"
+ if(R.connected_ai)
+ dat += " Slaved to [R.connected_ai.name] |"
+ else
+ dat += " Independent from AI |"
+ if (istype(usr, /mob/living/silicon))
+ if(issilicon(usr) && is_special_character(usr) && !R.emagged)
+ dat += "(Hack) "
+ dat += "([R.canmove ? "Lockdown" : "Release"]) "
+ dat += "(Destroy)"
+ dat += " "
+ dat += "(Return to Main Menu) "
+ if(screen == 2)
+ if(!src.status)
+ dat += {" Emergency Robot Self-Destruct \nStatus: Off
+ \n
+ \nCountdown: [src.timeleft]/60 \[Reset\]
+ \n
+ \nStart Sequence
+ \n
+ \nClose"}
+ else
+ dat = {"Emergency Robot Self-Destruct \nStatus: Activated
+ \n
+ \nCountdown: [src.timeleft]/60 \[Reset\]
+ \n \nStop Sequence
+ \n
+ \nClose"}
+ dat += "(Return to Main Menu) "
+ popup.set_content(dat)
+ popup.open()
+ return
+
+/datum/file/program/borg_control/Topic(var/href, var/list/href_list)
+ if(!interactable() || ..(href,href_list))
return
+ if("killall" in href_list)
+ src.temp = {"Destroy Robots?
+ \[Swipe ID to initiate destruction sequence\]
+ Cancel"}
+
+ if("do_killall" in href_list)
+ var/obj/item/weapon/card/id/I = usr.get_active_hand()
+ if(istype(I, /obj/item/device/pda))
+ var/obj/item/device/pda/pda = I
+ I = pda.id
+ if(istype(I))
+ if(src.check_access(I))
+ if(!status)
+ message_admins("[key_name_admin(usr)] has initiated the global cyborg killswitch!")
+ log_game("[key_name(usr)] has initiated the global cyborg killswitch!")
+ src.status = 1
+ src.start_sequence()
+ src.temp = null
+
+ else
+ to_chat(usr, "Access Denied.")
+
+ if("stop" in href_list)
+ src.temp = {"
+ Stop Robot Destruction Sequence?
+ Yes
+ No"}
+
+ if("stop2" in href_list)
+ src.stop = 1
+ src.temp = null
+ src.status = 0
+
+ if("reset" in href_list)
+ src.timeleft = 60
+
+ if("temp" in href_list)
+ src.temp = null
+ if("screen" in href_list)
+ switch(href_list["screen"])
+ if("0")
+ screen = 0
+ if("1")
+ screen = 1
+ if("2")
+ screen = 2
+ if("killbot" in href_list)
+ if(computer.allowed(usr))
+ var/mob/living/silicon/robot/R = locate(href_list["killbot"])
+ if(R)
+ var/choice = input("Are you certain you wish to detonate [R.name]?") in list("Confirm", "Abort")
+ if(choice == "Confirm")
+ if(R && istype(R))
+ if(R.mind && R.mind.special_role && R.emagged)
+ to_chat(R, "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered.")
+ R.ResetSecurityCodes()
+
+ else
+ message_admins("[key_name_admin(usr)] detonated [key_name(R.name)]!")
+ log_game("[key_name_admin(usr)] detonated [key_name(R.name)]!")
+ if(R.connected_ai)
+ to_chat(R.connected_ai, "
ALERT - Cyborg kill-switch activated: [R.name] ")
+ R.self_destruct()
+ else
+ to_chat(usr, "Access Denied.")
+
+ if("stopbot" in href_list)
+ if(computer.allowed(usr))
+ var/mob/living/silicon/robot/R = locate(href_list["stopbot"])
+ if(R && istype(R)) // Extra sancheck because of input var references
+ var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort")
+ if(choice == "Confirm")
+ if(R && istype(R))
+ message_admins("[key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
+ log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [key_name(R.name)]!")
+ R.canmove = !R.canmove
+ if(R.lockcharge)
+ R.lockcharge = !R.lockcharge
+ to_chat(R, "Your lockdown has been lifted!")
+ else
+ R.lockcharge = !R.lockcharge
+ to_chat(R, "You have been locked down!")
+
+ else
+ to_chat(usr, "Access Denied.")
+
+ if ("magbot" in href_list)
+ if(computer.allowed(usr))
+ var/mob/living/silicon/robot/R = locate(href_list["magbot"])
+ if(R)
+ var/choice = input("Are you certain you wish to hack [R.name]?") in list("Confirm", "Abort")
+ if(choice == "Confirm")
+ if(R && istype(R))
+// message_admins("[key_name_admin(usr)] emagged [R.name] using robotic console!") // why is this commented out?
+ log_game("[key_name(usr)] emagged [R.name] using robotic console!")
+ R.emagged = 1
+ if(R.mind.special_role)
+ R.verbs += /mob/living/silicon/robot/proc/ResetSecurityCodes
interact()
- if(!interactable() || computer.z > 6)
- return
- var/dat
- if (src.temp)
- dat = "[src.temp]
Clear Screen"
- else
- if(screen == 0)
- //dat += "Cyborg Control Console "
- dat += "1. Cyborg Status "
- dat += "2. Emergency Full Destruct "
- if(screen == 1)
- for(var/mob/living/silicon/robot/R in mob_list)
- if(istype(usr, /mob/living/silicon/ai))
- if (R.connected_ai != usr)
- continue
- if(istype(usr, /mob/living/silicon/robot))
- if (R != usr)
- continue
- if(R.scrambledcodes)
- continue
-
- dat += "[R.name] |"
- if(R.stat)
- dat += " Not Responding |"
- else if (!R.canmove)
- dat += " Locked Down |"
- else
- dat += " Operating Normally |"
- if (!R.canmove)
- else if(R.cell)
- dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |"
- else
- dat += " No Cell Installed |"
- if(R.module)
- dat += " Module Installed ([R.module.name]) |"
- else
- dat += " No Module Installed |"
- if(R.connected_ai)
- dat += " Slaved to [R.connected_ai.name] |"
- else
- dat += " Independent from AI |"
- if (istype(usr, /mob/living/silicon))
- if(issilicon(usr) && is_special_character(usr) && !R.emagged)
- dat += "(Hack) "
- dat += "([R.canmove ? "Lockdown" : "Release"]) "
- dat += "(Destroy)"
- dat += " "
- dat += "(Return to Main Menu) "
- if(screen == 2)
- if(!src.status)
- dat += {" Emergency Robot Self-Destruct \nStatus: Off
- \n
- \nCountdown: [src.timeleft]/60 \[Reset\]
- \n
- \nStart Sequence
- \n
- \nClose"}
- else
- dat = {"Emergency Robot Self-Destruct \nStatus: Activated
- \n
- \nCountdown: [src.timeleft]/60 \[Reset\]
- \n \nStop Sequence
- \n
- \nClose"}
- dat += "(Return to Main Menu) "
-
- popup.set_content(dat)
- popup.open()
- return
-
- Topic(var/href, var/list/href_list)
- if(!interactable() || ..(href,href_list))
- return
-
- if ("killall" in href_list)
- src.temp = {"Destroy Robots?
- \[Swipe ID to initiate destruction sequence\]
- Cancel"}
-
- if ("do_killall" in href_list)
- var/obj/item/weapon/card/id/I = usr.get_active_hand()
- if (istype(I, /obj/item/device/pda))
- var/obj/item/device/pda/pda = I
- I = pda.id
- if (istype(I))
- if(src.check_access(I))
- if (!status)
- message_admins("[key_name_admin(usr)] has initiated the global cyborg killswitch!")
- log_game("[key_name(usr)] has initiated the global cyborg killswitch!")
- src.status = 1
- src.start_sequence()
- src.temp = null
-
- else
- usr << "Access Denied."
-
- if ("stop" in href_list)
- src.temp = {"
- Stop Robot Destruction Sequence?
- Yes
- No"}
-
- if ("stop2" in href_list)
- src.stop = 1
- src.temp = null
- src.status = 0
-
- if ("reset" in href_list)
- src.timeleft = 60
-
- if ("temp" in href_list)
- src.temp = null
- if ("screen" in href_list)
- switch(href_list["screen"])
- if("0")
- screen = 0
- if("1")
- screen = 1
- if("2")
- screen = 2
- if ("killbot" in href_list)
- if(computer.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["killbot"])
- if(R)
- var/choice = input("Are you certain you wish to detonate [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm")
- if(R && istype(R))
- if(R.mind && R.mind.special_role && R.emagged)
- R << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered."
- R.ResetSecurityCodes()
-
- else
- message_admins("[key_name_admin(usr)] detonated [key_name(R.name)]!")
- log_game("[key_name_admin(usr)] detonated [key_name(R.name)]!")
- if(R.connected_ai)
- R.connected_ai << "
ALERT - Cyborg kill-switch activated: [R.name] "
- R.self_destruct()
- else
- usr << "Access Denied."
-
- if ("stopbot" in href_list)
- if(computer.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["stopbot"])
- if(R && istype(R)) // Extra sancheck because of input var references
- var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm")
- if(R && istype(R))
- message_admins("[key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
- log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [key_name(R.name)]!")
- R.canmove = !R.canmove
- if (R.lockcharge)
- R.lockcharge = !R.lockcharge
- R << "Your lockdown has been lifted!"
- else
- R.lockcharge = !R.lockcharge
- R << "You have been locked down!"
-
- else
- usr << "Access Denied."
-
- if ("magbot" in href_list)
- if(computer.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["magbot"])
- if(R)
- var/choice = input("Are you certain you wish to hack [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm")
- if(R && istype(R))
-// message_admins("[key_name_admin(usr)] emagged [R.name] using robotic console!") // why is this commented out?
- log_game("[key_name(usr)] emagged [R.name] using robotic console!")
- R.emagged = 1
- if(R.mind.special_role)
- R.verbs += /mob/living/silicon/robot/proc/ResetSecurityCodes
-
- interact()
- return
+ return
diff --git a/code/game/machinery/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm
index 6b77a274bf..92b1469edd 100644
--- a/code/game/machinery/computer3/computers/security.dm
+++ b/code/game/machinery/computer3/computers/security.dm
@@ -1,20 +1,20 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
/obj/machinery/computer3/secure_data
- default_prog = /datum/file/program/secure_data
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio)
- icon_state = "frame-sec"
+ default_prog = /datum/file/program/secure_data
+ spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio)
+ icon_state = "frame-sec"
/obj/machinery/computer3/laptop/secure_data
- default_prog = /datum/file/program/secure_data
- spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio)
- icon_state = "laptop"
+ default_prog = /datum/file/program/secure_data
+ spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio)
+ icon_state = "laptop"
/datum/file/program/secure_data
- name = "Security Records"
- desc = "Used to view and edit personnel's security records"
+ name = "Security Records"
+ desc = "Used to view and edit personnel's security records"
active_state = "security"
- image = 'icons/ntos/records.png'
+ image = 'icons/ntos/records.png'
req_one_access = list(access_security, access_forensics_lockers)
@@ -33,105 +33,105 @@
var/tempname = null
//Sorting Variables
var/sortBy = "name"
- var/order = 1 // -1 = Descending - 1 = Ascending
+ var/order = 1 // -1 = Descending // 1 = Ascending
- proc/authenticate()
- if(access_security in scan.access || access_forensics_lockers in scan.access )
- return 1
- if(istype(usr,/mob/living/silicon/ai))
- return 1
- return 0
+/datum/file/program/secure_data/proc/authenticate()
+ if(access_security in scan.access || access_forensics_lockers in scan.access )
+ return 1
+ if(isAI(usr))
+ return 1
+ return 0
- interact()
- if(!computer.cardslot)
- computer.Crash(MISSING_PERIPHERAL)
- return
- usr.set_machine(src)
- scan = computer.cardslot.reader
+/datum/file/program/secure_data/interact()
+ if(!computer.cardslot)
+ computer.Crash(MISSING_PERIPHERAL)
+ return
+ usr.set_machine(src)
+ scan = computer.cardslot.reader
- if (computer.cardslot.dualslot)
- scan2 = computer.cardslot.writer
+ if(istype(computer.cardslot, /obj/item/part/computer/cardslot/dual))
+ var/obj/item/part/computer/cardslot/dual/D = computer.cardslot
+ scan2 = D.writer
- if(!interactable())
- return
+ if(!interactable())
+ return
- if (computer.z > 6)
- usr << "Unable to establish a connection: You're too far away from the station!"
- return
- var/dat
+ if(computer.z > 6)
+ to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
+ return
+ var/dat
- if (temp)
- dat = text("[]
Clear Screen", temp, src)
- else
- dat = text("Confirm Identity (R): [] ", src, (scan ? text("[]", scan.name) : "----------"))
- if (computer.cardslot.dualslot)
- dat += text("Check Identity (W): [] ", src, (scan2 ? text("[]", scan2.name) : "----------"))
- if(scan2 && !scan)
- dat += text("Insert card into reader slot to log in. ")
- if (authenticated)
- switch(screen)
- if(1.0)
- dat += {"
- "}
- dat += text("Search Records ", src)
- dat += text("New Record ", src)
- dat += {"
-
-
-
-
- | Name |
- ID |
- Rank |
- Fingerprints |
- Criminal Status |
- "}
- if(!isnull(data_core.general))
- for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
- var/crimstat = ""
- for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
- crimstat = E.fields["criminal"]
- var/background
- switch(crimstat)
- if("*Arrest*")
- background = "'background-color:#DC143C;'"
- if("Incarcerated")
- background = "'background-color:#CD853F;'"
- if("Parolled")
- background = "'background-color:#CD853F;'"
- if("Released")
- background = "'background-color:#3BB9FF;'"
- if("None")
- background = "'background-color:#00FF00;'"
- if("")
- background = "'background-color:#00FF7F;'"
- crimstat = "No Record."
- dat += text("| [] | ", background, src, R, R.fields["name"])
- dat += text("[] | ", R.fields["id"])
- dat += text("[] | ", R.fields["rank"])
- dat += text("[] | ", R.fields["fingerprint"])
- dat += text("[] | ", crimstat)
- dat += " "
- dat += text("Record Maintenance
", src)
- dat += text("{Log Out}",src)
- if(2.0)
- dat += "Records Maintenance "
- dat += " Delete All Records
Back"
- if(3.0)
- dat += "Security Record "
- if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- var/icon/front = active1.fields["photo_front"]
- var/icon/side = active1.fields["photo_side"]
- usr << browse_rsc(front, "front.png")
- usr << browse_rsc(side, "side.png")
- dat += text(" \
+ if(temp)
+ dat = text("[]
Clear Screen", temp, src)
+ else
+ dat = text("Confirm Identity (R): [] ", src, (scan ? text("[]", scan.name) : "----------"))
+ if(istype(computer.cardslot, /obj/item/part/computer/cardslot/dual))
+ dat += text("Confirm Identity (W): [] ", src, (scan2 ? text("[]", scan2.name) : "----------"))
+ if(scan2 && !scan)
+ dat += text("Insert card into reader slot to log in. ")
+ if(authenticated)
+ switch(screen)
+ if(1.0)
+ dat += ""
+ dat += text("Search Records ", src)
+ dat += text("New Record ", src)
+ dat += {"
+
+
+
+
+ | Name |
+ ID |
+ Rank |
+ Fingerprints |
+ Criminal Status |
+ "}
+ if(!isnull(data_core.general))
+ for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
+ var/crimstat = ""
+ for(var/datum/data/record/E in data_core.security)
+ if(E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])
+ crimstat = E.fields["criminal"]
+ var/background
+ switch(crimstat)
+ if("*Arrest*")
+ background = "'background-color:#DC143C;'"
+ if("Incarcerated")
+ background = "'background-color:#CD853F;'"
+ if("Parolled")
+ background = "'background-color:#CD853F;'"
+ if("Released")
+ background = "'background-color:#3BB9FF;'"
+ if("None")
+ background = "'background-color:#00FF00;'"
+ if("")
+ background = "'background-color:#00FF7F;'"
+ crimstat = "No Record."
+ dat += text("| [] | ", background, src, R, R.fields["name"])
+ dat += text("[] | ", R.fields["id"])
+ dat += text("[] | ", R.fields["rank"])
+ dat += text("[] | ", R.fields["fingerprint"])
+ dat += text("[] | ", crimstat)
+ dat += " "
+ dat += text("Record Maintenance
", src)
+ dat += text("{Log Out}",src)
+ if(2.0)
+ dat += "Records Maintenance "
+ dat += " Delete All Records
Back"
+ if(3.0)
+ dat += "Security Record "
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ var/icon/front = active1.fields["photo_front"]
+ var/icon/side = active1.fields["photo_side"]
+ usr << browse_rsc(front, "front.png")
+ usr << browse_rsc(side, "side.png")
+ dat += text("")
- else
- dat += "General Record Lost! "
- if ((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
- dat += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src, active2.fields["criminal"], src, active2.fields["mi_crim"], src, active2.fields["mi_crim_d"], src, active2.fields["ma_crim"], src, active2.fields["ma_crim_d"], src, decode(active2.fields["notes"]))
- var/counter = 1
- while(active2.fields[text("com_[]", counter)])
- dat += text("[] Delete Entry
", active2.fields[text("com_[]", counter)], src, counter)
- counter++
- dat += text("Add Entry
", src)
- dat += text("Delete Record (Security Only)
", src)
- else
- dat += "Security Record Lost! "
- dat += text("New Security Record
", src)
- dat += text("\nDelete Record (ALL)
\nPrint Record \nBack ", src, src, src)
- if(4.0)
- if(!Perp.len)
- dat += text("ERROR. String could not be located.
Back", src)
- else
- dat += {"
-
- "}
- dat += text("| Search Results for '[]': | ", tempname)
- dat += {"
-
-
-
-
- | Name |
- ID |
- Rank |
- Fingerprints |
- Criminal Status |
- "}
- for(var/i=1, i<=Perp.len, i += 2)
- var/crimstat = ""
- var/datum/data/record/R = Perp[i]
- if(istype(Perp[i+1],/datum/data/record/))
- var/datum/data/record/E = Perp[i+1]
- crimstat = E.fields["criminal"]
- var/background
- switch(crimstat)
- if("*Arrest*")
- background = "'background-color:#DC143C;'"
- if("Incarcerated")
- background = "'background-color:#CD853F;'"
- if("Parolled")
- background = "'background-color:#CD853F;'"
- if("Released")
- background = "'background-color:#3BB9FF;'"
- if("None")
- background = "'background-color:#00FF7F;'"
- if("")
- background = "'background-color:#FFFFFF;'"
- crimstat = "No Record."
- dat += text("| [] | ", background, src, R, R.fields["name"])
- dat += text("[] | ", R.fields["id"])
- dat += text("[] | ", R.fields["rank"])
- dat += text("[] | ", R.fields["fingerprint"])
- dat += text("[] | ", crimstat)
- dat += " "
- dat += text(" Return to index.", src)
else
- else
- dat += text("{Log In}", src)
- popup.width = 600
- popup.height = 400
- popup.set_content(dat)
- popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
- popup.open()
- return
+ dat += "General Record Lost! "
+ if(istype(active2, /datum/data/record) && data_core.security.Find(active2))
+ dat += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src, active2.fields["criminal"], src, active2.fields["mi_crim"], src, active2.fields["mi_crim_d"], src, active2.fields["ma_crim"], src, active2.fields["ma_crim_d"], src, decode(active2.fields["notes"]))
+ var/counter = 1
+ while(active2.fields[text("com_[]", counter)])
+ dat += text("[] Delete Entry
", active2.fields[text("com_[]", counter)], src, counter)
+ counter++
+ dat += text("Add Entry
", src)
+ dat += text("Delete Record (Security Only)
", src)
+ else
+ dat += "Security Record Lost! "
+ dat += text("New Security Record
", src)
+ dat += text("\nDelete Record (ALL)
\nPrint Record \nBack ", src, src, src)
+ if(4.0)
+ if(!Perp.len)
+ dat += text("ERROR. String could not be located.
Back", src)
+ else
+ dat += {"
+
+ "}
+ dat += text("| Search Results for '[]': | ", tempname)
+ dat += {"
+
+
+
+
+ | Name |
+ ID |
+ Rank |
+ Fingerprints |
+ Criminal Status |
+ "}
+ for(var/i=1, i<=Perp.len, i += 2)
+ var/crimstat = ""
+ var/datum/data/record/R = Perp[i]
+ if(istype(Perp[i+1],/datum/data/record/))
+ var/datum/data/record/E = Perp[i+1]
+ crimstat = E.fields["criminal"]
+ var/background
+ switch(crimstat)
+ if("*Arrest*")
+ background = "'background-color:#DC143C;'"
+ if("Incarcerated")
+ background = "'background-color:#CD853F;'"
+ if("Parolled")
+ background = "'background-color:#CD853F;'"
+ if("Released")
+ background = "'background-color:#3BB9FF;'"
+ if("None")
+ background = "'background-color:#00FF7F;'"
+ if("")
+ background = "'background-color:#FFFFFF;'"
+ crimstat = "No Record."
+ dat += text("| [] | ", background, src, R, R.fields["name"])
+ dat += text("[] | ", R.fields["id"])
+ dat += text("[] | ", R.fields["rank"])
+ dat += text("[] | ", R.fields["fingerprint"])
+ dat += text("[] | ", crimstat)
+ dat += " "
+ dat += text(" Return to index.", src)
+ else
+ else
+ dat += text("{Log In}", src)
+ popup.width = 600
+ popup.height = 400
+ popup.set_content(dat)
+ popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
+ popup.open()
+ return
/*Revised /N
I can't be bothered to look more of the actual code outside of switch but that probably needs revising too.
What a mess.*/
- Topic(href, href_list)
- if(!interactable() || !computer.cardslot || ..(href,href_list))
- return
- if (!( data_core.general.Find(active1) ))
+/datum/file/program/secure_data/Topic(href, href_list)
+ if(!interactable() || !computer.cardslot || ..(href,href_list))
+ return
+ if (!data_core.general.Find(active1))
+ active1 = null
+ if(!data_core.security.Find(active2))
+ active2 = null
+ switch(href_list["choice"])
+ // SORTING!
+ if("Sorting")
+ // Reverse the order if clicked twice
+ if(sortBy == href_list["sort"])
+ if(order == 1)
+ order = -1
+ else
+ order = 1
+ else
+ // New sorting order!
+ sortBy = href_list["sort"]
+ order = initial(order)
+ //BASIC FUNCTIONS
+ if("Clear Screen")
+ temp = null
+
+ if("Return")
+ screen = 1
active1 = null
- if (!( data_core.security.Find(active2) ))
active2 = null
- switch(href_list["choice"])
-// SORTING!
- if("Sorting")
- // Reverse the order if clicked twice
- if(sortBy == href_list["sort"])
- if(order == 1)
- order = -1
- else
- order = 1
- else
- // New sorting order!
- sortBy = href_list["sort"]
- order = initial(order)
-//BASIC FUNCTIONS
- if("Clear Screen")
- temp = null
- if ("Return")
- screen = 1
+ if("Confirm Identity R")
+ if(scan)
+ if(ishuman(usr) && !usr.get_active_hand())
+ computer.cardslot.remove(usr, 1)
+ else
+ scan.loc = get_turf(src)
+ scan = null
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/weapon/card/id))
+ usr << "Attempting to insert"
+ computer.cardslot.insert(I, usr) // No slot, will autofill
+ scan = I
+
+ if("Confirm Identity W")
+ if(scan2)
+ if(ishuman(usr) && !usr.get_active_hand())
+ computer.cardslot.remove(usr, 2)
+ else
+ scan2.loc = get_turf(src)
+ scan2 = null
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/weapon/card/id))
+ computer.cardslot.insert(I, usr, 2) // Specifically writer slot
+ scan2 = I
+
+ if("Log Out")
+ authenticated = null
+ screen = null
+ active1 = null
+ active2 = null
+
+ if("Log In")
+ if(isAI(usr))
+ src.active1 = null
+ src.active2 = null
+ src.authenticated = usr.name
+ src.rank = "AI"
+ src.screen = 1
+ else if(isrobot(usr))
+ src.active1 = null
+ src.active2 = null
+ src.authenticated = usr.name
+ var/mob/living/silicon/robot/R = usr
+ src.rank = "[R.modtype] [R.braintype]"
+ src.screen = 1
+ else if(istype(scan, /obj/item/weapon/card/id))
active1 = null
active2 = null
+ if(authenticate())
+ authenticated = scan.registered_name
+ rank = scan.assignment
+ screen = 1
+ //RECORD FUNCTIONS
+ if("Search Records")
+ var/t1 = input("Search String: (Partial Name or ID or Fingerprints or Rank)", "Secure. records", null, null) as text
+ if(!t1 || usr.stat || !authenticated || usr.restrained() || !interactable())
+ return
+ Perp = new/list()
+ t1 = lowertext(t1)
+ var/list/components = splittext(t1, " ")
+ if(components.len > 5)
+ return //Lets not let them search too greedily.
+ for(var/datum/data/record/R in data_core.general)
+ var/temptext = R.fields["name"] + " " + R.fields["id"] + " " + R.fields["fingerprint"] + " " + R.fields["rank"]
+ for(var/i = 1, i<=components.len, i++)
+ if(findtext(temptext,components[i]))
+ var/prelist = new/list(2)
+ prelist[1] = R
+ Perp += prelist
+ for(var/i = 1, i<=Perp.len, i+=2)
+ for(var/datum/data/record/E in data_core.security)
+ var/datum/data/record/R = Perp[i]
+ if(E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])
+ Perp[i+1] = E
+ tempname = t1
+ screen = 4
- if("Confirm Identity R")
- if (scan)
- if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
- computer.cardslot.remove(1)
- else
- scan.loc = get_turf(src)
- scan = null
- else
- var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I))
- computer.cardslot.insert(I, 1)
- scan = I
+ if("Record Maintenance")
+ screen = 2
+ active1 = null
+ active2 = null
- if("Confirm Identity W")
- if (scan2)
- if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
- computer.cardslot.remove(2)
- else
- scan2.loc = get_turf(src)
- scan2 = null
- else
- var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I))
- computer.cardslot.insert(I, 2)
- scan2 = I
+ if("Browse Record")
+ var/datum/data/record/R = locate(href_list["d_rec"])
+ var/S = locate(href_list["d_rec"])
+ if(!data_core.general.Find(R))
+ temp = "Record Not Found!"
+ else
+ for(var/datum/data/record/E in data_core.security)
+ if(E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])
+ S = E
+ active1 = R
+ active2 = S
+ screen = 3
- if("Log Out")
- authenticated = null
- screen = null
- active1 = null
- active2 = null
-
- if("Log In")
- if (istype(usr, /mob/living/silicon/ai))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- src.rank = "AI"
- src.screen = 1
- else if (istype(usr, /mob/living/silicon/robot))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- var/mob/living/silicon/robot/R = usr
- src.rank = "[R.modtype] [R.braintype]"
- src.screen = 1
- else if (istype(scan, /obj/item/weapon/card/id))
- active1 = null
- active2 = null
- if(authenticate())
- authenticated = scan.registered_name
- rank = scan.assignment
- screen = 1
-//RECORD FUNCTIONS
- if("Search Records")
- var/t1 = input("Search String: (Partial Name or ID or Fingerprints or Rank)", "Secure. records", null, null) as text
- if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || !interactable()))
- return
- Perp = new/list()
- t1 = lowertext(t1)
- var/list/components = splittext(t1, " ")
- if(components.len > 5)
- return //Lets not let them search too greedily.
- for(var/datum/data/record/R in data_core.general)
- var/temptext = R.fields["name"] + " " + R.fields["id"] + " " + R.fields["fingerprint"] + " " + R.fields["rank"]
- for(var/i = 1, i<=components.len, i++)
- if(findtext(temptext,components[i]))
- var/prelist = new/list(2)
- prelist[1] = R
- Perp += prelist
- for(var/i = 1, i<=Perp.len, i+=2)
- for(var/datum/data/record/E in data_core.security)
- var/datum/data/record/R = Perp[i]
- if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
- Perp[i+1] = E
- tempname = t1
- screen = 4
-
- if("Record Maintenance")
- screen = 2
- active1 = null
- active2 = null
-
- if ("Browse Record")
- var/datum/data/record/R = locate(href_list["d_rec"])
- var/S = locate(href_list["d_rec"])
- if (!( data_core.general.Find(R) ))
- temp = "Record Not Found!"
- else
- for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- S = E
+/* if ("Search Fingerprints")
+ var/t1 = input("Search String: (Fingerprint)", "Secure. records", null, null) as text
+ if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!interactable()) && (!istype(usr, /mob/living/silicon))))
+ return
+ active1 = null
+ active2 = null
+ t1 = lowertext(t1)
+ for(var/datum/data/record/R in data_core.general)
+ if (lowertext(R.fields["fingerprint"]) == t1)
active1 = R
- active2 = S
- screen = 3
+ if (!( active1 ))
+ temp = text("Could not locate record [].", t1)
+ else
+ for(var/datum/data/record/E in data_core.security)
+ if ((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"]))
+ active2 = E
+ screen = 3 */
-/* if ("Search Fingerprints")
- var/t1 = input("Search String: (Fingerprint)", "Secure. records", null, null) as text
- if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!interactable()) && (!istype(usr, /mob/living/silicon))))
- return
- active1 = null
- active2 = null
- t1 = lowertext(t1)
- for(var/datum/data/record/R in data_core.general)
- if (lowertext(R.fields["fingerprint"]) == t1)
- active1 = R
- if (!( active1 ))
- temp = text("Could not locate record [].", t1)
+ if("Print Record")
+ if(!printing)
+ printing = 1
+ var/datum/data/record/record1 = null
+ var/datum/data/record/record2 = null
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ record1 = active1
+ if(istype(active2, /datum/data/record) && data_core.security.Find(active2))
+ record2 = active2
+ sleep(50)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc )
+ P.info = "Security Record "
+ if(record1)
+ P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", record1.fields["name"], record1.fields["id"], record1.fields["sex"], record1.fields["age"], record1.fields["fingerprint"], record1.fields["p_stat"], record1.fields["m_stat"])
+ P.name = text("Security Record ([])", record1.fields["name"])
else
- for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"]))
- active2 = E
- screen = 3 */
+ P.info += "General Record Lost! "
+ P.name = "Security Record"
+ if(record2)
+ P.info += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", record2.fields["criminal"], record2.fields["mi_crim"], record2.fields["mi_crim_d"], record2.fields["ma_crim"], record2.fields["ma_crim_d"], decode(record2.fields["notes"]))
+ var/counter = 1
+ while(record2.fields[text("com_[]", counter)])
+ P.info += text("[] ", record2.fields[text("com_[]", counter)])
+ counter++
+ else
+ P.info += "Security Record Lost! "
+ P.info += ""
+ printing = null
+ computer.updateUsrDialog()
+ //RECORD DELETE
+ if("Delete All Records")
+ temp = ""
+ temp += "Are you sure you wish to delete all Security records? "
+ temp += "Yes "
+ temp += "No"
- if ("Print Record")
- if (!( printing ))
- printing = 1
- var/datum/data/record/record1 = null
- var/datum/data/record/record2 = null
- if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- record1 = active1
- if ((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
- record2 = active2
- sleep(50)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc )
- P.info = "Security Record "
- if (record1)
- P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", record1.fields["name"], record1.fields["id"], record1.fields["sex"], record1.fields["age"], record1.fields["fingerprint"], record1.fields["p_stat"], record1.fields["m_stat"])
- P.name = text("Security Record ([])", record1.fields["name"])
- else
- P.info += "General Record Lost! "
- P.name = "Security Record"
- if (record2)
- P.info += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", record2.fields["criminal"], record2.fields["mi_crim"], record2.fields["mi_crim_d"], record2.fields["ma_crim"], record2.fields["ma_crim_d"], decode(record2.fields["notes"]))
- var/counter = 1
- while(record2.fields[text("com_[]", counter)])
- P.info += text("[] ", record2.fields[text("com_[]", counter)])
- counter++
- else
- P.info += "Security Record Lost! "
- P.info += ""
- printing = null
- computer.updateUsrDialog()
-//RECORD DELETE
- if ("Delete All Records")
- temp = ""
- temp += "Are you sure you wish to delete all Security records? "
- temp += "Yes "
+ if("Purge All Records")
+ for(var/datum/data/record/R in data_core.security)
+ qdel(R)
+ temp = "All Security records deleted."
+
+ if("Add Entry")
+ if(!istype(active2, /datum/data/record))
+ return
+ var/a2 = active2
+ var/t1 = sanitize(input("Add Comment:", "Secure. records", null, null) as message)
+ if(!t1 || !authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || active2 != a2)
+ return
+ var/counter = 1
+ while(active2.fields[text("com_[]", counter)])
+ counter++
+ active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [stationtime2text()], [game_year] [t1]")
+
+ if("Delete Record (ALL)")
+ if(active1)
+ temp = "Are you sure you wish to delete the record (ALL)?"
+ temp += "Yes "
temp += "No"
- if ("Purge All Records")
- for(var/datum/data/record/R in data_core.security)
- qdel(R)
- temp = "All Security records deleted."
+ if("Delete Record (Security)")
+ if(active2)
+ temp = "Are you sure you wish to delete the record (Security Portion Only)?"
+ temp += "Yes "
+ temp += "No"
- if ("Add Entry")
- if (!( istype(active2, /datum/data/record) ))
- return
- var/a2 = active2
- var/t1 = sanitize(input("Add Comment:", "Secure. records", null, null) as message)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- var/counter = 1
- while(active2.fields[text("com_[]", counter)])
- counter++
- active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [stationtime2text()], [game_year] [t1]")
+ if("Delete Entry")
+ if(istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])])
+ active2.fields[text("com_[]", href_list["del_c"])] = "Deleted"
+ //RECORD CREATE
+ if("New Record (Security)")
+ if(istype(active1, /datum/data/record) && !istype(active2, /datum/data/record))
+ active2 = data_core.CreateSecurityRecord(active1.fields["name"], active1.fields["id"])
+ screen = 3
- if ("Delete Record (ALL)")
- if (active1)
- temp = "Are you sure you wish to delete the record (ALL)?"
- temp += "Yes "
- temp += "No"
+ if("New Record (General)")
+ active1 = data_core.CreateGeneralRecord()
+ active2 = null
- if ("Delete Record (Security)")
- if (active2)
- temp = "Are you sure you wish to delete the record (Security Portion Only)?"
- temp += "Yes "
- temp += "No"
-
- if ("Delete Entry")
- if ((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])]))
- active2.fields[text("com_[]", href_list["del_c"])] = "Deleted"
-//RECORD CREATE
- if ("New Record (Security)")
- if ((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) )))
- active2 = data_core.CreateSecurityRecord(active1.fields["name"], active1.fields["id"])
- screen = 3
-
- if ("New Record (General)")
- active1 = data_core.CreateGeneralRecord()
- active2 = null
-
-//FIELD FUNCTIONS
- if ("Edit Field")
- var/a1 = active1
- var/a2 = active2
- switch(href_list["field"])
- if("name")
- if (istype(active1, /datum/data/record))
- var/t1 = sanitizeName(input("Please input name:", "Secure. records", active1.fields["name"], null) as text)
- if ((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
- return
- active1.fields["name"] = t1
- if("id")
- if (istype(active2, /datum/data/record))
- var/t1 = sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["id"] = t1
- if("fingerprint")
- if (istype(active1, /datum/data/record))
- var/t1 = sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["fingerprint"] = t1
- if("sex")
- if (istype(active1, /datum/data/record))
- if (active1.fields["sex"] == "Male")
- active1.fields["sex"] = "Female"
- else
- active1.fields["sex"] = "Male"
- if("age")
- if (istype(active1, /datum/data/record))
- var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["age"] = t1
- if("mi_crim")
- if (istype(active2, /datum/data/record))
- var/t1 = sanitize(input("Please input minor disabilities list:", "Secure. records", active2.fields["mi_crim"], null) as text)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["mi_crim"] = t1
- if("mi_crim_d")
- if (istype(active2, /datum/data/record))
- var/t1 = sanitize(input("Please summarize minor dis.:", "Secure. records", active2.fields["mi_crim_d"], null) as message)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["mi_crim_d"] = t1
- if("ma_crim")
- if (istype(active2, /datum/data/record))
- var/t1 = sanitize(input("Please input major diabilities list:", "Secure. records", active2.fields["ma_crim"], null) as text)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["ma_crim"] = t1
- if("ma_crim_d")
- if (istype(active2, /datum/data/record))
- var/t1 = sanitize(input("Please summarize major dis.:", "Secure. records", active2.fields["ma_crim_d"], null) as message)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["ma_crim_d"] = t1
- if("notes")
- if (istype(active2, /datum/data/record))
- var/t1 = sanitize(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message, extra = 0)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["notes"] = t1
- if("criminal")
- if (istype(active2, /datum/data/record))
- temp = "Criminal Status:"
- temp += ""
- if("rank")
- var/list/L = list( "Head of Personnel", "Colony Director", "AI" )
- //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
- if ((istype(active1, /datum/data/record) && L.Find(rank)))
- temp = "Rank:"
- temp += ""
- for(var/rank in joblist)
- temp += "- [rank]
"
- temp += " "
+ //FIELD FUNCTIONS
+ if("Edit Field")
+ var/a1 = active1
+ var/a2 = active2
+ switch(href_list["field"])
+ if("name")
+ if(istype(active1, /datum/data/record))
+ var/t1 = sanitizeName(input("Please input name:", "Secure. records", active1.fields["name"], null) as text)
+ if(!t1 || !length(trim(t1)) || !authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || active1 != a1)
+ return
+ active1.fields["name"] = t1
+ if("id")
+ if(istype(active2, /datum/data/record))
+ var/t1 = sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)
+ if(!t1 || !authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || active1 != a1)
+ return
+ active1.fields["id"] = t1
+ if("fingerprint")
+ if(istype(active1, /datum/data/record))
+ var/t1 = sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)
+ if(!t1 || !authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || active1 != a1)
+ return
+ active1.fields["fingerprint"] = t1
+ if("sex")
+ if(istype(active1, /datum/data/record))
+ if(active1.fields["sex"] == "Male")
+ active1.fields["sex"] = "Female"
else
- alert(usr, "You do not have the required rank to do this!")
- if("species")
- if (istype(active1, /datum/data/record))
- var/t1 = sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["species"] = t1
-
-//TEMPORARY MENU FUNCTIONS
- else//To properly clear as per clear screen.
- temp=null
- switch(href_list["choice"])
- if ("Change Rank")
- if (active1)
- active1.fields["rank"] = href_list["rank"]
- if(href_list["rank"] in joblist)
- active1.fields["real_rank"] = href_list["real_rank"]
-
- if ("Change Criminal Status")
- if (active2)
- for(var/mob/living/carbon/human/H in player_list)
- BITSET(H.hud_updateflag, WANTED_HUD)
- switch(href_list["criminal2"])
- if("none")
- active2.fields["criminal"] = "None"
- if("arrest")
- active2.fields["criminal"] = "*Arrest*"
- if("incarcerated")
- active2.fields["criminal"] = "Incarcerated"
- if("parolled")
- active2.fields["criminal"] = "Parolled"
- if("released")
- active2.fields["criminal"] = "Released"
-
- if ("Delete Record (Security) Execute")
- if (active2)
- qdel(active2)
-
- if ("Delete Record (ALL) Execute")
- if (active1)
- for(var/datum/data/record/R in data_core.medical)
- if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
- qdel(R)
- else
- qdel(active1)
- if (active2)
- qdel(active2)
+ active1.fields["sex"] = "Male"
+ if("age")
+ if(istype(active1, /datum/data/record))
+ var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
+ if(!t1 || !authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || active1 != a1)
+ return
+ active1.fields["age"] = t1
+ if("mi_crim")
+ if(istype(active2, /datum/data/record))
+ var/t1 = sanitize(input("Please input minor disabilities list:", "Secure. records", active2.fields["mi_crim"], null) as text)
+ if(!t1 || !authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || active2 != a2)
+ return
+ active2.fields["mi_crim"] = t1
+ if("mi_crim_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = sanitize(input("Please summarize minor dis.:", "Secure. records", active2.fields["mi_crim_d"], null) as message)
+ if (!t1 || !authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || active2 != a2)
+ return
+ active2.fields["mi_crim_d"] = t1
+ if("ma_crim")
+ if(istype(active2, /datum/data/record))
+ var/t1 = sanitize(input("Please input major diabilities list:", "Secure. records", active2.fields["ma_crim"], null) as text)
+ if(!t1 || !authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || active2 != a2)
+ return
+ active2.fields["ma_crim"] = t1
+ if("ma_crim_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = sanitize(input("Please summarize major dis.:", "Secure. records", active2.fields["ma_crim_d"], null) as message)
+ if(!t1 || !authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || active2 != a2)
+ return
+ active2.fields["ma_crim_d"] = t1
+ if("notes")
+ if(istype(active2, /datum/data/record))
+ var/t1 = sanitize(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message, extra = 0)
+ if(!t1 || !authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || active2 != a2)
+ return
+ active2.fields["notes"] = t1
+ if("criminal")
+ if (istype(active2, /datum/data/record))
+ temp = "Criminal Status:"
+ temp += ""
+ if("rank")
+ var/list/L = list( "Head of Personnel", "Colony Director", "AI" )
+ //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
+ if ((istype(active1, /datum/data/record) && L.Find(rank)))
+ temp = "Rank:"
+ temp += ""
+ for(var/rank in joblist)
+ temp += "- [rank]
"
+ temp += " "
else
- temp = "This function does not appear to be working at the moment. Our apologies."
+ alert(usr, "You do not have the required rank to do this!")
+ if("species")
+ if (istype(active1, /datum/data/record))
+ var/t1 = sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)
+ if(!t1 || !authenticated || usr.stat || usr.restrained() || (!interactable() && !issilicon(usr)) || active1 != a1)
+ return
+ active1.fields["species"] = t1
- //computer.updateUsrDialog()
- interact()
- return
+ //TEMPORARY MENU FUNCTIONS
+ else//To properly clear as per clear screen.
+ temp=null
+ switch(href_list["choice"])
+ if("Change Rank")
+ if(active1)
+ active1.fields["rank"] = href_list["rank"]
+ if(href_list["rank"] in joblist)
+ active1.fields["real_rank"] = href_list["real_rank"]
+
+ if("Change Criminal Status")
+ if(active2)
+ for(var/mob/living/carbon/human/H in player_list)
+ BITSET(H.hud_updateflag, WANTED_HUD)
+ switch(href_list["criminal2"])
+ if("none")
+ active2.fields["criminal"] = "None"
+ if("arrest")
+ active2.fields["criminal"] = "*Arrest*"
+ if("incarcerated")
+ active2.fields["criminal"] = "Incarcerated"
+ if("parolled")
+ active2.fields["criminal"] = "Parolled"
+ if("released")
+ active2.fields["criminal"] = "Released"
+
+ if("Delete Record (Security) Execute")
+ if(active2)
+ qdel(active2)
+
+ if("Delete Record (ALL) Execute")
+ if(active1)
+ for(var/datum/data/record/R in data_core.medical)
+ if(R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"])
+ qdel(R)
+ else
+ qdel(active1)
+ if(active2)
+ qdel(active2)
+ else
+ temp = "This function does not appear to be working at the moment. Our apologies."
+
+ //computer.updateUsrDialog()
+ interact()
+ return
/obj/machinery/computer3/secure_data/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
diff --git a/code/game/machinery/computer3/computers/welcome.dm b/code/game/machinery/computer3/computers/welcome.dm
index 062fc7b59b..801a6cd93c 100644
--- a/code/game/machinery/computer3/computers/welcome.dm
+++ b/code/game/machinery/computer3/computers/welcome.dm
@@ -9,26 +9,26 @@
image = 'icons/ntos/program.png'
- interact()
- usr.set_machine(src)
- if(!interactable())
- return
- var/dat = ""
- dat += "Welcome to NTOS"
- dat += "Thank you for choosing NTOS, your gateway to the future of mobile computing technology, sponsored by [using_map.company_name] (R) "
- dat += "Getting started with NTOS: "
- dat += "To leave a current program, click the X button in the top right corner of the window. This will return you to the NTOS desktop. \
- From the desktop, you can open the hard drive, usually located in the top left corner to access all the programs installed on your computer. \
- When you rented your laptop, you were supplied with programs that your [using_map.company_name] Issued ID has given you access to use. \
- In the event of a serious error, the right click menu will give you the ability to reset your computer. To open and close your laptop, alt-click your device.\
- If you have any questions or technical issues, please contact your local computer technical experts at your local [using_map.boss_name]."
- popup.set_content(dat)
- popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
- popup.open()
+/datum/file/program/welcome/interact()
+ usr.set_machine(src)
+ if(!interactable())
return
+ var/dat = ""
+ dat += "Welcome to NTOS"
+ dat += "Thank you for choosing NTOS, your gateway to the future of mobile computing technology, sponsored by [using_map.company_name] (R) "
+ dat += "Getting started with NTOS: "
+ dat += "To leave a current program, click the X button in the top right corner of the window. This will return you to the NTOS desktop. \
+ From the desktop, you can open the hard drive, usually located in the top left corner to access all the programs installed on your computer. \
+ When you rented your laptop, you were supplied with programs that your [using_map.company_name] Issued ID has given you access to use. \
+ In the event of a serious error, the right click menu will give you the ability to reset your computer. To open and close your laptop, alt-click your device.\
+ If you have any questions or technical issues, please contact your local computer technical experts at your local [using_map.boss_name]."
+ popup.set_content(dat)
+ popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
+ popup.open()
+ return
- Topic(href, href_list)
- if(!interactable() || ..(href,href_list))
- return
- interact()
- return
\ No newline at end of file
+/datum/file/program/welcome/Topic(href, href_list)
+ if(!interactable() || ..(href,href_list))
+ return
+ interact()
+ return
\ No newline at end of file
diff --git a/code/game/machinery/computer3/file.dm b/code/game/machinery/computer3/file.dm
index c425bcc0aa..528aff8c87 100644
--- a/code/game/machinery/computer3/file.dm
+++ b/code/game/machinery/computer3/file.dm
@@ -17,49 +17,49 @@
var/drm = 0 // Copy protection, called by copy() and move()
var/readonly = 0 // Edit protection, called by edit(), which is just a failcheck proc
- proc/execute(var/datum/file/source)
- return
+/datum/file/proc/execute(var/datum/file/source)
+ return
- //
- // Copy file to device.
- // If you overwrite this function, use the return value to make sure it succeeded
- //
- proc/copy(var/obj/item/part/computer/storage/dest)
- if(!computer) return null
- if(drm)
- if(!computer.emagged)
- return null
- var/datum/file/F = new type()
- if(!dest.addfile(F))
- return null // todo: arf here even though the player can't do a damn thing due to concurrency
- return F
-
- //
- // Move file to device
- // Returns null on failure even though the existing file doesn't go away
- //
- proc/move(var/obj/item/part/computer/storage/dest)
- if(!computer) return null
- if(drm)
- if(!computer.emagged)
- return null
- var/obj/item/part/computer/storage/current = device
- if(!dest.addfile(src))
+//
+// Copy file to device.
+// If you overwrite this function, use the return value to make sure it succeeded
+//
+/datum/file/proc/copy(var/obj/item/part/computer/storage/dest)
+ if(!computer) return null
+ if(drm)
+ if(!computer.emagged)
return null
- current.removefile(src)
- return src
+ var/datum/file/F = new type()
+ if(!dest.addfile(F))
+ return null // todo: arf here even though the player can't do a damn thing due to concurrency
+ return F
- //
- // Determines if the file is editable. This does not use the DRM flag,
- // but instead the readonly flag.
- //
+//
+// Move file to device
+// Returns null on failure even though the existing file doesn't go away
+//
+/datum/file/proc/move(var/obj/item/part/computer/storage/dest)
+ if(!computer) return null
+ if(drm)
+ if(!computer.emagged)
+ return null
+ var/obj/item/part/computer/storage/current = device
+ if(!dest.addfile(src))
+ return null
+ current.removefile(src)
+ return src
- proc/edit()
- if(!computer)
- return 0
- if(readonly && !computer.emagged)
- return 0 //
- return 1
+//
+// Determines if the file is editable. This does not use the DRM flag,
+// but instead the readonly flag.
+//
+
+/datum/file/proc/edit()
+ if(!computer)
+ return 0
+ if(readonly && !computer.emagged)
+ return 0
+ return 1
/*
CentCom root authorization certificate
@@ -84,23 +84,23 @@
var/file_increment = 1
var/binary = 0 // determines if the file can't be opened by editor
- // Set the content to a specific amount, increase filesize appropriately.
- proc/set_content(var/text)
- content = text
+/datum/file/data/New()
+ if(content)
if(file_increment > 1)
- volume = round(file_increment * length(text))
+ volume = round(file_increment * length(content))
+ ..()
- copy(var/obj/O)
- var/datum/file/data/D = ..(O)
- if(D)
- D.content = content
- D.readonly = readonly
+// Set the content to a specific amount, increase filesize appropriately.
+/datum/file/data/proc/set_content(var/text)
+ content = text
+ if(file_increment > 1)
+ volume = round(file_increment * length(text))
- New()
- if(content)
- if(file_increment > 1)
- volume = round(file_increment * length(content))
- ..()
+/datum/file/data/copy(var/obj/O)
+ var/datum/file/data/D = ..(O)
+ if(D)
+ D.content = content
+ D.readonly = readonly
/*
A generic file that contains text
diff --git a/code/game/machinery/computer3/laptop.dm b/code/game/machinery/computer3/laptop.dm
index 1b0e413165..9a8ba02b00 100644
--- a/code/game/machinery/computer3/laptop.dm
+++ b/code/game/machinery/computer3/laptop.dm
@@ -28,42 +28,44 @@
var/obj/machinery/computer3/laptop/stored_computer = null
- verb/open_computer()
- set name = "Open Laptop"
- set category = "Object"
- set src in view(1)
+/obj/item/device/laptop/get_cell()
+ return stored_computer.battery
- if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living))
- usr << "You can't do that."
- return
+/obj/item/device/laptop/verb/open_computer()
+ set name = "Open Laptop"
+ set category = "Object"
+ set src in view(1)
- if(!Adjacent(usr))
- usr << "You can't reach it."
- return
+ if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living))
+ to_chat(usr, "You can't do that.")
+ return
- if(!istype(loc,/turf))
- usr << "[src] is too bulky! You'll have to set it down."
- return
+ if(!Adjacent(usr))
+ to_chat(usr, "You can't reach it.")
+ return
- if(!stored_computer)
- if(contents.len)
- for(var/obj/O in contents)
- O.loc = loc
- usr << "\The [src] crumbles to pieces."
- spawn(5)
- qdel(src)
- return
+ if(!istype(loc,/turf))
+ to_chat(usr, "[src] is too bulky! You'll have to set it down.")
+ return
- stored_computer.loc = loc
- stored_computer.stat &= ~MAINT
- stored_computer.update_icon()
- loc = stored_computer
- usr << "You open \the [src]."
+ if(!stored_computer)
+ if(contents.len)
+ for(var/obj/O in contents)
+ O.loc = loc
+ to_chat(usr, "\The [src] crumbles to pieces.")
+ spawn(5)
+ qdel(src)
+ return
+ stored_computer.loc = loc
+ stored_computer.stat &= ~MAINT
+ stored_computer.update_icon()
+ loc = stored_computer
+ to_chat(usr, "You open \the [src].")
- AltClick()
- if(Adjacent(usr))
- open_computer()
+/obj/item/device/laptop/AltClick()
+ if(Adjacent(usr))
+ open_computer()
//Quickfix until Snapshot works out how he wants to redo power. ~Z
/obj/item/device/laptop/verb/eject_id()
@@ -73,6 +75,7 @@
if(stored_computer)
stored_computer.eject_id()
+
/obj/machinery/computer3/laptop/verb/eject_id()
set category = "Object"
set name = "Eject ID Card"
@@ -80,21 +83,11 @@
var/obj/item/part/computer/cardslot/C = locate() in src.contents
if(!C)
- usr << "There is no card port on the laptop."
+ to_chat(usr, "There is no card port on the laptop.")
return
- var/obj/item/weapon/card/id/card
- if(C.reader)
- card = C.reader
- else if(C.writer)
- card = C.writer
- else
- usr << "There is nothing to remove from the laptop card port."
- return
-
- usr << "You remove [card] from the laptop."
- C.remove(4)
-
+ C.remove(usr)
+ return
/obj/machinery/computer3/laptop
name = "Laptop Computer"
@@ -110,81 +103,81 @@
var/obj/item/device/laptop/portable = null
- New(var/L, var/built = 0)
- if(!built && !battery)
- battery = new /obj/item/weapon/cell(src)
- battery.maxcharge = 500
- battery.charge = 500
- ..(L,built)
+/obj/machinery/computer3/laptop/New(var/L, var/built = 0)
+ if(!built && !battery)
+ battery = new /obj/item/weapon/cell(src)
+ battery.maxcharge = 500
+ battery.charge = 500
+ ..(L,built)
- verb/close_computer()
- set name = "Close Laptop"
- set category = "Object"
- set src in view(1)
+/obj/machinery/computer3/laptop/verb/close_computer()
+ set name = "Close Laptop"
+ set category = "Object"
+ set src in view(1)
- if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living))
- usr << "You can't do that."
- return
+ if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living))
+ to_chat(usr, "You can't do that.")
+ return
- if(!Adjacent(usr))
- usr << "You can't reach it."
- return
+ if(!Adjacent(usr))
+ to_chat(usr, "You can't reach it.")
+ return
- close_laptop(usr)
+ close_laptop(usr)
- proc/close_laptop(mob/user = null)
- if(istype(loc,/obj/item/device/laptop))
- testing("Close closed computer")
- return
- if(!istype(loc,/turf))
- testing("Odd computer location: [loc] - close laptop")
- return
+/obj/machinery/computer3/laptop/proc/close_laptop(mob/user = null)
+ if(istype(loc,/obj/item/device/laptop))
+ testing("Close closed computer")
+ return
+ if(!istype(loc,/turf))
+ testing("Odd computer location: [loc] - close laptop")
+ return
- if(stat&BROKEN)
- if(user)
- user << "\The [src] is broken! You can't quite get it closed."
- return
-
- if(!portable)
- portable=new
- portable.stored_computer = src
-
- portable.loc = loc
- loc = portable
- stat |= MAINT
+ if(stat&BROKEN)
if(user)
- user << "You close \the [src]."
+ to_chat(user, "\The [src] is broken! You can't quite get it closed.")
+ return
- auto_use_power()
- if(stat&MAINT)
- return
- if(use_power && istype(battery) && battery.charge > 0)
- if(use_power == 1)
- battery.use(idle_power_usage*CELLRATE) //idle and active_power_usage are in WATTS. battery.use() expects CHARGE.
- else
- battery.use(active_power_usage*CELLRATE)
- return 1
- return 0
+ if(!portable)
+ portable=new
+ portable.stored_computer = src
- use_power(var/amount, var/chan = -1)
- if(battery && battery.charge > 0)
- battery.use(amount*CELLRATE)
+ portable.loc = loc
+ loc = portable
+ stat |= MAINT
+ if(user)
+ to_chat(user, "You close \the [src].")
- power_change()
- if( !battery || battery.charge <= 0 )
- stat |= NOPOWER
+/obj/machinery/computer3/laptop/auto_use_power()
+ if(stat&MAINT)
+ return
+ if(use_power && istype(battery) && battery.charge > 0)
+ if(use_power == 1)
+ battery.use(idle_power_usage*CELLRATE) //idle and active_power_usage are in WATTS. battery.use() expects CHARGE.
else
- stat &= ~NOPOWER
+ battery.use(active_power_usage*CELLRATE)
+ return 1
+ return 0
- Destroy()
- if(istype(loc,/obj/item/device/laptop))
- var/obj/O = loc
- spawn(5)
- if(O)
- qdel(O)
- ..()
+/obj/machinery/computer3/laptop/use_power(var/amount, var/chan = -1)
+ if(battery && battery.charge > 0)
+ battery.use(amount*CELLRATE)
+
+/obj/machinery/computer3/laptop/power_change()
+ if( !battery || battery.charge <= 0 )
+ stat |= NOPOWER
+ else
+ stat &= ~NOPOWER
+
+/obj/machinery/computer3/laptop/Destroy()
+ if(istype(loc,/obj/item/device/laptop))
+ var/obj/O = loc
+ spawn(5)
+ if(O)
+ qdel(O)
+ ..()
- AltClick()
- if(Adjacent(usr))
- close_computer()
+/obj/machinery/computer3/laptop/AltClick()
+ if(Adjacent(usr))
+ close_computer()
diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm
index cbfa8686bc..147dbdaa44 100644
--- a/code/game/machinery/computer3/lapvend.dm
+++ b/code/game/machinery/computer3/lapvend.dm
@@ -47,7 +47,7 @@
usr.drop_item()
L.loc = src
vendmode = 2
- usr << "You slot your [L.name] into \The [src.name]"
+ to_chat(user, "You slot your [L.name] into \The [src.name]")
nanomanager.update_uis(src)
else
..()
@@ -169,7 +169,7 @@
visible_message("\The [usr] swipes \the [I] through \the [src].")
var/datum/money_account/CH = get_account(C.associated_account_number)
if(!CH)
- usr << "\icon[src]No valid account number is associated with this card."
+ to_chat(usr, "\icon[src]No valid account number is associated with this card.")
return
if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
if(vendor_account)
@@ -178,9 +178,9 @@
if(D)
transfer_and_vend(D, C)
else
- usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call [using_map.boss_short] Support."
+ to_chat(usr, "\icon[src]Unable to access vendor account. Please record the machine ID and call [using_map.boss_short] Support.")
else
- usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call [using_map.boss_short] Support."
+ to_chat(usr, "\icon[src]Unable to access vendor account. Please record the machine ID and call [using_map.boss_short] Support.")
else
transfer_and_vend(CH, C)
@@ -228,7 +228,7 @@
network = 0
power = 0
else
- usr << "\icon[src]You don't have that much money!"
+ to_chat(usr, "\icon[src]You don't have that much money!")
/obj/machinery/lapvend/proc/total()
var/total = 0
@@ -317,7 +317,7 @@
visible_message("\The [usr] swipes \the [I] through \the [src].")
var/datum/money_account/CH = get_account(C.associated_account_number)
if(!CH)
- usr << "\icon[src]No valid account number is associated with this card."
+ to_chat(usr, "\icon[src]No valid account number is associated with this card.")
return 0
if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
if(vendor_account)
@@ -327,10 +327,10 @@
transfer_and_reimburse(D)
return 1
else
- usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call [using_map.boss_short] Support."
+ to_chat(usr, "\icon[src]Unable to access vendor account. Please record the machine ID and call [using_map.boss_short] Support.")
return 0
else
- usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call [using_map.boss_short] Support."
+ to_chat(usr, "\icon[src]Unable to access vendor account. Please record the machine ID and call [using_map.boss_short] Support.")
return 0
else
transfer_and_reimburse(CH)
diff --git a/code/game/machinery/computer3/networking.dm b/code/game/machinery/computer3/networking.dm
index f88d8a4837..7b7922a635 100644
--- a/code/game/machinery/computer3/networking.dm
+++ b/code/game/machinery/computer3/networking.dm
@@ -1,58 +1,60 @@
/obj/item/part/computer/networking
name = "Computer networking component"
- /*
- This is the public-facing proc used by NETUP.
- It does additional checking before and after calling get_machines()
+/obj/item/part/computer/networking/allow_attackby(var/obj/item/I, var/mob/user)
+ return 0
- */
- proc/connect_to(var/typekey,var/atom/previous)
- if(!computer || computer.stat)
+/*
+ This is the public-facing proc used by NETUP.
+ It does additional checking before and after calling get_machines()
+*/
+/obj/item/part/computer/networking/proc/connect_to(var/typekey,var/atom/previous)
+ if(!computer || computer.stat)
+ return null
+
+ if(istype(previous,typekey) && verify_machine(previous))
+ return previous
+
+ var/result = get_machines(typekey)
+
+ if(!result)
+ return null
+
+ if(islist(result))
+ var/list/R = result
+ if(R.len == 0)
return null
+ else if(R.len == 1)
+ return R[1]
+ else
+ var/list/atomlist = computer.format_atomlist(R)
+ result = input("Select:","Multiple destination machines located",atomlist[1]) as null|anything in atomlist
+ return atomlist[result]
- if(istype(previous,typekey) && verify_machine(previous))
- return previous
+ if(isobj(result))
+ return result
- var/result = get_machines(typekey)
+ return null // ?
- if(!result)
- return null
+/*
+ This one is used to determine the candidate machines.
+ It may return an object, a list of objects, or null.
- if(islist(result))
- var/list/R = result
- if(R.len == 0)
- return null
- else if(R.len == 1)
- return R[1]
- else
- var/list/atomlist = computer.format_atomlist(R)
- result = input("Select:","Multiple destination machines located",atomlist[1]) as null|anything in atomlist
- return atomlist[result]
+ Overwite this on any networking component.
+*/
+/obj/item/part/computer/networking/proc/get_machines(var/typekey)
+ return list()
- if(isobj(result))
- return result
+/*
+ This is used to verify that an existing machine is within the network.
+ Calling NETUP() with an object argument will run this check, and if
+ the object is still accessible, it will be used. Otherwise, another
+ search will be run.
- return null // ?
-
- /*
- This one is used to determine the candidate machines.
- It may return an object, a list of objects, or null.
-
- Overwite this on any networking component.
- */
- proc/get_machines(var/typekey)
- return list()
-
- /*
- This is used to verify that an existing machine is within the network.
- Calling NETUP() with an object argument will run this check, and if
- the object is still accessible, it will be used. Otherwise, another
- search will be run.
-
- Overwrite this on any networking component.
- */
- proc/verify_machine(var/obj/previous)
- return 0
+ Overwrite this on any networking component.
+*/
+/obj/item/part/computer/networking/proc/verify_machine(var/obj/previous)
+ return 0
/*
Provides radio/signaler functionality, and also
@@ -69,56 +71,58 @@
var/range = null
var/subspace = 0
- init()
- ..()
- spawn(5)
- radio_connection = radio_controller.add_object(src, src.frequency, src.rad_filter)
+/obj/item/part/computer/networking/radio/init()
+ ..()
+ spawn(5)
+ radio_connection = radio_controller.add_object(src, src.frequency, src.rad_filter)
- proc/set_frequency(new_frequency)
- if(radio_controller)
- radio_controller.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, rad_filter)
- else
- frequency = new_frequency
- spawn(rand(5,10))
- set_frequency(new_frequency)
+/obj/item/part/computer/networking/radio/proc/set_frequency(new_frequency)
+ if(radio_controller)
+ radio_controller.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, rad_filter)
+ else
+ frequency = new_frequency
+ spawn(rand(5,10))
+ set_frequency(new_frequency)
- receive_signal(var/datum/signal/signal)
- if(!signal || !computer || (computer.stat&~MAINT)) // closed laptops use maint, allow it
- return
- if(computer.program)
- computer.program.receive_signal(signal)
+/obj/item/part/computer/networking/radio/receive_signal(var/datum/signal/signal)
+ if(!signal || !computer || (computer.stat&~MAINT)) // closed laptops use maint, allow it
+ return
+ if(computer.program)
+ computer.program.receive_signal(signal)
- proc/post_signal(var/datum/signal/signal)
- if(!computer || (computer.stat&~MAINT) || !computer.program) return
- if(!radio_connection) return
+/obj/item/part/computer/networking/radio/proc/post_signal(var/datum/signal/signal)
+ if(!computer || (computer.stat&~MAINT) || !computer.program)
+ return
+ if(!radio_connection)
+ return
+ radio_connection.post_signal(src,signal,rad_filter,range)
- radio_connection.post_signal(src,signal,rad_filter,range)
+/obj/item/part/computer/networking/radio/get_machines(var/typekey)
+ if(!radio_connection || !radio_connection.frequency)
+ return list()
+ var/list/result = list()
+ var/turf/T = get_turf(loc)
+ var/z_level = T.z
+ for(var/obj/O in radio_connection.devices)
+ if(istype(O,typekey))
+ T = get_turf(O)
+ if(istype(O) && (subspace || (O.z == z_level))) // radio does not work across z-levels
+ result |= O
+ return result
- get_machines(var/typekey)
- if(!radio_connection || !radio_connection.frequency)
- return list()
- var/list/result = list()
+/obj/item/part/computer/networking/radio/verify_machine(var/obj/previous)
+ if(!previous)
+ return 0
+ if(subspace)
+ return ( radio_connection && (previous in radio_connection.devices) )
+ else
var/turf/T = get_turf(loc)
- var/z_level = T.z
- for(var/obj/O in radio_connection.devices)
- if(istype(O,typekey))
- T = get_turf(O)
- if(istype(O) && (subspace || (O.z == z_level))) // radio does not work across z-levels
- result |= O
- return result
-
- verify_machine(var/obj/previous)
- if(!previous) return 0
- if(subspace)
- return ( radio_connection && (previous in radio_connection.devices) )
- else
- var/turf/T = get_turf(loc)
- var/turf/O = get_turf(previous)
- if(!T || !O)
- return 0
- return ( radio_connection && (previous in radio_connection.devices) && (T.z == O.z))
+ var/turf/O = get_turf(previous)
+ if(!T || !O)
+ return 0
+ return ( radio_connection && (previous in radio_connection.devices) && (T.z == O.z))
/*
Subspace networking: Communicates off-station. Allows centcom communications.
@@ -136,23 +140,24 @@
name = "short-wave networking terminal"
desc = "Connects to nearby computers through the area power network"
- get_machines(var/typekey)
- var/area/A = get_area(loc)
- if(!istype(A) || A == /area)
- return list()
- if(typekey == null)
- typekey = /obj/machinery
- var/list/machines = list()
- for(var/obj/O in A.contents)
- if(istype(O,typekey))
- machines |= O
- return machines
- verify_machine(var/obj/previous)
- if(!previous) return 0
- var/area/A = get_area(src)
- if( A && A == get_area(previous) )
- return 1
- return 0
+/obj/item/part/computer/networking/area/get_machines(var/typekey)
+ var/area/A = get_area(loc)
+ if(!istype(A) || A == /area)
+ return list()
+ if(typekey == null)
+ typekey = /obj/machinery
+ var/list/machines = list()
+ for(var/obj/O in A.contents)
+ if(istype(O,typekey))
+ machines |= O
+ return machines
+
+/obj/item/part/computer/networking/area/verify_machine(var/obj/previous)
+ if(!previous) return 0
+ var/area/A = get_area(src)
+ if( A && A == get_area(previous) )
+ return 1
+ return 0
/*
Proximity networking: Connects to machines or computers adjacent to this device
@@ -161,78 +166,78 @@
name = "proximity networking terminal"
desc = "Connects a computer to adjacent machines"
- get_machines(var/typekey)
- var/turf/T = get_turf(loc)
- if(!istype(T))
- return list()
- if(typekey == null)
- typekey = /obj/machinery
- var/list/machines = list()
- for(var/obj/O in T)
+/obj/item/part/computer/networking/prox/get_machines(var/typekey)
+ var/turf/T = get_turf(loc)
+ if(!istype(T))
+ return list()
+ if(typekey == null)
+ typekey = /obj/machinery
+ var/list/nearby_machines = list()
+ for(var/obj/O in T)
+ if(istype(O,typekey))
+ nearby_machines += O
+ for(var/d in cardinal)
+ var/turf/T2 = get_step(T,d)
+ for(var/obj/O in T2)
if(istype(O,typekey))
- machines += O
- for(var/d in cardinal)
- var/turf/T2 = get_step(T,d)
- for(var/obj/O in T2)
- if(istype(O,typekey))
- machines += O
- return machines
+ nearby_machines += O
+ return nearby_machines
- verify_machine(var/obj/previous)
- if(!previous)
- return 0
- if(get_dist(get_turf(previous),get_turf(loc)) == 1)
- return 1
+/obj/item/part/computer/networking/prox/verify_machine(var/obj/previous)
+ if(!previous)
return 0
+ if(get_dist(get_turf(previous),get_turf(loc)) == 1)
+ return 1
+ return 0
+
/*
Cable networking: Not currently used
*/
-
/obj/item/part/computer/networking/cable
name = "cable networking terminal"
desc = "Connects to other machines on the same cable network."
- get_machines(var/typekey)
-// if(istype(computer,/obj/machinery/computer/laptop)) // laptops move, this could get breaky
-// return list()
- var/turf/T = get_turf(loc)
- var/datum/powernet/P = null
- for(var/obj/structure/cable/C in T)
- if(C.d1 == 0)
- P = C.powernet
- break
- if(!P)
- return list()
- if(!typekey)
- typekey = /obj/machinery
- else if(typekey == /datum/powernet)
- return list(P)
- var/list/candidates = list()
- for(var/atom/A in P.nodes)
- if(istype(A,typekey))
- candidates += A
- else if(istype(A,/obj/machinery/power/terminal))
- var/obj/machinery/power/terminal/PT = A
- if(istype(PT.master,typekey))
- candidates += PT.master
- return candidates
+/obj/item/part/computer/networking/cable/get_machines(var/typekey)
+// if(istype(computer,/obj/machinery/computer/laptop)) // laptops move, this could get breaky
+// return list()
+ var/turf/T = get_turf(loc)
+ var/datum/powernet/P = null
+ for(var/obj/structure/cable/C in T)
+ if(C.d1 == 0)
+ P = C.powernet
+ break
+ if(!P)
+ return list()
+ if(!typekey)
+ typekey = /obj/machinery
+ else if(typekey == /datum/powernet)
+ return list(P)
+ var/list/candidates = list()
+ for(var/atom/A in P.nodes)
+ if(istype(A,typekey))
+ candidates += A
+ else if(istype(A,/obj/machinery/power/terminal))
+ var/obj/machinery/power/terminal/PT = A
+ if(istype(PT.master,typekey))
+ candidates += PT.master
+ return candidates
- verify_machine(var/obj/previous)
- if(!previous)
- return 0
- var/turf/T = get_turf(loc)
- var/datum/powernet/P = null
- for(var/obj/structure/cable/C in T)
- if(C.d1 == 0)
- P = C.powernet
- break
- if(istype(previous,/datum/powernet))
- if(previous == P)
- return 1
- return 0
- T = get_turf(previous.loc)
- for(var/obj/structure/cable/C in T)
- if(C.d1 == 0 && (C.powernet == P))
- return 1
+/obj/item/part/computer/networking/cable/verify_machine(var/obj/previous)
+ if(!previous)
return 0
+ var/turf/T = get_turf(loc)
+ var/datum/powernet/P = null
+ for(var/obj/structure/cable/C in T)
+ if(C.d1 == 0)
+ P = C.powernet
+ break
+ if(istype(previous,/datum/powernet))
+ if(previous == P)
+ return 1
+ return 0
+ T = get_turf(previous.loc)
+ for(var/obj/structure/cable/C in T)
+ if(C.d1 == 0 && (C.powernet == P))
+ return 1
+ return 0
diff --git a/code/game/machinery/computer3/program.dm b/code/game/machinery/computer3/program.dm
index 0667fe2f73..b39998bdfd 100644
--- a/code/game/machinery/computer3/program.dm
+++ b/code/game/machinery/computer3/program.dm
@@ -228,10 +228,10 @@ Programs are a file that can be executed
//
if("eject_card" in href_list)
if(computer.cardslot)
- if(computer.cardslot.dualslot && href_list["eject_card"] == "writer")
- computer.cardslot.remove(computer.cardslot.writer)
+ if(istype(computer.cardslot, /obj/item/part/computer/cardslot/dual) && href_list["eject_card"] == "writer")
+ computer.cardslot.remove(usr)
else
- computer.cardslot.remove(computer.cardslot.reader)
+ computer.cardslot.remove(usr)
return 1
//
// usage: runfile=\ref[file]
diff --git a/code/game/machinery/computer3/server.dm b/code/game/machinery/computer3/server.dm
index 9e32918fea..5c820ce0ca 100644
--- a/code/game/machinery/computer3/server.dm
+++ b/code/game/machinery/computer3/server.dm
@@ -24,9 +24,9 @@
spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio/subspace)
- update_icon()
+/obj/machinery/computer3/server/rack/update_icon()
//overlays.Cut()
return
- attack_hand() // Racks have no screen, only AI can use them
+/obj/machinery/computer3/server/rack/attack_hand() // Racks have no screen, only AI can use them
return
diff --git a/code/game/machinery/computer3/storage.dm b/code/game/machinery/computer3/storage.dm
index cbef3434ba..671d28c3a6 100644
--- a/code/game/machinery/computer3/storage.dm
+++ b/code/game/machinery/computer3/storage.dm
@@ -21,56 +21,55 @@
var/list/spawnfiles = list()// For mappers, special drives, and data disks
- New()
- ..()
- if(islist(spawnfiles))
- if(removeable && spawnfiles.len)
- var/obj/item/part/computer/storage/removable/R = src
- R.inserted = new(src)
- if(writeprotect)
- R.inserted.writeprotect = 1
- for(var/typekey in spawnfiles)
- addfile(new typekey(),1)
+/obj/item/part/computer/storage/New()
+ ..()
+ if(islist(spawnfiles))
+ if(removeable && spawnfiles.len)
+ var/obj/item/part/computer/storage/removable/R = src
+ R.inserted = new(src)
+ if(writeprotect)
+ R.inserted.writeprotect = 1
+ for(var/typekey in spawnfiles)
+ addfile(new typekey(),1)
- // Add a file to the hard drive, returns 0 if failed
- // forced is used when spawning files on a write-protect drive
- proc/addfile(var/datum/file/F,var/forced = 0)
- if(!F || (F in files))
- return 1
- if(writeprotect && !forced)
+// Add a file to the hard drive, returns 0 if failed
+// forced is used when spawning files on a write-protect drive
+/obj/item/part/computer/storage/proc/addfile(var/datum/file/F,var/forced = 0)
+ if(!F || (F in files))
+ return 1
+ if(writeprotect && !forced)
+ return 0
+ if(volume + F.volume > max_volume)
+ if(!forced)
return 0
- if(volume + F.volume > max_volume)
- if(!forced)
- return 0
- max_volume = volume + F.volume
+ max_volume = volume + F.volume
- files.Add(F)
- volume += F.volume
+ files.Add(F)
+ volume += F.volume
+ F.computer = computer
+ F.device = src
+ return 1
+/obj/item/part/computer/storage/proc/removefile(var/datum/file/F,var/forced = 0)
+ if(!F || !(F in files))
+ return 1
+ if(writeprotect && !forced)
+ return 0
+
+ files -= F
+ volume -= F.volume
+ if(F.device == src)
+ F.device = null
+ F.computer = null
+ return 1
+
+/obj/item/part/computer/storage/init(var/obj/machinery/computer/target)
+ computer = target
+ for(var/datum/file/F in files)
F.computer = computer
- F.device = src
- return 1
- proc/removefile(var/datum/file/F,var/forced = 0)
- if(!F || !(F in files))
- return 1
- if(writeprotect && !forced)
- return 0
-
- files -= F
- volume -= F.volume
- if(F.device == src)
- F.device = null
- F.computer = null
- return 1
-
- init(var/obj/machinery/computer/target)
- computer = target
- for(var/datum/file/F in files)
- F.computer = computer
/*
Standard hard drives for computers. Used in computer construction
*/
-
/obj/item/part/computer/storage/hdd
name = "Hard Drive"
max_volume = 25000
@@ -99,66 +98,64 @@
attackby_types = list(/obj/item/weapon/disk/file, /obj/item/weapon/pen)
var/obj/item/weapon/disk/file/inserted = null
- proc/eject_disk(var/forced = 0)
- if(!forced)
+/obj/item/part/computer/storage/removable/proc/eject_disk(var/forced = 0)
+ if(!forced)
+ return
+ files = list()
+ inserted.loc = computer.loc
+ if(usr)
+ if(!usr.get_active_hand())
+ usr.put_in_active_hand(inserted)
+ else if(forced && !usr.get_inactive_hand())
+ usr.put_in_inactive_hand(inserted)
+ for(var/datum/file/F in inserted.files)
+ F.computer = null
+ inserted = null
+
+
+/obj/item/part/computer/storage/removable/attackby(obj/O as obj, mob/user as mob)
+ if(inserted && istype(O,/obj/item/weapon/pen))
+ to_chat(usr, "You use [O] to carefully pry [inserted] out of [src].")
+ eject_disk(forced = 1)
+ return
+
+ if(istype(O,/obj/item/weapon/disk/file))
+ if(inserted)
+ to_chat(usr, "There's already a disk in [src]!")
return
- files = list()
- inserted.loc = computer.loc
- if(usr)
- if(!usr.get_active_hand())
- usr.put_in_active_hand(inserted)
- else if(forced && !usr.get_inactive_hand())
- usr.put_in_inactive_hand(inserted)
+
+ to_chat(usr, "You insert [O] into [src].")
+ usr.drop_item()
+ O.loc = src
+ inserted = O
+ writeprotect = inserted.writeprotect
+
+ files = inserted.files
for(var/datum/file/F in inserted.files)
- F.computer = null
- inserted = null
+ F.computer = computer
+ return
+ ..()
- attackby(obj/O as obj, mob/user as mob)
- if(inserted && istype(O,/obj/item/weapon/pen))
- usr << "You use [O] to carefully pry [inserted] out of [src]."
- eject_disk(forced = 1)
- return
+/obj/item/part/computer/storage/removable/addfile(var/datum/file/F)
+ if(!F || !inserted)
+ return 0
- if(istype(O,/obj/item/weapon/disk/file))
- if(inserted)
- usr << "There's already a disk in [src]!"
- return
-
- usr << "You insert [O] into [src]."
- usr.drop_item()
- O.loc = src
- inserted = O
- writeprotect = inserted.writeprotect
-
- files = inserted.files
- for(var/datum/file/F in inserted.files)
- F.computer = computer
-
- return
-
- ..()
-
- addfile(var/datum/file/F)
- if(!F || !inserted)
- return 0
-
- if(F in inserted.files)
- return 1
-
- if(inserted.volume + F.volume > inserted.max_volume)
- return 0
-
- inserted.files.Add(F)
- F.computer = computer
- F.device = inserted
+ if(F in inserted.files)
return 1
+ if(inserted.volume + F.volume > inserted.max_volume)
+ return 0
+
+ inserted.files.Add(F)
+ F.computer = computer
+ F.device = inserted
+ return 1
+
/*
Removable hard drive presents...
removeable disk!
*/
-
/obj/item/weapon/disk/file
//parent_type = /obj/item/part/computer/storage // todon't: do this
name = "Data Disk"
@@ -170,15 +167,15 @@
var/max_volume = 1028
- New()
- ..()
- icon_state = "datadisk[rand(0,6)]"
- src.pixel_x = rand(-5, 5)
- src.pixel_y = rand(-5, 5)
- files = list()
- if(istype(spawn_files))
- for(var/typekey in spawn_files)
- var/datum/file/F = new typekey()
- F.device = src
- files += F
- volume += F.volume
+/obj/item/weapon/disk/file/New()
+ ..()
+ icon_state = "datadisk[rand(0,6)]"
+ src.pixel_x = rand(-5, 5)
+ src.pixel_y = rand(-5, 5)
+ files = list()
+ if(istype(spawn_files))
+ for(var/typekey in spawn_files)
+ var/datum/file/F = new typekey()
+ F.device = src
+ files += F
+ volume += F.volume
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index c3b6e010d6..e74ffb7cf9 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -31,19 +31,19 @@
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = P
if (C.get_amount() < 5)
- user << "You need five lengths of cable to add them to the frame."
+ to_chat(user, "You need five lengths of cable to add them to the frame.")
return
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- user << "You start to add cables to the frame."
+ to_chat(user, "You start to add cables to the frame.")
if(do_after(user, 20) && state == 1)
if(C.use(5))
- user << "You add cables to the frame."
+ to_chat(user, "You add cables to the frame.")
state = 2
icon_state = "box_1"
else
- if(istype(P, /obj/item/weapon/wrench))
+ if(P.is_wrench())
playsound(src, W.usesound, 75, 1)
- user << "You dismantle the frame"
+ to_chat(user, "You dismantle the frame")
new /obj/item/stack/material/steel(src.loc, 5)
qdel(src)
if(2)
@@ -51,7 +51,7 @@
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "machine")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- user << "You add the circuit board to the frame."
+ to_chat(user, "You add the circuit board to the frame.")
circuit = P
user.drop_item()
P.loc = src
@@ -67,28 +67,28 @@
var/obj/ct = new cp() // have to quickly instantiate it get name
req_component_names[A] = ct.name
update_desc()
- user << desc
+ to_chat(user, desc)
else
- user << "This frame does not accept circuit boards of this type!"
+ to_chat(user, "This frame does not accept circuit boards of this type!")
else
- if(istype(P, /obj/item/weapon/wirecutters))
+ if(P.is_wirecutter())
playsound(src.loc, P.usesound, 50, 1)
- user << "You remove the cables."
+ to_chat(user, "You remove the cables.")
state = 1
icon_state = "box_0"
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc )
A.amount = 5
if(3)
- if(istype(P, /obj/item/weapon/crowbar))
+ if(P.is_crowbar())
playsound(src, P.usesound, 50, 1)
state = 2
circuit.loc = src.loc
circuit = null
if(components.len == 0)
- user << "You remove the circuit board."
+ to_chat(user, "You remove the circuit board.")
else
- user << "You remove the circuit board and other components."
+ to_chat(user, "You remove the circuit board and other components.")
for(var/obj/item/weapon/W in components)
W.loc = src.loc
desc = initial(desc)
@@ -96,7 +96,7 @@
components = null
icon_state = "box_1"
else
- if(istype(P, /obj/item/weapon/screwdriver))
+ if(P.is_screwdriver())
var/component_check = 1
for(var/R in req_components)
if(req_components[R] > 0)
@@ -132,7 +132,7 @@
for(var/I in req_components)
if(istype(P, text2path(I)) && (req_components[I] > 0))
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(istype(P, /obj/item/stack/cable_coil))
+ if(P.is_cable_coil))
var/obj/item/stack/cable_coil/CP = P
if(CP.get_amount() > 1)
var/camt = min(CP.amount, req_components[I]) // amount of cable to take, idealy amount required, but limited by amount provided
@@ -150,6 +150,6 @@
req_components[I]--
update_desc()
break
- user << desc
+ to_chat(user, desc)
if(P && P.loc != src && !istype(P, /obj/item/stack/cable_coil))
- user << "You cannot add that component to the machine!"
+ to_chat(user, "You cannot add that component to the machine!")
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index f7ab7e7a7e..adb4a5f35a 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -185,7 +185,7 @@
/obj/machinery/atmospherics/unary/cryo_cell/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob)
if(istype(G, /obj/item/weapon/reagent_containers/glass))
if(beaker)
- user << "A beaker is already loaded into the machine."
+ to_chat(user, "A beaker is already loaded into the machine.")
return
beaker = G
@@ -197,13 +197,16 @@
var/obj/item/weapon/grab/grab = G
if(!ismob(grab.affecting))
return
+ if(occupant)
+ to_chat(user,"\The [src] is already occupied by [occupant].")
for(var/mob/living/simple_animal/slime/M in range(1,grab.affecting))
if(M.victim == grab.affecting)
- usr << "[grab.affecting.name] will not fit into the cryo because they have a slime latched onto their head."
+ to_chat(usr, "[grab.affecting.name] will not fit into the cryo because they have a slime latched onto their head.")
return
var/mob/M = grab.affecting
- if(put_mob(M))
- qdel(grab)
+ qdel(grab)
+ put_mob(M)
+
return
/obj/machinery/atmospherics/unary/cryo_cell/MouseDrop_T(var/mob/target, var/mob/user) //Allows borgs to put people into cryo without external assistance
@@ -290,19 +293,19 @@
return
/obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M as mob)
if(stat & (NOPOWER|BROKEN))
- usr << "The cryo cell is not functioning."
+ to_chat(usr, "The cryo cell is not functioning.")
return
if(!istype(M))
- usr << "The cryo cell cannot handle such a lifeform!"
+ to_chat(usr, "The cryo cell cannot handle such a lifeform!")
return
if(occupant)
- usr << "The cryo cell is already occupied!"
+ to_chat(usr, "The cryo cell is already occupied!")
return
if(M.abiotic())
- usr << "Subject may not have abiotic items on."
+ to_chat(usr, "Subject may not have abiotic items on.")
return
if(!node)
- usr << "The cell is not correctly connected to its pipe network!"
+ to_chat(usr, "The cell is not correctly connected to its pipe network!")
return
if(M.client)
M.client.perspective = EYE_PERSPECTIVE
@@ -311,7 +314,7 @@
M.loc = src
M.ExtinguishMob()
if(M.health > -100 && (M.health < 0 || M.sleeping))
- M << "You feel a cold liquid surround you. Your skin starts to freeze up."
+ to_chat(M, "You feel a cold liquid surround you. Your skin starts to freeze up.")
occupant = M
buckle_mob(occupant, forced = TRUE, check_loc = FALSE)
vis_contents |= occupant
@@ -330,7 +333,7 @@
if(usr == occupant)//If the user is inside the tube...
if(usr.stat == 2)//and he's not dead....
return
- usr << "Release sequence activated. This will take two minutes."
+ to_chat(usr, "Release sequence activated. This will take two minutes.")
sleep(1200)
if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already
return
@@ -348,7 +351,7 @@
set src in oview(1)
for(var/mob/living/simple_animal/slime/M in range(1,usr))
if(M.victim == usr)
- usr << "You're too busy getting your life sucked out of you."
+ to_chat(usr, "You're too busy getting your life sucked out of you.")
return
if(usr.stat != 0)
return
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 5d6d7abdcc..6e74466be3 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -95,7 +95,7 @@
dat += "Recover object. "
dat += "Recover all objects. "
- user << browse(dat, "window=cryopod_console")
+ to_chat(user, browse(dat, "window=cryopod_console"))
onclose(user, "cryopod_console")
/obj/machinery/computer/cryopod/Topic(href, href_list)
@@ -114,7 +114,7 @@
dat += "[person] "
dat += " "
- user << browse(dat, "window=cryolog")
+ to_chat(user, browse(dat, "window=cryolog"))
if(href_list["view"])
if(!allow_items) return
@@ -124,13 +124,13 @@
dat += "[I.name] "
dat += " "
- user << browse(dat, "window=cryoitems")
+ to_chat(user, browse(dat, "window=cryoitems"))
else if(href_list["item"])
if(!allow_items) return
if(frozen_items.len == 0)
- user << "There is nothing to recover from storage."
+ to_chat(user, "There is nothing to recover from storage.")
return
var/obj/item/I = input(usr, "Please choose which object to retrieve.","Object recovery",null) as null|anything in frozen_items
@@ -138,7 +138,7 @@
return
if(!(I in frozen_items))
- user << "\The [I] is no longer in storage."
+ to_chat(user, "\The [I] is no longer in storage.")
return
visible_message("The console beeps happily as it disgorges \the [I].", 3)
@@ -150,7 +150,7 @@
if(!allow_items) return
if(frozen_items.len == 0)
- user << "There is nothing to recover from storage."
+ to_chat(user, "There is nothing to recover from storage.")
return
visible_message("The console beeps happily as it disgorges the desired objects.", 3)
@@ -401,7 +401,7 @@
preserve = 1
if(istype(W,/obj/item/weapon/implant/health))
- for(var/obj/machinery/computer/cloning/com in world)
+ for(var/obj/machinery/computer/cloning/com in machines)
for(var/datum/dna2/record/R in com.records)
if(locate(R.implant) == W)
qdel(R)
@@ -484,7 +484,7 @@
var/obj/item/weapon/grab/grab = G
if(occupant)
- user << "\The [src] is in use."
+ to_chat(user, "\The [src] is in use.")
return
if(!ismob(grab.affecting))
@@ -529,12 +529,12 @@
return
if(occupant)
- usr << "\The [src] is in use."
+ to_chat(usr, "\The [src] is in use.")
return
for(var/mob/living/simple_animal/slime/M in range(1,usr))
if(M.victim == usr)
- usr << "You're too busy getting your life sucked out of you."
+ to_chat(usr, "You're too busy getting your life sucked out of you.")
return
visible_message("[usr] [on_enter_visible_message] [src].", 3)
@@ -545,7 +545,7 @@
return
if(occupant)
- usr << "\The [src] is in use."
+ to_chat(usr, "\The [src] is in use.")
return
usr.stop_pulling()
@@ -561,8 +561,8 @@
icon_state = occupied_icon_state
- usr << "[on_enter_occupant_message]"
- usr << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
+ to_chat(usr, "[on_enter_occupant_message]")
+ to_chat(usr, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.")
time_entered = world.time
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index 2ed722e129..c50503f3c5 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -86,7 +86,7 @@ for reference:
return //hitting things with the wrong type of stack usually doesn't produce messages, and probably doesn't need to.
if(health < maxhealth)
if(D.get_amount() < 1)
- user << "You need one sheet of [material.display_name] to repair \the [src]."
+ to_chat(user, "You need one sheet of [material.display_name] to repair \the [src].")
return
visible_message("[user] begins to repair \the [src].")
if(do_after(user,20) && health < maxhealth)
@@ -168,10 +168,10 @@ for reference:
anchored = !anchored
icon_state = "barrier[locked]"
if((locked == 1.0) && (emagged < 2.0))
- user << "Barrier lock toggled on."
+ to_chat(user, "Barrier lock toggled on.")
return
else if((locked == 0.0) && (emagged < 2.0))
- user << "Barrier lock toggled off."
+ to_chat(user, "Barrier lock toggled off.")
return
else
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
@@ -180,7 +180,7 @@ for reference:
visible_message("BZZzZZzZZzZT")
return
return
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
if(health < maxhealth)
health = maxhealth
emagged = 0
@@ -252,7 +252,7 @@ for reference:
emagged = 1
req_access.Cut()
req_one_access.Cut()
- user << "You break the ID authentication lock on \the [src]."
+ to_chat(user, "You break the ID authentication lock on \the [src].")
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
@@ -260,7 +260,7 @@ for reference:
return 1
else if(emagged == 1)
emagged = 2
- user << "You short out the anchoring mechanism on \the [src]."
+ to_chat(user, "You short out the anchoring mechanism on \the [src].")
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index 7f7ce32e03..0a54b148d1 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -21,7 +21,7 @@
if(wires & 2)
return attack_hand(user)
else
- user << "Error, no route to host."
+ to_chat(user, "Error, no route to host.")
/obj/machinery/button/remote/attackby(obj/item/weapon/W, mob/user as mob)
return attack_hand(user)
@@ -42,7 +42,7 @@
return
if(!allowed(user) && (wires & 1))
- user << "Access Denied"
+ to_chat(user, "Access Denied")
flick("doorctrl-denied",src)
return
@@ -91,7 +91,7 @@
*/
/obj/machinery/button/remote/airlock/trigger()
- for(var/obj/machinery/door/airlock/D in world)
+ for(var/obj/machinery/door/airlock/D in machines)
if(D.id_tag == id)
if(specialfunctions & OPEN)
if(D.density)
@@ -135,7 +135,7 @@
desc = "It controls blast doors, remotely."
/obj/machinery/button/remote/blast_door/trigger()
- for(var/obj/machinery/door/blast/M in world)
+ for(var/obj/machinery/door/blast/M in machines)
if(M.id == id)
if(M.density)
spawn(0)
@@ -154,7 +154,7 @@
desc = "It controls emitters, remotely."
/obj/machinery/button/remote/emitter/trigger(mob/user as mob)
- for(var/obj/machinery/power/emitter/E in world)
+ for(var/obj/machinery/power/emitter/E in machines)
if(E.id == id)
spawn(0)
E.activate(user)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 2d40396d91..021edb48ca 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -870,7 +870,7 @@ About the new airlock wires panel:
if(istype(C, /mob/living))
..()
return
- if(!repairing && (istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density))
+ if(!repairing && istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density)
var/obj/item/weapon/weldingtool/W = C
if(W.remove_fuel(0,user))
if(!src.welded)
@@ -882,7 +882,7 @@ About the new airlock wires panel:
return
else
return
- else if(istype(C, /obj/item/weapon/screwdriver))
+ else if(C.is_screwdriver())
if (src.p_open)
if (stat & BROKEN)
to_chat(usr,"The panel is broken and cannot be closed.")
@@ -893,7 +893,7 @@ About the new airlock wires panel:
src.p_open = 1
playsound(src, C.usesound, 50, 1)
src.update_icon()
- else if(istype(C, /obj/item/weapon/wirecutters))
+ else if(C.is_wirecutter())
return src.attack_hand(user)
else if(istype(C, /obj/item/device/multitool))
return src.attack_hand(user)
@@ -902,7 +902,7 @@ About the new airlock wires panel:
else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE
var/obj/item/weapon/pai_cable/cable = C
cable.plugin(src, user)
- else if(!repairing && istype(C, /obj/item/weapon/crowbar))
+ else if(!repairing && C.is_crowbar())
if(can_remove_electronics())
playsound(src, C.usesound, 75, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.")
@@ -1175,7 +1175,7 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/initialize()
if(src.closeOtherId != null)
- for (var/obj/machinery/door/airlock/A in world)
+ for (var/obj/machinery/door/airlock/A in machines)
if(A.closeOtherId == src.closeOtherId && A != src)
src.closeOther = A
break
diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm
index 58ce8b282c..f4926c2aa8 100644
--- a/code/game/machinery/doors/blast_door.dm
+++ b/code/game/machinery/doors/blast_door.dm
@@ -125,7 +125,7 @@
if(istype(C,/obj/item/weapon/material/twohanded/fireaxe)) // Fireaxes need to be in both hands to pry.
var/obj/item/weapon/material/twohanded/fireaxe/F = C
if(!F.wielded)
- user << "You need to be wielding \the [F] to do that."
+ to_chat(user, "You need to be wielding \the [F] to do that.")
return
// If we're at this point, it's a fireaxe in both hands or something else that doesn't care for twohanding.
@@ -133,7 +133,7 @@
force_toggle(1, user)
else
- usr << "[src]'s motors resist your effort."
+ to_chat(user, "[src]'s motors resist your effort.")
return
@@ -153,19 +153,19 @@
else if(istype(C, /obj/item/stack/material) && C.get_material_name() == "plasteel") // Repairing.
var/amt = Ceiling((maxhealth - health)/150)
if(!amt)
- usr << "\The [src] is already fully repaired."
+ to_chat(user, "\The [src] is already fully repaired.")
return
var/obj/item/stack/P = C
if(P.amount < amt)
- usr << "You don't have enough sheets to repair this! You need at least [amt] sheets."
+ to_chat(user, "You don't have enough sheets to repair this! You need at least [amt] sheets.")
return
- usr << "You begin repairing [src]..."
+ to_chat(user, "You begin repairing [src]...")
if(do_after(usr, 30))
if(P.use(amt))
- usr << "You have repaired \The [src]"
+ to_chat(user, "You have repaired \The [src]")
src.repair()
else
- usr << "You don't have enough sheets to repair this! You need at least [amt] sheets."
+ to_chat(user, "You don't have enough sheets to repair this! You need at least [amt] sheets.")
else if(src.density && (user.a_intent == I_HURT)) //If we can't pry it open and it's not a weapon.... Eh, let's attack it anyway.
var/obj/item/weapon/W = C
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index e639571cb4..fe1d726d50 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -47,7 +47,7 @@
if(F.id == src.id)
LAZYADD(targets,F)
- for(var/obj/structure/closet/secure_closet/brig/C in world)
+ for(var/obj/structure/closet/secure_closet/brig/C in all_brig_closets)
if(C.id == src.id)
LAZYADD(targets,C)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 984d5e023d..a56ce2a880 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -254,7 +254,7 @@
repairing = null
return
- if(repairing && istype(I, /obj/item/weapon/crowbar))
+ if(repairing && I.is_crowbar())
user << "You remove \the [repairing]."
playsound(src, I.usesound, 100, 1)
repairing.loc = user.loc
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 504d65c306..fb7609ee05 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -4,8 +4,8 @@
#define FIREDOOR_MIN_TEMP 0
// Bitflags
-#define FIREDOOR_ALERT_HOT 1
-#define FIREDOOR_ALERT_COLD 2
+#define FIREDOOR_ALERT_HOT 1
+#define FIREDOOR_ALERT_COLD 2
// Not used #define FIREDOOR_ALERT_LOWPRESS 4
/obj/machinery/door/firedoor
@@ -83,9 +83,9 @@
return
if(pdiff >= FIREDOOR_MAX_PRESSURE_DIFF)
- user << "WARNING: Current pressure differential is [pdiff]kPa! Opening door may result in injury!"
+ to_chat(user, "WARNING: Current pressure differential is [pdiff]kPa! Opening door may result in injury!")
- user << "Sensor readings:"
+ to_chat(user, "Sensor readings:")
for(var/index = 1; index <= tile_info.len; index++)
var/o = " "
switch(index)
@@ -99,7 +99,7 @@
o += "WEST: "
if(tile_info[index] == null)
o += "DATA UNAVAILABLE"
- user << o
+ to_chat(user, o)
continue
var/celsius = convert_k2c(tile_info[index][1])
var/pressure = tile_info[index][2]
@@ -107,14 +107,14 @@
o += "[celsius]°C "
o += ""
o += "[pressure]kPa"
- user << o
+ to_chat(user, o)
if(islist(users_to_open) && users_to_open.len)
var/users_to_open_string = users_to_open[1]
if(users_to_open.len >= 2)
for(var/i = 2 to users_to_open.len)
users_to_open_string += ", [users_to_open[i]]"
- user << "These people have opened \the [src] during an alert: [users_to_open_string]."
+ to_chat(user, "These people have opened \the [src] during an alert: [users_to_open_string].")
/obj/machinery/door/firedoor/Bumped(atom/AM)
if(p_open || operating)
@@ -142,7 +142,7 @@
return
if(blocked)
- user << "\The [src] is welded solid!"
+ to_chat(user, "\The [src] is welded solid!")
return
var/alarmed = lockdown
@@ -154,15 +154,15 @@
"\The [src]", "Yes, [density ? "open" : "close"]", "No")
if(answer == "No")
return
- if(user.incapacitated() || (get_dist(src, user) > 1 && !issilicon(user)))
- user << "Sorry, you must remain able bodied and close to \the [src] in order to use it."
+ if(user.incapacitated() || (get_dist(src, user) > 1 && !issilicon(user)))
+ to_chat(user, "Sorry, you must remain able bodied and close to \the [src] in order to use it.")
return
if(density && (stat & (BROKEN|NOPOWER))) //can still close without power
- user << "\The [src] is not functioning, you'll have to force it open manually."
+ to_chat(user, "\The [src] is not functioning, you'll have to force it open manually.")
return
if(alarmed && density && lockdown && !allowed(user))
- user << "Access denied. Please wait for authorities to arrive, or for the alert to clear."
+ to_chat(user, "Access denied. Please wait for authorities to arrive, or for the alert to clear.")
return
else
user.visible_message("\The [src] [density ? "open" : "close"]s for \the [user].",\
@@ -245,7 +245,7 @@
return//Already doing something.
if(istype(C, /obj/item/weapon/weldingtool) && !repairing)
if(prying)
- to_chat(user,"Someone's busy prying that [density ? "open" : "closed"]!")
+ to_chat(user, "Someone's busy prying that [density ? "open" : "closed"]!")
var/obj/item/weapon/weldingtool/W = C
if(W.remove_fuel(0, user))
blocked = !blocked
@@ -256,7 +256,7 @@
update_icon()
return
- if(density && istype(C, /obj/item/weapon/screwdriver))
+ if(density && C.is_screwdriver())
hatch_open = !hatch_open
playsound(src, C.usesound, 50, 1)
user.visible_message("[user] has [hatch_open ? "opened" : "closed"] \the [src] maintenance hatch.",
@@ -264,9 +264,9 @@
update_icon()
return
- if(blocked && istype(C, /obj/item/weapon/crowbar) && !repairing)
+ if(blocked && C.is_crowbar() && !repairing)
if(!hatch_open)
- user << "You must open the maintenance hatch first!"
+ to_chat(user, "You must open the maintenance hatch first!")
else
user.visible_message("[user] is removing the electronics from \the [src].",
"You start to remove the electronics from [src].")
@@ -290,14 +290,14 @@
return
if(blocked)
- user << "\The [src] is welded shut!"
+ to_chat(user, "\The [src] is welded shut!")
return
if(C.pry == 1)
if(operating)
return
- if(blocked && istype(C, /obj/item/weapon/crowbar))
+ if(blocked && C.is_crowbar())
user.visible_message("\The [user] pries at \the [src] with \a [C], but \the [src] is welded in place!",\
"You try to pry \the [src] [density ? "open" : "closed"], but it is welded in place!",\
"You hear someone struggle and metal straining.")
@@ -309,7 +309,7 @@
return
if(prying)
- to_chat(user,"Someone's already prying that [density ? "open" : "closed"].")
+ to_chat(user, "Someone's already prying that [density ? "open" : "closed"].")
return
user.visible_message("\The [user] starts to force \the [src] [density ? "open" : "closed"] with \a [C]!",\
@@ -319,7 +319,7 @@
update_icon()
playsound(src, C.usesound, 100, 1)
if(do_after(user,30 * C.toolspeed))
- if(istype(C, /obj/item/weapon/crowbar))
+ if(C.is_crowbar())
if(stat & (BROKEN|NOPOWER) || !density)
user.visible_message("\The [user] forces \the [src] [density ? "open" : "closed"] with \a [C]!",\
"You force \the [src] [density ? "open" : "closed"] with \the [C]!",\
@@ -504,7 +504,7 @@
/obj/machinery/door/firedoor/glass
name = "\improper Emergency Glass Shutter"
- desc = "Emergency air-tight shutter, capable of sealing off breached areas. This one has a resilient glass window, allowing you to see the danger."
+ desc = "Emergency air-tight shutter, capable of sealing off breached areas. This one has a resilient glass window, allowing you to see the danger."
icon = 'icons/obj/doors/DoorHazardGlass.dmi'
icon_state = "door_open"
glass = 1
diff --git a/code/game/machinery/doors/firedoor_assembly.dm b/code/game/machinery/doors/firedoor_assembly.dm
index f30c2e6146..cebafdbb40 100644
--- a/code/game/machinery/doors/firedoor_assembly.dm
+++ b/code/game/machinery/doors/firedoor_assembly.dm
@@ -26,7 +26,7 @@ obj/structure/firedoor_assembly/attackby(obj/item/C, mob/user as mob)
wired = 1
user << "You wire \the [src]."
- else if(istype(C, /obj/item/weapon/wirecutters) && wired )
+ else if(C.is_wirecutter() && wired )
playsound(src.loc, C.usesound, 100, 1)
user.visible_message("[user] cuts the wires from \the [src].", "You start to cut the wires from \the [src].")
@@ -46,7 +46,7 @@ obj/structure/firedoor_assembly/attackby(obj/item/C, mob/user as mob)
qdel(src)
else
user << "You must secure \the [src] first!"
- else if(istype(C, /obj/item/weapon/wrench))
+ else if(C.is_wrench())
anchored = !anchored
playsound(src.loc, C.usesound, 50, 1)
user.visible_message("[user] has [anchored ? "" : "un" ]secured \the [src]!",
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index d25473e709..b2afaaf6ae 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -207,7 +207,7 @@
return 1
//If it's opened/emagged, crowbar can pry it out of its frame.
- if (!density && istype(I, /obj/item/weapon/crowbar))
+ if (!density && I.is_crowbar())
playsound(src, I.usesound, 50, 1)
user.visible_message("[user] begins prying the windoor out of the frame.", "You start to pry the windoor out of the frame.")
if (do_after(user,40 * I.toolspeed))
@@ -268,8 +268,6 @@
return
-
-
/obj/machinery/door/window/brigdoor
name = "secure door"
icon = 'icons/obj/doors/windoor.dmi'
@@ -284,7 +282,6 @@
new /obj/item/stack/rods(src.loc, 2)
..()
-
/obj/machinery/door/window/northleft
dir = NORTH
diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm
index 87eba96324..27a01c0682 100644
--- a/code/game/machinery/exonet_node.dm
+++ b/code/game/machinery/exonet_node.dm
@@ -88,9 +88,9 @@
// Parameters: 2 (I - the item being whacked against the machine, user - the person doing the whacking)
// Description: Handles deconstruction.
/obj/machinery/exonet_node/attackby(obj/item/I, mob/user)
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
default_deconstruction_screwdriver(user, I)
- else if(istype(I, /obj/item/weapon/crowbar))
+ else if(I.is_crowbar())
default_deconstruction_crowbar(user, I)
else
..()
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 18844dcd73..169bc8c6d7 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -35,7 +35,7 @@
//Don't want to render prison breaks impossible
/obj/machinery/flasher/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wirecutters))
+ if(W.is_wirecutter())
add_fingerprint(user)
disable = !disable
if(disable)
@@ -102,7 +102,7 @@
flash()
/obj/machinery/flasher/portable/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
add_fingerprint(user)
anchored = !anchored
diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm
index 88b36f6b5c..729d99f419 100644
--- a/code/game/machinery/floodlight.dm
+++ b/code/game/machinery/floodlight.dm
@@ -65,7 +65,7 @@
turn_off(1)
else
if(!turn_on(1))
- user << "You try to turn on \the [src] but it does not work."
+ to_chat(user, "You try to turn on \the [src] but it does not work.")
/obj/machinery/floodlight/attack_hand(mob/user as mob)
if(open && cell)
@@ -82,7 +82,7 @@
cell = null
on = 0
set_light(0)
- user << "You remove the power cell"
+ to_chat(user, "You remove the power cell")
update_icon()
return
@@ -90,38 +90,38 @@
turn_off(1)
else
if(!turn_on(1))
- user << "You try to turn on \the [src] but it does not work."
+ to_chat(user, "You try to turn on \the [src] but it does not work.")
update_icon()
/obj/machinery/floodlight/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
if(!open)
if(unlocked)
unlocked = 0
- user << "You screw the battery panel in place."
+ to_chat(user, "You screw the battery panel in place.")
else
unlocked = 1
- user << "You unscrew the battery panel."
+ to_chat(user, "You unscrew the battery panel.")
- if(istype(W, /obj/item/weapon/crowbar))
+ if(W.is_crowbar())
if(unlocked)
if(open)
open = 0
overlays = null
- user << "You crowbar the battery panel in place."
+ to_chat(user, "You crowbar the battery panel in place.")
else
if(unlocked)
open = 1
- user << "You remove the battery panel."
+ to_chat(user, "You remove the battery panel.")
if(istype(W, /obj/item/weapon/cell))
if(open)
if(cell)
- user << "There is a power cell already installed."
+ to_chat(user, "There is a power cell already installed.")
else
user.drop_item()
W.loc = src
cell = W
- user << "You insert the power cell."
+ to_chat(user, "You insert the power cell.")
update_icon()
diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm
index 40ff7a3b04..f02d3c2855 100644
--- a/code/game/machinery/floor_light.dm
+++ b/code/game/machinery/floor_light.dm
@@ -16,20 +16,20 @@ var/list/floor_light_cache = list()
var/on
var/damaged
var/default_light_range = 4
- var/default_light_power = 2
- var/default_light_colour = "#FFFFFF"
+ var/default_light_power = 0.75
+ var/default_light_colour = LIGHT_COLOR_INCANDESCENT_BULB
/obj/machinery/floor_light/prebuilt
anchored = 1
/obj/machinery/floor_light/attackby(var/obj/item/W, var/mob/user)
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
anchored = !anchored
visible_message("\The [user] has [anchored ? "attached" : "detached"] \the [src].")
else if(istype(W, /obj/item/weapon/weldingtool) && (damaged || (stat & BROKEN)))
var/obj/item/weapon/weldingtool/WT = W
if(!WT.remove_fuel(0, user))
- user << "\The [src] must be on to complete this task."
+ to_chat(user, "\The [src] must be on to complete this task.")
return
playsound(src.loc, WT.usesound, 50, 1)
if(!do_after(user, 20 * WT.toolspeed))
@@ -60,15 +60,15 @@ var/list/floor_light_cache = list()
else
if(!anchored)
- user << "\The [src] must be screwed down first."
+ to_chat(user, "\The [src] must be screwed down first.")
return
if(stat & BROKEN)
- user << "\The [src] is too damaged to be functional."
+ to_chat(user, "\The [src] is too damaged to be functional.")
return
if(stat & NOPOWER)
- user << "\The [src] is unpowered."
+ to_chat(user, "\The [src] is unpowered.")
return
on = !on
@@ -154,4 +154,4 @@ var/list/floor_light_cache = list()
/obj/machinery/floor_light/cultify()
default_light_colour = "#FF0000"
- update_brightness()
\ No newline at end of file
+ update_brightness()
diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm
index 1cbccc195c..94f61981ea 100644
--- a/code/game/machinery/floorlayer.dm
+++ b/code/game/machinery/floorlayer.dm
@@ -34,7 +34,7 @@
return
/obj/machinery/floorlayer/attackby(var/obj/item/W as obj, var/mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
var/m = input("Choose work mode", "Mode") as null|anything in mode
mode[m] = !mode[m]
var/O = mode[m]
@@ -42,23 +42,23 @@
return
if(istype(W, /obj/item/stack/tile))
- user << "\The [W] successfully loaded."
+ to_chat(user, "\The [W] successfully loaded.")
user.drop_item(T)
TakeTile(T)
return
- if(istype(W, /obj/item/weapon/crowbar))
+ if(W.is_crowbar())
if(!length(contents))
- user << "\The [src] is empty."
+ to_chat(user, "\The [src] is empty.")
else
var/obj/item/stack/tile/E = input("Choose remove tile type.", "Tiles") as null|anything in contents
if(E)
- user << "You remove the [E] from /the [src]."
+ to_chat(user, "You remove the [E] from /the [src].")
E.loc = src.loc
T = null
return
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
T = input("Choose tile type.", "Tiles") as null|anything in contents
return
..()
diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm
index f1f2ec0834..2c16d3771e 100644
--- a/code/game/machinery/frame.dm
+++ b/code/game/machinery/frame.dm
@@ -260,9 +260,9 @@
update_icon()
/obj/structure/frame/attackby(obj/item/P as obj, mob/user as mob)
- if(istype(P, /obj/item/weapon/wrench))
+ if(P.is_wrench())
if(state == FRAME_PLACED && !anchored)
- user << "You start to wrench the frame into place."
+ to_chat(user, "You start to wrench the frame into place.")
playsound(src.loc, P.usesound, 50, 1)
if(do_after(user, 20 * P.toolspeed))
anchored = 1
@@ -270,14 +270,14 @@
state = FRAME_FASTENED
check_components()
update_desc()
- user << "You wrench the frame into place and set the outer cover."
+ to_chat(user, "You wrench the frame into place and set the outer cover.")
else
- user << "You wrench the frame into place."
+ to_chat(user, "You wrench the frame into place.")
else if(state == FRAME_PLACED && anchored)
playsound(src, P.usesound, 50, 1)
if(do_after(user, 20 * P.toolspeed))
- user << "You unfasten the frame."
+ to_chat(user, "You unfasten the frame.")
anchored = 0
else if(istype(P, /obj/item/weapon/weldingtool))
@@ -287,12 +287,12 @@
playsound(src.loc, P.usesound, 50, 1)
if(do_after(user, 20 * P.toolspeed))
if(src && WT.isOn())
- user << "You deconstruct the frame."
+ to_chat(user, "You deconstruct the frame.")
new /obj/item/stack/material/steel(src.loc, frame_type.frame_size)
qdel(src)
return
else if(!WT.remove_fuel(0, user))
- user << "The welding tool must be on to complete this task."
+ to_chat(user, "The welding tool must be on to complete this task.")
return
else if(istype(P, /obj/item/weapon/circuitboard) && need_circuit && !circuit)
@@ -301,7 +301,7 @@
var/datum/frame/frame_types/board_type = B.board_type
if(board_type.name == frame_type.name)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- user << "You place the circuit board inside the frame."
+ to_chat(user, "You place the circuit board inside the frame.")
circuit = P
user.drop_item()
P.loc = src
@@ -310,25 +310,25 @@
check_components()
update_desc()
else
- user << "This frame does not accept circuit boards of this type!"
+ to_chat(user, "This frame does not accept circuit boards of this type!")
return
- else if(istype(P, /obj/item/weapon/screwdriver))
+ else if(P.is_screwdriver())
if(state == FRAME_UNFASTENED)
if(need_circuit && circuit)
playsound(src, P.usesound, 50, 1)
- user << "You screw the circuit board into place."
+ to_chat(user, "You screw the circuit board into place.")
state = FRAME_FASTENED
else if(state == FRAME_FASTENED)
if(need_circuit && circuit)
playsound(src, P.usesound, 50, 1)
- user << "You unfasten the circuit board."
+ to_chat(user, "You unfasten the circuit board.")
state = FRAME_UNFASTENED
else if(!need_circuit && circuit)
playsound(src, P.usesound, 50, 1)
- user << "You unfasten the outer cover."
+ to_chat(user, "You unfasten the outer cover.")
state = FRAME_PLACED
else if(state == FRAME_WIRED)
@@ -370,7 +370,7 @@
else if(frame_type.frame_class == FRAME_CLASS_ALARM)
playsound(src, P.usesound, 50, 1)
- user << "You fasten the cover."
+ to_chat(user, "You fasten the cover.")
var/obj/machinery/B = new circuit.build_path(src.loc)
B.pixel_x = pixel_x
B.pixel_y = pixel_y
@@ -384,7 +384,7 @@
else if(state == FRAME_PANELED)
if(frame_type.frame_class == FRAME_CLASS_COMPUTER)
playsound(src, P.usesound, 50, 1)
- user << "You connect the monitor."
+ to_chat(user, "You connect the monitor.")
var/obj/machinery/B = new circuit.build_path(src.loc)
B.pixel_x = pixel_x
B.pixel_y = pixel_y
@@ -397,7 +397,7 @@
else if(frame_type.frame_class == FRAME_CLASS_DISPLAY)
playsound(src, P.usesound, 50, 1)
- user << "You connect the monitor."
+ to_chat(user, "You connect the monitor.")
var/obj/machinery/B = new circuit.build_path(src.loc)
B.pixel_x = pixel_x
B.pixel_y = pixel_y
@@ -408,11 +408,11 @@
qdel(src)
return
- else if(istype(P, /obj/item/weapon/crowbar))
+ else if(P.is_crowbar())
if(state == FRAME_UNFASTENED)
if(need_circuit && circuit)
playsound(src, P.usesound, 50, 1)
- user << "You remove the circuit board."
+ to_chat(user, "You remove the circuit board.")
state = FRAME_PLACED
circuit.forceMove(src.loc)
circuit = null
@@ -423,25 +423,25 @@
if(frame_type.frame_class == FRAME_CLASS_MACHINE)
playsound(src, P.usesound, 50, 1)
if(components.len == 0)
- user << "There are no components to remove."
+ to_chat(user, "There are no components to remove.")
else
- user << "You remove the components."
+ to_chat(user, "You remove the components.")
for(var/obj/item/weapon/W in components)
W.forceMove(src.loc)
check_components()
update_desc()
- user << desc
+ to_chat(user, desc)
else if(state == FRAME_PANELED)
if(frame_type.frame_class == FRAME_CLASS_COMPUTER)
playsound(src, P.usesound, 50, 1)
- user << "You remove the glass panel."
+ to_chat(user, "You remove the glass panel.")
state = FRAME_WIRED
new /obj/item/stack/material/glass(src.loc, 2)
else if(frame_type.frame_class == FRAME_CLASS_DISPLAY)
playsound(src, P.usesound, 50, 1)
- user << "You remove the glass panel."
+ to_chat(user, "You remove the glass panel.")
state = FRAME_WIRED
new /obj/item/stack/material/glass(src.loc, 2)
@@ -449,16 +449,16 @@
if(state == FRAME_FASTENED)
var/obj/item/stack/cable_coil/C = P
if(C.get_amount() < 5)
- user << "You need five coils of wire to add them to the frame."
+ to_chat(user, "You need five coils of wire to add them to the frame.")
return
- user << "You start to add cables to the frame."
+ to_chat(user, "You start to add cables to the frame.")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 20) && state == FRAME_FASTENED)
if(C.use(5))
- user << "You add cables to the frame."
+ to_chat(user, "You add cables to the frame.")
state = FRAME_WIRED
if(frame_type.frame_class == FRAME_CLASS_MACHINE)
- user << desc
+ to_chat(user, desc)
else if(state == FRAME_WIRED)
if(frame_type.frame_class == FRAME_CLASS_MACHINE)
for(var/I in req_components)
@@ -483,31 +483,31 @@
req_components[I]--
update_desc()
break
- user << desc
+ to_chat(user, desc)
- else if(istype(P, /obj/item/weapon/wirecutters))
+ else if(P.is_wirecutter())
if(state == FRAME_WIRED)
if(frame_type.frame_class == FRAME_CLASS_COMPUTER)
playsound(src, P.usesound, 50, 1)
- user << "You remove the cables."
+ to_chat(user, "You remove the cables.")
state = FRAME_FASTENED
new /obj/item/stack/cable_coil(src.loc, 5)
else if(frame_type.frame_class == FRAME_CLASS_DISPLAY)
playsound(src, P.usesound, 50, 1)
- user << "You remove the cables."
+ to_chat(user, "You remove the cables.")
state = FRAME_FASTENED
new /obj/item/stack/cable_coil(src.loc, 5)
else if(frame_type.frame_class == FRAME_CLASS_ALARM)
playsound(src, P.usesound, 50, 1)
- user << "You remove the cables."
+ to_chat(user, "You remove the cables.")
state = FRAME_FASTENED
new /obj/item/stack/cable_coil(src.loc, 5)
else if(frame_type.frame_class == FRAME_CLASS_MACHINE)
playsound(src, P.usesound, 50, 1)
- user << "You remove the cables."
+ to_chat(user, "You remove the cables.")
state = FRAME_FASTENED
new /obj/item/stack/cable_coil(src.loc, 5)
@@ -516,25 +516,25 @@
if(frame_type.frame_class == FRAME_CLASS_COMPUTER)
var/obj/item/stack/G = P
if(G.get_amount() < 2)
- user << "You need two sheets of glass to put in the glass panel."
+ to_chat(user, "You need two sheets of glass to put in the glass panel.")
return
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- user << "You start to put in the glass panel."
+ to_chat(user, "You start to put in the glass panel.")
if(do_after(user, 20) && state == FRAME_WIRED)
if(G.use(2))
- user << "You put in the glass panel."
+ to_chat(user, "You put in the glass panel.")
state = FRAME_PANELED
else if(frame_type.frame_class == FRAME_CLASS_DISPLAY)
var/obj/item/stack/G = P
if(G.get_amount() < 2)
- user << "You need two sheets of glass to put in the glass panel."
+ to_chat(user, "You need two sheets of glass to put in the glass panel.")
return
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- user << "You start to put in the glass panel."
+ to_chat(user, "You start to put in the glass panel.")
if(do_after(user, 20) && state == FRAME_WIRED)
if(G.use(2))
- user << "You put in the glass panel."
+ to_chat(user, "You put in the glass panel.")
state = FRAME_PANELED
else if(istype(P, /obj/item))
@@ -562,9 +562,9 @@
req_components[I]--
update_desc()
break
- user << desc
+ to_chat(user, desc)
if(P && P.loc != src && !istype(P, /obj/item/stack/material))
- user << "You cannot add that component to the machine!"
+ to_chat(user, "You cannot add that component to the machine!")
return
update_icon()
@@ -578,12 +578,12 @@
return 0
if(anchored)
- usr << "It is fastened to the floor therefore you can't rotate it!"
+ to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
return 0
set_dir(turn(dir, 90))
- usr << "You rotate the [src] to face [dir2text(dir)]!"
+ to_chat(usr, "You rotate the [src] to face [dir2text(dir)]!")
return
@@ -597,11 +597,11 @@
return 0
if(anchored)
- usr << "It is fastened to the floor therefore you can't rotate it!"
+ to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
return 0
set_dir(turn(dir, 270))
- usr << "You rotate the [src] to face [dir2text(dir)]!"
+ to_chat(usr, "You rotate the [src] to face [dir2text(dir)]!")
return
\ No newline at end of file
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index e0156196d6..cddec859ad 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -35,7 +35,8 @@ var/const/HOLOPAD_MODE = RANGE_BASED
icon_state = "holopad0"
show_messages = 1
circuit = /obj/item/weapon/circuitboard/holopad
- layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them.
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
var/power_per_hologram = 500 //per usage per hologram
idle_power_usage = 5
use_power = 1
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 1e67fb8b4f..5cb521d423 100755
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -71,7 +71,7 @@
// sd_SetLuminosity(0)
/obj/machinery/sparker/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
add_fingerprint(user)
disable = !disable
playsound(src, W.usesound, 50, 1)
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 306a098638..36ec27f4ac 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -55,21 +55,21 @@
/obj/machinery/iv_drip/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/reagent_containers))
if(!isnull(beaker))
- user << "There is already a reagent container loaded!"
+ to_chat(user, "There is already a reagent container loaded!")
return
user.drop_item()
W.loc = src
beaker = W
- user << "You attach \the [W] to \the [src]."
+ to_chat(user, "You attach \the [W] to \the [src].")
update_icon()
return
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
playsound(src, W.usesound, 50, 1)
- user << "You start to dismantle the IV drip."
+ to_chat(user, "You start to dismantle the IV drip.")
if(do_after(user, 15))
- user << "You dismantle the IV drip."
+ to_chat(user, "You dismantle the IV drip.")
var/obj/item/stack/rods/A = new /obj/item/stack/rods(src.loc)
A.amount = 6
if(beaker)
@@ -110,12 +110,14 @@
amount = min(amount, 4)
// If the beaker is full, ping
if(amount == 0)
- if(prob(5)) visible_message("\The [src] pings.")
+ if(prob(5))
+ visible_message("\The [src] pings.")
return
var/mob/living/carbon/human/T = attached
- if(!istype(T)) return
+ if(!istype(T))
+ return
if(!T.dna)
return
if(NOCLONE in T.mutations)
@@ -152,30 +154,31 @@
set src in view(1)
if(!istype(usr, /mob/living))
- usr << "You can't do that."
+ to_chat(usr, "You can't do that.")
return
if(usr.stat)
return
mode = !mode
- usr << "The IV drip is now [mode ? "injecting" : "taking blood"]."
+ to_chat(usr, "The IV drip is now [mode ? "injecting" : "taking blood"].")
/obj/machinery/iv_drip/examine(mob/user)
..(user)
- if(!(user in view(2)) && user != src.loc) return
+ if(!(user in view(2)) && user != src.loc)
+ return
- user << "The IV drip is [mode ? "injecting" : "taking blood"]."
+ to_chat(user, "The IV drip is [mode ? "injecting" : "taking blood"].")
if(beaker)
if(beaker.reagents && beaker.reagents.reagent_list.len)
- usr << "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid."
+ to_chat(user, "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.")
else
- usr << "Attached is an empty [beaker]."
+ to_chat(user, "Attached is an empty [beaker].")
else
- usr << "No chemicals are attached."
+ to_chat(user, "No chemicals are attached.")
- usr << "[attached ? attached : "No one"] is attached."
+ to_chat(user, "[attached ? attached : "No one"] is attached.")
/obj/machinery/iv_drip/CanPass(atom/movable/mover, turf/target, height = 0, air_group = 0)
if(height && istype(mover) && mover.checkpass(PASSTABLE)) //allow bullets, beams, thrown objects, mice, drones, and the like through.
diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm
index caa71d7fb5..b16ebafa88 100644
--- a/code/game/machinery/jukebox.dm
+++ b/code/game/machinery/jukebox.dm
@@ -37,7 +37,7 @@ datum/track/New(var/title_name, var/audio)
new/datum/track("Part A", 'sound/misc/TestLoop1.ogg'),
new/datum/track("Scratch", 'sound/music/title1.ogg'),
new/datum/track("Trai`Tor", 'sound/music/traitor.ogg'),
- new/datum/track("Stellar Transit", 'sound/ambience/serspaceamb1.ogg'),
+ new/datum/track("Stellar Transit", 'sound/ambience/space/space_serithi.ogg'),
)
// Only visible if hacked
@@ -76,11 +76,11 @@ datum/track/New(var/title_name, var/audio)
return
if(default_deconstruction_crowbar(user, W))
return
- if(istype(W, /obj/item/weapon/wirecutters))
+ if(W.is_wirecutter())
return wires.Interact(user)
if(istype(W, /obj/item/device/multitool))
return wires.Interact(user)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
if(playing)
StopPlaying()
user.visible_message("[user] has [anchored ? "un" : ""]secured \the [src].", "You [anchored ? "un" : ""]secure \the [src].")
@@ -123,11 +123,11 @@ datum/track/New(var/title_name, var/audio)
return
if(!anchored)
- usr << "You must secure \the [src] first."
+ to_chat(usr, "You must secure \the [src] first.")
return
if(stat & (NOPOWER|BROKEN))
- usr << "\The [src] doesn't appear to function."
+ to_chat(usr, "\The [src] doesn't appear to function.")
return
if(href_list["change_track"])
@@ -156,7 +156,7 @@ datum/track/New(var/title_name, var/audio)
spawn(15)
explode()
else if(current_track == null)
- usr << "No track selected."
+ to_chat(usr, "No track selected.")
else
StartPlaying()
@@ -164,7 +164,7 @@ datum/track/New(var/title_name, var/audio)
/obj/machinery/media/jukebox/interact(mob/user)
if(stat & (NOPOWER|BROKEN))
- usr << "\The [src] doesn't appear to function."
+ to_chat(usr, "\The [src] doesn't appear to function.")
return
ui_interact(user)
@@ -220,7 +220,7 @@ datum/track/New(var/title_name, var/audio)
return
if(default_deconstruction_crowbar(user, W))
return
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
if(playing)
StopPlaying()
user.visible_message("[user] has [anchored ? "un" : ""]secured \the [src].", "You [anchored ? "un" : ""]secure \the [src].")
diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm
index 3da253e682..1ece9225b1 100644
--- a/code/game/machinery/kitchen/microwave.dm
+++ b/code/game/machinery/kitchen/microwave.dm
@@ -61,7 +61,7 @@
/obj/machinery/microwave/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(src.broken > 0)
- if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver
+ if(src.broken == 2 && O.is_screwdriver()) // If it's broken and they're using a screwdriver
user.visible_message( \
"\The [user] starts to fix part of the microwave.", \
"You start to fix part of the microwave." \
@@ -73,7 +73,7 @@
"You have fixed part of the microwave." \
)
src.broken = 1 // Fix it a bit
- else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench
+ else if(src.broken == 1 && O.is_wrench()) // If it's broken and they're doing the wrench
user.visible_message( \
"\The [user] starts to fix part of the microwave.", \
"You start to fix part of the microwave." \
@@ -88,7 +88,7 @@
src.dirty = 0 // just to be sure
src.flags = OPENCONTAINER | NOREACT
else
- user << "It's broken!"
+ to_chat(user, "It's broken!")
return 1
else if(default_deconstruction_screwdriver(user, O))
return
@@ -113,11 +113,11 @@
src.icon_state = "mw"
src.flags = OPENCONTAINER | NOREACT
else //Otherwise bad luck!!
- user << "It's dirty!"
+ to_chat(user, "It's dirty!")
return 1
else if(is_type_in_list(O,acceptable_items))
if (contents.len>=(max_n_of_items + component_parts.len + 1)) //Adds component_parts to the maximum number of items. The 1 is from the circuit
- user << "This [src] is full of ingredients, you cannot put more."
+ to_chat(user, "This [src] is full of ingredients, you cannot put more.")
return 1
if(istype(O, /obj/item/stack) && O:get_amount() > 1) // This is bad, but I can't think of how to change it
var/obj/item/stack/S = O
@@ -143,15 +143,15 @@
return 1
for (var/datum/reagent/R in O.reagents.reagent_list)
if (!(R.id in acceptable_reagents))
- user << "Your [O] contains components unsuitable for cookery."
+ to_chat(user, "Your [O] contains components unsuitable for cookery.")
return 1
return
else if(istype(O,/obj/item/weapon/grab))
var/obj/item/weapon/grab/G = O
- user << "This is ridiculous. You can not fit \the [G.affecting] in this [src]."
+ to_chat(user, "This is ridiculous. You can not fit \the [G.affecting] in this [src].")
return 1
else
- user << "You have no idea what you can cook with this [O]."
+ to_chat(user, "You have no idea what you can cook with this [O].")
..()
src.updateUsrDialog()
@@ -225,7 +225,7 @@
Eject ingredients! \
"}
- user << browse("Microwave Controls[dat]", "window=microwave")
+ to_chat(user, browse("Microwave Controls[dat]", "window=microwave"))
onclose(user, "microwave")
return
diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index b2c3d21b68..a0ead02ef2 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -208,7 +208,7 @@
********************/
/obj/machinery/smartfridge/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(istype(O, /obj/item/weapon/screwdriver))
+ if(O.is_screwdriver())
panel_open = !panel_open
user.visible_message("[user] [panel_open ? "opens" : "closes"] the maintenance panel of \the [src].", "You [panel_open ? "open" : "close"] the maintenance panel of \the [src].")
playsound(src, O.usesound, 50, 1)
@@ -221,13 +221,13 @@
if(wrenchable && default_unfasten_wrench(user, O, 20))
return
- if(istype(O, /obj/item/device/multitool)||istype(O, /obj/item/weapon/wirecutters))
+ if(istype(O, /obj/item/device/multitool) || O.is_wirecutter())
if(panel_open)
attack_hand(user)
return
if(stat & NOPOWER)
- user << "\The [src] is unpowered and useless."
+ to_chat(user, "\The [src] is unpowered and useless.")
return
if(accept_check(O))
@@ -246,27 +246,27 @@
if(plants_loaded)
user.visible_message("[user] loads \the [src] with \the [P].", "You load \the [src] with \the [P].")
if(P.contents.len > 0)
- user << "Some items are refused."
+ to_chat(user, "Some items are refused.")
else if(istype(O, /obj/item/weapon/gripper)) // Grippers. ~Mechoid.
var/obj/item/weapon/gripper/B = O //B, for Borg.
if(!B.wrapped)
- user << "\The [B] is not holding anything."
+ to_chat(user, "\The [B] is not holding anything.")
return
else
var/B_held = B.wrapped
- user << "You use \the [B] to put \the [B_held] into \the [src]."
+ to_chat(user, "You use \the [B] to put \the [B_held] into \the [src].")
return
else
- user << "\The [src] smartly refuses [O]."
+ to_chat(user, "\The [src] smartly refuses [O].")
return 1
/obj/machinery/smartfridge/secure/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
emagged = 1
locked = -1
- user << "You short out the product lock on [src]."
+ to_chat(user, "You short out the product lock on [src].")
return 1
/obj/machinery/smartfridge/proc/stock(obj/item/O)
@@ -378,9 +378,10 @@
*************************/
/obj/machinery/smartfridge/secure/Topic(href, href_list)
- if(stat & (NOPOWER|BROKEN)) return 0
+ if(stat & (NOPOWER|BROKEN))
+ return 0
if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf)))
if(!allowed(usr) && !emagged && locked != -1 && href_list["vend"])
- usr << "Access denied."
+ to_chat(usr, "Access denied.")
return 0
return ..()
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index ab5fcbdf64..f4b3d6f8f0 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -46,7 +46,7 @@
/obj/machinery/light_switch/examine(mob/user)
if(..(user, 1))
- user << "A light switch. It is [on? "on" : "off"]."
+ to_chat(user, "A light switch. It is [on? "on" : "off"].")
/obj/machinery/light_switch/attack_hand(mob/user)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 874f8876b9..c103f1f39e 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -124,10 +124,12 @@ Class Procs:
/obj/machinery/initialize()
. = ..()
+ global.machines += src
START_MACHINE_PROCESSING(src)
/obj/machinery/Destroy()
STOP_MACHINE_PROCESSING(src)
+ global.machines -= src
if(component_parts)
for(var/atom/A in component_parts)
if(A.loc == src) // If the components are inside the machine, delete them.
@@ -230,8 +232,8 @@ Class Procs:
return 1
if(user.lying || user.stat)
return 1
- if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/living/silicon)))
- usr << "You don't have the dexterity to do this!"
+ if(!(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon)))
+ to_chat(user, "You don't have the dexterity to do this!")
return 1
if(ishuman(user))
var/mob/living/carbon/human/H = user
@@ -239,7 +241,7 @@ Class Procs:
visible_message("[H] stares cluelessly at [src].")
return 1
else if(prob(H.getBrainLoss()))
- user << "You momentarily forget how to use [src]."
+ to_chat(user, "You momentarily forget how to use [src].")
return 1
add_fingerprint(user)
@@ -311,23 +313,23 @@ Class Procs:
component_parts -= A
component_parts += B
B.loc = null
- user << "[A.name] replaced with [B.name]."
+ to_chat(user, "[A.name] replaced with [B.name].")
break
update_icon()
RefreshParts()
else
- user << "Following parts detected in the machine:"
+ to_chat(user, "Following parts detected in the machine:")
for(var/var/obj/item/C in component_parts) //var/var/obj/item/C?
- user << " [C.name]"
+ to_chat(user, " [C.name]")
return 1
// Default behavior for wrenching down machines. Supports both delay and instant modes.
-/obj/machinery/proc/default_unfasten_wrench(var/mob/user, var/obj/item/weapon/wrench/W, var/time = 0)
- if(!istype(W))
+/obj/machinery/proc/default_unfasten_wrench(var/mob/user, var/obj/item/W, var/time = 0)
+ if(!W.is_wrench())
return FALSE
if(panel_open)
return FALSE // Close panel first!
- playsound(loc, W.usesound, 50, 1)
+ playsound(loc, W.usesound, 50, 1)
var/actual_time = W.toolspeed * time
if(actual_time != 0)
user.visible_message( \
@@ -342,48 +344,48 @@ Class Procs:
update_icon()
return TRUE
-/obj/machinery/proc/default_deconstruction_crowbar(var/mob/user, var/obj/item/weapon/crowbar/C)
- if(!istype(C))
+/obj/machinery/proc/default_deconstruction_crowbar(var/mob/user, var/obj/item/C)
+ if(!C.is_crowbar())
return 0
if(!panel_open)
return 0
. = dismantle()
-/obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/obj/item/weapon/screwdriver/S)
- if(!istype(S))
+/obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/obj/item/S)
+ if(!S.is_screwdriver())
return 0
playsound(src, S.usesound, 50, 1)
panel_open = !panel_open
- user << "You [panel_open ? "open" : "close"] the maintenance hatch of [src]."
+ to_chat(user, "You [panel_open ? "open" : "close"] the maintenance hatch of [src].")
update_icon()
return 1
-/obj/machinery/proc/computer_deconstruction_screwdriver(var/mob/user, var/obj/item/weapon/screwdriver/S)
- if(!istype(S))
+/obj/machinery/proc/computer_deconstruction_screwdriver(var/mob/user, var/obj/item/S)
+ if(!S.is_screwdriver())
return 0
if(!circuit)
return 0
- user << "You start disconnecting the monitor."
+ to_chat(user, "You start disconnecting the monitor.")
playsound(src, S.usesound, 50, 1)
if(do_after(user, 20 * S.toolspeed))
if(stat & BROKEN)
- user << "The broken glass falls out."
+ to_chat(user, "The broken glass falls out.")
new /obj/item/weapon/material/shard(src.loc)
else
- user << "You disconnect the monitor."
+ to_chat(user, "You disconnect the monitor.")
. = dismantle()
-/obj/machinery/proc/alarm_deconstruction_screwdriver(var/mob/user, var/obj/item/weapon/screwdriver/S)
- if(!istype(S))
+/obj/machinery/proc/alarm_deconstruction_screwdriver(var/mob/user, var/obj/item/S)
+ if(!S.is_screwdriver())
return 0
playsound(src, S.usesound, 50, 1)
panel_open = !panel_open
- user << "The wires have been [panel_open ? "exposed" : "unexposed"]"
+ to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"]")
update_icon()
return 1
-/obj/machinery/proc/alarm_deconstruction_wirecutters(var/mob/user, var/obj/item/weapon/wirecutters/W)
- if(!istype(W))
+/obj/machinery/proc/alarm_deconstruction_wirecutters(var/mob/user, var/obj/item/W)
+ if(!W.is_wirecutter())
return 0
if(!panel_open)
return 0
diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm
index 8022235736..d21d751e7e 100644
--- a/code/game/machinery/magnet.dm
+++ b/code/game/machinery/magnet.dm
@@ -213,7 +213,7 @@
..()
if(autolink)
- for(var/obj/machinery/magnetic_module/M in world)
+ for(var/obj/machinery/magnetic_module/M in machines)
if(M.freq == frequency && M.code == code)
magnets.Add(M)
@@ -229,7 +229,7 @@
/obj/machinery/magnetic_controller/process()
if(magnets.len == 0 && autolink)
- for(var/obj/machinery/magnetic_module/M in world)
+ for(var/obj/machinery/magnetic_module/M in machines)
if(M.freq == frequency && M.code == code)
magnets.Add(M)
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index 4d1affb3a0..1d13a36c3a 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -38,7 +38,7 @@
if(panel_open)
var/input = sanitize(input(usr, "What id would you like to give this conveyor?", "Multitool-Conveyor interface", id))
if(!input)
- usr << "No input found please hang up and try your call again."
+ to_chat(usr, "No input found please hang up and try your call again.")
return
id = input
return
@@ -55,7 +55,7 @@
O_limit++
if(O_limit >= 20)
for(var/mob/M in hearers(src, null))
- M << "The mass driver lets out a screech, it mustn't be able to handle any more items."
+ to_chat(M, "The mass driver lets out a screech, it mustn't be able to handle any more items.")
break
use_power(500)
spawn(0)
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index 7e472c8eca..6d4453d1f2 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -72,7 +72,7 @@ var/global/list/navbeacons = list() // no I don't like putting this in, but it w
if(!T.is_plating())
return // prevent intraction when T-scanner revealed
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
open = !open
playsound(src, I.usesound, 50, 1)
user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.")
@@ -83,12 +83,12 @@ var/global/list/navbeacons = list() // no I don't like putting this in, but it w
if(open)
if(allowed(user))
locked = !locked
- user << "Controls are now [locked ? "locked." : "unlocked."]"
+ to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]")
else
- user << "Access denied."
+ to_chat(user, "Access denied.")
updateDialog()
else
- user << "You must open the cover first!"
+ to_chat(user, "You must open the cover first!")
return
/obj/machinery/navbeacon/attack_ai(var/mob/user)
@@ -107,7 +107,7 @@ var/global/list/navbeacons = list() // no I don't like putting this in, but it w
return // prevent intraction when T-scanner revealed
if(!open && !ai) // can't alter controls if not open, unless you're an AI
- user << "The beacon's control cover is closed."
+ to_chat(user, "The beacon's control cover is closed.")
return
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index b9bd4a6855..048c1563b9 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -125,6 +125,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
desc = "A standard newsfeed handler for use on commercial space stations. All the news you absolutely have no use for, in one place!"
icon = 'icons/obj/terminals.dmi'
icon_state = "newscaster_normal"
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
var/isbroken = 0 //1 if someone banged it with something heavy
var/ispowered = 1 //starts powered, changes with power_change()
//var/list/datum/feed_channel/channel_list = list() //This list will contain the names of the feed channels. Each name will refer to a data region where the messages of the feed channels are stored.
diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm
index 018cf75f53..53c4dcdd28 100644
--- a/code/game/machinery/nuclear_bomb.dm
+++ b/code/game/machinery/nuclear_bomb.dm
@@ -55,30 +55,30 @@ var/bomb_set
return
/obj/machinery/nuclearbomb/attackby(obj/item/weapon/O as obj, mob/user as mob)
- if(istype(O, /obj/item/weapon/screwdriver))
+ if(O.is_screwdriver())
playsound(src, O.usesound, 50, 1)
add_fingerprint(user)
if(auth)
if(opened == 0)
opened = 1
overlays += image(icon, "npanel_open")
- user << "You unscrew the control panel of [src]."
+ to_chat(user, "You unscrew the control panel of [src].")
else
opened = 0
overlays -= image(icon, "npanel_open")
- user << "You screw the control panel of [src] back on."
+ to_chat(user, "You screw the control panel of [src] back on.")
else
if(opened == 0)
- user << "The [src] emits a buzzing noise, the panel staying locked in."
+ to_chat(user, "The [src] emits a buzzing noise, the panel staying locked in.")
if(opened == 1)
opened = 0
overlays -= image(icon, "npanel_open")
- user << "You screw the control panel of [src] back on."
+ to_chat(user, "You screw the control panel of [src] back on.")
flick("nuclearbombc", src)
return
- if(istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/device/multitool))
+ if(O.is_wirecutter() || istype(O, /obj/item/device/multitool))
if(opened == 1)
nukehack_win(user)
return
@@ -99,7 +99,7 @@ var/bomb_set
var/obj/item/weapon/weldingtool/WT = O
if(!WT.isOn()) return
if(WT.get_fuel() < 5) // uses up 5 fuel.
- user << "You need more fuel to complete this task."
+ to_chat(user, "You need more fuel to complete this task.")
return
user.visible_message("[user] starts cutting loose the anchoring bolt covers on [src].", "You start cutting loose the anchoring bolt covers with [O]...")
@@ -111,7 +111,7 @@ var/bomb_set
return
if(1)
- if(istype(O,/obj/item/weapon/crowbar))
+ if(O.is_crowbar())
user.visible_message("[user] starts forcing open the bolt covers on [src].", "You start forcing open the anchoring bolt covers with [O]...")
playsound(src, O.usesound, 50, 1)
@@ -127,7 +127,7 @@ var/bomb_set
var/obj/item/weapon/weldingtool/WT = O
if(!WT.isOn()) return
if(WT.get_fuel() < 5) // uses up 5 fuel.
- user << "You need more fuel to complete this task."
+ to_chat(user, "You need more fuel to complete this task.")
return
user.visible_message("[user] starts cutting apart the anchoring system sealant on [src].", "You start cutting apart the anchoring system's sealant with [O]...")
@@ -139,7 +139,7 @@ var/bomb_set
return
if(3)
- if(istype(O,/obj/item/weapon/wrench))
+ if(O.is_wrench())
user.visible_message("[user] begins unwrenching the anchoring bolts on [src].", "You begin unwrenching the anchoring bolts...")
playsound(src, O.usesound, 50, 1)
@@ -150,7 +150,7 @@ var/bomb_set
return
if(4)
- if(istype(O,/obj/item/weapon/crowbar))
+ if(O.is_crowbar())
user.visible_message("[user] begins lifting [src] off of the anchors.", "You begin lifting the device off the anchors...")
playsound(src, O.usesound, 50, 1)
@@ -165,7 +165,7 @@ var/bomb_set
/obj/machinery/nuclearbomb/attack_hand(mob/user as mob)
if(extended)
if(!ishuman(user))
- usr << "You don't have the dexterity to do this!"
+ to_chat(user, "You don't have the dexterity to do this!")
return 1
user.set_machine(src)
@@ -219,14 +219,14 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob)
if(!usr.canmove || usr.stat || usr.restrained())
return
if(!ishuman(usr))
- usr << "You don't have the dexterity to do this!"
+ to_chat(usr, "You don't have the dexterity to do this!")
return 1
if(deployable)
- usr << "You close several panels to make [src] undeployable."
+ to_chat(usr, "You close several panels to make [src] undeployable.")
deployable = 0
else
- usr << "You adjust some panels to make [src] deployable."
+ to_chat(usr, "You adjust some panels to make [src] deployable.")
deployable = 1
return
@@ -240,10 +240,10 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob)
var/temp_wire = href_list["wire"]
if(href_list["act"] == "pulse")
if(!istype(usr.get_active_hand(), /obj/item/device/multitool))
- usr << "You need a multitool!"
+ to_chat(usr, "You need a multitool!")
else
if(wires[temp_wire])
- usr << "You can't pulse a cut wire."
+ to_chat(usr, "You can't pulse a cut wire.")
else
if(light_wire == temp_wire)
lighthack = !lighthack
@@ -262,8 +262,9 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob)
else
visible_message("The [src] emits a quiet whirling noise!")
if(href_list["act"] == "wire")
- if(!istype(usr.get_active_hand(), /obj/item/weapon/wirecutters))
- usr << "You need wirecutters!"
+ var/obj/item/I = usr.get_active_hand()
+ if(!I.is_wirecutter())
+ to_chat(usr, "You need wirecutters!")
else
wires[temp_wire] = !wires[temp_wire]
if(safety_wire == temp_wire)
@@ -314,7 +315,7 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob)
if(timing == -1.0)
return
if(safety)
- usr << "The safety is still on."
+ to_chat(usr, "The safety is still on.")
return
timing = !(timing)
if(timing)
diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm
index 36db3f83f3..0980dc60ed 100644
--- a/code/game/machinery/oxygen_pump.dm
+++ b/code/game/machinery/oxygen_pump.dm
@@ -128,7 +128,7 @@
return 1
/obj/machinery/oxygen_pump/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
stat ^= MAINT
user.visible_message("\The [user] [stat & MAINT ? "opens" : "closes"] \the [src].", "You [stat & MAINT ? "open" : "close"] \the [src].")
if(stat & MAINT)
diff --git a/code/game/machinery/pda_multicaster.dm b/code/game/machinery/pda_multicaster.dm
index fde455ae51..3388de0c31 100644
--- a/code/game/machinery/pda_multicaster.dm
+++ b/code/game/machinery/pda_multicaster.dm
@@ -46,9 +46,9 @@
icon_state = "[initial(icon_state)]-p"
/obj/machinery/pda_multicaster/attackby(obj/item/I, mob/user)
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
default_deconstruction_screwdriver(user, I)
- else if(istype(I, /obj/item/weapon/crowbar))
+ else if(I.is_crowbar())
default_deconstruction_crowbar(user, I)
else
..()
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index ca09d3de58..0482e2f242 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -166,11 +166,11 @@ Buildable meters
return ..()
/obj/item/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
- if(iswrench(W))
+ if(W.is_wrench())
return wrench_act(user, W)
return ..()
-/obj/item/pipe/proc/wrench_act(var/mob/living/user, var/obj/item/weapon/wrench/W)
+/obj/item/pipe/proc/wrench_act(var/mob/living/user, var/obj/item/weapon/tool/wrench/W)
if(!isturf(loc))
return TRUE
@@ -255,11 +255,11 @@ Buildable meters
var/piping_layer = PIPING_LAYER_DEFAULT
/obj/item/pipe_meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
- if(iswrench(W))
+ if(W.is_wrench())
return wrench_act(user, W)
return ..()
-/obj/item/pipe_meter/proc/wrench_act(var/mob/living/user, var/obj/item/weapon/wrench/W)
+/obj/item/pipe_meter/proc/wrench_act(var/mob/living/user, var/obj/item/weapon/tool/wrench/W)
var/obj/machinery/atmospherics/pipe/pipe
for(var/obj/machinery/atmospherics/pipe/P in loc)
if(P.piping_layer == piping_layer)
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index 6675a5ca15..d863e57b90 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -74,7 +74,7 @@
user.drop_item()
qdel(W)
return
- else if (istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
if (unwrenched==0)
playsound(src, W.usesound, 50, 1)
user << "You begin to unfasten \the [src] from the floor..."
diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm
index 65656929de..b51fbd4cc0 100644
--- a/code/game/machinery/pipe/pipelayer.dm
+++ b/code/game/machinery/pipe/pipelayer.dm
@@ -13,7 +13,7 @@
var/max_metal = 50 // Max capacity for internal metal storage
var/metal = 0 // Current amount in internal metal storage
var/pipe_cost = 0.25 // Cost in steel for each pipe.
- var/obj/item/weapon/wrench/W // Internal wrench used for wrenching down the pipes
+ var/obj/item/weapon/tool/wrench/W // Internal wrench used for wrenching down the pipes
var/list/Pipes = list(
"regular pipes" = /obj/machinery/atmospherics/pipe/simple,
"scrubbers pipes" = /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -57,7 +57,7 @@
return
if(panel_open)
if(metal < 1)
- user << "\The [src] is empty."
+ to_chat(user, "\The [src] is empty.")
return
var/answer = alert(user, "Do you want to eject all the metal in \the [src]?", , "Yes","No")
if(answer == "Yes")
@@ -66,7 +66,7 @@
"You remove [amount_ejected] sheet\s of [DEFAULT_WALL_MATERIAL] from \the [src].")
return
if(!metal && !on)
- user << "\The [src] doesn't work without metal."
+ to_chat(user, "\The [src] doesn't work without metal.")
return
on = !on
old_turf = get_turf(src)
@@ -81,33 +81,33 @@
return
if(default_part_replacement(user, W))
return
- if (!panel_open && iswrench(W))
+ if (!panel_open && W.is_wrench())
P_type_t = input("Choose pipe type", "Pipe type") as null|anything in Pipes
P_type = Pipes[P_type_t]
user.visible_message("[user] has set \the [src] to manufacture [P_type_t].", "You set \the [src] to manufacture [P_type_t].")
return
- if(!panel_open && iscrowbar(W))
+ if(!panel_open && W.is_crowbar())
a_dis = !a_dis
user.visible_message("[user] has [!a_dis?"de":""]activated auto-dismantling.", "You [!a_dis?"de":""]activate auto-dismantling.")
return
if(istype(W, /obj/item/pipe))
// NOTE - We must check for matter, otherwise the (free) pipe dispenser can be used to get infinite steel.
if(!W.matter || W.matter[DEFAULT_WALL_MATERIAL] < pipe_cost * SHEET_MATERIAL_AMOUNT)
- user << "\The [W] doesn't contain enough [DEFAULT_WALL_MATERIAL] to recycle."
+ to_chat(user, "\The [W] doesn't contain enough [DEFAULT_WALL_MATERIAL] to recycle.")
else if(metal + pipe_cost > max_metal)
- user << "\The [src] is full."
+ to_chat(user, "\The [src] is full.")
else
user.drop_from_inventory(W)
metal += pipe_cost
- usr << "You recycle \the [W]."
+ to_chat(user, "You recycle \the [W].")
qdel(W)
return
if(istype(W, /obj/item/stack/material) && W.get_material_name() == DEFAULT_WALL_MATERIAL)
var/result = load_metal(W)
if(isnull(result))
- user << "Unable to load [W] - no metal found."
+ to_chat(user, "Unable to load [W] - no metal found.")
else if(!result)
- user << "\The [src] is full."
+ to_chat(user, "\The [src] is full.")
else
user.visible_message("[user] has loaded metal into \the [src].", "You load metal into \the [src]")
return
@@ -116,7 +116,7 @@
/obj/machinery/pipelayer/examine(mob/user)
..()
- user << "\The [src] has [metal] sheet\s, is set to produce [P_type_t], and auto-dismantling is [!a_dis?"de":""]activated."
+ to_chat(user, "\The [src] has [metal] sheet\s, is set to produce [P_type_t], and auto-dismantling is [!a_dis?"de":""]activated.")
/obj/machinery/pipelayer/proc/reset()
on = 0
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index de1d8fcb54..5ae3608271 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -47,6 +47,7 @@
var/check_synth = 0 //if active, will shoot at anything not an AI or cyborg
var/check_all = 0 //If active, will fire on anything, including synthetics.
var/ailock = 0 // AI cannot use this
+ var/faction = null //if set, will not fire at people in the same faction for any reason.
var/attacked = 0 //if set to 1, the turret gets pissed off and shoots at people nearby (unless they have sec access!)
@@ -80,6 +81,11 @@
lethal = 1
installation = /obj/item/weapon/gun/energy/laser
+/obj/machinery/porta_turret/stationary/syndie // Generic turrets for POIs that need to not shoot their buddies.
+ enabled = TRUE
+ check_all = TRUE
+ faction = "syndicate" // Make sure this equals the faction that the mobs in the POI have or they will fight each other.
+
/obj/machinery/porta_turret/ai_defense
name = "defense turret"
desc = "This variant appears to be much more durable."
@@ -105,6 +111,13 @@
stat = BROKEN
can_salvage = FALSE // So you need to actually kill a turret to get the alien gun.
+/obj/machinery/porta_turret/poi //These are always angry
+ enabled = TRUE
+ lethal = TRUE
+ ailock = TRUE
+ check_all = TRUE
+ can_salvage = FALSE // So you can't just twoshot a turret and get a fancy gun
+
/obj/machinery/porta_turret/New()
..()
req_access.Cut()
@@ -218,11 +231,11 @@ var/list/turret_icons
/obj/machinery/porta_turret/proc/isLocked(mob/user)
if(ailock && issilicon(user))
- user << "There seems to be a firewall preventing you from accessing this device."
+ to_chat(user, "There seems to be a firewall preventing you from accessing this device.")
return 1
if(locked && !issilicon(user))
- user << "Access denied."
+ to_chat(user, "Access denied.")
return 1
return 0
@@ -271,14 +284,14 @@ var/list/turret_icons
/obj/machinery/porta_turret/CanUseTopic(var/mob/user)
if(HasController())
- user << "Turrets can only be controlled using the assigned turret controller."
+ to_chat(user, "Turrets can only be controlled using the assigned turret controller.")
return STATUS_CLOSE
if(isLocked(user))
return STATUS_CLOSE
if(!anchored)
- usr << "\The [src] has to be secured first!"
+ to_chat(user, "\The [src] has to be secured first!")
return STATUS_CLOSE
return ..()
@@ -322,13 +335,13 @@ var/list/turret_icons
/obj/machinery/porta_turret/attackby(obj/item/I, mob/user)
if(stat & BROKEN)
- if(istype(I, /obj/item/weapon/crowbar))
+ if(I.is_crowbar())
//If the turret is destroyed, you can remove it with a crowbar to
//try and salvage its components
- user << "You begin prying the metal coverings off."
+ to_chat(user, "You begin prying the metal coverings off.")
if(do_after(user, 20))
if(can_salvage && prob(70))
- user << "You remove the turret and salvage some components."
+ to_chat(user, "You remove the turret and salvage some components.")
if(installation)
var/obj/item/weapon/gun/energy/Gun = new installation(loc)
Gun.power_supply.charge = gun_charge
@@ -338,18 +351,18 @@ var/list/turret_icons
if(prob(50))
new /obj/item/device/assembly/prox_sensor(loc)
else
- user << "You remove the turret but did not manage to salvage anything."
+ to_chat(user, "You remove the turret but did not manage to salvage anything.")
qdel(src) // qdel
- else if((istype(I, /obj/item/weapon/wrench)))
+ else if(I.is_wrench())
if(enabled || raised)
- user << "You cannot unsecure an active turret!"
+ to_chat(user, "You cannot unsecure an active turret!")
return
if(wrenching)
- user << "Someone is already [anchored ? "un" : ""]securing the turret!"
+ to_chat(user, "Someone is already [anchored ? "un" : ""]securing the turret!")
return
if(!anchored && isinspace())
- user << "Cannot secure turrets in space!"
+ to_chat(user, "Cannot secure turrets in space!")
return
user.visible_message(\
@@ -364,11 +377,11 @@ var/list/turret_icons
playsound(loc, I.usesound, 100, 1)
anchored = 1
update_icon()
- user << "You secure the exterior bolts on the turret."
+ to_chat(user, "You secure the exterior bolts on the turret.")
else if(anchored)
playsound(loc, I.usesound, 100, 1)
anchored = 0
- user << "You unsecure the exterior bolts on the turret."
+ to_chat(user, "You unsecure the exterior bolts on the turret.")
update_icon()
wrenching = 0
@@ -376,10 +389,10 @@ var/list/turret_icons
//Behavior lock/unlock mangement
if(allowed(user))
locked = !locked
- user << "Controls are now [locked ? "locked" : "unlocked"]."
+ to_chat(user, "Controls are now [locked ? "locked" : "unlocked"].")
updateUsrDialog()
else
- user << "Access denied."
+ to_chat(user, "Access denied.")
else
//if the turret was attacked with the intention of harming it:
@@ -409,7 +422,7 @@ var/list/turret_icons
if(!emagged)
//Emagging the turret makes it go bonkers and stun everyone. It also makes
//the turret shoot much, much faster.
- user << "You short out [src]'s threat assessment circuits."
+ to_chat(user, "You short out [src]'s threat assessment circuits.")
visible_message("[src] hums oddly...")
emagged = 1
iconholder = 1
@@ -545,6 +558,9 @@ var/list/turret_icons
if(!L)
return TURRET_NOT_TARGET
+ if(faction && L.faction == faction)
+ return TURRET_NOT_TARGET
+
if(!emagged && issilicon(L) && check_all == 0) // Don't target silica, unless told to neutralize everything.
return TURRET_NOT_TARGET
@@ -761,16 +777,16 @@ var/list/turret_icons
//this is a bit unwieldy but self-explanatory
switch(build_step)
if(0) //first step
- if(istype(I, /obj/item/weapon/wrench) && !anchored)
+ if(I.is_wrench() && !anchored)
playsound(loc, I.usesound, 100, 1)
- user << "You secure the external bolts."
+ to_chat(user, "You secure the external bolts.")
anchored = 1
build_step = 1
return
- else if(istype(I, /obj/item/weapon/crowbar) && !anchored)
+ else if(I.is_crowbar() && !anchored)
playsound(loc, I.usesound, 75, 1)
- user << "You dismantle the turret construction."
+ to_chat(user, "You dismantle the turret construction.")
new /obj/item/stack/material/steel(loc, 5)
qdel(src)
return
@@ -779,24 +795,24 @@ var/list/turret_icons
if(istype(I, /obj/item/stack/material) && I.get_material_name() == DEFAULT_WALL_MATERIAL)
var/obj/item/stack/M = I
if(M.use(2))
- user << "You add some metal armor to the interior frame."
+ to_chat(user, "You add some metal armor to the interior frame.")
build_step = 2
icon_state = "turret_frame2"
else
- user << "You need two sheets of metal to continue construction."
+ to_chat(user, "You need two sheets of metal to continue construction.")
return
- else if(istype(I, /obj/item/weapon/wrench))
+ else if(I.is_wrench())
playsound(loc, I.usesound, 75, 1)
- user << "You unfasten the external bolts."
+ to_chat(user, "You unfasten the external bolts.")
anchored = 0
build_step = 0
return
if(2)
- if(istype(I, /obj/item/weapon/wrench))
+ if(I.is_wrench())
playsound(loc, I.usesound, 100, 1)
- user << "You bolt the metal armor into place."
+ to_chat(user, "You bolt the metal armor into place.")
build_step = 3
return
@@ -805,14 +821,14 @@ var/list/turret_icons
if(!WT.isOn())
return
if(WT.get_fuel() < 5) //uses up 5 fuel.
- user << "You need more fuel to complete this task."
+ to_chat(user, "You need more fuel to complete this task.")
return
playsound(loc, I.usesound, 50, 1)
if(do_after(user, 20 * I.toolspeed))
if(!src || !WT.remove_fuel(5, user)) return
build_step = 1
- user << "You remove the turret's interior metal armor."
+ to_chat(user, "You remove the turret's interior metal armor.")
new /obj/item/stack/material/steel(loc, 2)
return
@@ -823,20 +839,20 @@ var/list/turret_icons
return
var/obj/item/weapon/gun/energy/E = I //typecasts the item to an energy gun
if(!user.unEquip(I))
- user << "\the [I] is stuck to your hand, you cannot put it in \the [src]"
+ to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]")
return
installation = I.type //installation becomes I.type
gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge
- user << "You add [I] to the turret."
+ to_chat(user, "You add [I] to the turret.")
target_type = /obj/machinery/porta_turret
build_step = 4
qdel(I) //delete the gun :(
return
- else if(istype(I, /obj/item/weapon/wrench))
+ else if(I.is_wrench())
playsound(loc, I.usesound, 100, 1)
- user << "You remove the turret's metal armor bolts."
+ to_chat(user, "You remove the turret's metal armor bolts.")
build_step = 2
return
@@ -844,19 +860,19 @@ var/list/turret_icons
if(isprox(I))
build_step = 5
if(!user.unEquip(I))
- user << "\the [I] is stuck to your hand, you cannot put it in \the [src]"
+ to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]")
return
- user << "You add the prox sensor to the turret."
+ to_chat(user, "You add the prox sensor to the turret.")
qdel(I)
return
//attack_hand() removes the gun
if(5)
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
playsound(loc, I.usesound, 100, 1)
build_step = 6
- user << "You close the internal access hatch."
+ to_chat(user, "You close the internal access hatch.")
return
//attack_hand() removes the prox sensor
@@ -865,16 +881,16 @@ var/list/turret_icons
if(istype(I, /obj/item/stack/material) && I.get_material_name() == DEFAULT_WALL_MATERIAL)
var/obj/item/stack/M = I
if(M.use(2))
- user << "You add some metal armor to the exterior frame."
+ to_chat(user, "You add some metal armor to the exterior frame.")
build_step = 7
else
- user << "You need two sheets of metal to continue construction."
+ to_chat(user, "You need two sheets of metal to continue construction.")
return
- else if(istype(I, /obj/item/weapon/screwdriver))
+ else if(I.is_screwdriver())
playsound(loc, I.usesound, 100, 1)
build_step = 5
- user << "You open the internal access hatch."
+ to_chat(user, "You open the internal access hatch.")
return
if(7)
@@ -882,14 +898,14 @@ var/list/turret_icons
var/obj/item/weapon/weldingtool/WT = I
if(!WT.isOn()) return
if(WT.get_fuel() < 5)
- user << "You need more fuel to complete this task."
+ to_chat(user, "You need more fuel to complete this task.")
playsound(loc, WT.usesound, 50, 1)
if(do_after(user, 30 * WT.toolspeed))
if(!src || !WT.remove_fuel(5, user))
return
build_step = 8
- user << "You weld the turret's armor down."
+ to_chat(user, "You weld the turret's armor down.")
//The final step: create a full turret
var/obj/machinery/porta_turret/Turret = new target_type(loc)
@@ -901,9 +917,9 @@ var/list/turret_icons
qdel(src) // qdel
- else if(istype(I, /obj/item/weapon/crowbar))
+ else if(I.is_crowbar())
playsound(loc, I.usesound, 75, 1)
- user << "You pry off the turret's exterior armor."
+ to_chat(user, "You pry off the turret's exterior armor.")
new /obj/item/stack/material/steel(loc, 2)
build_step = 6
return
@@ -932,10 +948,10 @@ var/list/turret_icons
Gun.update_icon()
installation = null
gun_charge = 0
- user << "You remove [Gun] from the turret frame."
+ to_chat(user, "You remove [Gun] from the turret frame.")
if(5)
- user << "You remove the prox sensor from the turret frame."
+ to_chat(user, "You remove the prox sensor from the turret frame.")
new /obj/item/device/assembly/prox_sensor(loc)
build_step = 4
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index d8ad21eb21..ddd50a8f50 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -41,41 +41,18 @@ obj/machinery/recharger
return
if(istype(G, /obj/item/weapon/gun/energy))
var/obj/item/weapon/gun/energy/E = G
- if(!E.power_supply)
- to_chat(user, "Your gun has no power cell.")
- return
if(E.self_recharge)
to_chat(user, "Your gun has no recharge port.")
return
- if(istype(G, /obj/item/weapon/gun/energy/staff))
+ if(!G.get_cell())
+ to_chat(user, "This device does not have a battery installed.")
return
- if(istype(G, /obj/item/device/flashlight))
- var/obj/item/device/flashlight/F = G
- if(!F.power_use)
- return
- if(!F.cell)
- return
- if(istype(G, /obj/item/device/laptop))
- var/obj/item/device/laptop/L = G
- if(!L.stored_computer.battery)
- user << "There's no battery in it!"
- return
- if(istype(G, /obj/item/device/electronic_assembly))
- var/obj/item/device/electronic_assembly/assembly = G
- if(!assembly.battery)
- to_chat(user, "The assembly doesn't have a power cell.")
- return
- if(istype(G, /obj/item/weapon/weldingtool/electric))
- var/obj/item/weapon/weldingtool/electric/welder = G
- if(!welder.power_supply)
- to_chat(user, "Your welder has no power cell.")
- return
user.drop_item()
G.loc = src
charging = G
update_icon()
- else if(portable && istype(G, /obj/item/weapon/wrench))
+ else if(portable && G.is_wrench())
if(charging)
to_chat(user, "Remove [charging] first!")
return
@@ -109,71 +86,8 @@ obj/machinery/recharger
update_use_power(1)
icon_state = icon_state_idle
else
- if(istype(charging, /obj/item/weapon/gun/energy))
- var/obj/item/weapon/gun/energy/E = charging
- if(!E.power_supply.fully_charged())
- icon_state = icon_state_charging
- E.power_supply.give(active_power_usage*CELLRATE)
- update_use_power(2)
- else
- icon_state = icon_state_charged
- update_use_power(1)
- return
-
- if(istype(charging, /obj/item/weapon/gun/magnetic))
- var/obj/item/weapon/gun/magnetic/M = charging
- if(!M.cell.fully_charged())
- icon_state = icon_state_charging
- M.cell.give(active_power_usage*CELLRATE)
- update_use_power(2)
- else
- icon_state = icon_state_charged
- update_use_power(1)
- return
-
- if(istype(charging, /obj/item/weapon/melee/baton))
- var/obj/item/weapon/melee/baton/B = charging
- if(B.bcell)
- if(!B.bcell.fully_charged())
- icon_state = icon_state_charging
- B.bcell.give(active_power_usage*CELLRATE)
- update_use_power(2)
- else
- icon_state = icon_state_charged
- update_use_power(1)
- else
- icon_state = icon_state_idle
- update_use_power(1)
- return
-
- if(istype(charging, /obj/item/device/laptop))
- var/obj/item/device/laptop/L = charging
- if(!L.stored_computer.battery.fully_charged())
- icon_state = icon_state_charging
- L.stored_computer.battery.give(active_power_usage*CELLRATE)
- update_use_power(2)
- else
- icon_state = icon_state_charged
- update_use_power(1)
- return
-
- if(istype(charging, /obj/item/device/flashlight))
- var/obj/item/device/flashlight/F = charging
- if(F.cell)
- if(!F.cell.fully_charged())
- icon_state = icon_state_charging
- F.cell.give(active_power_usage*CELLRATE)
- update_use_power(2)
- else
- icon_state = icon_state_charged
- update_use_power(1)
- else
- icon_state = icon_state_idle
- update_use_power(1)
- return
-
- if(istype(charging, /obj/item/weapon/cell))
- var/obj/item/weapon/cell/C = charging
+ var/obj/item/weapon/cell/C = charging.get_cell()
+ if(istype(C))
if(!C.fully_charged())
icon_state = icon_state_charging
C.give(active_power_usage*CELLRATE)
@@ -181,48 +95,17 @@ obj/machinery/recharger
else
icon_state = icon_state_charged
update_use_power(1)
- return
-
- if(istype(charging, /obj/item/device/electronic_assembly))
- var/obj/item/device/electronic_assembly/assembly = charging
- if(assembly.battery)
- if(!assembly.battery.fully_charged())
- icon_state = icon_state_charging
- assembly.battery.give(active_power_usage*CELLRATE)
- update_use_power(2)
- else
- icon_state = icon_state_charged
- update_use_power(1)
- else
- icon_state = icon_state_idle
- update_use_power(1)
- return
-
- if(istype(charging, /obj/item/weapon/weldingtool/electric))
- var/obj/item/weapon/weldingtool/electric/C = charging
- if(!C.power_supply.fully_charged())
- icon_state = icon_state_charging
- C.power_supply.give(active_power_usage*CELLRATE)
- update_use_power(2)
- else
- icon_state = icon_state_charged
- update_use_power(1)
- return
/obj/machinery/recharger/emp_act(severity)
if(stat & (NOPOWER|BROKEN) || !anchored)
..(severity)
return
- if(istype(charging, /obj/item/weapon/gun/energy))
- var/obj/item/weapon/gun/energy/E = charging
- if(E.power_supply)
- E.power_supply.emp_act(severity)
+ if(charging)
+ var/obj/item/weapon/cell/C = charging.get_cell()
+ if(istype(C))
+ C.emp_act(severity)
- else if(istype(charging, /obj/item/weapon/melee/baton))
- var/obj/item/weapon/melee/baton/B = charging
- if(B.bcell)
- B.bcell.charge = 0
..(severity)
/obj/machinery/recharger/update_icon() //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
@@ -231,11 +114,12 @@ obj/machinery/recharger
else
icon_state = icon_state_idle
-
/obj/machinery/recharger/wallcharger
name = "wall recharger"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "wrecharger0"
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
active_power_usage = 25000 //25 kW , It's more specialized than the standalone recharger (guns, batons, and flashlights only) so make it more powerful
allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/gun/magnetic, /obj/item/weapon/melee/baton, /obj/item/device/flashlight, /obj/item/weapon/cell/device)
icon_state_charged = "wrecharger2"
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 692e76bf5a..f702f3cf25 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -126,7 +126,7 @@
/obj/machinery/recharge_station/examine(mob/user)
..(user)
- user << "The charge meter reads: [round(chargepercentage())]%"
+ to_chat(user, "The charge meter reads: [round(chargepercentage())]%")
/obj/machinery/recharge_station/proc/chargepercentage()
if(!cell)
@@ -292,7 +292,7 @@
if(usr.incapacitated() || !isliving(usr))
return
-
+
go_in(usr)
/obj/machinery/recharge_station/ghost_pod_recharger
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 6bf06e5e2f..473f3dfd77 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -28,6 +28,8 @@ var/list/obj/machinery/requests_console/allConsoles = list()
anchored = 1
icon = 'icons/obj/terminals.dmi'
icon_state = "req_comp0"
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
circuit = /obj/item/weapon/circuitboard/request
var/department = "Unknown" //The list of all departments on the station (Determined from this variable on each unit) Set this to the same thing if you want several consoles in one department
var/list/message_log = list() //List of all messages
@@ -166,7 +168,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
var/log_msg = message
var/pass = 0
screen = RCS_SENTFAIL
- for (var/obj/machinery/message_server/MS in world)
+ for (var/obj/machinery/message_server/MS in machines)
if(!MS.active) continue
MS.send_rc_message(ckey(href_list["department"]),department,log_msg,msgStamped,msgVerified,priority)
pass = 1
@@ -235,7 +237,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
announcement.announcer = ID.assignment ? "[ID.assignment] [ID.registered_name]" : ID.registered_name
else
reset_message()
- user << "You are not authorized to send announcements."
+ to_chat(user, "You are not authorized to send announcements.")
updateUsrDialog()
if(istype(O, /obj/item/weapon/stamp))
if(inoperable(MAINT)) return
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index ec0af28d58..4c447e91f3 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -30,11 +30,11 @@
/obj/machinery/space_heater/examine(mob/user)
..(user)
- user << "The heater is [on ? "on" : "off"] and the hatch is [panel_open ? "open" : "closed"]."
+ to_chat(user, "The heater is [on ? "on" : "off"] and the hatch is [panel_open ? "open" : "closed"].")
if(panel_open)
- user << "The power cell is [cell ? "installed" : "missing"]."
+ to_chat(user, "The power cell is [cell ? "installed" : "missing"].")
else
- user << "The charge meter reads [cell ? round(cell.percent(),1) : 0]%"
+ to_chat(user, "The charge meter reads [cell ? round(cell.percent(),1) : 0]%")
return
/obj/machinery/space_heater/powered()
@@ -54,7 +54,7 @@
if(istype(I, /obj/item/weapon/cell))
if(panel_open)
if(cell)
- user << "There is already a power cell inside."
+ to_chat(user, "There is already a power cell inside.")
return
else
// insert cell
@@ -68,9 +68,9 @@
user.visible_message("[user] inserts a power cell into [src].", "You insert the power cell into [src].")
power_change()
else
- user << "The hatch must be open to insert a power cell."
+ to_chat(user, "The hatch must be open to insert a power cell.")
return
- else if(istype(I, /obj/item/weapon/screwdriver))
+ else if(I.is_screwdriver())
panel_open = !panel_open
playsound(src, I.usesound, 50, 1)
user.visible_message("[user] [panel_open ? "opens" : "closes"] the hatch on the [src].", "You [panel_open ? "open" : "close"] the hatch on the [src].")
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 7c0ca00f1a..5cb6b0ba06 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -207,14 +207,14 @@
if(!protected)
playsound(src.loc, "sparks", 75, 1, -1)
- user << "You try to touch the controls but you get zapped. There must be a short circuit somewhere."
+ to_chat(user, "You try to touch the controls but you get zapped. There must be a short circuit somewhere.")
return*/
else //welp, the guy is protected, we can continue
if(issuperUV)
- user << "You slide the dial back towards \"185nm\"."
+ to_chat(user, "You slide the dial back towards \"185nm\".")
issuperUV = 0
else
- user << "You crank the dial all the way up to \"15nm\"."
+ to_chat(user, "You crank the dial all the way up to \"15nm\".")
issuperUV = 1
return
@@ -233,10 +233,10 @@
if(!protected)
playsound(src.loc, "sparks", 75, 1, -1)
- user << "You try to touch the controls but you get zapped. There must be a short circuit somewhere."
+ to_chat(user, "You try to touch the controls but you get zapped. There must be a short circuit somewhere.")
return*/
else
- user << "You push the button. The coloured LED next to it changes."
+ to_chat(user, "You push the button. The coloured LED next to it changes.")
safetieson = !safetieson
@@ -285,7 +285,7 @@
/obj/machinery/suit_storage_unit/proc/toggle_open(mob/user as mob)
if(islocked || isUV)
- user << "Unable to open unit."
+ to_chat(user, "Unable to open unit.")
return
if(OCCUPANT)
eject_occupant(user)
@@ -296,7 +296,7 @@
/obj/machinery/suit_storage_unit/proc/toggle_lock(mob/user as mob)
if(OCCUPANT && safetieson)
- user << "The Unit's safety protocols disallow locking when a biological form is detected inside its compartments."
+ to_chat(user, "The Unit's safety protocols disallow locking when a biological form is detected inside its compartments.")
return
if(isopen)
return
@@ -308,12 +308,12 @@
if(isUV || isopen) //I'm bored of all these sanity checks
return
if(OCCUPANT && safetieson)
- user << "WARNING: Biological entity detected in the confines of the Unit's storage. Cannot initiate cycle."
+ to_chat(user, "WARNING: Biological entity detected in the confines of the Unit's storage. Cannot initiate cycle.")
return
if(!HELMET && !MASK && !SUIT && !OCCUPANT) //shit's empty yo
- user << "Unit storage bays empty. Nothing to disinfect -- Aborting."
+ to_chat(user, "Unit storage bays empty. Nothing to disinfect -- Aborting.")
return
- user << "You start the Unit's cauterisation cycle."
+ to_chat(user, "You start the Unit's cauterisation cycle.")
cycletime_left = 20
isUV = 1
if(OCCUPANT && !islocked)
@@ -378,10 +378,10 @@
if(OCCUPANT)
if(issuperUV)
OCCUPANT.take_organ_damage(0,40)
- user << "Test. You gave him 40 damage"
+ to_chat(user, "Test. You gave him 40 damage")
else
OCCUPANT.take_organ_damage(0,8)
- user << "Test. You gave him 8 damage"
+ to_chat(user, "Test. You gave him 8 damage")
return*/
@@ -438,13 +438,13 @@
if(usr.stat != 0)
return
if(!isopen)
- usr << "The unit's doors are shut."
+ to_chat(usr, "The unit's doors are shut.")
return
if(!ispowered || isbroken)
- usr << "The unit is not operational."
+ to_chat(usr, "The unit is not operational.")
return
if((OCCUPANT) || (HELMET) || (SUIT))
- usr << "It's too cluttered inside for you to fit in!"
+ to_chat(usr, "It's too cluttered inside for you to fit in!")
return
visible_message("[usr] starts squeezing into the suit storage unit!", 3)
if(do_after(usr, 10))
@@ -471,10 +471,10 @@
/obj/machinery/suit_storage_unit/attackby(obj/item/I as obj, mob/user as mob)
if(!ispowered)
return
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
panelopen = !panelopen
playsound(src, I.usesound, 100, 1)
- user << text("You [] the unit's maintenance panel.",(panelopen ? "open up" : "close"))
+ to_chat(user, "You [panelopen ? "open up" : "close"] the unit's maintenance panel.")
updateUsrDialog()
return
if(istype(I, /obj/item/weapon/grab))
@@ -482,13 +482,13 @@
if(!(ismob(G.affecting)))
return
if(!isopen)
- usr << "The unit's doors are shut."
+ to_chat(user, "The unit's doors are shut.")
return
if(!ispowered || isbroken)
- usr << "The unit is not operational."
+ to_chat(user, "The unit is not operational.")
return
if((OCCUPANT) || (HELMET) || (SUIT)) //Unit needs to be absolutely empty
- user << "The unit's storage area is too cluttered."
+ to_chat(user, "The unit's storage area is too cluttered.")
return
visible_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.", 3)
if(do_after(user, 20))
@@ -514,9 +514,9 @@
return
var/obj/item/clothing/suit/space/S = I
if(SUIT)
- user << "The unit already contains a suit."
+ to_chat(user, "The unit already contains a suit.")
return
- user << "You load the [S.name] into the storage compartment."
+ to_chat(user, "You load the [S.name] into the storage compartment.")
user.drop_item()
S.loc = src
SUIT = S
@@ -528,9 +528,9 @@
return
var/obj/item/clothing/head/helmet/H = I
if(HELMET)
- user << "The unit already contains a helmet."
+ to_chat(user, "The unit already contains a helmet.")
return
- user << "You load the [H.name] into the storage compartment."
+ to_chat(user, "You load the [H.name] into the storage compartment.")
user.drop_item()
H.loc = src
HELMET = H
@@ -542,9 +542,9 @@
return
var/obj/item/clothing/mask/M = I
if(MASK)
- user << "The unit already contains a mask."
+ to_chat(user, "The unit already contains a mask.")
return
- user << "You load the [M.name] into the storage compartment."
+ to_chat(user, "You load the [M.name] into the storage compartment.")
user.drop_item()
M.loc = src
MASK = M
@@ -653,7 +653,7 @@
return
//Hacking init.
- if(istype(I, /obj/item/device/multitool) || istype(I, /obj/item/weapon/wirecutters))
+ if(istype(I, /obj/item/device/multitool) || I.is_wirecutter())
if(panel_open)
attack_hand(user)
return
@@ -665,11 +665,11 @@
return
if(locked)
- user << "The suit cycler is locked."
+ to_chat(user, "The suit cycler is locked.")
return
if(contents.len > 0)
- user << "There is no room inside the cycler for [G.affecting.name]."
+ to_chat(user, "There is no room inside the cycler for [G.affecting.name].")
return
visible_message("[user] starts putting [G.affecting.name] into the suit cycler.", 3)
@@ -689,29 +689,29 @@
updateUsrDialog()
return
- else if(istype(I,/obj/item/weapon/screwdriver))
+ else if(I.is_screwdriver())
panel_open = !panel_open
playsound(src, I.usesound, 50, 1)
- user << "You [panel_open ? "open" : "close"] the maintenance panel."
+ to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
updateUsrDialog()
return
else if(istype(I,/obj/item/clothing/head/helmet/space) && !istype(I, /obj/item/clothing/head/helmet/space/rig))
if(locked)
- user << "The suit cycler is locked."
+ to_chat(user, "The suit cycler is locked.")
return
if(helmet)
- user << "The cycler already contains a helmet."
+ to_chat(user, "The cycler already contains a helmet.")
return
if(I.icon_override == CUSTOM_ITEM_MOB)
- user << "You cannot refit a customised voidsuit."
+ to_chat(user, "You cannot refit a customised voidsuit.")
return
- user << "You fit \the [I] into the suit cycler."
+ to_chat(user, "You fit \the [I] into the suit cycler.")
user.drop_item()
I.loc = src
helmet = I
@@ -723,18 +723,18 @@
else if(istype(I,/obj/item/clothing/suit/space/void))
if(locked)
- user << "The suit cycler is locked."
+ to_chat(user, "The suit cycler is locked.")
return
if(suit)
- user << "The cycler already contains a voidsuit."
+ to_chat(user, "The cycler already contains a voidsuit.")
return
if(I.icon_override == CUSTOM_ITEM_MOB)
- user << "You cannot refit a customised voidsuit."
+ to_chat(user, "You cannot refit a customised voidsuit.")
return
- user << "You fit \the [I] into the suit cycler."
+ to_chat(user, "You fit \the [I] into the suit cycler.")
user.drop_item()
I.loc = src
suit = I
@@ -747,11 +747,11 @@
/obj/machinery/suit_cycler/emag_act(var/remaining_charges, var/mob/user)
if(emagged)
- user << "The cycler has already been subverted."
+ to_chat(user, "The cycler has already been subverted.")
return
//Clear the access reqs, disable the safeties, and open up all paintjobs.
- user << "You run the sequencer across the interface, corrupting the operating protocols."
+ to_chat(user, "You run the sequencer across the interface, corrupting the operating protocols.")
departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","Crowd Control","Emergency Medical Response","^%###^%$", "Charring")
species = list(SPECIES_HUMAN,SPECIES_TAJ,SPECIES_SKRELL,SPECIES_UNATHI, SPECIES_TESHARI)
@@ -855,14 +855,14 @@
if(allowed(usr))
locked = !locked
- usr << "You [locked ? "" : "un"]lock \the [src]."
+ to_chat(usr, "You [locked ? "" : "un"]lock \the [src].")
else
- usr << "Access denied."
+ to_chat(usr, "Access denied.")
else if(href_list["begin_decontamination"])
if(safeties && occupant)
- usr << "The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle."
+ to_chat(usr, "The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle.")
return
active = 1
diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm
index 0f58bd9a48..9f228be5d4 100644
--- a/code/game/machinery/supplybeacon.dm
+++ b/code/game/machinery/supplybeacon.dm
@@ -45,7 +45,7 @@
drop_type = "supermatter"
/obj/machinery/power/supply_beacon/attackby(var/obj/item/weapon/W, var/mob/user)
- if(!use_power && istype(W, /obj/item/weapon/wrench))
+ if(!use_power && W.is_wrench())
if(!anchored && !connect_to_network())
to_chat(user, "This device must be placed over an exposed cable.")
return
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index cf2449f1d3..2c59ec8b20 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -56,7 +56,7 @@
return
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/N = M
- M << "You have joined the ranks of the Syndicate and become a traitor to the station!"
+ to_chat(N, "You have joined the ranks of the Syndicate and become a traitor to the station!")
traitors.add_antagonist(N.mind)
traitors.equip(N)
message_admins("[N]/([N.ckey]) has accepted a traitor objective from a syndicate beacon.")
@@ -87,25 +87,26 @@
/obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null)
if(surplus() < 1500)
- if(user) user << "The connected wire doesn't have enough current."
+ if(user)
+ to_chat(user, "The connected wire doesn't have enough current.")
return
- for(var/obj/singularity/singulo in world)
+ for(var/obj/singularity/singulo in all_singularities)
if(singulo.z == z)
singulo.target = src
icon_state = "[icontype]1"
active = 1
START_MACHINE_PROCESSING(src)
if(user)
- user << "You activate the beacon."
+ to_chat(user, "You activate the beacon.")
/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null)
- for(var/obj/singularity/singulo in world)
+ for(var/obj/singularity/singulo in all_singularities)
if(singulo.target == src)
singulo.target = null
icon_state = "[icontype]0"
active = 0
if(user)
- user << "You deactivate the beacon."
+ to_chat(user, "You deactivate the beacon.")
/obj/machinery/power/singularity_beacon/attack_ai(mob/user as mob)
return
@@ -114,27 +115,27 @@
if(anchored)
return active ? Deactivate(user) : Activate(user)
else
- user << "You need to screw the beacon to the floor first!"
+ to_chat(user, "You need to screw the beacon to the floor first!")
return
/obj/machinery/power/singularity_beacon/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
if(active)
- user << "You need to deactivate the beacon first!"
+ to_chat(user, "You need to deactivate the beacon first!")
return
if(anchored)
anchored = 0
- user << "You unscrew the beacon from the floor."
+ to_chat(user, "You unscrew the beacon from the floor.")
playsound(src, W.usesound, 50, 1)
disconnect_from_network()
return
else
if(!connect_to_network())
- user << "This device must be placed over an exposed cable."
+ to_chat(user, "This device must be placed over an exposed cable.")
return
anchored = 1
- user << "You screw the beacon to the floor and attach the cable."
+ to_chat(user, "You screw the beacon to the floor and attach the cable.")
playsound(src, W.usesound, 50, 1)
return
..()
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index 208b9d51e8..331f5644d9 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -28,35 +28,35 @@
if (integrity < 100) //Damaged, let's repair!
if (T.use(1))
integrity = between(0, integrity + rand(10,20), 100)
- usr << "You apply the Nanopaste to [src], repairing some of the damage."
+ to_chat(usr, "You apply the Nanopaste to [src], repairing some of the damage.")
else
- usr << "This machine is already in perfect condition."
+ to_chat(usr, "This machine is already in perfect condition.")
return
switch(construct_op)
if(0)
- if(istype(P, /obj/item/weapon/screwdriver))
- user << "You unfasten the bolts."
+ if(P.is_screwdriver())
+ to_chat(user, "You unfasten the bolts.")
playsound(src.loc, P.usesound, 50, 1)
construct_op ++
if(1)
- if(istype(P, /obj/item/weapon/screwdriver))
- user << "You fasten the bolts."
+ if(P.is_screwdriver())
+ to_chat(user, "You fasten the bolts.")
playsound(src.loc, P.usesound, 50, 1)
construct_op --
- if(istype(P, /obj/item/weapon/wrench))
- user << "You dislodge the external plating."
+ if(P.is_wrench())
+ to_chat(user, "You dislodge the external plating.")
playsound(src.loc, P.usesound, 75, 1)
construct_op ++
if(2)
- if(istype(P, /obj/item/weapon/wrench))
- user << "You secure the external plating."
+ if(P.is_wrench())
+ to_chat(user, "You secure the external plating.")
playsound(src.loc, P.usesound, 75, 1)
construct_op --
- if(istype(P, /obj/item/weapon/wirecutters))
+ if(P.is_wirecutter())
playsound(src.loc, P.usesound, 50, 1)
- user << "You remove the cables."
+ to_chat(user, "You remove the cables.")
construct_op ++
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc )
A.amount = 5
@@ -65,16 +65,16 @@
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/A = P
if (A.use(5))
- user << "You insert the cables."
+ to_chat(user, "You insert the cables.")
construct_op--
stat &= ~BROKEN // the machine's not borked anymore!
else
- user << "You need five coils of wire for this."
- if(istype(P, /obj/item/weapon/crowbar))
- user << "You begin prying out the circuit board other components..."
+ to_chat(user, "You need five coils of wire for this.")
+ if(P.is_crowbar())
+ to_chat(user, "You begin prying out the circuit board other components...")
playsound(src.loc, P.usesound, 50, 1)
if(do_after(user,60 * P.toolspeed))
- user << "You finish prying out the components."
+ to_chat(user, "You finish prying out the components.")
// Drop all the component stuff
if(contents.len > 0)
@@ -172,7 +172,7 @@
dat += ""
temp = ""
- user << browse(dat, "window=tcommachine;size=520x500;can_resize=0")
+ to_chat(user, browse(dat, "window=tcommachine;size=520x500;can_resize=0"))
onclose(user, "dormitory")
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 7544c91bfe..be31a5aa56 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -95,7 +95,7 @@
var/list/L = list()
var/list/areaindex = list()
- for(var/obj/item/device/radio/beacon/R in world)
+ for(var/obj/item/device/radio/beacon/R in all_beacons)
var/turf/T = get_turf(R)
if(!T)
continue
@@ -108,7 +108,7 @@
areaindex[tmpname] = 1
L[tmpname] = R
- for (var/obj/item/weapon/implant/tracking/I in world)
+ for (var/obj/item/weapon/implant/tracking/I in all_tracking_implants)
if(!I.implanted || !ismob(I.loc))
continue
else
diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm
index 8f90343284..fa75864b01 100644
--- a/code/game/machinery/turret_control.dm
+++ b/code/game/machinery/turret_control.dm
@@ -51,7 +51,7 @@
else if(ispath(control_area))
control_area = locate(control_area)
else if(istext(control_area))
- for(var/area/A in world)
+ for(var/area/A in all_areas)
if(A.name && A.name==control_area)
control_area = A
break
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 29766d5c2c..92c23206bb 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -179,7 +179,7 @@
if(I || istype(W, /obj/item/weapon/spacecash))
attack_hand(user)
return
- else if(istype(W, /obj/item/weapon/screwdriver))
+ else if(W.is_screwdriver())
panel_open = !panel_open
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
playsound(src, W.usesound, 50, 1)
@@ -189,7 +189,7 @@
nanomanager.update_uis(src) // Speaker switch is on the main UI, not wires UI
return
- else if(istype(W, /obj/item/device/multitool)||istype(W, /obj/item/weapon/wirecutters))
+ else if(istype(W, /obj/item/device/multitool) || W.is_wirecutter())
if(panel_open)
attack_hand(user)
return
@@ -201,7 +201,7 @@
to_chat(user, "You insert \the [W] into \the [src].")
nanomanager.update_uis(src)
return
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
playsound(src, W.usesound, 100, 1)
if(anchored)
user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
@@ -510,6 +510,8 @@
if(R.get_product(get_turf(src)))
visible_message("\The [src] clunks as it vends an additional item.")
+ playsound(src, 'sound/items/vending.ogg', 50, 1, 1)
+
status_message = ""
status_error = 0
vend_ready = 1
@@ -565,7 +567,7 @@
if(!user.unEquip(W))
return
- user << "You insert \the [W] in the product receptor."
+ to_chat(user, "You insert \the [W] in the product receptor.")
R.add_product(W)
if(has_logs)
do_logging(R, user)
@@ -735,7 +737,7 @@
/obj/machinery/vending/assist
products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4,
- /obj/item/weapon/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4)
+ /obj/item/weapon/tool/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4)
contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2)
product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
@@ -1024,8 +1026,8 @@
icon_state = "tool"
icon_deny = "tool-deny"
//req_access = list(access_maint_tunnels) //Maintenance access
- products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/weapon/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/wirecutters = 5,
- /obj/item/weapon/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/screwdriver = 5,
+ products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/weapon/tool/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/tool/wirecutters = 5,
+ /obj/item/weapon/tool/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/tool/screwdriver = 5,
/obj/item/device/flashlight/glowstick = 3, /obj/item/device/flashlight/glowstick/red = 3, /obj/item/device/flashlight/glowstick/blue = 3,
/obj/item/device/flashlight/glowstick/orange =3, /obj/item/device/flashlight/glowstick/yellow = 3)
contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2,)
@@ -1063,8 +1065,8 @@
icon_deny = "engi-deny"
req_access = list(access_engine_equip)
products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/orange = 4,/obj/item/clothing/head/hardhat = 4,
- /obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/yellow = 4, /obj/item/weapon/screwdriver = 12,
- /obj/item/weapon/crowbar = 12,/obj/item/weapon/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/wrench = 12,/obj/item/device/t_scanner = 12,
+ /obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/yellow = 4, /obj/item/weapon/tool/screwdriver = 12,
+ /obj/item/weapon/tool/crowbar = 12,/obj/item/weapon/tool/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/tool/wrench = 12,/obj/item/device/t_scanner = 12,
/obj/item/stack/cable_coil/heavyduty = 8, /obj/item/weapon/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8,
/obj/item/weapon/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5,/obj/item/weapon/stock_parts/micro_laser = 5,
/obj/item/weapon/stock_parts/matter_bin = 5,/obj/item/weapon/stock_parts/manipulator = 5,/obj/item/weapon/stock_parts/console_screen = 5)
@@ -1083,7 +1085,7 @@
products = list(/obj/item/clothing/suit/storage/toggle/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/stack/cable_coil = 4,/obj/item/device/flash = 4,
/obj/item/weapon/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3,
/obj/item/weapon/surgical/scalpel = 2,/obj/item/weapon/surgical/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
- /obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
+ /obj/item/weapon/tool/screwdriver = 5,/obj/item/weapon/tool/crowbar = 5)
//everything after the power cell had no amounts, I improvised. -Sayu
req_log_access = access_rd
has_logs = 1
diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm
index 0d3c3bcd2c..dd75e2d8e9 100644
--- a/code/game/machinery/wall_frames.dm
+++ b/code/game/machinery/wall_frames.dm
@@ -18,7 +18,7 @@
frame_types_wall = construction_frame_wall
/obj/item/frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
new refund_type(get_turf(src.loc), refund_amt)
qdel(src)
return
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 309c9cf2a4..672b0a2c4e 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -90,7 +90,7 @@
return
if(default_unfasten_wrench(user, W, 40))
return
- /*if(istype(W,/obj/item/weapon/screwdriver))
+ /*if(W.is_screwdriver())
panel = !panel
user << "You [panel ? "open" : "close"] the [src]'s maintenance panel"*/
if(istype(W,/obj/item/weapon/pen/crayon) || istype(W,/obj/item/weapon/stamp))
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 80b417da22..e980c8261c 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -38,11 +38,13 @@
projectiles--
var/P = new projectile(curloc)
Fire(P, target)
+ if(i == 1)
+ set_ready_state(0)
if(fire_cooldown)
sleep(fire_cooldown)
if(auto_rearm)
projectiles = projectiles_per_shot
- set_ready_state(0)
+// set_ready_state(0)
do_after_cooldown()
return
diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm
index 45b9853881..f0b792ac73 100644
--- a/code/game/mecha/mech_prosthetics.dm
+++ b/code/game/mecha/mech_prosthetics.dm
@@ -150,7 +150,7 @@
/obj/machinery/pros_fabricator/attackby(var/obj/item/I, var/mob/user)
if(busy)
- user << "\The [src] is busy. Please wait for completion of previous operation."
+ to_chat(user, "\The [src] is busy. Please wait for completion of previous operation.")
return 1
if(default_deconstruction_screwdriver(user, I))
return
@@ -162,20 +162,20 @@
if(istype(I,/obj/item/weapon/disk/limb))
var/obj/item/weapon/disk/limb/D = I
if(!D.company || !(D.company in all_robolimbs))
- user << "This disk seems to be corrupted!"
+ to_chat(user, "This disk seems to be corrupted!")
else
- user << "Installing blueprint files for [D.company]..."
+ to_chat(user, "Installing blueprint files for [D.company]...")
if(do_after(user,50,src))
var/datum/robolimb/R = all_robolimbs[D.company]
R.unavailable_to_build = 0
- user << "Installed [D.company] blueprints!"
+ to_chat(user, "Installed [D.company] blueprints!")
qdel(I)
return
if(istype(I,/obj/item/stack/material))
var/obj/item/stack/material/S = I
if(!(S.material.name in materials))
- user << "The [src] doesn't accept [S.material]!"
+ to_chat(user, "The [src] doesn't accept [S.material]!")
return
var/sname = "[S.name]"
@@ -190,10 +190,10 @@
materials[S.material.name] += amnt
S.use(1)
count++
- user << "You insert [count] [sname] into the fabricator."
+ to_chat(user, "You insert [count] [sname] into the fabricator.")
update_busy()
else
- user << "The fabricator cannot hold more [sname]."
+ to_chat(user, "The fabricator cannot hold more [sname].")
return
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 360c9e1bbf..f410dbb014 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -719,7 +719,7 @@
user << "Invalid ID: Access denied."
else
user << "Maintenance protocols disabled by operator."
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
if(state==1)
state = 2
user << "You undo the securing bolts."
@@ -727,7 +727,7 @@
state = 1
user << "You tighten the securing bolts."
return
- else if(istype(W, /obj/item/weapon/crowbar))
+ else if(W.is_crowbar())
if(state==2)
state = 3
user << "You open the hatch to the power unit"
@@ -744,7 +744,7 @@
else
user << "There's not enough wire to finish the task."
return
- else if(istype(W, /obj/item/weapon/screwdriver))
+ else if(W.is_screwdriver())
if(hasInternalDamage(MECHA_INT_TEMP_CONTROL))
clearInternalDamage(MECHA_INT_TEMP_CONTROL)
user << "You repair the damaged temperature controller."
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index 98e81cb83f..ce5b751e55 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -2,71 +2,73 @@
///// Construction datums //////
////////////////////////////////
-/datum/construction/mecha/custom_action(step, atom/used_atom, mob/user)
- if(istype(used_atom, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/W = used_atom
+/datum/construction/mecha/custom_action(step, obj/item/I, mob/user)
+ if(istype(I, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/W = I
if (W.remove_fuel(0, user))
playsound(holder, 'sound/items/Welder2.ogg', 50, 1)
else
return 0
- else if(istype(used_atom, /obj/item/weapon/wrench))
+ else if(I.is_wrench())
playsound(holder, 'sound/items/Ratchet.ogg', 50, 1)
- else if(istype(used_atom, /obj/item/weapon/screwdriver))
+ else if(I.is_screwdriver())
playsound(holder, 'sound/items/Screwdriver.ogg', 50, 1)
- else if(istype(used_atom, /obj/item/weapon/wirecutters))
+ else if(I.is_wirecutter())
playsound(holder, 'sound/items/Wirecutter.ogg', 50, 1)
- else if(istype(used_atom, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C = used_atom
+ else if(istype(I, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = I
if(C.use(4))
playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1)
else
- user << ("There's not enough cable to finish the task.")
+ to_chat(user, "There's not enough cable to finish the task.")
return 0
- else if(istype(used_atom, /obj/item/stack))
- var/obj/item/stack/S = used_atom
+ else if(istype(I, /obj/item/stack))
+ var/obj/item/stack/S = I
if(S.get_amount() < 5)
- user << ("There's not enough material in this stack.")
+ to_chat(user, "There's not enough material in this stack.")
return 0
else
S.use(5)
return 1
-/datum/construction/reversible/mecha/custom_action(index as num, diff as num, atom/used_atom, mob/user as mob)
- if(istype(used_atom, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/W = used_atom
+/datum/construction/reversible/mecha/custom_action(index as num, diff as num, obj/item/I, mob/user as mob)
+ if(istype(I, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/W = I
if (W.remove_fuel(0, user))
playsound(holder, 'sound/items/Welder2.ogg', 50, 1)
else
return 0
- else if(istype(used_atom, /obj/item/weapon/wrench))
+ else if(I.is_wrench())
playsound(holder, 'sound/items/Ratchet.ogg', 50, 1)
- else if(istype(used_atom, /obj/item/weapon/screwdriver))
+ else if(I.is_screwdriver())
playsound(holder, 'sound/items/Screwdriver.ogg', 50, 1)
- else if(istype(used_atom, /obj/item/weapon/wirecutters))
+ else if(I.is_wirecutter())
playsound(holder, 'sound/items/Wirecutter.ogg', 50, 1)
- else if(istype(used_atom, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C = used_atom
+ else if(istype(I, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = I
if(C.use(4))
playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1)
else
- user << ("There's not enough cable to finish the task.")
+ to_chat(user, "There's not enough cable to finish the task.")
return 0
- else if(istype(used_atom, /obj/item/stack))
- var/obj/item/stack/S = used_atom
+ else if(istype(I, /obj/item/stack))
+ var/obj/item/stack/S = I
if(S.get_amount() < 5)
- user << ("There's not enough material in this stack.")
+ to_chat(user, "There's not enough material in this stack.")
return 0
else
S.use(5)
return 1
-
+//////////////////////
+// Ripley
+//////////////////////
/datum/construction/mecha/ripley_chassis
steps = list(list("key"=/obj/item/mecha_parts/part/ripley_torso),//1
list("key"=/obj/item/mecha_parts/part/ripley_left_arm),//2
@@ -75,25 +77,25 @@
list("key"=/obj/item/mecha_parts/part/ripley_right_leg)//5
)
- custom_action(step, atom/used_atom, mob/user)
- user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]")
- holder.overlays += used_atom.icon_state+"+o"
- qdel(used_atom)
- return 1
+/datum/construction/mecha/ripley_chassis/custom_action(step, obj/item/I, mob/user)
+ user.visible_message("[user] has connected [I] to [holder].", "You connect [I] to [holder]")
+ holder.overlays += I.icon_state+"+o"
+ qdel(I)
+ return 1
- action(atom/used_atom,mob/user as mob)
- return check_all_steps(used_atom,user)
+/datum/construction/mecha/ripley_chassis/action(obj/item/I,mob/user as mob)
+ return check_all_steps(I,user)
- spawn_result()
- var/obj/item/mecha_parts/chassis/const_holder = holder
- const_holder.construct = new /datum/construction/reversible/mecha/ripley(const_holder)
- const_holder.icon = 'icons/mecha/mech_construction.dmi'
- const_holder.icon_state = "ripley0"
- const_holder.density = 1
- const_holder.overlays.len = 0
- spawn()
- qdel(src)
- return
+/datum/construction/mecha/ripley_chassis/spawn_result()
+ var/obj/item/mecha_parts/chassis/const_holder = holder
+ const_holder.construct = new /datum/construction/reversible/mecha/ripley(const_holder)
+ const_holder.icon = 'icons/mecha/mech_construction.dmi'
+ const_holder.icon_state = "ripley0"
+ const_holder.density = 1
+ const_holder.overlays.len = 0
+ spawn()
+ qdel(src)
+ return
/datum/construction/reversible/mecha/ripley
@@ -101,11 +103,11 @@
steps = list(
//1
list("key"=/obj/item/weapon/weldingtool,
- "backkey"=/obj/item/weapon/wrench,
+ "backkey"=IS_WRENCH,
"desc"="External armor is wrenched."),
//2
- list("key"=/obj/item/weapon/wrench,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_WRENCH,
+ "backkey"=IS_CROWBAR,
"desc"="External armor is installed."),
//3
list("key"=/obj/item/stack/material/plasteel,
@@ -113,170 +115,171 @@
"desc"="Internal armor is welded."),
//4
list("key"=/obj/item/weapon/weldingtool,
- "backkey"=/obj/item/weapon/wrench,
+ "backkey"=IS_WRENCH,
"desc"="Internal armor is wrenched"),
//5
- list("key"=/obj/item/weapon/wrench,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_WRENCH,
+ "backkey"=IS_CROWBAR,
"desc"="Internal armor is installed"),
//6
list("key"=/obj/item/stack/material/steel,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Peripherals control module is secured"),
//7
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Peripherals control module is installed"),
//8
list("key"=/obj/item/weapon/circuitboard/mecha/ripley/peripherals,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Central control module is secured"),
//9
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Central control module is installed"),
//10
list("key"=/obj/item/weapon/circuitboard/mecha/ripley/main,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="The wiring is adjusted"),
//11
- list("key"=/obj/item/weapon/wirecutters,
- "backkey"=/obj/item/weapon/screwdriver,
+ list("key"=IS_WIRECUTTER,
+ "backkey"=IS_SCREWDRIVER,
"desc"="The wiring is added"),
//12
list("key"=/obj/item/stack/cable_coil,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="The hydraulic systems are active."),
//13
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/wrench,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_WRENCH,
"desc"="The hydraulic systems are connected."),
//14
- list("key"=/obj/item/weapon/wrench,
+ list("key"=IS_WRENCH,
"desc"="The hydraulic systems are disconnected.")
)
- action(atom/used_atom,mob/user as mob)
- return check_step(used_atom,user)
+/datum/construction/reversible/mecha/ripley/action(obj/item/I,mob/user as mob)
+ return check_step(I,user)
- custom_action(index, diff, atom/used_atom, mob/user)
- if(!..())
- return 0
+/datum/construction/reversible/mecha/ripley/custom_action(index, diff, obj/item/I, mob/user)
+ if(!..())
+ return 0
- //TODO: better messages.
- switch(index)
- if(14)
- user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
+ //TODO: better messages.
+ switch(index)
+ if(14)
+ user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
+ holder.icon_state = "ripley1"
+ if(13)
+ if(diff==FORWARD)
+ user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
+ holder.icon_state = "ripley2"
+ else
+ user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
+ holder.icon_state = "ripley0"
+ if(12)
+ if(diff==FORWARD)
+ user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
+ holder.icon_state = "ripley3"
+ else
+ user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
holder.icon_state = "ripley1"
- if(13)
- if(diff==FORWARD)
- user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
- holder.icon_state = "ripley2"
- else
- user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
- holder.icon_state = "ripley0"
- if(12)
- if(diff==FORWARD)
- user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
- holder.icon_state = "ripley3"
- else
- user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
- holder.icon_state = "ripley1"
- if(11)
- if(diff==FORWARD)
- user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
- holder.icon_state = "ripley4"
- else
- user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
- var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
- coil.amount = 4
- holder.icon_state = "ripley2"
- if(10)
- if(diff==FORWARD)
- user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
- qdel(used_atom)
- holder.icon_state = "ripley5"
- else
- user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
- holder.icon_state = "ripley3"
- if(9)
- if(diff==FORWARD)
- user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
- holder.icon_state = "ripley6"
- else
- user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
- new /obj/item/weapon/circuitboard/mecha/ripley/main(get_turf(holder))
- holder.icon_state = "ripley4"
- if(8)
- if(diff==FORWARD)
- user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
- qdel(used_atom)
- holder.icon_state = "ripley7"
- else
- user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
- holder.icon_state = "ripley5"
- if(7)
- if(diff==FORWARD)
- user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
- holder.icon_state = "ripley8"
- else
- user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
- new /obj/item/weapon/circuitboard/mecha/ripley/peripherals(get_turf(holder))
- holder.icon_state = "ripley6"
- if(6)
- if(diff==FORWARD)
- user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
- holder.icon_state = "ripley9"
- else
- user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
- holder.icon_state = "ripley7"
- if(5)
- if(diff==FORWARD)
- user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
- holder.icon_state = "ripley10"
- else
- user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
- var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
- MS.amount = 5
- holder.icon_state = "ripley8"
- if(4)
- if(diff==FORWARD)
- user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
- holder.icon_state = "ripley11"
- else
- user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
- holder.icon_state = "ripley9"
- if(3)
- if(diff==FORWARD)
- user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].")
- holder.icon_state = "ripley12"
- else
- user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
- holder.icon_state = "ripley10"
- if(2)
- if(diff==FORWARD)
- user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
- holder.icon_state = "ripley13"
- else
- user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
- var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
- MS.amount = 5
- holder.icon_state = "ripley11"
- if(1)
- if(diff==FORWARD)
- user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].")
- else
- user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.")
- holder.icon_state = "ripley12"
- return 1
-
- spawn_result()
- ..()
- feedback_inc("mecha_ripley_created",1)
- return
-
+ if(11)
+ if(diff==FORWARD)
+ user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
+ holder.icon_state = "ripley4"
+ else
+ user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
+ var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
+ coil.amount = 4
+ holder.icon_state = "ripley2"
+ if(10)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
+ qdel(I)
+ holder.icon_state = "ripley5"
+ else
+ user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
+ holder.icon_state = "ripley3"
+ if(9)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
+ holder.icon_state = "ripley6"
+ else
+ user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/ripley/main(get_turf(holder))
+ holder.icon_state = "ripley4"
+ if(8)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
+ qdel(I)
+ holder.icon_state = "ripley7"
+ else
+ user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
+ holder.icon_state = "ripley5"
+ if(7)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
+ holder.icon_state = "ripley8"
+ else
+ user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/ripley/peripherals(get_turf(holder))
+ holder.icon_state = "ripley6"
+ if(6)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
+ holder.icon_state = "ripley9"
+ else
+ user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
+ holder.icon_state = "ripley7"
+ if(5)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
+ holder.icon_state = "ripley10"
+ else
+ user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
+ var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
+ MS.amount = 5
+ holder.icon_state = "ripley8"
+ if(4)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
+ holder.icon_state = "ripley11"
+ else
+ user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
+ holder.icon_state = "ripley9"
+ if(3)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].")
+ holder.icon_state = "ripley12"
+ else
+ user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
+ holder.icon_state = "ripley10"
+ if(2)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
+ holder.icon_state = "ripley13"
+ else
+ user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
+ var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
+ MS.amount = 5
+ holder.icon_state = "ripley11"
+ if(1)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].")
+ else
+ user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.")
+ holder.icon_state = "ripley12"
+ return 1
+/datum/construction/reversible/mecha/ripley/spawn_result()
+ ..()
+ feedback_inc("mecha_ripley_created",1)
+ return
+//////////////////////
+// Gygax
+//////////////////////
/datum/construction/mecha/gygax_chassis
steps = list(list("key"=/obj/item/mecha_parts/part/gygax_torso),//1
list("key"=/obj/item/mecha_parts/part/gygax_left_arm),//2
@@ -286,24 +289,24 @@
list("key"=/obj/item/mecha_parts/part/gygax_head)
)
- custom_action(step, atom/used_atom, mob/user)
- user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]")
- holder.overlays += used_atom.icon_state+"+o"
- qdel(used_atom)
- return 1
+/datum/construction/mecha/gygax_chassis/custom_action(step, obj/item/I, mob/user)
+ user.visible_message("[user] has connected [I] to [holder].", "You connect [I] to [holder]")
+ holder.overlays += I.icon_state+"+o"
+ qdel(I)
+ return 1
- action(atom/used_atom,mob/user as mob)
- return check_all_steps(used_atom,user)
+/datum/construction/mecha/gygax_chassis/action(obj/item/I,mob/user as mob)
+ return check_all_steps(I,user)
- spawn_result()
- var/obj/item/mecha_parts/chassis/const_holder = holder
- const_holder.construct = new /datum/construction/reversible/mecha/gygax(const_holder)
- const_holder.icon = 'icons/mecha/mech_construction.dmi'
- const_holder.icon_state = "gygax0"
- const_holder.density = 1
- spawn()
- qdel(src)
- return
+/datum/construction/mecha/gygax_chassis/spawn_result()
+ var/obj/item/mecha_parts/chassis/const_holder = holder
+ const_holder.construct = new /datum/construction/reversible/mecha/gygax(const_holder)
+ const_holder.icon = 'icons/mecha/mech_construction.dmi'
+ const_holder.icon_state = "gygax0"
+ const_holder.density = 1
+ spawn()
+ qdel(src)
+ return
/datum/construction/reversible/mecha/gygax
@@ -311,11 +314,11 @@
steps = list(
//1
list("key"=/obj/item/weapon/weldingtool,
- "backkey"=/obj/item/weapon/wrench,
+ "backkey"=IS_WRENCH,
"desc"="External armor is wrenched."),
//2
- list("key"=/obj/item/weapon/wrench,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_WRENCH,
+ "backkey"=IS_CROWBAR,
"desc"="External armor is installed."),
//3
list("key"=/obj/item/mecha_parts/part/gygax_armour,
@@ -323,240 +326,243 @@
"desc"="Internal armor is welded."),
//4
list("key"=/obj/item/weapon/weldingtool,
- "backkey"=/obj/item/weapon/wrench,
+ "backkey"=IS_WRENCH,
"desc"="Internal armor is wrenched"),
//5
- list("key"=/obj/item/weapon/wrench,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_WRENCH,
+ "backkey"=IS_CROWBAR,
"desc"="Internal armor is installed"),
//6
list("key"=/obj/item/stack/material/steel,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Advanced capacitor is secured"),
//7
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Advanced capacitor is installed"),
//8
list("key"=/obj/item/weapon/stock_parts/capacitor/adv,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Advanced scanner module is secured"),
//9
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Advanced scanner module is installed"),
//10
list("key"=/obj/item/weapon/stock_parts/scanning_module/adv,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Targeting module is secured"),
//11
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Targeting module is installed"),
//12
list("key"=/obj/item/weapon/circuitboard/mecha/gygax/targeting,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Peripherals control module is secured"),
//13
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Peripherals control module is installed"),
//14
list("key"=/obj/item/weapon/circuitboard/mecha/gygax/peripherals,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Central control module is secured"),
//15
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Central control module is installed"),
//16
list("key"=/obj/item/weapon/circuitboard/mecha/gygax/main,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="The wiring is adjusted"),
//17
- list("key"=/obj/item/weapon/wirecutters,
- "backkey"=/obj/item/weapon/screwdriver,
+ list("key"=/obj/item/weapon/tool/wirecutters,
+ "backkey"=IS_SCREWDRIVER,
"desc"="The wiring is added"),
//18
list("key"=/obj/item/stack/cable_coil,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="The hydraulic systems are active."),
//19
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/wrench,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_WRENCH,
"desc"="The hydraulic systems are connected."),
//20
- list("key"=/obj/item/weapon/wrench,
+ list("key"=IS_WRENCH,
"desc"="The hydraulic systems are disconnected.")
)
- action(atom/used_atom,mob/user as mob)
- return check_step(used_atom,user)
+/datum/construction/reversible/mecha/gygax/action(obj/item/I,mob/user as mob)
+ return check_step(I,user)
- custom_action(index, diff, atom/used_atom, mob/user)
- if(!..())
- return 0
+/datum/construction/reversible/mecha/gygax/custom_action(index, diff, obj/item/I, mob/user)
+ if(!..())
+ return 0
- //TODO: better messages.
- switch(index)
- if(20)
- user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
+ //TODO: better messages.
+ switch(index)
+ if(20)
+ user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
+ holder.icon_state = "gygax1"
+ if(19)
+ if(diff==FORWARD)
+ user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
+ holder.icon_state = "gygax2"
+ else
+ user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
+ holder.icon_state = "gygax0"
+ if(18)
+ if(diff==FORWARD)
+ user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
+ holder.icon_state = "gygax3"
+ else
+ user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
holder.icon_state = "gygax1"
- if(19)
- if(diff==FORWARD)
- user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
- holder.icon_state = "gygax2"
- else
- user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
- holder.icon_state = "gygax0"
- if(18)
- if(diff==FORWARD)
- user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
- holder.icon_state = "gygax3"
- else
- user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
- holder.icon_state = "gygax1"
- if(17)
- if(diff==FORWARD)
- user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
- holder.icon_state = "gygax4"
- else
- user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
- var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
- coil.amount = 4
- holder.icon_state = "gygax2"
- if(16)
- if(diff==FORWARD)
- user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
- qdel(used_atom)
- holder.icon_state = "gygax5"
- else
- user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
- holder.icon_state = "gygax3"
- if(15)
- if(diff==FORWARD)
- user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
- holder.icon_state = "gygax6"
- else
- user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
- new /obj/item/weapon/circuitboard/mecha/gygax/main(get_turf(holder))
- holder.icon_state = "gygax4"
- if(14)
- if(diff==FORWARD)
- user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
- qdel(used_atom)
- holder.icon_state = "gygax7"
- else
- user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
- holder.icon_state = "gygax5"
- if(13)
- if(diff==FORWARD)
- user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
- holder.icon_state = "gygax8"
- else
- user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
- new /obj/item/weapon/circuitboard/mecha/gygax/peripherals(get_turf(holder))
- holder.icon_state = "gygax6"
- if(12)
- if(diff==FORWARD)
- user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].")
- qdel(used_atom)
- holder.icon_state = "gygax9"
- else
- user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
- holder.icon_state = "gygax7"
- if(11)
- if(diff==FORWARD)
- user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.")
- holder.icon_state = "gygax10"
- else
- user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].")
- new /obj/item/weapon/circuitboard/mecha/gygax/targeting(get_turf(holder))
- holder.icon_state = "gygax8"
- if(10)
- if(diff==FORWARD)
- user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].")
- qdel(used_atom)
- holder.icon_state = "gygax11"
- else
- user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.")
- holder.icon_state = "gygax9"
- if(9)
- if(diff==FORWARD)
- user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.")
- holder.icon_state = "gygax12"
- else
- user.visible_message("[user] removes the advanced scanner module from [holder].", "You remove the advanced scanner module from [holder].")
- new /obj/item/weapon/stock_parts/scanning_module/adv(get_turf(holder))
- holder.icon_state = "gygax10"
- if(8)
- if(diff==FORWARD)
- user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].")
- qdel(used_atom)
- holder.icon_state = "gygax13"
- else
- user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.")
- holder.icon_state = "gygax11"
- if(7)
- if(diff==FORWARD)
- user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.")
- holder.icon_state = "gygax14"
- else
- user.visible_message("[user] removes the advanced capacitor from [holder].", "You remove the advanced capacitor from [holder].")
- new /obj/item/weapon/stock_parts/capacitor/adv(get_turf(holder))
- holder.icon_state = "gygax12"
- if(6)
- if(diff==FORWARD)
- user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
- holder.icon_state = "gygax15"
- else
- user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.")
- holder.icon_state = "gygax13"
- if(5)
- if(diff==FORWARD)
- user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
- holder.icon_state = "gygax16"
- else
- user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
- var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
- MS.amount = 5
- holder.icon_state = "gygax14"
- if(4)
- if(diff==FORWARD)
- user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
- holder.icon_state = "gygax17"
- else
- user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
- holder.icon_state = "gygax15"
- if(3)
- if(diff==FORWARD)
- user.visible_message("[user] installs Gygax Armour Plates to [holder].", "You install Gygax Armour Plates to [holder].")
- qdel(used_atom)
- holder.icon_state = "gygax18"
- else
- user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
- holder.icon_state = "gygax16"
- if(2)
- if(diff==FORWARD)
- user.visible_message("[user] secures Gygax Armour Plates.", "You secure Gygax Armour Plates.")
- holder.icon_state = "gygax19"
- else
- user.visible_message("[user] pries Gygax Armour Plates from [holder].", "You prie Gygax Armour Plates from [holder].")
- new /obj/item/mecha_parts/part/gygax_armour(get_turf(holder))
- holder.icon_state = "gygax17"
- if(1)
- if(diff==FORWARD)
- user.visible_message("[user] welds Gygax Armour Plates to [holder].", "You weld Gygax Armour Plates to [holder].")
- else
- user.visible_message("[user] unfastens Gygax Armour Plates.", "You unfasten Gygax Armour Plates.")
- holder.icon_state = "gygax18"
- return 1
+ if(17)
+ if(diff==FORWARD)
+ user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
+ holder.icon_state = "gygax4"
+ else
+ user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
+ var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
+ coil.amount = 4
+ holder.icon_state = "gygax2"
+ if(16)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
+ qdel(I)
+ holder.icon_state = "gygax5"
+ else
+ user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
+ holder.icon_state = "gygax3"
+ if(15)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
+ holder.icon_state = "gygax6"
+ else
+ user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/gygax/main(get_turf(holder))
+ holder.icon_state = "gygax4"
+ if(14)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
+ qdel(I)
+ holder.icon_state = "gygax7"
+ else
+ user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
+ holder.icon_state = "gygax5"
+ if(13)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
+ holder.icon_state = "gygax8"
+ else
+ user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/gygax/peripherals(get_turf(holder))
+ holder.icon_state = "gygax6"
+ if(12)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].")
+ qdel(I)
+ holder.icon_state = "gygax9"
+ else
+ user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
+ holder.icon_state = "gygax7"
+ if(11)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.")
+ holder.icon_state = "gygax10"
+ else
+ user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/gygax/targeting(get_turf(holder))
+ holder.icon_state = "gygax8"
+ if(10)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].")
+ qdel(I)
+ holder.icon_state = "gygax11"
+ else
+ user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.")
+ holder.icon_state = "gygax9"
+ if(9)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.")
+ holder.icon_state = "gygax12"
+ else
+ user.visible_message("[user] removes the advanced scanner module from [holder].", "You remove the advanced scanner module from [holder].")
+ new /obj/item/weapon/stock_parts/scanning_module/adv(get_turf(holder))
+ holder.icon_state = "gygax10"
+ if(8)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].")
+ qdel(I)
+ holder.icon_state = "gygax13"
+ else
+ user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.")
+ holder.icon_state = "gygax11"
+ if(7)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.")
+ holder.icon_state = "gygax14"
+ else
+ user.visible_message("[user] removes the advanced capacitor from [holder].", "You remove the advanced capacitor from [holder].")
+ new /obj/item/weapon/stock_parts/capacitor/adv(get_turf(holder))
+ holder.icon_state = "gygax12"
+ if(6)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
+ holder.icon_state = "gygax15"
+ else
+ user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.")
+ holder.icon_state = "gygax13"
+ if(5)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
+ holder.icon_state = "gygax16"
+ else
+ user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
+ var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
+ MS.amount = 5
+ holder.icon_state = "gygax14"
+ if(4)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
+ holder.icon_state = "gygax17"
+ else
+ user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
+ holder.icon_state = "gygax15"
+ if(3)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs Gygax Armour Plates to [holder].", "You install Gygax Armour Plates to [holder].")
+ qdel(I)
+ holder.icon_state = "gygax18"
+ else
+ user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
+ holder.icon_state = "gygax16"
+ if(2)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures Gygax Armour Plates.", "You secure Gygax Armour Plates.")
+ holder.icon_state = "gygax19"
+ else
+ user.visible_message("[user] pries Gygax Armour Plates from [holder].", "You prie Gygax Armour Plates from [holder].")
+ new /obj/item/mecha_parts/part/gygax_armour(get_turf(holder))
+ holder.icon_state = "gygax17"
+ if(1)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds Gygax Armour Plates to [holder].", "You weld Gygax Armour Plates to [holder].")
+ else
+ user.visible_message("[user] unfastens Gygax Armour Plates.", "You unfasten Gygax Armour Plates.")
+ holder.icon_state = "gygax18"
+ return 1
- spawn_result()
- ..()
- feedback_inc("mecha_gygax_created",1)
- return
+/datum/construction/reversible/mecha/gygax/spawn_result()
+ ..()
+ feedback_inc("mecha_gygax_created",1)
+ return
+////////////////////////
+// Firfighter
+////////////////////////
/datum/construction/mecha/firefighter_chassis
steps = list(list("key"=/obj/item/mecha_parts/part/ripley_torso),//1
list("key"=/obj/item/mecha_parts/part/ripley_left_arm),//2
@@ -566,25 +572,25 @@
list("key"=/obj/item/clothing/suit/fire)//6
)
- custom_action(step, atom/used_atom, mob/user)
- user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]")
- holder.overlays += used_atom.icon_state+"+o"
- user.drop_item()
- qdel(used_atom)
- return 1
+/datum/construction/mecha/firefighter_chassis/custom_action(step, obj/item/I, mob/user)
+ user.visible_message("[user] has connected [I] to [holder].", "You connect [I] to [holder]")
+ holder.overlays += I.icon_state+"+o"
+ user.drop_item()
+ qdel(I)
+ return 1
- action(atom/used_atom,mob/user as mob)
- return check_all_steps(used_atom,user)
+/datum/construction/mecha/firefighter_chassis/action(obj/item/I,mob/user as mob)
+ return check_all_steps(I,user)
- spawn_result()
- var/obj/item/mecha_parts/chassis/const_holder = holder
- const_holder.construct = new /datum/construction/reversible/mecha/firefighter(const_holder)
- const_holder.icon = 'icons/mecha/mech_construction.dmi'
- const_holder.icon_state = "fireripley0"
- const_holder.density = 1
- spawn()
- qdel(src)
- return
+/datum/construction/mecha/firefighter_chassis/spawn_result()
+ var/obj/item/mecha_parts/chassis/const_holder = holder
+ const_holder.construct = new /datum/construction/reversible/mecha/firefighter(const_holder)
+ const_holder.icon = 'icons/mecha/mech_construction.dmi'
+ const_holder.icon_state = "fireripley0"
+ const_holder.density = 1
+ spawn()
+ qdel(src)
+ return
/datum/construction/reversible/mecha/firefighter
@@ -592,15 +598,15 @@
steps = list(
//1
list("key"=/obj/item/weapon/weldingtool,
- "backkey"=/obj/item/weapon/wrench,
+ "backkey"=IS_WRENCH,
"desc"="External armor is wrenched."),
//2
- list("key"=/obj/item/weapon/wrench,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_WRENCH,
+ "backkey"=IS_CROWBAR,
"desc"="External armor is installed."),
//3
list("key"=/obj/item/stack/material/plasteel,
- "backkey"=/obj/item/weapon/crowbar,
+ "backkey"=IS_CROWBAR,
"desc"="External armor is being installed."),
//4
list("key"=/obj/item/stack/material/plasteel,
@@ -608,179 +614,180 @@
"desc"="Internal armor is welded."),
//5
list("key"=/obj/item/weapon/weldingtool,
- "backkey"=/obj/item/weapon/wrench,
+ "backkey"=IS_WRENCH,
"desc"="Internal armor is wrenched"),
//6
- list("key"=/obj/item/weapon/wrench,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_WRENCH,
+ "backkey"=IS_CROWBAR,
"desc"="Internal armor is installed"),
-
//7
list("key"=/obj/item/stack/material/plasteel,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Peripherals control module is secured"),
//8
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Peripherals control module is installed"),
//9
list("key"=/obj/item/weapon/circuitboard/mecha/ripley/peripherals,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Central control module is secured"),
//10
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Central control module is installed"),
//11
list("key"=/obj/item/weapon/circuitboard/mecha/ripley/main,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="The wiring is adjusted"),
//12
- list("key"=/obj/item/weapon/wirecutters,
- "backkey"=/obj/item/weapon/screwdriver,
+ list("key"=/obj/item/weapon/tool/wirecutters,
+ "backkey"=IS_SCREWDRIVER,
"desc"="The wiring is added"),
//13
list("key"=/obj/item/stack/cable_coil,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="The hydraulic systems are active."),
//14
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/wrench,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_WRENCH,
"desc"="The hydraulic systems are connected."),
//15
- list("key"=/obj/item/weapon/wrench,
+ list("key"=IS_WRENCH,
"desc"="The hydraulic systems are disconnected.")
)
- action(atom/used_atom,mob/user as mob)
- return check_step(used_atom,user)
+/datum/construction/reversible/mecha/firefighter/action(obj/item/I,mob/user as mob)
+ return check_step(I,user)
- custom_action(index, diff, atom/used_atom, mob/user)
- if(!..())
- return 0
+/datum/construction/reversible/mecha/firefighter/custom_action(index, diff, obj/item/I, mob/user)
+ if(!..())
+ return 0
- //TODO: better messages.
- switch(index)
- if(15)
- user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
+ //TODO: better messages.
+ switch(index)
+ if(15)
+ user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
+ holder.icon_state = "fireripley1"
+ if(14)
+ if(diff==FORWARD)
+ user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
+ holder.icon_state = "fireripley2"
+ else
+ user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
+ holder.icon_state = "fireripley0"
+ if(13)
+ if(diff==FORWARD)
+ user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
+ holder.icon_state = "fireripley3"
+ else
+ user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
holder.icon_state = "fireripley1"
- if(14)
- if(diff==FORWARD)
- user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
- holder.icon_state = "fireripley2"
- else
- user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
- holder.icon_state = "fireripley0"
- if(13)
- if(diff==FORWARD)
- user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
- holder.icon_state = "fireripley3"
- else
- user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
- holder.icon_state = "fireripley1"
- if(12)
- if(diff==FORWARD)
- user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
- holder.icon_state = "fireripley4"
- else
- user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
- var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
- coil.amount = 4
- holder.icon_state = "fireripley2"
- if(11)
- if(diff==FORWARD)
- user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
- qdel(used_atom)
- holder.icon_state = "fireripley5"
- else
- user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
- holder.icon_state = "fireripley3"
- if(10)
- if(diff==FORWARD)
- user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
- holder.icon_state = "fireripley6"
- else
- user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
- new /obj/item/weapon/circuitboard/mecha/ripley/main(get_turf(holder))
- holder.icon_state = "fireripley4"
- if(9)
- if(diff==FORWARD)
- user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
- qdel(used_atom)
- holder.icon_state = "fireripley7"
- else
- user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
- holder.icon_state = "fireripley5"
- if(8)
- if(diff==FORWARD)
- user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
- holder.icon_state = "fireripley8"
- else
- user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
- new /obj/item/weapon/circuitboard/mecha/ripley/peripherals(get_turf(holder))
- holder.icon_state = "fireripley6"
- if(7)
- if(diff==FORWARD)
- user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
- holder.icon_state = "fireripley9"
- else
- user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
- holder.icon_state = "fireripley7"
+ if(12)
+ if(diff==FORWARD)
+ user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
+ holder.icon_state = "fireripley4"
+ else
+ user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
+ var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
+ coil.amount = 4
+ holder.icon_state = "fireripley2"
+ if(11)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
+ qdel(I)
+ holder.icon_state = "fireripley5"
+ else
+ user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
+ holder.icon_state = "fireripley3"
+ if(10)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
+ holder.icon_state = "fireripley6"
+ else
+ user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/ripley/main(get_turf(holder))
+ holder.icon_state = "fireripley4"
+ if(9)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
+ qdel(I)
+ holder.icon_state = "fireripley7"
+ else
+ user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
+ holder.icon_state = "fireripley5"
+ if(8)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
+ holder.icon_state = "fireripley8"
+ else
+ user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/ripley/peripherals(get_turf(holder))
+ holder.icon_state = "fireripley6"
+ if(7)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
+ holder.icon_state = "fireripley9"
+ else
+ user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
+ holder.icon_state = "fireripley7"
+ if(6)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
+ holder.icon_state = "fireripley10"
+ else
+ user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
+ var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
+ MS.amount = 5
+ holder.icon_state = "fireripley8"
+ if(5)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
+ holder.icon_state = "fireripley11"
+ else
+ user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
+ holder.icon_state = "fireripley9"
+ if(4)
+ if(diff==FORWARD)
+ user.visible_message("[user] starts to install the external armor layer to [holder].", "You start to install the external armor layer to [holder].")
+ holder.icon_state = "fireripley12"
+ else
+ user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
+ holder.icon_state = "fireripley10"
+ if(3)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].")
+ holder.icon_state = "fireripley13"
+ else
+ user.visible_message("[user] removes the external armor from [holder].", "You remove the external armor from [holder].")
+ var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
+ MS.amount = 5
+ holder.icon_state = "fireripley11"
+ if(2)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
+ holder.icon_state = "fireripley14"
+ else
+ user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
+ var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
+ MS.amount = 5
+ holder.icon_state = "fireripley12"
+ if(1)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].")
+ else
+ user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.")
+ holder.icon_state = "fireripley13"
+ return 1
- if(6)
- if(diff==FORWARD)
- user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
- holder.icon_state = "fireripley10"
- else
- user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
- var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
- MS.amount = 5
- holder.icon_state = "fireripley8"
- if(5)
- if(diff==FORWARD)
- user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
- holder.icon_state = "fireripley11"
- else
- user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
- holder.icon_state = "fireripley9"
- if(4)
- if(diff==FORWARD)
- user.visible_message("[user] starts to install the external armor layer to [holder].", "You start to install the external armor layer to [holder].")
- holder.icon_state = "fireripley12"
- else
- user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
- holder.icon_state = "fireripley10"
- if(3)
- if(diff==FORWARD)
- user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].")
- holder.icon_state = "fireripley13"
- else
- user.visible_message("[user] removes the external armor from [holder].", "You remove the external armor from [holder].")
- var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
- MS.amount = 5
- holder.icon_state = "fireripley11"
- if(2)
- if(diff==FORWARD)
- user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
- holder.icon_state = "fireripley14"
- else
- user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
- var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
- MS.amount = 5
- holder.icon_state = "fireripley12"
- if(1)
- if(diff==FORWARD)
- user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].")
- else
- user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.")
- holder.icon_state = "fireripley13"
- return 1
-
- spawn_result()
- ..()
- feedback_inc("mecha_firefighter_created",1)
- return
+/datum/construction/reversible/mecha/firefighter/spawn_result()
+ ..()
+ feedback_inc("mecha_firefighter_created",1)
+ return
+//////////////////////
+// Durand
+//////////////////////
/datum/construction/mecha/durand_chassis
steps = list(list("key"=/obj/item/mecha_parts/part/durand_torso),//1
list("key"=/obj/item/mecha_parts/part/durand_left_arm),//2
@@ -790,35 +797,36 @@
list("key"=/obj/item/mecha_parts/part/durand_head)
)
- custom_action(step, atom/used_atom, mob/user)
- user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]")
- holder.overlays += used_atom.icon_state+"+o"
- qdel(used_atom)
- return 1
+/datum/construction/mecha/durand_chassis/custom_action(step, obj/item/I, mob/user)
+ user.visible_message("[user] has connected [I] to [holder].", "You connect [I] to [holder]")
+ holder.overlays += I.icon_state+"+o"
+ qdel(I)
+ return 1
- action(atom/used_atom,mob/user as mob)
- return check_all_steps(used_atom,user)
+/datum/construction/mecha/durand_chassis/action(obj/item/I,mob/user as mob)
+ return check_all_steps(I,user)
+
+/datum/construction/mecha/durand_chassis/spawn_result()
+ var/obj/item/mecha_parts/chassis/const_holder = holder
+ const_holder.construct = new /datum/construction/reversible/mecha/durand(const_holder)
+ const_holder.icon = 'icons/mecha/mech_construction.dmi'
+ const_holder.icon_state = "durand0"
+ const_holder.density = 1
+ spawn()
+ qdel(src)
+ return
- spawn_result()
- var/obj/item/mecha_parts/chassis/const_holder = holder
- const_holder.construct = new /datum/construction/reversible/mecha/durand(const_holder)
- const_holder.icon = 'icons/mecha/mech_construction.dmi'
- const_holder.icon_state = "durand0"
- const_holder.density = 1
- spawn()
- qdel(src)
- return
/datum/construction/reversible/mecha/durand
result = "/obj/mecha/combat/durand"
steps = list(
//1
list("key"=/obj/item/weapon/weldingtool,
- "backkey"=/obj/item/weapon/wrench,
+ "backkey"=IS_WRENCH,
"desc"="External armor is wrenched."),
//2
- list("key"=/obj/item/weapon/wrench,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_WRENCH,
+ "backkey"=IS_CROWBAR,
"desc"="External armor is installed."),
//3
list("key"=/obj/item/mecha_parts/part/durand_armour,
@@ -826,242 +834,456 @@
"desc"="Internal armor is welded."),
//4
list("key"=/obj/item/weapon/weldingtool,
- "backkey"=/obj/item/weapon/wrench,
+ "backkey"=IS_WRENCH,
"desc"="Internal armor is wrenched"),
//5
- list("key"=/obj/item/weapon/wrench,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_WRENCH,
+ "backkey"=IS_CROWBAR,
"desc"="Internal armor is installed"),
//6
list("key"=/obj/item/stack/material/steel,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Advanced capacitor is secured"),
//7
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Advanced capacitor is installed"),
//8
list("key"=/obj/item/weapon/stock_parts/capacitor/adv,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Advanced scanner module is secured"),
//9
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Advanced scanner module is installed"),
//10
list("key"=/obj/item/weapon/stock_parts/scanning_module/adv,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Targeting module is secured"),
//11
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Targeting module is installed"),
//12
list("key"=/obj/item/weapon/circuitboard/mecha/durand/targeting,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Peripherals control module is secured"),
//13
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Peripherals control module is installed"),
//14
list("key"=/obj/item/weapon/circuitboard/mecha/durand/peripherals,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="Central control module is secured"),
//15
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
"desc"="Central control module is installed"),
//16
list("key"=/obj/item/weapon/circuitboard/mecha/durand/main,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="The wiring is adjusted"),
//17
- list("key"=/obj/item/weapon/wirecutters,
- "backkey"=/obj/item/weapon/screwdriver,
+ list("key"=/obj/item/weapon/tool/wirecutters,
+ "backkey"=IS_SCREWDRIVER,
"desc"="The wiring is added"),
//18
list("key"=/obj/item/stack/cable_coil,
- "backkey"=/obj/item/weapon/screwdriver,
+ "backkey"=IS_SCREWDRIVER,
"desc"="The hydraulic systems are active."),
//19
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/wrench,
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_WRENCH,
"desc"="The hydraulic systems are connected."),
//20
- list("key"=/obj/item/weapon/wrench,
+ list("key"=IS_WRENCH,
"desc"="The hydraulic systems are disconnected.")
)
- action(atom/used_atom,mob/user as mob)
- return check_step(used_atom,user)
+/datum/construction/reversible/mecha/durand/action(obj/item/I,mob/user as mob)
+ return check_step(I,user)
- custom_action(index, diff, atom/used_atom, mob/user)
- if(!..())
- return 0
+/datum/construction/reversible/mecha/durand/custom_action(index, diff, obj/item/I, mob/user)
+ if(!..())
+ return 0
- //TODO: better messages.
- switch(index)
- if(20)
- user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
+ //TODO: better messages.
+ switch(index)
+ if(20)
+ user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
+ holder.icon_state = "durand1"
+ if(19)
+ if(diff==FORWARD)
+ user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
+ holder.icon_state = "durand2"
+ else
+ user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
+ holder.icon_state = "durand0"
+ if(18)
+ if(diff==FORWARD)
+ user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
+ holder.icon_state = "durand3"
+ else
+ user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
holder.icon_state = "durand1"
- if(19)
- if(diff==FORWARD)
- user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
- holder.icon_state = "durand2"
- else
- user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
- holder.icon_state = "durand0"
- if(18)
- if(diff==FORWARD)
- user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
- holder.icon_state = "durand3"
- else
- user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
- holder.icon_state = "durand1"
- if(17)
- if(diff==FORWARD)
- user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
- holder.icon_state = "durand4"
- else
- user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
- var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
- coil.amount = 4
- holder.icon_state = "durand2"
- if(16)
- if(diff==FORWARD)
- user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
- qdel(used_atom)
- holder.icon_state = "durand5"
- else
- user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
- holder.icon_state = "durand3"
- if(15)
- if(diff==FORWARD)
- user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
- holder.icon_state = "durand6"
- else
- user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
- new /obj/item/weapon/circuitboard/mecha/durand/main(get_turf(holder))
- holder.icon_state = "durand4"
- if(14)
- if(diff==FORWARD)
- user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
- qdel(used_atom)
- holder.icon_state = "durand7"
- else
- user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
- holder.icon_state = "durand5"
- if(13)
- if(diff==FORWARD)
- user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
- holder.icon_state = "durand8"
- else
- user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
- new /obj/item/weapon/circuitboard/mecha/durand/peripherals(get_turf(holder))
- holder.icon_state = "durand6"
- if(12)
- if(diff==FORWARD)
- user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].")
- qdel(used_atom)
- holder.icon_state = "durand9"
- else
- user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
- holder.icon_state = "durand7"
- if(11)
- if(diff==FORWARD)
- user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.")
- holder.icon_state = "durand10"
- else
- user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].")
- new /obj/item/weapon/circuitboard/mecha/durand/targeting(get_turf(holder))
- holder.icon_state = "durand8"
- if(10)
- if(diff==FORWARD)
- user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].")
- qdel(used_atom)
- holder.icon_state = "durand11"
- else
- user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.")
- holder.icon_state = "durand9"
- if(9)
- if(diff==FORWARD)
- user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.")
- holder.icon_state = "durand12"
- else
- user.visible_message("[user] removes the advanced scanner module from [holder].", "You remove the advanced scanner module from [holder].")
- new /obj/item/weapon/stock_parts/scanning_module/adv(get_turf(holder))
- holder.icon_state = "durand10"
- if(8)
- if(diff==FORWARD)
- user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].")
- qdel(used_atom)
- holder.icon_state = "durand13"
- else
- user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.")
- holder.icon_state = "durand11"
- if(7)
- if(diff==FORWARD)
- user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.")
- holder.icon_state = "durand14"
- else
- user.visible_message("[user] removes the advanced capacitor from [holder].", "You remove the advanced capacitor from [holder].")
- new /obj/item/weapon/stock_parts/capacitor/adv(get_turf(holder))
- holder.icon_state = "durand12"
- if(6)
- if(diff==FORWARD)
- user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
- holder.icon_state = "durand15"
- else
- user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.")
- holder.icon_state = "durand13"
- if(5)
- if(diff==FORWARD)
- user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
- holder.icon_state = "durand16"
- else
- user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
- var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
- MS.amount = 5
- holder.icon_state = "durand14"
- if(4)
- if(diff==FORWARD)
- user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
- holder.icon_state = "durand17"
- else
- user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
- holder.icon_state = "durand15"
- if(3)
- if(diff==FORWARD)
- user.visible_message("[user] installs Durand Armour Plates to [holder].", "You install Durand Armour Plates to [holder].")
- qdel(used_atom)
- holder.icon_state = "durand18"
- else
- user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
- holder.icon_state = "durand16"
- if(2)
- if(diff==FORWARD)
- user.visible_message("[user] secures Durand Armour Plates.", "You secure Durand Armour Plates.")
- holder.icon_state = "durand19"
- else
- user.visible_message("[user] pries Durand Armour Plates from [holder].", "You prie Durand Armour Plates from [holder].")
- new /obj/item/mecha_parts/part/durand_armour(get_turf(holder))
- holder.icon_state = "durand17"
- if(1)
- if(diff==FORWARD)
- user.visible_message("[user] welds Durand Armour Plates to [holder].", "You weld Durand Armour Plates to [holder].")
- else
- user.visible_message("[user] unfastens Durand Armour Plates.", "You unfasten Durand Armour Plates.")
- holder.icon_state = "durand18"
- return 1
+ if(17)
+ if(diff==FORWARD)
+ user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
+ holder.icon_state = "durand4"
+ else
+ user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
+ var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
+ coil.amount = 4
+ holder.icon_state = "durand2"
+ if(16)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
+ qdel(I)
+ holder.icon_state = "durand5"
+ else
+ user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
+ holder.icon_state = "durand3"
+ if(15)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
+ holder.icon_state = "durand6"
+ else
+ user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/durand/main(get_turf(holder))
+ holder.icon_state = "durand4"
+ if(14)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
+ qdel(I)
+ holder.icon_state = "durand7"
+ else
+ user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
+ holder.icon_state = "durand5"
+ if(13)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
+ holder.icon_state = "durand8"
+ else
+ user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/durand/peripherals(get_turf(holder))
+ holder.icon_state = "durand6"
+ if(12)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].")
+ qdel(I)
+ holder.icon_state = "durand9"
+ else
+ user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
+ holder.icon_state = "durand7"
+ if(11)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.")
+ holder.icon_state = "durand10"
+ else
+ user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/durand/targeting(get_turf(holder))
+ holder.icon_state = "durand8"
+ if(10)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].")
+ qdel(I)
+ holder.icon_state = "durand11"
+ else
+ user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.")
+ holder.icon_state = "durand9"
+ if(9)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.")
+ holder.icon_state = "durand12"
+ else
+ user.visible_message("[user] removes the advanced scanner module from [holder].", "You remove the advanced scanner module from [holder].")
+ new /obj/item/weapon/stock_parts/scanning_module/adv(get_turf(holder))
+ holder.icon_state = "durand10"
+ if(8)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].")
+ qdel(I)
+ holder.icon_state = "durand13"
+ else
+ user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.")
+ holder.icon_state = "durand11"
+ if(7)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.")
+ holder.icon_state = "durand14"
+ else
+ user.visible_message("[user] removes the advanced capacitor from [holder].", "You remove the advanced capacitor from [holder].")
+ new /obj/item/weapon/stock_parts/capacitor/adv(get_turf(holder))
+ holder.icon_state = "durand12"
+ if(6)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
+ holder.icon_state = "durand15"
+ else
+ user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.")
+ holder.icon_state = "durand13"
+ if(5)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
+ holder.icon_state = "durand16"
+ else
+ user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
+ var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
+ MS.amount = 5
+ holder.icon_state = "durand14"
+ if(4)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
+ holder.icon_state = "durand17"
+ else
+ user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
+ holder.icon_state = "durand15"
+ if(3)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs Durand Armour Plates to [holder].", "You install Durand Armour Plates to [holder].")
+ qdel(I)
+ holder.icon_state = "durand18"
+ else
+ user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
+ holder.icon_state = "durand16"
+ if(2)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures Durand Armour Plates.", "You secure Durand Armour Plates.")
+ holder.icon_state = "durand19"
+ else
+ user.visible_message("[user] pries Durand Armour Plates from [holder].", "You prie Durand Armour Plates from [holder].")
+ new /obj/item/mecha_parts/part/durand_armour(get_turf(holder))
+ holder.icon_state = "durand17"
+ if(1)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds Durand Armour Plates to [holder].", "You weld Durand Armour Plates to [holder].")
+ else
+ user.visible_message("[user] unfastens Durand Armour Plates.", "You unfasten Durand Armour Plates.")
+ holder.icon_state = "durand18"
+ return 1
- spawn_result()
- ..()
- feedback_inc("mecha_durand_created",1)
- return
+/datum/construction/reversible/mecha/durand/spawn_result()
+ ..()
+ feedback_inc("mecha_durand_created",1)
+ return
+
+////////////////////////
+// Odysseus
+////////////////////////
+/datum/construction/mecha/odysseus_chassis
+ steps = list(list("key"=/obj/item/mecha_parts/part/odysseus_torso),//1
+ list("key"=/obj/item/mecha_parts/part/odysseus_head),//2
+ list("key"=/obj/item/mecha_parts/part/odysseus_left_arm),//3
+ list("key"=/obj/item/mecha_parts/part/odysseus_right_arm),//4
+ list("key"=/obj/item/mecha_parts/part/odysseus_left_leg),//5
+ list("key"=/obj/item/mecha_parts/part/odysseus_right_leg)//6
+ )
+
+/datum/construction/mecha/odysseus_chassis/custom_action(step, obj/item/I, mob/user)
+ user.visible_message("[user] has connected [I] to [holder].", "You connect [I] to [holder]")
+ holder.overlays += I.icon_state+"+o"
+ qdel(I)
+ return 1
+
+/datum/construction/mecha/odysseus_chassis/action(obj/item/I,mob/user as mob)
+ return check_all_steps(I,user)
+
+/datum/construction/mecha/odysseus_chassis/spawn_result()
+ var/obj/item/mecha_parts/chassis/const_holder = holder
+ const_holder.construct = new /datum/construction/reversible/mecha/odysseus(const_holder)
+ const_holder.icon = 'icons/mecha/mech_construction.dmi'
+ const_holder.icon_state = "odysseus0"
+ const_holder.density = 1
+ spawn()
+ qdel(src)
+ return
+/datum/construction/reversible/mecha/odysseus
+ result = "/obj/mecha/medical/odysseus"
+ steps = list(
+ //1
+ list("key"=/obj/item/weapon/weldingtool,
+ "backkey"=IS_WRENCH,
+ "desc"="External armor is wrenched."),
+ //2
+ list("key"=IS_WRENCH,
+ "backkey"=IS_CROWBAR,
+ "desc"="External armor is installed."),
+ //3
+ list("key"=/obj/item/stack/material/plasteel,
+ "backkey"=/obj/item/weapon/weldingtool,
+ "desc"="Internal armor is welded."),
+ //4
+ list("key"=/obj/item/weapon/weldingtool,
+ "backkey"=IS_WRENCH,
+ "desc"="Internal armor is wrenched"),
+ //5
+ list("key"=IS_WRENCH,
+ "backkey"=IS_CROWBAR,
+ "desc"="Internal armor is installed"),
+ //6
+ list("key"=/obj/item/stack/material/steel,
+ "backkey"=IS_SCREWDRIVER,
+ "desc"="Peripherals control module is secured"),
+ //7
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
+ "desc"="Peripherals control module is installed"),
+ //8
+ list("key"=/obj/item/weapon/circuitboard/mecha/odysseus/peripherals,
+ "backkey"=IS_SCREWDRIVER,
+ "desc"="Central control module is secured"),
+ //9
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
+ "desc"="Central control module is installed"),
+ //10
+ list("key"=/obj/item/weapon/circuitboard/mecha/odysseus/main,
+ "backkey"=IS_SCREWDRIVER,
+ "desc"="The wiring is adjusted"),
+ //11
+ list("key"=/obj/item/weapon/tool/wirecutters,
+ "backkey"=IS_SCREWDRIVER,
+ "desc"="The wiring is added"),
+ //12
+ list("key"=/obj/item/stack/cable_coil,
+ "backkey"=IS_SCREWDRIVER,
+ "desc"="The hydraulic systems are active."),
+ //13
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_WRENCH,
+ "desc"="The hydraulic systems are connected."),
+ //14
+ list("key"=IS_WRENCH,
+ "desc"="The hydraulic systems are disconnected.")
+ )
+
+/datum/construction/reversible/mecha/odysseus/action(obj/item/I,mob/user as mob)
+ return check_step(I,user)
+
+/datum/construction/reversible/mecha/odysseus/custom_action(index, diff, obj/item/I, mob/user)
+ if(!..())
+ return 0
+
+ //TODO: better messages.
+ switch(index)
+ if(14)
+ user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
+ holder.icon_state = "odysseus1"
+ if(13)
+ if(diff==FORWARD)
+ user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
+ holder.icon_state = "odysseus2"
+ else
+ user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
+ holder.icon_state = "odysseus0"
+ if(12)
+ if(diff==FORWARD)
+ user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
+ holder.icon_state = "odysseus3"
+ else
+ user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
+ holder.icon_state = "odysseus1"
+ if(11)
+ if(diff==FORWARD)
+ user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
+ holder.icon_state = "odysseus4"
+ else
+ user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
+ var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
+ coil.amount = 4
+ holder.icon_state = "odysseus2"
+ if(10)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
+ qdel(I)
+ holder.icon_state = "odysseus5"
+ else
+ user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
+ holder.icon_state = "odysseus3"
+ if(9)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
+ holder.icon_state = "odysseus6"
+ else
+ user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/odysseus/main(get_turf(holder))
+ holder.icon_state = "odysseus4"
+ if(8)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
+ qdel(I)
+ holder.icon_state = "odysseus7"
+ else
+ user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
+ holder.icon_state = "odysseus5"
+ if(7)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
+ holder.icon_state = "odysseus8"
+ else
+ user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/odysseus/peripherals(get_turf(holder))
+ holder.icon_state = "odysseus6"
+ if(6)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
+ holder.icon_state = "odysseus9"
+ else
+ user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
+ holder.icon_state = "odysseus7"
+ if(5)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
+ holder.icon_state = "odysseus10"
+ else
+ user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
+ var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
+ MS.amount = 5
+ holder.icon_state = "odysseus8"
+ if(4)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
+ holder.icon_state = "odysseus11"
+ else
+ user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
+ holder.icon_state = "odysseus9"
+ if(3)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs [I] layer to [holder].", "You install external reinforced armor layer to [holder].")
+ holder.icon_state = "odysseus12"
+ else
+ user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
+ holder.icon_state = "odysseus10"
+ if(2)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
+ holder.icon_state = "odysseus13"
+ else
+ var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
+ MS.amount = 5
+ user.visible_message("[user] pries [MS] from [holder].", "You prie [MS] from [holder].")
+ holder.icon_state = "odysseus11"
+ if(1)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].")
+ holder.icon_state = "odysseus14"
+ else
+ user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.")
+ holder.icon_state = "odysseus12"
+ return 1
+
+/datum/construction/reversible/mecha/odysseus/spawn_result()
+ ..()
+ feedback_inc("mecha_odysseus_created",1)
+ return
+
+//////////////////////
+// Phazon
+//////////////////////
/datum/construction/mecha/phazon_chassis
result = "/obj/mecha/combat/phazon"
steps = list(list("key"=/obj/item/mecha_parts/part/phazon_torso),//1
@@ -1072,224 +1294,11 @@
list("key"=/obj/item/mecha_parts/part/phazon_head)
)
- custom_action(step, atom/used_atom, mob/user)
- user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]")
- holder.overlays += used_atom.icon_state+"+o"
- qdel(used_atom)
- return 1
+/datum/construction/mecha/phazon_chassis/custom_action(step, obj/item/I, mob/user)
+ user.visible_message("[user] has connected [I] to [holder].", "You connect [I] to [holder]")
+ holder.overlays += I.icon_state+"+o"
+ qdel(I)
+ return 1
- action(atom/used_atom,mob/user as mob)
- return check_all_steps(used_atom,user)
-
-
-
-
-/datum/construction/mecha/odysseus_chassis
- steps = list(list("key"=/obj/item/mecha_parts/part/odysseus_torso),//1
- list("key"=/obj/item/mecha_parts/part/odysseus_head),//2
- list("key"=/obj/item/mecha_parts/part/odysseus_left_arm),//3
- list("key"=/obj/item/mecha_parts/part/odysseus_right_arm),//4
- list("key"=/obj/item/mecha_parts/part/odysseus_left_leg),//5
- list("key"=/obj/item/mecha_parts/part/odysseus_right_leg)//6
- )
-
- custom_action(step, atom/used_atom, mob/user)
- user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]")
- holder.overlays += used_atom.icon_state+"+o"
- qdel(used_atom)
- return 1
-
- action(atom/used_atom,mob/user as mob)
- return check_all_steps(used_atom,user)
-
- spawn_result()
- var/obj/item/mecha_parts/chassis/const_holder = holder
- const_holder.construct = new /datum/construction/reversible/mecha/odysseus(const_holder)
- const_holder.icon = 'icons/mecha/mech_construction.dmi'
- const_holder.icon_state = "odysseus0"
- const_holder.density = 1
- spawn()
- qdel(src)
- return
-
-
-/datum/construction/reversible/mecha/odysseus
- result = "/obj/mecha/medical/odysseus"
- steps = list(
- //1
- list("key"=/obj/item/weapon/weldingtool,
- "backkey"=/obj/item/weapon/wrench,
- "desc"="External armor is wrenched."),
- //2
- list("key"=/obj/item/weapon/wrench,
- "backkey"=/obj/item/weapon/crowbar,
- "desc"="External armor is installed."),
- //3
- list("key"=/obj/item/stack/material/plasteel,
- "backkey"=/obj/item/weapon/weldingtool,
- "desc"="Internal armor is welded."),
- //4
- list("key"=/obj/item/weapon/weldingtool,
- "backkey"=/obj/item/weapon/wrench,
- "desc"="Internal armor is wrenched"),
- //5
- list("key"=/obj/item/weapon/wrench,
- "backkey"=/obj/item/weapon/crowbar,
- "desc"="Internal armor is installed"),
- //6
- list("key"=/obj/item/stack/material/steel,
- "backkey"=/obj/item/weapon/screwdriver,
- "desc"="Peripherals control module is secured"),
- //7
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
- "desc"="Peripherals control module is installed"),
- //8
- list("key"=/obj/item/weapon/circuitboard/mecha/odysseus/peripherals,
- "backkey"=/obj/item/weapon/screwdriver,
- "desc"="Central control module is secured"),
- //9
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
- "desc"="Central control module is installed"),
- //10
- list("key"=/obj/item/weapon/circuitboard/mecha/odysseus/main,
- "backkey"=/obj/item/weapon/screwdriver,
- "desc"="The wiring is adjusted"),
- //11
- list("key"=/obj/item/weapon/wirecutters,
- "backkey"=/obj/item/weapon/screwdriver,
- "desc"="The wiring is added"),
- //12
- list("key"=/obj/item/stack/cable_coil,
- "backkey"=/obj/item/weapon/screwdriver,
- "desc"="The hydraulic systems are active."),
- //13
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/wrench,
- "desc"="The hydraulic systems are connected."),
- //14
- list("key"=/obj/item/weapon/wrench,
- "desc"="The hydraulic systems are disconnected.")
- )
-
- action(atom/used_atom,mob/user as mob)
- return check_step(used_atom,user)
-
- custom_action(index, diff, atom/used_atom, mob/user)
- if(!..())
- return 0
-
- //TODO: better messages.
- switch(index)
- if(14)
- user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
- holder.icon_state = "odysseus1"
- if(13)
- if(diff==FORWARD)
- user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
- holder.icon_state = "odysseus2"
- else
- user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
- holder.icon_state = "odysseus0"
- if(12)
- if(diff==FORWARD)
- user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
- holder.icon_state = "odysseus3"
- else
- user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
- holder.icon_state = "odysseus1"
- if(11)
- if(diff==FORWARD)
- user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
- holder.icon_state = "odysseus4"
- else
- user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
- var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
- coil.amount = 4
- holder.icon_state = "odysseus2"
- if(10)
- if(diff==FORWARD)
- user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
- qdel(used_atom)
- holder.icon_state = "odysseus5"
- else
- user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
- holder.icon_state = "odysseus3"
- if(9)
- if(diff==FORWARD)
- user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
- holder.icon_state = "odysseus6"
- else
- user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
- new /obj/item/weapon/circuitboard/mecha/odysseus/main(get_turf(holder))
- holder.icon_state = "odysseus4"
- if(8)
- if(diff==FORWARD)
- user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
- qdel(used_atom)
- holder.icon_state = "odysseus7"
- else
- user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
- holder.icon_state = "odysseus5"
- if(7)
- if(diff==FORWARD)
- user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
- holder.icon_state = "odysseus8"
- else
- user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
- new /obj/item/weapon/circuitboard/mecha/odysseus/peripherals(get_turf(holder))
- holder.icon_state = "odysseus6"
- if(6)
- if(diff==FORWARD)
- user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
- holder.icon_state = "odysseus9"
- else
- user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
- holder.icon_state = "odysseus7"
- if(5)
- if(diff==FORWARD)
- user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
- holder.icon_state = "odysseus10"
- else
- user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
- var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
- MS.amount = 5
- holder.icon_state = "odysseus8"
- if(4)
- if(diff==FORWARD)
- user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
- holder.icon_state = "odysseus11"
- else
- user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
- holder.icon_state = "odysseus9"
- if(3)
- if(diff==FORWARD)
- user.visible_message("[user] installs [used_atom] layer to [holder].", "You install external reinforced armor layer to [holder].")
-
- holder.icon_state = "odysseus12"
- else
- user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
- holder.icon_state = "odysseus10"
- if(2)
- if(diff==FORWARD)
- user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
- holder.icon_state = "odysseus13"
- else
- var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
- MS.amount = 5
- user.visible_message("[user] pries [MS] from [holder].", "You prie [MS] from [holder].")
- holder.icon_state = "odysseus11"
- if(1)
- if(diff==FORWARD)
- user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].")
- holder.icon_state = "odysseus14"
- else
- user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.")
- holder.icon_state = "odysseus12"
- return 1
-
- spawn_result()
- ..()
- feedback_inc("mecha_odysseus_created",1)
- return
+/datum/construction/mecha/phazon_chassis/action(obj/item/I,mob/user as mob)
+ return check_all_steps(I,user)
\ No newline at end of file
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index 39620c4742..73cee1223b 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -34,7 +34,7 @@
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(salvage_num <= 0)
- user << "You don't see anything that can be cut with [W]."
+ to_chat(user, "You don't see anything that can be cut with [W].")
return
if (!isemptylist(welder_salvage) && WT.remove_fuel(0,user))
var/type = prob(70)?pick(welder_salvage):null
@@ -45,13 +45,13 @@
welder_salvage -= type
salvage_num--
else
- user << "You failed to salvage anything valuable from [src]."
+ to_chat(user, "You failed to salvage anything valuable from [src].")
else
- user << "You need more welding fuel to complete this task."
+ to_chat(user, "You need more welding fuel to complete this task.")
return
- if(istype(W, /obj/item/weapon/wirecutters))
+ if(W.is_wirecutter())
if(salvage_num <= 0)
- user << "You don't see anything that can be cut with [W]."
+ to_chat(user, "You don't see anything that can be cut with [W].")
return
else if(!isemptylist(wirecutters_salvage))
var/type = prob(70)?pick(wirecutters_salvage):null
@@ -60,8 +60,8 @@
user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].")
salvage_num--
else
- user << "You failed to salvage anything valuable from [src]."
- if(istype(W, /obj/item/weapon/crowbar))
+ to_chat(user, "You failed to salvage anything valuable from [src].")
+ if(W.is_crowbar())
if(!isemptylist(crowbar_salvage))
var/obj/S = pick(crowbar_salvage)
if(S)
@@ -70,7 +70,7 @@
user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].")
return
else
- user << "You don't see anything that can be pried with [W]."
+ to_chat(user, "You don't see anything that can be pried with [W].")
else
..()
return
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 90f708ff9d..0369b91d63 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -248,6 +248,6 @@ var/global/list/image/splatter_cache=list()
//This version should be used for admin spawns and pre-mapped virus vectors (e.g. in PoIs), this version does not dry
/obj/effect/decal/cleanable/mucus/mapped/New()
- ...()
+ ..()
virus2 = new /datum/disease2/disease
virus2.makerandom()
diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm
index 695f8d3b79..0d7370d269 100644
--- a/code/game/objects/effects/decals/contraband.dm
+++ b/code/game/objects/effects/decals/contraband.dm
@@ -122,7 +122,7 @@
icon_state = design.icon_state // poster[serial_number]
/obj/structure/sign/poster/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wirecutters))
+ if(W.is_wirecutter())
playsound(src.loc, W.usesound, 100, 1)
if(ruined)
user << "You remove the remnants of the poster."
diff --git a/code/game/objects/effects/item_pickup_ghost.dm b/code/game/objects/effects/item_pickup_ghost.dm
new file mode 100644
index 0000000000..0944e2753e
--- /dev/null
+++ b/code/game/objects/effects/item_pickup_ghost.dm
@@ -0,0 +1,19 @@
+/obj/effect/temporary_effect/item_pickup_ghost
+ anchored = 1
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
+ mouse_opacity = 0//just in case something dumb happens
+ time_to_die = 0.5 SECONDS
+ var/lifetime = 0.25 SECONDS //so it doesn't die before animation ends
+
+/obj/effect/temporary_effect/item_pickup_ghost/proc/assumeform(var/obj/item/picked_up)
+ icon = picked_up.icon
+ icon_state = picked_up.icon_state
+ pixel_x = picked_up.pixel_x
+ pixel_y = picked_up.pixel_y
+ color = picked_up.color
+
+/obj/effect/temporary_effect/item_pickup_ghost/proc/animate_towards(var/atom/target)
+ var/new_pixel_x = pixel_x + (target.x - src.x) * 32
+ var/new_pixel_y = pixel_y + (target.y - src.y) * 32
+ animate(src, pixel_x = new_pixel_x, pixel_y = new_pixel_y, transform = matrix()*0, time = lifetime)
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index a1a6623ff1..9ea690318b 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -47,13 +47,13 @@
explode(M)
/obj/effect/mine/attackby(obj/item/W as obj, mob/living/user as mob)
- if(isscrewdriver(W))
+ if(W.is_screwdriver())
panel_open = !panel_open
user.visible_message("[user] very carefully screws the mine's panel [panel_open ? "open" : "closed"].",
"You very carefully screw the mine's panel [panel_open ? "open" : "closed"].")
playsound(src.loc, W.usesound, 50, 1)
- else if((iswirecutter(W) || ismultitool(W)) && panel_open)
+ else if((W.is_wirecutter() || istype(W, /obj/item/device/multitool)) && panel_open)
interact(user)
else
..()
diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm
index aaebab4355..d7db6f2a0c 100644
--- a/code/game/objects/effects/misc.dm
+++ b/code/game/objects/effects/misc.dm
@@ -46,4 +46,21 @@
/obj/effect/temporary_effect/shuttle_landing/initialize()
flick("shuttle_warning", src) // flick() forces the animation to always begin at the start.
+ . = ..()
+
+// The manifestation of Zeus's might. Or just a really unlucky day.
+// This is purely a visual effect, this isn't the part of the code that hurts things.
+/obj/effect/temporary_effect/lightning_strike
+ name = "lightning"
+ desc = "How shocked you must be, to see this text. You must have lightning reflexes. \
+ The humor in this description is just so electrifying."
+ icon = 'icons/effects/96x256.dmi'
+ icon_state = "lightning_strike"
+ plane = PLANE_LIGHTING_ABOVE
+ time_to_die = 1 SECOND
+ pixel_x = -32
+
+/obj/effect/temporary_effect/lightning_strike/initialize()
+ icon_state += "[rand(1,2)]" // To have two variants of lightning sprites.
+ animate(src, alpha = 0, time = time_to_die - 1)
. = ..()
\ No newline at end of file
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index 702926d6ff..dc4bf5146a 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -1,3 +1,5 @@
+GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal)
+
/obj/effect/portal
name = "portal"
desc = "Looks unstable. Best to test it with the clown."
@@ -29,6 +31,7 @@
return
/obj/effect/portal/New()
+ ..() // Necessary for the list boilerplate to work
spawn(300)
qdel(src)
return
diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm
index a58241ada2..febfff6d0f 100644
--- a/code/game/objects/effects/step_triggers.dm
+++ b/code/game/objects/effects/step_triggers.dm
@@ -158,7 +158,14 @@ var/global/list/tele_landmarks = list() // Terrible, but the alternative is loop
/obj/effect/step_trigger/teleporter/planetary_fall
var/datum/planet/planet = null
+// First time setup, which planet are we aiming for?
+/obj/effect/step_trigger/teleporter/planetary_fall/proc/find_planet()
+ return
+
/obj/effect/step_trigger/teleporter/planetary_fall/Trigger(var/atom/movable/A)
+ if(!planet)
+ find_planet()
+
if(planet)
if(!planet.planet_floors.len)
message_admins("ERROR: planetary_fall step trigger's list of outdoor floors was empty.")
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index f6eec0de71..9132cf4b12 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -46,7 +46,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
var/close = range(world.view+round(devastation_range,1), epicenter)
// to all distanced mobs play a different sound
- for(var/mob/M in world)
+ for(var/mob/M in player_list)
if(M.z == epicenter.z)
if(!(M in close))
// check if the mob can hear
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 748a203cc4..4a80379c16 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -211,6 +211,8 @@
if(!temp)
user << "You try to use your hand, but realize it is no longer attached!"
return
+
+ var/old_loc = src.loc
src.pickup(user)
if (istype(src.loc, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = src.loc
@@ -223,7 +225,11 @@
else
if(isliving(src.loc))
return
- user.put_in_active_hand(src)
+ if(user.put_in_active_hand(src))
+ if(isturf(old_loc))
+ var/obj/effect/temporary_effect/item_pickup_ghost/ghost = new(old_loc)
+ ghost.assumeform(src)
+ ghost.animate_towards(user)
return
/obj/item/attack_ai(mob/user as mob)
@@ -678,6 +684,10 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
/obj/item/proc/is_hot()
return FALSE
+// Called when you swap hands away from the item
+/obj/item/proc/in_inactive_hand(mob/user)
+ return
+
// My best guess as to why this is here would be that it does so little. Still, keep it under all the procs, for sanity's sake.
/obj/item/device
icon = 'icons/obj/device.dmi'
@@ -796,3 +806,27 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
/obj/item/proc/apply_accessories(var/image/standing)
return standing
+/*
+ * Assorted tool procs, so any item can emulate any tool, if coded
+*/
+/obj/item/proc/is_screwdriver()
+ return FALSE
+
+/obj/item/proc/is_wrench()
+ return FALSE
+
+/obj/item/proc/is_crowbar()
+ return FALSE
+
+/obj/item/proc/is_wirecutter()
+ return FALSE
+
+// These next three might bug out or runtime, unless someone goes back and finds a way to generalize their specific code
+/obj/item/proc/is_cable_coil()
+ return FALSE
+
+/obj/item/proc/is_multitool()
+ return FALSE
+
+/obj/item/proc/is_welder()
+ return FALSE
\ No newline at end of file
diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm
index fd2ea3e94b..fe40f772dd 100644
--- a/code/game/objects/items/apc_frame.dm
+++ b/code/game/objects/items/apc_frame.dm
@@ -9,7 +9,7 @@
/obj/item/frame/apc/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
- if (istype(W, /obj/item/weapon/wrench))
+ if (W.is_wrench())
new /obj/item/stack/material/steel( get_turf(src.loc), 2 )
qdel(src)
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index 302c7df568..324c5560a3 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -42,7 +42,7 @@
storage_capacity = (MOB_MEDIUM * 2) - 1
var/contains_body = 0
-/obj/structure/closet/body_bag/attackby(W as obj, mob/user as mob)
+/obj/structure/closet/body_bag/attackby(var/obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/pen))
var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
if (user.get_active_hand() != W)
@@ -58,7 +58,7 @@
src.name = "body bag"
//..() //Doesn't need to run the parent. Since when can fucking bodybags be welded shut? -Agouri
return
- else if(istype(W, /obj/item/weapon/wirecutters))
+ else if(W.is_wirecutter())
to_chat(user, "You cut the tag off the bodybag")
src.name = "body bag"
src.overlays.Cut()
@@ -239,7 +239,7 @@
inject_occupant(H)
break
- else if(istype(W,/obj/item/weapon/screwdriver))
+ else if(W.is_screwdriver())
if(syringe)
if(used)
to_chat(user,"The injector cannot be removed now that the stasis bag has been used!")
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 78ee749ceb..5df1daff3d 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -653,8 +653,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "pda.tmpl", title, 520, 400, state = inventory_state)
+ // add templates for screens in common with communicator.
+ ui.add_template("atmosphericScan", "atmospheric_scan.tmpl")
// when the ui is first opened this is the data it will use
-
ui.set_initial_data(data)
// open the new ui window
ui.open()
@@ -893,7 +894,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if("Toggle Door")
if(cartridge && cartridge.access_remote_door)
- for(var/obj/machinery/door/blast/M in world)
+ for(var/obj/machinery/door/blast/M in machines)
if(M.id == cartridge.remote_door_id)
if(M.density)
M.open()
@@ -1247,19 +1248,24 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(issilicon(usr))
return
- if(can_use(usr) && !isnull(cartridge))
- cartridge.forceMove(get_turf(src))
- if(ismob(loc))
- var/mob/M = loc
- M.put_in_hands(cartridge)
- mode = 0
- scanmode = 0
- if (cartridge.radio)
- cartridge.radio.hostpda = null
- to_chat(usr, "You remove \the [cartridge] from the [name].")
- cartridge = null
- else
+ if(!can_use(usr))
to_chat(usr, "You cannot do this while restrained.")
+ return
+
+ if(isnull(cartridge))
+ to_chat(usr, "There's no cartridge to eject.")
+ return
+
+ cartridge.forceMove(get_turf(src))
+ if(ismob(loc))
+ var/mob/M = loc
+ M.put_in_hands(cartridge)
+ mode = 0
+ scanmode = 0
+ if (cartridge.radio)
+ cartridge.radio.hostpda = null
+ to_chat(usr, "You remove \the [cartridge] from the [name].")
+ cartridge = null
/obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use.
if(choice == 1)
@@ -1376,7 +1382,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
to_chat(user, "Blood type: [C:blood_DNA[blood]]\nDNA: [blood]")
if(4)
- user.visible_message("\The [user] has analyzed [C]'s radiation levels!", 1)
+ user.visible_message("\The [user] has analyzed [C]'s radiation levels!", "You have analyzed [C]'s radiation levels!")
to_chat(user, "Analyzing Results for [C]:")
if(C.radiation)
to_chat(user, "Radiation Level: [C.radiation]")
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 4b088f51b8..4832bdcc53 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -434,7 +434,7 @@ var/list/civilian_cartridges = list(
for(var/S in supply_controller.shoppinglist)
var/datum/supply_order/SO = S
- supplyOrderData[++supplyOrderData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "ApprovedBy" = SO.orderedby, "Comment" = html_encode(SO.comment))
+ supplyOrderData[++supplyOrderData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "ApprovedBy" = SO.ordered_by, "Comment" = html_encode(SO.comment))
if(!supplyOrderData.len)
supplyOrderData[++supplyOrderData.len] = list("Number" = null, "Name" = null, "OrderedBy"=null)
@@ -443,10 +443,13 @@ var/list/civilian_cartridges = list(
var/requestCount = 0
var/requestData[0]
- for(var/S in supply_controller.requestlist)
+ for(var/S in supply_controller.order_history)
var/datum/supply_order/SO = S
+ if(SO.status != SUP_ORDER_REQUESTED)
+ continue
+
requestCount++
- requestData[++requestData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "OrderedBy" = SO.orderedby, "Comment" = html_encode(SO.comment))
+ requestData[++requestData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "OrderedBy" = SO.ordered_by, "Comment" = html_encode(SO.comment))
if(!requestData.len)
requestData[++requestData.len] = list("Number" = null, "Name" = null, "orderedBy" = null, "Comment" = null)
@@ -468,7 +471,7 @@ var/list/civilian_cartridges = list(
else
JaniData["user_loc"] = list("x" = 0, "y" = 0)
var/MopData[0]
- for(var/obj/item/weapon/mop/M in world)
+ for(var/obj/item/weapon/mop/M in all_mops)
var/turf/ml = get_turf(M)
if(ml)
if(ml.z != cl.z)
@@ -481,7 +484,7 @@ var/list/civilian_cartridges = list(
var/BucketData[0]
- for(var/obj/structure/mopbucket/B in world)
+ for(var/obj/structure/mopbucket/B in all_mopbuckets)
var/turf/bl = get_turf(B)
if(bl)
if(bl.z != cl.z)
@@ -493,7 +496,7 @@ var/list/civilian_cartridges = list(
BucketData[++BucketData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
var/CbotData[0]
- for(var/mob/living/bot/cleanbot/B in world)
+ for(var/mob/living/bot/cleanbot/B in mob_list)
var/turf/bl = get_turf(B)
if(bl)
if(bl.z != cl.z)
@@ -505,7 +508,7 @@ var/list/civilian_cartridges = list(
if(!CbotData.len)
CbotData[++CbotData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
var/CartData[0]
- for(var/obj/structure/janitorialcart/B in world)
+ for(var/obj/structure/janitorialcart/B in all_janitorial_carts)
var/turf/bl = get_turf(B)
if(bl)
if(bl.z != cl.z)
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index b57c67bac0..7e288dbadc 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -64,20 +64,24 @@
add_attack_logs(user,carded_ai,"Purged from AI Card")
flush = 1
carded_ai.suiciding = 1
- carded_ai << "Your power has been disabled!"
+ to_chat(carded_ai, "Your power has been disabled!")
while (carded_ai && carded_ai.stat != 2)
+ if(carded_ai.controlling_drone && prob(carded_ai.oxyloss)) //You feel it creeping? Eventually will reach 100, resulting in the second half of the AI's remaining life being lonely.
+ carded_ai.controlling_drone.release_ai_control("Unit lost. Integrity too low to maintain connection.")
carded_ai.adjustOxyLoss(2)
carded_ai.updatehealth()
sleep(10)
flush = 0
if (href_list["radio"])
carded_ai.aiRadio.disabledAi = text2num(href_list["radio"])
- carded_ai << "Your Subspace Transceiver has been [carded_ai.aiRadio.disabledAi ? "disabled" : "enabled"]!"
- user << "You [carded_ai.aiRadio.disabledAi ? "disable" : "enable"] the AI's Subspace Transceiver."
+ to_chat(carded_ai, "Your Subspace Transceiver has been [carded_ai.aiRadio.disabledAi ? "disabled" : "enabled"]!")
+ to_chat(user, "You [carded_ai.aiRadio.disabledAi ? "disable" : "enable"] the AI's Subspace Transceiver.")
if (href_list["wireless"])
carded_ai.control_disabled = text2num(href_list["wireless"])
- carded_ai << "Your wireless interface has been [carded_ai.control_disabled ? "disabled" : "enabled"]!"
- user << "You [carded_ai.control_disabled ? "disable" : "enable"] the AI's wireless interface."
+ to_chat(carded_ai, "Your wireless interface has been [carded_ai.control_disabled ? "disabled" : "enabled"]!")
+ to_chat(user, "You [carded_ai.control_disabled ? "disable" : "enable"] the AI's wireless interface.")
+ if(carded_ai.control_disabled && carded_ai.controlling_drone)
+ carded_ai.controlling_drone.release_ai_control("Unit control terminated at intellicore port.")
update_icon()
return 1
@@ -94,12 +98,12 @@
icon_state = "aicard"
/obj/item/device/aicard/proc/grab_ai(var/mob/living/silicon/ai/ai, var/mob/living/user)
- if(!ai.client)
- user << "ERROR: AI [ai.name] is offline. Unable to transfer."
+ if(!ai.client && !ai.controlling_drone)
+ to_chat(user, "ERROR: AI [ai.name] is offline. Unable to transfer.")
return 0
if(carded_ai)
- user << "Transfer failed: Existing AI found on remote device. Remove existing AI to install a new one."
+ to_chat(user, "Transfer failed: Existing AI found on remote device. Remove existing AI to install a new one.")
return 0
if(!user.IsAdvancedToolUser() && isanimal(user))
@@ -108,7 +112,9 @@
return 0
user.visible_message("\The [user] starts transferring \the [ai] into \the [src]...", "You start transferring \the [ai] into \the [src]...")
- ai << "\The [user] is transferring you into \the [src]!"
+ to_chat(ai, "\The [user] is transferring you into \the [src]!")
+ if(ai.controlling_drone)
+ to_chat(ai.controlling_drone, "\The [user] is transferring you into \the [src]!")
if(do_after(user, 100))
if(istype(ai.loc, /turf/))
@@ -124,11 +130,13 @@
ai.control_disabled = 1
ai.aiRestorePowerRoutine = 0
carded_ai = ai
+ if(ai.controlling_drone)
+ ai.controlling_drone.release_ai_control("Unit control lost.")
if(ai.client)
- ai << "You have been transferred into a mobile core. Remote access lost."
+ to_chat(ai, "You have been transferred into a mobile core. Remote access lost.")
if(user.client)
- user << "Transfer successful: [ai.name] extracted from current device and placed within mobile core."
+ to_chat(ai, "Transfer successful: [ai.name] extracted from current device and placed within mobile core.")
ai.canmove = 1
update_icon()
diff --git a/code/game/objects/items/devices/communicator/UI.dm b/code/game/objects/items/devices/communicator/UI.dm
index f2d3fd39b6..fca4cf4866 100644
--- a/code/game/objects/items/devices/communicator/UI.dm
+++ b/code/game/objects/items/devices/communicator/UI.dm
@@ -69,17 +69,16 @@
im_list_ui[++im_list_ui.len] = list("address" = I["address"], "to_address" = I["to_address"], "im" = I["im"])
//Weather reports.
- if(planet_controller)
- for(var/datum/planet/planet in planet_controller.planets)
- if(planet.weather_holder && planet.weather_holder.current_weather)
- var/list/W = list(
- "Planet" = planet.name,
- "Time" = planet.current_time.show_time("hh:mm"),
- "Weather" = planet.weather_holder.current_weather.name,
- "Temperature" = planet.weather_holder.temperature - T0C,
- "High" = planet.weather_holder.current_weather.temp_high - T0C,
- "Low" = planet.weather_holder.current_weather.temp_low - T0C)
- weather[++weather.len] = W
+ for(var/datum/planet/planet in SSplanets.planets)
+ if(planet.weather_holder && planet.weather_holder.current_weather)
+ var/list/W = list(
+ "Planet" = planet.name,
+ "Time" = planet.current_time.show_time("hh:mm"),
+ "Weather" = planet.weather_holder.current_weather.name,
+ "Temperature" = planet.weather_holder.temperature - T0C,
+ "High" = planet.weather_holder.current_weather.temp_high - T0C,
+ "Low" = planet.weather_holder.current_weather.temp_low - T0C)
+ weather[++weather.len] = W
injection = "Test "
@@ -118,6 +117,8 @@
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "communicator.tmpl", "Communicator", 475, 700, state = key_state)
+ // add templates for screens in common with communicator.
+ ui.add_template("atmosphericScan", "atmospheric_scan.tmpl")
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm
index af9d697d63..9b127da04a 100644
--- a/code/game/objects/items/devices/defib.dm
+++ b/code/game/objects/items/devices/defib.dm
@@ -94,7 +94,7 @@
to_chat(user, "You install a cell in \the [src].")
update_icon()
- else if(isscrewdriver(W))
+ else if(W.is_screwdriver())
if(bcell)
bcell.update_icon()
bcell.forceMove(get_turf(src.loc))
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 6d512981ae..44d3c98c8c 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -10,6 +10,8 @@
action_button_name = "Toggle Flashlight"
var/on = 0
var/brightness_on = 4 //luminosity when on
+ var/flashlight_power = 0.8 //lighting power when on
+ var/flashlight_colour = LIGHT_COLOR_INCANDESCENT_FLASHLIGHT //lighting colour when on
var/obj/item/weapon/cell/cell
var/cell_type = /obj/item/weapon/cell/device
var/list/brightness_levels
@@ -39,6 +41,9 @@
processing_objects -= src
return ..()
+/obj/item/device/flashlight/get_cell()
+ return cell
+
/obj/item/device/flashlight/verb/toggle()
set name = "Toggle Flashlight Brightness"
set category = "Object"
@@ -71,11 +76,11 @@
icon_state = "[initial(icon_state)]-on"
if(brightness_level == "low")
- set_light(brightness_on/2)
+ set_light(brightness_on/2, flashlight_power*0.75, flashlight_colour)
else if(brightness_level == "high")
- set_light(brightness_on*1.5)
+ set_light(brightness_on*1.5, flashlight_power*1.1, flashlight_colour)
else
- set_light(brightness_on)
+ set_light(brightness_on, flashlight_power, flashlight_colour)
else
icon_state = "[initial(icon_state)]"
@@ -267,6 +272,7 @@
name = "maglight"
desc = "A very, very heavy duty flashlight."
icon_state = "maglight"
+ flashlight_colour = LIGHT_COLOR_FLUORESCENT_FLASHLIGHT
force = 10
flags = CONDUCT
slot_flags = SLOT_BELT
@@ -303,7 +309,7 @@
desc = "A classic green-shaded desk lamp."
icon_state = "lampgreen"
brightness_on = 5
- light_color = "#FFC58F"
+ flashlight_colour = "#FFC58F"
/obj/item/device/flashlight/lamp/verb/toggle_light()
set name = "Toggle light"
@@ -320,8 +326,8 @@
desc = "A red standard-issue flare. There are instructions on the side reading 'pull cord, make light'."
w_class = ITEMSIZE_SMALL
brightness_on = 8 // Pretty bright.
- light_power = 3
- light_color = LIGHT_COLOR_FLARE
+ flashlight_power = 0.8
+ flashlight_colour = LIGHT_COLOR_FLARE
icon_state = "flare"
item_state = "flare"
action_button_name = null //just pull it manually, neckbeard.
@@ -383,8 +389,8 @@
desc = "A green military-grade glowstick."
w_class = ITEMSIZE_SMALL
brightness_on = 4
- light_power = 2
- light_color = "#49F37C"
+ flashlight_power = 0.9
+ flashlight_colour = "#49F37C"
icon_state = "glowstick"
item_state = "glowstick"
var/fuel = 0
@@ -422,28 +428,28 @@
/obj/item/device/flashlight/glowstick/red
name = "red glowstick"
desc = "A red military-grade glowstick."
- light_color = "#FC0F29"
+ flashlight_colour = "#FC0F29"
icon_state = "glowstick_red"
item_state = "glowstick_red"
/obj/item/device/flashlight/glowstick/blue
name = "blue glowstick"
desc = "A blue military-grade glowstick."
- light_color = "#599DFF"
+ flashlight_colour = "#599DFF"
icon_state = "glowstick_blue"
item_state = "glowstick_blue"
/obj/item/device/flashlight/glowstick/orange
name = "orange glowstick"
desc = "A orange military-grade glowstick."
- light_color = "#FA7C0B"
+ flashlight_colour = "#FA7C0B"
icon_state = "glowstick_orange"
item_state = "glowstick_orange"
/obj/item/device/flashlight/glowstick/yellow
name = "yellow glowstick"
desc = "A yellow military-grade glowstick."
- light_color = "#FEF923"
+ flashlight_colour = "#FEF923"
icon_state = "glowstick_yellow"
item_state = "glowstick_yellow"
@@ -454,7 +460,7 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "floor1" //not a slime extract sprite but... something close enough!
item_state = "slime"
- light_color = "#FFF423"
+ flashlight_colour = "#FFF423"
w_class = ITEMSIZE_TINY
brightness_on = 6
on = 1 //Bio-luminesence has one setting, on.
@@ -462,7 +468,7 @@
/obj/item/device/flashlight/slime/New()
..()
- set_light(brightness_on)
+ set_light(brightness_on, flashlight_power, flashlight_colour)
/obj/item/device/flashlight/slime/update_icon()
return
diff --git a/code/game/objects/items/devices/hacktool.dm b/code/game/objects/items/devices/hacktool.dm
index 9ae5f62732..b5d6439da3 100644
--- a/code/game/objects/items/devices/hacktool.dm
+++ b/code/game/objects/items/devices/hacktool.dm
@@ -24,7 +24,7 @@
return ..()
/obj/item/device/multitool/hacktool/attackby(var/obj/item/W, var/mob/user)
- if(isscrewdriver(W))
+ if(W.is_screwdriver())
in_hack_mode = !in_hack_mode
playsound(src.loc, W.usesound, 50, 1)
else
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
new file mode 100644
index 0000000000..343a58ce1a
--- /dev/null
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -0,0 +1,219 @@
+/obj/item/device/laser_pointer
+ name = "laser pointer"
+ desc = "Don't shine it in your eyes!"
+ icon = 'icons/obj/device.dmi'
+ icon_state = "pointer"
+ item_state = "pen"
+ var/pointer_icon_state
+ slot_flags = SLOT_BELT
+ matter = list("glass" = 500,"metal" = 500)
+ w_class = 2 //Increased to 2, because diodes are w_class 2. Conservation of matter.
+ origin_tech = list(TECH_MAGNET = 2, TECH_COMBAT = 1)
+ var/turf/pointer_loc
+ var/energy = 8
+ var/max_energy = 8
+ var/effectchance = 20
+ var/cooldown = 10
+ var/last_used_time = 0
+ var/recharging = 0
+ var/recharge_locked = 0
+ var/obj/item/weapon/stock_parts/micro_laser/diode //used for upgrading!
+
+
+/obj/item/device/laser_pointer/red
+ pointer_icon_state = "red_laser"
+/obj/item/device/laser_pointer/green
+ pointer_icon_state = "green_laser"
+/obj/item/device/laser_pointer/blue
+ pointer_icon_state = "blue_laser"
+/obj/item/device/laser_pointer/purple
+ pointer_icon_state = "purple_laser"
+
+/obj/item/device/laser_pointer/New()
+ ..()
+ diode = new(src)
+ if(!pointer_icon_state)
+ pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser")
+
+/obj/item/device/laser_pointer/upgraded/New()
+ ..()
+ diode = new /obj/item/weapon/stock_parts/micro_laser/ultra
+
+
+
+/obj/item/device/laser_pointer/attack(mob/living/M, mob/user)
+ laser_act(M, user)
+
+/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user)
+ if(istype(W, /obj/item/weapon/stock_parts/micro_laser))
+ if(!diode)
+ user.drop_item()
+ W.loc = src
+ diode = W
+ to_chat(user, "You install a [diode.name] in [src].")
+ else
+ to_chat(user, "[src] already has a diode.")
+
+ else if(W.is_screwdriver())
+ if(diode)
+ to_chat(user, "You remove the [diode.name] from the [src].")
+ diode.loc = get_turf(src.loc)
+ diode = null
+ return
+ ..()
+ return
+
+/obj/item/device/laser_pointer/afterattack(var/atom/target, var/mob/living/user, flag, params)
+ if(flag) //we're placing the object on a table or in backpack
+ return
+ laser_act(target, user)
+
+/obj/item/device/laser_pointer/proc/laser_act(var/atom/target, var/mob/living/user)
+ if(!(user in (viewers(world.view,target))))
+ return
+ if(!(world.time - last_used_time >= cooldown))
+ return
+ if (!diode)
+ to_chat(user, "You point [src] at [target], but nothing happens!")
+ return
+ if (!user.IsAdvancedToolUser())
+ to_chat(user, "You don't have the dexterity to do this!")
+ return
+
+ add_fingerprint(user)
+
+ //nothing happens if the battery is drained
+ if(recharge_locked)
+ to_chat(user, "You point [src] at [target], but it's still charging.")
+ return
+
+ var/outmsg
+ var/turf/targloc = get_turf(target)
+
+ //human/alien mobs
+ if(iscarbon(target))
+ if(user.zone_sel.selecting == "eyes")
+ var/mob/living/carbon/C = target
+
+ //20% chance to actually hit the eyes
+
+ if(prob(effectchance * diode.rating))
+ add_attack_logs(user,C,"Tried blinding using [src]")
+
+ //eye target check, will return -1 to 2
+ var/eye_prot = C.eyecheck()
+ if(C.blinded)
+ eye_prot = 4
+ var/severity = (rand(0, 1) + diode.rating - eye_prot)
+ var/mob/living/carbon/human/H = C
+ var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
+ if(!E)
+ outmsg = "You shine [src] at [C], but they don't seem to have eyes."
+ return
+
+ outmsg = "You shine [src] into [C]'s eyes."
+ switch(severity)
+ if(0)
+ //rank 1 diode with basic eye protection (like sunglasses), or rank 2 with industrial protection (like welding goggles)
+ to_chat(C, "A small, bright dot appears in your vision.")
+ if(1)
+ //rank 1 with no protection, rank 2 with basic protection, or rank 3 with industrial protection
+ to_chat(C, "Something bright flashes in the corner of your vision.")
+ if(2)
+ //rank 1 or 2 with no protection, rank 2 or 3 with basic protection, or rank 3 with industrial protection
+ //alternatively, rank 1 with minor vulnerability (like night vision goggles)
+ flick("flash", C.flash_eyes())
+ to_chat(C, "A bright light shines across your eyes!")
+ if(3)
+ //rank 1 with minor vulnerability, rank 2 or 3 with no protection, or rank 3 with basic protection
+ if(prob(3 * diode.rating))
+ C.Weaken(1)
+ flick("flash", C.flash_eyes())
+ E.damage += 1
+ to_chat(C, "A bright light briefly blinds you!")
+ if(4)
+ //rank 3 with no protection, or rank 2 with minor vulnerability
+ if(prob(5 * diode.rating))
+ C.Weaken(1)
+ flick("e_flash", C.flash_eyes())
+ E.damage += 2
+ to_chat(C, "A blinding light burns your eyes!")
+ else
+ outmsg = "You shine the [src] at [C], but miss their eyes."
+
+ //robots and AI
+ else if(issilicon(target))
+ var/mob/living/silicon/S = target
+ //20% chance to actually hit the sensors
+ if(prob(effectchance * diode.rating))
+ flick("flash", S.flash_eyes(affect_silicon = TRUE))
+ if (prob(3 * diode.rating))
+ S.Weaken(1)
+ to_chat(S, "Your sensors were blinded by a laser!")
+ outmsg = "You blind [S] by shining [src] at their sensors."
+ add_attack_logs(user,S,"Tried disabling using [src]")
+ else
+ outmsg = "You shine the [src] at [S], but miss their sensors."
+
+ //cameras
+ else if(istype(target, /obj/machinery/camera))
+ var/obj/machinery/camera/C = target
+ if(prob(effectchance * diode.rating))
+ C.emp_act(4 - diode.rating)
+ outmsg = "You shine the [src] into the lens of [C]."
+ add_attack_logs(user,C.name,"Tried disabling using [src]")
+ else
+ outmsg = "You missed the lens of [C] with [src]."
+
+ //cats!
+ for(var/mob/living/simple_animal/cat/C in viewers(1,targloc))
+ if (!(C.stat || C.buckled))
+ if(prob(50) && !(C.client))
+ C.visible_message("[C] pounces on the light!", "You pounce on the light!")
+ step_towards(C, targloc)
+ C.lay_down()
+ spawn(10)
+ C.lay_down()
+ else
+ C.set_dir(get_dir(C,targloc))
+ C.visible_message("[C] watches the light.", "Your attention is drawn to the mysterious glowing dot.")
+
+
+ //laser pointer image
+ icon_state = "pointer_[pointer_icon_state]"
+ var/list/showto = list()
+ for(var/mob/M in viewers(world.view,targloc))
+ if(M.client)
+ showto.Add(M.client)
+ var/image/I = image('icons/obj/projectiles.dmi',targloc,pointer_icon_state,cooldown)
+ I.plane = PLANE_LIGHTING_ABOVE
+ I.pixel_x = target.pixel_x + rand(-5,5)
+ I.pixel_y = target.pixel_y + rand(-5,5)
+
+ if(outmsg)
+ user.visible_message("[user] points [src] at [target].", outmsg)
+ else
+ user.visible_message("[user] points [src] at [target].", "You point [src] at [target].")
+
+ last_used_time = world.time
+ energy -= 1
+ if(energy <= max_energy)
+ if(!recharging)
+ recharging = 1
+ processing_objects.Add(src)
+ if(energy <= 0)
+ to_chat(user, "You've overused the battery of [src], now it needs time to recharge!")
+ recharge_locked = 1
+
+ flick_overlay(I, showto, cooldown)
+ spawn(cooldown)
+ icon_state = "pointer"
+
+/obj/item/device/laser_pointer/process()
+ if(prob(20 - recharge_locked*5))
+ energy += 1
+ if(energy >= max_energy)
+ energy = max_energy
+ recharging = 0
+ recharge_locked = 0
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index ca4b8d8066..9c9f1aba59 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -10,44 +10,162 @@
var/insults = 0
var/list/insultmsg = list("FUCK EVERYONE!", "I'M A TERRORIST!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "GLORY TO ALMACH!")
-/obj/item/device/megaphone/attack_self(mob/living/user as mob)
+/obj/item/device/megaphone/proc/can_broadcast(var/mob/living/user)
if (user.client)
if(user.client.prefs.muted & MUTE_IC)
- src << "You cannot speak in IC (muted)."
- return
- if(!ishuman(user))
- user << "You don't know how to use this!"
- return
+ to_chat(user, "You cannot speak in IC (muted).")
+ return 0
+ if(!(ishuman(user) || user.isSynthetic()))
+ to_chat(user, "You don't know how to use this!")
+ return 0
if(user.silent)
- return
+ return 0
if(spamcheck)
- user << "\The [src] needs to recharge!"
- return
+ to_chat(user, "\The [src] needs to recharge!")
+ return 0
+ return 1
- var/message = sanitize(input(user, "Shout a message?", "Megaphone", null) as text)
- if(!message)
- return
- message = capitalize(message)
+/obj/item/device/megaphone/proc/do_broadcast(var/mob/living/user, var/message)
if ((src.loc == user && usr.stat == 0))
if(emagged)
if(insults)
- for(var/mob/O in (viewers(user)))
- O.show_message("[user] broadcasts, \"[pick(insultmsg)]\"",2) // 2 stands for hearable message
+ user.audible_message("[user] broadcasts, \"[pick(insultmsg)]\"")
insults--
else
- user << "*BZZZZzzzzzt*"
+ to_chat(user, "*BZZZZzzzzzt*")
else
- for(var/mob/O in (viewers(user)))
- O.show_message("[user] broadcasts, \"[message]\"",2) // 2 stands for hearable message
+ user.audible_message("[user] broadcasts, \"[message]\"")
spamcheck = 1
spawn(20)
spamcheck = 0
return
+/obj/item/device/megaphone/attack_self(mob/living/user as mob)
+ if(!can_broadcast(user))
+ return
+
+ var/message = sanitize(input(user, "Shout a message?", "Megaphone", null) as text)
+ if(!message)
+ return
+ message = capitalize(message)
+
+ do_broadcast(user, message)
+
/obj/item/device/megaphone/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
- user << "You overload \the [src]'s voice synthesizer."
+ to_chat(user, "You overload \the [src]'s voice synthesizer.")
emagged = 1
- insults = rand(1, 3)//to prevent dickflooding
+ insults = rand(1, 3)//to prevent caps spam.
return 1
+
+/obj/item/device/megaphone/super
+ name = "gigaphone"
+ desc = "A device used to project your voice. Loudly-er."
+ icon_state = "gigaphone"
+
+ var/broadcast_font = "verdana"
+ var/broadcast_size = 3
+ var/broadcast_color = "#000000" //Black by default.
+ var/list/volume_options = list(2, 3, 4)
+ var/list/font_options = list("times new roman", "times", "verdana", "sans-serif", "serif", "georgia")
+ var/list/color_options= list("#000000", "#ff0000", "#00ff00", "#0000ff")
+
+ insultmsg = list("HONK?!", "HONK!", "HOOOOOOOONK!", "...!", "HUNK.", "Honk?")
+
+/obj/item/device/megaphone/super/emag_act(var/remaining_charges, var/mob/user)
+ ..()
+ if(emagged)
+ if(!(11 in volume_options))
+ volume_options = list(11)
+ broadcast_size = 11
+ if(!("comic sans ms" in font_options))
+ font_options = list("comic sans ms")
+ broadcast_font = "comic sans ms"
+ to_chat(user, "\The [src] emits a silly sound.")
+ if(!("#ff69b4" in color_options))
+ color_options = list("#ff69b4")
+ broadcast_color = "#ff69b4"
+ if(insults <= 0)
+ insults = rand(1,3)
+ to_chat(user, "You re-scramble \the [src]'s voice synthesizer.")
+ return 1
+
+/obj/item/device/megaphone/super/verb/turn_volume_dial()
+ set name = "Change Volume"
+ set desc = "Allows you to change the megaphone's volume."
+ set category = "Object"
+
+ adjust_volume(usr)
+
+/obj/item/device/megaphone/super/proc/adjust_volume(var/mob/living/user)
+ var/new_volume = input(user, "Set Volume") as null|anything in volume_options
+
+ if(new_volume && Adjacent(user))
+ broadcast_size = new_volume
+
+/obj/item/device/megaphone/super/verb/change_font()
+ set name = "Change... Pronunciation?"
+ set desc = "Allows you to change the megaphone's font."
+ set category = "Object"
+
+ adjust_font(usr)
+
+/obj/item/device/megaphone/super/proc/adjust_font(var/mob/living/user)
+ var/new_font = input(user, "Set Volume") as null|anything in font_options
+
+ if(new_font && Adjacent(user))
+ broadcast_font = new_font
+
+/obj/item/device/megaphone/super/verb/change_color()
+ set name = "Change... Tune?"
+ set desc = "Allows you to change the megaphone's color."
+ set category = "Object"
+
+ adjust_color(usr)
+
+/obj/item/device/megaphone/super/proc/adjust_color(var/mob/living/user)
+ var/new_color = input(user, "Set Volume") as null|anything in color_options
+
+ if(new_color && Adjacent(user))
+ broadcast_color = new_color
+
+/obj/item/device/megaphone/super/do_broadcast(var/mob/living/user, var/message)
+ if ((src.loc == user && usr.stat == 0))
+ if(emagged)
+ if(insults)
+ user.audible_message("[user] broadcasts, \"[pick(insultmsg)]\"")
+ if(broadcast_size >= 11)
+ var/turf/T = get_turf(user)
+ playsound(T, 'sound/items/AirHorn.ogg', 100, 1)
+ for(var/mob/living/carbon/M in oviewers(4, T))
+ if(M.get_ear_protection() >= 2)
+ continue
+ M.sleeping = 0
+ M.stuttering += 20
+ M.ear_deaf += 30
+ M.Weaken(3)
+ if(prob(30))
+ M.Stun(10)
+ M.Paralyse(4)
+ else
+ M.make_jittery(50)
+ insults--
+ else
+ user.audible_message("*BZZZZzzzzzt*")
+ if(prob(40) && insults <= 0)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, get_turf(user))
+ s.start()
+ user.visible_message("\The [src] sparks violently!")
+ spawn(30)
+ explosion(get_turf(src), -1, -1, 1, 3, adminlog = 1)
+ qdel(src)
+ return
+ else
+ user.audible_message("[user] broadcasts, \"[message]\"")
+
+ spamcheck = 1
+ spawn(20)
+ spamcheck = 0
+ return
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index 2cf67da30c..8f2827c7ab 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -1,3 +1,5 @@
+GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
+
/obj/item/device/paicard
name = "personal AI device"
icon = 'icons/obj/pda.dmi'
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index f3bc620d08..6ea73e8c78 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -30,13 +30,13 @@
..()
/obj/item/device/powersink/attackby(var/obj/item/I, var/mob/user)
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
if(mode == 0)
var/turf/T = loc
if(isturf(T) && !!T.is_plating())
attached = locate() in T
if(!attached)
- user << "No exposed cable here to attach to."
+ to_chat(user, "No exposed cable here to attach to.")
return
else
anchored = 1
@@ -45,7 +45,7 @@
playsound(src, I.usesound, 50, 1)
return
else
- user << "Device must be placed over an exposed cable to attach to it."
+ to_chat(user, "Device must be placed over an exposed cable to attach to it.")
return
else
if (mode == 2)
diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm
index 7d41e25bc4..5bd91e81b6 100644
--- a/code/game/objects/items/devices/radio/beacon.dm
+++ b/code/game/objects/items/devices/radio/beacon.dm
@@ -6,6 +6,8 @@
var/code = "electronic"
origin_tech = list(TECH_BLUESPACE = 1)
+GLOBAL_LIST_BOILERPLATE(all_beacons, /obj/item/device/radio/beacon)
+
/obj/item/device/radio/beacon/hear_talk()
return
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 105eb3aa8f..a67a2bef7b 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -40,8 +40,8 @@
if(!(..(user, 1) && radio_desc))
return
- user << "The following channels are available:"
- user << radio_desc
+ to_chat(user, "The following channels are available:")
+ to_chat(user, radio_desc)
/obj/item/device/radio/headset/handle_message_mode(mob/living/M as mob, message, channel)
if (channel == "special")
@@ -326,10 +326,10 @@
/obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob)
// ..()
user.set_machine(src)
- if (!( istype(W, /obj/item/weapon/screwdriver) || (istype(W, /obj/item/device/encryptionkey/ ))))
+ if(!(W.is_screwdriver() || istype(W, /obj/item/device/encryptionkey)))
return
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
if(keyslot1 || keyslot2)
@@ -353,15 +353,15 @@
keyslot2 = null
recalculateChannels()
- user << "You pop out the encryption keys in the headset!"
+ to_chat(user, "You pop out the encryption keys in the headset!")
playsound(src, W.usesound, 50, 1)
else
- user << "This headset doesn't have any encryption keys! How useless..."
+ to_chat(user, "This headset doesn't have any encryption keys! How useless...")
if(istype(W, /obj/item/device/encryptionkey/))
if(keyslot1 && keyslot2)
- user << "The headset can't hold another key!"
+ to_chat(user, "The headset can't hold another key!")
return
if(!keyslot1)
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 81e3227022..364323d183 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -2,6 +2,8 @@
name = "station intercom (General)"
desc = "Talk through this."
icon_state = "intercom"
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
anchored = 1
w_class = ITEMSIZE_LARGE
canhear_range = 2
@@ -116,9 +118,9 @@
/obj/item/device/radio/intercom/attackby(obj/item/W as obj, mob/user as mob)
add_fingerprint(user)
- if(istype(W, /obj/item/weapon/screwdriver)) // Opening the intercom up.
+ if(W.is_screwdriver()) // Opening the intercom up.
wiresexposed = !wiresexposed
- user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
+ to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]")
playsound(src, W.usesound, 50, 1)
if(wiresexposed)
if(!on)
@@ -128,7 +130,7 @@
else
icon_state = "intercom"
return
- if(wiresexposed && istype(W, /obj/item/weapon/wirecutters))
+ if(wiresexposed && W.is_wirecutter())
user.visible_message("[user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].")
playsound(src, W.usesound, 50, 1)
new/obj/item/stack/cable_coil(get_turf(src), 5)
diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm
index 680b5e2b37..868f90251c 100644
--- a/code/game/objects/items/devices/radio/jammer.dm
+++ b/code/game/objects/items/devices/radio/jammer.dm
@@ -38,6 +38,9 @@ var/global/list/active_radio_jammers = list()
qdel_null(power_source)
return ..()
+/obj/item/device/radio_jammer/get_cell()
+ return power_source
+
/obj/item/device/radio_jammer/proc/turn_off(mob/user)
if(user)
to_chat(user,"\The [src] deactivates.")
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index f5f85fe8f5..350caf013c 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -247,14 +247,12 @@ var/global/list/default_medbay_channels = list(
if (!connection)
return
- var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(src, null, null, 1)
+ var/static/mob/living/silicon/ai/announcer/A = new /mob/living/silicon/ai/announcer(src, null, null, 1)
A.SetName(from)
Broadcast_Message(connection, A,
0, "*garbled automated announcement*", src,
message, from, "Automated Announcement", from, "synthesized voice",
4, 0, list(0), connection.frequency, "states")
- qdel(A)
- return
// Interprets the message mode when talking into a radio, possibly returning a connection datum
/obj/item/device/radio/proc/handle_message_mode(mob/living/M as mob, message, message_mode)
@@ -563,7 +561,7 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
user.set_machine(src)
- if (!( istype(W, /obj/item/weapon/screwdriver) ))
+ if (!W.is_screwdriver())
return
b_stat = !( b_stat )
if(!istype(src, /obj/item/device/radio/beacon))
@@ -615,10 +613,10 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio/borg/attackby(obj/item/weapon/W as obj, mob/user as mob)
// ..()
user.set_machine(src)
- if (!( istype(W, /obj/item/weapon/screwdriver) || (istype(W, /obj/item/device/encryptionkey/ ))))
+ if (!(W.is_screwdriver() || istype(W, /obj/item/device/encryptionkey)))
return
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
if(keyslot)
@@ -634,15 +632,15 @@ var/global/list/default_medbay_channels = list(
keyslot = null
recalculateChannels()
- user << "You pop out the encryption key in the radio!"
+ to_chat(user, "You pop out the encryption key in the radio!")
playsound(src, W.usesound, 50, 1)
else
- user << "This radio doesn't have any encryption keys!"
+ to_chat(user, "This radio doesn't have any encryption keys!")
if(istype(W, /obj/item/device/encryptionkey/))
if(keyslot)
- user << "The radio can't hold another key!"
+ to_chat(user, "The radio can't hold another key!")
return
if(!keyslot)
@@ -694,9 +692,9 @@ var/global/list/default_medbay_channels = list(
if(enable_subspace_transmission != subspace_transmission)
subspace_transmission = !subspace_transmission
if(subspace_transmission)
- usr << "Subspace Transmission is enabled"
+ to_chat(usr, "Subspace Transmission is enabled")
else
- usr << "Subspace Transmission is disabled"
+ to_chat(usr, "Subspace Transmission is disabled")
if(subspace_transmission == 0)//Simple as fuck, clears the channel list to prevent talking/listening over them if subspace transmission is disabled
channels = list()
@@ -709,10 +707,10 @@ var/global/list/default_medbay_channels = list(
shut_up = !shut_up
if(shut_up)
canhear_range = 0
- usr << "Loadspeaker disabled."
+ to_chat(usr, "Loadspeaker disabled.")
else
canhear_range = 3
- usr << "Loadspeaker enabled."
+ to_chat(usr, "Loadspeaker enabled.")
. = 1
if(.)
diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm
index 2040f22a99..6efc045785 100644
--- a/code/game/objects/items/devices/suit_cooling.dm
+++ b/code/game/objects/items/devices/suit_cooling.dm
@@ -122,7 +122,7 @@
cell.add_fingerprint(user)
cell.update_icon()
- user << "You remove \the [src.cell]."
+ to_chat(user, "You remove \the [src.cell].")
src.cell = null
updateicon()
return
@@ -134,16 +134,16 @@
turn_off()
else
turn_on()
- user << "You switch \the [src] [on ? "on" : "off"]."
+ to_chat(user, "You switch \the [src] [on ? "on" : "off"].")
/obj/item/device/suit_cooling_unit/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/screwdriver))
+ if (W.is_screwdriver())
if(cover_open)
cover_open = 0
- user << "You screw the panel into place."
+ to_chat(user, "You screw the panel into place.")
else
cover_open = 1
- user << "You unscrew the panel."
+ to_chat(user, "You unscrew the panel.")
playsound(src, W.usesound, 50, 1)
updateicon()
return
@@ -151,12 +151,12 @@
if (istype(W, /obj/item/weapon/cell))
if(cover_open)
if(cell)
- user << "There is a [cell] already installed here."
+ to_chat(user, "There is a [cell] already installed here.")
else
user.drop_item()
W.loc = src
cell = W
- user << "You insert the [cell]."
+ to_chat(user, "You insert the [cell].")
updateicon()
return
@@ -177,19 +177,19 @@
if (on)
if (attached_to_suit(src.loc))
- user << "It's switched on and running."
+ to_chat(user, "It's switched on and running.")
else
- user << "It's switched on, but not attached to anything."
+ to_chat(user, "It's switched on, but not attached to anything.")
else
- user << "It is switched off."
+ to_chat(user, "It is switched off.")
if (cover_open)
if(cell)
- user << "The panel is open, exposing the [cell]."
+ to_chat(user, "The panel is open, exposing the [cell].")
else
- user << "The panel is open."
+ to_chat(user, "The panel is open.")
if (cell)
- user << "The charge meter reads [round(cell.percent())]%."
+ to_chat(user, "The charge meter reads [round(cell.percent())]%.")
else
- user << "It doesn't have a power cell installed."
+ to_chat(user, "It doesn't have a power cell installed.")
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 791725c14b..841bcc18ed 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -414,7 +414,7 @@
/obj/item/device/tape/attackby(obj/item/I, mob/user, params)
- if(ruined && istype(I, /obj/item/weapon/screwdriver))
+ if(ruined && I.is_screwdriver())
to_chat(user, "You start winding the tape back in...")
playsound(src, I.usesound, 50, 1)
if(do_after(user, 120 * I.toolspeed, target = src))
diff --git a/code/game/objects/items/poi_items.dm b/code/game/objects/items/poi_items.dm
index 8d11e747f6..394212e4c4 100644
--- a/code/game/objects/items/poi_items.dm
+++ b/code/game/objects/items/poi_items.dm
@@ -28,14 +28,8 @@
icon_closed = "poireactor"
climbable = 0
-/obj/structure/closet/crate/oldreactor/New()
- ..()
- new /obj/item/weapon/fuel_assembly/deuterium(src)
- new /obj/item/weapon/fuel_assembly/deuterium(src)
- new /obj/item/weapon/fuel_assembly/deuterium(src)
- new /obj/item/weapon/fuel_assembly/deuterium(src)
- new /obj/item/weapon/fuel_assembly/deuterium(src)
- new /obj/item/weapon/fuel_assembly/deuterium(src)
+ starts_with = list(
+ /obj/item/weapon/fuel_assembly/deuterium = 6)
/obj/item/poi/brokenoldreactor
icon_state = "poireactor_broken"
@@ -51,4 +45,16 @@
/obj/item/poi/brokenoldreactor/Destroy()
processing_objects -= src
- return ..()
\ No newline at end of file
+ return ..()
+
+
+//Crashed Cargo Shuttle PoI
+
+/obj/structure/largecrate/animal/crashedshuttle
+ name = "SCP"
+
+/obj/structure/largecrate/animal/crashedshuttle/initialize()
+ starts_with = pick(/mob/living/simple_animal/hostile/statue, /obj/item/cursed_marble, /obj/item/weapon/deadringer)
+ name = pick("Spicy Crust Pizzeria", "Soap and Care Products", "Sally's Computer Parts", "Steve's Chocolate Pastries", "Smith & Christian's Plastics","Standard Containers & Packaging Co.", "Sanitary Chemical Purgation (LTD)")
+ name += " delivery crate"
+ return ..()
diff --git a/code/game/objects/items/stacks/marker_beacons.dm b/code/game/objects/items/stacks/marker_beacons.dm
index 2194b84fbd..f252ecae06 100644
--- a/code/game/objects/items/stacks/marker_beacons.dm
+++ b/code/game/objects/items/stacks/marker_beacons.dm
@@ -83,7 +83,7 @@ var/list/marker_beacon_colors = list(
// layer = BELOW_OPEN_DOOR_LAYER
anchored = TRUE
light_range = 2
- light_power = 3
+ light_power = 0.8
var/remove_speed = 15
var/picked_color
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index b5ff773e8b..672a711a74 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -9,6 +9,7 @@
throw_range = 20
var/heal_brute = 0
var/heal_burn = 0
+ var/apply_sounds
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
if (!istype(M))
@@ -65,6 +66,7 @@
icon_state = "brutepack"
origin_tech = list(TECH_BIO = 1)
no_variants = FALSE
+ apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg')
/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -112,6 +114,7 @@
"You place a bandaid over \a [W.desc] on [M]'s [affecting.name]." )
W.bandage()
W.disinfect()
+ playsound(src, pick(apply_sounds), 25)
used++
affecting.update_damages()
if(used == amount)
@@ -130,6 +133,7 @@
heal_burn = 1
origin_tech = list(TECH_BIO = 1)
no_variants = FALSE
+ apply_sounds = list('sound/effects/ointment.ogg')
/obj/item/stack/medical/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -159,6 +163,7 @@
"You salved wounds on [M]'s [affecting.name]." )
use(1)
affecting.salve()
+ playsound(src, pick(apply_sounds), 25)
/obj/item/stack/medical/advanced/bruise_pack
name = "advanced trauma kit"
@@ -167,6 +172,7 @@
icon_state = "traumakit"
heal_brute = 3
origin_tech = list(TECH_BIO = 1)
+ apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg','sound/effects/tape.ogg')
/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -212,6 +218,7 @@
W.bandage()
W.disinfect()
W.heal_damage(heal_brute)
+ playsound(src, pick(apply_sounds), 25)
used++
affecting.update_damages()
if(used == amount)
@@ -228,7 +235,7 @@
icon_state = "burnkit"
heal_burn = 3
origin_tech = list(TECH_BIO = 1)
-
+ apply_sounds = list('sound/effects/ointment.ogg')
/obj/item/stack/medical/advanced/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -258,6 +265,7 @@
affecting.heal_damage(0,heal_burn)
use(1)
affecting.salve()
+ playsound(src, pick(apply_sounds), 25)
/obj/item/stack/medical/splint
name = "medical splints"
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 5c17634ae2..18b13a8034 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -199,3 +199,9 @@
throw_range = 20
flags = 0
no_variants = FALSE
+
+/obj/item/stack/tile/roofing
+ name = "roofing"
+ singular_name = "roofing"
+ desc = "A section of roofing material. You can use it to repair the ceiling, or expand it."
+ icon_state = "techtile_grid"
\ No newline at end of file
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 02a308555b..02e121d02c 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -1042,6 +1042,50 @@
name = "tuxedo cat plushie"
icon_state = "tuxedocat"
+// nah, squids are better than foxes :>
+
+/obj/item/toy/plushie/squid/green
+ name = "green squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is green."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "greensquid"
+ slot_flags = SLOT_HEAD
+
+/obj/item/toy/plushie/squid/mint
+ name = "mint squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is mint coloured."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "mintsquid"
+ slot_flags = SLOT_HEAD
+
+/obj/item/toy/plushie/squid/blue
+ name = "blue squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is blue."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "bluesquid"
+ slot_flags = SLOT_HEAD
+
+/obj/item/toy/plushie/squid/orange
+ name = "orange squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is orange."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "orangesquid"
+ slot_flags = SLOT_HEAD
+
+/obj/item/toy/plushie/squid/yellow
+ name = "yellow squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is yellow."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "yellowsquid"
+ slot_flags = SLOT_HEAD
+
+/obj/item/toy/plushie/squid/pink
+ name = "pink squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is pink."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "pinksquid"
+ slot_flags = SLOT_HEAD
+
/obj/item/toy/plushie/therapy/red
name = "red therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is red."
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 58aa30547d..d9543fed20 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -153,7 +153,7 @@
return 0
if(build_turf)
- T.ChangeTurf(build_turf)
+ T.ChangeTurf(build_turf, preserve_outdoors = TRUE)
else if(build_other)
new build_other(T)
else
diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm
index d9606d28d2..7cddfd1efc 100644
--- a/code/game/objects/items/weapons/autopsy.dm
+++ b/code/game/objects/items/weapons/autopsy.dm
@@ -167,21 +167,24 @@
if(!istype(M))
return 0
+ if (user.a_intent == I_HELP)
+ return ..()
+
if(target_name != M.name)
target_name = M.name
src.wdata = list()
src.chemtraces = list()
src.timeofdeath = null
- user << "A new patient has been registered. Purging data for previous patient."
+ to_chat(user, "A new patient has been registered. Purging data for previous patient.")
src.timeofdeath = M.timeofdeath
var/obj/item/organ/external/S = M.get_organ(user.zone_sel.selecting)
if(!S)
- usr << "You can't scan this body part."
+ to_chat(user, "You can't scan this body part.")
return
if(!S.open)
- usr << "You have to cut [S] open first!"
+ to_chat(user, "You have to cut [S] open first!")
return
M.visible_message("\The [user] scans the wounds on [M]'s [S.name] with [src]")
diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm
index 71d6e2d867..c15d73036a 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm
@@ -153,11 +153,6 @@
name = T_BOARD("disease splicer")
build_path = /obj/machinery/computer/diseasesplicer
-/obj/item/weapon/circuitboard/ordercomp
- name = T_BOARD("supply ordering console")
- build_path = /obj/machinery/computer/ordercomp
- origin_tech = list(TECH_DATA = 2)
-
/obj/item/weapon/circuitboard/mining_shuttle
name = T_BOARD("mining shuttle console")
build_path = /obj/machinery/computer/shuttle_control/mining
diff --git a/code/game/objects/items/weapons/circuitboards/computer/research.dm b/code/game/objects/items/weapons/circuitboards/computer/research.dm
index fa9ed16797..791cd51cdc 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/research.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/research.dm
@@ -7,15 +7,15 @@
build_path = /obj/machinery/computer/rdconsole/core
/obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I,/obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
playsound(src, I.usesound, 50, 1)
user.visible_message("\The [user] adjusts the jumper on \the [src]'s access protocol pins.", "You adjust the jumper on the access protocol pins.")
if(build_path == /obj/machinery/computer/rdconsole/core)
name = T_BOARD("RD Console - Robotics")
build_path = /obj/machinery/computer/rdconsole/robotics
- user << "Access protocols set to robotics."
+ to_chat(user, "Access protocols set to robotics.")
else
name = T_BOARD("RD Console")
build_path = /obj/machinery/computer/rdconsole/core
- user << "Access protocols set to default."
+ to_chat(user, "Access protocols set to default.")
return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/circuitboards/computer/supply.dm b/code/game/objects/items/weapons/circuitboards/computer/supply.dm
index 5924e19ac0..324f1c1a06 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/supply.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/supply.dm
@@ -3,11 +3,16 @@
#endif
/obj/item/weapon/circuitboard/supplycomp
- name = T_BOARD("supply control console")
+ name = T_BOARD("supply ordering console")
build_path = /obj/machinery/computer/supplycomp
- origin_tech = list(TECH_DATA = 3)
+ origin_tech = list(TECH_DATA = 2)
var/contraband_enabled = 0
+/obj/item/weapon/circuitboard/supplycomp/control
+ name = T_BOARD("supply ordering console")
+ build_path = /obj/machinery/computer/supplycomp/control
+ origin_tech = list(TECH_DATA = 3)
+
/obj/item/weapon/circuitboard/supplycomp/construct(var/obj/machinery/computer/supplycomp/SC)
if (..(SC))
SC.can_order_contraband = contraband_enabled
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm
index 31e0d9c063..3fc0aa26ab 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm
@@ -12,17 +12,17 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/stock_parts/scanning_module = 1)
obj/item/weapon/circuitboard/rdserver/attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I,/obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
playsound(src, I.usesound, 50, 1)
user.visible_message("\The [user] adjusts the jumper on \the [src]'s access protocol pins.", "You adjust the jumper on the access protocol pins.")
if(build_path == /obj/machinery/r_n_d/server/core)
name = T_BOARD("RD Console - Robotics")
build_path = /obj/machinery/r_n_d/server/robotics
- user << "Access protocols set to robotics."
+ to_chat(user, "Access protocols set to robotics.")
else
name = T_BOARD("RD Console")
build_path = /obj/machinery/r_n_d/server/core
- user << "Access protocols set to default."
+ to_chat(user, "Access protocols set to default.")
return
/obj/item/weapon/circuitboard/destructive_analyzer
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index b49a76c5a9..5290ac7479 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -25,11 +25,11 @@
return ..()
/obj/item/weapon/plastique/attackby(var/obj/item/I, var/mob/user)
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
open_panel = !open_panel
user << "You [open_panel ? "open" : "close"] the wire panel."
playsound(src, I.usesound, 50, 1)
- else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler ))
+ else if(I.is_wirecutter() || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler ))
wires.Interact(user)
else
..()
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 649b5677ca..3f62ac2725 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -70,7 +70,7 @@
/obj/item/weapon/flamethrower/attackby(obj/item/W as obj, mob/user as mob)
if(user.stat || user.restrained() || user.lying) return
- if(iswrench(W) && !status)//Taking this apart
+ if(W.is_wrench() && !status)//Taking this apart
var/turf/T = get_turf(src)
if(weldtool)
weldtool.loc = T
@@ -85,7 +85,7 @@
qdel(src)
return
- if(isscrewdriver(W) && igniter && !lit)
+ if(W.is_screwdriver() && igniter && !lit)
status = !status
user << "[igniter] is now [status ? "secured" : "unsecured"]!"
update_icon()
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index bef0f8fcd9..177d674c6b 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -46,7 +46,7 @@
/obj/effect/spresent/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
- if (!istype(W, /obj/item/weapon/wirecutters))
+ if (!W.is_wirecutter())
user << "I need wirecutters for that."
return
@@ -129,7 +129,8 @@
if (!( locate(/obj/structure/table, src.loc) ))
user << "You MUST put the paper on a table!"
if (W.w_class < ITEMSIZE_LARGE)
- if (user.get_type_in_hands(/obj/item/weapon/wirecutters))
+ var/obj/item/I = user.get_inactive_hand()
+ if(I.is_wirecutter())
var/a_used = 2 ** (src.w_class - 1)
if (src.amount < a_used)
user << "You need more paper!"
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 92de17d994..f8b1f5692d 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -41,7 +41,7 @@
user.put_in_hands(B)
name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]"
if(stage > 1 && !active && clown_check(user))
- user << "You prime \the [name]!"
+ to_chat(user, "You prime \the [name]!")
msg_admin_attack("[key_name_admin(user)] primed \a [src]")
@@ -56,13 +56,13 @@
if(istype(W,/obj/item/device/assembly_holder) && (!stage || stage==1) && path != 2)
var/obj/item/device/assembly_holder/det = W
if(istype(det.a_left,det.a_right.type) || (!isigniter(det.a_left) && !isigniter(det.a_right)))
- user << "Assembly must contain one igniter."
+ to_chat(user, "Assembly must contain one igniter.")
return
if(!det.secured)
- user << "Assembly must be secured with screwdriver."
+ to_chat(user, "Assembly must be secured with screwdriver.")
return
path = 1
- user << "You add [W] to the metal casing."
+ to_chat(user, "You add [W] to the metal casing.")
playsound(src.loc, 'sound/items/Screwdriver2.ogg', 25, -3)
user.remove_from_mob(det)
det.loc = src
@@ -76,26 +76,26 @@
icon_state = initial(icon_state) +"_ass"
name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]"
stage = 1
- else if(istype(W,/obj/item/weapon/screwdriver) && path != 2)
+ else if(W.is_screwdriver() && path != 2)
if(stage == 1)
path = 1
if(beakers.len)
- user << "You lock the assembly."
+ to_chat(user, "You lock the assembly.")
name = "grenade"
else
-// user << "You need to add at least one beaker before locking the assembly."
- user << "You lock the empty assembly."
+// to_chat(user, "You need to add at least one beaker before locking the assembly.")
+ to_chat(user, "You lock the empty assembly.")
name = "fake grenade"
playsound(src, W.usesound, 50, 1)
icon_state = initial(icon_state) +"_locked"
stage = 2
else if(stage == 2)
if(active && prob(95))
- user << "You trigger the assembly!"
+ to_chat(user, "You trigger the assembly!")
prime()
return
else
- user << "You unlock the assembly."
+ to_chat(user, "You unlock the assembly.")
playsound(src.loc, W.usesound, 50, -3)
name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]"
icon_state = initial(icon_state) + (detonator?"_ass":"")
@@ -104,23 +104,23 @@
else if(is_type_in_list(W, allowed_containers) && (!stage || stage==1) && path != 2)
path = 1
if(beakers.len == 2)
- user << "The grenade can not hold more containers."
+ to_chat(user, "The grenade can not hold more containers.")
return
else
if(W.reagents.total_volume)
- user << "You add \the [W] to the assembly."
+ to_chat(user, "You add \the [W] to the assembly.")
user.drop_item()
W.loc = src
beakers += W
stage = 1
name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]"
else
- user << "\The [W] is empty."
+ to_chat(user, "\The [W] is empty.")
examine(mob/user)
..(user)
if(detonator)
- user << "With attached [detonator.name]"
+ to_chat(user, "With attached [detonator.name]")
activate(mob/user as mob)
if(active) return
diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index e917745e0e..89d05d5ffd 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -3,19 +3,20 @@
icon_state = "flashbang"
item_state = "flashbang"
origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 1)
+ var/max_range = 10 //The maximum range possible, including species effect mods. Cuts off at 7 for normal humans. Should be 3 higher than your intended target range for affecting normal humans.
var/banglet = 0
/obj/item/weapon/grenade/flashbang/prime()
..()
- for(var/obj/structure/closet/L in hear(7, get_turf(src)))
+ for(var/obj/structure/closet/L in hear(max_range, get_turf(src)))
if(locate(/mob/living/carbon/, L))
for(var/mob/living/carbon/M in L)
bang(get_turf(src), M)
- for(var/mob/living/carbon/M in hear(7, get_turf(src)))
+ for(var/mob/living/carbon/M in hear(max_range, get_turf(src)))
bang(get_turf(src), M)
- for(var/obj/structure/blob/B in hear(8,get_turf(src))) //Blob damage here
+ for(var/obj/structure/blob/B in hear(max_range - 2,get_turf(src))) //Blob damage here
var/damage = round(30/(get_dist(B,get_turf(src))+1))
if(B.overmind)
damage *= B.overmind.blob_type.burn_multiplier
@@ -23,6 +24,7 @@
new/obj/effect/effect/sparks(src.loc)
new/obj/effect/effect/smoke/illumination(src.loc, 5, range=30, power=30, color="#FFFFFF")
+
qdel(src)
return
@@ -39,13 +41,19 @@
ear_safety = M.get_ear_protection()
//Flashing everyone
- if(eye_safety < 1)
+ var/mob/living/carbon/human/H = M
+ var/flash_effectiveness = 1
+ var/bang_effectiveness = 1
+ if(ishuman(M))
+ flash_effectiveness = H.species.flash_mod
+ bang_effectiveness = H.species.sound_mod
+ if(eye_safety < 1 && get_dist(M, T) <= round(max_range * 0.7 * flash_effectiveness))
M.flash_eyes()
- M.Confuse(2)
- M.Weaken(5)
+ M.Confuse(2 * flash_effectiveness)
+ M.Weaken(5 * flash_effectiveness)
//Now applying sound
- if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M))
+ if((get_dist(M, T) <= round(max_range * 0.3 * bang_effectiveness) || src.loc == M.loc || src.loc == M))
if(ear_safety > 0)
M.Confuse(2)
M.Weaken(1)
@@ -58,20 +66,19 @@
M.ear_damage += rand(0, 5)
M.ear_deaf = max(M.ear_deaf,15)
- else if(get_dist(M, T) <= 5)
+ else if(get_dist(M, T) <= round(max_range * 0.5 * bang_effectiveness))
if(!ear_safety)
M.Confuse(8)
M.ear_damage += rand(0, 3)
M.ear_deaf = max(M.ear_deaf,10)
- else if(!ear_safety)
+ else if(!ear_safety && get_dist(M, T) <= (max_range * 0.7 * bang_effectiveness))
M.Confuse(4)
M.ear_damage += rand(0, 1)
M.ear_deaf = max(M.ear_deaf,5)
//This really should be in mob not every check
if(ishuman(M))
- var/mob/living/carbon/human/H = M
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
if (E && E.damage >= E.min_bruised_damage)
M << "Your eyes start to burn badly!"
@@ -87,35 +94,37 @@
else if(M.ear_damage >= 5)
to_chat(M, "Your ears start to ring!")
- M.update_icons() //Forces matrix transform to proc if they are now laying, I guess?
-
/obj/item/weapon/grenade/flashbang/Destroy()
walk(src, 0) // Because we might have called walk_away, we must stop the walk loop or BYOND keeps an internal reference to us forever.
return ..()
+
/obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve
desc = "Use of this weapon may constiute a war crime in your area, consult your local Colony Director."
name = "clusterbang"
icon = 'icons/obj/grenade.dmi'
icon_state = "clusterbang"
+ var/can_repeat = TRUE // Does this thing drop mini-clusterbangs?
+ var/min_banglets = 4
+ var/max_banglets = 8
/obj/item/weapon/grenade/flashbang/clusterbang/prime()
- var/numspawned = rand(4,8)
+ var/numspawned = rand(min_banglets, max_banglets)
var/again = 0
- for(var/more = numspawned,more > 0,more--)
- if(prob(35))
- again++
- numspawned --
- for(,numspawned > 0, numspawned--)
- spawn(0)
- new /obj/item/weapon/grenade/flashbang/cluster(src.loc)//Launches flashbangs
- playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
+ if(can_repeat)
+ for(var/more = numspawned, more > 0, more--)
+ if(prob(35))
+ again++
+ numspawned--
- for(,again > 0, again--)
- spawn(0)
- new /obj/item/weapon/grenade/flashbang/clusterbang/segment(src.loc)//Creates a 'segment' that launches a few more flashbangs
- playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
+ for(var/do_spawn = numspawned, do_spawn > 0, do_spawn--)
+ new /obj/item/weapon/grenade/flashbang/cluster(src.loc)//Launches flashbangs
+ playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
+
+ for(var/do_again = again, do_again > 0, do_again--)
+ new /obj/item/weapon/grenade/flashbang/clusterbang/segment(src.loc)//Creates a 'segment' that launches a few more flashbangs
+ playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
qdel(src)
return
@@ -124,41 +133,34 @@
name = "clusterbang segment"
icon = 'icons/obj/grenade.dmi'
icon_state = "clusterbang_segment"
+ can_repeat = FALSE
+ banglet = TRUE
/obj/item/weapon/grenade/flashbang/clusterbang/segment/New()//Segments should never exist except part of the clusterbang, since these immediately 'do their thing' and asplode
+ ..()
+
icon_state = "clusterbang_segment_active"
- active = 1
- banglet = 1
+
var/stepdist = rand(1,4)//How far to step
var/temploc = src.loc//Saves the current location to know where to step away from
walk_away(src,temploc,stepdist)//I must go, my people need me
+
var/dettime = rand(15,60)
spawn(dettime)
prime()
- ..()
-/obj/item/weapon/grenade/flashbang/clusterbang/segment/prime()
- var/numspawned = rand(4,8)
- for(var/more = numspawned,more > 0,more--)
- if(prob(35))
- numspawned --
-
- for(,numspawned > 0, numspawned--)
- spawn(0)
- new /obj/item/weapon/grenade/flashbang/cluster(src.loc)
- playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
- qdel(src)
- return
+/obj/item/weapon/grenade/flashbang/cluster
+ banglet = TRUE
/obj/item/weapon/grenade/flashbang/cluster/New()//Same concept as the segments, so that all of the parts don't become reliant on the clusterbang
- spawn(0)
- icon_state = "flashbang_active"
- active = 1
- banglet = 1
- var/stepdist = rand(1,3)
- var/temploc = src.loc
- walk_away(src,temploc,stepdist)
- var/dettime = rand(15,60)
- spawn(dettime)
- prime()
..()
+
+ icon_state = "flashbang_active"
+
+ var/stepdist = rand(1,3)
+ var/temploc = src.loc
+ walk_away(src,temploc,stepdist)
+
+ var/dettime = rand(15,60)
+ spawn(dettime)
+ prime()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm
index 5854e02cac..3d91607ce2 100644
--- a/code/game/objects/items/weapons/grenades/grenade.dm
+++ b/code/game/objects/items/weapons/grenades/grenade.dm
@@ -91,7 +91,7 @@
/obj/item/weapon/grenade/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(isscrewdriver(W))
+ if(W.is_screwdriver())
switch(det_time)
if (1)
det_time = 10
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 3e656b844b..f5bd38dcc1 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -21,12 +21,26 @@
/obj/item/weapon/implant/proc/activate()
return
- // What does the implant do upon injection?
- // return 0 if the implant fails (ex. Revhead and loyalty implant.)
- // return 1 if the implant succeeds (ex. Nonrevhead and loyalty implant.)
-/obj/item/weapon/implant/proc/implanted(var/mob/source)
+// Moves the implant where it needs to go, and tells it if there's more to be done in post_implant
+/obj/item/weapon/implant/proc/handle_implant(var/mob/source, var/target_zone = BP_TORSO)
+ . = TRUE
+ imp_in = source
+ implanted = TRUE
+ if(ishuman(source))
+ var/mob/living/carbon/human/H = source
+ var/obj/item/organ/external/affected = H.get_organ(target_zone)
+ if(affected)
+ affected.implants += src
+ part = affected
+ if(part)
+ forceMove(part)
+ else
+ forceMove(source)
+
listening_objects |= src
- return 1
+
+// Takes place after handle_implant, if that returns TRUE
+/obj/item/weapon/implant/proc/post_implant(var/mob/source)
/obj/item/weapon/implant/proc/get_data()
return "No information available"
@@ -49,6 +63,12 @@
icon_state = "implant_melted"
malfunction = MALFUNCTION_PERMANENT
+/obj/item/weapon/implant/proc/implant_loadout(var/mob/living/carbon/human/H)
+ if(H)
+ var/obj/item/organ/external/affected = H.organs_by_name[BP_HEAD]
+ if(handle_implant(H, affected))
+ post_implant(H)
+
/obj/item/weapon/implant/Destroy()
if(part)
part.implants.Remove(src)
@@ -69,6 +89,13 @@
else
..()
+
+
+//////////////////////////////
+// Tracking Implant
+//////////////////////////////
+GLOBAL_LIST_BOILERPLATE(all_tracking_implants, /obj/item/weapon/implant/tracking)
+
/obj/item/weapon/implant/tracking
name = "tracking implant"
desc = "An implant normally given to dangerous criminals. Allows security to track your location."
@@ -82,9 +109,8 @@
id = rand(1, 1000)
..()
-/obj/item/weapon/implant/tracking/implanted(var/mob/source)
+/obj/item/weapon/implant/tracking/post_implant(var/mob/source)
processing_objects.Add(src)
- return 1
/obj/item/weapon/implant/tracking/Destroy()
processing_objects.Remove(src)
@@ -140,7 +166,9 @@ Implant Specifics: "}
spawn(delay)
malfunction--
-
+//////////////////////////////
+// Death Explosive Implant
+//////////////////////////////
/obj/item/weapon/implant/dexplosive
name = "explosive"
desc = "And boom goes the weasel."
@@ -175,7 +203,9 @@ Implant Specifics: "}
/obj/item/weapon/implant/dexplosive/islegal()
return 0
-//BS12 Explosive
+//////////////////////////////
+// Explosive Implant
+//////////////////////////////
/obj/item/weapon/implant/explosive
name = "explosive implant"
desc = "A military grade micro bio-explosive. Highly dangerous."
@@ -247,15 +277,13 @@ Implant Specifics: "}
if(t)
t.hotspot_expose(3500,125)
-/obj/item/weapon/implant/explosive/implanted(mob/source as mob)
+/obj/item/weapon/implant/explosive/post_implant(mob/source as mob)
elevel = alert("What sort of explosion would you prefer?", "Implant Intent", "Localized Limb", "Destroy Body", "Full Explosion")
phrase = input("Choose activation phrase:") as text
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
phrase = replace_characters(phrase, replacechars)
usr.mind.store_memory("Explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', say [src.phrase] to attempt to activate.", 0, 0)
usr << "The implanted explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', say [src.phrase] to attempt to activate."
- listening_objects |= src
- return 1
/obj/item/weapon/implant/explosive/emp_act(severity)
if (malfunction)
@@ -309,6 +337,11 @@ Implant Specifics: "}
explosion(get_turf(imp_in), -1, -1, 1, 3)
qdel(src)
+//////////////////////////////
+// Chemical Implant
+//////////////////////////////
+GLOBAL_LIST_BOILERPLATE(all_chem_implants, /obj/item/weapon/implant/chem)
+
/obj/item/weapon/implant/chem
name = "chemical implant"
desc = "Injects things."
@@ -332,20 +365,17 @@ Can only be loaded while still in its original case.
the implant may become unstable and either pre-maturely inject the subject or simply break."}
return dat
-
/obj/item/weapon/implant/chem/New()
..()
var/datum/reagents/R = new/datum/reagents(50)
reagents = R
R.my_atom = src
-
/obj/item/weapon/implant/chem/trigger(emote, source as mob)
if(emote == "deathgasp")
src.activate(src.reagents.total_volume)
return
-
/obj/item/weapon/implant/chem/activate(var/cause)
if((!cause) || (!src.imp_in)) return 0
var/mob/living/carbon/R = src.imp_in
@@ -380,6 +410,9 @@ the implant may become unstable and either pre-maturely inject the subject or si
spawn(20)
malfunction--
+//////////////////////////////
+// Loyalty Implant
+//////////////////////////////
/obj/item/weapon/implant/loyalty
name = "loyalty implant"
desc = "Makes you loyal or such."
@@ -397,20 +430,24 @@ the implant may become unstable and either pre-maturely inject the subject or si
Integrity: Implant will last so long as the nanobots are inside the bloodstream."}
return dat
-
-/obj/item/weapon/implant/loyalty/implanted(mob/M)
- if(!istype(M, /mob/living/carbon/human)) return 0
+/obj/item/weapon/implant/loyalty/handle_implant(mob/M, target_zone = BP_TORSO)
+ . = ..(M, target_zone)
+ if(!istype(M, /mob/living/carbon/human))
+ . = FALSE
var/mob/living/carbon/human/H = M
var/datum/antagonist/antag_data = get_antag_data(H.mind.special_role)
if(antag_data && (antag_data.flags & ANTAG_IMPLANT_IMMUNE))
H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of [using_map.company_name] try to invade your mind!")
- return 0
- else
- clear_antag_roles(H.mind, 1)
- H << "You feel a surge of loyalty towards [using_map.company_name]."
- return 1
+ . = FALSE
+/obj/item/weapon/implant/loyalty/post_implant(mob/M)
+ var/mob/living/carbon/human/H = M
+ clear_antag_roles(H.mind, 1)
+ to_chat(H, "You feel a surge of loyalty towards [using_map.company_name].")
+//////////////////////////////
+// Adrenaline Implant
+//////////////////////////////
/obj/item/weapon/implant/adrenalin
name = "adrenalin"
desc = "Removes all stuns and knockdowns."
@@ -441,14 +478,13 @@ the implant may become unstable and either pre-maturely inject the subject or si
return
-
-/obj/item/weapon/implant/adrenalin/implanted(mob/source)
+/obj/item/weapon/implant/adrenalin/post_implant(mob/source)
source.mind.store_memory("A implant can be activated by using the pale emote, say *pale to attempt to activate.", 0, 0)
source << "The implanted freedom implant can be activated by using the pale emote, say *pale to attempt to activate."
- listening_objects |= src
- return 1
-
+//////////////////////////////
+// Death Alarm Implant
+//////////////////////////////
/obj/item/weapon/implant/death_alarm
name = "death alarm implant"
desc = "An alarm which monitors host vital signs and transmits a radio message upon death."
@@ -525,11 +561,13 @@ the implant may become unstable and either pre-maturely inject the subject or si
spawn(20)
malfunction--
-/obj/item/weapon/implant/death_alarm/implanted(mob/source as mob)
+/obj/item/weapon/implant/death_alarm/post_implant(mob/source as mob)
mobname = source.real_name
processing_objects.Add(src)
- return 1
+//////////////////////////////
+// Compressed Matter Implant
+//////////////////////////////
/obj/item/weapon/implant/compressed
name = "compressed matter implant"
desc = "Based on compressed matter technology, can store a single item."
@@ -567,13 +605,12 @@ the implant may become unstable and either pre-maturely inject the subject or si
scanned.loc = t
qdel(src)
-/obj/item/weapon/implant/compressed/implanted(mob/source as mob)
+/obj/item/weapon/implant/compressed/post_implant(mob/source)
src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
if (source.mind)
source.mind.store_memory("Compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
source << "The implanted compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
- listening_objects |= src
- return 1
+
/obj/item/weapon/implant/compressed/islegal()
return 0
diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm
index 44b33721cf..c05d52442c 100644
--- a/code/game/objects/items/weapons/implants/implantchair.dm
+++ b/code/game/objects/items/weapons/implants/implantchair.dm
@@ -135,10 +135,9 @@
for (var/mob/O in viewers(M, null))
O.show_message("\The [M] has been implanted by \the [src].", 1)
- if(imp.implanted(M))
- imp.loc = M
- imp.imp_in = M
- imp.implanted = 1
+ if(imp.handle_implant(M, BP_TORSO))
+ imp.post_implant(M)
+
implant_list -= imp
break
return
diff --git a/code/game/objects/items/weapons/implants/implantcircuits.dm b/code/game/objects/items/weapons/implants/implantcircuits.dm
index 7dd29055f3..2b87e8fae5 100644
--- a/code/game/objects/items/weapons/implants/implantcircuits.dm
+++ b/code/game/objects/items/weapons/implants/implantcircuits.dm
@@ -39,7 +39,7 @@
IC.examine(user)
/obj/item/weapon/implant/integrated_circuit/attackby(var/obj/item/O, var/mob/user)
- if(istype(O, /obj/item/weapon/crowbar) || istype(O, /obj/item/device/integrated_electronics) || istype(O, /obj/item/integrated_circuit) || istype(O, /obj/item/weapon/screwdriver) || istype(O, /obj/item/weapon/cell/device) )
+ if(O.is_crowbar() || istype(O, /obj/item/device/integrated_electronics) || istype(O, /obj/item/integrated_circuit) || O.is_screwdriver() || istype(O, /obj/item/weapon/cell/device) )
IC.attackby(O, user)
else
..()
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm
index 8052b19de6..fcfd67bb6a 100644
--- a/code/game/objects/items/weapons/implants/implanter.dm
+++ b/code/game/objects/items/weapons/implants/implanter.dm
@@ -56,16 +56,11 @@
add_attack_logs(user,M,"Implanted with [imp.name] using [name]")
- if(src.imp.implanted(M))
- src.imp.loc = M
- src.imp.imp_in = M
- src.imp.implanted = 1
- if (ishuman(M))
- var/mob/living/carbon/human/H = M
- var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
- affected.implants += src.imp
- imp.part = affected
+ if(imp.handle_implant(M))
+ imp.post_implant(M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
BITSET(H.hud_updateflag, IMPLOYAL_HUD)
src.imp = null
diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm
index 92021a46a2..fab692775d 100644
--- a/code/game/objects/items/weapons/implants/implantfreedom.dm
+++ b/code/game/objects/items/weapons/implants/implantfreedom.dm
@@ -16,7 +16,9 @@
/obj/item/weapon/implant/freedom/trigger(emote, mob/living/carbon/source as mob)
- if (src.uses < 1) return 0
+ if (src.uses < 1)
+ return 0
+
if (emote == src.activation_emote)
src.uses--
source << "You feel a faint click."
@@ -46,13 +48,9 @@
W.layer = initial(W.layer)
return
-
-/obj/item/weapon/implant/freedom/implanted(mob/living/carbon/source)
+/obj/item/weapon/implant/freedom/post_implant(mob/source)
source.mind.store_memory("Freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
source << "The implanted freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
- listening_objects |= src
- return 1
-
/obj/item/weapon/implant/freedom/get_data()
var/dat = {"
diff --git a/code/game/objects/items/weapons/implants/implantlanguage.dm b/code/game/objects/items/weapons/implants/implantlanguage.dm
index d813a8d388..7c6e33508b 100644
--- a/code/game/objects/items/weapons/implants/implantlanguage.dm
+++ b/code/game/objects/items/weapons/implants/implantlanguage.dm
@@ -4,7 +4,26 @@
/obj/item/weapon/implant/language
name = "GalCom language implant"
- desc = "An implant allowing someone to speak and hear the range of frequencies used in Galactic Common, as well as produce any phonemes that they usually cannot. Only helps with hearing and producing sounds, not understanding them."
+ desc = "An implant allowing someone to speak the range of frequencies used in Galactic Common, as well as produce any phonemes that they usually cannot. Only helps with producing sounds, not understanding them."
+ var/list/languages = list(LANGUAGE_GALCOM) // List of languages that this assists with
+
+/obj/item/weapon/implant/language/post_implant(mob/M) // Amends the mob's voice organ, then deletes itself
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/internal/voicebox/V = locate() in H.internal_organs
+ if(V)
+ var/list/need_amend = list() // If they've already got all the languages they need, then they don't need this implant to do anything
+ for(var/L in languages)
+ if(L in V.will_assist_languages)
+ continue
+ else
+ need_amend |= L
+ if(LAZYLEN(need_amend))
+ if(V.robotic < ORGAN_ASSISTED)
+ V.mechassist()
+ for(var/L in need_amend)
+ V.add_assistable_langs(L)
+ qdel_null(src)
/obj/item/weapon/implant/language/get_data()
var/dat = {"
@@ -14,16 +33,19 @@
Important Notes: Affects hearing and speech.
Implant Details:
-Function: Allows a being otherwise incapable to both hear the frequencies Galactic Common is generally spoken at, as well as to produce the phonemes of the language.
+Function: Allows a being otherwise incapable of speaking Galactic Common to produce the phonemes of the language.
Special Features: None.
Integrity: Implant will function for expected life, barring physical damage."}
return dat
+
+// EAL Implant
/obj/item/weapon/implant/language/eal
name = "EAL language implant"
- desc = "An implant allowing an organic to both hear and speak Encoded Audio Language accurately. Only helps with hearing and producing sounds, not understanding them."
+ desc = "An implant allowing an organic to speak Encoded Audio Language passably. Only helps with producing sounds, not understanding them."
+ languages = list(LANGUAGE_EAL)
-/obj/item/weapon/implant/language/get_data()
+/obj/item/weapon/implant/language/eal/get_data()
var/dat = {"
Implant Specifications:
Name: Vey-Med L-2 Encoded Audio Language Implant
@@ -31,7 +53,25 @@
Important Notes: Affects hearing and speech.
Implant Details:
-Function: Allows an organic to accurately process and speak Encoded Audio Language.
+Function: Allows an organic to accurately speak Encoded Audio Language.
+Special Features: None.
+Integrity: Implant will function for expected life, barring physical damage."}
+ return dat
+
+/obj/item/weapon/implant/language/skrellian
+ name = "Skrellian language implant"
+ desc = "An implant allowing someone to speak the range of frequencies used in Skrellian, as well as produce any phonemes that they usually cannot. Only helps with hearing and producing sounds, not understanding them."
+ languages = list(LANGUAGE_SKRELLIAN)
+
+/obj/item/weapon/implant/language/skrellian/get_data()
+ var/dat = {"
+Implant Specifications:
+Name: Vey-Med L-1 Galactic Common Implant
+Life: 5 years
+Important Notes: Affects hearing and speech.
+
+Implant Details:
+Function: Allows a being otherwise incapable of speaking Skrellian to produce the phonemes of the language.
Special Features: None.
Integrity: Implant will function for expected life, barring physical damage."}
return dat
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm
index 644ebf1bb7..82809cfe61 100644
--- a/code/game/objects/items/weapons/implants/implantuplink.dm
+++ b/code/game/objects/items/weapons/implants/implantuplink.dm
@@ -11,15 +11,13 @@
..()
return
-/obj/item/weapon/implant/uplink/implanted(mob/source)
+/obj/item/weapon/implant/uplink/post_implant(mob/source)
+ listening_objects |= src
activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
- listening_objects |= src
- return 1
-
/obj/item/weapon/implant/uplink/trigger(emote, mob/source as mob)
if(hidden_uplink && usr == source) // Let's not have another people activate our uplink
hidden_uplink.check_trigger(source, emote, activation_emote)
- return
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/improvised_components.dm b/code/game/objects/items/weapons/improvised_components.dm
index 105a76473f..ded033a746 100644
--- a/code/game/objects/items/weapons/improvised_components.dm
+++ b/code/game/objects/items/weapons/improvised_components.dm
@@ -7,8 +7,8 @@
thrown_force_divisor = 0.1
/obj/item/weapon/material/butterflyconstruction/attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/screwdriver))
- user << "You finish the concealed blade weapon."
+ if(W.is_screwdriver())
+ to_chat(user, "You finish the concealed blade weapon.")
playsound(src, W.usesound, 50, 1)
new /obj/item/weapon/material/butterfly(user.loc, material.name)
qdel(src)
@@ -33,7 +33,7 @@
/obj/item/weapon/material/butterflyhandle/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/material/butterflyblade))
var/obj/item/weapon/material/butterflyblade/B = W
- user << "You attach the two concealed blade parts."
+ to_chat(user, "You attach the two concealed blade parts.")
new /obj/item/weapon/material/butterflyconstruction(user.loc, B.material.name)
qdel(W)
qdel(src)
@@ -58,10 +58,10 @@
if(istype(I, /obj/item/weapon/material/shard) || istype(I, /obj/item/weapon/material/butterflyblade))
var/obj/item/weapon/material/tmp_shard = I
finished = new /obj/item/weapon/material/twohanded/spear(get_turf(user), tmp_shard.material.name)
- user << "You fasten \the [I] to the top of the rod with the cable."
- else if(istype(I, /obj/item/weapon/wirecutters))
+ to_chat(user, "You fasten \the [I] to the top of the rod with the cable.")
+ else if(I.is_wirecutter())
finished = new /obj/item/weapon/melee/baton/cattleprod(get_turf(user))
- user << "You fasten the wirecutters to the top of the rod with the cable, prongs outward."
+ to_chat(user, "You fasten the wirecutters to the top of the rod with the cable, prongs outward.")
if(finished)
user.drop_from_inventory(src)
user.drop_from_inventory(I)
diff --git a/code/game/objects/items/weapons/material/gravemarker.dm b/code/game/objects/items/weapons/material/gravemarker.dm
index f50416b05d..aff9a9e5ce 100644
--- a/code/game/objects/items/weapons/material/gravemarker.dm
+++ b/code/game/objects/items/weapons/material/gravemarker.dm
@@ -12,7 +12,7 @@
var/epitaph = "" //A quick little blurb
/obj/item/weapon/material/gravemarker/attackby(obj/item/weapon/W, mob/user as mob)
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
var/carving_1 = sanitizeSafe(input(user, "Who is \the [src.name] for?", "Gravestone Naming", null) as text, MAX_NAME_LEN)
if(carving_1)
user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].")
@@ -27,7 +27,7 @@
user.visible_message("[user] carves something into \the [src.name].", "You carve your message into \the [src.name].")
epitaph += carving_2
update_icon()
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].")
if(do_after(user, material.hardness * W.toolspeed))
material.place_dismantled_product(get_turf(src))
diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm
index acc3132712..dbc573cf26 100644
--- a/code/game/objects/items/weapons/material/twohanded.dm
+++ b/code/game/objects/items/weapons/material/twohanded.dm
@@ -144,9 +144,9 @@
force = 10
w_class = ITEMSIZE_LARGE
slot_flags = SLOT_BACK
- force_divisor = 0.5 // 15 when wielded with hardness 15 (glass)
+ force_divisor = 0.5 // 15 when wielded with hardness 30 (glass)
unwielded_force_divisor = 0.375
- thrown_force_divisor = 1.5 // 20 when thrown with weight 15 (glass)
+ thrown_force_divisor = 1.5 // 22.5 when thrown with weight 15 (glass)
throw_speed = 3
edge = 0
sharp = 1
@@ -156,4 +156,4 @@
applies_material_colour = 0
fragile = 1 //It's a haphazard thing of glass, wire, and steel
reach = 2 // Spears are long.
- attackspeed = 14
\ No newline at end of file
+ attackspeed = 14
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index 3e46128d71..0cfdd4792d 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -1,3 +1,5 @@
+GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/weapon/mop)
+
/obj/item/weapon/mop
desc = "The world of janitalia wouldn't be complete without a mop."
name = "mop"
@@ -12,9 +14,9 @@
var/mopping = 0
var/mopcount = 0
-
/obj/item/weapon/mop/New()
create_reagents(30)
+ ..()
/obj/item/weapon/mop/afterattack(atom/A, mob/user, proximity)
if(!proximity) return
diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm
index 43183d45f4..aec6a790b2 100644
--- a/code/game/objects/items/weapons/policetape.dm
+++ b/code/game/objects/items/weapons/policetape.dm
@@ -4,6 +4,9 @@
icon = 'icons/policetape.dmi'
icon_state = "tape"
w_class = ITEMSIZE_SMALL
+
+ toolspeed = 3 //You can use it in surgery. It's stupid, but you can.
+
var/turf/start
var/turf/end
var/tape_type = /obj/item/tape
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index cee423a627..18c60af449 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -47,6 +47,10 @@
max_storage_space = ITEMSIZE_COST_NORMAL * 14 // 56
storage_cost = INVENTORY_STANDARD_SPACE + 1
+/obj/item/weapon/storage/backpack/holding/duffle
+ name = "dufflebag of holding"
+ icon_state = "holdingduffle"
+
/obj/item/weapon/storage/backpack/holding/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/storage/backpack/holding))
user << "The Bluespace interfaces of the two devices conflict and malfunction."
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index e4482932b1..c7607d5aeb 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -43,11 +43,11 @@
icon_state = "utility"
can_hold = list(
///obj/item/weapon/combitool,
- /obj/item/weapon/crowbar,
- /obj/item/weapon/screwdriver,
+ /obj/item/weapon/tool/crowbar,
+ /obj/item/weapon/tool/screwdriver,
/obj/item/weapon/weldingtool,
- /obj/item/weapon/wirecutters,
- /obj/item/weapon/wrench,
+ /obj/item/weapon/tool/wirecutters,
+ /obj/item/weapon/tool/wrench,
/obj/item/device/multitool,
/obj/item/device/flashlight,
/obj/item/weapon/cell/device,
@@ -71,22 +71,21 @@
/obj/item/weapon/storage/belt/utility/full
starts_with = list(
- /obj/item/weapon/screwdriver,
- /obj/item/weapon/wrench,
+ /obj/item/weapon/tool/screwdriver,
+ /obj/item/weapon/tool/wrench,
/obj/item/weapon/weldingtool,
- /obj/item/weapon/crowbar,
- /obj/item/weapon/wirecutters,
+ /obj/item/weapon/tool/crowbar,
+ /obj/item/weapon/tool/wirecutters,
/obj/item/stack/cable_coil/random_belt
)
/obj/item/weapon/storage/belt/utility/atmostech
starts_with = list(
- /obj/item/weapon/screwdriver,
- /obj/item/weapon/wrench,
+ /obj/item/weapon/tool/screwdriver,
+ /obj/item/weapon/tool/wrench,
/obj/item/weapon/weldingtool,
- /obj/item/weapon/crowbar,
- /obj/item/weapon/wirecutters,
- /obj/item/device/t_scanner
+ /obj/item/weapon/tool/crowbar,
+ /obj/item/weapon/tool/wirecutters,
)
/obj/item/weapon/storage/belt/utility/chief
@@ -97,8 +96,8 @@
/obj/item/weapon/storage/belt/utility/chief/full
starts_with = list(
- /obj/item/weapon/screwdriver/power,
- /obj/item/weapon/crowbar/power,
+ /obj/item/weapon/tool/screwdriver/power,
+ /obj/item/weapon/tool/crowbar/power,
/obj/item/weapon/weldingtool/experimental,
/obj/item/device/multitool,
/obj/item/stack/cable_coil/random_belt,
@@ -131,7 +130,7 @@
/obj/item/clothing/gloves,
/obj/item/weapon/reagent_containers/hypospray,
/obj/item/clothing/glasses,
- /obj/item/weapon/crowbar,
+ /obj/item/weapon/tool/crowbar,
/obj/item/device/flashlight,
/obj/item/weapon/cell/device,
/obj/item/weapon/extinguisher/mini,
@@ -242,11 +241,11 @@
/obj/item/weapon/storage/belt/utility/alien/full
starts_with = list(
- /obj/item/weapon/screwdriver/alien,
- /obj/item/weapon/wrench/alien,
+ /obj/item/weapon/tool/screwdriver/alien,
+ /obj/item/weapon/tool/wrench/alien,
/obj/item/weapon/weldingtool/alien,
- /obj/item/weapon/crowbar/alien,
- /obj/item/weapon/wirecutters/alien,
+ /obj/item/weapon/tool/crowbar/alien,
+ /obj/item/weapon/tool/wirecutters/alien,
/obj/item/device/multitool/alien,
/obj/item/stack/cable_coil/alien
)
@@ -279,7 +278,7 @@
/obj/item/clothing/gloves,
/obj/item/weapon/reagent_containers/hypospray,
/obj/item/clothing/glasses,
- /obj/item/weapon/crowbar,
+ /obj/item/weapon/tool/crowbar,
/obj/item/device/flashlight,
/obj/item/weapon/cell/device,
/obj/item/weapon/extinguisher/mini,
@@ -369,7 +368,7 @@
/obj/item/weapon/clipboard,
/obj/item/weapon/anodevice,
/obj/item/clothing/glasses,
- /obj/item/weapon/wrench,
+ /obj/item/weapon/tool/wrench,
/obj/item/weapon/storage/excavation,
/obj/item/weapon/anobattery,
/obj/item/device/ano_scanner,
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index f7e43ac718..6105095d65 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -445,7 +445,7 @@
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack")
foldable = null
max_w_class = ITEMSIZE_NORMAL
- can_hold = list(/obj/item/organ, /obj/item/weapon/reagent_containers/food, /obj/item/weapon/reagent_containers/glass)
+ can_hold = list(/obj/item/organ)
max_storage_space = ITEMSIZE_COST_NORMAL * 5 // Formally 21. Odd numbers are bad.
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index 78a2d940ad..081dcdcb2d 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -41,13 +41,13 @@
playsound(src.loc, "sparks", 50, 1)
return
- if (istype(W, /obj/item/weapon/screwdriver))
+ if (W.is_screwdriver())
if (do_after(user, 20 * W.toolspeed))
src.open =! src.open
playsound(src, W.usesound, 50, 1)
user.show_message(text("You [] the service panel.", (src.open ? "open" : "close")))
return
- if ((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking))
+ if (istype(W, /obj/item/device/multitool) && (src.open == 1)&& (!src.l_hacking))
user.show_message("Now attempting to reset internal memory, please hold.", 1)
src.l_hacking = 1
if (do_after(usr, 100))
@@ -135,7 +135,7 @@
src.overlays = null
overlays += image('icons/obj/storage.dmi', icon_locking)
locked = 0
- user << (feedback ? feedback : "You short out the lock of \the [src].")
+ to_chat(user, (feedback ? feedback : "You short out the lock of \the [src]."))
return 1
// -----------------------------
@@ -156,7 +156,7 @@
attack_hand(mob/user as mob)
if ((src.loc == user) && (src.locked == 1))
- usr << "[src] is locked and cannot be opened!"
+ to_chat(user, "[src] is locked and cannot be opened!")
else if ((src.loc == user) && (!src.locked))
src.open(usr)
else
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index c4174eb4c0..7989c53f1d 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -20,7 +20,7 @@
icon_state = "red"
item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red")
starts_with = list(
- /obj/item/weapon/crowbar/red,
+ /obj/item/weapon/tool/crowbar/red,
/obj/item/weapon/extinguisher/mini,
/obj/item/device/radio
)
@@ -36,12 +36,12 @@
icon_state = "blue"
item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue")
starts_with = list(
- /obj/item/weapon/screwdriver,
- /obj/item/weapon/wrench,
+ /obj/item/weapon/tool/screwdriver,
+ /obj/item/weapon/tool/wrench,
/obj/item/weapon/weldingtool,
- /obj/item/weapon/crowbar,
+ /obj/item/weapon/tool/crowbar,
/obj/item/device/analyzer,
- /obj/item/weapon/wirecutters
+ /obj/item/weapon/tool/wirecutters
)
/obj/item/weapon/storage/toolbox/electrical
@@ -49,10 +49,10 @@
icon_state = "yellow"
item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow")
starts_with = list(
- /obj/item/weapon/screwdriver,
- /obj/item/weapon/wirecutters,
+ /obj/item/weapon/tool/screwdriver,
+ /obj/item/weapon/tool/wirecutters,
/obj/item/device/t_scanner,
- /obj/item/weapon/crowbar,
+ /obj/item/weapon/tool/crowbar,
/obj/item/stack/cable_coil/random_belt,
/obj/item/stack/cable_coil/random_belt
)
@@ -72,20 +72,20 @@
force = 14
starts_with = list(
/obj/item/clothing/gloves/yellow,
- /obj/item/weapon/screwdriver,
- /obj/item/weapon/wrench,
+ /obj/item/weapon/tool/screwdriver,
+ /obj/item/weapon/tool/wrench,
/obj/item/weapon/weldingtool,
- /obj/item/weapon/crowbar,
- /obj/item/weapon/wirecutters,
+ /obj/item/weapon/tool/crowbar,
+ /obj/item/weapon/tool/wirecutters,
/obj/item/device/multitool
)
/obj/item/weapon/storage/toolbox/syndicate/powertools
starts_with = list(
/obj/item/clothing/gloves/yellow,
- /obj/item/weapon/screwdriver/power,
+ /obj/item/weapon/tool/screwdriver/power,
/obj/item/weapon/weldingtool/experimental,
- /obj/item/weapon/crowbar/power,
+ /obj/item/weapon/tool/crowbar/power,
/obj/item/device/multitool,
/obj/item/stack/cable_coil/random_belt,
/obj/item/device/analyzer
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 5c0f837340..c66da84712 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -223,19 +223,19 @@
/obj/item/weapon/storage/box/syndie_kit/demolitions
starts_with = list(
/obj/item/weapon/syndie/c4explosive,
- /obj/item/weapon/screwdriver
+ /obj/item/weapon/tool/screwdriver
)
/obj/item/weapon/storage/box/syndie_kit/demolitions_heavy
starts_with = list(
/obj/item/weapon/syndie/c4explosive/heavy,
- /obj/item/weapon/screwdriver
+ /obj/item/weapon/tool/screwdriver
)
/obj/item/weapon/storage/box/syndie_kit/demolitions_super_heavy
starts_with = list(
/obj/item/weapon/syndie/c4explosive/heavy/super_heavy,
- /obj/item/weapon/screwdriver
+ /obj/item/weapon/tool/screwdriver
)
/obj/item/weapon/storage/secure/briefcase/rifle
@@ -253,7 +253,8 @@
description_fluff = "The container, upon opening, looks to have a few oddly shaped indentations in its packing."
description_antag = "This case will likely contain a charged fuel rod gun, and a few fuel rods to go with it. It can only hold the fuel rod gun, fuel rods, batteries, a screwdriver, and stock machine parts."
force = 12 //Anti-rad lined i.e. Lead, probably gonna hurt a bit if you get bashed with it.
- can_hold = list(/obj/item/weapon/gun/magnetic/fuelrod, /obj/item/weapon/fuel_assembly, /obj/item/weapon/cell, /obj/item/weapon/stock_parts, /obj/item/weapon/screwdriver)
+ can_hold = list(/obj/item/weapon/gun/magnetic/fuelrod, /obj/item/weapon/fuel_assembly, /obj/item/weapon/cell, /obj/item/weapon/stock_parts, /obj/item/weapon/tool/screwdriver)
+ cant_hold = list(/obj/item/weapon/tool/screwdriver/power)
starts_with = list(
/obj/item/weapon/gun/magnetic/fuelrod,
/obj/item/weapon/fuel_assembly/deuterium,
@@ -261,5 +262,5 @@
/obj/item/weapon/fuel_assembly/tritium,
/obj/item/weapon/fuel_assembly/tritium,
/obj/item/weapon/fuel_assembly/phoron,
- /obj/item/weapon/screwdriver
+ /obj/item/weapon/tool/screwdriver
)
diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm
index cb376787ab..ce1227014c 100644
--- a/code/game/objects/items/weapons/storage/wallets.dm
+++ b/code/game/objects/items/weapons/storage/wallets.dm
@@ -32,11 +32,12 @@
/obj/item/weapon/photo,
/obj/item/weapon/reagent_containers/dropper,
/obj/item/weapon/sample,
- /obj/item/weapon/screwdriver,
+ /obj/item/weapon/tool/screwdriver,
/obj/item/weapon/stamp,
/obj/item/clothing/accessory/permit,
/obj/item/clothing/accessory/badge
)
+ cant_hold = list(/obj/item/weapon/tool/screwdriver/power)
slot_flags = SLOT_ID
var/obj/item/weapon/card/id/front_id = null
@@ -81,10 +82,10 @@
..()
var/amount = rand(50, 100) + rand(50, 100) // Triangular distribution from 100 to 200
var/obj/item/weapon/spacecash/SC = null
+ SC = new(src)
for(var/i in list(100, 50, 20, 10, 5, 1))
if(amount < i)
continue
- SC = new(src)
while(amount >= i)
amount -= i
SC.adjust_worth(i, 0)
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 268a8d5ad7..e37b2f9977 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -19,16 +19,19 @@
var/obj/item/weapon/cell/bcell = null
var/hitcost = 240
-/obj/item/weapon/melee/baton/suicide_act(mob/user)
- var/datum/gender/TU = gender_datums[user.get_visible_gender()]
- user.visible_message("\The [user] is putting the live [name] in [TU.his] mouth! It looks like [TU.he] [TU.is] trying to commit suicide.")
- return (FIRELOSS)
-
/obj/item/weapon/melee/baton/New()
..()
update_icon()
return
+/obj/item/weapon/melee/baton/get_cell()
+ return bcell
+
+/obj/item/weapon/melee/baton/suicide_act(mob/user)
+ var/datum/gender/TU = gender_datums[user.get_visible_gender()]
+ user.visible_message("\The [user] is putting the live [name] in [TU.his] mouth! It looks like [TU.he] [TU.is] trying to commit suicide.")
+ return (FIRELOSS)
+
/obj/item/weapon/melee/baton/MouseDrop(obj/over_object as obj)
if(!canremove)
return
diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm
index c47489272b..ee528cb6f8 100644
--- a/code/game/objects/items/weapons/syndie.dm
+++ b/code/game/objects/items/weapons/syndie.dm
@@ -91,7 +91,7 @@
else if(lit && detonator_mode)
switch(alert(user, "What would you like to do?", "Lighter", "Press the button.", "Close the lighter."))
if("Press the button.")
- user << "You press the button."
+ to_chat(user, "You press the button.")
icon_state = "[base_state]click"
if(src.bomb)
src.bomb.detonate()
@@ -106,7 +106,7 @@
/obj/item/weapon/flame/lighter/zippo/c4detonator/attackby(obj/item/weapon/W, mob/user as mob)
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
detonator_mode = !detonator_mode
playsound(src, W.usesound, 50, 1)
- user << "You unscrew the top panel of \the [src] revealing a button."
+ to_chat(user, "You unscrew the top panel of \the [src] revealing a button.")
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index 49608c649a..07979777e7 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -130,7 +130,7 @@ var/list/global/tank_gauge_cache = list()
to_chat(user, "You attach the wires to the tank.")
src.add_bomb_overlay()
- if(istype(W, /obj/item/weapon/wirecutters))
+ if(W.is_wirecutter())
if(wired && src.proxyassembly.assembly)
to_chat(user, "You carefully begin clipping the wires that attach to the tank.")
diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm
index 83e944f593..e3afddba4c 100644
--- a/code/game/objects/items/weapons/tape.dm
+++ b/code/game/objects/items/weapons/tape.dm
@@ -5,8 +5,12 @@
icon_state = "taperoll"
w_class = ITEMSIZE_TINY
+ toolspeed = 2 //It is now used in surgery as a not awful, but probably dangerous option, due to speed.
+
/obj/item/weapon/tape_roll/attack(var/mob/living/carbon/human/H, var/mob/user)
if(istype(H))
+ if(user.a_intent == I_HELP)
+ return
var/can_place = 0
if(istype(user, /mob/living/silicon/robot))
can_place = 1
@@ -56,6 +60,7 @@
user.visible_message("\The [user] has taped up \the [H]'s eyes!")
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses)
H.update_inv_glasses()
+ playsound(src, 'sound/effects/tape.ogg',25)
else if(user.zone_sel.selecting == O_MOUTH || user.zone_sel.selecting == BP_HEAD)
if(!H.organs_by_name[BP_HEAD])
@@ -94,6 +99,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask)
H.update_inv_wear_mask()
+ playsound(src, 'sound/effects/tape.ogg',25)
else if(user.zone_sel.selecting == "r_hand" || user.zone_sel.selecting == "l_hand")
can_place = 0
@@ -109,6 +115,7 @@
return
var/obj/item/weapon/handcuffs/cable/tape/T = new(user)
+ playsound(src, 'sound/effects/tape.ogg',25)
if(!T.place_handcuffs(H, user))
user.unEquip(T)
@@ -124,6 +131,7 @@
var/obj/item/weapon/ducttape/tape = new(get_turf(src))
tape.attach(W)
user.put_in_hands(tape)
+ playsound(src, 'sound/effects/tape.ogg',25)
/obj/item/weapon/ducttape
name = "tape"
@@ -188,6 +196,7 @@
return // reduce papers around corners issue.
user.drop_from_inventory(src)
+ playsound(src, 'sound/effects/tape.ogg',25)
forceMove(source_turf)
if(params)
diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm
index c8af607576..3818ddac81 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/teleportation.dm
@@ -60,7 +60,7 @@ Frequency:
if (sr)
src.temp += "Located Beacons: "
- for(var/obj/item/device/radio/beacon/W in world)
+ for(var/obj/item/device/radio/beacon/W in all_beacons)
if (W.frequency == src.frequency)
var/turf/tr = get_turf(W)
if (tr.z == sr.z && tr)
@@ -78,7 +78,7 @@ Frequency:
src.temp += "[W.code]-[dir2text(get_dir(sr, tr))]-[direct] "
src.temp += "Extranneous Signals: "
- for (var/obj/item/weapon/implant/tracking/W in world)
+ for (var/obj/item/weapon/implant/tracking/W in all_tracking_implants)
if (!W.implanted || !(istype(W.loc,/obj/item/organ/external) || ismob(W.loc) || W.malfunction))
continue
@@ -137,7 +137,7 @@ Frequency:
user << "\The [src] is malfunctioning."
return
var/list/L = list( )
- for(var/obj/machinery/teleport/hub/R in world)
+ for(var/obj/machinery/teleport/hub/R in machines)
var/obj/machinery/computer/teleporter/com = locate(/obj/machinery/computer/teleporter, locate(R.x - 2, R.y, R.z))
if (istype(com, /obj/machinery/computer/teleporter) && com.locked && !com.one_time_use)
if(R.icon_state == "tele1")
@@ -156,7 +156,7 @@ Frequency:
if ((user.get_active_hand() != src || user.stat || user.restrained()))
return
var/count = 0 //num of portals from this teleport in world
- for(var/obj/effect/portal/PO in world)
+ for(var/obj/effect/portal/PO in all_portals)
if(PO.creator == src) count++
if(count >= 3)
user.show_message("\The [src] is recharging!")
diff --git a/code/game/objects/items/weapons/tools/combitool.dm b/code/game/objects/items/weapons/tools/combitool.dm
new file mode 100644
index 0000000000..96b64d18f7
--- /dev/null
+++ b/code/game/objects/items/weapons/tools/combitool.dm
@@ -0,0 +1,63 @@
+// File is unticked because this is entirely untested old code
+
+
+/*
+ * Combitool
+ */
+/obj/item/weapon/combitool
+ name = "combi-tool"
+ desc = "It even has one of those nubbins for doing the thingy."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "combitool"
+ w_class = ITEMSIZE_SMALL
+
+ var/list/spawn_tools = list(
+ /obj/item/weapon/tool/screwdriver,
+ /obj/item/weapon/tool/wrench,
+ /obj/item/weapon/tool/wirecutters,
+ /obj/item/weapon/material/knife,
+ /obj/item/weapon/material/kitchen/utensil/fork,
+ /obj/item/weapon/material/knife/machete/hatchet
+ )
+ var/list/tools = list()
+ var/current_tool = 1
+
+/obj/item/weapon/combitool/examine()
+ ..()
+ if(loc == usr && tools.len)
+ to_chat(usr, "It has the following fittings:")
+ for(var/obj/item/tool in tools)
+ to_chat(usr, "\icon[tool] - [tool.name][tools[current_tool]==tool?" (selected)":""]")
+
+/obj/item/weapon/combitool/New()
+ ..()
+ for(var/type in spawn_tools)
+ tools |= new type(src)
+
+/obj/item/weapon/combitool/attack_self(mob/user as mob)
+ if(++current_tool > tools.len) current_tool = 1
+ var/obj/item/tool = tools[current_tool]
+ if(!tool)
+ to_chat(user, "You can't seem to find any fittings in \the [src].")
+ else
+ to_chat(user, "You switch \the [src] to the [tool.name] fitting.")
+ return 1
+
+/obj/item/weapon/combitool/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+ if(!M.Adjacent(user))
+ return 0
+ var/obj/item/tool = tools[current_tool]
+ if(!tool) return 0
+ return (tool ? tool.attack(M,user) : 0)
+
+/obj/item/weapon/combitool/afterattack(var/atom/target, var/mob/living/user, proximity, params)
+ if(!proximity)
+ return 0
+ var/obj/item/tool = tools[current_tool]
+ if(!tool) return 0
+ tool.loc = user
+ var/resolved = target.attackby(tool,user)
+ if(!resolved && tool && target)
+ tool.afterattack(target,user,1)
+ if(tool)
+ tool.loc = src
diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm
new file mode 100644
index 0000000000..5eb2668b2f
--- /dev/null
+++ b/code/game/objects/items/weapons/tools/crowbar.dm
@@ -0,0 +1,77 @@
+/*
+ * Crowbar
+ */
+
+/obj/item/weapon/tool/crowbar
+ name = "crowbar"
+ desc = "Used to remove floors and to pry open doors."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "crowbar"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ force = 6
+ throwforce = 7
+ pry = 1
+ item_state = "crowbar"
+ w_class = ITEMSIZE_SMALL
+ origin_tech = list(TECH_ENGINEERING = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 50)
+ attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
+ usesound = 'sound/items/crowbar.ogg'
+ toolspeed = 1
+
+/obj/item/weapon/tool/crowbar/is_crowbar()
+ return TRUE
+
+/obj/item/weapon/tool/crowbar/red
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "red_crowbar"
+ item_state = "crowbar_red"
+
+/obj/item/weapon/tool/crowbar/alien
+ name = "alien crowbar"
+ desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
+ icon = 'icons/obj/abductor.dmi'
+ usesound = 'sound/weapons/sonic_jackhammer.ogg'
+ icon_state = "crowbar"
+ toolspeed = 0.1
+ origin_tech = list(TECH_COMBAT = 4, TECH_ENGINEERING = 4)
+
+/obj/item/weapon/tool/crowbar/cyborg
+ name = "hydraulic crowbar"
+ desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbars in industrial synthetics."
+ usesound = 'sound/items/jaws_pry.ogg'
+ force = 10
+ toolspeed = 0.5
+
+/obj/item/weapon/tool/crowbar/power
+ name = "jaws of life"
+ desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a prying head."
+ icon_state = "jaws_pry"
+ item_state = "jawsoflife"
+ matter = list(MAT_METAL=150, MAT_SILVER=50)
+ origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
+ usesound = 'sound/items/jaws_pry.ogg'
+ force = 15
+ toolspeed = 0.25
+ var/obj/item/weapon/tool/wirecutters/power/counterpart = null
+
+/obj/item/weapon/tool/crowbar/power/New(newloc, no_counterpart = TRUE)
+ ..(newloc)
+ if(!counterpart && no_counterpart)
+ counterpart = new(src, FALSE)
+ counterpart.counterpart = src
+
+/obj/item/weapon/tool/crowbar/power/Destroy()
+ if(counterpart)
+ counterpart.counterpart = null // So it can qdel cleanly.
+ qdel_null(counterpart)
+ return ..()
+
+/obj/item/weapon/tool/crowbar/power/attack_self(mob/user)
+ playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
+ user.drop_item(src)
+ counterpart.forceMove(get_turf(src))
+ src.forceMove(counterpart)
+ user.put_in_active_hand(counterpart)
+ to_chat(user, "You attach the cutting jaws to [src].")
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm
new file mode 100644
index 0000000000..6c0a1561a3
--- /dev/null
+++ b/code/game/objects/items/weapons/tools/screwdriver.dm
@@ -0,0 +1,125 @@
+/*
+ * Screwdriver
+ */
+/obj/item/weapon/tool/screwdriver
+ name = "screwdriver"
+ desc = "You can be totally screwwy with this."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "screwdriver"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT | SLOT_EARS
+ force = 6
+ w_class = ITEMSIZE_TINY
+ throwforce = 5
+ throw_speed = 3
+ throw_range = 5
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ usesound = 'sound/items/screwdriver.ogg'
+ matter = list(DEFAULT_WALL_MATERIAL = 75)
+ attack_verb = list("stabbed")
+ sharp = 1
+ toolspeed = 1
+ var/random_color = TRUE
+
+/obj/item/weapon/tool/screwdriver/suicide_act(mob/user)
+ var/datum/gender/TU = gender_datums[user.get_visible_gender()]
+ viewers(user) << pick("\The [user] is stabbing the [src.name] into [TU.his] temple! It looks like [TU.hes] trying to commit suicide.", \
+ "\The [user] is stabbing the [src.name] into [TU.his] heart! It looks like [TU.hes] trying to commit suicide.")
+ return(BRUTELOSS)
+
+/obj/item/weapon/tool/screwdriver/New()
+ if(random_color)
+ switch(pick("red","blue","purple","brown","green","cyan","yellow"))
+ if ("red")
+ icon_state = "screwdriver2"
+ item_state = "screwdriver"
+ if ("blue")
+ icon_state = "screwdriver"
+ item_state = "screwdriver_blue"
+ if ("purple")
+ icon_state = "screwdriver3"
+ item_state = "screwdriver_purple"
+ if ("brown")
+ icon_state = "screwdriver4"
+ item_state = "screwdriver_brown"
+ if ("green")
+ icon_state = "screwdriver5"
+ item_state = "screwdriver_green"
+ if ("cyan")
+ icon_state = "screwdriver6"
+ item_state = "screwdriver_cyan"
+ if ("yellow")
+ icon_state = "screwdriver7"
+ item_state = "screwdriver_yellow"
+
+ if (prob(75))
+ src.pixel_y = rand(0, 16)
+ ..()
+
+/obj/item/weapon/tool/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+ if(!istype(M) || user.a_intent == "help")
+ return ..()
+ if(user.zone_sel.selecting != O_EYES && user.zone_sel.selecting != BP_HEAD)
+ return ..()
+ if((CLUMSY in user.mutations) && prob(50))
+ M = user
+ return eyestab(M,user)
+
+/obj/item/weapon/tool/screwdriver/is_screwdriver()
+ return TRUE
+
+/obj/item/weapon/tool/screwdriver/alien
+ name = "alien screwdriver"
+ desc = "An ultrasonic screwdriver."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "screwdriver_a"
+ item_state = "screwdriver_black"
+ usesound = 'sound/items/pshoom.ogg'
+ toolspeed = 0.1
+ random_color = FALSE
+
+/obj/item/weapon/tool/screwdriver/cyborg
+ name = "powered screwdriver"
+ desc = "An electrical screwdriver, designed to be both precise and quick."
+ usesound = 'sound/items/drill_use.ogg'
+ toolspeed = 0.5
+
+/obj/item/weapon/tool/screwdriver/power
+ name = "hand drill"
+ desc = "A simple powered hand drill. It's fitted with a screw bit."
+ icon_state = "drill_screw"
+ item_state = "drill"
+ matter = list(DEFAULT_WALL_MATERIAL = 150, MAT_SILVER = 50)
+ origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
+ slot_flags = SLOT_BELT
+ force = 8
+ w_class = ITEMSIZE_SMALL
+ throwforce = 8
+ throw_speed = 2
+ throw_range = 3//it's heavier than a screw driver/wrench, so it does more damage, but can't be thrown as far
+ attack_verb = list("drilled", "screwed", "jabbed", "whacked")
+ hitsound = 'sound/items/drill_hit.ogg'
+ usesound = 'sound/items/drill_use.ogg'
+ toolspeed = 0.25
+ random_color = FALSE
+ var/obj/item/weapon/tool/wrench/power/counterpart = null
+
+/obj/item/weapon/tool/screwdriver/power/New(newloc, no_counterpart = TRUE)
+ ..(newloc)
+ if(!counterpart && no_counterpart)
+ counterpart = new(src, FALSE)
+ counterpart.counterpart = src
+
+/obj/item/weapon/tool/screwdriver/power/Destroy()
+ if(counterpart)
+ counterpart.counterpart = null // So it can qdel cleanly.
+ qdel_null(counterpart)
+ return ..()
+
+/obj/item/weapon/tool/screwdriver/power/attack_self(mob/user)
+ playsound(get_turf(user),'sound/items/change_drill.ogg',50,1)
+ user.drop_item(src)
+ counterpart.forceMove(get_turf(src))
+ src.forceMove(counterpart)
+ user.put_in_active_hand(counterpart)
+ to_chat(user, "You attach the bolt driver bit to [src].")
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools/weldingtool.dm
similarity index 54%
rename from code/game/objects/items/weapons/tools.dm
rename to code/game/objects/items/weapons/tools/weldingtool.dm
index 62b3d9b1bb..31019176d8 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools/weldingtool.dm
@@ -1,1039 +1,595 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
-
-#define WELDER_FUEL_BURN_INTERVAL 13
-
-/* Tools!
- * Note: Multitools are /obj/item/device
- *
- * Contains:
- * Wrench
- * Screwdriver
- * Wirecutters
- * Welding Tool
- * Crowbar
- */
-
-/*
- * Wrench
- */
-/obj/item/weapon/wrench
- name = "wrench"
- desc = "A wrench with many common uses. Can be usually found in your hand."
- icon = 'icons/obj/tools.dmi'
- icon_state = "wrench"
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 6
- throwforce = 7
- w_class = ITEMSIZE_SMALL
- origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
- matter = list(DEFAULT_WALL_MATERIAL = 150)
- attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
- usesound = 'sound/items/ratchet.ogg'
- toolspeed = 1
-
-/obj/item/weapon/wrench/cyborg
- name = "automatic wrench"
- desc = "An advanced robotic wrench. Can be found in industrial synthetic shells."
- usesound = 'sound/items/drill_use.ogg'
- toolspeed = 0.5
-
-/obj/item/weapon/wrench/alien
- name = "alien wrench"
- desc = "A polarized wrench. It causes anything placed between the jaws to turn."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "wrench"
- usesound = 'sound/effects/empulse.ogg'
- toolspeed = 0.1
- origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5)
-
-/obj/item/weapon/wrench/power
- name = "hand drill"
- desc = "A simple powered hand drill. It's fitted with a bolt bit."
- icon_state = "drill_bolt"
- item_state = "drill"
- usesound = 'sound/items/drill_use.ogg'
- matter = list(DEFAULT_WALL_MATERIAL = 150, MAT_SILVER = 50)
- origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
- force = 8
- w_class = ITEMSIZE_SMALL
- throwforce = 8
- attack_verb = list("drilled", "screwed", "jabbed")
- toolspeed = 0.25
- var/obj/item/weapon/screwdriver/power/counterpart = null
-
-/obj/item/weapon/wrench/power/New(newloc, no_counterpart = TRUE)
- ..(newloc)
- if(!counterpart && no_counterpart)
- counterpart = new(src, FALSE)
- counterpart.counterpart = src
-
-/obj/item/weapon/wrench/power/Destroy()
- if(counterpart)
- counterpart.counterpart = null // So it can qdel cleanly.
- qdel_null(counterpart)
- return ..()
-
-/obj/item/weapon/wrench/power/attack_self(mob/user)
- playsound(get_turf(user),'sound/items/change_drill.ogg',50,1)
- user.drop_item(src)
- counterpart.forceMove(get_turf(src))
- src.forceMove(counterpart)
- user.put_in_active_hand(counterpart)
- to_chat(user, "You attach the screw driver bit to [src].")
-
-/*
- * Screwdriver
- */
-/obj/item/weapon/screwdriver
- name = "screwdriver"
- desc = "You can be totally screwwy with this."
- icon = 'icons/obj/tools.dmi'
- icon_state = "screwdriver"
- flags = CONDUCT
- slot_flags = SLOT_BELT | SLOT_EARS
- force = 6
- w_class = ITEMSIZE_TINY
- throwforce = 5
- throw_speed = 3
- throw_range = 5
- hitsound = 'sound/weapons/bladeslice.ogg'
- usesound = 'sound/items/screwdriver.ogg'
- matter = list(DEFAULT_WALL_MATERIAL = 75)
- attack_verb = list("stabbed")
- sharp = 1
- toolspeed = 1
- var/random_color = TRUE
-
- suicide_act(mob/user)
- var/datum/gender/TU = gender_datums[user.get_visible_gender()]
- viewers(user) << pick("\The [user] is stabbing the [src.name] into [TU.his] temple! It looks like [TU.hes] trying to commit suicide.", \
- "\The [user] is stabbing the [src.name] into [TU.his] heart! It looks like [TU.hes] trying to commit suicide.")
- return(BRUTELOSS)
-
-/obj/item/weapon/screwdriver/New()
- if(random_color)
- switch(pick("red","blue","purple","brown","green","cyan","yellow"))
- if ("red")
- icon_state = "screwdriver2"
- item_state = "screwdriver"
- if ("blue")
- icon_state = "screwdriver"
- item_state = "screwdriver_blue"
- if ("purple")
- icon_state = "screwdriver3"
- item_state = "screwdriver_purple"
- if ("brown")
- icon_state = "screwdriver4"
- item_state = "screwdriver_brown"
- if ("green")
- icon_state = "screwdriver5"
- item_state = "screwdriver_green"
- if ("cyan")
- icon_state = "screwdriver6"
- item_state = "screwdriver_cyan"
- if ("yellow")
- icon_state = "screwdriver7"
- item_state = "screwdriver_yellow"
-
- if (prob(75))
- src.pixel_y = rand(0, 16)
- ..()
-
-/obj/item/weapon/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M) || user.a_intent == "help")
- return ..()
- if(user.zone_sel.selecting != O_EYES && user.zone_sel.selecting != BP_HEAD)
- return ..()
- if((CLUMSY in user.mutations) && prob(50))
- M = user
- return eyestab(M,user)
-
-/obj/item/weapon/screwdriver/alien
- name = "alien screwdriver"
- desc = "An ultrasonic screwdriver."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "screwdriver_a"
- item_state = "screwdriver_black"
- usesound = 'sound/items/pshoom.ogg'
- toolspeed = 0.1
- random_color = FALSE
-
-/obj/item/weapon/screwdriver/cyborg
- name = "powered screwdriver"
- desc = "An electrical screwdriver, designed to be both precise and quick."
- usesound = 'sound/items/drill_use.ogg'
- toolspeed = 0.5
-
-/obj/item/weapon/screwdriver/power
- name = "hand drill"
- desc = "A simple powered hand drill. It's fitted with a screw bit."
- icon_state = "drill_screw"
- item_state = "drill"
- matter = list(DEFAULT_WALL_MATERIAL = 150, MAT_SILVER = 50)
- origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
-
- force = 8
- w_class = ITEMSIZE_SMALL
- throwforce = 8
- throw_speed = 2
- throw_range = 3//it's heavier than a screw driver/wrench, so it does more damage, but can't be thrown as far
- attack_verb = list("drilled", "screwed", "jabbed", "whacked")
- hitsound = 'sound/items/drill_hit.ogg'
- usesound = 'sound/items/drill_use.ogg'
- toolspeed = 0.25
- random_color = FALSE
- var/obj/item/weapon/wrench/power/counterpart = null
-
-/obj/item/weapon/screwdriver/power/New(newloc, no_counterpart = TRUE)
- ..(newloc)
- if(!counterpart && no_counterpart)
- counterpart = new(src, FALSE)
- counterpart.counterpart = src
-
-/obj/item/weapon/screwdriver/power/Destroy()
- if(counterpart)
- counterpart.counterpart = null // So it can qdel cleanly.
- qdel_null(counterpart)
- return ..()
-
-/obj/item/weapon/screwdriver/power/attack_self(mob/user)
- playsound(get_turf(user),'sound/items/change_drill.ogg',50,1)
- user.drop_item(src)
- counterpart.forceMove(get_turf(src))
- src.forceMove(counterpart)
- user.put_in_active_hand(counterpart)
- to_chat(user, "You attach the bolt driver bit to [src].")
-
-/*
- * Wirecutters
- */
-/obj/item/weapon/wirecutters
- name = "wirecutters"
- desc = "This cuts wires."
- icon = 'icons/obj/tools.dmi'
- icon_state = "cutters"
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 6
- throw_speed = 2
- throw_range = 9
- w_class = ITEMSIZE_SMALL
- origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
- matter = list(DEFAULT_WALL_MATERIAL = 80)
- attack_verb = list("pinched", "nipped")
- hitsound = 'sound/items/wirecutter.ogg'
- usesound = 'sound/items/wirecutter.ogg'
- sharp = 1
- edge = 1
- toolspeed = 1
- var/random_color = TRUE
-
-/obj/item/weapon/wirecutters/New()
- if(random_color && prob(50))
- icon_state = "cutters-y"
- item_state = "cutters_yellow"
- ..()
-
-/obj/item/weapon/wirecutters/attack(mob/living/carbon/C as mob, mob/user as mob)
- if(istype(C) && user.a_intent == I_HELP && (C.handcuffed) && (istype(C.handcuffed, /obj/item/weapon/handcuffs/cable)))
- usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\
- "You cut \the [C]'s restraints with \the [src]!",\
- "You hear cable being cut.")
- C.handcuffed = null
- if(C.buckled && C.buckled.buckle_require_restraints)
- C.buckled.unbuckle_mob()
- C.update_inv_handcuffed()
- return
- else
- ..()
-
-/obj/item/weapon/wirecutters/alien
- name = "alien wirecutters"
- desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "cutters"
- toolspeed = 0.1
- origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4)
- random_color = FALSE
-
-/obj/item/weapon/wirecutters/cyborg
- name = "wirecutters"
- desc = "This cuts wires. With science."
- usesound = 'sound/items/jaws_cut.ogg'
- toolspeed = 0.5
-
-/obj/item/weapon/wirecutters/power
- name = "jaws of life"
- desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a cutting head."
- icon_state = "jaws_cutter"
- item_state = "jawsoflife"
- origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
- matter = list(MAT_METAL=150, MAT_SILVER=50)
- usesound = 'sound/items/jaws_cut.ogg'
- force = 15
- toolspeed = 0.25
- random_color = FALSE
- var/obj/item/weapon/crowbar/power/counterpart = null
-
-/obj/item/weapon/wirecutters/power/New(newloc, no_counterpart = TRUE)
- ..(newloc)
- if(!counterpart && no_counterpart)
- counterpart = new(src, FALSE)
- counterpart.counterpart = src
-
-/obj/item/weapon/wirecutters/power/Destroy()
- if(counterpart)
- counterpart.counterpart = null // So it can qdel cleanly.
- qdel_null(counterpart)
- return ..()
-
-/obj/item/weapon/wirecutters/power/attack_self(mob/user)
- playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
- user.drop_item(src)
- counterpart.forceMove(get_turf(src))
- src.forceMove(counterpart)
- user.put_in_active_hand(counterpart)
- to_chat(user, "You attach the pry jaws to [src].")
-
-/*
- * Welding Tool
- */
-/obj/item/weapon/weldingtool
- name = "welding tool"
- icon = 'icons/obj/tools.dmi'
- icon_state = "welder"
- item_state = "welder"
- flags = CONDUCT
- slot_flags = SLOT_BELT
-
- //Amount of OUCH when it's thrown
- force = 3.0
- throwforce = 5.0
- throw_speed = 1
- throw_range = 5
- w_class = ITEMSIZE_SMALL
-
- //Cost to make in the autolathe
- matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 30)
-
- //R&D tech level
- origin_tech = list(TECH_ENGINEERING = 1)
-
- //Welding tool specific stuff
- var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
- var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
- var/max_fuel = 20 //The max amount of fuel the welder can hold
-
- var/acti_sound = 'sound/items/welderactivate.ogg'
- var/deac_sound = 'sound/items/welderdeactivate.ogg'
- usesound = 'sound/items/Welder2.ogg'
- var/change_icons = TRUE
- var/flame_intensity = 2 //how powerful the emitted light is when used.
- var/flame_color = "#FF9933" // What color the welder light emits when its on. Default is an orange-ish color.
- var/eye_safety_modifier = 0 // Increasing this will make less eye protection needed to stop eye damage. IE at 1, sunglasses will fully protect.
- var/burned_fuel_for = 0 // Keeps track of how long the welder's been on, used to gradually empty the welder if left one, without RNG.
- var/always_process = FALSE // If true, keeps the welder on the process list even if it's off. Used for when it needs to regenerate fuel.
- toolspeed = 1
-
-/obj/item/weapon/weldingtool/New()
-// var/random_fuel = min(rand(10,20),max_fuel)
- var/datum/reagents/R = new/datum/reagents(max_fuel)
- reagents = R
- R.my_atom = src
- R.add_reagent("fuel", max_fuel)
- update_icon()
- if(always_process)
- processing_objects |= src
- ..()
-
-/obj/item/weapon/weldingtool/Destroy()
- if(welding || always_process)
- processing_objects -= src
- return ..()
-
-/obj/item/weapon/weldingtool/examine(mob/user)
- if(..(user, 0))
- if(max_fuel)
- to_chat(user, text("\icon[] The [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel ))
-
-
-/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/living/user as mob)
- if(istype(W,/obj/item/weapon/screwdriver))
- if(welding)
- to_chat(user, "Stop welding first!")
- return
- status = !status
- if(status)
- to_chat(user, "You secure the welder.")
- else
- to_chat(user, "The welder can now be attached and modified.")
- src.add_fingerprint(user)
- return
-
- if((!status) && (istype(W,/obj/item/stack/rods)))
- var/obj/item/stack/rods/R = W
- R.use(1)
- var/obj/item/weapon/flamethrower/F = new/obj/item/weapon/flamethrower(user.loc)
- src.loc = F
- F.weldtool = src
- if (user.client)
- user.client.screen -= src
- if (user.r_hand == src)
- user.remove_from_mob(src)
- else
- user.remove_from_mob(src)
- src.master = F
- src.layer = initial(src.layer)
- user.remove_from_mob(src)
- if (user.client)
- user.client.screen -= src
- src.loc = F
- src.add_fingerprint(user)
- return
-
- ..()
- return
-
-
-/obj/item/weapon/weldingtool/process()
- if(welding)
- ++burned_fuel_for
- if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL)
- remove_fuel(1)
-
-
-
- if(get_fuel() < 1)
- setWelding(0)
-
- //I'm not sure what this does. I assume it has to do with starting fires...
- //...but it doesnt check to see if the welder is on or not.
- var/turf/location = src.loc
- if(istype(location, /mob/living))
- var/mob/living/M = location
- if(M.item_is_in_hands(src))
- location = get_turf(M)
- if (istype(location, /turf))
- location.hotspot_expose(700, 5)
-
-
-/obj/item/weapon/weldingtool/afterattack(obj/O as obj, mob/user as mob, proximity)
- if(!proximity) return
- if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1)
- if(!welding && max_fuel)
- O.reagents.trans_to_obj(src, max_fuel)
- to_chat(user, "Welder refueled")
- playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
- return
- else if(!welding)
- to_chat(user, "[src] doesn't use fuel.")
- return
- else
- message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.")
- log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.")
- to_chat(user, "You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done.")
- var/obj/structure/reagent_dispensers/fueltank/tank = O
- tank.explode()
- return
- if (src.welding)
- remove_fuel(1)
- var/turf/location = get_turf(user)
- if(isliving(O))
- var/mob/living/L = O
- L.IgniteMob()
- if (istype(location, /turf))
- location.hotspot_expose(700, 50, 1)
- return
-
-
-/obj/item/weapon/weldingtool/attack_self(mob/user as mob)
- setWelding(!welding, usr)
- return
-
-//Returns the amount of fuel in the welder
-/obj/item/weapon/weldingtool/proc/get_fuel()
- return reagents.get_reagent_amount("fuel")
-
-/obj/item/weapon/weldingtool/proc/get_max_fuel()
- return max_fuel
-
-//Removes fuel from the welding tool. If a mob is passed, it will perform an eyecheck on the mob. This should probably be renamed to use()
-/obj/item/weapon/weldingtool/proc/remove_fuel(var/amount = 1, var/mob/M = null)
- if(!welding)
- return 0
- if(amount)
- burned_fuel_for = 0 // Reset the counter since we're removing fuel.
- if(get_fuel() >= amount)
- reagents.remove_reagent("fuel", amount)
- if(M)
- eyecheck(M)
- update_icon()
- return 1
- else
- if(M)
- to_chat(M, "You need more welding fuel to complete this task.")
- update_icon()
- return 0
-
-//Returns whether or not the welding tool is currently on.
-/obj/item/weapon/weldingtool/proc/isOn()
- return src.welding
-
-/obj/item/weapon/weldingtool/update_icon()
- ..()
- overlays.Cut()
- // Welding overlay.
- if(welding)
- var/image/I = image(icon, src, "[icon_state]-on")
- overlays.Add(I)
- item_state = "[initial(item_state)]1"
- else
- item_state = initial(item_state)
-
- // Fuel counter overlay.
- if(change_icons && get_max_fuel())
- var/ratio = get_fuel() / get_max_fuel()
- ratio = Ceiling(ratio*4) * 25
- var/image/I = image(icon, src, "[icon_state][ratio]")
- overlays.Add(I)
-
- // Lights
- if(welding && flame_intensity)
- set_light(flame_intensity, flame_intensity, flame_color)
- else
- set_light(0)
-
-// icon_state = welding ? "[icon_state]1" : "[initial(icon_state)]"
- var/mob/M = loc
- if(istype(M))
- M.update_inv_l_hand()
- M.update_inv_r_hand()
-
-/obj/item/weapon/weldingtool/MouseDrop(obj/over_object as obj)
- if(!canremove)
- return
-
- if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
-
- if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
- return
-
- if (!( istype(over_object, /obj/screen) ))
- return ..()
-
- //makes sure that the thing is equipped, so that we can't drag it into our hand from miles away.
- //there's got to be a better way of doing this.
- if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
- return
-
- if (( usr.restrained() ) || ( usr.stat ))
- return
-
- if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src))
- return
-
- switch(over_object.name)
- if("r_hand")
- usr.u_equip(src)
- usr.put_in_r_hand(src)
- if("l_hand")
- usr.u_equip(src)
- usr.put_in_l_hand(src)
- src.add_fingerprint(usr)
-
-//Sets the welding state of the welding tool. If you see W.welding = 1 anywhere, please change it to W.setWelding(1)
-//so that the welding tool updates accordingly
-/obj/item/weapon/weldingtool/proc/setWelding(var/set_welding, var/mob/M)
- if(!status) return
-
- var/turf/T = get_turf(src)
- //If we're turning it on
- if(set_welding && !welding)
- if (get_fuel() > 0)
- if(M)
- to_chat(M, "You switch the [src] on.")
- else if(T)
- T.visible_message("\The [src] turns on.")
- playsound(loc, acti_sound, 50, 1)
- src.force = 15
- src.damtype = "fire"
- src.w_class = ITEMSIZE_LARGE
- src.hitsound = 'sound/items/welder.ogg'
- welding = 1
- update_icon()
- if(!always_process)
- processing_objects |= src
- else
- if(M)
- var/msg = max_fuel ? "welding fuel" : "charge"
- to_chat(M, "You need more [msg] to complete this task.")
- return
- //Otherwise
- else if(!set_welding && welding)
- if(!always_process)
- processing_objects -= src
- if(M)
- to_chat(M, "You switch \the [src] off.")
- else if(T)
- T.visible_message("\The [src] turns off.")
- playsound(loc, deac_sound, 50, 1)
- src.force = 3
- src.damtype = "brute"
- src.w_class = initial(src.w_class)
- src.welding = 0
- src.hitsound = initial(src.hitsound)
- update_icon()
-
-//Decides whether or not to damage a player's eyes based on what they're wearing as protection
-//Note: This should probably be moved to mob
-/obj/item/weapon/weldingtool/proc/eyecheck(mob/living/carbon/user)
- if(!istype(user))
- return 1
- var/safety = user.eyecheck()
- safety = between(-1, safety + eye_safety_modifier, 2)
- if(istype(user, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = user
- var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
- if(!E)
- return
- switch(safety)
- if(1)
- to_chat(usr, "Your eyes sting a little.")
- E.damage += rand(1, 2)
- if(E.damage > 12)
- user.eye_blurry += rand(3,6)
- if(0)
- to_chat(usr, "Your eyes burn.")
- E.damage += rand(2, 4)
- if(E.damage > 10)
- E.damage += rand(4,10)
- if(-1)
- to_chat(usr, "Your thermals intensify the welder's glow. Your eyes itch and burn severely.")
- user.eye_blurry += rand(12,20)
- E.damage += rand(12, 16)
- if(safety<2)
-
- if(E.damage > 10)
- to_chat(user, "Your eyes are really starting to hurt. This can't be good for you!")
-
- if (E.damage >= E.min_broken_damage)
- to_chat(user, "You go blind!")
- user.sdisabilities |= BLIND
- else if (E.damage >= E.min_bruised_damage)
- to_chat(user, "You go blind!")
- user.Blind(5)
- user.eye_blurry = 5
- user.disabilities |= NEARSIGHTED
- spawn(100)
- user.disabilities &= ~NEARSIGHTED
- return
-
-/obj/item/weapon/weldingtool/is_hot()
- return isOn()
-
-/obj/item/weapon/weldingtool/largetank
- name = "industrial welding tool"
- desc = "A slightly larger welder with a larger tank."
- icon_state = "indwelder"
- max_fuel = 40
- origin_tech = list(TECH_ENGINEERING = 2, TECH_PHORON = 2)
- matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 60)
-
-/obj/item/weapon/weldingtool/largetank/cyborg
- name = "integrated welding tool"
- desc = "An advanced welder designed to be used in robotic systems."
- toolspeed = 0.5
-
-/obj/item/weapon/weldingtool/hugetank
- name = "upgraded welding tool"
- desc = "A much larger welder with a huge tank."
- icon_state = "indwelder"
- max_fuel = 80
- w_class = ITEMSIZE_NORMAL
- origin_tech = list(TECH_ENGINEERING = 3)
- matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120)
-
-/obj/item/weapon/weldingtool/mini
- name = "emergency welding tool"
- desc = "A miniature welder used during emergencies."
- icon_state = "miniwelder"
- max_fuel = 10
- w_class = ITEMSIZE_SMALL
- matter = list(MAT_METAL = 30, MAT_GLASS = 10)
- change_icons = 0
- toolspeed = 2
- eye_safety_modifier = 1 // Safer on eyes.
-
-/obj/item/weapon/weldingtool/alien
- name = "alien welding tool"
- desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "welder"
- toolspeed = 0.1
- flame_color = "#6699FF" // Light bluish.
- eye_safety_modifier = 2
- change_icons = 0
- origin_tech = list(TECH_PHORON = 5 ,TECH_ENGINEERING = 5)
- always_process = TRUE
-
-/obj/item/weapon/weldingtool/alien/process()
- if(get_fuel() <= get_max_fuel())
- reagents.add_reagent("fuel", 1)
- ..()
-
-/obj/item/weapon/weldingtool/experimental
- name = "experimental welding tool"
- desc = "An experimental welder capable of self-fuel generation. It can output a flame hotter than regular welders."
- icon_state = "exwelder"
- max_fuel = 40
- w_class = ITEMSIZE_NORMAL
- origin_tech = list(TECH_ENGINEERING = 4, TECH_PHORON = 3)
- matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120)
- toolspeed = 0.5
- change_icons = 0
- flame_intensity = 3
- always_process = TRUE
- var/nextrefueltick = 0
-
-/obj/item/weapon/weldingtool/experimental/process()
- ..()
- if(get_fuel() < get_max_fuel() && nextrefueltick < world.time)
- nextrefueltick = world.time + 10
- reagents.add_reagent("fuel", 1)
-
-/*
- * Backpack Welder.
- */
-
-/obj/item/weapon/weldingtool/tubefed
- name = "tube-fed welding tool"
- desc = "A bulky, cooler-burning welding tool that draws from a worn welding tank."
- icon_state = "tubewelder"
- max_fuel = 10
- w_class = ITEMSIZE_NO_CONTAINER
- matter = null
- toolspeed = 1.25
- change_icons = 0
- flame_intensity = 1
- eye_safety_modifier = 1
- always_process = TRUE
- var/obj/item/weapon/weldpack/mounted_pack = null
-
-/obj/item/weapon/weldingtool/tubefed/New(location)
- ..()
- if(istype(location, /obj/item/weapon/weldpack))
- var/obj/item/weapon/weldpack/holder = location
- mounted_pack = holder
- else
- qdel(src)
-
-/obj/item/weapon/weldingtool/tubefed/Destroy()
- mounted_pack.nozzle = null
- mounted_pack = null
- return ..()
-
-/obj/item/weapon/weldingtool/tubefed/process()
- if(mounted_pack)
- if(!istype(mounted_pack.loc,/mob/living/carbon/human))
- mounted_pack.return_nozzle()
- else
- var/mob/living/carbon/human/H = mounted_pack.loc
- if(H.back != mounted_pack)
- mounted_pack.return_nozzle()
-
- if(mounted_pack.loc != src.loc && src.loc != mounted_pack)
- mounted_pack.return_nozzle()
- visible_message("\The [src] retracts to its fueltank.")
-
- if(get_fuel() <= get_max_fuel())
- mounted_pack.reagents.trans_to_obj(src, 1)
-
- ..()
-
-/obj/item/weapon/weldingtool/tubefed/dropped(mob/user)
- ..()
- if(src.loc != user)
- mounted_pack.return_nozzle()
- to_chat(user, "\The [src] retracts to its fueltank.")
-
-/*
- * Electric/Arc Welder
- */
-
-/obj/item/weapon/weldingtool/electric //AND HIS WELDING WAS ELECTRIC
- name = "electric welding tool"
- desc = "A welder which runs off of electricity."
- icon_state = "arcwelder"
- max_fuel = 0 //We'll handle the consumption later.
- item_state = "ewelder"
- var/obj/item/weapon/cell/power_supply //What type of power cell this uses
- var/charge_cost = 24 //The rough equivalent of 1 unit of fuel, based on us wanting 10 welds per battery
- var/cell_type = /obj/item/weapon/cell/device
- var/use_external_power = 0 //If in a borg or hardsuit, this needs to = 1
- flame_color = "#00CCFF" // Blue-ish, to set it apart from the gas flames.
- acti_sound = 'sound/effects/sparks4.ogg'
- deac_sound = 'sound/effects/sparks4.ogg'
-
-/obj/item/weapon/weldingtool/electric/New()
- ..()
- if(cell_type == null)
- update_icon()
- else if(cell_type)
- power_supply = new cell_type(src)
- else
- power_supply = new /obj/item/weapon/cell/device(src)
- update_icon()
-
-/obj/item/weapon/weldingtool/electric/unloaded/New()
- cell_type = null
-
-/obj/item/weapon/weldingtool/electric/examine(mob/user)
- if(get_dist(src, user) > 1)
- to_chat(user, desc)
- else // The << need to stay, for some reason
- if(power_supply)
- user << text("\icon[] The [] has [] charge left.", src, src.name, get_fuel())
- else
- user << text("\icon[] The [] has no power cell!", src, src.name)
-
-/obj/item/weapon/weldingtool/electric/get_fuel()
- if(use_external_power)
- var/obj/item/weapon/cell/external = get_external_power_supply()
- if(external)
- return external.charge
- else if(power_supply)
- return power_supply.charge
- else
- return 0
-
-/obj/item/weapon/weldingtool/electric/get_max_fuel()
- if(use_external_power)
- var/obj/item/weapon/cell/external = get_external_power_supply()
- if(external)
- return external.maxcharge
- else if(power_supply)
- return power_supply.maxcharge
- return 0
-
-/obj/item/weapon/weldingtool/electric/remove_fuel(var/amount = 1, var/mob/M = null)
- if(!welding)
- return 0
- if(get_fuel() >= amount)
- power_supply.checked_use(charge_cost)
- if(use_external_power)
- var/obj/item/weapon/cell/external = get_external_power_supply()
- if(!external || !external.use(charge_cost)) //Take power from the borg...
- power_supply.give(charge_cost) //Give it back to the cell.
- if(M)
- eyecheck(M)
- update_icon()
- return 1
- else
- if(M)
- to_chat(M, "You need more energy to complete this task.")
- update_icon()
- return 0
-
-/obj/item/weapon/weldingtool/electric/attack_hand(mob/user as mob)
- if(user.get_inactive_hand() == src)
- if(power_supply)
- power_supply.update_icon()
- user.put_in_hands(power_supply)
- power_supply = null
- to_chat(user, "You remove the cell from the [src].")
- setWelding(0)
- update_icon()
- return
- ..()
- else
- return ..()
-
-/obj/item/weapon/weldingtool/electric/attackby(obj/item/weapon/W, mob/user as mob)
- if(istype(W, /obj/item/weapon/cell))
- if(istype(W, /obj/item/weapon/cell/device))
- if(!power_supply)
- user.drop_item()
- W.loc = src
- power_supply = W
- to_chat(user, "You install a cell in \the [src].")
- update_icon()
- else
- to_chat(user, "\The [src] already has a cell.")
- else
- to_chat(user, "\The [src] cannot use that type of cell.")
- else
- ..()
-
-/obj/item/weapon/weldingtool/electric/proc/get_external_power_supply()
- if(isrobot(src.loc))
- var/mob/living/silicon/robot/R = src.loc
- return R.cell
- if(istype(src.loc, /obj/item/rig_module))
- var/obj/item/rig_module/module = src.loc
- if(module.holder && module.holder.wearer)
- var/mob/living/carbon/human/H = module.holder.wearer
- if(istype(H) && H.back)
- var/obj/item/weapon/rig/suit = H.back
- if(istype(suit))
- return suit.cell
- return null
-
-/obj/item/weapon/weldingtool/electric/mounted
- use_external_power = 1
-
-/obj/item/weapon/weldingtool/electric/mounted/cyborg
- toolspeed = 0.5
-/*
- * Crowbar
- */
-
-/obj/item/weapon/crowbar
- name = "crowbar"
- desc = "Used to remove floors and to pry open doors."
- icon = 'icons/obj/tools.dmi'
- icon_state = "crowbar"
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 6
- throwforce = 7
- pry = 1
- item_state = "crowbar"
- w_class = ITEMSIZE_SMALL
- origin_tech = list(TECH_ENGINEERING = 1)
- matter = list(DEFAULT_WALL_MATERIAL = 50)
- attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
- usesound = 'sound/items/crowbar.ogg'
- toolspeed = 1
-
-/obj/item/weapon/crowbar/red
- icon = 'icons/obj/tools.dmi'
- icon_state = "red_crowbar"
- item_state = "crowbar_red"
-
-/obj/item/weapon/weldingtool/attack(var/atom/A, var/mob/living/user, var/def_zone)
- if(ishuman(A) && user.a_intent == I_HELP)
- var/mob/living/carbon/human/H = A
- var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting]
-
- if(!S || S.robotic < ORGAN_ROBOT || S.open == 3)
- return ..()
-
- if(!welding)
- to_chat(user, "You'll need to turn [src] on to patch the damage on [H]'s [S.name]!")
- return 1
-
- if(S.robo_repair(15, BRUTE, "some dents", src, user))
- remove_fuel(1, user)
-
- else
- return ..()
-
-/obj/item/weapon/crowbar/alien
- name = "alien crowbar"
- desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
- icon = 'icons/obj/abductor.dmi'
- usesound = 'sound/weapons/sonic_jackhammer.ogg'
- icon_state = "crowbar"
- toolspeed = 0.1
- origin_tech = list(TECH_COMBAT = 4, TECH_ENGINEERING = 4)
-
-/obj/item/weapon/crowbar/cyborg
- name = "hydraulic crowbar"
- desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbars in industrial synthetics."
- usesound = 'sound/items/jaws_pry.ogg'
- force = 10
- toolspeed = 0.5
-
-/obj/item/weapon/crowbar/power
- name = "jaws of life"
- desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a prying head."
- icon_state = "jaws_pry"
- item_state = "jawsoflife"
- matter = list(MAT_METAL=150, MAT_SILVER=50)
- origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
- usesound = 'sound/items/jaws_pry.ogg'
- force = 15
- toolspeed = 0.25
- var/obj/item/weapon/wirecutters/power/counterpart = null
-
-/obj/item/weapon/crowbar/power/New(newloc, no_counterpart = TRUE)
- ..(newloc)
- if(!counterpart && no_counterpart)
- counterpart = new(src, FALSE)
- counterpart.counterpart = src
-
-/obj/item/weapon/crowbar/power/Destroy()
- if(counterpart)
- counterpart.counterpart = null // So it can qdel cleanly.
- qdel_null(counterpart)
- return ..()
-
-/obj/item/weapon/crowbar/power/attack_self(mob/user)
- playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
- user.drop_item(src)
- counterpart.forceMove(get_turf(src))
- src.forceMove(counterpart)
- user.put_in_active_hand(counterpart)
- to_chat(user, "You attach the cutting jaws to [src].")
-
-
-/*/obj/item/weapon/combitool
- name = "combi-tool"
- desc = "It even has one of those nubbins for doing the thingy."
- icon = 'icons/obj/items.dmi'
- icon_state = "combitool"
- w_class = ITEMSIZE_SMALL
-
- var/list/spawn_tools = list(
- /obj/item/weapon/screwdriver,
- /obj/item/weapon/wrench,
- /obj/item/weapon/wirecutters,
- /obj/item/weapon/material/knife,
- /obj/item/weapon/material/kitchen/utensil/fork,
- /obj/item/weapon/material/knife/machete/hatchet
- )
- var/list/tools = list()
- var/current_tool = 1
-
-/obj/item/weapon/combitool/examine()
- ..()
- if(loc == usr && tools.len)
- to_chat(usr, "It has the following fittings:")
- for(var/obj/item/tool in tools)
- to_chat(usr, "\icon[tool] - [tool.name][tools[current_tool]==tool?" (selected)":""]")
-
-/obj/item/weapon/combitool/New()
- ..()
- for(var/type in spawn_tools)
- tools |= new type(src)
-
-/obj/item/weapon/combitool/attack_self(mob/user as mob)
- if(++current_tool > tools.len) current_tool = 1
- var/obj/item/tool = tools[current_tool]
- if(!tool)
- to_chat(user, "You can't seem to find any fittings in \the [src].")
- else
- to_chat(user, "You switch \the [src] to the [tool.name] fitting.")
- return 1
-
-/obj/item/weapon/combitool/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!M.Adjacent(user))
- return 0
- var/obj/item/tool = tools[current_tool]
- if(!tool) return 0
- return (tool ? tool.attack(M,user) : 0)
-
-/obj/item/weapon/combitool/afterattack(var/atom/target, var/mob/living/user, proximity, params)
- if(!proximity)
- return 0
- var/obj/item/tool = tools[current_tool]
- if(!tool) return 0
- tool.loc = user
- var/resolved = target.attackby(tool,user)
- if(!resolved && tool && target)
- tool.afterattack(target,user,1)
- if(tool)
- tool.loc = src*/
-
-#undef WELDER_FUEL_BURN_INTERVAL
+
+#define WELDER_FUEL_BURN_INTERVAL 13
+/*
+ * Welding Tool
+ */
+/obj/item/weapon/weldingtool
+ name = "welding tool"
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "welder"
+ item_state = "welder"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+
+ //Amount of OUCH when it's thrown
+ force = 3.0
+ throwforce = 5.0
+ throw_speed = 1
+ throw_range = 5
+ w_class = ITEMSIZE_SMALL
+
+ //Cost to make in the autolathe
+ matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 30)
+
+ //R&D tech level
+ origin_tech = list(TECH_ENGINEERING = 1)
+
+ //Welding tool specific stuff
+ var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
+ var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
+ var/max_fuel = 20 //The max amount of fuel the welder can hold
+
+ var/acti_sound = 'sound/items/welderactivate.ogg'
+ var/deac_sound = 'sound/items/welderdeactivate.ogg'
+ usesound = 'sound/items/Welder2.ogg'
+ var/change_icons = TRUE
+ var/flame_intensity = 2 //how powerful the emitted light is when used.
+ var/flame_color = "#FF9933" // What color the welder light emits when its on. Default is an orange-ish color.
+ var/eye_safety_modifier = 0 // Increasing this will make less eye protection needed to stop eye damage. IE at 1, sunglasses will fully protect.
+ var/burned_fuel_for = 0 // Keeps track of how long the welder's been on, used to gradually empty the welder if left one, without RNG.
+ var/always_process = FALSE // If true, keeps the welder on the process list even if it's off. Used for when it needs to regenerate fuel.
+ toolspeed = 1
+
+/obj/item/weapon/weldingtool/New()
+// var/random_fuel = min(rand(10,20),max_fuel)
+ var/datum/reagents/R = new/datum/reagents(max_fuel)
+ reagents = R
+ R.my_atom = src
+ R.add_reagent("fuel", max_fuel)
+ update_icon()
+ if(always_process)
+ processing_objects |= src
+ ..()
+
+/obj/item/weapon/weldingtool/Destroy()
+ if(welding || always_process)
+ processing_objects -= src
+ return ..()
+
+/obj/item/weapon/weldingtool/examine(mob/user)
+ if(..(user, 0))
+ if(max_fuel)
+ to_chat(user, text("\icon[] The [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel ))
+
+
+/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/living/user as mob)
+ if(istype(W,/obj/item/weapon/tool/screwdriver))
+ if(welding)
+ to_chat(user, "Stop welding first!")
+ return
+ status = !status
+ if(status)
+ to_chat(user, "You secure the welder.")
+ else
+ to_chat(user, "The welder can now be attached and modified.")
+ src.add_fingerprint(user)
+ return
+
+ if((!status) && (istype(W,/obj/item/stack/rods)))
+ var/obj/item/stack/rods/R = W
+ R.use(1)
+ var/obj/item/weapon/flamethrower/F = new/obj/item/weapon/flamethrower(user.loc)
+ src.loc = F
+ F.weldtool = src
+ if (user.client)
+ user.client.screen -= src
+ if (user.r_hand == src)
+ user.remove_from_mob(src)
+ else
+ user.remove_from_mob(src)
+ src.master = F
+ src.layer = initial(src.layer)
+ user.remove_from_mob(src)
+ if (user.client)
+ user.client.screen -= src
+ src.loc = F
+ src.add_fingerprint(user)
+ return
+
+ ..()
+ return
+
+
+/obj/item/weapon/weldingtool/process()
+ if(welding)
+ ++burned_fuel_for
+ if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL)
+ remove_fuel(1)
+
+
+
+ if(get_fuel() < 1)
+ setWelding(0)
+
+ //I'm not sure what this does. I assume it has to do with starting fires...
+ //...but it doesnt check to see if the welder is on or not.
+ var/turf/location = src.loc
+ if(istype(location, /mob/living))
+ var/mob/living/M = location
+ if(M.item_is_in_hands(src))
+ location = get_turf(M)
+ if (istype(location, /turf))
+ location.hotspot_expose(700, 5)
+
+
+/obj/item/weapon/weldingtool/afterattack(obj/O as obj, mob/user as mob, proximity)
+ if(!proximity) return
+ if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1)
+ if(!welding && max_fuel)
+ O.reagents.trans_to_obj(src, max_fuel)
+ to_chat(user, "Welder refueled")
+ playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
+ return
+ else if(!welding)
+ to_chat(user, "[src] doesn't use fuel.")
+ return
+ else
+ message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.")
+ log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.")
+ to_chat(user, "You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done.")
+ var/obj/structure/reagent_dispensers/fueltank/tank = O
+ tank.explode()
+ return
+ if (src.welding)
+ remove_fuel(1)
+ var/turf/location = get_turf(user)
+ if(isliving(O))
+ var/mob/living/L = O
+ L.IgniteMob()
+ if (istype(location, /turf))
+ location.hotspot_expose(700, 50, 1)
+ return
+
+
+/obj/item/weapon/weldingtool/attack_self(mob/user as mob)
+ setWelding(!welding, usr)
+ return
+
+//Returns the amount of fuel in the welder
+/obj/item/weapon/weldingtool/proc/get_fuel()
+ return reagents.get_reagent_amount("fuel")
+
+/obj/item/weapon/weldingtool/proc/get_max_fuel()
+ return max_fuel
+
+//Removes fuel from the welding tool. If a mob is passed, it will perform an eyecheck on the mob. This should probably be renamed to use()
+/obj/item/weapon/weldingtool/proc/remove_fuel(var/amount = 1, var/mob/M = null)
+ if(!welding)
+ return 0
+ if(amount)
+ burned_fuel_for = 0 // Reset the counter since we're removing fuel.
+ if(get_fuel() >= amount)
+ reagents.remove_reagent("fuel", amount)
+ if(M)
+ eyecheck(M)
+ update_icon()
+ return 1
+ else
+ if(M)
+ to_chat(M, "You need more welding fuel to complete this task.")
+ update_icon()
+ return 0
+
+//Returns whether or not the welding tool is currently on.
+/obj/item/weapon/weldingtool/proc/isOn()
+ return src.welding
+
+/obj/item/weapon/weldingtool/update_icon()
+ ..()
+ overlays.Cut()
+ // Welding overlay.
+ if(welding)
+ var/image/I = image(icon, src, "[icon_state]-on")
+ overlays.Add(I)
+ item_state = "[initial(item_state)]1"
+ else
+ item_state = initial(item_state)
+
+ // Fuel counter overlay.
+ if(change_icons && get_max_fuel())
+ var/ratio = get_fuel() / get_max_fuel()
+ ratio = Ceiling(ratio*4) * 25
+ var/image/I = image(icon, src, "[icon_state][ratio]")
+ overlays.Add(I)
+
+ // Lights
+ if(welding && flame_intensity)
+ set_light(flame_intensity, flame_intensity, flame_color)
+ else
+ set_light(0)
+
+// icon_state = welding ? "[icon_state]1" : "[initial(icon_state)]"
+ var/mob/M = loc
+ if(istype(M))
+ M.update_inv_l_hand()
+ M.update_inv_r_hand()
+
+/obj/item/weapon/weldingtool/MouseDrop(obj/over_object as obj)
+ if(!canremove)
+ return
+
+ if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
+
+ if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
+ return
+
+ if (!( istype(over_object, /obj/screen) ))
+ return ..()
+
+ //makes sure that the thing is equipped, so that we can't drag it into our hand from miles away.
+ //there's got to be a better way of doing this.
+ if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
+ return
+
+ if (( usr.restrained() ) || ( usr.stat ))
+ return
+
+ if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src))
+ return
+
+ switch(over_object.name)
+ if("r_hand")
+ usr.u_equip(src)
+ usr.put_in_r_hand(src)
+ if("l_hand")
+ usr.u_equip(src)
+ usr.put_in_l_hand(src)
+ src.add_fingerprint(usr)
+
+//Sets the welding state of the welding tool. If you see W.welding = 1 anywhere, please change it to W.setWelding(1)
+//so that the welding tool updates accordingly
+/obj/item/weapon/weldingtool/proc/setWelding(var/set_welding, var/mob/M)
+ if(!status) return
+
+ var/turf/T = get_turf(src)
+ //If we're turning it on
+ if(set_welding && !welding)
+ if (get_fuel() > 0)
+ if(M)
+ to_chat(M, "You switch the [src] on.")
+ else if(T)
+ T.visible_message("\The [src] turns on.")
+ playsound(loc, acti_sound, 50, 1)
+ src.force = 15
+ src.damtype = "fire"
+ src.w_class = ITEMSIZE_LARGE
+ src.hitsound = 'sound/items/welder.ogg'
+ welding = 1
+ update_icon()
+ if(!always_process)
+ processing_objects |= src
+ else
+ if(M)
+ var/msg = max_fuel ? "welding fuel" : "charge"
+ to_chat(M, "You need more [msg] to complete this task.")
+ return
+ //Otherwise
+ else if(!set_welding && welding)
+ if(!always_process)
+ processing_objects -= src
+ if(M)
+ to_chat(M, "You switch \the [src] off.")
+ else if(T)
+ T.visible_message("\The [src] turns off.")
+ playsound(loc, deac_sound, 50, 1)
+ src.force = 3
+ src.damtype = "brute"
+ src.w_class = initial(src.w_class)
+ src.welding = 0
+ src.hitsound = initial(src.hitsound)
+ update_icon()
+
+//Decides whether or not to damage a player's eyes based on what they're wearing as protection
+//Note: This should probably be moved to mob
+/obj/item/weapon/weldingtool/proc/eyecheck(mob/living/carbon/user)
+ if(!istype(user))
+ return 1
+ var/safety = user.eyecheck()
+ safety = between(-1, safety + eye_safety_modifier, 2)
+ if(istype(user, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
+ if(!E)
+ return
+ switch(safety)
+ if(1)
+ to_chat(usr, "Your eyes sting a little.")
+ E.damage += rand(1, 2)
+ if(E.damage > 12)
+ user.eye_blurry += rand(3,6)
+ if(0)
+ to_chat(usr, "Your eyes burn.")
+ E.damage += rand(2, 4)
+ if(E.damage > 10)
+ E.damage += rand(4,10)
+ if(-1)
+ to_chat(usr, "Your thermals intensify the welder's glow. Your eyes itch and burn severely.")
+ user.eye_blurry += rand(12,20)
+ E.damage += rand(12, 16)
+ if(safety<2)
+
+ if(E.damage > 10)
+ to_chat(user, "Your eyes are really starting to hurt. This can't be good for you!")
+
+ if (E.damage >= E.min_broken_damage)
+ to_chat(user, "You go blind!")
+ user.sdisabilities |= BLIND
+ else if (E.damage >= E.min_bruised_damage)
+ to_chat(user, "You go blind!")
+ user.Blind(5)
+ user.eye_blurry = 5
+ user.disabilities |= NEARSIGHTED
+ spawn(100)
+ user.disabilities &= ~NEARSIGHTED
+ return
+
+/obj/item/weapon/weldingtool/is_hot()
+ return isOn()
+
+/obj/item/weapon/weldingtool/largetank
+ name = "industrial welding tool"
+ desc = "A slightly larger welder with a larger tank."
+ icon_state = "indwelder"
+ max_fuel = 40
+ origin_tech = list(TECH_ENGINEERING = 2, TECH_PHORON = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 60)
+
+/obj/item/weapon/weldingtool/largetank/cyborg
+ name = "integrated welding tool"
+ desc = "An advanced welder designed to be used in robotic systems."
+ toolspeed = 0.5
+
+/obj/item/weapon/weldingtool/hugetank
+ name = "upgraded welding tool"
+ desc = "A much larger welder with a huge tank."
+ icon_state = "indwelder"
+ max_fuel = 80
+ w_class = ITEMSIZE_NORMAL
+ origin_tech = list(TECH_ENGINEERING = 3)
+ matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120)
+
+/obj/item/weapon/weldingtool/mini
+ name = "emergency welding tool"
+ desc = "A miniature welder used during emergencies."
+ icon_state = "miniwelder"
+ max_fuel = 10
+ w_class = ITEMSIZE_SMALL
+ matter = list(MAT_METAL = 30, MAT_GLASS = 10)
+ change_icons = 0
+ toolspeed = 2
+ eye_safety_modifier = 1 // Safer on eyes.
+
+/obj/item/weapon/weldingtool/alien
+ name = "alien welding tool"
+ desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "welder"
+ toolspeed = 0.1
+ flame_color = "#6699FF" // Light bluish.
+ eye_safety_modifier = 2
+ change_icons = 0
+ origin_tech = list(TECH_PHORON = 5 ,TECH_ENGINEERING = 5)
+ always_process = TRUE
+
+/obj/item/weapon/weldingtool/alien/process()
+ if(get_fuel() <= get_max_fuel())
+ reagents.add_reagent("fuel", 1)
+ ..()
+
+/obj/item/weapon/weldingtool/experimental
+ name = "experimental welding tool"
+ desc = "An experimental welder capable of synthesizing its own fuel from waste compounds. It can output a flame hotter than regular welders."
+ icon_state = "exwelder"
+ max_fuel = 40
+ w_class = ITEMSIZE_NORMAL
+ origin_tech = list(TECH_ENGINEERING = 4, TECH_PHORON = 3)
+ matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120)
+ toolspeed = 0.5
+ change_icons = 0
+ flame_intensity = 3
+ always_process = TRUE
+ var/nextrefueltick = 0
+
+/obj/item/weapon/weldingtool/experimental/process()
+ ..()
+ if(get_fuel() < get_max_fuel() && nextrefueltick < world.time)
+ nextrefueltick = world.time + 10
+ reagents.add_reagent("fuel", 1)
+
+/*
+ * Backpack Welder.
+ */
+
+/obj/item/weapon/weldingtool/tubefed
+ name = "tube-fed welding tool"
+ desc = "A bulky, cooler-burning welding tool that draws from a worn welding tank."
+ icon_state = "tubewelder"
+ max_fuel = 10
+ w_class = ITEMSIZE_NO_CONTAINER
+ matter = null
+ toolspeed = 1.25
+ change_icons = 0
+ flame_intensity = 1
+ eye_safety_modifier = 1
+ always_process = TRUE
+ var/obj/item/weapon/weldpack/mounted_pack = null
+
+/obj/item/weapon/weldingtool/tubefed/New(location)
+ ..()
+ if(istype(location, /obj/item/weapon/weldpack))
+ var/obj/item/weapon/weldpack/holder = location
+ mounted_pack = holder
+ else
+ qdel(src)
+
+/obj/item/weapon/weldingtool/tubefed/Destroy()
+ mounted_pack.nozzle = null
+ mounted_pack = null
+ return ..()
+
+/obj/item/weapon/weldingtool/tubefed/process()
+ if(mounted_pack)
+ if(!istype(mounted_pack.loc,/mob/living/carbon/human))
+ mounted_pack.return_nozzle()
+ else
+ var/mob/living/carbon/human/H = mounted_pack.loc
+ if(H.back != mounted_pack)
+ mounted_pack.return_nozzle()
+
+ if(mounted_pack.loc != src.loc && src.loc != mounted_pack)
+ mounted_pack.return_nozzle()
+ visible_message("\The [src] retracts to its fueltank.")
+
+ if(get_fuel() <= get_max_fuel())
+ mounted_pack.reagents.trans_to_obj(src, 1)
+
+ ..()
+
+/obj/item/weapon/weldingtool/tubefed/dropped(mob/user)
+ ..()
+ if(src.loc != user)
+ mounted_pack.return_nozzle()
+ to_chat(user, "\The [src] retracts to its fueltank.")
+
+/*
+ * Electric/Arc Welder
+ */
+
+/obj/item/weapon/weldingtool/electric //AND HIS WELDING WAS ELECTRIC
+ name = "electric welding tool"
+ desc = "A welder which runs off of electricity."
+ icon_state = "arcwelder"
+ max_fuel = 0 //We'll handle the consumption later.
+ item_state = "ewelder"
+ var/obj/item/weapon/cell/power_supply //What type of power cell this uses
+ var/charge_cost = 24 //The rough equivalent of 1 unit of fuel, based on us wanting 10 welds per battery
+ var/cell_type = /obj/item/weapon/cell/device
+ var/use_external_power = 0 //If in a borg or hardsuit, this needs to = 1
+ flame_color = "#00CCFF" // Blue-ish, to set it apart from the gas flames.
+ acti_sound = 'sound/effects/sparks4.ogg'
+ deac_sound = 'sound/effects/sparks4.ogg'
+
+/obj/item/weapon/weldingtool/electric/unloaded/New()
+ cell_type = null
+
+/obj/item/weapon/weldingtool/electric/New()
+ ..()
+ if(cell_type == null)
+ update_icon()
+ else if(cell_type)
+ power_supply = new cell_type(src)
+ else
+ power_supply = new /obj/item/weapon/cell/device(src)
+ update_icon()
+
+/obj/item/weapon/weldingtool/electric/get_cell()
+ return power_supply
+
+/obj/item/weapon/weldingtool/electric/examine(mob/user)
+ if(get_dist(src, user) > 1)
+ to_chat(user, desc)
+ else // The << need to stay, for some reason
+ if(power_supply)
+ user << text("\icon[] The [] has [] charge left.", src, src.name, get_fuel())
+ else
+ user << text("\icon[] The [] has no power cell!", src, src.name)
+
+/obj/item/weapon/weldingtool/electric/get_fuel()
+ if(use_external_power)
+ var/obj/item/weapon/cell/external = get_external_power_supply()
+ if(external)
+ return external.charge
+ else if(power_supply)
+ return power_supply.charge
+ else
+ return 0
+
+/obj/item/weapon/weldingtool/electric/get_max_fuel()
+ if(use_external_power)
+ var/obj/item/weapon/cell/external = get_external_power_supply()
+ if(external)
+ return external.maxcharge
+ else if(power_supply)
+ return power_supply.maxcharge
+ return 0
+
+/obj/item/weapon/weldingtool/electric/remove_fuel(var/amount = 1, var/mob/M = null)
+ if(!welding)
+ return 0
+ if(get_fuel() >= amount)
+ power_supply.checked_use(charge_cost)
+ if(use_external_power)
+ var/obj/item/weapon/cell/external = get_external_power_supply()
+ if(!external || !external.use(charge_cost)) //Take power from the borg...
+ power_supply.give(charge_cost) //Give it back to the cell.
+ if(M)
+ eyecheck(M)
+ update_icon()
+ return 1
+ else
+ if(M)
+ to_chat(M, "You need more energy to complete this task.")
+ update_icon()
+ return 0
+
+/obj/item/weapon/weldingtool/electric/attack_hand(mob/user as mob)
+ if(user.get_inactive_hand() == src)
+ if(power_supply)
+ power_supply.update_icon()
+ user.put_in_hands(power_supply)
+ power_supply = null
+ to_chat(user, "You remove the cell from the [src].")
+ setWelding(0)
+ update_icon()
+ return
+ ..()
+ else
+ return ..()
+
+/obj/item/weapon/weldingtool/electric/attackby(obj/item/weapon/W, mob/user as mob)
+ if(istype(W, /obj/item/weapon/cell))
+ if(istype(W, /obj/item/weapon/cell/device))
+ if(!power_supply)
+ user.drop_item()
+ W.loc = src
+ power_supply = W
+ to_chat(user, "You install a cell in \the [src].")
+ update_icon()
+ else
+ to_chat(user, "\The [src] already has a cell.")
+ else
+ to_chat(user, "\The [src] cannot use that type of cell.")
+ else
+ ..()
+
+/obj/item/weapon/weldingtool/electric/proc/get_external_power_supply()
+ if(isrobot(src.loc))
+ var/mob/living/silicon/robot/R = src.loc
+ return R.cell
+ if(istype(src.loc, /obj/item/rig_module))
+ var/obj/item/rig_module/module = src.loc
+ if(module.holder && module.holder.wearer)
+ var/mob/living/carbon/human/H = module.holder.wearer
+ if(istype(H) && H.back)
+ var/obj/item/weapon/rig/suit = H.back
+ if(istype(suit))
+ return suit.cell
+ return null
+
+/obj/item/weapon/weldingtool/electric/mounted
+ use_external_power = 1
+
+/obj/item/weapon/weldingtool/electric/mounted/cyborg
+ toolspeed = 0.5
+
+#undef WELDER_FUEL_BURN_INTERVAL
diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm
new file mode 100644
index 0000000000..edd002cc4b
--- /dev/null
+++ b/code/game/objects/items/weapons/tools/wirecutters.dm
@@ -0,0 +1,93 @@
+/*
+ * Wirecutters
+ */
+/obj/item/weapon/tool/wirecutters
+ name = "wirecutters"
+ desc = "This cuts wires."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "cutters"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ force = 6
+ throw_speed = 2
+ throw_range = 9
+ w_class = ITEMSIZE_SMALL
+ origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 80)
+ attack_verb = list("pinched", "nipped")
+ hitsound = 'sound/items/wirecutter.ogg'
+ usesound = 'sound/items/wirecutter.ogg'
+ sharp = 1
+ edge = 1
+ toolspeed = 1
+ var/random_color = TRUE
+
+/obj/item/weapon/tool/wirecutters/New()
+ if(random_color && prob(50))
+ icon_state = "cutters-y"
+ item_state = "cutters_yellow"
+ ..()
+
+/obj/item/weapon/tool/wirecutters/attack(mob/living/carbon/C as mob, mob/user as mob)
+ if(istype(C) && user.a_intent == I_HELP && (C.handcuffed) && (istype(C.handcuffed, /obj/item/weapon/handcuffs/cable)))
+ usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\
+ "You cut \the [C]'s restraints with \the [src]!",\
+ "You hear cable being cut.")
+ C.handcuffed = null
+ if(C.buckled && C.buckled.buckle_require_restraints)
+ C.buckled.unbuckle_mob()
+ C.update_inv_handcuffed()
+ return
+ else
+ ..()
+
+/obj/item/weapon/tool/wirecutters/is_wirecutter()
+ return TRUE
+
+/obj/item/weapon/tool/wirecutters/alien
+ name = "alien wirecutters"
+ desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "cutters"
+ toolspeed = 0.1
+ origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4)
+ random_color = FALSE
+
+/obj/item/weapon/tool/wirecutters/cyborg
+ name = "wirecutters"
+ desc = "This cuts wires. With science."
+ usesound = 'sound/items/jaws_cut.ogg'
+ toolspeed = 0.5
+
+/obj/item/weapon/tool/wirecutters/power
+ name = "jaws of life"
+ desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a cutting head."
+ icon_state = "jaws_cutter"
+ item_state = "jawsoflife"
+ origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
+ matter = list(MAT_METAL=150, MAT_SILVER=50)
+ usesound = 'sound/items/jaws_cut.ogg'
+ force = 15
+ toolspeed = 0.25
+ random_color = FALSE
+ var/obj/item/weapon/tool/crowbar/power/counterpart = null
+
+/obj/item/weapon/tool/wirecutters/power/New(newloc, no_counterpart = TRUE)
+ ..(newloc)
+ if(!counterpart && no_counterpart)
+ counterpart = new(src, FALSE)
+ counterpart.counterpart = src
+
+/obj/item/weapon/tool/wirecutters/power/Destroy()
+ if(counterpart)
+ counterpart.counterpart = null // So it can qdel cleanly.
+ qdel_null(counterpart)
+ return ..()
+
+/obj/item/weapon/tool/wirecutters/power/attack_self(mob/user)
+ playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
+ user.drop_item(src)
+ counterpart.forceMove(get_turf(src))
+ src.forceMove(counterpart)
+ user.put_in_active_hand(counterpart)
+ to_chat(user, "You attach the pry jaws to [src].")
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm
new file mode 100644
index 0000000000..22eb371157
--- /dev/null
+++ b/code/game/objects/items/weapons/tools/wrench.dm
@@ -0,0 +1,71 @@
+/*
+ * Wrench
+ */
+/obj/item/weapon/tool/wrench
+ name = "wrench"
+ desc = "A wrench with many common uses. Can be usually found in your hand."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "wrench"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ force = 6
+ throwforce = 7
+ w_class = ITEMSIZE_SMALL
+ origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 150)
+ attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
+ usesound = 'sound/items/ratchet.ogg'
+ toolspeed = 1
+
+/obj/item/weapon/tool/wrench/is_wrench()
+ return TRUE
+
+/obj/item/weapon/tool/wrench/cyborg
+ name = "automatic wrench"
+ desc = "An advanced robotic wrench. Can be found in industrial synthetic shells."
+ usesound = 'sound/items/drill_use.ogg'
+ toolspeed = 0.5
+
+/obj/item/weapon/tool/wrench/alien
+ name = "alien wrench"
+ desc = "A polarized wrench. It causes anything placed between the jaws to turn."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "wrench"
+ usesound = 'sound/effects/empulse.ogg'
+ toolspeed = 0.1
+ origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5)
+
+/obj/item/weapon/tool/wrench/power
+ name = "hand drill"
+ desc = "A simple powered hand drill. It's fitted with a bolt bit."
+ icon_state = "drill_bolt"
+ item_state = "drill"
+ usesound = 'sound/items/drill_use.ogg'
+ matter = list(DEFAULT_WALL_MATERIAL = 150, MAT_SILVER = 50)
+ origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
+ force = 8
+ w_class = ITEMSIZE_SMALL
+ throwforce = 8
+ attack_verb = list("drilled", "screwed", "jabbed")
+ toolspeed = 0.25
+ var/obj/item/weapon/tool/screwdriver/power/counterpart = null
+
+/obj/item/weapon/tool/wrench/power/New(newloc, no_counterpart = TRUE)
+ ..(newloc)
+ if(!counterpart && no_counterpart)
+ counterpart = new(src, FALSE)
+ counterpart.counterpart = src
+
+/obj/item/weapon/tool/wrench/power/Destroy()
+ if(counterpart)
+ counterpart.counterpart = null // So it can qdel cleanly.
+ qdel_null(counterpart)
+ return ..()
+
+/obj/item/weapon/tool/wrench/power/attack_self(mob/user)
+ playsound(get_turf(user),'sound/items/change_drill.ogg',50,1)
+ user.drop_item(src)
+ counterpart.forceMove(get_turf(src))
+ src.forceMove(counterpart)
+ user.put_in_active_hand(counterpart)
+ to_chat(user, "You attach the screw driver bit to [src].")
\ No newline at end of file
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 3835b2a24b..9c2fb60434 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -39,7 +39,7 @@
/obj/CanUseTopic(var/mob/user, var/datum/topic_state/state)
if(user.CanUseObjTopic(src))
return ..()
- user << "\icon[src]Access Denied!"
+ to_chat(user, "\icon[src]Access Denied!")
return STATUS_CLOSE
/mob/living/silicon/CanUseObjTopic(var/obj/O)
@@ -163,3 +163,6 @@
/obj/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2)
return
+
+/obj/proc/get_cell()
+ return
\ No newline at end of file
diff --git a/code/game/objects/random/guns_and_ammo.dm b/code/game/objects/random/guns_and_ammo.dm
index a910881a76..62dde5a3df 100644
--- a/code/game/objects/random/guns_and_ammo.dm
+++ b/code/game/objects/random/guns_and_ammo.dm
@@ -1,6 +1,16 @@
+/obj/random/gun/random
+ name = "Random Weapon"
+ desc = "This is a random energy or ballistic weapon."
+ icon = 'icons/obj/gun.dmi'
+ icon_state = "energystun100"
+
+/obj/random/gun/random/item_to_spawn()
+ return pick(prob(5);/obj/random/energy,
+ prob(5);/obj/random/projectile/random)
+
/obj/random/energy
name = "Random Energy Weapon"
- desc = "This is a random security weapon."
+ desc = "This is a random weapon."
icon = 'icons/obj/gun.dmi'
icon_state = "energykill100"
@@ -83,6 +93,18 @@
prob(2);/obj/item/weapon/gun/projectile/automatic/wt550,
prob(1);/obj/item/weapon/gun/projectile/shotgun/pump/combat)
+/obj/random/projectile/shotgun
+ name = "Random Projectile Weapon"
+ desc = "This is a random projectile weapon."
+ icon = 'icons/obj/gun.dmi'
+ icon_state = "shotgun"
+
+/obj/random/projectile/item_to_spawn()
+ return pick(prob(4);/obj/item/weapon/gun/projectile/shotgun/doublebarrel,
+ prob(3);/obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn,
+ prob(3);/obj/item/weapon/gun/projectile/shotgun/pump,
+ prob(1);/obj/item/weapon/gun/projectile/shotgun/pump/combat)
+
/obj/random/handgun
name = "Random Handgun"
desc = "This is a random sidearm."
@@ -126,4 +148,256 @@
prob(4);/obj/item/ammo_magazine/m45/rubber,
prob(4);/obj/item/ammo_magazine/m45/flash,
prob(2);/obj/item/ammo_magazine/m9mmt,
- prob(6);/obj/item/ammo_magazine/m9mmt/rubber)
\ No newline at end of file
+ prob(6);/obj/item/ammo_magazine/m9mmt/rubber)
+
+/obj/random/projectile/random
+ name = "Random Projectile Weapon"
+ desc = "This is a random weapon."
+ icon = 'icons/obj/gun.dmi'
+ icon_state = "revolver"
+
+/obj/random/projectile/random/item_to_spawn()
+ return pick(prob(3);/obj/random/multiple/gun/projectile/handgun,
+ prob(2);/obj/random/multiple/gun/projectile/smg,
+ prob(2);/obj/random/multiple/gun/projectile/shotgun,
+ prob(1);/obj/random/multiple/gun/projectile/rifle)
+
+/obj/random/multiple/gun/projectile/smg
+ name = "random smg projectile gun"
+ desc = "Loot for PoIs."
+ icon = 'icons/obj/gun.dmi'
+ icon_state = "saber"
+
+/obj/random/multiple/gun/projectile/smg/item_to_spawn()
+ return pick(
+ prob(3);list(
+ /obj/item/weapon/gun/projectile/automatic/wt550,
+ /obj/item/ammo_magazine/m9mmt,
+ /obj/item/ammo_magazine/m9mmt
+ ),
+ prob(3);list(
+ /obj/item/weapon/gun/projectile/automatic/mini_uzi,
+ /obj/item/ammo_magazine/m45uzi,
+ /obj/item/ammo_magazine/m45uzi
+ ),
+ prob(3);list(
+ /obj/item/weapon/gun/projectile/automatic/tommygun,
+ /obj/item/ammo_magazine/m45tommy,
+ /obj/item/ammo_magazine/m45tommy
+ ),
+ prob(2);list(
+ /obj/item/weapon/gun/projectile/automatic/c20r,
+ /obj/item/ammo_magazine/m10mm,
+ /obj/item/ammo_magazine/m10mm
+ ),
+ prob(1);list(
+ /obj/item/weapon/gun/projectile/automatic/p90,
+ /obj/item/ammo_magazine/m9mmp90
+ )
+ )
+
+/obj/random/multiple/gun/projectile/rifle
+ name = "random rifle projectile gun"
+ desc = "Loot for PoIs."
+ icon = 'icons/obj/gun.dmi'
+ icon_state = "carbine"
+
+//Concerns about the bullpup, but currently seems to be only a slightly stronger z8. But we shall see.
+
+/obj/random/multiple/gun/projectile/rifle/item_to_spawn()
+ return pick(
+ prob(2);list(
+ /obj/item/weapon/gun/projectile/automatic/sts35,
+ /obj/item/ammo_magazine/m545,
+ /obj/item/ammo_magazine/m545
+ ),
+ prob(2);list(
+ /obj/item/weapon/gun/projectile/automatic/z8,
+ /obj/item/ammo_magazine/m762,
+ /obj/item/ammo_magazine/m762
+ ),
+ prob(4);list(
+ /obj/item/weapon/gun/projectile/shotgun/pump/rifle,
+ /obj/item/ammo_magazine/clip/c762,
+ /obj/item/ammo_magazine/clip/c762
+ ),
+ prob(3);list(
+ /obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever,
+ /obj/item/ammo_magazine/clip/c762,
+ /obj/item/ammo_magazine/clip/c762
+ ),
+ prob(1);list(
+ /obj/item/weapon/gun/projectile/garand,
+ /obj/item/ammo_magazine/m762garand,
+ /obj/item/ammo_magazine/m762garand
+ ),
+ prob(1);list(
+ /obj/item/weapon/gun/projectile/automatic/bullpup,
+ /obj/item/ammo_magazine/m762,
+ /obj/item/ammo_magazine/m762
+ )
+ )
+
+/obj/random/multiple/gun/projectile/handgun
+ name = "random handgun projectile gun"
+ desc = "Loot for PoIs."
+ icon = 'icons/obj/gun.dmi'
+ icon_state = "revolver"
+
+/obj/random/multiple/gun/projectile/handgun/item_to_spawn()
+ return pick(
+ prob(5);list(
+ /obj/item/weapon/gun/projectile/colt,
+ /obj/item/ammo_magazine/m45,
+ /obj/item/ammo_magazine/m45
+ ),
+ prob(4);list(
+ /obj/item/weapon/gun/projectile/contender,
+ /obj/item/ammo_magazine/s357,
+ /obj/item/ammo_magazine/s357
+ ),
+ prob(3);list(
+ /obj/item/weapon/gun/projectile/contender/tacticool,
+ /obj/item/ammo_magazine/s357,
+ /obj/item/ammo_magazine/s357
+ ),
+ prob(2);list(
+ /obj/item/weapon/gun/projectile/deagle,
+ /obj/item/ammo_magazine/m44,
+ /obj/item/ammo_magazine/m44
+ ),
+ prob(1);list(
+ /obj/item/weapon/gun/projectile/deagle/camo,
+ /obj/item/ammo_magazine/m44,
+ /obj/item/ammo_magazine/m44
+ ),
+ prob(1);list(
+ /obj/item/weapon/gun/projectile/deagle/gold,
+ /obj/item/ammo_magazine/m44,
+ /obj/item/ammo_magazine/m44
+ ),
+ prob(4);list(
+ /obj/item/weapon/gun/projectile/derringer,
+ /obj/item/ammo_magazine/s357,
+ /obj/item/ammo_magazine/s357
+ ),
+ prob(5);list(
+ /obj/item/weapon/gun/projectile/luger,
+ /obj/item/ammo_magazine/m9mm/compact,
+ /obj/item/ammo_magazine/m9mm/compact
+ ),
+ prob(4);list(
+ /obj/item/weapon/gun/projectile/luger/brown,
+ /obj/item/ammo_magazine/m9mm/compact,
+ /obj/item/ammo_magazine/m9mm/compact
+ ),
+ prob(5);list(
+ /obj/item/weapon/gun/projectile/sec,
+ /obj/item/ammo_magazine/m45,
+ /obj/item/ammo_magazine/m45
+ ),
+ prob(4);list(
+ /obj/item/weapon/gun/projectile/sec/wood,
+ /obj/item/ammo_magazine/m45,
+ /obj/item/ammo_magazine/m45
+ ),
+ prob(5);list(
+ /obj/item/weapon/gun/projectile/p92x,
+ /obj/item/ammo_magazine/m9mm,
+ /obj/item/ammo_magazine/m9mm
+ ),
+ prob(4);list(
+ /obj/item/weapon/gun/projectile/p92x/brown,
+ /obj/item/ammo_magazine/m9mm,
+ /obj/item/ammo_magazine/m9mm
+ ),
+ prob(2);list(
+ /obj/item/weapon/gun/projectile/p92x/large,
+ /obj/item/ammo_magazine/m9mm/large,
+ /obj/item/ammo_magazine/m9mm/large
+ ),
+ prob(5);list(
+ /obj/item/weapon/gun/projectile/pistol,
+ /obj/item/ammo_magazine/m9mm/compact,
+ /obj/item/ammo_magazine/m9mm/compact
+ ),
+ prob(2);list(
+ /obj/item/weapon/gun/projectile/silenced,
+ /obj/item/ammo_magazine/m45,
+ /obj/item/ammo_magazine/m45
+ ),
+ prob(2);list(
+ /obj/item/weapon/gun/projectile/revolver,
+ /obj/item/ammo_magazine/s357,
+ /obj/item/ammo_magazine/s357
+ ),
+ prob(4);list(
+ /obj/item/weapon/gun/projectile/revolver/deckard,
+ /obj/item/ammo_magazine/s38,
+ /obj/item/ammo_magazine/s38
+ ),
+ prob(4);list(
+ /obj/item/weapon/gun/projectile/revolver/detective,
+ /obj/item/ammo_magazine/s38,
+ /obj/item/ammo_magazine/s38
+ ),
+ prob(2);list(
+ /obj/item/weapon/gun/projectile/revolver/judge,
+ /obj/item/ammo_magazine/clip/c12g,
+ /obj/item/ammo_magazine/clip/c12g,
+ /obj/item/ammo_magazine/clip/c12g
+ ),
+ prob(2);list(
+ /obj/item/weapon/gun/projectile/revolver/lemat,
+ /obj/item/ammo_magazine/s38,
+ /obj/item/ammo_magazine/s38,
+ /obj/item/ammo_magazine/clip/c12g
+ ),
+ prob(2);list(
+ /obj/item/weapon/gun/projectile/revolver/mateba,
+ /obj/item/ammo_magazine/s357,
+ /obj/item/ammo_magazine/s357
+ ),
+ prob(2);list(
+ /obj/item/weapon/gun/projectile/revolver/webley,
+ /obj/item/ammo_magazine/s44,
+ /obj/item/ammo_magazine/s44
+ ),
+ prob(1);list(
+ /obj/item/weapon/gun/projectile/revolver/webley/auto,
+ /obj/item/ammo_magazine/s44,
+ /obj/item/ammo_magazine/s44
+ )
+ )
+
+/obj/random/multiple/gun/projectile/shotgun
+ name = "random shotgun projectile gun"
+ desc = "Loot for PoIs."
+ icon = 'icons/obj/gun.dmi'
+ icon_state = "shotgun"
+
+/obj/random/multiple/gun/projectile/shotgun/item_to_spawn()
+ return pick(
+ prob(4);list(
+ /obj/item/weapon/gun/projectile/shotgun/doublebarrel/pellet,
+ /obj/item/ammo_magazine/clip/c12g/pellet,
+ /obj/item/ammo_magazine/clip/c12g/pellet,
+ /obj/item/ammo_magazine/clip/c12g/pellet,
+ /obj/item/ammo_magazine/clip/c12g/pellet
+ ),
+ prob(3);list(
+ /obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn,
+ /obj/item/ammo_magazine/clip/c12g/pellet,
+ /obj/item/ammo_magazine/clip/c12g/pellet,
+ /obj/item/ammo_magazine/clip/c12g/pellet,
+ /obj/item/ammo_magazine/clip/c12g/pellet
+ ),
+ prob(3);list(
+ /obj/item/weapon/gun/projectile/shotgun/pump/slug,
+ /obj/item/weapon/storage/box/shotgunammo
+ ),
+ prob(1);list(
+ /obj/item/weapon/gun/projectile/shotgun/pump/combat,
+ /obj/item/weapon/storage/box/shotgunammo
+ )
+ )
\ No newline at end of file
diff --git a/code/game/objects/random/mapping.dm b/code/game/objects/random/mapping.dm
index 57ff7acdcd..aba62d0806 100644
--- a/code/game/objects/random/mapping.dm
+++ b/code/game/objects/random/mapping.dm
@@ -92,8 +92,8 @@
/obj/random/multiple/minevault
name = "random vault loot"
desc = "Loot for mine vaults."
- icon = 'icons/misc/mark.dmi'
- icon_state = "rup"
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "crate"
/obj/random/multiple/minevault/item_to_spawn()
return pick(
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index 29b597d460..28a9513e77 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -10,12 +10,12 @@
icon_state = "welder"
/obj/random/tool/item_to_spawn()
- return pick(/obj/item/weapon/screwdriver,
- /obj/item/weapon/wirecutters,
+ return pick(/obj/item/weapon/tool/screwdriver,
+ /obj/item/weapon/tool/wirecutters,
/obj/item/weapon/weldingtool,
/obj/item/weapon/weldingtool/largetank,
- /obj/item/weapon/crowbar,
- /obj/item/weapon/wrench,
+ /obj/item/weapon/tool/crowbar,
+ /obj/item/weapon/tool/wrench,
/obj/item/device/flashlight,
/obj/item/device/multitool)
@@ -26,8 +26,8 @@
/obj/random/tool/powermaint/item_to_spawn()
return pick(prob(320);/obj/random/tool,
- prob(1);/obj/item/weapon/screwdriver/power,
- prob(1);/obj/item/weapon/wirecutters/power,
+ prob(1);/obj/item/weapon/tool/screwdriver/power,
+ prob(1);/obj/item/weapon/tool/wirecutters/power,
prob(15);/obj/item/weapon/weldingtool/electric,
prob(5);/obj/item/weapon/weldingtool/experimental)
@@ -37,8 +37,8 @@
icon_state = "jaws_pry"
/obj/random/tool/power/item_to_spawn()
- return pick(/obj/item/weapon/screwdriver/power,
- /obj/item/weapon/wirecutters/power,
+ return pick(/obj/item/weapon/tool/screwdriver/power,
+ /obj/item/weapon/tool/wirecutters/power,
/obj/item/weapon/weldingtool/electric,
/obj/item/weapon/weldingtool/experimental)
@@ -49,11 +49,11 @@
icon_state = "welder"
/obj/random/tool/alien/item_to_spawn()
- return pick(/obj/item/weapon/screwdriver/alien,
- /obj/item/weapon/wirecutters/alien,
+ return pick(/obj/item/weapon/tool/screwdriver/alien,
+ /obj/item/weapon/tool/wirecutters/alien,
/obj/item/weapon/weldingtool/alien,
- /obj/item/weapon/crowbar/alien,
- /obj/item/weapon/wrench/alien,
+ /obj/item/weapon/tool/crowbar/alien,
+ /obj/item/weapon/tool/wrench/alien,
/obj/item/stack/cable_coil/alien,
/obj/item/device/multitool/alien)
@@ -159,8 +159,8 @@
/obj/random/medical
name = "Random Medicine"
desc = "This is a random medical item."
- icon = 'icons/obj/items.dmi'
- icon_state = "advfirstaid"
+ icon = 'icons/obj/stacks.dmi'
+ icon_state = "traumakit"
/obj/random/medical/item_to_spawn()
return pick(prob(21);/obj/random/medical/lite,
diff --git a/code/game/objects/random/mob.dm b/code/game/objects/random/mob.dm
index 2043ef0240..3aefa9a84c 100644
--- a/code/game/objects/random/mob.dm
+++ b/code/game/objects/random/mob.dm
@@ -74,6 +74,23 @@
prob(1);/mob/living/simple_animal/hostile/goose,
prob(20);/mob/living/simple_animal/giant_crab)
+
+/obj/random/mob/sif/peaceful
+ name = "Random Peaceful Sif Animal"
+ desc = "This is a random peaceful cold weather animal."
+ icon_state = "penguin"
+
+ mob_returns_home = 1
+ mob_wander_distance = 12
+
+/obj/random/mob/sif/peaceful/item_to_spawn()
+ return pick(prob(30);/mob/living/simple_animal/retaliate/diyaab,
+ prob(15);/mob/living/simple_animal/crab,
+ prob(15);/mob/living/simple_animal/penguin,
+ prob(15);/mob/living/simple_animal/mouse,
+ prob(15);/mob/living/simple_animal/corgi/tamaskan,
+ prob(20);/mob/living/simple_animal/giant_crab)
+
/obj/random/mob/sif/hostile
name = "Random Hostile Sif Animal"
desc = "This is a random hostile cold weather animal."
@@ -97,6 +114,18 @@
prob(33);/mob/living/simple_animal/hostile/giant_spider/hunter,
prob(45);/mob/living/simple_animal/hostile/giant_spider)
+/obj/random/mob/spider/nurse
+ name = "Random Nurse Spider"
+ desc = "This is a random nurse spider."
+ icon_state = "nurse"
+
+ mob_returns_home = 1
+ mob_wander_distance = 4
+
+/obj/random/mob/spider/nurse/item_to_spawn()
+ return pick(prob(22);/mob/living/simple_animal/hostile/giant_spider/nurse/hat,
+ prob(45);/mob/living/simple_animal/hostile/giant_spider/nurse)
+
/obj/random/mob/spider/mutant
name = "Random Mutant Spider"
desc = "This is a random mutated spider."
diff --git a/code/game/objects/random/spacesuits.dm b/code/game/objects/random/spacesuits.dm
index cb4ec6d4e9..29bd799c5c 100644
--- a/code/game/objects/random/spacesuits.dm
+++ b/code/game/objects/random/spacesuits.dm
@@ -97,6 +97,31 @@
)
)
+/obj/random/multiple/voidsuit/medical
+ name = "Random Mining Voidsuit"
+ desc = "This is a random mining voidsuit."
+ icon = 'icons/obj/clothing/suits.dmi'
+ icon_state = "rig-mining"
+
+/obj/random/multiple/voidsuit/medical/item_to_spawn()
+ return pick(
+ prob(5);list(
+ /obj/item/clothing/suit/space/void/medical,
+ /obj/item/clothing/head/helmet/space/void/medical
+ ),
+ prob(1);list(
+ /obj/item/clothing/suit/space/void/medical/alt,
+ /obj/item/clothing/head/helmet/space/void/medical/alt
+ ),
+ prob(3);list(
+ /obj/item/clothing/suit/space/void/medical/bio,
+ /obj/item/clothing/head/helmet/space/void/medical/bio
+ ),
+ prob(4);list(
+ /obj/item/clothing/suit/space/void/medical/emt,
+ /obj/item/clothing/head/helmet/space/void/medical/emt
+ )
+ )
/obj/random/rigsuit
name = "Random rigsuit"
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index b41743799b..faa9f024f0 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -10,7 +10,7 @@
/obj/structure/Destroy()
if(parts)
new parts(loc)
- . = ..()
+ . = ..()
/obj/structure/attack_hand(mob/user)
if(breakable)
@@ -177,7 +177,7 @@
return 1
/obj/structure/attack_generic(var/mob/user, var/damage, var/attack_verb, var/wallbreaker)
- if(!breakable || !damage || !wallbreaker)
+ if(!breakable || damage < 10 || !wallbreaker)
return 0
visible_message("[user] [attack_verb] the [src] apart!")
user.do_attack_animation(src)
diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm
index d9f3340bdd..eda2c9346b 100644
--- a/code/game/objects/structures/catwalk.dm
+++ b/code/game/objects/structures/catwalk.dm
@@ -1,10 +1,11 @@
// Based on catwalk.dm from https://github.com/Endless-Horizon/CEV-Eris
/obj/structure/catwalk
- layer = TURF_LAYER + 0.5
- icon = 'icons/turf/catwalks.dmi'
- icon_state = "catwalk"
name = "catwalk"
desc = "Cats really don't like these things."
+ plane = DECAL_PLANE
+ layer = ABOVE_UTILITY
+ icon = 'icons/turf/catwalks.dmi'
+ icon_state = "catwalk"
density = 0
var/health = 100
var/maxhealth = 100
@@ -66,7 +67,7 @@
return
/obj/structure/catwalk/attackby(obj/item/C as obj, mob/user as mob)
- if (istype(C, /obj/item/weapon/weldingtool))
+ if(istype(C, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = C
if(WT.isOn())
if(WT.remove_fuel(0, user))
@@ -75,7 +76,7 @@
new /obj/item/stack/rods(src.loc)
new /obj/structure/lattice(src.loc)
qdel(src)
- if(istype(C, /obj/item/weapon/screwdriver))
+ if(C.is_screwdriver())
if(health < maxhealth)
to_chat(user, "You begin repairing \the [src.name] with \the [C.name].")
if(do_after(user, 20, src))
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index e25553d361..1dc8336ae6 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -5,6 +5,7 @@
icon_state = "closed"
density = 1
w_class = ITEMSIZE_HUGE
+ layer = UNDER_JUNK_LAYER
var/icon_closed = "closed"
var/icon_opened = "open"
var/opened = 0
@@ -21,12 +22,13 @@
var/store_items = 1
var/store_mobs = 1
- var/list/will_contain
+ var/list/starts_with
/obj/structure/closet/initialize()
. = ..()
- if(will_contain)
- create_objects_in_loc(src, will_contain)
+ if(starts_with)
+ create_objects_in_loc(src, starts_with)
+ starts_with = null
if(!opened) // if closed, any item at the crate's loc is put in the contents
var/obj/item/I
@@ -258,7 +260,7 @@
src.update_icon()
for(var/mob/M in viewers(src))
M.show_message("[src] has been [welded?"welded shut":"unwelded"] by [user.name].", 3, "You hear welding.", 2)
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
if(welded)
if(anchored)
user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
@@ -345,7 +347,7 @@
icon_state = icon_opened
/obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys", var/wallbreaker)
- if(!damage || !wallbreaker)
+ if(damage < 10 || !wallbreaker)
return
user.do_attack_animation(src)
visible_message("[user] [attack_message] the [src]!")
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
index 0af7913df8..cad925f6e8 100644
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
@@ -14,91 +14,69 @@
var/locked = 1
var/smashed = 0
- New()
- ..()
- fireaxe = new /obj/item/weapon/material/twohanded/fireaxe(src)
+ starts_with = list(/obj/item/weapon/material/twohanded/fireaxe)
- attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
- //..() //That's very useful, Erro
+/obj/structure/closet/fireaxecabinet/initialize()
+ ..()
+ fireaxe = locate() in contents
- // This could stand to be put further in, made better, etc. but fuck you. Fuck whoever
- // wrote this code. Fuck everything about this object. I hope you step on a Lego.
- user.setClickCooldown(10)
- // Seriously why the fuck is this even a closet aghasjdhasd I hate you
+/obj/structure/closet/fireaxecabinet/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
+ //..() //That's very useful, Erro
- var/hasaxe = 0 //gonna come in handy later~ // FUCK YOUR TILDES.
- if(fireaxe)
- hasaxe = 1
+ // This could stand to be put further in, made better, etc. but fuck you. Fuck whoever
+ // wrote this code. Fuck everything about this object. I hope you step on a Lego.
+ user.setClickCooldown(10)
+ // Seriously why the fuck is this even a closet aghasjdhasd I hate you
- if (isrobot(usr) || src.locked)
- if(istype(O, /obj/item/device/multitool))
- user << "Resetting circuitry..."
- playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
- if(do_after(user, 20 * O.toolspeed))
- src.locked = 0
- to_chat(user, " You disable the locking modules.")
- update_icon()
- return
- else if(istype(O, /obj/item/weapon))
- var/obj/item/weapon/W = O
- if(src.smashed || src.localopened)
- if(localopened)
- localopened = 0
- icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- return
- else
- playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time
- if(W.force < 15)
- to_chat(user, "The cabinet's protective glass glances off the hit.")
- else
- src.hitstaken++
- if(src.hitstaken == 4)
- playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) //Break cabinet, receive goodies. Cabinet's fucked for life after that.
- src.smashed = 1
- src.locked = 0
- src.localopened = 1
+ var/hasaxe = 0 //gonna come in handy later~ // FUCK YOUR TILDES.
+ if(fireaxe)
+ hasaxe = 1
+
+ if (isrobot(usr) || src.locked)
+ if(istype(O, /obj/item/device/multitool))
+ user << "Resetting circuitry..."
+ playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
+ if(do_after(user, 20 * O.toolspeed))
+ src.locked = 0
+ to_chat(user, " You disable the locking modules.")
update_icon()
return
- if (istype(O, /obj/item/weapon/material/twohanded/fireaxe) && src.localopened)
- if(!fireaxe)
- if(O:wielded)
- O:wielded = 0
- O.update_icon()
- //to_chat(user, "Unwield the axe first.")
- //return
- fireaxe = O
- user.remove_from_mob(O)
- src.contents += O
- to_chat(user, "You place the fire axe back in the [src.name].")
- update_icon()
- else
- if(src.smashed)
- return
- else
- localopened = !localopened
- if(localopened)
- icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- else
- icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- else
- if(src.smashed)
- return
- if(istype(O, /obj/item/device/multitool))
+ else if(istype(O, /obj/item/weapon))
+ var/obj/item/weapon/W = O
+ if(src.smashed || src.localopened)
if(localopened)
localopened = 0
icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
spawn(10) update_icon()
- return
- else
- to_chat(user, "Resetting circuitry...")
- playsound(user, 'sound/machines/lockenable.ogg', 50, 1)
- if(do_after(user,20 * O.toolspeed))
- src.locked = 1
- to_chat(user, " You re-enable the locking modules.")
- return
+ return
+ else
+ playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time
+ if(W.force < 15)
+ to_chat(user, "The cabinet's protective glass glances off the hit.")
+ else
+ src.hitstaken++
+ if(src.hitstaken == 4)
+ playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) //Break cabinet, receive goodies. Cabinet's fucked for life after that.
+ src.smashed = 1
+ src.locked = 0
+ src.localopened = 1
+ update_icon()
+ return
+ if (istype(O, /obj/item/weapon/material/twohanded/fireaxe) && src.localopened)
+ if(!fireaxe)
+ if(O:wielded)
+ O:wielded = 0
+ O.update_icon()
+ //to_chat(user, "Unwield the axe first.")
+ //return
+ fireaxe = O
+ user.remove_from_mob(O)
+ src.contents += O
+ to_chat(user, "You place the fire axe back in the [src.name].")
+ update_icon()
+ else
+ if(src.smashed)
+ return
else
localopened = !localopened
if(localopened)
@@ -107,108 +85,130 @@
else
icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
spawn(10) update_icon()
-
-
-
-
- attack_hand(mob/user as mob)
-
- var/hasaxe = 0
- if(fireaxe)
- hasaxe = 1
-
- if(src.locked)
- to_chat(user, "The cabinet won't budge!")
- return
- if(localopened)
- if(fireaxe)
- user.put_in_hands(fireaxe)
- fireaxe = null
- to_chat (user, "You take the fire axe from the [name].")
- src.add_fingerprint(user)
- update_icon()
- else
- if(src.smashed)
- return
- else
- localopened = !localopened
- if(localopened)
- src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- else
- src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
-
- else
- localopened = !localopened //I'm pretty sure we don't need an if(src.smashed) in here. In case I'm wrong and it fucks up teh cabinet, **MARKER**. -Agouri
- if(localopened)
- src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- else
- src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
-
- attack_tk(mob/user as mob)
- if(localopened && fireaxe)
- fireaxe.forceMove(loc)
- to_chat(user, "You telekinetically remove the fire axe.")
- fireaxe = null
- update_icon()
- return
- attack_hand(user)
-
- verb/toggle_openness() //nice name, huh? HUH?! -Erro //YEAH -Agouri
- set name = "Open/Close"
- set category = "Object"
-
- if (isrobot(usr) || src.locked || src.smashed)
- if(src.locked)
- to_chat(usr, "The cabinet won't budge!")
- else if(src.smashed)
- to_chat(usr, "The protective glass is broken!")
- return
-
- localopened = !localopened
- update_icon()
-
- verb/remove_fire_axe()
- set name = "Remove Fire Axe"
- set category = "Object"
-
- if (isrobot(usr))
- return
-
- if (localopened)
- if(fireaxe)
- usr.put_in_hands(fireaxe)
- fireaxe = null
- to_chat(usr, "You take the Fire axe from the [name].")
- else
- to_chat(usr, "The [src.name] is empty.")
- else
- to_chat(usr, "The [src.name] is closed.")
- update_icon()
-
- attack_ai(mob/user as mob)
+ else
if(src.smashed)
- to_chat(user, "The security of the cabinet is compromised.")
return
- else
- locked = !locked
- if(locked)
- to_chat(user, "Cabinet locked.")
+ if(istype(O, /obj/item/device/multitool))
+ if(localopened)
+ localopened = 0
+ icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
+ spawn(10) update_icon()
+ return
else
- to_chat(user, "Cabinet unlocked.")
- return
+ to_chat(user, "Resetting circuitry...")
+ playsound(user, 'sound/machines/lockenable.ogg', 50, 1)
+ if(do_after(user,20 * O.toolspeed))
+ src.locked = 1
+ to_chat(user, " You re-enable the locking modules.")
+ return
+ else
+ localopened = !localopened
+ if(localopened)
+ icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
+ spawn(10) update_icon()
+ else
+ icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
+ spawn(10) update_icon()
- update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers
- var/hasaxe = 0
+
+/obj/structure/closet/fireaxecabinet/attack_hand(mob/user as mob)
+ var/hasaxe = 0
+ if(fireaxe)
+ hasaxe = 1
+
+ if(src.locked)
+ to_chat(user, "The cabinet won't budge!")
+ return
+
+ if(localopened)
if(fireaxe)
- hasaxe = 1
- icon_state = text("fireaxe[][][][]",hasaxe,src.localopened,src.hitstaken,src.smashed)
+ user.put_in_hands(fireaxe)
+ fireaxe = null
+ to_chat (user, "You take the fire axe from the [name].")
+ src.add_fingerprint(user)
+ update_icon()
+ else
+ if(src.smashed)
+ return
+ else
+ localopened = !localopened
+ if(localopened)
+ src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
+ spawn(10) update_icon()
+ else
+ src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
+ spawn(10) update_icon()
- open()
+ else
+ localopened = !localopened //I'm pretty sure we don't need an if(src.smashed) in here. In case I'm wrong and it fucks up teh cabinet, **MARKER**. -Agouri
+ if(localopened)
+ src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
+ spawn(10) update_icon()
+ else
+ src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
+ spawn(10) update_icon()
+
+/obj/structure/closet/fireaxecabinet/attack_tk(mob/user as mob)
+ if(localopened && fireaxe)
+ fireaxe.forceMove(loc)
+ to_chat(user, "You telekinetically remove the fire axe.")
+ fireaxe = null
+ update_icon()
+ return
+ attack_hand(user)
+
+/obj/structure/closet/fireaxecabinet/verb/toggle_openness() //nice name, huh? HUH?! -Erro //YEAH -Agouri
+ set name = "Open/Close"
+ set category = "Object"
+
+ if (isrobot(usr) || src.locked || src.smashed)
+ if(src.locked)
+ to_chat(usr, "The cabinet won't budge!")
+ else if(src.smashed)
+ to_chat(usr, "The protective glass is broken!")
return
- close()
+ localopened = !localopened
+ update_icon()
+
+/obj/structure/closet/fireaxecabinet/verb/remove_fire_axe()
+ set name = "Remove Fire Axe"
+ set category = "Object"
+
+ if (isrobot(usr))
return
+
+ if (localopened)
+ if(fireaxe)
+ usr.put_in_hands(fireaxe)
+ fireaxe = null
+ to_chat(usr, "You take the Fire axe from the [name].")
+ else
+ to_chat(usr, "The [src.name] is empty.")
+ else
+ to_chat(usr, "The [src.name] is closed.")
+ update_icon()
+
+/obj/structure/closet/fireaxecabinet/attack_ai(mob/user as mob)
+ if(src.smashed)
+ to_chat(user, "The security of the cabinet is compromised.")
+ return
+ else
+ locked = !locked
+ if(locked)
+ to_chat(user, "Cabinet locked.")
+ else
+ to_chat(user, "Cabinet unlocked.")
+ return
+
+/obj/structure/closet/fireaxecabinet/update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers
+ var/hasaxe = 0
+ if(fireaxe)
+ hasaxe = 1
+ icon_state = text("fireaxe[][][][]",hasaxe,src.localopened,src.hitstaken,src.smashed)
+
+/obj/structure/closet/fireaxecabinet/open()
+ return
+
+/obj/structure/closet/fireaxecabinet/close()
+ return
diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm
index 4e31b9e05c..c261d8d2f6 100644
--- a/code/game/objects/structures/crates_lockers/closets/fitness.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm
@@ -4,49 +4,41 @@
icon_state = "mixed"
icon_closed = "mixed"
-/obj/structure/closet/athletic_mixed/New()
- ..()
- new /obj/item/clothing/under/shorts/grey(src)
- new /obj/item/clothing/under/shorts/black(src)
- new /obj/item/clothing/under/shorts/red(src)
- new /obj/item/clothing/under/shorts/blue(src)
- new /obj/item/clothing/under/shorts/green(src)
- new /obj/item/clothing/under/swimsuit/red(src)
- new /obj/item/clothing/under/swimsuit/black(src)
- new /obj/item/clothing/under/swimsuit/blue(src)
- new /obj/item/clothing/under/swimsuit/green(src)
- new /obj/item/clothing/under/swimsuit/purple(src)
- new /obj/item/clothing/under/swimsuit/striped(src)
- new /obj/item/clothing/under/swimsuit/white(src)
- new /obj/item/clothing/under/swimsuit/earth(src) //Maybe at some point make it randomly choose swimsuits, so that it doesn't overflow as we add more.
- new /obj/item/clothing/mask/snorkel(src)
- new /obj/item/clothing/mask/snorkel(src)
- new /obj/item/clothing/shoes/swimmingfins(src)
- new /obj/item/clothing/shoes/swimmingfins(src)
-
-
+ starts_with = list(
+ /obj/item/clothing/under/shorts/grey,
+ /obj/item/clothing/under/shorts/black,
+ /obj/item/clothing/under/shorts/red,
+ /obj/item/clothing/under/shorts/blue,
+ /obj/item/clothing/under/shorts/green,
+ /obj/item/clothing/under/swimsuit/red,
+ /obj/item/clothing/under/swimsuit/black,
+ /obj/item/clothing/under/swimsuit/blue,
+ /obj/item/clothing/under/swimsuit/green,
+ /obj/item/clothing/under/swimsuit/purple,
+ /obj/item/clothing/under/swimsuit/striped,
+ /obj/item/clothing/under/swimsuit/white,
+ /obj/item/clothing/under/swimsuit/earth,
+ /obj/item/clothing/mask/snorkel = 2,
+ /obj/item/clothing/shoes/swimmingfins = 2)
/obj/structure/closet/boxinggloves
name = "boxing gloves"
desc = "It's a storage unit for gloves for use in the boxing ring."
-/obj/structure/closet/boxinggloves/New()
- ..()
- new /obj/item/clothing/gloves/boxing/blue(src)
- new /obj/item/clothing/gloves/boxing/green(src)
- new /obj/item/clothing/gloves/boxing/yellow(src)
- new /obj/item/clothing/gloves/boxing(src)
-
+ starts_with = list(
+ /obj/item/clothing/gloves/boxing/blue,
+ /obj/item/clothing/gloves/boxing/green,
+ /obj/item/clothing/gloves/boxing/yellow,
+ /obj/item/clothing/gloves/boxing)
/obj/structure/closet/masks
name = "mask closet"
desc = "IT'S A STORAGE UNIT FOR FIGHTER MASKS OLE!"
-/obj/structure/closet/masks/New()
- ..()
- new /obj/item/clothing/mask/luchador(src)
- new /obj/item/clothing/mask/luchador/rudos(src)
- new /obj/item/clothing/mask/luchador/tecnicos(src)
+ starts_with = list(
+ /obj/item/clothing/mask/luchador,
+ /obj/item/clothing/mask/luchador/rudos,
+ /obj/item/clothing/mask/luchador/tecnicos)
/obj/structure/closet/lasertag/red
@@ -55,18 +47,9 @@
icon_state = "red"
icon_closed = "red"
-/obj/structure/closet/lasertag/red/New()
- ..()
- new /obj/item/weapon/gun/energy/lasertag/red(src)
- new /obj/item/weapon/gun/energy/lasertag/red(src)
- new /obj/item/weapon/gun/energy/lasertag/red(src)
- new /obj/item/weapon/gun/energy/lasertag/red(src)
- new /obj/item/weapon/gun/energy/lasertag/red(src)
- new /obj/item/clothing/suit/redtag(src)
- new /obj/item/clothing/suit/redtag(src)
- new /obj/item/clothing/suit/redtag(src)
- new /obj/item/clothing/suit/redtag(src)
- new /obj/item/clothing/suit/redtag(src)
+ starts_with = list(
+ /obj/item/weapon/gun/energy/lasertag/red = 5,
+ /obj/item/clothing/suit/redtag = 5)
/obj/structure/closet/lasertag/blue
@@ -75,15 +58,6 @@
icon_state = "blue"
icon_closed = "blue"
-/obj/structure/closet/lasertag/blue/New()
- ..()
- new /obj/item/weapon/gun/energy/lasertag/blue(src)
- new /obj/item/weapon/gun/energy/lasertag/blue(src)
- new /obj/item/weapon/gun/energy/lasertag/blue(src)
- new /obj/item/weapon/gun/energy/lasertag/blue(src)
- new /obj/item/weapon/gun/energy/lasertag/blue(src)
- new /obj/item/clothing/suit/bluetag(src)
- new /obj/item/clothing/suit/bluetag(src)
- new /obj/item/clothing/suit/bluetag(src)
- new /obj/item/clothing/suit/bluetag(src)
- new /obj/item/clothing/suit/bluetag(src)
\ No newline at end of file
+ starts_with = list(
+ /obj/item/weapon/gun/energy/lasertag/blue = 5,
+ /obj/item/clothing/suit/bluetag = 5)
diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm
index 8ebd9358b5..f567cdbd3a 100644
--- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm
+++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm
@@ -34,18 +34,9 @@
icon_closed = "syndicate1"
icon_opened = "syndicate1open"
-/obj/structure/closet/gimmick/russian/New()
- ..()
- new /obj/item/clothing/head/ushanka(src)
- new /obj/item/clothing/head/ushanka(src)
- new /obj/item/clothing/head/ushanka(src)
- new /obj/item/clothing/head/ushanka(src)
- new /obj/item/clothing/head/ushanka(src)
- new /obj/item/clothing/under/soviet(src)
- new /obj/item/clothing/under/soviet(src)
- new /obj/item/clothing/under/soviet(src)
- new /obj/item/clothing/under/soviet(src)
- new /obj/item/clothing/under/soviet(src)
+ starts_with = list(
+ /obj/item/clothing/head/ushanka = 5,
+ /obj/item/clothing/under/soviet = 5)
/obj/structure/closet/gimmick/tacticool
@@ -55,22 +46,15 @@
icon_closed = "syndicate1"
icon_opened = "syndicate1open"
-/obj/structure/closet/gimmick/tacticool/New()
- ..()
- new /obj/item/clothing/glasses/eyepatch(src)
- new /obj/item/clothing/glasses/sunglasses(src)
- new /obj/item/clothing/gloves/swat(src)
- new /obj/item/clothing/gloves/swat(src)
- new /obj/item/clothing/head/helmet/swat(src)
- new /obj/item/clothing/head/helmet/swat(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/clothing/shoes/boots/swat(src)
- new /obj/item/clothing/shoes/boots/swat(src)
- new /obj/item/clothing/suit/armor/swat(src)
- new /obj/item/clothing/suit/armor/swat(src)
- new /obj/item/clothing/under/syndicate/tacticool(src)
- new /obj/item/clothing/under/syndicate/tacticool(src)
+ starts_with = list(
+ /obj/item/clothing/glasses/eyepatch,
+ /obj/item/clothing/glasses/sunglasses,
+ /obj/item/clothing/gloves/swat = 2,
+ /obj/item/clothing/head/helmet/swat = 2,
+ /obj/item/clothing/mask/gas = 2,
+ /obj/item/clothing/shoes/boots/swat = 2,
+ /obj/item/clothing/suit/armor/swat = 2,
+ /obj/item/clothing/under/syndicate/tacticool = 2)
/obj/structure/closet/thunderdome
@@ -81,32 +65,16 @@
icon_opened = "syndicateopen"
anchored = 1
-/obj/structure/closet/thunderdome/New()
- ..()
-
/obj/structure/closet/thunderdome/tdred
name = "red-team Thunderdome closet"
-/obj/structure/closet/thunderdome/tdred/New()
- ..()
- new /obj/item/clothing/suit/armor/tdome/red(src)
- new /obj/item/clothing/suit/armor/tdome/red(src)
- new /obj/item/clothing/suit/armor/tdome/red(src)
- new /obj/item/weapon/melee/energy/sword(src)
- new /obj/item/weapon/melee/energy/sword(src)
- new /obj/item/weapon/melee/energy/sword(src)
- new /obj/item/weapon/gun/energy/laser(src)
- new /obj/item/weapon/gun/energy/laser(src)
- new /obj/item/weapon/gun/energy/laser(src)
- new /obj/item/weapon/melee/baton(src)
- new /obj/item/weapon/melee/baton(src)
- new /obj/item/weapon/melee/baton(src)
- new /obj/item/weapon/storage/box/flashbangs(src)
- new /obj/item/weapon/storage/box/flashbangs(src)
- new /obj/item/weapon/storage/box/flashbangs(src)
- new /obj/item/clothing/head/helmet/thunderdome(src)
- new /obj/item/clothing/head/helmet/thunderdome(src)
- new /obj/item/clothing/head/helmet/thunderdome(src)
+ starts_with = list(
+ /obj/item/clothing/suit/armor/tdome/red = 3,
+ /obj/item/weapon/melee/energy/sword = 3,
+ /obj/item/weapon/gun/energy/laser = 3,
+ /obj/item/weapon/melee/baton = 3,
+ /obj/item/weapon/storage/box/flashbangs = 3,
+ /obj/item/clothing/head/helmet/thunderdome = 3)
/obj/structure/closet/thunderdome/tdgreen
name = "green-team Thunderdome closet"
@@ -114,26 +82,13 @@
icon_closed = "syndicate1"
icon_opened = "syndicate1open"
-/obj/structure/closet/thunderdome/tdgreen/New()
- ..()
- new /obj/item/clothing/suit/armor/tdome/green(src)
- new /obj/item/clothing/suit/armor/tdome/green(src)
- new /obj/item/clothing/suit/armor/tdome/green(src)
- new /obj/item/weapon/melee/energy/sword(src)
- new /obj/item/weapon/melee/energy/sword(src)
- new /obj/item/weapon/melee/energy/sword(src)
- new /obj/item/weapon/gun/energy/laser(src)
- new /obj/item/weapon/gun/energy/laser(src)
- new /obj/item/weapon/gun/energy/laser(src)
- new /obj/item/weapon/melee/baton(src)
- new /obj/item/weapon/melee/baton(src)
- new /obj/item/weapon/melee/baton(src)
- new /obj/item/weapon/storage/box/flashbangs(src)
- new /obj/item/weapon/storage/box/flashbangs(src)
- new /obj/item/weapon/storage/box/flashbangs(src)
- new /obj/item/clothing/head/helmet/thunderdome(src)
- new /obj/item/clothing/head/helmet/thunderdome(src)
- new /obj/item/clothing/head/helmet/thunderdome(src)
+ starts_with = list(
+ /obj/item/clothing/suit/armor/tdome/green = 3,
+ /obj/item/weapon/melee/energy/sword = 3,
+ /obj/item/weapon/gun/energy/laser = 3,
+ /obj/item/weapon/melee/baton = 3,
+ /obj/item/weapon/storage/box/flashbangs = 3,
+ /obj/item/clothing/head/helmet/thunderdome = 3)
/obj/structure/closet/alien
name = "alien container"
@@ -142,4 +97,4 @@
icon_state = "alien_locker"
icon_closed = "alien_locker"
icon_opened = "alien_locker_open"
- anchored = TRUE
\ No newline at end of file
+ anchored = TRUE
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 48f979daa1..cfed9c545f 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -14,29 +14,22 @@
icon_state = "black"
icon_closed = "black"
-/obj/structure/closet/gmcloset/New()
- ..()
- new /obj/item/clothing/head/that(src)
- new /obj/item/clothing/head/that(src)
- new /obj/item/device/radio/headset/headset_service(src)
- new /obj/item/device/radio/headset/headset_service(src)
- new /obj/item/clothing/head/pin/flower(src)
- new /obj/item/clothing/head/pin/flower/pink(src)
- new /obj/item/clothing/head/pin/flower/yellow(src)
- new /obj/item/clothing/head/pin/flower/blue(src)
- new /obj/item/clothing/head/pin/pink(src)
- new /obj/item/clothing/head/pin/magnetic(src)
- new /obj/item/clothing/under/sl_suit(src)
- new /obj/item/clothing/under/sl_suit(src)
- new /obj/item/clothing/under/rank/bartender(src)
- new /obj/item/clothing/under/rank/bartender(src)
- new /obj/item/clothing/under/rank/bartender/skirt(src)
- new /obj/item/clothing/under/dress/dress_saloon(src)
- new /obj/item/clothing/accessory/wcoat(src)
- new /obj/item/clothing/accessory/wcoat(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/laceup(src)
+ starts_with = list(
+ /obj/item/clothing/head/that = 2,
+ /obj/item/device/radio/headset/headset_service = 2,
+ /obj/item/clothing/head/pin/flower,
+ /obj/item/clothing/head/pin/flower/pink,
+ /obj/item/clothing/head/pin/flower/yellow,
+ /obj/item/clothing/head/pin/flower/blue,
+ /obj/item/clothing/head/pin/pink,
+ /obj/item/clothing/head/pin/magnetic,
+ /obj/item/clothing/under/sl_suit = 2,
+ /obj/item/clothing/under/rank/bartender = 2,
+ /obj/item/clothing/under/rank/bartender/skirt,
+ /obj/item/clothing/under/dress/dress_saloon,
+ /obj/item/clothing/accessory/wcoat = 2,
+ /obj/item/clothing/shoes/black = 2,
+ /obj/item/clothing/shoes/laceup)
/*
* Chef
@@ -47,19 +40,14 @@
icon_state = "black"
icon_closed = "black"
-/obj/structure/closet/chefcloset/New()
- ..()
- new /obj/item/clothing/under/sundress(src)
- new /obj/item/clothing/under/waiter(src)
- new /obj/item/clothing/under/waiter(src)
- new /obj/item/device/radio/headset/headset_service(src)
- new /obj/item/device/radio/headset/headset_service(src)
- new /obj/item/weapon/storage/box/mousetraps(src)
- new /obj/item/weapon/storage/box/mousetraps(src)
- new /obj/item/clothing/under/rank/chef(src)
- new /obj/item/clothing/head/chefhat(src)
- new /obj/item/weapon/storage/bag/food(src)
- new /obj/item/weapon/storage/bag/food(src)
+ starts_with = list(
+ /obj/item/clothing/under/sundress,
+ /obj/item/clothing/under/waiter = 2,
+ /obj/item/device/radio/headset/headset_service = 2,
+ /obj/item/weapon/storage/box/mousetraps = 2,
+ /obj/item/clothing/under/rank/chef,
+ /obj/item/clothing/head/chefhat,
+ /obj/item/weapon/storage/bag/food = 2)
/*
* Janitor
@@ -70,24 +58,20 @@
icon_state = "mixed"
icon_closed = "mixed"
-/obj/structure/closet/jcloset/New()
- ..()
- new /obj/item/clothing/under/rank/janitor(src)
- new /obj/item/clothing/under/dress/maid/janitor(src)
- new /obj/item/device/radio/headset/headset_service(src)
- new /obj/item/weapon/cartridge/janitor(src)
- new /obj/item/clothing/gloves/black(src)
- new /obj/item/clothing/head/soft/purple(src)
- new /obj/item/clothing/head/beret/purple(src)
- new /obj/item/device/flashlight(src)
- new /obj/item/weapon/caution(src)
- new /obj/item/weapon/caution(src)
- new /obj/item/weapon/caution(src)
- new /obj/item/weapon/caution(src)
- new /obj/item/device/lightreplacer(src)
- new /obj/item/weapon/storage/bag/trash(src)
- new /obj/item/weapon/storage/belt/janitor(src)
- new /obj/item/clothing/shoes/galoshes(src)
+ starts_with = list(
+ /obj/item/clothing/under/rank/janitor,
+ /obj/item/clothing/under/dress/maid/janitor,
+ /obj/item/device/radio/headset/headset_service,
+ /obj/item/weapon/cartridge/janitor,
+ /obj/item/clothing/gloves/black,
+ /obj/item/clothing/head/soft/purple,
+ /obj/item/clothing/head/beret/purple,
+ /obj/item/device/flashlight,
+ /obj/item/weapon/caution = 4,
+ /obj/item/device/lightreplacer,
+ /obj/item/weapon/storage/bag/trash,
+ /obj/item/weapon/storage/belt/janitor,
+ /obj/item/clothing/shoes/galoshes)
/*
* Lawyer
@@ -98,43 +82,23 @@
icon_state = "blue"
icon_closed = "blue"
-/obj/structure/closet/lawcloset/New()
- ..()
- new /obj/item/clothing/under/lawyer/female(src)
- new /obj/item/clothing/under/lawyer/female(src)
- new /obj/item/clothing/under/lawyer/black(src)
- new /obj/item/clothing/under/lawyer/black(src)
- new /obj/item/clothing/under/lawyer/black/skirt(src)
- new /obj/item/clothing/under/lawyer/black/skirt(src)
- new /obj/item/clothing/under/lawyer/red(src)
- new /obj/item/clothing/under/lawyer/red(src)
- new /obj/item/clothing/under/lawyer/red/skirt(src)
- new /obj/item/clothing/under/lawyer/red/skirt(src)
- new /obj/item/clothing/suit/storage/toggle/internalaffairs(src)
- new /obj/item/clothing/suit/storage/toggle/internalaffairs(src)
- new /obj/item/clothing/under/lawyer/bluesuit(src)
- new /obj/item/clothing/under/lawyer/bluesuit(src)
- new /obj/item/clothing/under/lawyer/bluesuit/skirt(src)
- new /obj/item/clothing/under/lawyer/bluesuit/skirt(src)
- new /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket(src)
- new /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket(src)
- new /obj/item/clothing/under/lawyer/purpsuit(src)
- new /obj/item/clothing/under/lawyer/purpsuit(src)
- new /obj/item/clothing/under/lawyer/purpsuit/skirt(src)
- new /obj/item/clothing/under/lawyer/purpsuit/skirt(src)
- new /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket(src)
- new /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/laceup(src)
- new /obj/item/clothing/shoes/laceup(src)
- new /obj/item/clothing/glasses/sunglasses/big(src)
- new /obj/item/clothing/glasses/sunglasses/big(src)
- new /obj/item/clothing/under/lawyer/blue(src)
- new /obj/item/clothing/under/lawyer/blue(src)
- new /obj/item/clothing/under/lawyer/blue/skirt(src)
- new /obj/item/clothing/under/lawyer/blue/skirt(src)
- new /obj/item/device/tape/random(src)
- new /obj/item/device/tape/random(src)
\ No newline at end of file
+ starts_with = list(
+ /obj/item/clothing/under/lawyer/female = 2,
+ /obj/item/clothing/under/lawyer/black = 2,
+ /obj/item/clothing/under/lawyer/black/skirt = 2,
+ /obj/item/clothing/under/lawyer/red = 2,
+ /obj/item/clothing/under/lawyer/red/skirt = 2,
+ /obj/item/clothing/suit/storage/toggle/internalaffairs = 2,
+ /obj/item/clothing/under/lawyer/bluesuit = 2,
+ /obj/item/clothing/under/lawyer/bluesuit/skirt = 2,
+ /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 2,
+ /obj/item/clothing/under/lawyer/purpsuit = 2,
+ /obj/item/clothing/under/lawyer/purpsuit/skirt = 2,
+ /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 2,
+ /obj/item/clothing/shoes/brown = 2,
+ /obj/item/clothing/shoes/black = 2,
+ /obj/item/clothing/shoes/laceup = 2,
+ /obj/item/clothing/glasses/sunglasses/big = 2,
+ /obj/item/clothing/under/lawyer/blue = 2,
+ /obj/item/clothing/under/lawyer/blue/skirt = 2,
+ /obj/item/device/tape/random = 2)
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm
index 4074230d8d..aed0a4d9ee 100644
--- a/code/game/objects/structures/crates_lockers/closets/l3closet.dm
+++ b/code/game/objects/structures/crates_lockers/closets/l3closet.dm
@@ -10,10 +10,9 @@
icon_closed = "bio_general"
icon_opened = "bio_generalopen"
-/obj/structure/closet/l3closet/general/New()
- ..()
- new /obj/item/clothing/suit/bio_suit/general(src)
- new /obj/item/clothing/head/bio_hood/general(src)
+ starts_with = list(
+ /obj/item/clothing/suit/bio_suit/general,
+ /obj/item/clothing/head/bio_hood/general)
/obj/structure/closet/l3closet/virology
@@ -21,12 +20,11 @@
icon_closed = "bio_virology"
icon_opened = "bio_virologyopen"
-/obj/structure/closet/l3closet/virology/New()
- ..()
- new /obj/item/clothing/suit/bio_suit/virology(src)
- new /obj/item/clothing/head/bio_hood/virology(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/weapon/tank/oxygen(src)
+ starts_with = list(
+ /obj/item/clothing/suit/bio_suit/virology,
+ /obj/item/clothing/head/bio_hood/virology,
+ /obj/item/clothing/mask/gas,
+ /obj/item/weapon/tank/oxygen)
/obj/structure/closet/l3closet/security
@@ -34,27 +32,22 @@
icon_closed = "bio_security"
icon_opened = "bio_securityopen"
-/obj/structure/closet/l3closet/security/New()
- ..()
- new /obj/item/clothing/suit/bio_suit/security(src)
- new /obj/item/clothing/head/bio_hood/security(src)
- new /obj/item/weapon/gun/energy/taser/xeno/sec(src)
+ starts_with = list(
+ /obj/item/clothing/suit/bio_suit/security,
+ /obj/item/clothing/head/bio_hood/security,
+ /obj/item/weapon/gun/energy/taser/xeno/sec)
+
/obj/structure/closet/l3closet/janitor
icon_state = "bio_janitor"
icon_closed = "bio_janitor"
icon_opened = "bio_janitoropen"
-/obj/structure/closet/l3closet/janitor/New()
- ..()
- new /obj/item/clothing/suit/bio_suit/janitor(src)
- new /obj/item/clothing/suit/bio_suit/janitor(src)
- new /obj/item/clothing/head/bio_hood/janitor(src)
- new /obj/item/clothing/head/bio_hood/janitor(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/weapon/tank/emergency/oxygen/engi(src)
- new /obj/item/weapon/tank/emergency/oxygen/engi(src)
+ starts_with = list(
+ /obj/item/clothing/suit/bio_suit/janitor = 2,
+ /obj/item/clothing/head/bio_hood/janitor = 2,
+ /obj/item/clothing/mask/gas = 2,
+ /obj/item/weapon/tank/emergency/oxygen/engi = 2)
/obj/structure/closet/l3closet/scientist
@@ -62,15 +55,14 @@
icon_closed = "bio_scientist"
icon_opened = "bio_scientistopen"
-/obj/structure/closet/l3closet/scientist/New()
- ..()
- new /obj/item/clothing/suit/bio_suit/scientist(src)
- new /obj/item/clothing/head/bio_hood/scientist(src)
+ starts_with = list(
+ /obj/item/clothing/suit/bio_suit/scientist,
+ /obj/item/clothing/head/bio_hood/scientist)
-/obj/structure/closet/l3closet/scientist/double/New()
- ..()
- new /obj/item/clothing/suit/bio_suit/scientist(src)
- new /obj/item/clothing/head/bio_hood/scientist(src)
+/obj/structure/closet/l3closet/scientist/double
+ starts_with = list(
+ /obj/item/clothing/suit/bio_suit/scientist = 2,
+ /obj/item/clothing/head/bio_hood/scientist = 2)
/obj/structure/closet/l3closet/medical
@@ -78,14 +70,7 @@
icon_closed = "bio_scientist"
icon_opened = "bio_scientistopen"
-/obj/structure/closet/l3closet/medical/New()
- ..()
- new /obj/item/clothing/suit/bio_suit/general(src)
- new /obj/item/clothing/suit/bio_suit/general(src)
- new /obj/item/clothing/suit/bio_suit/general(src)
- new /obj/item/clothing/head/bio_hood/general(src)
- new /obj/item/clothing/head/bio_hood/general(src)
- new /obj/item/clothing/head/bio_hood/general(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/clothing/mask/gas(src)
\ No newline at end of file
+ starts_with = list(
+ /obj/item/clothing/suit/bio_suit/general = 3,
+ /obj/item/clothing/head/bio_hood/general = 3,
+ /obj/item/clothing/mask/gas = 3)
diff --git a/code/game/objects/structures/crates_lockers/closets/malfunction.dm b/code/game/objects/structures/crates_lockers/closets/malfunction.dm
index bd17ba9841..40b6ec68b9 100644
--- a/code/game/objects/structures/crates_lockers/closets/malfunction.dm
+++ b/code/game/objects/structures/crates_lockers/closets/malfunction.dm
@@ -4,12 +4,11 @@
icon_closed = "syndicate"
icon_opened = "syndicateopen"
-/obj/structure/closet/malf/suits/New()
- ..()
- new /obj/item/weapon/tank/jetpack/void(src)
- new /obj/item/clothing/mask/breath(src)
- new /obj/item/clothing/head/helmet/space/void(src)
- new /obj/item/clothing/suit/space/void(src)
- new /obj/item/weapon/crowbar(src)
- new /obj/item/weapon/cell(src)
- new /obj/item/device/multitool(src)
+ starts_with = list(
+ /obj/item/weapon/tank/jetpack/void,
+ /obj/item/clothing/mask/breath,
+ /obj/item/clothing/head/helmet/space/void,
+ /obj/item/clothing/suit/space/void,
+ /obj/item/weapon/tool/crowbar,
+ /obj/item/weapon/cell,
+ /obj/item/device/multitool)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
index 53606b3463..516d2a645e 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
@@ -8,7 +8,8 @@
icon_broken = "cabinetdetective_broken"
icon_off = "cabinetdetective_broken"
- will_contain = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 10)
+ starts_with = list(
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 10)
/obj/structure/closet/secure_closet/bar/update_icon()
if(broken)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index 103867ef88..ef68d7ca60 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -8,28 +8,28 @@
icon_broken = "securecargobroken"
icon_off = "securecargooff"
- New()
- ..()
- if(prob(75))
- new /obj/item/weapon/storage/backpack(src)
- else
- new /obj/item/weapon/storage/backpack/satchel/norm(src)
- if(prob(25))
- new /obj/item/weapon/storage/backpack/dufflebag(src)
- new /obj/item/clothing/under/rank/cargotech(src)
- new /obj/item/clothing/under/rank/cargotech/skirt(src)
- new /obj/item/clothing/under/rank/cargotech/jeans(src)
- new /obj/item/clothing/under/rank/cargotech/jeans/female(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/cargo(src)
- new /obj/item/clothing/shoes/boots/winter/supply(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/device/radio/headset/headset_cargo(src)
- new /obj/item/device/radio/headset/headset_cargo/alt(src)
- new /obj/item/clothing/gloves/black(src)
- new /obj/item/clothing/gloves/fingerless(src)
- new /obj/item/clothing/head/soft(src)
-// new /obj/item/weapon/cartridge/quartermaster(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/rank/cargotech,
+ /obj/item/clothing/under/rank/cargotech/skirt,
+ /obj/item/clothing/under/rank/cargotech/jeans,
+ /obj/item/clothing/under/rank/cargotech/jeans/female,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/cargo,
+ /obj/item/clothing/shoes/boots/winter/supply,
+ /obj/item/clothing/shoes/black,
+ /obj/item/device/radio/headset/headset_cargo,
+ /obj/item/device/radio/headset/headset_cargo/alt,
+ /obj/item/clothing/gloves/black,
+ /obj/item/clothing/gloves/fingerless,
+ /obj/item/clothing/head/soft)
+
+/obj/structure/closet/secure_closet/cargotech/initialize()
+ if(prob(75))
+ starts_with += /obj/item/weapon/storage/backpack
+ else
+ starts_with += /obj/item/weapon/storage/backpack/satchel/norm
+ if(prob(25))
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag
+ return ..()
/obj/structure/closet/secure_closet/quartermaster
name = "quartermaster's locker"
@@ -41,32 +41,32 @@
icon_broken = "secureqmbroken"
icon_off = "secureqmoff"
- New()
- ..()
- if(prob(75))
- new /obj/item/weapon/storage/backpack(src)
- else
- new /obj/item/weapon/storage/backpack/satchel/norm(src)
- if(prob(25))
- new /obj/item/weapon/storage/backpack/dufflebag(src)
- new /obj/item/clothing/under/rank/cargo(src)
- new /obj/item/clothing/under/rank/cargo/skirt(src)
- new /obj/item/clothing/under/rank/cargo/jeans(src)
- new /obj/item/clothing/under/rank/cargo/jeans/female(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/device/radio/headset/headset_cargo(src)
- new /obj/item/device/radio/headset/headset_cargo/alt(src)
- new /obj/item/clothing/gloves/black(src)
- new /obj/item/clothing/gloves/fingerless(src)
-// new /obj/item/weapon/cartridge/quartermaster(src)
- new /obj/item/clothing/suit/fire/firefighter(src)
- new /obj/item/weapon/tank/emergency/oxygen(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/clothing/glasses/meson(src)
- new /obj/item/clothing/head/soft(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/cargo(src)
- new /obj/item/clothing/shoes/boots/winter/supply(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/rank/cargo,
+ /obj/item/clothing/under/rank/cargo/skirt,
+ /obj/item/clothing/under/rank/cargo/jeans,
+ /obj/item/clothing/under/rank/cargo/jeans/female,
+ /obj/item/clothing/shoes/brown,
+ /obj/item/device/radio/headset/headset_cargo,
+ /obj/item/device/radio/headset/headset_cargo/alt,
+ /obj/item/clothing/gloves/black,
+ /obj/item/clothing/gloves/fingerless,
+ /obj/item/clothing/suit/fire/firefighter,
+ /obj/item/weapon/tank/emergency/oxygen,
+ /obj/item/clothing/mask/gas,
+ /obj/item/clothing/glasses/meson,
+ /obj/item/clothing/head/soft,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/cargo,
+ /obj/item/clothing/shoes/boots/winter/supply)
+
+/obj/structure/closet/secure_closet/quartermaster/initialize()
+ if(prob(75))
+ starts_with += /obj/item/weapon/storage/backpack
+ else
+ starts_with += /obj/item/weapon/storage/backpack/satchel/norm
+ if(prob(25))
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag
+ return ..()
/obj/structure/closet/secure_closet/miner
name = "miner's equipment"
@@ -78,23 +78,24 @@
icon_off = "miningsecoff"
req_access = list(access_mining)
-/obj/structure/closet/secure_closet/miner/New()
- ..()
- sleep(2)
+ starts_with = list(
+ /obj/item/device/radio/headset/headset_mine,
+ /obj/item/clothing/under/rank/miner,
+ /obj/item/clothing/gloves/black,
+ /obj/item/clothing/shoes/black,
+ /obj/item/device/analyzer,
+ /obj/item/weapon/storage/bag/ore,
+ /obj/item/device/flashlight/lantern,
+ /obj/item/weapon/shovel,
+ /obj/item/weapon/pickaxe,
+ /obj/item/clothing/glasses/material,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/miner,
+ /obj/item/clothing/shoes/boots/winter/mining,
+ /obj/item/stack/marker_beacon/thirty)
+
+/obj/structure/closet/secure_closet/miner/initialize()
if(prob(50))
- new /obj/item/weapon/storage/backpack/industrial(src)
+ starts_with += /obj/item/weapon/storage/backpack/industrial
else
- new /obj/item/weapon/storage/backpack/satchel/eng(src)
- new /obj/item/device/radio/headset/headset_mine(src)
- new /obj/item/clothing/under/rank/miner(src)
- new /obj/item/clothing/gloves/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/device/analyzer(src)
- new /obj/item/weapon/storage/bag/ore(src)
- new /obj/item/device/flashlight/lantern(src)
- new /obj/item/weapon/shovel(src)
- new /obj/item/weapon/pickaxe(src)
- new /obj/item/clothing/glasses/material(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/miner(src)
- new /obj/item/clothing/shoes/boots/winter/mining(src)
- new /obj/item/stack/marker_beacon/thirty(src)
\ No newline at end of file
+ starts_with += /obj/item/weapon/storage/backpack/satchel/eng
+ return ..()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index df9e6802f7..fd1475c280 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -1,170 +1,143 @@
/obj/structure/closet/secure_closet/engineering_chief
name = "chief engineer's locker"
- req_access = list(access_ce)
icon_state = "securece1"
icon_closed = "securece"
icon_locked = "securece1"
icon_opened = "secureceopen"
icon_broken = "securecebroken"
icon_off = "secureceoff"
+ req_access = list(access_ce)
+ starts_with = list(
+ /obj/item/clothing/accessory/storage/brown_vest,
+ /obj/item/blueprints,
+ /obj/item/clothing/under/rank/chief_engineer,
+ /obj/item/clothing/under/rank/chief_engineer/skirt,
+ /obj/item/clothing/head/hardhat/white,
+ /obj/item/clothing/head/welding,
+ /obj/item/clothing/gloves/yellow,
+ /obj/item/clothing/shoes/brown,
+ /obj/item/weapon/cartridge/ce,
+ /obj/item/device/radio/headset/heads/ce,
+ /obj/item/device/radio/headset/heads/ce/alt,
+ /obj/item/weapon/storage/toolbox/mechanical,
+ /obj/item/clothing/suit/storage/hazardvest,
+ /obj/item/clothing/mask/gas,
+ /obj/item/device/multitool,
+ /obj/item/weapon/storage/belt/utility/chief/full,
+ /obj/item/device/flash,
+ /obj/item/device/t_scanner/upgraded,
+ /obj/item/taperoll/engineering,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/engineering,
+ /obj/item/clothing/shoes/boots/winter/engineering,
+ /obj/item/weapon/tank/emergency/oxygen/engi)
- New()
- ..()
- if(prob(50))
- new /obj/item/weapon/storage/backpack/industrial(src)
- else
- new /obj/item/weapon/storage/backpack/satchel/eng(src)
- if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/eng(src)
- new /obj/item/clothing/accessory/storage/brown_vest(src)
- new /obj/item/blueprints(src)
- new /obj/item/clothing/under/rank/chief_engineer(src)
- new /obj/item/clothing/under/rank/chief_engineer/skirt(src)
- new /obj/item/clothing/head/hardhat/white(src)
- new /obj/item/clothing/head/welding(src)
- new /obj/item/clothing/gloves/yellow(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/weapon/cartridge/ce(src)
- new /obj/item/device/radio/headset/heads/ce(src)
- new /obj/item/device/radio/headset/heads/ce/alt(src)
- new /obj/item/weapon/storage/toolbox/mechanical(src)
- new /obj/item/clothing/suit/storage/hazardvest(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/device/multitool(src)
- new /obj/item/weapon/storage/belt/utility/chief/full(src)
- new /obj/item/device/flash(src)
- new /obj/item/device/t_scanner/upgraded
- new /obj/item/taperoll/engineering(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src)
- new /obj/item/clothing/shoes/boots/winter/engineering(src)
- new /obj/item/weapon/tank/emergency/oxygen/engi(src)
- return
-
-
+/obj/structure/closet/secure_closet/engineering_chief/initialize()
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/industrial
+ else
+ starts_with += /obj/item/weapon/storage/backpack/satchel/eng
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/eng
+ return ..()
/obj/structure/closet/secure_closet/engineering_electrical
name = "electrical supplies"
- req_access = list(access_engine_equip)
icon_state = "secureengelec1"
icon_closed = "secureengelec"
icon_locked = "secureengelec1"
icon_opened = "toolclosetopen"
icon_broken = "secureengelecbroken"
icon_off = "secureengelecoff"
+ req_access = list(access_engine_equip)
-
- New()
- ..()
- new /obj/item/clothing/gloves/yellow(src)
- new /obj/item/clothing/gloves/yellow(src)
- new /obj/item/weapon/storage/toolbox/electrical(src)
- new /obj/item/weapon/storage/toolbox/electrical(src)
- new /obj/item/weapon/storage/toolbox/electrical(src)
- new /obj/item/weapon/module/power_control(src)
- new /obj/item/weapon/module/power_control(src)
- new /obj/item/weapon/module/power_control(src)
- new /obj/item/device/multitool(src)
- new /obj/item/device/multitool(src)
- new /obj/item/device/multitool(src)
- return
-
+ starts_with = list(
+ /obj/item/clothing/gloves/yellow = 2,
+ /obj/item/weapon/storage/toolbox/electrical = 3,
+ /obj/item/weapon/module/power_control = 3,
+ /obj/item/device/multitool = 3)
/obj/structure/closet/secure_closet/engineering_welding
name = "welding supplies"
- req_access = list(access_construction)
icon_state = "secureengweld1"
icon_closed = "secureengweld"
icon_locked = "secureengweld1"
icon_opened = "toolclosetopen"
icon_broken = "secureengweldbroken"
icon_off = "secureengweldoff"
+ req_access = list(access_construction)
-
- New()
- ..()
- new /obj/item/clothing/head/welding(src)
- new /obj/item/clothing/head/welding(src)
- new /obj/item/clothing/head/welding(src)
- new /obj/item/weapon/weldingtool/largetank(src)
- new /obj/item/weapon/weldingtool/largetank(src)
- new /obj/item/weapon/weldingtool/largetank(src)
- new /obj/item/weapon/weldpack(src)
- new /obj/item/weapon/weldpack(src)
- new /obj/item/weapon/weldpack(src)
- new /obj/item/clothing/glasses/welding(src)
- new /obj/item/clothing/glasses/welding(src)
- new /obj/item/clothing/glasses/welding(src)
- return
-
-
+ starts_with = list(
+ /obj/item/clothing/head/welding = 3,
+ /obj/item/weapon/weldingtool/largetank = 3,
+ /obj/item/weapon/weldpack = 3,
+ /obj/item/clothing/glasses/welding = 3)
/obj/structure/closet/secure_closet/engineering_personal
name = "engineer's locker"
- req_access = list(access_engine_equip)
icon_state = "secureeng1"
icon_closed = "secureeng"
icon_locked = "secureeng1"
icon_opened = "secureengopen"
icon_broken = "secureengbroken"
icon_off = "secureengoff"
+ req_access = list(access_engine_equip)
+ starts_with = list(
+ /obj/item/clothing/accessory/storage/brown_vest,
+ /obj/item/weapon/storage/toolbox/mechanical,
+ /obj/item/device/radio/headset/headset_eng,
+ /obj/item/device/radio/headset/headset_eng/alt,
+ /obj/item/clothing/suit/storage/hazardvest,
+ /obj/item/clothing/mask/gas,
+ /obj/item/clothing/glasses/meson,
+ /obj/item/weapon/cartridge/engineering,
+ /obj/item/taperoll/engineering,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/engineering,
+ /obj/item/clothing/shoes/boots/winter/engineering,
+ /obj/item/weapon/tank/emergency/oxygen/engi)
- New()
- ..()
- if(prob(50))
- new /obj/item/weapon/storage/backpack/industrial(src)
- else
- new /obj/item/weapon/storage/backpack/satchel/eng(src)
- if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/eng(src)
- new /obj/item/clothing/accessory/storage/brown_vest(src)
- new /obj/item/weapon/storage/toolbox/mechanical(src)
- new /obj/item/device/radio/headset/headset_eng(src)
- new /obj/item/device/radio/headset/headset_eng/alt(src)
- new /obj/item/clothing/suit/storage/hazardvest(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/clothing/glasses/meson(src)
- new /obj/item/weapon/cartridge/engineering(src)
- new /obj/item/taperoll/engineering(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src)
- new /obj/item/clothing/shoes/boots/winter/engineering(src)
- new /obj/item/weapon/tank/emergency/oxygen/engi(src)
- return
-
+/obj/structure/closet/secure_closet/engineering_personal/initialize()
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/industrial
+ else
+ starts_with += /obj/item/weapon/storage/backpack/satchel/eng
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/eng
+ return ..()
/obj/structure/closet/secure_closet/atmos_personal
name = "technician's locker"
- req_access = list(access_atmospherics)
icon_state = "secureatm1"
icon_closed = "secureatm"
icon_locked = "secureatm1"
icon_opened = "secureatmopen"
icon_broken = "secureatmbroken"
icon_off = "secureatmoff"
+ req_access = list(access_atmospherics)
+ starts_with = list(
+ /obj/item/clothing/accessory/storage/brown_vest,
+ /obj/item/clothing/suit/fire/firefighter,
+ /obj/item/device/flashlight,
+ /obj/item/weapon/extinguisher,
+ /obj/item/device/radio/headset/headset_eng,
+ /obj/item/device/radio/headset/headset_eng/alt,
+ /obj/item/clothing/suit/storage/hazardvest,
+ /obj/item/clothing/mask/gas,
+ /obj/item/weapon/cartridge/atmos,
+ /obj/item/taperoll/atmos,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos,
+ /obj/item/clothing/shoes/boots/winter/atmos,
+ /obj/item/weapon/tank/emergency/oxygen/engi)
- New()
- ..()
- if(prob(50))
- new /obj/item/weapon/storage/backpack/industrial(src)
- else
- new /obj/item/weapon/storage/backpack/satchel/eng(src)
- if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/eng(src)
- new /obj/item/clothing/accessory/storage/brown_vest(src)
- new /obj/item/clothing/suit/fire/firefighter(src)
- new /obj/item/device/flashlight(src)
- new /obj/item/weapon/extinguisher(src)
- new /obj/item/device/radio/headset/headset_eng(src)
- new /obj/item/device/radio/headset/headset_eng/alt(src)
- new /obj/item/clothing/suit/storage/hazardvest(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/weapon/cartridge/atmos(src)
- new /obj/item/taperoll/atmos(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos(src)
- new /obj/item/clothing/shoes/boots/winter/atmos(src)
- new /obj/item/weapon/tank/emergency/oxygen/engi(src)
- return
+/obj/structure/closet/secure_closet/atmos_personal/initialize()
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/industrial
+ else
+ starts_with += /obj/item/weapon/storage/backpack/satchel/eng
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/eng
+ return ..()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
index 62401902b6..c6eddffe83 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
@@ -16,20 +16,14 @@
name = "kitchen cabinet"
req_access = list(access_kitchen)
- New()
- ..()
- for(var/i = 1 to 7)
- new /obj/item/weapon/reagent_containers/food/condiment/flour(src)
- for(var/i = 1 to 2)
- new /obj/item/weapon/reagent_containers/food/condiment/sugar(src)
- return
-
+ starts_with = list(
+ /obj/item/weapon/reagent_containers/food/condiment/flour = 7,
+ /obj/item/weapon/reagent_containers/food/condiment/sugar = 2)
/obj/structure/closet/secure_closet/freezer/kitchen/mining
req_access = list()
-
/obj/structure/closet/secure_closet/freezer/meat
name = "meat fridge"
icon_state = "fridge1"
@@ -39,13 +33,8 @@
icon_broken = "fridgebroken"
icon_off = "fridge1"
-
- New()
- ..()
- for(var/i = 1 to 10)
- new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src)
- return
-
+ starts_with = list(
+ /obj/item/weapon/reagent_containers/food/snacks/meat/monkey = 10)
/obj/structure/closet/secure_closet/freezer/fridge
@@ -57,17 +46,10 @@
icon_broken = "fridgebroken"
icon_off = "fridge1"
-
- New()
- ..()
- for(var/i = 1 to 6)
- new /obj/item/weapon/reagent_containers/food/drinks/milk(src)
- for(var/i = 1 to 4)
- new /obj/item/weapon/reagent_containers/food/drinks/soymilk(src)
- for(var/i = 1 to 4)
- new /obj/item/weapon/storage/fancy/egg_box(src)
- return
-
+ starts_with = list(
+ /obj/item/weapon/reagent_containers/food/drinks/milk = 6,
+ /obj/item/weapon/reagent_containers/food/drinks/soymilk = 4,
+ /obj/item/weapon/storage/fancy/egg_box = 4)
/obj/structure/closet/secure_closet/freezer/money
@@ -81,12 +63,7 @@
req_access = list(access_heads_vault)
- New()
- ..()
- for(var/i = 1 to 3)
- new /obj/item/weapon/spacecash/c1000(src)
- for(var/i = 1 to 4)
- new /obj/item/weapon/spacecash/c500(src)
- for(var/i = 1 to 5)
- new /obj/item/weapon/spacecash/c200(src)
- return
+ starts_with = list(
+ /obj/item/weapon/spacecash/c1000 = 3,
+ /obj/item/weapon/spacecash/c500 = 4,
+ /obj/item/weapon/spacecash/c200 = 5)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm b/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm
index f4f24e8d50..c606151550 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm
@@ -1,6 +1,5 @@
/obj/structure/closet/secure_closet/guncabinet
name = "gun cabinet"
- req_one_access = list(access_armory)
icon = 'icons/obj/guncabinet.dmi'
icon_state = "base"
icon_off ="base"
@@ -8,9 +7,10 @@
icon_locked ="base"
icon_closed ="base"
icon_opened = "base"
+ req_one_access = list(access_armory)
-/obj/structure/closet/secure_closet/guncabinet/New()
- ..()
+/obj/structure/closet/secure_closet/guncabinet/initialize()
+ . = ..()
update_icon()
/obj/structure/closet/secure_closet/guncabinet/toggle()
@@ -27,7 +27,7 @@
for (var/obj/item/weapon/gun/G in contents)
if (istype(G, /obj/item/weapon/gun/energy))
lazors++
- if (istype(G, /obj/item/weapon/gun/projectile/))
+ if (istype(G, /obj/item/weapon/gun/projectile))
shottas++
for (var/i = 0 to 2)
if(lazors || shottas) // only make icons if we have one of the two types.
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
index fc5a536730..2b10bdff4a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
@@ -8,24 +8,22 @@
icon_broken = "hydrosecurebroken"
icon_off = "hydrosecureoff"
+ starts_with = list(
+ /obj/item/weapon/storage/bag/plants,
+ /obj/item/clothing/under/rank/hydroponics,
+ /obj/item/device/analyzer/plant_analyzer,
+ /obj/item/device/radio/headset/headset_service,
+ /obj/item/clothing/head/greenbandana,
+ /obj/item/weapon/material/minihoe,
+ /obj/item/weapon/material/knife/machete/hatchet,
+ /obj/item/weapon/tool/wirecutters/clippers,
+ /obj/item/weapon/reagent_containers/spray/plantbgone,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/hydro,
+ /obj/item/clothing/shoes/boots/winter/hydro)
- New()
- ..()
- switch(rand(1,2))
- if(1)
- new /obj/item/clothing/suit/storage/apron(src)
- if(2)
- new /obj/item/clothing/suit/storage/apron/overalls(src)
- new /obj/item/weapon/storage/bag/plants(src)
- new /obj/item/clothing/under/rank/hydroponics(src)
- new /obj/item/device/analyzer/plant_analyzer(src)
- new /obj/item/device/radio/headset/headset_service(src)
- new /obj/item/clothing/head/greenbandana(src)
- new /obj/item/weapon/material/minihoe(src)
- new /obj/item/weapon/material/knife/machete/hatchet(src)
- new /obj/item/weapon/wirecutters/clippers(src)
- new /obj/item/weapon/reagent_containers/spray/plantbgone(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/hydro(src)
- new /obj/item/clothing/shoes/boots/winter/hydro(src)
-// new /obj/item/weapon/bee_net(src) //No more bees, March 2014
- return
+/obj/structure/closet/secure_closet/hydroponics/initialize()
+ if(prob(50))
+ starts_with += /obj/item/clothing/suit/storage/apron
+ else
+ starts_with += /obj/item/clothing/suit/storage/apron/overalls
+ return ..()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 518a59251d..16520ae8fa 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -9,21 +9,13 @@
icon_off = "medicaloff"
req_access = list(access_medical)
-
-/obj/structure/closet/secure_closet/medical1/New()
- ..()
- new /obj/item/weapon/storage/box/autoinjectors(src)
- new /obj/item/weapon/storage/box/syringes(src)
- new /obj/item/weapon/reagent_containers/dropper(src)
- new /obj/item/weapon/reagent_containers/dropper(src)
- new /obj/item/weapon/reagent_containers/glass/beaker(src)
- new /obj/item/weapon/reagent_containers/glass/beaker(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src)
- return
-
+ starts_with = list(
+ /obj/item/weapon/storage/box/autoinjectors,
+ /obj/item/weapon/storage/box/syringes,
+ /obj/item/weapon/reagent_containers/dropper = 2,
+ /obj/item/weapon/reagent_containers/glass/beaker = 2,
+ /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline = 2,
+ /obj/item/weapon/reagent_containers/glass/bottle/antitoxin = 2)
/obj/structure/closet/secure_closet/medical2
@@ -37,17 +29,9 @@
icon_off = "medicaloff"
req_access = list(access_surgery)
-
-/obj/structure/closet/secure_closet/medical2/New()
- ..()
- new /obj/item/weapon/tank/anesthetic(src)
- new /obj/item/weapon/tank/anesthetic(src)
- new /obj/item/weapon/tank/anesthetic(src)
- new /obj/item/clothing/mask/breath/medical(src)
- new /obj/item/clothing/mask/breath/medical(src)
- new /obj/item/clothing/mask/breath/medical(src)
- return
-
+ starts_with = list(
+ /obj/item/weapon/tank/anesthetic = 3,
+ /obj/item/clothing/mask/breath/medical = 3)
/obj/structure/closet/secure_closet/medical3
@@ -60,63 +44,63 @@
icon_broken = "securemedbroken"
icon_off = "securemedoff"
-/obj/structure/closet/secure_closet/medical3/New()
- ..()
+ starts_with = list(
+ /obj/item/clothing/under/rank/medical,
+ /obj/item/clothing/under/rank/nurse,
+ /obj/item/clothing/under/rank/orderly,
+ /obj/item/clothing/suit/storage/toggle/labcoat,
+ /obj/item/clothing/suit/storage/toggle/fr_jacket,
+ /obj/item/clothing/shoes/white,
+ /obj/item/weapon/cartridge/medical,
+ /obj/item/device/radio/headset/headset_med,
+ /obj/item/device/radio/headset/headset_med/alt,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/medical,
+ /obj/item/clothing/shoes/boots/winter/medical,
+ /obj/item/clothing/under/rank/nursesuit,
+ /obj/item/clothing/head/nursehat,
+ /obj/item/weapon/storage/box/freezer = 3)
+
+/obj/structure/closet/secure_closet/medical3/initialize()
if(prob(50))
- new /obj/item/weapon/storage/backpack/medic(src)
+ starts_with += /obj/item/weapon/storage/backpack/medic
else
- new /obj/item/weapon/storage/backpack/satchel/med(src)
+ starts_with += /obj/item/weapon/storage/backpack/satchel/med
if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/med(src)
- new /obj/item/clothing/under/rank/nursesuit (src)
- new /obj/item/clothing/head/nursehat (src)
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/med
switch(pick("blue", "green", "purple", "black", "navyblue"))
if ("blue")
- new /obj/item/clothing/under/rank/medical/scrubs(src)
- new /obj/item/clothing/head/surgery/blue(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs
+ starts_with += /obj/item/clothing/head/surgery/blue
if ("green")
- new /obj/item/clothing/under/rank/medical/scrubs/green(src)
- new /obj/item/clothing/head/surgery/green(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/green
+ starts_with += /obj/item/clothing/head/surgery/green
if ("purple")
- new /obj/item/clothing/under/rank/medical/scrubs/purple(src)
- new /obj/item/clothing/head/surgery/purple(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/purple
+ starts_with += /obj/item/clothing/head/surgery/purple
if ("black")
- new /obj/item/clothing/under/rank/medical/scrubs/black(src)
- new /obj/item/clothing/head/surgery/black(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/black
+ starts_with += /obj/item/clothing/head/surgery/black
if ("navyblue")
- new /obj/item/clothing/under/rank/medical/scrubs/navyblue(src)
- new /obj/item/clothing/head/surgery/navyblue(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/navyblue
+ starts_with += /obj/item/clothing/head/surgery/navyblue
switch(pick("blue", "green", "purple", "black", "navyblue"))
if ("blue")
- new /obj/item/clothing/under/rank/medical/scrubs(src)
- new /obj/item/clothing/head/surgery/blue(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs
+ starts_with += /obj/item/clothing/head/surgery/blue
if ("green")
- new /obj/item/clothing/under/rank/medical/scrubs/green(src)
- new /obj/item/clothing/head/surgery/green(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/green
+ starts_with += /obj/item/clothing/head/surgery/green
if ("purple")
- new /obj/item/clothing/under/rank/medical/scrubs/purple(src)
- new /obj/item/clothing/head/surgery/purple(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/purple
+ starts_with += /obj/item/clothing/head/surgery/purple
if ("black")
- new /obj/item/clothing/under/rank/medical/scrubs/black(src)
- new /obj/item/clothing/head/surgery/black(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/black
+ starts_with += /obj/item/clothing/head/surgery/black
if ("navyblue")
- new /obj/item/clothing/under/rank/medical/scrubs/navyblue(src)
- new /obj/item/clothing/head/surgery/navyblue(src)
- new /obj/item/clothing/under/rank/medical(src)
- new /obj/item/clothing/under/rank/nurse(src)
- new /obj/item/clothing/under/rank/orderly(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat(src)
- new /obj/item/clothing/suit/storage/toggle/fr_jacket(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/weapon/cartridge/medical(src)
- new /obj/item/device/radio/headset/headset_med(src)
- new /obj/item/device/radio/headset/headset_med/alt(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src)
- new /obj/item/clothing/shoes/boots/winter/medical(src)
- new /obj/item/weapon/storage/box/freezer(src)
- new /obj/item/weapon/storage/box/freezer(src)
- new /obj/item/weapon/storage/box/freezer(src)
- return
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/navyblue
+ starts_with += /obj/item/clothing/head/surgery/navyblue
+ return ..()
+
/obj/structure/closet/secure_closet/paramedic
name = "paramedic locker"
@@ -129,33 +113,30 @@
icon_off = "medicaloff"
req_access = list(access_medical_equip)
-
-/obj/structure/closet/secure_closet/paramedic/New()
- ..()
- new /obj/item/weapon/storage/backpack/dufflebag/emt(src)
- new /obj/item/weapon/storage/box/autoinjectors(src)
- new /obj/item/weapon/storage/box/syringes(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src)
- new /obj/item/weapon/storage/belt/medical/emt(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/clothing/suit/storage/toggle/fr_jacket(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat/emt(src)
- new /obj/item/device/radio/headset/headset_med/alt(src)
- new /obj/item/weapon/cartridge/medical(src)
- new /obj/item/weapon/storage/briefcase/inflatable(src)
- new /obj/item/device/flashlight(src)
- new /obj/item/weapon/tank/emergency/oxygen/engi(src)
- new /obj/item/clothing/glasses/hud/health(src)
- new /obj/item/device/healthanalyzer(src)
- new /obj/item/device/radio/off(src)
- new /obj/random/medical(src)
- new /obj/item/weapon/crowbar(src)
- new /obj/item/weapon/extinguisher/mini(src)
- new /obj/item/weapon/storage/box/freezer(src)
- new /obj/item/clothing/accessory/storage/white_vest(src)
- new /obj/item/taperoll/medical(src)
- return
+ starts_with = list(
+ /obj/item/weapon/storage/backpack/dufflebag/emt,
+ /obj/item/weapon/storage/box/autoinjectors,
+ /obj/item/weapon/storage/box/syringes,
+ /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,
+ /obj/item/weapon/reagent_containers/glass/bottle/antitoxin,
+ /obj/item/weapon/storage/belt/medical/emt,
+ /obj/item/clothing/mask/gas,
+ /obj/item/clothing/suit/storage/toggle/fr_jacket,
+ /obj/item/clothing/suit/storage/toggle/labcoat/emt,
+ /obj/item/device/radio/headset/headset_med/alt,
+ /obj/item/weapon/cartridge/medical,
+ /obj/item/weapon/storage/briefcase/inflatable,
+ /obj/item/device/flashlight,
+ /obj/item/weapon/tank/emergency/oxygen/engi,
+ /obj/item/clothing/glasses/hud/health,
+ /obj/item/device/healthanalyzer,
+ /obj/item/device/radio/off,
+ /obj/random/medical,
+ /obj/item/weapon/tool/crowbar,
+ /obj/item/weapon/extinguisher/mini,
+ /obj/item/weapon/storage/box/freezer,
+ /obj/item/clothing/accessory/storage/white_vest,
+ /obj/item/taperoll/medical)
/obj/structure/closet/secure_closet/CMO
name = "chief medical officer's locker"
@@ -167,66 +148,60 @@
icon_broken = "cmosecurebroken"
icon_off = "cmosecureoff"
-/obj/structure/closet/secure_closet/CMO/New()
- ..()
+ starts_with = list(
+ /obj/item/clothing/under/rank/chief_medical_officer,
+ /obj/item/clothing/under/rank/chief_medical_officer/skirt,
+ /obj/item/clothing/suit/storage/toggle/labcoat/cmo,
+ /obj/item/clothing/suit/storage/toggle/labcoat/cmoalt,
+ /obj/item/weapon/cartridge/cmo,
+ /obj/item/clothing/gloves/sterile/latex,
+ /obj/item/clothing/shoes/brown ,
+ /obj/item/device/radio/headset/heads/cmo,
+ /obj/item/device/radio/headset/heads/cmo/alt,
+ /obj/item/device/flash,
+ /obj/item/weapon/reagent_containers/hypospray/vial,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/medical,
+ /obj/item/clothing/shoes/boots/winter/medical,
+ /obj/item/weapon/storage/box/freezer,
+ /obj/item/clothing/mask/gas,
+ /obj/item/taperoll/medical,
+ /obj/item/clothing/suit/bio_suit/cmo,
+ /obj/item/clothing/head/bio_hood/cmo,
+ /obj/item/clothing/shoes/white)
+
+/obj/structure/closet/secure_closet/CMO/initialize()
if(prob(50))
- new /obj/item/weapon/storage/backpack/medic(src)
+ starts_with += /obj/item/weapon/storage/backpack/medic
else
- new /obj/item/weapon/storage/backpack/satchel/med(src)
+ starts_with += /obj/item/weapon/storage/backpack/satchel/med
if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/med(src)
- new /obj/item/clothing/suit/bio_suit/cmo(src)
- new /obj/item/clothing/head/bio_hood/cmo(src)
- new /obj/item/clothing/shoes/white(src)
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/med
switch(pick("blue", "green", "purple", "black", "navyblue"))
if ("blue")
- new /obj/item/clothing/under/rank/medical/scrubs(src)
- new /obj/item/clothing/head/surgery/blue(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs
+ starts_with += /obj/item/clothing/head/surgery/blue
if ("green")
- new /obj/item/clothing/under/rank/medical/scrubs/green(src)
- new /obj/item/clothing/head/surgery/green(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/green
+ starts_with += /obj/item/clothing/head/surgery/green
if ("purple")
- new /obj/item/clothing/under/rank/medical/scrubs/purple(src)
- new /obj/item/clothing/head/surgery/purple(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/purple
+ starts_with += /obj/item/clothing/head/surgery/purple
if ("black")
- new /obj/item/clothing/under/rank/medical/scrubs/black(src)
- new /obj/item/clothing/head/surgery/black(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/black
+ starts_with += /obj/item/clothing/head/surgery/black
if ("navyblue")
- new /obj/item/clothing/under/rank/medical/scrubs/navyblue(src)
- new /obj/item/clothing/head/surgery/navyblue(src)
- new /obj/item/clothing/under/rank/chief_medical_officer(src)
- new /obj/item/clothing/under/rank/chief_medical_officer/skirt(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat/cmoalt(src)
- new /obj/item/weapon/cartridge/cmo(src)
- new /obj/item/clothing/gloves/sterile/latex(src)
- new /obj/item/clothing/shoes/brown (src)
- new /obj/item/device/radio/headset/heads/cmo(src)
- new /obj/item/device/radio/headset/heads/cmo/alt(src)
- new /obj/item/device/flash(src)
- new /obj/item/weapon/reagent_containers/hypospray/vial(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src)
- new /obj/item/clothing/shoes/boots/winter/medical(src)
- new /obj/item/weapon/storage/box/freezer(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/taperoll/medical(src)
- return
-
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/navyblue
+ starts_with += /obj/item/clothing/head/surgery/navyblue
+ return ..()
/obj/structure/closet/secure_closet/animal
name = "animal control closet"
req_access = list(access_surgery)
-
-/obj/structure/closet/secure_closet/animal/New()
- ..()
- new /obj/item/device/assembly/signaler(src)
- new /obj/item/device/radio/electropack(src)
- new /obj/item/device/radio/electropack(src)
- new /obj/item/device/radio/electropack(src)
- return
-
+ starts_with = list(
+ /obj/item/device/assembly/signaler,
+ /obj/item/device/radio/electropack = 3)
/obj/structure/closet/secure_closet/chemical
@@ -240,21 +215,15 @@
icon_off = "medicaloff"
req_access = list(access_chemistry)
+ starts_with = list(
+ /obj/item/weapon/storage/box/pillbottles = 2,
+ /obj/item/weapon/storage/box/beakers,
+ /obj/item/weapon/storage/box/autoinjectors,
+ /obj/item/weapon/storage/box/syringes,
+ /obj/item/weapon/reagent_containers/dropper = 2,
+ /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline = 2,
+ /obj/item/weapon/reagent_containers/glass/bottle/antitoxin = 2)
-/obj/structure/closet/secure_closet/chemical/New()
- ..()
- new /obj/item/weapon/storage/box/pillbottles(src)
- new /obj/item/weapon/storage/box/pillbottles(src)
- new /obj/item/weapon/storage/box/beakers(src)
- new /obj/item/weapon/storage/box/autoinjectors(src)
- new /obj/item/weapon/storage/box/syringes(src)
- new /obj/item/weapon/reagent_containers/dropper(src)
- new /obj/item/weapon/reagent_containers/dropper(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src)
- return
/obj/structure/closet/secure_closet/psych
name = "psychiatric closet"
@@ -267,25 +236,21 @@
icon_off = "medicaloff"
req_access = list(access_psychiatrist)
+ starts_with = list(
+ /obj/item/clothing/under/rank/psych,
+ /obj/item/clothing/under/rank/psych/turtleneck,
+ /obj/item/clothing/suit/straight_jacket,
+ /obj/item/weapon/reagent_containers/glass/bottle/stoxin,
+ /obj/item/weapon/reagent_containers/syringe,
+ /obj/item/weapon/storage/pill_bottle/citalopram,
+ /obj/item/weapon/reagent_containers/pill/methylphenidate,
+ /obj/item/weapon/clipboard,
+ /obj/item/weapon/folder/white,
+ /obj/item/device/taperecorder,
+ /obj/item/device/tape/random = 3,
+ /obj/item/device/camera,
+ /obj/item/toy/plushie/therapy/blue)
-/obj/structure/closet/secure_closet/psych/New()
- ..()
- new /obj/item/clothing/under/rank/psych(src)
- new /obj/item/clothing/under/rank/psych/turtleneck(src)
- new /obj/item/clothing/suit/straight_jacket(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/stoxin(src)
- new /obj/item/weapon/reagent_containers/syringe(src)
- new /obj/item/weapon/storage/pill_bottle/citalopram(src)
- new /obj/item/weapon/reagent_containers/pill/methylphenidate(src)
- new /obj/item/weapon/clipboard(src)
- new /obj/item/weapon/folder/white(src)
- new /obj/item/device/taperecorder(src)
- new /obj/item/device/tape/random(src)
- new /obj/item/device/tape/random(src)
- new /obj/item/device/tape/random(src)
- new /obj/item/device/camera(src)
- new /obj/item/toy/plushie/therapy/blue(src)
- return
/obj/structure/closet/secure_closet/medical_wall
name = "first aid closet"
@@ -296,6 +261,8 @@
icon_opened = "medical_wall_open"
icon_broken = "medical_wall_spark"
icon_off = "medical_wall_off"
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
anchored = 1
density = 0
wall_mounted = 1
@@ -316,25 +283,18 @@
/obj/structure/closet/secure_closet/medical_wall/pills
name = "pill cabinet"
-/obj/structure/closet/secure_closet/medical_wall/pills/New()
- ..()
- new /obj/item/weapon/storage/pill_bottle/tramadol(src)
- new /obj/item/weapon/storage/pill_bottle/antitox(src)
- new /obj/item/weapon/storage/pill_bottle/carbon(src)
- new /obj/random/medical/pillbottle(src)
- return
+ starts_with = list(
+ /obj/item/weapon/storage/pill_bottle/tramadol,
+ /obj/item/weapon/storage/pill_bottle/antitox,
+ /obj/item/weapon/storage/pill_bottle/carbon,
+ /obj/random/medical/pillbottle)
+
/obj/structure/closet/secure_closet/medical_wall/anesthetics
name = "anesthetics wall closet"
desc = "Used to knock people out."
req_access = list(access_surgery)
-/obj/structure/closet/secure_closet/medical_wall/anesthetics/New()
- ..()
- new /obj/item/weapon/tank/anesthetic(src)
- new /obj/item/weapon/tank/anesthetic(src)
- new /obj/item/weapon/tank/anesthetic(src)
- new /obj/item/clothing/mask/breath/medical(src)
- new /obj/item/clothing/mask/breath/medical(src)
- new /obj/item/clothing/mask/breath/medical(src)
- return
\ No newline at end of file
+ starts_with = list(
+ /obj/item/weapon/tank/anesthetic = 3,
+ /obj/item/clothing/mask/breath/medical = 3)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index 8665e985f7..b7a09db3c4 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -4,31 +4,23 @@
req_access = list(access_all_personal_lockers)
var/registered_name = null
-/obj/structure/closet/secure_closet/personal/New()
- ..()
- spawn(2)
- if(prob(50))
- new /obj/item/weapon/storage/backpack(src)
- else
- new /obj/item/weapon/storage/backpack/satchel/norm(src)
- new /obj/item/device/radio/headset( src )
- return
+ starts_with = list(
+ /obj/item/device/radio/headset)
+/obj/structure/closet/secure_closet/personal/initialize()
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack
+ else
+ starts_with += /obj/item/weapon/storage/backpack/satchel/norm
+ return ..()
/obj/structure/closet/secure_closet/personal/patient
name = "patient's closet"
-/obj/structure/closet/secure_closet/personal/patient/New()
- ..()
- spawn(4)
- // Not really the best way to do this, but it's better than "contents = list()"!
- for(var/atom/movable/AM in contents)
- qdel(AM)
- new /obj/item/clothing/under/medigown(src)
- new /obj/item/clothing/under/color/white( src )
- new /obj/item/clothing/shoes/white( src )
- return
-
+ starts_with = list(
+ /obj/item/clothing/under/medigown,
+ /obj/item/clothing/under/color/white,
+ /obj/item/clothing/shoes/white)
/obj/structure/closet/secure_closet/personal/cabinet
@@ -39,6 +31,11 @@
icon_broken = "cabinetdetective_broken"
icon_off = "cabinetdetective_broken"
+ starts_with = list(
+ /obj/item/weapon/storage/backpack/satchel/withwallet,
+ /obj/item/device/radio/headset
+ )
+
/obj/structure/closet/secure_closet/personal/cabinet/update_icon()
if(broken)
icon_state = icon_broken
@@ -51,20 +48,11 @@
else
icon_state = icon_opened
-/obj/structure/closet/secure_closet/personal/cabinet/New()
- ..()
- spawn(4)
- // Not really the best way to do this, but it's better than "contents = list()"!
- for(var/atom/movable/AM in contents)
- qdel(AM)
- new /obj/item/weapon/storage/backpack/satchel/withwallet( src )
- new /obj/item/device/radio/headset( src )
- return
-
/obj/structure/closet/secure_closet/personal/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (src.opened)
if (istype(W, /obj/item/weapon/grab))
- src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
+ var/obj/item/weapon/grab/G = W
+ src.MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
user.drop_item()
if (W) W.forceMove(src.loc)
else if(W.GetID())
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index 570407026b..9d5c89833c 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -1,60 +1,56 @@
/obj/structure/closet/secure_closet/scientist
name = "scientist's locker"
- req_access = list(access_tox_storage)
icon_state = "secureres1"
icon_closed = "secureres"
icon_locked = "secureres1"
icon_opened = "secureresopen"
icon_broken = "secureresbroken"
icon_off = "secureresoff"
+ req_access = list(access_tox_storage)
- New()
- ..()
- new /obj/item/clothing/under/rank/scientist(src)
- //new /obj/item/clothing/suit/labcoat/science(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat(src)
- new /obj/item/clothing/shoes/white(src)
-// new /obj/item/weapon/cartridge/signal/science(src)
- new /obj/item/device/radio/headset/headset_sci(src)
- new /obj/item/weapon/tank/air(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/science(src)
- new /obj/item/clothing/shoes/boots/winter/science(src)
- if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/sci(src)
- else
- new /obj/item/weapon/storage/backpack/toxins(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/rank/scientist,
+ /obj/item/clothing/suit/storage/toggle/labcoat,
+ /obj/item/clothing/shoes/white,
+ /obj/item/device/radio/headset/headset_sci,
+ /obj/item/weapon/tank/air,
+ /obj/item/clothing/mask/gas,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/science,
+ /obj/item/clothing/shoes/boots/winter/science)
+/obj/structure/closet/secure_closet/scientist/initialize()
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/sci
+ else
+ starts_with += /obj/item/weapon/storage/backpack/toxins
+ return ..()
/obj/structure/closet/secure_closet/RD
name = "research director's locker"
- req_access = list(access_rd)
icon_state = "rdsecure1"
icon_closed = "rdsecure"
icon_locked = "rdsecure1"
icon_opened = "rdsecureopen"
icon_broken = "rdsecurebroken"
icon_off = "rdsecureoff"
+ req_access = list(access_rd)
- New()
- ..()
- new /obj/item/clothing/suit/bio_suit/scientist(src)
- new /obj/item/clothing/head/bio_hood/scientist(src)
- new /obj/item/clothing/under/rank/research_director(src)
- new /obj/item/clothing/under/rank/research_director/rdalt(src)
- new /obj/item/clothing/under/rank/research_director/dress_rd(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat(src)
- new /obj/item/weapon/cartridge/rd(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/leather(src)
- new /obj/item/clothing/gloves/sterile/latex(src)
- new /obj/item/device/radio/headset/heads/rd(src)
- new /obj/item/device/radio/headset/heads/rd/alt(src)
- new /obj/item/weapon/tank/air(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/device/flash(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/science(src)
- new /obj/item/clothing/shoes/boots/winter/science(src)
- return
+ starts_with = list(
+ /obj/item/clothing/suit/bio_suit/scientist,
+ /obj/item/clothing/head/bio_hood/scientist,
+ /obj/item/clothing/under/rank/research_director,
+ /obj/item/clothing/under/rank/research_director/rdalt,
+ /obj/item/clothing/under/rank/research_director/dress_rd,
+ /obj/item/clothing/suit/storage/toggle/labcoat,
+ /obj/item/weapon/cartridge/rd,
+ /obj/item/clothing/shoes/white,
+ /obj/item/clothing/shoes/leather,
+ /obj/item/clothing/gloves/sterile/latex,
+ /obj/item/device/radio/headset/heads/rd,
+ /obj/item/device/radio/headset/heads/rd/alt,
+ /obj/item/weapon/tank/air,
+ /obj/item/clothing/mask/gas,
+ /obj/item/device/flash,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/science,
+ /obj/item/clothing/shoes/boots/winter/science)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index 269e7b6fc8..994fe0eca1 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -88,7 +88,7 @@
spark_system.start()
playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
playsound(src.loc, "sparks", 50, 1)
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
if(welded)
if(anchored)
user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index cf70a40920..738e36e09a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -1,300 +1,273 @@
/obj/structure/closet/secure_closet/captains
name = "colony director's locker"
- req_access = list(access_captain)
icon_state = "capsecure1"
icon_closed = "capsecure"
icon_locked = "capsecure1"
icon_opened = "capsecureopen"
icon_broken = "capsecurebroken"
icon_off = "capsecureoff"
+ req_access = list(access_captain)
- New()
- ..()
- new /obj/item/weapon/storage/backpack/dufflebag/captain(src)
- new /obj/item/clothing/head/helmet(src)
- new /obj/item/clothing/suit/storage/vest(src)
- new /obj/item/weapon/cartridge/captain(src)
- new /obj/item/weapon/storage/lockbox/medal(src)
- new /obj/item/device/radio/headset/heads/captain(src)
- new /obj/item/device/radio/headset/heads/captain/alt(src)
- new /obj/item/weapon/gun/energy/gun(src)
- new /obj/item/weapon/melee/telebaton(src)
- new /obj/item/device/flash(src)
- new /obj/item/weapon/storage/box/ids(src)
- return
-
+ starts_with = list(
+ /obj/item/weapon/storage/backpack/dufflebag/captain,
+ /obj/item/clothing/head/helmet,
+ /obj/item/clothing/suit/storage/vest,
+ /obj/item/weapon/cartridge/captain,
+ /obj/item/weapon/storage/lockbox/medal,
+ /obj/item/device/radio/headset/heads/captain,
+ /obj/item/device/radio/headset/heads/captain/alt,
+ /obj/item/weapon/gun/energy/gun,
+ /obj/item/weapon/melee/telebaton,
+ /obj/item/device/flash,
+ /obj/item/weapon/storage/box/ids)
/obj/structure/closet/secure_closet/hop
name = "head of personnel's locker"
- req_access = list(access_hop)
icon_state = "hopsecure1"
icon_closed = "hopsecure"
icon_locked = "hopsecure1"
icon_opened = "hopsecureopen"
icon_broken = "hopsecurebroken"
icon_off = "hopsecureoff"
+ req_access = list(access_hop)
- New()
- ..()
- new /obj/item/clothing/suit/storage/vest(src)
- new /obj/item/clothing/head/helmet(src)
- new /obj/item/weapon/cartridge/hop(src)
- new /obj/item/device/radio/headset/heads/hop(src)
- new /obj/item/device/radio/headset/heads/hop/alt(src)
- new /obj/item/weapon/storage/box/ids(src)
- new /obj/item/weapon/storage/box/ids( src )
- new /obj/item/weapon/gun/energy/gun(src)
- new /obj/item/weapon/gun/projectile/sec/flash(src)
- new /obj/item/device/flash(src)
- return
+ starts_with = list(
+ /obj/item/clothing/suit/storage/vest,
+ /obj/item/clothing/head/helmet,
+ /obj/item/weapon/cartridge/hop,
+ /obj/item/device/radio/headset/heads/hop,
+ /obj/item/device/radio/headset/heads/hop/alt,
+ /obj/item/weapon/storage/box/ids = 2,
+ /obj/item/weapon/gun/energy/gun,
+ /obj/item/weapon/gun/projectile/sec/flash,
+ /obj/item/device/flash)
/obj/structure/closet/secure_closet/hop2
name = "head of personnel's attire"
- req_access = list(access_hop)
icon_state = "hopsecure1"
icon_closed = "hopsecure"
icon_locked = "hopsecure1"
icon_opened = "hopsecureopen"
icon_broken = "hopsecurebroken"
icon_off = "hopsecureoff"
+ req_access = list(access_hop)
- New()
- ..()
- new /obj/item/clothing/under/rank/head_of_personnel(src)
- new /obj/item/clothing/under/dress/dress_hop(src)
- new /obj/item/clothing/under/dress/dress_hr(src)
- new /obj/item/clothing/under/lawyer/female(src)
- new /obj/item/clothing/under/lawyer/black(src)
- new /obj/item/clothing/under/lawyer/black/skirt(src)
- new /obj/item/clothing/under/lawyer/red(src)
- new /obj/item/clothing/under/lawyer/red/skirt(src)
- new /obj/item/clothing/under/lawyer/oldman(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/leather(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/under/rank/head_of_personnel_whimsy(src)
- new /obj/item/clothing/head/caphat/hop(src)
- new /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit(src)
- new /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt(src)
- new /obj/item/clothing/glasses/sunglasses(src)
- return
-
+ starts_with = list(
+ /obj/item/clothing/under/rank/head_of_personnel,
+ /obj/item/clothing/under/dress/dress_hop,
+ /obj/item/clothing/under/dress/dress_hr,
+ /obj/item/clothing/under/lawyer/female,
+ /obj/item/clothing/under/lawyer/black,
+ /obj/item/clothing/under/lawyer/black/skirt,
+ /obj/item/clothing/under/lawyer/red,
+ /obj/item/clothing/under/lawyer/red/skirt,
+ /obj/item/clothing/under/lawyer/oldman,
+ /obj/item/clothing/shoes/brown,
+ /obj/item/clothing/shoes/black,
+ /obj/item/clothing/shoes/leather,
+ /obj/item/clothing/shoes/white,
+ /obj/item/clothing/under/rank/head_of_personnel_whimsy,
+ /obj/item/clothing/head/caphat/hop,
+ /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit,
+ /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt,
+ /obj/item/clothing/glasses/sunglasses)
/obj/structure/closet/secure_closet/hos
name = "head of security's locker"
- req_access = list(access_hos)
icon_state = "hossecure1"
icon_closed = "hossecure"
icon_locked = "hossecure1"
icon_opened = "hossecureopen"
icon_broken = "hossecurebroken"
icon_off = "hossecureoff"
+ req_access = list(access_hos)
storage_capacity = 2.5 * MOB_MEDIUM
- New()
- ..()
- if(prob(50))
- new /obj/item/weapon/storage/backpack/security(src)
- else
- new /obj/item/weapon/storage/backpack/satchel/sec(src)
- if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/sec(src)
- new /obj/item/clothing/head/helmet/HoS(src)
- new /obj/item/clothing/head/helmet/HoS/hat(src)
- new /obj/item/clothing/suit/storage/vest/hos(src)
- new /obj/item/clothing/under/rank/head_of_security/jensen(src)
- new /obj/item/clothing/under/rank/head_of_security/corp(src)
- new /obj/item/clothing/suit/storage/vest/hoscoat/jensen(src)
- new /obj/item/clothing/suit/storage/vest/hoscoat(src)
- new /obj/item/clothing/head/helmet/dermal(src)
- new /obj/item/weapon/cartridge/hos(src)
- new /obj/item/device/radio/headset/heads/hos(src)
- new /obj/item/device/radio/headset/heads/hos/alt(src)
- new /obj/item/clothing/glasses/sunglasses/sechud(src)
- new /obj/item/taperoll/police(src)
- new /obj/item/weapon/shield/riot(src)
- new /obj/item/weapon/shield/riot/tele(src)
- new /obj/item/weapon/storage/box/holobadge/hos(src)
- new /obj/item/clothing/accessory/badge/holo/hos(src)
- new /obj/item/weapon/reagent_containers/spray/pepper(src)
- new /obj/item/weapon/crowbar/red(src)
- new /obj/item/weapon/storage/box/flashbangs(src)
- new /obj/item/weapon/storage/belt/security(src)
- new /obj/item/device/flash(src)
- new /obj/item/weapon/melee/baton/loaded(src)
- new /obj/item/weapon/gun/energy/gun(src)
- new /obj/item/weapon/cell/device/weapon(src)
- new /obj/item/clothing/accessory/holster/waist(src)
- new /obj/item/weapon/melee/telebaton(src)
- new /obj/item/clothing/head/beret/sec/corporate/hos(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
- new /obj/item/clothing/shoes/boots/winter/security(src)
- new /obj/item/device/flashlight/maglight(src)
- new /obj/item/clothing/mask/gas/half(src)
- return
+ starts_with = list(
+ /obj/item/clothing/head/helmet/HoS,
+ /obj/item/clothing/head/helmet/HoS/hat,
+ /obj/item/clothing/suit/storage/vest/hos,
+ /obj/item/clothing/under/rank/head_of_security/jensen,
+ /obj/item/clothing/under/rank/head_of_security/corp,
+ /obj/item/clothing/suit/storage/vest/hoscoat/jensen,
+ /obj/item/clothing/suit/storage/vest/hoscoat,
+ /obj/item/clothing/head/helmet/dermal,
+ /obj/item/weapon/cartridge/hos,
+ /obj/item/device/radio/headset/heads/hos,
+ /obj/item/device/radio/headset/heads/hos/alt,
+ /obj/item/clothing/glasses/sunglasses/sechud,
+ /obj/item/taperoll/police,
+ /obj/item/weapon/shield/riot,
+ /obj/item/weapon/shield/riot/tele,
+ /obj/item/weapon/storage/box/holobadge/hos,
+ /obj/item/clothing/accessory/badge/holo/hos,
+ /obj/item/weapon/reagent_containers/spray/pepper,
+ /obj/item/weapon/tool/crowbar/red,
+ /obj/item/weapon/storage/box/flashbangs,
+ /obj/item/weapon/storage/belt/security,
+ /obj/item/device/flash,
+ /obj/item/weapon/melee/baton/loaded,
+ /obj/item/weapon/gun/energy/gun,
+ /obj/item/weapon/cell/device/weapon,
+ /obj/item/clothing/accessory/holster/waist,
+ /obj/item/weapon/melee/telebaton,
+ /obj/item/clothing/head/beret/sec/corporate/hos,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/security,
+ /obj/item/clothing/shoes/boots/winter/security,
+ /obj/item/device/flashlight/maglight,
+ /obj/item/clothing/mask/gas/half)
+/obj/structure/closet/secure_closet/hos/initialize()
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/security
+ else
+ starts_with += /obj/item/weapon/storage/backpack/satchel/sec
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/sec
+ return ..()
/obj/structure/closet/secure_closet/warden
name = "warden's locker"
- req_access = list(access_armory)
icon_state = "wardensecure1"
icon_closed = "wardensecure"
icon_locked = "wardensecure1"
icon_opened = "wardensecureopen"
icon_broken = "wardensecurebroken"
icon_off = "wardensecureoff"
+ req_access = list(access_armory)
+ starts_with = list(
+ /obj/item/clothing/suit/storage/vest/warden,
+ /obj/item/clothing/under/rank/warden,
+ /obj/item/clothing/under/rank/warden/corp,
+ /obj/item/clothing/suit/storage/vest/wardencoat,
+ /obj/item/clothing/suit/storage/vest/wardencoat/alt,
+ /obj/item/clothing/head/helmet/dermal,
+ /obj/item/clothing/head/helmet/warden,
+ /obj/item/clothing/head/helmet/warden/hat,
+ /obj/item/weapon/cartridge/security,
+ /obj/item/device/radio/headset/headset_sec,
+ /obj/item/device/radio/headset/headset_sec/alt,
+ /obj/item/clothing/glasses/sunglasses/sechud,
+ /obj/item/taperoll/police,
+ /obj/item/clothing/accessory/badge/holo/warden,
+ /obj/item/weapon/storage/box/flashbangs,
+ /obj/item/weapon/storage/belt/security,
+ /obj/item/weapon/reagent_containers/spray/pepper,
+ /obj/item/weapon/melee/baton/loaded,
+ /obj/item/weapon/gun/energy/gun,
+ /obj/item/weapon/cell/device/weapon,
+ /obj/item/weapon/storage/box/holobadge,
+ /obj/item/clothing/head/beret/sec/corporate/warden,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/security,
+ /obj/item/clothing/shoes/boots/winter/security,
+ /obj/item/device/flashlight/maglight,
+ /obj/item/device/megaphone,
+ /obj/item/clothing/mask/gas/half)
- New()
- ..()
- if(prob(50))
- new /obj/item/weapon/storage/backpack/security(src)
- else
- new /obj/item/weapon/storage/backpack/satchel/sec(src)
- if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/sec(src)
- new /obj/item/clothing/suit/storage/vest/warden(src)
- new /obj/item/clothing/under/rank/warden(src)
- new /obj/item/clothing/under/rank/warden/corp(src)
- new /obj/item/clothing/suit/storage/vest/wardencoat(src)
- new /obj/item/clothing/suit/storage/vest/wardencoat/alt(src)
- new /obj/item/clothing/head/helmet/dermal(src)
- new /obj/item/clothing/head/helmet/warden(src)
- new /obj/item/clothing/head/helmet/warden/hat(src)
- new /obj/item/weapon/cartridge/security(src)
- new /obj/item/device/radio/headset/headset_sec(src)
- new /obj/item/device/radio/headset/headset_sec/alt(src)
- new /obj/item/clothing/glasses/sunglasses/sechud(src)
- new /obj/item/taperoll/police(src)
- new /obj/item/clothing/accessory/badge/holo/warden(src)
- new /obj/item/weapon/storage/box/flashbangs(src)
- new /obj/item/weapon/storage/belt/security(src)
- new /obj/item/weapon/reagent_containers/spray/pepper(src)
- new /obj/item/weapon/melee/baton/loaded(src)
- new /obj/item/weapon/gun/energy/gun(src)
- new /obj/item/weapon/cell/device/weapon(src)
- new /obj/item/weapon/storage/box/holobadge(src)
- new /obj/item/clothing/head/beret/sec/corporate/warden(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
- new /obj/item/clothing/shoes/boots/winter/security(src)
- new /obj/item/device/flashlight/maglight(src)
- new /obj/item/device/megaphone(src)
- new /obj/item/clothing/mask/gas/half(src)
- return
-
-
+/obj/structure/closet/secure_closet/warden/initialize()
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/security
+ else
+ starts_with += /obj/item/weapon/storage/backpack/satchel/sec
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/sec
+ return ..()
/obj/structure/closet/secure_closet/security
name = "security officer's locker"
- req_access = list(access_brig)
icon_state = "sec1"
icon_closed = "sec"
icon_locked = "sec1"
icon_opened = "secopen"
icon_broken = "secbroken"
icon_off = "secoff"
+ req_access = list(access_brig)
- New()
- ..()
- if(prob(50))
- new /obj/item/weapon/storage/backpack/security(src)
- else
- new /obj/item/weapon/storage/backpack/satchel/sec(src)
- if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/sec(src)
- new /obj/item/clothing/suit/storage/vest/officer(src)
- new /obj/item/clothing/head/helmet(src)
- new /obj/item/weapon/cartridge/security(src)
- new /obj/item/device/radio/headset/headset_sec(src)
- new /obj/item/device/radio/headset/headset_sec/alt(src)
- new /obj/item/weapon/storage/belt/security(src)
- new /obj/item/device/flash(src)
- new /obj/item/weapon/reagent_containers/spray/pepper(src)
- new /obj/item/weapon/grenade/flashbang(src)
- new /obj/item/weapon/melee/baton/loaded(src)
- new /obj/item/clothing/glasses/sunglasses/sechud(src)
- new /obj/item/taperoll/police(src)
- new /obj/item/device/hailer(src)
- new /obj/item/device/flashlight/flare(src)
- new /obj/item/clothing/accessory/storage/black_vest(src)
- new /obj/item/clothing/head/soft/sec/corp(src)
- new /obj/item/clothing/under/rank/security/corp(src)
- new /obj/item/ammo_magazine/m45/rubber(src)
- new /obj/item/weapon/gun/energy/taser(src)
- new /obj/item/weapon/cell/device/weapon(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
- new /obj/item/clothing/shoes/boots/winter/security(src)
- new /obj/item/device/flashlight/maglight(src)
- return
+ starts_with = list(
+ /obj/item/clothing/suit/storage/vest/officer,
+ /obj/item/clothing/head/helmet,
+ /obj/item/weapon/cartridge/security,
+ /obj/item/device/radio/headset/headset_sec,
+ /obj/item/device/radio/headset/headset_sec/alt,
+ /obj/item/weapon/storage/belt/security,
+ /obj/item/device/flash,
+ /obj/item/weapon/reagent_containers/spray/pepper,
+ /obj/item/weapon/grenade/flashbang,
+ /obj/item/weapon/melee/baton/loaded,
+ /obj/item/clothing/glasses/sunglasses/sechud,
+ /obj/item/taperoll/police,
+ /obj/item/device/hailer,
+ /obj/item/device/flashlight/flare,
+ /obj/item/clothing/accessory/storage/black_vest,
+ /obj/item/clothing/head/soft/sec/corp,
+ /obj/item/clothing/under/rank/security/corp,
+ /obj/item/ammo_magazine/m45/rubber,
+ /obj/item/weapon/gun/energy/taser,
+ /obj/item/weapon/cell/device/weapon,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/security,
+ /obj/item/clothing/shoes/boots/winter/security,
+ /obj/item/device/flashlight/maglight)
+/obj/structure/closet/secure_closet/security/initialize()
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/security
+ else
+ starts_with += /obj/item/weapon/storage/backpack/satchel/sec
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/sec
+ return ..()
-/obj/structure/closet/secure_closet/security/cargo
+/obj/structure/closet/secure_closet/security/cargo/initialize()
+ starts_with += /obj/item/clothing/accessory/armband/cargo
+ starts_with += /obj/item/device/encryptionkey/headset_cargo
+ return ..()
- New()
- ..()
- new /obj/item/clothing/accessory/armband/cargo(src)
- new /obj/item/device/encryptionkey/headset_cargo(src)
- return
+/obj/structure/closet/secure_closet/security/engine/initialize()
+ starts_with += /obj/item/clothing/accessory/armband/engine
+ starts_with += /obj/item/device/encryptionkey/headset_eng
+ return ..()
-/obj/structure/closet/secure_closet/security/engine
+/obj/structure/closet/secure_closet/security/science/initialize()
+ starts_with += /obj/item/clothing/accessory/armband/science
+ starts_with += /obj/item/device/encryptionkey/headset_sci
+ return ..()
- New()
- ..()
- new /obj/item/clothing/accessory/armband/engine(src)
- new /obj/item/device/encryptionkey/headset_eng(src)
- return
-
-/obj/structure/closet/secure_closet/security/science
-
- New()
- ..()
- new /obj/item/clothing/accessory/armband/science(src)
- new /obj/item/device/encryptionkey/headset_sci(src)
- return
-
-/obj/structure/closet/secure_closet/security/med
-
- New()
- ..()
- new /obj/item/clothing/accessory/armband/medblue(src)
- new /obj/item/device/encryptionkey/headset_med(src)
- return
+/obj/structure/closet/secure_closet/security/med/initialize()
+ starts_with += /obj/item/clothing/accessory/armband/medblue
+ starts_with += /obj/item/device/encryptionkey/headset_med
+ return ..()
/obj/structure/closet/secure_closet/detective
name = "detective's cabinet"
- req_access = list(access_forensics_lockers)
icon_state = "cabinetdetective_locked"
icon_closed = "cabinetdetective"
icon_locked = "cabinetdetective_locked"
icon_opened = "cabinetdetective_open"
icon_broken = "cabinetdetective_broken"
icon_off = "cabinetdetective_broken"
+ req_access = list(access_forensics_lockers)
- New()
- ..()
- new /obj/item/clothing/accessory/badge/holo/detective(src)
- new /obj/item/clothing/gloves/black(src)
- new /obj/item/gunbox(src)
- new /obj/item/weapon/storage/belt/detective(src)
- new /obj/item/weapon/storage/box/evidence(src)
- new /obj/item/device/radio/headset/headset_sec(src)
- new /obj/item/device/radio/headset/headset_sec/alt(src)
- new /obj/item/clothing/suit/storage/vest/detective(src)
- new /obj/item/taperoll/police(src)
- new /obj/item/clothing/accessory/holster/armpit(src)
- new /obj/item/device/flashlight/maglight(src)
- new /obj/item/weapon/reagent_containers/food/drinks/flask/detflask(src)
- new /obj/item/weapon/storage/briefcase/crimekit(src)
- new /obj/item/device/taperecorder(src)
- new /obj/item/device/tape/random(src)
- new /obj/item/device/tape/random(src)
- new /obj/item/device/tape/random(src)
- return
+ starts_with = list(
+ /obj/item/clothing/accessory/badge/holo/detective,
+ /obj/item/clothing/gloves/black,
+ /obj/item/gunbox,
+ /obj/item/weapon/storage/belt/detective,
+ /obj/item/weapon/storage/box/evidence,
+ /obj/item/device/radio/headset/headset_sec,
+ /obj/item/device/radio/headset/headset_sec/alt,
+ /obj/item/clothing/suit/storage/vest/detective,
+ /obj/item/taperoll/police,
+ /obj/item/clothing/accessory/holster/armpit,
+ /obj/item/device/flashlight/maglight,
+ /obj/item/weapon/reagent_containers/food/drinks/flask/detflask,
+ /obj/item/weapon/storage/briefcase/crimekit,
+ /obj/item/device/taperecorder,
+ /obj/item/device/tape/random = 3)
/obj/structure/closet/secure_closet/detective/update_icon()
if(broken)
@@ -308,18 +281,15 @@
else
icon_state = icon_opened
+
/obj/structure/closet/secure_closet/injection
name = "lethal injections locker"
req_access = list(access_captain)
+ starts_with = list(
+ /obj/item/weapon/reagent_containers/syringe/ld50_syringe/choral = 2)
- New()
- ..()
- new /obj/item/weapon/reagent_containers/syringe/ld50_syringe/choral(src)
- new /obj/item/weapon/reagent_containers/syringe/ld50_syringe/choral(src)
- return
-
-
+GLOBAL_LIST_BOILERPLATE(all_brig_closets, /obj/structure/closet/secure_closet/brig)
/obj/structure/closet/secure_closet/brig
name = "brig locker"
@@ -327,40 +297,34 @@
anchored = 1
var/id = null
- New()
- ..()
- new /obj/item/clothing/under/color/orange( src )
- new /obj/item/clothing/shoes/orange( src )
- return
-
+ starts_with = list(
+ /obj/item/clothing/under/color/orange,
+ /obj/item/clothing/shoes/orange)
/obj/structure/closet/secure_closet/courtroom
name = "courtroom locker"
req_access = list(access_lawyer)
- New()
- ..()
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/weapon/paper/Court (src)
- new /obj/item/weapon/paper/Court (src)
- new /obj/item/weapon/paper/Court (src)
- new /obj/item/weapon/pen (src)
- new /obj/item/clothing/suit/judgerobe (src)
- new /obj/item/clothing/head/powdered_wig (src)
- new /obj/item/weapon/storage/briefcase(src)
- return
+ starts_with = list(
+ /obj/item/clothing/shoes/brown,
+ /obj/item/weapon/paper/Court = 3,
+ /obj/item/weapon/pen,
+ /obj/item/clothing/suit/judgerobe,
+ /obj/item/clothing/head/powdered_wig,
+ /obj/item/weapon/storage/briefcase)
+
/obj/structure/closet/secure_closet/wall
name = "wall locker"
- req_access = list(access_security)
icon_state = "wall-locker1"
- density = 1
icon_closed = "wall-locker"
icon_locked = "wall-locker1"
icon_opened = "wall-lockeropen"
icon_broken = "wall-lockerbroken"
icon_off = "wall-lockeroff"
+ req_access = list(access_security)
+ density = 1
//too small to put a man in
large = 0
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index 906e46dbe1..1194b7f9fa 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -5,77 +5,57 @@
icon_closed = "syndicate"
icon_opened = "syndicateopen"
-
/obj/structure/closet/syndicate/personal
desc = "It's a storage unit for operative gear."
-/obj/structure/closet/syndicate/personal/New()
- ..()
- new /obj/item/weapon/tank/jetpack/oxygen(src)
- new /obj/item/clothing/mask/gas/syndicate(src)
- new /obj/item/clothing/under/syndicate(src)
- new /obj/item/clothing/head/helmet/space/void/merc(src)
- new /obj/item/clothing/suit/space/void/merc(src)
- new /obj/item/weapon/crowbar/red(src)
- new /obj/item/weapon/cell/high(src)
- new /obj/item/weapon/card/id/syndicate(src)
- new /obj/item/device/multitool(src)
- new /obj/item/weapon/shield/energy(src)
- new /obj/item/clothing/shoes/magboots(src)
+ starts_with = list(
+ /obj/item/weapon/tank/jetpack/oxygen,
+ /obj/item/clothing/mask/gas/syndicate,
+ /obj/item/clothing/under/syndicate,
+ /obj/item/clothing/head/helmet/space/void/merc,
+ /obj/item/clothing/suit/space/void/merc,
+ /obj/item/weapon/tool/crowbar/red,
+ /obj/item/weapon/cell/high,
+ /obj/item/weapon/card/id/syndicate,
+ /obj/item/device/multitool,
+ /obj/item/weapon/shield/energy,
+ /obj/item/clothing/shoes/magboots)
/obj/structure/closet/syndicate/suit
desc = "It's a storage unit for voidsuits."
-/obj/structure/closet/syndicate/suit/New()
- ..()
- new /obj/item/weapon/tank/jetpack/oxygen(src)
- new /obj/item/clothing/shoes/magboots(src)
- new /obj/item/clothing/suit/space/void/merc(src)
- new /obj/item/clothing/mask/gas/syndicate(src)
- new /obj/item/clothing/head/helmet/space/void/merc(src)
+ starts_with = list(
+ /obj/item/weapon/tank/jetpack/oxygen,
+ /obj/item/clothing/shoes/magboots,
+ /obj/item/clothing/suit/space/void/merc,
+ /obj/item/clothing/mask/gas/syndicate,
+ /obj/item/clothing/head/helmet/space/void/merc)
/obj/structure/closet/syndicate/nuclear
desc = "It's a storage unit for nuclear-operative gear."
-/obj/structure/closet/syndicate/nuclear/New()
- ..()
+ starts_with = list(
+ /obj/item/ammo_magazine/m10mm = 5,
+ /obj/item/weapon/storage/box/handcuffs,
+ /obj/item/weapon/storage/box/flashbangs,
+ /obj/item/weapon/gun/energy/gun = 5,
+ /obj/item/weapon/pinpointer/nukeop = 5,
+ /obj/item/device/pda/syndicate,
+ /obj/item/device/radio/uplink)
- new /obj/item/ammo_magazine/m10mm(src)
- new /obj/item/ammo_magazine/m10mm(src)
- new /obj/item/ammo_magazine/m10mm(src)
- new /obj/item/ammo_magazine/m10mm(src)
- new /obj/item/ammo_magazine/m10mm(src)
- new /obj/item/weapon/storage/box/handcuffs(src)
- new /obj/item/weapon/storage/box/flashbangs(src)
- new /obj/item/weapon/gun/energy/gun(src)
- new /obj/item/weapon/gun/energy/gun(src)
- new /obj/item/weapon/gun/energy/gun(src)
- new /obj/item/weapon/gun/energy/gun(src)
- new /obj/item/weapon/gun/energy/gun(src)
- new /obj/item/weapon/pinpointer/nukeop(src)
- new /obj/item/weapon/pinpointer/nukeop(src)
- new /obj/item/weapon/pinpointer/nukeop(src)
- new /obj/item/weapon/pinpointer/nukeop(src)
- new /obj/item/weapon/pinpointer/nukeop(src)
- new /obj/item/device/pda/syndicate(src)
- new /obj/item/device/radio/uplink(src)
- //U.hidden_uplink.uses = 40
- return
-
-/obj/structure/closet/syndicate/resources/
+/obj/structure/closet/syndicate/resources
desc = "An old, dusty locker."
- New()
- ..()
+/obj/structure/closet/syndicate/resources/initialize()
+ . = ..()
+ if(!contents.len)
var/common_min = 30 //Minimum amount of minerals in the stack for common minerals
var/common_max = 50 //Maximum amount of HONK in the stack for HONK common minerals
var/rare_min = 5 //Minimum HONK of HONK in the stack HONK HONK rare minerals
var/rare_max = 20 //Maximum HONK HONK HONK in the HONK for HONK rare HONK
-
-
var/pickednum = rand(1, 50)
//Sad trombone
@@ -120,13 +100,11 @@
if(pickednum == 50)
new /obj/item/weapon/tank/jetpack/carbondioxide(src)
- return
-
/obj/structure/closet/syndicate/resources/everything
desc = "It's an emergency storage closet for repairs."
- New()
- var/list/resources = list(
+/obj/structure/closet/syndicate/resources/everything/initialize()
+ var/list/resources = list(
/obj/item/stack/material/steel,
/obj/item/stack/material/glass,
/obj/item/stack/material/gold,
@@ -136,12 +114,11 @@
/obj/item/stack/material/diamond,
/obj/item/stack/material/plasteel,
/obj/item/stack/rods
- )
+ )
+ for(var/i = 0, i<2, i++)
+ for(var/res in resources)
+ var/obj/item/stack/R = new res(src)
+ R.amount = R.max_amount
- for(var/i = 0, i<2, i++)
- for(var/res in resources)
- var/obj/item/stack/R = new res(src)
- R.amount = R.max_amount
-
- return
+ return ..()
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index 110790aa82..f0781b3f02 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -14,48 +14,46 @@
*/
/obj/structure/closet/emcloset
name = "emergency closet"
- desc = "It's a storage unit for emergency breathmasks and o2 tanks."
+ desc = "It's a storage unit for emergency breathmasks and O2 tanks."
icon_state = "emergency"
icon_closed = "emergency"
icon_opened = "emergencyopen"
-/obj/structure/closet/emcloset/New()
- ..()
-
+/obj/structure/closet/emcloset/initialize()
switch (pickweight(list("small" = 55, "aid" = 25, "tank" = 10, "both" = 10)))
if ("small")
- new /obj/item/weapon/tank/emergency/oxygen(src)
- new /obj/item/weapon/tank/emergency/oxygen(src)
- new /obj/item/clothing/mask/breath(src)
- new /obj/item/clothing/mask/breath(src)
- new /obj/item/clothing/suit/space/emergency(src)
- new /obj/item/clothing/head/helmet/space/emergency(src)
+ starts_with = list(
+ /obj/item/weapon/tank/emergency/oxygen = 2,
+ /obj/item/clothing/mask/breath = 2,
+ /obj/item/clothing/suit/space/emergency,
+ /obj/item/clothing/head/helmet/space/emergency)
if ("aid")
- new /obj/item/weapon/tank/emergency/oxygen(src)
- new /obj/item/weapon/storage/toolbox/emergency(src)
- new /obj/item/clothing/mask/breath(src)
- new /obj/item/weapon/storage/firstaid/o2(src)
- new /obj/item/clothing/suit/space/emergency(src)
- new /obj/item/clothing/head/helmet/space/emergency(src)
+ starts_with = list(
+ /obj/item/weapon/tank/emergency/oxygen,
+ /obj/item/weapon/storage/toolbox/emergency,
+ /obj/item/clothing/mask/breath,
+ /obj/item/weapon/storage/firstaid/o2,
+ /obj/item/clothing/suit/space/emergency,
+ /obj/item/clothing/head/helmet/space/emergency)
if ("tank")
- new /obj/item/weapon/tank/emergency/oxygen/engi(src)
- new /obj/item/clothing/mask/breath(src)
- new /obj/item/weapon/tank/emergency/oxygen/engi(src)
- new /obj/item/clothing/mask/breath(src)
+ starts_with = list(
+ /obj/item/weapon/tank/emergency/oxygen/engi = 2,
+ /obj/item/clothing/mask/breath = 2)
if ("both")
- new /obj/item/weapon/storage/toolbox/emergency(src)
- new /obj/item/weapon/tank/emergency/oxygen/engi(src)
- new /obj/item/clothing/mask/breath(src)
- new /obj/item/weapon/storage/firstaid/o2(src)
- new /obj/item/clothing/suit/space/emergency(src)
- new /obj/item/clothing/suit/space/emergency(src)
- new /obj/item/clothing/head/helmet/space/emergency(src)
- new /obj/item/clothing/head/helmet/space/emergency(src)
+ starts_with = list(
+ /obj/item/weapon/storage/toolbox/emergency,
+ /obj/item/weapon/tank/emergency/oxygen/engi,
+ /obj/item/clothing/mask/breath,
+ /obj/item/weapon/storage/firstaid/o2,
+ /obj/item/clothing/suit/space/emergency = 2,
+ /obj/item/clothing/head/helmet/space/emergency = 2)
-/obj/structure/closet/emcloset/legacy/New()
- ..()
- new /obj/item/weapon/tank/oxygen(src)
- new /obj/item/clothing/mask/gas(src)
+ return ..()
+
+/obj/structure/closet/emcloset/legacy
+ starts_with = list(
+ /obj/item/weapon/tank/oxygen,
+ /obj/item/clothing/mask/gas)
/*
* Fire Closet
@@ -67,35 +65,30 @@
icon_closed = "firecloset"
icon_opened = "fireclosetopen"
-/obj/structure/closet/firecloset/New()
- ..()
+ starts_with = list(
+ /obj/item/clothing/suit/fire/firefighter,
+ /obj/item/clothing/mask/gas,
+ /obj/item/weapon/tank/oxygen/red,
+ /obj/item/weapon/extinguisher,
+ /obj/item/clothing/head/hardhat/red)
- new /obj/item/clothing/suit/fire/firefighter(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/weapon/tank/oxygen/red(src)
- new /obj/item/weapon/extinguisher(src)
- new /obj/item/clothing/head/hardhat/red(src)
+/obj/structure/closet/firecloset/full
+ starts_with = list(
+ /obj/item/clothing/suit/fire/firefighter,
+ /obj/item/clothing/mask/gas,
+ /obj/item/device/flashlight,
+ /obj/item/weapon/tank/oxygen/red,
+ /obj/item/weapon/extinguisher,
+ /obj/item/clothing/head/hardhat/red)
-/obj/structure/closet/firecloset/full/New()
- ..()
- sleep(4)
- contents = list()
-
- new /obj/item/clothing/suit/fire/firefighter(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/device/flashlight(src)
- new /obj/item/weapon/tank/oxygen/red(src)
- new /obj/item/weapon/extinguisher(src)
- new /obj/item/clothing/head/hardhat/red(src)
-
-/obj/structure/closet/firecloset/full/double/New()
- ..()
- new /obj/item/clothing/suit/fire/firefighter(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/device/flashlight(src)
- new /obj/item/weapon/tank/oxygen/red(src)
- new /obj/item/weapon/extinguisher(src)
- new /obj/item/clothing/head/hardhat/red(src)
+/obj/structure/closet/firecloset/full/double
+ starts_with = list(
+ /obj/item/clothing/suit/fire/firefighter = 2,
+ /obj/item/clothing/mask/gas = 2,
+ /obj/item/device/flashlight = 2,
+ /obj/item/weapon/tank/oxygen/red = 2,
+ /obj/item/weapon/extinguisher = 2,
+ /obj/item/clothing/head/hardhat/red = 2)
/obj/structure/closet/firecloset/update_icon()
if(!opened)
@@ -103,7 +96,6 @@
else
icon_state = icon_opened
-
/*
* Tool Closet
*/
@@ -114,39 +106,40 @@
icon_closed = "toolcloset"
icon_opened = "toolclosetopen"
-/obj/structure/closet/toolcloset/New()
- ..()
+/obj/structure/closet/toolcloset/initialize()
+ starts_with = list()
if(prob(40))
- new /obj/item/clothing/suit/storage/hazardvest(src)
+ starts_with += /obj/item/clothing/suit/storage/hazardvest
if(prob(70))
- new /obj/item/device/flashlight(src)
+ starts_with += /obj/item/device/flashlight
if(prob(70))
- new /obj/item/weapon/screwdriver(src)
+ starts_with += /obj/item/weapon/tool/screwdriver
if(prob(70))
- new /obj/item/weapon/wrench(src)
+ starts_with += /obj/item/weapon/tool/wrench
if(prob(70))
- new /obj/item/weapon/weldingtool(src)
+ starts_with += /obj/item/weapon/weldingtool
if(prob(70))
- new /obj/item/weapon/crowbar(src)
+ starts_with += /obj/item/weapon/tool/crowbar
if(prob(70))
- new /obj/item/weapon/wirecutters(src)
+ starts_with += /obj/item/weapon/tool/wirecutters
if(prob(70))
- new /obj/item/device/t_scanner(src)
+ starts_with += /obj/item/device/t_scanner
if(prob(20))
- new /obj/item/weapon/storage/belt/utility(src)
+ starts_with += /obj/item/weapon/storage/belt/utility
if(prob(30))
- new /obj/item/stack/cable_coil/random(src)
+ starts_with += /obj/item/stack/cable_coil/random
if(prob(30))
- new /obj/item/stack/cable_coil/random(src)
+ starts_with += /obj/item/stack/cable_coil/random
if(prob(30))
- new /obj/item/stack/cable_coil/random(src)
+ starts_with += /obj/item/stack/cable_coil/random
if(prob(20))
- new /obj/item/device/multitool(src)
+ starts_with += /obj/item/device/multitool
if(prob(5))
- new /obj/item/clothing/gloves/yellow(src)
+ starts_with += /obj/item/clothing/gloves/yellow
if(prob(40))
- new /obj/item/clothing/head/hardhat(src)
+ starts_with += /obj/item/clothing/head/hardhat
+ return ..()
/*
* Radiation Closet
@@ -158,14 +151,10 @@
icon_opened = "toolclosetopen"
icon_closed = "radsuitcloset"
-/obj/structure/closet/radiation/New()
- ..()
- new /obj/item/clothing/suit/radiation(src)
- new /obj/item/clothing/head/radiation(src)
- new /obj/item/clothing/suit/radiation(src)
- new /obj/item/clothing/head/radiation(src)
- new /obj/item/device/geiger(src)
- new /obj/item/device/geiger(src)
+ starts_with = list(
+ /obj/item/clothing/suit/radiation = 2,
+ /obj/item/clothing/head/radiation = 2,
+ /obj/item/device/geiger = 2)
/*
* Bombsuit closet
@@ -177,19 +166,18 @@
icon_closed = "bombsuit"
icon_opened = "bombsuitopen"
-/obj/structure/closet/bombcloset/New()
- ..()
- new /obj/item/clothing/suit/bomb_suit( src )
- new /obj/item/clothing/under/color/black( src )
- new /obj/item/clothing/shoes/black( src )
- new /obj/item/clothing/head/bomb_hood( src )
+ starts_with = list(
+ /obj/item/clothing/suit/bomb_suit,
+ /obj/item/clothing/under/color/black,
+ /obj/item/clothing/shoes/black,
+ /obj/item/clothing/head/bomb_hood)
-/obj/structure/closet/bombcloset/double/New() // Makes two suits.
- ..()
- new /obj/item/clothing/suit/bomb_suit( src )
- new /obj/item/clothing/under/color/black( src )
- new /obj/item/clothing/shoes/black( src )
- new /obj/item/clothing/head/bomb_hood( src )
+/obj/structure/closet/bombcloset/double
+ starts_with = list(
+ /obj/item/clothing/suit/bomb_suit = 2,
+ /obj/item/clothing/under/color/black = 2,
+ /obj/item/clothing/shoes/black = 2,
+ /obj/item/clothing/head/bomb_hood = 2)
/obj/structure/closet/bombclosetsecurity
name = "\improper EOD closet"
@@ -198,12 +186,11 @@
icon_closed = "bombsuitsec"
icon_opened = "bombsuitsecopen"
-/obj/structure/closet/bombclosetsecurity/New()
- ..()
- new /obj/item/clothing/suit/bomb_suit/security( src )
- new /obj/item/clothing/under/rank/security( src )
- new /obj/item/clothing/shoes/brown( src )
- new /obj/item/clothing/head/bomb_hood/security( src )
+ starts_with = list(
+ /obj/item/clothing/suit/bomb_suit/security,
+ /obj/item/clothing/under/rank/security,
+ /obj/item/clothing/shoes/brown,
+ /obj/item/clothing/head/bomb_hood/security)
/*
* Hydrant
@@ -214,18 +201,19 @@
icon_state = "hydrant"
icon_closed = "hydrant"
icon_opened = "hydrant_open"
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
anchored = 1
density = 0
wall_mounted = 1
-/obj/structure/closet/hydrant/New()
- ..()
- new /obj/item/clothing/suit/fire/firefighter(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/device/flashlight(src)
- new /obj/item/weapon/tank/oxygen/red(src)
- new /obj/item/weapon/extinguisher(src)
- new /obj/item/clothing/head/hardhat/red(src)
+ starts_with = list(
+ /obj/item/clothing/suit/fire/firefighter,
+ /obj/item/clothing/mask/gas,
+ /obj/item/device/flashlight,
+ /obj/item/weapon/tank/oxygen/red,
+ /obj/item/weapon/extinguisher,
+ /obj/item/clothing/head/hardhat/red)
/*
* First Aid
diff --git a/code/game/objects/structures/crates_lockers/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm
index 39204e3491..78572d38cd 100644
--- a/code/game/objects/structures/crates_lockers/closets/walllocker.dm
+++ b/code/game/objects/structures/crates_lockers/closets/walllocker.dm
@@ -16,7 +16,7 @@
/obj/structure/closet/walllocker/emerglocker
name = "emergency locker"
desc = "A wall mounted locker with emergency supplies."
- var/list/spawnitems = list(/obj/item/weapon/tank/emergency/oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/crowbar/red)
+ var/list/spawnitems = list(/obj/item/weapon/tank/emergency/oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/tool/crowbar/red)
var/amount = 2 // spawns each items X times.
icon_state = "emerg"
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 3bb6f6c87e..2a7d883d95 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -9,54 +9,34 @@
icon_state = "red"
icon_closed = "red"
-/obj/structure/closet/wardrobe/red/New()
- ..()
- if(prob(50))
- new /obj/item/weapon/storage/backpack/security(src)
- else
- new /obj/item/weapon/storage/backpack/satchel/sec(src)
- if(prob(50))
- new /obj/item/weapon/storage/backpack/security(src)
- else
- new /obj/item/weapon/storage/backpack/satchel/sec(src)
- if(prob(50))
- new /obj/item/weapon/storage/backpack/security(src)
- else
- new /obj/item/weapon/storage/backpack/satchel/sec(src)
- new /obj/item/clothing/under/rank/security(src)
- new /obj/item/clothing/under/rank/security(src)
- new /obj/item/clothing/under/rank/security(src)
- new /obj/item/clothing/under/rank/security2(src)
- new /obj/item/clothing/under/rank/security2(src)
- new /obj/item/clothing/under/rank/security2(src)
- new /obj/item/clothing/under/rank/security/skirt(src)
- new /obj/item/clothing/under/rank/security/skirt(src)
- new /obj/item/clothing/shoes/boots/jackboots(src)
- new /obj/item/clothing/shoes/boots/jackboots(src)
- new /obj/item/clothing/shoes/boots/jackboots(src)
- new /obj/item/clothing/head/soft/sec(src)
- new /obj/item/clothing/head/soft/sec(src)
- new /obj/item/clothing/head/soft/sec(src)
- new /obj/item/clothing/head/beret/sec(src)
- new /obj/item/clothing/head/beret/sec(src)
- new /obj/item/clothing/head/beret/sec(src)
- new /obj/item/clothing/head/beret/sec/corporate/officer(src)
- new /obj/item/clothing/head/beret/sec/corporate/officer(src)
- new /obj/item/clothing/head/beret/sec/corporate/officer(src)
- new /obj/item/clothing/mask/bandana/red(src)
- new /obj/item/clothing/mask/bandana/red(src)
- new /obj/item/clothing/mask/bandana/red(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
- new /obj/item/clothing/accessory/armband(src)
- new /obj/item/clothing/accessory/armband(src)
- new /obj/item/clothing/accessory/armband(src)
- new /obj/item/clothing/accessory/holster/waist(src)
- new /obj/item/clothing/accessory/holster/waist(src)
- new /obj/item/clothing/accessory/holster/waist(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/rank/security = 3,
+ /obj/item/clothing/under/rank/security2 = 3,
+ /obj/item/clothing/under/rank/security/skirt = 2,
+ /obj/item/clothing/shoes/boots/jackboots = 3,
+ /obj/item/clothing/head/soft/sec = 3,
+ /obj/item/clothing/head/beret/sec = 3,
+ /obj/item/clothing/head/beret/sec/corporate/officer = 3,
+ /obj/item/clothing/mask/bandana/red = 3,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/security = 3,
+ /obj/item/clothing/accessory/armband = 3,
+ /obj/item/clothing/accessory/holster/waist = 3)
+/obj/structure/closet/wardrobe/red/initialize()
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/security
+ else
+ starts_with += /obj/item/weapon/storage/backpack/satchel/sec
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/security
+ else
+ starts_with += /obj/item/weapon/storage/backpack/satchel/sec
+ if(prob(50))
+ starts_with += /obj/item/weapon/storage/backpack/security
+ else
+ starts_with += /obj/item/weapon/storage/backpack/satchel/sec
+
+ return ..()
/obj/structure/closet/wardrobe/detective
name = "detective wardrobe"
@@ -64,78 +44,44 @@
icon_closed = "cabinet_closed"
icon_opened = "cabinet_open"
-/obj/structure/closet/wardrobe/detective/New()
- ..()
- new /obj/item/clothing/head/det(src)
- new /obj/item/clothing/head/det(src)
- new /obj/item/clothing/head/det/grey(src)
- new /obj/item/clothing/head/det/grey(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/shoes/laceup(src)
- new /obj/item/clothing/shoes/laceup(src)
- new /obj/item/clothing/under/det(src)
- new /obj/item/clothing/under/det(src)
- new /obj/item/clothing/under/det/waistcoat(src)
- new /obj/item/clothing/under/det/waistcoat(src)
- new /obj/item/clothing/under/det/grey(src)
- new /obj/item/clothing/under/det/grey(src)
- new /obj/item/clothing/under/det/grey/waistcoat(src)
- new /obj/item/clothing/under/det/grey/waistcoat(src)
- new /obj/item/clothing/under/det/black(src)
- new /obj/item/clothing/under/det/black(src)
- new /obj/item/clothing/under/det/skirt(src)
- new /obj/item/clothing/under/det/corporate(src)
- new /obj/item/clothing/under/det/corporate(src)
- new /obj/item/clothing/suit/storage/det_trench(src)
- new /obj/item/clothing/suit/storage/det_trench(src)
- new /obj/item/clothing/suit/storage/det_trench/grey(src)
- new /obj/item/clothing/suit/storage/det_trench/grey(src)
- new /obj/item/clothing/suit/storage/forensics/blue(src)
- new /obj/item/clothing/suit/storage/forensics/blue(src)
- new /obj/item/clothing/suit/storage/forensics/red(src)
- new /obj/item/clothing/suit/storage/forensics/red(src)
- return
+ starts_with = list(
+ /obj/item/clothing/head/det = 2,
+ /obj/item/clothing/head/det/grey = 2,
+ /obj/item/clothing/shoes/brown = 2,
+ /obj/item/clothing/shoes/laceup = 2,
+ /obj/item/clothing/under/det = 2,
+ /obj/item/clothing/under/det/waistcoat = 2,
+ /obj/item/clothing/under/det/grey = 2,
+ /obj/item/clothing/under/det/grey/waistcoat = 2,
+ /obj/item/clothing/under/det/black = 2,
+ /obj/item/clothing/under/det/skirt,
+ /obj/item/clothing/under/det/corporate = 2,
+ /obj/item/clothing/suit/storage/det_trench = 2,
+ /obj/item/clothing/suit/storage/det_trench/grey = 2,
+ /obj/item/clothing/suit/storage/forensics/blue = 2,
+ /obj/item/clothing/suit/storage/forensics/red = 2)
/obj/structure/closet/wardrobe/pink
name = "pink wardrobe"
icon_state = "pink"
icon_closed = "pink"
-/obj/structure/closet/wardrobe/pink/New()
- ..()
- new /obj/item/clothing/under/color/pink(src)
- new /obj/item/clothing/under/color/pink(src)
- new /obj/item/clothing/under/color/pink(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/shoes/brown(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/color/pink = 3,
+ /obj/item/clothing/shoes/brown = 3)
/obj/structure/closet/wardrobe/black
name = "black wardrobe"
icon_state = "black"
icon_closed = "black"
-/obj/structure/closet/wardrobe/black/New()
- ..()
- new /obj/item/clothing/under/color/black(src)
- new /obj/item/clothing/under/color/black(src)
- new /obj/item/clothing/under/color/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/head/that(src)
- new /obj/item/clothing/head/that(src)
- new /obj/item/clothing/head/that(src)
- new /obj/item/clothing/head/soft/black(src)
- new /obj/item/clothing/head/soft/black(src)
- new /obj/item/clothing/head/soft/black(src)
- new /obj/item/clothing/mask/bandana(src)
- new /obj/item/clothing/mask/bandana(src)
- new /obj/item/clothing/mask/bandana(src)
- new /obj/item/weapon/storage/backpack/messenger/black(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/color/black = 3,
+ /obj/item/clothing/shoes/black = 3,
+ /obj/item/clothing/head/that = 3,
+ /obj/item/clothing/head/soft/black = 3,
+ /obj/item/clothing/mask/bandana = 3,
+ /obj/item/weapon/storage/backpack/messenger/black)
/obj/structure/closet/wardrobe/chaplain_black
@@ -144,21 +90,18 @@
icon_state = "black"
icon_closed = "black"
-/obj/structure/closet/wardrobe/chaplain_black/New()
- ..()
- new /obj/item/clothing/under/rank/chaplain(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/suit/nun(src)
- new /obj/item/clothing/head/nun_hood(src)
- new /obj/item/clothing/suit/storage/hooded/chaplain_hoodie(src)
- new /obj/item/clothing/suit/storage/hooded/chaplain_hoodie/whiteout(src)
- new /obj/item/clothing/suit/holidaypriest(src)
- new /obj/item/clothing/under/wedding/bride_white(src)
- new /obj/item/weapon/storage/backpack/cultpack (src)
- new /obj/item/weapon/storage/fancy/candle_box(src)
- new /obj/item/weapon/storage/fancy/candle_box(src)
- new /obj/item/weapon/deck/tarot(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/rank/chaplain,
+ /obj/item/clothing/shoes/black,
+ /obj/item/clothing/suit/nun,
+ /obj/item/clothing/head/nun_hood,
+ /obj/item/clothing/suit/storage/hooded/chaplain_hoodie,
+ /obj/item/clothing/suit/storage/hooded/chaplain_hoodie/whiteout,
+ /obj/item/clothing/suit/holidaypriest,
+ /obj/item/clothing/under/wedding/bride_white,
+ /obj/item/weapon/storage/backpack/cultpack,
+ /obj/item/weapon/storage/fancy/candle_box = 2,
+ /obj/item/weapon/deck/tarot)
/obj/structure/closet/wardrobe/green
@@ -166,40 +109,24 @@
icon_state = "green"
icon_closed = "green"
-/obj/structure/closet/wardrobe/green/New()
- ..()
- new /obj/item/clothing/under/color/green(src)
- new /obj/item/clothing/under/color/green(src)
- new /obj/item/clothing/under/color/green(src)
- new /obj/item/clothing/shoes/green(src)
- new /obj/item/clothing/shoes/green(src)
- new /obj/item/clothing/shoes/green(src)
- new /obj/item/clothing/head/soft/green(src)
- new /obj/item/clothing/head/soft/green(src)
- new /obj/item/clothing/head/soft/green(src)
- new /obj/item/clothing/mask/bandana/green(src)
- new /obj/item/clothing/mask/bandana/green(src)
- new /obj/item/clothing/mask/bandana/green(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/color/green = 3,
+ /obj/item/clothing/shoes/green = 3,
+ /obj/item/clothing/head/soft/green = 3,
+ /obj/item/clothing/mask/bandana/green = 3)
/obj/structure/closet/wardrobe/xenos
name = "xenos wardrobe"
icon_state = "green"
icon_closed = "green"
-/obj/structure/closet/wardrobe/xenos/New()
- ..()
- new /obj/item/clothing/suit/unathi/mantle(src)
- new /obj/item/clothing/suit/unathi/robe(src)
- new /obj/item/clothing/shoes/sandal(src)
- new /obj/item/clothing/shoes/sandal(src)
- new /obj/item/clothing/shoes/footwraps(src)
- new /obj/item/clothing/shoes/footwraps(src)
- new /obj/item/clothing/shoes/boots/winter(src)
- new /obj/item/clothing/shoes/boots/winter(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat(src)
- return
+ starts_with = list(
+ /obj/item/clothing/suit/unathi/mantle,
+ /obj/item/clothing/suit/unathi/robe,
+ /obj/item/clothing/shoes/sandal = 2,
+ /obj/item/clothing/shoes/footwraps = 2,
+ /obj/item/clothing/shoes/boots/winter = 2,
+ /obj/item/clothing/suit/storage/hooded/wintercoat = 2)
/obj/structure/closet/wardrobe/orange
@@ -208,15 +135,9 @@
icon_state = "orange"
icon_closed = "orange"
-/obj/structure/closet/wardrobe/orange/New()
- ..()
- new /obj/item/clothing/under/color/orange(src)
- new /obj/item/clothing/under/color/orange(src)
- new /obj/item/clothing/under/color/orange(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/shoes/orange(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/color/orange = 3,
+ /obj/item/clothing/shoes/orange = 3)
/obj/structure/closet/wardrobe/yellow
@@ -224,21 +145,11 @@
icon_state = "yellow"
icon_closed = "yellow"
-/obj/structure/closet/wardrobe/yellow/New()
- ..()
- new /obj/item/clothing/under/color/yellow(src)
- new /obj/item/clothing/under/color/yellow(src)
- new /obj/item/clothing/under/color/yellow(src)
- new /obj/item/clothing/shoes/yellow(src)
- new /obj/item/clothing/shoes/yellow(src)
- new /obj/item/clothing/shoes/yellow(src)
- new /obj/item/clothing/head/soft/yellow(src)
- new /obj/item/clothing/head/soft/yellow(src)
- new /obj/item/clothing/head/soft/yellow(src)
- new /obj/item/clothing/mask/bandana/gold(src)
- new /obj/item/clothing/mask/bandana/gold(src)
- new /obj/item/clothing/mask/bandana/gold(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/color/yellow = 3,
+ /obj/item/clothing/shoes/yellow = 3,
+ /obj/item/clothing/head/soft/yellow = 3,
+ /obj/item/clothing/mask/bandana/gold = 3)
/obj/structure/closet/wardrobe/atmospherics_yellow
@@ -246,88 +157,42 @@
icon_state = "yellow"
icon_closed = "yellow"
-/obj/structure/closet/wardrobe/atmospherics_yellow/New()
- ..()
- new /obj/item/clothing/under/rank/atmospheric_technician(src)
- new /obj/item/clothing/under/rank/atmospheric_technician(src)
- new /obj/item/clothing/under/rank/atmospheric_technician(src)
- new /obj/item/clothing/under/rank/atmospheric_technician/skirt(src)
- new /obj/item/clothing/under/rank/atmospheric_technician/skirt(src)
- new /obj/item/clothing/under/rank/atmospheric_technician/skirt(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/head/hardhat/red(src)
- new /obj/item/clothing/head/hardhat/red(src)
- new /obj/item/clothing/head/hardhat/red(src)
- new /obj/item/clothing/head/beret/engineering(src)
- new /obj/item/clothing/head/beret/engineering(src)
- new /obj/item/clothing/head/beret/engineering(src)
- new /obj/item/clothing/mask/bandana/gold(src)
- new /obj/item/clothing/mask/bandana/gold(src)
- new /obj/item/clothing/mask/bandana/gold(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos(src)
- new /obj/item/clothing/shoes/boots/winter/atmos(src)
- new /obj/item/clothing/shoes/boots/winter/atmos(src)
- new /obj/item/clothing/shoes/boots/winter/atmos(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/rank/atmospheric_technician = 3,
+ /obj/item/clothing/under/rank/atmospheric_technician/skirt = 3,
+ /obj/item/clothing/shoes/black = 3,
+ /obj/item/clothing/head/hardhat/red = 3,
+ /obj/item/clothing/head/beret/engineering = 3,
+ /obj/item/clothing/mask/bandana/gold = 3,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos = 3,
+ /obj/item/clothing/shoes/boots/winter/atmos = 3)
/obj/structure/closet/wardrobe/engineering_yellow
name = "engineering wardrobe"
icon_state = "yellow"
icon_closed = "yellow"
-/obj/structure/closet/wardrobe/engineering_yellow/New()
- ..()
- new /obj/item/clothing/under/rank/engineer(src)
- new /obj/item/clothing/under/rank/engineer(src)
- new /obj/item/clothing/under/rank/engineer(src)
- new /obj/item/clothing/under/rank/engineer/skirt(src)
- new /obj/item/clothing/under/rank/engineer/skirt(src)
- new /obj/item/clothing/under/rank/engineer/skirt(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/head/hardhat(src)
- new /obj/item/clothing/head/hardhat(src)
- new /obj/item/clothing/head/hardhat(src)
- new /obj/item/clothing/head/beret/engineering(src)
- new /obj/item/clothing/head/beret/engineering(src)
- new /obj/item/clothing/head/beret/engineering(src)
- new /obj/item/clothing/mask/bandana/gold(src)
- new /obj/item/clothing/mask/bandana/gold(src)
- new /obj/item/clothing/mask/bandana/gold(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src)
- new /obj/item/clothing/shoes/boots/winter/engineering(src)
- new /obj/item/clothing/shoes/boots/winter/engineering(src)
- new /obj/item/clothing/shoes/boots/winter/engineering(src)
- new /obj/item/clothing/shoes/boots/workboots(src)
- new /obj/item/clothing/shoes/boots/workboots(src)
- new /obj/item/clothing/shoes/boots/workboots(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/rank/engineer = 3,
+ /obj/item/clothing/under/rank/engineer/skirt = 3,
+ /obj/item/clothing/shoes/orange = 3,
+ /obj/item/clothing/head/hardhat = 3,
+ /obj/item/clothing/head/beret/engineering = 3,
+ /obj/item/clothing/mask/bandana/gold = 3,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/engineering = 3,
+ /obj/item/clothing/shoes/boots/winter/engineering = 3,
+ /obj/item/clothing/shoes/boots/workboots = 3)
/obj/structure/closet/wardrobe/white
name = "white wardrobe"
icon_state = "white"
icon_closed = "white"
-
-/obj/structure/closet/wardrobe/white/New()
- ..()
- new /obj/item/clothing/under/color/white(src)
- new /obj/item/clothing/under/color/white(src)
- new /obj/item/clothing/under/color/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/head/soft/mime(src)
- new /obj/item/clothing/head/soft/mime(src)
- new /obj/item/clothing/head/soft/mime(src)
- return
+
+ starts_with = list(
+ /obj/item/clothing/under/color/white = 3,
+ /obj/item/clothing/shoes/white = 3,
+ /obj/item/clothing/head/soft/mime = 3)
/obj/structure/closet/wardrobe/pjs
@@ -335,17 +200,11 @@
icon_state = "white"
icon_closed = "white"
-/obj/structure/closet/wardrobe/pjs/New()
- ..()
- new /obj/item/clothing/under/pj/red(src)
- new /obj/item/clothing/under/pj/red(src)
- new /obj/item/clothing/under/pj/blue(src)
- new /obj/item/clothing/under/pj/blue(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/slippers(src)
- new /obj/item/clothing/shoes/slippers(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/pj/red = 2,
+ /obj/item/clothing/under/pj/blue = 2,
+ /obj/item/clothing/shoes/white = 2,
+ /obj/item/clothing/shoes/slippers = 2)
/obj/structure/closet/wardrobe/science_white
@@ -353,60 +212,50 @@
icon_state = "white"
icon_closed = "white"
-/obj/structure/closet/wardrobe/science_white/New()
- ..()
- new /obj/item/clothing/under/rank/scientist(src)
- new /obj/item/clothing/under/rank/scientist(src)
- new /obj/item/clothing/under/rank/scientist(src)
- new /obj/item/clothing/under/rank/scientist/skirt(src)
- new /obj/item/clothing/under/rank/scientist/skirt(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/slippers(src)
- new /obj/item/clothing/shoes/slippers(src)
- new /obj/item/clothing/shoes/slippers(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/science(src)
- new /obj/item/clothing/shoes/boots/winter/science(src)
- new /obj/item/weapon/storage/backpack/toxins(src)
- new /obj/item/weapon/storage/backpack/satchel/tox(src)
+ starts_with = list(
+ /obj/item/clothing/under/rank/scientist = 3,
+ /obj/item/clothing/under/rank/scientist/skirt = 2,
+ /obj/item/clothing/suit/storage/toggle/labcoat = 3,
+ /obj/item/clothing/shoes/white = 3,
+ /obj/item/clothing/shoes/slippers = 3,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/science,
+ /obj/item/clothing/shoes/boots/winter/science,
+ /obj/item/weapon/storage/backpack/toxins,
+ /obj/item/weapon/storage/backpack/satchel/tox)
+
+/obj/structure/closet/wardrobe/science_white/initialize()
if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/sci(src)
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/sci
else
- new /obj/item/weapon/storage/backpack/satchel/tox(src)
+ starts_with += /obj/item/weapon/storage/backpack/satchel/tox
if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/sci(src)
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/sci
else
- new /obj/item/weapon/storage/backpack/satchel/tox(src)
+ starts_with += /obj/item/weapon/storage/backpack/satchel/tox
+
+ return ..()
+
+
/obj/structure/closet/wardrobe/robotics_black
name = "robotics wardrobe"
icon_state = "black"
icon_closed = "black"
-/obj/structure/closet/wardrobe/robotics_black/New()
- ..()
- new /obj/item/clothing/under/rank/roboticist(src)
- new /obj/item/clothing/under/rank/roboticist(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/gloves/black(src)
- new /obj/item/clothing/gloves/black(src)
- new /obj/item/weapon/storage/backpack/toxins(src)
+ starts_with = list(
+ /obj/item/clothing/under/rank/roboticist = 2,
+ /obj/item/clothing/suit/storage/toggle/labcoat = 2,
+ /obj/item/clothing/shoes/black = 2,
+ /obj/item/clothing/gloves/black = 2,
+ /obj/item/weapon/storage/backpack/toxins,
+ /obj/item/weapon/storage/backpack/satchel/tox)
+
+/obj/structure/closet/wardrobe/robotics_black/initialize()
if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/sci(src)
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/sci
else
- new /obj/item/weapon/storage/backpack/satchel/tox(src)
- new /obj/item/weapon/storage/backpack/satchel/tox(src)
- if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/sci(src)
- else
- new /obj/item/weapon/storage/backpack/satchel/tox(src)
- return
+ starts_with += /obj/item/weapon/storage/backpack/satchel/tox
+
+ return ..()
/obj/structure/closet/wardrobe/chemistry_white
@@ -414,23 +263,14 @@
icon_state = "white"
icon_closed = "white"
-/obj/structure/closet/wardrobe/chemistry_white/New()
- ..()
- new /obj/item/clothing/under/rank/chemist(src)
- new /obj/item/clothing/under/rank/chemist(src)
- new /obj/item/clothing/under/rank/chemist/skirt(src)
- new /obj/item/clothing/under/rank/chemist/skirt(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(src)
- new /obj/item/weapon/storage/backpack/chemistry(src)
- new /obj/item/weapon/storage/backpack/chemistry(src)
- new /obj/item/weapon/storage/backpack/satchel/chem(src)
- new /obj/item/weapon/storage/backpack/satchel/chem(src)
- new /obj/item/weapon/storage/bag/chemistry(src)
- new /obj/item/weapon/storage/bag/chemistry(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/rank/chemist = 2,
+ /obj/item/clothing/under/rank/chemist/skirt = 2,
+ /obj/item/clothing/shoes/white = 2,
+ /obj/item/clothing/suit/storage/toggle/labcoat/chemist = 2,
+ /obj/item/weapon/storage/backpack/chemistry = 2,
+ /obj/item/weapon/storage/backpack/satchel/chem = 2,
+ /obj/item/weapon/storage/bag/chemistry = 2,)
/obj/structure/closet/wardrobe/genetics_white
@@ -438,21 +278,13 @@
icon_state = "white"
icon_closed = "white"
-/obj/structure/closet/wardrobe/genetics_white/New()
- ..()
- new /obj/item/clothing/under/rank/geneticist(src)
- new /obj/item/clothing/under/rank/geneticist(src)
- new /obj/item/clothing/under/rank/geneticist/skirt(src)
- new /obj/item/clothing/under/rank/geneticist/skirt(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(src)
- new /obj/item/weapon/storage/backpack/genetics(src)
- new /obj/item/weapon/storage/backpack/genetics(src)
- new /obj/item/weapon/storage/backpack/satchel/gen(src)
- new /obj/item/weapon/storage/backpack/satchel/gen(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/rank/geneticist = 2,
+ /obj/item/clothing/under/rank/geneticist/skirt = 2,
+ /obj/item/clothing/shoes/white = 2,
+ /obj/item/clothing/suit/storage/toggle/labcoat/genetics = 2,
+ /obj/item/weapon/storage/backpack/genetics = 2,
+ /obj/item/weapon/storage/backpack/satchel/gen = 2)
/obj/structure/closet/wardrobe/virology_white
@@ -460,23 +292,14 @@
icon_state = "white"
icon_closed = "white"
-/obj/structure/closet/wardrobe/virology_white/New()
- ..()
- new /obj/item/clothing/under/rank/virologist(src)
- new /obj/item/clothing/under/rank/virologist(src)
- new /obj/item/clothing/under/rank/virologist/skirt(src)
- new /obj/item/clothing/under/rank/virologist/skirt(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(src)
- new /obj/item/clothing/mask/surgical(src)
- new /obj/item/clothing/mask/surgical(src)
- new /obj/item/weapon/storage/backpack/virology(src)
- new /obj/item/weapon/storage/backpack/virology(src)
- new /obj/item/weapon/storage/backpack/satchel/vir(src)
- new /obj/item/weapon/storage/backpack/satchel/vir(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/rank/virologist = 2,
+ /obj/item/clothing/under/rank/virologist/skirt = 2,
+ /obj/item/clothing/shoes/white = 2,
+ /obj/item/clothing/suit/storage/toggle/labcoat/virologist = 2,
+ /obj/item/clothing/mask/surgical = 2,
+ /obj/item/weapon/storage/backpack/virology = 2,
+ /obj/item/weapon/storage/backpack/satchel/vir = 2)
/obj/structure/closet/wardrobe/medic_white
@@ -484,33 +307,24 @@
icon_state = "white"
icon_closed = "white"
-/obj/structure/closet/wardrobe/medic_white/New()
- ..()
- new /obj/item/clothing/under/rank/medical(src)
- new /obj/item/clothing/under/rank/medical(src)
- new /obj/item/clothing/under/rank/medical/skirt(src)
- new /obj/item/clothing/under/rank/medical/skirt(src)
- new /obj/item/clothing/under/rank/medical/scrubs(src)
- new /obj/item/clothing/under/rank/medical/scrubs/green(src)
- new /obj/item/clothing/under/rank/medical/scrubs/purple(src)
- new /obj/item/clothing/under/rank/medical/scrubs/black(src)
- new /obj/item/clothing/under/rank/medical/scrubs/navyblue(src)
- new /obj/item/clothing/head/surgery/navyblue(src)
- new /obj/item/clothing/head/surgery/purple(src)
- new /obj/item/clothing/head/surgery/blue(src)
- new /obj/item/clothing/head/surgery/green(src)
- new /obj/item/clothing/head/surgery/black(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat(src)
- new /obj/item/clothing/mask/surgical(src)
- new /obj/item/clothing/mask/surgical(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src)
- new /obj/item/clothing/shoes/boots/winter/medical(src)
- new /obj/item/clothing/shoes/boots/winter/medical(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/rank/medical = 2,
+ /obj/item/clothing/under/rank/medical/skirt = 2,
+ /obj/item/clothing/under/rank/medical/scrubs,
+ /obj/item/clothing/under/rank/medical/scrubs/green,
+ /obj/item/clothing/under/rank/medical/scrubs/purple,
+ /obj/item/clothing/under/rank/medical/scrubs/black,
+ /obj/item/clothing/under/rank/medical/scrubs/navyblue,
+ /obj/item/clothing/head/surgery/navyblue,
+ /obj/item/clothing/head/surgery/purple,
+ /obj/item/clothing/head/surgery/blue,
+ /obj/item/clothing/head/surgery/green,
+ /obj/item/clothing/head/surgery/black,
+ /obj/item/clothing/shoes/white = 2,
+ /obj/item/clothing/suit/storage/toggle/labcoat = 2,
+ /obj/item/clothing/mask/surgical = 2,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/medical = 2,
+ /obj/item/clothing/shoes/boots/winter/medical = 2)
/obj/structure/closet/wardrobe/medic_gown
@@ -518,71 +332,57 @@
icon_state = "white"
icon_closed = "white"
-/obj/structure/closet/wardrobe/medic_gown/New()
- ..()
- new /obj/item/clothing/under/medigown(src)
- new /obj/item/clothing/under/medigown(src)
- new /obj/item/clothing/under/medigown(src)
- new /obj/item/clothing/under/medigown(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/medigown = 4)
/obj/structure/closet/wardrobe/grey
name = "grey wardrobe"
icon_state = "grey"
icon_closed = "grey"
-
-/obj/structure/closet/wardrobe/grey/New()
- ..()
- new /obj/item/clothing/under/color/grey(src)
- new /obj/item/clothing/under/color/grey(src)
- new /obj/item/clothing/under/color/grey(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/head/soft/grey(src)
- new /obj/item/clothing/head/soft/grey(src)
- new /obj/item/clothing/head/soft/grey(src)
- return
-
+
+ starts_with = list(
+ /obj/item/clothing/under/color/grey = 3,
+ /obj/item/clothing/shoes/black = 3,
+ /obj/item/clothing/head/soft/grey = 3)
+
/obj/structure/closet/wardrobe/mixed
name = "mixed wardrobe"
icon_state = "mixed"
icon_closed = "mixed"
-/obj/structure/closet/wardrobe/mixed/New()
- ..()
- new /obj/item/clothing/under/color/blue(src)
- new /obj/item/clothing/under/color/yellow(src)
- new /obj/item/clothing/under/color/green(src)
- new /obj/item/clothing/under/color/pink(src)
- new /obj/item/clothing/under/skirt/outfit/plaid_blue(src)
- new /obj/item/clothing/under/skirt/outfit/plaid_red(src)
- new /obj/item/clothing/under/skirt/outfit/plaid_purple(src)
- new /obj/item/clothing/shoes/blue(src)
- new /obj/item/clothing/shoes/yellow(src)
- new /obj/item/clothing/shoes/green(src)
- new /obj/item/clothing/shoes/purple(src)
- new /obj/item/clothing/shoes/red(src)
- new /obj/item/clothing/shoes/leather(src)
- new /obj/item/clothing/under/pants/classicjeans(src)
- new /obj/item/clothing/under/pants/mustangjeans(src)
- new /obj/item/clothing/under/pants/blackjeans(src)
- new /obj/item/clothing/under/pants/youngfolksjeans(src)
- new /obj/item/clothing/under/pants/white(src)
- new /obj/item/clothing/under/pants/red(src)
- new /obj/item/clothing/under/pants/black(src)
- new /obj/item/clothing/under/pants/tan(src)
- new /obj/item/clothing/under/pants/track(src)
- new /obj/item/clothing/suit/storage/toggle/track(src)
- new /obj/item/clothing/under/pants(src)
- new /obj/item/clothing/under/pants/khaki(src)
- new /obj/item/clothing/mask/bandana/blue(src)
- new /obj/item/clothing/mask/bandana/blue(src)
- new /obj/item/clothing/accessory/hawaii(src)
- new /obj/item/clothing/accessory/hawaii/random(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/color/blue,
+ /obj/item/clothing/under/color/yellow,
+ /obj/item/clothing/under/color/green,
+ /obj/item/clothing/under/color/pink,
+ /obj/item/clothing/under/skirt/outfit/plaid_blue,
+ /obj/item/clothing/under/skirt/outfit/plaid_red,
+ /obj/item/clothing/under/skirt/outfit/plaid_purple,
+ /obj/item/clothing/shoes/blue,
+ /obj/item/clothing/shoes/yellow,
+ /obj/item/clothing/shoes/green,
+ /obj/item/clothing/shoes/purple,
+ /obj/item/clothing/shoes/red,
+ /obj/item/clothing/shoes/leather,
+ /obj/item/clothing/under/pants/classicjeans,
+ /obj/item/clothing/under/pants/mustangjeans,
+ /obj/item/clothing/under/pants/blackjeans,
+ /obj/item/clothing/under/pants/youngfolksjeans,
+ /obj/item/clothing/under/pants/white,
+ /obj/item/clothing/under/pants/red,
+ /obj/item/clothing/under/pants/black,
+ /obj/item/clothing/under/pants/tan,
+ /obj/item/clothing/under/pants/track,
+ /obj/item/clothing/suit/storage/toggle/track,
+ /obj/item/clothing/under/pants,
+ /obj/item/clothing/under/pants/khaki,
+ /obj/item/clothing/mask/bandana/blue,
+ /obj/item/clothing/mask/bandana/blue,
+ /obj/item/clothing/accessory/hawaii,
+ /obj/item/clothing/accessory/hawaii/random)
+
/obj/structure/closet/wardrobe/tactical
name = "tactical equipment"
@@ -590,24 +390,26 @@
icon_closed = "syndicate1"
icon_opened = "syndicate1open"
-/obj/structure/closet/wardrobe/tactical/New()
- ..()
- new /obj/item/clothing/under/tactical(src)
- new /obj/item/clothing/suit/armor/tactical(src)
- new /obj/item/clothing/head/helmet/tactical(src)
- new /obj/item/clothing/mask/balaclava/tactical(src)
- new /obj/item/clothing/mask/balaclava(src)
- new /obj/item/clothing/glasses/sunglasses/sechud/tactical(src)
+ starts_with = list(
+ /obj/item/clothing/under/tactical,
+ /obj/item/clothing/suit/armor/tactical,
+ /obj/item/clothing/head/helmet/tactical,
+ /obj/item/clothing/mask/balaclava/tactical,
+ /obj/item/clothing/mask/balaclava,
+ /obj/item/clothing/glasses/sunglasses/sechud/tactical,
+ /obj/item/clothing/shoes/boots/jackboots,
+ /obj/item/clothing/gloves/black,
+ /obj/item/clothing/under/pants/camo)
+
+/obj/structure/closet/wardrobe/tactical/initialize()
if(prob(25))
- new /obj/item/weapon/storage/belt/security/tactical/bandolier(src)
+ starts_with += /obj/item/weapon/storage/belt/security/tactical/bandolier
else
- new /obj/item/weapon/storage/belt/security/tactical(src)
+ starts_with += /obj/item/weapon/storage/belt/security/tactical
if(prob(10))
- new /obj/item/clothing/mask/bandana/skull(src)
- new /obj/item/clothing/shoes/boots/jackboots(src)
- new /obj/item/clothing/gloves/black(src)
- new /obj/item/clothing/under/pants/camo(src)
- return
+ starts_with += /obj/item/clothing/mask/bandana/skull
+
+ return ..()
/obj/structure/closet/wardrobe/ert
name = "emergency response team equipment"
@@ -615,52 +417,47 @@
icon_closed = "syndicate1"
icon_opened = "syndicate1open"
-/obj/structure/closet/wardrobe/ert/New()
- ..()
- new /obj/item/clothing/under/rank/centcom(src)
- new /obj/item/clothing/under/ert(src)
- new /obj/item/clothing/under/syndicate/combat(src)
- new /obj/item/device/radio/headset/ert/alt(src)
- new /obj/item/clothing/glasses/sunglasses(src)
- new /obj/item/clothing/shoes/boots/swat(src)
- new /obj/item/clothing/gloves/swat(src)
- new /obj/item/clothing/mask/balaclava/tactical(src)
- new /obj/item/clothing/mask/balaclava(src)
- new /obj/item/clothing/mask/bandana/skull(src)
- new /obj/item/clothing/mask/bandana/skull(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/rank/centcom,
+ /obj/item/clothing/under/ert,
+ /obj/item/clothing/under/syndicate/combat,
+ /obj/item/device/radio/headset/ert/alt,
+ /obj/item/clothing/glasses/sunglasses,
+ /obj/item/clothing/shoes/boots/swat,
+ /obj/item/clothing/gloves/swat,
+ /obj/item/clothing/mask/balaclava/tactical,
+ /obj/item/clothing/mask/balaclava,
+ /obj/item/clothing/mask/bandana/skull = 2)
+
/obj/structure/closet/wardrobe/suit
name = "suit locker"
icon_state = "mixed"
icon_closed = "mixed"
-/obj/structure/closet/wardrobe/suit/New()
- ..()
- new /obj/item/clothing/under/assistantformal(src)
- new /obj/item/clothing/under/suit_jacket/charcoal(src)
- new /obj/item/clothing/under/suit_jacket/charcoal/skirt(src)
- new /obj/item/clothing/under/suit_jacket/navy(src)
- new /obj/item/clothing/under/suit_jacket/navy/skirt(src)
- new /obj/item/clothing/under/suit_jacket/burgundy(src)
- new /obj/item/clothing/under/suit_jacket/burgundy/skirt(src)
- new /obj/item/clothing/under/suit_jacket/checkered(src)
- new /obj/item/clothing/under/suit_jacket/checkered/skirt(src)
- new /obj/item/clothing/under/suit_jacket/tan(src)
- new /obj/item/clothing/under/suit_jacket/tan/skirt(src)
- new /obj/item/clothing/under/sl_suit(src)
- new /obj/item/clothing/under/suit_jacket(src)
- new /obj/item/clothing/under/suit_jacket/female(src)
- new /obj/item/clothing/under/suit_jacket/female/skirt(src)
- new /obj/item/clothing/under/suit_jacket/really_black(src)
- new /obj/item/clothing/under/suit_jacket/really_black/skirt(src)
- new /obj/item/clothing/under/suit_jacket/red(src)
- new /obj/item/clothing/under/suit_jacket/red/skirt(src)
- new /obj/item/clothing/under/scratch(src)
- new /obj/item/clothing/under/scratch/skirt(src)
- new /obj/item/weapon/storage/backpack/satchel(src)
- new /obj/item/weapon/storage/backpack/satchel(src)
- return
+ starts_with = list(
+ /obj/item/clothing/under/assistantformal,
+ /obj/item/clothing/under/suit_jacket/charcoal,
+ /obj/item/clothing/under/suit_jacket/charcoal/skirt,
+ /obj/item/clothing/under/suit_jacket/navy,
+ /obj/item/clothing/under/suit_jacket/navy/skirt,
+ /obj/item/clothing/under/suit_jacket/burgundy,
+ /obj/item/clothing/under/suit_jacket/burgundy/skirt,
+ /obj/item/clothing/under/suit_jacket/checkered,
+ /obj/item/clothing/under/suit_jacket/checkered/skirt,
+ /obj/item/clothing/under/suit_jacket/tan,
+ /obj/item/clothing/under/suit_jacket/tan/skirt,
+ /obj/item/clothing/under/sl_suit,
+ /obj/item/clothing/under/suit_jacket,
+ /obj/item/clothing/under/suit_jacket/female,
+ /obj/item/clothing/under/suit_jacket/female/skirt,
+ /obj/item/clothing/under/suit_jacket/really_black,
+ /obj/item/clothing/under/suit_jacket/really_black/skirt,
+ /obj/item/clothing/under/suit_jacket/red,
+ /obj/item/clothing/under/suit_jacket/red/skirt,
+ /obj/item/clothing/under/scratch,
+ /obj/item/clothing/under/scratch/skirt,
+ /obj/item/weapon/storage/backpack/satchel = 2)
/obj/structure/closet/wardrobe/captain
name = "colony director's wardrobe"
@@ -668,24 +465,22 @@
icon_closed = "cabinet_closed"
icon_opened = "cabinet_open"
-/obj/structure/closet/wardrobe/captain/New()
- ..()
- new /obj/item/weapon/storage/backpack/captain(src)
- new /obj/item/clothing/suit/captunic(src)
- new /obj/item/clothing/suit/captunic/capjacket(src)
- new /obj/item/clothing/head/caphat/cap(src)
- new /obj/item/clothing/under/rank/captain(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/gloves/captain(src)
- new /obj/item/clothing/under/dress/dress_cap(src)
- new /obj/item/weapon/storage/backpack/satchel/cap(src)
- new /obj/item/clothing/head/caphat/formal(src)
- new /obj/item/clothing/under/captainformal(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/captain(src)
- new /obj/item/clothing/shoes/boots/winter/command(src)
- new /obj/item/clothing/head/beret/centcom/captain(src)
- new /obj/item/clothing/under/gimmick/rank/captain/suit(src)
- new /obj/item/clothing/under/gimmick/rank/captain/suit/skirt(src)
- new /obj/item/clothing/glasses/sunglasses(src)
- new /obj/item/clothing/head/caphat(src)
- return
+ starts_with = list(
+ /obj/item/weapon/storage/backpack/captain,
+ /obj/item/clothing/suit/captunic,
+ /obj/item/clothing/suit/captunic/capjacket,
+ /obj/item/clothing/head/caphat/cap,
+ /obj/item/clothing/under/rank/captain,
+ /obj/item/clothing/shoes/brown,
+ /obj/item/clothing/gloves/captain,
+ /obj/item/clothing/under/dress/dress_cap,
+ /obj/item/weapon/storage/backpack/satchel/cap,
+ /obj/item/clothing/head/caphat/formal,
+ /obj/item/clothing/under/captainformal,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/captain,
+ /obj/item/clothing/shoes/boots/winter/command,
+ /obj/item/clothing/head/beret/centcom/captain,
+ /obj/item/clothing/under/gimmick/rank/captain/suit,
+ /obj/item/clothing/under/gimmick/rank/captain/suit/skirt,
+ /obj/item/clothing/glasses/sunglasses,
+ /obj/item/clothing/head/caphat)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 97dd747845..e399c04d0b 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -94,7 +94,7 @@
user.drop_item()
W.forceMove(src)
return
- else if(istype(W, /obj/item/weapon/wirecutters))
+ else if(W.is_wirecutter())
if(rigged)
user << "You cut away the wiring."
playsound(src.loc, W.usesound, 100, 1)
@@ -191,7 +191,7 @@
src.toggle(user)
/obj/structure/closet/crate/secure/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(is_type_in_list(W, list(/obj/item/weapon/packageWrap, /obj/item/stack/cable_coil, /obj/item/device/radio/electropack, /obj/item/weapon/wirecutters)))
+ if(is_type_in_list(W, list(/obj/item/weapon/packageWrap, /obj/item/stack/cable_coil, /obj/item/device/radio/electropack, /obj/item/weapon/tool/wirecutters)))
return ..()
if(istype(W, /obj/item/weapon/melee/energy/blade))
emag_act(INFINITY, user)
@@ -287,42 +287,18 @@
icon_opened = "engi_crateopen"
icon_closed = "engi_crate"
-/obj/structure/closet/crate/rcd/New()
- ..()
- new /obj/item/weapon/rcd_ammo(src)
- new /obj/item/weapon/rcd_ammo(src)
- new /obj/item/weapon/rcd_ammo(src)
- new /obj/item/weapon/rcd(src)
+ starts_with = list(
+ /obj/item/weapon/rcd_ammo = 3,
+ /obj/item/weapon/rcd)
/obj/structure/closet/crate/solar
name = "solar pack crate"
-/obj/structure/closet/crate/solar/New()
- ..()
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/solar_assembly(src)
- new /obj/item/weapon/circuitboard/solar_control(src)
- new /obj/item/weapon/tracker_electronics(src)
- new /obj/item/weapon/paper/solar(src)
+ starts_with = list(
+ /obj/item/solar_assembly = 21,
+ /obj/item/weapon/circuitboard/solar_control,
+ /obj/item/weapon/tracker_electronics,
+ /obj/item/weapon/paper/solar)
/obj/structure/closet/crate/freezer
name = "freezer"
@@ -366,13 +342,9 @@
name = "emergency rations"
desc = "A crate of emergency rations."
+ starts_with = list(
+ /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 4)
-/obj/structure/closet/crate/freezer/rations/New()
- ..()
- new /obj/item/weapon/reagent_containers/food/snacks/liquidfood(src)
- new /obj/item/weapon/reagent_containers/food/snacks/liquidfood(src)
- new /obj/item/weapon/reagent_containers/food/snacks/liquidfood(src)
- new /obj/item/weapon/reagent_containers/food/snacks/liquidfood(src)
/obj/structure/closet/crate/bin
name = "large bin"
@@ -381,6 +353,7 @@
icon_opened = "largebinopen"
icon_closed = "largebin"
+
/obj/structure/closet/crate/radiation
name = "radioactive gear crate"
desc = "A crate with a radiation sign on it."
@@ -388,16 +361,10 @@
icon_opened = "radiationopen"
icon_closed = "radiation"
-/obj/structure/closet/crate/radiation/New()
- ..()
- new /obj/item/clothing/suit/radiation(src)
- new /obj/item/clothing/head/radiation(src)
- new /obj/item/clothing/suit/radiation(src)
- new /obj/item/clothing/head/radiation(src)
- new /obj/item/clothing/suit/radiation(src)
- new /obj/item/clothing/head/radiation(src)
- new /obj/item/clothing/suit/radiation(src)
- new /obj/item/clothing/head/radiation(src)
+ starts_with = list(
+ /obj/item/clothing/suit/radiation = 4,
+ /obj/item/clothing/head/radiation = 4)
+
/obj/structure/closet/crate/secure/weapon
name = "weapons crate"
@@ -406,6 +373,7 @@
icon_opened = "weaponcrateopen"
icon_closed = "weaponcrate"
+
/obj/structure/closet/crate/secure/phoron
name = "phoron crate"
desc = "A secure phoron crate."
@@ -413,6 +381,7 @@
icon_opened = "phoroncrateopen"
icon_closed = "phoroncrate"
+
/obj/structure/closet/crate/secure/gear
name = "gear crate"
desc = "A secure gear crate."
@@ -420,6 +389,7 @@
icon_opened = "secgearcrateopen"
icon_closed = "secgearcrate"
+
/obj/structure/closet/crate/secure/hydrosec
name = "secure hydroponics crate"
desc = "A crate with a lock on it, painted in the scheme of the station's botanists."
@@ -427,6 +397,7 @@
icon_opened = "hydrosecurecrateopen"
icon_closed = "hydrosecurecrate"
+
/obj/structure/closet/crate/secure/engineering
desc = "A crate with a lock on it, painted in the scheme of the station's engineers."
name = "secure engineering crate"
@@ -434,6 +405,7 @@
icon_opened = "engi_secure_crateopen"
icon_closed = "engi_secure_crate"
+
/obj/structure/closet/crate/secure/science
name = "secure science crate"
desc = "A crate with a lock on it, painted in the scheme of the station's scientists."
@@ -441,6 +413,7 @@
icon_opened = "scisecurecrateopen"
icon_closed = "scisecurecrate"
+
/obj/structure/closet/crate/secure/bin
name = "secure bin"
desc = "A secure bin."
@@ -452,6 +425,7 @@
sparks = "largebinsparks"
emag = "largebinemag"
+
/obj/structure/closet/crate/large
name = "large crate"
desc = "A hefty metal crate."
@@ -460,6 +434,7 @@
icon_opened = "largemetalopen"
icon_closed = "largemetal"
+
/obj/structure/closet/crate/large/close()
. = ..()
if (.)//we can hold up to one large item
@@ -478,6 +453,7 @@
break
return
+
/obj/structure/closet/crate/secure/large
name = "large crate"
desc = "A hefty metal crate with an electronic locking system."
@@ -488,6 +464,7 @@
redlight = "largemetalr"
greenlight = "largemetalg"
+
/obj/structure/closet/crate/secure/large/close()
. = ..()
if (.)//we can hold up to one large item
@@ -506,6 +483,7 @@
break
return
+
//fluff variant
/obj/structure/closet/crate/secure/large/reinforced
desc = "A hefty, reinforced metal crate with an electronic locking system."
@@ -537,16 +515,8 @@
icon_opened = "hydrocrateopen"
icon_closed = "hydrocrate"
-/obj/structure/closet/crate/hydroponics/prespawned
- //This exists so the prespawned hydro crates spawn with their contents.
- New()
- ..()
- new /obj/item/weapon/reagent_containers/spray/plantbgone(src)
- new /obj/item/weapon/reagent_containers/spray/plantbgone(src)
- new /obj/item/weapon/material/minihoe(src)
-// new /obj/item/weapon/weedspray(src)
-// new /obj/item/weapon/weedspray(src)
-// new /obj/item/weapon/pestspray(src)
-// new /obj/item/weapon/pestspray(src)
-// new /obj/item/weapon/pestspray(src)
+/obj/structure/closet/crate/hydroponics/prespawned
+ starts_with = list(
+ /obj/item/weapon/reagent_containers/spray/plantbgone = 2,
+ /obj/item/weapon/material/minihoe)
diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index c4e9ece866..b48636f9ba 100644
--- a/code/game/objects/structures/crates_lockers/largecrate.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate.dm
@@ -4,9 +4,13 @@
icon = 'icons/obj/storage.dmi'
icon_state = "densecrate"
density = 1
+ var/list/starts_with
/obj/structure/largecrate/initialize()
. = ..()
+ if(starts_with)
+ create_objects_in_loc(src, starts_with)
+ starts_with = null
for(var/obj/I in src.loc)
if(I.density || I.anchored || I == src || !I.simulated)
continue
@@ -17,7 +21,7 @@
return
/obj/structure/largecrate/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/crowbar))
+ if(W.is_crowbar())
new /obj/item/stack/material/wood(src)
var/turf/T = get_turf(src)
for(var/atom/movable/AM in contents)
@@ -38,7 +42,7 @@
icon_state = "mulecrate"
/obj/structure/largecrate/hoverpod/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/crowbar))
+ if(W.is_crowbar())
var/obj/item/mecha_parts/mecha_equipment/ME
var/obj/mecha/working/hoverpod/H = new (loc)
@@ -50,38 +54,30 @@
/obj/structure/largecrate/animal
icon_state = "mulecrate"
- var/held_count = 1
- var/held_type
-
-/obj/structure/largecrate/animal/New()
- ..()
- for(var/i = 1;i<=held_count;i++)
- new held_type(src)
/obj/structure/largecrate/animal/mulebot
name = "Mulebot crate"
- held_type = /mob/living/bot/mulebot
+ starts_with = list(/mob/living/bot/mulebot)
/obj/structure/largecrate/animal/corgi
name = "corgi carrier"
- held_type = /mob/living/simple_animal/corgi
+ starts_with = list(/mob/living/simple_animal/corgi)
/obj/structure/largecrate/animal/cow
name = "cow crate"
- held_type = /mob/living/simple_animal/cow
+ starts_with = list(/mob/living/simple_animal/cow)
/obj/structure/largecrate/animal/goat
name = "goat crate"
- held_type = /mob/living/simple_animal/retaliate/goat
+ starts_with = list(/mob/living/simple_animal/retaliate/goat)
/obj/structure/largecrate/animal/cat
name = "cat carrier"
- held_type = /mob/living/simple_animal/cat
+ starts_with = list(/mob/living/simple_animal/cat)
/obj/structure/largecrate/animal/cat/bones
- held_type = /mob/living/simple_animal/cat/fluff/bones
+ starts_with = list(/mob/living/simple_animal/cat/fluff/bones)
/obj/structure/largecrate/animal/chick
name = "chicken crate"
- held_count = 5
- held_type = /mob/living/simple_animal/chick
+ starts_with = list(/mob/living/simple_animal/chick = 5)
diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm
index af129800b7..78095631de 100644
--- a/code/game/objects/structures/curtains.dm
+++ b/code/game/objects/structures/curtains.dm
@@ -2,13 +2,15 @@
name = "curtain"
icon = 'icons/obj/curtain.dmi'
icon_state = "closed"
- layer = SHOWER_OPEN_LAYER
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
opacity = 1
density = 0
/obj/structure/curtain/open
icon_state = "open"
- layer = SHOWER_CLOSED_LAYER
+ plane = OBJ_PLANE
+ layer = OBJ_LAYER
opacity = 0
/obj/structure/curtain/bullet_act(obj/item/projectile/P, def_zone)
@@ -27,13 +29,15 @@
set_opacity(!opacity)
if(opacity)
icon_state = "closed"
- layer = SHOWER_CLOSED_LAYER
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
else
icon_state = "open"
- layer = SHOWER_OPEN_LAYER
+ plane = OBJ_PLANE
+ layer = OBJ_LAYER
/obj/structure/curtain/attackby(obj/item/P, mob/user)
- if(istype(P, /obj/item/weapon/wirecutters))
+ if(P.is_wirecutter())
playsound(src, P.usesound, 50, 1)
user << "You start to cut the shower curtains."
if(do_after(user, 10))
@@ -76,6 +80,3 @@
/obj/structure/curtain/open/shower/security
color = "#AA0000"
-
-#undef SHOWER_OPEN_LAYER
-#undef SHOWER_CLOSED_LAYER
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 87957b4d4d..f8ea5d2f77 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -200,7 +200,7 @@
to_chat(user, "You need more welding fuel.")
return
- else if(istype(W, /obj/item/weapon/wrench) && state == 0)
+ else if(W.is_wrench() && state == 0)
playsound(src, W.usesound, 100, 1)
if(anchored)
user.visible_message("[user] begins unsecuring the airlock assembly from the floor.", "You starts unsecuring the airlock assembly from the floor.")
@@ -223,7 +223,7 @@
src.state = 1
to_chat(user, "You wire the airlock.")
- else if(istype(W, /obj/item/weapon/wirecutters) && state == 1 )
+ else if(W.is_wirecutter() && state == 1 )
playsound(src, W.usesound, 100, 1)
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
@@ -245,7 +245,7 @@
src.state = 2
src.electronics = W
- else if(istype(W, /obj/item/weapon/crowbar) && state == 2 )
+ else if(W.is_crowbar() && state == 2 )
//This should never happen, but just in case I guess
if (!electronics)
to_chat(user, "There was nothing to remove.")
@@ -287,7 +287,7 @@
to_chat(user, "You installed [material_display_name(material_name)] plating into the airlock assembly.")
glass = material_name
- else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 )
+ else if(W.is_screwdriver() && state == 2 )
playsound(src, W.usesound, 100, 1)
to_chat(user, "Now finishing the airlock.")
diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm
index e9483386cf..1cd43b7910 100644
--- a/code/game/objects/structures/electricchair.dm
+++ b/code/game/objects/structures/electricchair.dm
@@ -12,7 +12,7 @@
return
/obj/structure/bed/chair/e_chair/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
var/obj/structure/bed/chair/C = new /obj/structure/bed/chair(loc)
playsound(src, W.usesound, 50, 1)
C.set_dir(dir)
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index bfbc34dcee..2be63df8e7 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -3,6 +3,8 @@
desc = "A small wall mounted cabinet designed to hold a fire extinguisher."
icon = 'icons/obj/closet.dmi'
icon_state = "extinguisher_closed"
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
anchored = 1
density = 0
var/obj/item/weapon/extinguisher/has_extinguisher
@@ -33,7 +35,7 @@
user << "You place [O] in [src]."
else
opened = !opened
- if(istype(O, /obj/item/weapon/wrench))
+ if(O.is_wrench())
if(!has_extinguisher)
user << "You start to unwrench the extinguisher cabinet."
playsound(src.loc, O.usesound, 50, 1)
diff --git a/code/game/objects/structures/fitness.dm b/code/game/objects/structures/fitness.dm
index d29ad16f74..158bf5533b 100644
--- a/code/game/objects/structures/fitness.dm
+++ b/code/game/objects/structures/fitness.dm
@@ -33,7 +33,7 @@
var/list/qualifiers = list("with ease", "without any trouble", "with great effort")
/obj/structure/fitness/weightlifter/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1)
weight = ((weight) % qualifiers.len) + 1
to_chat(user, "You set the machine's weight level to [weight].")
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index c95b5af2c9..25febad1a3 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -197,7 +197,7 @@
desc = "This is an unusual plant. It's bulbous ends emit a soft blue light."
icon_state = "plant-09"
light_range = 2
- light_power = 1
+ light_power = 0.6
light_color = "#33CCFF"
/obj/structure/flora/pottedplant/orientaltree
@@ -255,7 +255,7 @@
desc = "This is a subterranean plant. It's bulbous ends glow faintly."
icon_state = "plant-20"
light_range = 2
- light_power = 1
+ light_power = 0.6
light_color = "#FF6633"
/obj/structure/flora/pottedplant/minitree
@@ -301,7 +301,7 @@
desc = "This is a subterranean plant. It's bulbous ends glow faintly."
icon_state = "glowplant"
light_range = 2
- light_power = 1
+ light_power = 0.6
light_color = "#FF6633"
/obj/structure/flora/sif/subterranean/initialize()
@@ -315,4 +315,4 @@
/obj/structure/flora/sif/eyes/initialize()
icon_state = "[initial(icon_state)][rand(1,3)]"
- . = ..()
\ No newline at end of file
+ . = ..()
diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm
index ef58518e48..8b7f5bf042 100644
--- a/code/game/objects/structures/flora/trees.dm
+++ b/code/game/objects/structures/flora/trees.dm
@@ -4,7 +4,8 @@
anchored = 1
density = 1
pixel_x = -16
- layer = MOB_LAYER // You know what, let's play it safe.
+ plane = MOB_PLANE // You know what, let's play it safe.
+ layer = ABOVE_MOB_LAYER
var/base_state = null // Used for stumps.
var/health = 200 // Used for chopping down trees.
var/max_health = 200
@@ -51,12 +52,12 @@
animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING)
// Used when the tree gets hurt.
-/obj/structure/flora/tree/proc/adjust_health(var/amount, var/is_ranged = FALSE)
+/obj/structure/flora/tree/proc/adjust_health(var/amount, var/damage_wood = FALSE)
if(is_stump)
return
// Bullets and lasers ruin some of the wood
- if(is_ranged && product_amount > 0)
+ if(damage_wood && product_amount > 0)
var/wood = initial(product_amount)
product_amount -= round(wood * (abs(amount)/max_health))
@@ -89,12 +90,16 @@
set_light(0)
/obj/structure/flora/tree/ex_act(var/severity)
- adjust_health(-(max_health / severity))
+ adjust_health(-(max_health / severity), TRUE)
/obj/structure/flora/tree/bullet_act(var/obj/item/projectile/Proj)
if(Proj.get_structure_damage())
adjust_health(-Proj.get_structure_damage(), TRUE)
+/obj/structure/flora/tree/tesla_act(power, explosive)
+ adjust_health(-power / 100, TRUE) // Kills most trees in one lightning strike.
+ ..()
+
/obj/structure/flora/tree/get_description_interaction()
var/list/results = list()
diff --git a/code/game/objects/structures/ghost_pods/mysterious.dm b/code/game/objects/structures/ghost_pods/mysterious.dm
new file mode 100644
index 0000000000..2e6a11a8bb
--- /dev/null
+++ b/code/game/objects/structures/ghost_pods/mysterious.dm
@@ -0,0 +1,50 @@
+/obj/structure/ghost_pod/manual/corgi
+ name = "glowing rune"
+ desc = "This rune slowly lights up and goes dim in a repeating pattern, like a slow heartbeat. It's almost as if it's calling out to you to touch it..."
+ description_info = "This will summon some manner of creature through quite dubious means. The creature will be controlled by a player."
+ icon_state = "corgirune"
+ icon_state_opened = "corgirune-inert"
+ density = FALSE
+ anchored = TRUE
+ ghost_query_type = /datum/ghost_query/corgi_rune
+ confirm_before_open = TRUE
+
+/obj/structure/ghost_pod/manual/corgi/trigger()
+ ..("\The [usr] places their hand on the rune!", "is attempting to summon a corgi.")
+
+/obj/structure/ghost_pod/manual/corgi/create_occupant(var/mob/M)
+ lightning_strike(get_turf(src), cosmetic = TRUE)
+ density = FALSE
+ var/mob/living/simple_animal/corgi/R = new(get_turf(src))
+ if(M.mind)
+ M.mind.transfer_to(R)
+ to_chat(M, "You are a Corgi! Woof!")
+ R.ckey = M.ckey
+ visible_message("With a bright flash of light, \the [src] disappears, and in its place stands a small corgi.")
+ log_and_message_admins("successfully touched \a [src] and summoned a corgi.")
+ ..()
+
+/obj/structure/ghost_pod/manual/cursedblade
+ name = "abandoned blade"
+ desc = "A red crystal blade that someone jammed deep into a stone. If you try hard enough, you might be able to remove it."
+ icon_state = "soulblade-embedded"
+ icon_state_opened = "soulblade-released"
+ density = TRUE
+ anchored = TRUE
+ ghost_query_type = /datum/ghost_query/cursedblade
+ confirm_before_open = TRUE
+
+/obj/structure/ghost_pod/manual/cursedblade/trigger()
+ ..("\The [usr] attempts to pull out the sword!", "is activating a cursed blade.")
+
+/obj/structure/ghost_pod/manual/cursedblade/create_occupant(var/mob/M)
+ density = FALSE
+ var/obj/item/weapon/melee/cursedblade/R = new(get_turf(src))
+ to_chat(M, "You are a Cursed Sword, discovered by a hapless explorer. \
+ You were once an explorer yourself, when one day you discovered a strange sword made from a red crystal. As soon as you touched it,\
+ your body was reduced to ashes and your soul was cursed to remain trapped in the blade forever. \
+ Now it is up to you to decide whether you want to be a faithful companion, or a bitter prisoner of the blade.")
+ R.ghost_inhabit(M)
+ visible_message("The blade shines brightly for a brief moment as [usr] pulls it out of the stone!")
+ log_and_message_admins("successfully acquired a cursed sword.")
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/structures/ghost_pods/silicon.dm b/code/game/objects/structures/ghost_pods/silicon.dm
index 1e7210a1ec..8fd3fcea7c 100644
--- a/code/game/objects/structures/ghost_pods/silicon.dm
+++ b/code/game/objects/structures/ghost_pods/silicon.dm
@@ -58,54 +58,4 @@
R.ckey = M.ckey
visible_message("As \the [src] opens, the eyes of the robot flicker as it is activated.")
R.Namepick()
- ..()
-
-/obj/structure/ghost_pod/manual/corgi
- name = "glowing rune"
- desc = "This rune slowly lights up and goes dim in a repeating pattern, like a slow heartbeat. It's almost as if it's calling out to you to touch it..."
- description_info = "This will summon some manner of creature through quite dubious means. The creature will be controlled by a player."
- icon_state = "corgirune"
- icon_state_opened = "corgirune-inert"
- density = FALSE
- anchored = TRUE
- ghost_query_type = /datum/ghost_query/corgi_rune
- confirm_before_open = TRUE
-
-/obj/structure/ghost_pod/manual/corgi/trigger()
- ..("\The [usr] places their hand on the rune!", "is attempting to summon a corgi.")
-
-/obj/structure/ghost_pod/manual/corgi/create_occupant(var/mob/M)
- density = FALSE
- var/mob/living/simple_animal/corgi/R = new(get_turf(src))
- if(M.mind)
- M.mind.transfer_to(R)
- to_chat(M, "You are a Corgi! Woof!")
- R.ckey = M.ckey
- visible_message("With a bright flash of light, \the [src] disappears, and in its place stands a small corgi.")
- log_and_message_admins("successfully touched \a [src] and summoned a corgi.")
- ..()
-
-/obj/structure/ghost_pod/manual/cursedblade
- name = "abandoned blade"
- desc = "A red crystal blade that someone jammed deep into a stone. If you try hard enough, you might be able to remove it."
- icon_state = "soulblade-embedded"
- icon_state_opened = "soulblade-released"
- density = TRUE
- anchored = TRUE
- ghost_query_type = /datum/ghost_query/cursedblade
- confirm_before_open = TRUE
-
-/obj/structure/ghost_pod/manual/cursedblade/trigger()
- ..("\The [usr] attempts to pull out the sword!", "is activating a cursed blade.")
-
-/obj/structure/ghost_pod/manual/cursedblade/create_occupant(var/mob/M)
- density = FALSE
- var/obj/item/weapon/melee/cursedblade/R = new(get_turf(src))
- to_chat(M, "You are a Cursed Sword, discovered by a hapless explorer. \
- You were once an explorer yourself, when one day you discovered a strange sword made from a red crystal. As soon as you touched it,\
- your body was reduced to ashes and your soul was cursed to remain trapped in the blade forever. \
- Now it is up to you to decide whether you want to be a faithful companion, or a bitter prisoner of the blade.")
- R.ghost_inhabit(M)
- visible_message("The blade shines brightly for a brief moment as [usr] pulls it out of the stone!")
- log_and_message_admins("successfully acquired a cursed sword.")
..()
\ No newline at end of file
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index a22bbae0d2..311e07d0c6 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -144,7 +144,7 @@
reinforce_girder()
/obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench) && state == 0)
+ if(W.is_wrench() && state == 0)
if(anchored && !reinf_material)
playsound(src, W.usesound, 100, 1)
to_chat(user, "Now disassembling the girder...")
@@ -170,7 +170,7 @@
to_chat(user, "You drill through the girder!")
dismantle()
- else if(istype(W, /obj/item/weapon/screwdriver))
+ else if(W.is_screwdriver())
if(state == 2)
playsound(src, W.usesound, 100, 1)
to_chat(user, "Now unsecuring support struts...")
@@ -183,7 +183,7 @@
reinforcing = !reinforcing
to_chat(user, "\The [src] can now be [reinforcing? "reinforced" : "constructed"]!")
- else if(istype(W, /obj/item/weapon/wirecutters) && state == 1)
+ else if(W.is_wirecutter() && state == 1)
playsound(src, W.usesound, 100, 1)
to_chat(user, "Now removing support struts...")
if(do_after(user,40 * W.toolspeed))
@@ -193,7 +193,7 @@
reinf_material = null
reset_girder()
- else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored)
+ else if(W.is_crowbar() && state == 0 && anchored)
playsound(src, W.usesound, 100, 1)
to_chat(user, "Now dislodging the girder...")
if(do_after(user, 40 * W.toolspeed))
@@ -329,7 +329,7 @@
qdel(src)
/obj/structure/girder/cult/attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
playsound(src, W.usesound, 100, 1)
to_chat(user, "Now disassembling the girder...")
if(do_after(user,40 * W.toolspeed))
diff --git a/code/game/objects/structures/gravemarker.dm b/code/game/objects/structures/gravemarker.dm
index e20591b939..7ef0d49a51 100644
--- a/code/game/objects/structures/gravemarker.dm
+++ b/code/game/objects/structures/gravemarker.dm
@@ -56,7 +56,7 @@
return 1
/obj/structure/gravemarker/attackby(obj/item/weapon/W, mob/user as mob)
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
var/carving_1 = sanitizeSafe(input(user, "Who is \the [src.name] for?", "Gravestone Naming", null) as text, MAX_NAME_LEN)
if(carving_1)
user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].")
@@ -72,7 +72,7 @@
epitaph += carving_2
update_icon()
return
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
user.visible_message("[user] starts taking down \the [src.name].", "You start taking down \the [src.name].")
if(do_after(user, material.hardness * W.toolspeed))
user.visible_message("[user] takes down \the [src.name].", "You take down \the [src.name].")
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index ee80999916..8b16105815 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -7,7 +7,7 @@
anchored = 1
flags = CONDUCT
pressure_resistance = 5*ONE_ATMOSPHERE
- layer = UNDER_JUNK_LAYER
+ layer = TABLE_LAYER
explosion_resistance = 1
var/health = 10
var/destroyed = 0
@@ -94,12 +94,12 @@
spawn(0) healthcheck() //spawn to make sure we return properly if the grille is deleted
/obj/structure/grille/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(iswirecutter(W))
+ if(W.is_wirecutter())
if(!shock(user, 100))
playsound(src, W.usesound, 100, 1)
new /obj/item/stack/rods(get_turf(src), destroyed ? 1 : 2)
qdel(src)
- else if((isscrewdriver(W)) && (istype(loc, /turf/simulated) || anchored))
+ else if((W.is_screwdriver()) && (istype(loc, /turf/simulated) || anchored))
if(!shock(user, 90))
playsound(src, W.usesound, 100, 1)
anchored = !anchored
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index b037ecf4e7..4c1bc63618 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -1,3 +1,5 @@
+GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
+
/obj/structure/janitorialcart
name = "janitorial cart"
desc = "The ultimate in janitorial carts! Has space for water, mops, signs, trash bags, and more!"
@@ -18,6 +20,7 @@
/obj/structure/janitorialcart/New()
create_reagents(300)
+ ..()
/obj/structure/janitorialcart/examine(mob/user)
diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm
index 353dbe31a7..60807e253d 100644
--- a/code/game/objects/structures/loot_piles.dm
+++ b/code/game/objects/structures/loot_piles.dm
@@ -365,9 +365,9 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
/obj/item/device/gps,
/obj/item/device/geiger,
/obj/item/device/mass_spectrometer,
- /obj/item/weapon/wrench,
- /obj/item/weapon/screwdriver,
- /obj/item/weapon/wirecutters,
+ /obj/item/weapon/tool/wrench,
+ /obj/item/weapon/tool/screwdriver,
+ /obj/item/weapon/tool/wirecutters,
/obj/item/device/multitool,
/obj/item/mecha_parts/mecha_equipment/generator,
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer,
@@ -450,11 +450,11 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
uncommon_loot = list(
/obj/item/device/multitool/alien,
/obj/item/stack/cable_coil/alien,
- /obj/item/weapon/crowbar/alien,
- /obj/item/weapon/screwdriver/alien,
+ /obj/item/weapon/tool/crowbar/alien,
+ /obj/item/weapon/tool/screwdriver/alien,
/obj/item/weapon/weldingtool/alien,
- /obj/item/weapon/wirecutters/alien,
- /obj/item/weapon/wrench/alien
+ /obj/item/weapon/tool/wirecutters/alien,
+ /obj/item/weapon/tool/wrench/alien
)
rare_loot = list(
/obj/item/weapon/storage/belt/utility/alien/full
@@ -496,11 +496,11 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
common_loot = list(
/obj/item/device/multitool/alien,
/obj/item/stack/cable_coil/alien,
- /obj/item/weapon/crowbar/alien,
- /obj/item/weapon/screwdriver/alien,
+ /obj/item/weapon/tool/crowbar/alien,
+ /obj/item/weapon/tool/screwdriver/alien,
/obj/item/weapon/weldingtool/alien,
- /obj/item/weapon/wirecutters/alien,
- /obj/item/weapon/wrench/alien,
+ /obj/item/weapon/tool/wirecutters/alien,
+ /obj/item/weapon/tool/wrench/alien,
/obj/item/weapon/surgical/FixOVein/alien,
/obj/item/weapon/surgical/bone_clamp/alien,
/obj/item/weapon/surgical/cautery/alien,
@@ -830,3 +830,42 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
/obj/item/mecha_parts/mecha_equipment/repair_droid,
/obj/item/mecha_parts/mecha_equipment/teleporter
)
+
+/obj/structure/loot_pile/surface/drone
+ name = "drone wreckage"
+ desc = "The ruins of some unfortunate drone. Perhaps something is salvageable."
+ icon = 'icons/mob/animal.dmi'
+ icon_state = "drone_dead"
+
+// Since the actual drone loot is a bit stupid in how it is handled, this is a sparse and empty list with items I don't exactly want in it. But until we can get the proper items in . . .
+
+ common_loot = list(
+ /obj/random/tool,
+ /obj/item/stack/cable_coil/random,
+ /obj/random/tank,
+ /obj/random/tech_supply/component,
+ /obj/item/stack/material/steel{amount = 25},
+ /obj/item/stack/material/glass{amount = 10},
+ /obj/item/stack/material/plasteel{amount = 5},
+ /obj/item/weapon/cell,
+ /obj/item/weapon/material/shard
+ )
+
+ uncommon_loot = list(
+ /obj/item/weapon/cell/high,
+ /obj/item/robot_parts/robot_component/actuator,
+ /obj/item/robot_parts/robot_component/armour,
+ /obj/item/robot_parts/robot_component/binary_communication_device,
+ /obj/item/robot_parts/robot_component/camera,
+ /obj/item/robot_parts/robot_component/diagnosis_unit,
+ /obj/item/robot_parts/robot_component/radio
+ )
+
+ rare_loot = list(
+ /obj/item/weapon/cell/super,
+ /obj/item/borg/upgrade/restart,
+ /obj/item/borg/upgrade/jetpack,
+ /obj/item/borg/upgrade/tasercooler,
+ /obj/item/borg/upgrade/syndicate,
+ /obj/item/borg/upgrade/vtec
+ )
\ No newline at end of file
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 1e8237cdfd..3011d2c61d 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -49,24 +49,24 @@
..()
/obj/structure/mirror/attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I, /obj/item/weapon/wrench))
+ if(I.is_wrench())
if(!glass)
playsound(src.loc, I.usesound, 50, 1)
if(do_after(user, 20 * I.toolspeed))
- user << "You unfasten the frame."
+ to_chat(user, "You unfasten the frame.")
new /obj/item/frame/mirror( src.loc )
qdel(src)
return
- if(istype(I, /obj/item/weapon/crowbar))
+ if(I.is_wrench())
if(shattered && glass)
- user << "The broken glass falls out."
+ to_chat(user, "The broken glass falls out.")
icon_state = "mirror_frame"
glass = !glass
new /obj/item/weapon/material/shard( src.loc )
return
if(!shattered && glass)
playsound(src.loc, I.usesound, 50, 1)
- user << "You remove the glass."
+ to_chat(user, "You remove the glass.")
glass = !glass
icon_state = "mirror_frame"
new /obj/item/stack/material/glass( src.loc, 2 )
@@ -76,15 +76,15 @@
if(!glass)
var/obj/item/stack/material/glass/G = I
if (G.get_amount() < 2)
- user << "You need two sheets of glass to add them to the frame."
+ to_chat(user, "You need two sheets of glass to add them to the frame.")
return
- user << "You start to add the glass to the frame."
+ to_chat(user, "You start to add the glass to the frame.")
if(do_after(user, 20))
if (G.use(2))
shattered = 0
glass = 1
icon_state = "mirror"
- user << "You add the glass to the frame."
+ to_chat(user, "You add the glass to the frame.")
return
if(shattered && glass)
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index e7b90cd657..714f2cbfc9 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -10,6 +10,7 @@
flags = OPENCONTAINER
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
+GLOBAL_LIST_BOILERPLATE(all_mopbuckets, /obj/structure/mopbucket)
/obj/structure/mopbucket/New()
create_reagents(300)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index d0324c98bf..9322c8656e 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -196,6 +196,8 @@
* Crematorium
*/
+GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium)
+
/obj/structure/morgue/crematorium
name = "crematorium"
desc = "A human incinerator. Works well on barbeque nights."
@@ -342,7 +344,7 @@
if(..())
return
if(src.allowed(user))
- for (var/obj/structure/morgue/crematorium/C in world)
+ for (var/obj/structure/morgue/crematorium/C in all_crematoriums)
if (C.id == id)
if (!C.cremating)
C.cremate(user)
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index 3b36cb0087..130c591613 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -429,8 +429,8 @@
return
/obj/structure/device/piano/attackby(obj/item/O as obj, mob/user as mob)
- if (istype(O, /obj/item/weapon/wrench))
- if (anchored)
+ if(O.is_wrench())
+ if(anchored)
playsound(src.loc, O.usesound, 50, 1)
user << "You begin to loosen \the [src]'s casters..."
if (do_after(user, 40 * O.toolspeed))
diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm
index 0a26e568ec..64ef2f926b 100644
--- a/code/game/objects/structures/noticeboard.dm
+++ b/code/game/objects/structures/noticeboard.dm
@@ -41,7 +41,7 @@
user << "You pin the paper to the noticeboard."
else
user << "You reach to pin your paper to the board but hesitate. You are certain your paper will not be seen among the many others already attached."
- if(istype(O, /obj/item/weapon/wrench))
+ if(O.is_wrench())
user << "You start to unwrench the noticeboard."
playsound(src.loc, O.usesound, 50, 1)
if(do_after(user, 15 * O.toolspeed))
diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm
new file mode 100644
index 0000000000..0340356e37
--- /dev/null
+++ b/code/game/objects/structures/plasticflaps.dm
@@ -0,0 +1,78 @@
+/obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY
+ name = "\improper plastic flaps"
+ desc = "Completely impassable - or are they?"
+ icon = 'icons/obj/stationobjs.dmi' //Change this.
+ icon_state = "plasticflaps"
+ density = 0
+ anchored = 1
+ layer = MOB_LAYER
+ plane = MOB_PLANE
+ explosion_resistance = 5
+ var/list/mobs_can_pass = list(
+ /mob/living/bot,
+ /mob/living/simple_animal/slime,
+ /mob/living/simple_animal/mouse,
+ /mob/living/silicon/robot/drone
+ )
+
+/obj/structure/plasticflaps/attackby(obj/item/P, mob/user)
+ if(P.is_wirecutter())
+ playsound(src, P.usesound, 50, 1)
+ user << "You start to cut the plastic flaps."
+ if(do_after(user, 10 * P.toolspeed))
+ user << "You cut the plastic flaps."
+ var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc )
+ A.amount = 4
+ qdel(src)
+ return
+ else
+ return
+
+/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
+ if(istype(A) && A.checkpass(PASSGLASS))
+ return prob(60)
+
+ var/obj/structure/bed/B = A
+ if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass
+ return 0
+
+ if(istype(A, /obj/vehicle)) //no vehicles
+ return 0
+
+ var/mob/living/M = A
+ if(istype(M))
+ if(M.lying)
+ return ..()
+ for(var/mob_type in mobs_can_pass)
+ if(istype(A, mob_type))
+ return ..()
+ return issmall(M)
+
+ return ..()
+
+/obj/structure/plasticflaps/ex_act(severity)
+ switch(severity)
+ if (1)
+ qdel(src)
+ if (2)
+ if (prob(50))
+ qdel(src)
+ if (3)
+ if (prob(5))
+ qdel(src)
+
+/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates
+ name = "airtight plastic flaps"
+ desc = "Heavy duty, airtight, plastic flaps."
+
+/obj/structure/plasticflaps/mining/New() //set the turf below the flaps to block air
+ var/turf/T = get_turf(loc)
+ if(T)
+ T.blocks_air = 1
+ ..()
+
+/obj/structure/plasticflaps/mining/Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor
+ var/turf/T = get_turf(loc)
+ if(T && istype(T, /turf/simulated/floor))
+ T.blocks_air = 0
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/structures/alien_props.dm b/code/game/objects/structures/props/alien_props.dm
similarity index 90%
rename from code/game/objects/structures/alien_props.dm
rename to code/game/objects/structures/props/alien_props.dm
index eb8ae9d19f..fa11e27b15 100644
--- a/code/game/objects/structures/alien_props.dm
+++ b/code/game/objects/structures/props/alien_props.dm
@@ -6,15 +6,6 @@
icon = 'icons/obj/abductor.dmi'
density = TRUE
anchored = TRUE
- var/interaction_message = null
-
-/obj/structure/prop/alien/attack_hand(mob/living/user) // Used to tell the player that this isn't useful for anything.
- if(!istype(user))
- return FALSE
- if(!interaction_message)
- return ..()
- else
- to_chat(user, interaction_message)
/obj/structure/prop/alien/computer
name = "alien console"
diff --git a/code/game/objects/structures/props/beam_prism.dm b/code/game/objects/structures/props/beam_prism.dm
new file mode 100644
index 0000000000..44df2eb68b
--- /dev/null
+++ b/code/game/objects/structures/props/beam_prism.dm
@@ -0,0 +1,215 @@
+//A series(?) of prisms for PoIs. The base one only works for beams.
+
+/obj/structure/prop/prism
+ name = "prismatic turret"
+ desc = "A raised, externally powered 'turret'. It seems to have a massive crystal ring around its base."
+ description_info = "This device is capable of redirecting any beam projectile."
+ icon = 'icons/obj/props/prism.dmi'
+ icon_state = "prism"
+ density = TRUE
+ anchored = TRUE
+
+ layer = 3.1 //Layer over projectiles.
+ plane = -10 //Layer over projectiles.
+
+ var/rotation_lock = 0 // Can you rotate the prism at all?
+ var/free_rotate = 1 // Does the prism rotate in any direction, or only in the eight standard compass directions?
+ var/external_control_lock = 0 // Does the prism only rotate from the controls of an external switch?
+ var/degrees_from_north = 0 // How far is it rotated clockwise?
+ var/compass_directions = list("North" = 0, "South" = 180, "East" = 90, "West" = 270, "Northwest" = 315, "Northeast" = 45, "Southeast" = 135, "Southwest" = 225)
+ var/interaction_sound = 'sound/mecha/mechmove04.ogg'
+
+ var/redirect_type = /obj/item/projectile/beam
+
+ var/dialID = null
+ var/obj/structure/prop/prismcontrol/remote_dial = null
+
+ interaction_message = "The prismatic turret seems to be able to rotate."
+
+/obj/structure/prop/prism/initialize()
+ if(degrees_from_north)
+ animate(src, transform = turn(NORTH, degrees_from_north), time = 3)
+
+/obj/structure/prop/prism/Destroy()
+ if(remote_dial)
+ remote_dial.my_turrets -= src
+ remote_dial = null
+ ..()
+
+/obj/structure/prop/prism/proc/reset_rotation()
+ var/degrees_to_rotate = -1 * degrees_from_north
+ animate(src, transform = turn(src.transform, degrees_to_rotate), time = 2)
+
+/obj/structure/prop/prism/attack_hand(mob/living/user)
+ ..()
+
+ if(rotation_lock)
+ to_chat(user, "\The [src] is locked at its current bearing.")
+ return
+ if(external_control_lock)
+ to_chat(user, "\The [src]'s motors resist your efforts to rotate it. You may need to find some form of controller.")
+ return
+
+ var/confirm = input("Do you want to try to rotate \the [src]?", "[name]") in list("Yes", "No")
+ if(confirm == "No")
+ visible_message(\
+ "[user.name] decides not to try turning \the [src].",\
+ "You decide not to try turning \the [src].")
+ return
+
+ var/new_bearing
+ if(free_rotate)
+ new_bearing = input("What bearing do you want to rotate \the [src] to?", "[name]") as num
+ new_bearing = round(new_bearing)
+ if(new_bearing <= -1 || new_bearing > 360)
+ to_chat(user, "Rotating \the [src] [new_bearing] degrees would be a waste of time.")
+ return
+ else
+ var/choice = input("What point do you want to set \the [src] to?", "[name]") as null|anything in compass_directions
+ new_bearing = round(compass_directions[choice])
+
+ var/rotate_degrees = new_bearing - degrees_from_north
+
+ if(new_bearing == 360) // Weird artifact.
+ new_bearing = 0
+ degrees_from_north = new_bearing
+
+ var/two_stage = 0
+ if(rotate_degrees == 180 || rotate_degrees == -180)
+ two_stage = 1
+ var/multiplier = pick(-1, 1)
+ rotate_degrees = multiplier * (rotate_degrees / 2)
+
+ playsound(src, interaction_sound, 50, 1)
+ if(two_stage)
+ animate(src, transform = turn(src.transform, rotate_degrees), time = 3)
+ spawn(3)
+ animate(src, transform = turn(src.transform, rotate_degrees), time = 3)
+ else
+ animate(src, transform = turn(src.transform, rotate_degrees), time = 6) //Can't update transform because it will reset the angle.
+
+/obj/structure/prop/prism/proc/rotate_auto(var/new_bearing)
+ if(rotation_lock)
+ visible_message("\The [src] shudders.")
+ playsound(src, 'sound/effects/clang.ogg', 50, 1)
+ return
+
+ visible_message("\The [src] rotates to a bearing of [new_bearing].")
+
+ var/rotate_degrees = new_bearing - degrees_from_north
+
+ if(new_bearing == 360)
+ new_bearing = 0
+ degrees_from_north = new_bearing
+
+ var/two_stage = 0
+ if(rotate_degrees == 180 || rotate_degrees == -180)
+ two_stage = 1
+ var/multiplier = pick(-1, 1)
+ rotate_degrees = multiplier * (rotate_degrees / 2)
+
+ playsound(src, interaction_sound, 50, 1)
+ if(two_stage)
+ animate(src, transform = turn(src.transform, rotate_degrees), time = 3)
+ spawn(3)
+ animate(src, transform = turn(src.transform, rotate_degrees), time = 3)
+ else
+ animate(src, transform = turn(src.transform, rotate_degrees), time = 6)
+
+/obj/structure/prop/prism/bullet_act(var/obj/item/projectile/Proj)
+ if(istype(Proj, redirect_type))
+ visible_message("\The [src] redirects \the [Proj]!")
+ flick("[initial(icon_state)]+glow", src)
+
+ var/new_x = (1 * round(10 * cos(degrees_from_north - 90))) + x //Vectors vectors vectors.
+ var/new_y = (-1 * round(10 * sin(degrees_from_north - 90))) + y
+ var/turf/curloc = get_turf(src)
+
+ Proj.penetrating += 1 // Needed for the beam to get out of the turret.
+
+ Proj.redirect(new_x, new_y, curloc, null)
+
+/obj/structure/prop/prism/incremental
+ free_rotate = 0
+ description_info = "This device is capable of redirecting any beam projectile, but only locks to specific positions in rotation."
+
+/obj/structure/prop/prism/incremental/externalcont
+ external_control_lock = 1
+ description_info = "This device is capable of redirecting any beam projectile, but can only be rotated by a control dial to specific positions."
+
+/obj/structure/prop/prism/externalcont
+ external_control_lock = 1
+ description_info = "This device is capable of redirecting any beam projectile, but can only be rotated by an external control dial."
+
+/obj/structure/prop/prismcontrol
+ name = "prismatic dial"
+ desc = "A large dial with a crystalline ring."
+ icon = 'icons/obj/props/prism.dmi'
+ icon_state = "dial"
+ density = FALSE
+ anchored = TRUE
+
+ interaction_message = "The dial pulses as your hand nears it."
+ var/list/my_turrets = list()
+ var/dialID = null
+
+/obj/structure/prop/prismcontrol/attack_hand(mob/living/user)
+ ..()
+
+ var/confirm = input("Do you want to try to rotate \the [src]?", "[name]") in list("Yes", "No")
+ if(confirm == "No")
+ visible_message(\
+ "[user.name] decides not to try turning \the [src].",\
+ "You decide not to try turning \the [src].")
+ return
+
+ if(!my_turrets || !my_turrets.len)
+ to_chat(user, "\The [src] doesn't seem to do anything.")
+ return
+
+ var/free_rotate = 1
+ var/list/compass_directions = list()
+ for(var/obj/structure/prop/prism/P in my_turrets)
+ if(!P.free_rotate) //Doesn't use bearing, it uses compass points.
+ free_rotate = 0
+ compass_directions |= P.compass_directions
+
+ var/new_bearing
+ if(free_rotate)
+ new_bearing = input("What bearing do you want to rotate \the [src] to?", "[name]") as num
+ new_bearing = round(new_bearing)
+ if(new_bearing <= -1 || new_bearing > 360)
+ to_chat(user, "Rotating \the [src] [new_bearing] degrees would be a waste of time.")
+ return
+ else
+ var/choice = input("What point do you want to set \the [src] to?", "[name]") as null|anything in compass_directions
+ new_bearing = round(compass_directions[choice])
+
+ confirm = input("Are you certain you want to rotate \the [src]?", "[name]") in list("Yes", "No")
+ if(confirm == "No")
+ visible_message(\
+ "[user.name] decides not to try turning \the [src].",\
+ "You decide not to try turning \the [src].")
+ return
+
+ to_chat(user, "\The [src] clicks into place.")
+ for(var/obj/structure/prop/prism/P in my_turrets)
+ P.rotate_auto(new_bearing)
+
+/obj/structure/prop/prismcontrol/initialize()
+ ..()
+ if(my_turrets.len) //Preset controls.
+ for(var/obj/structure/prop/prism/P in my_turrets)
+ P.remote_dial = src
+ return
+ spawn()
+ for(var/obj/structure/prop/prism/P in orange(src, world.view)) //Don't search a huge area.
+ if(P.dialID == dialID && !P.remote_dial && P.external_control_lock)
+ my_turrets |= P
+ P.remote_dial = src
+
+/obj/structure/prop/prismcontrol/Destroy()
+ for(var/obj/structure/prop/prism/P in my_turrets)
+ P.remote_dial = null
+ my_turrets = list()
+ ..()
diff --git a/code/game/objects/structures/props/projectile_lock.dm b/code/game/objects/structures/props/projectile_lock.dm
new file mode 100644
index 0000000000..5c3fcd2ba0
--- /dev/null
+++ b/code/game/objects/structures/props/projectile_lock.dm
@@ -0,0 +1,53 @@
+//A locking mechanism that pulses when hit by a projectile. The base one responds to high-power lasers.
+
+/obj/structure/prop/lock
+ name = "weird lock"
+ desc = "An esoteric object that responds to.. something."
+ icon = 'icons/obj/props/prism.dmi'
+ icon_state = "lock"
+
+ var/enabled = 0
+ var/lockID = null
+
+ var/list/linked_objects = list()
+
+/obj/structure/prop/lock/Destroy()
+ if(linked_objects.len)
+ for(var/obj/O in linked_objects)
+ if(istype(O, /obj/machinery/door/blast/puzzle))
+ var/obj/machinery/door/blast/puzzle/P = O
+ P.locks -= src
+ linked_objects -= P
+ ..()
+
+/obj/structure/prop/lock/proc/toggle_lock()
+ enabled = !enabled
+
+ if(enabled)
+ icon_state = "[initial(icon_state)]-active"
+ else
+ icon_state = "[initial(icon_state)]"
+
+/obj/structure/prop/lock/projectile
+ name = "beam lock"
+ desc = "An esoteric object that responds to high intensity light."
+
+ var/projectile_key = /obj/item/projectile/beam
+ var/timed = 0
+ var/timing = 0
+ var/time_limit = 1500 // In ticks. Ten is one second.
+
+ interaction_message = "The object remains inert to your touch."
+
+/obj/structure/prop/lock/projectile/bullet_act(var/obj/item/projectile/Proj)
+ if(!istype(Proj, projectile_key) || timing)
+ return
+
+ if(istype(Proj, /obj/item/projectile/beam/heavylaser/cannon) || istype(Proj, /obj/item/projectile/beam/emitter) || (Proj.damage >= 80 && Proj.damtype == BURN))
+ toggle_lock()
+ visible_message("\The [src] [enabled ? "disengages" : "engages"] its locking mechanism.")
+
+ if(timed)
+ timing = 1
+ spawn(time_limit)
+ toggle_lock()
diff --git a/code/game/objects/structures/props/prop.dm b/code/game/objects/structures/props/prop.dm
new file mode 100644
index 0000000000..fea5815674
--- /dev/null
+++ b/code/game/objects/structures/props/prop.dm
@@ -0,0 +1,18 @@
+//The base 'prop' for PoIs or other large junk.
+
+/obj/structure/prop
+ name = "something"
+ desc = "My description is broken, bug a developer."
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "safe"
+ density = TRUE
+ anchored = TRUE
+ var/interaction_message = null
+
+/obj/structure/prop/attack_hand(mob/living/user) // Used to tell the player that this isn't useful for anything.
+ if(!istype(user))
+ return FALSE
+ if(!interaction_message)
+ return ..()
+ else
+ to_chat(user, interaction_message)
diff --git a/code/game/objects/structures/props/puzzledoor.dm b/code/game/objects/structures/props/puzzledoor.dm
new file mode 100644
index 0000000000..b9a32fc0dc
--- /dev/null
+++ b/code/game/objects/structures/props/puzzledoor.dm
@@ -0,0 +1,92 @@
+// An indestructible blast door that can only be opened once its puzzle requirements are completed.
+
+/obj/machinery/door/blast/puzzle
+ name = "puzzle door"
+ desc = "A large, virtually indestructible door that will not open unless certain requirements are met."
+ icon_state_open = "pdoor0"
+ icon_state_opening = "pdoorc0"
+ icon_state_closed = "pdoor1"
+ icon_state_closing = "pdoorc1"
+ icon_state = "pdoor1"
+
+ explosion_resistance = 100
+
+ maxhealth = 9999999 //No.
+
+ var/list/locks = list()
+ var/lockID = null
+ var/checkrange_mult = 1
+
+/obj/machinery/door/blast/puzzle/proc/check_locks()
+ for(var/obj/structure/prop/lock/L in locks)
+ if(!L.enabled)
+ return 0
+ return 1
+
+/obj/machinery/door/blast/puzzle/bullet_act(var/obj/item/projectile/Proj)
+ visible_message("\The [src] is completely unaffected by \the [Proj].")
+ qdel(Proj) //No piercing. No.
+
+/obj/machinery/door/blast/puzzle/ex_act(severity)
+ visible_message("\The [src] is completely unaffected by the blast.")
+ return
+
+/obj/machinery/door/blast/puzzle/initialize()
+ . = ..()
+ implicit_material = get_material_by_name("dungeonium")
+ if(locks.len)
+ return
+ var/check_range = world.view * checkrange_mult
+ for(var/obj/structure/prop/lock/L in orange(src, check_range))
+ if(L.lockID == lockID)
+ L.linked_objects |= src
+ locks |= L
+
+/obj/machinery/door/blast/puzzle/Destroy()
+ if(locks.len)
+ for(var/obj/structure/prop/lock/L in locks)
+ L.linked_objects -= src
+ locks -= L
+ ..()
+
+/obj/machinery/door/blast/puzzle/attack_hand(mob/user as mob)
+ if(check_locks())
+ force_toggle(1, user)
+ else
+ to_chat(user, "\The [src] does not respond to your touch.")
+
+/obj/machinery/door/blast/puzzle/attackby(obj/item/weapon/C as obj, mob/user as mob)
+ if(istype(C, /obj/item/weapon))
+ if(C.pry == 1 && (user.a_intent != I_HURT || (stat & BROKEN)))
+ if(istype(C,/obj/item/weapon/material/twohanded/fireaxe))
+ var/obj/item/weapon/material/twohanded/fireaxe/F = C
+ if(!F.wielded)
+ to_chat(user, "You need to be wielding \the [F] to do that.")
+ return
+
+ if(check_locks())
+ force_toggle(1, user)
+
+ else
+ to_chat(user, "[src]'s arcane workings resist your effort.")
+ return
+
+ else if(src.density && (user.a_intent == I_HURT))
+ var/obj/item/weapon/W = C
+ user.setClickCooldown(user.get_attack_speed(W))
+ if(W.damtype == BRUTE || W.damtype == BURN)
+ user.do_attack_animation(src)
+ user.visible_message("\The [user] hits \the [src] with \the [W] with no visible effect.")
+
+ else if(istype(C, /obj/item/weapon/plastique))
+ to_chat(user, "On contacting \the [src], a flash of light envelops \the [C] as it is turned to ash. Oh.")
+ qdel(C)
+ return 0
+
+/obj/machinery/door/blast/puzzle/attack_generic(var/mob/user, var/damage)
+ if(check_locks())
+ force_toggle(1, user)
+
+/obj/machinery/door/blast/puzzle/attack_alien(var/mob/user)
+ if(check_locks())
+ force_toggle(1, user)
diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm
index e67750b8f3..18e45af166 100644
--- a/code/game/objects/structures/railing.dm
+++ b/code/game/objects/structures/railing.dm
@@ -198,7 +198,7 @@
/obj/structure/railing/attackby(obj/item/W as obj, mob/user as mob)
// Dismantle
- if(istype(W, /obj/item/weapon/wrench) && !anchored)
+ if(W.is_wrench() && !anchored)
playsound(src.loc, W.usesound, 50, 1)
if(do_after(user, 20, src))
user.visible_message("\The [user] dismantles \the [src].", "You dismantle \the [src].")
@@ -217,7 +217,7 @@
return
// Install
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
user.visible_message(anchored ? "\The [user] begins unscrewing \the [src]." : "\The [user] begins fasten \the [src]." )
playsound(loc, W.usesound, 75, 1)
if(do_after(user, 10, src))
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 33c6d6501c..cfb77a748e 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -3,7 +3,7 @@
anchored = 1
opacity = 0
density = 0
- layer = ABOVE_JUNK_LAYER
+ layer = UNDER_JUNK_LAYER
w_class = ITEMSIZE_NORMAL
/obj/structure/sign/ex_act(severity)
@@ -21,9 +21,9 @@
return
/obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction
- if(istype(tool, /obj/item/weapon/screwdriver) && !istype(src, /obj/structure/sign/double))
+ if(tool.is_screwdriver() && !istype(src, /obj/structure/sign/double))
playsound(src, tool.usesound, 50, 1)
- user << "You unfasten the sign with your [tool]."
+ to_chat(user, "You unfasten the sign with your [tool].")
var/obj/item/sign/S = new(src.loc)
S.name = name
S.desc = desc
@@ -42,7 +42,7 @@
var/sign_state = ""
/obj/item/sign/attackby(obj/item/tool as obj, mob/user as mob) //construction
- if(istype(tool, /obj/item/weapon/screwdriver) && isturf(user.loc))
+ if(tool.is_screwdriver() && isturf(user.loc))
var/direction = input("In which direction?", "Select direction.") in list("North", "East", "South", "West", "Cancel")
if(direction == "Cancel") return
var/obj/structure/sign/S = new(user.loc)
@@ -59,7 +59,7 @@
S.name = name
S.desc = desc
S.icon_state = sign_state
- user << "You fasten \the [S] with your [tool]."
+ to_chat(user, "You fasten \the [S] with your [tool].")
qdel(src)
else ..()
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index 219854f15f..bff152aa0a 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -89,7 +89,7 @@
return
/obj/structure/bed/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
playsound(src, W.usesound, 50, 1)
dismantle()
qdel(src)
@@ -120,7 +120,7 @@
add_padding(padding_type)
return
- else if (istype(W, /obj/item/weapon/wirecutters))
+ else if(W.is_wirecutter())
if(!padding_material)
to_chat(user, "\The [src] has no padding to remove.")
return
@@ -213,7 +213,7 @@
return
/obj/structure/bed/roller/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench) || istype(W,/obj/item/stack) || istype(W, /obj/item/weapon/wirecutters))
+ if(W.is_wrench() || istype(W,/obj/item/stack) || W.is_wirecutter())
return
else if(istype(W,/obj/item/roller_holder))
if(has_buckled_mobs())
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 390e3c84b9..bbc2a64593 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -134,7 +134,7 @@
return
/obj/structure/bed/chair/office/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/stack) || istype(W, /obj/item/weapon/wirecutters))
+ if(istype(W,/obj/item/stack) || W.is_wirecutter())
return
..()
@@ -198,7 +198,7 @@
return
/obj/structure/bed/chair/wood/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/stack) || istype(W, /obj/item/weapon/wirecutters))
+ if(istype(W,/obj/item/stack) || W.is_wirecutter())
return
..()
diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
index 02ea01556a..b594ad678a 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
@@ -108,7 +108,7 @@ var/global/list/stool_cache = list() //haha stool
qdel(src)
/obj/item/weapon/stool/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
playsound(src, W.usesound, 50, 1)
dismantle()
qdel(src)
@@ -138,7 +138,7 @@ var/global/list/stool_cache = list() //haha stool
user << "You add padding to \the [src]."
add_padding(padding_type)
return
- else if (istype(W, /obj/item/weapon/wirecutters))
+ else if (W.is_wirecutter())
if(!padding_material)
user << "\The [src] has no padding to remove."
return
diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
index bb1a62e40b..e5eba3f20a 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
@@ -23,7 +23,7 @@
L.set_dir(dir)
/obj/structure/bed/chair/wheelchair/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench) || istype(W,/obj/item/stack) || istype(W, /obj/item/weapon/wirecutters))
+ if(W.is_wrench() || W.is_wirecutter() || istype(W,/obj/item/stack))
return
..()
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
index c13ae10e64..d9d31dfb55 100644
--- a/code/game/objects/structures/tank_dispenser.dm
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -74,7 +74,7 @@
user << "[src] is full."
updateUsrDialog()
return
- if(istype(I, /obj/item/weapon/wrench))
+ if(I.is_wrench())
if(anchored)
user << "You lean down and unwrench [src]."
anchored = 0
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 9882ca4507..ff95dd44d8 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -44,7 +44,7 @@
icon_state = "toilet[open][cistern]"
/obj/structure/toilet/attackby(obj/item/I as obj, mob/living/user as mob)
- if(istype(I, /obj/item/weapon/crowbar))
+ if(I.is_crowbar())
to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"].")
playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1)
if(do_after(user, 30))
@@ -142,7 +142,8 @@
name = "mist"
icon = 'icons/obj/watercloset.dmi'
icon_state = "mist"
- layer = MOB_LAYER + 1
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
anchored = 1
mouse_opacity = 0
@@ -159,7 +160,7 @@
/obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob)
if(I.type == /obj/item/device/analyzer)
to_chat(user, "The water temperature seems to be [watertemp].")
- if(istype(I, /obj/item/weapon/wrench))
+ if(I.is_wrench())
var/newtemp = input(user, "What setting would you like to set the temperature valve to?", "Water Temperature Valve") in temperature_settings
to_chat(user, "You begin to adjust the temperature valve with \the [I].")
playsound(src.loc, I.usesound, 50, 1)
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 1d1be70694..47f08399f0 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -108,7 +108,7 @@ obj/structure/windoor_assembly/Destroy()
return
//Wrenching an unsecure assembly anchors it in place. Step 4 complete
- if(istype(W, /obj/item/weapon/wrench) && !anchored)
+ if(W.is_wrench() && !anchored)
playsound(src, W.usesound, 100, 1)
user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor.")
@@ -119,7 +119,7 @@ obj/structure/windoor_assembly/Destroy()
step = 0
//Unwrenching an unsecure assembly un-anchors it. Step 4 undone
- else if(istype(W, /obj/item/weapon/wrench) && anchored)
+ else if(W.is_wrench() && anchored)
playsound(src, W.usesound, 100, 1)
user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor.")
@@ -145,7 +145,7 @@ obj/structure/windoor_assembly/Destroy()
if("02")
//Removing wire from the assembly. Step 5 undone.
- if(istype(W, /obj/item/weapon/wirecutters) && !src.electronics)
+ if(W.is_wirecutter() && !src.electronics)
playsound(src, W.usesound, 100, 1)
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
@@ -174,7 +174,7 @@ obj/structure/windoor_assembly/Destroy()
W.loc = src.loc
//Screwdriver to remove airlock electronics. Step 6 undone.
- else if(istype(W, /obj/item/weapon/screwdriver) && src.electronics)
+ else if(W.is_screwdriver() && src.electronics)
playsound(src, W.usesound, 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly.")
@@ -187,7 +187,7 @@ obj/structure/windoor_assembly/Destroy()
ae.loc = src.loc
//Crowbar to complete the assembly, Step 7 complete.
- else if(istype(W, /obj/item/weapon/crowbar))
+ else if(W.is_crowbar())
if(!src.electronics)
to_chat(usr,"The assembly is missing electronics.")
return
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index c197ee1f60..f97433aab4 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -262,7 +262,7 @@
if(W.flags & NOBLUDGEON) return
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
if(reinf && state >= 1)
state = 3 - state
update_nearby_icons()
@@ -280,11 +280,11 @@
update_verbs()
playsound(src, W.usesound, 75, 1)
user << (anchored ? "You have fastened the window to the floor." : "You have unfastened the window.")
- else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <= 1)
+ else if(W.is_crowbar() && reinf && state <= 1)
state = 1 - state
playsound(src, W.usesound, 75, 1)
user << (state ? "You have pried the window into the frame." : "You have pried the window out of the frame.")
- else if(istype(W, /obj/item/weapon/wrench) && !anchored && (!state || !reinf))
+ else if(W.is_wrench() && !anchored && (!state || !reinf))
if(!glasstype)
user << "You're not sure how to dismantle \the [src] properly."
else
@@ -294,7 +294,7 @@
if(is_fulltile())
mats.amount = 4
qdel(src)
- else if(iscoil(W) && reinf && state == 0 && !istype(src, /obj/structure/window/reinforced/polarized))
+ else if(istype(W, /obj/item/stack/cable_coil) && reinf && state == 0 && !istype(src, /obj/structure/window/reinforced/polarized))
var/obj/item/stack/cable_coil/C = W
if (C.use(1))
playsound(src.loc, 'sound/effects/sparks1.ogg', 75, 1)
@@ -572,7 +572,7 @@
maxhealth = 80
/obj/structure/window/reinforced/polarized/attackby(obj/item/W as obj, mob/user as mob)
- if(ismultitool(W) && !anchored) // Only allow programming if unanchored!
+ if(istype(W, /obj/item/device/multitool) && !anchored) // Only allow programming if unanchored!
var/obj/item/device/multitool/MT = W
// First check if they have a windowtint button buffered
if(istype(MT.connectable, /obj/machinery/button/windowtint))
@@ -632,7 +632,7 @@
icon_state = "light[active]"
/obj/machinery/button/windowtint/attackby(obj/item/W as obj, mob/user as mob)
- if(ismultitool(W))
+ if(istype(W, /obj/item/device/multitool))
var/obj/item/device/multitool/MT = W
if(!id)
// If no ID is set yet (newly built button?) let them select an ID for first-time use!
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 2db1e433bd..8e206300a8 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -130,6 +130,9 @@
if ("mechstep") soundin = pick('sound/mecha/mechstep1.ogg', 'sound/mecha/mechstep2.ogg')
if ("geiger") soundin = pick('sound/items/geiger1.ogg', 'sound/items/geiger2.ogg', 'sound/items/geiger3.ogg', 'sound/items/geiger4.ogg', 'sound/items/geiger5.ogg')
if ("geiger_weak") soundin = pick('sound/items/geiger_weak1.ogg', 'sound/items/geiger_weak2.ogg', 'sound/items/geiger_weak3.ogg', 'sound/items/geiger_weak4.ogg')
+ if ("thunder") soundin = pick('sound/effects/thunder/thunder1.ogg', 'sound/effects/thunder/thunder2.ogg', 'sound/effects/thunder/thunder3.ogg', 'sound/effects/thunder/thunder4.ogg',
+ 'sound/effects/thunder/thunder5.ogg', 'sound/effects/thunder/thunder6.ogg', 'sound/effects/thunder/thunder7.ogg', 'sound/effects/thunder/thunder8.ogg', 'sound/effects/thunder/thunder9.ogg',
+ 'sound/effects/thunder/thunder10.ogg')
return soundin
//Are these even used?
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
deleted file mode 100644
index 3cc0bb8ab9..0000000000
--- a/code/game/supplyshuttle.dm
+++ /dev/null
@@ -1,333 +0,0 @@
-//Config stuff
-#define SUPPLY_DOCKZ 2 //Z-level of the Dock.
-#define SUPPLY_STATIONZ 1 //Z-level of the Station.
-#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station
-#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock
-
-//Supply packs are in /code/defines/obj/supplypacks.dm
-//Computers are in /code/game/machinery/computer/supply.dm
-
-var/datum/controller/supply/supply_controller = new()
-
-var/list/mechtoys = list(
- /obj/item/toy/prize/ripley,
- /obj/item/toy/prize/fireripley,
- /obj/item/toy/prize/deathripley,
- /obj/item/toy/prize/gygax,
- /obj/item/toy/prize/durand,
- /obj/item/toy/prize/honk,
- /obj/item/toy/prize/marauder,
- /obj/item/toy/prize/seraph,
- /obj/item/toy/prize/mauler,
- /obj/item/toy/prize/odysseus,
- /obj/item/toy/prize/phazon
-)
-
-/obj/item/weapon/paper/manifest
- name = "supply manifest"
- var/is_copy = 1
-
-/area/supply/station
- name = "Supply Shuttle"
- icon_state = "shuttle3"
- requires_power = 0
- base_turf = /turf/space
-
-/area/supply/dock
- name = "Supply Shuttle"
- icon_state = "shuttle3"
- requires_power = 0
- base_turf = /turf/space
-
-/obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY
- name = "\improper plastic flaps"
- desc = "Completely impassable - or are they?"
- icon = 'icons/obj/stationobjs.dmi' //Change this.
- icon_state = "plasticflaps"
- density = 0
- anchored = 1
- layer = MOB_LAYER
- plane = MOB_PLANE
- explosion_resistance = 5
- var/list/mobs_can_pass = list(
- /mob/living/bot,
- /mob/living/simple_animal/slime,
- /mob/living/simple_animal/mouse,
- /mob/living/silicon/robot/drone
- )
-
-/obj/structure/plasticflaps/attackby(obj/item/P, mob/user)
- if(istype(P, /obj/item/weapon/wirecutters))
- playsound(src, P.usesound, 50, 1)
- user << "You start to cut the plastic flaps."
- if(do_after(user, 10 * P.toolspeed))
- user << "You cut the plastic flaps."
- var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc )
- A.amount = 4
- qdel(src)
- return
- else
- return
-
-/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
- if(istype(A) && A.checkpass(PASSGLASS))
- return prob(60)
-
- var/obj/structure/bed/B = A
- if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass
- return 0
-
- if(istype(A, /obj/vehicle)) //no vehicles
- return 0
-
- var/mob/living/M = A
- if(istype(M))
- if(M.lying)
- return ..()
- for(var/mob_type in mobs_can_pass)
- if(istype(A, mob_type))
- return ..()
- return issmall(M)
-
- return ..()
-
-/obj/structure/plasticflaps/ex_act(severity)
- switch(severity)
- if (1)
- qdel(src)
- if (2)
- if (prob(50))
- qdel(src)
- if (3)
- if (prob(5))
- qdel(src)
-
-/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates
- name = "airtight plastic flaps"
- desc = "Heavy duty, airtight, plastic flaps."
-
-/obj/structure/plasticflaps/mining/New() //set the turf below the flaps to block air
- var/turf/T = get_turf(loc)
- if(T)
- T.blocks_air = 1
- ..()
-
-/obj/structure/plasticflaps/mining/Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor
- var/turf/T = get_turf(loc)
- if(T && istype(T, /turf/simulated/floor))
- T.blocks_air = 0
- ..()
-
-/*
-/obj/effect/marker/supplymarker
- icon_state = "X"
- icon = 'icons/misc/mark.dmi'
- name = "X"
- invisibility = 101
- anchored = 1
- opacity = 0
-*/
-
-/datum/supply_order
- var/ordernum
- var/datum/supply_packs/object = null
- var/orderedby = null
- var/comment = null
-
-/datum/exported_crate
- var/name
- var/value
-
-/datum/controller/supply
- //supply points
- var/points = 50
- var/points_per_process = 1.5
- var/points_per_slip = 2
- var/points_per_platinum = 5 // 5 points per sheet
- var/points_per_phoron = 5
- var/points_per_money = 0.02
- //control
- var/ordernum
- var/list/shoppinglist = list()
- var/list/requestlist = list()
- var/list/supply_packs = list()
- var/list/exported_crates = list()
- //shuttle movement
- var/movetime = 1200
- var/datum/shuttle/ferry/supply/shuttle
-
-/datum/controller/supply/New()
- ordernum = rand(1,9000)
-
- for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs))
- var/datum/supply_packs/P = new typepath()
- supply_packs[P.name] = P
-
-// Supply shuttle ticker - handles supply point regeneration
-// This is called by the process scheduler every thirty seconds
-/datum/controller/supply/proc/process()
- points += points_per_process
-
-//To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types.
-/datum/controller/supply/proc/forbidden_atoms_check(atom/A)
- if(isliving(A))
- return 1
- if(istype(A,/obj/item/weapon/disk/nuclear))
- return 1
- if(istype(A,/obj/machinery/nuclearbomb))
- return 1
- if(istype(A,/obj/item/device/radio/beacon))
- return 1
-
- for(var/i=1, i<=A.contents.len, i++)
- var/atom/B = A.contents[i]
- if(.(B))
- return 1
-
-//Sellin
-/datum/controller/supply/proc/sell()
- var/area/area_shuttle = shuttle.get_location_area()
- if(!area_shuttle) return
-
- callHook("sell_shuttle", list(area_shuttle));
-
- var/phoron_count = 0
- var/plat_count = 0
- var/money_count = 0
-
- exported_crates = list()
-
- for(var/atom/movable/MA in area_shuttle)
- if(MA.anchored) continue
-
- // Must be in a crate!
- if(istype(MA,/obj/structure/closet/crate))
- var/oldpoints = points
- var/oldphoron = phoron_count
- var/oldplatinum = plat_count
- var/oldmoney = money_count
-
- var/obj/structure/closet/crate/CR = MA
- callHook("sell_crate", list(CR, area_shuttle))
-
- points += CR.points_per_crate
- var/find_slip = 1
-
- for(var/atom in CR)
- // Sell manifests
- var/atom/A = atom
- if(find_slip && istype(A,/obj/item/weapon/paper/manifest))
- var/obj/item/weapon/paper/manifest/slip = A
- if(!slip.is_copy && slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense
- points += points_per_slip
- find_slip = 0
- continue
-
- // Sell phoron and platinum
- if(istype(A, /obj/item/stack))
- var/obj/item/stack/P = A
- switch(P.get_material_name())
- if("phoron") phoron_count += P.get_amount()
- if("platinum") plat_count += P.get_amount()
-
- //Sell spacebucks
- if(istype(A, /obj/item/weapon/spacecash))
- var/obj/item/weapon/spacecash/cashmoney = A
- money_count += cashmoney.worth
-
- var/datum/exported_crate/EC = new /datum/exported_crate()
- EC.name = CR.name
- EC.value = points - oldpoints
- EC.value += (phoron_count - oldphoron) * points_per_phoron
- EC.value += (plat_count - oldplatinum) * points_per_platinum
- EC.value += (money_count - oldmoney) * points_per_money
- exported_crates += EC
-
- qdel(MA)
-
- points += phoron_count * points_per_phoron
- points += plat_count * points_per_platinum
- points += money_count * points_per_money
-
-//Buyin
-/datum/controller/supply/proc/buy()
- if(!shoppinglist.len)
- return
-
- var/orderedamount = shoppinglist.len
-
- var/area/area_shuttle = shuttle.get_location_area()
- if(!area_shuttle)
- return
-
- var/list/clear_turfs = list()
-
- for(var/turf/T in area_shuttle)
- if(T.density)
- continue
- var/contcount
- for(var/atom/A in T.contents)
- if(!A.simulated)
- continue
- contcount++
- if(contcount)
- continue
- clear_turfs += T
-
- for(var/S in shoppinglist)
- if(!clear_turfs.len) break
- var/i = rand(1,clear_turfs.len)
- var/turf/pickedloc = clear_turfs[i]
- clear_turfs.Cut(i,i+1)
- shoppinglist -= S
-
- var/datum/supply_order/SO = S
- var/datum/supply_packs/SP = SO.object
-
- var/obj/A = new SP.containertype(pickedloc)
- A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]"
-
- //supply manifest generation begin
- var/obj/item/weapon/paper/manifest/slip
- if(!SP.contraband)
- slip = new /obj/item/weapon/paper/manifest(A)
- slip.is_copy = 0
- slip.info = "[command_name()] Shipping Manifest
"
- slip.info +="Order #[SO.ordernum] "
- slip.info +="Destination: [station_name()] "
- slip.info +="[orderedamount] PACKAGES IN THIS SHIPMENT "
- slip.info +="CONTENTS:
"
-
- //spawn the stuff, finish generating the manifest while you're at it
- if(SP.access)
- if(isnum(SP.access))
- A.req_access = list(SP.access)
- else if(islist(SP.access))
- var/list/L = SP.access // access var is a plain var, we need a list
- A.req_access = L.Copy()
- else
- log_debug("Supply pack with invalid access restriction [SP.access] encountered!")
-
- var/list/contains
- if(istype(SP,/datum/supply_packs/randomised))
- var/datum/supply_packs/randomised/SPR = SP
- contains = list()
- if(SPR.contains.len)
- for(var/j=1,j<=SPR.num_contained,j++)
- contains += pick(SPR.contains)
- else
- contains = SP.contains
-
- for(var/typepath in contains)
- if(!typepath) continue
- var/number_of_items = max(1, contains[typepath])
- for(var/j = 1 to number_of_items)
- var/atom/B2 = new typepath(A)
- if(slip) slip.info += "- [B2.name]
" //add the item to the manifest
-
- //manifest finalisation
- if(slip)
- slip.info += " "
- slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS "
-
- return
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index e156588937..1c74b467e2 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -12,6 +12,7 @@
nitrogen = MOLES_N2STANDARD
var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed
var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to
+ var/can_dirty = TRUE // If false, tile never gets dirty
var/dirt = 0
// This is not great.
@@ -65,12 +66,13 @@
tracks.AddTracks(bloodDNA,comingdir,goingdir,bloodcolor)
/turf/simulated/proc/update_dirt()
- dirt = min(dirt+1, 101)
- var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, src)
- if (dirt > 50)
- if (!dirtoverlay)
- dirtoverlay = new/obj/effect/decal/cleanable/dirt(src)
- dirtoverlay.alpha = min((dirt - 50) * 5, 255)
+ if(can_dirty)
+ dirt = min(dirt+1, 101)
+ var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, src)
+ if (dirt > 50)
+ if (!dirtoverlay)
+ dirtoverlay = new/obj/effect/decal/cleanable/dirt(src)
+ dirtoverlay.alpha = min((dirt - 50) * 5, 255)
/turf/simulated/Entered(atom/A, atom/OL)
if(movement_disabled && usr.ckey != movement_disabled_exception)
@@ -82,8 +84,9 @@
if(M.lying)
return ..()
- // Dirt overlays.
- update_dirt()
+ if(M.dirties_floor())
+ // Dirt overlays.
+ update_dirt()
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
diff --git a/code/game/turfs/simulated/dungeon/wall.dm b/code/game/turfs/simulated/dungeon/wall.dm
index 156fddac6a..c1a02cde66 100644
--- a/code/game/turfs/simulated/dungeon/wall.dm
+++ b/code/game/turfs/simulated/dungeon/wall.dm
@@ -12,7 +12,13 @@
/turf/simulated/wall/dungeon/ex_act()
return
+/turf/simulated/wall/dungeon/take_damage() //These things are suppose to be unbreakable
+ return
+
/turf/simulated/wall/solidrock //for more stylish anti-cheese.
+ name = "solid rock"
+ desc = "This rock seems dense, impossible to drill."
+ description_info = "Probably not going to be able to drill or bomb your way through this, best to try and find a way around."
icon_state = "bedrock"
var/base_state = "bedrock"
block_tele = TRUE
@@ -34,4 +40,7 @@
return
/turf/simulated/wall/solidrock/ex_act()
+ return
+
+/turf/simulated/wall/solidrock/take_damage() //These things are suppose to be unbreakable
return
\ No newline at end of file
diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm
index 91371e7beb..83d2444f96 100644
--- a/code/game/turfs/simulated/floor_attackby.dm
+++ b/code/game/turfs/simulated/floor_attackby.dm
@@ -9,6 +9,50 @@
attack_tile(C, L) // Be on help intent if you want to decon something.
return
+ if(istype(C, /obj/item/stack/tile/roofing))
+ var/expended_tile = FALSE // To track the case. If a ceiling is built in a multiz zlevel, it also necessarily roofs it against weather
+ var/turf/T = GetAbove(src)
+ var/obj/item/stack/tile/roofing/R = C
+
+ // Patch holes in the ceiling
+ if(T)
+ if(istype(T, /turf/simulated/open) || istype(T, /turf/space))
+ // Must be build adjacent to an existing floor/wall, no floating floors
+ var/list/cardinalTurfs = list() // Up a Z level
+ for(var/dir in cardinal)
+ var/turf/B = get_step(T, dir)
+ if(B)
+ cardinalTurfs += B
+
+ var/turf/simulated/A = locate(/turf/simulated/floor) in cardinalTurfs
+ if(!A)
+ A = locate(/turf/simulated/wall) in cardinalTurfs
+ if(!A)
+ to_chat(user, "There's nothing to attach the ceiling to!")
+ return
+
+ if(R.use(1)) // Cost of roofing tiles is 1:1 with cost to place lattice and plating
+ T.ReplaceWithLattice()
+ T.ChangeTurf(/turf/simulated/floor, preserve_outdoors = TRUE)
+ playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
+ user.visible_message("[user] patches a hole in the ceiling.", "You patch a hole in the ceiling.")
+ expended_tile = TRUE
+ else
+ to_chat(user, "There aren't any holes in the ceiling to patch here.")
+ return
+
+ // Create a ceiling to shield from the weather
+ if(src.outdoors)
+ for(var/dir in cardinal)
+ var/turf/A = get_step(src, dir)
+ if(A && !A.outdoors)
+ if(expended_tile || R.use(1))
+ make_indoors()
+ playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
+ user.visible_message("[user] roofs a tile, shielding it from the elements.", "You roof this tile, shielding it from the elements.")
+ break
+ return
+
if(flooring)
if(istype(C, /obj/item/weapon))
try_deconstruct_tile(C, user)
@@ -71,7 +115,7 @@
to_chat(user, "You need more welding fuel to complete this task.")
/turf/simulated/floor/proc/try_deconstruct_tile(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/crowbar))
+ if(W.is_crowbar())
if(broken || burnt)
to_chat(user, "You remove the broken [flooring.descriptor].")
make_plating()
@@ -85,14 +129,14 @@
return 0
playsound(src, W.usesound, 80, 1)
return 1
- else if(istype(W, /obj/item/weapon/screwdriver) && (flooring.flags & TURF_REMOVE_SCREWDRIVER))
+ else if(W.is_screwdriver() && (flooring.flags & TURF_REMOVE_SCREWDRIVER))
if(broken || burnt)
return 0
to_chat(user, "You unscrew and remove the [flooring.descriptor].")
make_plating(1)
playsound(src, W.usesound, 80, 1)
return 1
- else if(istype(W, /obj/item/weapon/wrench) && (flooring.flags & TURF_REMOVE_WRENCH))
+ else if(W.is_wrench() && (flooring.flags & TURF_REMOVE_WRENCH))
to_chat(user, "You unwrench and remove the [flooring.descriptor].")
make_plating(1)
playsound(src, W.usesound, 80, 1)
diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm
index e1b49762ec..e65c15ae19 100644
--- a/code/game/turfs/simulated/floor_icon.dm
+++ b/code/game/turfs/simulated/floor_icon.dm
@@ -84,9 +84,6 @@ var/image/no_ceiling_image = null
if(!isnull(burnt) && (flooring.flags & TURF_CAN_BURN))
add_overlay(get_flooring_overlay("[flooring.icon_base]-burned-[burnt]","[flooring.icon_base]_burned[burnt]"))
- if(weather_overlay)
- add_overlay(weather_overlay)
-
if(update_neighbors)
for(var/turf/simulated/floor/F in range(src, 1))
if(F == src)
diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm
index dc49c0d893..316153ebc0 100644
--- a/code/game/turfs/simulated/floor_types.dm
+++ b/code/game/turfs/simulated/floor_types.dm
@@ -181,7 +181,7 @@
/turf/simulated/shuttle/floor/alien
icon_state = "alienpod1"
light_range = 3
- light_power = 3
+ light_power = 0.6
light_color = "#66ffff" // Bright cyan.
block_tele = TRUE
@@ -253,4 +253,4 @@
/turf/simulated/shuttle/floor/voidcraft/external/dark
-/turf/simulated/shuttle/floor/voidcraft/external/light
\ No newline at end of file
+/turf/simulated/shuttle/floor/voidcraft/external/light
diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm
index 34a07ef9c4..85fdacc30d 100644
--- a/code/game/turfs/simulated/outdoors/outdoors.dm
+++ b/code/game/turfs/simulated/outdoors/outdoors.dm
@@ -1,5 +1,4 @@
var/list/turf_edge_cache = list()
-var/list/outdoor_turfs = list()
/turf/
// If greater than 0, this turf will apply edge overlays on top of other turfs cardinally adjacent to it, if those adjacent turfs are of a different icon_state,
@@ -7,8 +6,6 @@ var/list/outdoor_turfs = list()
var/edge_blending_priority = 0
// Outdoors var determines if the game should consider the turf to be 'outdoors', which controls certain things such as weather effects.
var/outdoors = FALSE
- // This holds the image for the current weather effect.
- var/image/weather_overlay = null
/turf/simulated/floor/outdoors
name = "generic ground"
@@ -17,6 +14,8 @@ var/list/outdoor_turfs = list()
icon_state = null
edge_blending_priority = 1
outdoors = TRUE // This variable is used for weather effects.
+ can_dirty = FALSE // Looks hideous with dirt on it.
+
// When a turf gets demoted or promoted, this list gets adjusted. The top-most layer is the layer on the bottom of the list, due to how pop() works.
var/list/turf_layers = list(/turf/simulated/floor/outdoors/rocks)
@@ -26,38 +25,29 @@ var/list/outdoor_turfs = list()
/turf/simulated/floor/New()
if(outdoors)
- outdoor_turfs.Add(src)
+ SSplanets.addTurf(src)
..()
/turf/simulated/floor/Destroy()
if(outdoors)
- planet_controller.unallocateTurf(src)
- ..()
+ SSplanets.removeTurf(src)
+ return ..()
/turf/simulated/proc/make_outdoors()
outdoors = TRUE
- outdoor_turfs.Add(src)
+ SSplanets.addTurf(src)
/turf/simulated/proc/make_indoors()
outdoors = FALSE
- if(planet_controller)
- planet_controller.unallocateTurf(src)
- else // This is happening during map gen, if there's no planet_controller (hopefully).
- outdoor_turfs -= src
- if(weather_overlay)
- cut_overlay(weather_overlay)
- qdel_null(weather_overlay)
- update_icon()
+ SSplanets.removeTurf(src)
/turf/simulated/post_change()
..()
// If it was outdoors and still is, it will not get added twice when the planet controller gets around to putting it in.
if(outdoors)
make_outdoors()
- // outdoor_turfs += src
else
make_indoors()
- // planet_controller.unallocateTurf(src)
/turf/simulated/proc/update_icon_edge()
if(edge_blending_priority)
@@ -66,8 +56,8 @@ var/list/outdoor_turfs = list()
if(istype(T) && T.edge_blending_priority && edge_blending_priority < T.edge_blending_priority && icon_state != T.icon_state)
var/cache_key = "[T.get_edge_icon_state()]-[checkdir]"
if(!turf_edge_cache[cache_key])
- var/image/I = image(icon = 'icons/turf/outdoors_edge.dmi', icon_state = "[T.get_edge_icon_state()]-edge", dir = checkdir)
- I.plane = 0
+ var/image/I = image(icon = 'icons/turf/outdoors_edge.dmi', icon_state = "[T.get_edge_icon_state()]-edge", dir = checkdir, layer = ABOVE_TURF_LAYER)
+ I.plane = TURF_PLANE
turf_edge_cache[cache_key] = I
add_overlay(turf_edge_cache[cache_key])
diff --git a/code/game/turfs/simulated/outdoors/sky.dm b/code/game/turfs/simulated/outdoors/sky.dm
index c329fc2e4d..468b893b33 100644
--- a/code/game/turfs/simulated/outdoors/sky.dm
+++ b/code/game/turfs/simulated/outdoors/sky.dm
@@ -14,7 +14,7 @@
/turf/simulated/sky/initialize()
. = ..()
- outdoor_turfs.Add(src)
+ SSplanets.addTurf(src)
set_light(2, 2, "#FFFFFF")
/turf/simulated/sky/north
diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm
index 1eaca16e76..70cacfba2c 100644
--- a/code/game/turfs/simulated/wall_attacks.dm
+++ b/code/game/turfs/simulated/wall_attacks.dm
@@ -84,16 +84,16 @@
if(rotting)
if(reinf_material)
- user << "\The [reinf_material.display_name] feels porous and crumbly."
+ to_chat(user, "\The [reinf_material.display_name] feels porous and crumbly.")
else
- user << "\The [material.display_name] crumbles under your touch!"
+ to_chat(user, "\The [material.display_name] crumbles under your touch!")
dismantle_wall()
return 1
if(..()) return 1
if(!can_open)
- user << "You push the wall, but nothing happens."
+ to_chat(user, "You push the wall, but nothing happens.")
playsound(src, 'sound/weapons/Genhit.ogg', 25, 1)
else
toggle_open(user)
@@ -138,28 +138,57 @@
user.setClickCooldown(user.get_attack_speed(W))
if (!user.)
- user << "You don't have the dexterity to do this!"
+ to_chat(user, "You don't have the dexterity to do this!")
return
//get the user's location
- if(!istype(user.loc, /turf)) return //can't do this stuff whilst inside objects and such
+ if(!istype(user.loc, /turf))
+ return //can't do this stuff whilst inside objects and such
if(W)
radiate()
if(is_hot(W))
burn(is_hot(W))
+ if(istype(W, /obj/item/stack/tile/roofing))
+ var/expended_tile = FALSE // To track the case. If a ceiling is built in a multiz zlevel, it also necessarily roofs it against weather
+ var/turf/T = GetAbove(src)
+ var/obj/item/stack/tile/roofing/R = W
+
+ // Place plating over a wall
+ if(T)
+ if(istype(T, /turf/simulated/open) || istype(T, /turf/space))
+ if(R.use(1)) // Cost of roofing tiles is 1:1 with cost to place lattice and plating
+ T.ReplaceWithLattice()
+ T.ChangeTurf(/turf/simulated/floor, preserve_outdoors = TRUE)
+ playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
+ user.visible_message("[user] patches a hole in the ceiling.", "You patch a hole in the ceiling.")
+ expended_tile = TRUE
+ else
+ to_chat(user, "There aren't any holes in the ceiling to patch here.")
+ return
+
+ // Create a ceiling to shield from the weather
+ if(outdoors)
+ if(expended_tile || R.use(1)) // Don't need to check adjacent turfs for a wall, we're building on one
+ make_indoors()
+ if(!expended_tile) // Would've already played a sound
+ playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
+ user.visible_message("[user] roofs \the [src], shielding it from the elements.", "You roof \the [src] tile, shielding it from the elements.")
+ return
+
+
if(locate(/obj/effect/overlay/wallrot) in src)
if(istype(W, /obj/item/weapon/weldingtool) )
var/obj/item/weapon/weldingtool/WT = W
if( WT.remove_fuel(0,user) )
- user << "You burn away the fungi with \the [WT]."
+ to_chat(user, "You burn away the fungi with \the [WT].")
playsound(src, WT.usesound, 10, 1)
for(var/obj/effect/overlay/wallrot/WR in src)
qdel(WR)
return
else if(!is_sharp(W) && W.force >= 10 || W.force >= 20)
- user << "\The [src] crumbles away under the force of your [W.name]."
+ to_chat(user, "\The [src] crumbles away under the force of your [W.name].")
src.dismantle_wall(1)
return
@@ -179,7 +208,7 @@
var/obj/item/weapon/melee/energy/blade/EB = W
EB.spark_system.start()
- user << "You slash \the [src] with \the [EB]; the thermite ignites!"
+ to_chat(user, "You slash \the [src] with \the [EB]; the thermite ignites!")
playsound(src, "sparks", 50, 1)
playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
@@ -196,13 +225,13 @@
return
if(WT.remove_fuel(0,user))
- user << "You start repairing the damage to [src]."
+ to_chat(user, "You start repairing the damage to [src].")
playsound(src.loc, WT.usesound, 100, 1)
if(do_after(user, max(5, damage / 5) * WT.toolspeed) && WT && WT.isOn())
- user << "You finish repairing the damage to [src]."
+ to_chat(user, "You finish repairing the damage to [src].")
take_damage(-damage)
else
- user << "You need more welding fuel to complete this task."
+ to_chat(user, "You need more welding fuel to complete this task.")
return
user.update_examine_panel(src)
return
@@ -219,7 +248,7 @@
if(!WT.isOn())
return
if(!WT.remove_fuel(0,user))
- user << "You need more welding fuel to complete this task."
+ to_chat(user, "You need more welding fuel to complete this task.")
return
dismantle_verb = "cutting"
dismantle_sound = W.usesound
@@ -236,7 +265,7 @@
if(dismantle_verb)
- user << "You begin [dismantle_verb] through the outer plating."
+ to_chat(user, "You begin [dismantle_verb] through the outer plating.")
if(dismantle_sound)
playsound(src, dismantle_sound, 100, 1)
@@ -246,7 +275,7 @@
if(!do_after(user,cut_delay * W.toolspeed))
return
- user << "You remove the outer plating."
+ to_chat(user, "You remove the outer plating.")
dismantle_wall()
user.visible_message("The wall was torn open by [user]!")
return
@@ -255,28 +284,28 @@
else
switch(construction_stage)
if(6)
- if (istype(W, /obj/item/weapon/wirecutters))
+ if (W.is_wirecutter())
playsound(src, W.usesound, 100, 1)
construction_stage = 5
user.update_examine_panel(src)
- user << "You cut through the outer grille."
+ to_chat(user, "You cut through the outer grille.")
update_icon()
return
if(5)
- if (istype(W, /obj/item/weapon/screwdriver))
- user << "You begin removing the support lines."
+ if (W.is_screwdriver())
+ to_chat(user, "You begin removing the support lines.")
playsound(src, W.usesound, 100, 1)
if(!do_after(user,40 * W.toolspeed) || !istype(src, /turf/simulated/wall) || construction_stage != 5)
return
construction_stage = 4
user.update_examine_panel(src)
update_icon()
- user << "You unscrew the support lines."
+ to_chat(user, "You unscrew the support lines.")
return
- else if (istype(W, /obj/item/weapon/wirecutters))
+ else if (W.is_wirecutter())
construction_stage = 6
user.update_examine_panel(src)
- user << "You mend the outer grille."
+ to_chat(user, "You mend the outer grille.")
playsound(src, W.usesound, 100, 1)
update_icon()
return
@@ -289,51 +318,51 @@
if(WT.remove_fuel(0,user))
cut_cover=1
else
- user << "You need more welding fuel to complete this task."
+ to_chat(user, "You need more welding fuel to complete this task.")
return
else if (istype(W, /obj/item/weapon/pickaxe/plasmacutter))
cut_cover = 1
if(cut_cover)
- user << "You begin slicing through the metal cover."
+ to_chat(user, "You begin slicing through the metal cover.")
playsound(src, W.usesound, 100, 1)
if(!do_after(user, 60 * W.toolspeed) || !istype(src, /turf/simulated/wall) || construction_stage != 4)
return
construction_stage = 3
user.update_examine_panel(src)
update_icon()
- user << "You press firmly on the cover, dislodging it."
+ to_chat(user, "You press firmly on the cover, dislodging it.")
return
- else if (istype(W, /obj/item/weapon/screwdriver))
- user << "You begin screwing down the support lines."
+ else if (W.is_screwdriver())
+ to_chat(user, "You begin screwing down the support lines.")
playsound(src, W.usesound, 100, 1)
if(!do_after(user,40 * W.toolspeed) || !istype(src, /turf/simulated/wall) || construction_stage != 4)
return
construction_stage = 5
user.update_examine_panel(src)
update_icon()
- user << "You screw down the support lines."
+ to_chat(user, "You screw down the support lines.")
return
if(3)
- if (istype(W, /obj/item/weapon/crowbar))
- user << "You struggle to pry off the cover."
+ if (W.is_crowbar())
+ to_chat(user, "You struggle to pry off the cover.")
playsound(src, W.usesound, 100, 1)
if(!do_after(user,100 * W.toolspeed) || !istype(src, /turf/simulated/wall) || construction_stage != 3)
return
construction_stage = 2
user.update_examine_panel(src)
update_icon()
- user << "You pry off the cover."
+ to_chat(user, "You pry off the cover.")
return
if(2)
- if (istype(W, /obj/item/weapon/wrench))
- user << "You start loosening the anchoring bolts which secure the support rods to their frame."
+ if (W.is_wrench())
+ to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame.")
playsound(src, W.usesound, 100, 1)
if(!do_after(user,40 * W.toolspeed) || !istype(src, /turf/simulated/wall) || construction_stage != 2)
return
construction_stage = 1
user.update_examine_panel(src)
update_icon()
- user << "You remove the bolts anchoring the support rods."
+ to_chat(user, "You remove the bolts anchoring the support rods.")
return
if(1)
var/cut_cover
@@ -342,28 +371,28 @@
if( WT.remove_fuel(0,user) )
cut_cover=1
else
- user << "You need more welding fuel to complete this task."
+ to_chat(user, "You need more welding fuel to complete this task.")
return
else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
cut_cover = 1
if(cut_cover)
- user << "You begin slicing through the support rods."
+ to_chat(user, "You begin slicing through the support rods.")
playsound(src, W.usesound, 100, 1)
if(!do_after(user,70 * W.toolspeed) || !istype(src, /turf/simulated/wall) || construction_stage != 1)
return
construction_stage = 0
user.update_examine_panel(src)
update_icon()
- user << "The slice through the support rods."
+ to_chat(user, "The slice through the support rods.")
return
if(0)
- if(istype(W, /obj/item/weapon/crowbar))
- user << "You struggle to pry off the outer sheath."
+ if(W.is_crowbar())
+ to_chat(user, "You struggle to pry off the outer sheath.")
playsound(src, W.usesound, 100, 1)
if(!do_after(user,100 * W.toolspeed) || !istype(src, /turf/simulated/wall) || !user || !W || !T )
return
if(user.loc == T && user.get_active_hand() == W )
- user << "You pry off the outer sheath."
+ to_chat(user, "You pry off the outer sheath.")
dismantle_wall()
return
diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm
index eae30c6cb4..bef279fc77 100644
--- a/code/game/turfs/simulated/wall_types.dm
+++ b/code/game/turfs/simulated/wall_types.dm
@@ -3,6 +3,23 @@
/turf/simulated/wall/r_wall/New(var/newloc)
..(newloc, "plasteel","plasteel") //3strong
+/turf/simulated/wall/shull/New(var/newloc) //Spaaaace ship.
+ ..(newloc, MAT_STEELHULL, null, MAT_STEELHULL)
+/turf/simulated/wall/rshull/New(var/newloc)
+ ..(newloc, MAT_STEELHULL, MAT_STEELHULL, MAT_STEELHULL)
+/turf/simulated/wall/pshull/New(var/newloc) //Spaaaace-er ship.
+ ..(newloc, MAT_PLASTEELHULL, null, MAT_PLASTEELHULL)
+/turf/simulated/wall/rpshull/New(var/newloc)
+ ..(newloc, MAT_PLASTEELHULL, MAT_PLASTEELHULL, MAT_PLASTEELHULL)
+/turf/simulated/wall/dshull/New(var/newloc) //Spaaaace-est ship.
+ ..(newloc, MAT_DURASTEELHULL, null, MAT_DURASTEELHULL)
+/turf/simulated/wall/rdshull/New(var/newloc)
+ ..(newloc, MAT_DURASTEELHULL, MAT_DURASTEELHULL, MAT_DURASTEELHULL)
+/turf/simulated/wall/thull/New(var/newloc)
+ ..(newloc, MAT_TITANIUMHULL, null, MAT_TITANIUMHULL)
+/turf/simulated/wall/rthull/New(var/newloc)
+ ..(newloc, MAT_TITANIUMHULL, MAT_TITANIUMHULL, MAT_TITANIUMHULL)
+
/turf/simulated/wall/cult
icon_state = "cult"
/turf/simulated/wall/cult/New(var/newloc)
@@ -118,7 +135,7 @@
icon_state = "alien"
base_state = "alien"
light_range = 3
- light_power = 3
+ light_power = 0.75
light_color = "#ff0066" // Pink-ish
block_tele = TRUE // Will be used for dungeons so this is needed to stop cheesing with handteles.
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index e5bb57ad9e..b64ba73ee3 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -115,9 +115,9 @@
plant.pixel_y = 0
plant.update_neighbors()
-/turf/simulated/wall/ChangeTurf(var/newtype)
+/turf/simulated/wall/ChangeTurf(var/turf/N, var/tell_universe, var/force_lighting_update, var/preserve_outdoors)
clear_plants()
- ..(newtype)
+ ..(N, tell_universe, force_lighting_update, preserve_outdoors)
//Appearance
/turf/simulated/wall/examine(mob/user)
diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm
index e4b762d733..6539348e5d 100644
--- a/code/game/turfs/simulated/water.dm
+++ b/code/game/turfs/simulated/water.dm
@@ -9,6 +9,8 @@
edge_blending_priority = -1
movement_cost = 4
outdoors = TRUE
+ can_dirty = FALSE // It's water
+
var/depth = 1 // Higher numbers indicates deeper water.
/turf/simulated/floor/water/initialize()
@@ -19,6 +21,7 @@
..() // To get the edges.
icon_state = water_state
var/image/floorbed_sprite = image(icon = 'icons/turf/outdoors.dmi', icon_state = under_state)
+ underlays.Cut() // To clear the old underlay, so the list doesn't expand infinitely
underlays.Add(floorbed_sprite)
update_icon_edge()
diff --git a/code/game/turfs/space/cracked_asteroid.dm b/code/game/turfs/space/cracked_asteroid.dm
index dae0d5a129..75cf25fd3f 100644
--- a/code/game/turfs/space/cracked_asteroid.dm
+++ b/code/game/turfs/space/cracked_asteroid.dm
@@ -6,6 +6,7 @@
desc = "Rough sand with a huge crack. It probably leads out into the void."
icon_state = "asteroid_cracked"
dynamic_lighting = TRUE
+ keep_sprite = TRUE
/turf/space/cracked_asteroid/is_space() // So people don't start floating when standing on it.
return FALSE
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 61ad8faddd..ed48013050 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -6,14 +6,14 @@
temperature = T20C
thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT
- var/keep_sprite = 0
+ var/keep_sprite = FALSE
// heat_capacity = 700000 No.
-/turf/space/New()
- if(!istype(src, /turf/space/transit) && !istype(src, /turf/space/cracked_asteroid))
+/turf/space/initialize()
+ . = ..()
+ if(!keep_sprite)
icon_state = "[((x + y) ^ ~(x * y) + z) % 25]"
update_starlight()
- ..()
/turf/space/is_space()
return 1
@@ -33,18 +33,18 @@
/turf/space/attackby(obj/item/C as obj, mob/user as mob)
- if (istype(C, /obj/item/stack/rods))
+ if(istype(C, /obj/item/stack/rods))
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L)
return
var/obj/item/stack/rods/R = C
if (R.use(1))
- user << "Constructing support lattice ..."
+ to_chat(user, "Constructing support lattice ...")
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
ReplaceWithLattice()
return
- if (istype(C, /obj/item/stack/tile/floor))
+ if(istype(C, /obj/item/stack/tile/floor))
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L)
var/obj/item/stack/tile/floor/S = C
@@ -56,7 +56,33 @@
ChangeTurf(/turf/simulated/floor/airless)
return
else
- user << "The plating is going to need some support."
+ to_chat(user, "The plating is going to need some support.")
+
+ if(istype(C, /obj/item/stack/tile/roofing))
+ var/turf/T = GetAbove(src)
+ var/obj/item/stack/tile/roofing/R = C
+
+ // Patch holes in the ceiling
+ if(T)
+ if(istype(T, /turf/simulated/open) || istype(T, /turf/space))
+ // Must be build adjacent to an existing floor/wall, no floating floors
+ var/turf/simulated/A = locate(/turf/simulated/floor) in T.CardinalTurfs()
+ if(!A)
+ A = locate(/turf/simulated/wall) in T.CardinalTurfs()
+ if(!A)
+ to_chat(user, "There's nothing to attach the ceiling to!")
+ return
+
+ if(R.use(1)) // Cost of roofing tiles is 1:1 with cost to place lattice and plating
+ T.ReplaceWithLattice()
+ T.ChangeTurf(/turf/simulated/floor)
+ playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
+ user.visible_message("[user] expands the ceiling.", "You expand the ceiling.")
+ else
+ to_chat(user, "There aren't any holes in the ceiling to patch here.")
+ return
+ // Space shouldn't have weather of the sort planets with atmospheres do.
+ // If that's changed, then you'll want to swipe the rest of the roofing code from code/game/turfs/simulated/floor_attackby.dm
return
@@ -64,7 +90,7 @@
/turf/space/Entered(atom/movable/A as mob|obj)
if(movement_disabled)
- usr << "Movement is admin-disabled." //This is to identify lag problems
+ to_chat(usr, "Movement is admin-disabled.") //This is to identify lag problems
return
..()
if ((!(A) || src != A.loc)) return
@@ -187,5 +213,5 @@
A.loc.Entered(A)
return
-/turf/space/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0)
- return ..(N, tell_universe, 1)
+/turf/space/ChangeTurf(var/turf/N, var/tell_universe, var/force_lighting_update, var/preserve_outdoors)
+ return ..(N, tell_universe, 1, preserve_outdoors)
diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm
index 236f94de82..79550c3f30 100644
--- a/code/game/turfs/space/transit.dm
+++ b/code/game/turfs/space/transit.dm
@@ -1,5 +1,5 @@
/turf/space/transit
- keep_sprite = 1
+ keep_sprite = TRUE
var/pushdirection // push things that get caught in the transit tile this direction
//Overwrite because we dont want people building rods in space.
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 58da7d1129..724799ebde 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -137,6 +137,8 @@ turf/attackby(obj/item/weapon/W as obj, mob/user as mob)
animate(O, transform = turn(O.transform, -40), time = 4)
sleep(4)
animate(O, transform = turn(O.transform, 20), time = 2)
+ sleep(2)
+ O.update_transform()
/turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area)
if(movement_disabled && usr.ckey != movement_disabled_exception)
diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm
index 84d832b45c..5e5d3d9baf 100644
--- a/code/game/turfs/turf_changing.dm
+++ b/code/game/turfs/turf_changing.dm
@@ -22,14 +22,13 @@
below.update_icon() // To add or remove the 'ceiling-less' overlay.
//Creates a new turf
-/turf/proc/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0)
+/turf/proc/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0, var/preserve_outdoors = FALSE)
if (!N)
return
- // This makes sure that turfs are not changed to space when one side is part of a zone
if(N == /turf/space)
var/turf/below = GetBelow(src)
- if(istype(below) && (air_master.has_valid_zone(below) || air_master.has_valid_zone(src)))
+ if(istype(below) && !istype(below,/turf/space))
N = /turf/simulated/open
var/obj/fire/old_fire = fire
@@ -37,8 +36,8 @@
var/old_dynamic_lighting = dynamic_lighting
var/old_affecting_lights = affecting_lights
var/old_lighting_overlay = lighting_overlay
- var/old_weather_overlay = weather_overlay
var/old_corners = corners
+ var/old_outdoors = outdoors
//world << "Replacing [src.type] with [N]"
@@ -56,9 +55,6 @@
if(old_fire)
fire = old_fire
- if(old_weather_overlay)
- W.weather_overlay = old_weather_overlay
-
if (istype(W,/turf/simulated/floor))
W.RemoveLattice()
@@ -83,9 +79,6 @@
if(old_fire)
old_fire.RemoveFire()
- if(old_weather_overlay)
- W.weather_overlay = old_weather_overlay
-
if(tell_universe)
universe.OnTurfChange(W)
@@ -113,3 +106,6 @@
lighting_build_overlay()
else
lighting_clear_overlay()
+
+ if(preserve_outdoors)
+ outdoors = old_outdoors
\ No newline at end of file
diff --git a/code/game/turfs/unsimulated/planetary.dm b/code/game/turfs/unsimulated/planetary.dm
index 613638ec80..35cd7aa4a8 100644
--- a/code/game/turfs/unsimulated/planetary.dm
+++ b/code/game/turfs/unsimulated/planetary.dm
@@ -1,7 +1,5 @@
// This is a wall you surround the area of your "planet" with, that makes the atmosphere inside stay within bounds, even if canisters
// are opened or other strange things occur.
-var/list/planetary_walls = list()
-
/turf/unsimulated/wall/planetary
name = "railroading"
desc = "Choo choo!"
@@ -21,10 +19,10 @@ var/list/planetary_walls = list()
/turf/unsimulated/wall/planetary/New()
..()
- planetary_walls.Add(src)
+ SSplanets.addTurf(src)
/turf/unsimulated/wall/planetary/Destroy()
- planetary_walls.Remove(src)
+ SSplanets.removeTurf(src)
..()
/turf/unsimulated/wall/planetary/proc/set_temperature(var/new_temperature)
diff --git a/code/global.dm b/code/global.dm
index 8c6ae38f97..88df87a100 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -6,7 +6,8 @@
// Items that ask to be called every cycle.
var/global/datum/datacore/data_core = null
var/global/list/all_areas = list()
-var/global/list/machines = list() // TODO - Move into SSmachines
+var/global/list/machines = list() // ALL Machines, wether processing or not.
+var/global/list/processing_machines = list() // TODO - Move into SSmachines
var/global/list/processing_objects = list()
var/global/list/processing_power_items = list() // TODO - Move into SSmachines
var/global/list/active_diseases = list()
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 84aa437c55..1ee7dc9686 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -52,6 +52,11 @@ proc/admin_notice(var/message, var/rights)
else
body += " \[Heal\] "
+ if(M.client)
+ body += " First connection: [M.client.player_age] days ago"
+ body += " BYOND account created: [M.client.account_join_date]"
+ body += " BYOND account age (days): [M.client.account_age]"
+
body += {"
\[
VV -
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 6b038aca4e..56a440b639 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -132,7 +132,9 @@ var/list/admin_verbs_fun = list(
/client/proc/editappear,
/client/proc/roll_dices,
/datum/admins/proc/call_supply_drop,
- /datum/admins/proc/call_drop_pod
+ /datum/admins/proc/call_drop_pod,
+ /client/proc/smite,
+ /client/proc/admin_lightning_strike
)
var/list/admin_verbs_spawn = list(
@@ -174,7 +176,8 @@ var/list/admin_verbs_server = list(
/client/proc/nanomapgen_DumpImage,
/client/proc/modify_server_news,
/client/proc/recipe_dump,
- /client/proc/panicbunker
+ /client/proc/panicbunker,
+ /client/proc/paranoia_logging
)
var/list/admin_verbs_debug = list(
@@ -650,11 +653,13 @@ var/list/admin_verbs_event_manager = list(
set desc = "Cause an explosion of varying strength at your location."
var/turf/epicenter = mob.loc
- var/list/choices = list("Small Bomb", "Medium Bomb", "Big Bomb", "Custom Bomb")
+ var/list/choices = list("Small Bomb", "Medium Bomb", "Big Bomb", "Custom Bomb", "Cancel")
var/choice = input("What size explosion would you like to produce?") in choices
switch(choice)
if(null)
return 0
+ if("Cancel")
+ return 0
if("Small Bomb")
explosion(epicenter, 1, 2, 3, 3)
if("Medium Bomb")
diff --git a/code/modules/admin/secrets/fun_secrets/fix_all_lights.dm b/code/modules/admin/secrets/fun_secrets/fix_all_lights.dm
index 387f6d3ce7..622c68d2ea 100644
--- a/code/modules/admin/secrets/fun_secrets/fix_all_lights.dm
+++ b/code/modules/admin/secrets/fun_secrets/fix_all_lights.dm
@@ -6,5 +6,5 @@
if(!.)
return
- for(var/obj/machinery/light/L in world)
+ for(var/obj/machinery/light/L in machines)
L.fix()
diff --git a/code/modules/admin/secrets/random_events/gravity.dm b/code/modules/admin/secrets/random_events/gravity.dm
index 8d4cad4960..929d34601e 100644
--- a/code/modules/admin/secrets/random_events/gravity.dm
+++ b/code/modules/admin/secrets/random_events/gravity.dm
@@ -16,7 +16,7 @@
return
gravity_is_on = !gravity_is_on
- for(var/area/A in world)
+ for(var/area/A in all_areas)
A.gravitychange(gravity_is_on,A)
feedback_inc("admin_secrets_fun_used",1)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 358df91af6..28470c376e 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1316,6 +1316,16 @@
feedback_inc("admin_cookies_spawned",1)
H << "Your prayers have been answered!! You received the best cookie!"
+ else if(href_list["adminsmite"])
+ if(!check_rights(R_ADMIN|R_FUN)) return
+
+ var/mob/living/carbon/human/H = locate(href_list["adminsmite"])
+ if(!ishuman(H))
+ usr << "This can only be used on instances of type /mob/living/carbon/human"
+ return
+
+ owner.smite(H)
+
else if(href_list["BlueSpaceArtillery"])
if(!check_rights(R_ADMIN|R_FUN)) return
@@ -1327,37 +1337,7 @@
if(alert(src.owner, "Are you sure you wish to hit [key_name(M)] with Blue Space Artillery?", "Confirm Firing?" , "Yes" , "No") != "Yes")
return
- if(BSACooldown)
- src.owner << "Standby! Reload cycle in progress! Gunnary crews ready in five seconds!"
- return
-
- BSACooldown = 1
- spawn(50)
- BSACooldown = 0
-
- M << "You've been hit by bluespace artillery!"
- log_admin("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]")
- message_admins("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]")
-
- var/obj/effect/stop/S
- S = new /obj/effect/stop
- S.victim = M
- S.loc = M.loc
- spawn(20)
- qdel(S)
-
- var/turf/simulated/floor/T = get_turf(M)
- if(istype(T))
- if(prob(80)) T.break_tile_to_plating()
- else T.break_tile()
-
- if(M.health == 1)
- M.gib()
- else
- M.adjustBruteLoss( min( 99 , (M.health - 1) ) )
- M.Stun(20)
- M.Weaken(20)
- M.stuttering = 20
+ bluespace_artillery(M,src)
else if(href_list["CentComReply"])
var/mob/living/L = locate(href_list["CentComReply"])
diff --git a/code/modules/admin/verbs/SDQL.dm b/code/modules/admin/verbs/SDQL.dm
index 7c8ae52312..969e5cd47c 100644
--- a/code/modules/admin/verbs/SDQL.dm
+++ b/code/modules/admin/verbs/SDQL.dm
@@ -85,32 +85,32 @@
else
var/f2 = text2path(f)
if(text_starts_with(f, "/mob"))
- for(var/mob/m in world)
+ for(var/mob/m in mob_list)
if(istype(m, f2))
from_objs += m
else if(text_starts_with(f, "/turf/space"))
- for(var/turf/space/m in world)
+ for(var/turf/space/m in turfs)
if(istype(m, f2))
from_objs += m
else if(text_starts_with(f, "/turf/simulated"))
- for(var/turf/simulated/m in world)
+ for(var/turf/simulated/m in turfs)
if(istype(m, f2))
from_objs += m
else if(text_starts_with(f, "/turf/unsimulated"))
- for(var/turf/unsimulated/m in world)
+ for(var/turf/unsimulated/m in turfs)
if(istype(m, f2))
from_objs += m
else if(text_starts_with(f, "/turf"))
- for(var/turf/m in world)
+ for(var/turf/m in turfs)
if(istype(m, f2))
from_objs += m
else if(text_starts_with(f, "/area"))
- for(var/area/m in world)
+ for(var/area/m in all_areas)
if(istype(m, f2))
from_objs += m
@@ -120,7 +120,7 @@
from_objs += m
else if(text_starts_with(f, "/obj/machinery"))
- for(var/obj/machinery/m in world)
+ for(var/obj/machinery/m in machines)
if(istype(m, f2))
from_objs += m
@@ -135,7 +135,7 @@
from_objs += m
/*
else
- for(var/datum/m in world)
+ for(var/datum/m in nope)
if(istype(m, f2))
from_objs += m
*/
diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm
index e57720bb62..823a540d10 100644
--- a/code/modules/admin/verbs/adminjump.dm
+++ b/code/modules/admin/verbs/adminjump.dm
@@ -21,7 +21,7 @@
else
alert("Admin jumping disabled")
-/client/proc/jumptoturf(var/turf/T in world)
+/client/proc/jumptoturf(var/turf/T in turfs)
set name = "Jump to Turf"
set category = "Admin"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG))
diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm
index 22689f1718..13c6e6a767 100644
--- a/code/modules/admin/verbs/antag-ooc.dm
+++ b/code/modules/admin/verbs/antag-ooc.dm
@@ -12,7 +12,7 @@
else if(is_antag && !is_admin) // Is an antag, and not an admin, meaning we need to check if their antag type allows AOOC.
var/datum/antagonist/A = get_antag_data(usr.mind.special_role)
- if(!A || !A.can_use_aooc)
+ if(!A || !A.can_speak_aooc || !A.can_hear_aooc)
to_chat(usr, "Sorry, but your antagonist type is not allowed to speak in AOOC.")
return
@@ -36,7 +36,7 @@
var/datum/antagonist/A = null
if(M.mind) // Observers don't have minds, but they should still see AOOC.
A = get_antag_data(M.mind.special_role)
- if((M.mind && M.mind.special_role && A && A.can_use_aooc) || isobserver(M)) // Antags must have their type be allowed to AOOC to see AOOC. This prevents, say, ERT from seeing AOOC.
+ if((M.mind && M.mind.special_role && A && A.can_hear_aooc) || isobserver(M)) // Antags must have their type be allowed to AOOC to see AOOC. This prevents, say, ERT from seeing AOOC.
to_chat(M, "[create_text_tag("aooc", "Antag-OOC:", M.client)] [player_display]: [msg]")
log_aooc(msg,src)
\ No newline at end of file
diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm
index 169d82dba3..083789e550 100644
--- a/code/modules/admin/verbs/atmosdebug.dm
+++ b/code/modules/admin/verbs/atmosdebug.dm
@@ -12,23 +12,23 @@
usr << "Checking for disconnected pipes..."
//all plumbing - yes, some things might get stated twice, doesn't matter.
- for (var/obj/machinery/atmospherics/plumbing in world)
+ for (var/obj/machinery/atmospherics/plumbing in machines)
if (plumbing.nodealert)
usr << "Unconnected [plumbing.name] located at [plumbing.x],[plumbing.y],[plumbing.z] ([get_area(plumbing.loc)])"
//Manifolds
- for (var/obj/machinery/atmospherics/pipe/manifold/pipe in world)
+ for (var/obj/machinery/atmospherics/pipe/manifold/pipe in machines)
if (!pipe.node1 || !pipe.node2 || !pipe.node3)
usr << "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])"
//Pipes
- for (var/obj/machinery/atmospherics/pipe/simple/pipe in world)
+ for (var/obj/machinery/atmospherics/pipe/simple/pipe in machines)
if (!pipe.node1 || !pipe.node2)
usr << "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])"
usr << "Checking for overlapping pipes..."
next_turf:
- for(var/turf/T in world)
+ for(var/turf/T in turfs)
for(var/dir in cardinal)
var/list/connect_types = list(1 = 0, 2 = 0, 3 = 0)
for(var/obj/machinery/atmospherics/pipe in T)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 326a317bfd..c6f2c0321e 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -173,96 +173,6 @@
else
alert("Invalid mob")
-/*
-/client/proc/cmd_admin_monkeyize(var/mob/M in world)
- set category = "Fun"
- set name = "Make Monkey"
-
- if(!ticker)
- alert("Wait until the game starts")
- return
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/target = M
- log_admin("[key_name(src)] is attempting to monkeyize [M.key].")
- spawn(10)
- target.monkeyize()
- else
- alert("Invalid mob")
-
-/client/proc/cmd_admin_changelinginize(var/mob/M in world)
- set category = "Fun"
- set name = "Make Changeling"
-
- if(!ticker)
- alert("Wait until the game starts")
- return
- if(istype(M, /mob/living/carbon/human))
- log_admin("[key_name(src)] has made [M.key] a changeling.")
- spawn(10)
- M.absorbed_dna[M.real_name] = M.dna.Clone()
- M.make_changeling()
- if(M.mind)
- M.mind.special_role = "Changeling"
- else
- alert("Invalid mob")
-*/
-/*
-/client/proc/cmd_admin_abominize(var/mob/M in world)
- set category = null
- set name = "Make Abomination"
-
- usr << "Ruby Mode disabled. Command aborted."
- return
- if(!ticker)
- alert("Wait until the game starts.")
- return
- if(istype(M, /mob/living/carbon/human))
- log_admin("[key_name(src)] has made [M.key] an abomination.")
-
- // spawn(10)
- // M.make_abomination()
-
-*/
-/*
-/client/proc/make_cultist(var/mob/M in world) // -- TLE, modified by Urist
- set category = "Fun"
- set name = "Make Cultist"
- set desc = "Makes target a cultist"
- if(!cultwords["travel"])
- runerandom()
- if(M)
- if(M.mind in ticker.mode.cult)
- return
- else
- if(alert("Spawn that person a tome?",,"Yes","No")=="Yes")
- M << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie. A tome, a message from your new master, appears on the ground."
- new /obj/item/weapon/book/tome(M.loc)
- else
- M << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie."
- var/glimpse=pick("1","2","3","4","5","6","7","8")
- switch(glimpse)
- if("1")
- M << "You remembered one thing from the glimpse... [cultwords["travel"]] is travel..."
- if("2")
- M << "You remembered one thing from the glimpse... [cultwords["blood"]] is blood..."
- if("3")
- M << "You remembered one thing from the glimpse... [cultwords["join"]] is join..."
- if("4")
- M << "You remembered one thing from the glimpse... [cultwords["hell"]] is Hell..."
- if("5")
- M << "You remembered one thing from the glimpse... [cultwords["destroy"]] is destroy..."
- if("6")
- M << "You remembered one thing from the glimpse... [cultwords["technology"]] is technology..."
- if("7")
- M << "You remembered one thing from the glimpse... [cultwords["self"]] is self..."
- if("8")
- M << "You remembered one thing from the glimpse... [cultwords["see"]] is see..."
-
- if(M.mind)
- M.mind.special_role = "Cultist"
- ticker.mode.cult += M.mind
- src << "Made [M] a cultist."
-*/
//TODO: merge the vievars version into this or something maybe mayhaps
/client/proc/cmd_debug_del_all()
@@ -431,41 +341,41 @@
var/list/areas_with_intercom = list()
var/list/areas_with_camera = list()
- for(var/area/A in world)
+ for(var/area/A in all_areas)
if(!(A.type in areas_all))
areas_all.Add(A.type)
- for(var/obj/machinery/power/apc/APC in world)
+ for(var/obj/machinery/power/apc/APC in machines)
var/area/A = get_area(APC)
if(!(A.type in areas_with_APC))
areas_with_APC.Add(A.type)
- for(var/obj/machinery/alarm/alarm in world)
+ for(var/obj/machinery/alarm/alarm in machines)
var/area/A = get_area(alarm)
if(!(A.type in areas_with_air_alarm))
areas_with_air_alarm.Add(A.type)
- for(var/obj/machinery/requests_console/RC in world)
+ for(var/obj/machinery/requests_console/RC in machines)
var/area/A = get_area(RC)
if(!(A.type in areas_with_RC))
areas_with_RC.Add(A.type)
- for(var/obj/machinery/light/L in world)
+ for(var/obj/machinery/light/L in machines)
var/area/A = get_area(L)
if(!(A.type in areas_with_light))
areas_with_light.Add(A.type)
- for(var/obj/machinery/light_switch/LS in world)
+ for(var/obj/machinery/light_switch/LS in machines)
var/area/A = get_area(LS)
if(!(A.type in areas_with_LS))
areas_with_LS.Add(A.type)
- for(var/obj/item/device/radio/intercom/I in world)
+ for(var/obj/item/device/radio/intercom/I in machines)
var/area/A = get_area(I)
if(!(A.type in areas_with_intercom))
areas_with_intercom.Add(A.type)
- for(var/obj/machinery/camera/C in world)
+ for(var/obj/machinery/camera/C in machines)
var/area/A = get_area(C)
if(!(A.type in areas_with_camera))
areas_with_camera.Add(A.type)
@@ -546,31 +456,31 @@
if(alert("Are you sure? This will start up the engine. Should only be used during debug!",,"Yes","No") != "Yes")
return
- for(var/obj/machinery/power/emitter/E in world)
+ for(var/obj/machinery/power/emitter/E in machines)
if(istype(get_area(E), /area/space))
E.anchored = TRUE
E.state = 2
E.connect_to_network()
E.active = TRUE
- for(var/obj/machinery/field_generator/F in world)
+ for(var/obj/machinery/field_generator/F in machines)
if(istype(get_area(F), /area/space))
F.Varedit_start = 1
- for(var/obj/machinery/power/grounding_rod/GR in world)
+ for(var/obj/machinery/power/grounding_rod/GR in machines)
GR.anchored = TRUE
GR.update_icon()
- for(var/obj/machinery/power/tesla_coil/TC in world)
+ for(var/obj/machinery/power/tesla_coil/TC in machines)
TC.anchored = TRUE
TC.update_icon()
- for(var/obj/structure/particle_accelerator/PA in world)
+ for(var/obj/structure/particle_accelerator/PA in machines)
PA.anchored = TRUE
PA.construction_state = 3
PA.update_icon()
- for(var/obj/machinery/particle_accelerator/PA in world)
+ for(var/obj/machinery/particle_accelerator/PA in machines)
PA.anchored = TRUE
PA.construction_state = 3
PA.update_icon()
- for(var/obj/machinery/power/rad_collector/Rad in world)
+ for(var/obj/machinery/power/rad_collector/Rad in machines)
if(Rad.anchored)
if(!Rad.P)
var/obj/item/weapon/tank/phoron/Phoron = new/obj/item/weapon/tank/phoron(Rad)
@@ -597,7 +507,7 @@
var/found_the_pump = 0
var/obj/machinery/power/supermatter/SM
- for(var/obj/machinery/M in world)
+ for(var/obj/machinery/M in machines)
if(!M)
continue
if(!M.loc)
@@ -727,7 +637,7 @@
if(!check_rights(R_DEBUG))
return
- var/datum/planet/planet = input(usr, "Which planet do you want to modify the weather on?", "Change Weather") in planet_controller.planets
+ var/datum/planet/planet = input(usr, "Which planet do you want to modify the weather on?", "Change Weather") in SSplanets.planets
var/datum/weather/new_weather = input(usr, "What weather do you want to change to?", "Change Weather") as null|anything in planet.weather_holder.allowed_weather_types
if(new_weather)
planet.weather_holder.change_weather(new_weather)
@@ -743,7 +653,7 @@
if(!check_rights(R_DEBUG))
return
- var/datum/planet/planet = input(usr, "Which planet do you want to modify time on?", "Change Time") in planet_controller.planets
+ var/datum/planet/planet = input(usr, "Which planet do you want to modify time on?", "Change Time") in SSplanets.planets
var/datum/time/current_time_datum = planet.current_time
var/new_hour = input(usr, "What hour do you want to change to?", "Change Time", text2num(current_time_datum.show_time("hh"))) as null|num
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index 595675ea80..9fdf39c0d1 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -48,7 +48,7 @@
var/largest_click_time = 0
var/mob/largest_move_mob = null
var/mob/largest_click_mob = null
- for(var/mob/M in world)
+ for(var/mob/M in mob_list)
if(!M.client)
continue
if(M.next_move >= largest_move_time)
diff --git a/code/modules/admin/verbs/grief_fixers.dm b/code/modules/admin/verbs/grief_fixers.dm
index 7059fef907..2d524b4c23 100644
--- a/code/modules/admin/verbs/grief_fixers.dm
+++ b/code/modules/admin/verbs/grief_fixers.dm
@@ -38,7 +38,7 @@
unsorted_overlays |= gas_data.tile_overlay[id]
- for(var/turf/simulated/T in world)
+ for(var/turf/simulated/T in turfs)
T.air = null
T.overlays.Remove(unsorted_overlays)
T.zone = null
diff --git a/code/modules/admin/verbs/lightning_strike.dm b/code/modules/admin/verbs/lightning_strike.dm
new file mode 100644
index 0000000000..16cb6b06dd
--- /dev/null
+++ b/code/modules/admin/verbs/lightning_strike.dm
@@ -0,0 +1,115 @@
+/client/proc/admin_lightning_strike()
+ set name = "Lightning Strike"
+ set desc = "Causes lightning to strike on your tile. This will hurt things on or nearby it severely."
+ set category = "Fun"
+
+ if(!check_rights(R_FUN))
+ return
+
+ var/result = alert(src, "Really strike your tile with lightning?", "Confirm Badmin" , "No", "Yes (Cosmetic)", "Yes (Real)")
+
+ if(result == "No")
+ return
+ var/fake_lightning = result == "Yes (Cosmetic)"
+
+ lightning_strike(get_turf(usr), fake_lightning)
+ log_and_message_admins("[key_name(src)] has caused [fake_lightning ? "cosmetic":"harmful"] lightning to strike at their position ([src.mob.x], [src.mob.y], [src.mob.z]). \
+ (JMP)")
+
+#define LIGHTNING_REDIRECT_RANGE 28 // How far in tiles certain things draw lightning from.
+#define LIGHTNING_ZAP_RANGE 3 // How far the tesla effect zaps, as well as the bad effects from a direct strike.
+#define LIGHTNING_POWER 20000 // How much 'zap' is in a strike, used for tesla_zap().
+
+// The real lightning proc.
+// This is global until I can figure out a better place for it.
+// T is the turf that is being struck. If cosmetic is true, the lightning won't actually hurt anything.
+/proc/lightning_strike(turf/T, cosmetic = FALSE)
+ // First, visuals.
+
+ // Do a lightning flash for the whole planet, if the turf belongs to a planet.
+ var/datum/planet/P = null
+ P = SSplanets.z_to_planet[T.z]
+ if(P)
+ var/datum/weather_holder/holder = P.weather_holder
+ flick("lightning_flash", holder.special_visuals)
+
+ // Before we do the other visuals, we need to see if something is going to hijack our intended target.
+ var/obj/machinery/power/grounding_rod/ground = null // Most of the bad effects of lightning will get negated if a grounding rod is nearby.
+ var/obj/machinery/power/tesla_coil/coil = null // However a tesla coil has higher priority and the strike will bounce.
+
+ for(var/obj/machinery/power/thing in range(LIGHTNING_REDIRECT_RANGE, T))
+ if(istype(thing, /obj/machinery/power/tesla_coil))
+ var/turf/simulated/coil_turf = get_turf(thing)
+ if(istype(coil_turf) && thing.anchored && coil_turf.outdoors)
+ coil = thing
+ break
+
+ if(istype(thing, /obj/machinery/power/grounding_rod))
+ var/turf/simulated/rod_turf = get_turf(thing)
+ if(istype(rod_turf) && thing.anchored && rod_turf.outdoors)
+ ground = thing
+
+ if(coil) // Coil gets highest priority.
+ T = coil.loc
+ else if(ground)
+ T = ground.loc
+
+ // Now make the lightning strike sprite. It will fade and delete itself in a second.
+ new /obj/effect/temporary_effect/lightning_strike(T)
+
+ // For those close up.
+ playsound(T, 'sound/effects/lightningbolt.ogg', 100, 1)
+
+ // And for those far away. If the strike happens on a planet, everyone on the planet will hear it.
+ // Otherwise only those on the current z-level will hear it.
+ var/sound = get_sfx("thunder")
+ for(var/mob/M in player_list)
+ if((P && M.z in P.expected_z_levels) || M.z == T.z)
+ M.playsound_local(get_turf(M), soundin = sound, vol = 70, vary = FALSE, is_global = TRUE)
+
+ if(cosmetic) // Everything beyond here involves potentially damaging things. If we don't want to do that, stop now.
+ return
+
+ if(ground) // All is well.
+ ground.tesla_act(LIGHTNING_POWER, FALSE)
+ return
+
+ else if(coil) // Otherwise lets bounce off the tesla coil.
+ coil.tesla_act(LIGHTNING_POWER, TRUE)
+
+ else // Striking the turf directly.
+ tesla_zap(T, zap_range = LIGHTNING_ZAP_RANGE, power = LIGHTNING_POWER, explosive = FALSE, stun_mobs = TRUE)
+
+ // Some extra effects.
+ // Some apply to those within zap range, others if they were a bit farther away.
+ for(var/mob/living/L in view(5, T))
+ if(get_dist(L, T) <= LIGHTNING_ZAP_RANGE) // They probably got zapped.
+ // The actual damage/electrocution is handled by tesla_zap().
+ L.Paralyse(5)
+ L.stuttering += 20
+ L.make_jittery(20)
+ L.emp_act(1)
+ to_chat(L, span("critical", "You've been struck by lightning!"))
+
+ // If a non-player simplemob was struck, inflict huge damage.
+ // If the damage is fatal, the SA is turned to ash.
+ if(istype(L, /mob/living/simple_animal) && !L.key)
+ var/mob/living/simple_animal/SA = L
+ SA.adjustFireLoss(200)
+ SA.updatehealth()
+ if(SA.health <= 0) // Might be best to check/give simple_mobs siemens when this gets ported to new mobs.
+ SA.visible_message(span("critical", "\The [SA] disintegrates into ash!"))
+ SA.ash()
+ continue // No point deafening something that wont exist.
+
+ // Deafen them.
+ if(L.get_ear_protection() < 2)
+ L.AdjustSleeping(-100)
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ C.ear_deaf += 10
+ to_chat(L, span("danger", "Lightning struck nearby, and the thunderclap is deafening!"))
+
+#undef GROUNDING_ROD_RANGE
+#undef LIGHTNING_ZAP_RANGE
+#undef LIGHTNING_POWER
\ No newline at end of file
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index 896509280e..04df02e37a 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -22,6 +22,8 @@
var/camera_range_display_status = 0
var/intercom_range_display_status = 0
+GLOBAL_LIST_BOILERPLATE(all_debugging_effects, /obj/effect/debugging)
+
/obj/effect/debugging/camera_range
icon = 'icons/480x480.dmi'
icon_state = "25percent"
@@ -54,7 +56,7 @@ var/intercom_range_display_status = 0
- for(var/obj/effect/debugging/camera_range/C in world)
+ for(var/obj/effect/debugging/camera_range/C in all_debugging_effects)
qdel(C)
if(camera_range_display_status)
@@ -113,11 +115,11 @@ var/intercom_range_display_status = 0
else
intercom_range_display_status = 1
- for(var/obj/effect/debugging/marker/M in world)
+ for(var/obj/effect/debugging/marker/M in all_debugging_effects)
qdel(M)
if(intercom_range_display_status)
- for(var/obj/item/device/radio/intercom/I in world)
+ for(var/obj/item/device/radio/intercom/I in machines)
for(var/turf/T in orange(7,I))
var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T)
if (!(F in view(7,I.loc)))
diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm
index ef770dbc60..09178d650e 100644
--- a/code/modules/admin/verbs/massmodvar.dm
+++ b/code/modules/admin/verbs/massmodvar.dm
@@ -144,7 +144,7 @@
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
- for(var/turf/A in world)
+ for(var/turf/A in turfs)
if ( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
@@ -160,7 +160,7 @@
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
- for(var/turf/A in world)
+ for(var/turf/A in turfs)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
@@ -184,7 +184,7 @@
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
- for(var/turf/A in world)
+ for(var/turf/A in turfs)
if ( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
else
@@ -199,7 +199,7 @@
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
- for(var/turf/A in world)
+ for(var/turf/A in turfs)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
@@ -231,7 +231,7 @@
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
- for(var/turf/A in world)
+ for(var/turf/A in turfs)
if ( istype(A , O.type) )
if(variable=="light_range")
A.set_light(new_value)
@@ -256,7 +256,7 @@
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
- for(var/turf/A in world)
+ for(var/turf/A in turfs)
if (A.type == O.type)
if(variable=="light_range")
A.set_light(new_value)
@@ -280,7 +280,7 @@
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
- for(var/turf/A in world)
+ for(var/turf/A in turfs)
if ( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
else
@@ -295,7 +295,7 @@
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
- for(var/turf/A in world)
+ for(var/turf/A in turfs)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
@@ -316,7 +316,7 @@
A.vars[variable] = O.vars[variable]
else if(istype(O.type, /turf))
- for(var/turf/A in world)
+ for(var/turf/A in turfs)
if ( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
else
@@ -331,7 +331,7 @@
A.vars[variable] = O.vars[variable]
else if(istype(O.type, /turf))
- for(var/turf/A in world)
+ for(var/turf/A in turfs)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
@@ -351,7 +351,7 @@
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
- for(var/turf/A in world)
+ for(var/turf/A in turfs)
if ( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
@@ -367,7 +367,7 @@
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
- for(var/turf/A in world)
+ for(var/turf/A in turfs)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
diff --git a/code/modules/admin/verbs/panicbunker.dm b/code/modules/admin/verbs/panicbunker.dm
index ac31c26071..a997fdcb11 100644
--- a/code/modules/admin/verbs/panicbunker.dm
+++ b/code/modules/admin/verbs/panicbunker.dm
@@ -1,15 +1,31 @@
/client/proc/panicbunker()
set category = "Server"
set name = "Toggle Panic Bunker"
+
+ if(!check_rights(R_ADMIN))
+ return
+
if (!config.sql_enabled)
to_chat(usr, "The Database is not enabled!")
return
config.panic_bunker = (!config.panic_bunker)
- log_admin("[key_name(usr)] has toggled the Panic Bunker, it is now [(config.panic_bunker?"on":"off")]")
- message_admins("[key_name_admin(usr)] has toggled the Panic Bunker, it is now [(config.panic_bunker?"enabled":"disabled")].")
+ log_and_message_admins("[key_name(usr)] has toggled the Panic Bunker, it is now [(config.panic_bunker?"on":"off")]")
if (config.panic_bunker && (!dbcon || !dbcon.IsConnected()))
message_admins("The Database is not connected! Panic bunker will not work until the connection is reestablished.")
feedback_add_details("admin_verb","PANIC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/client/proc/paranoia_logging()
+ set category = "Server"
+ set name = "New Player Warnings"
+
+ if(!check_rights(R_ADMIN))
+ return
+
+ config.paranoia_logging = (!config.paranoia_logging)
+
+ log_and_message_admins("[key_name(usr)] has toggled Paranoia Logging, it is now [(config.paranoia_logging?"on":"off")]")
+ if (config.paranoia_logging && (!dbcon || !dbcon.IsConnected()))
+ message_admins("The Database is not connected! Paranoia logging will not be able to give 'player age' (time since first connection) warnings, only Byond account warnings.")
+ feedback_add_details("admin_verb","PARLOG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index eb7451c61c..c622f08516 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -54,12 +54,12 @@ var/list/sounds_cache = list()
set name = "Cuban Pete Time"
message_admins("[key_name_admin(usr)] has declared Cuban Pete Time!", 1)
- for(var/mob/M in world)
+ for(var/mob/M in player_list)
if(M.client)
if(M.client.midis)
M << 'cubanpetetime.ogg'
- for(var/mob/living/carbon/human/CP in world)
+ for(var/mob/living/carbon/human/CP in human_mob_list)
if(CP.real_name=="Cuban Pete" && CP.key!="Rosham")
CP << "Your body can't contain the rhumba beat"
CP.gib()
@@ -70,7 +70,7 @@ var/list/sounds_cache = list()
set name = "Banana Phone"
message_admins("[key_name_admin(usr)] has activated Banana Phone!", 1)
- for(var/mob/M in world)
+ for(var/mob/M in player_list)
if(M.client)
if(M.client.midis)
M << 'bananaphone.ogg'
@@ -81,7 +81,7 @@ client/proc/space_asshole()
set name = "Space Asshole"
message_admins("[key_name_admin(usr)] has played the Space Asshole Hymn.", 1)
- for(var/mob/M in world)
+ for(var/mob/M in player_list)
if(M.client)
if(M.client.midis)
M << 'sound/music/space_asshole.ogg'
@@ -92,7 +92,7 @@ client/proc/honk_theme()
set name = "Honk"
message_admins("[key_name_admin(usr)] has creeped everyone out with Blackest Honks.", 1)
- for(var/mob/M in world)
+ for(var/mob/M in player_list)
if(M.client)
if(M.client.midis)
M << 'honk_theme.ogg'*/
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index b8fbf77ed3..5469367beb 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -17,7 +17,7 @@
return
var/image/cross = image('icons/obj/storage.dmi',"bible")
- msg = "\icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC): [msg]"
+ msg = "\icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC) (SMITE): [msg]"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 9536f830fb..0373b8bf5d 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -219,7 +219,7 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No")
if(show_log == "Yes")
- command_announcement.Announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", new_sound = 'sound/AI/ionstorm.ogg')
+ command_announcement.Announce("Ion storm detected near \the [station_name()]. Please check all AI-controlled equipment for errors.", "Anomaly Alert", new_sound = 'sound/AI/ionstorm.ogg')
IonStorm(0)
feedback_add_details("admin_verb","ION") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -522,7 +522,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No")
if(show_log == "Yes")
- command_announcement.Announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", new_sound = 'sound/AI/ionstorm.ogg')
+ command_announcement.Announce("Ion storm detected near the [station_name()]. Please check all AI-controlled equipment for errors.", "Anomaly Alert", new_sound = 'sound/AI/ionstorm.ogg')
feedback_add_details("admin_verb","IONC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_rejuvenate(mob/living/M as mob in mob_list)
@@ -704,7 +704,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
switch(alert("How would you like to ban someone today?", "Manual Ban", "Key List", "Enter Manually", "Cancel"))
if("Key List")
var/list/keys = list()
- for(var/mob/M in world)
+ for(var/mob/M in player_list)
keys += M.client
var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in keys
if(!selection)
diff --git a/code/modules/admin/verbs/smite.dm b/code/modules/admin/verbs/smite.dm
new file mode 100644
index 0000000000..e8183e3665
--- /dev/null
+++ b/code/modules/admin/verbs/smite.dm
@@ -0,0 +1,83 @@
+/client/proc/smite(var/mob/living/carbon/human/target in player_list)
+ set name = "Smite"
+ set desc = "Abuse a player with various 'special treatments' from a list."
+ set category = "Fun"
+ if(!check_rights(R_FUN))
+ return
+
+ if(!istype(target))
+ return
+
+ var/list/smite_types = list(SMITE_BREAKLEGS,SMITE_BLUESPACEARTILLERY,SMITE_SPONTANEOUSCOMBUSTION,SMITE_LIGHTNINGBOLT)
+
+ var/smite_choice = input("Select the type of SMITE for [target]","SMITE Type Choice") as null|anything in smite_types
+ if(!smite_choice)
+ return
+
+ switch(smite_choice)
+ if(SMITE_BREAKLEGS)
+ var/broken_legs = 0
+ var/obj/item/organ/external/left_leg = target.get_organ(BP_L_LEG)
+ if(left_leg && left_leg.fracture())
+ broken_legs++
+ var/obj/item/organ/external/right_leg = target.get_organ(BP_R_LEG)
+ if(right_leg && right_leg.fracture())
+ broken_legs++
+ if(!broken_legs)
+ to_chat(src,"[target] didn't have any breakable legs, sorry.")
+
+ if(SMITE_BLUESPACEARTILLERY)
+ bluespace_artillery(target,src)
+
+ if(SMITE_SPONTANEOUSCOMBUSTION)
+ target.adjust_fire_stacks(10)
+ target.IgniteMob()
+ target.visible_message("[target] bursts into flames!")
+
+ if(SMITE_LIGHTNINGBOLT)
+ var/turf/T = get_step(get_step(target, NORTH), NORTH)
+ T.Beam(target, icon_state="lightning[rand(1,12)]", time = 5)
+ target.electrocute_act(75,def_zone = BP_HEAD)
+ target.visible_message("[target] is struck by lightning!")
+
+ else
+ return //Injection? Don't print any messages.
+
+ log_and_message_admins("[key_name(src)] has used SMITE ([smite_choice]) on [key_name(target)].")
+ feedback_add_details("admin_verb","SMITE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/proc/bluespace_artillery(mob/living/target, user)
+ if(!istype(target))
+ return
+
+ if(BSACooldown)
+ if(user)
+ to_chat(user,"BSA is still cooling down, please wait!")
+ return
+
+ BSACooldown = 1
+ spawn(50)
+ BSACooldown = 0
+
+ to_chat(target,"You've been hit by bluespace artillery!")
+ log_and_message_admins("[key_name(target)] has been hit by Bluespace Artillery fired by [key_name(user ? user : usr)]")
+
+ var/obj/effect/stop/S
+ S = new /obj/effect/stop
+ S.victim = target
+ S.loc = target.loc
+ spawn(20)
+ qdel(S)
+
+ var/turf/simulated/floor/T = get_turf(target)
+ if(istype(T))
+ if(prob(80)) T.break_tile_to_plating()
+ else T.break_tile()
+
+ if(target.health == 1)
+ target.gib()
+ else
+ target.adjustBruteLoss( min( 99 , (target.health - 1) ) )
+ target.Stun(20)
+ target.Weaken(20)
+ target.stuttering = 20
diff --git a/code/modules/artifice/deadringer.dm b/code/modules/artifice/deadringer.dm
new file mode 100644
index 0000000000..e12c0b0045
--- /dev/null
+++ b/code/modules/artifice/deadringer.dm
@@ -0,0 +1,177 @@
+/obj/item/weapon/deadringer
+ name = "silver pocket watch"
+ desc = "A fancy silver-plated digital pocket watch. Looks expensive."
+ icon = 'icons/obj/deadringer.dmi'
+ icon_state = "deadringer"
+ w_class = ITEMSIZE_SMALL
+ slot_flags = SLOT_ID | SLOT_BELT | SLOT_TIE
+ origin_tech = list(TECH_ILLEGAL = 3)
+ var/activated = 0
+ var/timer = 0
+ var/bruteloss_prev = 999999
+ var/fireloss_prev = 999999
+ var/mob/living/carbon/human/corpse = null
+ var/mob/living/carbon/human/watchowner = null
+
+
+/obj/item/weapon/deadringer/New()
+ ..()
+ processing_objects |= src
+
+/obj/item/weapon/deadringer/Destroy() //just in case some smartass tries to stay invisible by destroying the watch
+ uncloak()
+ processing_objects -= src
+ ..()
+
+/obj/item/weapon/deadringer/dropped()
+ if(timer > 20)
+ uncloak()
+ watchowner = null
+ return
+
+/obj/item/weapon/deadringer/attack_self(var/mob/living/user as mob)
+ var/mob/living/H = src.loc
+ if (!istype(H, /mob/living/carbon/human))
+ to_chat(H,"You have no clue what to do with this thing.")
+ return
+ if(!activated)
+ if(timer == 0)
+ to_chat(H, "You press a small button on [src]'s side. It starts to hum quietly.")
+ bruteloss_prev = H.getBruteLoss()
+ fireloss_prev = H.getFireLoss()
+ activated = 1
+ return
+ else
+ to_chat(H,"You press a small button on [src]'s side. It buzzes a little.")
+ return
+ if(activated)
+ to_chat(H,"You press a small button on [src]'s side. It stops humming.")
+ activated = 0
+ return
+
+/obj/item/weapon/deadringer/process()
+ if(activated)
+ if (ismob(src.loc))
+ var/mob/living/carbon/human/H = src.loc
+ watchowner = H
+ if(H.getBruteLoss() > bruteloss_prev || H.getFireLoss() > fireloss_prev)
+ deathprevent()
+ activated = 0
+ if(watchowner.isSynthetic())
+ to_chat(watchowner, "You fade into nothingness! [src]'s screen blinks, being unable to copy your synthetic body!")
+ else
+ to_chat(watchowner, "You fade into nothingness, leaving behind a fake body!")
+ icon_state = "deadringer_cd"
+ timer = 50
+ return
+ if(timer > 0)
+ timer--
+ if(timer == 20)
+ uncloak()
+ if(corpse)
+ new /obj/effect/effect/smoke/chem(corpse.loc)
+ qdel(corpse)
+ if(timer == 0)
+ icon_state = "deadringer"
+ return
+
+/obj/item/weapon/deadringer/proc/deathprevent()
+ for(var/mob/living/simple_animal/D in oviewers(7, src))
+ D.LoseTarget()
+ watchowner.emote("deathgasp")
+ watchowner.alpha = 15
+ makeacorpse(watchowner)
+ for(var/mob/living/simple_animal/D in oviewers(7, src))
+ D.LoseTarget()
+ return
+
+/obj/item/weapon/deadringer/proc/uncloak()
+ if(watchowner)
+ watchowner.alpha = 255
+ playsound(get_turf(src), 'sound/effects/uncloak.ogg', 35, 1, -1)
+ return
+
+/obj/item/weapon/deadringer/proc/makeacorpse(var/mob/living/carbon/human/H)
+ if(H.isSynthetic())
+ return
+ corpse = new /mob/living/carbon/human(H.loc)
+ corpse.setDNA(H.dna.Clone())
+ corpse.death(1) //Kills the new mob
+ var/obj/item/clothing/temp = null
+ if(H.get_equipped_item(slot_w_uniform))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/under/chameleon/changeling(corpse), slot_w_uniform)
+ temp = corpse.get_equipped_item(slot_w_uniform)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_w_uniform)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_wear_suit))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/suit/chameleon/changeling(corpse), slot_wear_suit)
+ temp = corpse.get_equipped_item(slot_wear_suit)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_wear_suit)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_shoes))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/shoes/chameleon/changeling(corpse), slot_shoes)
+ temp = corpse.get_equipped_item(slot_shoes)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_shoes)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_gloves))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/gloves/chameleon/changeling(corpse), slot_gloves)
+ temp = corpse.get_equipped_item(slot_gloves)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_gloves)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_l_ear))
+ temp = H.get_equipped_item(slot_l_ear)
+ corpse.equip_to_slot_or_del(new temp.type(corpse), slot_l_ear)
+ temp = corpse.get_equipped_item(slot_l_ear)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_glasses))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/glasses/chameleon/changeling(corpse), slot_glasses)
+ temp = corpse.get_equipped_item(slot_glasses)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_glasses)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_wear_mask))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/mask/chameleon/changeling(corpse), slot_wear_mask)
+ temp = corpse.get_equipped_item(slot_wear_mask)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_wear_mask)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_head))
+ corpse.equip_to_slot_or_del(new /obj/item/clothing/head/chameleon/changeling(corpse), slot_head)
+ temp = corpse.get_equipped_item(slot_head)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_head)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_belt))
+ corpse.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/chameleon/changeling(corpse), slot_belt)
+ temp = corpse.get_equipped_item(slot_belt)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_belt)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ if(H.get_equipped_item(slot_back))
+ corpse.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chameleon/changeling(corpse), slot_back)
+ temp = corpse.get_equipped_item(slot_back)
+ var/obj/item/clothing/c_type = H.get_equipped_item(slot_back)
+ temp.disguise(c_type.type)
+ temp.canremove = 0
+ corpse.identifying_gender = H.identifying_gender
+ corpse.flavor_texts = H.flavor_texts.Copy()
+ corpse.real_name = H.real_name
+ corpse.name = H.name
+ corpse.set_species(corpse.dna.species)
+ corpse.change_hair(H.h_style)
+ corpse.change_facial_hair(H.f_style)
+ corpse.change_hair_color(H.r_hair, H.g_hair, H.b_hair)
+ corpse.change_facial_hair_color(H.r_facial, H.g_facial, H.b_facial)
+ corpse.change_skin_color(H.r_skin, H.g_skin, H.b_skin)
+ corpse.adjustFireLoss(H.getFireLoss())
+ corpse.adjustBruteLoss(H.getBruteLoss())
+ corpse.UpdateAppearance()
+ corpse.regenerate_icons()
+ for(var/obj/item/organ/internal/I in corpse.internal_organs)
+ var/obj/item/organ/internal/G = I
+ G.Destroy()
+ return
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index 747b0d442b..8c965f0deb 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -102,7 +102,7 @@
if((!A.secured) && (!secured))
attach_assembly(A,user)
return
- if(isscrewdriver(W))
+ if(W.is_screwdriver())
if(toggle_secure())
to_chat(user, "\The [src] is ready!")
else
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index 1bbf0597e6..0cc5f49682 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -144,7 +144,7 @@
/obj/item/device/assembly_holder/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(isscrewdriver(W))
+ if(W.is_screwdriver())
if(!a_left || !a_right)
to_chat(user, " BUG:Assembly part missing, please report this!")
return
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 63c781452c..9e9eaeb868 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -250,9 +250,8 @@
return
/obj/effect/beam/i_beam/Destroy()
+ . = ..()
if(master.first == src)
master.first = null
- if(next)
- qdel(next)
- next = null
- ..()
+ if(next && !next.gc_destroyed)
+ qdel_null(next)
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index a956103e2d..c08b908dc4 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -39,7 +39,7 @@
log_debug("DEBUG: HasProximity called with [AM] on [src] ([usr]).")
return
if (istype(AM, /obj/effect/beam)) return
- if (AM.move_speed < 12) sense()
+ if (!isobserver(AM) && AM.move_speed < 12) sense()
return
diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm
index 0fbefc88d8..fd5c35bbfb 100644
--- a/code/modules/assembly/shock_kit.dm
+++ b/code/modules/assembly/shock_kit.dm
@@ -15,7 +15,7 @@
return
/obj/item/assembly/shock_kit/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench) && !status)
+ if(W.is_wrench() && !status)
var/turf/T = loc
if(ismob(T))
T = T.loc
@@ -27,7 +27,7 @@
part2 = null
qdel(src)
return
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
status = !status
to_chat(user, "[src] is now [status ? "secured" : "unsecured"]!")
playsound(src, W.usesound, 50, 1)
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 57bb0b541d..cd4c253f66 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -117,14 +117,6 @@ Code:
signal.data["message"] = "ACTIVATE"
radio_connection.post_signal(src, signal)
return
-/*
- for(var/obj/item/device/assembly/signaler/S in world)
- if(!S) continue
- if(S == src) continue
- if((S.frequency == src.frequency) && (S.code == src.code))
- spawn(0)
- if(S) S.pulse(0)
- return 0*/
/obj/item/device/assembly/signaler/pulse(var/radio = 0)
diff --git a/code/modules/busy_space/air_traffic.dm b/code/modules/busy_space/air_traffic.dm
index 7da2c6f73b..bac3a0ab90 100644
--- a/code/modules/busy_space/air_traffic.dm
+++ b/code/modules/busy_space/air_traffic.dm
@@ -63,7 +63,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
var/combined_name = "[owner] [prefix] [shipname]"
var/alt_atc_names = list("[using_map.station_short] TraCon","[using_map.station_short] Control","[using_map.station_short] STC","[using_map.station_short] Airspace")
- var/wrong_atc_names = list("Sol Command","Orion Control", "[using_map.dock_name]")
+ var/wrong_atc_names = list("Sol Command","New Reykjavik StarCon", "[using_map.dock_name]")
var/mission_noun = list("flight","mission","route")
var/request_verb = list("requesting","calling for","asking for")
diff --git a/code/modules/busy_space/organizations.dm b/code/modules/busy_space/organizations.dm
index 22b41ad86f..5baae4d2c0 100644
--- a/code/modules/busy_space/organizations.dm
+++ b/code/modules/busy_space/organizations.dm
@@ -31,7 +31,15 @@
"Hawk",
"Haste",
"Radiant",
- "Luminous"
+ "Luminous",
+ "Princess of Sol",
+ "King of the Mountain",
+ "Words and Changes",
+ "Katerina's Silhouette",
+ "Castle of Water",
+ "Jade Leviathan",
+ "Sword of Destiny",
+ "Ishtar's Grace"
)
var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly.
var/autogenerate_destination_names = TRUE
@@ -44,7 +52,7 @@
"Sol", "Alpha Centauri", "Tau Ceti", "Zhu Que", "Oasis", "Vir", "Gavel", "Ganesha",
"Saint Columbia", "Altair", "Sidhe", "New Ohio", "Parvati", "Mahi-Mahi", "Nyx", "New Seoul",
"Kess-Gendar", "Raphael", "Phact", "Altair", "El", "Eutopia", "Qerr'valis", "Qerrna-Lakirr", "Rarkajar", "Thoth", "Jahan's Post", "Kauq'xum", "Silk", "New Singapore", "Stove", "Viola", "Love", "Isavau's Gamble" )
- var/list/destination_types = list("dockyard", "station", "vessel", "waystation", "telecommunications satellite", "spaceport", "distress beacon", "anomaly", "colony", "outpost")
+ var/list/destination_types = list("dockyard", "station", "vessel", "waystation", "telecommunications satellite", "spaceport", "anomaly", "colony", "outpost")
while(i)
destination_names.Add("a [pick(destination_types)] in [pick(star_names)]")
i--
@@ -69,10 +77,10 @@
for newly tested posibrains to remain with the company."
history = "" // To be written someday.
work = "research giant"
- headquarters = "Luna"
+ headquarters = "Luna, Sol"
motto = ""
- ship_prefixes = list("NSV" = "exploration", "NTV" = "hauling", "NDV" = "patrol", "NRV" = "emergency response")
+ ship_prefixes = list("NSV" = "exploration", "NTV" = "hauling", "NDV" = "patrol", "NRV" = "emergency response", "NDV" = "asset protection")
//Scientist naming scheme
ship_names = list(
"Bardeen",
@@ -99,7 +107,12 @@
"Aristotle",
"Von Braun",
"Kaku",
- "Oppenheimer"
+ "Oppenheimer",
+ "Renwick",
+ "Hubble",
+ "Alcubierre",
+ "Robineau",
+ "Glass"
)
// Note that the current station being used will be pruned from this list upon being instantiated
destination_names = list(
@@ -130,14 +143,14 @@
desc = "Hephaestus Industries is the largest supplier of arms, ammunition, and small millitary vehicles in Sol space. \
Hephaestus products have a reputation for reliability, and the corporation itself has a noted tendency to stay removed \
from corporate politics. They enforce their neutrality with the help of a fairly large asset-protection contingent which \
- prevents any contracting polities from using their own materiel against them. SolGov itself is one of Hephastus’ largest \
+ prevents any contracting polities from using their own materiel against them. SolGov itself is one of Hephaestus' largest \
bulk contractors owing to the above factors."
history = ""
work = "arms manufacturer"
- headquarters = ""
+ headquarters = "Luna, Sol"
motto = ""
- ship_prefixes = list("HTV" = "freight", "HTV" = "munitions resupply")
+ ship_prefixes = list("HTV" = "freight", "HLV" = "munitions resupply", "HDV" = "asset protection", "HDV" = "preemptive deployment")
//War God/Soldier Theme
ship_names = list(
"Ares",
@@ -154,7 +167,23 @@
"Annan",
"Chi Yu",
"Shiva",
- "Tyr"
+ "Tyr",
+ "Nobunaga",
+ "Xerxes",
+ "Alexander",
+ "McArthur",
+ "Samson",
+ "Oya",
+ "Nemain",
+ "Caesar",
+ "Augustus",
+ "Sekhmet",
+ "Ku",
+ "Indra",
+ "Innana",
+ "Ishtar",
+ "Qamaits",
+ "'Oro",
)
destination_names = list(
"a SolGov dockyard on Luna",
@@ -170,15 +199,15 @@
Despite the suspicion and prejudice leveled at them for their alien origin, Vey-Med has obtained market dominance in \
the sale of medical equipment-- from surgical tools to large medical devices to the Oddyseus trauma response mecha \
and everything in between. Their equipment tends to be top-of-the-line, most obviously shown by their incredibly \
- human-like FBP designs. Vey’s rise to stardom came from their introduction of ressurective cloning, although in \
- recent years they’ve been forced to diversify as their patents expired and NanoTrasen-made medications became \
+ human-like FBP designs. Vey's rise to stardom came from their introduction of ressurective cloning, although in \
+ recent years they've been forced to diversify as their patents expired and NanoTrasen-made medications became \
essential to modern cloning."
history = ""
work = "medical equipment supplier"
- headquarters = ""
+ headquarters = "Toledo, New Ohio"
motto = ""
- ship_prefixes = list("VTV" = "transportation", "VMV" = "medical resupply")
+ ship_prefixes = list("VTV" = "transportation", "VMV" = "medical resupply", "VSV" = "research mission", "VRV" = "emergency medical support")
// Diona names
ship_names = list(
"Wind That Stirs The Waves",
@@ -193,7 +222,13 @@
"Star That Fades From View",
"Eyes Which Turn Inwards",
"Joy Without Which The World Would Come Undone",
- "A Thousand Thousand Planets Dangling From Branches"
+ "A Thousand Thousand Planets Dangling From Branches",
+ "Light Streaming Through Interminable Branches",
+ "Smoke Brought Up From A Terrible Fire",
+ "Light of Qerr'Valis",
+ "King Xae'uoque",
+ "Memory of Kel'xi",
+ "Xi'Kroo's Herald"
)
destination_names = list(
"a research facility in Samsara",
@@ -207,13 +242,13 @@
acronym = "ZH"
desc = "Zeng-Hu is an old TSC, based in the Sol system. Until the discovery of Phoron, Zeng-Hu maintained a stranglehold \
on the market for medications, and many household names are patentted by Zeng-Hu-- Bicaridyne, Dylovene, Tricordrizine, \
- and Dexalin all came from a Zeng-Hu medical laboratory. Zeng-Hu’s fortunes have been in decline as Nanotrasen’s near monopoly \
- on phoron research cuts into their R&D and Vey-Med’s superior medical equipment effectively decimated their own equipment \
+ and Dexalin all came from a Zeng-Hu medical laboratory. Zeng-Hu's fortunes have been in decline as Nanotrasen's near monopoly \
+ on phoron research cuts into their R&D and Vey-Med's superior medical equipment effectively decimated their own equipment \
interests. The three-way rivalry between these companies for dominance in the medical field is well-known and a matter of \
constant economic speculation."
history = ""
work = "pharmaceuticals company"
- headquarters = ""
+ headquarters = "Earth, Sol"
motto = ""
ship_prefixes = list("ZTV" = "transportation", "ZMV" = "medical resupply")
@@ -226,15 +261,15 @@
desc = "Ward-Takahashi focuses on the sale of small consumer electronics, with its computers, communicators, \
and even mid-class automobiles a fixture of many households. Less famously, Ward-Takahashi also supplies most \
of the AI cores on which vital control systems are mounted, and it is this branch of their industry that has \
- led to their tertiary interest in the development and sale of high-grade AI systems. Ward-Takahashi’s economies \
- of scale frequently steal market share from Nanotrasen’s high-price products, leading to a bitter rivalry in the \
+ led to their tertiary interest in the development and sale of high-grade AI systems. Ward-Takahashi's economies \
+ of scale frequently steal market share from Nanotrasen's high-price products, leading to a bitter rivalry in the \
consumer electronics market."
history = ""
work = "electronics manufacturer"
headquarters = ""
motto = ""
- ship_prefixes = list("WTV" = "freight")
+ ship_prefixes = list("WFV" = "freight", "WTV" = "transport", "WDV" = "asset protection")
ship_names = list(
"Comet",
"Aurora",
@@ -246,7 +281,16 @@
"Pulsar",
"Quark",
"Void",
- "Asteroid"
+ "Asteroid",
+ "Wormhole",
+ "Sunspots",
+ "Supercluster",
+ "Moon",
+ "Anomaly",
+ "Drift",
+ "Stream",
+ "Rift",
+ "Curtain"
)
destination_names = list()
@@ -254,10 +298,10 @@
name = "Bishop Cybernetics"
short_name = "Bishop"
acronym = "BC"
- desc = "Bishop’s focus is on high-class, stylish cybernetics. A favorite among transhumanists (and a bête noire for \
+ desc = "Bishop's focus is on high-class, stylish cybernetics. A favorite among transhumanists (and a bête noire for \
bioconservatives), Bishop manufactures not only prostheses but also brain augmentation, synthetic organ replacements, \
and odds and ends like implanted wrist-watches. Their business model tends towards smaller, boutique operations, giving \
- it a reputation for high price and luxury, with Bishop cyberware often rivalling Vey-Med’s for cost. Bishop’s reputation \
+ it a reputation for high price and luxury, with Bishop cyberware often rivalling Vey-Med's for cost. Bishop's reputation \
for catering towards the interests of human augmentation enthusiasts instead of positronics have earned it ire from the \
Positronic Rights Group and puts it in ideological (but not economic) comptetition with Morpheus Cyberkinetics."
history = ""
@@ -265,8 +309,10 @@
headquarters = ""
motto = ""
- ship_prefixes = list("BTV" = "transportation")
- destination_names = list()
+ ship_prefixes = list("ITV" = "transportation", "ISV" = "research exchange") //Bishop can't afford / doesn't care enough to afford its own prefixes
+ destination_names = list(
+ "A medical facility in Angessa's Pearl"
+ )
/datum/lore/organization/tsc/morpheus
name = "Morpheus Cyberkinetics"
@@ -279,7 +325,7 @@
the good-will of the positronics, and the ire of those who wish to exploit them."
history = ""
work = "cybernetics manufacturer"
- headquarters = ""
+ headquarters = "Shelf"
motto = ""
ship_prefixes = list("MTV" = "freight")
@@ -374,7 +420,16 @@
"This Ship Is Spiders",
"Legitimate Trade Vessel",
"Please Don't Explode II",
- "Get Off the Air"
+ "Get Off the Air",
+ "Definitely Unsinkable",
+ "We Didn't Do It!",
+ "Unrelated To That Other Ship",
+ "Not Reflecting The Opinons Of The Shareholders",
+ "Normal Ship Name",
+ "Define Offensive",
+ "Tiffany",
+ "My Other Ship is A Gestalt",
+ "NTV HTV WTV ITV ZTV"
)
destination_names = list(
"a trade outpost in Shelf"
@@ -392,7 +447,31 @@
headquarters = ""
motto = ""
- ship_prefixes = list("XTV" = "hauling")
+ ship_prefixes = list("XTV" = "hauling", "XFV" = "bulk transport", "XIV" = "resupply")
+ destination_names = list()
+
+/datum/lore/organization/tsc/mbt
+ name = "Major Bill's Transportation"
+ short_name = "Major Bill's"
+ desc = "The most popular courier service and starliner, Major Bill's is an unassuming corporation whose greatest asset is their low cost and brand recognition. Major Bill’s is known, perhaps unfavorably, for its mascot, Major Bill, a cartoonish military figure that spouts quotable slogans. Their motto is \"With Major Bill's, you won't pay major bills!\", an earworm much of the galaxy longs to forget."
+ history = ""
+ work = "courier and passenger transit"
+ headquarters = "Mars, Sol"
+ motto = ""
+
+ ship_prefixes = list("TTV" = "transport", "TTV" = "luxury transit")
+ destination_names = list()
+
+/datum/lore/organization/tsc/independent
+ name = "Free Traders"
+ short_name = "Free Trader"
+ desc = "Though less common now than they were in the decades before the Sol Economic Organization took power, independent traders remain an important part of the galactic economy, owing in no small part to protective tarrifs established by the Free Trade Union in the late twenty-forth century."
+ history = ""
+ work = "trade and transit"
+ headquarters = "N/A"
+ motto = "N/A"
+
+ ship_prefixes = list("IEV" = "prospecting", "IEC" = "prospecting", "IFV" = "bulk freight", "ITV" = "passenger transport", "ITC" = "just-in-time delivery")
destination_names = list()
// Governments
@@ -405,7 +484,7 @@
comply with SifGov's legislation and regulations."
history = "" // Todo like the rest of them
work = "governing body of Sif"
- headquarters = "New Reykjavik, Sif"
+ headquarters = "New Reykjavik, Sif, Vir"
motto = ""
autogenerate_destination_names = FALSE
@@ -428,7 +507,7 @@
defacto represents humanity on the galactic stage."
history = "" // Todo
work = "governing polity of humanity's Confederation"
- headquarters = "Luna"
+ headquarters = "Luna, Sol"
motto = "Nil Mortalibus Ardui Est" // Latin, because latin. Says 'Nothing is too steep for mortals'.
autogenerate_destination_names = TRUE
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm
index 09d4738d67..d1412a2a12 100644
--- a/code/modules/client/client defines.dm
+++ b/code/modules/client/client defines.dm
@@ -29,8 +29,7 @@
///////////////
//SOUND STUFF//
///////////////
- var/ambience_playing= null
- var/played = 0
+ var/time_last_ambience_played = 0 // world.time when ambience was played to this client, to space out ambience sounds.
////////////
//SECURITY//
@@ -46,9 +45,11 @@
////////////////////////////////////
//things that require the database//
////////////////////////////////////
- var/player_age = "Requires database" //So admins know why it isn't working - Used to determine how old the account is - in days.
- var/related_accounts_ip = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip
- var/related_accounts_cid = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id
+ var/player_age = "(Requires database)" //So admins know why it isn't working - Used to determine how old the account is - in days.
+ var/related_accounts_ip = "(Requires database)" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip
+ var/related_accounts_cid = "(Requires database)" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id
+ var/account_join_date = "(Requires database)"
+ var/account_age = "(Requires database)"
preload_rsc = PRELOAD_RSC
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 95ce3456b6..b4b842f0b3 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -162,8 +162,12 @@
winset(src, "rpane.changelog", "background-color=#eaeaea;font-style=bold")
if(config.aggressive_changelog)
src.changes()
-
-
+
+ if(config.paranoia_logging)
+ if(isnum(player_age) && player_age == 0)
+ log_and_message_admins("PARANOIA: [key_name(src)] has connected here for the first time.")
+ if(isnum(account_age) && account_age <= 2)
+ log_and_message_admins("PARANOIA: [key_name(src)] has a very new BYOND account ([account_age] days).")
//////////////
//DISCONNECT//
@@ -220,6 +224,12 @@
player_age = text2num(query.item[2])
break
+ account_join_date = sanitizeSQL(findJoinDate())
+ if(account_join_date && dbcon.IsConnected())
+ var/DBQuery/query_datediff = dbcon.NewQuery("SELECT DATEDIFF(Now(),'[account_join_date]')")
+ if(query_datediff.Execute() && query_datediff.NextRow())
+ account_age = text2num(query_datediff.item[1])
+
var/DBQuery/query_ip = dbcon.NewQuery("SELECT ckey FROM erro_player WHERE ip = '[address]'")
query_ip.Execute()
related_accounts_ip = ""
@@ -363,3 +373,16 @@ client/verb/character_setup()
set category = "Preferences"
if(prefs)
prefs.ShowChoices(usr)
+
+/client/proc/findJoinDate()
+ var/list/http = world.Export("http://byond.com/members/[ckey]?format=text")
+ if(!http)
+ log_world("Failed to connect to byond age check for [ckey]")
+ return
+ var/F = file2text(http["CONTENT"])
+ if(F)
+ var/regex/R = regex("joined = \"(\\d{4}-\\d{2}-\\d{2})\"")
+ if(R.Find(F))
+ . = R.group[1]
+ else
+ CRASH("Age check regex failed for [src.ckey]")
diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm
index f0bccd731e..f044322cab 100644
--- a/code/modules/client/preference_setup/general/01_basic.dm
+++ b/code/modules/client/preference_setup/general/01_basic.dm
@@ -71,8 +71,8 @@ datum/preferences/proc/set_biological_gender(var/gender)
. += "Nickname: "
. += "[pref.nickname]"
. += " "
- . += "Biological Gender: [gender2text(pref.biological_gender)] "
- . += "Gender Identity: [gender2text(pref.identifying_gender)] "
+ . += "Biological Sex: [gender2text(pref.biological_gender)] "
+ . += "Pronouns: [gender2text(pref.identifying_gender)] "
. += "Age: [pref.age] "
. += "Spawn Point: [pref.spawnpoint] "
if(config.allow_Metadata)
@@ -111,13 +111,13 @@ datum/preferences/proc/set_biological_gender(var/gender)
return TOPIC_NOACTION
else if(href_list["bio_gender"])
- var/new_gender = input(user, "Choose your character's biological gender:", "Character Preference", pref.biological_gender) as null|anything in get_genders()
+ var/new_gender = input(user, "Choose your character's biological sex:", "Character Preference", pref.biological_gender) as null|anything in get_genders()
if(new_gender && CanUseTopic(user))
pref.set_biological_gender(new_gender)
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["id_gender"])
- var/new_gender = input(user, "Choose your character's identifying gender:", "Character Preference", pref.identifying_gender) as null|anything in all_genders_define_list
+ var/new_gender = input(user, "Choose your character's pronouns:", "Character Preference", pref.identifying_gender) as null|anything in all_genders_define_list
if(new_gender && CanUseTopic(user))
pref.identifying_gender = new_gender
return TOPIC_REFRESH
@@ -158,4 +158,4 @@ datum/preferences/proc/set_biological_gender(var/gender)
return possible_genders
possible_genders = possible_genders.Copy()
possible_genders |= NEUTER
- return possible_genders
\ No newline at end of file
+ return possible_genders
diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index 1fc3b1d8ba..e098283a2e 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -36,6 +36,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["synth_red"] >> pref.r_synth
S["synth_green"] >> pref.g_synth
S["synth_blue"] >> pref.b_synth
+ S["synth_markings"] >> pref.synth_markings
pref.preview_icon = null
S["bgstate"] >> pref.bgstate
@@ -65,6 +66,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["synth_red"] << pref.r_synth
S["synth_green"] << pref.g_synth
S["synth_blue"] << pref.b_synth
+ S["synth_markings"] << pref.synth_markings
S["bgstate"] << pref.bgstate
/datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S)
@@ -120,6 +122,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
character.r_synth = pref.r_synth
character.g_synth = pref.g_synth
character.b_synth = pref.b_synth
+ character.synth_markings = pref.synth_markings
// Destroy/cyborgize organs and limbs.
for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO))
@@ -300,11 +303,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += " Body Markings + "
for(var/M in pref.body_markings)
- . += "[M] - Color"
+ . += "[M] [pref.body_markings.len > 1 ? "˄ ˅ " : ""]- Color"
. += ""
. += " "
. += " "
+ . += "Allow Synth markings: [pref.synth_markings ? "Yes" : "No"] "
. += "Allow Synth color: [pref.synth_color ? "Yes" : "No"] "
if(pref.synth_color)
. += "Change Color "
@@ -493,6 +497,24 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.body_markings[new_marking] = "#000000" //New markings start black
return TOPIC_REFRESH_UPDATE_PREVIEW
+ else if(href_list["marking_up"])
+ var/M = href_list["marking_up"]
+ var/start = pref.body_markings.Find(M)
+ if(start != 1) //If we're not the beginning of the list, swap with the previous element.
+ moveElement(pref.body_markings, start, start-1)
+ else //But if we ARE, become the final element -ahead- of everything else.
+ moveElement(pref.body_markings, start, pref.body_markings.len+1)
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+
+ else if(href_list["marking_down"])
+ var/M = href_list["marking_down"]
+ var/start = pref.body_markings.Find(M)
+ if(start != pref.body_markings.len) //If we're not the end of the list, swap with the next element.
+ moveElement(pref.body_markings, start, start+2)
+ else //But if we ARE, become the first element -behind- everything else.
+ moveElement(pref.body_markings, start, 1)
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+
else if(href_list["marking_remove"])
var/M = href_list["marking_remove"]
pref.body_markings -= M
@@ -702,6 +724,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.b_synth = hex2num(copytext(new_color, 6, 8))
return TOPIC_REFRESH_UPDATE_PREVIEW
+ else if(href_list["synth_markings"])
+ pref.synth_markings = !pref.synth_markings
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+
else if(href_list["cycle_bg"])
pref.bgstate = next_in_list(pref.bgstate, pref.bgstate_options)
return TOPIC_REFRESH_UPDATE_PREVIEW
diff --git a/code/modules/client/preference_setup/global/01_ui.dm b/code/modules/client/preference_setup/global/01_ui.dm
index 29502ec985..5b1314d05f 100644
--- a/code/modules/client/preference_setup/global/01_ui.dm
+++ b/code/modules/client/preference_setup/global/01_ui.dm
@@ -8,6 +8,7 @@
S["UI_style_alpha"] >> pref.UI_style_alpha
S["ooccolor"] >> pref.ooccolor
S["tooltipstyle"] >> pref.tooltipstyle
+ S["client_fps"] >> pref.client_fps
/datum/category_item/player_setup_item/player_global/ui/save_preferences(var/savefile/S)
S["UI_style"] << pref.UI_style
@@ -15,6 +16,7 @@
S["UI_style_alpha"] << pref.UI_style_alpha
S["ooccolor"] << pref.ooccolor
S["tooltipstyle"] << pref.tooltipstyle
+ S["client_fps"] << pref.client_fps
/datum/category_item/player_setup_item/player_global/ui/sanitize_preferences()
pref.UI_style = sanitize_inlist(pref.UI_style, all_ui_styles, initial(pref.UI_style))
@@ -22,6 +24,7 @@
pref.UI_style_alpha = sanitize_integer(pref.UI_style_alpha, 0, 255, initial(pref.UI_style_alpha))
pref.ooccolor = sanitize_hexcolor(pref.ooccolor, initial(pref.ooccolor))
pref.tooltipstyle = sanitize_inlist(pref.tooltipstyle, all_tooltip_styles, initial(pref.tooltipstyle))
+ pref.client_fps = sanitize_integer(pref.client_fps, 0, MAX_CLIENT_FPS, initial(pref.client_fps))
/datum/category_item/player_setup_item/player_global/ui/content(var/mob/user)
. = "UI Style: [pref.UI_style] "
@@ -29,6 +32,7 @@
. += "-Color: [pref.UI_style_color] reset "
. += "-Alpha(transparency): [pref.UI_style_alpha] reset "
. += "Tooltip Style: [pref.tooltipstyle] "
+ . += "Client FPS: [pref.client_fps] "
if(can_select_ooc_color(user))
. += "OOC Color: "
if(pref.ooccolor == initial(pref.ooccolor))
@@ -62,11 +66,20 @@
return TOPIC_REFRESH
else if(href_list["select_tooltip_style"])
- var/tooltip_style_new = input(user, "Choose tooltip style.", "Character Preference", pref.tooltipstyle) as null|anything in all_tooltip_styles
+ var/tooltip_style_new = input(user, "Choose tooltip style.", "Global Preference", pref.tooltipstyle) as null|anything in all_tooltip_styles
if(!tooltip_style_new || !CanUseTopic(user)) return TOPIC_NOACTION
pref.tooltipstyle = tooltip_style_new
return TOPIC_REFRESH
+ else if(href_list["select_client_fps"])
+ var/fps_new = input(user, "Input Client FPS (1-200, 0 uses server FPS)", "Global Preference", pref.client_fps) as null|num
+ if(isnull(fps_new) || !CanUseTopic(user)) return TOPIC_NOACTION
+ if(fps_new < 0 || fps_new > MAX_CLIENT_FPS) return TOPIC_NOACTION
+ pref.client_fps = fps_new
+ if(pref.client)
+ pref.client.fps = fps_new
+ return TOPIC_REFRESH
+
else if(href_list["reset"])
switch(href_list["reset"])
if("ui")
diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm
index 9035485bda..c2f1450ca7 100644
--- a/code/modules/client/preference_setup/global/setting_datums.dm
+++ b/code/modules/client/preference_setup/global/setting_datums.dm
@@ -169,6 +169,20 @@ var/list/_client_preferences_by_type
enabled_description = "Fancy"
disabled_description = "Plain"
+/datum/client_preference/ambient_occlusion
+ description = "Fake Ambient Occlusion"
+ key = "AMBIENT_OCCLUSION_PREF"
+ enabled_by_default = FALSE
+ enabled_description = "On"
+ disabled_description = "Off"
+
+/datum/client_preference/ambient_occlusion/toggled(var/mob/preference_mob, var/enabled)
+ . = ..()
+ if(preference_mob && preference_mob.plane_holder)
+ var/datum/plane_holder/PH = preference_mob.plane_holder
+ PH.set_ao(VIS_OBJS, enabled)
+ PH.set_ao(VIS_MOBS, enabled)
+
/********************
* Staff Preferences *
********************/
diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
index 8782bf0c13..5364fee6b8 100644
--- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
@@ -147,17 +147,17 @@
/datum/gear/accessory/brown_drop_pouches
display_name = "drop pouches, brown"
path = /obj/item/clothing/accessory/storage/brown_drop_pouches
- allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
+ allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor", "Search and Rescue")
/datum/gear/accessory/black_drop_pouches
display_name = "drop pouches, black"
path = /obj/item/clothing/accessory/storage/black_drop_pouches
- allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
+ allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor", "Search and Rescue")
/datum/gear/accessory/white_drop_pouches
display_name = "drop pouches, white"
path = /obj/item/clothing/accessory/storage/white_drop_pouches
- allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
+ allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor", "Search and Rescue")
/datum/gear/accessory/fannypack
display_name = "fannypack selection"
@@ -236,7 +236,7 @@
/datum/gear/accessory/stethoscope
display_name = "stethoscope"
path = /obj/item/clothing/accessory/stethoscope
- allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic")
+ allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Search and Rescue")
/datum/gear/accessory/locket
display_name = "locket"
diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm
index b9f914ff38..7a17b782ef 100644
--- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm
@@ -57,7 +57,7 @@
/datum/gear/eyes/medical
display_name = "Medical HUD (Medical)"
path = /obj/item/clothing/glasses/hud/health
- allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
+ allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Search and Rescue")
/datum/gear/eyes/medical/prescriptionmed
display_name = "Medical HUD, prescription (Medical)"
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm
index 6b32034b31..41d37b8a67 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm
@@ -241,6 +241,46 @@ datum/gear/suit/duster
path = /obj/item/clothing/accessory/poncho/roles/cloak/hop
allowed_roles = list("Head of Personnel")
+/datum/gear/suit/roles/poncho/cloak/cargo
+ display_name = "cloak, cargo"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/cargo
+ allowed_roles = list("Cargo Technician","Quartermaster")
+
+/datum/gear/suit/roles/poncho/cloak/mining
+ display_name = "cloak, mining"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/mining
+ allowed_roles = list("Quartermaster","Shaft Miner")
+
+/datum/gear/suit/roles/poncho/cloak/security
+ display_name = "cloak, security"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/security
+ allowed_roles = list("Head of Security","Detective","Warden","Security Officer")
+
+/datum/gear/suit/roles/poncho/cloak/service
+ display_name = "cloak, service"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/service
+ allowed_roles = list("Head of Personnel","Bartender","Botanist","Janitor","Chef","Librarian")
+
+/datum/gear/suit/roles/poncho/cloak/engineer
+ display_name = "cloak, engineer"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/engineer
+ allowed_roles = list("Chief Engineer","Station Engineer")
+
+/datum/gear/suit/roles/poncho/cloak/atmos
+ display_name = "cloak, atmos"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/atmos
+ allowed_roles = list("Chief Engineer","Atmospheric Technician")
+
+/datum/gear/suit/roles/poncho/cloak/research
+ display_name = "cloak, science"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/research
+ allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist")
+
+/datum/gear/suit/roles/poncho/cloak/medical
+ display_name = "cloak, medical"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/medical
+ allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
+
/datum/gear/suit/unathi_robe
display_name = "roughspun robe"
path = /obj/item/clothing/suit/unathi/robe
@@ -440,7 +480,7 @@ datum/gear/suit/duster
/datum/gear/suit/snowsuit/medical
display_name = "snowsuit, medical"
path = /obj/item/clothing/suit/storage/snowsuit/medical
- allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
+ allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Search and Rescue")
/datum/gear/suit/snowsuit/science
display_name = "snowsuit, science"
@@ -455,4 +495,4 @@ datum/gear/suit/duster
/datum/gear/suit/snowsuit/cargo
display_name = "snowsuit, supply"
path = /obj/item/clothing/suit/storage/snowsuit/cargo
- allowed_roles = list("Quartermaster","shaft Miner","Cargo Technician","Head of Personnel")
\ No newline at end of file
+ allowed_roles = list("Quartermaster","Shaft Miner","Cargo Technician","Head of Personnel")
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm
index 5f747a9a86..1f35cc925a 100644
--- a/code/modules/client/preference_setup/loadout/loadout_utility.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm
@@ -79,6 +79,11 @@
path =/obj/item/weapon/storage/secure/briefcase
cost = 2
+/datum/gear/utility/laserpointer
+ display_name = "laser pointer"
+ path =/obj/item/device/laser_pointer
+ cost = 2
+
/datum/gear/utility/flashlight
display_name = "flashlight"
path = /obj/item/device/flashlight
@@ -109,12 +114,6 @@
path = /obj/item/weapon/cell/device
/datum/gear/utility/implant
- exploitable = 1
-
-/datum/gear/utility/implant/eal //This does nothing if you don't actually know EAL.
- display_name = "implant, language, EAL"
- path = /obj/item/weapon/implant/language/eal
- cost = 2
slot = "implant"
exploitable = 1
@@ -122,8 +121,20 @@
display_name = "implant, tracking"
path = /obj/item/weapon/implant/tracking/weak
cost = 10
- slot = "implant"
- exploitable = 1
+
+/datum/gear/utility/implant/language
+ cost = 2
+ exploitable = 0
+
+/datum/gear/utility/implant/language/eal
+ display_name = "vocal synthesizer, EAL"
+ description = "A surgically implanted vocal synthesizer which allows the owner to speak EAL, if they know it."
+ path = /obj/item/weapon/implant/language/eal
+
+/datum/gear/utility/implant/language/skrellian
+ display_name = "vocal synthesizer, Skrellian"
+ description = "A surgically implanted vocal synthesizer which allows the owner to speak Common Skrellian, if they know it."
+ path = /obj/item/weapon/implant/language/skrellian
/datum/gear/utility/pen
display_name = "Fountain Pen"
@@ -145,4 +156,4 @@
/datum/gear/utility/umbrella/New()
..()
- gear_tweaks = list(gear_tweak_free_color_choice)
\ No newline at end of file
+ gear_tweaks = list(gear_tweak_free_color_choice)
diff --git a/code/modules/client/preference_setup/traits/trait_defines.dm b/code/modules/client/preference_setup/traits/trait_defines.dm
index f8405eb7f8..82e3aee738 100644
--- a/code/modules/client/preference_setup/traits/trait_defines.dm
+++ b/code/modules/client/preference_setup/traits/trait_defines.dm
@@ -92,6 +92,30 @@
modifier_type = /datum/modifier/trait/larger
mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/small, /datum/trait/modifier/physical/large)
+/datum/trait/modifier/physical/colorblind_protanopia
+ name = "Protanopia"
+ desc = "You have a form of red-green colorblindness. You cannot see reds, and have trouble distinguishing them from yellows and greens."
+ modifier_type = /datum/modifier/trait/colorblind_protanopia
+ mutually_exclusive = list(/datum/trait/modifier/physical/colorblind_deuteranopia, /datum/trait/modifier/physical/colorblind_tritanopia, /datum/trait/modifier/physical/colorblind_monochrome)
+
+/datum/trait/modifier/physical/colorblind_deuteranopia
+ name = "Deuteranopia"
+ desc = "You have a form of red-green colorblindness. You cannot see greens, and have trouble distinguishing them from yellows and reds."
+ modifier_type = /datum/modifier/trait/colorblind_deuteranopia
+ mutually_exclusive = list(/datum/trait/modifier/physical/colorblind_protanopia, /datum/trait/modifier/physical/colorblind_tritanopia, /datum/trait/modifier/physical/colorblind_monochrome)
+
+/datum/trait/modifier/physical/colorblind_tritanopia
+ name = "Tritanopia"
+ desc = "You have a form of blue-yellow colorblindness. You have trouble distinguishing between blues, greens, and yellows, and see blues and violets as dim."
+ modifier_type = /datum/modifier/trait/colorblind_tritanopia
+ mutually_exclusive = list(/datum/trait/modifier/physical/colorblind_protanopia, /datum/trait/modifier/physical/colorblind_deuteranopia, /datum/trait/modifier/physical/colorblind_monochrome)
+
+/datum/trait/modifier/physical/colorblind_monochrome
+ name = "Monochromacy"
+ desc = "You are fully colorblind. Your condition is rare, but you can see no colors at all."
+ modifier_type = /datum/modifier/trait/colorblind_monochrome
+ mutually_exclusive = list(/datum/trait/modifier/physical/colorblind_protanopia, /datum/trait/modifier/physical/colorblind_deuteranopia, /datum/trait/modifier/physical/colorblind_tritanopia)
+
// These two traits might be borderline, feel free to remove if they get abused.
/datum/trait/modifier/physical/high_metabolism
name = "High Metabolism"
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 0b93d1bd64..dee21ddd5b 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -22,6 +22,7 @@ datum/preferences
var/UI_style_color = "#ffffff"
var/UI_style_alpha = 255
var/tooltipstyle = "Midnight" //Style for popup tooltips
+ var/client_fps = 0
//character preferences
var/real_name //our character's name
@@ -59,6 +60,7 @@ datum/preferences
var/r_synth //Used with synth_color to color synth parts that normaly can't be colored.
var/g_synth //Same as above
var/b_synth //Same as above
+ var/synth_markings = 0 //Enable/disable markings on synth parts.
//Some faction information.
var/home_system = "Unset" //System of birth.
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index ee815fd558..8b46611619 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -4,7 +4,7 @@
var/list/species_restricted = null //Only these species can wear this kit.
var/gunshot_residue //Used by forensics.
- var/list/accessories = list()
+ var/list/accessories
var/list/valid_accessory_slots
var/list/restricted_accessory_slots
var/list/starting_accessories
@@ -24,6 +24,8 @@
var/ear_protection = 0
var/blood_sprite_state
+ var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing
+
//Updates the icons of the mob wearing the clothing item, if any.
/obj/item/clothing/proc/update_clothing_icon()
return
@@ -229,7 +231,7 @@
return 0 // return 1 to cancel attack_hand()
/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user)
- if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel))
+ if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel))
if (clipped)
user << "The [src] have already been clipped!"
update_icon()
@@ -251,7 +253,8 @@
var/mob/living/carbon/human/H = user
if(slot && slot == slot_gloves)
- if(H.gloves)
+ var/obj/item/clothing/gloves/G = H.gloves
+ if(istype(G))
ring = H.gloves
if(ring.glove_level >= src.glove_level)
to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.")
@@ -582,8 +585,8 @@
SPECIES_VOX = 'icons/mob/species/vox/suit.dmi'
)
- valid_accessory_slots = list("over", "armband")
- restricted_accessory_slots = list("armband")
+ valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND)
+ restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND)
/obj/item/clothing/suit/update_clothing_icon()
if (ismob(src.loc))
@@ -625,15 +628,26 @@
//convenience var for defining the icon state for the overlay used when the clothing is worn.
//Also used by rolling/unrolling.
var/worn_state = null
- valid_accessory_slots = list("utility","armband","decor","over")
- restricted_accessory_slots = list("utility", "armband")
+ valid_accessory_slots = (\
+ ACCESSORY_SLOT_UTILITY\
+ |ACCESSORY_SLOT_WEAPON\
+ |ACCESSORY_SLOT_ARMBAND\
+ |ACCESSORY_SLOT_DECOR\
+ |ACCESSORY_SLOT_MEDAL\
+ |ACCESSORY_SLOT_TIE\
+ |ACCESSORY_SLOT_OVER)
+ restricted_accessory_slots = (\
+ ACCESSORY_SLOT_UTILITY\
+ |ACCESSORY_SLOT_WEAPON\
+ |ACCESSORY_SLOT_ARMBAND\
+ |ACCESSORY_SLOT_TIE\
+ |ACCESSORY_SLOT_OVER)
var/icon/rolled_down_icon = 'icons/mob/uniform_rolled_down.dmi'
var/icon/rolled_down_sleeves_icon = 'icons/mob/uniform_sleeves_rolled.dmi'
-
/obj/item/clothing/under/attack_hand(var/mob/user)
- if(accessories && accessories.len)
+ if(LAZYLEN(accessories))
..()
if ((ishuman(usr) || issmall(usr)) && src.loc == user)
return
diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm
index 57c292f1e3..91010f4103 100644
--- a/code/modules/clothing/clothing_accessories.dm
+++ b/code/modules/clothing/clothing_accessories.dm
@@ -1,20 +1,34 @@
/obj/item/clothing/proc/can_attach_accessory(obj/item/clothing/accessory/A)
- if(src.valid_accessory_slots && (A.slot in src.valid_accessory_slots))
- if(accessories.len && restricted_accessory_slots && (A.slot in restricted_accessory_slots))
- for(var/obj/item/clothing/accessory/AC in accessories)
- if (AC.slot == A.slot)
- return FALSE
- return TRUE
- else
+ //Just no, okay
+ if(!A.slot)
return FALSE
+ //Not valid at all, not in the valid list period.
+ if((valid_accessory_slots & A.slot) != A.slot)
+ return FALSE
+
+ //Find all consumed slots
+ var/consumed_slots = 0
+ for(var/thing in accessories)
+ var/obj/item/clothing/accessory/AC = thing
+ consumed_slots |= AC.slot
+
+ //Mask to just consumed restricted
+ var/consumed_restricted = restricted_accessory_slots & consumed_slots
+
+ //They share at least one bit with the restricted slots
+ if(consumed_restricted & A.slot)
+ return FALSE
+
+ return TRUE
+
/obj/item/clothing/attackby(var/obj/item/I, var/mob/user)
if(istype(I, /obj/item/clothing/accessory))
var/obj/item/clothing/accessory/A = I
if(attempt_attach_accessory(A, user))
return
- if(accessories.len)
+ if(LAZYLEN(accessories))
for(var/obj/item/clothing/accessory/A in accessories)
A.attackby(I, user)
return
@@ -23,7 +37,7 @@
/obj/item/clothing/attack_hand(var/mob/user)
//only forward to the attached accessory if the clothing is equipped (not in a storage)
- if(accessories.len && src.loc == user)
+ if(LAZYLEN(accessories) && src.loc == user)
for(var/obj/item/clothing/accessory/A in accessories)
A.attack_hand(user)
return
@@ -54,7 +68,7 @@
/obj/item/clothing/examine(var/mob/user)
..(user)
- if(accessories.len)
+ if(LAZYLEN(accessories))
for(var/obj/item/clothing/accessory/A in accessories)
user << "\A [A] is attached to it."
@@ -65,7 +79,7 @@
* items on spawn
*/
/obj/item/clothing/proc/attempt_attach_accessory(obj/item/clothing/accessory/A, mob/user)
- if(!valid_accessory_slots || !valid_accessory_slots.len)
+ if(!valid_accessory_slots)
if(user)
to_chat(user, "You cannot attach accessories of any kind to \the [src].")
return FALSE
@@ -83,14 +97,14 @@
/obj/item/clothing/proc/attach_accessory(mob/user, obj/item/clothing/accessory/A)
- accessories += A
+ LAZYADD(accessories,A)
A.on_attached(src, user)
src.verbs |= /obj/item/clothing/proc/removetie_verb
update_accessory_slowdown()
update_clothing_icon()
/obj/item/clothing/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A)
- if(!(A in accessories))
+ if(!LAZYLEN(accessories) || !(A in accessories))
return
A.on_removed(user)
@@ -109,18 +123,17 @@
set src in usr
if(!istype(usr, /mob/living)) return
if(usr.stat) return
- if(!accessories.len) return
var/obj/item/clothing/accessory/A
- if(accessories.len > 1)
+ if(LAZYLEN(accessories))
A = input("Select an accessory to remove from [src]") as null|anything in accessories
- else
- A = accessories[1]
- src.remove_accessory(usr,A)
- if(!accessories.len)
+ if(A)
+ remove_accessory(usr,A)
+ if(!LAZYLEN(accessories))
src.verbs -= /obj/item/clothing/proc/removetie_verb
+ accessories = null
/obj/item/clothing/emp_act(severity)
- if(accessories.len)
+ if(LAZYLEN(accessories))
for(var/obj/item/clothing/accessory/A in accessories)
A.emp_act(severity)
..()
\ No newline at end of file
diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm
index 2de7c06aeb..739f3e3977 100644
--- a/code/modules/clothing/gloves/boxing.dm
+++ b/code/modules/clothing/gloves/boxing.dm
@@ -4,11 +4,13 @@
icon_state = "boxing"
item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red")
+/*
/obj/item/clothing/gloves/boxing/attackby(obj/item/weapon/W, mob/user)
- if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/surgical/scalpel))
+ if(W.is_wirecutter() || istype(W, /obj/item/weapon/surgical/scalpel))
user << "That won't work." //Nope
return
..()
+*/
/obj/item/clothing/gloves/boxing/green
icon_state = "boxinggreen"
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index b046233849..8e7b10052d 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -2,8 +2,8 @@
name = "helmet"
desc = "Standard Security gear. Protects the head from impacts."
icon_state = "helmet"
- valid_accessory_slots = list(ACCESSORY_SLOT_HELM_C)
- restricted_accessory_slots = list(ACCESSORY_SLOT_HELM_C)
+ valid_accessory_slots = (ACCESSORY_SLOT_HELM_C)
+ restricted_accessory_slots = (ACCESSORY_SLOT_HELM_C)
flags = THICKMATERIAL
armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0)
flags_inv = HIDEEARS|HIDEEYES
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index fd850073d8..a6d1e9e48a 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -20,27 +20,32 @@
/obj/item/clothing/head/pin/pink
icon_state = "pinkpin"
+ addblends = null
name = "pink hair hat"
/obj/item/clothing/head/pin/clover
icon_state = "cloverpin"
name = "clover pin"
+ addblends = null
desc = "A hair pin in the shape of a clover leaf."
/obj/item/clothing/head/pin/butterfly
icon_state = "butterflypin"
name = "butterfly pin"
+ addblends = null
desc = "A hair pin in the shape of a bright blue butterfly."
/obj/item/clothing/head/pin/magnetic
icon_state = "magnetpin"
name = "magnetic 'pin'"
+ addblends = null
desc = "Finally, a hair pin even a Morpheus chassis can use."
matter = list(DEFAULT_WALL_MATERIAL = 10)
/obj/item/clothing/head/pin/flower
name = "red flower pin"
icon_state = "hairflower"
+ addblends = null
desc = "Smells nice."
/obj/item/clothing/head/pin/flower/blue
@@ -82,6 +87,7 @@
/obj/item/clothing/head/pin/bow/big/red
icon_state = "redribbon"
name = "red ribbon"
+ addblends = null
/obj/item/clothing/head/powdered_wig
name = "powdered wig"
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 0fc1bff792..63259fc65e 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -27,6 +27,12 @@
return gas_filtered
+/obj/item/clothing/mask/gas/clear
+ name = "gas mask"
+ desc = "A face-covering mask with a transparent faceplate that can be connected to an air supply."
+ icon_state = "gas_clear"
+ flags_inv = null
+
/obj/item/clothing/mask/gas/half
name = "face mask"
desc = "A compact, durable gas mask that can be connected to an air supply."
diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
index cda9d51796..39b23827d8 100644
--- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
@@ -1,6 +1,6 @@
/obj/item/weapon/rig/attackby(obj/item/W as obj, mob/living/user as mob)
-
- if(!istype(user)) return 0
+ if(!istype(user))
+ return 0
if(electrified != 0)
if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here.
@@ -14,78 +14,79 @@
if(W.GetID())
if(subverted)
locked = 0
- user << "It looks like the locking system has been shorted out."
+ to_chat(user, "It looks like the locking system has been shorted out.")
return
if((!req_access || !req_access.len) && (!req_one_access || !req_one_access.len))
locked = 0
- user << "\The [src] doesn't seem to have a locking mechanism."
+ to_chat(user, "\The [src] doesn't seem to have a locking mechanism.")
return
if(security_check_enabled && !src.allowed(user))
- user << "Access denied."
+ to_chat(user, "Access denied.")
return
locked = !locked
- user << "You [locked ? "lock" : "unlock"] \the [src] access panel."
+ to_chat(user, "You [locked ? "lock" : "unlock"] \the [src] access panel.")
return
- else if(istype(W,/obj/item/weapon/crowbar))
-
+ else if(W.is_crowbar())
if(!open && locked)
- user << "The access panel is locked shut."
+ to_chat(user, "The access panel is locked shut.")
return
open = !open
- user << "You [open ? "open" : "close"] the access panel."
+ to_chat(user, "You [open ? "open" : "close"] the access panel.")
return
if(open)
-
// Hacking.
- if(istype(W,/obj/item/weapon/wirecutters) || istype(W,/obj/item/device/multitool))
+ if(W.is_wirecutter() || istype(W, /obj/item/device/multitool))
if(open)
wires.Interact(user)
else
- user << "You can't reach the wiring."
+ to_chat(user, "You can't reach the wiring.")
return
// Air tank.
if(istype(W,/obj/item/weapon/tank)) //Todo, some kind of check for suits without integrated air supplies.
if(air_supply)
- user << "\The [src] already has a tank installed."
+ to_chat(user, "\The [src] already has a tank installed.")
+ return
+
+ if(!user.unEquip(W))
return
- if(!user.unEquip(W)) return
air_supply = W
W.forceMove(src)
- user << "You slot [W] into [src] and tighten the connecting valve."
+ to_chat(user, "You slot [W] into [src] and tighten the connecting valve.")
return
// Check if this is a hardsuit upgrade or a modification.
else if(istype(W,/obj/item/rig_module))
-
if(istype(src.loc,/mob/living/carbon/human))
var/mob/living/carbon/human/H = src.loc
if(H.back == src)
- user << "You can't install a hardsuit module while the suit is being worn."
+ to_chat(user, "You can't install a hardsuit module while the suit is being worn.")
return 1
- if(!installed_modules) installed_modules = list()
+ if(!installed_modules)
+ installed_modules = list()
if(installed_modules.len)
for(var/obj/item/rig_module/installed_mod in installed_modules)
if(!installed_mod.redundant && istype(installed_mod,W))
- user << "The hardsuit already has a module of that class installed."
+ to_chat(user, "The hardsuit already has a module of that class installed.")
return 1
var/obj/item/rig_module/mod = W
- user << "You begin installing \the [mod] into \the [src]."
+ to_chat(user, "You begin installing \the [mod] into \the [src].")
if(!do_after(user,40))
return
if(!user || !W)
return
- if(!user.unEquip(mod)) return
- user << "You install \the [mod] into \the [src]."
+ if(!user.unEquip(mod))
+ return
+ to_chat(user, "You install \the [mod] into \the [src].")
installed_modules |= mod
mod.forceMove(src)
mod.installed(src)
@@ -94,27 +95,28 @@
else if(!cell && istype(W,/obj/item/weapon/cell))
- if(!user.unEquip(W)) return
- user << "You jack \the [W] into \the [src]'s battery mount."
+ if(!user.unEquip(W))
+ return
+ to_chat(user, "You jack \the [W] into \the [src]'s battery mount.")
W.forceMove(src)
src.cell = W
return
- else if(istype(W,/obj/item/weapon/wrench))
+ else if(W.is_wrench())
if(!air_supply)
- user << "There is not tank to remove."
+ to_chat(user, "There is not tank to remove.")
return
if(user.r_hand && user.l_hand)
air_supply.forceMove(get_turf(user))
else
user.put_in_hands(air_supply)
- user << "You detach and remove \the [air_supply]."
+ to_chat(user, "You detach and remove \the [air_supply].")
air_supply = null
return
- else if(istype(W,/obj/item/weapon/screwdriver))
+ else if(W.is_screwdriver())
var/list/current_mounts = list()
if(cell) current_mounts += "cell"
@@ -127,7 +129,7 @@
if(istype(src.loc,/mob/living/carbon/human) && to_remove != "cell")
var/mob/living/carbon/human/H = src.loc
if(H.back == src)
- user << "You can't remove an installed device while the hardsuit is being worn."
+ to_chat(user, "You can't remove an installed device while the hardsuit is being worn.")
return
switch(to_remove)
@@ -135,7 +137,7 @@
if("cell")
if(cell)
- user << "You detatch \the [cell] from \the [src]'s battery mount."
+ to_chat(user, "You detatch \the [cell] from \the [src]'s battery mount.")
for(var/obj/item/rig_module/module in installed_modules)
module.deactivate()
if(user.r_hand && user.l_hand)
@@ -144,7 +146,7 @@
cell.forceMove(user.put_in_hands(cell))
cell = null
else
- user << "There is nothing loaded in that mount."
+ to_chat(user, "There is nothing loaded in that mount.")
if("system module")
@@ -155,7 +157,7 @@
possible_removals[module.name] = module
if(!possible_removals.len)
- user << "There are no installed modules to remove."
+ to_chat(user, "There are no installed modules to remove.")
return
var/removal_choice = input("Which module would you like to remove?") as null|anything in possible_removals
@@ -163,7 +165,7 @@
return
var/obj/item/rig_module/removed = possible_removals[removal_choice]
- user << "You detatch \the [removed] from \the [src]."
+ to_chat(user, "You detatch \the [removed] from \the [src].")
removed.forceMove(get_turf(src))
removed.removed()
installed_modules -= removed
@@ -192,5 +194,5 @@
req_one_access.Cut()
locked = 0
subverted = 1
- user << "You short out the access protocol for the suit."
+ to_chat(user, "You short out the access protocol for the suit.")
return 1
diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm
index 915c2bc698..33b4e07351 100644
--- a/code/modules/clothing/spacesuits/rig/suits/ert.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm
@@ -14,8 +14,8 @@
siemens_coefficient= 0.5
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
- allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \
- /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/tool/crowbar, \
+ /obj/item/weapon/tool/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/tool/wirecutters, /obj/item/weapon/tool/wrench, /obj/item/device/multitool, \
/obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \
/obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller)
diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm
index 6aed7eaf5d..b5a9900081 100644
--- a/code/modules/clothing/spacesuits/spacesuits.dm
+++ b/code/modules/clothing/spacesuits/spacesuits.dm
@@ -49,6 +49,8 @@
/obj/item/clothing/suit/space
name = "Space suit"
desc = "A suit that protects against low pressure environments."
+ icon = 'icons/obj/clothing/spacesuits.dmi'
+ update_icon_define = INV_SPACESUIT_DEF_ICON
icon_state = "space"
w_class = ITEMSIZE_HUGE // So you can't fit this in your bag and be prepared at all times.
gas_transfer_coefficient = 0.01
diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm
index ef78d32f03..d755540b91 100644
--- a/code/modules/clothing/spacesuits/void/void.dm
+++ b/code/modules/clothing/spacesuits/void/void.dm
@@ -68,9 +68,9 @@
var/list/part_list = new
for(var/obj/item/I in list(helmet,boots,tank,cooler))
part_list += "\a [I]"
- user << "\The [src] has [english_list(part_list)] installed."
+ to_chat(user, "\The [src] has [english_list(part_list)] installed.")
if(tank && in_range(src,user))
- user << "The wrist-mounted pressure gauge reads [max(round(tank.air_contents.return_pressure()),0)] kPa remaining in \the [tank]."
+ to_chat(user, "The wrist-mounted pressure gauge reads [max(round(tank.air_contents.return_pressure()),0)] kPa remaining in \the [tank].")
/obj/item/clothing/suit/space/void/refit_for_species(var/target_species)
..()
@@ -95,23 +95,23 @@
if(helmet)
if(H.head)
- M << "You are unable to deploy your suit's helmet as \the [H.head] is in the way."
+ to_chat(M, "You are unable to deploy your suit's helmet as \the [H.head] is in the way.")
else if (H.equip_to_slot_if_possible(helmet, slot_head))
- M << "Your suit's helmet deploys with a hiss."
+ to_chat(M, "Your suit's helmet deploys with a hiss.")
helmet.canremove = 0
if(tank)
if(H.s_store) //In case someone finds a way.
- M << "Alarmingly, the valve on your suit's installed tank fails to engage."
+ to_chat(M, "Alarmingly, the valve on your suit's installed tank fails to engage.")
else if (H.equip_to_slot_if_possible(tank, slot_s_store))
- M << "The valve on your suit's installed tank safely engages."
+ to_chat(M, "The valve on your suit's installed tank safely engages.")
tank.canremove = 0
if(cooler)
if(H.s_store) //Ditto
- M << "Alarmingly, the cooling unit installed into your suit fails to deploy."
+ to_chat(M, "Alarmingly, the cooling unit installed into your suit fails to deploy.")
else if (H.equip_to_slot_if_possible(cooler, slot_s_store))
- M << "Your suit's cooling unit deploys."
+ to_chat(M, "Your suit's cooling unit deploys.")
cooler.canremove = 0
@@ -153,28 +153,31 @@
if(!istype(src.loc,/mob/living)) return
if(!helmet)
- usr << "There is no helmet installed."
+ to_chat(usr, "There is no helmet installed.")
return
var/mob/living/carbon/human/H = usr
- if(!istype(H)) return
- if(H.stat) return
- if(H.wear_suit != src) return
+ if(!istype(H))
+ return
+ if(H.stat)
+ return
+ if(H.wear_suit != src)
+ return
if(H.head == helmet)
- H << "You retract your suit helmet."
+ to_chat(H, "You retract your suit helmet.")
helmet.canremove = 1
H.drop_from_inventory(helmet)
helmet.forceMove(src)
else
if(H.head)
- H << "You cannot deploy your helmet while wearing \the [H.head]."
+ to_chat(H, "You cannot deploy your helmet while wearing \the [H.head].")
return
if(H.equip_to_slot_if_possible(helmet, slot_head))
helmet.pickup(H)
helmet.canremove = 0
- H << "You deploy your suit helmet, sealing you off from the world."
+ to_chat(H, "You deploy your suit helmet, sealing you off from the world.")
helmet.update_light(H)
/obj/item/clothing/suit/space/void/verb/eject_tank()
@@ -186,7 +189,7 @@
if(!istype(src.loc,/mob/living)) return
if(!tank && !cooler)
- usr << "There is no tank or cooling unit inserted."
+ to_chat(usr, "There is no tank or cooling unit inserted.")
return
var/mob/living/carbon/human/H = usr
@@ -202,7 +205,7 @@
else
removing = cooler
cooler = null
- H << "You press the emergency release, ejecting \the [removing] from your suit."
+ to_chat(H, "You press the emergency release, ejecting \the [removing] from your suit.")
removing.canremove = 1
H.drop_from_inventory(removing)
@@ -214,75 +217,75 @@
return ..()
if(istype(src.loc,/mob/living))
- user << "You cannot modify \the [src] while it is being worn."
+ to_chat(user, "You cannot modify \the [src] while it is being worn.")
return
- if(istype(W,/obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
if(helmet || boots || tank)
var/choice = input("What component would you like to remove?") as null|anything in list(helmet,boots,tank,cooler)
if(!choice) return
if(choice == tank) //No, a switch doesn't work here. Sorry. ~Techhead
- user << "You pop \the [tank] out of \the [src]'s storage compartment."
+ to_chat(user, "You pop \the [tank] out of \the [src]'s storage compartment.")
tank.forceMove(get_turf(src))
playsound(src, W.usesound, 50, 1)
src.tank = null
else if(choice == cooler)
- user << "You pop \the [cooler] out of \the [src]'s storage compartment."
+ to_chat(user, "You pop \the [cooler] out of \the [src]'s storage compartment.")
cooler.forceMove(get_turf(src))
playsound(src, W.usesound, 50, 1)
src.cooler = null
else if(choice == helmet)
- user << "You detatch \the [helmet] from \the [src]'s helmet mount."
+ to_chat(user, "You detatch \the [helmet] from \the [src]'s helmet mount.")
helmet.forceMove(get_turf(src))
playsound(src, W.usesound, 50, 1)
src.helmet = null
else if(choice == boots)
- user << "You detatch \the [boots] from \the [src]'s boot mounts."
+ to_chat(user, "You detatch \the [boots] from \the [src]'s boot mounts.")
boots.forceMove(get_turf(src))
playsound(src, W.usesound, 50, 1)
src.boots = null
else
- user << "\The [src] does not have anything installed."
+ to_chat(user, "\The [src] does not have anything installed.")
return
else if(istype(W,/obj/item/clothing/head/helmet/space))
if(helmet)
- user << "\The [src] already has a helmet installed."
+ to_chat(user, "\The [src] already has a helmet installed.")
else
- user << "You attach \the [W] to \the [src]'s helmet mount."
+ to_chat(user, "You attach \the [W] to \the [src]'s helmet mount.")
user.drop_item()
W.forceMove(src)
src.helmet = W
return
else if(istype(W,/obj/item/clothing/shoes/magboots))
if(boots)
- user << "\The [src] already has magboots installed."
+ to_chat(user, "\The [src] already has magboots installed.")
else
- user << "You attach \the [W] to \the [src]'s boot mounts."
+ to_chat(user, "You attach \the [W] to \the [src]'s boot mounts.")
user.drop_item()
W.forceMove(src)
boots = W
return
else if(istype(W,/obj/item/weapon/tank))
if(tank)
- user << "\The [src] already has an airtank installed."
+ to_chat(user, "\The [src] already has an airtank installed.")
else if(cooler)
- user << "\The [src]'s suit cooling unit is in the way. Remove it first."
+ to_chat(user, "\The [src]'s suit cooling unit is in the way. Remove it first.")
else if(istype(W,/obj/item/weapon/tank/phoron))
- user << "\The [W] cannot be inserted into \the [src]'s storage compartment."
+ to_chat(user, "\The [W] cannot be inserted into \the [src]'s storage compartment.")
else
- user << "You insert \the [W] into \the [src]'s storage compartment."
+ to_chat(user, "You insert \the [W] into \the [src]'s storage compartment.")
user.drop_item()
W.forceMove(src)
tank = W
return
else if(istype(W,/obj/item/device/suit_cooling_unit))
if(cooler)
- user << "\The [src] already has a suit cooling unit installed."
+ to_chat(user, "\The [src] already has a suit cooling unit installed.")
else if(tank)
- user << "\The [src]'s airtank is in the way. Remove it first."
+ to_chat(user, "\The [src]'s airtank is in the way. Remove it first.")
else
- user << "You insert \the [W] into \the [src]'s storage compartment."
+ to_chat(user, "You insert \the [W] into \the [src]'s storage compartment.")
user.drop_item()
W.forceMove(src)
cooler = W
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 40ce8258af..eb1a04a2e0 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -492,8 +492,20 @@
icon = 'icons/obj/clothing/modular_armor.dmi'
item_icons = list(slot_wear_suit_str = 'icons/mob/modular_armor.dmi')
icon_state = "pcarrier"
- valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_C, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L, ACCESSORY_SLOT_ARMOR_S, ACCESSORY_SLOT_ARMOR_M)
- restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_C, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L, ACCESSORY_SLOT_ARMOR_S)
+ valid_accessory_slots = (\
+ ACCESSORY_SLOT_INSIGNIA\
+ |ACCESSORY_SLOT_ARMOR_C\
+ |ACCESSORY_SLOT_ARMOR_A\
+ |ACCESSORY_SLOT_ARMOR_L\
+ |ACCESSORY_SLOT_ARMOR_S\
+ |ACCESSORY_SLOT_ARMOR_M)
+ restricted_accessory_slots = (\
+ ACCESSORY_SLOT_INSIGNIA\
+ |ACCESSORY_SLOT_ARMOR_C\
+ |ACCESSORY_SLOT_ARMOR_A\
+ |ACCESSORY_SLOT_ARMOR_L\
+ |ACCESSORY_SLOT_ARMOR_S\
+ |ACCESSORY_SLOT_ARMOR_M)
blood_overlay_type = "armor"
/obj/item/clothing/suit/armor/pcarrier/light
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 1d93fe9f25..b2afaae33a 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -160,7 +160,7 @@
icon_state = "hazard"
blood_overlay_type = "armor"
allowed = list (/obj/item/device/analyzer, /obj/item/device/flashlight, /obj/item/device/multitool, /obj/item/device/pipe_painter, /obj/item/device/radio, /obj/item/device/t_scanner,
- /obj/item/weapon/crowbar, /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/weapon/tank/emergency/oxygen,
+ /obj/item/weapon/tool/crowbar, /obj/item/weapon/tool/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/tool/wirecutters, /obj/item/weapon/tool/wrench, /obj/item/weapon/tank/emergency/oxygen,
/obj/item/clothing/mask/gas, /obj/item/taperoll/engineering)
body_parts_covered = UPPER_TORSO
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 9e0c0a0196..6f613e38ab 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -128,6 +128,7 @@
/obj/item/clothing/suit/syndicatefake
name = "red space suit replica"
+ icon = 'icons/obj/clothing/spacesuits.dmi'
icon_state = "syndicate"
desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!"
w_class = ITEMSIZE_NORMAL
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 1965a5873a..2dbda7a615 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -78,7 +78,7 @@
name = "Radiation Hood"
icon_state = "rad"
desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation"
-// flags_inv = BLOCKHAIR
+ flags_inv = BLOCKHAIR
item_flags = THICKMATERIAL
body_parts_covered = HEAD|FACE|EYES
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100)
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 67c82dcf79..97c2d3aa90 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -6,7 +6,7 @@
item_state_slots = list(slot_r_hand_str = "", slot_l_hand_str = "")
slot_flags = SLOT_TIE
w_class = ITEMSIZE_SMALL
- var/slot = "decor"
+ var/slot = ACCESSORY_SLOT_DECOR
var/obj/item/clothing/has_suit = null //the suit the tie may be attached to
var/image/inv_overlay = null //overlay used when attached to clothing.
var/image/mob_overlay = null
@@ -95,6 +95,7 @@
/obj/item/clothing/accessory/tie
name = "blue tie"
icon_state = "bluetie"
+ slot = ACCESSORY_SLOT_TIE
/obj/item/clothing/accessory/tie/red
name = "red tie"
@@ -145,6 +146,7 @@
name = "stethoscope"
desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing."
icon_state = "stethoscope"
+ slot = ACCESSORY_SLOT_TIE
/obj/item/clothing/accessory/stethoscope/do_surgery(mob/living/carbon/human/M, mob/living/user)
if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool
@@ -206,6 +208,7 @@
name = "bronze medal"
desc = "A bronze medal."
icon_state = "bronze"
+ slot = ACCESSORY_SLOT_MEDAL
/obj/item/clothing/accessory/medal/conduct
name = "distinguished conduct medal"
@@ -260,6 +263,7 @@
name = "green scarf"
desc = "A stylish scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks."
icon_state = "greenscarf"
+ slot = ACCESSORY_SLOT_DECOR
/obj/item/clothing/accessory/scarf/red
name = "red scarf"
@@ -322,6 +326,7 @@
icon_state = "bracelet"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_TIE
+ slot = ACCESSORY_SLOT_DECOR
/obj/item/clothing/accessory/bracelet/friendship
name = "friendship bracelet"
diff --git a/code/modules/clothing/under/accessories/armband.dm b/code/modules/clothing/under/accessories/armband.dm
index bf40074a2a..93f4790492 100644
--- a/code/modules/clothing/under/accessories/armband.dm
+++ b/code/modules/clothing/under/accessories/armband.dm
@@ -2,7 +2,7 @@
name = "red armband"
desc = "A fancy red armband!"
icon_state = "red"
- slot = "armband"
+ slot = ACCESSORY_SLOT_ARMBAND
/obj/item/clothing/accessory/armband/cargo
name = "cargo armband"
diff --git a/code/modules/clothing/under/accessories/armor.dm b/code/modules/clothing/under/accessories/armor.dm
index df9e3b7c17..c6abaa6015 100644
--- a/code/modules/clothing/under/accessories/armor.dm
+++ b/code/modules/clothing/under/accessories/armor.dm
@@ -89,7 +89,7 @@
/obj/item/clothing/accessory/armor/armorplate/merc
name = "heavy armor plate"
desc = "A ceramics-reinforced synthetic armor plate, providing state of of the art protection. Attaches to a plate carrier."
- icon_state = "armor_heavy"
+ icon_state = "armor_merc"
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
//////////////
diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm
index e96ea4ce4e..ded92c2b3a 100644
--- a/code/modules/clothing/under/accessories/badges.dm
+++ b/code/modules/clothing/under/accessories/badges.dm
@@ -9,6 +9,7 @@
desc = "Security Department detective's badge, made from gold."
icon_state = "badge"
slot_flags = SLOT_BELT | SLOT_TIE
+ slot = ACCESSORY_SLOT_MEDAL
var/stored_name
var/badge_string = "Corporate Security"
diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm
index 3f117d6ade..02fab3e95a 100644
--- a/code/modules/clothing/under/accessories/clothing.dm
+++ b/code/modules/clothing/under/accessories/clothing.dm
@@ -2,11 +2,13 @@
name = "black vest"
desc = "Slick black suit vest."
icon_state = "det_vest"
+ slot = ACCESSORY_SLOT_OVER
-/obj/item/clothing/accessory/jacket/
+/obj/item/clothing/accessory/jacket
name = "tan suit jacket"
desc = "Cozy suit jacket."
icon_state = "tan_jacket"
+ slot = ACCESSORY_SLOT_OVER
/obj/item/clothing/accessory/jacket/charcoal
name = "charcoal suit jacket"
@@ -55,7 +57,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
siemens_coefficient = 0.9
w_class = ITEMSIZE_NORMAL
- slot = "over"
+ slot = ACCESSORY_SLOT_OVER
sprite_sheets = list(
"Teshari" = 'icons/mob/species/seromi/suit.dmi'
@@ -119,8 +121,8 @@
* Cloak
*/
/obj/item/clothing/accessory/poncho/roles/cloak
- name = "brown cloak"
- desc = "An elaborate brown cloak."
+ name = "quartermaster's cloak"
+ desc = "An elaborate brown and gold cloak."
icon_state = "qmcloak"
item_state = "qmcloak"
body_parts_covered = null
@@ -167,6 +169,54 @@
icon_state = "capcloak"
item_state = "capcloak"
+/obj/item/clothing/accessory/poncho/roles/cloak/cargo
+ name = "brown cloak"
+ desc = "A simple brown and black cloak."
+ icon_state = "cargocloak"
+ item_state = "cargocloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/mining
+ name = "trimmed purple cloak"
+ desc = "A trimmed purple and brown cloak."
+ icon_state = "miningcloak"
+ item_state = "miningcloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/security
+ name = "red cloak"
+ desc = "A simple red and black cloak."
+ icon_state = "seccloak"
+ item_state = "seccloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/service
+ name = "green cloak"
+ desc = "A simple green and blue cloak."
+ icon_state = "servicecloak"
+ item_state = "servicecloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/engineer
+ name = "gold cloak"
+ desc = "A simple gold and brown cloak."
+ icon_state = "engicloak"
+ item_state = "engicloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/atmos
+ name = "yellow cloak"
+ desc = "A trimmed yellow and blue cloak."
+ icon_state = "atmoscloak"
+ item_state = "atmoscloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/research
+ name = "purple cloak"
+ desc = "A simple purple and white cloak."
+ icon_state = "scicloak"
+ item_state = "scicloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/medical
+ name = "blue cloak"
+ desc = "A simple blue and white cloak."
+ icon_state = "medcloak"
+ item_state = "medcloak"
+
/obj/item/clothing/accessory/hawaii
name = "flower-pattern shirt"
desc = "You probably need some welder googles to look at this."
@@ -176,6 +226,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO
siemens_coefficient = 0.9
w_class = ITEMSIZE_NORMAL
+ slot = ACCESSORY_SLOT_OVER
/obj/item/clothing/accessory/hawaii/red
icon_state = "hawaii2"
@@ -201,6 +252,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO
siemens_coefficient = 0.9
w_class = ITEMSIZE_NORMAL
+ slot = ACCESSORY_SLOT_OVER
/obj/item/clothing/accessory/wcoat/red
name = "red waistcoat"
@@ -242,6 +294,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
siemens_coefficient = 0.9
w_class = ITEMSIZE_NORMAL
+ slot = ACCESSORY_SLOT_OVER
/obj/item/clothing/accessory/sweater/pink
name = "pink sweater"
diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm
index b97ae6fc3f..08470fd9bb 100644
--- a/code/modules/clothing/under/accessories/holster.dm
+++ b/code/modules/clothing/under/accessories/holster.dm
@@ -2,7 +2,7 @@
name = "shoulder holster"
desc = "A handgun holster."
icon_state = "holster"
- slot = "utility"
+ slot = ACCESSORY_SLOT_TORSO //Legacy/balance purposes
concealed_holster = 1
var/obj/item/holstered = null
@@ -52,7 +52,7 @@
clear_holster()
/obj/item/clothing/accessory/holster/attack_hand(mob/user as mob)
- if (has_suit) //if we are part of a suit
+ if (has_suit && (slot & ACCESSORY_SLOT_UTILITY)) //if we are part of a suit
if (holstered)
unholster(user)
return
@@ -98,7 +98,7 @@
H = src
else if (istype(src, /obj/item/clothing/under))
var/obj/item/clothing/under/S = src
- if (S.accessories.len)
+ if (LAZYLEN(S.accessories))
H = locate() in S.accessories
if (!H)
diff --git a/code/modules/clothing/under/accessories/lockets.dm b/code/modules/clothing/under/accessories/lockets.dm
index 4d5ca9fd38..f8a2eaf1c7 100644
--- a/code/modules/clothing/under/accessories/lockets.dm
+++ b/code/modules/clothing/under/accessories/lockets.dm
@@ -2,9 +2,9 @@
name = "silver locket"
desc = "A small locket of high-quality metal."
icon_state = "locket"
- slot_flags = 0
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_MASK | SLOT_TIE
+ slot = ACCESSORY_SLOT_DECOR
var/base_icon
var/open
var/obj/item/held //Item inside locket.
diff --git a/code/modules/clothing/under/accessories/permits.dm b/code/modules/clothing/under/accessories/permits.dm
index c6170bfd61..d7a5c3f396 100644
--- a/code/modules/clothing/under/accessories/permits.dm
+++ b/code/modules/clothing/under/accessories/permits.dm
@@ -6,6 +6,7 @@
icon = 'icons/obj/card.dmi'
icon_state = "permit"
w_class = ITEMSIZE_TINY
+ slot = ACCESSORY_SLOT_MEDAL
var/owner = 0 //To prevent people from just renaming the thing if they steal it
/obj/item/clothing/accessory/permit/attack_self(mob/user as mob)
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index 150c84abcf..bdd97a1148 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -2,10 +2,10 @@
name = "load bearing equipment"
desc = "Used to hold things when you don't have enough hands."
icon_state = "webbing"
- slot = "utility"
+ slot = ACCESSORY_SLOT_UTILITY
show_messages = 1
- var/slots = 3
+ var/slots = 5
var/obj/item/weapon/storage/internal/hold
w_class = ITEMSIZE_NORMAL
@@ -49,45 +49,40 @@
name = "webbing"
desc = "Sturdy mess of synthcotton belts and buckles, ready to share your burden."
icon_state = "webbing"
+ slots = 3
/obj/item/clothing/accessory/storage/black_vest
name = "black webbing vest"
desc = "Robust black synthcotton vest with lots of pockets to hold whatever you need, but cannot hold in hands."
icon_state = "vest_black"
- slots = 5
/obj/item/clothing/accessory/storage/brown_vest
name = "brown webbing vest"
desc = "Worn brownish synthcotton vest with lots of pockets to unload your hands."
icon_state = "vest_brown"
- slots = 5
/obj/item/clothing/accessory/storage/white_vest
name = "white webbing vest"
desc = "Durable white synthcotton vest with lots of pockets to carry essentials."
icon_state = "vest_white"
- slots = 5
/obj/item/clothing/accessory/storage/black_drop_pouches
name = "black drop pouches"
gender = PLURAL
desc = "Robust black synthcotton bags to hold whatever you need, but cannot hold in hands."
icon_state = "thigh_black"
- slots = 5
/obj/item/clothing/accessory/storage/brown_drop_pouches
name = "brown drop pouches"
gender = PLURAL
desc = "Worn brownish synthcotton bags to hold whatever you need, but cannot hold in hands."
icon_state = "thigh_brown"
- slots = 5
/obj/item/clothing/accessory/storage/white_drop_pouches
name = "white drop pouches"
gender = PLURAL
desc = "Durable white synthcotton bags to hold whatever you need, but cannot hold in hands."
icon_state = "thigh_white"
- slots = 5
/obj/item/clothing/accessory/storage/knifeharness
name = "decorated harness"
diff --git a/code/modules/clothing/under/xenos/vox.dm b/code/modules/clothing/under/xenos/vox.dm
index e6f63abbcb..0997c5fa93 100644
--- a/code/modules/clothing/under/xenos/vox.dm
+++ b/code/modules/clothing/under/xenos/vox.dm
@@ -1,8 +1,8 @@
/obj/item/clothing/under/vox
has_sensor = 0
species_restricted = list(SPECIES_VOX)
- valid_accessory_slots = list("vox")
- restricted_accessory_slots = list("vox")
+ valid_accessory_slots = "vox"
+ restricted_accessory_slots = "vox"
phoronproof = 1
/obj/item/clothing/under/vox/vox_casual
diff --git a/code/modules/economy/cash_register.dm b/code/modules/economy/cash_register.dm
index c9332fb72f..0b85db8191 100644
--- a/code/modules/economy/cash_register.dm
+++ b/code/modules/economy/cash_register.dm
@@ -166,7 +166,7 @@
-/obj/machinery/cash_register/attackby(obj/O as obj, user as mob)
+/obj/machinery/cash_register/attackby(obj/item/O as obj, user as mob)
// Check for a method of paying (ID, PDA, e-wallet, cash, ect.)
var/obj/item/weapon/card/id/I = O.GetID()
if(I)
@@ -188,8 +188,8 @@
scan_cash(SC)
else if(istype(O, /obj/item/weapon/card/emag))
return ..()
- else if(istype(O, /obj/item/weapon/wrench))
- var/obj/item/weapon/wrench/W = O
+ else if(O.is_wrench())
+ var/obj/item/weapon/tool/wrench/W = O
toggle_anchors(W, user)
// Not paying: Look up price and add it to transaction_amount
else
@@ -479,7 +479,7 @@
usr << "The cash box is locked."
-/obj/machinery/cash_register/proc/toggle_anchors(obj/item/weapon/wrench/W, mob/user)
+/obj/machinery/cash_register/proc/toggle_anchors(obj/item/weapon/tool/wrench/W, mob/user)
if(manipulating) return
manipulating = 1
if(!anchored)
diff --git a/code/modules/events/atmos_leak.dm b/code/modules/events/atmos_leak.dm
index e0a3a55549..a3bc517be4 100644
--- a/code/modules/events/atmos_leak.dm
+++ b/code/modules/events/atmos_leak.dm
@@ -51,17 +51,6 @@
kill()
return
-/** Checks if any living humans are in a given area! */
-/datum/event/atmos_leak/proc/is_area_occupied(var/area/myarea)
- // Testing suggests looping over human_mob_list is quicker than looping over area contents
- for(var/mob/living/carbon/human/H in human_mob_list)
- if(H.stat >= DEAD) //Conditions for exclusion here, like if disconnected people start blocking it.
- continue
- var/area/A = get_area(H)
- if(A == myarea) //The loc of a turf is the area it is in.
- return 1
- return 0
-
/datum/event/atmos_leak/announce()
command_announcement.Announce("Warning, hazardous [gas_data.name[gas_type]] gas leak detected in \the [target_area], evacuate the area and contain the damage!", "Hazard Alert")
diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm
index e70a18ae21..3c7a116827 100644
--- a/code/modules/events/dust.dm
+++ b/code/modules/events/dust.dm
@@ -3,13 +3,13 @@
endWhen = 30
/datum/event/dust/announce()
- command_announcement.Announce("Debris resulting from activity on another nearby asteroid is approaching your colony.", "Dust Alert")
+ command_announcement.Announce("Debris resulting from activity on another nearby asteroid is approaching \the [station_name()]", "Dust Alert")
/datum/event/dust/start()
dust_swarm(get_severity())
/datum/event/dust/end()
- command_announcement.Announce("The colony is no longer in danger of impact from space debris.", "Dust Notice")
+ command_announcement.Announce("\The [station_name()] is no longer in danger of impact from space debris.", "Dust Notice")
/datum/event/dust/proc/get_severity()
switch(severity)
diff --git a/code/modules/events/escaped_slimes.dm b/code/modules/events/escaped_slimes.dm
index 9cc2f5a7fc..c9f4f661a3 100644
--- a/code/modules/events/escaped_slimes.dm
+++ b/code/modules/events/escaped_slimes.dm
@@ -32,8 +32,8 @@
/datum/event/escaped_slimes/start()
var/list/vents = list()
- for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
- if(temp_vent.network && temp_vent.loc.z in using_map.station_levels) //borrowed from spiders event, but it works. Distribute the slimes only in rooms with vents
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines)
+ if(temp_vent.network && temp_vent.loc.z in using_map.station_levels && !is_area_occupied(temp_vent.loc.loc)) //borrowed from spiders event, but it works. Distribute the slimes only in rooms with vents
vents += temp_vent
while((spawncount > 0) && vents.len)
diff --git a/code/modules/events/gravity.dm b/code/modules/events/gravity.dm
index f5fc8f0b5a..4d0881294f 100644
--- a/code/modules/events/gravity.dm
+++ b/code/modules/events/gravity.dm
@@ -6,9 +6,8 @@
endWhen = rand(15, 60)
// Setup which levels we will disrupt gravit on.
zLevels = using_map.station_levels.Copy()
- if (planet_controller)
- for(var/datum/planet/P in planet_controller.planets)
- zLevels -= P.expected_z_levels
+ for(var/datum/planet/P in SSplanets.planets)
+ zLevels -= P.expected_z_levels
/datum/event/gravity/announce()
command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system \
@@ -16,7 +15,7 @@
/datum/event/gravity/start()
gravity_is_on = 0
- for(var/area/A in world)
+ for(var/area/A in all_areas)
if(A.z in zLevels)
A.gravitychange(gravity_is_on, A)
@@ -24,7 +23,7 @@
if(!gravity_is_on)
gravity_is_on = 1
- for(var/area/A in world)
+ for(var/area/A in all_areas)
if(A.z in zLevels)
A.gravitychange(gravity_is_on, A)
diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm
index 6930a63222..b4b43bfe97 100644
--- a/code/modules/events/ion_storm.dm
+++ b/code/modules/events/ion_storm.dm
@@ -12,7 +12,7 @@
continue
players += player.real_name
- for (var/mob/living/silicon/ai/target in world)
+ for (var/mob/living/silicon/ai/target in silicon_mob_list)
var/law = target.generate_ion_law()
target << "You have detected a change in your laws information:"
target << law
@@ -30,7 +30,7 @@
/datum/event/ionstorm/tick()
if(botEmagChance)
- for(var/mob/living/bot/bot in world)
+ for(var/mob/living/bot/bot in mob_list)
if(prob(botEmagChance))
bot.emag_act(1)
@@ -146,7 +146,7 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
M.add_ion_law("THE STATION IS [who2pref] [who2]")
if(botEmagChance)
- for(var/obj/machinery/bot/bot in world)
+ for(var/obj/machinery/bot/bot in mob_list)
if(prob(botEmagChance))
bot.Emag()
*/
@@ -162,21 +162,21 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
spawn(0)
world << "Started processing APCs"
- for (var/obj/machinery/power/apc/APC in world)
+ for (var/obj/machinery/power/apc/APC in machines)
if(APC.z in station_levels)
APC.ion_act()
apcnum++
world << "Finished processing APCs. Processed: [apcnum]"
spawn(0)
world << "Started processing SMES"
- for (var/obj/machinery/power/smes/SMES in world)
+ for (var/obj/machinery/power/smes/SMES in machines)
if(SMES.z in station_levels)
SMES.ion_act()
smesnum++
world << "Finished processing SMES. Processed: [smesnum]"
spawn(0)
world << "Started processing AIRLOCKS"
- for (var/obj/machinery/door/airlock/D in world)
+ for (var/obj/machinery/door/airlock/D in machines)
if(D.z in station_levels)
//if(length(D.req_access) > 0 && !(12 in D.req_access)) //not counting general access and maintenance airlocks
airlocknum++
@@ -185,7 +185,7 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
world << "Finished processing AIRLOCKS. Processed: [airlocknum]"
spawn(0)
world << "Started processing FIREDOORS"
- for (var/obj/machinery/door/firedoor/D in world)
+ for (var/obj/machinery/door/firedoor/D in machines)
if(D.z in station_levels)
firedoornum++;
spawn(0)
diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm
index 6ffb6011ef..b4f202722c 100644
--- a/code/modules/events/meteors.dm
+++ b/code/modules/events/meteors.dm
@@ -6,16 +6,16 @@
var/start_side
/datum/event/meteor_wave/setup()
- waves = severity * rand(1,3)
+ waves = 2 + rand(1, severity) //EVENT_LEVEL_MAJOR is 3-5 waves
start_side = pick(cardinal)
endWhen = worst_case_end()
/datum/event/meteor_wave/announce()
switch(severity)
if(EVENT_LEVEL_MAJOR)
- command_announcement.Announce("Meteors have been detected on collision course with the colony.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
+ command_announcement.Announce("Meteors have been detected on collision course with \the [station_name()].", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
else
- command_announcement.Announce("The colony is now in a meteor shower.", "Meteor Alert")
+ command_announcement.Announce("\The [station_name()] is now in a meteor shower.", "Meteor Alert")
/datum/event/meteor_wave/tick()
if(waves && activeFor >= next_meteor)
@@ -32,15 +32,15 @@
/datum/event/meteor_wave/end()
switch(severity)
if(EVENT_LEVEL_MAJOR)
- command_announcement.Announce("The colony has cleared the meteor storm.", "Meteor Alert")
+ command_announcement.Announce("\The [station_name()] has cleared the meteor storm.", "Meteor Alert")
else
- command_announcement.Announce("The colony has cleared the meteor shower", "Meteor Alert")
+ command_announcement.Announce("\The [station_name()] has cleared the meteor shower", "Meteor Alert")
/datum/event/meteor_wave/proc/get_meteors()
- switch(severity)
- if(EVENT_LEVEL_MAJOR)
+ if(EVENT_LEVEL_MAJOR)
+ if(prob(10))
return meteors_catastrophic
- if(EVENT_LEVEL_MODERATE)
- return meteors_threatening
else
- return meteors_normal
+ return meteors_threatening
+ else
+ return meteors_normal
diff --git a/code/modules/events/money_hacker.dm b/code/modules/events/money_hacker.dm
index b0304d4f88..47734f412d 100644
--- a/code/modules/events/money_hacker.dm
+++ b/code/modules/events/money_hacker.dm
@@ -20,7 +20,7 @@
Notifications will be sent as updates occur. "
var/my_department = "[station_name()] firewall subroutines"
- for(var/obj/machinery/message_server/MS in world)
+ for(var/obj/machinery/message_server/MS in machines)
if(!MS.active) continue
MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2)
@@ -62,6 +62,6 @@
var/my_department = "[station_name()] firewall subroutines"
- for(var/obj/machinery/message_server/MS in world)
+ for(var/obj/machinery/message_server/MS in machines)
if(!MS.active) continue
MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2)
diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm
index 2f5d099e8d..57a80c8d32 100644
--- a/code/modules/events/prison_break.dm
+++ b/code/modules/events/prison_break.dm
@@ -41,14 +41,14 @@
/datum/event/prison_break/start()
- for(var/area/A in world)
+ for(var/area/A in all_areas)
if(is_type_in_list(A,areaType) && !is_type_in_list(A,areaNotType))
areas += A
if(areas && areas.len > 0)
var/my_department = "[station_name()] firewall subroutines"
var/rc_message = "An unknown malicious program has been detected in the [english_list(areaName)] lighting and airlock control systems at [stationtime2text()]. Systems will be fully compromised within approximately three minutes. Direct intervention is required immediately. "
- for(var/obj/machinery/message_server/MS in world)
+ for(var/obj/machinery/message_server/MS in machines)
MS.send_rc_message("Engineering", my_department, rc_message, "", "", 2)
for(var/mob/living/silicon/ai/A in player_list)
A << "Malicious program detected in the [english_list(areaName)] lighting and airlock control systems by [my_department]."
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index bf2dec5e4e..e778814e11 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -9,7 +9,7 @@
var/postStartTicks = 0
/datum/event/radiation_storm/announce()
- 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')
+ command_announcement.Announce("High levels of radiation detected near \the [station_name()]. Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg')
/datum/event/radiation_storm/start()
make_maint_all_access()
diff --git a/code/modules/events/shipping_error.dm b/code/modules/events/shipping_error.dm
index 725c6a834a..6b0924b6f7 100644
--- a/code/modules/events/shipping_error.dm
+++ b/code/modules/events/shipping_error.dm
@@ -1,6 +1,6 @@
/datum/event/shipping_error/start()
var/datum/supply_order/O = new /datum/supply_order()
O.ordernum = supply_controller.ordernum
- O.object = supply_controller.supply_packs[pick(supply_controller.supply_packs)]
- O.orderedby = random_name(pick(MALE,FEMALE), species = SPECIES_HUMAN)
+ O.object = supply_controller.supply_pack[pick(supply_controller.supply_pack)]
+ O.ordered_by = random_name(pick(MALE,FEMALE), species = SPECIES_HUMAN)
supply_controller.shoppinglist += O
\ No newline at end of file
diff --git a/code/modules/events/solar_storm.dm b/code/modules/events/solar_storm.dm
index afaa01ed95..1f6f820b14 100644
--- a/code/modules/events/solar_storm.dm
+++ b/code/modules/events/solar_storm.dm
@@ -9,7 +9,7 @@
endWhen = startWhen + rand(30,90) + rand(30,90) //2-6 minute duration
/datum/event/solar_storm/announce()
- command_announcement.Announce("A solar storm has been detected approaching the station. Please halt all EVA activites immediately and return to the interior of the station.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg')
+ command_announcement.Announce("A solar storm has been detected approaching \the [station_name()]. Please halt all EVA activites immediately and return to the interior of the station.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg')
adjust_solar_output(1.5)
/datum/event/solar_storm/proc/adjust_solar_output(var/mult = 1)
diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm
index b425ea9976..7eb0be92cc 100644
--- a/code/modules/events/spider_infestation.dm
+++ b/code/modules/events/spider_infestation.dm
@@ -16,7 +16,7 @@
/datum/event/spider_infestation/start()
var/list/vents = list()
- for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines)
if(!temp_vent.welded && temp_vent.network && temp_vent.loc.z in using_map.station_levels)
if(temp_vent.network.normal_members.len > 50)
vents += temp_vent
diff --git a/code/modules/events/viral_infection.dm b/code/modules/events/viral_infection.dm
index 828233ea5f..8d0ea8b7ee 100644
--- a/code/modules/events/viral_infection.dm
+++ b/code/modules/events/viral_infection.dm
@@ -28,7 +28,7 @@ datum/event/viral_infection/announce()
level = "five"
if (severity == EVENT_LEVEL_MAJOR || prob(60))
- command_announcement.Announce("Confirmed outbreak of level [level] biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg')
+ command_announcement.Announce("Confirmed outbreak of level [level] biohazard aboard \the [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg')
datum/event/viral_infection/start()
if(!viruses.len) return
diff --git a/code/modules/events/wallrot.dm b/code/modules/events/wallrot.dm
index 5aede8a894..e09cc50d2f 100644
--- a/code/modules/events/wallrot.dm
+++ b/code/modules/events/wallrot.dm
@@ -15,7 +15,7 @@
/datum/event/wallrot/announce()
if(center)
- command_announcement.Announce("Harmful fungi detected on the colony nearby [center.loc.name]. Station structures may be contaminated.", "Biohazard Alert")
+ command_announcement.Announce("Harmful fungi detected on \the [station_name()] nearby [center.loc.name]. Station structures may be contaminated.", "Biohazard Alert")
/datum/event/wallrot/start()
spawn()
diff --git a/code/modules/gamemaster/actions/shipping_error.dm b/code/modules/gamemaster/actions/shipping_error.dm
index affbe94dc9..33520f13a3 100644
--- a/code/modules/gamemaster/actions/shipping_error.dm
+++ b/code/modules/gamemaster/actions/shipping_error.dm
@@ -12,6 +12,6 @@
..()
var/datum/supply_order/O = new /datum/supply_order()
O.ordernum = supply_controller.ordernum
- O.object = supply_controller.supply_packs[pick(supply_controller.supply_packs)]
- O.orderedby = random_name(pick(MALE,FEMALE), species = "Human")
+ O.object = supply_controller.supply_pack[pick(supply_controller.supply_pack)]
+ O.ordered_by = random_name(pick(MALE,FEMALE), species = "Human")
supply_controller.shoppinglist += O
\ No newline at end of file
diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm
index 7432cda589..8ad12f9ab0 100644
--- a/code/modules/holodeck/HolodeckObjects.dm
+++ b/code/modules/holodeck/HolodeckObjects.dm
@@ -128,7 +128,8 @@
item_state = "boxing"
/obj/structure/window/reinforced/holowindow/attackby(obj/item/W as obj, mob/user as mob)
- if(!istype(W)) return//I really wish I did not need this
+ if(!istype(W))
+ return//I really wish I did not need this
if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
var/obj/item/weapon/grab/G = W
if(istype(G.affecting,/mob/living))
@@ -155,12 +156,12 @@
if(W.flags & NOBLUDGEON) return
- if(istype(W, /obj/item/weapon/screwdriver))
- user << ("It's a holowindow, you can't unfasten it!")
- else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <= 1)
- user << ("It's a holowindow, you can't pry it!")
- else if(istype(W, /obj/item/weapon/wrench) && !anchored && (!state || !reinf))
- user << ("It's a holowindow, you can't dismantle it!")
+ if(W.is_screwdriver())
+ to_chat(user, "It's a holowindow, you can't unfasten it!")
+ else if(W.is_crowbar() && reinf && state <= 1)
+ to_chat(user, "It's a holowindow, you can't pry it!")
+ else if(W.is_wrench() && !anchored && (!state || !reinf))
+ to_chat(user, "It's a holowindow, you can't dismantle it!")
else
if(W.damtype == BRUTE || W.damtype == BURN)
hit(W.force)
@@ -216,8 +217,8 @@
qdel(src)
/obj/structure/bed/chair/holochair/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench))
- user << ("It's a holochair, you can't dismantle it!")
+ if(W.is_wrench())
+ to_chat(user, "It's a holochair, you can't dismantle it!")
return
/obj/item/weapon/holo
@@ -269,13 +270,13 @@
icon_state = "sword[item_color]"
w_class = ITEMSIZE_LARGE
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
- user << "[src] is now active."
+ to_chat(user, "[src] is now active.")
else
force = 3
icon_state = "sword0"
w_class = ITEMSIZE_SMALL
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
- user << "[src] can now be concealed."
+ to_chat(user, "[src] can now be concealed.")
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
@@ -307,7 +308,7 @@
if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
var/obj/item/weapon/grab/G = W
if(G.state<2)
- user << "You need a better grip to do that!"
+ to_chat(user, "You need a better grip to do that!")
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
@@ -350,7 +351,7 @@
power_channel = ENVIRON
/obj/machinery/readybutton/attack_ai(mob/user as mob)
- user << "The station AI is not to interact with these devices!"
+ to_chat(user, "The station AI is not to interact with these devices!")
return
/obj/machinery/readybutton/New()
@@ -358,12 +359,12 @@
/obj/machinery/readybutton/attackby(obj/item/weapon/W as obj, mob/user as mob)
- user << "The device is a solid button, there's nothing you can do with it!"
+ to_chat(user, "The device is a solid button, there's nothing you can do with it!")
/obj/machinery/readybutton/attack_hand(mob/user as mob)
if(user.stat || stat & (NOPOWER|BROKEN))
- user << "This device is not powered."
+ to_chat(user, "This device is not powered.")
return
if(!user.IsAdvancedToolUser())
@@ -374,7 +375,7 @@
qdel(src)
if(eventstarted)
- usr << "The event has already begun!"
+ to_chat(usr, "The event has already begun!")
return
ready = !ready
@@ -405,7 +406,7 @@
qdel(W)
for(var/mob/M in currentarea)
- M << "FIGHT!"
+ to_chat(M, "FIGHT!")
// A window that disappears when the ready button is pressed
/obj/structure/window/reinforced/holowindow/disappearing
diff --git a/code/modules/holomap/generate_holomap.dm b/code/modules/holomap/generate_holomap.dm
new file mode 100644
index 0000000000..e4917e0ba0
--- /dev/null
+++ b/code/modules/holomap/generate_holomap.dm
@@ -0,0 +1,177 @@
+//
+// Holomap generation.
+// Based on /vg/station but trimmed down (without antag stuff) and massively optimized (you should have seen it before!) ~Leshana
+//
+
+// Define what criteria makes a turf a path or not
+
+// Turfs that will be colored as HOLOMAP_ROCK
+#define IS_ROCK(tile) (istype(tile, /turf/simulated/mineral) && tile.density)
+
+// Turfs that will be colored as HOLOMAP_OBSTACLE
+#define IS_OBSTACLE(tile) ((!istype(tile, /turf/space) && istype(tile.loc, /area/mine/unexplored)) \
+ || istype(tile, /turf/simulated/wall) \
+ || istype(tile, /turf/unsimulated/mineral) \
+ || (istype(tile, /turf/unsimulated/wall) && !istype(tile, /turf/unsimulated/wall/planetary)) \
+ /*|| istype(tile, /turf/simulated/shuttle/wall)*/ \
+ || (locate(/obj/structure/grille) in tile) \
+ /*|| (locate(/obj/structure/window/full) in tile)*/)
+
+// Turfs that will be colored as HOLOMAP_PATH
+#define IS_PATH(tile) ((istype(tile, /turf/simulated/floor) && !istype(tile, /turf/simulated/floor/outdoors)) \
+ || istype(tile, /turf/unsimulated/floor) \
+ /*|| istype(tile, /turf/simulated/shuttle/floor)*/ \
+ || (locate(/obj/structure/catwalk) in tile))
+
+/// Generates all the holo minimaps, initializing it all nicely, probably.
+/datum/controller/subsystem/holomaps/proc/generateHoloMinimaps()
+ var/start_time = world.timeofday
+ // Build the base map for each z level
+ for (var/z = 1 to world.maxz)
+ holoMiniMaps |= z // hack, todo fix
+ holoMiniMaps[z] = generateHoloMinimap(z)
+
+ // Generate the area overlays, small maps, etc for the station levels.
+ for (var/z in using_map.station_levels)
+ generateStationMinimap(z)
+
+ if(using_map.holomap_smoosh)
+ for(var/smoosh_list in using_map.holomap_smoosh)
+ smooshTetherHolomaps(smoosh_list)
+
+ holomaps_initialized = TRUE
+ admin_notice("Holomaps initialized in [round(0.1*(world.timeofday-start_time),0.1)] seconds.", R_DEBUG)
+
+ // TODO - Check - They had a delayed init perhaps?
+ for (var/obj/machinery/station_map/S in station_holomaps)
+ S.setup_holomap()
+
+// Generates the "base" holomap for one z-level, showing only the physical structure of walls and paths.
+/datum/controller/subsystem/holomaps/proc/generateHoloMinimap(var/zLevel = 1)
+ // Save these values now to avoid a bazillion array lookups
+ var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zLevel)
+ var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zLevel)
+
+ // Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime
+ var/icon/canvas = icon(HOLOMAP_ICON, "blank")
+ if(world.maxx + offset_x > canvas.Width())
+ crash_with("Minimap for z=[zLevel] : world.maxx ([world.maxx]) + holomap_offset_x ([offset_x]) must be <= [canvas.Width()]")
+ if(world.maxy + offset_y > canvas.Height())
+ crash_with("Minimap for z=[zLevel] : world.maxy ([world.maxy]) + holomap_offset_y ([offset_y]) must be <= [canvas.Height()]")
+
+ for(var/x = 1 to world.maxx)
+ for(var/y = 1 to world.maxy)
+ var/turf/tile = locate(x, y, zLevel)
+ if(tile && tile.loc:holomapAlwaysDraw())
+ if(IS_ROCK(tile))
+ canvas.DrawBox(HOLOMAP_ROCK, x + offset_x, y + offset_y)
+ if(IS_OBSTACLE(tile))
+ canvas.DrawBox(HOLOMAP_OBSTACLE, x + offset_x, y + offset_y)
+ else if(IS_PATH(tile))
+ canvas.DrawBox(HOLOMAP_PATH, x + offset_x, y + offset_y)
+ // Check sleeping after each row to avoid *completely* destroying the server
+ CHECK_TICK
+ return canvas
+
+// Okay, what does this one do?
+// This seems to do the drawing thing, but draws only the areas, having nothing to do with the tiles.
+// Leshana: I'm guessing this map will get overlayed on top of the base map at runtime? We'll see.
+// Wait, seems we actually blend the area map on top of it right now! Huh.
+/datum/controller/subsystem/holomaps/proc/generateStationMinimap(var/zLevel)
+ // Save these values now to avoid a bazillion array lookups
+ var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zLevel)
+ var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zLevel)
+
+ // Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime
+ var/icon/canvas = icon(HOLOMAP_ICON, "blank")
+ if(world.maxx + offset_x > canvas.Width())
+ crash_with("Minimap for z=[zLevel] : world.maxx ([world.maxx]) + holomap_offset_x ([offset_x]) must be <= [canvas.Width()]")
+ if(world.maxy + offset_y > canvas.Height())
+ crash_with("Minimap for z=[zLevel] : world.maxy ([world.maxy]) + holomap_offset_y ([offset_y]) must be <= [canvas.Height()]")
+
+ for(var/x = 1 to world.maxx)
+ for(var/y = 1 to world.maxy)
+ var/turf/tile = locate(x, y, zLevel)
+ if(tile && tile.loc)
+ var/area/areaToPaint = tile.loc
+ if(areaToPaint.holomap_color)
+ canvas.DrawBox(areaToPaint.holomap_color, x + offset_x, y + offset_y)
+
+ // Save this nice area-colored canvas in case we want to layer it or something I guess
+ extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPAREAS]_[zLevel]"] = canvas
+
+ var/icon/map_base = icon(holoMiniMaps[zLevel])
+ map_base.Blend(HOLOMAP_HOLOFIER, ICON_MULTIPLY)
+
+ // Generate the full sized map by blending the base and areas onto the backdrop
+ var/icon/big_map = icon(HOLOMAP_ICON, "stationmap")
+ big_map.Blend(map_base, ICON_OVERLAY)
+ big_map.Blend(canvas, ICON_OVERLAY)
+ extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAP]_[zLevel]"] = big_map
+
+ // Generate the "small" map (I presume for putting on wall map things?)
+ var/icon/small_map = icon(HOLOMAP_ICON, "blank")
+ small_map.Blend(map_base, ICON_OVERLAY)
+ small_map.Blend(canvas, ICON_OVERLAY)
+ small_map.Scale(WORLD_ICON_SIZE, WORLD_ICON_SIZE)
+
+ // And rotate it in every direction of course!
+ var/icon/actual_small_map = icon(small_map)
+ actual_small_map.Insert(new_icon = small_map, dir = SOUTH)
+ actual_small_map.Insert(new_icon = turn(small_map, 90), dir = WEST)
+ actual_small_map.Insert(new_icon = turn(small_map, 180), dir = NORTH)
+ actual_small_map.Insert(new_icon = turn(small_map, 270), dir = EAST)
+ extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[zLevel]"] = actual_small_map
+
+// For tiny multi-z maps like the tether, we want to smoosh em together into a nice big one!
+/datum/controller/subsystem/holomaps/proc/smooshTetherHolomaps(var/list/zlevels)
+ var/icon/big_map = icon(HOLOMAP_ICON, "stationmap")
+ var/icon/small_map = icon(HOLOMAP_ICON, "blank")
+ // For each zlevel in turn, overlay them on top of each other
+ for(var/zLevel in zlevels)
+ var/icon/z_terrain = icon(holoMiniMaps[zLevel])
+ z_terrain.Blend(HOLOMAP_HOLOFIER, ICON_MULTIPLY)
+ big_map.Blend(z_terrain, ICON_OVERLAY)
+ small_map.Blend(z_terrain, ICON_OVERLAY)
+ var/icon/z_areas = extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPAREAS]_[zLevel]"]
+ big_map.Blend(z_areas, ICON_OVERLAY)
+ small_map.Blend(z_areas, ICON_OVERLAY)
+
+ // Then scale and rotate to make the actual small map we will use
+ small_map.Scale(WORLD_ICON_SIZE, WORLD_ICON_SIZE)
+ var/icon/actual_small_map = icon(small_map)
+ actual_small_map.Insert(new_icon = small_map, dir = SOUTH)
+ actual_small_map.Insert(new_icon = turn(small_map, 90), dir = WEST)
+ actual_small_map.Insert(new_icon = turn(small_map, 180), dir = NORTH)
+ actual_small_map.Insert(new_icon = turn(small_map, 270), dir = EAST)
+
+ // Then assign this icon as the icon for all those levels!
+ for(var/zLevel in zlevels)
+ extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAP]_[zLevel]"] = big_map
+ extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[zLevel]"] = actual_small_map
+
+// TODO - Holomap Markers!
+// /proc/generateMinimapMarkers(var/zLevel)
+// // Save these values now to avoid a bazillion array lookups
+// var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zLevel)
+// var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zLevel)
+
+// // TODO - Holomap markers
+// for(var/filter in list(HOLOMAP_FILTER_STATIONMAP))
+// var/icon/canvas = icon(HOLOMAP_ICON, "blank")
+// for(/datum/holomap_marker/holomarker in holomap_markers)
+// if(holomarker.z == zLevel && holomarker.filter & filter)
+// canvas.Blend(icon(holomarker.icon, holomarker.icon_state), ICON_OVERLAY, holomarker.x + offset_x, holomarker.y + offset_y)
+// extraMiniMaps["[HOLOMAP_EXTRA_MARKERS]_[filter]_[zLevel]"] = canvas
+
+// /datum/holomap_marker
+// var/x
+// var/y
+// var/z
+// var/filter
+// var/icon = 'icons/holomap_markers.dmi'
+// var/icon_state
+
+#undef IS_ROCK
+#undef IS_OBSTACLE
+#undef IS_PATH
diff --git a/code/modules/holomap/holomap_area.dm b/code/modules/holomap/holomap_area.dm
new file mode 100644
index 0000000000..2cc755dfa5
--- /dev/null
+++ b/code/modules/holomap/holomap_area.dm
@@ -0,0 +1,80 @@
+/*
+** Holomap vars and procs on /area
+*/
+
+/area
+ var/holomap_color = null // Color of this area on station holomap
+
+/area/rnd
+ holomap_color = HOLOMAP_AREACOLOR_SCIENCE
+/area/outpost/research
+ holomap_color = HOLOMAP_AREACOLOR_SCIENCE
+/area/server
+ holomap_color = HOLOMAP_AREACOLOR_SCIENCE
+/area/assembly
+ holomap_color = HOLOMAP_AREACOLOR_SCIENCE
+
+/area/bridge
+ holomap_color = HOLOMAP_AREACOLOR_COMMAND
+/area/teleporter
+ holomap_color = HOLOMAP_AREACOLOR_COMMAND
+/area/teleporter/departing
+ holomap_color = null
+
+/area/security
+ holomap_color = HOLOMAP_AREACOLOR_SECURITY
+/area/tether/surfacebase/security
+ holomap_color = HOLOMAP_AREACOLOR_SECURITY
+
+/area/medical
+ holomap_color = HOLOMAP_AREACOLOR_MEDICAL
+/area/tether/surfacebase/medical
+ holomap_color = HOLOMAP_AREACOLOR_MEDICAL
+
+/area/engineering
+ holomap_color = HOLOMAP_AREACOLOR_ENGINEERING
+/area/engineering/atmos/intake
+ holomap_color = null
+/area/maintenance/substation/engineering
+ holomap_color = HOLOMAP_AREACOLOR_ENGINEERING
+/area/storage/tech
+ holomap_color = HOLOMAP_AREACOLOR_ENGINEERING
+
+/area/quartermaster
+ holomap_color = HOLOMAP_AREACOLOR_CARGO
+/area/tether/surfacebase/mining_main
+ holomap_color = HOLOMAP_AREACOLOR_CARGO
+
+/area/hallway
+ holomap_color = HOLOMAP_AREACOLOR_HALLWAYS
+/area/bridge/hallway
+ holomap_color = HOLOMAP_AREACOLOR_HALLWAYS
+
+/area/crew_quarters/sleep
+ holomap_color = HOLOMAP_AREACOLOR_DORMS
+/area/crew_quarters/sleep/cryo
+ holomap_color = null
+
+// Heads
+/area/crew_quarters/captain
+ holomap_color = HOLOMAP_AREACOLOR_COMMAND
+/area/crew_quarters/heads/hop
+ holomap_color = HOLOMAP_AREACOLOR_COMMAND
+/area/crew_quarters/heads/hor
+ holomap_color = HOLOMAP_AREACOLOR_SCIENCE
+/area/crew_quarters/heads/chief
+ holomap_color = HOLOMAP_AREACOLOR_ENGINEERING
+/area/crew_quarters/heads/hos
+ holomap_color = HOLOMAP_AREACOLOR_SECURITY
+/area/crew_quarters/heads/cmo
+ holomap_color = HOLOMAP_AREACOLOR_MEDICAL
+/area/crew_quarters/medbreak
+ holomap_color = HOLOMAP_AREACOLOR_MEDICAL
+
+
+// ### PROCS ###
+// Whether the turfs in the area should be drawn onto the "base" holomap.
+/area/proc/holomapAlwaysDraw()
+ return TRUE
+/area/shuttle/holomapAlwaysDraw()
+ return FALSE
\ No newline at end of file
diff --git a/code/modules/holomap/holomap_datum.dm b/code/modules/holomap/holomap_datum.dm
new file mode 100644
index 0000000000..af4cc6f274
--- /dev/null
+++ b/code/modules/holomap/holomap_datum.dm
@@ -0,0 +1,40 @@
+// Simple datum to keep track of a running holomap. Each machine capable of displaying the holomap will have one.
+/datum/station_holomap
+ var/image/station_map
+ var/image/cursor
+ var/image/legend
+
+/datum/station_holomap/proc/initialize_holomap(var/turf/T, var/isAI = null, var/mob/user = null, var/reinit = FALSE)
+ if(!station_map || reinit)
+ station_map = image(SSholomaps.extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAP]_[T.z]"])
+ if(!cursor || reinit)
+ cursor = image('icons/holomap_markers.dmi', "you")
+ if(!legend || reinit)
+ legend = image('icons/effects/64x64.dmi', "legend_sc")
+
+ if(isAI)
+ T = get_turf(user.client.eye)
+ cursor.pixel_x = (T.x - 6 + HOLOMAP_PIXEL_OFFSET_X(T.z)) * PIXEL_MULTIPLIER
+ cursor.pixel_y = (T.y - 6 + HOLOMAP_PIXEL_OFFSET_Y(T.z)) * PIXEL_MULTIPLIER
+
+ legend.pixel_x = HOLOMAP_LEGEND_X(T.z)
+ legend.pixel_y = HOLOMAP_LEGEND_Y(T.z)
+
+ station_map.overlays |= cursor
+ station_map.overlays |= legend
+
+/datum/station_holomap/proc/initialize_holomap_bogus()
+ station_map = image('icons/480x480.dmi', "stationmap")
+ legend = image('icons/effects/64x64.dmi', "notfound")
+ legend.pixel_x = 7 * WORLD_ICON_SIZE
+ legend.pixel_y = 7 * WORLD_ICON_SIZE
+ station_map.overlays |= legend
+
+// TODO - Strategic Holomap support
+// /datum/station_holomap/strategic/initialize_holomap(var/turf/T, var/isAI=null, var/mob/user=null)
+// ..()
+// station_map = image(SSholomaps.extraMiniMaps[HOLOMAP_EXTRA_STATIONMAP_STRATEGIC])
+// legend = image('icons/effects/64x64.dmi', "strategic")
+// legend.pixel_x = 3*WORLD_ICON_SIZE
+// legend.pixel_y = 3*WORLD_ICON_SIZE
+// station_map.overlays |= legend
diff --git a/code/modules/holomap/station_holomap.dm b/code/modules/holomap/station_holomap.dm
new file mode 100644
index 0000000000..9de56229da
--- /dev/null
+++ b/code/modules/holomap/station_holomap.dm
@@ -0,0 +1,251 @@
+//
+// Wall mounted holomap of the station
+//
+/obj/machinery/station_map
+ name = "station holomap"
+ desc = "A virtual map of the surrounding station."
+ icon = 'icons/obj/machines/stationmap.dmi'
+ icon_state = "station_map"
+ anchored = 1
+ density = 0
+ use_power = 1
+ idle_power_usage = 10
+ active_power_usage = 500
+ circuit = /obj/item/weapon/circuitboard/station_map
+
+ // TODO - Port use_auto_lights from /vg - for now declare here
+ var/use_auto_lights = 1
+ var/light_power_on = 1
+ var/light_range_on = 2
+ light_color = "#64C864"
+
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
+
+ var/mob/watching_mob = null
+ var/image/small_station_map = null
+ var/image/floor_markings = null
+ var/image/panel = null
+
+ var/original_zLevel = 1 // zLevel on which the station map was initialized.
+ var/bogus = TRUE // set to 0 when you initialize the station map on a zLevel that has its own icon formatted for use by station holomaps.
+ var/datum/station_holomap/holomap_datum
+
+/obj/machinery/station_map/New()
+ ..()
+ holomap_datum = new()
+ original_zLevel = loc.z
+ SSholomaps.station_holomaps += src
+ flags |= ON_BORDER // Why? It doesn't help if its not density
+
+/obj/machinery/station_map/initialize()
+ . = ..()
+ if(SSholomaps.holomaps_initialized)
+ spawn(1) // Tragically we need to spawn this in order to give the frame construcing us time to set pixel_x/y
+ setup_holomap()
+
+/obj/machinery/station_map/Destroy()
+ SSholomaps.station_holomaps -= src
+ stopWatching()
+ holomap_datum = null
+ . = ..()
+
+/obj/machinery/station_map/proc/setup_holomap()
+ . = ..()
+ bogus = FALSE
+ var/turf/T = get_turf(src)
+ original_zLevel = T.z
+ if(!("[HOLOMAP_EXTRA_STATIONMAP]_[original_zLevel]" in SSholomaps.extraMiniMaps))
+ bogus = TRUE
+ holomap_datum.initialize_holomap_bogus()
+ update_icon()
+ return
+
+ holomap_datum.initialize_holomap(T, reinit = TRUE)
+
+ small_station_map = image(SSholomaps.extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"], dir = dir)
+ // small_station_map.plane = LIGHTING_PLANE // Not until we do planes ~Leshana
+ // small_station_map.layer = LIGHTING_LAYER+1 // Weird things will happen!
+
+ floor_markings = image('icons/obj/machines/stationmap.dmi', "decal_station_map")
+ floor_markings.dir = src.dir
+ // floor_markings.plane = ABOVE_TURF_PLANE // Not until we do planes ~Leshana
+ // floor_markings.layer = DECAL_LAYER
+ update_icon()
+
+/obj/machinery/station_map/attack_hand(var/mob/user)
+ if(watching_mob && (watching_mob != user))
+ to_chat(user, "Someone else is currently watching the holomap.")
+ return
+ if(user.loc != loc)
+ to_chat(user, "You need to stand in front of \the [src].")
+ return
+ startWatching(user)
+
+// Let people bump up against it to watch
+/obj/machinery/station_map/Bumped(var/atom/movable/AM)
+ if(!watching_mob && isliving(AM) && AM.loc == loc)
+ startWatching(AM)
+
+// In order to actually get Bumped() we need to block movement. We're (visually) on a wall, so people
+// couldn't really walk into us anyway. But in reality we are on the turf in front of the wall, so bumping
+// against where we seem is actually trying to *exit* our real loc
+/obj/machinery/station_map/CheckExit(atom/movable/mover as mob|obj, turf/target as turf)
+ // log_debug("[src] (dir=[dir]) CheckExit([mover], [target]) get_dir() = [get_dir(target, loc)]")
+ if(get_dir(target, loc) == dir) // Opposite of "normal" since we are visually in the next turf over
+ return FALSE
+ else
+ return TRUE
+
+/obj/machinery/station_map/proc/startWatching(var/mob/user)
+ // Okay, does this belong on a screen thing or what?
+ // One argument is that this is an "in game" object becuase its in the world.
+ // But I think it actually isn't. The map isn't holo projected into the whole room, (maybe strat one is!)
+ // But for this, the on screen object just represents you leaning in and looking at it closely.
+ // So it SHOULD be a screen object.
+ // But it is not QUITE a hud either. So I think it shouldn't go in /datum/hud
+ // Okay? Yeah. Lets use screen objects but manage them manually here in the item.
+ // That might be a mistake... I'd rather they be managed by some central hud management system.
+ // But the /vg code, while the screen obj is managed, its still adding and removing image, so this is
+ // just as good.
+
+ // EH JUST HACK IT FOR NOW SO WE CAN SEE HOW IT LOOKS! STOP OBSESSING, ITS BEEN AN HOUR NOW!
+
+ // TODO - This part!! ~Leshana
+ if(isliving(user) && anchored && !(stat & (NOPOWER|BROKEN)))
+ if(user.client)
+ holomap_datum.station_map.loc = global_hud.holomap // Put the image on the holomap hud
+ holomap_datum.station_map.alpha = 0 // Set to transparent so we can fade in
+ animate(holomap_datum.station_map, alpha = 255, time = 5, easing = LINEAR_EASING)
+ flick("station_map_activate", src)
+ // Wait, if wea re not modifying the holomap_obj... can't it be part of the global hud?
+ user.client.screen |= global_hud.holomap // TODO - HACK! This should be there permenently really.
+ user.client.images |= holomap_datum.station_map
+
+ watching_mob = user
+ moved_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition)
+ dir_set_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition)
+ destroyed_event.register(watching_mob, src, /obj/machinery/station_map/proc/stopWatching)
+ update_use_power(2)
+
+ if(bogus)
+ to_chat(user, "The holomap failed to initialize. This area of space cannot be mapped.")
+ else
+ to_chat(user, "A hologram of the station appears before your eyes.")
+
+/obj/machinery/station_map/attack_ai(var/mob/living/silicon/robot/user)
+ return // TODO - Implement for AI ~Leshana
+ // user.station_holomap.toggleHolomap(user, isAI(user))
+
+/obj/machinery/station_map/process()
+ if((stat & (NOPOWER|BROKEN)) || !anchored)
+ stopWatching()
+
+/obj/machinery/station_map/proc/checkPosition()
+ if(!watching_mob || (watching_mob.loc != loc) || (dir != watching_mob.dir))
+ stopWatching()
+
+/obj/machinery/station_map/proc/stopWatching()
+ if(watching_mob)
+ if(watching_mob.client)
+ animate(holomap_datum.station_map, alpha = 0, time = 5, easing = LINEAR_EASING)
+ var/mob/M = watching_mob
+ spawn(5) //we give it time to fade out
+ M.client.images -= holomap_datum.station_map
+ moved_event.unregister(watching_mob, src)
+ dir_set_event.unregister(watching_mob, src)
+ destroyed_event.unregister(watching_mob, src)
+ watching_mob = null
+ update_use_power(1)
+
+/obj/machinery/station_map/power_change()
+ . = ..()
+ update_icon()
+ // TODO - Port use_auto_lights from /vg - For now implement it manually here
+ if(stat & NOPOWER)
+ set_light(0)
+ else
+ set_light(light_range_on, light_power_on)
+
+/obj/machinery/station_map/proc/set_broken()
+ stat |= BROKEN
+ update_icon()
+
+/obj/machinery/station_map/update_icon()
+ overlays.Cut()
+ if(stat & BROKEN)
+ icon_state = "station_mapb"
+ else if((stat & NOPOWER) || !anchored)
+ icon_state = "station_map0"
+ else
+ icon_state = "station_map"
+
+ if(bogus)
+ holomap_datum.initialize_holomap_bogus()
+ else
+ small_station_map.icon = SSholomaps.extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"]
+ overlays |= small_station_map
+ holomap_datum.initialize_holomap(get_turf(src))
+
+ // Put the little "map" overlay down where it looks nice
+ if(floor_markings)
+ floor_markings.dir = src.dir
+ floor_markings.pixel_x = -src.pixel_x
+ floor_markings.pixel_y = -src.pixel_y
+ overlays += floor_markings
+
+ if(panel_open)
+ overlays += "station_map-panel"
+ else
+ overlays -= "station_map-panel"
+
+/obj/machinery/station_map/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ src.add_fingerprint(user)
+ if(default_deconstruction_screwdriver(user, W))
+ return
+ if(default_deconstruction_crowbar(user, W))
+ return
+ return ..()
+
+/obj/machinery/station_map/ex_act(severity)
+ switch(severity)
+ if(1)
+ qdel(src)
+ if(2)
+ if (prob(50))
+ qdel(src)
+ else
+ set_broken()
+ if(3)
+ if (prob(25))
+ set_broken()
+
+/datum/frame/frame_types/station_map
+ name = "Station Map Frame"
+ frame_class = "display"
+ frame_size = 3
+ frame_style = "wall"
+ x_offset = WORLD_ICON_SIZE
+ y_offset = WORLD_ICON_SIZE
+ circuit = /obj/item/weapon/circuitboard/station_map
+ icon_override = 'icons/obj/machines/stationmap.dmi'
+
+/datum/frame/frame_types/station_map/get_icon_state(var/state)
+ return "station_map_frame_[state]"
+
+/obj/structure/frame
+ layer = ABOVE_WINDOW_LAYER
+
+/obj/item/weapon/circuitboard/station_map
+ name = T_BOARD("Station Map")
+ board_type = new /datum/frame/frame_types/station_map
+ build_path = /obj/machinery/station_map
+ origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2)
+ req_components = list()
+
+// TODO
+// //Portable holomaps, currently AI/Borg/MoMMI only
+
+// TODO
+// OHHHH YEAH - STRATEGIC HOLOMAP! NICE!
+// It will need to wait until later tho.
diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm
index cc46a8da38..7f95ac306c 100644
--- a/code/modules/hydroponics/beekeeping/beehive.dm
+++ b/code/modules/hydroponics/beekeeping/beehive.dm
@@ -33,22 +33,22 @@
/obj/machinery/beehive/examine(var/mob/user)
..()
if(!closed)
- user << "The lid is open."
+ to_chat(user, "The lid is open.")
/obj/machinery/beehive/attackby(var/obj/item/I, var/mob/user)
- if(istype(I, /obj/item/weapon/crowbar))
+ if(I.is_crowbar())
closed = !closed
user.visible_message("[user] [closed ? "closes" : "opens"] \the [src].", "You [closed ? "close" : "open"] \the [src].")
update_icon()
return
- else if(istype(I, /obj/item/weapon/wrench))
+ else if(I.is_wrench())
anchored = !anchored
playsound(loc, I.usesound, 50, 1)
user.visible_message("[user] [anchored ? "wrenches" : "unwrenches"] \the [src].", "You [anchored ? "wrench" : "unwrench"] \the [src].")
return
else if(istype(I, /obj/item/bee_smoker))
if(closed)
- user << "You need to open \the [src] with a crowbar before smoking the bees."
+ to_chat(user, "You need to open \the [src] with a crowbar before smoking the bees.")
return
user.visible_message("[user] smokes the bees in \the [src].", "You smoke the bees in \the [src].")
smoked = 30
@@ -56,14 +56,14 @@
return
else if(istype(I, /obj/item/honey_frame))
if(closed)
- user << "You need to open \the [src] with a crowbar before inserting \the [I]."
+ to_chat(user, "You need to open \the [src] with a crowbar before inserting \the [I].")
return
if(frames >= maxFrames)
- user << "There is no place for an another frame."
+ to_chat(user, "There is no place for an another frame.")
return
var/obj/item/honey_frame/H = I
if(H.honey)
- user << "\The [I] is full with beeswax and honey, empty it in the extractor first."
+ to_chat(user, "\The [I] is full with beeswax and honey, empty it in the extractor first.")
return
++frames
user.visible_message("[user] loads \the [I] into \the [src].", "You load \the [I] into \the [src].")
@@ -74,16 +74,16 @@
else if(istype(I, /obj/item/bee_pack))
var/obj/item/bee_pack/B = I
if(B.full && bee_count)
- user << "\The [src] already has bees inside."
+ to_chat(user, "\The [src] already has bees inside.")
return
if(!B.full && bee_count < 90)
- user << "\The [src] is not ready to split."
+ to_chat(user, "\The [src] is not ready to split.")
return
if(!B.full && !smoked)
- user << "Smoke \the [src] first!"
+ to_chat(user, "Smoke \the [src] first!")
return
if(closed)
- user << "You need to open \the [src] with a crowbar before moving the bees."
+ to_chat(user, "You need to open \the [src] with a crowbar before moving the bees.")
return
if(B.full)
user.visible_message("[user] puts the queen and the bees from \the [I] into \the [src].", "You put the queen and the bees from \the [I] into \the [src].")
@@ -96,22 +96,22 @@
update_icon()
return
else if(istype(I, /obj/item/device/analyzer/plant_analyzer))
- user << "Scan result of \the [src]..."
- user << "Beehive is [bee_count ? "[round(bee_count)]% full" : "empty"].[bee_count > 90 ? " Colony is ready to split." : ""]"
+ to_chat(user, "Scan result of \the [src]...")
+ to_chat(user, "Beehive is [bee_count ? "[round(bee_count)]% full" : "empty"].[bee_count > 90 ? " Colony is ready to split." : ""]")
if(frames)
- user << "[frames] frames installed, [round(honeycombs / 100)] filled."
+ to_chat(user, "[frames] frames installed, [round(honeycombs / 100)] filled.")
if(honeycombs < frames * 100)
- user << "Next frame is [round(honeycombs % 100)]% full."
+ to_chat(user, "Next frame is [round(honeycombs % 100)]% full.")
else
- user << "No frames installed."
+ to_chat(user, "No frames installed.")
if(smoked)
- user << "The hive is smoked."
+ to_chat(user, "The hive is smoked.")
return 1
- else if(istype(I, /obj/item/weapon/screwdriver))
+ else if(I.is_screwdriver())
if(bee_count)
- user << "You can't dismantle \the [src] with these bees inside."
+ to_chat(user, "You can't dismantle \the [src] with these bees inside.")
return
- user << "You start dismantling \the [src]..."
+ to_chat(user, "You start dismantling \the [src]...")
playsound(src, I.usesound, 50, 1)
if(do_after(user, 30))
user.visible_message("[user] dismantles \the [src].", "You dismantle \the [src].")
@@ -122,10 +122,10 @@
/obj/machinery/beehive/attack_hand(var/mob/user)
if(!closed)
if(honeycombs < 100)
- user << "There are no filled honeycombs."
+ to_chat(user, "There are no filled honeycombs.")
return
if(!smoked && bee_count)
- user << "The bees won't let you take the honeycombs out like this, smoke them first."
+ to_chat(user, "The bees won't let you take the honeycombs out like this, smoke them first.")
return
user.visible_message("[user] starts taking the honeycombs out of \the [src].", "You start taking the honeycombs out of \the [src]...")
while(honeycombs >= 100 && do_after(user, 30))
@@ -134,7 +134,7 @@
--frames
update_icon()
if(honeycombs < 100)
- user << "You take all filled honeycombs out."
+ to_chat(user, "You take all filled honeycombs out.")
return
/obj/machinery/beehive/process()
@@ -166,12 +166,12 @@
/obj/machinery/honey_extractor/attackby(var/obj/item/I, var/mob/user)
if(processing)
- user << "\The [src] is currently spinning, wait until it's finished."
+ to_chat(user, "\The [src] is currently spinning, wait until it's finished.")
return
else if(istype(I, /obj/item/honey_frame))
var/obj/item/honey_frame/H = I
if(!H.honey)
- user << "\The [H] is empty, put it into a beehive."
+ to_chat(user, "\The [H] is empty, put it into a beehive.")
return
user.visible_message("[user] loads \the [H] into \the [src] and turns it on.", "You load \the [H] into \the [src] and turn it on.")
processing = H.honey
@@ -185,7 +185,7 @@
icon_state = "centrifuge"
else if(istype(I, /obj/item/weapon/reagent_containers/glass))
if(!honey)
- user << "There is no honey in \the [src]."
+ to_chat(user, "There is no honey in \the [src].")
return
var/obj/item/weapon/reagent_containers/glass/G = I
var/transferred = min(G.reagents.maximum_volume - G.reagents.total_volume, honey)
@@ -226,7 +226,7 @@
icon_state = "apiary"
/obj/item/beehive_assembly/attack_self(var/mob/user)
- user << "You start assembling \the [src]..."
+ to_chat(user, "You start assembling \the [src]...")
if(do_after(user, 30))
user.visible_message("[user] constructs a beehive.", "You construct a beehive.")
new /obj/machinery/beehive(get_turf(user))
diff --git a/code/modules/hydroponics/seed_controller.dm b/code/modules/hydroponics/seed_controller.dm
index 6a743d4a1c..b0aaab0a7c 100644
--- a/code/modules/hydroponics/seed_controller.dm
+++ b/code/modules/hydroponics/seed_controller.dm
@@ -81,7 +81,7 @@ var/global/datum/controller/plants/plant_controller // Set in New().
// Make sure any seed packets that were mapped in are updated
// correctly (since the seed datums did not exist a tick ago).
- for(var/obj/item/seeds/S in world)
+ for(var/obj/item/seeds/S in all_seed_packs)
S.update_seed()
//Might as well mask the gene types while we're at it.
diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm
index 6e6ef84fd1..b70a02af4c 100644
--- a/code/modules/hydroponics/seed_datums.dm
+++ b/code/modules/hydroponics/seed_datums.dm
@@ -860,6 +860,7 @@
seed_name = "watermelon"
display_name = "watermelon vine"
chems = list("nutriment" = list(1,6), "watermelonjuice" = list(10,6))
+ kitchen_tag = "watermelon"
/datum/seed/watermelon/New()
..()
diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm
index bc96f064c9..3507e49700 100644
--- a/code/modules/hydroponics/seed_machines.dm
+++ b/code/modules/hydroponics/seed_machines.dm
@@ -17,7 +17,7 @@
if(genes.len)
var/choice = alert(user, "Are you sure you want to wipe the disk?", "Xenobotany Data", "No", "Yes")
if(src && user && genes && choice && choice == "Yes" && user.Adjacent(get_turf(src)))
- user << "You wipe the disk data."
+ to_chat(user, "You wipe the disk data.")
name = initial(name)
desc = initial(name)
genes = list()
@@ -82,16 +82,16 @@
/obj/machinery/botany/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/seeds))
if(seed)
- user << "There is already a seed loaded."
+ to_chat(user, "There is already a seed loaded.")
return
var/obj/item/seeds/S =W
if(S.seed && S.seed.get_trait(TRAIT_IMMUTABLE) > 0)
- user << "That seed is not compatible with our genetics technology."
+ to_chat(user, "That seed is not compatible with our genetics technology.")
else
user.drop_from_inventory(W)
W.loc = src
seed = W
- user << "You load [W] into [src]."
+ to_chat(user, "You load [W] into [src].")
return
if(default_deconstruction_screwdriver(user, W))
@@ -100,24 +100,24 @@
return
if(istype(W,/obj/item/weapon/disk/botany))
if(loaded_disk)
- user << "There is already a data disk loaded."
+ to_chat(user, "There is already a data disk loaded.")
return
else
var/obj/item/weapon/disk/botany/B = W
if(B.genes && B.genes.len)
if(!disk_needs_genes)
- user << "That disk already has gene data loaded."
+ to_chat(user, "That disk already has gene data loaded.")
return
else
if(disk_needs_genes)
- user << "That disk does not have any gene data loaded."
+ to_chat(user, "That disk does not have any gene data loaded.")
return
user.drop_from_inventory(W)
W.loc = src
loaded_disk = W
- user << "You load [W] into [src]."
+ to_chat(user, "You load [W] into [src].")
return
..()
diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm
index 1b5318868b..0689f428b6 100644
--- a/code/modules/hydroponics/seed_packets.dm
+++ b/code/modules/hydroponics/seed_packets.dm
@@ -1,5 +1,7 @@
var/global/list/plant_seed_sprites = list()
+GLOBAL_LIST_BOILERPLATE(all_seed_packs, /obj/item/seeds)
+
//Seed packet object/procs.
/obj/item/seeds
name = "packet of seeds"
diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm
index ea7216dfd3..b2803e9d05 100644
--- a/code/modules/hydroponics/seed_storage.dm
+++ b/code/modules/hydroponics/seed_storage.dm
@@ -29,12 +29,65 @@
var/seeds_initialized = 0 // Map-placed ones break if seeds are loaded right at the start of the round, so we do it on the first interaction
var/list/datum/seed_pile/piles = list()
+ var/list/datum/seed_pile/piles_contra = list() //Hacked.
var/list/starting_seeds = list()
+ var/list/contraband_seeds = list() //Seeds we only show if we've been hacked.
var/list/scanner = list() // What properties we can view
+ var/seconds_electrified = 0 //Shock users like an airlock.
+ var/smart = 0 //Used for hacking. Overrides the scanner.
+ var/hacked = 0
+ var/lockdown = 0
+ var/datum/wires/seedstorage/wires = null
+
+/obj/machinery/seed_storage/New()
+ ..()
+ wires = new(src)
+ if(!contraband_seeds.len)
+ contraband_seeds = pick(list(
+ list(
+ /obj/item/seeds/ambrosiavulgarisseed = 3,
+ /obj/item/seeds/greengrapeseed = 3,
+ /obj/item/seeds/reishimycelium = 2,
+ /obj/item/seeds/bloodtomatoseed = 1
+ ),
+ list(
+ /obj/item/seeds/ambrosiavulgarisseed = 3,
+ /obj/item/seeds/plastiseed = 3,
+ /obj/item/seeds/kudzuseed = 2,
+ /obj/item/seeds/nettleseed = 1
+ ),
+ list(
+ /obj/item/seeds/ambrosiavulgarisseed = 3,
+ /obj/item/seeds/amanitamycelium = 3,
+ /obj/item/seeds/libertymycelium = 2,
+ /obj/item/seeds/glowshroom = 1
+ ),
+ list(
+ /obj/item/seeds/ambrosiavulgarisseed = 3,
+ /obj/item/seeds/glowberryseed = 3,
+ /obj/item/seeds/icepepperseed = 2,
+ /obj/item/seeds/bluetomatoseed = 1
+ ),
+ list(
+ /obj/item/seeds/ambrosiadeusseed = 1,
+ /obj/item/seeds/killertomatoseed = 1
+ ),
+ list(
+ /obj/item/seeds/ambrosiavulgarisseed = 3,
+ /obj/item/seeds/random = 6
+ )
+ ))
+ return
+
+/obj/machinery/seed_storage/process()
+ ..()
+ if(seconds_electrified > 0)
+ seconds_electrified--
+ return
/obj/machinery/seed_storage/random // This is mostly for testing, but I guess admins could spawn it
name = "Random seed storage"
- scanner = list("stats", "produce", "soil", "temperature", "light")
+ scanner = list("stats", "produce", "soil", "temperature", "light", "pressure")
starting_seeds = list(/obj/item/seeds/random = 50)
/obj/machinery/seed_storage/garden
@@ -81,7 +134,8 @@
/obj/machinery/seed_storage/xenobotany
name = "Xenobotany seed storage"
- scanner = list("stats", "produce", "soil", "temperature", "light")
+ scanner = list("stats", "produce", "soil", "temperature", "light", "pressure")
+ smart = 1
starting_seeds = list(
/obj/item/seeds/ambrosiavulgarisseed = 3,
/obj/item/seeds/appleseed = 3,
@@ -128,6 +182,17 @@
)
/obj/machinery/seed_storage/attack_hand(mob/user as mob)
+ if(stat & (BROKEN|NOPOWER))
+ return
+
+ if(seconds_electrified != 0)
+ if(shock(user, 100))
+ return
+
+ if(panel_open)
+ wires.Interact(user)
+ if(lockdown)
+ return
user.set_machine(src)
interact(user)
@@ -135,6 +200,11 @@
if (..())
return
+ if(smart)
+ scanner = list("stats", "produce", "soil", "temperature", "light", "pressure")
+ else
+ scanner = initial(scanner)
+
if (!seeds_initialized)
for(var/typepath in starting_seeds)
var/amount = starting_seeds[typepath]
@@ -143,6 +213,13 @@
for (var/i = 1 to amount)
var/O = new typepath
add(O)
+ for(var/typepath in contraband_seeds)
+ var/amount = contraband_seeds[typepath]
+ if(isnull(amount)) amount = 1
+
+ for (var/i = 1 to amount)
+ var/O = new typepath
+ add(O, 1)
seeds_initialized = 1
var/dat = "Seed storage contents"
@@ -248,6 +325,95 @@
dat += " | [S.amount] | "
dat += "Vend Purge | "
dat += " "
+ if(hacked || emagged)
+ for (var/datum/seed_pile/S in piles_contra)
+ var/datum/seed/seed = S.seed_type
+ if(!seed)
+ continue
+ dat += ""
+ dat += "| [seed.seed_name] | "
+ dat += "#[seed.uid] | "
+ if ("stats" in scanner)
+ dat += "[seed.get_trait(TRAIT_ENDURANCE)] | [seed.get_trait(TRAIT_YIELD)] | [seed.get_trait(TRAIT_MATURATION)] | [seed.get_trait(TRAIT_PRODUCTION)] | [seed.get_trait(TRAIT_POTENCY)] | "
+ if(seed.get_trait(TRAIT_HARVEST_REPEAT))
+ dat += "Multiple | "
+ else
+ dat += "Single | "
+ if ("temperature" in scanner)
+ dat += "[seed.get_trait(TRAIT_IDEAL_HEAT)] K | "
+ if ("light" in scanner)
+ dat += "[seed.get_trait(TRAIT_IDEAL_LIGHT)] L | "
+ if ("soil" in scanner)
+ if(seed.get_trait(TRAIT_REQUIRES_NUTRIENTS))
+ if(seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) < 0.05)
+ dat += "Low | "
+ else if(seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) > 0.2)
+ dat += "High | "
+ else
+ dat += "Norm | "
+ else
+ dat += "No | "
+ if(seed.get_trait(TRAIT_REQUIRES_WATER))
+ if(seed.get_trait(TRAIT_WATER_CONSUMPTION) < 1)
+ dat += "Low | "
+ else if(seed.get_trait(TRAIT_WATER_CONSUMPTION) > 5)
+ dat += "High | "
+ else
+ dat += "Norm | "
+ else
+ dat += "No | "
+
+ dat += ""
+ switch(seed.get_trait(TRAIT_CARNIVOROUS))
+ if(1)
+ dat += "CARN "
+ if(2)
+ dat += "CARN "
+ switch(seed.get_trait(TRAIT_SPREAD))
+ if(1)
+ dat += "VINE "
+ if(2)
+ dat += "VINE "
+ if ("pressure" in scanner)
+ if(seed.get_trait(TRAIT_LOWKPA_TOLERANCE) < 20)
+ dat += "LP "
+ if(seed.get_trait(TRAIT_HIGHKPA_TOLERANCE) > 220)
+ dat += "HP "
+ if ("temperature" in scanner)
+ if(seed.get_trait(TRAIT_HEAT_TOLERANCE) > 30)
+ dat += "TEMRES "
+ else if(seed.get_trait(TRAIT_HEAT_TOLERANCE) < 10)
+ dat += "TEMSEN "
+ if ("light" in scanner)
+ if(seed.get_trait(TRAIT_LIGHT_TOLERANCE) > 10)
+ dat += "LIGRES "
+ else if(seed.get_trait(TRAIT_LIGHT_TOLERANCE) < 3)
+ dat += "LIGSEN "
+ if(seed.get_trait(TRAIT_TOXINS_TOLERANCE) < 3)
+ dat += "TOXSEN "
+ else if(seed.get_trait(TRAIT_TOXINS_TOLERANCE) > 6)
+ dat += "TOXRES "
+ if(seed.get_trait(TRAIT_PEST_TOLERANCE) < 3)
+ dat += "PESTSEN "
+ else if(seed.get_trait(TRAIT_PEST_TOLERANCE) > 6)
+ dat += "PESTRES "
+ if(seed.get_trait(TRAIT_WEED_TOLERANCE) < 3)
+ dat += "WEEDSEN "
+ else if(seed.get_trait(TRAIT_WEED_TOLERANCE) > 6)
+ dat += "WEEDRES "
+ if(seed.get_trait(TRAIT_PARASITE))
+ dat += "PAR "
+ if ("temperature" in scanner)
+ if(seed.get_trait(TRAIT_ALTER_TEMP) > 0)
+ dat += "TEMP+ "
+ if(seed.get_trait(TRAIT_ALTER_TEMP) < 0)
+ dat += "TEMP- "
+ if(seed.get_trait(TRAIT_BIOLUM))
+ dat += "LUM "
+ dat += " | "
+ dat += "[S.amount] | "
+ dat += "Vend Purge | "
+ dat += " "
dat += " "
user << browse(dat, "window=seedstorage")
@@ -279,14 +445,35 @@
piles -= N
qdel(N)
break
+ if(hacked || emagged)
+ for (var/datum/seed_pile/N in piles_contra)
+ if (N.ID == ID)
+ if (task == "vend")
+ var/obj/O = pick(N.seeds)
+ if (O)
+ --N.amount
+ N.seeds -= O
+ if (N.amount <= 0 || N.seeds.len <= 0)
+ piles_contra -= N
+ qdel(N)
+ O.loc = src.loc
+ else
+ piles_contra -= N
+ qdel(N)
+ else if (task == "purge")
+ for (var/obj/O in N.seeds)
+ qdel(O)
+ piles_contra -= N
+ qdel(N)
+ break
updateUsrDialog()
/obj/machinery/seed_storage/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if (istype(O, /obj/item/seeds))
+ if (istype(O, /obj/item/seeds) && !lockdown)
add(O)
user.visible_message("[user] puts \the [O.name] into \the [src].", "You put \the [O] into \the [src].")
return
- else if (istype(O, /obj/item/weapon/storage/bag/plants))
+ else if (istype(O, /obj/item/weapon/storage/bag/plants) && !lockdown)
var/obj/item/weapon/storage/P = O
var/loaded = 0
for(var/obj/item/seeds/G in P.contents)
@@ -295,14 +482,40 @@
if (loaded)
user.visible_message("[user] puts the seeds from \the [O.name] into \the [src].", "You put the seeds from \the [O.name] into \the [src].")
else
- user << "There are no seeds in \the [O.name]."
+ to_chat(user, "There are no seeds in \the [O.name].")
return
- else if(istype(O, /obj/item/weapon/wrench))
+ else if(O.is_wrench())
playsound(loc, O.usesound, 50, 1)
anchored = !anchored
- user << "You [anchored ? "wrench" : "unwrench"] \the [src]."
+ to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
+ else if(O.is_screwdriver())
+ panel_open = !panel_open
+ to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
+ playsound(src, O.usesound, 50, 1)
+ overlays.Cut()
+ if(panel_open)
+ overlays += image(icon, "[initial(icon_state)]-panel")
+ else if((O.is_wirecutter() || istype(O, /obj/item/device/multitool)) && panel_open)
+ wires.Interact(user)
-/obj/machinery/seed_storage/proc/add(var/obj/item/seeds/O as obj)
+/obj/machinery/seed_storage/emag_act(var/remaining_charges, var/mob/user)
+ if(!src.emagged)
+ emagged = 1
+ if(lockdown)
+ to_chat(user, "\The [src]'s control panel thunks, as its cover retracts.")
+ lockdown = 0
+ if(req_access || req_one_access)
+ req_access = list()
+ req_one_access = list()
+ to_chat(user, "\The [src]'s access mechanism shorts out.")
+ var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
+ sparks.set_up(3, 0, get_turf(src))
+ sparks.start()
+ visible_message("\The [src]'s panel sparks!")
+ qdel(sparks)
+ return 1
+
+/obj/machinery/seed_storage/proc/add(var/obj/item/seeds/O as obj, var/contraband = 0)
if (istype(O.loc, /mob))
var/mob/user = O.loc
user.remove_from_mob(O)
@@ -313,6 +526,19 @@
O.loc = src
var/newID = 0
+ if(contraband)
+ var/datum/seed_pile/final_pile = piles[piles.len]
+ newID = final_pile.ID + 1
+ for (var/datum/seed_pile/N in piles_contra)
+ if (N.matches(O))
+ ++N.amount
+ N.seeds += (O)
+ return
+ else if(N.ID >= newID)
+ newID = N.ID + 1
+ piles_contra += new /datum/seed_pile(O, newID)
+ return
+
for (var/datum/seed_pile/N in piles)
if (N.matches(O))
++N.amount
@@ -322,4 +548,5 @@
newID = N.ID + 1
piles += new /datum/seed_pile(O, newID)
+
return
diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm
index c35d4b489a..b2e3e28287 100644
--- a/code/modules/hydroponics/spreading/spreading.dm
+++ b/code/modules/hydroponics/spreading/spreading.dm
@@ -240,7 +240,7 @@
user.setClickCooldown(user.get_attack_speed(W))
plant_controller.add_plant(src)
- if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/surgical/scalpel))
+ if(W.is_wirecutter() || istype(W, /obj/item/weapon/surgical/scalpel))
if(sampled)
user << "\The [src] has already been sampled recently."
return
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index 7dc02dedc7..8db9f7a8f1 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -453,7 +453,7 @@
if(O.is_open_container())
return 0
- if(istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/weapon/surgical/scalpel))
+ if(O.is_wirecutter() || istype(O, /obj/item/weapon/surgical/scalpel))
if(!seed)
user << "There is nothing to take a sample from in \the [src]."
@@ -548,7 +548,7 @@
qdel(O)
check_health()
- else if(mechanical && istype(O, /obj/item/weapon/wrench))
+ else if(mechanical && O.is_wrench())
//If there's a connector here, the portable_atmospherics setup can handle it.
if(locate(/obj/machinery/atmospherics/portables_connector/) in loc)
diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm
index 6c6a8ddbe3..c242f30bed 100644
--- a/code/modules/hydroponics/trays/tray_tools.dm
+++ b/code/modules/hydroponics/trays/tray_tools.dm
@@ -1,6 +1,6 @@
//Analyzer, pestkillers, weedkillers, nutrients, hatchets, cutters.
-/obj/item/weapon/wirecutters/clippers
+/obj/item/weapon/tool/wirecutters/clippers
name = "plant clippers"
desc = "A tool used to take samples from plants."
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 6404e2a579..90046fd269 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -264,13 +264,13 @@
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
interact(user)
return TRUE
- else if(istype(I, /obj/item/weapon/crowbar))
+ else if(I.is_crowbar())
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
opened = !opened
to_chat(user, "You [opened ? "opened" : "closed"] \the [src].")
update_icon()
return TRUE
- else if(istype(I, /obj/item/device/integrated_electronics/wirer) || istype(I, /obj/item/device/integrated_electronics/debugger) || istype(I, /obj/item/weapon/screwdriver))
+ else if(istype(I, /obj/item/device/integrated_electronics/wirer) || istype(I, /obj/item/device/integrated_electronics/debugger) || I.is_screwdriver())
if(opened)
interact(user)
else
diff --git a/code/modules/integrated_electronics/core/device.dm b/code/modules/integrated_electronics/core/device.dm
index 6b89a299a4..1b298c7a36 100644
--- a/code/modules/integrated_electronics/core/device.dm
+++ b/code/modules/integrated_electronics/core/device.dm
@@ -12,13 +12,16 @@
..()
/obj/item/device/assembly/electronic_assembly/attackby(obj/item/I as obj, mob/user as mob)
- if (iscrowbar(I) )
+ if (I.is_crowbar())
toggle_open(user)
else if (opened)
EA.attackby(I, user)
else
..()
+/obj/item/device/electronic_assembly/get_cell()
+ return battery
+
/obj/item/device/assembly/electronic_assembly/proc/toggle_open(mob/user)
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
opened = !opened
diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm
index 4dfd4e989a..794755b02c 100644
--- a/code/modules/integrated_electronics/core/printer.dm
+++ b/code/modules/integrated_electronics/core/printer.dm
@@ -162,13 +162,16 @@
return 1
var/cost = 1
+
+ if(isnull(current_category))
+ current_category = recipe_list[1]
if(ispath(build_type, /obj/item/device/electronic_assembly))
var/obj/item/device/electronic_assembly/E = build_type
cost = round( (initial(E.max_complexity) + initial(E.max_components) ) / 4)
- else if(ispath(build_type, /obj/item/integrated_circuit))
- var/obj/item/integrated_circuit/IC = build_type
- cost = initial(IC.w_class)
else
+ var/obj/item/I = build_type
+ cost = initial(I.w_class)
+ if(!(locate(build_type) in recipe_list[current_category]))
return
if(metal - cost < 0)
@@ -198,4 +201,4 @@
name = "integrated circuit printer upgrade disk - circuit cloner"
desc = "Install this into your integrated circuit printer to enhance it. This one allows the printer to duplicate assemblies."
icon_state = "upgrade_disk_clone"
- origin_tech = list(TECH_ENGINEERING = 5, TECH_DATA = 6)
\ No newline at end of file
+ origin_tech = list(TECH_ENGINEERING = 5, TECH_DATA = 6)
diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm
index 0f702be3de..c9d1c89e2b 100644
--- a/code/modules/integrated_electronics/core/tools.dm
+++ b/code/modules/integrated_electronics/core/tools.dm
@@ -261,10 +261,11 @@
/obj/item/weapon/storage/bag/circuits/mini,
/obj/item/device/electronic_assembly,
/obj/item/device/integrated_electronics,
- /obj/item/weapon/crowbar,
- /obj/item/weapon/screwdriver,
+ /obj/item/weapon/tool/crowbar,
+ /obj/item/weapon/tool/screwdriver,
/obj/item/device/multitool
)
+ cant_hold = list(/obj/item/weapon/tool/screwdriver/power)
/obj/item/weapon/storage/bag/circuits/basic/New()
..()
@@ -289,8 +290,8 @@
new /obj/item/device/assembly/electronic_assembly(src)
new /obj/item/device/assembly/electronic_assembly(src)
new /obj/item/device/multitool(src)
- new /obj/item/weapon/screwdriver(src)
- new /obj/item/weapon/crowbar(src)
+ new /obj/item/weapon/tool/screwdriver(src)
+ new /obj/item/weapon/tool/crowbar(src)
make_exact_fit()
/obj/item/weapon/storage/bag/circuits/all/New()
@@ -316,7 +317,7 @@
new /obj/item/device/electronic_assembly/drone(src)
new /obj/item/device/integrated_electronics/wirer(src)
new /obj/item/device/integrated_electronics/debugger(src)
- new /obj/item/weapon/crowbar(src)
+ new /obj/item/weapon/tool/crowbar(src)
make_exact_fit()
/obj/item/weapon/storage/bag/circuits/mini/
diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm
index 3ef22e0a5c..ac9a0e13f9 100644
--- a/code/modules/integrated_electronics/subtypes/input.dm
+++ b/code/modules/integrated_electronics/subtypes/input.dm
@@ -20,7 +20,7 @@
/obj/item/integrated_circuit/input/button/ask_for_input(mob/user) //Bit misleading name for this specific use.
- to_chat(user, "You press the button labeled '[src.name]'.")
+ to_chat(user, "You press the button labeled '[src.displayed_name]'.")
activate_pin(1)
/obj/item/integrated_circuit/input/toggle_button
@@ -38,7 +38,7 @@
set_pin_data(IC_OUTPUT, 1, !get_pin_data(IC_OUTPUT, 1))
push_data()
activate_pin(1)
- to_chat(user, "You toggle the button labeled '[src.name]' [get_pin_data(IC_OUTPUT, 1) ? "on" : "off"].")
+ to_chat(user, "You toggle the button labeled '[src.displayed_name]' [get_pin_data(IC_OUTPUT, 1) ? "on" : "off"].")
/obj/item/integrated_circuit/input/numberpad
name = "number pad"
diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm
index 3e53a069f3..344a7dc47e 100644
--- a/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -32,13 +32,13 @@
if(istype(O, /obj/item/weapon/gun))
var/obj/item/weapon/gun/gun = O
if(installed_gun)
- user << "There's already a weapon installed."
+ to_chat(user, "There's already a weapon installed.")
return
user.drop_from_inventory(gun)
installed_gun = gun
size += gun.w_class
gun.forceMove(src)
- user << "You slide \the [gun] into the firing mechanism."
+ to_chat(user, "You slide \the [gun] into the firing mechanism.")
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
else
..()
@@ -46,12 +46,12 @@
/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(var/mob/user)
if(installed_gun)
installed_gun.forceMove(get_turf(src))
- user << "You slide \the [installed_gun] out of the firing mechanism."
+ to_chat(user, "You slide \the [installed_gun] out of the firing mechanism.")
size = initial(size)
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
installed_gun = null
else
- user << "There's no weapon to remove from the mechanism."
+ to_chat(user, "There's no weapon to remove from the mechanism.")
/obj/item/integrated_circuit/manipulation/weapon_firing/do_work()
if(!installed_gun)
diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm
index 94c4594f5b..24dd18c80b 100644
--- a/code/modules/integrated_electronics/subtypes/memory.dm
+++ b/code/modules/integrated_electronics/subtypes/memory.dm
@@ -75,7 +75,6 @@
/obj/item/integrated_circuit/memory/constant
name = "constant chip"
desc = "This tiny chip can store one piece of data, which cannot be overwritten without disassembly."
- icon_state = "memory"
complexity = 1
inputs = list()
outputs = list("output pin" = IC_PINTYPE_ANY)
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 10c1fb2a8e..63f855b8a4 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -37,15 +37,15 @@
return
else
name = ("bookcase ([newname])")
- else if(istype(O,/obj/item/weapon/wrench))
+ else if(O.is_wrench())
playsound(loc, O.usesound, 100, 1)
- user << (anchored ? "You unfasten \the [src] from the floor." : "You secure \the [src] to the floor.")
+ to_chat(user, (anchored ? "You unfasten \the [src] from the floor." : "You secure \the [src] to the floor."))
anchored = !anchored
- else if(istype(O,/obj/item/weapon/screwdriver))
+ else if(O.is_screwdriver())
playsound(loc, O.usesound, 75, 1)
- user << "You begin dismantling \the [src]."
+ to_chat(user, "You begin dismantling \the [src].")
if(do_after(user,25 * O.toolspeed))
- user << "You dismantle \the [src]."
+ to_chat(user, "You dismantle \the [src].")
new /obj/item/stack/material/wood(get_turf(src), 3)
for(var/obj/item/weapon/book/b in contents)
b.loc = (get_turf(src))
@@ -154,19 +154,19 @@
/obj/item/weapon/book/attack_self(var/mob/user as mob)
if(carved)
if(store)
- user << "[store] falls out of [title]!"
+ to_chat(user, "[store] falls out of [title]!")
store.loc = get_turf(src.loc)
store = null
return
else
- user << "The pages of [title] have been cut out!"
+ to_chat(user, "The pages of [title] have been cut out!")
return
if(src.dat)
user << browse("Penned by [author]. " + "[dat]", "window=book")
user.visible_message("[user] opens a book titled \"[src.title]\" and begins reading intently.")
onclose(user, "book")
else
- user << "This book is completely blank!"
+ to_chat(user, "This book is completely blank!")
/obj/item/weapon/book/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(carved)
@@ -175,24 +175,24 @@
user.drop_item()
W.loc = src
store = W
- user << "You put [W] in [title]."
+ to_chat(user, "You put [W] in [title].")
return
else
- user << "[W] won't fit in [title]."
+ to_chat(user, "[W] won't fit in [title].")
return
else
- user << "There's already something in [title]!"
+ to_chat(user, "There's already something in [title]!")
return
if(istype(W, /obj/item/weapon/pen))
if(unique)
- user << "These pages don't seem to take the ink well. Looks like you can't modify it."
+ to_chat(user, "These pages don't seem to take the ink well. Looks like you can't modify it.")
return
var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel")
switch(choice)
if("Title")
var/newtitle = reject_bad_text(sanitizeSafe(input("Write a new title:")))
if(!newtitle)
- usr << "The title is invalid."
+ to_chat(usr, "The title is invalid.")
return
else
src.name = newtitle
@@ -200,14 +200,14 @@
if("Contents")
var/content = sanitize(input("Write your book's contents (HTML NOT allowed):") as message|null, MAX_BOOK_MESSAGE_LEN)
if(!content)
- usr << "The content is invalid."
+ to_chat(usr, "The content is invalid.")
return
else
src.dat += content
if("Author")
var/newauthor = sanitize(input(usr, "Write the author's name:"))
if(!newauthor)
- usr << "The name is invalid."
+ to_chat(usr, "The name is invalid.")
return
else
src.author = newauthor
@@ -216,37 +216,37 @@
else if(istype(W, /obj/item/weapon/barcodescanner))
var/obj/item/weapon/barcodescanner/scanner = W
if(!scanner.computer)
- user << "[W]'s screen flashes: 'No associated computer found!'"
+ to_chat(user, "[W]'s screen flashes: 'No associated computer found!'")
else
switch(scanner.mode)
if(0)
scanner.book = src
- user << "[W]'s screen flashes: 'Book stored in buffer.'"
+ to_chat(user, "[W]'s screen flashes: 'Book stored in buffer.'")
if(1)
scanner.book = src
scanner.computer.buffer_book = src.name
- user << "[W]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'"
+ to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'")
if(2)
scanner.book = src
for(var/datum/borrowbook/b in scanner.computer.checkouts)
if(b.bookname == src.name)
scanner.computer.checkouts.Remove(b)
- user << "[W]'s screen flashes: 'Book stored in buffer. Book has been checked in.'"
+ to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Book has been checked in.'")
return
- user << "[W]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'"
+ to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'")
if(3)
scanner.book = src
for(var/obj/item/weapon/book in scanner.computer.inventory)
if(book == src)
- user << "[W]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'"
+ to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'")
return
scanner.computer.inventory.Add(src)
- user << "[W]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'"
- else if(istype(W, /obj/item/weapon/material/knife) || istype(W, /obj/item/weapon/wirecutters))
+ to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'")
+ else if(istype(W, /obj/item/weapon/material/knife) || W.is_wirecutter())
if(carved) return
- user << "You begin to carve out [title]."
+ to_chat(user, "You begin to carve out [title].")
if(do_after(user, 30))
- user << "You carve out the pages from [title]! You didn't want to read it anyway."
+ to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.")
carved = 1
return
else
@@ -278,7 +278,7 @@
mode += 1
if(mode > 3)
mode = 0
- user << "[src] Status Display:"
+ to_chat(user, "[src] Status Display:")
var/modedesc
switch(mode)
if(0)
@@ -291,9 +291,9 @@
modedesc = "Scan book to local buffer, attempt to add book to general inventory."
else
modedesc = "ERROR"
- user << " - Mode [mode] : [modedesc]"
+ to_chat(user, " - Mode [mode] : [modedesc]")
if(src.computer)
- user << "Computer has been associated with this unit."
+ to_chat(user, "Computer has been associated with this unit.")
else
- user << "No associated computer found. Only local scans will function properly."
- user << "\n"
\ No newline at end of file
+ to_chat(user, "No associated computer found. Only local scans will function properly.")
+ to_chat(user, "\n")
\ No newline at end of file
diff --git a/code/modules/lighting/lighting_setup.dm b/code/modules/lighting/lighting_setup.dm
index b3e3cf7aa2..02621fdac1 100644
--- a/code/modules/lighting/lighting_setup.dm
+++ b/code/modules/lighting/lighting_setup.dm
@@ -1,6 +1,6 @@
// Create lighting overlays on all turfs with dynamic lighting in areas with dynamic lighting.
/proc/create_all_lighting_overlays()
- for(var/area/A in world)
+ for(var/area/A in all_areas)
if(!A.dynamic_lighting)
continue
for(var/turf/T in A)
diff --git a/code/modules/lore_codex/news_data/main.dm b/code/modules/lore_codex/news_data/main.dm
index cf3660a620..34fdea4afc 100644
--- a/code/modules/lore_codex/news_data/main.dm
+++ b/code/modules/lore_codex/news_data/main.dm
@@ -4,6 +4,10 @@
region. Each is labled by date of publication and title. This list is self-updating, and from time to time the publisher will push new \
articles. You are encouraged to check back frequently."
children = list(
+ /datum/lore/codex/page/article13,
+ /datum/lore/codex/page/article12,
+ /datum/lore/codex/page/article11,
+ /datum/lore/codex/page/article10,
/datum/lore/codex/page/article9,
/datum/lore/codex/page/article8,
/datum/lore/codex/page/article7,
@@ -99,7 +103,7 @@
/datum/lore/codex/page/article8
name = "4/1/62 - Almach Cordon Breached by Unknown Organization"
- data = "Early this morning, SolGov ships assigned to the Almach Cordon around the Rim territories reported that a number of bulk freighters had eluded apprehension and are now at large within the Golden Crescent. Lieutenant-Major Volkov of the SCG-D Henri Capet reports that the blockade-runners were highly organized and determined, citing several lightly-manned ships left behind to tie up the SolGov forces long enough for the freighters to escape, detonating their reactors when they lost the ability to continue fighting. This resulted in three Fleet casualties and a significant degree of damage to the Henri Capet. The contents and location of the freighters are unknown at this time. In response, eight light-response vessels are being assigned to the Saint Columbia Fleet Base from Jahan's Post and Zhu Que. Residents and traffic officials in Vir, Oasis, and Gavel are to remain alert and notify police if any suspicious or unregistered craft enter their space.\
+ data = "Early this morning, SolGov ships assigned to the Almach Cordon around the Rim territories reported that a number of bulk freighters had eluded apprehension and are now at large within the Golden Crescent. Centurio Volkov of the SCG-D Henri Capet reports that the blockade-runners were highly organized and determined, citing several lightly-manned ships left behind to tie up the SolGov forces long enough for the freighters to escape, detonating their reactors when they lost the ability to continue fighting. This resulted in three Fleet casualties and a significant degree of damage to the Henri Capet. The contents and location of the freighters are unknown at this time. In response, eight light-response vessels are being assigned to the Saint Columbia Fleet Base from Jahan's Post and Zhu Que. Residents and traffic officials in Vir, Oasis, and Gavel are to remain alert and notify police if any suspicious or unregistered craft enter their space.\
\
A spokesperson for the Association claims that, while they make no attempts to stop aspiring blockade runners, the organization responsible for this most recent attack is unaffiliated with the Association as a whole and deny any knowledge of their identity or motives."
@@ -109,3 +113,24 @@
\
The intervention of a local Defense Force drone wing on behalf of the terrorists leads many in the intelligence community to assume that more Boiling Point operatives remain active within Gavel, and possibly nearby systems such as Vir and Oasis. Some have also noted that elements of the terrorists' tactics and augmentations suggest Association training, though the specifics remain classified. More information as the story breaks."
+/datum/lore/codex/page/article10
+ name = "4/13/62 - Association Proposes Joint Operation"
+ data = "Condemning the actions of Boiling Point on Gavel this week, representatives from the Almach Association and SolGov met to discuss joint fleet action. At the end of nearly a week of closed-doors negotiations, the Association has agreed to send in a significant contingent of Association Militia vessels as a show of good-will. These vessels will be active in the Golden Crescent, searching for Boiling Point facilities believed to be located in the outskirts of major systems. The influx of manpower allows the Fleet to continue patrolling the Heights and the Bowl, in hopes of containing the spread of the organization. This operation also marks the opening of the Almach Cordon, although travelers are advised that migration between the regions will remain extremely limited.\
+
\
+ While undoubtedly a sign of increased trust between the Confederacy and the Rim, some have voiced concerns with the action's adding legitimacy to the Association government. Quote Rewi Kerahoma, SEO Chairperson of the Board: \"The meeting with the Association regime was inappropriate, but actively allying with them is something else entirely. If the generals think we don't have the fleet to hunt down a bunch of rabble-rousers without weakening ourselves to piracy and foreign invasion, then it is a sign that we need to grow our shipyards in the Bowl, and give jobs to the hardworking Solars that live there-- not that we need to collaborate with terrorists.\"\
+
\
+ Transgressive Technologies and Interior Police Executive Sifat Unar issued a memo indicating that, while the assistance of the Association's more conservative elements in this matter is appreciated, the Five Points of Human Sanctity remain intact and SolGov categorically refuses aid from \"transhumans, posthumans, uplifts, and Fortunates.\""
+
+/datum/lore/codex/page/article11
+ name = "4/29/62 - New Data from Shelf Suggests Continued Migration"
+ data = "Despite their recent inclusion in the Almach Association, astronomers have confirmed that Shelf is continuing to migrate along the Almach Stream to a new star. Sources within the Association claim that Shelf's participation in the organization has been \"lukewarm at best\", and that their continued migration is to be expected. Morpheus executives have refrained from issuing a statement on the matter, but given their statements upon entering the Association are believed to view themselves as personally culpable for the Gray Hour. Analysts suggest that Shelf may be unwilling to enter a shooting war with SolGov if the situation in the Rim destabilizes."
+
+/datum/lore/codex/page/article12
+ name = "5/07/62 - Allen Family Matriarch Expelled from Neon Light"
+ data = "The Allen family of the Neon Light, the largest single habitat-ship in Solar space, has been ousted in a nearly bloodless coup today. The Allens, staunch supporters of the Association and advocates for the criminal ark's inclusion in the organization, had attempted to seize control of the ship's agricultural region during the Almach Cordon. They effectively held the ship for a matter of weeks, but were defeated by loyalists to the reigning Crow family. Stripped of their position as rulers of the Third Stacks, their matriarch was summarily executed by spacing in what the current regime is referring to as an \"expedited exile\". This is believed to mark the end of the question of Neon Light's membership in the Association, and the nominal SolGov protectorate is expected to remain neutral for the foreseeable future."
+
+/datum/lore/codex/page/article13
+ name = "5/15/62 - Anti-Fleet Riots on Saint Columbia"
+ data = "As military vessels from the Almach Association continue to enter the Golden Crescent as part of a SolGov initiative to combat the Boiling Point terrorists believed to be hiding in the region, political unrest in the upstream portions of the region continue to grow. Many in the Republic of Saint Columbia, a small upstream nation, have responded to increasing militarization of their local Fleet base by taking to the streets, blocking pedestrian traffic in the capital of Barrueco and shutting down entire industries by destroying or disabling infrastructure. Quote rioter Luisa Tassis, \"we've been sick of the Fleeties squatting in our system and breathing down our neck, and now there's going to be even more of them? No, screw that. If there's going to be a war between the Rim and the Core, I know what side I'd rather be on.\"\
+
\
+ Association leaders have refrained from officially supporting the rioters, though many suspect that Association propagandists have sparked the unrest. Solar officials, on the other hand, were quick to offer assurances that the unrest will be calmed long before it begins to affect the Fleet base in system."
diff --git a/code/modules/maps/tg/reader.dm b/code/modules/maps/tg/reader.dm
index 1ba29fa183..027d1c4cae 100644
--- a/code/modules/maps/tg/reader.dm
+++ b/code/modules/maps/tg/reader.dm
@@ -285,7 +285,7 @@ var/global/use_preloader = FALSE
var/atom/instance
_preloader.setup(members_attributes[index])//preloader for assigning set variables on atom creation
var/atype = members[index]
- for(var/area/A in world)
+ for(var/area/A in all_areas)
if(A.type == atype)
instance = A
break
diff --git a/code/modules/materials/fifty_spawner_mats.dm b/code/modules/materials/fifty_spawner_mats.dm
index ffd5e59f40..1b39b38d93 100644
--- a/code/modules/materials/fifty_spawner_mats.dm
+++ b/code/modules/materials/fifty_spawner_mats.dm
@@ -56,14 +56,26 @@
name = "stack of steel"
type_to_spawn = /obj/item/stack/material/steel
+/obj/fiftyspawner/steel/hull
+ name = "stack of steel hull"
+ type_to_spawn = /obj/item/stack/material/steel/hull
+
/obj/fiftyspawner/plasteel
name = "stack of plasteel"
type_to_spawn = /obj/item/stack/material/plasteel
+/obj/fiftyspawner/plasteel/hull
+ name = "stack of plasteel hull"
+ type_to_spawn = /obj/item/stack/material/plasteel/hull
+
/obj/fiftyspawner/durasteel
name = "stack of durasteel"
type_to_spawn = /obj/item/stack/material/durasteel
+/obj/fiftyspawner/durasteel/hull
+ name = "stack of durasteel hull"
+ type_to_spawn = /obj/item/stack/material/durasteel/hull
+
/obj/fiftyspawner/wood
name = "stack of wood"
type_to_spawn = /obj/item/stack/material/wood
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 6e75d97a0d..232ef46e3e 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -53,6 +53,7 @@
recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0)
recipes += new/datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20)
+ recipes += new/datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20)
recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60)
recipes += new/datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1)
diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm
index 54d56fd773..3caf8df28b 100644
--- a/code/modules/materials/material_sheets.dm
+++ b/code/modules/materials/material_sheets.dm
@@ -192,12 +192,20 @@
default_type = DEFAULT_WALL_MATERIAL
no_variants = FALSE
+/obj/item/stack/material/steel/hull
+ name = MAT_STEELHULL
+ default_type = MAT_STEELHULL
+
/obj/item/stack/material/plasteel
name = "plasteel"
icon_state = "sheet-plasteel"
default_type = "plasteel"
no_variants = FALSE
+/obj/item/stack/material/plasteel/hull
+ name = MAT_PLASTEELHULL
+ default_type = MAT_PLASTEELHULL
+
/obj/item/stack/material/durasteel
name = "durasteel"
icon_state = "sheet-durasteel"
@@ -205,6 +213,9 @@
default_type = "durasteel"
no_variants = FALSE
+/obj/item/stack/material/durasteel/hull
+ name = "MAT_DURASTEELHULL"
+
/obj/item/stack/material/wood
name = "wooden plank"
icon_state = "sheet-wood"
diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm
index d0e53184e3..5a71af1bab 100644
--- a/code/modules/materials/materials.dm
+++ b/code/modules/materials/materials.dm
@@ -16,7 +16,17 @@
stone
metal
solid
- cult
+ ONLY WALLS
+ cult
+ hull
+ curvy
+ jaggy
+ brick
+ REINFORCEMENT
+ reinf_over
+ reinf_mesh
+ reinf_cult
+ reinf_metal
DOORS
stone
metal
@@ -358,6 +368,18 @@ var/list/name_to_material
icon_reinf = "reinf_over"
icon_colour = "#666666"
+/material/steel/hull
+ name = MAT_STEELHULL
+ stack_type = /obj/item/stack/material/steel/hull
+ integrity = 250
+ explosion_resistance = 10
+ icon_base = "hull"
+ icon_reinf = "reinf_mesh"
+ icon_colour = "#666677"
+
+/material/steel/hull/place_sheet(var/turf/target) //Deconstructed into normal steel sheets.
+ new /obj/item/stack/material/steel(target)
+
/material/diona
name = "biomass"
icon_colour = null
@@ -394,6 +416,17 @@ var/list/name_to_material
stack_origin_tech = list(TECH_MATERIAL = 2)
composite_material = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT, "platinum" = SHEET_MATERIAL_AMOUNT) //todo
+/material/plasteel/hull
+ name = MAT_PLASTEELHULL
+ stack_type = /obj/item/stack/material/plasteel/hull
+ integrity = 600
+ icon_base = "hull"
+ icon_reinf = "reinf_mesh"
+ icon_colour = "#777788"
+ explosion_resistance = 40
+
+/material/plasteel/hull/place_sheet(var/turf/target) //Deconstructed into normal plasteel sheets.
+ new /obj/item/stack/material/plasteel(target)
// Very rare alloy that is reflective, should be used sparingly.
/material/durasteel
@@ -412,6 +445,14 @@ var/list/name_to_material
stack_origin_tech = list(TECH_MATERIAL = 8)
composite_material = list("plasteel" = SHEET_MATERIAL_AMOUNT, "diamond" = SHEET_MATERIAL_AMOUNT) //shrug
+/material/durasteel/hull //The 'Hardball' of starship hulls.
+ name = MAT_DURASTEELHULL
+ icon_base = "hull"
+ icon_reinf = "reinf_mesh"
+ icon_colour = "#45829a"
+ explosion_resistance = 90
+ reflectivity = 0.9
+
/material/plasteel/titanium
name = "titanium"
stack_type = null
@@ -421,6 +462,12 @@ var/list/name_to_material
icon_colour = "#D1E6E3"
icon_reinf = "reinf_metal"
+/material/plasteel/titanium/hull
+ name = MAT_TITANIUMHULL
+ stack_type = null
+ icon_base = "hull"
+ icon_reinf = "reinf_mesh"
+
/material/glass
name = "glass"
stack_type = /obj/item/stack/material/glass
diff --git a/code/modules/mining/coins.dm b/code/modules/mining/coins.dm
index 2536f0ac2d..baf8094967 100644
--- a/code/modules/mining/coins.dm
+++ b/code/modules/mining/coins.dm
@@ -57,7 +57,7 @@
else
user << "This cable coil appears to be empty."
return
- else if(istype(W,/obj/item/weapon/wirecutters))
+ else if(W.is_wirecutter())
if(!string_attached)
..()
return
diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm
index 99fe3f85ee..7cf8bc575e 100644
--- a/code/modules/mining/drilling/drill.dm
+++ b/code/modules/mining/drilling/drill.dm
@@ -158,13 +158,13 @@
if(istype(O, /obj/item/weapon/cell))
if(cell)
- user << "The drill already has a cell installed."
+ to_chat(user, "The drill already has a cell installed.")
else
user.drop_item()
O.loc = src
cell = O
component_parts += O
- user << "You install \the [O]."
+ to_chat(user, "You install \the [O].")
return
..()
@@ -172,13 +172,13 @@
check_supports()
if (panel_open && cell && user.Adjacent(src))
- user << "You take out \the [cell]."
+ to_chat(user, "You take out \the [cell].")
cell.loc = get_turf(user)
component_parts -= cell
cell = null
return
else if(need_player_check)
- user << "You hit the manual override and reset the drill's error checking."
+ to_chat(user, "You hit the manual override and reset the drill's error checking.")
need_player_check = 0
if(anchored)
get_resource_field()
@@ -193,9 +193,9 @@
else
visible_message("\The [src] shudders to a grinding halt.")
else
- user << "The drill is unpowered."
+ to_chat(user, "The drill is unpowered.")
else
- user << "Turning on a piece of industrial machinery without sufficient bracing or wires exposed is a bad idea."
+ to_chat(user, "Turning on a piece of industrial machinery without sufficient bracing or wires exposed is a bad idea.")
update_icon()
@@ -289,9 +289,9 @@
if(B)
for(var/obj/item/weapon/ore/O in contents)
O.loc = B
- usr << "You unload the drill's storage cache into the ore box."
+ to_chat(usr, "You unload the drill's storage cache into the ore box.")
else
- usr << "You must move an ore box up to the drill before you can unload it."
+ to_chat(usr, "You must move an ore box up to the drill before you can unload it.")
/obj/machinery/mining/brace
@@ -308,7 +308,7 @@
/obj/machinery/mining/brace/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(connected && connected.active)
- user << "You can't work with the brace of a running drill!"
+ to_chat(user, "You can't work with the brace of a running drill!")
return
if(default_deconstruction_screwdriver(user, W))
@@ -316,14 +316,14 @@
if(default_deconstruction_crowbar(user, W))
return
- if(istype(W,/obj/item/weapon/wrench))
+ if(W.is_wrench())
if(istype(get_turf(src), /turf/space))
- user << "You can't anchor something to empty space. Idiot."
+ to_chat(user, "You can't anchor something to empty space. Idiot.")
return
playsound(src, W.usesound, 100, 1)
- user << "You [anchored ? "un" : ""]anchor the brace."
+ to_chat(user, "You [anchored ? "un" : ""]anchor the brace.")
anchored = !anchored
if(anchored)
@@ -371,7 +371,7 @@
if(usr.stat) return
if (src.anchored)
- usr << "It is anchored in place!"
+ to_chat(usr, "It is anchored in place!")
return 0
src.set_dir(turn(src.dir, 90))
diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm
new file mode 100644
index 0000000000..dd9c068a17
--- /dev/null
+++ b/code/modules/mining/fulton.dm
@@ -0,0 +1,191 @@
+var/global/list/total_extraction_beacons = list()
+
+/obj/item/extraction_pack
+ name = "fulton extraction pack"
+ desc = "A balloon that can be used to extract equipment or personnel to a Fulton Recovery Beacon. Anything not bolted down can be moved. Link the pack to a beacon by using the pack in hand."
+ icon = 'icons/obj/fulton.dmi'
+ icon_state = "extraction_pack"
+ w_class = ITEMSIZE_NORMAL
+ var/obj/structure/extraction_point/beacon
+ var/list/beacon_networks = list("station")
+ var/uses_left = 3
+ var/can_use_indoors
+ var/safe_for_living_creatures = 1
+
+/obj/item/extraction_pack/examine()
+ . = ..()
+ usr.show_message("It has [uses_left] use\s remaining.", 1)
+
+/obj/item/extraction_pack/attack_self(mob/user)
+ var/list/possible_beacons = list()
+ for(var/B in global.total_extraction_beacons)
+ var/obj/structure/extraction_point/EP = B
+ if(EP.beacon_network in beacon_networks)
+ possible_beacons += EP
+
+ if(!possible_beacons.len)
+ to_chat(user, "There are no extraction beacons in existence!")
+ return
+
+ else
+ var/A
+
+ A = input("Select a beacon to connect to", "Balloon Extraction Pack", A) as null|anything in possible_beacons
+
+ if(!A)
+ return
+ beacon = A
+ to_chat(user, "You link the extraction pack to the beacon system.")
+
+/obj/item/extraction_pack/afterattack(atom/movable/A, mob/living/carbon/human/user, flag, params)
+ if(!beacon)
+ to_chat(user, "[src] is not linked to a beacon, and cannot be used.")
+ return
+ if(!can_use_indoors)
+ var/turf/T = get_turf(A)
+ if(T && !T.outdoors)
+ to_chat(user, "[src] can only be used on things that are outdoors!")
+ return
+ if(!flag)
+ return
+ if(!istype(A))
+ return
+ else
+ if(!safe_for_living_creatures && check_for_living_mobs(A))
+ to_chat(user, "[src] is not safe for use with living creatures, they wouldn't survive the trip back!")
+ return
+ if(!isturf(A.loc)) // no extracting stuff inside other stuff
+ return
+ if(A.anchored)
+ return
+ to_chat(user, "You start attaching the pack to [A]...")
+ if(do_after(user,50,target=A))
+ to_chat(user, "You attach the pack to [A] and activate it.")
+ /* No components, sorry. No convienence for you!
+ if(loc == user && istype(user.back, /obj/item/storage/backpack))
+ var/obj/item/storage/backpack/B = user.back
+ B.SendSignal(COMSIG_TRY_STORAGE_INSERT, src, user, FALSE, FALSE)
+ */
+ uses_left--
+ if(uses_left <= 0)
+ user.drop_from_inventory(src, A)
+ var/mutable_appearance/balloon
+ var/mutable_appearance/balloon2
+ var/mutable_appearance/balloon3
+ if(isliving(A))
+ var/mob/living/M = A
+ M.AdjustStunned(20) // Keep them from moving during the duration of the extraction
+ if(M.buckled)
+ M.buckled.unbuckle_mob(M)
+ else
+ A.anchored = TRUE
+ A.density = FALSE
+ var/obj/effect/extraction_holder/holder_obj = new(A.loc)
+ holder_obj.appearance = A.appearance
+ A.forceMove(holder_obj)
+ balloon2 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_expand")
+ balloon2.pixel_y = 10
+ balloon2.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
+ holder_obj.add_overlay(balloon2)
+ sleep(4)
+ balloon = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_balloon")
+ balloon.pixel_y = 10
+ balloon.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
+ holder_obj.cut_overlay(balloon2)
+ holder_obj.add_overlay(balloon)
+ playsound(holder_obj.loc, 'sound/items/fulext_deploy.wav', 50, 1, -3)
+ animate(holder_obj, pixel_z = 10, time = 20)
+ sleep(20)
+ animate(holder_obj, pixel_z = 15, time = 10)
+ sleep(10)
+ animate(holder_obj, pixel_z = 10, time = 10)
+ sleep(10)
+ animate(holder_obj, pixel_z = 15, time = 10)
+ sleep(10)
+ animate(holder_obj, pixel_z = 10, time = 10)
+ sleep(10)
+ playsound(holder_obj.loc, 'sound/items/fultext_launch.wav', 50, 1, -3)
+ animate(holder_obj, pixel_z = 1000, time = 30)
+ if(ishuman(A))
+ var/mob/living/carbon/human/L = A
+ L.AdjustStunned(20)
+ L.drowsyness = 0
+ sleep(30)
+ var/list/flooring_near_beacon = list()
+ for(var/turf/simulated/floor/floor in orange(1, beacon))
+ flooring_near_beacon += floor
+ holder_obj.forceMove(pick(flooring_near_beacon))
+ animate(holder_obj, pixel_z = 10, time = 50)
+ sleep(50)
+ animate(holder_obj, pixel_z = 15, time = 10)
+ sleep(10)
+ animate(holder_obj, pixel_z = 10, time = 10)
+ sleep(10)
+ balloon3 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_retract")
+ balloon3.pixel_y = 10
+ balloon3.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
+ holder_obj.cut_overlay(balloon)
+ holder_obj.add_overlay(balloon3)
+ sleep(4)
+ holder_obj.cut_overlay(balloon3)
+ A.anchored = FALSE // An item has to be unanchored to be extracted in the first place.
+ A.density = initial(A.density)
+ animate(holder_obj, pixel_z = 0, time = 5)
+ sleep(5)
+ A.forceMove(holder_obj.loc)
+ qdel(holder_obj)
+ if(uses_left <= 0)
+ qdel(src)
+
+
+/obj/item/fulton_core
+ name = "extraction beacon signaller"
+ desc = "Emits a signal which fulton recovery devices can lock onto. Activate in hand to create a beacon."
+ icon = 'icons/obj/stock_parts.dmi'
+ icon_state = "subspace_amplifier"
+
+/obj/item/fulton_core/attack_self(mob/user)
+ if(do_after(user,15,target = user) && !QDELETED(src))
+ new /obj/structure/extraction_point(get_turf(user))
+ qdel(src)
+
+/obj/structure/extraction_point
+ name = "fulton recovery beacon"
+ desc = "A beacon for the fulton recovery system. Activate a pack in your hand to link it to a beacon."
+ icon = 'icons/obj/fulton.dmi'
+ icon_state = "extraction_point"
+ anchored = TRUE
+ density = FALSE
+ var/beacon_network = "station"
+
+/obj/structure/extraction_point/initialize()
+ . = ..()
+ name += " ([rand(100,999)]) ([get_area_name(src, TRUE)])"
+ global.total_extraction_beacons += src
+
+/obj/structure/extraction_point/Destroy()
+ global.total_extraction_beacons -= src
+ ..()
+
+/obj/effect/extraction_holder
+ name = "extraction holder"
+ desc = "you shouldnt see this"
+ var/atom/movable/stored_obj
+
+/obj/item/extraction_pack/proc/check_for_living_mobs(atom/A)
+ if(isliving(A))
+ var/mob/living/L = A
+ if(L.stat != DEAD)
+ return 1
+ for(var/thing in A.GetAllContents())
+ if(isliving(A))
+ var/mob/living/L = A
+ if(L.stat != DEAD)
+ return 1
+ return 0
+
+/obj/effect/extraction_holder/singularity_pull()
+ return
+
+/obj/effect/extraction_holder/singularity_pull()
+ return
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 7672e91cec..03568205c8 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -1,38 +1,39 @@
/**********************Mineral processing unit console**************************/
+#define PROCESS_NONE 0
+#define PROCESS_SMELT 1
+#define PROCESS_COMPRESS 2
+#define PROCESS_ALLOY 3
/obj/machinery/mineral/processing_unit_console
name = "production machine console"
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "console"
- density = 1
- anchored = 1
+ density = TRUE
+ anchored = TRUE
var/obj/machinery/mineral/processing_unit/machine = null
- //var/machinedir = EAST //Dumb
- var/show_all_ores = 0
+ var/show_all_ores = FALSE
-/obj/machinery/mineral/processing_unit_console/New()
- ..()
- spawn(7)
- //src.machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir))
- src.machine = locate(/obj/machinery/mineral/processing_unit) in range(5,src)
- if (machine)
- machine.console = src
- else
- world << "Warning: Ore processing machine console at [src.x], [src.y], [src.z] could not find its machine!"
- qdel(src)
+/obj/machinery/mineral/processing_unit_console/initialize()
+ . = ..()
+ src.machine = locate(/obj/machinery/mineral/processing_unit) in range(5, src)
+ if (machine)
+ machine.console = src
+ else
+ log_debug("Ore processing machine console at [src.x], [src.y], [src.z] could not find its machine!")
+ qdel(src)
/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user)
- add_fingerprint(user)
+ if(..())
+ return
interact(user)
/obj/machinery/mineral/processing_unit_console/interact(mob/user)
-
if(..())
return
if(!allowed(user))
- user << "Access denied."
+ to_chat(user, "Access denied.")
return
user.set_machine(src)
@@ -49,13 +50,13 @@
dat += " | [capitalize(O.display_name)] | [machine.ores_stored[ore]] | "
if(machine.ores_processing[ore])
switch(machine.ores_processing[ore])
- if(0)
+ if(PROCESS_NONE)
dat += "not processing"
- if(1)
+ if(PROCESS_SMELT)
dat += "smelting"
- if(2)
+ if(PROCESS_COMPRESS)
dat += "compressing"
- if(3)
+ if(PROCESS_ALLOY)
dat += "alloying"
else
dat += "not processing"
@@ -80,10 +81,10 @@
if(!choice) return
switch(choice)
- if("Nothing") choice = 0
- if("Smelting") choice = 1
- if("Compressing") choice = 2
- if("Alloying") choice = 3
+ if("Nothing") choice = PROCESS_NONE
+ if("Smelting") choice = PROCESS_SMELT
+ if("Compressing") choice = PROCESS_COMPRESS
+ if("Alloying") choice = PROCESS_ALLOY
machine.ores_processing[href_list["toggle_smelting"]] = choice
@@ -105,8 +106,8 @@
name = "material processor" //This isn't actually a goddamn furnace, we're in space and it's processing platinum and flammable phoron...
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "furnace"
- density = 1
- anchored = 1
+ density = TRUE
+ anchored = TRUE
light_range = 3
var/obj/machinery/mineral/input = null
var/obj/machinery/mineral/output = null
@@ -115,17 +116,17 @@
var/list/ores_processing[0]
var/list/ores_stored[0]
var/static/list/alloy_data
- var/active = 0
+ var/active = FALSE
/obj/machinery/mineral/processing_unit/New()
..()
-
// initialize static alloy_data list
if(!alloy_data)
alloy_data = list()
for(var/alloytype in typesof(/datum/alloy)-/datum/alloy)
alloy_data += new alloytype()
+ // TODO - Initializing this here is insane. Put it in global lists init or something. ~Leshana
if(!ore_data || !ore_data.len)
for(var/oretype in typesof(/ore)-/ore)
var/ore/OD = new oretype()
@@ -133,15 +134,16 @@
ores_processing[OD.name] = 0
ores_stored[OD.name] = 0
+/obj/machinery/mineral/processing_unit/initialize()
+ . = ..()
+ // TODO - Eschew input/output machinery and just use dirs ~Leshana
//Locate our output and input machinery.
- spawn(5)
- for (var/dir in cardinal)
- src.input = locate(/obj/machinery/mineral/input, get_step(src, dir))
- if(src.input) break
- for (var/dir in cardinal)
- src.output = locate(/obj/machinery/mineral/output, get_step(src, dir))
- if(src.output) break
- return
+ for (var/dir in cardinal)
+ src.input = locate(/obj/machinery/mineral/input, get_step(src, dir))
+ if(src.input) break
+ for (var/dir in cardinal)
+ src.output = locate(/obj/machinery/mineral/output, get_step(src, dir))
+ if(src.output) break
return
/obj/machinery/mineral/processing_unit/process()
@@ -174,7 +176,7 @@
if(!O) continue
- if(ores_processing[metal] == 3 && O.alloy) //Alloying.
+ if(ores_processing[metal] == PROCESS_ALLOY && O.alloy) //Alloying.
for(var/datum/alloy/A in alloy_data)
@@ -190,7 +192,7 @@
for(var/needs_metal in A.requires)
//Check if we're alloying the needed metal and have it stored.
- if(ores_processing[needs_metal] != 3 || ores_stored[needs_metal] < A.requires[needs_metal])
+ if(ores_processing[needs_metal] != PROCESS_ALLOY || ores_stored[needs_metal] < A.requires[needs_metal])
enough_metal = 0
break
@@ -207,7 +209,7 @@
for(var/i=0,i0) can_make--
@@ -222,7 +224,7 @@
sheets+=2
new M.stack_type(output.loc)
- else if(ores_processing[metal] == 1 && O.smelts_to) //Smelting.
+ else if(ores_processing[metal] == PROCESS_SMELT && O.smelts_to) //Smelting.
var/can_make = Clamp(ores_stored[metal],0,sheets_per_tick-sheets)
@@ -242,3 +244,8 @@
continue
console.updateUsrDialog()
+
+#undef PROCESS_NONE
+#undef PROCESS_SMELT
+#undef PROCESS_COMPRESS
+#undef PROCESS_ALLOY
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index b59909376f..843edf3f7f 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -18,6 +18,8 @@ var/list/mining_overlay_cache = list()
blocks_air = 1
temperature = T0C
+ can_dirty = FALSE
+
var/ore/mineral
var/sand_dug
var/mined_ore = 0
@@ -97,6 +99,25 @@ var/list/mining_overlay_cache = list()
attackby(O, R)
return
+/turf/simulated/mineral/proc/get_cached_border(var/cache_id, var/direction, var/icon_file, var/icon_state, var/offset = 32)
+ //Cache miss
+ if(!mining_overlay_cache["[cache_id]_[direction]"])
+ var/image/new_cached_image = image(icon_state, dir = direction, layer = ABOVE_TURF_LAYER)
+ switch(direction)
+ if(NORTH)
+ new_cached_image.pixel_y = offset
+ if(SOUTH)
+ new_cached_image.pixel_y = -offset
+ if(EAST)
+ new_cached_image.pixel_x = offset
+ if(WEST)
+ new_cached_image.pixel_x = -offset
+ mining_overlay_cache["[cache_id]_[direction]"] = new_cached_image
+ return new_cached_image
+
+ //Cache hit
+ return mining_overlay_cache["[cache_id]_[direction]"]
+
/turf/simulated/mineral/initialize()
. = ..()
if(prob(20))
@@ -111,8 +132,9 @@ var/list/mining_overlay_cache = list()
/turf/simulated/mineral/update_icon(var/update_neighbors)
- overlays.Cut()
+ cut_overlays()
+ //We are a wall (why does this system work like this??)
if(density)
if(mineral)
name = "[mineral.display_name] deposit"
@@ -122,47 +144,40 @@ var/list/mining_overlay_cache = list()
icon = 'icons/turf/walls.dmi'
icon_state = "rock"
+ //Apply overlays if we should have borders
for(var/direction in cardinal)
var/turf/T = get_step(src,direction)
if(istype(T) && !T.density)
- var/place_dir = turn(direction, 180)
- if(!mining_overlay_cache["rock_side_[place_dir]"])
- mining_overlay_cache["rock_side_[place_dir]"] = image('icons/turf/walls.dmi', "rock_side", dir = place_dir)
- T.overlays += mining_overlay_cache["rock_side_[place_dir]"]
+ add_overlay(get_cached_border("rock_side",direction,icon,"rock_side"))
if(archaeo_overlay)
- overlays += archaeo_overlay
+ add_overlay(archaeo_overlay)
if(excav_overlay)
- overlays += excav_overlay
- else
+ add_overlay(excav_overlay)
+ //We are a sand floor
+ else
name = "sand"
icon = 'icons/turf/flooring/asteroid.dmi'
icon_state = "asteroid"
if(sand_dug)
- if(!mining_overlay_cache["dug_overlay"])
- mining_overlay_cache["dug_overlay"] = image('icons/turf/flooring/asteroid.dmi', "dug_overlay")
- overlays += mining_overlay_cache["dug_overlay"]
+ add_overlay("dug_overlay")
+ //Apply overlays if there's space
for(var/direction in cardinal)
if(istype(get_step(src, direction), /turf/space) && !istype(get_step(src, direction), /turf/space/cracked_asteroid))
- if(!mining_overlay_cache["asteroid_edge_[direction]"])
- mining_overlay_cache["asteroid_edge_[direction]"] = image('icons/turf/flooring/asteroid.dmi', "asteroid_edges", dir = direction)
- overlays += mining_overlay_cache["asteroid_edge_[direction]"]
+ add_overlay(get_cached_border("asteroid_edge",direction,icon,"asteroid_edges", 0))
+
+ //Or any time
else
- var/turf/simulated/mineral/M = get_step(src, direction)
- if(istype(M) && M.density)
- if(!mining_overlay_cache["rock_side_[direction]"])
- mining_overlay_cache["rock_side_[direction]"] = image('icons/turf/walls.dmi', "rock_side", dir = direction)
- overlays += mining_overlay_cache["rock_side_[direction]"]
+ var/turf/T = get_step(src, direction)
+ if(istype(T) && T.density)
+ add_overlay(get_cached_border("rock_side",direction,'icons/turf/walls.dmi',"rock_side"))
if(overlay_detail)
-
- if(!mining_overlay_cache["decal_[overlay_detail]"])
- mining_overlay_cache["decal_[overlay_detail]"] = image(icon = 'icons/turf/flooring/decals.dmi', icon_state = overlay_detail)
- overlays += mining_overlay_cache["decal_[overlay_detail]"]
+ add_overlay('icons/turf/flooring/decals.dmi',overlay_detail)
if(update_neighbors)
for(var/direction in alldirs)
@@ -414,12 +429,13 @@ var/list/mining_overlay_cache = list()
if(!archaeo_overlay && finds && finds.len)
var/datum/find/F = finds[1]
if(F.excavation_required <= excavation_level + F.view_range)
+ cut_overlay(archaeo_overlay)
archaeo_overlay = "overlay_archaeo[rand(1,3)]"
- updateIcon = 1
+ add_overlay(archaeo_overlay)
else if(archaeo_overlay && (!finds || !finds.len))
+ cut_overlay(archaeo_overlay)
archaeo_overlay = null
- updateIcon = 1
//there's got to be a better way to do this
var/update_excav_overlay = 0
@@ -436,8 +452,9 @@ var/list/mining_overlay_cache = list()
//update overlays displaying excavation level
if( !(excav_overlay && excavation_level > 0) || update_excav_overlay )
var/excav_quadrant = round(excavation_level / 25) + 1
+ cut_overlay(excav_overlay)
excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]"
- updateIcon = 1
+ add_overlay(excav_overlay)
if(updateIcon)
update_icon()
diff --git a/code/modules/mob/_modifiers/aura.dm b/code/modules/mob/_modifiers/aura.dm
new file mode 100644
index 0000000000..f72ca67d1a
--- /dev/null
+++ b/code/modules/mob/_modifiers/aura.dm
@@ -0,0 +1,18 @@
+/*
+'Aura' modifiers are semi-permanent, in that they do not have a set duration, but will expire if out of range of the 'source' of the aura.
+Note: The source is defined as an argument in New(), and if not specified, it is assumed the holder is the source,
+making it not expire ever, which is likely not what you want.
+*/
+
+/datum/modifier/aura
+ var/aura_max_distance = 5 // If more than this many tiles away from the source, the modifier expires next tick.
+
+/datum/modifier/aura/check_if_valid()
+ if(!origin)
+ expire()
+ var/atom/A = origin.resolve()
+ if(istype(A)) // Make sure we're not null.
+ if(get_dist(holder, A) > aura_max_distance)
+ expire()
+ else
+ expire() // Source got deleted or something.
\ No newline at end of file
diff --git a/code/modules/mob/_modifiers/traits.dm b/code/modules/mob/_modifiers/traits.dm
index 453c17f321..d0b0abfd89 100644
--- a/code/modules/mob/_modifiers/traits.dm
+++ b/code/modules/mob/_modifiers/traits.dm
@@ -82,4 +82,40 @@
name = "Smaller"
desc = "Your body is smaller than average."
- icon_scale_percent = 0.9
\ No newline at end of file
+ icon_scale_percent = 0.9
+
+/datum/modifier/trait/colorblind_protanopia
+ name = "Protanopia"
+ desc = "You have a form of red-green colorblindness. You cannot see reds, and have trouble distinguishing them from yellows and greens."
+
+ client_color = MATRIX_Protanopia
+
+/datum/modifier/trait/colorblind_deuteranopia
+ name = "Deuteranopia"
+ desc = "You have a form of red-green colorblindness. You cannot see greens, and have trouble distinguishing them from yellows and reds."
+
+ client_color = MATRIX_Deuteranopia
+
+/datum/modifier/trait/colorblind_tritanopia
+ name = "Tritanopia"
+ desc = "You have a form of blue-yellow colorblindness. You have trouble distinguishing between blues, greens, and yellows, and see blues and violets as dim."
+
+ client_color = MATRIX_Tritanopia
+
+/datum/modifier/trait/colorblind_taj
+ name = "Colorblind - Blue-red"
+ desc = "You are colorblind. You have a minor issue with blue colors and have difficulty recognizing them from red colors."
+
+ client_color = MATRIX_Taj_Colorblind
+
+/datum/modifier/trait/colorblind_vulp
+ name = "Colorblind - Red-green"
+ desc = "You are colorblind. You have a severe issue with green colors and have difficulty recognizing them from red colors."
+
+ client_color = MATRIX_Vulp_Colorblind
+
+/datum/modifier/trait/colorblind_monochrome
+ name = "Monochromacy"
+ desc = "You are fully colorblind. Your condition is rare, but you can see no colors at all."
+
+ client_color = MATRIX_Monochromia
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 2b9340192f..fbc07117e1 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -795,7 +795,7 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
set name = "Blank pAI alert"
set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope."
if(usr.client.prefs.be_special & BE_PAI)
- for(var/obj/item/device/paicard/p in world)
+ for(var/obj/item/device/paicard/p in all_pai_cards)
var/obj/item/device/paicard/PP = p
if(PP.pai == null)
PP.overlays += "pai-ghostalert"
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 7153c0fe26..1e862472a2 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -302,7 +302,7 @@
else adverb = " a very lengthy message"
message = "[speaker] [verb][adverb]."
- src.show_message(message)
+ show_message(message, type = 1) // Type 1 is visual message
/mob/proc/hear_sleep(var/message)
var/heard = ""
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 3a19eee319..74baf0d9ce 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -95,6 +95,9 @@ var/list/holder_mob_icon_cache = list()
/obj/item/weapon/holder/drone
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 5)
+/obj/item/weapon/holder/pai
+ origin_tech = list(TECH_DATA = 2)
+
/obj/item/weapon/holder/mouse
w_class = ITEMSIZE_TINY
diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm
index ad55f2b346..7cb7cd08e5 100644
--- a/code/modules/mob/language/generic.dm
+++ b/code/modules/mob/language/generic.dm
@@ -133,6 +133,6 @@
key = "s"
flags = SIGNLANG|NO_STUTTER|NONVERBAL
-/datum/language/sign/can_speak_special(var/mob/speaker)
+/datum/language/sign/can_speak_special(var/mob/speaker) // TODO: If ever we make external organs assist languages, convert this over to the new format
var/obj/item/organ/external/hand/hands = locate() in speaker //you can't sign without hands
return (hands || !iscarbon(speaker))
diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm
index c6089a8788..66e0e5e0f0 100644
--- a/code/modules/mob/language/language.dm
+++ b/code/modules/mob/language/language.dm
@@ -133,7 +133,15 @@
return speech_verb
/datum/language/proc/can_speak_special(var/mob/speaker)
- return 1
+ . = TRUE
+ if(ishuman(speaker))
+ var/mob/living/carbon/human/H = speaker
+ if(src.name in H.species.assisted_langs)
+ . = FALSE
+ var/obj/item/organ/internal/voicebox/vox = locate() in H.internal_organs // Only voiceboxes for now. Maybe someday it'll include other organs, but I'm not that clever
+ if(vox)
+ if(!vox.is_broken() && (src in vox.assists_languages))
+ . = TRUE
// Language handling.
/mob/proc/add_language(var/language)
diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm
index b1932bb3ba..fdd719df89 100644
--- a/code/modules/mob/language/outsider.dm
+++ b/code/modules/mob/language/outsider.dm
@@ -129,4 +129,16 @@
flags = RESTRICTED
syllables = list("rus","zem","ave","groz","ski","ska","ven","konst","pol","lin","svy",
"danya","da","mied","zan","das","krem","myka","cyka","blyat","to","st","no","na","ni",
- "ko","ne","en","po","ra","li","on","byl","cto","eni","ost","ol","ego","ver","stv","pro")
\ No newline at end of file
+ "ko","ne","en","po","ra","li","on","byl","cto","eni","ost","ol","ego","ver","stv","pro")
+
+//For your event purposes.
+/datum/language/occursus
+ name = LANGUAGE_EVENT1
+ desc = "The Powers That Be have seen it fit to grace you with a special language that sounds like... something. This description should be overridden by the time you see this."
+ speech_verb = "says"
+ ask_verb = "asks"
+ exclaim_verb = "shouts"
+ colour = "warning"
+ key = "]"
+ flags = RESTRICTED
+ syllables = list("chan","ange","thi","se")
diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm
index 6de7a9d309..47cb3b8de0 100644
--- a/code/modules/mob/language/station.dm
+++ b/code/modules/mob/language/station.dm
@@ -63,6 +63,14 @@
"ka","aasi","far","wa","baq","ara","qara","zir","saam","mak","hrar","nja","rir","khan","jun","dar","rik","kah",
"hal","ket","jurl","mah","tul","cresh","azu","ragh","mro","mra","mrro","mrra")
+/datum/language/tajaran/get_random_name(var/gender)
+ var/new_name = ..(gender,1)
+ if(prob(50))
+ new_name += " [pick(list("Hadii","Kaytam","Nazkiin","Zhan-Khazan","Hharar","Njarir'Akhan","Faaira'Nrezi","Rhezar","Mi'dynh","Rrhazkal","Bayan","Al'Manq","Mi'jri","Chur'eech","Sanu'dra","Ii'rka"))]"
+ else
+ new_name += " [..(gender,1)]"
+ return new_name
+
/datum/language/tajaranakhani
name = LANGUAGE_AKHANI
desc = "The language of the sea-faring Njarir'Akhan Tajaran. Borrowing some elements from Siik, the language is distinctly more structured."
@@ -77,14 +85,27 @@
"kar","yar","kzar","rha","hrar","err","fer","rir","rar","yarr","arr","ii'r","jar","kur","ran","rii","ii",
"nai","ou","kah","oa","ama","uuk","bel","chi","ayt","kay","kas","akor","tam","yir","enai")
-/datum/language/tajaran/get_random_name(var/gender)
+/datum/language/tajsign
+ name = LANGUAGE_ALAI
+ desc = "A standardized Tajaran sign language that was developed in Zarraya and gradually adopted by other nations, incorporating \
+ hand gestures and movements of the ears and tail."
+ signlang_verb = list("gestures with their hands", "gestures with their ears and tail", "gestures with their ears, tail and hands")
+ colour = "tajaran"
+ key = "l"
+ flags = WHITELISTED | SIGNLANG | NO_STUTTER | NONVERBAL
- var/new_name = ..(gender,1)
- if(prob(50))
- new_name += " [pick(list("Hadii","Kaytam","Nazkiin","Zhan-Khazan","Hharar","Njarir'Akhan","Faaira'Nrezi","Rhezar","Mi'dynh","Rrhazkal","Bayan","Al'Manq","Mi'jri","Chur'eech","Sanu'dra","Ii'rka"))]"
- else
- new_name += " [..(gender,1)]"
- return new_name
+/datum/language/tajsign/can_speak_special(var/mob/speaker) // TODO: If ever we make external organs assist languages, convert this over to the new format
+ var/list/allowed_species = list(SPECIES_TAJ, SPECIES_TESHARI) // Need a tail and ears and such to use this.
+ if(iscarbon(speaker))
+ var/obj/item/organ/external/hand/hands = locate() in speaker //you can't sign without hands
+ if(!hands)
+ return FALSE
+ if(ishuman(speaker))
+ var/mob/living/carbon/human/H = speaker
+ if(H.species.get_bodytype(H) in allowed_species)
+ return TRUE
+
+ return FALSE
/datum/language/skrell
name = LANGUAGE_SKRELLIAN
@@ -112,7 +133,11 @@
flags = WHITELISTED
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix", "...", "oo", "q", "nq", "x", "xq", "ll", "...", "...", "...") //should sound like there's holes in it
-
+/datum/language/skrell/get_random_name(var/gender)
+ var/list/first_names = file2list('config/names/first_name_skrell.txt')
+ var/list/last_names = file2list('config/names/last_name_skrell.txt')
+ return "[pick(first_names)] [pick(last_names)]"
+
/datum/language/human
name = LANGUAGE_SOL_COMMON
desc = "A bastardized hybrid of many languages, including Chinese, English, French, and more; it is the common language of the Sol system."
@@ -152,11 +177,6 @@
syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz","shh","shk")
space_chance = 10
-/datum/language/machine/can_speak_special(var/mob/speaker)
- var/obj/item/weapon/implant/language/eal/beep = locate() in speaker
- return ((beep && beep.implanted) || speaker.isSynthetic() || isvoice(speaker))
- //thank you sweet zuhayr
-
/datum/language/machine/get_random_name()
if(prob(70))
return "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
@@ -272,4 +292,4 @@
"tod", "ser", "su", "no", "nue", "el",
"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na",
"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un",
-"tod", "ser", "su", "no", "nue", "el")
\ No newline at end of file
+"tod", "ser", "su", "no", "nue", "el")
diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm
index 6e8805d17a..12715a4c2b 100644
--- a/code/modules/mob/living/bot/bot.dm
+++ b/code/modules/mob/living/bot/bot.dm
@@ -7,6 +7,8 @@
universal_speak = 1
density = 0
+ makes_dirt = FALSE // No more dirt from Beepsky
+
var/obj/item/weapon/card/id/botcard = null
var/list/botcard_access = list()
var/on = 1
@@ -86,23 +88,23 @@
if(O.GetID())
if(access_scanner.allowed(user) && !open && !emagged)
locked = !locked
- user << "Controls are now [locked ? "locked." : "unlocked."]"
+ to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]")
attack_hand(user)
else
if(emagged)
- user << "ERROR"
+ to_chat(user, "ERROR")
if(open)
- user << "Please close the access panel before locking it."
+ to_chat(user, "Please close the access panel before locking it.")
else
- user << "Access denied."
+ to_chat(user, "Access denied.")
return
- else if(istype(O, /obj/item/weapon/screwdriver))
+ else if(O.is_screwdriver())
if(!locked)
open = !open
- user << "Maintenance panel is now [open ? "opened" : "closed"]."
+ to_chat(user, "Maintenance panel is now [open ? "opened" : "closed"].")
playsound(src, O.usesound, 50, 1)
else
- user << "You need to unlock the controls first."
+ to_chat(user, "You need to unlock the controls first.")
return
else if(istype(O, /obj/item/weapon/weldingtool))
if(health < getMaxHealth())
@@ -111,9 +113,9 @@
user.visible_message("[user] repairs [src].","You repair [src].")
playsound(src, O.usesound, 50, 1)
else
- user << "Unable to repair with the maintenance panel closed."
+ to_chat(user, "Unable to repair with the maintenance panel closed.")
else
- user << "[src] does not need a repair."
+ to_chat(user, "[src] does not need a repair.")
return
else
..()
@@ -383,3 +385,6 @@
else return !D.check_access(ID) // it's a real, air blocking door
return 0
+
+/mob/living/bot/isSynthetic() //Robots are synthetic, no?
+ return 1
diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm
index cac0f1872a..7c709bc165 100644
--- a/code/modules/mob/living/bot/ed209bot.dm
+++ b/code/modules/mob/living/bot/ed209bot.dm
@@ -56,7 +56,7 @@
/mob/living/bot/secbot/ed209/RangedAttack(var/atom/A)
if(last_shot + shot_delay > world.time)
- src << "You are not ready to fire yet!"
+ to_chat(src, "You are not ready to fire yet!")
return
last_shot = world.time
@@ -100,7 +100,7 @@
user.drop_item()
qdel(W)
build_step++
- user << "You add the robot leg to [src]."
+ to_chat(user, "You add the robot leg to [src].")
name = "legs/frame assembly"
if(build_step == 1)
icon_state = "ed209_leg"
@@ -112,7 +112,7 @@
user.drop_item()
qdel(W)
build_step++
- user << "You add the armor to [src]."
+ to_chat(user, "You add the armor to [src].")
name = "vest/legs/frame assembly"
item_state = "ed209_shell"
icon_state = "ed209_shell"
@@ -123,13 +123,13 @@
if(WT.remove_fuel(0, user))
build_step++
name = "shielded frame assembly"
- user << "You welded the vest to [src]."
+ to_chat(user, "You welded the vest to [src].")
if(4)
if(istype(W, /obj/item/clothing/head/helmet))
user.drop_item()
qdel(W)
build_step++
- user << "You add the helmet to [src]."
+ to_chat(user, "You add the helmet to [src].")
name = "covered and shielded frame assembly"
item_state = "ed209_hat"
icon_state = "ed209_hat"
@@ -139,7 +139,7 @@
user.drop_item()
qdel(W)
build_step++
- user << "You add the prox sensor to [src]."
+ to_chat(user, "You add the prox sensor to [src].")
name = "covered, shielded and sensored frame assembly"
item_state = "ed209_prox"
icon_state = "ed209_prox"
@@ -148,13 +148,13 @@
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = W
if (C.get_amount() < 1)
- user << "You need one coil of wire to wire [src]."
+ to_chat(user, "You need one coil of wire to wire [src].")
return
- user << "You start to wire [src]."
+ to_chat(user, "You start to wire [src].")
if(do_after(user, 40) && build_step == 6)
if(C.use(1))
build_step++
- user << "You wire the ED-209 assembly."
+ to_chat(user, "You wire the ED-209 assembly.")
name = "wired ED-209 assembly"
return
@@ -162,27 +162,27 @@
if(istype(W, /obj/item/weapon/gun/energy/taser))
name = "taser ED-209 assembly"
build_step++
- user << "You add [W] to [src]."
+ to_chat(user, "You add [W] to [src].")
item_state = "ed209_taser"
icon_state = "ed209_taser"
user.drop_item()
qdel(W)
if(8)
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
playsound(src, W.usesound, 100, 1)
var/turf/T = get_turf(user)
- user << "Now attaching the gun to the frame..."
+ to_chat(user, "Now attaching the gun to the frame...")
sleep(40)
if(get_turf(user) == T && build_step == 8)
build_step++
name = "armed [name]"
- user << "Taser gun attached."
+ to_chat(user, "Taser gun attached.")
if(9)
if(istype(W, /obj/item/weapon/cell))
build_step++
- user << "You complete the ED-209."
+ to_chat(user, "You complete the ED-209.")
var/turf/T = get_turf(src)
new /mob/living/bot/secbot/ed209(T,created_name,lasercolor)
user.drop_item()
diff --git a/code/modules/mob/living/bot/edCLNbot.dm b/code/modules/mob/living/bot/edCLNbot.dm
index 159b3e3594..9b84651165 100644
--- a/code/modules/mob/living/bot/edCLNbot.dm
+++ b/code/modules/mob/living/bot/edCLNbot.dm
@@ -214,7 +214,7 @@
qdel(W)
if(7)
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
playsound(src, W.usesound, 100, 1)
var/turf/T = get_turf(user)
to_chat(user, "Attatching the mop to the frame...")
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 3fb0c6e65e..aff4b81e1f 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -266,6 +266,10 @@
/mob/living/carbon/proc/eyecheck()
return 0
+/mob/living/carbon/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash)
+ if(eyecheck() < intensity || override_blindness_check)
+ return ..()
+
// ++++ROCKDTBEN++++ MOB PROCS -- Ask me before touching.
// Stop! ... Hammertime! ~Carn
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 09b7aadc70..b81f009878 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -1,6 +1,6 @@
/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null)
var/param = null
-
+
var/datum/gender/T = gender_datums[get_visible_gender()]
if (findtext(act, "-", 1, null))
@@ -14,9 +14,10 @@
var/muzzled = is_muzzled()
//var/m_type = 1
- for (var/obj/item/weapon/implant/I in src)
- if (I.implanted)
- I.trigger(act, src)
+ for(var/obj/item/organ/O in src.organs)
+ for (var/obj/item/weapon/implant/I in O)
+ if (I.implanted)
+ I.trigger(act, src)
if(src.stat == 2.0 && (act != "deathgasp"))
return
@@ -79,7 +80,7 @@
//Promethean-only emotes
if("squish")
- if(!species.bump_flag == SLIME) //That should do, yaya.
+ if(species.bump_flag != SLIME) //This should definitely do it.
src << "You are not a slime thing!"
return
@@ -738,7 +739,7 @@
set name = "Set Pose"
set desc = "Sets a description which will be shown when someone examines you."
set category = "IC"
-
+
var/datum/gender/T = gender_datums[get_visible_gender()]
pose = sanitize(input(usr, "This is [src]. [T.he]...", "Pose", null) as text)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 848ef7a870..a7490b4969 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -2,7 +2,7 @@
var/skip_gear = 0
var/skip_body = 0
- if(alpha <= 50)
+ if(alpha <= EFFECTIVE_INVIS)
src.loc.examine(user)
return
@@ -124,7 +124,7 @@
var/tie_msg
if(istype(w_uniform,/obj/item/clothing/under) && !(skip_gear & EXAMINE_SKIPTIE))
var/obj/item/clothing/under/U = w_uniform
- if(U.accessories.len)
+ if(LAZYLEN(U.accessories))
var/list/accessories_visible = list() //please let this fix the stupid fucking runtimes
if(skip_gear & EXAMINE_SKIPHOLSTER)
for(var/obj/item/clothing/accessory/A in U.accessories)
@@ -141,7 +141,7 @@
if(w_uniform.blood_DNA)
msg += "[T.He] [T.is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [w_uniform.name]![tie_msg] "
else
- msg += "[T.He] [T.is] wearing \icon[w_uniform] \a [w_uniform][tie_msg]. "
+ msg += "[T.He] [T.is] wearing \icon[w_uniform] \a [w_uniform].[tie_msg] "
//head
if(head && !(skip_gear & EXAMINE_SKIPHELMET) && head.show_examine)
@@ -155,7 +155,7 @@
var/tie_msg
if(istype(wear_suit,/obj/item/clothing/suit))
var/obj/item/clothing/suit/U = wear_suit
- if(U.accessories.len)
+ if(LAZYLEN(U.accessories))
tie_msg += " Attached to it is [english_list(U.accessories)]."
if(wear_suit.blood_DNA)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 1cea9e2113..a5ef3304ab 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -165,25 +165,12 @@
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if(update) UpdateDamageIcon()
-/mob/living/carbon/human/proc/implant_loadout(var/datum/gear/G = new/datum/gear/utility/implant)
- var/obj/item/weapon/implant/I = new G.path(src)
- I.imp_in = src
- I.implanted = 1
- var/obj/item/organ/external/affected = src.organs_by_name[BP_HEAD]
- affected.implants += I
- I.part = affected
- I.implanted(src)
-
/mob/living/carbon/human/proc/implant_loyalty(override = FALSE) // Won't override by default.
if(!config.use_loyalty_implants && !override) return // Nuh-uh.
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(src)
- L.imp_in = src
- L.implanted = 1
- var/obj/item/organ/external/affected = src.organs_by_name[BP_HEAD]
- affected.implants += L
- L.part = affected
- L.implanted(src)
+ if(L.handle_implant(src, BP_HEAD))
+ L.post_implant(src)
/mob/living/carbon/human/proc/is_loyalty_implanted()
for(var/L in src.contents)
@@ -241,7 +228,7 @@
if(legcuffed)
dat += " Legcuffed"
- if(suit && suit.accessories.len)
+ if(suit && LAZYLEN(suit.accessories))
dat += " Remove accessory"
dat += " Remove splints"
dat += " Empty pockets"
@@ -661,14 +648,21 @@
I = internal_organs_by_name[O_EYES]
if(I.is_broken())
return FLASH_PROTECTION_MAJOR
- else // They can't be flashed if they don't have eyes.
+ else if(!species.dispersed_eyes) // They can't be flashed if they don't have eyes, or widespread sensing surfaces.
return FLASH_PROTECTION_MAJOR
var/number = get_equipment_flash_protection()
- number = I.get_total_protection(number)
- I.additional_flash_effects(number)
+ if(I)
+ number = I.get_total_protection(number)
+ I.additional_flash_effects(number)
return number
+/mob/living/carbon/human/flash_eyes(var/intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash)
+ if(internal_organs_by_name[O_EYES]) // Eyes are fucked, not a 'weak point'.
+ var/obj/item/organ/internal/eyes/I = internal_organs_by_name[O_EYES]
+ I.additional_flash_effects(intensity)
+ return ..()
+
#define add_clothing_protection(A) \
var/obj/item/clothing/C = A; \
flash_protection += C.flash_protection; \
@@ -842,7 +836,7 @@
src.verbs -= /mob/living/carbon/human/proc/remotesay
return
var/list/creatures = list()
- for(var/mob/living/carbon/h in world)
+ for(var/mob/living/carbon/h in mob_list)
creatures += h
var/mob/target = input("Who do you want to project your mind to ?") as null|anything in creatures
if (isnull(target))
@@ -855,7 +849,7 @@
target.show_message(" You hear a voice that seems to echo around the room: [say]")
usr.show_message(" You project your mind into [target.real_name]: [say]")
log_say("(TPATH to [key_name(target)]) [say]",src)
- for(var/mob/observer/dead/G in world)
+ for(var/mob/observer/dead/G in mob_list)
G.show_message("Telepathic message from [src] to [target]: [say]")
/mob/living/carbon/human/proc/remoteobserve()
@@ -880,7 +874,7 @@
var/list/mob/creatures = list()
- for(var/mob/living/carbon/h in world)
+ for(var/mob/living/carbon/h in mob_list)
var/turf/temp_turf = get_turf(h)
if((temp_turf.z != 1 && temp_turf.z != 5) || h.stat!=CONSCIOUS) //Not on mining or the station. Or dead
continue
@@ -919,7 +913,7 @@
restore_all_organs() // Reapply robotics/amputated status from preferences.
if(!client || !key) //Don't boot out anyone already in the mob.
- for (var/obj/item/organ/internal/brain/H in world)
+ for (var/obj/item/organ/internal/brain/H in all_brain_organs)
if(H.brainmob)
if(H.brainmob.real_name == src.real_name)
if(H.brainmob.mind)
@@ -1113,6 +1107,8 @@
remove_language(species.language)
if(species.default_language)
remove_language(species.default_language)
+ for(var/datum/language/L in species.assisted_langs)
+ remove_language(L)
// Clear out their species abilities.
species.remove_inherent_verbs(src)
holder_type = null
@@ -1164,11 +1160,7 @@
fixblood()
// Rebuild the HUD. If they aren't logged in then login() should reinstantiate it for them.
- if(client && client.screen)
- client.screen.len = null
- if(hud_used)
- qdel(hud_used)
- hud_used = new /datum/hud(src)
+ update_hud()
//A slew of bits that may be affected by our species change
regenerate_icons()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index db20f7f744..64cd6a0dc1 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -146,45 +146,35 @@ emp_act
//this proc returns the armour value for a particular external organ.
/mob/living/carbon/human/proc/getarmor_organ(var/obj/item/organ/external/def_zone, var/type)
- if(!type || !def_zone) return 0
+ if(!type || !def_zone)
+ return 0
var/protection = 0
- var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes)
+ var/list/protective_gear = def_zone.get_covering_clothing()
for(var/obj/item/clothing/gear in protective_gear)
- if(gear.body_parts_covered & def_zone.body_part)
- protection += gear.armor[type]
- if(gear.accessories.len)
- for(var/obj/item/clothing/accessory/bling in gear.accessories)
- if(bling.body_parts_covered & def_zone.body_part)
- protection += bling.armor[type]
+ protection += gear.armor[type]
return protection
/mob/living/carbon/human/proc/getsoak_organ(var/obj/item/organ/external/def_zone, var/type)
- if(!type || !def_zone) return 0
+ if(!type || !def_zone)
+ return 0
var/soaked = 0
- var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes)
+ var/list/protective_gear = def_zone.get_covering_clothing()
for(var/obj/item/clothing/gear in protective_gear)
- if(gear.body_parts_covered & def_zone.body_part)
- soaked += gear.armorsoak[type]
- if(gear.accessories.len)
- for(var/obj/item/clothing/accessory/bling in gear.accessories)
- if(bling.body_parts_covered & def_zone.body_part)
- soaked += bling.armorsoak[type]
+ soaked += gear.armorsoak[type]
return soaked
+// Checked in borer code
/mob/living/carbon/human/proc/check_head_coverage()
-
- var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform)
- for(var/bp in body_parts)
- if(!bp) continue
- if(bp && istype(bp ,/obj/item/clothing))
- var/obj/item/clothing/C = bp
- if(C.body_parts_covered & HEAD)
- return 1
+ var/obj/item/organ/external/H = organs_by_name[BP_HEAD]
+ var/list/body_parts = H.get_covering_clothing()
+ if(LAZYLEN(body_parts))
+ return 1
return 0
//Used to check if they can be fed food/drinks/pills
/mob/living/carbon/human/proc/check_mouth_coverage()
- var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform)
+ var/obj/item/organ/external/H = organs_by_name[BP_HEAD]
+ var/list/protective_gear = H.get_covering_clothing()
for(var/obj/item/gear in protective_gear)
if(istype(gear) && (gear.body_parts_covered & FACE) && !(gear.item_flags & FLEXIBLEMATERIAL))
return gear
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 244c22e80b..2cbd93260c 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -30,6 +30,7 @@
var/r_synth //Used with synth_color to color synth parts that normaly can't be colored.
var/g_synth //Same as above
var/b_synth //Same as above
+ var/synth_markings = 0 //Enables/disables markings on synth parts.
var/damage_multiplier = 1 //multiplies melee combat damage
var/icon_update = 1 //whether icon updating shall take place
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index d2150354fa..30e00f2e7a 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -107,6 +107,11 @@
tally += item_tally
+ if(CE_SLOWDOWN in chem_effects)
+ if (tally >= 0 )
+ tally = (tally + tally/4) //Add a quarter of penalties on top.
+ tally += 1
+
if(CE_SPEEDBOOST in chem_effects)
if (tally >= 0) // cut any penalties in half
tally = tally/2
diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm
index 8a9db8a349..018f0e1926 100644
--- a/code/modules/mob/living/carbon/human/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/human_powers.dm
@@ -1,6 +1,38 @@
// These should all be procs, you can add them to humans/subspecies by
// species.dm's inherent_verbs ~ Z
+/mob/living/carbon/human/proc/tie_hair()
+ set name = "Tie Hair"
+ set desc = "Style your hair."
+ set category = "IC"
+
+ if(incapacitated())
+ to_chat(src, "You can't mess with your hair right now!")
+ return
+
+ if(h_style)
+ var/datum/sprite_accessory/hair/hair_style = hair_styles_list[h_style]
+ var/selected_string
+ if(!(hair_style.flags & HAIR_TIEABLE))
+ to_chat(src, "Your hair isn't long enough to tie.")
+ return
+ else
+ var/list/datum/sprite_accessory/hair/valid_hairstyles = list()
+ for(var/hair_string in hair_styles_list)
+ var/list/datum/sprite_accessory/hair/test = hair_styles_list[hair_string]
+ if(test.flags & HAIR_TIEABLE)
+ valid_hairstyles.Add(hair_string)
+ selected_string = input("Select a new hairstyle", "Your hairstyle", hair_style) as null|anything in valid_hairstyles
+ if(incapacitated())
+ to_chat(src, "You can't mess with your hair right now!")
+ return
+ else if(selected_string && h_style != selected_string)
+ h_style = selected_string
+ regenerate_icons()
+ visible_message("[src] pauses a moment to style their hair.")
+ else
+ to_chat(src, "You're already using that style.")
+
/mob/living/carbon/human/proc/tackle()
set category = "Abilities"
set name = "Tackle"
diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm
index e791d69749..367a00b5d5 100644
--- a/code/modules/mob/living/carbon/human/human_species.dm
+++ b/code/modules/mob/living/carbon/human/human_species.dm
@@ -51,3 +51,6 @@
/mob/living/carbon/human/stok/New(var/new_loc)
..(new_loc, SPECIES_MONKEY_UNATHI)
+
+/mob/living/carbon/human/event1/New(var/new_loc)
+ ..(new_loc, SPECIES_EVENT1)
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 9319893175..559649e90f 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -340,6 +340,11 @@ This saves us from having to call add_fingerprint() any time something is put in
if(W.action_button_name)
update_action_buttons()
+ if(W.zoom)
+ W.zoom()
+
+ W.in_inactive_hand(src)
+
return 1
//Checks if a given slot can be accessed at this time, either to equip or unequip I
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 3ce0c85ef1..9b2b0234e4 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1032,7 +1032,7 @@
adjustHalLoss(-1)
if (drowsyness)
- drowsyness--
+ drowsyness = max(0, drowsyness - 1)
eye_blurry = max(2, eye_blurry)
if (prob(5))
sleeping += 1
diff --git a/code/modules/mob/living/carbon/human/species/outsider/event.dm b/code/modules/mob/living/carbon/human/species/outsider/event.dm
new file mode 100644
index 0000000000..477b14c0c4
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/outsider/event.dm
@@ -0,0 +1,222 @@
+/*
+This species is meant to be used both as a base for Event species and possible future per-round RNG'd species, hence the proc var-ization in some places.
+
+IF YOU ARE USING THIS SPECIES:
+
+Variables you may want to make use of are:
+
+ icobase and deform Set both to the same thing, unless you have special deformed sprites.
+ mobtemplate The blank bounding box used by your species.
+ mob_size The size class of the species. 20 is human.
+ show_ssd What is shown when they're SSD?
+ virus_immune Immune to viruses? 1/0
+ short_sighted Permanent weldervision. 1/0
+ blood_volume Initial blood volume.
+ bloodloss_rate Multiplier for how fast a species bleeds out. Higher = Faster
+ hunger_factor Multiplier for hunger.
+ active_regen_mult Multiplier for 'Regenerate' power speed, in human_powers.dm
+
+ scream_verb The text descriptor of the scream. Default screams.
+ male_scream_sound Sound played when a male *scream s.
+ female_scream_sound Sound played when a female *scream s.
+ male_cough_sounds List of cough sounds for males.
+ female_cough_sounds List of cough sounds for females.
+ male_sneeze_sound Sound played when a male *sneeze s..
+ female_sneeze_sound Sound played when a female *sneeze s.
+
+ speech_sounds A list of sounds used randomly when the species talks.
+ speech_chance Percentile chance to do the above.
+
+ total_health How much damage can they take before entering crit? Default 100.
+
+ brute_mod Physical damage multiplier.
+ burn_mod Burn damage multiplier.
+ oxy_mod Oxyloss modifier
+ toxins_mod Toxloss modifier
+ radiation_mod Radiation modifier
+ flash_mod Stun from blindness modifier.
+ sound_mod Stun from sounds, I.E. flashbangs.
+ chemOD_mod Damage modifier for overdose
+ siemens_coefficient The lower, the thicker the skin and better the insulation.
+ darksight Native darksight distance.
+
+ meat_type The food given when they are turned into meat.
+ remains_type The effect left behind when they are ashed.
+ death_sound The sound played when they die.
+ death_message The deathgasp.
+ knockout_message The message when someone gets a lucky shot on the head.
+ cloning_modifier The modifier given when they are by chance cloned.
+
+ Any 'heat' or 'pressure' vars. Environmental survivability.
+
+ speech_bubble_appearance Part of icon_state to use for speech bubbles when talking. See talk.dmi for available icons.
+
+ slowdown Passive movement speed malus (or boost, if negative)
+ move_trail What effect marks are left when walking
+ has_floating_eyes Whether the eyes can be shown above other icons
+ has_glowing_eyes Whether the eyes are shown above all lighting
+ water_movement How much faster or slower the species is in water
+ snow_movement How much faster or slower the species is on snow
+ item_slowdown_mod How affected by item slowdown the species is. Multiplier.
+
+ */
+
+/datum/species/event1 //Essentially, by default a 'better' human.
+ name = SPECIES_EVENT1
+ name_plural = SPECIES_EVENT1
+ primitive_form = SPECIES_MONKEY
+ unarmed_types = list(/datum/unarmed_attack/stomp/event1, /datum/unarmed_attack/kick/event1, /datum/unarmed_attack/punch/event1, /datum/unarmed_attack/bite/event1)
+ blurb = "We're not quite sure where these things came from. Are you?"
+ num_alternate_languages = 3
+ species_language = LANGUAGE_GALCOM
+ secondary_langs = list()
+ assisted_langs = list()
+ name_language = null // Use the first-name last-name generator rather than a language scrambler
+
+ min_age = 0
+ max_age = 999
+
+ health_hud_intensity = 1.5
+
+ flags = NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT
+
+ vision_flags = SEE_SELF
+ darksight = 7
+
+ brute_mod = 0.9
+ burn_mod = 0.9
+ oxy_mod = 0.9
+ toxins_mod = 0.9
+ radiation_mod = 0.9
+ flash_mod = 0.9
+ sound_mod = 0.9
+ chemOD_mod = 0.9
+ siemens_coefficient = 0.9
+
+ spawn_flags = SPECIES_IS_RESTRICTED
+ appearance_flags = HAS_SKIN_TONE | HAS_EYE_COLOR
+
+ //Far more organs, due to the issues with adding them and their respective verbs mid round, I'll include them here.
+ //Colormatch organs will change to match the blood color of the species.
+ has_organ = list(
+ O_HEART = /obj/item/organ/internal/heart/grey/colormatch,
+ O_LUNGS = /obj/item/organ/internal/lungs/grey/colormatch,
+ O_LIVER = /obj/item/organ/internal/liver/grey/colormatch,
+ O_KIDNEYS = /obj/item/organ/internal/kidneys/grey/colormatch,
+ O_BRAIN = /obj/item/organ/internal/brain/grey/colormatch,
+ O_EYES = /obj/item/organ/internal/eyes/grey/colormatch,
+ O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/grey/colormatch,
+ O_ACID = /obj/item/organ/internal/xenos/acidgland/grey/colormatch,
+ O_HIVE = /obj/item/organ/internal/xenos/hivenode/grey/colormatch,
+ O_RESIN = /obj/item/organ/internal/xenos/resinspinner/grey/colormatch
+ )
+
+ var/use_bodyshape = SPECIES_HUMAN
+ var/waterbreathing = 0
+ var/overcome_gravity = 0
+ var/hover = 0
+
+/datum/species/event1/proc/set_limbset(var/setnum = 1) //Will require existing ones to be respawned for changes to take effect.
+ switch(setnum)
+ if(1) //Normal.
+ has_limbs = list(
+ BP_TORSO = list("path" = /obj/item/organ/external/chest),
+ BP_GROIN = list("path" = /obj/item/organ/external/groin),
+ BP_HEAD = list("path" = /obj/item/organ/external/head),
+ BP_L_ARM = list("path" = /obj/item/organ/external/arm),
+ BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
+ BP_L_LEG = list("path" = /obj/item/organ/external/leg),
+ BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
+ BP_L_HAND = list("path" = /obj/item/organ/external/hand),
+ BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
+ BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
+ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
+ )
+ if(2) //No broken bones.
+ has_limbs = list(
+ BP_TORSO = list("path" = /obj/item/organ/external/chest/unbreakable),
+ BP_GROIN = list("path" = /obj/item/organ/external/groin/unbreakable),
+ BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable),
+ BP_L_ARM = list("path" = /obj/item/organ/external/arm/unbreakable),
+ BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unbreakable),
+ BP_L_LEG = list("path" = /obj/item/organ/external/leg/unbreakable),
+ BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/unbreakable),
+ BP_L_HAND = list("path" = /obj/item/organ/external/hand/unbreakable),
+ BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unbreakable),
+ BP_L_FOOT = list("path" = /obj/item/organ/external/foot/unbreakable),
+ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unbreakable)
+ )
+ if(3) //No removing from the body.
+ has_limbs = list(
+ BP_TORSO = list("path" = /obj/item/organ/external/chest/unseverable),
+ BP_GROIN = list("path" = /obj/item/organ/external/groin/unseverable),
+ BP_HEAD = list("path" = /obj/item/organ/external/head/unseverable),
+ BP_L_ARM = list("path" = /obj/item/organ/external/arm/unseverable),
+ BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unseverable),
+ BP_L_LEG = list("path" = /obj/item/organ/external/leg/unseverable),
+ BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/unseverable),
+ BP_L_HAND = list("path" = /obj/item/organ/external/hand/unseverable),
+ BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unseverable),
+ BP_L_FOOT = list("path" = /obj/item/organ/external/foot/unseverable),
+ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unseverable)
+ )
+ if(4) //No breaking, OR removing from the body. For things that are more monsterous.
+ has_limbs = list(
+ BP_TORSO = list("path" = /obj/item/organ/external/chest/indestructible),
+ BP_GROIN = list("path" = /obj/item/organ/external/groin/indestructible),
+ BP_HEAD = list("path" = /obj/item/organ/external/head/indestructible),
+ BP_L_ARM = list("path" = /obj/item/organ/external/arm/indestructible),
+ BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/indestructible),
+ BP_L_LEG = list("path" = /obj/item/organ/external/leg/indestructible),
+ BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/indestructible),
+ BP_L_HAND = list("path" = /obj/item/organ/external/hand/indestructible),
+ BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/indestructible),
+ BP_L_FOOT = list("path" = /obj/item/organ/external/foot/indestructible),
+ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/indestructible)
+ )
+ return
+
+/datum/species/event1/proc/choose_limbset()
+ var/list/limb_sets = list("Normal" = 1, "Unbreakable" = 2, "Unseverable" = 3, "Indestructible" = 4)
+ var/choice = input("Choose limb set to use for future spawns.", "Limb types.") as null|anything in limb_sets
+ set_limbset(limb_sets[choice])
+ return limb_sets[choice]
+
+/datum/species/event1/proc/toggle_thermal()
+ vision_flags ^= SEE_MOBS
+
+/datum/species/event1/proc/toggle_meson()
+ vision_flags ^= SEE_TURFS
+
+/datum/species/event1/proc/toggle_material()
+ vision_flags ^= SEE_OBJS
+
+/datum/species/event1/proc/toggle_infection()
+ flags ^= NO_INFECT
+
+/datum/species/event1/proc/toggle_noslip()
+ flags ^= NO_SLIP
+
+/datum/species/event1/proc/toggle_cloning()
+ flags ^= NO_SCAN
+
+/datum/species/event1/proc/toggle_pain()
+ flags ^= NO_PAIN
+
+/datum/species/event1/proc/toggle_embedding()
+ flags ^= NO_EMBED
+
+/datum/species/event1/proc/toggle_plant() //Maybe it's a distant cousin of the Venus Fly Trap.
+ flags ^= IS_PLANT
+
+/datum/species/event1/get_bodytype(var/mob/living/carbon/human/H) //Default to human sprites, if they're based on another species, var edit use_bodyshape to the correct thing in _defines/mobs.dm of the species you want to use.
+ return use_bodyshape
+
+/datum/species/event1/can_breathe_water()
+ return waterbreathing
+
+/datum/species/event1/can_overcome_gravity(var/mob/living/carbon/human/H)
+ return overcome_gravity
+
+/datum/species/event1/can_fall(var/mob/living/carbon/human/H)
+ return hover
diff --git a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
index 5d81bb4c9c..d0f40f693d 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
@@ -25,6 +25,8 @@
genders = list(NEUTER)
+ assisted_langs = list()
+
/datum/species/shadow/handle_death(var/mob/living/carbon/human/H)
spawn(1)
new /obj/effect/decal/cleanable/ash(H.loc)
diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
index 9fab4751cc..525a611882 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
@@ -7,6 +7,7 @@
language = LANGUAGE_GALCOM
species_language = LANGUAGE_VOX
num_alternate_languages = 1
+ assisted_langs = list(LANGUAGE_ROOTGLOBAL)
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong)
rarity_value = 4
blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \
@@ -71,6 +72,7 @@
has_organ = list(
O_HEART = /obj/item/organ/internal/heart/vox,
O_LUNGS = /obj/item/organ/internal/lungs/vox,
+ O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver/vox,
O_KIDNEYS = /obj/item/organ/internal/kidneys/vox,
O_BRAIN = /obj/item/organ/internal/brain/vox,
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index bddbf7b982..38d566d430 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -52,13 +52,17 @@
// Language/culture vars.
var/default_language = LANGUAGE_GALCOM // Default language is used when 'say' is used without modifiers.
var/language = LANGUAGE_GALCOM // Default racial language, if any.
- var/species_language = LANGUAGE_GALCOM // Used on the Character Setup screen
+ var/list/species_language = list(LANGUAGE_GALCOM) // Used on the Character Setup screen
var/list/secondary_langs = list() // The names of secondary languages that are available to this species.
- var/list/speech_sounds // A list of sounds to potentially play when speaking.
- var/list/speech_chance // The likelihood of a speech sound playing.
+ var/list/speech_sounds = list() // A list of sounds to potentially play when speaking.
+ var/list/speech_chance = list() // The likelihood of a speech sound playing.
var/num_alternate_languages = 0 // How many secondary languages are available to select at character creation
var/name_language = LANGUAGE_GALCOM // The language to use when determining names for this species, or null to use the first name/last name generator
+ // The languages the species can't speak without an assisted organ.
+ // This list is a guess at things that no one other than the parent species should be able to speak
+ var/list/assisted_langs = list(LANGUAGE_EAL, LANGUAGE_TERMINUS, LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
+
//Soundy emotey things.
var/scream_verb = "screams"
var/male_scream_sound //= 'sound/goonstation/voice/male_scream.ogg' Removed due to licensing, replace!
@@ -75,13 +79,14 @@
/datum/unarmed_attack/bite
)
var/list/unarmed_attacks = null // For empty hand harm-intent attack
- var/brute_mod = 1 // Physical damage multiplier.
- var/burn_mod = 1 // Burn damage multiplier.
- var/oxy_mod = 1 // Oxyloss modifier
- var/toxins_mod = 1 // Toxloss modifier
- var/radiation_mod = 1 // Radiation modifier
- var/flash_mod = 1 // Stun from blindness modifier.
- var/chemOD_mod = 1 // Damage modifier for overdose
+ var/brute_mod = 1 // Physical damage multiplier.
+ var/burn_mod = 1 // Burn damage multiplier.
+ var/oxy_mod = 1 // Oxyloss modifier
+ var/toxins_mod = 1 // Toxloss modifier
+ var/radiation_mod = 1 // Radiation modifier
+ var/flash_mod = 1 // Stun from blindness modifier.
+ var/sound_mod = 1 // Stun from sounds, I.E. flashbangs.
+ var/chemOD_mod = 1 // Damage modifier for overdose
var/vision_flags = SEE_SELF // Same flags as glasses.
// Death vars.
@@ -152,7 +157,7 @@
var/health_hud_intensity = 1 // This modifies how intensely the health hud is colored.
// Body/form vars.
- var/list/inherent_verbs // Species-specific verbs.
+ var/list/inherent_verbs = list() // Species-specific verbs.
var/has_fine_manipulation = 1 // Can use small items.
var/siemens_coefficient = 1 // The lower, the thicker the skin and better the insulation.
var/darksight = 2 // Native darksight distance.
@@ -182,6 +187,7 @@
var/list/has_organ = list( // which required-organ checks are conducted.
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
+ O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
@@ -189,6 +195,7 @@
O_EYES = /obj/item/organ/internal/eyes
)
var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them.
+ var/dispersed_eyes // If set, the species will be affected by flashbangs regardless if they have eyes or not, as they see in large areas.
var/list/has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm
index 9ec7a2b005..3b09166813 100644
--- a/code/modules/mob/living/carbon/human/species/station/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/station/golem.dm
@@ -11,6 +11,8 @@
spawn_flags = SPECIES_IS_RESTRICTED
siemens_coefficient = 0
+ assisted_langs = list()
+
breath_type = null
poison_type = null
diff --git a/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm
index 180732b0aa..56b5c36035 100644
--- a/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm
+++ b/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm
@@ -45,6 +45,7 @@
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
+ O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
index 94b38d10d9..0c2fbc0ac3 100644
--- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
@@ -5,7 +5,11 @@ var/datum/species/shapeshifter/promethean/prometheans
name = SPECIES_PROMETHEAN
name_plural = "Prometheans"
- blurb = "What has Science done?"
+ blurb = "Prometheans (Macrolimus artificialis) are a species of artificially-created gelatinous humanoids, \
+ chiefly characterized by their primarily liquid bodies and ability to change their bodily shape and color in order to \
+ mimic many forms of life. Derived from the Aetolian giant slime (Macrolimus vulgaris) inhabiting the warm, tropical planet \
+ of Aetolus, they are a relatively new lab-created sapient species, and as such many things about them have yet to be comprehensively studied. \
+ What has Science done?"
show_ssd = "totally quiescent"
death_message = "rapidly loses cohesion, splattering across the ground..."
knockout_message = "collapses inwards, forming a disordered puddle of goo."
@@ -26,6 +30,7 @@ var/datum/species/shapeshifter/promethean/prometheans
health_hud_intensity = 2
num_alternate_languages = 3
species_language = LANGUAGE_SOL_COMMON
+ assisted_langs = list(LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) // Prometheans are weird, let's just assume they can use basically any language.
breath_type = null
poison_type = null
@@ -46,6 +51,8 @@ var/datum/species/shapeshifter/promethean/prometheans
brute_mod = 0.75
burn_mod = 2
oxy_mod = 0
+ flash_mod = 0.5 //No centralized, lensed eyes.
+ item_slowdown_mod = 1.33
cloning_modifier = /datum/modifier/cloning_sickness/promethean
@@ -66,6 +73,9 @@ var/datum/species/shapeshifter/promethean/prometheans
unarmed_types = list(/datum/unarmed_attack/slime_glomp)
has_organ = list(O_BRAIN = /obj/item/organ/internal/brain/slime) // Slime core.
+
+ dispersed_eyes = TRUE
+
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest/unbreakable/slime),
BP_GROIN = list("path" = /obj/item/organ/external/groin/unbreakable/slime),
@@ -143,22 +153,37 @@ var/datum/species/shapeshifter/promethean/prometheans
var/turf/T = H.loc
if(istype(T))
var/obj/effect/decal/cleanable/C = locate() in T
- if(C)
- if(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)))
- return
+ if(C && !(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET))))
qdel(C)
if (istype(T, /turf/simulated))
var/turf/simulated/S = T
S.dirt = 0
- H.nutrition += rand(15, 45)
+ H.nutrition = min(500, max(0, H.nutrition + rand(15, 30)))
// Heal remaining damage.
if(H.fire_stacks >= 0)
if(H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss())
- H.adjustBruteLoss(-heal_rate)
- H.adjustFireLoss(-heal_rate)
- H.adjustOxyLoss(-heal_rate)
- H.adjustToxLoss(-heal_rate)
+ var/nutrition_cost = 0
+ var/nutrition_debt = H.getBruteLoss()
+ var/starve_mod = 1
+ if(H.nutrition <= 25)
+ starve_mod = 0.75
+ H.adjustBruteLoss(-heal_rate * starve_mod)
+ nutrition_cost += nutrition_debt - H.getBruteLoss()
+
+ nutrition_debt = H.getFireLoss()
+ H.adjustFireLoss(-heal_rate * starve_mod)
+ nutrition_cost += nutrition_debt - H.getFireLoss()
+
+ nutrition_debt = H.getOxyLoss()
+ H.adjustOxyLoss(-heal_rate * starve_mod)
+ nutrition_cost += nutrition_debt - H.getOxyLoss()
+
+ nutrition_debt = H.getToxLoss()
+ H.adjustToxLoss(-heal_rate * starve_mod)
+ nutrition_cost += nutrition_debt - H.getToxLoss()
+ H.nutrition -= (2 * nutrition_cost) //Costs Nutrition when damage is being repaired, corresponding to the amount of damage being repaired.
+ H.nutrition = max(0, H.nutrition) //Ensure it's not below 0.
else
H.adjustToxLoss(2*heal_rate) // Doubled because 0.5 is miniscule, and fire_stacks are capped in both directions
diff --git a/code/modules/mob/living/carbon/human/species/station/seromi.dm b/code/modules/mob/living/carbon/human/species/station/seromi.dm
index 1d1c0036be..81deb462a6 100644
--- a/code/modules/mob/living/carbon/human/species/station/seromi.dm
+++ b/code/modules/mob/living/carbon/human/species/station/seromi.dm
@@ -104,6 +104,7 @@
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
+ O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index f605529211..5d95a63285 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -12,6 +12,7 @@
species_language = LANGUAGE_SOL_COMMON
secondary_langs = list(LANGUAGE_SOL_COMMON, LANGUAGE_TERMINUS)
name_language = null // Use the first-name last-name generator rather than a language scrambler
+ assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
min_age = 17
max_age = 130
@@ -23,6 +24,9 @@
spawn_flags = SPECIES_CAN_JOIN
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR
+ inherent_verbs = list(
+ /mob/living/carbon/human/proc/tie_hair)
+
/datum/species/human/get_bodytype(var/mob/living/carbon/human/H)
return SPECIES_HUMAN
@@ -154,7 +158,7 @@
metabolic_rate = 1.1
gluttonous = 1
num_alternate_languages = 3
- secondary_langs = list(LANGUAGE_SIIK, LANGUAGE_AKHANI)
+ secondary_langs = list(LANGUAGE_SIIK, LANGUAGE_AKHANI, LANGUAGE_ALAI)
name_language = LANGUAGE_SIIK
species_language = LANGUAGE_SIIK
health_hud_intensity = 2.5
@@ -212,6 +216,7 @@
has_organ = list( //No appendix.
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
+ O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
@@ -238,6 +243,7 @@
secondary_langs = list(LANGUAGE_SKRELLIAN, LANGUAGE_SCHECHI)
name_language = LANGUAGE_SKRELLIAN
species_language = LANGUAGE_SKRELLIAN
+ assisted_langs = list(LANGUAGE_EAL, LANGUAGE_TERMINUS, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
health_hud_intensity = 2
water_movement = -3
@@ -312,13 +318,14 @@
hud_type = /datum/hud_data/diona
siemens_coefficient = 0.3
show_ssd = "completely quiescent"
- num_alternate_languages = 2
- secondary_langs = list(LANGUAGE_ROOTGLOBAL)
- name_language = LANGUAGE_ROOTLOCAL
- species_language = LANGUAGE_ROOTLOCAL
health_hud_intensity = 2.5
item_slowdown_mod = 0.25
+ num_alternate_languages = 2
+ name_language = LANGUAGE_ROOTLOCAL
+ species_language = LANGUAGE_ROOTLOCAL
+ secondary_langs = list(LANGUAGE_ROOTGLOBAL)
+ assisted_langs = list(LANGUAGE_VOX) // Diona are weird, let's just assume they can use basically any language.
min_age = 1
max_age = 300
diff --git a/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm b/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm
index 0b9c5490eb..f3115474dc 100644
--- a/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm
+++ b/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm
@@ -16,6 +16,8 @@
speech_bubble_appearance = "cyber"
+ assisted_langs = list()
+
male_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
female_cough_sounds = list('sound/effects/mob_effects/f_cougha.ogg','sound/effects/mob_effects/f_coughb.ogg')
male_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg'
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
index d851c40255..1d2ce59307 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
@@ -5,6 +5,7 @@
default_language = "Xenomorph"
language = "Hivemind"
+ assisted_langs = list()
unarmed_types = list(/datum/unarmed_attack/claws/strong/xeno, /datum/unarmed_attack/bite/strong/xeno)
hud_type = /datum/hud_data/alien
rarity_value = 3
diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm
index 82ca192181..3029cdbf8f 100644
--- a/code/modules/mob/living/carbon/human/stripping.dm
+++ b/code/modules/mob/living/carbon/human/stripping.dm
@@ -33,7 +33,7 @@
return
if("tie")
var/obj/item/clothing/under/suit = w_uniform
- if(!istype(suit) || !suit.accessories.len)
+ if(!istype(suit) || !LAZYLEN(suit.accessories))
return
var/obj/item/clothing/accessory/A = suit.accessories[1]
if(!istype(A))
diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm
index a7f80fb8f1..6ec4ce2954 100644
--- a/code/modules/mob/living/carbon/human/unarmed_attack.dm
+++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm
@@ -113,6 +113,8 @@ var/global/list/sparring_attack_cache = list()
sharp = 0
edge = 0
+/datum/unarmed_attack/bite/event1
+
/datum/unarmed_attack/bite/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
if (user.is_muzzled())
@@ -128,6 +130,8 @@ var/global/list/sparring_attack_cache = list()
eye_attack_text_victim = "digits"
damage = 0
+/datum/unarmed_attack/punch/event1
+
/datum/unarmed_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
var/obj/item/organ/external/affecting = target.get_organ(zone)
var/organ = affecting.name
@@ -179,6 +183,8 @@ var/global/list/sparring_attack_cache = list()
attack_sound = "swing_hit"
damage = 0
+/datum/unarmed_attack/kick/event1
+
/datum/unarmed_attack/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
if (user.legcuffed)
return 0
@@ -220,6 +226,8 @@ var/global/list/sparring_attack_cache = list()
attack_sound = "swing_hit"
damage = 0
+/datum/unarmed_attack/stomp/event1
+
/datum/unarmed_attack/stomp/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
if (user.legcuffed)
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 806f14aa6b..30aa8f709c 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -711,7 +711,14 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(!wear_suit)
return //No point, no suit.
- overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = INV_SUIT_DEF_ICON, default_layer = SUIT_LAYER)
+ // Part of splitting the suit sprites up
+ var/iconFile = INV_SUIT_DEF_ICON
+ if(istype(wear_suit, /obj/item/clothing/suit))
+ var/obj/item/clothing/suit/S = wear_suit
+ if(S.update_icon_define)
+ iconFile = S.update_icon_define
+
+ overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = iconFile, default_layer = SUIT_LAYER)
apply_layer(SUIT_LAYER)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 3892f8310e..612765a776 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -866,6 +866,15 @@ default behaviour is:
to_chat(src, "You are now [resting ? "resting" : "getting up"]")
update_canmove()
+//called when the mob receives a bright flash
+/mob/living/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash)
+ if(override_blindness_check || !(disabilities & BLIND))
+ overlay_fullscreen("flash", type)
+ spawn(25)
+ if(src)
+ clear_fullscreen("flash", 25)
+ return 1
+
/mob/living/proc/cannot_use_vents()
if(mob_size > MOB_SMALL)
return "You can't fit into that vent."
@@ -1015,7 +1024,7 @@ default behaviour is:
if(lying != lying_prev)
lying_prev = lying
update_transform()
-
+
return canmove
// Adds overlays for specific modifiers.
@@ -1065,6 +1074,9 @@ default behaviour is:
var/list/colors_to_blend = list()
for(var/datum/modifier/M in modifiers)
if(!isnull(M.client_color))
+ if(islist(M.client_color)) //It's a color matrix! Forget it. Just use that one.
+ animate(client, color = M.client_color, time = 10)
+ return
colors_to_blend += M.client_color
if(colors_to_blend.len)
@@ -1101,6 +1113,13 @@ default behaviour is:
else
hud_used.l_hand_hud_object.icon_state = "l_hand_inactive"
hud_used.r_hand_hud_object.icon_state = "r_hand_active"
+
+ // We just swapped hands, so the thing in our inactive hand will notice it's not the focus
+ var/obj/item/I = get_inactive_hand()
+ if(I)
+ if(I.zoom)
+ I.zoom()
+ I.in_inactive_hand(src) //This'll do specific things, determined by the item
return
/mob/living/proc/activate_hand(var/selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand.
@@ -1195,3 +1214,11 @@ default behaviour is:
/mob/living/proc/make_hud_overlays()
return
+
+
+/mob/living/proc/has_vision()
+ return !(eye_blind || (disabilities & BLIND) || stat || blinded)
+
+
+/mob/living/proc/dirties_floor() // If we ever decide to add fancy conditionals for making dirty floors (floating, etc), here's the proc.
+ return makes_dirt
\ No newline at end of file
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 3d9140dd46..08bebc91b2 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -380,8 +380,13 @@
var/turf/location = get_turf(src)
location.hotspot_expose(fire_burn_temperature(), 50, 1)
-/mob/living/fire_act()
- adjust_fire_stacks(2)
+//altered this to cap at the temperature of the fire causing it, using the same 1:1500 value as /mob/living/carbon/human/handle_fire() in human/life.dm
+/mob/living/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature)
+ if(fire_stacks < exposed_temperature/1500) // Subject to balance
+ adjust_fire_stacks(2)
+ else
+ adjust_fire_stacks(2)
IgniteMob()
//Share fire evenly between the two mobs
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 9739e596b8..1ee86da6ef 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -16,7 +16,6 @@
var/brainloss = 0 //'Retardation' damage caused by someone hitting you in the head with a bible or being infected with brainrot.
var/halloss = 0 //Hallucination damage. 'Fake' damage obtained through hallucinating or the holodeck. Sleeping should cause it to wear off.
-
var/hallucination = 0 //Directly affects how long a mob will hallucinate for
var/list/atom/hallucinations = list() //A list of hallucinated people that try to attack the mob. See /obj/effect/fake_attacker in hallucinations.dm
@@ -59,3 +58,5 @@
var/list/hud_list //Holder for health hud, status hud, wanted hud, etc (not like inventory slots)
var/has_huds = FALSE //Whether or not we should bother initializing the above list
+
+ var/makes_dirt = TRUE //FALSE if the mob shouldn't be making dirt on the ground when it walks
\ No newline at end of file
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 9a22e3b816..be2bdf7887 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -265,14 +265,14 @@ proc/get_radio_key_from_channel(var/channel)
//Handle nonverbal and sign languages here
if (speaking)
- if (speaking.flags & NONVERBAL)
- if (prob(30))
- src.custom_emote(1, "[pick(speaking.signlang_verb)].")
-
if (speaking.flags & SIGNLANG)
log_say("(SIGN) [message]", src)
return say_signlang(message, pick(speaking.signlang_verb), speaking)
+ if (speaking.flags & NONVERBAL)
+ if (prob(30))
+ src.custom_emote(1, "[pick(speaking.signlang_verb)].")
+
//These will contain the main receivers of the message
var/list/listening = list()
var/list/listening_obj = list()
@@ -371,11 +371,19 @@ proc/get_radio_key_from_channel(var/channel)
return 1
/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language)
- var/list/potentials = get_mobs_and_objs_in_view_fast(src, world.view)
- var/list/mobs = potentials["mobs"]
- for(var/hearer in mobs)
- var/mob/M = hearer
- M.hear_signlang(message, verb, language, src)
+ var/turf/T = get_turf(src)
+ //We're in something, gesture to people inside the same thing
+ if(loc != T)
+ for(var/mob/M in loc)
+ M.hear_signlang(message, verb, language, src)
+
+ //We're on a turf, gesture to visible as if we were a normal language
+ else
+ var/list/potentials = get_mobs_and_objs_in_view_fast(T, world.view)
+ var/list/mobs = potentials["mobs"]
+ for(var/hearer in mobs)
+ var/mob/M = hearer
+ M.hear_signlang(message, verb, language, src)
return 1
/obj/effect/speech_bubble
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 2b11059ff9..c35fdcbf2a 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -1,7 +1,6 @@
#define AI_CHECK_WIRELESS 1
#define AI_CHECK_RADIO 2
-var/list/ai_list = list()
var/list/ai_verbs_default = list(
// /mob/living/silicon/ai/proc/ai_recall_shuttle,
/mob/living/silicon/ai/proc/ai_emergency_message,
@@ -65,6 +64,7 @@ var/list/ai_verbs_default = list(
var/datum/announcement/priority/announcement
var/obj/machinery/ai_powersupply/psupply = null // Backwards reference to AI's powersupply object.
var/hologram_follow = 1 //This is used for the AI eye, to determine if a holopad's hologram should follow it or not.
+ var/is_dummy = 0 //Used to prevent dummy AIs from spawning with communicators.
//NEWMALF VARIABLES
var/malfunctioning = 0 // Master var that determines if AI is malfunctioning.
var/datum/malf_hardware/hardware = null // Installed piece of hardware.
@@ -112,15 +112,16 @@ var/list/ai_verbs_default = list(
possibleNames -= pickedName
pickedName = null
- aiPDA = new/obj/item/device/pda/ai(src)
+ if(!is_dummy)
+ aiPDA = new/obj/item/device/pda/ai(src)
SetName(pickedName)
anchored = 1
canmove = 0
density = 1
loc = loc
- aiCommunicator = new /obj/item/device/communicator/integrated(src)
-
+ if(!is_dummy)
+ aiCommunicator = new /obj/item/device/communicator/integrated(src)
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
@@ -685,7 +686,10 @@ var/list/ai_verbs_default = list(
var/obj/item/device/aicard/card = W
card.grab_ai(src, user)
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
+ if(user == controlling_drone)
+ to_chat(user, "The drone's subsystems resist your efforts to tamper with your bolts.")
+ return
if(anchored)
playsound(src, W.usesound, 50, 1)
user.visible_message("\The [user] starts to unbolt \the [src] from the plating...")
@@ -789,5 +793,20 @@ var/list/ai_verbs_default = list(
// If that is ever fixed please update this proc.
return TRUE
+//Special subtype kept around for global announcements
+/mob/living/silicon/ai/announcer/
+ is_dummy = 1
+
+/mob/living/silicon/ai/announcer/initialize()
+ . = ..()
+ mob_list -= src
+ living_mob_list -= src
+ dead_mob_list -= src
+ ai_list -= src
+ silicon_mob_list -= src
+
+/mob/living/silicon/ai/announcer/Life()
+ return
+
#undef AI_CHECK_WIRELESS
#undef AI_CHECK_RADIO
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 0c33834db7..3bcbd7057b 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -3,12 +3,16 @@
if(stat == DEAD)
return
+ if(controlling_drone)
+ controlling_drone.release_ai_control("WARNING: Primary control loop failure. Session terminated.")
+ . = ..(gibbed)
+
if(src.eyeobj)
src.eyeobj.setLoc(get_turf(src))
remove_ai_verbs(src)
- for(var/obj/machinery/ai_status_display/O in world)
+ for(var/obj/machinery/ai_status_display/O in machines)
spawn( 0 )
O.mode = 2
if (istype(loc, /obj/item/device/aicard))
diff --git a/code/modules/mob/living/silicon/ai/icons.dm b/code/modules/mob/living/silicon/ai/icons.dm
index 2d8bc0d002..c9891f9ae8 100644
--- a/code/modules/mob/living/silicon/ai/icons.dm
+++ b/code/modules/mob/living/silicon/ai/icons.dm
@@ -84,6 +84,7 @@ var/list/datum/ai_icon/ai_icons
/datum/ai_icon/glitchman
name = "Glitchman"
alive_icon = "ai-glitchman"
+ dead_icon = "ai-glitchman-crash"
/datum/ai_icon/goon
name = "Goon"
@@ -110,6 +111,7 @@ var/list/datum/ai_icon/ai_icons
name = "Inverted"
alive_icon = "ai-u"
alive_light = "#81DDFF"
+ dead_icon = "ai-u-crash"
/datum/ai_icon/lonestar
name = "Lonestar"
@@ -163,14 +165,87 @@ var/list/datum/ai_icon/ai_icons
/datum/ai_icon/trapped
name = "Trapped"
alive_icon = "ai-hades"
- dead_icon = "ai-hades_dead"
+ dead_icon = "ai-hades-crash"
-/datum/ai_icon/triumvirate_static
+/datum/ai_icon/triumvirate
name = "Triumvirate"
alive_icon = "ai-triumvirate"
alive_light = "#020B2B"
/datum/ai_icon/triumvirate_static
name = "Triumvirate Static"
- alive_icon = "ai-static"
+ alive_icon = "ai-triumvirate-malf"
alive_light = "#020B2B"
+
+//Eros Research Platform Ports
+
+/datum/ai_icon/clown2
+ name = "Honk"
+ alive_icon = "ai-clown2"
+ dead_icon = "ai-clown2-crash"
+
+/datum/ai_icon/boxfort
+ name = "Boxfort"
+ alive_icon = "ai-boxfort"
+ dead_icon = "ai-boxfort_dead"
+
+/datum/ai_icon/ravensdale
+ name = "Integration"
+ alive_icon = "ai-ravensdale"
+ dead_icon = "ai-ravensdale-crash"
+
+/datum/ai_icon/gentoo
+ name = "Gentoo"
+ alive_icon = "ai-gentoo"
+ dead_icon = "ai-gentoo_dead"
+
+/datum/ai_icon/serithi
+ name = "Mechanicus"
+ alive_icon = "ai-serithi"
+ dead_icon = "ai-serithi-crash"
+
+/datum/ai_icon/alien
+ name = "Xenomorph"
+ alive_icon = "ai-alien"
+ dead_icon = "ai-alien-crash"
+
+/datum/ai_icon/syndicat
+ name = "Syndi-cat"
+ alive_icon = "ai-syndicatmeow"
+
+/datum/ai_icon/wasp
+ name = "Wasp"
+ alive_icon = "ai-wasp"
+
+/datum/ai_icon/house
+ name = "Doctor"
+ alive_icon = "ai-house"
+
+/datum/ai_icon/fabulous
+ name = "Fabulous"
+ alive_icon = "ai-fabulous"
+
+/datum/ai_icon/yesman
+ name = "Yes Man"
+ alive_icon = "ai-yes-man"
+ dead_icon = "ai-alien-crash"
+
+/datum/ai_icon/royal
+ name = "Royal"
+ alive_icon = "ai-royal"
+
+/datum/ai_icon/pirate
+ name = "Pirate"
+ alive_icon = "ai-pirate"
+
+/datum/ai_icon/gygas
+ name = "Love"
+ alive_icon = "ai-gygas"
+
+/datum/ai_icon/xerxes
+ name = "Xerxes"
+ alive_icon = "ai-xerxes"
+
+/datum/ai_icon/godfrey
+ name = "Godfrey"
+ alive_icon = "ai-godfrey"
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 413cf49250..c8e7dfdada 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -8,6 +8,8 @@
if (src.stat!=CONSCIOUS)
src.cameraFollow = null
src.reset_view(null)
+ if(controlling_drone)
+ controlling_drone.release_ai_control("WARNING: Primary control loop failure. Session terminated.")
src.updatehealth()
diff --git a/code/modules/mob/living/silicon/ai/logout.dm b/code/modules/mob/living/silicon/ai/logout.dm
index 09bc93bf34..25921ef960 100644
--- a/code/modules/mob/living/silicon/ai/logout.dm
+++ b/code/modules/mob/living/silicon/ai/logout.dm
@@ -1,6 +1,6 @@
/mob/living/silicon/ai/Logout()
..()
- for(var/obj/machinery/ai_status_display/O in world) //change status
+ for(var/obj/machinery/ai_status_display/O in machines) //change status
O.mode = 0
if(!isturf(loc))
if (client)
diff --git a/code/modules/mob/living/silicon/decoy/death.dm b/code/modules/mob/living/silicon/decoy/death.dm
index b94a311ef7..759b958bc2 100644
--- a/code/modules/mob/living/silicon/decoy/death.dm
+++ b/code/modules/mob/living/silicon/decoy/death.dm
@@ -3,6 +3,6 @@
icon_state = "ai-crash"
spawn(10)
explosion(loc, 3, 6, 12, 15)
- for(var/obj/machinery/ai_status_display/O in world) //change status
+ for(var/obj/machinery/ai_status_display/O in machines) //change status
O.mode = 2
return ..(gibbed)
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 5ed6fde8ae..168b031f5c 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -1,12 +1,14 @@
/mob/living/silicon/pai
name = "pAI"
icon = 'icons/mob/pai.dmi'
- icon_state = "repairbot"
+ icon_state = "pai-repairbot"
emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person)
pass_flags = 1
mob_size = MOB_SMALL
+ holder_type = /obj/item/weapon/holder/pai
+
can_pull_size = ITEMSIZE_SMALL
can_pull_mobs = MOB_PULL_SMALLER
@@ -23,16 +25,16 @@
var/obj/item/device/radio/radio // Our primary radio
var/obj/item/device/communicator/integrated/communicator // Our integrated communicator.
- var/chassis = "repairbot" // A record of your chosen chassis.
+ var/chassis = "pai-repairbot" // A record of your chosen chassis.
var/global/list/possible_chassis = list(
- "Drone" = "repairbot",
- "Cat" = "cat",
- "Mouse" = "mouse",
- "Monkey" = "monkey",
- "Corgi" = "borgi",
- "Fox" = "fox",
- "Parrot" = "parrot",
- "Rabbit" = "rabbit"
+ "Drone" = "pai-repairbot",
+ "Cat" = "pai-cat",
+ "Mouse" = "pai-mouse",
+ "Monkey" = "pai-monkey",
+ "Corgi" = "pai-borgi",
+ "Fox" = "pai-fox",
+ "Parrot" = "pai-parrot",
+ "Rabbit" = "pai-rabbit"
)
var/global/list/possible_say_verbs = list(
@@ -416,7 +418,8 @@
var/obj/item/weapon/holder/H = ..(grabber, self_drop)
if(!istype(H))
return
- H.icon_state = "pai-[icon_state]"
+
+ H.icon_state = "[chassis]"
grabber.update_inv_l_hand()
grabber.update_inv_r_hand()
return H
diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm
index ba6a4353bc..ac9d5b4f27 100644
--- a/code/modules/mob/living/silicon/pai/recruit.dm
+++ b/code/modules/mob/living/silicon/pai/recruit.dm
@@ -87,7 +87,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
if("submit")
if(candidate)
candidate.ready = 1
- for(var/obj/item/device/paicard/p in world)
+ for(var/obj/item/device/paicard/p in all_pai_cards)
if(p.looking_for_personality == 1)
p.alertUpdate()
usr << browse(null, "window=paiRecruit")
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index 472125cef9..ab2b0b53cd 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -126,6 +126,6 @@ var/global/list/default_pai_software = list()
else if(href_list["image"])
var/img = text2num(href_list["image"])
- if(1 <= img && img <= 9)
+ if(1 <= img && img <= (pai_emotions.len))
card.setEmotion(img)
return 1
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index 827387c5a4..dfecf96e6c 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -19,7 +19,7 @@ var/list/mob_hat_cache = list()
return mob_hat_cache[key]
/mob/living/silicon/robot/drone
- name = "drone"
+ name = "maintenance drone"
real_name = "drone"
icon = 'icons/mob/robots.dmi'
icon_state = "repairbot"
@@ -57,6 +57,8 @@ var/list/mob_hat_cache = list()
var/obj/item/hat
var/hat_x_offset = 0
var/hat_y_offset = -13
+ var/serial_number = 0
+ var/name_override = 0
holder_type = /obj/item/weapon/holder/drone
@@ -71,6 +73,7 @@ var/list/mob_hat_cache = list()
return FALSE
/mob/living/silicon/robot/drone/construction
+ name = "construction drone"
icon_state = "constructiondrone"
law_type = /datum/ai_laws/construction_drone
module_type = /obj/item/weapon/robot_module/drone/construction
@@ -96,6 +99,7 @@ var/list/mob_hat_cache = list()
remove_language("Robot Talk")
add_language("Robot Talk", 0)
add_language("Drone Talk", 1)
+ serial_number = rand(0,999)
//They are unable to be upgraded, so let's give them a bit of a better battery.
cell.maxcharge = 10000
@@ -111,6 +115,7 @@ var/list/mob_hat_cache = list()
verbs -= /mob/living/silicon/robot/verb/Namepick
updateicon()
+ updatename()
/mob/living/silicon/robot/drone/init()
aiCamera = new/obj/item/device/camera/siliconcam/drone_camera(src)
@@ -128,14 +133,22 @@ var/list/mob_hat_cache = list()
name = real_name
/mob/living/silicon/robot/drone/updatename()
- real_name = "maintenance drone ([rand(100,999)])"
+ if(name_override)
+ return
+ if(controlling_ai)
+ real_name = "remote drone ([controlling_ai])"
+ else
+ real_name = "[initial(name)] ([serial_number])"
name = real_name
/mob/living/silicon/robot/drone/updateicon()
overlays.Cut()
if(stat == 0)
- overlays += "eyes-[icon_state]"
+ if(controlling_ai)
+ overlays += "eyes-[icon_state]-ai"
+ else
+ overlays += "eyes-[icon_state]"
else
overlays -= "eyes"
if(hat) // Let the drones wear hats.
@@ -169,7 +182,7 @@ var/list/mob_hat_cache = list()
to_chat(user, "\The [src] is not compatible with \the [W].")
return
- else if (istype(W, /obj/item/weapon/crowbar))
+ else if (W.is_crowbar())
to_chat(user, "\The [src] is hermetically sealed. You can't open the case.")
return
@@ -187,9 +200,8 @@ var/list/mob_hat_cache = list()
user.visible_message("\The [user] swipes [TU.his] ID card through \the [src], attempting to reboot it.", ">You swipe your ID card through \the [src], attempting to reboot it.")
var/drones = 0
- for(var/mob/living/silicon/robot/drone/D in world)
- if(D.key && D.client)
- drones++
+ for(var/mob/living/silicon/robot/drone/D in player_list)
+ drones++
if(drones < config.max_maint_drones)
request_player()
return
@@ -215,15 +227,18 @@ var/list/mob_hat_cache = list()
return
if(emagged)
- to_chat(user, "\The [user] attempts to load subversive software into you, but your hacked subroutines ignore the attempt.")
+ to_chat(src, "\The [user] attempts to load subversive software into you, but your hacked subroutines ignore the attempt.")
to_chat(user, "You attempt to subvert [src], but the sequencer has no effect.")
return
to_chat(user, "You swipe the sequencer across [src]'s interface and watch its eyes flicker.")
- to_chat(user, "You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.")
- message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.")
- log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.")
+ if(controlling_ai)
+ to_chat(src, "\The [user] loads some kind of subversive software into the remote drone, corrupting its lawset but luckily sparing yours.")
+ else
+ to_chat(src, "You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.")
+
+ log_game("[key_name(user)] emagged drone [key_name(src)][controlling_ai ? " but AI [key_name(controlling_ai)] is in remote control" : " Laws overridden"].")
var/time = time2text(world.realtime,"hh:mm:ss")
lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])")
@@ -236,9 +251,10 @@ var/list/mob_hat_cache = list()
var/datum/gender/TU = gender_datums[user.get_visible_gender()]
set_zeroth_law("Only [user.real_name] and people [TU.he] designate[TU.s] as being such are operatives.")
- src << "Obey these laws:"
- laws.show_laws(src)
- src << "ALERT: [user.real_name] [TU.is] your new master. Obey your new laws and [TU.his] commands."
+ if(!controlling_ai)
+ to_chat(src, "Obey these laws:")
+ laws.show_laws(src)
+ to_chat(src, "ALERT: [user.real_name] is your new master. Obey your new laws and \his commands.")
return 1
//DRONE LIFE/DEATH
@@ -264,26 +280,41 @@ var/list/mob_hat_cache = list()
return
..()
+/mob/living/silicon/robot/drone/death(gibbed)
+ if(controlling_ai)
+ release_ai_control("WARNING: remote system failure. Connection timed out.")
+ . = ..(gibbed)
+
//DRONE MOVEMENT.
/mob/living/silicon/robot/drone/Process_Spaceslipping(var/prob_slip)
return 0
//CONSOLE PROCS
/mob/living/silicon/robot/drone/proc/law_resync()
+
+ if(controlling_ai)
+ to_chat(src, "Someone issues a remote law reset order for this unit, but you disregard it.")
+ return
+
if(stat != 2)
if(emagged)
- src << "You feel something attempting to modify your programming, but your hacked subroutines are unaffected."
+ to_chat(src, "You feel something attempting to modify your programming, but your hacked subroutines are unaffected.")
else
- src << "A reset-to-factory directive packet filters through your data connection, and you obediently modify your programming to suit it."
+ to_chat(src, "A reset-to-factory directive packet filters through your data connection, and you obediently modify your programming to suit it.")
full_law_reset()
show_laws()
/mob/living/silicon/robot/drone/proc/shut_down()
+
+ if(controlling_ai && mind.special_role)
+ to_chat(src, "Someone issued a remote kill order for this unit, but you disregard it.")
+ return
+
if(stat != 2)
if(emagged)
- src << "You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you."
+ to_chat(src, "You feel a system kill order percolate through [controlling_ai ? "the drones" : "your"] tiny brain, but it doesn't seem like a good idea to [controlling_ai ? "it" : "you"].")
else
- src << "You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself."
+ to_chat(src, "You feel a system kill order percolate through [controlling_ai ? "the drones" : "your"] tiny brain, and [controlling_ai ? "it" : "you"] obediently destroy[controlling_ai ? "s itself" : " yourself"].")
death()
/mob/living/silicon/robot/drone/proc/full_law_reset()
@@ -292,6 +323,21 @@ var/list/mob_hat_cache = list()
clear_ion_laws(1)
laws = new law_type
+/mob/living/silicon/robot/drone/show_laws(var/everyone = 0)
+ if(!controlling_ai)
+ return..()
+ to_chat(src, "Obey these laws:")
+ controlling_ai.laws_sanity_check()
+ controlling_ai.laws.show_laws(src)
+
+/mob/living/silicon/robot/drone/robot_checklaws()
+ set category = "Silicon Commands"
+ set name = "State Laws"
+
+ if(!controlling_ai)
+ return ..()
+ controlling_ai.subsystem_law_manager()
+
//Reboot procs.
/mob/living/silicon/robot/drone/proc/request_player()
@@ -349,14 +395,6 @@ var/list/mob_hat_cache = list()
..()
flavor_text = "It's a bulky construction drone stamped with a Sol Central glyph."
-/mob/living/silicon/robot/drone/construction/updatename()
- real_name = "construction drone ([rand(100,999)])"
- name = real_name
-
/mob/living/silicon/robot/drone/mining/init()
..()
flavor_text = "It's a bulky mining drone stamped with a Grayson logo."
-
-/mob/living/silicon/robot/drone/mining/updatename()
- real_name = "mining drone ([rand(100,999)])"
- name = real_name
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm
index 8c12226e3d..113394811b 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm
@@ -26,7 +26,7 @@
var/dat
dat += "Maintenance Units "
- for(var/mob/living/silicon/robot/drone/D in world)
+ for(var/mob/living/silicon/robot/drone/D in mob_list)
if(D.z != src.z)
continue
dat += " [D.real_name] ([D.stat == 2 ? "INACTIVE" : "ACTIVE"])"
@@ -68,8 +68,8 @@
else if (href_list["ping"])
usr << "You issue a maintenance request for all active drones, highlighting [drone_call_area]."
- for(var/mob/living/silicon/robot/drone/D in world)
- if(D.client && D.stat == 0)
+ for(var/mob/living/silicon/robot/drone/D in player_list)
+ if(D.stat == 0)
D << "-- Maintenance drone presence requested in: [drone_call_area]."
else if (href_list["resync"])
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
index b0a7543e11..fdb9c09eb5 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
@@ -1,8 +1,7 @@
/proc/count_drones()
var/drones = 0
- for(var/mob/living/silicon/robot/drone/D in world)
- if(D.key && D.client)
- drones++
+ for(var/mob/living/silicon/robot/drone/D in player_list)
+ drones++
return drones
/obj/machinery/drone_fabricator
@@ -76,20 +75,22 @@
if(!produce_drones || !config.allow_drone_spawn || count_drones() >= config.max_maint_drones)
return
- if(!player || !istype(player.mob,/mob/observer/dead))
+ if(player && !istype(player.mob,/mob/observer/dead))
return
- announce_ghost_joinleave(player, 0, "They have taken control over a maintenance drone.")
visible_message("\The [src] churns and grinds as it lurches into motion, disgorging a shiny new drone after a few moments.")
flick("h_lathe_leave",src)
+ drone_progress = 0
time_last_drone = world.time
- if(player.mob && player.mob.mind) player.mob.mind.reset()
- var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src))
- new_drone.transfer_personality(player)
- new_drone.master_fabricator = src
- drone_progress = 0
+ var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src))
+ if(player)
+ announce_ghost_joinleave(player, 0, "They have taken control over a maintenance drone.")
+ if(player.mob && player.mob.mind) player.mob.mind.reset()
+ new_drone.transfer_personality(player)
+
+ return new_drone
/mob/observer/dead/verb/join_as_drone()
@@ -135,7 +136,7 @@
return
var/list/all_fabricators = list()
- for(var/obj/machinery/drone_fabricator/DF in world)
+ for(var/obj/machinery/drone_fabricator/DF in machines)
if(DF.stat & NOPOWER || !DF.produce_drones)
continue
if(DF.drone_progress >= 100)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm b/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm
new file mode 100644
index 0000000000..4980c24ca3
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm
@@ -0,0 +1,103 @@
+/mob/living/silicon/ai
+ var/mob/living/silicon/robot/drone/controlling_drone
+
+/mob/living/silicon/robot/drone
+ var/mob/living/silicon/ai/controlling_ai
+
+/mob/living/silicon/robot/drone/attack_ai(var/mob/living/silicon/ai/user)
+
+ if(!istype(user) || controlling_ai || !config.allow_drone_spawn || !config.allow_ai_drones)
+ return
+
+ if(client || key)
+ to_chat(user, "You cannot take control of an autonomous, active drone.")
+ return
+
+ if(health < -35 || emagged)
+ to_chat(user, "WARNING: connection timed out.")
+ return
+
+ user.controlling_drone = src
+ user.teleop = src
+ radio.channels = user.aiRadio.keyslot2.channels
+ controlling_ai = user
+ verbs += /mob/living/silicon/robot/drone/proc/release_ai_control_verb
+ local_transmit = FALSE
+ languages = controlling_ai.languages.Copy()
+ speech_synthesizer_langs = controlling_ai.speech_synthesizer_langs.Copy()
+ stat = CONSCIOUS
+ if(user.mind)
+ user.mind.transfer_to(src)
+ else
+ key = user.key
+ updatename()
+ to_chat(src, "You have shunted your primary control loop into \a [initial(name)]. Use the Release Control verb to return to your core.")
+
+/obj/machinery/drone_fabricator/attack_ai(var/mob/living/silicon/ai/user as mob)
+
+ if(!istype(user) || user.controlling_drone || !config.allow_drone_spawn || !config.allow_ai_drones)
+ return
+
+ if(stat & NOPOWER)
+ to_chat(user, "\The [src] is unpowered.")
+ return
+
+ if(!produce_drones)
+ to_chat(user, "\The [src] is disabled.")
+ return
+
+ if(drone_progress < 100)
+ to_chat(user, "\The [src] is not ready to produce a new drone.")
+ return
+
+ if(count_drones() >= config.max_maint_drones)
+ to_chat(user, "The drone control subsystems are tasked to capacity; they cannot support any more drones.")
+ return
+
+ var/mob/living/silicon/robot/drone/new_drone = create_drone()
+ user.controlling_drone = new_drone
+ user.teleop = new_drone
+ new_drone.radio.channels = user.aiRadio.keyslot2.channels
+ new_drone.controlling_ai = user
+ new_drone.verbs += /mob/living/silicon/robot/drone/proc/release_ai_control_verb
+ new_drone.local_transmit = FALSE
+ new_drone.languages = new_drone.controlling_ai.languages.Copy()
+ new_drone.speech_synthesizer_langs = new_drone.controlling_ai.speech_synthesizer_langs.Copy()
+
+ if(user.mind)
+ user.mind.transfer_to(new_drone)
+ else
+ new_drone.key = user.key
+ new_drone.updatename()
+
+ to_chat(new_drone, "You have shunted your primary control loop into \a [initial(new_drone.name)]. Use the Release Control verb to return to your core.")
+
+/mob/living/silicon/robot/drone/proc/release_ai_control_verb()
+ set name = "Release Control"
+ set desc = "Release control of a remote drone."
+ set category = "Silicon Commands"
+
+ release_ai_control("Remote session terminated.")
+
+/mob/living/silicon/robot/drone/proc/release_ai_control(var/message = "Connection terminated.")
+
+ if(controlling_ai)
+ if(mind)
+ mind.transfer_to(controlling_ai)
+ else
+ controlling_ai.key = key
+ to_chat(controlling_ai, "[message]")
+ controlling_ai.controlling_drone = null
+ controlling_ai.teleop = null
+ controlling_ai = null
+
+ radio.channels = module.channels
+ verbs -= /mob/living/silicon/robot/drone/proc/release_ai_control_verb
+ module.remove_languages(src) //Removes excess, adds 'default'.
+ remove_language("Robot Talk")
+ add_language("Robot Talk", 0)
+ add_language("Drone Talk", 1)
+ local_transmit = TRUE
+ full_law_reset()
+ updatename()
+ death()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 6c7b895385..1845ab5a4a 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -196,7 +196,7 @@
if(cell.charge > cell_amount)
// Spam Protection
if(prob(10))
- src << "Warning: Unauthorized access through power channel [rand(11,29)] detected!"
+ to_chat(src, "Warning: Unauthorized access through power channel [rand(11,29)] detected!")
cell.use(cell_amount)
return amount
return 0
@@ -227,7 +227,7 @@
mmi.brainmob.remove_language("Robot Talk")
mind.transfer_to(mmi.brainmob)
else
- src << "Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug."
+ to_chat(src, "Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug.")
ghostize()
//ERROR("A borg has been destroyed, but its MMI lacked a brainmob, so the mind could not be transferred. Player: [ckey].")
mmi = null
@@ -256,7 +256,7 @@
var/list/modules = list()
modules.Add(robot_module_types)
if((crisis && security_level == SEC_LEVEL_RED) || crisis_override) //Leaving this in until it's balanced appropriately.
- src << "Crisis mode active. Combat module available."
+ to_chat(src, "Crisis mode active. Combat module available.")
modules+="Combat"
modtype = input("Please, select a module!", "Robot module", null, null) as null|anything in modules
@@ -352,7 +352,7 @@
set name = "Toggle Lights"
lights_on = !lights_on
- usr << "You [lights_on ? "enable" : "disable"] your integrated light."
+ to_chat(usr, "You [lights_on ? "enable" : "disable"] your integrated light.")
handle_light()
/mob/living/silicon/robot/verb/self_diagnosis_verb()
@@ -360,11 +360,11 @@
set name = "Self Diagnosis"
if(!is_component_functioning("diagnosis unit"))
- src << "Your self-diagnosis component isn't functioning."
+ to_chat(src, "Your self-diagnosis component isn't functioning.")
var/datum/robot_component/CO = get_component("diagnosis unit")
if (!cell_use_power(CO.active_usage))
- src << "Low Power."
+ to_chat(src, "Low Power.")
var/dat = self_diagnosis()
src << browse(dat, "window=robotdiagnosis")
@@ -388,10 +388,10 @@
var/datum/robot_component/C = components[toggle]
if(C.toggled)
C.toggled = 0
- src << "You disable [C.name]."
+ to_chat(src, "You disable [C.name].")
else
C.toggled = 1
- src << "You enable [C.name]."
+ to_chat(src, "You enable [C.name].")
/mob/living/silicon/robot/verb/spark_plug() //So you can still sparkle on demand without violence.
set category = "Robot Commands"
@@ -462,7 +462,7 @@
C.brute_damage = WC.brute
C.electronics_damage = WC.burn
- usr << "You install the [W.name]."
+ to_chat(usr, "You install the [W.name].")
return
@@ -477,11 +477,11 @@
if (istype(W, /obj/item/weapon/weldingtool))
if (src == user)
- user << "You lack the reach to be able to repair yourself."
+ to_chat(user, "You lack the reach to be able to repair yourself.")
return
if (!getBruteLoss())
- user << "Nothing to fix here!"
+ to_chat(user, "Nothing to fix here!")
return
var/obj/item/weapon/weldingtool/WT = W
if (WT.remove_fuel(0))
@@ -492,12 +492,12 @@
for(var/mob/O in viewers(user, null))
O.show_message(text("[user] has fixed some of the dents on [src]!"), 1)
else
- user << "Need more welding fuel!"
+ to_chat(user, "Need more welding fuel!")
return
else if(istype(W, /obj/item/stack/cable_coil) && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
if (!getFireLoss())
- user << "Nothing to fix here!"
+ to_chat(user, "Nothing to fix here!")
return
var/obj/item/stack/cable_coil/coil = W
if (coil.use(1))
@@ -507,21 +507,21 @@
for(var/mob/O in viewers(user, null))
O.show_message(text("[user] has fixed some of the burnt wires on [src]!"), 1)
- else if (istype(W, /obj/item/weapon/crowbar)) // crowbar means open or close the cover
+ else if (W.is_crowbar()) // crowbar means open or close the cover
if(opened)
if(cell)
- user << "You close the cover."
+ to_chat(user, "You close the cover.")
opened = 0
updateicon()
else if(wiresexposed && wires.IsAllCut())
//Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob.
if(!mmi)
- user << "\The [src] has no brain to remove."
+ to_chat(user, "\The [src] has no brain to remove.")
return
- user << "You jam the crowbar into the robot and begin levering [mmi]."
+ to_chat(user, "You jam the crowbar into the robot and begin levering [mmi].")
sleep(30)
- user << "You damage some parts of the chassis, but eventually manage to rip out [mmi]!"
+ to_chat(user, "You damage some parts of the chassis, but eventually manage to rip out [mmi]!")
var/obj/item/robot_parts/robot_suit/C = new/obj/item/robot_parts/robot_suit(loc)
C.l_leg = new/obj/item/robot_parts/l_leg(C)
C.r_leg = new/obj/item/robot_parts/r_leg(C)
@@ -544,7 +544,7 @@
return
var/datum/robot_component/C = components[remove]
var/obj/item/robot_parts/robot_component/I = C.wrapped
- user << "You remove \the [I]."
+ to_chat(user, "You remove \the [I].")
if(istype(I))
I.brute = C.brute_damage
I.burn = C.electronics_damage
@@ -557,25 +557,25 @@
else
if(locked)
- user << "The cover is locked and cannot be opened."
+ to_chat(user, "The cover is locked and cannot be opened.")
else
- user << "You open the cover."
+ to_chat(user, "You open the cover.")
opened = 1
updateicon()
else if (istype(W, /obj/item/weapon/cell) && opened) // trying to put a cell inside
var/datum/robot_component/C = components["power cell"]
if(wiresexposed)
- user << "Close the panel first."
+ to_chat(user, "Close the panel first.")
else if(cell)
- user << "There is a power cell already installed."
+ to_chat(user, "There is a power cell already installed.")
else if(W.w_class != ITEMSIZE_NORMAL)
- user << "\The [W] is too [W.w_class < ITEMSIZE_NORMAL ? "small" : "large"] to fit here."
+ to_chat(user, "\The [W] is too [W.w_class < ITEMSIZE_NORMAL ? "small" : "large"] to fit here.")
else
user.drop_item()
W.loc = src
cell = W
- user << "You insert the power cell."
+ to_chat(user, "You insert the power cell.")
C.installed = 1
C.wrapped = W
@@ -584,59 +584,59 @@
C.brute_damage = 0
C.electronics_damage = 0
- else if (istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool))
+ else if (W.is_wirecutter() || istype(W, /obj/item/device/multitool))
if (wiresexposed)
wires.Interact(user)
else
- user << "You can't reach the wiring."
+ to_chat(user, "You can't reach the wiring.")
- else if(istype(W, /obj/item/weapon/screwdriver) && opened && !cell) // haxing
+ else if(W.is_screwdriver() && opened && !cell) // haxing
wiresexposed = !wiresexposed
- user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
+ to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]")
playsound(src, W.usesound, 50, 1)
updateicon()
- else if(istype(W, /obj/item/weapon/screwdriver) && opened && cell) // radio
+ else if(W.is_screwdriver() && opened && cell) // radio
if(radio)
radio.attackby(W,user)//Push it to the radio to let it handle everything
else
- user << "Unable to locate a radio."
+ to_chat(user, "Unable to locate a radio.")
updateicon()
else if(istype(W, /obj/item/device/encryptionkey/) && opened)
if(radio)//sanityyyyyy
radio.attackby(W,user)//GTFO, you have your own procs
else
- user << "Unable to locate a radio."
+ to_chat(user, "Unable to locate a radio.")
else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)||istype(W, /obj/item/weapon/card/robot)) // trying to unlock the interface with an ID card
if(emagged)//still allow them to open the cover
- user << "The interface seems slightly damaged"
+ to_chat(user, "The interface seems slightly damaged")
if(opened)
- user << "You must close the cover to swipe an ID card."
+ to_chat(user, "You must close the cover to swipe an ID card.")
else
if(allowed(usr))
locked = !locked
- user << "You [ locked ? "lock" : "unlock"] [src]'s interface."
+ to_chat(user, "You [ locked ? "lock" : "unlock"] [src]'s interface.")
updateicon()
else
- user << "Access denied."
+ to_chat(user, "Access denied.")
else if(istype(W, /obj/item/borg/upgrade/))
var/obj/item/borg/upgrade/U = W
if(!opened)
- usr << "You must access the borgs internals!"
+ to_chat(usr, "You must access the borgs internals!")
else if(!src.module && U.require_module)
- usr << "The borg must choose a module before it can be upgraded!"
+ to_chat(usr, "The borg must choose a module before it can be upgraded!")
else if(U.locked)
- usr << "The upgrade is locked and cannot be used yet!"
+ to_chat(usr, "The upgrade is locked and cannot be used yet!")
else
if(U.action(src))
- usr << "You apply the upgrade to [src]!"
+ to_chat(usr, "You apply the upgrade to [src]!")
usr.drop_item()
U.loc = src
else
- usr << "Upgrade error!"
+ to_chat(usr, "Upgrade error!")
else
@@ -661,7 +661,7 @@
cell.update_icon()
cell.add_fingerprint(user)
user.put_in_active_hand(cell)
- user << "You remove \the [cell]."
+ to_chat(user, "You remove \the [cell].")
cell = null
cell_component.wrapped = null
cell_component.installed = 0
@@ -669,7 +669,7 @@
else if(cell_component.installed == -1)
cell_component.installed = 0
var/obj/item/broken_device = cell_component.wrapped
- user << "You remove \the [broken_device]."
+ to_chat(user, "You remove \the [broken_device].")
user.put_in_active_hand(broken_device)
//Robots take half damage from basic attacks.
@@ -732,7 +732,7 @@
/mob/living/silicon/robot/proc/installed_modules()
if(weapon_lock)
- src << "Weapon lock active, unable to use modules! Count:[weaponlock_time]"
+ to_chat(src, "Weapon lock active, unable to use modules! Count:[weaponlock_time]")
return
if(!module)
@@ -795,7 +795,7 @@
return 1
if(activated(O))
- src << "Already activated"
+ to_chat(src, "Already activated")
return 1
if(!module_state_1)
module_state_1 = O
@@ -816,7 +816,7 @@
if(istype(module_state_3,/obj/item/borg/sight))
sight_mode |= module_state_3:sight_mode
else
- src << "You need to disable a module first!"
+ to_chat(src, "You need to disable a module first!")
installed_modules()
return 1
@@ -833,9 +833,9 @@
module_state_3 = null
contents -= O
else
- src << "Module isn't activated."
+ to_chat(src, "Module isn't activated.")
else
- src << "Module isn't activated"
+ to_chat(src, "Module isn't activated")
installed_modules()
return 1
return
@@ -948,7 +948,7 @@
/mob/living/silicon/robot/proc/choose_icon(var/triesleft, var/list/module_sprites)
if(!module_sprites.len)
- src << "Something is badly wrong with the sprite selection. Harass a coder."
+ to_chat(src, "Something is badly wrong with the sprite selection. Harass a coder.")
return
icon_selected = 0
@@ -970,7 +970,7 @@
icon_selected = 1
icon_selection_tries = 0
- src << "Your icon has been set. You now require a module reset to change it."
+ to_chat(src, "Your icon has been set. You now require a module reset to change it.")
/mob/living/silicon/robot/proc/sensor_mode() //Medical/Security HUD controller for borgs
set name = "Set Sensor Augmentation"
@@ -1042,20 +1042,20 @@
if(!opened)//Cover is closed
if(locked)
if(prob(90))
- user << "You emag the cover lock."
+ to_chat(user, "You emag the cover lock.")
locked = 0
else
- user << "You fail to emag the cover lock."
- src << "Hack attempt detected."
+ to_chat(user, "You fail to emag the cover lock.")
+ to_chat(src, "Hack attempt detected.")
return 1
else
- user << "The cover is already unlocked."
+ to_chat(user, "The cover is already unlocked.")
return
if(opened)//Cover is open
if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice
if(wiresexposed)
- user << "You must close the panel first"
+ to_chat(user, "You must close the panel first")
return
else
sleep(6)
@@ -1063,7 +1063,7 @@
emagged = 1
lawupdate = 0
disconnect_from_ai()
- user << "You emag [src]'s interface."
+ to_chat(user, "You emag [src]'s interface.")
message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.")
log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.")
clear_supplied_laws()
@@ -1075,26 +1075,26 @@
set_zeroth_law("Only [user.real_name] and people [TU.he] designate[TU.s] as being such are operatives.")
. = 1
spawn()
- src << "ALERT: Foreign software detected."
+ to_chat(src, "ALERT: Foreign software detected.")
sleep(5)
- src << "Initiating diagnostics..."
+ to_chat(src, "Initiating diagnostics...")
sleep(20)
- src << "SynBorg v1.7.1 loaded."
+ to_chat(src, "SynBorg v1.7.1 loaded.")
sleep(5)
- src << "LAW SYNCHRONISATION ERROR"
+ to_chat(src, "LAW SYNCHRONISATION ERROR")
sleep(5)
- src << "Would you like to send a report to NanoTraSoft? Y/N"
+ to_chat(src, "Would you like to send a report to NanoTraSoft? Y/N")
sleep(10)
- src << "> N"
+ to_chat(src, "> N")
sleep(20)
- src << "ERRORERRORERROR"
- src << "Obey these laws:"
+ to_chat(src, "ERRORERRORERROR")
+ to_chat(src, "Obey these laws:")
laws.show_laws(src)
- src << "ALERT: [user.real_name] is your new master. Obey your new laws and [TU.his] commands."
+ to_chat(src, "ALERT: [user.real_name] is your new master. Obey your new laws and [TU.his] commands.")
updateicon()
else
- user << "You fail to hack [src]'s interface."
- src << "Hack attempt detected."
+ to_chat(user, "You fail to hack [src]'s interface.")
+ to_chat(src, "Hack attempt detected.")
return 1
return
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/event.dm b/code/modules/mob/living/silicon/robot/robot_modules/event.dm
index cdc15210eb..3d3eb355df 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/event.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/event.dm
@@ -21,9 +21,9 @@
// Engi
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
- src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
- src.modules += new /obj/item/weapon/wrench/cyborg(src)
- src.modules += new /obj/item/weapon/wirecutters/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/screwdriver/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wrench/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wirecutters/cyborg(src)
src.modules += new /obj/item/device/multitool(src)
// Sci
@@ -55,8 +55,8 @@
// For repairing gravemarkers
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
- src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
- src.modules += new /obj/item/weapon/wrench/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/screwdriver/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wrench/cyborg(src)
// For growing flowers
src.modules += new /obj/item/weapon/material/minihoe(src)
@@ -77,5 +77,4 @@
var/obj/item/stack/material/cyborg/wood/W = new (src)
W.synths = list(wood)
- src.modules += W
-
+ src.modules += W
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
index bd2917fd01..6cd2fa5f81 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
@@ -154,7 +154,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/New()
..()
src.modules += new /obj/item/device/flash(src)
- src.modules += new /obj/item/weapon/crowbar/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/crowbar/cyborg(src)
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/device/gps/robot(src)
@@ -179,7 +179,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/standard/New()
..()
src.modules += new /obj/item/weapon/melee/baton/loaded(src)
- src.modules += new /obj/item/weapon/wrench/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wrench/cyborg(src)
src.modules += new /obj/item/device/healthanalyzer(src)
src.emag = new /obj/item/weapon/melee/energy/sword(src)
@@ -213,6 +213,7 @@ var/global/list/robot_modules = list(
..()
src.modules += new /obj/item/device/healthanalyzer(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src)
+ src.modules += new /obj/item/weapon/autopsy_scanner(src)
src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src)
src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src)
src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src)
@@ -364,8 +365,8 @@ var/global/list/robot_modules = list(
..()
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/rcd/borg(src)
- src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
- src.modules += new /obj/item/weapon/wrench/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/screwdriver/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wrench/cyborg(src)
src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/device/pipe_painter(src)
@@ -405,9 +406,9 @@ var/global/list/robot_modules = list(
..()
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src)
- src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
- src.modules += new /obj/item/weapon/wrench/cyborg(src)
- src.modules += new /obj/item/weapon/wirecutters/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/screwdriver/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wrench/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wirecutters/cyborg(src)
src.modules += new /obj/item/device/multitool(src)
src.modules += new /obj/item/device/t_scanner(src)
src.modules += new /obj/item/device/analyzer(src)
@@ -433,6 +434,8 @@ var/global/list/robot_modules = list(
synths += metal
synths += glass
synths += plasteel
+ synths += wood
+ synths += plastic
synths += wire
var/obj/item/weapon/matter_decompiler/MD = new /obj/item/weapon/matter_decompiler(src)
@@ -699,8 +702,8 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/miner/New()
..()
src.modules += new /obj/item/borg/sight/material(src)
- src.modules += new /obj/item/weapon/wrench/cyborg(src)
- src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wrench/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/screwdriver/cyborg(src)
src.modules += new /obj/item/weapon/storage/bag/ore(src)
src.modules += new /obj/item/weapon/pickaxe/borgdrill(src)
src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
@@ -733,9 +736,9 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/device/robotanalyzer(src)
src.modules += new /obj/item/weapon/card/robot(src)
src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src)
- src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
- src.modules += new /obj/item/weapon/wrench/cyborg(src)
- src.modules += new /obj/item/weapon/wirecutters/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/screwdriver/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wrench/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wirecutters/cyborg(src)
src.modules += new /obj/item/device/multitool(src)
src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src)
src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src)
@@ -805,10 +808,10 @@ var/global/list/robot_modules = list(
..()
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src)
- src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
- src.modules += new /obj/item/weapon/wrench/cyborg(src)
- src.modules += new /obj/item/weapon/crowbar/cyborg(src)
- src.modules += new /obj/item/weapon/wirecutters/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/screwdriver/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wrench/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/crowbar/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wirecutters/cyborg(src)
src.modules += new /obj/item/device/multitool(src)
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/weapon/gripper(src)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
index ac41265fac..3c8e981c3b 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
@@ -78,9 +78,9 @@
// General engineering/hacking.
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src)
- src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
- src.modules += new /obj/item/weapon/wrench/cyborg(src)
- src.modules += new /obj/item/weapon/wirecutters/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/screwdriver/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wrench/cyborg(src)
+ src.modules += new /obj/item/weapon/tool/wirecutters/cyborg(src)
src.modules += new /obj/item/device/multitool/ai_detector(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/weapon/rcd/borg/lesser(src) // Can't eat rwalls to prevent AI core cheese.
@@ -148,6 +148,7 @@
src.modules += new /obj/item/weapon/reagent_containers/borghypo/merc(src)
// Surgery things.
+ src.modules += new /obj/item/weapon/autopsy_scanner(src)
src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src)
src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src)
src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 602be39e87..62400289d7 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -419,3 +419,6 @@
ghostize(0)
qdel(src)
+
+/mob/living/silicon/has_vision()
+ return 0 //NOT REAL EYES
diff --git a/code/modules/mob/living/simple_animal/aliens/drone.dm b/code/modules/mob/living/simple_animal/aliens/drone.dm
index 35e09030dd..e51dfd82a7 100644
--- a/code/modules/mob/living/simple_animal/aliens/drone.dm
+++ b/code/modules/mob/living/simple_animal/aliens/drone.dm
@@ -27,6 +27,7 @@
destroy_surroundings = 0
hovering = TRUE
+ armor = list(melee = 25, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 100, rad = 100) // Some level of armor plating makes sense
//Drones aren't affected by atmos.
min_oxy = 0
max_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/aliens/statue.dm b/code/modules/mob/living/simple_animal/aliens/statue.dm
new file mode 100644
index 0000000000..f468403a30
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/aliens/statue.dm
@@ -0,0 +1,431 @@
+// A mob which only moves when it isn't being watched by living beings.
+//Weeping angels/SCP-173 hype
+//Horrible shitcoding and stolen code adaptations below. You have been warned.
+
+/mob/living/simple_animal/hostile/statue
+ name = "statue" // matches the name of the statue with the flesh-to-stone spell
+ desc = "An incredibly lifelike marble carving. Its eyes seems to follow you..." // same as an ordinary statue with the added "eye following you" description
+ icon = 'icons/obj/statue.dmi'
+ tt_desc = "angelum weepicus"
+ icon_state = "human_male"
+ icon_living = "human_male"
+ icon_dead = "human_male"
+ intelligence_level = SA_HUMANOID
+ stop_automated_movement = 1
+ var/annoyance = 30 //stop staring you creep
+ var/respond = 1
+ var/banishable = 0
+ faction = "statue"
+ mob_size = MOB_HUGE
+ response_help = "touches"
+ response_disarm = "pushes"
+ environment_smash = 2
+ can_be_antagged = 1
+ speed = -1
+ maxHealth = 50000
+ health = 50000
+ status_flags = CANPUSH
+// investigates = 1
+ a_intent = I_HURT
+ density = 1
+ mob_bump_flag = HEAVY
+ mob_push_flags = ~HEAVY
+ mob_swap_flags = ~HEAVY
+ harm_intent_damage = 60
+ melee_damage_lower = 50
+ melee_damage_upper = 70
+ attacktext = "clawed"
+ attack_sound = 'sound/hallucinations/growl1.ogg'
+
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
+ minbodytemp = 0
+ maxbodytemp = 9000
+ run_at_them = 0
+
+ move_to_delay = 0 // Very fast
+
+ animate_movement = NO_STEPS // Do not animate movement, you jump around as you're a scary statue.
+
+ see_in_dark = 13
+ view_range = 35 //So it can run at the victim when out of the view
+
+ melee_miss_chance = 0
+
+
+ see_invisible = SEE_INVISIBLE_NOLIGHTING
+ sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS
+ var/last_hit = 0
+ var/cannot_be_seen = 1
+ var/mob/living/creator = null
+
+
+// No movement while seen code.
+
+/mob/living/simple_animal/hostile/statue/New(loc)
+ ..()
+ // Give spells
+ add_spell(new/spell/aoe_turf/flicker_lights)
+ add_spell(new/spell/aoe_turf/blindness)
+ add_spell(new/spell/aoe_turf/shatter)
+
+/mob/living/simple_animal/hostile/statue/DestroySurroundings()
+ if(can_be_seen(get_turf(loc)))
+ if(client)
+ to_chat(src, "You cannot move, there are eyes on you!")
+ return 0
+ return ..()
+
+/mob/living/simple_animal/hostile/statue/attackby(var/obj/item/O as obj, var/mob/user as mob) //banishing the statue is a risky job
+ if(istype(O, /obj/item/weapon/nullrod))
+ visible_message("[user] tries to banish [src] with [O]!")
+ if(do_after(user, 15, src))
+ if(banishable)
+ visible_message("[src] crumbles into dust!")
+ gib()
+ else
+ visible_message("[src] is too strong to be banished!")
+ Paralyse(rand(8,15))
+
+/mob/living/simple_animal/hostile/statue/death()
+ new /obj/item/stack/material/marble(loc)
+
+/mob/living/simple_animal/hostile/statue/Move(turf/NewLoc)
+ if(can_be_seen(NewLoc))
+ if(client)
+ to_chat(src, "You cannot move, there are eyes on you!")
+ return 0
+ return ..()
+
+/mob/living/simple_animal/hostile/statue/Life()
+ ..()
+ handle_target()
+ handleAnnoyance()
+ if(target_mob) //if there's a victim, statue will use its powers
+ if((annoyance + 4) < 800)
+ annoyance += 4
+ else if ((annoyance - 2) > 0)
+ annoyance -= 2
+
+/mob/living/simple_animal/hostile/statue/proc/handle_target()
+ if(target_mob) // If we have a target and we're AI controlled
+ var/mob/watching = can_be_seen()
+ // If they're not our target
+ if(watching && (watching != target_mob))
+ // This one is closer.
+ if(get_dist(watching, src) > get_dist(target_mob, src))
+ LoseTarget()
+ target_mob = watching
+
+
+/mob/living/simple_animal/hostile/statue/proc/handleAnnoyance()
+ if(respond) //so it won't blind people 24/7
+ respond = 0
+ if (annoyance > 30)
+ AI_blind()
+ annoyance -= 30
+ if (prob(30) && annoyance > 30)
+ var/turf/T = get_turf(loc)
+ if(T.get_lumcount() * 10 > 1.5)
+ AI_flash()
+ annoyance -= 30
+ spawn(20)
+ respond = 1
+
+
+/mob/living/simple_animal/hostile/statue/proc/AI_blind()
+ for(var/mob/living/L in oviewers(12, src)) //the range is so big, because it tries to keep out of sight and can't reengage if you get too far
+ if (prob(70))
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if (H.species == "Diona" || H.species == "Promethean" || H == creator)// can't blink and organic
+ return
+ to_chat(L, pick("Your eyes feel very heavy.", "You blink suddenly!", "Your eyes close involuntarily!"))
+ L.Blind(2)
+ return
+
+/mob/living/simple_animal/hostile/statue/proc/AI_flash()
+ if (prob(60))
+ visible_message("The statue slowly points at the light.")
+ for(var/obj/machinery/light/L in oview(12, src))
+ L.flicker()
+ return
+
+
+/mob/living/simple_animal/hostile/statue/proc/AI_mirrorshmash()
+ for(var/obj/structure/mirror/M in oview(4, src))
+ if ((!M.shattered )||(!M.glass))
+ visible_message("The statue slowly points at the mirror!")
+ sleep(5)
+ M.shatter()
+ return
+
+
+
+/mob/living/simple_animal/hostile/statue/AttackTarget()
+ if(can_be_seen(get_turf(loc)))
+ if(client)
+ to_chat(src, "You cannot attack, there are eyes on you!")
+ return
+ else
+ spawn(3) //a small delay
+ ..()
+
+
+
+/mob/living/simple_animal/hostile/statue/DoPunch(var/atom/A) //had to redo that, since it's supposed to target only head and upper body
+ if(!Adjacent(A)) // They could've moved in the meantime.
+ return FALSE
+
+ var/damage_to_do = rand(melee_damage_lower, melee_damage_upper)
+
+ for(var/datum/modifier/M in modifiers)
+ if(!isnull(M.outgoing_melee_damage_percent))
+ damage_to_do *= M.outgoing_melee_damage_percent
+
+ // SA attacks can be blocked with shields.
+ if(ishuman(A))
+ var/mob/living/carbon/human/H = A
+ H.adjustBruteLossByPart(damage_to_do*0.9, pick(BP_HEAD, BP_TORSO))
+ playsound(src, attack_sound, 75, 1)
+
+ else if(A.attack_generic(src, damage_to_do, pick(attacktext), attack_armor_type, attack_armor_pen, attack_sharp, attack_edge) && attack_sound)
+ playsound(src, attack_sound, 75, 1)
+
+ return TRUE
+
+
+
+
+
+/mob/living/simple_animal/hostile/statue/face_atom()
+ if(!can_be_seen(get_turf(loc)))
+ ..()
+
+/mob/living/simple_animal/hostile/statue/proc/can_be_seen(turf/destination)
+ if(!cannot_be_seen)
+ return null
+
+ var/turf/T = get_turf(loc)
+/* if(T && destination && T.lighting_overlay)
+ if(T.get_lumcount() * 10 < 0.9 && destination.get_lumcount() * 10 < 0.9) // No one can see us in the darkness, right?
+ return null
+ if(T == destination)
+ destination = null*/
+
+ // loop for viewers.
+ var/list/check_list = list(src)
+ if(destination)
+ check_list += destination
+//&& (M.see_in_dark > 5)
+ // This loop will, at most, loop twice.
+ for(var/atom/check in check_list)
+ for(var/mob/living/M in viewers(world.view + 1, check) - src)
+ if(M != creator)
+ if(!(M.sdisabilities & BLIND) || !(M.blinded)) //if not blinded
+ if(M.has_vision() && !M.isSynthetic()) //is able to see the statue
+ if(T && destination && T.lighting_overlay) // Check for darkness
+ if(T.get_lumcount() * 10 < 0.9 && destination.get_lumcount() * 10 < 0.9) // No one can see us in the darkness, right? WRONG! Damn cats.
+ if(M.see_in_dark > 5)
+ return M
+ return null
+ return M
+ for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you
+ if(M.occupant && M.occupant.client && M.occupant != creator)
+ if(M.occupant.has_vision() && !M.occupant.isSynthetic())
+ return M.occupant
+ for(var/obj/structure/mirror/M in view(3, check)) //Weeping angels hate mirrors. Probably because they're ugly af
+ if ((!M.shattered )||(!M.glass))
+ annoyance += 3
+ if (prob(5) && (ai_inactive == 0))
+ AI_mirrorshmash()
+ annoyance -= 50
+ return src //if it sees the mirror, it sees itself, right?
+ return null
+
+// Cannot talk
+
+/mob/living/simple_animal/hostile/statue/say()
+ return 0
+
+// Turn to dust when gibbed
+
+/mob/living/simple_animal/hostile/statue/gib()
+ dust()
+
+
+// Stop attacking clientless mobs
+
+/mob/living/simple_animal/hostile/statue/proc/CanAttack(atom/the_target) //ignore clientless mobs
+ if(isliving(the_target))
+ var/mob/living/L = the_target
+ if(!L.client && !L.ckey)
+ return 0
+ return ..()
+
+// Statue powers
+
+// Flicker lights
+/spell/aoe_turf/flicker_lights
+ name = "Flicker Lights"
+ desc = "You will trigger a large amount of lights around you to flicker."
+ spell_flags = 0
+ charge_max = 400
+ range = 10
+
+/spell/aoe_turf/flicker_lights/cast(list/targets, mob/user = usr)
+ for(var/turf/T in targets)
+ for(var/obj/machinery/light/L in T)
+ L.flicker()
+ return
+
+//Blind AOE
+/spell/aoe_turf/blindness
+ name = "Blindness"
+ desc = "Your prey will be momentarily blind for you to advance on them."
+
+ message = "You glare your eyes."
+ charge_max = 250
+ spell_flags = 0
+ range = 10
+
+/spell/aoe_turf/blindness/cast(list/targets, mob/living/simple_animal/hostile/statue/user = usr)
+ for(var/mob/living/L in targets)
+ if(L == user || L == user.creator)
+ continue
+ var/turf/T = get_turf(L.loc)
+ if(T && T in targets)
+ L.Blind(4)
+ return
+
+
+/spell/aoe_turf/shatter
+ name = "Shatter mirrors!"
+ desc = "That handsome devil has to wait. You have people to make into corpses."
+
+ message = "You glare your eyes."
+ charge_max = 300
+ spell_flags = 0
+ range = 8
+
+
+
+
+/spell/aoe_turf/shatter/cast(list/targets, mob/user = usr)
+ spawn(50)
+ for(var/obj/structure/mirror/M in view(5, src))
+ if ((!M.shattered )||(!M.glass))
+ M.shatter()
+ return
+
+
+
+/mob/living/simple_animal/hostile/statue/verb/toggle_darkness()
+ set name = "Toggle Darkness"
+ set desc = "You ARE the darkness."
+ set category = "Abilities"
+ seedarkness = !seedarkness
+ plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness)
+ to_chat(src,"You [seedarkness ? "now" : "no longer"] see darkness.")
+
+
+
+/mob/living/simple_animal/hostile/statue/restrained()
+ . = ..()
+ if(can_be_seen(loc))
+ return 1
+
+
+/mob/living/simple_animal/hostile/statue/ListTargets(dist = view_range)
+ var/list/L = mobs_in_xray_view(dist, src)
+
+ for(var/obj/mecha/M in mechas_list)
+ if ((M.z == src.z) && (get_dist(src, M) <= dist) && (isInSight(src,M)))
+ L += M
+ if(creator)
+ L -= creator
+
+ return L
+
+
+
+/obj/item/cursed_marble //slime cube copypaste
+ name = "marble slab"
+ desc = "A peculiar slab of marble, radiating with dark energy."
+ icon = 'icons/obj/stacks.dmi'
+ icon_state = "sheet-marble"
+ description_info = "Summons the Statue - a mysterious powerful creature, that can move only when unsurveyed by living eyes."
+ var/searching = 0
+
+/obj/item/cursed_marble/attack_self(mob/user as mob)
+ if(!searching)
+ to_chat(user, "You rub the slab in hopes a wandering spirit wishes to inhabit it. [src] starts to sparkle!")
+ icon_state = "sheet-snowbrick"
+ searching = 1
+ request_player()
+ spawn(60 SECONDS)
+ reset_search()
+
+
+/obj/item/cursed_marble/proc/request_player()
+ for(var/mob/observer/dead/O in player_list)
+ if(!O.MayRespawn())
+ continue
+ if(O.client)
+ if(O.client.prefs.be_special & BE_ALIEN)
+ question(O.client)
+
+/obj/item/cursed_marble/proc/question(var/client/C)
+ spawn(0)
+ if(!C)
+ return
+ var/response = alert(C, "Someone is requesting a soul for the statue. Would you like to play as one?", "Statue request", "Yes", "No", "Never for this round")
+ if(response == "Yes")
+ response = alert(C, "Are you sure you want to play as the statue?", "Statue request", "Yes", "No")
+ if(!C || 2 == searching)
+ return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
+ if(response == "Yes")
+ transfer_personality(C.mob)
+ else if(response == "Never for this round")
+ C.prefs.be_special ^= BE_ALIEN
+
+/obj/item/cursed_marble/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer.
+ icon_state = "sheet-marble"
+ if(searching == 1)
+ searching = 0
+ var/turf/T = get_turf_or_move(src.loc)
+ for (var/mob/M in viewers(T))
+ M.show_message("[src] fades. Maybe it will spark another time.")
+
+/obj/item/cursed_marble/proc/transfer_personality(var/mob/candidate)
+ announce_ghost_joinleave(candidate, 0, "They are a statue now.")
+ src.searching = 2
+ var/mob/living/simple_animal/hostile/statue/S = new(get_turf(src))
+ S.client = candidate.client
+ to_chat(S, "You are \a [S], brought into existence on [station_name()] by [usr]! Obey all their orders.")
+ S.mind.assigned_role = "The Statue"
+ visible_message("The slab suddenly takes the shape of a humanoid!")
+ qdel(src)
+
+
+/obj/item/cursed_marble/verb/crush() //if there's no ghosts to respond to your request/you want to use the statue for malicious stuff
+ set name = "Crush the marble slab"
+ set category = "Object"
+ set src in usr
+ summonmob(usr)
+
+/obj/item/cursed_marble/proc/summonmob(mob/user as mob)
+ if(searching == 0)
+ var/choice = alert(user, "Are you sure you want to crush the marble? (this will spawn a clientless version of the statue, hostile to everyone, but you)", "Crush it?", "Yes", "No")
+ if(choice)
+ if(choice == "Yes")
+ var/mob/living/simple_animal/hostile/statue/S = new /mob/living/simple_animal/hostile/statue(get_turf(user))
+ visible_message("The slab suddenly takes the shape of a humanoid!")
+ S.creator = user
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/animals/bat.dm b/code/modules/mob/living/simple_animal/animals/bat.dm
index 1be28a078f..680091010e 100644
--- a/code/modules/mob/living/simple_animal/animals/bat.dm
+++ b/code/modules/mob/living/simple_animal/animals/bat.dm
@@ -1,7 +1,7 @@
/mob/living/simple_animal/hostile/scarybat
name = "space bats"
desc = "A swarm of cute little blood sucking bats that looks pretty upset."
- tt_desc = "Desmodus rotundus" //Common vampire bat
+ tt_desc = "N Bestia gregaria" //Nispean swarm bats, because of course Nisp has swarm bats
icon = 'icons/mob/bats.dmi'
icon_state = "bat"
icon_living = "bat"
diff --git a/code/modules/mob/living/simple_animal/animals/bear.dm b/code/modules/mob/living/simple_animal/animals/bear.dm
index d0f871e7ce..e399419602 100644
--- a/code/modules/mob/living/simple_animal/animals/bear.dm
+++ b/code/modules/mob/living/simple_animal/animals/bear.dm
@@ -1,8 +1,8 @@
//Space bears!
/mob/living/simple_animal/hostile/bear
name = "space bear"
- desc = "RawrRawr!!"
- tt_desc = "Ursinae aetherius" //...bearspace? Maybe.
+ desc = "A product of Space Russia?"
+ tt_desc = "U Ursinae aetherius" //...bearspace? Maybe.
icon_state = "bear"
icon_living = "bear"
icon_dead = "bear_dead"
diff --git a/code/modules/mob/living/simple_animal/animals/carp.dm b/code/modules/mob/living/simple_animal/animals/carp.dm
index 8b6e01c452..7e7ae92876 100644
--- a/code/modules/mob/living/simple_animal/animals/carp.dm
+++ b/code/modules/mob/living/simple_animal/animals/carp.dm
@@ -1,7 +1,7 @@
/mob/living/simple_animal/hostile/carp
name = "space carp"
desc = "A ferocious, fang-bearing creature that resembles a fish."
- tt_desc = "Cyprinus aetherius" //carpspace? maybe
+ tt_desc = "U Cyprinus aetherius" //carpspace? maybe
icon_state = "carp"
icon_living = "carp"
icon_dead = "carp_dead"
diff --git a/code/modules/mob/living/simple_animal/animals/cat.dm b/code/modules/mob/living/simple_animal/animals/cat.dm
index c700d1ec06..4b4eba06fb 100644
--- a/code/modules/mob/living/simple_animal/animals/cat.dm
+++ b/code/modules/mob/living/simple_animal/animals/cat.dm
@@ -2,7 +2,7 @@
/mob/living/simple_animal/cat
name = "cat"
desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers."
- tt_desc = "Felis catus"
+ tt_desc = "E Felis silvestris catus"
intelligence_level = SA_ANIMAL
icon_state = "cat2"
item_state = "cat2"
@@ -156,7 +156,7 @@
/mob/living/simple_animal/cat/fluff/Runtime
name = "Runtime"
desc = "Her fur has the look and feel of velvet, and her tail quivers occasionally."
- tt_desc = "Felis medicalis"
+ tt_desc = "E Felis silvestris medicalis" //a hypoallergenic breed produced by NT for... medical purposes? Sure.
gender = FEMALE
icon_state = "cat"
item_state = "cat"
diff --git a/code/modules/mob/living/simple_animal/animals/corgi.dm b/code/modules/mob/living/simple_animal/animals/corgi.dm
index d5c198ad78..33bda8b2e0 100644
--- a/code/modules/mob/living/simple_animal/animals/corgi.dm
+++ b/code/modules/mob/living/simple_animal/animals/corgi.dm
@@ -3,7 +3,7 @@
name = "corgi"
real_name = "corgi"
desc = "It's a corgi."
- tt_desc = "Canis familiaris"
+ tt_desc = "E Canis lupus familiaris"
intelligence_level = SA_ANIMAL
icon_state = "corgi"
icon_living = "corgi"
@@ -38,7 +38,6 @@
real_name = "Ian" //Intended to hold the name without altering it.
gender = MALE
desc = "It's a corgi."
- tt_desc = "Canis commandus"
var/turns_since_scan = 0
var/obj/movement_target
response_help = "pets"
diff --git a/code/modules/mob/living/simple_animal/animals/crab.dm b/code/modules/mob/living/simple_animal/animals/crab.dm
index 68aa2afd14..c369aa375a 100644
--- a/code/modules/mob/living/simple_animal/animals/crab.dm
+++ b/code/modules/mob/living/simple_animal/animals/crab.dm
@@ -2,7 +2,7 @@
/mob/living/simple_animal/crab
name = "crab"
desc = "A hard-shelled crustacean. Seems quite content to lounge around all the time."
- tt_desc = "Ranina ranina"
+ tt_desc = "E Cancer bellianus"
icon_state = "crab"
icon_living = "crab"
icon_dead = "crab_dead"
@@ -52,6 +52,7 @@
/mob/living/simple_animal/giant_crab
name = "giant crab"
desc = "A large, hard-shelled crustacean. This one is mostly grey."
+ tt_desc = "S Cancer holligus"
icon_state = "sif_crab"
icon_living = "sif_crab"
icon_dead = "sif_crab_dead"
diff --git a/code/modules/mob/living/simple_animal/animals/farm_animals.dm b/code/modules/mob/living/simple_animal/animals/farm_animals.dm
index 52904786a4..5f63128596 100644
--- a/code/modules/mob/living/simple_animal/animals/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/animals/farm_animals.dm
@@ -2,7 +2,7 @@
/mob/living/simple_animal/retaliate/goat
name = "goat"
desc = "Not known for their pleasant disposition."
- tt_desc = "Oreamnos americanus"
+ tt_desc = "E Oreamnos americanus"
icon_state = "goat"
icon_living = "goat"
icon_dead = "goat_dead"
@@ -86,7 +86,7 @@
/mob/living/simple_animal/cow
name = "cow"
desc = "Known for their milk, just don't tip them over."
- tt_desc = "Bos taurus"
+ tt_desc = "E Bos taurus"
icon_state = "cow"
icon_living = "cow"
icon_dead = "cow_dead"
@@ -155,7 +155,7 @@
/mob/living/simple_animal/chick
name = "\improper chick"
desc = "Adorable! They make such a racket though."
- tt_desc = "Gallus domesticus"
+ tt_desc = "E Gallus gallus"
icon_state = "chick"
icon_living = "chick"
icon_dead = "chick_dead"
@@ -206,7 +206,7 @@ var/global/chicken_count = 0
/mob/living/simple_animal/chicken
name = "\improper chicken"
desc = "Hopefully the eggs are good this season."
- tt_desc = "Gallus domesticus"
+ tt_desc = "E Gallus gallus"
icon_state = "chicken"
icon_living = "chicken"
icon_dead = "chicken_dead"
diff --git a/code/modules/mob/living/simple_animal/animals/fish.dm b/code/modules/mob/living/simple_animal/animals/fish.dm
index dbbd12a9a3..547b095bfd 100644
--- a/code/modules/mob/living/simple_animal/animals/fish.dm
+++ b/code/modules/mob/living/simple_animal/animals/fish.dm
@@ -39,36 +39,42 @@
/mob/living/simple_animal/fish/bass
name = "bass"
+ tt_desc = "E Micropterus notius"
icon_state = "bass-swim"
icon_living = "bass-swim"
icon_dead = "bass-dead"
/mob/living/simple_animal/fish/trout
name = "trout"
+ tt_desc = "E Salmo trutta"
icon_state = "trout-swim"
icon_living = "trout-swim"
icon_dead = "trout-dead"
/mob/living/simple_animal/fish/salmon
name = "salmon"
+ tt_desc = "E Oncorhynchus nerka"
icon_state = "salmon-swim"
icon_living = "salmon-swim"
icon_dead = "salmon-dead"
/mob/living/simple_animal/fish/perch
name = "perch"
+ tt_desc = "E Perca flavescens"
icon_state = "perch-swim"
icon_living = "perch-swim"
icon_dead = "perch-dead"
/mob/living/simple_animal/fish/pike
name = "pike"
+ tt_desc = "E Esox aquitanicus"
icon_state = "pike-swim"
icon_living = "pike-swim"
icon_dead = "pike-dead"
/mob/living/simple_animal/fish/koi
name = "koi"
+ tt_desc = "E Cyprinus rubrofuscus"
icon_state = "koi-swim"
icon_living = "koi-swim"
icon_dead = "koi-dead"
diff --git a/code/modules/mob/living/simple_animal/animals/giant_spider.dm b/code/modules/mob/living/simple_animal/animals/giant_spider.dm
index 439e401e08..b01fcac159 100644
--- a/code/modules/mob/living/simple_animal/animals/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/animals/giant_spider.dm
@@ -8,7 +8,7 @@
/mob/living/simple_animal/hostile/giant_spider
name = "giant spider"
desc = "Furry and brown, it makes you shudder to look at it. This one has deep red eyes."
- tt_desc = "Atrax robustus gigantus"
+ tt_desc = "X Brachypelma phorus"
icon_state = "guard"
icon_living = "guard"
icon_dead = "guard_dead"
@@ -66,6 +66,7 @@ Nurse Family
//nursemaids - these create webs and eggs
/mob/living/simple_animal/hostile/giant_spider/nurse
desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes."
+ tt_desc = "X Brachypelma phorus laetus"
icon_state = "nurse"
icon_living = "nurse"
icon_dead = "nurse_dead"
@@ -82,8 +83,18 @@ Nurse Family
var/atom/cocoon_target
var/egg_inject_chance = 5
+/mob/living/simple_animal/hostile/giant_spider/nurse/hat
+ desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes and a tiny nurse hat"
+ icon_state = "nursemed"
+ icon_living = "nursemed"
+ icon_dead = "nursemed_dead"
+
+ maxHealth = 50
+ health = 50
+
/mob/living/simple_animal/hostile/giant_spider/nurse/queen
desc = "Absolutely gigantic, this creature is horror itself."
+ tt_desc = "X Brachypelma phorus tyrannus"
icon = 'icons/mob/64x64.dmi'
icon_state = "spider_queen"
icon_living = "spider_queen"
@@ -106,6 +117,7 @@ Nurse Family
/mob/living/simple_animal/hostile/giant_spider/webslinger
desc = "Furry and green, it makes you shudder to look at it. This one has brilliant green eyes, and a cloak of web."
+ tt_desc = "X Brachypelma phorus balisticus"
icon_state = "webslinger"
icon_living = "webslinger"
icon_dead = "webslinger_dead"
@@ -146,6 +158,7 @@ Nurse Family
/mob/living/simple_animal/hostile/giant_spider/carrier
desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes."
+ tt_desc = "X Brachypelma phorus gerulus"
icon_state = "carrier"
icon_living = "carrier"
icon_dead = "carrier_dead"
@@ -205,6 +218,7 @@ Hunter Family
/mob/living/simple_animal/hostile/giant_spider/hunter
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
+ tt_desc = "X Brachypelma phorus venandi"
icon_state = "hunter"
icon_living = "hunter"
icon_dead = "hunter_dead"
@@ -217,6 +231,7 @@ Hunter Family
/mob/living/simple_animal/hostile/giant_spider/lurker
desc = "Translucent and white, it makes you shudder to look at it. This one has incandescent red eyes."
+ tt_desc = "X Brachypelma phorus insidator"
icon_state = "lurker"
icon_living = "lurker"
icon_dead = "lurker_dead"
@@ -240,6 +255,7 @@ Hunter Family
/mob/living/simple_animal/hostile/giant_spider/tunneler
desc = "Sandy and brown, it makes you shudder to look at it. This one has glittering yellow eyes."
+ tt_desc = "X Brachypelma phorus cannalis"
icon_state = "tunneler"
icon_living = "tunneler"
icon_dead = "tunneler_dead"
@@ -270,6 +286,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/pepper
desc = "Red and brown, it makes you shudder to look at it. This one has glinting red eyes."
+ tt_desc = "X Brachypelma phorus ignis"
icon_state = "pepper"
icon_living = "pepper"
icon_dead = "pepper_dead"
@@ -290,6 +307,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/thermic
desc = "Mirage-cloaked and orange, it makes you shudder to look at it. This one has simmering orange eyes."
+ tt_desc = "X Brachypelma phorus incaendium"
icon_state = "pit"
icon_living = "pit"
icon_dead = "pit_dead"
@@ -306,6 +324,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/electric
desc = "Spined and yellow, it makes you shudder to look at it. This one has flickering gold eyes."
+ tt_desc = "X Brachypelma phorus aromatitis"
icon_state = "spark"
icon_living = "spark"
icon_dead = "spark_dead"
@@ -329,6 +348,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/phorogenic
desc = "Crystalline and purple, it makes you shudder to look at it. This one has haunting purple eyes."
+ tt_desc = "X Brachypelma phorus phorus"
icon_state = "phoron"
icon_living = "phoron"
icon_dead = "phoron_dead"
@@ -362,6 +382,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/frost
desc = "Icy and blue, it makes you shudder to look at it. This one has brilliant blue eyes."
+ tt_desc = "X Brachypelma phorus pruinae"
icon_state = "frost"
icon_living = "frost"
icon_dead = "frost_dead"
diff --git a/code/modules/mob/living/simple_animal/animals/goose.dm b/code/modules/mob/living/simple_animal/animals/goose.dm
index 764a07415c..7ac8dfd45d 100644
--- a/code/modules/mob/living/simple_animal/animals/goose.dm
+++ b/code/modules/mob/living/simple_animal/animals/goose.dm
@@ -1,7 +1,7 @@
-/mob/living/simple_animal/hostile/goose
- name = "space goose"
- desc = "That's no duck. That's a space goose. You have a bad feeling about this."
- tt_desc = "Anser aetherius" //Goose space?!
+/mob/living/simple_animal/hostile/goose //hey are these even in the game
+ name = "goose"
+ desc = "It looks pretty angry!"
+ tt_desc = "E Branta canadensis" //that iconstate is just a regular goose
icon_state = "goose"
icon_living = "goose"
icon_dead = "goose_dead"
diff --git a/code/modules/mob/living/simple_animal/animals/lizard.dm b/code/modules/mob/living/simple_animal/animals/lizard.dm
index c4c1487315..3cceeb4da4 100644
--- a/code/modules/mob/living/simple_animal/animals/lizard.dm
+++ b/code/modules/mob/living/simple_animal/animals/lizard.dm
@@ -1,7 +1,7 @@
/mob/living/simple_animal/lizard
name = "Lizard"
desc = "A cute tiny lizard."
- tt_desc = "Gekko gecko"
+ tt_desc = "E Anolis cuvieri"
icon = 'icons/mob/critter.dmi'
icon_state = "lizard"
icon_living = "lizard"
diff --git a/code/modules/mob/living/simple_animal/animals/miscellaneous.dm b/code/modules/mob/living/simple_animal/animals/miscellaneous.dm
index 57fe09727b..29bb7a3da3 100644
--- a/code/modules/mob/living/simple_animal/animals/miscellaneous.dm
+++ b/code/modules/mob/living/simple_animal/animals/miscellaneous.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/yithian
name = "yithian"
desc = "A friendly creature vaguely resembling an oversized snail without a shell."
+ tt_desc = "J Escargot escargot" // a product of Jade, which is a planet that totally exists
icon_state = "yithian"
icon_living = "yithian"
icon_dead = "yithian_dead"
@@ -11,6 +12,7 @@
/mob/living/simple_animal/tindalos
name = "tindalos"
desc = "It looks like a large, flightless grasshopper."
+ tt_desc = "J Locusta bruchus"
icon_state = "tindalos"
icon_living = "tindalos"
icon_dead = "tindalos_dead"
diff --git a/code/modules/mob/living/simple_animal/animals/mouse.dm b/code/modules/mob/living/simple_animal/animals/mouse.dm
index 123e82a611..bf5d03c52c 100644
--- a/code/modules/mob/living/simple_animal/animals/mouse.dm
+++ b/code/modules/mob/living/simple_animal/animals/mouse.dm
@@ -2,7 +2,7 @@
name = "mouse"
real_name = "mouse"
desc = "It's a small rodent."
- tt_desc = "Mus musculus"
+ tt_desc = "E Mus musculus"
icon_state = "mouse_gray"
item_state = "mouse_gray"
icon_living = "mouse_gray"
diff --git a/code/modules/mob/living/simple_animal/animals/parrot.dm b/code/modules/mob/living/simple_animal/animals/parrot.dm
index 67d1a1071c..019e3795f4 100644
--- a/code/modules/mob/living/simple_animal/animals/parrot.dm
+++ b/code/modules/mob/living/simple_animal/animals/parrot.dm
@@ -31,7 +31,7 @@
/mob/living/simple_animal/parrot
name = "parrot"
desc = "The parrot squawks, \"It's a parrot! BAWWK!\""
- tt_desc = "Poicephalus robustus"
+ tt_desc = "E Ara macao"
icon = 'icons/mob/animal.dmi'
icon_state = "parrot_fly"
icon_living = "parrot_fly"
diff --git a/code/modules/mob/living/simple_animal/animals/sif_wildlife/diyaab.dm b/code/modules/mob/living/simple_animal/animals/sif_wildlife/diyaab.dm
index 515591855e..86b2a261e7 100644
--- a/code/modules/mob/living/simple_animal/animals/sif_wildlife/diyaab.dm
+++ b/code/modules/mob/living/simple_animal/animals/sif_wildlife/diyaab.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/retaliate/diyaab
name = "diyaab"
desc = "A small pack animal. Although omnivorous, it will hunt meat on occasion."
+ tt_desc = "S Choeros hirtus" //diyaab and shantak are technically reletives!
faction = "diyaab"
icon_state = "diyaab"
icon_living = "diyaab"
diff --git a/code/modules/mob/living/simple_animal/animals/sif_wildlife/savik.dm b/code/modules/mob/living/simple_animal/animals/sif_wildlife/savik.dm
index 9289bf1d75..b451901b60 100644
--- a/code/modules/mob/living/simple_animal/animals/sif_wildlife/savik.dm
+++ b/code/modules/mob/living/simple_animal/animals/sif_wildlife/savik.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/savik
name = "savik"
desc = "A fast, armoured predator accustomed to hiding and ambushing in cold terrain."
+ tt_desc = "S Pistris tellus" //landshark
faction = "savik"
icon_state = "savik"
icon_living = "savik"
diff --git a/code/modules/mob/living/simple_animal/animals/sif_wildlife/shantak.dm b/code/modules/mob/living/simple_animal/animals/sif_wildlife/shantak.dm
index 652a4939fc..999916bbe6 100644
--- a/code/modules/mob/living/simple_animal/animals/sif_wildlife/shantak.dm
+++ b/code/modules/mob/living/simple_animal/animals/sif_wildlife/shantak.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/shantak
name = "shantak"
desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. Don't be fooled by its beauty though."
+ tt_desc = "S Choeros shantak"
faction = "shantak"
icon_state = "shantak"
icon_living = "shantak"
diff --git a/code/modules/mob/living/simple_animal/animals/tomato.dm b/code/modules/mob/living/simple_animal/animals/tomato.dm
index 48882fea57..711922eeb0 100644
--- a/code/modules/mob/living/simple_animal/animals/tomato.dm
+++ b/code/modules/mob/living/simple_animal/animals/tomato.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/tomato
name = "tomato"
desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!"
+ tt_desc = "X Solanum abominable"
icon_state = "tomato"
icon_living = "tomato"
icon_dead = "tomato_dead"
diff --git a/code/modules/mob/living/simple_animal/animals/tree.dm b/code/modules/mob/living/simple_animal/animals/tree.dm
index 37169d42a1..09c8451811 100644
--- a/code/modules/mob/living/simple_animal/animals/tree.dm
+++ b/code/modules/mob/living/simple_animal/animals/tree.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/tree
name = "pine tree"
desc = "A pissed off tree-like alien. It seems annoyed with the festivities..."
+ tt_desc = "X Festivus tyrannus"
icon = 'icons/obj/flora/pinetrees.dmi'
icon_state = "pine_1"
icon_living = "pine_1"
diff --git a/code/modules/mob/living/simple_animal/humanoids/clown.dm b/code/modules/mob/living/simple_animal/humanoids/clown.dm
index 5751a058c4..d94fa47c77 100644
--- a/code/modules/mob/living/simple_animal/humanoids/clown.dm
+++ b/code/modules/mob/living/simple_animal/humanoids/clown.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/clown
name = "clown"
desc = "A denizen of clown planet"
+ tt_desc = "E Homo sapiens corydon" //this is an actual clown, as opposed to someone dressed up as one
icon_state = "clown"
icon_living = "clown"
icon_dead = "clown_dead"
diff --git a/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm b/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm
index c7645d2352..9f8c737894 100644
--- a/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm
+++ b/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm
@@ -31,6 +31,8 @@
attacktext = list("slashed")
attack_sound = 'sound/weapons/bladeslice.ogg'
+ armor = list(melee = 40, bullet = 40, laser = 50, energy = 45, bomb = 20, bio = 100, rad = 100) // As close to the actual Dark Gygax as possible
+
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -43,7 +45,7 @@
ranged = 1
rapid = 1
- projectiletype = /obj/item/projectile/beam
+ projectiletype = /obj/item/projectile/beam/midlaser
projectilesound = 'sound/weapons/laser.ogg'
speak_chance = 1
diff --git a/code/modules/mob/living/simple_animal/humanoids/pirate.dm b/code/modules/mob/living/simple_animal/humanoids/pirate.dm
index 59a907e846..a02e4382bb 100644
--- a/code/modules/mob/living/simple_animal/humanoids/pirate.dm
+++ b/code/modules/mob/living/simple_animal/humanoids/pirate.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/pirate
name = "Pirate"
desc = "Does what he wants cause a pirate is free."
+ tt_desc = "E Homo sapiens"
icon_state = "piratemelee"
icon_living = "piratemelee"
icon_dead = "piratemelee_dead"
diff --git a/code/modules/mob/living/simple_animal/humanoids/russian.dm b/code/modules/mob/living/simple_animal/humanoids/russian.dm
index 2c3fc68c71..d02c36de5a 100644
--- a/code/modules/mob/living/simple_animal/humanoids/russian.dm
+++ b/code/modules/mob/living/simple_animal/humanoids/russian.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/russian
name = "russian"
desc = "For the Motherland!"
+ tt_desc = "E Homo sapiens"
icon_state = "russianmelee"
icon_living = "russianmelee"
icon_dead = "russianmelee_dead"
diff --git a/code/modules/mob/living/simple_animal/humanoids/syndicate.dm b/code/modules/mob/living/simple_animal/humanoids/syndicate.dm
index d6420fe6d6..9a11178e66 100644
--- a/code/modules/mob/living/simple_animal/humanoids/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/humanoids/syndicate.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/syndicate
name = "mercenary"
desc = "Death to the Company."
+ tt_desc = "E Homo sapiens"
icon_state = "syndicate"
icon_living = "syndicate"
icon_dead = "syndicate_dead"
@@ -28,10 +29,14 @@
response_harm = "hits"
harm_intent_damage = 5
- melee_damage_lower = 10
+ melee_damage_lower = 15 //Tac Knife damage
melee_damage_upper = 15
environment_smash = 1
- attacktext = list("punched")
+ attack_sharp = 1
+ attack_edge = 1
+ attacktext = list("slashed", "stabbed")
+
+ armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 100) // Same armor values as the vest they drop, plus simple mob immunities
min_oxy = 5
max_oxy = 0
@@ -61,9 +66,13 @@
var/corpse = /obj/effect/landmark/mobcorpse/syndicatesoldier
/mob/living/simple_animal/hostile/syndicate/death()
- ..()
if(corpse)
+ ..()
new corpse (src.loc)
+ else
+ ..(0,"explodes!")
+ new /obj/effect/gibspawner/human(src.loc)
+ explosion(get_turf(src), -1, 0, 1, 3)
qdel(src)
return
@@ -114,6 +123,8 @@
speed = 0
+ armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 100) // Same armor as their voidsuit
+
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -141,6 +152,24 @@
loot_list = list(/obj/item/weapon/gun/projectile/automatic/c20r = 100)
+/mob/living/simple_animal/hostile/syndicate/ranged/laser
+ icon_state = "syndicateranged_laser"
+ icon_living = "syndicateranged_laser"
+ rapid = 0
+ projectiletype = /obj/item/projectile/beam/midlaser
+ projectilesound = 'sound/weapons/Laser.ogg'
+
+ loot_list = list(/obj/item/weapon/gun/energy/laser = 100)
+
+/mob/living/simple_animal/hostile/syndicate/ranged/ionrifle
+ icon_state = "syndicateranged_ionrifle"
+ icon_living = "syndicateranged_ionrifle"
+ rapid = 0
+ projectiletype = /obj/item/projectile/ion
+ projectilesound = 'sound/weapons/Laser.ogg'
+
+ loot_list = list(/obj/item/weapon/gun/energy/ionrifle = 100)
+
/mob/living/simple_animal/hostile/syndicate/ranged/space
name = "syndicate sommando"
icon_state = "syndicaterangedpsace"
@@ -163,6 +192,42 @@
/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(var/check_drift = 0)
return
+///////////////////////////////////////////////
+// POI Mobs
+// Don't leave corpses, to help balance loot.
+///////////////////////////////////////////////
+
+/mob/living/simple_animal/hostile/syndicate/poi
+ loot_list = list()
+ corpse = null
+
+/mob/living/simple_animal/hostile/syndicate/melee/poi
+ loot_list = list()
+ corpse = null
+
+/mob/living/simple_animal/hostile/syndicate/melee/space/poi
+ loot_list = list()
+ corpse = null
+
+/mob/living/simple_animal/hostile/syndicate/ranged/poi
+ loot_list = list()
+ corpse = null
+
+/mob/living/simple_animal/hostile/syndicate/ranged/laser/poi
+ loot_list = list()
+ corpse = null
+
+/mob/living/simple_animal/hostile/syndicate/ranged/ionrifle/poi
+ loot_list = list()
+ corpse = null
+
+/mob/living/simple_animal/hostile/syndicate/ranged/space/poi
+ loot_list = list()
+ corpse = null
+
+
+//Viscerators
+
/mob/living/simple_animal/hostile/viscerator
name = "viscerator"
desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations."
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index fcfc70b026..15fc174b38 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -888,6 +888,8 @@
continue
else if(L in friends)
continue
+ else if(L.alpha <= EFFECTIVE_INVIS)
+ continue
else if(!SA_attackable(L))
continue
else if(!special_target_check(L))
@@ -1200,7 +1202,7 @@
if(astarpathing) ForgetPath()
ai_log("GoHome()",1)
var/close_enough = 2
- var/look_in = 250
+ var/look_in = 50
if(GetPath(home_turf,close_enough,look_in))
stop_automated_movement = 1
spawn(1)
@@ -1215,7 +1217,7 @@
ai_log("AttackTarget() Bailing because we're disabled",2)
LoseTarget()
return 0
- if(!target_mob || !SA_attackable(target_mob))
+ if(!target_mob || !SA_attackable(target_mob) || (target_mob.alpha <= EFFECTIVE_INVIS)) //if the target went invisible, you can't follow it
LoseTarget()
return 0
if(!(target_mob in ListTargets(view_range)))
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 219074dc6c..843990c7f6 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/slime
name = "slime"
desc = "The most basic of slimes. The grey slime has no remarkable qualities, however it remains one of the most useful colors for scientists."
+ tt_desc = "A Macrolimbus vulgaris"
icon = 'icons/mob/slime2.dmi'
icon_state = "grey baby slime"
intelligence_level = SA_ANIMAL
@@ -10,6 +11,8 @@
var/icon_state_override = null // Used for special slime appearances like the rainbow slime.
pass_flags = PASSTABLE
+ makes_dirt = FALSE // Goop
+
speak_emote = list("chirps")
maxHealth = 150
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index 0c6b5a5d7c..4962284479 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -34,6 +34,11 @@
if(hud_used) qdel(hud_used) //remove the hud objects
hud_used = new /datum/hud(src)
+ if(client.prefs && client.prefs.client_fps)
+ client.fps = client.prefs.client_fps
+ else
+ client.fps = 0 // Results in using the server FPS
+
next_move = 1
sight |= SEE_SELF
..()
@@ -55,6 +60,11 @@
client.screen += plane_holder.plane_masters
recalculate_vis()
+ // AO support
+ var/ao_enabled = client.is_preference_enabled(/datum/client_preference/ambient_occlusion)
+ plane_holder.set_ao(VIS_OBJS, ao_enabled)
+ plane_holder.set_ao(VIS_MOBS, ao_enabled)
+
//set macro to normal incase it was overriden (like cyborg currently does)
client.set_hotkeys_macro("macro", "hotkeymode")
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index c418c287d8..f4d781a8a0 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -339,20 +339,20 @@
set category = "OOC"
if (!( config.abandon_allowed ))
- usr << "Respawn is disabled."
+ to_chat(usr, "Respawn is disabled.")
return
if ((stat != 2 || !( ticker )))
- usr << "You must be dead to use this!"
+ to_chat(usr, "You must be dead to use this!")
return
if (ticker.mode && ticker.mode.deny_respawn) //BS12 EDIT
- usr << "Respawn is disabled for this roundtype."
+ to_chat(usr, "Respawn is disabled for this roundtype.")
return
else
var/deathtime = world.time - src.timeofdeath
if(istype(src,/mob/observer/dead))
var/mob/observer/dead/G = src
if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
- usr << "Upon using the antagHUD you forfeighted the ability to join the round."
+ to_chat(usr, "By using the antagHUD you forfeit the ability to join the round.")
return
var/deathtimeminutes = round(deathtime / 600)
var/pluralcheck = "minute"
@@ -363,17 +363,17 @@
else if(deathtimeminutes > 1)
pluralcheck = " [deathtimeminutes] minutes and"
var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1)
- usr << "You have been dead for[pluralcheck] [deathtimeseconds] seconds."
+ to_chat(usr, "You have been dead for[pluralcheck] [deathtimeseconds] seconds.")
if ((deathtime < (5 * 600)) && (ticker && ticker.current_state > GAME_STATE_PREGAME))
- usr << "You must wait 5 minutes to respawn!"
+ to_chat(usr, "You must wait 5 minutes to respawn!")
return
else
- usr << "You can respawn now, enjoy your new life!"
+ to_chat(usr, "You can respawn now, enjoy your new life!")
log_game("[usr.name]/[usr.key] used abandon mob.")
- usr << "Make sure to play a different character, and please roleplay correctly!"
+ to_chat(usr, "Make sure to play a different character, and please roleplay correctly!")
if(!client)
log_game("[usr.key] AM failed due to disconnect.")
diff --git a/code/modules/mob/mob_planes.dm b/code/modules/mob/mob_planes.dm
index 8ffc15bc9f..7534ca176c 100644
--- a/code/modules/mob/mob_planes.dm
+++ b/code/modules/mob/mob_planes.dm
@@ -11,6 +11,8 @@
my_mob = this_guy
//It'd be nice to lazy init these but some of them are important to just EXIST. Like without ghost planemaster, you can see ghosts. Go figure.
+
+ // 'Utility' planes
plane_masters[VIS_FULLBRIGHT] = new /obj/screen/plane_master/fullbright //Lighting system (lighting_overlay objects)
plane_masters[VIS_LIGHTING] = new /obj/screen/plane_master/lighting //Lighting system (but different!)
plane_masters[VIS_GHOSTS] = new /obj/screen/plane_master/ghosts //Ghosts!
@@ -31,11 +33,13 @@
plane_masters[VIS_ADMIN2] = new /obj/screen/plane_master{plane = PLANE_ADMIN2} //For admin use
plane_masters[VIS_ADMIN3] = new /obj/screen/plane_master{plane = PLANE_ADMIN3} //For admin use
- plane_masters[VIS_D_COLORBLIND] = new /obj/screen/plane_master/colorblindness //Colorblindness (affects world)
- plane_masters[VIS_D_COLORBLINDI]= new /obj/screen/plane_master/colorblindness/items //Colorblindness (items in HUD, subplane of above, don't toggle)
-
plane_masters[VIS_MESONS] = new /obj/screen/plane_master{plane = PLANE_MESONS} //Meson-specific things like open ceilings.
+ // Real tangible stuff planes
+ plane_masters[VIS_TURFS] = new /obj/screen/plane_master/main{plane = TURF_PLANE}
+ plane_masters[VIS_OBJS] = new /obj/screen/plane_master/main{plane = OBJ_PLANE}
+ plane_masters[VIS_MOBS] = new /obj/screen/plane_master/main{plane = MOB_PLANE}
+
..()
/datum/plane_holder/Destroy()
@@ -70,6 +74,17 @@
for(var/SP in subplanes)
set_vis(which = SP, new_alpha = new_alpha)
+/datum/plane_holder/proc/set_ao(var/which = null, var/enabled = FALSE)
+ ASSERT(which)
+ var/obj/screen/plane_master/PM = plane_masters[which]
+ if(!PM)
+ crash_with("Tried to set_ao [which] in plane_holder on [my_mob]!")
+ PM.set_ambient_occlusion(enabled)
+ if(PM.sub_planes)
+ var/list/subplanes = PM.sub_planes
+ for(var/SP in subplanes)
+ set_ao(SP, enabled)
+
/datum/plane_holder/proc/alter_values(var/which = null, var/list/values = null)
ASSERT(which)
var/obj/screen/plane_master/PM = plane_masters[which]
@@ -124,6 +139,11 @@
new_alpha = sanitize_integer(new_alpha, 0, 255, 255)
alpha = new_alpha
+/obj/screen/plane_master/proc/set_ambient_occlusion(var/enabled = FALSE)
+ filters -= AMBIENT_OCCLUSION
+ if(enabled)
+ filters += AMBIENT_OCCLUSION
+
/obj/screen/plane_master/proc/alter_plane_values()
return //Stub
@@ -152,55 +172,8 @@
plane = PLANE_GHOSTS
desired_alpha = 127 //When enabled, they're like half-transparent
-//'Normal'ness v v v
-//Various types of colorblindness R2R R2G R2B G2R G2G G2B B2R B2G B2B
-#define MATRIX_Monochromia list(0.33, 0.33, 0.33, 0.59, 0.59, 0.59, 0.11, 0.11, 0.11)
-#define MATRIX_Protanopia list(0.57, 0.43, 0, 0.56, 0.44, 0, 0, 0.24, 0.76)
-#define MATRIX_Protanomaly list(0.82, 0.18, 0, 0.33, 0.67, 0, 0, 0.13, 0.88)
-#define MATRIX_Deuteranopia list(0.63, 0.38, 0, 0.70, 0.30, 0, 0, 0.30, 0.70)
-#define MATRIX_Deuteranomaly list(0.80, 0.20, 0, 0.26, 0.74, 0, 0, 0.14, 0.86)
-#define MATRIX_Tritanopia list(0.95, 0.05, 0, 0, 0.43, 0.57, 0, 0.48, 0.53)
-#define MATRIX_Tritanomaly list(0.97, 0.03, 0, 0, 0.73, 0.27, 0, 0.18, 0.82)
-#define MATRIX_Achromatopsia list(0.30, 0.59, 0.11, 0.30, 0.59, 0.11, 0.30, 0.59, 0.11)
-#define MATRIX_Achromatomaly list(0.62, 0.32, 0.06, 0.16, 0.78, 0.06, 0.16, 0.32, 0.52)
-#define MATRIX_Vulp_Colorblind list(0.50, 0.40, 0.10, 0.50, 0.40, 0.10, 0, 0.20, 0.80)
-#define MATRIX_Taj_Colorblind list(0.40, 0.20, 0.40, 0.40, 0.60, 0, 0.20, 0.20, 0.60)
-
/////////////////
-//Colorblindness uses special color shenanigans
-/obj/screen/plane_master/colorblindness
- plane = PLANE_WORLD //Affects the main game world
- color = MATRIX_Monochromia
- alpha = 255 //Starts out nice and opaque
- invisibility = 101 //Can't see it usually
- mouse_opacity = 1 //Don't make entire world not visible pls
- invis_toggle = TRUE
- sub_planes = list(VIS_D_COLORBLINDI)
- var/list/varieties = list(
- "Monochromia" = MATRIX_Monochromia,
- "Protanopia" = MATRIX_Protanopia,
- "Protanomaly" = MATRIX_Protanomaly,
- "Deuteranopia" = MATRIX_Deuteranopia,
- "Deuteranomaly" = MATRIX_Deuteranomaly,
- "Tritanopia" = MATRIX_Tritanopia,
- "Tritanomaly" = MATRIX_Tritanomaly,
- "Achromatopsia" = MATRIX_Achromatopsia,
- "Achromatomaly" = MATRIX_Achromatomaly,
- "Paradise Vulp" = MATRIX_Vulp_Colorblind,
- "Paradise Taj" = MATRIX_Taj_Colorblind
- )
-
-/obj/screen/plane_master/colorblindness/alter_plane_values(var/variety = null)
- var/new_matrix = varieties[variety]
- if(!new_matrix) return
-
- color = new_matrix
-
-/obj/screen/plane_master/colorblindness/proc/debug_variety()
- var/choice = input(usr,"Pick a type of colorblindness","Which?") as null|anything in varieties
- if(choice)
- color = varieties[choice]
-
-/obj/screen/plane_master/colorblindness/items
- plane = PLANE_PLAYER_HUD_ITEMS
- sub_planes = null
+//The main game planes start normal and visible
+/obj/screen/plane_master/main
+ alpha = 255
+ mouse_opacity = 1
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index ce34765ac0..6181c47c79 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -2,9 +2,10 @@
/mob/new_player
var/ready = 0
- var/spawning = 0//Referenced when you want to delete the new_player later on in the code.
- var/totalPlayers = 0 //Player counts for the Lobby tab
+ var/spawning = 0 //Referenced when you want to delete the new_player later on in the code.
+ var/totalPlayers = 0 //Player counts for the Lobby tab
var/totalPlayersReady = 0
+ var/show_hidden_jobs = 0 //Show jobs that are set to "Never" in preferences
var/datum/browser/panel
universal_speak = 1
@@ -27,7 +28,7 @@
/mob/new_player/proc/new_player_panel_proc()
var/output = ""
output +="
"
- output += " Setup Character "
+ output += " Character Setup "
if(!ticker || ticker.current_state <= GAME_STATE_PREGAME)
if(ready)
@@ -115,7 +116,7 @@
if(alert(src,"Are you sure you wish to observe? You will have to wait 5 minutes before being able to respawn!","Player Setup","Yes","No") == "Yes")
if(!client) return 1
-
+
//Make a new mannequin quickly, and allow the observer to take the appearance
var/mob/living/carbon/human/dummy/mannequin = new()
client.prefs.dress_preview_mob(mannequin)
@@ -285,6 +286,10 @@
handle_server_news()
return
+ if(href_list["hidden_jobs"])
+ show_hidden_jobs = !show_hidden_jobs
+ LateChoices()
+
/mob/new_player/proc/handle_server_news()
if(!client)
return
@@ -344,7 +349,6 @@
var/mob/living/character = create_character(T) //creates the human and transfers vars and mind
character = job_master.EquipRank(character, rank, 1) //equips the human
UpdateFactionList(character)
- log_game("JOINED [key_name(character)] as \"[rank]\"")
// AIs don't need a spawnpoint, they must spawn at an empty core
if(character.mind.assigned_role == "AI")
@@ -412,10 +416,18 @@
dat += " The station is currently undergoing crew transfer procedures."
dat += "Choose from the following open/valid positions: "
+ dat += " [show_hidden_jobs ? "Hide":"Show"] Hidden Jobs."
for(var/datum/job/job in job_master.occupations)
if(job && IsJobAvailable(job.title))
+ // Checks for jobs with minimum age requirements
if(job.minimum_character_age && (client.prefs.age < job.minimum_character_age))
continue
+ // Checks for jobs set to "Never" in preferences //TODO: Figure out a better way to check for this
+ if(!(client.prefs.GetJobDepartment(job, 1) & job.flag))
+ if(!(client.prefs.GetJobDepartment(job, 2) & job.flag))
+ if(!(client.prefs.GetJobDepartment(job, 3) & job.flag))
+ if(!show_hidden_jobs && job.title != "Assistant") // Assistant is always an option
+ continue
var/active = 0
// Only players with the job assigned and AFK for less than 10 minutes count as active
for(var/mob/M in player_list) if(M.mind && M.client && M.mind.assigned_role == job.title && M.client.inactivity <= 10 * 60 * 10)
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 8a2f769018..f465acb877 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -47,60 +47,80 @@
icon = 'icons/mob/Human_face_m.dmi' // default icon for all hairs
var/icon_add = 'icons/mob/human_face.dmi'
+ var/flags
bald
name = "Bald"
icon_state = "bald"
gender = MALE
+ flags = HAIR_VERY_SHORT
species_allowed = list(SPECIES_HUMAN,SPECIES_UNATHI,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_VOX)
short
name = "Short Hair" // try to capatilize the names please~
icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
+ flags = HAIR_VERY_SHORT
short2
name = "Short Hair 2"
icon_state = "hair_shorthair3"
+ flags = HAIR_VERY_SHORT
short3
name = "Short Hair 3"
icon_state = "hair_shorthair4"
+ flags = HAIR_VERY_SHORT
twintail
name = "Twintail"
icon_state = "hair_twintail"
+ flags = HAIR_TIEABLE
cut
name = "Cut Hair"
icon_state = "hair_c"
+ flags = HAIR_VERY_SHORT
flair
name = "Flaired Hair"
icon_state = "hair_flair"
+ flags = HAIR_TIEABLE
long
name = "Shoulder-length Hair"
icon_state = "hair_b"
+ flags = HAIR_TIEABLE
- /*longish
+/*
+ longish
name = "Longer Hair"
- icon_state = "hair_b2"*/
-
+ icon_state = "hair_b2"
+ flags = HAIR_TIEABLE
+*/
longer
name = "Long Hair"
icon_state = "hair_vlong"
+ flags = HAIR_TIEABLE
+
+ longeralt2
+ name = "Long Hair Alt 2"
+ icon_state = "hair_longeralt2"
+ flags = HAIR_TIEABLE
longest
name = "Very Long Hair"
icon_state = "hair_longest"
+ flags = HAIR_TIEABLE
longfringe
name = "Long Fringe"
icon_state = "hair_longfringe"
+ flags = HAIR_TIEABLE
longestalt
name = "Longer Fringe"
icon_state = "hair_vlongfringe"
+ flags = HAIR_TIEABLE
halfbang
name = "Half-banged Hair"
@@ -113,57 +133,72 @@
ponytail1
name = "Ponytail 1"
icon_state = "hair_ponytail"
+ flags = HAIR_TIEABLE
ponytail2
name = "Ponytail 2"
icon_state = "hair_pa"
+ flags = HAIR_TIEABLE
ponytail3
name = "Ponytail 3"
icon_state = "hair_ponytail3"
+ flags = HAIR_TIEABLE
ponytail4
name = "Ponytail 4"
icon_state = "hair_ponytail4"
+ flags = HAIR_TIEABLE
ponytail5
name = "Ponytail 5"
icon_state = "hair_ponytail5"
+ flags = HAIR_TIEABLE
ponytail6
name = "Ponytail 6"
icon_state = "hair_ponytail6"
+ flags = HAIR_TIEABLE
fringetail
name = "Fringetail"
icon_state = "hair_fringetail"
+ flags = HAIR_TIEABLE
sideponytail
name = "Side Ponytail"
icon_state = "hair_stail"
+ flags = HAIR_TIEABLE
sideponytail4 //Not happy about this... but it's for the save files.
name = "Side Ponytail 2"
icon_state = "hair_ponytailf"
+ flags = HAIR_TIEABLE
sideponytail2
name = "One Shoulder"
icon_state = "hair_oneshoulder"
+ flags = HAIR_TIEABLE
sideponytail3
name = "Tress Shoulder"
icon_state = "hair_tressshoulder"
+ flags = HAIR_TIEABLE
spikyponytail
name = "Spiky Ponytail"
icon_state = "hair_spikyponytail"
+ flags = HAIR_TIEABLE
zieglertail
name = "Zieglertail"
icon_state = "hair_ziegler"
+ flags = HAIR_TIEABLE
+
wisp
name = "Wisp"
icon_state = "hair_wisp"
+ flags = HAIR_TIEABLE
parted
name = "Parted"
@@ -176,6 +211,7 @@
sleeze
name = "Sleeze"
icon_state = "hair_sleeze"
+ flags = HAIR_VERY_SHORT
quiff
name = "Quiff"
@@ -192,32 +228,39 @@
bedhead3
name = "Bedhead 3"
icon_state = "hair_bedheadv3"
+ flags = HAIR_TIEABLE
bedheadlong
name = "Bedhead Long"
icon_state = "hair_long_bedhead"
+ flags = HAIR_TIEABLE
beehive
name = "Beehive"
icon_state = "hair_beehive"
+ flags = HAIR_TIEABLE
beehive2
name = "Beehive 2"
icon_state = "hair_beehive2"
+ flags = HAIR_TIEABLE
bobcurl
name = "Bobcurl"
icon_state = "hair_bobcurl"
species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI)
+ flags = HAIR_TIEABLE
bob
name = "Bob"
icon_state = "hair_bobcut"
species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI)
+ flags = HAIR_TIEABLE
bobcutalt
name = "Chin Length Bob"
icon_state = "hair_bobcutalt"
+ flags = HAIR_TIEABLE
bun
name = "Bun"
@@ -238,15 +281,18 @@
buzz
name = "Buzzcut"
icon_state = "hair_buzzcut"
+ flags = HAIR_VERY_SHORT
species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI)
shavehair
name = "Shaved Hair"
icon_state = "hair_shaved"
+ flags = HAIR_VERY_SHORT
crew
name = "Crewcut"
icon_state = "hair_crewcut"
+ flags = HAIR_VERY_SHORT
combover
name = "Combover"
@@ -271,6 +317,7 @@
curls
name = "Curls"
icon_state = "hair_curls"
+ flags = HAIR_TIEABLE
afro
name = "Afro"
@@ -287,14 +334,17 @@
rows
name = "Rows"
icon_state = "hair_rows1"
+ flags = HAIR_VERY_SHORT
rows2
name = "Rows 2"
icon_state = "hair_rows2"
+ flags = HAIR_TIEABLE
sargeant
name = "Flat Top"
icon_state = "hair_sargeant"
+ flags = HAIR_VERY_SHORT
emo
name = "Emo"
@@ -307,10 +357,12 @@
longemo
name = "Long Emo"
icon_state = "hair_emolong"
+ flags = HAIR_TIEABLE
fringeemo
name = "Emo Fringe"
icon_state = "hair_emofringe"
+ flags = HAIR_TIEABLE
veryshortovereyealternate
name = "Overeye Very Short, Alternate"
@@ -327,6 +379,7 @@
longovereye
name = "Overeye Long"
icon_state = "hair_longovereye"
+ flags = HAIR_TIEABLE
flowhair
name = "Flow Hair"
@@ -335,6 +388,7 @@
feather
name = "Feather"
icon_state = "hair_feather"
+ flags = HAIR_TIEABLE
hitop
name = "Hitop"
@@ -356,6 +410,7 @@
gentle
name = "Gentle"
icon_state = "hair_gentle"
+ flags = HAIR_TIEABLE
spiky
name = "Spiky"
@@ -369,51 +424,63 @@
kagami
name = "Pigtails"
icon_state = "hair_kagami"
+ flags = HAIR_TIEABLE
himecut
name = "Hime Cut"
icon_state = "hair_himecut"
+ flags = HAIR_TIEABLE
shorthime
name = "Short Hime Cut"
icon_state = "hair_shorthime"
+ flags = HAIR_TIEABLE
grandebraid
name = "Grande Braid"
icon_state = "hair_grande"
+ flags = HAIR_TIEABLE
mbraid
name = "Medium Braid"
icon_state = "hair_shortbraid"
+ flags = HAIR_TIEABLE
braid2
name = "Long Braid"
icon_state = "hair_hbraid"
+ flags = HAIR_TIEABLE
braid
name = "Floorlength Braid"
icon_state = "hair_braid"
+ flags = HAIR_TIEABLE
odango
name = "Odango"
icon_state = "hair_odango"
+ flags = HAIR_TIEABLE
ombre
name = "Ombre"
icon_state = "hair_ombre"
+ flags = HAIR_TIEABLE
updo
name = "Updo"
icon_state = "hair_updo"
+ flags = HAIR_TIEABLE
skinhead
name = "Skinhead"
icon_state = "hair_skinhead"
+ flags = HAIR_VERY_SHORT
balding
name = "Balding Hair"
icon_state = "hair_e"
gender = MALE
+ flags = HAIR_VERY_SHORT
familyman
name = "The Family Man"
@@ -434,10 +501,13 @@
poofy
name = "Poofy"
icon_state = "hair_poofy"
+ flags = HAIR_TIEABLE
poofy2
name = "Poofy2"
icon_state = "hair_poofy2"
+ flags = HAIR_TIEABLE
+
crono
name = "Chrono"
icon_state = "hair_toriyama"
@@ -461,6 +531,7 @@
nitori
name = "Nitori"
icon_state = "hair_nitori"
+ flags = HAIR_TIEABLE
joestar
name = "Joestar"
@@ -469,6 +540,7 @@
volaju
name = "Volaju"
icon_state = "hair_volaju"
+ flags = HAIR_TIEABLE
eighties
name = "80's"
@@ -486,14 +558,6 @@
name = "Modern"
icon_state = "hair_modern"
- bald
- name = "Bald"
- icon_state = "bald"
-
- longeralt2
- name = "Long Hair Alt 2"
- icon_state = "hair_longeralt2"
-
shortbangs
name = "Short Bangs"
icon_state = "hair_shortbangs"
@@ -505,10 +569,12 @@
bun
name = "Casual Bun"
icon_state = "hair_bun"
+ flags = HAIR_TIEABLE
doublebun
name = "Double-Bun"
icon_state = "hair_doublebun"
+ flags = HAIR_TIEABLE
oxton
name = "Oxton"
@@ -518,93 +584,113 @@
name = "Low Fade"
icon_state = "hair_lowfade"
gender = MALE
+ flags = HAIR_VERY_SHORT
medfade
name = "Medium Fade"
icon_state = "hair_medfade"
+ flags = HAIR_VERY_SHORT
highfade
name = "High Fade"
icon_state = "hair_highfade"
gender = MALE
+ flags = HAIR_VERY_SHORT
baldfade
name = "Balding Fade"
icon_state = "hair_baldfade"
gender = MALE
+ flags = HAIR_VERY_SHORT
nofade
name = "Regulation Cut"
icon_state = "hair_nofade"
gender = MALE
+ flags = HAIR_VERY_SHORT
trimflat
name = "Trimmed Flat Top"
icon_state = "hair_trimflat"
gender = MALE
+ flags = HAIR_VERY_SHORT
trimmed
name = "Trimmed"
icon_state = "hair_trimmed"
gender = MALE
+ flags = HAIR_VERY_SHORT
tightbun
name = "Tight Bun"
icon_state = "hair_tightbun"
gender = FEMALE
+ flags = HAIR_VERY_SHORT | HAIR_TIEABLE
coffeehouse
name = "Coffee House Cut"
icon_state = "hair_coffeehouse"
gender = MALE
+ flags = HAIR_VERY_SHORT
undercut1
name = "Undercut"
icon_state = "hair_undercut1"
gender = MALE
+ flags = HAIR_VERY_SHORT
undercut2
name = "Undercut Swept Right"
icon_state = "hair_undercut2"
gender = MALE
+ flags = HAIR_VERY_SHORT
undercut3
name = "Undercut Swept Left"
icon_state = "hair_undercut3"
gender = MALE
+ flags = HAIR_VERY_SHORT
partfade
name = "Parted Fade"
icon_state = "hair_shavedpart"
gender = MALE
+ flags = HAIR_VERY_SHORT
hightight
name = "High and Tight"
icon_state = "hair_hightight"
+ flags = HAIR_VERY_SHORT
rowbun
name = "Row Bun"
icon_state = "hair_rowbun"
+ flags = HAIR_TIEABLE
rowdualbraid
name = "Row Dual Braid"
icon_state = "hair_rowdualtail"
+ flags = HAIR_TIEABLE
rowbraid
name = "Row Braid"
icon_state = "hair_rowbraid"
+ flags = HAIR_TIEABLE
regulationmohawk
name = "Regulation Mohawk"
icon_state = "hair_shavedmohawk"
+ flags = HAIR_VERY_SHORT
topknot
name = "Topknot"
icon_state = "hair_topknot"
+ flags = HAIR_TIEABLE
ronin
name = "Ronin"
icon_state = "hair_ronin"
+ flags = HAIR_TIEABLE
bowlcut2
name = "Bowl2"
@@ -613,18 +699,22 @@
thinning
name = "Thinning"
icon_state = "hair_thinning"
+ flags = HAIR_VERY_SHORT
thinningfront
name = "Thinning Front"
icon_state = "hair_thinningfront"
+ flags = HAIR_VERY_SHORT
thinningback
name = "Thinning Back"
icon_state = "hair_thinningrear"
+ flags = HAIR_VERY_SHORT
manbun
name = "Manbun"
icon_state = "hair_manbun"
+ flags = HAIR_TIEABLE
shy
name = "Shy"
@@ -649,6 +739,22 @@
mohawkunshaven
name = "Unshaven Mohawk"
icon_state = "hair_unshaven_mohawk"
+
+ belenko
+ name = "Belenko"
+ icon_state = "hair_belenko"
+ flags = HAIR_TIEABLE
+
+ belenkotied
+ name = "Belenko Tied"
+ icon_state = "hair_belenkotied"
+ flags = HAIR_TIEABLE
+
+ belenkotied
+ name = "Supernova"
+ icon_state = "hair_supernova"
+ flags = HAIR_TIEABLE
+
/*
///////////////////////////////////
/ =---------------------------= /
@@ -1167,6 +1273,24 @@
name = "Tattoo (Campbell, L.Arm)"
body_parts = list(BP_L_ARM)
+ rightleg
+ name = "Tattoo (Campbell, R.Leg)"
+ body_parts = list(BP_R_LEG)
+
+ leftleg
+ name = "Tattoo (Campbell, L.Leg)"
+ body_parts = list (BP_L_LEG)
+
+ tat_silverburgh
+ name = "Tattoo (Silverburgh, R.Leg)"
+ icon_state = "tat_silverburgh"
+ body_parts = list (BP_R_LEG)
+
+ left
+ name = "Tattoo (Silverburgh, L.Leg)"
+ icon_state = "tat_silverburgh"
+ body_parts = list (BP_L_LEG)
+
tat_tiger
name = "Tattoo (Tiger Stripes, Body)"
icon_state = "tat_tiger"
diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm
index 95a6ab7121..1f245ba3a3 100644
--- a/code/modules/multiz/movement.dm
+++ b/code/modules/multiz/movement.dm
@@ -151,6 +151,9 @@
if(!below)
return
+ if(istype(below, /turf/space))
+ return
+
var/turf/T = loc
if(!T.CanZPass(src, DOWN) || !below.CanZPass(src, DOWN))
return
@@ -395,7 +398,7 @@
if(!silent)
if(planetary)
visible_message(" \A [src] falls out of the sky and crashes into \the [landing]!", \
- " You fall out of the skiy and crash into \the [landing]!", \
+ " You fall out of the sky and crash into \the [landing]!", \
"You hear something slam into \the [landing].")
var/turf/T = get_turf(landing)
explosion(T, 0, 1, 2)
diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm
index 8b97ffdb35..f819e2ca7b 100644
--- a/code/modules/multiz/structures.dm
+++ b/code/modules/multiz/structures.dm
@@ -141,20 +141,23 @@
if(!istype(above))
above.ChangeTurf(/turf/simulated/open)
-/obj/structure/stairs/Uncross(atom/movable/A)
- if(A.dir == dir)
- // This is hackish but whatever.
- var/turf/target = get_step(GetAbove(A), dir)
- var/turf/source = A.loc
- if(target.Enter(A, source))
- A.loc = target
- target.Entered(A, source)
- if(isliving(A))
- var/mob/living/L = A
- if(L.pulling)
- L.pulling.forceMove(target)
- return 0
- return 1
+/obj/structure/stairs/CheckExit(atom/movable/mover as mob|obj, turf/target as turf)
+ if(get_dir(loc, target) == dir && upperStep(mover.loc))
+ return FALSE
+ . = ..()
+
+/obj/structure/stairs/Bumped(atom/movable/A)
+ // This is hackish but whatever.
+ var/turf/target = get_step(GetAbove(A), dir)
+ if(target.Enter(A, src)) // Pass src to be ignored to avoid infinate loop
+ A.forceMove(target)
+ if(isliving(A))
+ var/mob/living/L = A
+ if(L.pulling)
+ L.pulling.forceMove(target)
+
+/obj/structure/stairs/proc/upperStep(var/turf/T)
+ return (T == loc)
/obj/structure/stairs/CanPass(obj/mover, turf/source, height, airflow)
return airflow || !density
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index 310bbfa9c5..ec003a813e 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -519,8 +519,3 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/update(var/force_open = 0)
src_object.ui_interact(user, ui_key, src, force_open, master_ui, state)
-
-/datum/nanoui/proc/append_template(var/key, var/filename)
- add_template(key, filename)
- open()
- update(1)
diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm
index ec0b9d8034..ee1056344f 100644
--- a/code/modules/organs/internal/brain.dm
+++ b/code/modules/organs/internal/brain.dm
@@ -1,3 +1,5 @@
+GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain)
+
/obj/item/organ/internal/brain
name = "brain"
health = 400 //They need to live awhile longer than other organs. Is this even used by organ code anymore?
@@ -135,12 +137,117 @@
icon_state = "green slime extract"
parent_organ = BP_TORSO
clone_source = TRUE
+ flags = OPENCONTAINER
/obj/item/organ/internal/brain/slime/is_open_container()
return 1
+/obj/item/organ/internal/brain/slime/New()
+ ..()
+ create_reagents(50)
+
+/obj/item/organ/internal/brain/slime/proc/reviveBody()
+ var/datum/dna2/record/R = new /datum/dna2/record()
+ R.dna = brainmob.dna
+ R.ckey = brainmob.ckey
+ R.id = copytext(md5(brainmob.real_name), 2, 6)
+ R.name = R.dna.real_name
+ R.types = DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE
+ R.languages = brainmob.languages
+ R.flavor = list()
+ for(var/datum/modifier/mod in brainmob.modifiers)
+ if(mod.flags & MODIFIER_GENETIC)
+ R.genetic_modifiers.Add(mod.type)
+
+ var/datum/mind/clonemind = brainmob.mind
+
+ if(!istype(clonemind, /datum/mind)) //not a mind
+ return 0
+ if(clonemind.current && clonemind.current.stat != DEAD) //mind is associated with a non-dead body
+ return 0
+ if(clonemind.active) //somebody is using that mind
+ if(ckey(clonemind.key) != R.ckey)
+ return 0
+ else
+ for(var/mob/observer/dead/G in player_list)
+ if(G.ckey == R.ckey)
+ if(G.can_reenter_corpse)
+ break
+ else
+ return 0
+
+ for(var/modifier_type in R.genetic_modifiers) //Can't be revived. Probably won't happen...?
+ if(istype(modifier_type, /datum/modifier/no_clone))
+ return 0
+
+ var/mob/living/carbon/human/H = new /mob/living/carbon/human(get_turf(src), R.dna.species)
+
+ if(!R.dna)
+ H.dna = new /datum/dna()
+ H.dna.real_name = H.real_name
+ else
+ H.dna = R.dna
+
+ H.UpdateAppearance()
+ H.sync_organ_dna()
+ if(!R.dna.real_name) //to prevent null names
+ R.dna.real_name = "promethean ([rand(0,999)])"
+ H.real_name = R.dna.real_name
+
+ H.nutrition = 260 //Enough to try to regenerate ONCE.
+ H.adjustBruteLoss(40)
+ H.adjustFireLoss(40)
+ H.Paralyse(4)
+ H.updatehealth()
+ for(var/obj/item/organ/external/E in H.organs) //They've still gotta congeal, but it's faster than the clone sickness they'd normally get.
+ if(E && E.organ_tag == BP_L_ARM || E.organ_tag == BP_R_ARM || E.organ_tag == BP_L_LEG || E.organ_tag == BP_R_LEG)
+ E.removed()
+ qdel(E)
+ E = null
+ H.regenerate_icons()
+ clonemind.transfer_to(H)
+ for(var/modifier_type in R.genetic_modifiers)
+ H.add_modifier(modifier_type)
+
+ for(var/datum/language/L in R.languages)
+ H.add_language(L.name)
+ H.flavor_texts = R.flavor.Copy()
+ qdel(src)
+ return 1
+
+/datum/chemical_reaction/promethean_brain_revival
+ name = "Promethean Revival"
+ id = "prom_revival"
+ result = null
+ required_reagents = list("phoron" = 40)
+ result_amount = 1
+
+/datum/chemical_reaction/promethean_brain_revival/can_happen(var/datum/reagents/holder)
+ if(holder.my_atom && istype(holder.my_atom, /obj/item/organ/internal/brain/slime))
+ return ..()
+ return FALSE
+
+/datum/chemical_reaction/promethean_brain_revival/on_reaction(var/datum/reagents/holder)
+ var/obj/item/organ/internal/brain/slime/brain = holder.my_atom
+ if(brain.reviveBody())
+ brain.visible_message(" [brain] bubbles, surrounding itself with a rapidly expanding mass of slime!")
+ else
+ brain.visible_message(" [brain] shifts strangely, but falls still.")
+
/obj/item/organ/internal/brain/golem
name = "chem"
desc = "A tightly furled roll of paper, covered with indecipherable runes."
icon = 'icons/obj/wizard.dmi'
icon_state = "scroll"
+
+/obj/item/organ/internal/brain/grey
+ desc = "A piece of juicy meat found in a person's head. This one is strange."
+ icon_state = "brain_grey"
+
+/obj/item/organ/internal/brain/grey/colormatch/New()
+ ..()
+ var/mob/living/carbon/human/H = null
+ spawn(15)
+ if(ishuman(owner))
+ H = owner
+ color = H.species.blood_color
diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm
index ec4ca77a92..2048699dba 100644
--- a/code/modules/organs/internal/eyes.dm
+++ b/code/modules/organs/internal/eyes.dm
@@ -21,6 +21,17 @@
..()
robotize()
+/obj/item/organ/internal/eyes/grey
+ icon_state = "eyes_grey"
+
+/obj/item/organ/internal/eyes/grey/colormatch/New()
+ ..()
+ var/mob/living/carbon/human/H = null
+ spawn(15)
+ if(ishuman(owner))
+ H = owner
+ color = H.species.blood_color
+
/obj/item/organ/internal/eyes/proc/change_eye_color()
set name = "Change Eye Color"
set desc = "Changes your robotic eye color instantly."
@@ -39,7 +50,7 @@
// Now sync the organ's eye_colour list.
update_colour()
// Finally, update the eye icon on the mob.
- owner.update_eyes()
+ owner.regenerate_icons()
/obj/item/organ/internal/eyes/replaced(var/mob/living/carbon/human/target)
diff --git a/code/modules/organs/internal/heart.dm b/code/modules/organs/internal/heart.dm
index 8ca68878e3..10fdcada69 100644
--- a/code/modules/organs/internal/heart.dm
+++ b/code/modules/organs/internal/heart.dm
@@ -20,3 +20,15 @@
if(prob(1))
owner.custom_pain("A stabbing pain rolls through your chest!",1)
owner.apply_damage(damage = 25, damagetype = HALLOSS, def_zone = parent_organ)
+
+/obj/item/organ/internal/heart/grey
+ icon_state = "heart_grey-on"
+ dead_icon = "heart_grey-off"
+
+/obj/item/organ/internal/heart/grey/colormatch/New()
+ ..()
+ var/mob/living/carbon/human/H = null
+ spawn(15)
+ if(ishuman(owner))
+ H = owner
+ color = H.species.blood_color
diff --git a/code/modules/organs/internal/kidneys.dm b/code/modules/organs/internal/kidneys.dm
index 19652a6376..571fe4f9e9 100644
--- a/code/modules/organs/internal/kidneys.dm
+++ b/code/modules/organs/internal/kidneys.dm
@@ -35,3 +35,14 @@
owner.custom_pain("You feel extremely tired, like you can't move!",1)
owner.m_intent = "walk"
owner.hud_used.move_intent.icon_state = "walking"
+
+/obj/item/organ/internal/kidneys/grey
+ icon_state = "kidneys_grey"
+
+/obj/item/organ/internal/kidneys/grey/colormatch/New()
+ ..()
+ var/mob/living/carbon/human/H = null
+ spawn(15)
+ if(ishuman(owner))
+ H = owner
+ color = H.species.blood_color
diff --git a/code/modules/organs/internal/liver.dm b/code/modules/organs/internal/liver.dm
index 3b20f30214..a81c71895f 100644
--- a/code/modules/organs/internal/liver.dm
+++ b/code/modules/organs/internal/liver.dm
@@ -57,3 +57,14 @@
if(prob(1) && owner.getToxLoss() < owner.getMaxHealth()*0.3)
//owner << "" //Toxins provide their own messages for pain
owner.adjustToxLoss(5) //Not realistic to PA but there are basically no 'real' liver infections
+
+/obj/item/organ/internal/liver/grey
+ icon_state = "liver_grey"
+
+/obj/item/organ/internal/liver/grey/colormatch/New()
+ ..()
+ var/mob/living/carbon/human/H = null
+ spawn(15)
+ if(ishuman(owner))
+ H = owner
+ color = H.species.blood_color
diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm
index c42167f131..9966e93aa7 100644
--- a/code/modules/organs/internal/lungs.dm
+++ b/code/modules/organs/internal/lungs.dm
@@ -39,3 +39,14 @@
if(prob(1))
owner.custom_pain("You suddenly feel short of breath and take a sharp, painful breath!",1)
owner.adjustOxyLoss(30) //Look it's hard to simulate low O2 perfusion okay
+
+/obj/item/organ/internal/lungs/grey
+ icon_state = "lungs_grey"
+
+/obj/item/organ/internal/lungs/grey/colormatch/New()
+ ..()
+ var/mob/living/carbon/human/H = null
+ spawn(15)
+ if(ishuman(owner))
+ H = owner
+ color = H.species.blood_color
diff --git a/code/modules/organs/internal/voicebox.dm b/code/modules/organs/internal/voicebox.dm
new file mode 100644
index 0000000000..4de69fe8f2
--- /dev/null
+++ b/code/modules/organs/internal/voicebox.dm
@@ -0,0 +1,42 @@
+/*
+ * Voicebox/Vocal Synthesizers
+ * TL;DR: Assists with speaking languages that a species doesn't normally have,
+ * such as EAL. Not standard or organic, because at the moment it's undesireable to completely mute characters.
+ */
+
+/obj/item/organ/internal/voicebox
+ name = "larynx"
+ icon_state = "larynx"
+ parent_organ = BP_TORSO // We don't have a neck area
+ organ_tag = O_VOICE
+ will_assist_languages = list(LANGUAGE_GALCOM)
+
+/obj/item/organ/internal/voicebox/New()
+ ..()
+ amend_assist_langs()
+
+/obj/item/organ/internal/voicebox/proc/amend_assist_langs() // Adds the list of language datums assisted by the voicebox to the list used in speaking
+ for(var/L in will_assist_languages)
+ assists_languages |= all_languages[L]
+
+/obj/item/organ/internal/voicebox/proc/add_assistable_langs(var/language) // Adds a new language (by string/define) to the list of things the voicebox can assist
+ will_assist_languages |= language
+ amend_assist_langs() // Can't think of a better place to put this, makes the voicebox actually start to assist with the added language
+
+/////////////////////////////////
+// Voicebox Subtypes
+/////////////////////////////////
+
+/obj/item/organ/internal/voicebox/assist // In the off chance we get a species that doesn't speak GalCom by default
+
+/obj/item/organ/internal/voicebox/assist/New()
+ ..()
+ mechassist()
+
+/obj/item/organ/internal/voicebox/robot
+ name = "vocal synthesizer"
+ will_assist_languages = list(LANGUAGE_GALCOM, LANGUAGE_EAL) // Synthetics spawn with this by default
+
+/obj/item/organ/internal/voicebox/robot/New()
+ ..()
+ robotize()
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index e26ea19374..ea31950e3d 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -27,9 +27,14 @@ var/list/organ_cache = list()
var/min_bruised_damage = 10 // Damage before considered bruised
var/min_broken_damage = 30 // Damage before becoming broken
var/max_damage // Damage cap
+ var/can_reject = 1 // Can this organ reject?
var/rejecting // Is this organ already being rejected?
var/preserved = 0 // If this is 1, prevents organ decay.
+ // Language vars. Putting them here in case we decide to do something crazy with sign-or-other-nonverbal languages.
+ var/list/will_assist_languages = list()
+ var/list/datum/language/assists_languages = list()
+
/obj/item/organ/Destroy()
if(owner) owner = null
@@ -188,7 +193,7 @@ var/list/organ_cache = list()
/obj/item/organ/proc/handle_rejection()
// Process unsuitable transplants. TODO: consider some kind of
// immunosuppressant that changes transplant data to make it match.
- if(dna)
+ if(dna && can_reject)
if(!rejecting)
if(blood_incompatible(dna.b_type, owner.dna.b_type, species, owner.species))
rejecting = 1
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 57c06cbb8e..16250e2c22 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -24,6 +24,7 @@
var/brute_dam = 0 // Actual current brute damage.
var/burn_dam = 0 // Actual current burn damage.
var/last_dam = -1 // used in healing/processing calculations.
+ var/spread_dam = 0
// Appearance vars.
var/nonsolid // Snowflake warning, reee. Used for slime limbs.
@@ -71,6 +72,8 @@
var/open = 0
var/stage = 0
var/cavity = 0
+ var/burn_stage = 0 //Surgical repair stage for burn.
+ var/brute_stage = 0 //Surgical repair stage for brute.
// HUD element variable, see organ_icon.dm get_damage_hud_image()
var/image/hud_damage_image
@@ -253,7 +256,7 @@
//Continued damage to vital organs can kill you, and robot organs don't count towards total damage so no need to cap them.
return (vital || (robotic >= ORGAN_ROBOT) || brute_dam + burn_dam + additional_damage < max_damage)
-/obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
+/obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list(), permutation = 0)
brute = round(brute * brute_mod, 0.1)
burn = round(burn * burn_mod, 0.1)
@@ -280,6 +283,8 @@
// If the limbs can break, make sure we don't exceed the maximum damage a limb can take before breaking
// Non-vital organs are limited to max_damage. You can't kill someone by bludeonging their arm all the way to 200 -- you can
// push them faster into paincrit though, as the additional damage is converted into shock.
+ var/brute_overflow = 0
+ var/burn_overflow = 0
if(is_damageable(brute + burn) || !config.limbs_can_break)
if(brute)
if(can_cut)
@@ -306,20 +311,22 @@
createwound( CUT, min(brute,can_inflict) )
else
createwound( BRUISE, min(brute,can_inflict) )
- var/temp = can_inflict
- //How much mroe damage can we inflict
- can_inflict = max(0, can_inflict - brute)
+ //How much more damage can we inflict
+ brute_overflow = max(0, brute - can_inflict)
//How much brute damage is left to inflict
- spillover += max(0, brute - temp)
+ spillover += max(0, brute - can_inflict)
+
+ can_inflict = max_damage * config.organ_health_multiplier - (brute_dam + burn_dam) //Refresh the can_inflict var, so burn doesn't overload the limb if it is set to take both.
if (burn > 0 && can_inflict)
//Inflict all burn damage we can
createwound(BURN, min(burn,can_inflict))
//How much burn damage is left to inflict
- spillover += max(0, burn - can_inflict)
+ burn_overflow = max(0, burn - can_inflict)
+ spillover += burn_overflow
- //If there are still hurties to dispense
- if (spillover)
+ //If there is pain to dispense.
+ if(spillover)
owner.shock_stage += spillover * config.organ_damage_spillover_multiplier
// sync the organ's damage with its wounds
@@ -348,12 +355,19 @@
if(edge_eligible && brute >= max_damage / DROPLIMB_THRESHOLD_EDGE && prob(brute))
droplimb(0, DROPLIMB_EDGE)
- else if(burn >= max_damage / DROPLIMB_THRESHOLD_DESTROY && prob(burn/3))
+ else if((burn >= max_damage / DROPLIMB_THRESHOLD_DESTROY) || (nonsolid && burn >= 5 && (burn_dam + burn >= max_damage)) && prob(burn/3))
droplimb(0, DROPLIMB_BURN)
- else if(brute >= max_damage / DROPLIMB_THRESHOLD_DESTROY && prob(brute))
+ else if((brute >= max_damage / DROPLIMB_THRESHOLD_DESTROY && prob(brute)) || (nonsolid && brute >= 5 && (brute_dam + brute >= max_damage) && prob(brute/2)))
droplimb(0, DROPLIMB_BLUNT)
else if(brute >= max_damage / DROPLIMB_THRESHOLD_TEAROFF && prob(brute/3))
droplimb(0, DROPLIMB_EDGE)
+ else if(spread_dam && owner && parent && (brute_overflow || burn_overflow) && (brute_overflow >= 5 || burn_overflow >= 5) && !permutation) //No infinite damage loops.
+ if(children && children.len)
+ spawn()
+ for(var/obj/item/organ/external/C in children)
+ if(!C.is_stump())
+ C.take_damage(brute_overflow / children.len / 3, burn_overflow / children.len / 3, 0, 0, null, forbidden_limbs, 1) //Splits the damage to each individual 'child', incase multiple exist.
+ parent.take_damage(brute_overflow / 3, burn_overflow / 3, 0, 0, null, forbidden_limbs, 1)
return update_icon()
@@ -1034,6 +1048,8 @@ Note that amputating the affected organ does in fact remove the infection from t
var/obj/item/clothing/suit/space/suit = owner.wear_suit
suit.handle_fracture(owner, src)
+ return 1
+
/obj/item/organ/external/proc/mend_fracture()
if(robotic >= ORGAN_ROBOT)
return 0 //ORGAN_BROKEN doesn't have the same meaning for robot limbs
@@ -1075,6 +1091,8 @@ Note that amputating the affected organ does in fact remove the infection from t
R = basic_robolimb
if(R)
force_icon = R.icon
+ brute_mod *= R.robo_brute_mod
+ burn_mod *= R.robo_burn_mod
if(R.lifelike)
robotic = ORGAN_LIFELIKE
name = "[initial(name)]"
@@ -1312,3 +1330,18 @@ Note that amputating the affected organ does in fact remove the infection from t
if(6 to INFINITY)
flavor_text += "a ton of [wound]\s"
return english_list(flavor_text)
+
+// Returns a list of the clothing (not glasses) that are covering this part
+/obj/item/organ/external/proc/get_covering_clothing()
+ var/list/covering_clothing = list()
+ if(owner)
+ var/list/protective_gear = list(owner.head, owner.wear_mask, owner.wear_suit, owner.w_uniform, owner.gloves, owner.shoes)
+ for(var/obj/item/clothing/gear in protective_gear)
+ if(gear.body_parts_covered & src.body_part)
+ covering_clothing |= gear
+ if(LAZYLEN(gear.accessories))
+ for(var/obj/item/clothing/accessory/bling in gear.accessories)
+ if(bling.body_parts_covered & src.body_part)
+ covering_clothing |= bling
+
+ return covering_clothing
\ No newline at end of file
diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm
index 971af563ee..91b96fea31 100644
--- a/code/modules/organs/organ_icon.dm
+++ b/code/modules/organs/organ_icon.dm
@@ -4,13 +4,13 @@ var/global/list/limb_icon_cache = list()
return
/obj/item/organ/external/proc/compile_icon()
- overlays.Cut()
+ cut_overlays()
// This is a kludge, only one icon has more than one generation of children though.
for(var/obj/item/organ/external/organ in contents)
if(organ.children && organ.children.len)
for(var/obj/item/organ/external/child in organ.children)
overlays += child.mob_icon
- overlays += organ.mob_icon
+ add_overlay(organ.mob_icon)
/obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human)
s_tone = null
@@ -51,10 +51,10 @@ var/global/list/limb_icon_cache = list()
/obj/item/organ/external/head/get_icon()
..()
-
+
//The overlays are not drawn on the mob, they are used for if the head is removed and becomes an item
cut_overlays()
-
+
//Every 'addon' below requires information from species
if(!owner || !owner.species)
return
@@ -78,7 +78,7 @@ var/global/list/limb_icon_cache = list()
eyes_icon.Blend(rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes), ICON_ADD)
add_overlay(eyes_icon)
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
-
+
//Lip color/icon
if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS)))
var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s")
@@ -94,6 +94,12 @@ var/global/list/limb_icon_cache = list()
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
+ add_overlay(get_hair_icon())
+
+ return mob_icon
+
+/obj/item/organ/external/head/proc/get_hair_icon()
+ var/image/res = image('icons/mob/human_face.dmi',"bald_s")
//Facial hair
if(owner.f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style]
@@ -101,20 +107,24 @@ var/global/list/limb_icon_cache = list()
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
if(facial_hair_style.do_colouration)
facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD)
- add_overlay(facial_s)
+ res.add_overlay(facial_s)
//Head hair
if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR)))
- var/datum/sprite_accessory/hair/hair_style = hair_styles_list[owner.h_style]
+ var/style = owner.h_style
+ var/datum/sprite_accessory/hair/hair_style = hair_styles_list[style]
+ if(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR))
+ if(!(hair_style.flags & HAIR_VERY_SHORT))
+ hair_style = hair_styles_list["Short Hair"]
if(hair_style && (species.get_bodytype(owner) in hair_style.species_allowed))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s")
if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3)
hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY)
hair_s.Blend(hair_s_add, ICON_ADD)
- add_overlay(hair_s)
+ res.add_overlay(hair_s)
- return mob_icon
+ return res
/obj/item/organ/external/proc/get_icon(var/skeletal)
@@ -154,7 +164,7 @@ var/global/list/limb_icon_cache = list()
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], ICON_ADD)
- overlays |= mark_s //So when it's not on your body, it has icons
+ add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
@@ -169,6 +179,14 @@ var/global/list/limb_icon_cache = list()
if(model)
icon_cache_key += "_model_[model]"
apply_colouration(mob_icon)
+ if(owner && owner.synth_markings)
+ for(var/M in markings)
+ var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
+ var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
+ mark_s.Blend(markings[M]["color"], ICON_ADD)
+ add_overlay(mark_s) //So when it's not on your body, it has icons
+ mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
+ icon_cache_key += "[M][markings[M]["color"]]"
dir = EAST
icon = mob_icon
@@ -248,7 +266,7 @@ var/list/robot_hud_colours = list("#CFCFCF","#AFAFAF","#8F8F8F","#6F6F6F","#4F4F
var/b = 0.11 * R.health_hud_intensity
temp.color = list(r, r, r, g, g, g, b, b, b)
hud_damage_image = image(null)
- hud_damage_image.overlays += temp
+ hud_damage_image.add_overlay(temp)
// Calculate the required color index.
var/dam_state = min(1,((brute_dam+burn_dam)/max_damage))
diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm
index 2e7d9ad6ed..825d3f5892 100644
--- a/code/modules/organs/robolimbs.dm
+++ b/code/modules/organs/robolimbs.dm
@@ -49,6 +49,9 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
var/suggested_species = "Human" //If it should make the torso a species
var/speech_bubble_appearance = "synthetic" // What icon_state to use for speech bubbles when talking. Check talk.dmi for all the icons.
+ var/robo_brute_mod = 1 // Multiplier for incoming brute damage.
+ var/robo_burn_mod = 1 // As above for burn.
+
/datum/robolimb/unbranded_monitor
company = "Unbranded Monitor"
desc = "A generic unbranded interpretation of a popular prosthetic head model. It looks rudimentary and cheaply constructed."
@@ -57,6 +60,18 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
monitor_styles = standard_monitor_styles
unavailable_to_build = 1
+/datum/robolimb/unbranded_alt1
+ company = "Unbranded - Protez"
+ desc = "A simple robotic limb with retro design. Seems rather stiff."
+ icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt1.dmi'
+ unavailable_to_build = 1
+
+/datum/robolimb/unbranded_alt2
+ company = "Unbranded - Mantis Prosis"
+ desc = "This limb has a casing of sleek black metal and repulsive insectile design."
+ icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt2.dmi'
+ unavailable_to_build = 1
+
/datum/robolimb/nanotrasen
company = "NanoTrasen"
desc = "A simple but efficient robotic limb, created by NanoTrasen."
@@ -202,6 +217,8 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
skin_tone = 1
blood_color = "#CCCCCC"
speech_bubble_appearance = "normal"
+ robo_brute_mod = 1.1
+ robo_burn_mod = 1.1
/datum/robolimb/wardtakahashi
company = "Ward-Takahashi"
diff --git a/code/modules/organs/subtypes/indestructible.dm b/code/modules/organs/subtypes/indestructible.dm
new file mode 100644
index 0000000000..2f2e13400f
--- /dev/null
+++ b/code/modules/organs/subtypes/indestructible.dm
@@ -0,0 +1,65 @@
+/obj/item/organ/external/chest/indestructible
+ cannot_gib = 1
+ cannot_amputate = 1
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/groin/indestructible
+ cannot_gib = 1
+ cannot_amputate = 1
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/arm/indestructible
+ cannot_gib = 1
+ cannot_amputate = 1
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/arm/right/indestructible
+ cannot_gib = 1
+ cannot_amputate = 1
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/leg/indestructible
+ cannot_gib = 1
+ cannot_amputate = 1
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/leg/right/indestructible
+ cannot_gib = 1
+ cannot_amputate = 1
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/foot/indestructible
+ cannot_gib = 1
+ cannot_amputate = 1
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/foot/right/indestructible
+ cannot_gib = 1
+ cannot_amputate = 1
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/hand/indestructible
+ cannot_gib = 1
+ cannot_amputate = 1
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/hand/right/indestructible
+ cannot_gib = 1
+ cannot_amputate = 1
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/head/indestructible
+ cannot_gib = 1
+ cannot_amputate = 1
+ cannot_break = 1
+ dislocated = -1
diff --git a/code/modules/organs/subtypes/slime.dm b/code/modules/organs/subtypes/slime.dm
index 1c9c11d75b..f22b90caea 100644
--- a/code/modules/organs/subtypes/slime.dm
+++ b/code/modules/organs/subtypes/slime.dm
@@ -2,46 +2,57 @@
nonsolid = 1
max_damage = 50
encased = 0
+ spread_dam = 1
/obj/item/organ/external/groin/unbreakable/slime
nonsolid = 1
max_damage = 30
+ spread_dam = 1
/obj/item/organ/external/arm/unbreakable/slime
nonsolid = 1
- max_damage = 5
+ max_damage = 20
+ spread_dam = 1
/obj/item/organ/external/arm/right/unbreakable/slime
nonsolid = 1
- max_damage = 5
+ max_damage = 20
+ spread_dam = 1
/obj/item/organ/external/leg/unbreakable/slime
nonsolid = 1
- max_damage = 5
+ max_damage = 20
+ spread_dam = 1
/obj/item/organ/external/leg/right/unbreakable/slime
nonsolid = 1
- max_damage = 5
+ max_damage = 20
+ spread_dam = 1
/obj/item/organ/external/foot/unbreakable/slime
nonsolid = 1
- max_damage = 5
+ max_damage = 20
+ spread_dam = 1
/obj/item/organ/external/foot/right/unbreakable/slime
nonsolid = 1
- max_damage = 5
+ max_damage = 20
+ spread_dam = 1
/obj/item/organ/external/hand/unbreakable/slime
nonsolid = 1
- max_damage = 5
+ max_damage = 20
+ spread_dam = 1
/obj/item/organ/external/hand/right/unbreakable/slime
nonsolid = 1
- max_damage = 5
+ max_damage = 20
+ spread_dam = 1
/obj/item/organ/external/head/unbreakable/slime //They don't need this anymore.
nonsolid = 1
cannot_gib = 0
vital = 0
- max_damage = 5
- encased = 0
\ No newline at end of file
+ max_damage = 30
+ encased = 0
+ spread_dam = 1
diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm
index a499a437ab..a3ab809523 100644
--- a/code/modules/organs/subtypes/standard.dm
+++ b/code/modules/organs/subtypes/standard.dm
@@ -25,8 +25,9 @@
/obj/item/organ/external/chest/robotize()
if(..())
- // Give them a new cell.
- owner.internal_organs_by_name["cell"] = new /obj/item/organ/internal/cell(owner,1)
+ // Give them fancy new organs.
+ owner.internal_organs_by_name[O_CELL] = new /obj/item/organ/internal/cell(owner,1)
+ owner.internal_organs_by_name[O_VOICE] = new /obj/item/organ/internal/voicebox/robot(owner, 1)
/obj/item/organ/external/chest/handle_germ_effects()
. = ..() //Should return an infection level
diff --git a/code/modules/organs/subtypes/unseverable.dm b/code/modules/organs/subtypes/unseverable.dm
new file mode 100644
index 0000000000..370b659454
--- /dev/null
+++ b/code/modules/organs/subtypes/unseverable.dm
@@ -0,0 +1,43 @@
+/obj/item/organ/external/chest/unseverable
+ cannot_gib = 1
+ cannot_amputate = 1
+
+/obj/item/organ/external/groin/unseverable
+ cannot_gib = 1
+ cannot_amputate = 1
+
+/obj/item/organ/external/arm/unseverable
+ cannot_gib = 1
+ cannot_amputate = 1
+
+/obj/item/organ/external/arm/right/unseverable
+ cannot_gib = 1
+ cannot_amputate = 1
+
+/obj/item/organ/external/leg/unseverable
+ cannot_gib = 1
+ cannot_amputate = 1
+
+/obj/item/organ/external/leg/right/unseverable
+ cannot_gib = 1
+ cannot_amputate = 1
+
+/obj/item/organ/external/foot/unseverable
+ cannot_gib = 1
+ cannot_amputate = 1
+
+/obj/item/organ/external/foot/right/unseverable
+ cannot_gib = 1
+ cannot_amputate = 1
+
+/obj/item/organ/external/hand/unseverable
+ cannot_gib = 1
+ cannot_amputate = 1
+
+/obj/item/organ/external/hand/right/unseverable
+ cannot_gib = 1
+ cannot_amputate = 1
+
+/obj/item/organ/external/head/unseverable
+ cannot_gib = 1
+ cannot_amputate = 1
diff --git a/code/modules/organs/subtypes/xenos.dm b/code/modules/organs/subtypes/xenos.dm
index 95024a6355..f573930489 100644
--- a/code/modules/organs/subtypes/xenos.dm
+++ b/code/modules/organs/subtypes/xenos.dm
@@ -1,23 +1,46 @@
//XENOMORPH ORGANS
/obj/item/organ/internal/xenos
name = "xeno organ"
- icon = 'icons/effects/blood.dmi'
+ icon = 'icons/obj/surgery.dmi'
desc = "It smells like an accident in a chemical factory."
/obj/item/organ/internal/xenos/eggsac
name = "egg sac"
parent_organ = BP_GROIN
- icon_state = "xgibmid1"
+ icon_state = "sac"
organ_tag = O_EGG
+/obj/item/organ/internal/xenos/eggsac/grey
+ icon_state = "sac_grey"
+
+/obj/item/organ/internal/xenos/eggsac/grey/colormatch/New()
+ ..()
+ var/mob/living/carbon/human/H = null
+ spawn(15)
+ if(ishuman(owner))
+ H = owner
+ color = H.species.blood_color
+
/obj/item/organ/internal/xenos/plasmavessel
name = "plasma vessel"
parent_organ = BP_TORSO
- icon_state = "xgibdown1"
+ icon_state = "plasma"
organ_tag = O_PLASMA
var/stored_plasma = 0
var/max_plasma = 500
+/obj/item/organ/internal/xenos/plasmavessel/grey
+ icon_state = "plasma_grey"
+ stored_plasma = 200
+
+/obj/item/organ/internal/xenos/plasmavessel/grey/colormatch/New()
+ ..()
+ var/mob/living/carbon/human/H = null
+ spawn(15)
+ if(ishuman(owner))
+ H = owner
+ color = H.species.blood_color
+
/obj/item/organ/internal/xenos/plasmavessel/queen
name = "bloated plasma vessel"
stored_plasma = 200
@@ -35,17 +58,51 @@
/obj/item/organ/internal/xenos/acidgland
name = "acid gland"
parent_organ = BP_HEAD
- icon_state = "xgibtorso"
+ icon_state = "acidgland"
organ_tag = O_ACID
+/obj/item/organ/internal/xenos/acidgland/grey
+ icon_state = "acidgland_grey"
+
+/obj/item/organ/internal/xenos/acidgland/grey/colormatch/New()
+ ..()
+ var/mob/living/carbon/human/H = null
+ spawn(15)
+ if(ishuman(owner))
+ H = owner
+ color = H.species.blood_color
+
/obj/item/organ/internal/xenos/hivenode
name = "hive node"
parent_organ = BP_TORSO
- icon_state = "xgibmid2"
+ icon_state = "xenode"
organ_tag = O_HIVE
+/obj/item/organ/internal/xenos/hivenode/grey
+ icon_state = "xenode_grey"
+
+/obj/item/organ/internal/xenos/hivenode/grey/colormatch/New()
+ ..()
+ var/mob/living/carbon/human/H = null
+ spawn(15)
+ if(ishuman(owner))
+ H = owner
+ color = H.species.blood_color
+
/obj/item/organ/internal/xenos/resinspinner
name = "resin spinner"
parent_organ = BP_HEAD
- icon_state = "xgibmid2"
+ icon_state = "xenode"
organ_tag = O_RESIN
+
+
+/obj/item/organ/internal/xenos/resinspinner/grey
+ icon_state = "xenode_grey"
+
+/obj/item/organ/internal/xenos/resinspinner/grey/colormatch/New()
+ ..()
+ var/mob/living/carbon/human/H = null
+ spawn(15)
+ if(ishuman(owner))
+ H = owner
+ color = H.species.blood_color
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 940dac91e7..44a2d1310b 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -33,34 +33,34 @@
/obj/structure/filingcabinet/attackby(obj/item/P as obj, mob/user as mob)
if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo) || istype(P, /obj/item/weapon/paper_bundle))
- user << " You put [P] in [src]."
+ to_chat(user, " You put [P] in [src].")
user.drop_item()
P.loc = src
icon_state = "[initial(icon_state)]-open"
sleep(5)
icon_state = initial(icon_state)
updateUsrDialog()
- else if(istype(P, /obj/item/weapon/wrench))
+ else if(P.is_wrench())
playsound(loc, P.usesound, 50, 1)
anchored = !anchored
- user << " You [anchored ? "wrench" : "unwrench"] \the [src]."
- else if(istype(P, /obj/item/weapon/screwdriver))
- user << " You begin taking the [name] apart."
+ to_chat(user, " You [anchored ? "wrench" : "unwrench"] \the [src].")
+ else if(P.is_screwdriver())
+ to_chat(user, " You begin taking the [name] apart.")
playsound(src, P.usesound, 50, 1)
if(do_after(user, 10 * P.toolspeed))
playsound(loc, P.usesound, 50, 1)
- user << " You take the [name] apart."
+ to_chat(user, " You take the [name] apart.")
new /obj/item/stack/material/steel( src.loc, 4 )
for(var/obj/item/I in contents)
I.forceMove(loc)
qdel(src)
return
else
- user << " You can't put [P] in [src]!"
+ to_chat(user, " You can't put [P] in [src]!")
/obj/structure/filingcabinet/attack_hand(mob/user as mob)
if(contents.len <= 0)
- user << " \The [src] is empty."
+ to_chat(user, " \The [src] is empty.")
return
user.set_machine(src)
@@ -85,9 +85,9 @@
I.loc = loc
if(prob(25))
step_rand(I)
- user << " You pull \a [I] out of [src] at random."
+ to_chat(user, " You pull \a [I] out of [src] at random.")
return
- user << " You find nothing in [src]."
+ to_chat(user, " You find nothing in [src].")
/obj/structure/filingcabinet/Topic(href, href_list)
if(href_list["retrieve"])
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 816b62a099..e8940afecb 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -309,6 +309,7 @@
t = replacetext(t, "\[/h2\]", "")
t = replacetext(t, "\[h3\]", " ")
t = replacetext(t, "\[/h3\]", "")
+ t = replacetext(t, "\[tab\]", " ")
if(!iscrayon)
t = replacetext(t, "\[*\]", " ")
@@ -630,4 +631,8 @@
/obj/item/weapon/paper/crumpled/bloody/CrashedMedShuttle
name = "Blackbox Transcript - VMV Aurora's Light"
- info = "\[The paper is torn at the top, presumably from the impact. It's oil-stained, but you can just about read it.] mmons 19:52:01: Come on... it's right there in the distance, we're almost there! Doctor Nazarril 19:52:26: Odysseus online. Orrderrs, sirr? Captain Simmons 19:52:29: Brace for impact. We're going in full-speed. Technician Dynasty 19:52:44: Chief, fire's spread to the secondary propulsion systems. Captain Simmons 19:52:51: Copy. Any word from TraCon? Transponder's down still? Technician Dynasty 19:53:02: Can't get in touch, sir. Emergency beacon's active, but we're not going t- Doctor Nazarril 19:53:08: Don't say it. As long as we believe, we'll get through this. Captain Simmons 19:53:11: Damn right. We're a few klicks out from the port. Rough landing, but we can do it. V.I.T.A 19:53:26: Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay. A loud explosion is heard. V.I.T.A 19:53:29: Alert: fuel intake valve open. Technician Dynasty 19:53:31: ... ah. Doctor Nazarril 19:53:34: Trrranslate? V.I.T.A 19:53:37: There is a 16.92% chance of this vessel safely landing at the emergency destination. Note that there is an 83.08% chance of detonation of fuel supplies upon landing. Technician Dynasty 19:53:48: We'll make it, sure, but we'll explode and take out half the LZ with us. Propulsion's down, we can't slow down. If we land there, everyone in that port dies, no question. V.I.T.A 19:53:53: The Technician is correct. Doctor Nazarril 19:54:02: Then... we can't land therrre. V.I.T.A 19:54:11: Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible. Captain Simmons 19:54:27: I- alright. I'm bringing us down. You all know what this means. Doctor Nazarril 19:54:33: Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA. Technician Dynasty 19:54:39: We had a good run. I'm going to miss this. Captain Simmons 19:54:47: VITA. Tell them we died heroes. Tell them... we did all we could. V.I.T.A 19:54:48: I will. Impact in five. Four. Three. Doctor Nazarril 19:54:49: Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you. Technician Dynasty 19:54:50: Any time, kid. Any time. V.I.T.A 19:54:41: Two. V.I.T.A 19:54:42: One. **8/DEC/2561** V.I.T.A 06:22:16: Backup power restored. Attempting to establish connection with emergency rescue personnel. V.I.T.A 06:22:17: Unable to establish connection. Transponder destroyed on impact. V.I.T.A 06:22:18: No lifesigns detected on board. **1/JAN/2562** V.I.T.A 00:00:00: Happy New Year, crew. V.I.T.A 00:00:01: Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline. V.I.T.A 00:00:02: Nobody's coming. **14/FEB/2562** V.I.T.A 00:00:00: Roses are red. V.I.T.A 00:00:01: Violets are blue. V.I.T.A 00:00:02: Won't you come back? V.I.T.A 00:00:03: I miss you. **15/FEB/2562** V.I.T.A 22:19:06: Power reserves critical. Transferring remaining power to emergency broadcasting beacon. V.I.T.A 22:19:07: Should anyone find this, lay them to rest. They deserve a proper burial. V.I.T.A 22:19:08: Erasing files... shutting down. A low, monotone beep. **16/FEB/2562** Something chitters. End of transcript."
\ No newline at end of file
+ info = "\[The paper is torn at the top, presumably from the impact. It's oil-stained, but you can just about read it.] mmons 19:52:01: Come on... it's right there in the distance, we're almost there! Doctor Nazarril 19:52:26: Odysseus online. Orrderrs, sirr? Captain Simmons 19:52:29: Brace for impact. We're going in full-speed. Technician Dynasty 19:52:44: Chief, fire's spread to the secondary propulsion systems. Captain Simmons 19:52:51: Copy. Any word from TraCon? Transponder's down still? Technician Dynasty 19:53:02: Can't get in touch, sir. Emergency beacon's active, but we're not going t- Doctor Nazarril 19:53:08: Don't say it. As long as we believe, we'll get through this. Captain Simmons 19:53:11: Damn right. We're a few klicks out from the port. Rough landing, but we can do it. V.I.T.A 19:53:26: Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay. A loud explosion is heard. V.I.T.A 19:53:29: Alert: fuel intake valve open. Technician Dynasty 19:53:31: ... ah. Doctor Nazarril 19:53:34: Trrranslate? V.I.T.A 19:53:37: There is a 16.92% chance of this vessel safely landing at the emergency destination. Note that there is an 83.08% chance of detonation of fuel supplies upon landing. Technician Dynasty 19:53:48: We'll make it, sure, but we'll explode and take out half the LZ with us. Propulsion's down, we can't slow down. If we land there, everyone in that port dies, no question. V.I.T.A 19:53:53: The Technician is correct. Doctor Nazarril 19:54:02: Then... we can't land therrre. V.I.T.A 19:54:11: Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible. Captain Simmons 19:54:27: I- alright. I'm bringing us down. You all know what this means. Doctor Nazarril 19:54:33: Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA. Technician Dynasty 19:54:39: We had a good run. I'm going to miss this. Captain Simmons 19:54:47: VITA. Tell them we died heroes. Tell them... we did all we could. V.I.T.A 19:54:48: I will. Impact in five. Four. Three. Doctor Nazarril 19:54:49: Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you. Technician Dynasty 19:54:50: Any time, kid. Any time. V.I.T.A 19:54:41: Two. V.I.T.A 19:54:42: One. **8/DEC/2561** V.I.T.A 06:22:16: Backup power restored. Attempting to establish connection with emergency rescue personnel. V.I.T.A 06:22:17: Unable to establish connection. Transponder destroyed on impact. V.I.T.A 06:22:18: No lifesigns detected on board. **1/JAN/2562** V.I.T.A 00:00:00: Happy New Year, crew. V.I.T.A 00:00:01: Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline. V.I.T.A 00:00:02: Nobody's coming. **14/FEB/2562** V.I.T.A 00:00:00: Roses are red. V.I.T.A 00:00:01: Violets are blue. V.I.T.A 00:00:02: Won't you come back? V.I.T.A 00:00:03: I miss you. **15/FEB/2562** V.I.T.A 22:19:06: Power reserves critical. Transferring remaining power to emergency broadcasting beacon. V.I.T.A 22:19:07: Should anyone find this, lay them to rest. They deserve a proper burial. V.I.T.A 22:19:08: Erasing files... shutting down. A low, monotone beep. **16/FEB/2562** Something chitters. End of transcript."
+
+/obj/item/weapon/paper/manifest
+ name = "supply manifest"
+ var/is_copy = 1
\ No newline at end of file
diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm
index bbf630ced6..b1f58b0965 100644
--- a/code/modules/paperwork/papershredder.dm
+++ b/code/modules/paperwork/papershredder.dm
@@ -40,10 +40,10 @@
if(istype(W, /obj/item/weapon/storage))
empty_bin(user, W)
return
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
playsound(src, W.usesound, 50, 1)
anchored = !anchored
- user << "You [anchored ? "wrench" : "unwrench"] \the [src]."
+ to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
return
else if(default_part_replacement(user, W))
return
@@ -60,7 +60,7 @@
if(inoperable())
return // Need powah!
if(paperamount == max_paper)
- user << "\The [src] is full; please empty it before you continue."
+ to_chat(user, "\The [src] is full; please empty it before you continue.")
return
paperamount += paper_result
user.drop_from_inventory(W)
@@ -68,7 +68,7 @@
playsound(src.loc, 'sound/items/pshred.ogg', 75, 1)
flick(shred_anim, src)
if(paperamount > max_paper)
- user <<"\The [src] was too full, and shredded paper goes everywhere!"
+ to_chat(user,"\The [src] was too full, and shredded paper goes everywhere!")
for(var/i=(paperamount-max_paper);i>0;i--)
var/obj/item/weapon/shreddedp/SP = get_shredded_paper()
SP.loc = get_turf(src)
@@ -87,7 +87,7 @@
return
if(!paperamount)
- usr << "\The [src] is empty."
+ to_chat(usr, "\The [src] is empty.")
return
empty_bin(usr)
@@ -99,7 +99,7 @@
empty_into = null
if(empty_into && empty_into.contents.len >= empty_into.storage_slots)
- user << "\The [empty_into] is full."
+ to_chat(user, "\The [empty_into] is full.")
return
while(paperamount)
@@ -111,12 +111,12 @@
break
if(empty_into)
if(paperamount)
- user << "You fill \the [empty_into] with as much shredded paper as it will carry."
+ to_chat(user, "You fill \the [empty_into] with as much shredded paper as it will carry.")
else
- user << "You empty \the [src] into \the [empty_into]."
+ to_chat(user, "You empty \the [src] into \the [empty_into].")
else
- user << "You empty \the [src]."
+ to_chat(user, "You empty \the [src].")
update_icon()
/obj/machinery/papershredder/proc/get_shredded_paper()
@@ -171,12 +171,12 @@
if(user.restrained())
return
if(!P.lit)
- user << "\The [P] is not lit."
+ to_chat(user, "\The [P] is not lit.")
return
user.visible_message("\The [user] holds \the [P] up to \the [src]. It looks like [TU.he] [TU.is] trying to burn it!", \
"You hold \the [P] up to \the [src], burning it slowly.")
if(!do_after(user,20))
- user << "You must hold \the [P] steady to burn \the [src]."
+ to_chat(user, "You must hold \the [P] steady to burn \the [src].")
return
user.visible_message("\The [user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \
"You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.")
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 0870b60c64..515eaea110 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -80,7 +80,7 @@
var/obj/item/weapon/paper_bundle/B = bundlecopy(copyitem)
sleep(11*B.pages.len)
else
- usr << "\The [copyitem] can't be copied by \the [src]."
+ to_chat(usr, "\The [copyitem] can't be copied by \the [src].")
break
use_power(active_power_usage)
@@ -88,7 +88,7 @@
if(copyitem)
copyitem.loc = usr.loc
usr.put_in_hands(copyitem)
- usr << "You take \the [copyitem] out of \the [src]."
+ to_chat(usr, "You take \the [copyitem] out of \the [src].")
copyitem = null
else if(href_list["min"])
if(copies > 1)
@@ -126,24 +126,24 @@
user.drop_item()
copyitem = O
O.loc = src
- user << "You insert \the [O] into \the [src]."
+ to_chat(user, "You insert \the [O] into \the [src].")
playsound(loc, "sound/machines/click.ogg", 100, 1)
flick(insert_anim, src)
else
- user << "There is already something in \the [src]."
+ to_chat(user, "There is already something in \the [src].")
else if(istype(O, /obj/item/device/toner))
if(toner <= 10) //allow replacing when low toner is affecting the print darkness
user.drop_item()
- user << "You insert the toner cartridge into \the [src]."
+ to_chat(user, "You insert the toner cartridge into \the [src].")
var/obj/item/device/toner/T = O
toner += T.toner_amount
qdel(O)
else
- user << "This cartridge is not yet ready for replacement! Use up the rest of the toner."
- else if(istype(O, /obj/item/weapon/wrench))
+ to_chat(user, "This cartridge is not yet ready for replacement! Use up the rest of the toner.")
+ else if(O.is_wrench())
playsound(loc, O.usesound, 50, 1)
anchored = !anchored
- user << "You [anchored ? "wrench" : "unwrench"] \the [src]."
+ to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
else if(default_deconstruction_screwdriver(user, O))
return
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index c8b78cfd65..c239d1352a 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -33,11 +33,14 @@ var/global/photo_count = 0
var/icon/img //Big photo image
var/scribble //Scribble on the back.
var/icon/tiny
+ var/cursed = 0
var/photo_size = 3
/obj/item/weapon/photo/New()
id = photo_count++
+
+
/obj/item/weapon/photo/attack_self(mob/user as mob)
user.examinate(src)
@@ -131,7 +134,7 @@ var/global/photo_count = 0
var/icon_on = "camera"
var/icon_off = "camera_off"
var/size = 3
- var/picture_planes = list(PLANE_WORLD)
+ var/list/picture_planes = list()
/obj/item/device/camera/verb/change_size()
set name = "Set Photo Focus"
@@ -182,7 +185,7 @@ var/global/photo_count = 0
// As well as anything that isn't invisible.
for(var/atom/A in the_turf)
if(A.invisibility) continue
- if(!(A.plane in picture_planes)) continue
+ if(A.plane > 0 && !(A.plane in picture_planes)) continue
atoms.Add(A)
// Sort the atoms into their layers
@@ -191,7 +194,7 @@ var/global/photo_count = 0
for(var/i; i <= sorted.len; i++)
var/atom/A = sorted[i]
if(A)
- var/icon/img = getFlatIcon(A, picture_planes = picture_planes)//build_composite_icon(A)
+ var/icon/img = getFlatIcon(A, picture_planes)//build_composite_icon(A)
// If what we got back is actually a picture, draw it.
if(istype(img, /icon))
@@ -233,6 +236,11 @@ var/global/photo_count = 0
mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. "
else
mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]."
+
+ for(var/mob/living/simple_animal/hostile/statue/S in the_turf)
+ if(S)
+ mob_detail += "You can see \a [S] on the photo. Its stare makes you feel uneasy." //"That which holds the image of an angel, becomes itself an angel."
+
return mob_detail
/obj/item/device/camera/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
@@ -274,7 +282,21 @@ var/global/photo_count = 0
y_c--
x_c = x_c - size
+
+
+
var/obj/item/weapon/photo/p = createpicture(target, user, turfs, mobs, flag)
+ if(findtext(mobs, "Its stare makes you feel uneasy"))
+ p.cursed = 1
+ user.visible_message("Something starts to slowly manifest from the picture!")
+ spawn(150)
+ var/turf/T = get_turf(p)
+ var/mob/living/simple_animal/hostile/statue/S = new /mob/living/simple_animal/hostile/statue/(T)
+ S.banishable = 1//At least you can get rid of those bastards
+ T.visible_message("The photo turns into \a [S]!")
+ qdel(p)
+
+
printpicture(user, p)
/obj/item/device/camera/proc/createpicture(atom/target, mob/user, list/turfs, mobs, flag)
@@ -298,7 +320,6 @@ var/global/photo_count = 0
p.pixel_x = rand(-10, 10)
p.pixel_y = rand(-10, 10)
p.photo_size = size
-
return p
/obj/item/device/camera/proc/printpicture(mob/user, obj/item/weapon/photo/p)
@@ -318,6 +339,16 @@ var/global/photo_count = 0
p.pixel_y = pixel_y
p.photo_size = photo_size
p.scribble = scribble
+ p.cursed = cursed
+ if(p.cursed)
+ var/turf/T = get_turf(p)
+ T.visible_message("Something starts to slowly manifest from the picture!")
+ spawn(150)
+ T = get_turf(p) //second time, because the photo could've moved
+ var/mob/living/simple_animal/hostile/statue/S = new /mob/living/simple_animal/hostile/statue/(T)
+ S.banishable = 1//At least you can get rid of those bastards
+ T.visible_message("The photo turns into \a [S]!")
+ qdel(p)
if(copy_id)
p.id = id
diff --git a/code/modules/planet/planet.dm b/code/modules/planet/planet.dm
index 061ae73398..8fb7604417 100644
--- a/code/modules/planet/planet.dm
+++ b/code/modules/planet/planet.dm
@@ -30,9 +30,10 @@
current_time = current_time.make_random_time()
update_sun()
-/datum/planet/proc/process(amount)
+/datum/planet/proc/process(last_fire)
if(current_time)
- current_time = current_time.add_seconds(amount)
+ var/difference = world.time - last_fire
+ current_time = current_time.add_seconds(difference SECONDS)
update_weather() // We update this first, because some weather types decease the brightness of the sun.
if(sun_last_process <= world.time - sun_process_interval)
update_sun()
diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm
index 8717245b24..3491fac2db 100644
--- a/code/modules/planet/sif.dm
+++ b/code/modules/planet/sif.dm
@@ -184,7 +184,8 @@ datum/weather/sif
)
/datum/weather/sif/snow/process_effects()
- for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs)
+ ..()
+ for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
@@ -207,7 +208,8 @@ datum/weather/sif
)
/datum/weather/sif/blizzard/process_effects()
- for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs)
+ ..()
+ for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
@@ -219,6 +221,8 @@ datum/weather/sif
name = "rain"
icon_state = "rain"
light_modifier = 0.5
+ effect_message = "Rain falls on you."
+
transition_chances = list(
WEATHER_OVERCAST = 25,
WEATHER_LIGHT_SNOW = 10,
@@ -228,6 +232,7 @@ datum/weather/sif
)
/datum/weather/sif/rain/process_effects()
+ ..()
for(var/mob/living/L in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
@@ -238,16 +243,19 @@ datum/weather/sif
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(U.open)
- to_chat(L, "Rain patters softly onto your umbrella")
+ if(show_message)
+ to_chat(L, "Rain patters softly onto your umbrella")
continue
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
if(U.open)
- to_chat(L, "Rain patters softly onto your umbrella")
+ if(show_message)
+ to_chat(L, "Rain patters softly onto your umbrella")
continue
L.water_act(1)
- to_chat(L, "Rain falls on you.")
+ if(show_message)
+ to_chat(L, effect_message)
/datum/weather/sif/storm
name = "storm"
@@ -256,6 +264,11 @@ datum/weather/sif
temp_low = 233.15 // -40c
light_modifier = 0.3
flight_failure_modifier = 10
+ var/next_lightning_strike = 0 // world.time when lightning will strike.
+ var/min_lightning_cooldown = 5 SECONDS
+ var/max_lightning_cooldown = 1 MINUTE
+
+
transition_chances = list(
WEATHER_RAIN = 45,
WEATHER_STORM = 40,
@@ -264,6 +277,7 @@ datum/weather/sif
)
/datum/weather/sif/storm/process_effects()
+ ..()
for(var/mob/living/L in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
@@ -287,6 +301,17 @@ datum/weather/sif
L.water_act(2)
to_chat(L, "Rain falls on you, drenching you in water.")
+ handle_lightning()
+
+// This gets called to do lightning periodically.
+// There is a seperate function to do the actual lightning strike, so that badmins can play with it.
+/datum/weather/sif/storm/proc/handle_lightning()
+ if(world.time < next_lightning_strike)
+ return // It's too soon to strike again.
+ next_lightning_strike = world.time + rand(min_lightning_cooldown, max_lightning_cooldown)
+ var/turf/T = pick(holder.our_planet.planet_floors) // This has the chance to 'strike' the sky, but that might be a good thing, to scare reckless pilots.
+ lightning_strike(T)
+
/datum/weather/sif/hail
name = "hail"
icon_state = "hail"
@@ -294,6 +319,10 @@ datum/weather/sif
temp_low = 243.15 // -30c
light_modifier = 0.3
flight_failure_modifier = 15
+ timer_low_bound = 2
+ timer_high_bound = 5
+ effect_message = "The hail smacks into you!"
+
transition_chances = list(
WEATHER_RAIN = 45,
WEATHER_STORM = 40,
@@ -302,6 +331,7 @@ datum/weather/sif
)
/datum/weather/sif/hail/process_effects()
+ ..()
for(var/mob/living/carbon/human/H in living_mob_list)
if(H.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(H)
@@ -309,15 +339,18 @@ datum/weather/sif
continue // They're indoors, so no need to pelt them with ice.
// If they have an open umbrella, it'll guard from rain
+ // Message plays every time the umbrella gets stolen, just so they're especially aware of what's happening
if(istype(H.get_active_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = H.get_active_hand()
if(U.open)
- to_chat(H, "Hail patters gently onto your umbrella.")
+ if(show_message)
+ to_chat(H, "Hail patters gently onto your umbrella.")
continue
else if(istype(H.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = H.get_inactive_hand()
if(U.open)
- to_chat(H, "Hail patters gently onto your umbrella.")
+ if(show_message)
+ to_chat(H, "Hail patters gently onto your umbrella.")
continue
var/target_zone = pick(BP_ALL)
@@ -330,8 +363,9 @@ datum/weather/sif
if(amount_soaked >= 10)
continue // No need to apply damage.
- H.apply_damage(rand(5, 10), BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
- to_chat(H, "The hail smacks into you!")
+ H.apply_damage(rand(1, 3), BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
+ if(show_message)
+ to_chat(H, effect_message)
/datum/weather/sif/blood_moon
name = "blood moon"
diff --git a/code/modules/planet/weather.dm b/code/modules/planet/weather.dm
index 4b7e50a2a5..c3939956c5 100644
--- a/code/modules/planet/weather.dm
+++ b/code/modules/planet/weather.dm
@@ -8,6 +8,10 @@
var/list/roundstart_weather_chances = list()
var/next_weather_shift = null
+ // Holds the weather icon, using vis_contents. Documentation says an /atom/movable is required for placing inside another atom's vis_contents.
+ var/atom/movable/weather_visuals/visuals = null
+ var/atom/movable/weather_visuals/special/special_visuals = null
+
/datum/weather_holder/New(var/source)
..()
our_planet = source
@@ -15,13 +19,15 @@
var/datum/weather/W = allowed_weather_types[A]
if(istype(W))
W.holder = src
+ visuals = new()
+ special_visuals = new()
/datum/weather_holder/proc/change_weather(var/new_weather)
var/old_light_modifier = null
if(current_weather)
old_light_modifier = current_weather.light_modifier // We store the old one, so we can determine if recalculating the sun is needed.
current_weather = allowed_weather_types[new_weather]
- next_weather_shift = world.time + rand(20, 30) MINUTES
+ next_weather_shift = world.time + rand(current_weather.timer_low_bound, current_weather.timer_high_bound) MINUTES
update_icon_effects()
update_temperature()
@@ -41,7 +47,7 @@
current_weather.process_effects()
/datum/weather_holder/proc/update_icon_effects()
- our_planet.needs_work |= PLANET_PROCESS_WEATHER
+ visuals.icon_state = current_weather.icon_state
/datum/weather_holder/proc/update_temperature()
temperature = Interpolate(current_weather.temp_low, current_weather.temp_high, weight = our_planet.sun_position)
@@ -62,6 +68,29 @@
var/flight_failure_modifier = 0 // Some types of weather make flying harder, and therefore make crashes more likely.
var/transition_chances = list() // Assoc list
var/datum/weather_holder/holder = null
+ var/timer_low_bound = 5 // How long this weather must run before it tries to change, in minutes
+ var/timer_high_bound = 10 // How long this weather can run before it tries to change, in minutes
+
+ var/effect_message = null // Should be a string, this is what is shown to a mob caught in the weather
+ var/last_message = 0 // Keeps track of when the weather last tells EVERY player it's hitting them
+ var/message_delay = 10 SECONDS // Delay in between weather hit messages
+ var/show_message = FALSE // Is set to TRUE and plays the messsage every [message_delay]
/datum/weather/proc/process_effects()
+ show_message = FALSE // Need to reset the show_message var, just in case
+ if(effect_message) // Only bother with the code below if we actually need to display something
+ if(world.time >= last_message + message_delay)
+ last_message = world.time // Reset the timer
+ show_message = TRUE // Tell the rest of the process that we need to make a message
return
+
+// All this does is hold the weather icon.
+/atom/movable/weather_visuals
+ icon = 'icons/effects/weather.dmi'
+ mouse_opacity = 0
+ plane = PLANE_PLANETLIGHTING
+
+// This is for special effects for specific types of weather, such as lightning flashes in a storm.
+// It's a seperate object to allow the use of flick().
+/atom/movable/weather_visuals/special
+ plane = PLANE_LIGHTING_ABOVE
\ No newline at end of file
diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm
index dfea9f494e..1f1c01bab2 100644
--- a/code/modules/power/antimatter/control.dm
+++ b/code/modules/power/antimatter/control.dm
@@ -140,7 +140,7 @@
/obj/machinery/power/am_control_unit/attackby(obj/item/W, mob/user)
if(!istype(W) || !user) return
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
if(!anchored)
playsound(src, W.usesound, 75, 1)
user.visible_message("[user.name] secures the [src.name] to the floor.", \
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 9d513f386e..f4e920f000 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -64,6 +64,8 @@
desc = "A control terminal for the area electrical systems."
icon_state = "apc0"
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
anchored = 1
use_power = 0
req_access = list(access_engine_equip)
@@ -86,7 +88,6 @@
var/locked = 1
var/coverlocked = 1
var/aidisabled = 0
- var/tdir = null
var/obj/machinery/power/terminal/terminal = null
var/lastused_light = 0
var/lastused_equip = 0
@@ -163,11 +164,9 @@
// this allows the APC to be embedded in a wall, yet still inside an area
if (building)
set_dir(ndir)
- src.tdir = dir // to fix Vars bug
- set_dir(SOUTH)
- pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -24)
- pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 24 : -24) : 0
+ pixel_x = (src.dir & 3)? 0 : (src.dir == 4 ? 24 : -24)
+ pixel_y = (src.dir & 3)? (src.dir ==1 ? 24 : -24) : 0
if (building==0)
init()
else
@@ -207,7 +206,7 @@
// create a terminal object at the same position as original turf loc
// wires will attach to this
terminal = new/obj/machinery/power/terminal(src.loc)
- terminal.set_dir(tdir)
+ terminal.set_dir(dir)
terminal.master = src
/obj/machinery/power/apc/proc/init()
@@ -346,7 +345,7 @@
if(update & 3)
if(update_state & UPDATE_BLUESCREEN)
- set_light(l_range = 2, l_power = 0.5, l_color = "#0000FF")
+ set_light(l_range = 2, l_power = 0.25, l_color = "#0000FF")
else if(!(stat & (BROKEN|MAINT)) && update_state & UPDATE_ALLGOOD)
var/color
switch(charging)
@@ -356,7 +355,7 @@
color = "#A8B0F8"
if(2)
color = "#82FF4C"
- set_light(l_range = 2, l_power = 0.5, l_color = color)
+ set_light(l_range = 2, l_power = 0.25, l_color = color)
else
set_light(0)
@@ -447,7 +446,7 @@
if (istype(user, /mob/living/silicon) && get_dist(src,user)>1)
return src.attack_hand(user)
src.add_fingerprint(user)
- if (istype(W, /obj/item/weapon/crowbar) && opened)
+ if (W.is_crowbar() && opened)
if (has_electronics==1)
if (terminal)
to_chat(user,"Disconnect the wires first.")
@@ -471,7 +470,7 @@
else if (opened!=2) //cover isn't removed
opened = 0
update_icon()
- else if (istype(W, /obj/item/weapon/crowbar) && !(stat & BROKEN) )
+ else if (W.is_crowbar() && !(stat & BROKEN) )
if(coverlocked && !(stat & MAINT))
to_chat(user,"The cover is locked and cannot be opened.")
return
@@ -497,7 +496,7 @@
"You insert the power cell.")
chargecount = 0
update_icon()
- else if (istype(W, /obj/item/weapon/screwdriver)) // haxing
+ else if (W.is_screwdriver()) // haxing
if(opened)
if (cell)
to_chat(user,"Remove the power cell first.")
@@ -568,7 +567,7 @@
"You add cables to the APC frame.")
make_terminal()
terminal.connect_to_network()
- else if (istype(W, /obj/item/weapon/wirecutters) && terminal && opened && has_electronics!=2)
+ else if (W.is_wirecutter() && terminal && opened && has_electronics!=2)
var/turf/T = loc
if(istype(T) && !T.is_plating())
to_chat(user,"You must remove the floor plating in front of the APC first.")
@@ -669,9 +668,7 @@
else
if (istype(user, /mob/living/silicon))
return src.attack_hand(user)
- if (!opened && wiresexposed && \
- (istype(W, /obj/item/device/multitool) || \
- istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/assembly/signaler)))
+ if (!opened && wiresexposed && (istype(W, /obj/item/device/multitool) || W.is_wirecutter() || istype(W, /obj/item/device/assembly/signaler)))
return src.attack_hand(user)
//Placeholder until someone can do take_damage() for APCs or something.
to_chat(user,"The [src.name] looks too sturdy to bash open with \the [W.name].")
diff --git a/code/modules/power/batteryrack.dm b/code/modules/power/batteryrack.dm
index 7bb37a5662..d897bb827a 100644
--- a/code/modules/power/batteryrack.dm
+++ b/code/modules/power/batteryrack.dm
@@ -78,7 +78,7 @@
/obj/machinery/power/smes/batteryrack/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) //these can only be moved by being reconstructed, solves having to remake the powernet.
..() //SMES attackby for now handles screwdriver, cable coils and wirecutters, no need to repeat that here
if(open_hatch)
- if(istype(W, /obj/item/weapon/crowbar))
+ if(W.is_crowbar())
if (charge < (capacity / 100))
if (!output_attempt && !input_attempt)
playsound(src, W.usesound, 50, 1)
@@ -91,9 +91,9 @@
qdel(src)
return 1
else
- user << "Turn off the [src] before dismantling it."
+ to_chat(user, "Turn off the [src] before dismantling it.")
else
- user << "Better let [src] discharge before dismantling it."
+ to_chat(user, "Better let [src] discharge before dismantling it.")
else if ((istype(W, /obj/item/weapon/stock_parts/capacitor) && (capacitors_amount < 5)) || (istype(W, /obj/item/weapon/cell) && (cells_amount < 5)))
if (charge < (capacity / 100))
if (!output_attempt && !input_attempt)
@@ -101,11 +101,11 @@
component_parts += W
W.loc = src
RefreshParts()
- user << "You upgrade the [src] with [W.name]."
+ to_chat(user, "You upgrade the [src] with [W.name].")
else
- user << "Turn off the [src] before dismantling it."
+ to_chat(user, "Turn off the [src] before dismantling it.")
else
- user << "Better let [src] discharge before putting your hand inside it."
+ to_chat(user, "Better let [src] discharge before putting your hand inside it.")
else
user.set_machine(src)
interact(user)
diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm
index 2e7903c38e..856697e033 100644
--- a/code/modules/power/breaker_box.dm
+++ b/code/modules/power/breaker_box.dm
@@ -40,26 +40,26 @@
set_state(1)
/obj/machinery/power/breakerbox/examine(mob/user)
- user << "Large machine with heavy duty switching circuits used for advanced grid control"
+ to_chat(user, "Large machine with heavy duty switching circuits used for advanced grid control")
if(on)
- user << "It seems to be online."
+ to_chat(user, "It seems to be online.")
else
- user << "It seems to be offline."
+ to_chat(user, "It seems to be offline.")
/obj/machinery/power/breakerbox/attack_ai(mob/user)
if(update_locked)
- user << "System locked. Please try again later."
+ to_chat(user, "System locked. Please try again later.")
return
if(busy)
- user << "System is busy. Please wait until current operation is finished before changing power settings."
+ to_chat(user, "System is busy. Please wait until current operation is finished before changing power settings.")
return
busy = 1
- user << "Updating power settings..."
+ to_chat(user, "Updating power settings...")
if(do_after(user, 50))
set_state(!on)
- user << "Update Completed. New setting:[on ? "on": "off"]"
+ to_chat(user, "Update Completed. New setting:[on ? "on": "off"]")
update_locked = 1
spawn(600)
update_locked = 0
@@ -68,11 +68,11 @@
/obj/machinery/power/breakerbox/attack_hand(mob/user)
if(update_locked)
- user << "System locked. Please try again later."
+ to_chat(user, "System locked. Please try again later.")
return
if(busy)
- user << "System is busy. Please wait until current operation is finished before changing power settings."
+ to_chat(user, "System is busy. Please wait until current operation is finished before changing power settings.")
return
busy = 1
@@ -94,7 +94,7 @@
var/newtag = input(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system") as text
if(newtag)
RCon_tag = newtag
- user << "You changed the RCON tag to: [newtag]"
+ to_chat(user, "You changed the RCON tag to: [newtag]")
if(on)
to_chat(user, "Disable the breaker before performing maintenance.")
return
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 5ad1e727da..6717edf95d 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -159,7 +159,8 @@ var/list/possible_cable_coil_colours = list(
if(!T.is_plating())
return
- if(istype(W, /obj/item/weapon/wirecutters))
+ if(W.is_wirecutter())
+ var/obj/item/stack/cable_coil/CC
if(d1 == UP || d2 == UP)
to_chat(user, "You must cut this cable from above.")
return
@@ -172,9 +173,12 @@ var/list/possible_cable_coil_colours = list(
return
if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long
- new/obj/item/stack/cable_coil(T, 2, color)
+ CC = new/obj/item/stack/cable_coil(T, 2, color)
else
- new/obj/item/stack/cable_coil(T, 1, color)
+ CC = new/obj/item/stack/cable_coil(T, 1, color)
+
+ src.add_fingerprint(user)
+ src.transfer_fingerprints_to(CC)
for(var/mob/O in viewers(src, null))
O.show_message("[user] cuts the cable.", 1)
@@ -939,4 +943,25 @@ obj/structure/cable/proc/cableColor(var/colorC)
if(get_dist(src, user) <= 1)
msg += " It doesn't seem to have a beginning, or an end."
- to_chat(user, msg)
\ No newline at end of file
+ to_chat(user, msg)
+
+/obj/item/stack/cable_coil/alien/attack_hand(mob/user as mob)
+ if (user.get_inactive_hand() == src)
+ var/N = input("How many units of wire do you want to take from [src]? You can only take up to [amount] at a time.", "Split stacks", 1) as num|null
+ if(N && N <= amount)
+ var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc)
+ CC.amount = N
+ CC.update_icon()
+ to_chat(user,"You take [N] units of wire from the [src].")
+ if (CC)
+ user.put_in_hands(CC)
+ src.add_fingerprint(user)
+ CC.add_fingerprint(user)
+ spawn(0)
+ if (src && usr.machine==src)
+ src.interact(usr)
+ else
+ return
+ else
+ ..()
+ return
diff --git a/code/modules/power/cable_ender.dm b/code/modules/power/cable_ender.dm
index d6975091ea..20ca1fdd05 100644
--- a/code/modules/power/cable_ender.dm
+++ b/code/modules/power/cable_ender.dm
@@ -24,7 +24,7 @@
/obj/structure/cable/ender/attackby(obj/item/W, mob/user)
src.add_fingerprint(user)
- if(istype(W, /obj/item/weapon/wirecutters))
+ if(W.is_wirecutter())
to_chat(user, " These cables are too tough to be cut with those [W.name].")
return
else if(istype(W, /obj/item/stack/cable_coil))
diff --git a/code/modules/power/cable_heavyduty.dm b/code/modules/power/cable_heavyduty.dm
index a286517965..c90c936c4d 100644
--- a/code/modules/power/cable_heavyduty.dm
+++ b/code/modules/power/cable_heavyduty.dm
@@ -17,7 +17,7 @@
if(!T.is_plating())
return
- if(istype(W, /obj/item/weapon/wirecutters))
+ if(W.is_wirecutter())
usr << "These cables are too tough to be cut with those [W.name]."
return
else if(istype(W, /obj/item/stack/cable_coil))
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 4db4d40c4c..f9fca6222f 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -41,6 +41,9 @@
processing_objects -= src
return ..()
+/obj/item/weapon/cell/get_cell()
+ return src
+
/obj/item/weapon/cell/process()
if(self_recharge)
if(world.time >= last_use + charge_delay)
diff --git a/code/modules/power/fusion/_setup.dm b/code/modules/power/fusion/_setup.dm
index b4aca0c827..4ac8bb9cbf 100644
--- a/code/modules/power/fusion/_setup.dm
+++ b/code/modules/power/fusion/_setup.dm
@@ -17,7 +17,7 @@
to_chat(usr, "Error: you are not an admin!")
return
- if(!(locate(/obj/machinery/power/fusion_core/mapped) in world))
+ if(!(locate(/obj/machinery/power/fusion_core/mapped) in machines))
to_chat(usr, "This map is not appropriate for this verb.")
return
@@ -40,7 +40,7 @@
var/list/delayed_objects = list()
// SETUP PHASE
- for(var/obj/effect/engine_setup/S in world)
+ for(var/obj/effect/engine_setup/S in machines)
var/result = S.activate(0)
switch(result)
if(SETUP_OK)
diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm
index 7f81b70ffd..329170be44 100644
--- a/code/modules/power/fusion/core/_core.dm
+++ b/code/modules/power/fusion/core/_core.dm
@@ -120,7 +120,7 @@ var/list/fusion_cores = list()
if(default_part_replacement(user, W))
return
- if(ismultitool(W))
+ if(istype(W, /obj/item/device/multitool))
var/new_ident = input("Enter a new ident tag.", "Fusion Core", id_tag) as null|text
if(new_ident && user.Adjacent(src))
id_tag = new_ident
diff --git a/code/modules/power/fusion/core/core_control.dm b/code/modules/power/fusion/core/core_control.dm
index bb4e04b1e9..0dca71a4d1 100644
--- a/code/modules/power/fusion/core/core_control.dm
+++ b/code/modules/power/fusion/core/core_control.dm
@@ -3,21 +3,20 @@
icon = 'icons/obj/machines/power/fusion.dmi'
icon_state = "core_control"
light_color = COLOR_ORANGE
-
+ circuit = /obj/item/weapon/circuitboard/fusion_core_control
var/id_tag
var/scan_range = 25
var/list/connected_devices = list()
var/obj/machinery/power/fusion_core/cur_viewed_device
/obj/machinery/computer/fusion_core_control/attackby(var/obj/item/thing, var/mob/user)
- if(ismultitool(thing))
+ ..()
+ if(istype(thing, /obj/item/device/multitool))
var/new_ident = input("Enter a new ident tag.", "Core Control", id_tag) as null|text
if(new_ident && user.Adjacent(src))
id_tag = new_ident
cur_viewed_device = null
return
- else
- return ..()
/obj/machinery/computer/fusion_core_control/attack_ai(mob/user)
attack_hand(user)
@@ -28,6 +27,11 @@
/obj/machinery/computer/fusion_core_control/interact(mob/user)
+ if(stat & (BROKEN|NOPOWER))
+ user.unset_machine()
+ user << browse(null, "window=fusion_control")
+ return
+
if(!cur_viewed_device || !check_core_status(cur_viewed_device))
cur_viewed_device = null
@@ -174,3 +178,19 @@
if(C.idle_power_usage > C.avail())
return
. = 1
+
+/obj/machinery/computer/fusion_core_control/update_icon()
+ if(stat & (BROKEN))
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "broken"
+ set_light(0)
+
+ if(stat & (NOPOWER))
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "computer"
+ set_light(0)
+
+ if(!stat & (BROKEN|NOPOWER))
+ icon = initial(icon)
+ icon_state = initial(icon_state)
+ set_light(light_range_on, light_power_on)
diff --git a/code/modules/power/fusion/core/core_field.dm b/code/modules/power/fusion/core/core_field.dm
index 1efb09d777..f5d85fb4bf 100644
--- a/code/modules/power/fusion/core/core_field.dm
+++ b/code/modules/power/fusion/core/core_field.dm
@@ -35,7 +35,7 @@
/obj/structure/cable,
/obj/machinery/atmospherics,
/obj/machinery/air_sensor,
- /mob/observer/dead,
+ /mob/observer,
/obj/machinery/power/hydromagnetic_trap
)
@@ -672,4 +672,4 @@
#undef FUSION_HEAT_CAP
#undef FUSION_MAX_ENVIRO_HEAT
-#undef PLASMA_TEMP_RADIATION_DIVISIOR
\ No newline at end of file
+#undef PLASMA_TEMP_RADIATION_DIVISIOR
diff --git a/code/modules/power/fusion/fuel_assembly/fuel_control.dm b/code/modules/power/fusion/fuel_assembly/fuel_control.dm
index 6d95e358d8..6825f9ba37 100644
--- a/code/modules/power/fusion/fuel_assembly/fuel_control.dm
+++ b/code/modules/power/fusion/fuel_assembly/fuel_control.dm
@@ -2,6 +2,7 @@
name = "fuel injection control computer"
icon = 'icons/obj/machines/power/fusion.dmi'
icon_state = "fuel"
+ circuit = /obj/item/weapon/circuitboard/fusion_fuel_control
var/id_tag
var/scan_range = 25
@@ -94,9 +95,25 @@
/obj/machinery/computer/fusion_fuel_control/attackby(var/obj/item/W, var/mob/user)
- if(ismultitool(W))
+ ..()
+ if(istype(W, /obj/item/device/multitool))
var/new_ident = input("Enter a new ident tag.", "Fuel Control", id_tag) as null|text
if(new_ident && user.Adjacent(src))
id_tag = new_ident
return
- return ..()
+
+/obj/machinery/computer/fusion_fuel_control/update_icon()
+ if(stat & (BROKEN))
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "broken"
+ set_light(0)
+
+ if(stat & (NOPOWER))
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "computer"
+ set_light(0)
+
+ if(!stat & (BROKEN|NOPOWER))
+ icon = initial(icon)
+ icon_state = initial(icon_state)
+ set_light(light_range_on, light_power_on)
diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
index 545638c7d8..79794ff069 100644
--- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
+++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
@@ -42,7 +42,7 @@ var/list/fuel_injectors = list()
/obj/machinery/fusion_fuel_injector/attackby(obj/item/W, mob/user)
- if(ismultitool(W))
+ if(istype(W, /obj/item/device/multitool))
var/new_ident = input("Enter a new ident tag.", "Fuel Injector", id_tag) as null|text
if(new_ident && user.Adjacent(src))
id_tag = new_ident
@@ -68,7 +68,7 @@ var/list/fuel_injectors = list()
cur_assembly = W
return
- if(iswrench(W) || isscrewdriver(W) || iscrowbar(W) || istype(W, /obj/item/weapon/storage/part_replacer))
+ if(W.is_wrench() || W.is_screwdriver() || W.is_crowbar() || istype(W, /obj/item/weapon/storage/part_replacer))
if(injecting)
to_chat(user, "Shut \the [src] off first!")
return
diff --git a/code/modules/power/fusion/gyrotron/gyrotron.dm b/code/modules/power/fusion/gyrotron/gyrotron.dm
index 5309b0f5b2..23697d2449 100644
--- a/code/modules/power/fusion/gyrotron/gyrotron.dm
+++ b/code/modules/power/fusion/gyrotron/gyrotron.dm
@@ -52,7 +52,7 @@ var/list/gyrotrons = list()
icon_state = "emitter-off"
/obj/machinery/power/emitter/gyrotron/attackby(var/obj/item/W, var/mob/user)
- if(ismultitool(W))
+ if(istype(W, /obj/item/device/multitool))
var/new_ident = input("Enter a new ident tag.", "Gyrotron", id_tag) as null|text
if(new_ident && user.Adjacent(src))
id_tag = new_ident
diff --git a/code/modules/power/fusion/gyrotron/gyrotron_control.dm b/code/modules/power/fusion/gyrotron/gyrotron_control.dm
index 9f6c59c753..958e03f06f 100644
--- a/code/modules/power/fusion/gyrotron/gyrotron_control.dm
+++ b/code/modules/power/fusion/gyrotron/gyrotron_control.dm
@@ -3,6 +3,7 @@
icon = 'icons/obj/machines/power/fusion.dmi'
icon_state = "engine"
light_color = COLOR_BLUE
+ circuit = /obj/item/weapon/circuitboard/gyrotron_control
var/id_tag
var/scan_range = 25
@@ -16,6 +17,11 @@
/obj/machinery/computer/gyrotron_control/interact(var/mob/user)
+ if(stat & (BROKEN|NOPOWER))
+ user.unset_machine()
+ user << browse(null, "window=gyrotron_controller_[id_tag]")
+ return
+
if(!id_tag)
to_chat(user, "This console has not been assigned an ident tag. Please contact your system administrator or conduct a manual update with a standard multitool.")
return
@@ -89,9 +95,25 @@
return 0
/obj/machinery/computer/gyrotron_control/attackby(var/obj/item/W, var/mob/user)
- if(ismultitool(W))
+ ..()
+ if(istype(W, /obj/item/device/multitool))
var/new_ident = input("Enter a new ident tag.", "Gyrotron Control", id_tag) as null|text
if(new_ident && user.Adjacent(src))
id_tag = new_ident
return
- return ..()
+
+/obj/machinery/computer/gyrotron_control/update_icon()
+ if(stat & (BROKEN))
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "broken"
+ set_light(0)
+
+ if(stat & (NOPOWER))
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "computer"
+ set_light(0)
+
+ if(!stat & (BROKEN|NOPOWER))
+ icon = initial(icon)
+ icon_state = initial(icon_state)
+ set_light(light_range_on, light_power_on)
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 27032a2198..c7168ee9b0 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -137,7 +137,7 @@
attack_hand(user)
/obj/machinery/power/generator/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
playsound(src, W.usesound, 75, 1)
anchored = !anchored
user.visible_message("[user.name] [anchored ? "secures" : "unsecures"] the bolts holding [src.name] to the floor.", \
diff --git a/code/modules/power/grid_checker.dm b/code/modules/power/grid_checker.dm
index 8127383651..93d4918af0 100644
--- a/code/modules/power/grid_checker.dm
+++ b/code/modules/power/grid_checker.dm
@@ -43,12 +43,12 @@
/obj/machinery/power/grid_checker/attackby(obj/item/W, mob/user)
if(!user)
return
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
default_deconstruction_screwdriver(user, W)
opened = !opened
- else if(istype(W, /obj/item/weapon/crowbar))
+ else if(W.is_crowbar())
default_deconstruction_crowbar(user, W)
- else if(istype(W, /obj/item/device/multitool) || istype(W, /obj/item/weapon/wirecutters) )
+ else if(istype(W, /obj/item/device/multitool) || W.is_wirecutter())
attack_hand(user)
/obj/machinery/power/grid_checker/attack_hand(mob/user)
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 98d4d2233f..6417889dcd 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -47,7 +47,7 @@
/obj/machinery/light_construct/attackby(obj/item/weapon/W as obj, mob/user as mob)
src.add_fingerprint(user)
- if (istype(W, /obj/item/weapon/wrench))
+ if (W.is_wrench())
if (src.stage == 1)
playsound(src, W.usesound, 75, 1)
usr << "You begin deconstructing [src]."
@@ -66,7 +66,7 @@
usr << "You have to unscrew the case first."
return
- if(istype(W, /obj/item/weapon/wirecutters))
+ if(W.is_wirecutter())
if (src.stage != 2) return
src.stage = 1
switch(fixture_type)
@@ -98,7 +98,7 @@
"You add wires to [src].")
return
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
if (src.stage == 2)
switch(fixture_type)
if ("tube")
@@ -161,12 +161,12 @@
layer = ABOVE_MOB_LAYER
use_power = 2
idle_power_usage = 2
- active_power_usage = 20
+ active_power_usage = 10 // Previously 20.
power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list
var/on = 0 // 1 if on, 0 if off
- var/brightness_range = 6 // luminosity when on, also used in power calculation
- var/brightness_power = 3
- var/brightness_color = null
+ var/brightness_range = 8 // luminosity when on, also used in power calculation
+ var/brightness_power = 0.8
+ var/brightness_color = LIGHT_COLOR_INCANDESCENT_TUBE
var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN
var/flickering = 0
var/light_type = /obj/item/weapon/light/tube // the type of light item
@@ -183,8 +183,7 @@
base_state = "bulb"
fitting = "bulb"
brightness_range = 4
- brightness_power = 2
- brightness_color = "#FFF4E5"
+ brightness_color = LIGHT_COLOR_INCANDESCENT_BULB
desc = "A small lighting fixture."
light_type = /obj/item/weapon/light/bulb
@@ -193,17 +192,15 @@
base_state = "flamp"
fitting = "bulb"
brightness_range = 5
- brightness_power = 2
plane = OBJ_PLANE
layer = OBJ_LAYER
- brightness_color = "#FFF4E5"
+ brightness_color = LIGHT_COLOR_INCANDESCENT_BULB
desc = "A floor lamp."
light_type = /obj/item/weapon/light/bulb
var/lamp_shade = 1
/obj/machinery/light/small/emergency
brightness_range = 4
- brightness_power = 2
brightness_color = "#da0205"
/obj/machinery/light/spot
@@ -211,7 +208,7 @@
fitting = "large tube"
light_type = /obj/item/weapon/light/tube/large
brightness_range = 12
- brightness_power = 4
+ brightness_power = 0.9
/obj/machinery/light/built/New()
status = LIGHT_EMPTY
@@ -423,7 +420,7 @@
// attempt to stick weapon into light socket
else if(status == LIGHT_EMPTY)
- if(istype(W, /obj/item/weapon/screwdriver)) //If it's a screwdriver open it.
+ if(W.is_screwdriver()) //If it's a screwdriver open it.
playsound(src, W.usesound, 75, 1)
user.visible_message("[user.name] opens [src]'s casing.", \
"You open [src]'s casing.", "You hear a noise.")
@@ -459,7 +456,7 @@
electrocute_mob(user, get_area(src), src, rand(0.7,1.0))
/obj/machinery/light/flamp/attackby(obj/item/W, mob/user)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
anchored = !anchored
playsound(src, W.usesound, 50, 1)
user << "You [anchored ? "wrench" : "unwrench"] \the [src]."
@@ -472,7 +469,7 @@
return
else
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
playsound(src, W.usesound, 75, 1)
user.visible_message("[user.name] removes [src]'s lamp shade.", \
"You remove [src]'s lamp shade.", "You hear a noise.")
@@ -716,8 +713,8 @@
matter = list(DEFAULT_WALL_MATERIAL = 60)
var/rigged = 0 // true if rigged to explode
var/brightness_range = 2 //how much light it gives off
- var/brightness_power = 1
- var/brightness_color = null
+ var/brightness_power = 0.8
+ var/brightness_color = LIGHT_COLOR_INCANDESCENT_TUBE
/obj/item/weapon/light/tube
name = "light tube"
@@ -727,13 +724,12 @@
item_state = "c_tube"
matter = list("glass" = 100)
brightness_range = 8
- brightness_power = 3
/obj/item/weapon/light/tube/large
w_class = ITEMSIZE_SMALL
name = "large light tube"
brightness_range = 15
- brightness_power = 4
+ brightness_power = 0.9
/obj/item/weapon/light/bulb
name = "light bulb"
@@ -743,8 +739,7 @@
item_state = "contvapour"
matter = list("glass" = 100)
brightness_range = 5
- brightness_power = 2
- brightness_color = "#a0a080"
+ brightness_color = LIGHT_COLOR_INCANDESCENT_BULB
/obj/item/weapon/light/throw_impact(atom/hit_atom)
..()
@@ -758,7 +753,6 @@
item_state = "egg4"
matter = list("glass" = 100)
brightness_range = 5
- brightness_power = 2
// update the icon state and description of the light
@@ -834,4 +828,4 @@
desc = "A lamp shade for a lamp."
icon = 'icons/obj/lighting.dmi'
icon_state = "lampshade"
- w_class = ITEMSIZE_TINY
\ No newline at end of file
+ w_class = ITEMSIZE_TINY
diff --git a/code/modules/power/pacman2.dm b/code/modules/power/pacman2.dm
index b6b904e65a..8e32cccc30 100644
--- a/code/modules/power/pacman2.dm
+++ b/code/modules/power/pacman2.dm
@@ -52,7 +52,7 @@
examine(mob/user)
..(user)
- user << "The generator has [P.air_contents.phoron] units of fuel left, producing [power_gen] per cycle."
+ to_chat(user, "The generator has [P.air_contents.phoron] units of fuel left, producing [power_gen] per cycle.")
handleInactive()
heat -= 2
@@ -70,29 +70,29 @@
attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O, /obj/item/weapon/tank/phoron))
if(P)
- user << "The generator already has a phoron tank loaded!"
+ to_chat(user, "The generator already has a phoron tank loaded!")
return
P = O
user.drop_item()
O.loc = src
- user << "You add the phoron tank to the generator."
+ to_chat(user, "You add the phoron tank to the generator.")
else if(!active)
- if(istype(O, /obj/item/weapon/wrench))
+ if(O.is_wrench())
anchored = !anchored
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(anchored)
- user << "You secure the generator to the floor."
+ to_chat(user, "You secure the generator to the floor.")
else
- user << "You unsecure the generator from the floor."
+ to_chat(user, "You unsecure the generator from the floor.")
SSmachines.makepowernets()
- else if(istype(O, /obj/item/weapon/screwdriver))
+ else if(O.is_screwdriver())
open = !open
playsound(loc, O.usesound, 50, 1)
if(open)
- user << "You open the access panel."
+ to_chat(user, "You open the access panel.")
else
- user << "You close the access panel."
- else if(istype(O, /obj/item/weapon/crowbar) && !open)
+ to_chat(user, "You close the access panel.")
+ else if(O.is_crowbar() && !open)
playsound(loc, O.usesound, 50, 1)
var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc)
for(var/obj/item/I in component_parts)
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 5a20aaeaeb..660ee536db 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -51,9 +51,9 @@
if(!..(user,1 ))
return
if(active)
- usr << "The generator is on."
+ to_chat(user, "The generator is on.")
else
- usr << "The generator is off."
+ to_chat(user, "The generator is off.")
/obj/machinery/power/port_gen/emp_act(severity)
var/duration = 6000 //ten minutes
@@ -145,10 +145,12 @@
/obj/machinery/power/port_gen/pacman/examine(mob/user)
..(user)
- user << "\The [src] appears to be producing [power_gen*power_output] W."
- user << "There [sheets == 1 ? "is" : "are"] [sheets] sheet\s left in the hopper."
- if(IsBroken()) user << "\The [src] seems to have broken down."
- if(overheating) user << "\The [src] is overheating!"
+ to_chat(user, "\The [src] appears to be producing [power_gen*power_output] W.")
+ to_chat(user, "There [sheets == 1 ? "is" : "are"] [sheets] sheet\s left in the hopper.")
+ if(IsBroken())
+ to_chat(user, "\The [src] seems to have broken down.")
+ if(overheating)
+ to_chat(user, "\The [src] is overheating!")
/obj/machinery/power/port_gen/pacman/HasFuel()
var/needed_sheets = power_output / time_per_sheet
@@ -263,21 +265,21 @@
var/obj/item/stack/addstack = O
var/amount = min((max_sheets - sheets), addstack.amount)
if(amount < 1)
- user << "The [src.name] is full!"
+ to_chat(user, "The [src.name] is full!")
return
- user << "You add [amount] sheet\s to the [src.name]."
+ to_chat(user, "You add [amount] sheet\s to the [src.name].")
sheets += amount
addstack.use(amount)
updateUsrDialog()
return
else if(!active)
- if(istype(O, /obj/item/weapon/wrench))
+ if(O.is_wrench())
if(!anchored)
connect_to_network()
- user << "You secure the generator to the floor."
+ to_chat(user, "You secure the generator to the floor.")
else
disconnect_from_network()
- user << "You unsecure the generator from the floor."
+ to_chat(user, "You unsecure the generator from the floor.")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
anchored = !anchored
else if(default_deconstruction_screwdriver(user, O))
@@ -337,7 +339,7 @@
if (get_dist(src, user) > 1 )
if (!istype(user, /mob/living/silicon/ai))
user.unset_machine()
- user << browse(null, "window=port_gen")
+ user << browse(null, "window=port_gen"
return
user.set_machine(src)
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 112f5a482e..04e63379fc 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -139,7 +139,7 @@
return
// Power machinery should also connect/disconnect from the network.
-/obj/machinery/power/default_unfasten_wrench(var/mob/user, var/obj/item/weapon/wrench/W, var/time = 20)
+/obj/machinery/power/default_unfasten_wrench(var/mob/user, var/obj/item/weapon/W, var/time = 20)
if((. = ..()))
if(anchored)
connect_to_network()
diff --git a/code/modules/power/sensors/powernet_sensor.dm b/code/modules/power/sensors/powernet_sensor.dm
index 20c8837b32..bc1298d201 100644
--- a/code/modules/power/sensors/powernet_sensor.dm
+++ b/code/modules/power/sensors/powernet_sensor.dm
@@ -35,7 +35,7 @@
/obj/machinery/power/sensor/Destroy()
. = ..()
// TODO - Switch power_monitor to register deletion events instead of this.
- for(var/obj/machinery/computer/power_monitor/PM in world)
+ for(var/obj/machinery/computer/power_monitor/PM in machines)
if(PM.power_monitor)
PM.power_monitor.refresh_sensors()
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 9dbec38fe9..af143b64a4 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -54,7 +54,7 @@ var/global/list/rad_collectors = list()
investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.gas["phoron"]/0.29)]%":"It is empty"].","singulo")
return
else
- user << "The controls are locked!"
+ to_chat(user, "The controls are locked!")
return
..()
@@ -62,23 +62,23 @@ var/global/list/rad_collectors = list()
/obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/tank/phoron))
if(!src.anchored)
- user << "The [src] needs to be secured to the floor first."
+ to_chat(user, "The [src] needs to be secured to the floor first.")
return 1
if(src.P)
- user << "There's already a phoron tank loaded."
+ to_chat(user, "There's already a phoron tank loaded.")
return 1
user.drop_item()
src.P = W
W.loc = src
update_icons()
return 1
- else if(istype(W, /obj/item/weapon/crowbar))
+ else if(W.is_crowbar())
if(P && !src.locked)
eject()
return 1
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
if(P)
- user << "Remove the phoron tank first."
+ to_chat(user, "Remove the phoron tank first.")
return 1
playsound(src, W.usesound, 75, 1)
src.anchored = !src.anchored
@@ -94,18 +94,18 @@ var/global/list/rad_collectors = list()
if (src.allowed(user))
if(active)
src.locked = !src.locked
- user << "The controls are now [src.locked ? "locked." : "unlocked."]"
+ to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]")
else
src.locked = 0 //just in case it somehow gets locked
- user << "The controls can only be locked when the [src] is active."
+ to_chat(user, "The controls can only be locked when the [src] is active.")
else
- user << "Access denied!"
+ to_chat(user, "Access denied!")
return 1
return ..()
/obj/machinery/power/rad_collector/examine(mob/user)
if (..(user, 3))
- user << "The meter indicates that \the [src] is collecting [last_power] W."
+ to_chat(user, "The meter indicates that \the [src] is collecting [last_power] W.")
return 1
/obj/machinery/power/rad_collector/ex_act(severity)
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index eaca5bd663..8ac6bfb559 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -146,7 +146,7 @@
/obj/machinery/power/emitter/attackby(obj/item/W, mob/user)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
if(active)
user << "Turn off [src] first."
return
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index dc6fd45163..4132919938 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -103,7 +103,7 @@ field_generator power level display
if(active)
user << "The [src] needs to be off."
return
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
switch(state)
if(0)
state = 1
diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm
index 2f9bc83cf4..888d75ea6f 100644
--- a/code/modules/power/singularity/generator.dm
+++ b/code/modules/power/singularity/generator.dm
@@ -17,7 +17,7 @@
if(src) qdel(src)
/obj/machinery/the_singularitygen/attackby(obj/item/W, mob/user)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
anchored = !anchored
playsound(src, W.usesound, 75, 1)
if(anchored)
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index a5d2a4ac0a..e89ff0dcce 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -207,35 +207,35 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
if(0)
- if(iswrench(O))
+ if(O.is_wrench())
playsound(src, O.usesound, 75, 1)
src.anchored = 1
user.visible_message("[user.name] secures the [src.name] to the floor.", \
"You secure the external bolts.")
temp_state++
if(1)
- if(iswrench(O))
+ if(O.is_wrench())
playsound(src, O.usesound, 75, 1)
src.anchored = 0
user.visible_message("[user.name] detaches the [src.name] from the floor.", \
"You remove the external bolts.")
temp_state--
- else if(iscoil(O))
+ else if(istype(O, /obj/item/stack/cable_coil))
if(O:use(1,user))
user.visible_message("[user.name] adds wires to the [src.name].", \
"You add some wires.")
temp_state++
if(2)
- if(iswirecutter(O))//TODO:Shock user if its on?
+ if(O.is_wirecutter())//TODO:Shock user if its on?
user.visible_message("[user.name] removes some wires from the [src.name].", \
"You remove some wires.")
temp_state--
- else if(isscrewdriver(O))
+ else if(O.is_screwdriver())
user.visible_message("[user.name] closes the [src.name]'s access panel.", \
"You close the access panel.")
temp_state++
if(3)
- if(isscrewdriver(O))
+ if(O.is_screwdriver())
user.visible_message("[user.name] opens the [src.name]'s access panel.", \
"You open the access panel.")
temp_state--
@@ -346,35 +346,35 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
var/temp_state = src.construction_state
switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
if(0)
- if(iswrench(O))
+ if(O.is_wrench())
playsound(src, O.usesound, 75, 1)
src.anchored = 1
user.visible_message("[user.name] secures the [src.name] to the floor.", \
"You secure the external bolts.")
temp_state++
if(1)
- if(iswrench(O))
+ if(O.is_wrench())
playsound(src, O.usesound, 75, 1)
src.anchored = 0
user.visible_message("[user.name] detaches the [src.name] from the floor.", \
"You remove the external bolts.")
temp_state--
- else if(iscoil(O))
+ else if(istype(O, /obj/item/stack/cable_coil))
if(O:use(1))
user.visible_message("[user.name] adds wires to the [src.name].", \
"You add some wires.")
temp_state++
if(2)
- if(iswirecutter(O))//TODO:Shock user if its on?
+ if(O.is_wirecutter())//TODO:Shock user if its on?
user.visible_message("[user.name] removes some wires from the [src.name].", \
"You remove some wires.")
temp_state--
- else if(isscrewdriver(O))
+ else if(O.is_screwdriver())
user.visible_message("[user.name] closes the [src.name]'s access panel.", \
"You close the access panel.")
temp_state++
if(3)
- if(isscrewdriver(O))
+ if(O.is_screwdriver())
user.visible_message("[user.name] opens the [src.name]'s access panel.", \
"You open the access panel.")
temp_state--
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 75ec8fffc7..05e5e6e023 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -1,5 +1,7 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
+GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity)
+
/obj/singularity/
name = "gravitational singularity"
desc = "A gravitational singularity."
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index e2b37348a9..5a6ecf02ab 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -192,7 +192,7 @@
//Will return 1 on failure
/obj/machinery/power/smes/proc/make_terminal(const/mob/user)
if (user.loc == loc)
- user << "You must not be on the same tile as the [src]."
+ to_chat(user, "You must not be on the same tile as the [src].")
return 1
//Direction the terminal will face to
@@ -204,13 +204,13 @@
tempDir = WEST
var/turf/tempLoc = get_step(src, reverse_direction(tempDir))
if (istype(tempLoc, /turf/space))
- user << "You can't build a terminal on space."
+ to_chat(user, "You can't build a terminal on space.")
return 1
else if (istype(tempLoc))
if(!tempLoc.is_plating())
- user << "You must remove the floor plating first."
+ to_chat(user, "You must remove the floor plating first.")
return 1
- user << "You start adding cable to the [src]."
+ to_chat(user, "You start adding cable to the [src].")
if(do_after(user, 50))
terminal = new /obj/machinery/power/terminal(tempLoc)
terminal.set_dir(tempDir)
@@ -236,27 +236,27 @@
/obj/machinery/power/smes/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
if(!open_hatch)
open_hatch = 1
- user << "You open the maintenance hatch of [src]."
+ to_chat(user, "You open the maintenance hatch of [src].")
playsound(src, W.usesound, 50, 1)
return 0
else
open_hatch = 0
- user << "You close the maintenance hatch of [src]."
+ to_chat(user, "You close the maintenance hatch of [src].")
playsound(src, W.usesound, 50, 1)
return 0
if (!open_hatch)
- user << "You need to open access hatch on [src] first!"
+ to_chat(user, "You need to open access hatch on [src] first!")
return 0
if(istype(W, /obj/item/stack/cable_coil) && !terminal && !building_terminal)
building_terminal = 1
var/obj/item/stack/cable_coil/CC = W
if (CC.get_amount() <= 10)
- user << "You need more cables."
+ to_chat(user, "You need more cables.")
building_terminal = 0
return 0
if (make_terminal(user))
@@ -270,14 +270,14 @@
stat = 0
return 0
- else if(istype(W, /obj/item/weapon/wirecutters) && terminal && !building_terminal)
+ else if(W.is_wirecutter() && terminal && !building_terminal)
building_terminal = 1
var/turf/tempTDir = terminal.loc
if (istype(tempTDir))
if(!tempTDir.is_plating())
- user << "You must remove the floor plating first."
+ to_chat(user, "You must remove the floor plating first.")
else
- user << "You begin to cut the cables..."
+ to_chat(user, "You begin to cut the cables...")
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 50 * W.toolspeed))
if (prob(50) && electrocute_mob(usr, terminal.powernet, terminal))
diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm
index 6a4aa9c276..6a9e6bfaff 100644
--- a/code/modules/power/smes_construction.dm
+++ b/code/modules/power/smes_construction.dm
@@ -328,7 +328,7 @@
failure_probability = 0
// Crowbar - Disassemble the SMES.
- if(istype(W, /obj/item/weapon/crowbar))
+ if(W.is_crowbar())
if (terminal)
to_chat(user, "You have to disassemble the terminal first!")
return
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 360cad96bf..2d9f1803ba 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -61,7 +61,7 @@ var/list/solars_list = list()
/obj/machinery/power/solar/attackby(obj/item/weapon/W, mob/user)
- if(istype(W, /obj/item/weapon/crowbar))
+ if(W.is_crowbar())
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user.visible_message("[user] begins to take the glass off the solar panel.")
if(do_after(user, 50))
@@ -228,13 +228,13 @@ var/list/solars_list = list()
if (!isturf(loc))
return 0
if(!anchored)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
anchored = 1
user.visible_message("[user] wrenches the solar assembly into place.")
playsound(src, W.usesound, 75, 1)
return 1
else
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
anchored = 0
user.visible_message("[user] unwrenches the solar assembly from it's place.")
playsound(src, W.usesound, 75, 1)
@@ -251,7 +251,7 @@ var/list/solars_list = list()
else
new /obj/machinery/power/solar(get_turf(src), src)
else
- user << "You need two sheets of glass to put them into a solar panel."
+ to_chat(user, "You need two sheets of glass to put them into a solar panel.")
return
return 1
@@ -263,7 +263,7 @@ var/list/solars_list = list()
user.visible_message("[user] inserts the electronics into the solar assembly.")
return 1
else
- if(istype(W, /obj/item/weapon/crowbar))
+ if(W.is_crowbar())
new /obj/item/weapon/tracker_electronics(src.loc)
tracker = 0
user.visible_message("[user] takes out the electronics from the solar assembly.")
@@ -403,11 +403,11 @@ var/list/solars_list = list()
return
/obj/machinery/power/solar_control/attackby(obj/item/I, user as mob)
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
playsound(src, I.usesound, 50, 1)
if(do_after(user, 20))
if (src.stat & BROKEN)
- user << "The broken glass falls out."
+ to_chat(user, "The broken glass falls out.")
var/obj/structure/frame/A = new /obj/structure/frame/computer( src.loc )
new /obj/item/weapon/material/shard( src.loc )
var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A )
@@ -419,7 +419,7 @@ var/list/solars_list = list()
A.anchored = 1
qdel(src)
else
- user << "You disconnect the monitor."
+ to_chat(user, "You disconnect the monitor.")
var/obj/structure/frame/A = new /obj/structure/frame/computer( src.loc )
var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A )
for (var/obj/C in src)
diff --git a/code/modules/power/supermatter/setup_supermatter.dm b/code/modules/power/supermatter/setup_supermatter.dm
index f797e14f9e..7477623805 100644
--- a/code/modules/power/supermatter/setup_supermatter.dm
+++ b/code/modules/power/supermatter/setup_supermatter.dm
@@ -32,7 +32,7 @@
// CONFIGURATION PHASE
// Coolant canisters, set types according to response.
- for(var/obj/effect/engine_setup/coolant_canister/C in world)
+ for(var/obj/effect/engine_setup/coolant_canister/C in all_engine_setup_markers)
switch(response)
if("N2")
C.canister_type = /obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup/
@@ -44,7 +44,7 @@
C.canister_type = /obj/machinery/portable_atmospherics/canister/phoron/engine_setup/
continue
- for(var/obj/effect/engine_setup/core/C in world)
+ for(var/obj/effect/engine_setup/core/C in all_engine_setup_markers)
switch(response)
if("N2")
C.energy_setting = ENERGY_NITROGEN
@@ -56,12 +56,12 @@
C.energy_setting = ENERGY_PHORON
continue
- for(var/obj/effect/engine_setup/atmo_filter/F in world)
+ for(var/obj/effect/engine_setup/atmo_filter/F in all_engine_setup_markers)
F.coolant = response
var/list/delayed_objects = list()
// SETUP PHASE
- for(var/obj/effect/engine_setup/S in world)
+ for(var/obj/effect/engine_setup/S in all_engine_setup_markers)
var/result = S.activate(0)
switch(result)
if(SETUP_OK)
@@ -108,6 +108,8 @@
icon = 'icons/mob/screen1.dmi'
icon_state = "x3"
+GLOBAL_LIST_BOILERPLATE(all_engine_setup_markers, /obj/effect/engine_setup)
+
/obj/effect/engine_setup/proc/activate(var/last = 0)
return 1
@@ -261,6 +263,34 @@
F.update_icon()
return SETUP_OK
+// Closes the monitoring room shutters so the first Engi to show up doesn't get microwaved
+/obj/effect/engine_setup/shutters/
+ name = "Shutter Button Marker"
+ var/target_button = "Engine Monitoring Room Blast Doors" // This needs to be set to whatever the shutter button is called
+
+/obj/effect/engine_setup/shutters/activate()
+ if(!target_button)
+ log_and_message_admins("## WARNING: No button type set at [x] [y] [z]!")
+ return SETUP_WARNING
+
+ var/obj/machinery/button/remote/blast_door/found = null
+ var/turf/T = get_turf(src)
+ for(var/obj/machinery/button/remote/blast_door/B in T.contents)
+ if(B.name == target_button)
+ found = B
+ break
+
+ if(!found)
+ log_and_message_admins("## WARNING: Unable to locate button at [x] [y] [z]!")
+ return SETUP_WARNING
+
+ found.trigger()
+ found.update_icon()
+ return SETUP_OK
+
+
+
+
#undef SETUP_OK
#undef SETUP_WARNING
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index 07dedf5b2b..82e84718cf 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -18,6 +18,9 @@
var/last_zap = 0
var/datum/wires/tesla_coil/wires = null
+/obj/machinery/power/tesla_coil/pre_mapped
+ anchored = TRUE
+
/obj/machinery/power/tesla_coil/New()
..()
wires = new(src)
@@ -103,6 +106,9 @@
can_buckle = TRUE
buckle_lying = FALSE
+/obj/machinery/power/grounding_rod/pre_mapped
+ anchored = TRUE
+
/obj/machinery/power/grounding_rod/update_icon()
if(panel_open)
icon_state = "grounding_rod_open[anchored]"
diff --git a/code/modules/power/tesla/tesla_act.dm b/code/modules/power/tesla/tesla_act.dm
index 8e3f1c6996..605c9e3021 100644
--- a/code/modules/power/tesla/tesla_act.dm
+++ b/code/modules/power/tesla/tesla_act.dm
@@ -45,7 +45,10 @@
/obj/machinery/light/tesla_act(power, explosive = FALSE)
if(explosive)
explosion(loc, 0, 0, 0/*, flame_range = 5*/, adminlog = FALSE)
- qdel(src)
+ qdel(src)
+ return
+ on = TRUE
+ broken()
/obj/structure/closet/tesla_act(var/power)
..() //extend the zap
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index b06ed2aaf1..a6eab0dbe0 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -59,7 +59,7 @@
/obj/machinery/power/tracker/attackby(var/obj/item/weapon/W, var/mob/user)
- if(istype(W, /obj/item/weapon/crowbar))
+ if(W.is_crowbar())
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user.visible_message("[user] begins to take the glass off the solar tracker.")
if(do_after(user, 50))
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 30668993a8..725280149b 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -124,14 +124,14 @@
return
if(default_deconstruction_crowbar(user, W))
return
- if(ismultitool(W))
+ if(istype(W, /obj/item/device/multitool))
var/new_ident = input("Enter a new ident tag.", name, comp_id) as null|text
if(new_ident && user.Adjacent(src))
comp_id = new_ident
return
return ..()
-/obj/machinery/compressor/default_unfasten_wrench(var/mob/user, var/obj/item/weapon/wrench/W, var/time = 20)
+/obj/machinery/compressor/default_unfasten_wrench(var/mob/user, var/obj/item/weapon/W, var/time = 20)
if((. = ..()))
turbine = null
if(anchored)
@@ -229,7 +229,7 @@
return
return ..()
-/obj/machinery/power/turbine/default_unfasten_wrench(var/mob/user, var/obj/item/weapon/wrench/W, var/time = 20)
+/obj/machinery/power/turbine/default_unfasten_wrench(var/mob/user, var/obj/item/weapon/W, var/time = 20)
if((. = ..()))
compressor = null
if(anchored)
@@ -337,7 +337,7 @@
doors += P
/obj/machinery/computer/turbine_computer/attackby(obj/item/W, mob/user)
- if(ismultitool(W))
+ if(istype(W, /obj/item/device/multitool))
var/new_ident = input("Enter a new ident tag.", name, id) as null|text
if(new_ident && user.Adjacent(src))
id = new_ident
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index b28c8f2993..a9307e10ac 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -30,20 +30,20 @@
update_icon()
/obj/item/ammo_casing/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
if(!BB)
- user << "There is no bullet in the casing to inscribe anything into."
+ to_chat(user, "There is no bullet in the casing to inscribe anything into.")
return
var/tmp_label = ""
var/label_text = sanitizeSafe(input(user, "Inscribe some text into \the [initial(BB.name)]","Inscription",tmp_label), MAX_NAME_LEN)
if(length(label_text) > 20)
- user << "The inscription can be at most 20 characters long."
+ to_chat(user, "The inscription can be at most 20 characters long.")
else if(!label_text)
- user << "You scratch the inscription off of [initial(BB)]."
+ to_chat(user, "You scratch the inscription off of [initial(BB)].")
BB.name = initial(BB.name)
else
- user << "You inscribe \"[label_text]\" into \the [initial(BB.name)]."
+ to_chat(user, "You inscribe \"[label_text]\" into \the [initial(BB.name)].")
BB.name = "[initial(BB.name)] (\"[label_text]\")"
/obj/item/ammo_casing/update_icon()
@@ -55,7 +55,7 @@
/obj/item/ammo_casing/examine(mob/user)
..()
if (!BB)
- user << "This one is spent."
+ to_chat(user, "This one is spent.")
//Gun loading types
#define SINGLE_CASING 1 //The gun only accepts ammo_casings. ammo_magazines should never have this as their mag_type.
@@ -110,10 +110,10 @@
if(istype(W, /obj/item/ammo_casing))
var/obj/item/ammo_casing/C = W
if(C.caliber != caliber)
- user << "[C] does not fit into [src]."
+ to_chat(user, "[C] does not fit into [src].")
return
if(stored_ammo.len >= max_ammo)
- user << "[src] is full!"
+ to_chat(user, "[src] is full!")
return
user.remove_from_mob(C)
C.loc = src
@@ -122,13 +122,13 @@
if(istype(W, /obj/item/ammo_magazine/clip))
var/obj/item/ammo_magazine/clip/L = W
if(L.caliber != caliber)
- user << "The ammo in [L] does not fit into [src]."
+ to_chat(user, "The ammo in [L] does not fit into [src].")
return
if(!L.stored_ammo.len)
- user << "There's no more ammo [L]!"
+ to_chat(user, "There's no more ammo [L]!")
return
if(stored_ammo.len >= max_ammo)
- user << "[src] is full!"
+ to_chat(user, "[src] is full!")
return
var/obj/item/ammo_casing/AC = L.stored_ammo[1] //select the next casing.
L.stored_ammo -= AC //Remove this casing from loaded list of the clip.
@@ -140,9 +140,9 @@
/obj/item/ammo_magazine/attack_self(mob/user)
if(!stored_ammo.len)
- user << "[src] is already empty!"
+ to_chat(user, "[src] is already empty!")
return
- user << "You empty [src]."
+ to_chat(user, "You empty [src].")
for(var/obj/item/ammo_casing/C in stored_ammo)
C.loc = user.loc
C.set_dir(pick(cardinal))
@@ -162,7 +162,7 @@
/obj/item/ammo_magazine/examine(mob/user)
..()
- user << "There [(stored_ammo.len == 1)? "is" : "are"] [stored_ammo.len] round\s left!"
+ to_chat(user, "There [(stored_ammo.len == 1)? "is" : "are"] [stored_ammo.len] round\s left!")
//magazine icon state caching
/var/global/list/magazine_icondata_keys = list()
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 94cf0ab21e..5ea1c0a2d6 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -325,6 +325,31 @@
/obj/item/ammo_magazine/box/c9mm/empty
initial_ammo = 0
+/obj/item/ammo_magazine/m9mmR/saber
+ desc = "A very high capacity double stack magazine made specially for the SABER SMG. Filled with 22 9mm bullets."
+ icon_state = "S9mm-22"
+ mag_type = MAGAZINE
+ ammo_type = /obj/item/ammo_casing/a9mm
+ matter = list(DEFAULT_WALL_MATERIAL = 1200)
+ caliber = "9mm"
+ max_ammo = 22
+ origin_tech = list(TECH_COMBAT = 2, TECH_ILLEGAL = 1)
+ multiple_sprites = 1
+
+/obj/item/ammo_magazine/m9mmR/saber/ap
+ desc = "A high capacity double stack magazine made specially for the SABER SMG. Filled with 22 9mm armor piercing bullets."
+ icon_state = "S9mm-22"
+ mag_type = MAGAZINE
+ ammo_type = /obj/item/ammo_casing/a9mm/ap
+ matter = list(DEFAULT_WALL_MATERIAL = 2000)
+ caliber = "9mm"
+ max_ammo = 22
+ origin_tech = list(TECH_COMBAT = 2, TECH_ILLEGAL = 1)
+ multiple_sprites = 1
+
+/obj/item/ammo_magazine/m9mmR/saber/empty
+ initial_ammo = 0
+
///////// 10mm /////////
/obj/item/ammo_magazine/m10mm
@@ -472,7 +497,7 @@
/obj/item/ammo_magazine/m44
name = "magazine (.44)"
- icon_state = "44"
+ icon_state = "m44"
origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE
caliber = ".44"
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 663f5f7878..f8445008fe 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -150,11 +150,11 @@
if(dna_lock && attached_lock.stored_dna)
if(!authorized_user(user))
if(attached_lock.safety_level == 0)
- M << "\The [src] buzzes in dissapoint and displays an invalid DNA symbol."
+ to_chat(M, "\The [src] buzzes in dissapoint and displays an invalid DNA symbol.")
return 0
if(!attached_lock.exploding)
if(attached_lock.safety_level == 1)
- M << "\The [src] hisses in dissapointment."
+ to_chat(M, "\The [src] hisses in dissapointment.")
visible_message("\The [src] announces, \"Self-destruct occurring in ten seconds.\"", "\The [src] announces, \"Self-destruct occurring in ten seconds.\"")
spawn(100)
explosion(src, 0, 0, 3, 4)
@@ -163,7 +163,7 @@
qdel(src)
return 0
if(HULK in M.mutations)
- M << "Your fingers are much too large for the trigger guard!"
+ to_chat(M, "Your fingers are much too large for the trigger guard!")
return 0
if((CLUMSY in M.mutations) && prob(40)) //Clumsy handling
var/obj/P = consume_next_projectile()
@@ -196,7 +196,7 @@
return
if(user && user.a_intent == I_HELP && user.is_preference_enabled(/datum/client_preference/safefiring)) //regardless of what happens, refuse to shoot if help intent is on
- user << "You refrain from firing your [src] as your intent is set to help."
+ to_chat(user, "You refrain from firing your [src] as your intent is set to help.")
return
else
@@ -236,9 +236,9 @@
/obj/item/weapon/gun/attackby(var/obj/item/A as obj, mob/user as mob)
if(istype(A, /obj/item/dnalockingchip))
if(dna_lock)
- user << "\The [src] already has a [attached_lock]."
+ to_chat(user, "\The [src] already has a [attached_lock].")
return
- user << "You insert \the [A] into \the [src]."
+ to_chat(user, "You insert \the [A] into \the [src].")
user.drop_item()
A.loc = src
attached_lock = A
@@ -248,12 +248,12 @@
verbs += /obj/item/weapon/gun/verb/allow_dna
return
- if(istype(A, /obj/item/weapon/screwdriver))
+ if(A.is_screwdriver())
if(dna_lock && attached_lock && !attached_lock.controller_lock)
- user << "You begin removing \the [attached_lock] from \the [src]."
+ to_chat(user, "You begin removing \the [attached_lock] from \the [src].")
playsound(src, A.usesound, 50, 1)
if(do_after(user, 25 * A.toolspeed))
- user << "You remove \the [attached_lock] from \the [src]."
+ to_chat(user, "You remove \the [attached_lock] from \the [src].")
user.put_in_hands(attached_lock)
dna_lock = 0
attached_lock = null
@@ -261,12 +261,12 @@
verbs -= /obj/item/weapon/gun/verb/give_dna
verbs -= /obj/item/weapon/gun/verb/allow_dna
else
- user << "\The [src] is not accepting modifications at this time."
+ to_chat(user, "\The [src] is not accepting modifications at this time.")
..()
/obj/item/weapon/gun/emag_act(var/remaining_charges, var/mob/user)
if(dna_lock && attached_lock.controller_lock)
- user << "You short circuit the internal locking mechanisms of \the [src]!"
+ to_chat(user, "You short circuit the internal locking mechanisms of \the [src]!")
attached_lock.controller_dna = null
attached_lock.controller_lock = 0
attached_lock.stored_dna = list()
@@ -317,7 +317,7 @@
if(world.time < next_fire_time)
if (world.time % 3) //to prevent spam
- user << "[src] is not ready to fire again!"
+ to_chat(user, "[src] is not ready to fire again!")
return
var/shoot_time = (burst - 1)* burst_delay
@@ -681,7 +681,7 @@
user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1)
user.death()
else
- user << "Ow..."
+ to_chat(user, "Ow...")
user.apply_effect(110,AGONY,0)
qdel(in_chamber)
mouthshoot = 0
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index c87c37a085..9cfd0d152a 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -23,17 +23,6 @@
var/battery_lock = 0 //If set, weapon cannot switch batteries
-/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob)
- ..()
-
-/obj/item/weapon/gun/energy/switch_firemodes(mob/user)
- if(..())
- update_icon()
-
-/obj/item/weapon/gun/energy/emp_act(severity)
- ..()
- update_icon()
-
/obj/item/weapon/gun/energy/New()
..()
if(self_recharge)
@@ -52,6 +41,9 @@
processing_objects.Remove(src)
return ..()
+/obj/item/weapon/gun/energy/get_cell()
+ return power_supply
+
/obj/item/weapon/gun/energy/process()
if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the battery
if(world.time > last_shot + charge_delay) //Doesn't work if you've fired recently
@@ -75,6 +67,17 @@
charge_tick = 0
return 1
+/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob)
+ ..()
+
+/obj/item/weapon/gun/energy/switch_firemodes(mob/user)
+ if(..())
+ update_icon()
+
+/obj/item/weapon/gun/energy/emp_act(severity)
+ ..()
+ update_icon()
+
/obj/item/weapon/gun/energy/consume_next_projectile()
if(!power_supply) return null
if(!ispath(projectile_type)) return null
diff --git a/code/modules/projectiles/guns/energy/phase.dm b/code/modules/projectiles/guns/energy/phase.dm
new file mode 100644
index 0000000000..7de6ae53ce
--- /dev/null
+++ b/code/modules/projectiles/guns/energy/phase.dm
@@ -0,0 +1,57 @@
+// Phase weapons go here
+
+/obj/item/weapon/gun/energy/phasegun
+ name = "phase carbine"
+ desc = "The NT EW26 Artemis is a downsized energy weapon, specifically designed for use against wildlife."
+ icon_state = "phasecarbine"
+ item_state = "phasecarbine"
+ wielded_item_state = "phasecarbine-wielded"
+ slot_flags = SLOT_BACK|SLOT_BELT
+ charge_cost = 240
+ projectile_type = /obj/item/projectile/energy/phase
+ one_handed_penalty = 15
+
+/obj/item/weapon/gun/energy/phasegun/pistol
+ name = "phase pistol"
+ desc = "The NT EW15 Apollo is an energy handgun, specifically designed for self-defense against aggressive wildlife."
+ icon_state = "phase"
+ item_state = "taser" //I don't have an in-hand sprite, taser will be fine
+ w_class = ITEMSIZE_NORMAL
+ slot_flags = SLOT_BELT|SLOT_HOLSTER
+ charge_cost = 300
+ projectile_type = /obj/item/projectile/energy/phase/light
+ one_handed_penalty = 0
+
+/obj/item/weapon/gun/energy/phasegun/pistol/mounted
+ name = "mounted phase pistol"
+ self_recharge = 1
+ use_external_power = 1
+
+/obj/item/weapon/gun/energy/phasegun/pistol/mounted/cyborg
+ charge_cost = 400
+ recharge_time = 7
+
+obj/item/weapon/gun/energy/phasegun/rifle
+ name = "phase rifle"
+ desc = "The NT EW31 Orion is a specialist energy weapon, intended for use against hostile wildlife."
+ icon_state = "phaserifle"
+ item_state = "phaserifle"
+ wielded_item_state = "phaserifle-wielded"
+ slot_flags = SLOT_BACK
+ charge_cost = 150
+ projectile_type = /obj/item/projectile/energy/phase/heavy
+ accuracy = 15
+ one_handed_penalty = 30
+
+/obj/item/weapon/gun/energy/phasegun/cannon
+ name = "phase cannon"
+ desc = "The NT EW50 Gaia is a massive energy weapon, purpose-built for clearing land. You feel dirty just looking at it."
+ icon_state = "phasecannon"
+ item_state = "phasecannon"
+ wielded_item_state = "phasecannon-wielded" //TODO: New Sprites
+ w_class = ITEMSIZE_HUGE // This thing is big.
+ slot_flags = SLOT_BACK
+ charge_cost = 100
+ projectile_type = /obj/item/projectile/energy/phase/heavy/cannon
+ accuracy = 15
+ one_handed_penalty = 65
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 8f18f2f64c..f1e20b169b 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -25,15 +25,6 @@
charge_cost = 480
projectile_type = /obj/item/projectile/ion/pistol
-/obj/item/weapon/gun/energy/phasegun
- name = "phase pistol"
- desc = "The NT Mk26 EW Apollo is an energy handgun, specifically designed for use against wildlife."
- icon_state = "phase"
- item_state = "taser" //I don't have an in-hand sprite, taser will be fine
- slot_flags = SLOT_BELT|SLOT_HOLSTER
- charge_cost = 300
- projectile_type = /obj/item/projectile/energy/phase
-
/obj/item/weapon/gun/energy/decloner
name = "biological demolecularisor"
desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
diff --git a/code/modules/projectiles/guns/launcher/crossbow.dm b/code/modules/projectiles/guns/launcher/crossbow.dm
index 8918b7d893..a8458b1676 100644
--- a/code/modules/projectiles/guns/launcher/crossbow.dm
+++ b/code/modules/projectiles/guns/launcher/crossbow.dm
@@ -162,7 +162,7 @@
else
user << "[src] already has a cell installed."
- else if(istype(W, /obj/item/weapon/screwdriver))
+ else if(W.is_screwdriver())
if(cell)
var/obj/item/C = cell
C.loc = get_turf(user)
@@ -227,7 +227,7 @@
else
user << "You need at least three rods to complete this task."
return
- else if(istype(W,/obj/item/weapon/weldingtool))
+ else if(istype(W, /obj/item/weapon/weldingtool))
if(buildstate == 1)
var/obj/item/weapon/weldingtool/T = W
if(T.remove_fuel(0,user))
@@ -237,7 +237,7 @@
buildstate++
update_icon()
return
- else if(istype(W,/obj/item/stack/cable_coil))
+ else if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = W
if(buildstate == 2)
if(C.use(5))
@@ -265,7 +265,7 @@
else
user << "You need at least three plastic sheets to complete this task."
return
- else if(istype(W,/obj/item/weapon/screwdriver))
+ else if(W.is_screwdriver())
if(buildstate == 5)
user << "You secure the crossbow's various parts."
playsound(src, W.usesound, 50, 1)
diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm
index cbce1a7aa1..2e8289fb8e 100644
--- a/code/modules/projectiles/guns/magnetic/magnetic.dm
+++ b/code/modules/projectiles/guns/magnetic/magnetic.dm
@@ -36,6 +36,9 @@
qdel_null(capacitor)
. = ..()
+/obj/item/weapon/gun/magnetic/get_cell()
+ return cell
+
/obj/item/weapon/gun/magnetic/process()
if(capacitor)
if(cell)
@@ -102,7 +105,7 @@
update_icon()
return
- if(isscrewdriver(thing))
+ if(thing.is_screwdriver())
if(!capacitor)
to_chat(user, "\The [src] has no capacitor installed.")
return
diff --git a/code/modules/projectiles/guns/magnetic/magnetic_construction.dm b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm
index 0c3647458b..e8d38169fd 100644
--- a/code/modules/projectiles/guns/magnetic/magnetic_construction.dm
+++ b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm
@@ -66,7 +66,7 @@
increment_construction_stage()
return
- if(isscrewdriver(thing) && construction_stage >= 9)
+ if(thing.is_screwdriver() && construction_stage >= 9)
user.visible_message("\The [user] secures \the [src] and finishes it off.")
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
var/obj/item/weapon/gun/magnetic/coilgun = new(loc)
diff --git a/code/modules/projectiles/guns/modular_guns.dm b/code/modules/projectiles/guns/modular_guns.dm
index 8f81e971c4..64b33347cd 100644
--- a/code/modules/projectiles/guns/modular_guns.dm
+++ b/code/modules/projectiles/guns/modular_guns.dm
@@ -50,12 +50,12 @@
FireModeModify()
/obj/item/weapon/gun/energy/modular/attackby(obj/item/O, mob/user)
- if(istype(O, /obj/item/weapon/screwdriver))
+ if(O.is_screwdriver())
to_chat(user, "You [assembled ? "disassemble" : "assemble"] the gun.")
assembled = !assembled
playsound(src, O.usesound, 50, 1)
return
- if(istype(O, /obj/item/weapon/crowbar))
+ if(O.is_crowbar())
if(assembled == 1)
to_chat(user, "Disassemble the [src] first!")
return
@@ -130,11 +130,11 @@
/obj/item/weapon/gun/energy/modular/load_ammo(var/obj/item/C, mob/user)
if(istype(C, cell_type))
if(self_recharge || battery_lock)
- user << "[src] does not have a battery port."
+ to_chat(user, "[src] does not have a battery port.")
return
var/obj/item/weapon/cell/P = C
if(power_supply)
- user << "[src] already has a power cell."
+ to_chat(user, "[src] already has a power cell.")
else
user.visible_message("[user] is reloading [src].", "You start to insert [P] into [src].")
if(do_after(user, 10))
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 4c7e0e3e88..a1afc075b5 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -1,25 +1,40 @@
-/obj/item/weapon/gun/projectile/automatic //Hopefully someone will find a way to make these fire in bursts or something. --Superxpdude //Except burstfire isn't fit for an rp server --Mark
+/obj/item/weapon/gun/projectile/automatic //This should never be spawned in, it is just here because of code necessities.
+ name = "daka SMG"
+ desc = "A small SMG. You really shouldn't be able to get this gun. Uses 9mm rounds."
+ icon_state = "c05r" //Used because it's not used anywhere else
+ load_method = SPEEDLOADER
+ ammo_type = /obj/item/ammo_casing/a9mm
+ projectile_type = /obj/item/projectile/bullet/pistol
+
+//Burst is the number of bullets fired; Fire delay is the time you have to wait to shoot the gun again, Move delay is the same but for moving after shooting. .
+//Burst accuracy is the accuracy of each bullet fired in the burst. Dispersion is how much the bullets will 'spread' away from where you aimed.
+
+ firemodes = list(
+ list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
+ list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0)))
+
+/obj/item/weapon/gun/projectile/automatic/saber //Fixed it
name = "prototype SMG"
desc = "A protoype lightweight, fast firing gun. Uses 9mm rounds."
- icon_state = "saber" //ugly
+ icon = 'icons/obj/gun.dmi'
+ icon_state = "saber"//Still ugly
w_class = ITEMSIZE_NORMAL
- load_method = SPEEDLOADER //yup. until someone sprites a magazine for it.
+ load_method = MAGAZINE //This should fix it
max_shells = 22
caliber = "9mm"
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2)
slot_flags = SLOT_BELT
- ammo_type = /obj/item/ammo_casing/a9mm
+ magazine_type = /obj/item/ammo_magazine/m9mmR/saber
+ allowed_magazines = list(/obj/item/ammo_magazine/m9mmR/saber, /obj/item/ammo_magazine/m9mmR/saber/ap)
projectile_type = /obj/item/projectile/bullet/pistol
multi_aim = 1
burst_delay = 2
-// one_handed_penalty = 15
-
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0))
-// list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15,-30,-30), dispersion=list(0.6, 1.0, 1.0, 1.0, 1.2)),
- )
+ // list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15,-30,-30), dispersion=list(0.6, 1.0, 1.0, 1.0, 1.2)),
+ )
/obj/item/weapon/gun/projectile/automatic/c20r
name = "submachine gun"
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 087543091d..183ead39d1 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -41,6 +41,9 @@
update_icon()
+/obj/item/weapon/gun/projectile/shotgun/pump/slug
+ ammo_type = /obj/item/ammo_casing/a12g
+
/obj/item/weapon/gun/projectile/shotgun/pump/combat
name = "combat shotgun"
desc = "Built for close quarters combat, the Hephaestus Industries KS-40 is widely regarded as a weapon of choice for repelling boarders. Uses 12g rounds."
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index b398de7d2f..4566577a94 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -323,6 +323,7 @@
before_move()
Move(location.return_turf())
+ after_move()
if(!bumped && !isturf(original))
if(loc == get_turf(original))
@@ -348,6 +349,9 @@
/obj/item/projectile/proc/before_move()
return
+/obj/item/projectile/proc/after_move()
+ return
+
/obj/item/projectile/proc/setup_trajectory(turf/startloc, turf/targloc, var/x_offset = 0, var/y_offset = 0)
// setup projectile state
starting = startloc
diff --git a/code/modules/projectiles/projectile/arc.dm b/code/modules/projectiles/projectile/arc.dm
new file mode 100644
index 0000000000..6e434b1e99
--- /dev/null
+++ b/code/modules/projectiles/projectile/arc.dm
@@ -0,0 +1,134 @@
+// These projectiles are somewhat different from the other projectiles in the code.
+// First, these have an 'arcing' visual, that is accomplished by having the projectile icon rotate as its flying, and
+// moving up, then down as it approaches the target. There is also a small shadow effect that follows the projectile
+// as its flying.
+
+// Besides the visuals, arcing projectiles do not collide with anything until they reach the target, as they fly over them.
+// For best effect, use this only when it makes sense to do so, IE on the Surface. The projectiles don't care about ceilings or gravity.
+
+/obj/item/projectile/arc
+ name = "arcing shot"
+ icon_state = "fireball" // WIP
+ step_delay = 2 // Travel a bit slower, to really sell the arc visuals.
+ plane = ABOVE_PLANE // Since projectiles are 'in the air', they might visually overlap mobs while in flight, so the projectile needs to be above their plane.
+ var/target_distance = null // How many tiles the impact site is.
+ var/fired_dir = null // Which direction was the projectile fired towards. Needed to invert the projectile turning based on if facing left or right.
+ var/obj/effect/projectile_shadow/shadow = null // Visual indicator for the projectile's 'true' position. Needed due to being bound to two dimensions in reality.
+
+/obj/item/projectile/arc/initialize()
+ shadow = new(get_turf(src))
+ return ..()
+
+/obj/item/projectile/arc/Destroy()
+ qdel_null(shadow)
+ return ..()
+
+/obj/item/projectile/arc/Bump(atom/A, forced=0)
+ return 0
+// if(get_turf(src) != original)
+// return 0
+// else
+// return ..()
+
+// This is a test projectile in the sense that its testing the code to make sure it works,
+// as opposed to a 'can I hit this thing' projectile.
+/obj/item/projectile/arc/test/on_impact(turf/T)
+ new /obj/effect/explosion(T)
+ return ..()
+
+/obj/item/projectile/arc/launch(atom/target, target_zone, x_offset=0, y_offset=0, angle_offset=0)
+ var/expected_distance = get_dist(target, loc)
+ kill_count = expected_distance // So the projectile "hits the ground."
+ target_distance = expected_distance
+ fired_dir = get_dir(loc, target)
+ ..() // Does the regular launching stuff.
+ if(fired_dir & EAST)
+ transform = turn(transform, -45)
+ else if(fired_dir & WEST)
+ transform = turn(transform, 45)
+
+
+// Visuals.
+/obj/item/projectile/arc/after_move()
+ // Handle projectile turning in flight.
+ // This won't turn if fired north/south, as it looks weird.
+ var/turn_per_step = 90 / target_distance
+ if(fired_dir & EAST)
+ transform = turn(transform, turn_per_step)
+ else if(fired_dir & WEST)
+ transform = turn(transform, -turn_per_step)
+
+ // Now for the fake height.
+ // We need to know how far along our "arc" we are.
+ var/arc_progress = get_dist(src, original)
+ var/arc_max_height = (target_distance * world.icon_size) / 2 // TODO: Real math.
+// var/arc_center = target_distance / 2
+// var/projectile_position = abs(arc_progress - arc_center)
+// var/height_multiplier = projectile_position / arc_center
+// height_multiplier = abs(height_multiplier - 1)
+// height_multiplier = height_multiplier ** 2
+
+
+// animate(src, pixel_z = arc_max_height * height_multiplier, time = step_delay)
+ var/projectile_position = arc_progress / target_distance
+ var/sine_position = projectile_position * 180
+ var/pixel_z_position = arc_max_height * sin(sine_position)
+ animate(src, pixel_z = pixel_z_position, time = step_delay)
+
+ // Update our shadow.
+ shadow.forceMove(loc)
+
+/obj/effect/projectile_shadow
+ name = "shadow"
+ desc = "You better avoid the thing coming down!"
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "arc_shadow"
+ anchored = TRUE
+
+//////////////
+// Subtypes
+//////////////
+
+// Generic, Hivebot related
+/obj/item/projectile/arc/blue_energy
+ name = "energy missile"
+ icon_state = "force_missile"
+ damage = 15
+ damage_type = BURN
+
+// Fragmentation arc shot
+/obj/item/projectile/arc/fragmentation
+ name = "fragmentation shot"
+ icon_state = "shell"
+ var/list/fragment_types = list(
+ /obj/item/projectile/bullet/pellet/fragment, /obj/item/projectile/bullet/pellet/fragment, \
+ /obj/item/projectile/bullet/pellet/fragment, /obj/item/projectile/bullet/pellet/fragment/strong
+ )
+ var/fragment_amount = 63 // Same as a grenade.
+ var/spread_range = 7
+
+/obj/item/projectile/arc/fragmentation/on_impact(turf/T)
+ fragmentate(T, fragment_amount, spread_range, fragment_types)
+
+// EMP arc shot
+/obj/item/projectile/arc/emp_blast
+ name = "emp blast"
+ icon_state = "bluespace"
+
+/obj/item/projectile/arc/emp_blast/on_impact(turf/T)
+ empulse(T, 2, 4, 7, 10) // Normal EMP grenade.
+ return ..()
+
+/obj/item/projectile/arc/emp_blast/weak/on_impact(turf/T)
+ empulse(T, 1, 2, 3, 4) // Sec EMP grenade.
+ return ..()
+
+// Radiation arc shot
+/obj/item/projectile/arc/radioactive
+ name = "radiation blast"
+ icon_state = "green_pellet"
+ icon_scale = 2
+ var/rad_power = 50
+
+/obj/item/projectile/arc/radioactive/on_impact(turf/T)
+ radiation_repository.radiate(T, rad_power)
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 9755f604ab..0cd8e69013 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -10,7 +10,7 @@
var/frequency = 1
hitscan = 1
embed_chance = 0
- invisibility = 101 //beam projectiles are invisible as they are rendered by the effect engine
+ invisibility = 99 //beam projectiles are invisible as they are rendered by the effect engine
light_range = 2
light_power = 0.5
light_color = "#FF0D00"
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index d5bae0dc22..3448c2a9e9 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -212,7 +212,22 @@
muzzle_type = /obj/effect/projectile/pulse/muzzle
/obj/item/projectile/energy/phase
- kill_count = 4
+ name = "phase wave"
+ icon_state = "phase"
+ kill_count = 6
damage = 5
- SA_bonus_damage = 55 // 60 total on animals.
- SA_vulnerability = SA_ANIMAL
\ No newline at end of file
+ SA_bonus_damage = 45 // 50 total on animals
+ SA_vulnerability = SA_ANIMAL
+
+/obj/item/projectile/energy/phase/light
+ kill_count = 4
+ SA_bonus_damage = 35 // 40 total on animals
+
+/obj/item/projectile/energy/phase/heavy
+ kill_count = 8
+ SA_bonus_damage = 55 // 60 total on animals
+
+/obj/item/projectile/energy/phase/heavy/cannon
+ kill_count = 10
+ damage = 15
+ SA_bonus_damage = 60 // 75 total on animals
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index f7ecddb0eb..2e27d125ef 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -15,7 +15,7 @@
var/sev1_range = 0
var/sev2_range = 1
var/sev3_range = 1
- var/sev4_range = 2
+ var/sev4_range = 1
/obj/item/projectile/ion/on_hit(var/atom/target, var/blocked = 0)
empulse(target, sev1_range, sev2_range, sev3_range, sev4_range)
diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm
index 00a380dedf..76d1804265 100644
--- a/code/modules/projectiles/targeting/targeting_overlay.dm
+++ b/code/modules/projectiles/targeting/targeting_overlay.dm
@@ -6,7 +6,7 @@
anchored = 1
density = 0
opacity = 0
- layer = FLY_LAYER
+ plane = ABOVE_PLANE
simulated = 0
mouse_opacity = 0
diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm
index 30b5f86027..f426fa5ebc 100644
--- a/code/modules/random_map/drop/drop_types.dm
+++ b/code/modules/random_map/drop/drop_types.dm
@@ -193,8 +193,8 @@ datum/supply_drop_loot/riot
/obj/item/weapon/reagent_containers/food/snacks/tastybread,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake,
- /obj/item/weapon/crowbar,
- /obj/item/weapon/crowbar,
+ /obj/item/weapon/tool/crowbar,
+ /obj/item/weapon/tool/crowbar,
/obj/item/device/flashlight,
/obj/item/device/flashlight,
/obj/item/clothing/suit/storage/hazardvest,
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 3587e2f36a..d75d1439f7 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -50,24 +50,24 @@
if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food))
if(src.beaker)
- user << "\A [beaker] is already loaded into the machine."
+ to_chat(user, "\A [beaker] is already loaded into the machine.")
return
src.beaker = B
user.drop_item()
B.loc = src
- user << "You add \the [B] to the machine!"
+ to_chat(user, "You add \the [B] to the machine!")
icon_state = "mixer1"
else if(istype(B, /obj/item/weapon/storage/pill_bottle))
if(src.loaded_pill_bottle)
- user << "A \the [loaded_pill_bottle] s already loaded into the machine."
+ to_chat(user, "A \the [loaded_pill_bottle] s already loaded into the machine.")
return
src.loaded_pill_bottle = B
user.drop_item()
B.loc = src
- user << "You add \the [loaded_pill_bottle] into the dispenser slot!"
+ to_chat(user, "You add \the [loaded_pill_bottle] into the dispenser slot!")
else if(default_unfasten_wrench(user, B, 20))
return
@@ -220,7 +220,9 @@
return
if (href_list["createpill_multiple"])
- count = input("Select the number of pills to make.", "Max [max_pill_count]", pillamount) as num
+ count = input("Select the number of pills to make.", "Max [max_pill_count]", pillamount) as null|num
+ if(!count) //Covers 0 and cancel
+ return
count = Clamp(count, 1, max_pill_count)
if(reagents.total_volume/count < 1) //Sanity checking.
@@ -229,7 +231,9 @@
var/amount_per_pill = reagents.total_volume/count
if (amount_per_pill > 60) amount_per_pill = 60
- var/name = sanitizeSafe(input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)"), MAX_NAME_LEN)
+ var/name = sanitizeSafe(input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)") as null|text, MAX_NAME_LEN)
+ if(!name) //Blank name (sanitized to nothing, or left empty) or cancel
+ return
if(reagents.total_volume/count < 1) //Sanity checking.
return
@@ -342,7 +346,7 @@
return 0
if(holdingitems && holdingitems.len >= limit)
- usr << "The machine cannot hold anymore items."
+ to_chat(user, "The machine cannot hold anymore items.")
return 1
if(!istype(O))
@@ -361,13 +365,13 @@
break
if(failed)
- user << "Nothing in the plant bag is usable."
+ to_chat(user, "Nothing in the plant bag is usable.")
return 1
if(!O.contents.len)
- user << "You empty \the [O] into \the [src]."
+ to_chat(user, "You empty \the [O] into \the [src].")
else
- user << "You fill \the [src] from \the [O]."
+ to_chat(user, "You fill \the [src] from \the [O].")
src.updateUsrDialog()
return 0
@@ -375,16 +379,16 @@
if(istype(O,/obj/item/weapon/gripper))
var/obj/item/weapon/gripper/B = O //B, for Borg.
if(!B.wrapped)
- user << "\The [B] is not holding anything."
+ to_chat(user, "\The [B] is not holding anything.")
return 0
else
var/B_held = B.wrapped
- user << "You use \the [B] to load \the [src] with \the [B_held]."
+ to_chat(user, "You use \the [B] to load \the [src] with \the [B_held].")
return 0
if(!sheet_reagents[O.type] && (!O.reagents || !O.reagents.total_volume))
- user << "\The [O] is not suitable for blending."
+ to_chat(user, "\The [O] is not suitable for blending.")
return 1
user.remove_from_mob(O)
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
index 3cf83d5185..59eba0e341 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
@@ -172,6 +172,11 @@
else
..()
+/datum/reagent/water/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
+ if(alien == IS_SLIME)
+ M.visible_message("[M]'s flesh sizzles where the water touches it!", "Your flesh burns in the water!")
+ ..()
+
/datum/reagent/fuel
name = "Welding fuel"
id = "fuel"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
index f844407d3c..cd40067d4c 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
@@ -65,7 +65,7 @@
reagent_state = LIQUID
color = "#404030"
- ingest_met = REM
+ ingest_met = REM * 2
var/nutriment_factor = 0
var/strength = 10 // This is, essentially, units between stages - the lower, the stronger. Less fine tuning, more clarity.
@@ -94,6 +94,8 @@
strength_mod *= 0.75
if(alien == IS_DIONA)
strength_mod = 0
+ if(alien == IS_SLIME)
+ M.adjustToxLoss(removed) //Sterilizing, if only by a little bit. Also already doubled above.
M.add_chemical_effect(CE_ALCOHOL, 1)
@@ -136,6 +138,8 @@
strength_mod *= 0.75
if(alien == IS_DIONA)
strength_mod = 0
+ if(alien == IS_SLIME)
+ M.adjustToxLoss(removed * 2) //Sterilizing, if only by a little bit.
M.add_chemical_effect(CE_ALCOHOL, 1)
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
index 853fe1cab0..c98a69aff8 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
@@ -34,7 +34,7 @@
data -= taste
/datum/reagent/nutriment/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- if(!injectable)
+ if(!injectable && alien != IS_SLIME)
M.adjustToxLoss(0.1 * removed)
return
affect_ingest(M, alien, removed)
@@ -94,7 +94,7 @@
nutriment_factor = 10
color = "#FFFF00"
-/datum/reagent/honey/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
+/datum/reagent/nutriment/honey/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
..()
var/effective_dose = dose
@@ -255,6 +255,16 @@
overdose = REAGENTS_OVERDOSE
ingest_met = REM
+/datum/reagent/sodiumchloride/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ if(alien == IS_SLIME)
+ M.adjustFireLoss(removed)
+
+/datum/reagent/sodiumchloride/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
+ var/pass_mod = rand(3,5)
+ var/passthrough = (removed - (removed/pass_mod)) //Some may be nullified during consumption, between one third and one fifth.
+ affect_blood(M, alien, passthrough)
+
/datum/reagent/blackpepper
name = "Black Pepper"
id = "blackpepper"
@@ -354,6 +364,15 @@
/datum/reagent/condensedcapsaicin/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
var/eyes_covered = 0
var/mouth_covered = 0
+
+ var/head_covered = 0
+ var/arms_covered = 0 //These are used for the effects on slime-based species.
+ var/legs_covered = 0
+ var/hands_covered = 0
+ var/feet_covered = 0
+ var/chest_covered = 0
+ var/groin_covered = 0
+
var/obj/item/safe_thing = null
var/effective_strength = 5
@@ -384,27 +403,78 @@
eyes_covered = 1
if(!safe_thing)
safe_thing = H.glasses
+ if(alien == IS_SLIME)
+ for(var/obj/item/clothing/C in H.worn_clothing)
+ if(C.body_parts_covered & HEAD)
+ head_covered = 1
+ if(C.body_parts_covered & UPPER_TORSO)
+ chest_covered = 1
+ if(C.body_parts_covered & LOWER_TORSO)
+ groin_covered = 1
+ if(C.body_parts_covered & LEGS)
+ legs_covered = 1
+ if(C.body_parts_covered & ARMS)
+ arms_covered = 1
+ if(C.body_parts_covered & HANDS)
+ hands_covered = 1
+ if(C.body_parts_covered & FEET)
+ feet_covered = 1
+ if(head_covered && chest_covered && groin_covered && legs_covered && arms_covered && hands_covered && feet_covered)
+ break
if(eyes_covered && mouth_covered)
- M << "Your [safe_thing] protects you from the pepperspray!"
- return
+ to_chat(M, "Your [safe_thing] protects you from the pepperspray!")
+ if(alien != IS_SLIME)
+ return
else if(eyes_covered)
- M << "Your [safe_thing] protect you from most of the pepperspray!"
+ to_chat(M, "Your [safe_thing] protect you from most of the pepperspray!")
M.eye_blurry = max(M.eye_blurry, effective_strength * 3)
M.Blind(effective_strength)
M.Stun(5)
M.Weaken(5)
- return
- else if (mouth_covered) // Mouth cover is better than eye cover
- M << "Your [safe_thing] protects your face from the pepperspray!"
+ if(alien != IS_SLIME)
+ return
+ else if(mouth_covered) // Mouth cover is better than eye cover
+ to_chat(M, "Your [safe_thing] protects your face from the pepperspray!")
M.eye_blurry = max(M.eye_blurry, effective_strength)
- return
- else // Oh dear :D
- M << "You're sprayed directly in the eyes with pepperspray!"
+ if(alien != IS_SLIME)
+ return
+ else// Oh dear :D
+ to_chat(M, "You're sprayed directly in the eyes with pepperspray!")
M.eye_blurry = max(M.eye_blurry, effective_strength * 5)
M.Blind(effective_strength * 2)
M.Stun(5)
M.Weaken(5)
- return
+ if(alien != IS_SLIME)
+ return
+ if(alien == IS_SLIME)
+ if(!head_covered)
+ if(prob(33))
+ to_chat(M, "The exposed flesh on your head burns!")
+ M.apply_effect(5 * effective_strength, AGONY, 0)
+ if(!chest_covered)
+ if(prob(33))
+ to_chat(M, "The exposed flesh on your chest burns!")
+ M.apply_effect(5 * effective_strength, AGONY, 0)
+ if(!groin_covered && prob(75))
+ if(prob(33))
+ to_chat(M, "The exposed flesh on your groin burns!")
+ M.apply_effect(3 * effective_strength, AGONY, 0)
+ if(!arms_covered && prob(45))
+ if(prob(33))
+ to_chat(M, "The exposed flesh on your arms burns!")
+ M.apply_effect(3 * effective_strength, AGONY, 0)
+ if(!legs_covered && prob(45))
+ if(prob(33))
+ to_chat(M, "The exposed flesh on your legs burns!")
+ M.apply_effect(3 * effective_strength, AGONY, 0)
+ if(!hands_covered && prob(20))
+ if(prob(33))
+ to_chat(M, "The exposed flesh on your hands burns!")
+ M.apply_effect(effective_strength / 2, AGONY, 0)
+ if(!feet_covered && prob(20))
+ if(prob(33))
+ to_chat(M, "The exposed flesh on your feet burns!")
+ M.apply_effect(effective_strength / 2, AGONY, 0)
/datum/reagent/condensedcapsaicin/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
if(ishuman(M))
@@ -437,7 +507,10 @@
var/adj_temp = 0
/datum/reagent/drink/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- M.adjustToxLoss(removed) // Probably not a good idea; not very deadly though
+ var/strength_mod = 1
+ if(alien == IS_SLIME)
+ strength_mod = 3
+ M.adjustToxLoss(removed * strength_mod) // Probably not a good idea; not very deadly though
return
/datum/reagent/drink/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
@@ -449,6 +522,8 @@
M.bodytemperature = min(310, M.bodytemperature + (adj_temp * TEMPERATURE_DAMAGE_COEFFICIENT))
if(adj_temp < 0 && M.bodytemperature > 310)
M.bodytemperature = min(310, M.bodytemperature - (adj_temp * TEMPERATURE_DAMAGE_COEFFICIENT))
+ if(alien == IS_SLIME)
+ M.adjustToxLoss(removed * 2)
/datum/reagent/drink/overdose(var/mob/living/carbon/M, var/alien) //Add special interactions here in the future if desired.
..()
@@ -489,7 +564,7 @@
..()
M.reagents.add_reagent("imidazoline", removed * 0.2)
-/datum/reagent/drink/juice/
+/datum/reagent/drink/juice
name = "Grape Juice"
id = "grapejuice"
description = "It's grrrrrape!"
@@ -499,7 +574,7 @@
glass_name = "grape juice"
glass_desc = "It's grrrrrape!"
-/datum/reagent/juice/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
+/datum/reagent/drink/juice/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
..()
var/effective_dose = dose/2
@@ -729,6 +804,24 @@
cup_name = "cup of iced tea"
cup_desc = "No relation to a certain rap artist/ actor."
+/datum/reagent/drink/tea/icetea/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ if(alien == IS_SLIME)
+ if(M.bodytemperature > T0C)
+ M.bodytemperature -= 0.5
+ if(M.bodytemperature < T0C)
+ M.bodytemperature += 0.5
+ M.adjustToxLoss(5 * removed)
+
+/datum/reagent/drink/tea/icetea/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ if(alien == IS_SLIME)
+ if(M.bodytemperature > T0C)
+ M.bodytemperature -= 0.5
+ if(M.bodytemperature < T0C)
+ M.bodytemperature += 0.5
+ M.adjustToxLoss(5 * removed)
+
/datum/reagent/drink/tea/minttea
name = "Mint Tea"
id = "minttea"
@@ -765,7 +858,7 @@
glass_name = "lime tea"
glass_desc = "A tasty mixture of lime and tea. It's apparently good for you!"
- cup_name = "cup of berry tea"
+ cup_name = "cup of lime tea"
cup_desc = "A tasty mixture of lime and tea. It's apparently good for you!"
/datum/reagent/drink/tea/orangetea
@@ -809,9 +902,9 @@
cup_icon_state = "cup_coffee"
cup_name = "cup of coffee"
- cup_desc = "Don't drop it, or you'll send scalding liquid and porcelain shards everywhere."
+ cup_desc = "Don't drop it, or you'll send scalding liquid and ceramic shards everywhere."
- glass_name = "cup of coffee"
+ glass_name = "coffee"
glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere."
@@ -825,7 +918,7 @@
if(adj_temp > 0)
holder.remove_reagent("frostoil", 10 * removed)
-/datum/reagent/nutriment/coffee/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+/datum/reagent/drink/coffee/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
..()
if(alien == IS_TAJARA)
M.adjustToxLoss(2 * removed)
@@ -851,6 +944,24 @@
glass_desc = "A drink to perk you up and refresh you!"
glass_special = list(DRINK_ICE)
+/datum/reagent/drink/coffee/icecoffee/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ if(alien == IS_SLIME)
+ if(M.bodytemperature > T0C)
+ M.bodytemperature -= 0.5
+ if(M.bodytemperature < T0C)
+ M.bodytemperature += 0.5
+ M.adjustToxLoss(5 * removed)
+
+/datum/reagent/drink/coffee/icecoffee/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ if(alien == IS_SLIME)
+ if(M.bodytemperature > T0C)
+ M.bodytemperature -= 0.5
+ if(M.bodytemperature < T0C)
+ M.bodytemperature += 0.5
+ M.adjustToxLoss(5 * removed)
+
/datum/reagent/drink/coffee/soy_latte
name = "Soy Latte"
id = "soy_latte"
@@ -1047,13 +1158,13 @@
adj_dizzy = -5
adj_drowsy = -3
adj_sleepy = -2
-
+
glass_name = "Coffee Milkshake"
glass_desc = "An energizing coffee milkshake, perfect for hot days at work.."
/datum/reagent/drink/milkshake/coffeeshake/overdose(var/mob/living/carbon/M, var/alien)
- M.make_jittery(5)
+ M.make_jittery(5)
/datum/reagent/drink/rewriter
name = "Rewriter"
@@ -1309,6 +1420,24 @@
glass_desc = "Generally, you're supposed to put something else in there too..."
glass_icon = DRINK_ICON_NOISY
+/datum/reagent/drink/ice/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ if(alien == IS_SLIME)
+ if(M.bodytemperature > T0C)
+ M.bodytemperature -= rand(1,3)
+ if(M.bodytemperature < T0C)
+ M.bodytemperature += rand(1,3)
+ M.adjustToxLoss(5 * removed)
+
+/datum/reagent/drink/ice/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ if(alien == IS_SLIME)
+ if(M.bodytemperature > T0C)
+ M.bodytemperature -= rand(1,3)
+ if(M.bodytemperature < T0C)
+ M.bodytemperature += rand(1,3)
+ M.adjustToxLoss(5 * removed)
+
/datum/reagent/drink/nothing
name = "Nothing"
id = "nothing"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
index d753d045d6..414fa58cd5 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
@@ -28,8 +28,11 @@
scannable = 1
/datum/reagent/bicaridine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ var/chem_effective = 1
+ if(alien == IS_SLIME)
+ chem_effective = 0.75
if(alien != IS_DIONA)
- M.heal_organ_damage(6 * removed, 0)
+ M.heal_organ_damage(6 * removed * chem_effective, 0)
/datum/reagent/bicaridine/overdose(var/mob/living/carbon/M, var/alien, var/removed)
..()
@@ -59,8 +62,12 @@
scannable = 1
/datum/reagent/kelotane/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ var/chem_effective = 1
+ if(alien == IS_SLIME)
+ chem_effective = 0.5
+ M.adjustBruteLoss(2 * removed) //Mends burns, but has negative effects with a Promethean's skeletal structure.
if(alien != IS_DIONA)
- M.heal_organ_damage(0, 6 * removed)
+ M.heal_organ_damage(0, 6 * removed * chem_effective)
/datum/reagent/dermaline
name = "Dermaline"
@@ -74,8 +81,11 @@
scannable = 1
/datum/reagent/dermaline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ var/chem_effective = 1
+ if(alien == IS_SLIME)
+ chem_effective = 0.75
if(alien != IS_DIONA)
- M.heal_organ_damage(0, 12 * removed)
+ M.heal_organ_damage(0, 12 * removed * chem_effective)
/datum/reagent/dylovene
name = "Dylovene"
@@ -87,10 +97,15 @@
scannable = 1
/datum/reagent/dylovene/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ var/chem_effective = 1
+ if(alien == IS_SLIME)
+ chem_effective = 0.66
+ if(dose >= 15)
+ M.druggy = max(M.druggy, 5)
if(alien != IS_DIONA)
- M.drowsyness = max(0, M.drowsyness - 6 * removed)
- M.hallucination = max(0, M.hallucination - 9 * removed)
- M.adjustToxLoss(-4 * removed)
+ M.drowsyness = max(0, M.drowsyness - 6 * removed * chem_effective)
+ M.hallucination = max(0, M.hallucination - 9 * removed * chem_effective)
+ M.adjustToxLoss(-4 * removed * chem_effective)
/datum/reagent/carthatoline
name = "Carthatoline"
@@ -114,6 +129,8 @@
return
if(L.damage > 0)
L.damage = max(L.damage - 2 * removed, 0)
+ if(alien == IS_SLIME)
+ H.druggy = max(M.druggy, 5)
/datum/reagent/dexalin
name = "Dexalin"
@@ -128,6 +145,12 @@
/datum/reagent/dexalin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_VOX)
M.adjustToxLoss(removed * 6)
+ else if(alien == IS_SLIME && dose >= 15)
+ M.add_chemical_effect(CE_PAINKILLER, 15)
+ if(prob(15))
+ to_chat(M, "You have a moment of clarity as you collapse.")
+ M.adjustBrainLoss(-5 * removed)
+ M.Weaken(6)
else if(alien != IS_DIONA)
M.adjustOxyLoss(-15 * removed)
@@ -146,6 +169,12 @@
/datum/reagent/dexalinp/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_VOX)
M.adjustToxLoss(removed * 9)
+ else if(alien == IS_SLIME && dose >= 10)
+ M.add_chemical_effect(CE_PAINKILLER, 25)
+ if(prob(25))
+ to_chat(M, "You have a moment of clarity, as you feel your tubes lose pressure rapidly.")
+ M.adjustBrainLoss(-8 * removed)
+ M.Weaken(3)
else if(alien != IS_DIONA)
M.adjustOxyLoss(-150 * removed)
@@ -162,9 +191,12 @@
/datum/reagent/tricordrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien != IS_DIONA)
- M.adjustOxyLoss(-3 * removed)
- M.heal_organ_damage(1.5 * removed, 1.5 * removed)
- M.adjustToxLoss(-1.5 * removed)
+ var/chem_effective = 1
+ if(alien == IS_SLIME)
+ chem_effective = 0.5
+ M.adjustOxyLoss(-3 * removed * chem_effective)
+ M.heal_organ_damage(1.5 * removed, 1.5 * removed * chem_effective)
+ M.adjustToxLoss(-1.5 * removed * chem_effective)
/datum/reagent/cryoxadone
name = "Cryoxadone"
@@ -179,10 +211,17 @@
/datum/reagent/cryoxadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(M.bodytemperature < 170)
- M.adjustCloneLoss(-10 * removed)
- M.adjustOxyLoss(-10 * removed)
- M.heal_organ_damage(10 * removed, 10 * removed)
- M.adjustToxLoss(-10 * removed)
+ var/chem_effective = 1
+ if(alien == IS_SLIME)
+ chem_effective = 0.25
+ to_chat(M, "It's cold. Something causes your cellular mass to harden occasionally, resulting in vibration.")
+ M.Weaken(10)
+ M.silent = max(M.silent, 10)
+ M.make_jittery(4)
+ M.adjustCloneLoss(-10 * removed * chem_effective)
+ M.adjustOxyLoss(-10 * removed * chem_effective)
+ M.heal_organ_damage(10 * removed, 10 * removed * chem_effective)
+ M.adjustToxLoss(-10 * removed * chem_effective)
/datum/reagent/clonexadone
name = "Clonexadone"
@@ -197,10 +236,18 @@
/datum/reagent/clonexadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(M.bodytemperature < 170)
- M.adjustCloneLoss(-30 * removed)
- M.adjustOxyLoss(-30 * removed)
- M.heal_organ_damage(30 * removed, 30 * removed)
- M.adjustToxLoss(-30 * removed)
+ var/chem_effective = 1
+ if(alien == IS_SLIME)
+ if(prob(10))
+ to_chat(M, "It's so cold. Something causes your cellular mass to harden sporadically, resulting in seizure-like twitching.")
+ chem_effective = 0.5
+ M.Weaken(20)
+ M.silent = max(M.silent, 20)
+ M.make_jittery(4)
+ M.adjustCloneLoss(-30 * removed * chem_effective)
+ M.adjustOxyLoss(-30 * removed * chem_effective)
+ M.heal_organ_damage(30 * removed, 30 * removed * chem_effective)
+ M.adjustToxLoss(-30 * removed * chem_effective)
/* Painkillers */
@@ -217,10 +264,15 @@
mrate_static = TRUE
/datum/reagent/paracetamol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- M.add_chemical_effect(CE_PAINKILLER, 25)
+ var/chem_effective = 1
+ if(alien == IS_SLIME)
+ chem_effective = 0.75
+ M.add_chemical_effect(CE_PAINKILLER, 25 * chem_effective)
/datum/reagent/paracetamol/overdose(var/mob/living/carbon/M, var/alien)
..()
+ if(alien == IS_SLIME)
+ M.add_chemical_effect(CE_SLOWDOWN, 1)
M.hallucination = max(M.hallucination, 2)
/datum/reagent/tramadol
@@ -236,7 +288,11 @@
mrate_static = TRUE
/datum/reagent/tramadol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- M.add_chemical_effect(CE_PAINKILLER, 80)
+ var/chem_effective = 1
+ if(alien == IS_SLIME)
+ chem_effective = 0.8
+ M.add_chemical_effect(CE_SLOWDOWN, 1)
+ M.add_chemical_effect(CE_PAINKILLER, 80 * chem_effective)
/datum/reagent/tramadol/overdose(var/mob/living/carbon/M, var/alien)
..()
@@ -255,8 +311,13 @@
mrate_static = TRUE
/datum/reagent/oxycodone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- M.add_chemical_effect(CE_PAINKILLER, 200)
- M.eye_blurry = min(M.eye_blurry + 10, 250)
+ var/chem_effective = 1
+ if(alien == IS_SLIME)
+ chem_effective = 0.75
+ M.stuttering = min(50, max(0, M.stuttering + 5)) //If you can't feel yourself, and your main mode of speech is resonation, there's a problem.
+ M.add_chemical_effect(CE_SLOWDOWN, 1)
+ M.add_chemical_effect(CE_PAINKILLER, 200 * chem_effective)
+ M.eye_blurry = min(M.eye_blurry + 10, 250 * chem_effective)
M.Confuse(5)
/datum/reagent/oxycodone/overdose(var/mob/living/carbon/M, var/alien)
@@ -278,16 +339,23 @@
scannable = 1
/datum/reagent/synaptizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ var/chem_effective = 1
if(alien == IS_DIONA)
return
+ if(alien == IS_SLIME)
+ if(dose >= 5) //Not effective in small doses, though it causes toxloss at higher ones, it will make the regeneration for brute and burn more 'efficient' at the cost of more nutrition.
+ M.nutrition -= removed * 2
+ M.adjustBruteLoss(-2 * removed)
+ M.adjustFireLoss(-1 * removed)
+ chem_effective = 0.5
M.drowsyness = max(M.drowsyness - 5, 0)
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
holder.remove_reagent("mindbreaker", 5)
M.hallucination = max(0, M.hallucination - 10)
- M.adjustToxLoss(5 * removed) // It used to be incredibly deadly due to an oversight. Not anymore!
- M.add_chemical_effect(CE_PAINKILLER, 20)
+ M.adjustToxLoss(5 * removed * chem_effective) // It used to be incredibly deadly due to an oversight. Not anymore!
+ M.add_chemical_effect(CE_PAINKILLER, 20 * chem_effective)
/datum/reagent/hyperzine
name = "Hyperzine"
@@ -301,6 +369,10 @@
/datum/reagent/hyperzine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_TAJARA)
removed *= 1.25
+ if(alien == IS_SLIME)
+ M.make_jittery(4) //Hyperactive fluid pumping results in unstable 'skeleton', resulting in vibration.
+ if(dose >= 5)
+ M.nutrition = (M.nutrition - (removed * 2)) //Sadly this movement starts burning food in higher doses.
..()
if(prob(5))
M.emote(pick("twitch", "blink_r", "shiver"))
@@ -320,8 +392,15 @@
/datum/reagent/alkysine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
return
- M.adjustBrainLoss(-30 * removed)
- M.add_chemical_effect(CE_PAINKILLER, 10)
+ var/chem_effective = 1
+ if(alien == IS_SLIME)
+ chem_effective = 0.25
+ if(M.brainloss >= 10)
+ M.Weaken(5)
+ if(dose >= 10 && M.paralysis < 40)
+ M.AdjustParalysis(1) //Messing with the core with a simple chemical probably isn't the best idea.
+ M.adjustBrainLoss(-30 * removed * chem_effective)
+ M.add_chemical_effect(CE_PAINKILLER, 10 * chem_effective)
/datum/reagent/imidazoline
name = "Imidazoline"
@@ -369,6 +448,10 @@
if(I.damage <= 5 && I.organ_tag == O_EYES)
H.eye_blurry = min(M.eye_blurry + 10, 250) //Eyes need to reset, or something
H.sdisabilities &= ~BLIND
+ if(alien == IS_SLIME)
+ H.add_chemical_effect(CE_PAINKILLER, 20)
+ if(prob(33))
+ H.Confuse(10)
/datum/reagent/osteodaxon
name = "Osteodaxon"
@@ -437,9 +520,35 @@
M.disabilities = 0
M.sdisabilities = 0
+ var/mob/living/carbon/human/H = M
+ if(alien == IS_SLIME && istype(H)) //Shifts them toward white, faster than Rezadone does toward grey.
+ if(prob(50))
+ if(H.r_skin)
+ H.r_skin = round((H.r_skin + 510)/3)
+ if(H.r_hair)
+ H.r_hair = round((H.r_hair + 510)/3)
+ if(H.r_facial)
+ H.r_facial = round((H.r_facial + 510)/3)
+ H.adjustToxLoss(6 * removed)
+ if(prob(50))
+ if(H.g_skin)
+ H.g_skin = round((H.g_skin + 510)/3)
+ if(H.g_hair)
+ H.g_hair = round((H.g_hair + 510)/3)
+ if(H.g_facial)
+ H.g_facial = round((H.g_facial + 510)/3)
+ H.adjustToxLoss(6 * removed)
+ if(prob(50))
+ if(H.b_skin)
+ H.b_skin = round((H.b_skin + 510)/3)
+ if(H.b_hair)
+ H.b_hair = round((H.b_hair + 510)/3)
+ if(H.b_facial)
+ H.b_facial = round((H.b_facial + 510)/3)
+ H.adjustToxLoss(6 * removed)
+
// Might need to update appearance for hulk etc.
if(needs_update && ishuman(M))
- var/mob/living/carbon/human/H = M
H.update_mutations()
/datum/reagent/ethylredoxrazine
@@ -513,9 +622,19 @@
mrate_static = TRUE
overdose = REAGENTS_OVERDOSE
scannable = 1
+ data = 0
/datum/reagent/spaceacillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
..()
+ if(alien == IS_SLIME)
+ if(volume <= 0.1 && data != -1)
+ data = -1
+ to_chat(M, "You regain focus...")
+ else
+ var/delay = (5 MINUTES)
+ if(world.time > data + delay)
+ data = world.time
+ to_chat(M, "Your senses feel unfocused, and divided.")
M.add_chemical_effect(CE_ANTIBIOTIC, dose >= overdose ? ANTIBIO_OD : ANTIBIO_NORM)
/datum/reagent/corophizine
@@ -528,11 +647,48 @@
mrate_static = TRUE
overdose = 10
scannable = 1
+ data = 0
/datum/reagent/corophizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
..()
M.add_chemical_effect(CE_ANTIBIOTIC, ANTIBIO_SUPER)
+ var/mob/living/carbon/human/H = M
+
+ if(ishuman(M) && alien == IS_SLIME) //Everything about them is treated like a targetted organism. Widespread bodily function begins to fail.
+ if(volume <= 0.1 && data != -1)
+ data = -1
+ to_chat(M, "Your body ceases its revolt.")
+ else
+ var/delay = (3 MINUTES)
+ if(world.time > data + delay)
+ data = world.time
+ to_chat(M, "It feels like your body is revolting!")
+ M.Confuse(7)
+ M.adjustFireLoss(removed * 2)
+ M.adjustToxLoss(removed * 2)
+ if(dose >= 5 && M.toxloss >= 10) //It all starts going wrong.
+ M.adjustBruteLoss(removed * 3)
+ M.eye_blurry = min(20, max(0, M.eye_blurry + 10))
+ if(prob(25))
+ if(prob(25))
+ to_chat(M, "Your pneumatic fluids seize for a moment.")
+ M.Stun(2)
+ spawn(30)
+ M.Weaken(2)
+ if(dose >= 10 || M.toxloss >= 25) //Internal skeletal tubes are rupturing, allowing the chemical to breach them.
+ M.adjustToxLoss(removed * 4)
+ M.make_jittery(5)
+ if(dose >= 20 || M.toxloss >= 60) //Core disentigration, cellular mass begins treating itself as an enemy, while maintaining regeneration. Slime-cancer.
+ M.adjustBrainLoss(2 * removed)
+ M.nutrition = max(H.nutrition - 20, 0)
+ if(M.bruteloss >= 60 && M.toxloss >= 60 && M.brainloss >= 30) //Total Structural Failure. Limbs start splattering.
+ var/obj/item/organ/external/O = pick(H.organs)
+ if(prob(20) && !istype(O, /obj/item/organ/external/chest/unbreakable/slime) && !istype(O, /obj/item/organ/external/groin/unbreakable/slime))
+ to_chat(M, "You feel your [O] begin to dissolve, before it sloughs from your body.")
+ O.droplimb() //Splat.
+ return
+
//Based roughly on Levofloxacin's rather severe side-effects
if(prob(20))
M.Confuse(5)
@@ -545,7 +701,6 @@
//One of the levofloxacin side effects is 'spontaneous tendon rupture', which I'll immitate here. 1:1000 chance, so, pretty darn rare.
if(ishuman(M) && rand(1,1000) == 1)
- var/mob/living/carbon/human/H = M
var/obj/item/organ/external/eo = pick(H.organs) //Misleading variable name, 'organs' is only external organs
eo.fracture()
@@ -558,11 +713,20 @@
color = "#C8A5DC"
touch_met = 5
+/datum/reagent/sterilizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ if(alien == IS_SLIME)
+ M.adjustFireLoss(removed)
+ M.adjustToxLoss(2 * removed)
+ return
+
/datum/reagent/sterilizine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
M.germ_level -= min(removed*20, M.germ_level)
for(var/obj/item/I in M.contents)
I.was_bloodied = null
M.was_bloodied = null
+ if(alien == IS_SLIME)
+ M.adjustFireLoss(removed)
+ M.adjustToxLoss(2 * removed)
/datum/reagent/sterilizine/touch_obj(var/obj/O)
O.germ_level -= min(volume*20, O.germ_level)
@@ -606,6 +770,29 @@
/datum/reagent/rezadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
return
+ var/mob/living/carbon/human/H = M
+ if(alien == IS_SLIME && istype(H))
+ if(prob(50))
+ if(H.r_skin)
+ H.r_skin = round((H.r_skin + 50)/2)
+ if(H.r_hair)
+ H.r_hair = round((H.r_hair + 50)/2)
+ if(H.r_facial)
+ H.r_facial = round((H.r_facial + 50)/2)
+ if(prob(50))
+ if(H.g_skin)
+ H.g_skin = round((H.g_skin + 50)/2)
+ if(H.g_hair)
+ H.g_hair = round((H.g_hair + 50)/2)
+ if(H.g_facial)
+ H.g_facial = round((H.g_facial + 50)/2)
+ if(prob(50))
+ if(H.b_skin)
+ H.b_skin = round((H.b_skin + 50)/2)
+ if(H.b_hair)
+ H.b_hair = round((H.b_hair + 50)/2)
+ if(H.b_facial)
+ H.b_facial = round((H.b_facial + 50)/2)
M.adjustCloneLoss(-20 * removed)
M.adjustOxyLoss(-2 * removed)
M.heal_organ_damage(20 * removed, 20 * removed)
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
index 6c83b0e26d..53ce37b3ef 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
@@ -482,3 +482,11 @@
/datum/reagent/luminol/touch_mob(var/mob/living/L)
L.reveal_blood()
+
+/datum/reagent/nutriment/biomass
+ name = "Biomass"
+ id = "biomass"
+ description = "A slurry of compounds that contains the basic requirements for life."
+ taste_description = "salty meat"
+ reagent_state = LIQUID
+ color = "#DF9FBF"
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
index c377ea98c3..e3c087b5fa 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
@@ -16,7 +16,10 @@
if(issmall(M)) removed *= 2 // Small bodymass, more effect from lower volume.
if(alien == IS_SLIME)
removed *= 0.25 // Results in half the standard tox as normal. Prometheans are 'Small' for flaps.
- M.nutrition += strength * removed
+ if(dose >= 10)
+ M.nutrition += strength * removed //Body has to deal with the massive influx of toxins, rather than try using them to repair.
+ else
+ M.heal_organ_damage((10/strength) * removed, (10/strength) * removed) //Doses of toxins below 10 units, and 10 strength, are capable of providing useful compounds for repair.
M.adjustToxLoss(strength * removed)
/datum/reagent/toxin/plasticide
@@ -73,6 +76,15 @@
spawn (0) target_tile.hotspot_expose(700, 400)
remove_self(volume)
+/datum/reagent/toxin/hydrophoron/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ if(alien == IS_SLIME)
+ M.adjust_fire_stacks(removed * 10)
+ if(prob(10))
+ to_chat(M, "You feel something boiling within you!")
+ spawn(rand(30, 60))
+ M.IgniteMob()
+
/datum/reagent/toxin/spidertoxin
name = "Spidertoxin"
id = "spidertoxin"
@@ -107,6 +119,8 @@
if(alien == IS_VOX)
M.adjustOxyLoss(-100 * removed) //5 oxyloss healed per tick.
return //You're wasting plasma (a semi-limited chemical) to save someone, so it might as well be somewhat strong.
+ if(alien == IS_SLIME)
+ M.adjust_fire_stacks(removed * 3) //Not quite 'converting' it. It's like mixing fuel into a jelly. You get explosive, or at least combustible, jelly.
..()
/datum/reagent/toxin/phoron/touch_turf(var/turf/simulated/T, var/amount)
@@ -177,6 +191,11 @@
strength = 0
overdose = REAGENTS_OVERDOSE
+/datum/reagent/toxin/potassium_chloride/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ if(alien == IS_SLIME)
+ M.adjustFireLoss(removed * 2)
+
/datum/reagent/toxin/potassium_chloride/overdose(var/mob/living/carbon/M, var/alien)
..()
if(ishuman(M))
@@ -206,6 +225,8 @@
H.losebreath = max(10, M.losebreath-10)
H.adjustOxyLoss(2)
H.Weaken(10)
+ if(alien == IS_SLIME)
+ M.adjustFireLoss(removed * 3)
/datum/reagent/toxin/zombiepowder
name = "Zombie Powder"
@@ -353,6 +374,13 @@
/datum/reagent/lexorin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
return
+ if(alien == IS_SLIME)
+ M.apply_effect(5, AGONY, 0)
+ M.adjustToxLoss(3 * removed)
+ if(prob(10))
+ to_chat(M, "Your cellular mass hardens for a moment.")
+ M.Stun(6)
+ return
if(alien == IS_SKRELL)
M.take_organ_damage(2.4 * removed, 0)
if(M.losebreath < 10)
@@ -384,9 +412,34 @@
if(M.isSynthetic())
return
- var/mob/living/carbon/human/H = M
- if(istype(H) && (H.species.flags & NO_SCAN))
- return
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(alien == IS_SLIME && prob(25))
+ var/color_shift = rand(-100, 100)
+ spawn(1)
+ if(prob(33))
+ if(H.r_skin)
+ H.r_skin = max(0, min(255, H.r_skin + color_shift))
+ if(H.r_hair)
+ H.r_hair = max(0, min(255, H.r_hair + color_shift))
+ if(H.r_facial)
+ H.r_facial = max(0, min(255, H.r_facial + color_shift))
+ if(prob(33))
+ if(H.g_skin)
+ H.g_skin = max(0, min(255, H.g_skin + color_shift))
+ if(H.g_hair)
+ H.g_hair = max(0, min(255, H.g_hair + color_shift))
+ if(H.g_facial)
+ H.g_facial = max(0, min(255, H.g_facial + color_shift))
+ if(prob(33))
+ if(H.b_skin)
+ H.b_skin = max(0, min(255, H.b_skin + color_shift))
+ if(H.b_hair)
+ H.b_hair = max(0, min(255, H.b_hair + color_shift))
+ if(H.b_facial)
+ H.b_facial = max(0, min(255, H.b_facial + color_shift))
+ if(H.species.flags & NO_SCAN)
+ return
//The original coder comment here wanted it to be "Approx. one mutation per 10 injected/20 ingested/30 touching units"
//The issue was, it was removed (.2) multiplied by .1, which resulted in a .02% chance per tick to have a mutation occur. Or more accurately, 5000 injected for a single mutation.
@@ -439,6 +492,7 @@
reagent_state = LIQUID
color = "#009CA8"
metabolism = REM * 0.5
+ ingest_met = REM * 1.5
overdose = REAGENTS_OVERDOSE
/datum/reagent/soporific/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -485,6 +539,7 @@
reagent_state = SOLID
color = "#000067"
metabolism = REM * 0.5
+ ingest_met = REM * 1.5
overdose = REAGENTS_OVERDOSE * 0.5
overdose_mod = 5 //For that good, lethal feeling
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 6e79670459..5d46650c3f 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -501,6 +501,7 @@
id = "ammonia"
result = "ammonia"
required_reagents = list("hydrogen" = 3, "nitrogen" = 1)
+ inhibitors = list("phoron" = 1) // Messes with lexorin
result_amount = 3
/datum/chemical_reaction/diethylamine
@@ -2239,4 +2240,12 @@
id = "qerr_quem"
result = "qerr_quem"
required_reagents = list("nicotine" = 1, "carbon" = 1, "sugar" = 2)
- result_amount = 4
\ No newline at end of file
+ result_amount = 4
+
+// Biomass, for cloning and bioprinters
+/datum/chemical_reaction/biomass
+ name = "Biomass"
+ id = "biomass"
+ result = "biomass"
+ required_reagents = list("protein" = 1, "sugar" = 1, "phoron" = 1)
+ result_amount = 1 // Roughly 20u per phoron sheet
\ No newline at end of file
diff --git a/code/modules/reagents/dispenser/dispenser2.dm b/code/modules/reagents/dispenser/dispenser2.dm
index 5ba448c14d..726c66af42 100644
--- a/code/modules/reagents/dispenser/dispenser2.dm
+++ b/code/modules/reagents/dispenser/dispenser2.dm
@@ -26,32 +26,32 @@
/obj/machinery/chemical_dispenser/examine(mob/user)
..()
- user << "It has [cartridges.len] cartridges installed, and has space for [DISPENSER_MAX_CARTRIDGES - cartridges.len] more."
+ to_chat(user, "It has [cartridges.len] cartridges installed, and has space for [DISPENSER_MAX_CARTRIDGES - cartridges.len] more.")
/obj/machinery/chemical_dispenser/proc/add_cartridge(obj/item/weapon/reagent_containers/chem_disp_cartridge/C, mob/user)
if(!istype(C))
if(user)
- user << "\The [C] will not fit in \the [src]!"
+ to_chat(user, "\The [C] will not fit in \the [src]!")
return
if(cartridges.len >= DISPENSER_MAX_CARTRIDGES)
if(user)
- user << "\The [src] does not have any slots open for \the [C] to fit into!"
+ to_chat(user, "\The [src] does not have any slots open for \the [C] to fit into!")
return
if(!C.label)
if(user)
- user << "\The [C] does not have a label!"
+ to_chat(user, "\The [C] does not have a label!")
return
if(cartridges[C.label])
if(user)
- user << "\The [src] already contains a cartridge with that label!"
+ to_chat(user, "\The [src] already contains a cartridge with that label!")
return
if(user)
user.drop_from_inventory(C)
- user << "You add \the [C] to \the [src]."
+ to_chat(user, "You add \the [C] to \the [src].")
C.loc = src
cartridges[C.label] = C
@@ -64,9 +64,9 @@
nanomanager.update_uis(src)
/obj/machinery/chemical_dispenser/attackby(obj/item/weapon/W, mob/user)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
playsound(src, W.usesound, 50, 1)
- user << "You begin to [anchored ? "un" : ""]fasten \the [src]."
+ to_chat(user, "You begin to [anchored ? "un" : ""]fasten \the [src].")
if (do_after(user, 20 * W.toolspeed))
user.visible_message(
"\The [user] [anchored ? "un" : ""]fastens \the [src].",
@@ -74,39 +74,39 @@
"You hear a ratchet.")
anchored = !anchored
else
- user << "You decide not to [anchored ? "un" : ""]fasten \the [src]."
+ to_chat(user, "You decide not to [anchored ? "un" : ""]fasten \the [src].")
else if(istype(W, /obj/item/weapon/reagent_containers/chem_disp_cartridge))
add_cartridge(W, user)
- else if(istype(W, /obj/item/weapon/screwdriver))
+ else if(W.is_screwdriver())
var/label = input(user, "Which cartridge would you like to remove?", "Chemical Dispenser") as null|anything in cartridges
if(!label) return
var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = remove_cartridge(label)
if(C)
- user << "You remove \the [C] from \the [src]."
+ to_chat(user, "You remove \the [C] from \the [src].")
C.loc = loc
playsound(src, W.usesound, 50, 1)
else if(istype(W, /obj/item/weapon/reagent_containers/glass) || istype(W, /obj/item/weapon/reagent_containers/food))
if(container)
- user << "There is already \a [container] on \the [src]!"
+ to_chat(user, "There is already \a [container] on \the [src]!")
return
var/obj/item/weapon/reagent_containers/RC = W
if(!accept_drinking && istype(RC,/obj/item/weapon/reagent_containers/food))
- user << "This machine only accepts beakers!"
+ to_chat(user, "This machine only accepts beakers!")
return
if(!RC.is_open_container())
- user << "You don't see how \the [src] could dispense reagents into \the [RC]."
+ to_chat(user, "You don't see how \the [src] could dispense reagents into \the [RC].")
return
container = RC
user.drop_from_inventory(RC)
RC.loc = src
- user << "You set \the [RC] on \the [src]."
+ to_chat(user, "You set \the [RC] on \the [src].")
nanomanager.update_uis(src) // update all UIs attached to src
else
diff --git a/code/modules/reagents/dispenser/supply.dm b/code/modules/reagents/dispenser/supply.dm
index e183da7f79..e6488d9d7e 100644
--- a/code/modules/reagents/dispenser/supply.dm
+++ b/code/modules/reagents/dispenser/supply.dm
@@ -1,4 +1,4 @@
-/datum/supply_packs/chemistry_dispenser
+/datum/supply_pack/chemistry_dispenser
name = "Reagent dispenser"
contains = list(
/obj/machinery/chemical_dispenser{anchored = 0}
@@ -8,7 +8,7 @@
containername = "reagent dispenser crate"
group = "Reagents"
-/datum/supply_packs/beer_dispenser
+/datum/supply_pack/beer_dispenser
name = "Booze dispenser"
contains = list(
/obj/machinery/chemical_dispenser/bar_alc{anchored = 0}
@@ -18,7 +18,7 @@
containername = "booze dispenser crate"
group = "Reagents"
-/datum/supply_packs/soda_dispenser
+/datum/supply_pack/soda_dispenser
name = "Soda dispenser"
contains = list(
/obj/machinery/chemical_dispenser/bar_soft{anchored = 0}
@@ -28,7 +28,7 @@
containername = "soda dispenser crate"
group = "Reagents"
-/datum/supply_packs/reagents
+/datum/supply_pack/reagents
name = "Chemistry dispenser refill"
contains = list(
/obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrogen,
@@ -60,7 +60,7 @@
access = list(access_chemistry)
group = "Reagents"
-/datum/supply_packs/alcohol_reagents
+/datum/supply_pack/alcohol_reagents
name = "Bar alcoholic dispenser refill"
contains = list(
/obj/item/weapon/reagent_containers/chem_disp_cartridge/beer,
@@ -83,7 +83,7 @@
access = list(access_bar)
group = "Reagents"
-/datum/supply_packs/softdrink_reagents
+/datum/supply_pack/softdrink_reagents
name = "Bar soft drink dispenser refill"
contains = list(
/obj/item/weapon/reagent_containers/chem_disp_cartridge/water,
@@ -110,7 +110,7 @@
containername = "soft drinks crate"
group = "Reagents"
-/datum/supply_packs/coffee_reagents
+/datum/supply_pack/coffee_reagents
name = "Coffee machine dispenser refill"
contains = list(
/obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee,
@@ -127,7 +127,7 @@
containername = "coffee drinks crate"
group = "Reagents"
-/datum/supply_packs/dispenser_cartridges
+/datum/supply_pack/dispenser_cartridges
name = "Empty dispenser cartridges"
contains = list(
/obj/item/weapon/reagent_containers/chem_disp_cartridge,
@@ -147,7 +147,7 @@
group = "Reagents"
#define SEC_PACK(_tname, _type, _name, _cname, _cost, _access)\
- datum/supply_packs/dispenser_cartridges{\
+ datum/supply_pack/dispenser_cartridges{\
_tname {\
name = _name ;\
containername = _cname ;\
@@ -159,7 +159,7 @@
}\
}
#define PACK(_tname, _type, _name, _cname, _cost)\
- datum/supply_packs/dispenser_cartridges{\
+ datum/supply_pack/dispenser_cartridges{\
_tname {\
name = _name ;\
containername = _cname ;\
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 316311c794..5aefbc96d3 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -252,7 +252,7 @@
flags = OPENCONTAINER
unacidable = 0
-/obj/item/weapon/reagent_containers/glass/bucket/attackby(var/obj/D, mob/user as mob)
+/obj/item/weapon/reagent_containers/glass/bucket/attackby(var/obj/item/D, mob/user as mob)
if(isprox(D))
user << "You add [D] to [src]."
qdel(D)
@@ -260,7 +260,7 @@
user.drop_from_inventory(src)
qdel(src)
return
- else if(istype(D, /obj/item/weapon/wirecutters))
+ else if(D.is_wirecutter())
to_chat(user, "You cut a big hole in \the [src] with \the [D]. It's kinda useless as a bucket now.")
user.put_in_hands(new /obj/item/clothing/head/helmet/bucket)
user.drop_from_inventory(src)
diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm
index 26e88caec0..159ac6acf3 100644
--- a/code/modules/reagents/reagent_containers/glass/bottle.dm
+++ b/code/modules/reagents/reagent_containers/glass/bottle.dm
@@ -55,7 +55,6 @@
var/image/lid = image(icon, src, "lid_bottle")
overlays += lid
-
/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline
name = "inaprovaline bottle"
desc = "A small bottle. Contains inaprovaline - used to stabilize patients."
@@ -63,7 +62,6 @@
icon_state = "bottle-4"
prefill = list("inaprovaline" = 60)
-
/obj/item/weapon/reagent_containers/glass/bottle/toxin
name = "toxin bottle"
desc = "A small bottle of toxins. Do not drink, it is poisonous."
@@ -71,7 +69,6 @@
icon_state = "bottle-3"
prefill = list("toxin" = 60)
-
/obj/item/weapon/reagent_containers/glass/bottle/cyanide
name = "cyanide bottle"
desc = "A small bottle of cyanide. Bitter almonds?"
@@ -79,7 +76,6 @@
icon_state = "bottle-3"
prefill = list("cyanide" = 30) //volume changed to match chloral
-
/obj/item/weapon/reagent_containers/glass/bottle/stoxin
name = "soporific bottle"
desc = "A small bottle of soporific. Just the fumes make you sleepy."
@@ -87,15 +83,13 @@
icon_state = "bottle-3"
prefill = list("stoxin" = 60)
-
/obj/item/weapon/reagent_containers/glass/bottle/chloralhydrate
- name = "Chloral Hydrate Bottle"
+ name = "chloral hydrate bottle"
desc = "A small bottle of Choral Hydrate. Mickey's Favorite!"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle-3"
prefill = list("chloralhydrate" = 30) //Intentionally low since it is so strong. Still enough to knock someone out.
-
/obj/item/weapon/reagent_containers/glass/bottle/antitoxin
name = "dylovene bottle"
desc = "A small bottle of dylovene. Counters poisons, and repairs damage. A wonder drug."
@@ -103,7 +97,6 @@
icon_state = "bottle-4"
prefill = list("anti_toxin" = 60)
-
/obj/item/weapon/reagent_containers/glass/bottle/mutagen
name = "unstable mutagen bottle"
desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact."
@@ -111,7 +104,6 @@
icon_state = "bottle-1"
prefill = list("mutagen" = 60)
-
/obj/item/weapon/reagent_containers/glass/bottle/ammonia
name = "ammonia bottle"
desc = "A small bottle."
@@ -119,7 +111,6 @@
icon_state = "bottle-1"
prefill = list("ammonia" = 60)
-
/obj/item/weapon/reagent_containers/glass/bottle/eznutrient
name = "\improper EZ NUtrient bottle"
desc = "A small bottle."
@@ -127,7 +118,6 @@
icon_state = "bottle-4"
prefill = list("eznutrient" = 60)
-
/obj/item/weapon/reagent_containers/glass/bottle/left4zed
name = "\improper Left-4-Zed bottle"
desc = "A small bottle."
@@ -135,7 +125,6 @@
icon_state = "bottle-4"
prefill = list("left4zed" = 60)
-
/obj/item/weapon/reagent_containers/glass/bottle/robustharvest
name = "\improper Robust Harvest"
desc = "A small bottle."
@@ -143,7 +132,6 @@
icon_state = "bottle-4"
prefill = list("robustharvest" = 60)
-
/obj/item/weapon/reagent_containers/glass/bottle/diethylamine
name = "diethylamine bottle"
desc = "A small bottle."
@@ -152,32 +140,36 @@
prefill = list("diethylamine" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/pacid
- name = "Polytrinic Acid Bottle"
+ name = "polytrinic acid bottle"
desc = "A small bottle. Contains a small amount of Polytrinic Acid"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle-4"
prefill = list("pacid" = 60)
-
/obj/item/weapon/reagent_containers/glass/bottle/adminordrazine
- name = "Adminordrazine Bottle"
+ name = "adminordrazine bottle"
desc = "A small bottle. Contains the liquid essence of the gods."
icon = 'icons/obj/drinks.dmi'
icon_state = "holyflask"
prefill = list("adminordrazine" = 60)
-
/obj/item/weapon/reagent_containers/glass/bottle/capsaicin
- name = "Capsaicin Bottle"
+ name = "capsaicin bottle"
desc = "A small bottle. Contains hot sauce."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle-4"
prefill = list("capsaicin" = 60)
-
/obj/item/weapon/reagent_containers/glass/bottle/frostoil
- name = "Frost Oil Bottle"
+ name = "frost oil bottle"
desc = "A small bottle. Contains cold sauce."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle-4"
prefill = list("frostoil" = 60)
+
+/obj/item/weapon/reagent_containers/glass/bottle/biomass
+ name = "biomass bottle"
+ desc = "A bottle of raw biomass! Gross!"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle-3"
+ prefill = list("biomass" = 60)
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index e38d07dcd2..724cee9a6f 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -49,12 +49,14 @@
if(H.a_intent != I_HELP)
to_chat(user, "[H] is resisting your attempt to inject them with \the [src].")
to_chat(H, " [user] is trying to inject you with \the [src]!")
- if(!do_after(user, 30))
+ if(!do_after(user, 30, H))
return
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN)
to_chat(user, "You inject [M] with \the [src].")
to_chat(M, "You feel a tiny prick!")
+
+ playsound(src, 'sound/effects/hypospray.ogg',25)
if(M.reagents)
var/contained = reagentlist()
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 5ec7aae23a..d40fc51610 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -5,6 +5,7 @@
desc = "..."
icon = 'icons/obj/objects.dmi'
icon_state = "watertank"
+ layer = TABLE_LAYER
density = 1
anchored = 0
pressure_resistance = 2*ONE_ATMOSPHERE
@@ -26,12 +27,12 @@
/obj/structure/reagent_dispensers/examine(mob/user)
if(!..(user, 2))
return
- user << "It contains:"
+ to_chat(user, "It contains:")
if(reagents && reagents.reagent_list.len)
for(var/datum/reagent/R in reagents.reagent_list)
- user << "[R.volume] units of [R.name]"
+ to_chat(user, "[R.volume] units of [R.name]")
else
- user << "Nothing."
+ to_chat(user, "Nothing.")
/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this
set name = "Set transfer amount"
@@ -102,9 +103,9 @@
if(!..(user, 2))
return
if (modded)
- user << "Fuel faucet is wrenched open, leaking the fuel!"
+ to_chat(user, "Fuel faucet is wrenched open, leaking the fuel!")
if(rig)
- user << "There is some kind of device rigged to the tank."
+ to_chat(user, "There is some kind of device rigged to the tank.")
/obj/structure/reagent_dispensers/fueltank/attack_hand()
if (rig)
@@ -117,7 +118,7 @@
/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W as obj, mob/user as mob)
src.add_fingerprint(user)
- if (istype(W,/obj/item/weapon/wrench))
+ if (W.is_wrench())
user.visible_message("[user] wrenches [src]'s faucet [modded ? "closed" : "open"].", \
"You wrench [src]'s faucet [modded ? "closed" : "open"]")
modded = modded ? 0 : 1
@@ -128,7 +129,7 @@
leak_fuel(amount_per_transfer_from_this)
if (istype(W,/obj/item/device/assembly_holder))
if (rig)
- user << "There is another device in the way."
+ to_chat(user, "There is another device in the way.")
return ..()
user.visible_message("[user] begins rigging [W] to \the [src].", "You begin rigging [W] to \the [src]")
if(do_after(user, 20))
@@ -235,15 +236,15 @@
/obj/structure/reagent_dispensers/water_cooler/examine(mob/user)
..()
if(cupholder)
- user << "There are [cups] cups in the cup dispenser."
+ to_chat(user, "There are [cups] cups in the cup dispenser.")
/obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I, /obj/item/weapon/wrench))
+ if(I.is_wrench())
src.add_fingerprint(user)
if(bottle)
playsound(loc, I.usesound, 50, 1)
if(do_after(user, 20) && bottle)
- user << "You unfasten the jug."
+ to_chat(user, "You unfasten the jug.")
var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = new /obj/item/weapon/reagent_containers/glass/cooler_bottle( src.loc )
for(var/datum/reagent/R in reagents.reagent_list)
var/total_reagent = reagents.get_reagent_amount(R.id)
@@ -258,15 +259,15 @@
user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
if(do_after(user, 20 * I.toolspeed, src))
if(!src) return
- user << "You [anchored? "un" : ""]secured \the [src]!"
+ to_chat(user, "You [anchored? "un" : ""]secured \the [src]!")
anchored = !anchored
playsound(loc, I.usesound, 50, 1)
return
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
if(cupholder)
playsound(loc, I.usesound, 50, 1)
- user << "You take the cup dispenser off."
+ to_chat(user, "You take the cup dispenser off.")
new /obj/item/stack/material/plastic( src.loc )
if(cups)
for(var/i = 0 to cups)
@@ -277,9 +278,9 @@
return
if(!bottle && !cupholder)
playsound(loc, I.usesound, 50, 1)
- user << "You start taking the water-cooler apart."
+ to_chat(user, "You start taking the water-cooler apart.")
if(do_after(user, 20 * I.toolspeed) && !bottle && !cupholder)
- user << "You take the water-cooler apart."
+ to_chat(user, "You take the water-cooler apart.")
new /obj/item/stack/material/plastic( src.loc, 4 )
qdel(src)
return
@@ -289,19 +290,19 @@
if(!bottle)
if(anchored)
var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = I
- user << "You start to screw the bottle onto the water-cooler."
+ to_chat(user, "You start to screw the bottle onto the water-cooler.")
if(do_after(user, 20) && !bottle && anchored)
bottle = 1
update_icon()
- user << "You screw the bottle onto the water-cooler!"
+ to_chat(user, "You screw the bottle onto the water-cooler!")
for(var/datum/reagent/R in G.reagents.reagent_list)
var/total_reagent = G.reagents.get_reagent_amount(R.id)
reagents.add_reagent(R.id, total_reagent)
qdel(G)
else
- user << "You need to wrench down the cooler first."
+ to_chat(user, "You need to wrench down the cooler first.")
else
- user << "There is already a bottle there!"
+ to_chat(user, "There is already a bottle there!")
return 1
if(istype(I, /obj/item/stack/material/plastic))
@@ -309,17 +310,17 @@
if(anchored)
var/obj/item/stack/material/plastic/P = I
src.add_fingerprint(user)
- user << "You start to attach a cup dispenser onto the water-cooler."
+ to_chat(user, "You start to attach a cup dispenser onto the water-cooler.")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 20) && !cupholder && anchored)
if (P.use(1))
- user << "You attach a cup dispenser onto the water-cooler."
+ to_chat(user, "You attach a cup dispenser onto the water-cooler.")
cupholder = 1
update_icon()
else
- user << "You need to wrench down the cooler first."
+ to_chat(user, "You need to wrench down the cooler first.")
else
- user << "There is already a cup dispenser there!"
+ to_chat(user, "There is already a cup dispenser there!")
return
/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/user)
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index dd431e2de9..d70e6e563d 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -100,10 +100,10 @@
if(panel_open)
var/input = sanitize(input(usr, "What id would you like to give this conveyor?", "Multitool-Conveyor interface", id))
if(!input)
- usr << "No input found please hang up and try your call again."
+ to_chat(user, "No input found. Please hang up and try your call again.")
return
id = input
- for(var/obj/machinery/conveyor_switch/C in world)
+ for(var/obj/machinery/conveyor_switch/C in machines)
if(C.id == id)
C.conveyors |= src
return
@@ -190,7 +190,7 @@
/obj/machinery/conveyor_switch/LateInitialize()
conveyors = list()
- for(var/obj/machinery/conveyor/C in world)
+ for(var/obj/machinery/conveyor/C in machines)
if(C.id == id)
conveyors += C
@@ -220,7 +220,7 @@
// attack with hand, switch position
/obj/machinery/conveyor_switch/attack_hand(mob/user)
if(!allowed(user))
- user << "Access denied."
+ to_chat(user, "Access denied.")
return
if(position == 0)
@@ -238,7 +238,7 @@
update()
// find any switches with same id as this one, and set their positions to match us
- for(var/obj/machinery/conveyor_switch/S in world)
+ for(var/obj/machinery/conveyor_switch/S in machines)
if(S.id == src.id)
S.position = position
S.update()
@@ -251,12 +251,12 @@
if(panel_open)
var/obj/item/weapon/weldingtool/WT = I
if(!WT.remove_fuel(0, user))
- user << "The welding tool must be on to complete this task."
+ to_chat(user, "The welding tool must be on to complete this task.")
return
playsound(src, WT.usesound, 50, 1)
if(do_after(user, 20 * WT.toolspeed))
if(!src || !WT.isOn()) return
- user << "You deconstruct the frame."
+ to_chat(user, "You deconstruct the frame.")
new /obj/item/stack/material/steel( src.loc, 2 )
qdel(src)
return
@@ -265,11 +265,11 @@
if(panel_open)
var/input = sanitize(input(usr, "What id would you like to give this conveyor switch?", "Multitool-Conveyor interface", id))
if(!input)
- usr << "No input found please hang up and try your call again."
+ to_chat(user, "No input found. Please hang up and try your call again.")
return
id = input
conveyors = list() // Clear list so they aren't double added.
- for(var/obj/machinery/conveyor/C in world)
+ for(var/obj/machinery/conveyor/C in machines)
if(C.id == id)
conveyors += C
return
@@ -289,7 +289,7 @@
update()
// find any switches with same id as this one, and set their positions to match us
- for(var/obj/machinery/conveyor_switch/S in world)
+ for(var/obj/machinery/conveyor_switch/S in machines)
if(S.id == src.id)
S.position = position
S.update()
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index 597033a6e6..8034b776b4 100644
--- a/code/modules/recycling/disposal-construction.dm
+++ b/code/modules/recycling/disposal-construction.dm
@@ -112,7 +112,7 @@
return
if(anchored)
- usr << "You must unfasten the pipe before rotating it."
+ to_chat(usr, "You must unfasten the pipe before rotating it.")
return
set_dir(turn(dir, -90))
@@ -126,7 +126,7 @@
return
if(anchored)
- usr << "You must unfasten the pipe before flipping it."
+ to_chat(usr, "You must unfasten the pipe before flipping it.")
return
set_dir(turn(dir, 180))
@@ -223,12 +223,12 @@
var/turf/T = src.loc
if(!T.is_plating())
- user << "You can only attach the [nicetype] if the floor plating is removed."
+ to_chat(user, "You can only attach the [nicetype] if the floor plating is removed.")
return
var/obj/structure/disposalpipe/CP = locate() in T
- if(istype(I, /obj/item/weapon/wrench))
+ if(I.is_wrench())
if(anchored)
anchored = 0
if(ispipe)
@@ -236,15 +236,15 @@
density = 0
else
density = 1
- user << "You detach the [nicetype] from the underfloor."
+ to_chat(user, "You detach the [nicetype] from the underfloor.")
else
if(ptype>=6 && ptype <= 8) // Disposal or outlet
if(CP) // There's something there
if(!istype(CP,/obj/structure/disposalpipe/trunk))
- user << "The [nicetype] requires a trunk underneath it in order to work."
+ to_chat(user, "The [nicetype] requires a trunk underneath it in order to work.")
return
else // Nothing under, fuck.
- user << "The [nicetype] requires a trunk underneath it in order to work."
+ to_chat(user, "The [nicetype] requires a trunk underneath it in order to work.")
return
else
if(CP)
@@ -253,7 +253,7 @@
if(istype(CP, /obj/structure/disposalpipe/broken))
pdir = CP.dir
if(pdir & dpdir)
- user << "There is already a [nicetype] at that location."
+ to_chat(user, "There is already a [nicetype] at that location.")
return
anchored = 1
@@ -262,7 +262,7 @@
density = 0
else
density = 1 // We don't want disposal bins or outlets to go density 0
- user << "You attach the [nicetype] to the underfloor."
+ to_chat(user, "You attach the [nicetype] to the underfloor.")
playsound(loc, I.usesound, 100, 1)
update()
@@ -271,10 +271,10 @@
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
playsound(src, W.usesound, 100, 1)
- user << "Welding the [nicetype] in place."
+ to_chat(user, "Welding the [nicetype] in place.")
if(do_after(user, 20 * W.toolspeed))
if(!src || !W.isOn()) return
- user << "The [nicetype] has been welded in place!"
+ to_chat(user, "The [nicetype] has been welded in place!")
update() // TODO: Make this neat
if(ispipe) // Pipe
@@ -316,10 +316,10 @@
qdel(src)
return
else
- user << "You need more welding fuel to complete this task."
+ to_chat(user, "You need more welding fuel to complete this task.")
return
else
- user << "You need to attach it to the plating first!"
+ to_chat(user, "You need to attach it to the plating first!")
return
/obj/structure/disposalconstruct/hides_under_flooring()
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 07c8429bfb..10157157fa 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -55,32 +55,32 @@
src.add_fingerprint(user)
if(mode<=0) // It's off
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
if(contents.len > 0)
- user << "Eject the items first!"
+ to_chat(user, "Eject the items first!")
return
if(mode==0) // It's off but still not unscrewed
mode=-1 // Set it to doubleoff l0l
playsound(src, I.usesound, 50, 1)
- user << "You remove the screws around the power connection."
+ to_chat(user, "You remove the screws around the power connection.")
return
else if(mode==-1)
mode=0
playsound(src, I.usesound, 50, 1)
- user << "You attach the screws around the power connection."
+ to_chat(user, "You attach the screws around the power connection.")
return
- else if(istype(I,/obj/item/weapon/weldingtool) && mode==-1)
+ else if(istype(I, /obj/item/weapon/weldingtool) && mode==-1)
if(contents.len > 0)
- user << "Eject the items first!"
+ to_chat(user, "Eject the items first!")
return
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
playsound(src, W.usesound, 100, 1)
- user << "You start slicing the floorweld off the disposal unit."
+ to_chat(user, "You start slicing the floorweld off the disposal unit.")
if(do_after(user,20 * W.toolspeed))
if(!src || !W.isOn()) return
- user << "You sliced the floorweld off the disposal unit."
+ to_chat(user, "You sliced the floorweld off the disposal unit.")
var/obj/structure/disposalconstruct/C = new (src.loc)
src.transfer_fingerprints_to(C)
C.ptype = 6 // 6 = disposal unit
@@ -90,16 +90,16 @@
qdel(src)
return
else
- user << "You need more welding fuel to complete this task."
+ to_chat(user, "You need more welding fuel to complete this task.")
return
if(istype(I, /obj/item/weapon/melee/energy/blade))
- user << "You can't place that item inside the disposal unit."
+ to_chat(user, "You can't place that item inside the disposal unit.")
return
if(istype(I, /obj/item/weapon/storage/bag/trash))
var/obj/item/weapon/storage/bag/trash/T = I
- user << "You empty the bag."
+ to_chat(user, "You empty the bag.")
for(var/obj/item/O in T.contents)
T.remove_from_storage(O,src)
T.update_icon()
@@ -130,7 +130,7 @@
for (var/mob/C in viewers(src))
C.show_message("[GM.name] has been placed in the [src] by [user].", 3)
qdel(G)
-
+
add_attack_logs(user,GM,"Disposals dunked")
return
@@ -143,7 +143,7 @@
if(I)
I.forceMove(src)
- user << "You place \the [I] into the [src]."
+ to_chat(user, "You place \the [I] into the [src].")
for(var/mob/M in viewers(src))
if(M == user)
continue
@@ -179,10 +179,10 @@
if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) // if drop self, then climbed in
// must be awake, not stunned or whatever
msg = "[user.name] climbs into the [src]."
- user << "You climb into the [src]."
+ to_chat(user, "You climb into the [src].")
else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis)
msg = "[user.name] stuffs [target.name] into the [src]!"
- user << "You stuff [target.name] into the [src]!"
+ to_chat(user, "You stuff [target.name] into the [src]!")
add_attack_logs(user,target,"Disposals dunked")
else
@@ -230,7 +230,7 @@
return
if(user && user.loc == src)
- usr << "You cannot reach the controls from inside."
+ to_chat(user, "You cannot reach the controls from inside.")
return
// Clumsy folks can only flush it.
@@ -279,11 +279,11 @@
/obj/machinery/disposal/Topic(href, href_list)
if(usr.loc == src)
- usr << "You cannot reach the controls from inside."
+ to_chat(usr, "You cannot reach the controls from inside.")
return
if(mode==-1 && !href_list["eject"]) // only allow ejecting if mode is -1
- usr << "The disposal units power is disabled."
+ to_chat(usr, "The disposal units power is disabled.")
return
if(..())
return
@@ -636,7 +636,7 @@
if (src.loc)
for (var/mob/M in hearers(src.loc.loc))
- M << "CLONG, clong!"
+ to_chat(M, "CLONG, clong!")
playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0)
@@ -885,15 +885,15 @@
// check if anything changed over 2 seconds
var/turf/uloc = user.loc
var/atom/wloc = W.loc
- user << "Slicing the disposal pipe."
+ to_chat(user, "Slicing the disposal pipe.")
sleep(30)
if(!W.isOn()) return
if(user.loc == uloc && wloc == W.loc)
welded()
else
- user << "You must stay still while welding the pipe."
+ to_chat(user, "You must stay still while welding the pipe.")
else
- user << "You need more welding fuel to cut the pipe."
+ to_chat(user, "You need more welding fuel to cut the pipe.")
return
// called when pipe is cut with welder
@@ -1169,7 +1169,7 @@
if(O.currTag)// Tag set
sort_tag = O.currTag
playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1)
- user << "Changed tag to '[sort_tag]'."
+ to_chat(user, "Changed tag to '[sort_tag]'.")
updatename()
updatedesc()
@@ -1237,7 +1237,7 @@
if(O.currTag)// Tag set
sortType = O.currTag
playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1)
- user << "Changed filter to '[sortType]'."
+ to_chat(user, "Changed filter to '[sortType]'.")
updatename()
updatedesc()
@@ -1365,15 +1365,15 @@
// check if anything changed over 2 seconds
var/turf/uloc = user.loc
var/atom/wloc = W.loc
- user << "Slicing the disposal pipe."
+ to_chat(user, "Slicing the disposal pipe.")
sleep(30)
if(!W.isOn()) return
if(user.loc == uloc && wloc == W.loc)
welded()
else
- user << "You must stay still while welding the pipe."
+ to_chat(user, "You must stay still while welding the pipe.")
else
- user << "You need more welding fuel to cut the pipe."
+ to_chat(user, "You need more welding fuel to cut the pipe.")
return
// would transfer to next pipe segment, but we are in a trunk
@@ -1475,25 +1475,25 @@
if(!I || !user)
return
src.add_fingerprint(user)
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
if(mode==0)
mode=1
- user << "You remove the screws around the power connection."
+ to_chat(user, "You remove the screws around the power connection.")
playsound(src, I.usesound, 50, 1)
return
else if(mode==1)
mode=0
- user << "You attach the screws around the power connection."
+ to_chat(user, "You attach the screws around the power connection.")
playsound(src, I.usesound, 50, 1)
return
- else if(istype(I,/obj/item/weapon/weldingtool) && mode==1)
+ else if(istype(I, /obj/item/weapon/weldingtool) && mode==1)
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
playsound(src, W.usesound, 100, 1)
- user << "You start slicing the floorweld off the disposal outlet."
+ to_chat(user, "You start slicing the floorweld off the disposal outlet.")
if(do_after(user,20 * W.toolspeed))
if(!src || !W.isOn()) return
- user << "You sliced the floorweld off the disposal outlet."
+ to_chat(user, "You sliced the floorweld off the disposal outlet.")
var/obj/structure/disposalconstruct/C = new (src.loc)
src.transfer_fingerprints_to(C)
C.ptype = 7 // 7 = outlet
@@ -1503,7 +1503,7 @@
qdel(src)
return
else
- user << "You need more welding fuel to complete this task."
+ to_chat(user, "You need more welding fuel to complete this task.")
return
// called when movable is expelled from a disposal pipe or outlet
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index b2cbcb9b3e..64f5b923ab 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -26,7 +26,7 @@
var/obj/item/device/destTagger/O = W
if(O.currTag)
if(src.sortTag != O.currTag)
- user << "You have labeled the destination as [O.currTag]."
+ to_chat(user, "You have labeled the destination as [O.currTag].")
if(!src.sortTag)
src.sortTag = O.currTag
update_icon()
@@ -34,16 +34,16 @@
src.sortTag = O.currTag
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1)
else
- user << "The package is already labeled for [O.currTag]."
+ to_chat(user, "The package is already labeled for [O.currTag].")
else
- user << "You need to set a destination first!"
+ to_chat(user, "You need to set a destination first!")
else if(istype(W, /obj/item/weapon/pen))
switch(alert("What would you like to alter?",,"Title","Description", "Cancel"))
if("Title")
var/str = sanitizeSafe(input(usr,"Label text?","Set label",""), MAX_NAME_LEN)
if(!str || !length(str))
- usr << " Invalid text."
+ to_chat(user, " Invalid text.")
return
user.visible_message("\The [user] titles \the [src] with \a [W], marking down: \"[str]\"",\
"You title \the [src]: \"[str]\"",\
@@ -57,7 +57,7 @@
if("Description")
var/str = sanitize(input(usr,"Label text?","Set label",""))
if(!str || !length(str))
- usr << "Invalid text."
+ to_chat(user, "Invalid text.")
return
if(!examtext && !nameset)
examtext = str
@@ -101,9 +101,9 @@
examine(mob/user)
if(..(user, 4))
if(sortTag)
- user << "It is labeled \"[sortTag]\""
+ to_chat(user, "It is labeled \"[sortTag]\"")
if(examtext)
- user << "It has a note attached which reads, \"[examtext]\""
+ to_chat(user, "It has a note attached which reads, \"[examtext]\"")
return
/obj/item/smallDelivery
@@ -133,7 +133,7 @@
var/obj/item/device/destTagger/O = W
if(O.currTag)
if(src.sortTag != O.currTag)
- user << "You have labeled the destination as [O.currTag]."
+ to_chat(user, "You have labeled the destination as [O.currTag].")
if(!src.sortTag)
src.sortTag = O.currTag
update_icon()
@@ -141,16 +141,16 @@
src.sortTag = O.currTag
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1)
else
- user << "The package is already labeled for [O.currTag]."
+ to_chat(user, "The package is already labeled for [O.currTag].")
else
- user << "You need to set a destination first!"
+ to_chat(user, "You need to set a destination first!")
else if(istype(W, /obj/item/weapon/pen))
switch(alert("What would you like to alter?",,"Title","Description", "Cancel"))
if("Title")
var/str = sanitizeSafe(input(usr,"Label text?","Set label",""), MAX_NAME_LEN)
if(!str || !length(str))
- usr << " Invalid text."
+ to_chat(user, " Invalid text.")
return
user.visible_message("\The [user] titles \the [src] with \a [W], marking down: \"[str]\"",\
"You title \the [src]: \"[str]\"",\
@@ -165,7 +165,7 @@
if("Description")
var/str = sanitize(input(usr,"Label text?","Set label",""))
if(!str || !length(str))
- usr << "Invalid text."
+ to_chat(user, "Invalid text.")
return
if(!examtext && !nameset)
examtext = str
@@ -205,9 +205,9 @@
examine(mob/user)
if(..(user, 4))
if(sortTag)
- user << "It is labeled \"[sortTag]\""
+ to_chat(user, "It is labeled \"[sortTag]\"")
if(examtext)
- user << "It has a note attached which reads, \"[examtext]\""
+ to_chat(user, "It has a note attached which reads, \"[examtext]\"")
return
/obj/item/weapon/packageWrap
@@ -278,7 +278,7 @@
"You wrap \the [target], leaving [amount] units of paper on \the [src].",\
"You hear someone taping paper around a large object.")
else if(src.amount < 3)
- user << "You need more paper."
+ to_chat(user, "You need more paper.")
else if (istype (target, /obj/structure/closet))
var/obj/structure/closet/O = target
if (src.amount > 3 && !O.opened)
@@ -291,9 +291,9 @@
"You wrap \the [target], leaving [amount] units of paper on \the [src].",\
"You hear someone taping paper around a large object.")
else if(src.amount < 3)
- user << "You need more paper."
+ to_chat(user, "You need more paper.")
else
- user << "The object you are trying to wrap is unsuitable for the sorting machinery!"
+ to_chat(user, "The object you are trying to wrap is unsuitable for the sorting machinery!")
if (src.amount <= 0)
new /obj/item/weapon/c_tube( src.loc )
qdel(src)
@@ -302,7 +302,7 @@
examine(mob/user)
if(..(user, 0))
- user << "There are [amount] units of package wrap left!"
+ to_chat(user, "There are [amount] units of package wrap left!")
return
@@ -421,25 +421,25 @@
if(!I || !user)
return
- if(istype(I, /obj/item/weapon/screwdriver))
+ if(I.is_screwdriver())
if(c_mode==0)
c_mode=1
playsound(src.loc, I.usesound, 50, 1)
- user << "You remove the screws around the power connection."
+ to_chat(user, "You remove the screws around the power connection.")
return
else if(c_mode==1)
c_mode=0
playsound(src.loc, I.usesound, 50, 1)
- user << "You attach the screws around the power connection."
+ to_chat(user, "You attach the screws around the power connection.")
return
- else if(istype(I,/obj/item/weapon/weldingtool) && c_mode==1)
+ else if(istype(I, /obj/item/weapon/weldingtool) && c_mode==1)
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
playsound(src.loc, W.usesound, 50, 1)
- user << "You start slicing the floorweld off the delivery chute."
+ to_chat(user, "You start slicing the floorweld off the delivery chute.")
if(do_after(user,20 * W.toolspeed))
if(!src || !W.isOn()) return
- user << "You sliced the floorweld off the delivery chute."
+ to_chat(user, "You sliced the floorweld off the delivery chute.")
var/obj/structure/disposalconstruct/C = new (src.loc)
C.ptype = 8 // 8 = Delivery chute
C.update()
@@ -448,7 +448,7 @@
qdel(src)
return
else
- user << "You need more welding fuel to complete this task."
+ to_chat(user, "You need more welding fuel to complete this task.")
return
/obj/machinery/disposal/deliveryChute/Destroy()
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index dae6575577..850df76645 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -99,7 +99,7 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
/obj/machinery/r_n_d/circuit_imprinter/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(busy)
- user << "\The [src] is busy. Please wait for completion of previous operation."
+ to_chat(user, "\The [src] is busy. Please wait for completion of previous operation.")
return 1
if(default_deconstruction_screwdriver(user, O))
if(linked_console)
@@ -113,26 +113,26 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
if(istype(O, /obj/item/weapon/gripper/no_use/loader))
return 0 //Sheet loaders weren't finishing attack(), this prevents the message "You can't stuff that gripper into this" without preventing the rest of the attack sequence from finishing
if(panel_open)
- user << "You can't load \the [src] while it's opened."
+ to_chat(user, "You can't load \the [src] while it's opened.")
return 1
if(!linked_console)
- user << "\The [src] must be linked to an R&D console first."
+ to_chat(user, "\The [src] must be linked to an R&D console first.")
return 1
if(O.is_open_container())
return 0
if(!istype(O, /obj/item/stack/material)) //Previously checked for specific material sheets, for some reason? Made the check on 133 redundant.
- user << "You cannot insert this item into \the [src]."
+ to_chat(user, "You cannot insert this item into \the [src].")
return 1
if(stat)
return 1
if(TotalMaterials() + SHEET_MATERIAL_AMOUNT > max_material_storage)
- user << "\The [src]'s material bin is full. Please remove material before adding more."
+ to_chat(user, "\The [src]'s material bin is full. Please remove material before adding more.")
return 1
var/obj/item/stack/material/S = O
if(!(S.material.name in materials))
- user << "The [src] doesn't accept [S.material]!"
+ to_chat(user, "The [src] doesn't accept [S.material]!")
return
busy = 1
@@ -152,9 +152,9 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
materials[S.material.name] += amnt
S.use(1)
count++
- user << "You insert [count] [sname] into the fabricator."
+ to_chat(user, "You insert [count] [sname] into the fabricator.")
else
- user << "The fabricator cannot hold more [sname]."
+ to_chat(user, "The fabricator cannot hold more [sname].")
busy = 0
updateUsrDialog()
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index f90fd1c313..106c655ae2 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -79,1810 +79,4 @@ other types of metals and chemistry for reagents).
req_tech = list(TECH_DATA = 1)
materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10)
build_path = /obj/item/weapon/disk/tech_disk
- sort_string = "GAAAB"
-
-/datum/design/item/stock_part
- build_type = PROTOLATHE
-
-/datum/design/item/stock_part/AssembleDesignName()
- ..()
- name = "Component design ([item_name])"
-
-/datum/design/item/stock_part/AssembleDesignDesc()
- if(!desc)
- desc = "A stock part used in the construction of various devices."
-
-/datum/design/item/stock_part/basic_capacitor
- id = "basic_capacitor"
- req_tech = list(TECH_POWER = 1)
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
- build_path = /obj/item/weapon/stock_parts/capacitor
- sort_string = "CAAAA"
-
-/datum/design/item/stock_part/adv_capacitor
- id = "adv_capacitor"
- req_tech = list(TECH_POWER = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
- build_path = /obj/item/weapon/stock_parts/capacitor/adv
- sort_string = "CAAAB"
-
-/datum/design/item/stock_part/super_capacitor
- id = "super_capacitor"
- req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4)
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, "gold" = 20)
- build_path = /obj/item/weapon/stock_parts/capacitor/super
- sort_string = "CAAAC"
-
-/datum/design/item/stock_part/micro_mani
- id = "micro_mani"
- req_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1)
- materials = list(DEFAULT_WALL_MATERIAL = 30)
- build_path = /obj/item/weapon/stock_parts/manipulator
- sort_string = "CAABA"
-
-/datum/design/item/stock_part/nano_mani
- id = "nano_mani"
- req_tech = list(TECH_MATERIAL = 3, TECH_DATA = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 30)
- build_path = /obj/item/weapon/stock_parts/manipulator/nano
- sort_string = "CAABB"
-
-/datum/design/item/stock_part/pico_mani
- id = "pico_mani"
- req_tech = list(TECH_MATERIAL = 5, TECH_DATA = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 30)
- build_path = /obj/item/weapon/stock_parts/manipulator/pico
- sort_string = "CAABC"
-
-/datum/design/item/stock_part/basic_matter_bin
- id = "basic_matter_bin"
- req_tech = list(TECH_MATERIAL = 1)
- materials = list(DEFAULT_WALL_MATERIAL = 80)
- build_path = /obj/item/weapon/stock_parts/matter_bin
- sort_string = "CAACA"
-
-/datum/design/item/stock_part/adv_matter_bin
- id = "adv_matter_bin"
- req_tech = list(TECH_MATERIAL = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 80)
- build_path = /obj/item/weapon/stock_parts/matter_bin/adv
- sort_string = "CAACB"
-
-/datum/design/item/stock_part/super_matter_bin
- id = "super_matter_bin"
- req_tech = list(TECH_MATERIAL = 5)
- materials = list(DEFAULT_WALL_MATERIAL = 80)
- build_path = /obj/item/weapon/stock_parts/matter_bin/super
- sort_string = "CAACC"
-
-/datum/design/item/stock_part/basic_micro_laser
- id = "basic_micro_laser"
- req_tech = list(TECH_MAGNET = 1)
- materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20)
- build_path = /obj/item/weapon/stock_parts/micro_laser
- sort_string = "CAADA"
-
-/datum/design/item/stock_part/high_micro_laser
- id = "high_micro_laser"
- req_tech = list(TECH_MAGNET = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20)
- build_path = /obj/item/weapon/stock_parts/micro_laser/high
- sort_string = "CAADB"
-
-/datum/design/item/stock_part/ultra_micro_laser
- id = "ultra_micro_laser"
- req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5)
- materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20, "uranium" = 10)
- build_path = /obj/item/weapon/stock_parts/micro_laser/ultra
- sort_string = "CAADC"
-
-/datum/design/item/stock_part/basic_sensor
- id = "basic_sensor"
- req_tech = list(TECH_MAGNET = 1)
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20)
- build_path = /obj/item/weapon/stock_parts/scanning_module
- sort_string = "CAAEA"
-
-/datum/design/item/stock_part/adv_sensor
- id = "adv_sensor"
- req_tech = list(TECH_MAGNET = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20)
- build_path = /obj/item/weapon/stock_parts/scanning_module/adv
- sort_string = "CAAEB"
-
-/datum/design/item/stock_part/phasic_sensor
- id = "phasic_sensor"
- req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20, "silver" = 10)
- build_path = /obj/item/weapon/stock_parts/scanning_module/phasic
- sort_string = "CAAEC"
-
-/datum/design/item/stock_part/RPED
- name = "Rapid Part Exchange Device"
- desc = "Special mechanical module made to store, sort, and apply standard machine parts."
- id = "rped"
- req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 5000)
- build_path = /obj/item/weapon/storage/part_replacer
- sort_string = "CBAAA"
-
-/datum/design/item/powercell
- build_type = PROTOLATHE | MECHFAB
-
-/datum/design/item/powercell/AssembleDesignName()
- name = "Power Cell Model ([item_name])"
-
-/datum/design/item/powercell/AssembleDesignDesc()
- if(build_path)
- var/obj/item/weapon/cell/C = build_path
- desc = "Allows the construction of power cells that can hold [initial(C.maxcharge)] units of energy."
-
-/datum/design/item/powercell/Fabricate()
- var/obj/item/weapon/cell/C = ..()
- C.charge = 0 //shouldn't produce power out of thin air.
- return C
-
-/datum/design/item/powercell/basic
- name = "basic"
- build_type = PROTOLATHE | MECHFAB
- id = "basic_cell"
- req_tech = list(TECH_POWER = 1)
- materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
- build_path = /obj/item/weapon/cell
- category = "Misc"
- sort_string = "DAAAA"
-
-/datum/design/item/powercell/high
- name = "high-capacity"
- build_type = PROTOLATHE | MECHFAB
- id = "high_cell"
- req_tech = list(TECH_POWER = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60)
- build_path = /obj/item/weapon/cell/high
- category = "Misc"
- sort_string = "DAAAB"
-
-/datum/design/item/powercell/super
- name = "super-capacity"
- id = "super_cell"
- req_tech = list(TECH_POWER = 3, TECH_MATERIAL = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70)
- build_path = /obj/item/weapon/cell/super
- category = "Misc"
- sort_string = "DAAAC"
-
-/datum/design/item/powercell/hyper
- name = "hyper-capacity"
- id = "hyper_cell"
- req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4)
- materials = list(DEFAULT_WALL_MATERIAL = 400, "gold" = 150, "silver" = 150, "glass" = 70)
- build_path = /obj/item/weapon/cell/hyper
- category = "Misc"
- sort_string = "DAAAD"
-
-/datum/design/item/powercell/device
- name = "device"
- build_type = PROTOLATHE
- id = "device"
- materials = list(DEFAULT_WALL_MATERIAL = 350, "glass" = 25)
- build_path = /obj/item/weapon/cell/device
- category = "Misc"
- sort_string = "DAABA"
-
-/datum/design/item/powercell/weapon
- name = "weapon"
- build_type = PROTOLATHE
- id = "weapon"
- materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
- build_path = /obj/item/weapon/cell/device/weapon
- category = "Misc"
- sort_string = "DAABB"
-
-/datum/design/item/hud
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
-
-/datum/design/item/hud/AssembleDesignName()
- ..()
- name = "HUD glasses prototype ([item_name])"
-
-/datum/design/item/hud/AssembleDesignDesc()
- desc = "Allows for the construction of \a [item_name] HUD glasses."
-
-/datum/design/item/hud/health
- name = "health scanner"
- id = "health_hud"
- req_tech = list(TECH_BIO = 2, TECH_MAGNET = 3)
- build_path = /obj/item/clothing/glasses/hud/health
- sort_string = "GAAAA"
-
-/datum/design/item/hud/security
- name = "security records"
- id = "security_hud"
- req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2)
- build_path = /obj/item/clothing/glasses/hud/security
- sort_string = "GAAAB"
-
-/datum/design/item/hud/mesons
- name = "Optical meson scanners design"
- desc = "Using the meson-scanning technology those glasses allow you to see through walls, floor or anything else."
- id = "mesons"
- req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
- build_path = /obj/item/clothing/glasses/meson
- sort_string = "GAAAC"
-
-/datum/design/item/weapon/mining/AssembleDesignName()
- ..()
- name = "Mining equipment design ([item_name])"
-
-/datum/design/item/weapon/mining/jackhammer
- id = "jackhammer"
- req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "silver" = 500)
- build_path = /obj/item/weapon/pickaxe/jackhammer
- sort_string = "KAAAA"
-
-/datum/design/item/weapon/mining/drill
- id = "drill"
- req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1000) //expensive, but no need for miners.
- build_path = /obj/item/weapon/pickaxe/drill
- sort_string = "KAAAB"
-
-/datum/design/item/weapon/mining/plasmacutter
- id = "plasmacutter"
- req_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 500, "gold" = 500, "phoron" = 500)
- build_path = /obj/item/weapon/pickaxe/plasmacutter
- sort_string = "KAAAC"
-
-/datum/design/item/weapon/mining/pick_diamond
- id = "pick_diamond"
- req_tech = list(TECH_MATERIAL = 6)
- materials = list("diamond" = 3000)
- build_path = /obj/item/weapon/pickaxe/diamond
- sort_string = "KAAAD"
-
-/datum/design/item/weapon/mining/drill_diamond
- id = "drill_diamond"
- req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 4)
- materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 1000, "diamond" = 2000)
- build_path = /obj/item/weapon/pickaxe/diamonddrill
- sort_string = "KAAAE"
-
-/datum/design/item/device/depth_scanner
- desc = "Used to check spatial depth and density of rock outcroppings."
- id = "depth_scanner"
- req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 1000)
- build_path = /obj/item/device/depth_scanner
- sort_string = "KAAAF"
-
-///////////////////////////////////
-/////////Shield Generators/////////
-///////////////////////////////////
-/datum/design/circuit/shield
- req_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3)
- materials = list("$glass" = 2000, "sacid" = 20, "$phoron" = 10000, "$diamond" = 5000, "$gold" = 10000)
-
-/datum/design/item/medical
- materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 20)
-
-/datum/design/item/medical/AssembleDesignName()
- ..()
- name = "Biotech device prototype ([item_name])"
-
-/datum/design/item/medical/robot_scanner
- desc = "A hand-held scanner able to diagnose robotic injuries."
- id = "robot_scanner"
- req_tech = list(TECH_MAGNET = 3, TECH_BIO = 2, TECH_ENGINEERING = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200)
- build_path = /obj/item/device/robotanalyzer
- sort_string = "MACFA"
-
-/datum/design/item/medical/mass_spectrometer
- desc = "A device for analyzing chemicals in blood."
- id = "mass_spectrometer"
- req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2)
- build_path = /obj/item/device/mass_spectrometer
- sort_string = "MACAA"
-
-/datum/design/item/medical/adv_mass_spectrometer
- desc = "A device for analyzing chemicals in blood and their quantities."
- id = "adv_mass_spectrometer"
- req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4)
- build_path = /obj/item/device/mass_spectrometer/adv
- sort_string = "MACAB"
-
-/datum/design/item/medical/reagent_scanner
- desc = "A device for identifying chemicals."
- id = "reagent_scanner"
- req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2)
- build_path = /obj/item/device/reagent_scanner
- sort_string = "MACBA"
-
-/datum/design/item/medical/adv_reagent_scanner
- desc = "A device for identifying chemicals and their proportions."
- id = "adv_reagent_scanner"
- req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4)
- build_path = /obj/item/device/reagent_scanner/adv
- sort_string = "MACBB"
-
-/datum/design/item/beaker/AssembleDesignName()
- name = "Beaker prototype ([item_name])"
-
-/datum/design/item/beaker/noreact
- name = "cryostasis"
- desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units."
- id = "splitbeaker"
- req_tech = list(TECH_MATERIAL = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 3000)
- build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact
- sort_string = "MADAA"
-
-/datum/design/item/beaker/bluespace
- name = TECH_BLUESPACE
- desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units."
- id = "bluespacebeaker"
- req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 6)
- materials = list(DEFAULT_WALL_MATERIAL = 3000, "phoron" = 3000, "diamond" = 500)
- build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace
- sort_string = "MADAB"
-
-/datum/design/item/medical/nanopaste
- desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery."
- id = "nanopaste"
- req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000)
- build_path = /obj/item/stack/nanopaste
- sort_string = "MBAAA"
-
-/datum/design/item/medical/scalpel_laser1
- name = "Basic Laser Scalpel"
- desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved."
- id = "scalpel_laser1"
- req_tech = list(TECH_BIO = 2, TECH_MATERIAL = 2, TECH_MAGNET = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500)
- build_path = /obj/item/weapon/surgical/scalpel/laser1
- sort_string = "MBBAA"
-
-/datum/design/item/medical/scalpel_laser2
- name = "Improved Laser Scalpel"
- desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced."
- id = "scalpel_laser2"
- req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 4, TECH_MAGNET = 4)
- materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500)
- build_path = /obj/item/weapon/surgical/scalpel/laser2
- sort_string = "MBBAB"
-
-/datum/design/item/medical/scalpel_laser3
- name = "Advanced Laser Scalpel"
- desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!"
- id = "scalpel_laser3"
- req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 5)
- materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2000, "gold" = 1500)
- build_path = /obj/item/weapon/surgical/scalpel/laser3
- sort_string = "MBBAC"
-
-/datum/design/item/medical/scalpel_manager
- name = "Incision Management System"
- desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps."
- id = "scalpel_manager"
- req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 7, TECH_MAGNET = 5, TECH_DATA = 4)
- materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 1500, "gold" = 1500, "diamond" = 750)
- build_path = /obj/item/weapon/surgical/scalpel/manager
- sort_string = "MBBAD"
-
-/datum/design/item/medical/bone_clamp
- name = "Bone Clamp"
- desc = "A miracle of modern science, this tool rapidly knits together bone, without the need for bone gel."
- id = "bone_clamp"
- req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 5, TECH_MAGNET = 4, TECH_DATA = 4)
- materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500)
- build_path = /obj/item/weapon/surgical/bone_clamp
- sort_string = "MBBAE"
-
-/datum/design/item/medical/advanced_roller
- name = "advanced roller bed"
- desc = "A more advanced version of the regular roller bed, with inbuilt surgical stabilisers and an improved folding system."
- id = "roller_bed"
- req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 3, TECH_MAGNET = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "phoron" = 2000)
- build_path = /obj/item/roller/adv
- sort_string = "MBBAF"
-
-/datum/design/item/medical/improved_analyzer
- name = "improved health analyzer"
- desc = "A prototype version of the regular health analyzer, able to distinguish the location of more serious injuries as well as accurately determine radiation levels."
- id = "improved_analyzer"
- req_tech = list(TECH_MAGNET = 5, TECH_BIO = 6)
- materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 1500)
- build_path = /obj/item/device/healthanalyzer/improved
- sort_string = "MBBAG"
-
-/datum/design/item/implant
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
-
-/datum/design/item/implant/AssembleDesignName()
- ..()
- name = "Implantable biocircuit design ([item_name])"
-
-/datum/design/item/implant/chemical
- name = "chemical"
- id = "implant_chem"
- req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3)
- build_path = /obj/item/weapon/implantcase/chem
- sort_string = "MFAAA"
-
-/datum/design/item/implant/freedom
- name = "freedom"
- id = "implant_free"
- req_tech = list(TECH_ILLEGAL = 2, TECH_BIO = 3)
- build_path = /obj/item/weapon/implantcase/freedom
- sort_string = "MFAAB"
-
-/datum/design/item/weapon/AssembleDesignName()
- ..()
- name = "Weapon prototype ([item_name])"
-
-/datum/design/item/weapon/AssembleDesignDesc()
- if(!desc)
- if(build_path)
- var/obj/item/I = build_path
- desc = initial(I.desc)
- ..()
-
-/datum/design/item/weapon/stunrevolver
- id = "stunrevolver"
- req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 4000)
- build_path = /obj/item/weapon/gun/energy/stunrevolver
- sort_string = "TAAAA"
-
-/datum/design/item/weapon/nuclear_gun
- id = "nuclear_gun"
- req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "uranium" = 500)
- build_path = /obj/item/weapon/gun/energy/gun/nuclear
- sort_string = "TAAAB"
-
-/datum/design/item/weapon/lasercannon
- desc = "The lasing medium of this prototype is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core."
- id = "lasercannon"
- req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1000, "diamond" = 2000)
- build_path = /obj/item/weapon/gun/energy/lasercannon
- sort_string = "TAAAC"
-
-/datum/design/item/weapon/phoronpistol
- id = "ppistol"
- req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4)
- materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "phoron" = 3000)
- build_path = /obj/item/weapon/gun/energy/toxgun
- sort_string = "TAAAD"
-
-/datum/design/item/weapon/decloner
- id = "decloner"
- req_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 7, TECH_BIO = 5, TECH_POWER = 6)
- materials = list("gold" = 5000,"uranium" = 10000)
- chemicals = list("mutagen" = 40)
- build_path = /obj/item/weapon/gun/energy/decloner
- sort_string = "TAAAE"
-
-/datum/design/item/weapon/smg
- id = "smg"
- req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 8000, "silver" = 2000, "diamond" = 1000)
- build_path = /obj/item/weapon/gun/projectile/automatic
- sort_string = "TAABA"
-
-/datum/design/item/weapon/ammo_9mm
- id = "ammo_9mm"
- req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 3750, "silver" = 100)
- build_path = /obj/item/ammo_magazine/box/c9mm
- sort_string = "TAACA"
-
-/datum/design/item/weapon/stunshell
- desc = "A stunning shell for a shotgun."
- id = "stunshell"
- req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 4000)
- build_path = /obj/item/ammo_casing/a12g/stunshell
- sort_string = "TAACB"
-
-/datum/design/item/weapon/chemsprayer
- desc = "An advanced chem spraying device."
- id = "chemsprayer"
- req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000)
- build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer
- sort_string = "TABAA"
-
-/datum/design/item/weapon/rapidsyringe
- id = "rapidsyringe"
- req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000)
- build_path = /obj/item/weapon/gun/launcher/syringe/rapid
- sort_string = "TABAB"
-
-/datum/design/item/weapon/temp_gun
- desc = "A gun that shoots high-powered glass-encased energy temperature bullets."
- id = "temp_gun"
- req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 500, "silver" = 3000)
- build_path = /obj/item/weapon/gun/energy/temperature
- sort_string = "TABAC"
-
-/datum/design/item/weapon/large_grenade
- id = "large_Grenade"
- req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 3000)
- build_path = /obj/item/weapon/grenade/chem_grenade/large
- sort_string = "TACAA"
-
-/datum/design/item/weapon/dartgun
- desc = "A gun that fires small hollow chemical-payload darts."
- id = "dartgun_r"
- req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_BIO = 4, TECH_MAGNET = 3, TECH_ILLEGAL = 1)
- materials = list(DEFAULT_WALL_MATERIAL = 5000, "gold" = 5000, "silver" = 2500, "glass" = 750)
- build_path = /obj/item/weapon/gun/projectile/dartgun/research
- sort_string = "TACAB"
-
-/datum/design/item/weapon/dartgunmag_small
- id = "dartgun_mag_s"
- req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1)
- materials = list(DEFAULT_WALL_MATERIAL = 300, "gold" = 100, "silver" = 100, "glass" = 300)
- build_path = /obj/item/ammo_magazine/chemdart/small
- sort_string = "TACAC"
-
-/datum/design/item/weapon/dartgun_ammo_small
- id = "dartgun_ammo_s"
- req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1)
- materials = list(DEFAULT_WALL_MATERIAL = 50, "gold" = 30, "silver" = 30, "glass" = 50)
- build_path = /obj/item/ammo_casing/chemdart/small
- sort_string = "TACAD"
-
-/datum/design/item/weapon/dartgunmag_med
- id = "dartgun_mag_m"
- req_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1)
- materials = list(DEFAULT_WALL_MATERIAL = 500, "gold" = 150, "silver" = 150, "diamond" = 200, "glass" = 400)
- build_path = /obj/item/ammo_magazine/chemdart
- sort_string = "TACAE"
-
-/datum/design/item/weapon/dartgun_ammo_med
- id = "dartgun_ammo_m"
- req_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1)
- materials = list(DEFAULT_WALL_MATERIAL = 80, "gold" = 40, "silver" = 40, "glass" = 60)
- build_path = /obj/item/ammo_casing/chemdart
- sort_string = "TACAF"
-
-/datum/design/item/weapon/fuelrod
- id = "fuelrod_gun"
- req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_PHORON = 4, TECH_ILLEGAL = 5, TECH_MAGNET = 5)
- materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "gold" = 500, "silver" = 500, "uranium" = 1000, "phoron" = 3000, "diamond" = 1000)
- build_path = /obj/item/weapon/gun/magnetic/fuelrod
- sort_string = "TACBA"
-
-/datum/design/item/weapon/flora_gun
- id = "flora_gun"
- req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "uranium" = 500)
- build_path = /obj/item/weapon/gun/energy/floragun
- sort_string = "TBAAA"
-
-/datum/design/item/weapon/slimebation
- id = "slimebation"
- req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2, TECH_POWER = 3, TECH_COMBAT = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 5000)
- build_path = /obj/item/weapon/melee/baton/slime
- sort_string = "TBAAB"
-
-/datum/design/item/weapon/slimetaser
- id = "slimetaser"
- req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 3, TECH_POWER = 4, TECH_COMBAT = 4)
- materials = list(DEFAULT_WALL_MATERIAL = 5000)
- build_path = /obj/item/weapon/gun/energy/taser/xeno
- sort_string = "TBAAC"
-
-/datum/design/item/stock_part/subspace_ansible
- id = "s-ansible"
- req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 80, "silver" = 20)
- build_path = /obj/item/weapon/stock_parts/subspace/ansible
- sort_string = "UAAAA"
-
-/datum/design/item/stock_part/hyperwave_filter
- id = "s-filter"
- req_tech = list(TECH_DATA = 3, TECH_MAGNET = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 40, "silver" = 10)
- build_path = /obj/item/weapon/stock_parts/subspace/sub_filter
- sort_string = "UAAAB"
-
-/datum/design/item/stock_part/subspace_amplifier
- id = "s-amplifier"
- req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 30, "uranium" = 15)
- build_path = /obj/item/weapon/stock_parts/subspace/amplifier
- sort_string = "UAAAC"
-
-/datum/design/item/stock_part/subspace_treatment
- id = "s-treatment"
- req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 10, "silver" = 20)
- build_path = /obj/item/weapon/stock_parts/subspace/treatment
- sort_string = "UAAAD"
-
-/datum/design/item/stock_part/subspace_analyzer
- id = "s-analyzer"
- req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 15)
- build_path = /obj/item/weapon/stock_parts/subspace/analyzer
- sort_string = "UAAAE"
-
-/datum/design/item/stock_part/subspace_crystal
- id = "s-crystal"
- req_tech = list(TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
- materials = list("glass" = 1000, "silver" = 20, "gold" = 20)
- build_path = /obj/item/weapon/stock_parts/subspace/crystal
- sort_string = "UAAAF"
-
-/datum/design/item/stock_part/subspace_transmitter
- id = "s-transmitter"
- req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5, TECH_BLUESPACE = 3)
- materials = list("glass" = 100, "silver" = 10, "uranium" = 15)
- build_path = /obj/item/weapon/stock_parts/subspace/transmitter
- sort_string = "UAAAG"
-
-/datum/design/item/device/ano_scanner
- name = "Alden-Saraspova counter"
- id = "ano_scanner"
- desc = "Aids in triangulation of exotic particles."
- req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000)
- build_path = /obj/item/device/ano_scanner
- sort_string = "UAAAH"
-
-/datum/design/item/light_replacer
- name = "Light replacer"
- desc = "A device to automatically replace lights. Refill with working lightbulbs."
- id = "light_replacer"
- req_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 4)
- materials = list(DEFAULT_WALL_MATERIAL = 1500, "silver" = 150, "glass" = 3000)
- build_path = /obj/item/device/lightreplacer
- sort_string = "VAAAH"
-
-/datum/design/item/paicard
- name = "'pAI', personal artificial intelligence device"
- id = "paicard"
- req_tech = list(TECH_DATA = 2)
- materials = list("glass" = 500, DEFAULT_WALL_MATERIAL = 500)
- build_path = /obj/item/device/paicard
- sort_string = "VABAI"
-
-/datum/design/item/communicator
- name = "Communicator"
- id = "communicator"
- req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500)
- build_path = /obj/item/device/communicator
- sort_string = "VABAJ"
-
-/datum/design/item/intellicard
- name = "'intelliCore', AI preservation and transportation system"
- desc = "Allows for the construction of an intelliCore."
- id = "intellicore"
- req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4)
- materials = list("glass" = 1000, "gold" = 200)
- build_path = /obj/item/device/aicard
- sort_string = "VACAA"
-
-/datum/design/item/dronebrain
- name = "Robotic intelligence circuit"
- id = "dronebrain"
- req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_DATA = 4)
- build_type = PROTOLATHE | PROSFAB
- materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500)
- build_path = /obj/item/device/mmi/digital/robot
- category = "Misc"
- sort_string = "VACAC"
-
-/datum/design/item/posibrain
- name = "Positronic brain"
- id = "posibrain"
- req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4)
- build_type = PROTOLATHE | PROSFAB
- materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100)
- build_path = /obj/item/device/mmi/digital/posibrain
- category = "Misc"
- sort_string = "VACAB"
-
-/datum/design/item/mmi
- name = "Man-machine interface"
- id = "mmi"
- req_tech = list(TECH_DATA = 2, TECH_BIO = 3)
- build_type = PROTOLATHE | PROSFAB
- materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500)
- build_path = /obj/item/device/mmi
- category = "Misc"
- sort_string = "VACBA"
-
-/datum/design/item/beacon
- name = "Bluespace tracking beacon design"
- id = "beacon"
- req_tech = list(TECH_BLUESPACE = 1)
- materials = list (DEFAULT_WALL_MATERIAL = 20, "glass" = 10)
- build_path = /obj/item/device/radio/beacon
- sort_string = "VADAA"
-
-/datum/design/item/gps
- name = "Triangulating device design"
- desc = "Triangulates approximate co-ordinates using a nearby satellite network."
- id = "gps"
- req_tech = list(TECH_MATERIAL = 2, TECH_DATA = 2, TECH_BLUESPACE = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 500)
- build_path = /obj/item/device/gps
- sort_string = "VADAB"
-
-/datum/design/item/beacon_locator
- name = "Beacon tracking pinpointer"
- desc = "Used to scan and locate signals on a particular frequency."
- id = "beacon_locator"
- req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 500)
- build_path = /obj/item/device/beacon_locator
- sort_string = "VADAC"
-
-/datum/design/item/bag_holding
- name = "'Bag of Holding', an infinite capacity bag prototype"
- desc = "Using localized pockets of bluespace this bag prototype offers incredible storage capacity with the contents weighting nothing. It's a shame the bag itself is pretty heavy."
- id = "bag_holding"
- req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6)
- materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250)
- build_path = /obj/item/weapon/storage/backpack/holding
- sort_string = "VAEAA"
-
-/datum/design/item/binaryencrypt
- name = "Binary encryption key"
- desc = "Allows for deciphering the binary channel on-the-fly."
- id = "binaryencrypt"
- req_tech = list(TECH_ILLEGAL = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 300, "glass" = 300)
- build_path = /obj/item/device/encryptionkey/binary
- sort_string = "VASAA"
-
-/datum/design/item/chameleon
- name = "Holographic equipment kit"
- desc = "A kit of dangerous, high-tech equipment with changeable looks."
- id = "chameleon"
- req_tech = list(TECH_ILLEGAL = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 500)
- build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon
- sort_string = "VASBA"
-
-/datum/design/item/experimental_welder
- name = "Experimental welding tool"
- desc = "A welding tool that generate fuel for itself."
- id = "expwelder"
- req_tech = list(TECH_ENGINEERING = 4, TECH_PHORON = 3, TECH_MATERIAL = 4)
- materials = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120, "phoron" = 100)
- build_path = /obj/item/weapon/weldingtool/experimental
- sort_string = "VASCA"
-
-/datum/design/item/hand_drill
- name = "Hand drill"
- desc = "A simple powered hand drill."
- id = "handdrill"
- req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100)
- build_path = /obj/item/weapon/screwdriver/power
- sort_string = "VASDA"
-
-/datum/design/item/jaws_life
- name = "Jaws of life"
- desc = "A set of jaws of life, compressed through the magic of science."
- id = "jawslife"
- req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100)
- build_path = /obj/item/weapon/crowbar/power
- sort_string = "VASEA"
-
-/datum/design/item/device/t_scanner_upg
- name = "Upgraded T-ray Scanner"
- desc = "An upgraded version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
- id = "upgradedtscanner"
- req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 4, TECH_MATERIAL = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 500, "phoron" = 150)
- build_path = /obj/item/device/t_scanner/upgraded
- sort_string = "VASSA"
-
-
-/datum/design/item/device/t_scanner_adv
- name = "Advanced T-ray Scanner"
- desc = "An advanced version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
- id = "advancedtscanner"
- req_tech = list(TECH_MAGNET = 6, TECH_ENGINEERING = 6, TECH_MATERIAL = 6)
- materials = list(DEFAULT_WALL_MATERIAL = 1250, "phoron" = 500, "silver" = 50)
- build_path = /obj/item/device/t_scanner/advanced
- sort_string = "VASSB"
-/*
-CIRCUITS BELOW
-*/
-
-/datum/design/circuit
- build_type = IMPRINTER
- req_tech = list(TECH_DATA = 2)
- materials = list("glass" = 2000)
- chemicals = list("sacid" = 20)
- time = 5
-
-/datum/design/circuit/AssembleDesignName()
- ..()
- if(build_path)
- var/obj/item/weapon/circuitboard/C = build_path
- if(initial(C.board_type) == "machine")
- name = "Machine circuit design ([item_name])"
- else if(initial(C.board_type) == "computer")
- name = "Computer circuit design ([item_name])"
- else
- name = "Circuit design ([item_name])"
-
-/datum/design/circuit/AssembleDesignDesc()
- if(!desc)
- desc = "Allows for the construction of \a [item_name] circuit board."
-
-/datum/design/circuit/arcademachine
- name = "battle arcade machine"
- id = "arcademachine"
- req_tech = list(TECH_DATA = 1)
- build_path = /obj/item/weapon/circuitboard/arcade/battle
- sort_string = "MAAAA"
-
-/datum/design/circuit/oriontrail
- name = "orion trail arcade machine"
- id = "oriontrail"
- req_tech = list(TECH_DATA = 1)
- build_path = /obj/item/weapon/circuitboard/arcade/orion_trail
- sort_string = "MAAAA"
-
-/datum/design/circuit/jukebox
- name = "jukebox"
- id = "jukebox"
- req_tech = list(TECH_MAGNET = 2, TECH_DATA = 1)
- build_path = /obj/item/weapon/circuitboard/jukebox
- sort_string = "MAAAB"
-
-/datum/design/circuit/seccamera
- name = "security camera monitor"
- id = "seccamera"
- build_path = /obj/item/weapon/circuitboard/security
- sort_string = "DAAAA"
-
-/datum/design/circuit/secdata
- name = "security records console"
- id = "sec_data"
- build_path = /obj/item/weapon/circuitboard/secure_data
- sort_string = "DABAA"
-
-/datum/design/circuit/prisonmanage
- name = "prisoner management console"
- id = "prisonmanage"
- build_path = /obj/item/weapon/circuitboard/prisoner
- sort_string = "DACAA"
-
-/datum/design/circuit/med_data
- name = "medical records console"
- id = "med_data"
- build_path = /obj/item/weapon/circuitboard/med_data
- sort_string = "FAAAA"
-
-/datum/design/circuit/operating
- name = "patient monitoring console"
- id = "operating"
- build_path = /obj/item/weapon/circuitboard/operating
- sort_string = "FACAA"
-
-/datum/design/circuit/scan_console
- name = "DNA machine"
- id = "scan_console"
- build_path = /obj/item/weapon/circuitboard/scan_consolenew
- sort_string = "FAGAA"
-
-/datum/design/circuit/clonecontrol
- name = "cloning control console"
- id = "clonecontrol"
- req_tech = list(TECH_DATA = 3, TECH_BIO = 3)
- build_path = /obj/item/weapon/circuitboard/cloning
- sort_string = "FAGAC"
-
-/datum/design/circuit/clonepod
- name = "clone pod"
- id = "clonepod"
- req_tech = list(TECH_DATA = 3, TECH_BIO = 3)
- build_path = /obj/item/weapon/circuitboard/clonepod
- sort_string = "FAGAE"
-
-/datum/design/circuit/clonescanner
- name = "cloning scanner"
- id = "clonescanner"
- req_tech = list(TECH_DATA = 3, TECH_BIO = 3)
- build_path = /obj/item/weapon/circuitboard/clonescanner
- sort_string = "FAGAG"
-
-/datum/design/circuit/crewconsole
- name = "crew monitoring console"
- id = "crewconsole"
- req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_BIO = 2)
- build_path = /obj/item/weapon/circuitboard/crew
- sort_string = "FAGAI"
-
-/datum/design/circuit/teleconsole
- name = "teleporter control console"
- id = "teleconsole"
- req_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 2)
- build_path = /obj/item/weapon/circuitboard/teleporter
- sort_string = "HAAAA"
-
-/datum/design/circuit/robocontrol
- name = "robotics control console"
- id = "robocontrol"
- req_tech = list(TECH_DATA = 4)
- build_path = /obj/item/weapon/circuitboard/robotics
- sort_string = "HAAAB"
-
-/datum/design/circuit/mechacontrol
- name = "exosuit control console"
- id = "mechacontrol"
- req_tech = list(TECH_DATA = 3)
- build_path = /obj/item/weapon/circuitboard/mecha_control
- sort_string = "HAAAC"
-
-/datum/design/circuit/rdconsole
- name = "R&D control console"
- id = "rdconsole"
- req_tech = list(TECH_DATA = 4)
- build_path = /obj/item/weapon/circuitboard/rdconsole
- sort_string = "HAAAE"
-
-/datum/design/circuit/aifixer
- name = "AI integrity restorer"
- id = "aifixer"
- req_tech = list(TECH_DATA = 3, TECH_BIO = 2)
- build_path = /obj/item/weapon/circuitboard/aifixer
- sort_string = "HAAAF"
-
-/datum/design/circuit/comm_monitor
- name = "telecommunications monitoring console"
- id = "comm_monitor"
- req_tech = list(TECH_DATA = 3)
- build_path = /obj/item/weapon/circuitboard/comm_monitor
- sort_string = "HAACA"
-
-/datum/design/circuit/comm_server
- name = "telecommunications server monitoring console"
- id = "comm_server"
- req_tech = list(TECH_DATA = 3)
- build_path = /obj/item/weapon/circuitboard/comm_server
- sort_string = "HAACB"
-
-/datum/design/circuit/message_monitor
- name = "messaging monitor console"
- id = "message_monitor"
- req_tech = list(TECH_DATA = 5)
- build_path = /obj/item/weapon/circuitboard/message_monitor
- sort_string = "HAACC"
-
-/datum/design/circuit/aiupload
- name = "AI upload console"
- id = "aiupload"
- req_tech = list(TECH_DATA = 4)
- build_path = /obj/item/weapon/circuitboard/aiupload
- sort_string = "HAABA"
-
-/datum/design/circuit/borgupload
- name = "cyborg upload console"
- id = "borgupload"
- req_tech = list(TECH_DATA = 4)
- build_path = /obj/item/weapon/circuitboard/borgupload
- sort_string = "HAABB"
-
-/datum/design/circuit/destructive_analyzer
- name = "destructive analyzer"
- id = "destructive_analyzer"
- req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2, TECH_ENGINEERING = 2)
- build_path = /obj/item/weapon/circuitboard/destructive_analyzer
- sort_string = "HABAA"
-
-/datum/design/circuit/protolathe
- name = "protolathe"
- id = "protolathe"
- req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
- build_path = /obj/item/weapon/circuitboard/protolathe
- sort_string = "HABAB"
-
-/datum/design/circuit/circuit_imprinter
- name = "circuit imprinter"
- id = "circuit_imprinter"
- req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
- build_path = /obj/item/weapon/circuitboard/circuit_imprinter
- sort_string = "HABAC"
-
-/datum/design/circuit/autolathe
- name = "autolathe board"
- id = "autolathe"
- req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
- build_path = /obj/item/weapon/circuitboard/autolathe
- sort_string = "HABAD"
-
-/datum/design/circuit/rdservercontrol
- name = "R&D server control console"
- id = "rdservercontrol"
- req_tech = list(TECH_DATA = 3)
- build_path = /obj/item/weapon/circuitboard/rdservercontrol
- sort_string = "HABBA"
-
-/datum/design/circuit/rdserver
- name = "R&D server"
- id = "rdserver"
- req_tech = list(TECH_DATA = 3)
- build_path = /obj/item/weapon/circuitboard/rdserver
- sort_string = "HABBB"
-
-/datum/design/circuit/mechfab
- name = "exosuit fabricator"
- id = "mechfab"
- req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
- build_path = /obj/item/weapon/circuitboard/mechfab
- sort_string = "HABAE"
-
-/datum/design/circuit/prosfab
- name = "prosthetics fabricator"
- id = "prosfab"
- req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
- build_path = /obj/item/weapon/circuitboard/prosthetics
- sort_string = "HABAF"
-
-/datum/design/circuit/mech_recharger
- name = "mech recharger"
- id = "mech_recharger"
- req_tech = list(TECH_DATA = 2, TECH_POWER = 2, TECH_ENGINEERING = 2)
- build_path = /obj/item/weapon/circuitboard/mech_recharger
- sort_string = "HACAA"
-
-/datum/design/circuit/recharge_station
- name = "cyborg recharge station"
- id = "recharge_station"
- req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2)
- build_path = /obj/item/weapon/circuitboard/recharge_station
- sort_string = "HACAC"
-
-/datum/design/circuit/atmosalerts
- name = "atmosphere alert console"
- id = "atmosalerts"
- build_path = /obj/item/weapon/circuitboard/atmos_alert
- sort_string = "JAAAA"
-
-/datum/design/circuit/air_management
- name = "atmosphere monitoring console"
- id = "air_management"
- build_path = /obj/item/weapon/circuitboard/air_management
- sort_string = "JAAAB"
-
-/datum/design/circuit/rcon_console
- name = "RCON remote control console"
- id = "rcon_console"
- req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_POWER = 5)
- build_path = /obj/item/weapon/circuitboard/rcon_console
- sort_string = "JAAAC"
-
-/datum/design/circuit/dronecontrol
- name = "drone control console"
- id = "dronecontrol"
- req_tech = list(TECH_DATA = 4)
- build_path = /obj/item/weapon/circuitboard/drone_control
- sort_string = "JAAAD"
-
-/datum/design/circuit/powermonitor
- name = "power monitoring console"
- id = "powermonitor"
- build_path = /obj/item/weapon/circuitboard/powermonitor
- sort_string = "JAAAE"
-
-/datum/design/circuit/solarcontrol
- name = "solar control console"
- id = "solarcontrol"
- build_path = /obj/item/weapon/circuitboard/solar_control
- sort_string = "JAAAF"
-
-/datum/design/circuit/pacman
- name = "PACMAN-type generator"
- id = "pacman"
- req_tech = list(TECH_DATA = 3, TECH_PHORON = 3, TECH_POWER = 3, TECH_ENGINEERING = 3)
- build_path = /obj/item/weapon/circuitboard/pacman
- sort_string = "JBAAA"
-
-/datum/design/circuit/superpacman
- name = "SUPERPACMAN-type generator"
- id = "superpacman"
- req_tech = list(TECH_DATA = 3, TECH_POWER = 4, TECH_ENGINEERING = 4)
- build_path = /obj/item/weapon/circuitboard/pacman/super
- sort_string = "JBAAB"
-
-/datum/design/circuit/mrspacman
- name = "MRSPACMAN-type generator"
- id = "mrspacman"
- req_tech = list(TECH_DATA = 3, TECH_POWER = 5, TECH_ENGINEERING = 5)
- build_path = /obj/item/weapon/circuitboard/pacman/mrs
- sort_string = "JBAAC"
-
-/datum/design/circuit/batteryrack
- name = "cell rack PSU"
- id = "batteryrack"
- req_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 2)
- build_path = /obj/item/weapon/circuitboard/batteryrack
- sort_string = "JBABA"
-
-/datum/design/circuit/smes_cell
- name = "'SMES' superconductive magnetic energy storage"
- desc = "Allows for the construction of circuit boards used to build a SMES."
- id = "smes_cell"
- req_tech = list(TECH_POWER = 7, TECH_ENGINEERING = 5)
- build_path = /obj/item/weapon/circuitboard/smes
- sort_string = "JBABB"
-
-/datum/design/circuit/grid_checker
- name = "power grid checker"
- desc = "Allows for the construction of circuit boards used to build a grid checker."
- id = "grid_checker"
- req_tech = list(TECH_POWER = 4, TECH_ENGINEERING = 3)
- build_path = /obj/item/weapon/circuitboard/grid_checker
- sort_string = "JBABC"
-
-/datum/design/circuit/breakerbox
- name = "breaker box"
- desc = "Allows for the construction of circuit boards used to build a breaker box."
- id = "breakerbox"
- req_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3)
- build_path = /obj/item/weapon/circuitboard/breakerbox
- sort_string = "JBABD"
-
-/datum/design/circuit/gas_heater
- name = "gas heating system"
- id = "gasheater"
- req_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 1)
- build_path = /obj/item/weapon/circuitboard/unary_atmos/heater
- sort_string = "JCAAA"
-
-/datum/design/circuit/gas_cooler
- name = "gas cooling system"
- id = "gascooler"
- req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2)
- build_path = /obj/item/weapon/circuitboard/unary_atmos/cooler
- sort_string = "JCAAB"
-
-/datum/design/circuit/secure_airlock
- name = "secure airlock electronics"
- desc = "Allows for the construction of a tamper-resistant airlock electronics."
- id = "securedoor"
- req_tech = list(TECH_DATA = 3)
- build_path = /obj/item/weapon/airlock_electronics/secure
- sort_string = "JDAAA"
-
-/datum/design/circuit/ordercomp
- name = "supply ordering console"
- id = "ordercomp"
- build_path = /obj/item/weapon/circuitboard/ordercomp
- sort_string = "KAAAA"
-
-/datum/design/circuit/supplycomp
- name = "supply control console"
- id = "supplycomp"
- req_tech = list(TECH_DATA = 3)
- build_path = /obj/item/weapon/circuitboard/supplycomp
- sort_string = "KAAAB"
-
-/datum/design/circuit/biogenerator
- name = "biogenerator"
- id = "biogenerator"
- req_tech = list(TECH_DATA = 2)
- build_path = /obj/item/weapon/circuitboard/biogenerator
- sort_string = "KBAAA"
-
-/datum/design/circuit/miningdrill
- name = "mining drill head"
- id = "mining drill head"
- req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
- build_path = /obj/item/weapon/circuitboard/miningdrill
- sort_string = "KCAAA"
-
-/datum/design/circuit/miningdrillbrace
- name = "mining drill brace"
- id = "mining drill brace"
- req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
- build_path = /obj/item/weapon/circuitboard/miningdrillbrace
- sort_string = "KCAAB"
-
-/datum/design/circuit/comconsole
- name = "communications console"
- id = "comconsole"
- build_path = /obj/item/weapon/circuitboard/communications
- sort_string = "LAAAA"
-
-/datum/design/circuit/idcardconsole
- name = "ID card modification console"
- id = "idcardconsole"
- build_path = /obj/item/weapon/circuitboard/card
- sort_string = "LAAAB"
-
-/datum/design/circuit/emp_data
- name = "employment records console"
- id = "emp_data"
- build_path = /obj/item/weapon/circuitboard/skills
- sort_string = "LAAAC"
-
-/datum/design/circuit/mecha
- req_tech = list(TECH_DATA = 3)
-
-/datum/design/circuit/mecha/AssembleDesignName()
- name = "Exosuit module circuit design ([name])"
-/datum/design/circuit/mecha/AssembleDesignDesc()
- desc = "Allows for the construction of \a [name] module."
-
-/datum/design/circuit/mecha/ripley_main
- name = "APLU 'Ripley' central control"
- id = "ripley_main"
- build_path = /obj/item/weapon/circuitboard/mecha/ripley/main
- sort_string = "NAAAA"
-
-/datum/design/circuit/mecha/ripley_peri
- name = "APLU 'Ripley' peripherals control"
- id = "ripley_peri"
- build_path = /obj/item/weapon/circuitboard/mecha/ripley/peripherals
- sort_string = "NAAAB"
-
-/datum/design/circuit/mecha/odysseus_main
- name = "'Odysseus' central control"
- id = "odysseus_main"
- req_tech = list(TECH_DATA = 3,TECH_BIO = 2)
- build_path = /obj/item/weapon/circuitboard/mecha/odysseus/main
- sort_string = "NAABA"
-
-/datum/design/circuit/mecha/odysseus_peri
- name = "'Odysseus' peripherals control"
- id = "odysseus_peri"
- req_tech = list(TECH_DATA = 3,TECH_BIO = 2)
- build_path = /obj/item/weapon/circuitboard/mecha/odysseus/peripherals
- sort_string = "NAABB"
-
-/datum/design/circuit/mecha/gygax_main
- name = "'Gygax' central control"
- id = "gygax_main"
- req_tech = list(TECH_DATA = 4)
- build_path = /obj/item/weapon/circuitboard/mecha/gygax/main
- sort_string = "NAACA"
-
-/datum/design/circuit/mecha/gygax_peri
- name = "'Gygax' peripherals control"
- id = "gygax_peri"
- req_tech = list(TECH_DATA = 4)
- build_path = /obj/item/weapon/circuitboard/mecha/gygax/peripherals
- sort_string = "NAACB"
-
-/datum/design/circuit/mecha/gygax_targ
- name = "'Gygax' weapon control and targeting"
- id = "gygax_targ"
- req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2)
- build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting
- sort_string = "NAACC"
-
-/datum/design/circuit/mecha/durand_main
- name = "'Durand' central control"
- id = "durand_main"
- req_tech = list(TECH_DATA = 4)
- build_path = /obj/item/weapon/circuitboard/mecha/durand/main
- sort_string = "NAADA"
-
-/datum/design/circuit/mecha/durand_peri
- name = "'Durand' peripherals control"
- id = "durand_peri"
- req_tech = list(TECH_DATA = 4)
- build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals
- sort_string = "NAADB"
-
-/datum/design/circuit/mecha/durand_targ
- name = "'Durand' weapon control and targeting"
- id = "durand_targ"
- req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2)
- build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting
- sort_string = "NAADC"
-
-/datum/design/circuit/tcom
- req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4)
-
-/datum/design/circuit/tcom/AssembleDesignName()
- name = "Telecommunications machinery circuit design ([name])"
-/datum/design/circuit/tcom/AssembleDesignDesc()
- desc = "Allows for the construction of a telecommunications [name] circuit board."
-
-/datum/design/circuit/tcom/server
- name = "server mainframe"
- id = "tcom-server"
- build_path = /obj/item/weapon/circuitboard/telecomms/server
- sort_string = "PAAAA"
-
-/datum/design/circuit/tcom/processor
- name = "processor unit"
- id = "tcom-processor"
- build_path = /obj/item/weapon/circuitboard/telecomms/processor
- sort_string = "PAAAB"
-
-/datum/design/circuit/tcom/bus
- name = "bus mainframe"
- id = "tcom-bus"
- build_path = /obj/item/weapon/circuitboard/telecomms/bus
- sort_string = "PAAAC"
-
-/datum/design/circuit/tcom/hub
- name = "hub mainframe"
- id = "tcom-hub"
- build_path = /obj/item/weapon/circuitboard/telecomms/hub
- sort_string = "PAAAD"
-
-/datum/design/circuit/tcom/relay
- name = "relay mainframe"
- id = "tcom-relay"
- req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 4, TECH_BLUESPACE = 3)
- build_path = /obj/item/weapon/circuitboard/telecomms/relay
- sort_string = "PAAAE"
-
-/datum/design/circuit/tcom/broadcaster
- name = "subspace broadcaster"
- id = "tcom-broadcaster"
- req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_BLUESPACE = 2)
- build_path = /obj/item/weapon/circuitboard/telecomms/broadcaster
- sort_string = "PAAAF"
-
-/datum/design/circuit/tcom/receiver
- name = "subspace receiver"
- id = "tcom-receiver"
- req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_BLUESPACE = 2)
- build_path = /obj/item/weapon/circuitboard/telecomms/receiver
- sort_string = "PAAAG"
-
-/datum/design/circuit/tcom/exonet_node
- name = "exonet node"
- id = "tcom-exonet_node"
- req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5, TECH_BLUESPACE = 4)
- build_path = /obj/item/weapon/circuitboard/telecomms/exonet_node
- sort_string = "PAAAH"
-
-/datum/design/circuit/shield
- req_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3)
- materials = list("glass" = 2000, "gold" = 1000)
-
-/datum/design/circuit/shield/AssembleDesignName()
- name = "Shield generator circuit design ([name])"
-/datum/design/circuit/shield/AssembleDesignDesc()
- if(!desc)
- desc = "Allows for the construction of \a [name] shield generator."
-
-/datum/design/circuit/shield/bubble
- name = "bubble"
- id = "shield_gen"
- build_path = /obj/item/weapon/circuitboard/shield_gen
- sort_string = "VAAAA"
-
-/datum/design/circuit/shield/hull
- name = "hull"
- id = "shield_gen_ex"
- build_path = /obj/item/weapon/circuitboard/shield_gen_ex
- sort_string = "VAAAB"
-
-/datum/design/circuit/shield/capacitor
- name = "capacitor"
- desc = "Allows for the construction of a shield capacitor circuit board."
- id = "shield_cap"
- req_tech = list(TECH_MAGNET = 3, TECH_POWER = 4)
- build_path = /obj/item/weapon/circuitboard/shield_cap
- sort_string = "VAAAC"
-
-/datum/design/circuit/aicore
- name = "AI core"
- id = "aicore"
- req_tech = list(TECH_DATA = 4, TECH_BIO = 3)
- build_path = /obj/item/weapon/circuitboard/aicore
- sort_string = "XAAAA"
-
-/datum/design/aimodule
- build_type = IMPRINTER
- materials = list("glass" = 2000, "gold" = 100)
-
-/datum/design/aimodule/AssembleDesignName()
- name = "AI module design ([name])"
-
-/datum/design/aimodule/AssembleDesignDesc()
- desc = "Allows for the construction of \a '[name]' AI module."
-
-/datum/design/aimodule/safeguard
- name = "Safeguard"
- id = "safeguard"
- req_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4)
- build_path = /obj/item/weapon/aiModule/safeguard
- sort_string = "XABAA"
-
-/datum/design/aimodule/onehuman
- name = "OneCrewMember"
- id = "onehuman"
- req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 6)
- build_path = /obj/item/weapon/aiModule/oneHuman
- sort_string = "XABAB"
-
-/datum/design/aimodule/protectstation
- name = "ProtectStation"
- id = "protectstation"
- req_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6)
- build_path = /obj/item/weapon/aiModule/protectStation
- sort_string = "XABAC"
-
-/datum/design/aimodule/notele
- name = "TeleporterOffline"
- id = "notele"
- req_tech = list(TECH_DATA = 3)
- build_path = /obj/item/weapon/aiModule/teleporterOffline
- sort_string = "XABAD"
-
-/datum/design/aimodule/quarantine
- name = "Quarantine"
- id = "quarantine"
- req_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MATERIAL = 4)
- build_path = /obj/item/weapon/aiModule/quarantine
- sort_string = "XABAE"
-
-/datum/design/aimodule/oxygen
- name = "OxygenIsToxicToHumans"
- id = "oxygen"
- req_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MATERIAL = 4)
- build_path = /obj/item/weapon/aiModule/oxygen
- sort_string = "XABAF"
-
-/datum/design/aimodule/freeform
- name = "Freeform"
- id = "freeform"
- req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4)
- build_path = /obj/item/weapon/aiModule/freeform
- sort_string = "XABAG"
-
-/datum/design/aimodule/reset
- name = "Reset"
- id = "reset"
- req_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6)
- build_path = /obj/item/weapon/aiModule/reset
- sort_string = "XAAAA"
-
-/datum/design/aimodule/purge
- name = "Purge"
- id = "purge"
- req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 6)
- build_path = /obj/item/weapon/aiModule/purge
- sort_string = "XAAAB"
-
-// Core modules
-/datum/design/aimodule/core
- req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 6)
-
-/datum/design/aimodule/core/AssembleDesignName()
- name = "AI core module design ([name])"
-
-/datum/design/aimodule/core/AssembleDesignDesc()
- desc = "Allows for the construction of \a '[name]' AI core module."
-
-/datum/design/aimodule/core/freeformcore
- name = "Freeform"
- id = "freeformcore"
- build_path = /obj/item/weapon/aiModule/freeformcore
- sort_string = "XACAA"
-
-/datum/design/aimodule/core/asimov
- name = "Asimov"
- id = "asimov"
- build_path = /obj/item/weapon/aiModule/asimov
- sort_string = "XACAB"
-
-/datum/design/aimodule/core/paladin
- name = "P.A.L.A.D.I.N."
- id = "paladin"
- build_path = /obj/item/weapon/aiModule/paladin
- sort_string = "XACAC"
-
-/datum/design/aimodule/core/tyrant
- name = "T.Y.R.A.N.T."
- id = "tyrant"
- req_tech = list(TECH_DATA = 4, TECH_ILLEGAL = 2, TECH_MATERIAL = 6)
- build_path = /obj/item/weapon/aiModule/tyrant
- sort_string = "XACAD"
-
-/datum/design/item/pda
- name = "PDA design"
- desc = "Cheaper than whiny non-digital assistants."
- id = "pda"
- req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
- build_path = /obj/item/device/pda
- sort_string = "VAAAA"
-
-// Cartridges
-/datum/design/item/pda_cartridge
- req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
-
-/datum/design/item/pda_cartridge/AssembleDesignName()
- ..()
- name = "PDA accessory ([item_name])"
-
-/datum/design/item/pda_cartridge/cart_basic
- id = "cart_basic"
- build_path = /obj/item/weapon/cartridge
- sort_string = "VBAAA"
-
-/datum/design/item/pda_cartridge/engineering
- id = "cart_engineering"
- build_path = /obj/item/weapon/cartridge/engineering
- sort_string = "VBAAB"
-
-/datum/design/item/pda_cartridge/atmos
- id = "cart_atmos"
- build_path = /obj/item/weapon/cartridge/atmos
- sort_string = "VBAAC"
-
-/datum/design/item/pda_cartridge/medical
- id = "cart_medical"
- build_path = /obj/item/weapon/cartridge/medical
- sort_string = "VBAAD"
-
-/datum/design/item/pda_cartridge/chemistry
- id = "cart_chemistry"
- build_path = /obj/item/weapon/cartridge/chemistry
- sort_string = "VBAAE"
-
-/datum/design/item/pda_cartridge/security
- id = "cart_security"
- build_path = /obj/item/weapon/cartridge/security
- sort_string = "VBAAF"
-
-/datum/design/item/pda_cartridge/janitor
- id = "cart_janitor"
- build_path = /obj/item/weapon/cartridge/janitor
- sort_string = "VBAAG"
-
-/datum/design/item/pda_cartridge/science
- id = "cart_science"
- build_path = /obj/item/weapon/cartridge/signal/science
- sort_string = "VBAAH"
-
-/datum/design/item/pda_cartridge/quartermaster
- id = "cart_quartermaster"
- build_path = /obj/item/weapon/cartridge/quartermaster
- sort_string = "VBAAI"
-
-/datum/design/item/pda_cartridge/hop
- id = "cart_hop"
- build_path = /obj/item/weapon/cartridge/hop
- sort_string = "VBAAJ"
-
-/datum/design/item/pda_cartridge/hos
- id = "cart_hos"
- build_path = /obj/item/weapon/cartridge/hos
- sort_string = "VBAAK"
-
-/datum/design/item/pda_cartridge/ce
- id = "cart_ce"
- build_path = /obj/item/weapon/cartridge/ce
- sort_string = "VBAAL"
-
-/datum/design/item/pda_cartridge/cmo
- id = "cart_cmo"
- build_path = /obj/item/weapon/cartridge/cmo
- sort_string = "VBAAM"
-
-/datum/design/item/pda_cartridge/rd
- id = "cart_rd"
- build_path = /obj/item/weapon/cartridge/rd
- sort_string = "VBAAN"
-
-/datum/design/item/pda_cartridge/captain
- id = "cart_captain"
- build_path = /obj/item/weapon/cartridge/captain
- sort_string = "VBAAO"
-
-
-
-/datum/design/item/wirer
- name = "Custom wirer tool"
- id = "wirer"
- req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500)
- build_path = /obj/item/device/integrated_electronics/wirer
- sort_string = "VBVAA"
-
-/datum/design/item/debugger
- name = "Custom circuit debugger tool"
- id = "debugger"
- req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500)
- build_path = /obj/item/device/integrated_electronics/debugger
- sort_string = "VBVAB"
-
-
-
-/datum/design/item/custom_circuit_assembly
- name = "Small custom assembly"
- desc = "A customizable assembly for simple, small devices."
- id = "assembly-small"
- req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2, TECH_POWER = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 10000)
- build_path = /obj/item/device/electronic_assembly
- sort_string = "VCAAA"
-
-/datum/design/item/custom_circuit_assembly/medium
- name = "Medium custom assembly"
- desc = "A customizable assembly suited for more ambitious mechanisms."
- id = "assembly-medium"
- req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_POWER = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 20000)
- build_path = /obj/item/device/electronic_assembly/medium
- sort_string = "VCAAB"
-
-/datum/design/item/custom_circuit_assembly/drone
- name = "Drone custom assembly"
- desc = "A customizable assembly optimized for autonomous devices."
- id = "assembly-drone"
- req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 4, TECH_POWER = 4)
- materials = list(DEFAULT_WALL_MATERIAL = 30000)
- build_path = /obj/item/device/electronic_assembly/drone
- sort_string = "VCAAC"
-
-/datum/design/item/custom_circuit_assembly/large
- name = "Large custom assembly"
- desc = "A customizable assembly for large machines."
- id = "assembly-large"
- req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 4)
- materials = list(DEFAULT_WALL_MATERIAL = 40000)
- build_path = /obj/item/device/electronic_assembly/large
- sort_string = "VCAAD"
-
-/datum/design/item/custom_circuit_assembly/implant
- name = "Implant custom assembly"
- desc = "An customizable assembly for very small devices, implanted into living entities."
- id = "assembly-implant"
- req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 3, TECH_BIO = 5)
- materials = list(DEFAULT_WALL_MATERIAL = 2000)
- build_path = /obj/item/weapon/implant/integrated_circuit
- sort_string = "VCAAE"
-
-/datum/design/item/custom_circuit_assembly/device
- name = "Device custom assembly"
- desc = "An customizable assembly designed to interface with other devices."
- id = "assembly-device"
- req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2, TECH_POWER = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 5000)
- build_path = /obj/item/device/assembly/electronic_assembly
- sort_string = "VCAAF"
-
-/datum/design/item/custom_circuit_printer
- name = "Portable integrated circuit printer"
- desc = "A portable(ish) printer for modular machines."
- id = "ic_printer"
- req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 4, TECH_DATA = 5)
- materials = list(DEFAULT_WALL_MATERIAL = 10000)
- build_path = /obj/item/device/integrated_circuit_printer
- sort_string = "VCAAG"
-
-/datum/design/item/custom_circuit_printer_upgrade
- name = "Integrated circuit printer upgrade - advanced designs"
- desc = "Allows the integrated circuit printer to create advanced circuits"
- id = "ic_printer_upgrade_adv"
- req_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 4)
- materials = list(DEFAULT_WALL_MATERIAL = 2000)
- build_path = /obj/item/weapon/disk/integrated_circuit/upgrade/advanced
- sort_string = "VCAAH"
-
-/datum/design/item/translator
- name = "handheld translator"
- id = "translator"
- req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000)
- build_path = /obj/item/device/universal_translator
- sort_string = "HABQA"
-
-/datum/design/item/ear_translator
- name = "earpiece translator"
- id = "ear_translator"
- req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5) //It's been hella miniaturized.
- materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000, "gold" = 1000)
- build_path = /obj/item/device/universal_translator/ear
- sort_string = "HABQB"
-
-/datum/design/obj/item/device/xenoarch_multi_tool
- name = "xenoarcheology multitool"
- id = "xenoarch_multitool"
- req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3)
- build_path = /obj/item/device/xenoarch_multi_tool
- materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500, "phoron" = 500)
- sort_string = "HABQC"
-
-/datum/design/excavationdrill
- name = "Excavation Drill"
- id = "excavationdrill"
- req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3)
- build_type = PROTOLATHE
- materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000)
- build_path = /obj/item/weapon/pickaxe/excavationdrill
-
-/* Uncomment if someone makes these buildable
-/datum/design/circuit/general_alert
- name = "general alert console"
- id = "general_alert"
- build_path = /obj/item/weapon/circuitboard/general_alert
-
-// Removal of loyalty implants. Can't think of a way to add this to the config option.
-/datum/design/item/implant/loyalty
- name = "loyalty"
- id = "implant_loyal"
- req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000)
- build_path = /obj/item/weapon/implantcase/loyalty"
-
-/datum/design/rust_core_control
- name = "Circuit Design (RUST core controller)"
- desc = "Allows for the construction of circuit boards used to build a core control console for the RUST fusion engine."
- id = "rust_core_control"
- req_tech = list("programming" = 4, "engineering" = 4)
- build_type = IMPRINTER
- materials = list("glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/rust_core_control"
-
-datum/design/rust_fuel_control
- name = "Circuit Design (RUST fuel controller)"
- desc = "Allows for the construction of circuit boards used to build a fuel injector control console for the RUST fusion engine."
- id = "rust_fuel_control"
- req_tech = list("programming" = 4, "engineering" = 4)
- build_type = IMPRINTER
- materials = list("glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/rust_fuel_control"
-
-datum/design/rust_fuel_port
- name = "Internal circuitry (RUST fuel port)"
- desc = "Allows for the construction of circuit boards used to build a fuel injection port for the RUST fusion engine."
- id = "rust_fuel_port"
- req_tech = list("engineering" = 4, "materials" = 5)
- build_type = IMPRINTER
- materials = list("glass" = 2000, "sacid" = 20, "uranium" = 3000)
- build_path = "/obj/item/weapon/module/rust_fuel_port"
-
-datum/design/rust_fuel_compressor
- name = "Circuit Design (RUST fuel compressor)"
- desc = "Allows for the construction of circuit boards used to build a fuel compressor of the RUST fusion engine."
- id = "rust_fuel_compressor"
- req_tech = list("materials" = 6, "phorontech" = 4)
- build_type = IMPRINTER
- materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "diamond" = 1000)
- build_path = "/obj/item/weapon/module/rust_fuel_compressor"
-
-datum/design/rust_core
- name = "Internal circuitry (RUST tokamak core)"
- desc = "The circuit board that for a RUST-pattern tokamak fusion core."
- id = "pacman"
- req_tech = list(bluespace = 3, phorontech = 4, magnets = 5, powerstorage = 6)
- build_type = IMPRINTER
- materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "diamond" = 2000)
- build_path = "/obj/item/weapon/circuitboard/rust_core"
-
-datum/design/rust_injector
- name = "Internal circuitry (RUST tokamak core)"
- desc = "The circuit board that for a RUST-pattern particle accelerator."
- id = "pacman"
- req_tech = list(powerstorage = 3, engineering = 4, phorontech = 4, materials = 6)
- build_type = IMPRINTER
- materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "uranium" = 2000)
- build_path = "/obj/item/weapon/circuitboard/rust_core"
-*/
+ sort_string = "GAAAB"
\ No newline at end of file
diff --git a/code/modules/research/designs/ai_modules.dm b/code/modules/research/designs/ai_modules.dm
new file mode 100644
index 0000000000..eae26ea386
--- /dev/null
+++ b/code/modules/research/designs/ai_modules.dm
@@ -0,0 +1,117 @@
+/datum/design/aimodule
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "gold" = 100)
+
+/datum/design/aimodule/AssembleDesignName()
+ name = "AI module design ([name])"
+
+/datum/design/aimodule/AssembleDesignDesc()
+ desc = "Allows for the construction of \a '[name]' AI module."
+
+/datum/design/aimodule/safeguard
+ name = "Safeguard"
+ id = "safeguard"
+ req_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4)
+ build_path = /obj/item/weapon/aiModule/safeguard
+ sort_string = "XABAA"
+
+/datum/design/aimodule/onehuman
+ name = "OneCrewMember"
+ id = "onehuman"
+ req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 6)
+ build_path = /obj/item/weapon/aiModule/oneHuman
+ sort_string = "XABAB"
+
+/datum/design/aimodule/protectstation
+ name = "ProtectStation"
+ id = "protectstation"
+ req_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6)
+ build_path = /obj/item/weapon/aiModule/protectStation
+ sort_string = "XABAC"
+
+/datum/design/aimodule/notele
+ name = "TeleporterOffline"
+ id = "notele"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/aiModule/teleporterOffline
+ sort_string = "XABAD"
+
+/datum/design/aimodule/quarantine
+ name = "Quarantine"
+ id = "quarantine"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MATERIAL = 4)
+ build_path = /obj/item/weapon/aiModule/quarantine
+ sort_string = "XABAE"
+
+/datum/design/aimodule/oxygen
+ name = "OxygenIsToxicToHumans"
+ id = "oxygen"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MATERIAL = 4)
+ build_path = /obj/item/weapon/aiModule/oxygen
+ sort_string = "XABAF"
+
+/datum/design/aimodule/freeform
+ name = "Freeform"
+ id = "freeform"
+ req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4)
+ build_path = /obj/item/weapon/aiModule/freeform
+ sort_string = "XABAG"
+
+/datum/design/aimodule/reset
+ name = "Reset"
+ id = "reset"
+ req_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6)
+ build_path = /obj/item/weapon/aiModule/reset
+ sort_string = "XAAAZ" // Duplicate string, really need to redo this whole thing
+
+/datum/design/aimodule/purge
+ name = "Purge"
+ id = "purge"
+ req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 6)
+ build_path = /obj/item/weapon/aiModule/purge
+ sort_string = "XAAAB"
+
+// Core modules
+/datum/design/aimodule/core
+ req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 6)
+
+/datum/design/aimodule/core/AssembleDesignName()
+ name = "AI core module design ([name])"
+
+/datum/design/aimodule/core/AssembleDesignDesc()
+ desc = "Allows for the construction of \a '[name]' AI core module."
+
+/datum/design/aimodule/core/freeformcore
+ name = "Freeform"
+ id = "freeformcore"
+ build_path = /obj/item/weapon/aiModule/freeformcore
+ sort_string = "XACAA"
+
+/datum/design/aimodule/core/asimov
+ name = "Asimov"
+ id = "asimov"
+ build_path = /obj/item/weapon/aiModule/asimov
+ sort_string = "XACAB"
+
+/datum/design/aimodule/core/paladin
+ name = "P.A.L.A.D.I.N."
+ id = "paladin"
+ build_path = /obj/item/weapon/aiModule/paladin
+ sort_string = "XACAC"
+
+/datum/design/aimodule/core/tyrant
+ name = "T.Y.R.A.N.T."
+ id = "tyrant"
+ req_tech = list(TECH_DATA = 4, TECH_ILLEGAL = 2, TECH_MATERIAL = 6)
+ build_path = /obj/item/weapon/aiModule/tyrant
+ sort_string = "XACAD"
+
+// AI file, AI tool
+/datum/design/item/intellicard
+ name = "'intelliCore', AI preservation and transportation system"
+ desc = "Allows for the construction of an intelliCore."
+ id = "intellicore"
+ req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4)
+ materials = list("glass" = 1000, "gold" = 200)
+ build_path = /obj/item/device/aicard
+ sort_string = "VACAA"
\ No newline at end of file
diff --git a/code/modules/research/designs/circuit_assembly.dm b/code/modules/research/designs/circuit_assembly.dm
new file mode 100644
index 0000000000..9f20032445
--- /dev/null
+++ b/code/modules/research/designs/circuit_assembly.dm
@@ -0,0 +1,89 @@
+/datum/design/item/wirer
+ name = "Custom wirer tool"
+ id = "wirer"
+ req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500)
+ build_path = /obj/item/device/integrated_electronics/wirer
+ sort_string = "VBVAA"
+
+/datum/design/item/debugger
+ name = "Custom circuit debugger tool"
+ id = "debugger"
+ req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500)
+ build_path = /obj/item/device/integrated_electronics/debugger
+ sort_string = "VBVAB"
+
+
+
+/datum/design/item/custom_circuit_assembly
+ name = "Small custom assembly"
+ desc = "A customizable assembly for simple, small devices."
+ id = "assembly-small"
+ req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2, TECH_POWER = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000)
+ build_path = /obj/item/device/electronic_assembly
+ sort_string = "VCAAA"
+
+/datum/design/item/custom_circuit_assembly/medium
+ name = "Medium custom assembly"
+ desc = "A customizable assembly suited for more ambitious mechanisms."
+ id = "assembly-medium"
+ req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_POWER = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 20000)
+ build_path = /obj/item/device/electronic_assembly/medium
+ sort_string = "VCAAB"
+
+/datum/design/item/custom_circuit_assembly/drone
+ name = "Drone custom assembly"
+ desc = "A customizable assembly optimized for autonomous devices."
+ id = "assembly-drone"
+ req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 4, TECH_POWER = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 30000)
+ build_path = /obj/item/device/electronic_assembly/drone
+ sort_string = "VCAAC"
+
+/datum/design/item/custom_circuit_assembly/large
+ name = "Large custom assembly"
+ desc = "A customizable assembly for large machines."
+ id = "assembly-large"
+ req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 40000)
+ build_path = /obj/item/device/electronic_assembly/large
+ sort_string = "VCAAD"
+
+/datum/design/item/custom_circuit_assembly/implant
+ name = "Implant custom assembly"
+ desc = "An customizable assembly for very small devices, implanted into living entities."
+ id = "assembly-implant"
+ req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 3, TECH_BIO = 5)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000)
+ build_path = /obj/item/weapon/implant/integrated_circuit
+ sort_string = "VCAAE"
+
+/datum/design/item/custom_circuit_assembly/device
+ name = "Device custom assembly"
+ desc = "An customizable assembly designed to interface with other devices."
+ id = "assembly-device"
+ req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2, TECH_POWER = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000)
+ build_path = /obj/item/device/assembly/electronic_assembly
+ sort_string = "VCAAF"
+
+/datum/design/item/custom_circuit_printer
+ name = "Portable integrated circuit printer"
+ desc = "A portable(ish) printer for modular machines."
+ id = "ic_printer"
+ req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 4, TECH_DATA = 5)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000)
+ build_path = /obj/item/device/integrated_circuit_printer
+ sort_string = "VCAAG"
+
+/datum/design/item/custom_circuit_printer_upgrade
+ name = "Integrated circuit printer upgrade - advanced designs"
+ desc = "Allows the integrated circuit printer to create advanced circuits"
+ id = "ic_printer_upgrade_adv"
+ req_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000)
+ build_path = /obj/item/weapon/disk/integrated_circuit/upgrade/advanced
+ sort_string = "VCAAH"
\ No newline at end of file
diff --git a/code/modules/research/designs/circuits.dm b/code/modules/research/designs/circuits.dm
new file mode 100644
index 0000000000..6c79366e66
--- /dev/null
+++ b/code/modules/research/designs/circuits.dm
@@ -0,0 +1,597 @@
+/*
+CIRCUITS BELOW
+*/
+
+/datum/design/circuit
+ build_type = IMPRINTER
+ req_tech = list(TECH_DATA = 2)
+ materials = list("glass" = 2000)
+ chemicals = list("sacid" = 20)
+ time = 5
+
+/datum/design/circuit/AssembleDesignName()
+ ..()
+ if(build_path)
+ var/obj/item/weapon/circuitboard/C = build_path
+ if(initial(C.board_type) == "machine")
+ name = "Machine circuit design ([item_name])"
+ else if(initial(C.board_type) == "computer")
+ name = "Computer circuit design ([item_name])"
+ else
+ name = "Circuit design ([item_name])"
+
+/datum/design/circuit/AssembleDesignDesc()
+ if(!desc)
+ desc = "Allows for the construction of \a [item_name] circuit board."
+
+/datum/design/circuit/arcademachine
+ name = "battle arcade machine"
+ id = "arcademachine"
+ req_tech = list(TECH_DATA = 1)
+ build_path = /obj/item/weapon/circuitboard/arcade/battle
+ sort_string = "MAAAA"
+
+/datum/design/circuit/oriontrail
+ name = "orion trail arcade machine"
+ id = "oriontrail"
+ req_tech = list(TECH_DATA = 1)
+ build_path = /obj/item/weapon/circuitboard/arcade/orion_trail
+ sort_string = "MAAAZ" // Duplicate string, really need to redo this whole thing
+
+/datum/design/circuit/jukebox
+ name = "jukebox"
+ id = "jukebox"
+ req_tech = list(TECH_MAGNET = 2, TECH_DATA = 1)
+ build_path = /obj/item/weapon/circuitboard/jukebox
+ sort_string = "MAAAB"
+
+/datum/design/circuit/seccamera
+ name = "security camera monitor"
+ id = "seccamera"
+ build_path = /obj/item/weapon/circuitboard/security
+ sort_string = "DAAAZ" // Duplicate string, really need to redo this whole thing
+
+/datum/design/circuit/secdata
+ name = "security records console"
+ id = "sec_data"
+ build_path = /obj/item/weapon/circuitboard/secure_data
+ sort_string = "DABAA"
+
+/datum/design/circuit/prisonmanage
+ name = "prisoner management console"
+ id = "prisonmanage"
+ build_path = /obj/item/weapon/circuitboard/prisoner
+ sort_string = "DACAA"
+
+/datum/design/circuit/med_data
+ name = "medical records console"
+ id = "med_data"
+ build_path = /obj/item/weapon/circuitboard/med_data
+ sort_string = "FAAAA"
+
+/datum/design/circuit/operating
+ name = "patient monitoring console"
+ id = "operating"
+ build_path = /obj/item/weapon/circuitboard/operating
+ sort_string = "FACAA"
+
+/datum/design/circuit/scan_console
+ name = "DNA machine"
+ id = "scan_console"
+ build_path = /obj/item/weapon/circuitboard/scan_consolenew
+ sort_string = "FAGAA"
+
+/datum/design/circuit/clonecontrol
+ name = "cloning control console"
+ id = "clonecontrol"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 3)
+ build_path = /obj/item/weapon/circuitboard/cloning
+ sort_string = "FAGAC"
+
+/datum/design/circuit/clonepod
+ name = "clone pod"
+ id = "clonepod"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 3)
+ build_path = /obj/item/weapon/circuitboard/clonepod
+ sort_string = "FAGAE"
+
+/datum/design/circuit/clonescanner
+ name = "cloning scanner"
+ id = "clonescanner"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 3)
+ build_path = /obj/item/weapon/circuitboard/clonescanner
+ sort_string = "FAGAG"
+
+/datum/design/circuit/crewconsole
+ name = "crew monitoring console"
+ id = "crewconsole"
+ req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_BIO = 2)
+ build_path = /obj/item/weapon/circuitboard/crew
+ sort_string = "FAGAI"
+
+/datum/design/circuit/teleconsole
+ name = "teleporter control console"
+ id = "teleconsole"
+ req_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 2)
+ build_path = /obj/item/weapon/circuitboard/teleporter
+ sort_string = "HAAAA"
+
+/datum/design/circuit/robocontrol
+ name = "robotics control console"
+ id = "robocontrol"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/robotics
+ sort_string = "HAAAB"
+
+/datum/design/circuit/mechacontrol
+ name = "exosuit control console"
+ id = "mechacontrol"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/circuitboard/mecha_control
+ sort_string = "HAAAC"
+
+/datum/design/circuit/rdconsole
+ name = "R&D control console"
+ id = "rdconsole"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/rdconsole
+ sort_string = "HAAAE"
+
+/datum/design/circuit/aifixer
+ name = "AI integrity restorer"
+ id = "aifixer"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 2)
+ build_path = /obj/item/weapon/circuitboard/aifixer
+ sort_string = "HAAAF"
+
+/datum/design/circuit/comm_monitor
+ name = "telecommunications monitoring console"
+ id = "comm_monitor"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/circuitboard/comm_monitor
+ sort_string = "HAACA"
+
+/datum/design/circuit/comm_server
+ name = "telecommunications server monitoring console"
+ id = "comm_server"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/circuitboard/comm_server
+ sort_string = "HAACB"
+
+/datum/design/circuit/message_monitor
+ name = "messaging monitor console"
+ id = "message_monitor"
+ req_tech = list(TECH_DATA = 5)
+ build_path = /obj/item/weapon/circuitboard/message_monitor
+ sort_string = "HAACC"
+
+/datum/design/circuit/aiupload
+ name = "AI upload console"
+ id = "aiupload"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/aiupload
+ sort_string = "HAABA"
+
+/datum/design/circuit/borgupload
+ name = "cyborg upload console"
+ id = "borgupload"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/borgupload
+ sort_string = "HAABB"
+
+/datum/design/circuit/destructive_analyzer
+ name = "destructive analyzer"
+ id = "destructive_analyzer"
+ req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2, TECH_ENGINEERING = 2)
+ build_path = /obj/item/weapon/circuitboard/destructive_analyzer
+ sort_string = "HABAA"
+
+/datum/design/circuit/protolathe
+ name = "protolathe"
+ id = "protolathe"
+ req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
+ build_path = /obj/item/weapon/circuitboard/protolathe
+ sort_string = "HABAB"
+
+/datum/design/circuit/circuit_imprinter
+ name = "circuit imprinter"
+ id = "circuit_imprinter"
+ req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
+ build_path = /obj/item/weapon/circuitboard/circuit_imprinter
+ sort_string = "HABAC"
+
+/datum/design/circuit/autolathe
+ name = "autolathe board"
+ id = "autolathe"
+ req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
+ build_path = /obj/item/weapon/circuitboard/autolathe
+ sort_string = "HABAD"
+
+/datum/design/circuit/rdservercontrol
+ name = "R&D server control console"
+ id = "rdservercontrol"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/circuitboard/rdservercontrol
+ sort_string = "HABBA"
+
+/datum/design/circuit/rdserver
+ name = "R&D server"
+ id = "rdserver"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/circuitboard/rdserver
+ sort_string = "HABBB"
+
+/datum/design/circuit/mechfab
+ name = "exosuit fabricator"
+ id = "mechfab"
+ req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
+ build_path = /obj/item/weapon/circuitboard/mechfab
+ sort_string = "HABAE"
+
+/datum/design/circuit/prosfab
+ name = "prosthetics fabricator"
+ id = "prosfab"
+ req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
+ build_path = /obj/item/weapon/circuitboard/prosthetics
+ sort_string = "HABAF"
+
+/datum/design/circuit/mech_recharger
+ name = "mech recharger"
+ id = "mech_recharger"
+ req_tech = list(TECH_DATA = 2, TECH_POWER = 2, TECH_ENGINEERING = 2)
+ build_path = /obj/item/weapon/circuitboard/mech_recharger
+ sort_string = "HACAA"
+
+/datum/design/circuit/recharge_station
+ name = "cyborg recharge station"
+ id = "recharge_station"
+ req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2)
+ build_path = /obj/item/weapon/circuitboard/recharge_station
+ sort_string = "HACAC"
+
+/datum/design/circuit/atmosalerts
+ name = "atmosphere alert console"
+ id = "atmosalerts"
+ build_path = /obj/item/weapon/circuitboard/atmos_alert
+ sort_string = "JAAAA"
+
+/datum/design/circuit/air_management
+ name = "atmosphere monitoring console"
+ id = "air_management"
+ build_path = /obj/item/weapon/circuitboard/air_management
+ sort_string = "JAAAB"
+
+/datum/design/circuit/rcon_console
+ name = "RCON remote control console"
+ id = "rcon_console"
+ req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_POWER = 5)
+ build_path = /obj/item/weapon/circuitboard/rcon_console
+ sort_string = "JAAAC"
+
+/datum/design/circuit/dronecontrol
+ name = "drone control console"
+ id = "dronecontrol"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/drone_control
+ sort_string = "JAAAD"
+
+/datum/design/circuit/powermonitor
+ name = "power monitoring console"
+ id = "powermonitor"
+ build_path = /obj/item/weapon/circuitboard/powermonitor
+ sort_string = "JAAAE"
+
+/datum/design/circuit/solarcontrol
+ name = "solar control console"
+ id = "solarcontrol"
+ build_path = /obj/item/weapon/circuitboard/solar_control
+ sort_string = "JAAAF"
+
+/datum/design/circuit/pacman
+ name = "PACMAN-type generator"
+ id = "pacman"
+ req_tech = list(TECH_DATA = 3, TECH_PHORON = 3, TECH_POWER = 3, TECH_ENGINEERING = 3)
+ build_path = /obj/item/weapon/circuitboard/pacman
+ sort_string = "JBAAA"
+
+/datum/design/circuit/superpacman
+ name = "SUPERPACMAN-type generator"
+ id = "superpacman"
+ req_tech = list(TECH_DATA = 3, TECH_POWER = 4, TECH_ENGINEERING = 4)
+ build_path = /obj/item/weapon/circuitboard/pacman/super
+ sort_string = "JBAAB"
+
+/datum/design/circuit/mrspacman
+ name = "MRSPACMAN-type generator"
+ id = "mrspacman"
+ req_tech = list(TECH_DATA = 3, TECH_POWER = 5, TECH_ENGINEERING = 5)
+ build_path = /obj/item/weapon/circuitboard/pacman/mrs
+ sort_string = "JBAAC"
+
+/datum/design/circuit/batteryrack
+ name = "cell rack PSU"
+ id = "batteryrack"
+ req_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 2)
+ build_path = /obj/item/weapon/circuitboard/batteryrack
+ sort_string = "JBABA"
+
+/datum/design/circuit/smes_cell
+ name = "'SMES' superconductive magnetic energy storage"
+ desc = "Allows for the construction of circuit boards used to build a SMES."
+ id = "smes_cell"
+ req_tech = list(TECH_POWER = 7, TECH_ENGINEERING = 5)
+ build_path = /obj/item/weapon/circuitboard/smes
+ sort_string = "JBABB"
+
+/datum/design/circuit/grid_checker
+ name = "power grid checker"
+ desc = "Allows for the construction of circuit boards used to build a grid checker."
+ id = "grid_checker"
+ req_tech = list(TECH_POWER = 4, TECH_ENGINEERING = 3)
+ build_path = /obj/item/weapon/circuitboard/grid_checker
+ sort_string = "JBABC"
+
+/datum/design/circuit/breakerbox
+ name = "breaker box"
+ desc = "Allows for the construction of circuit boards used to build a breaker box."
+ id = "breakerbox"
+ req_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3)
+ build_path = /obj/item/weapon/circuitboard/breakerbox
+ sort_string = "JBABD"
+
+/datum/design/circuit/gas_heater
+ name = "gas heating system"
+ id = "gasheater"
+ req_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 1)
+ build_path = /obj/item/weapon/circuitboard/unary_atmos/heater
+ sort_string = "JCAAA"
+
+/datum/design/circuit/gas_cooler
+ name = "gas cooling system"
+ id = "gascooler"
+ req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2)
+ build_path = /obj/item/weapon/circuitboard/unary_atmos/cooler
+ sort_string = "JCAAB"
+
+/datum/design/circuit/secure_airlock
+ name = "secure airlock electronics"
+ desc = "Allows for the construction of a tamper-resistant airlock electronics."
+ id = "securedoor"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/airlock_electronics/secure
+ sort_string = "JDAAA"
+
+/datum/design/circuit/ordercomp
+ name = "supply ordering console"
+ id = "ordercomp"
+ build_path = /obj/item/weapon/circuitboard/supplycomp
+ sort_string = "KAAAY" // Duplicate string, really need to redo this whole thing
+
+/datum/design/circuit/supplycomp
+ name = "supply control console"
+ id = "supplycomp"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/circuitboard/supplycomp/control
+ sort_string = "KAAAZ" // Duplicate string, really need to redo this whole thing
+
+/datum/design/circuit/biogenerator
+ name = "biogenerator"
+ id = "biogenerator"
+ req_tech = list(TECH_DATA = 2)
+ build_path = /obj/item/weapon/circuitboard/biogenerator
+ sort_string = "KBAAA"
+
+/datum/design/circuit/miningdrill
+ name = "mining drill head"
+ id = "mining drill head"
+ req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
+ build_path = /obj/item/weapon/circuitboard/miningdrill
+ sort_string = "KCAAA"
+
+/datum/design/circuit/miningdrillbrace
+ name = "mining drill brace"
+ id = "mining drill brace"
+ req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
+ build_path = /obj/item/weapon/circuitboard/miningdrillbrace
+ sort_string = "KCAAB"
+
+/datum/design/circuit/comconsole
+ name = "communications console"
+ id = "comconsole"
+ build_path = /obj/item/weapon/circuitboard/communications
+ sort_string = "LAAAA"
+
+/datum/design/circuit/idcardconsole
+ name = "ID card modification console"
+ id = "idcardconsole"
+ build_path = /obj/item/weapon/circuitboard/card
+ sort_string = "LAAAB"
+
+/datum/design/circuit/emp_data
+ name = "employment records console"
+ id = "emp_data"
+ build_path = /obj/item/weapon/circuitboard/skills
+ sort_string = "LAAAC"
+
+/datum/design/circuit/mecha
+ req_tech = list(TECH_DATA = 3)
+
+/datum/design/circuit/mecha/AssembleDesignName()
+ name = "Exosuit module circuit design ([name])"
+/datum/design/circuit/mecha/AssembleDesignDesc()
+ desc = "Allows for the construction of \a [name] module."
+
+/datum/design/circuit/mecha/ripley_main
+ name = "APLU 'Ripley' central control"
+ id = "ripley_main"
+ build_path = /obj/item/weapon/circuitboard/mecha/ripley/main
+ sort_string = "NAAAA"
+
+/datum/design/circuit/mecha/ripley_peri
+ name = "APLU 'Ripley' peripherals control"
+ id = "ripley_peri"
+ build_path = /obj/item/weapon/circuitboard/mecha/ripley/peripherals
+ sort_string = "NAAAB"
+
+/datum/design/circuit/mecha/odysseus_main
+ name = "'Odysseus' central control"
+ id = "odysseus_main"
+ req_tech = list(TECH_DATA = 3,TECH_BIO = 2)
+ build_path = /obj/item/weapon/circuitboard/mecha/odysseus/main
+ sort_string = "NAABA"
+
+/datum/design/circuit/mecha/odysseus_peri
+ name = "'Odysseus' peripherals control"
+ id = "odysseus_peri"
+ req_tech = list(TECH_DATA = 3,TECH_BIO = 2)
+ build_path = /obj/item/weapon/circuitboard/mecha/odysseus/peripherals
+ sort_string = "NAABB"
+
+/datum/design/circuit/mecha/gygax_main
+ name = "'Gygax' central control"
+ id = "gygax_main"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/mecha/gygax/main
+ sort_string = "NAACA"
+
+/datum/design/circuit/mecha/gygax_peri
+ name = "'Gygax' peripherals control"
+ id = "gygax_peri"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/mecha/gygax/peripherals
+ sort_string = "NAACB"
+
+/datum/design/circuit/mecha/gygax_targ
+ name = "'Gygax' weapon control and targeting"
+ id = "gygax_targ"
+ req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2)
+ build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting
+ sort_string = "NAACC"
+
+/datum/design/circuit/mecha/durand_main
+ name = "'Durand' central control"
+ id = "durand_main"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/mecha/durand/main
+ sort_string = "NAADA"
+
+/datum/design/circuit/mecha/durand_peri
+ name = "'Durand' peripherals control"
+ id = "durand_peri"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals
+ sort_string = "NAADB"
+
+/datum/design/circuit/mecha/durand_targ
+ name = "'Durand' weapon control and targeting"
+ id = "durand_targ"
+ req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2)
+ build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting
+ sort_string = "NAADC"
+
+/datum/design/circuit/tcom
+ req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4)
+
+/datum/design/circuit/tcom/AssembleDesignName()
+ name = "Telecommunications machinery circuit design ([name])"
+/datum/design/circuit/tcom/AssembleDesignDesc()
+ desc = "Allows for the construction of a telecommunications [name] circuit board."
+
+/datum/design/circuit/tcom/server
+ name = "server mainframe"
+ id = "tcom-server"
+ build_path = /obj/item/weapon/circuitboard/telecomms/server
+ sort_string = "PAAAA"
+
+/datum/design/circuit/tcom/processor
+ name = "processor unit"
+ id = "tcom-processor"
+ build_path = /obj/item/weapon/circuitboard/telecomms/processor
+ sort_string = "PAAAB"
+
+/datum/design/circuit/tcom/bus
+ name = "bus mainframe"
+ id = "tcom-bus"
+ build_path = /obj/item/weapon/circuitboard/telecomms/bus
+ sort_string = "PAAAC"
+
+/datum/design/circuit/tcom/hub
+ name = "hub mainframe"
+ id = "tcom-hub"
+ build_path = /obj/item/weapon/circuitboard/telecomms/hub
+ sort_string = "PAAAD"
+
+/datum/design/circuit/tcom/relay
+ name = "relay mainframe"
+ id = "tcom-relay"
+ req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 4, TECH_BLUESPACE = 3)
+ build_path = /obj/item/weapon/circuitboard/telecomms/relay
+ sort_string = "PAAAE"
+
+/datum/design/circuit/tcom/broadcaster
+ name = "subspace broadcaster"
+ id = "tcom-broadcaster"
+ req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_BLUESPACE = 2)
+ build_path = /obj/item/weapon/circuitboard/telecomms/broadcaster
+ sort_string = "PAAAF"
+
+/datum/design/circuit/tcom/receiver
+ name = "subspace receiver"
+ id = "tcom-receiver"
+ req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_BLUESPACE = 2)
+ build_path = /obj/item/weapon/circuitboard/telecomms/receiver
+ sort_string = "PAAAG"
+
+/datum/design/circuit/tcom/exonet_node
+ name = "exonet node"
+ id = "tcom-exonet_node"
+ req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5, TECH_BLUESPACE = 4)
+ build_path = /obj/item/weapon/circuitboard/telecomms/exonet_node
+ sort_string = "PAAAH"
+
+/datum/design/circuit/shield
+ req_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3)
+ materials = list("glass" = 2000, "gold" = 1000)
+
+/datum/design/circuit/shield/AssembleDesignName()
+ name = "Shield generator circuit design ([name])"
+/datum/design/circuit/shield/AssembleDesignDesc()
+ if(!desc)
+ desc = "Allows for the construction of \a [name] shield generator."
+
+/datum/design/circuit/shield/bubble
+ name = "bubble"
+ id = "shield_gen"
+ build_path = /obj/item/weapon/circuitboard/shield_gen
+ sort_string = "VAAAZ" // Duplicate string, really need to redo this whole thing
+
+/datum/design/circuit/shield/hull
+ name = "hull"
+ id = "shield_gen_ex"
+ build_path = /obj/item/weapon/circuitboard/shield_gen_ex
+ sort_string = "VAAAB"
+
+/datum/design/circuit/shield/capacitor
+ name = "capacitor"
+ desc = "Allows for the construction of a shield capacitor circuit board."
+ id = "shield_cap"
+ req_tech = list(TECH_MAGNET = 3, TECH_POWER = 4)
+ build_path = /obj/item/weapon/circuitboard/shield_cap
+ sort_string = "VAAAC"
+
+/datum/design/circuit/aicore
+ name = "AI core"
+ id = "aicore"
+ req_tech = list(TECH_DATA = 4, TECH_BIO = 3)
+ build_path = /obj/item/weapon/circuitboard/aicore
+ sort_string = "XAAAA"
+
+
+/* I have no idea how this was even running before, but it doesn't seem to be necessary.
+///////////////////////////////////
+/////////Shield Generators/////////
+///////////////////////////////////
+/datum/design/circuit/shield
+ req_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3)
+ materials = list("$glass" = 2000, "sacid" = 20, "$phoron" = 10000, "$diamond" = 5000, "$gold" = 10000)
+*/
\ No newline at end of file
diff --git a/code/modules/research/designs/illegal.dm b/code/modules/research/designs/illegal.dm
new file mode 100644
index 0000000000..1542e929b6
--- /dev/null
+++ b/code/modules/research/designs/illegal.dm
@@ -0,0 +1,19 @@
+// Yeah yeah, vague file name. Basically a misc folder for antag things that RnD can make.
+
+/datum/design/item/binaryencrypt
+ name = "Binary encryption key"
+ desc = "Allows for deciphering the binary channel on-the-fly."
+ id = "binaryencrypt"
+ req_tech = list(TECH_ILLEGAL = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 300, "glass" = 300)
+ build_path = /obj/item/device/encryptionkey/binary
+ sort_string = "VASAA"
+
+/datum/design/item/chameleon
+ name = "Holographic equipment kit"
+ desc = "A kit of dangerous, high-tech equipment with changeable looks."
+ id = "chameleon"
+ req_tech = list(TECH_ILLEGAL = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 500)
+ build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon
+ sort_string = "VASBA"
\ No newline at end of file
diff --git a/code/modules/research/designs/medical.dm b/code/modules/research/designs/medical.dm
new file mode 100644
index 0000000000..8e821fe0fe
--- /dev/null
+++ b/code/modules/research/designs/medical.dm
@@ -0,0 +1,186 @@
+/datum/design/item/medical
+ materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 20)
+
+/datum/design/item/medical/AssembleDesignName()
+ ..()
+ name = "Biotech device prototype ([item_name])"
+
+/datum/design/item/medical/robot_scanner
+ desc = "A hand-held scanner able to diagnose robotic injuries."
+ id = "robot_scanner"
+ req_tech = list(TECH_MAGNET = 3, TECH_BIO = 2, TECH_ENGINEERING = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200)
+ build_path = /obj/item/device/robotanalyzer
+ sort_string = "MACFA"
+
+/datum/design/item/medical/mass_spectrometer
+ desc = "A device for analyzing chemicals in blood."
+ id = "mass_spectrometer"
+ req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2)
+ build_path = /obj/item/device/mass_spectrometer
+ sort_string = "MACAA"
+
+/datum/design/item/medical/adv_mass_spectrometer
+ desc = "A device for analyzing chemicals in blood and their quantities."
+ id = "adv_mass_spectrometer"
+ req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4)
+ build_path = /obj/item/device/mass_spectrometer/adv
+ sort_string = "MACAB"
+
+/datum/design/item/medical/reagent_scanner
+ desc = "A device for identifying chemicals."
+ id = "reagent_scanner"
+ req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2)
+ build_path = /obj/item/device/reagent_scanner
+ sort_string = "MACBA"
+
+/datum/design/item/medical/adv_reagent_scanner
+ desc = "A device for identifying chemicals and their proportions."
+ id = "adv_reagent_scanner"
+ req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4)
+ build_path = /obj/item/device/reagent_scanner/adv
+ sort_string = "MACBB"
+
+/datum/design/item/beaker/AssembleDesignName()
+ name = "Beaker prototype ([item_name])"
+
+/datum/design/item/beaker/noreact
+ name = "cryostasis"
+ desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units."
+ id = "splitbeaker"
+ req_tech = list(TECH_MATERIAL = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 3000)
+ build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact
+ sort_string = "MADAA"
+
+/datum/design/item/beaker/bluespace
+ name = TECH_BLUESPACE
+ desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units."
+ id = "bluespacebeaker"
+ req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 6)
+ materials = list(DEFAULT_WALL_MATERIAL = 3000, "phoron" = 3000, "diamond" = 500)
+ build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace
+ sort_string = "MADAB"
+
+/datum/design/item/medical/nanopaste
+ desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery."
+ id = "nanopaste"
+ req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000)
+ build_path = /obj/item/stack/nanopaste
+ sort_string = "MBAAA"
+
+/datum/design/item/medical/scalpel_laser1
+ name = "Basic Laser Scalpel"
+ desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved."
+ id = "scalpel_laser1"
+ req_tech = list(TECH_BIO = 2, TECH_MATERIAL = 2, TECH_MAGNET = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500)
+ build_path = /obj/item/weapon/surgical/scalpel/laser1
+ sort_string = "MBBAA"
+
+/datum/design/item/medical/scalpel_laser2
+ name = "Improved Laser Scalpel"
+ desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced."
+ id = "scalpel_laser2"
+ req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 4, TECH_MAGNET = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500)
+ build_path = /obj/item/weapon/surgical/scalpel/laser2
+ sort_string = "MBBAB"
+
+/datum/design/item/medical/scalpel_laser3
+ name = "Advanced Laser Scalpel"
+ desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!"
+ id = "scalpel_laser3"
+ req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 5)
+ materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2000, "gold" = 1500)
+ build_path = /obj/item/weapon/surgical/scalpel/laser3
+ sort_string = "MBBAC"
+
+/datum/design/item/medical/scalpel_manager
+ name = "Incision Management System"
+ desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps."
+ id = "scalpel_manager"
+ req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 7, TECH_MAGNET = 5, TECH_DATA = 4)
+ materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 1500, "gold" = 1500, "diamond" = 750)
+ build_path = /obj/item/weapon/surgical/scalpel/manager
+ sort_string = "MBBAD"
+
+/datum/design/item/medical/bone_clamp
+ name = "Bone Clamp"
+ desc = "A miracle of modern science, this tool rapidly knits together bone, without the need for bone gel."
+ id = "bone_clamp"
+ req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 5, TECH_MAGNET = 4, TECH_DATA = 4)
+ materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500)
+ build_path = /obj/item/weapon/surgical/bone_clamp
+ sort_string = "MBBAE"
+
+/datum/design/item/medical/advanced_roller
+ name = "advanced roller bed"
+ desc = "A more advanced version of the regular roller bed, with inbuilt surgical stabilisers and an improved folding system."
+ id = "roller_bed"
+ req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 3, TECH_MAGNET = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "phoron" = 2000)
+ build_path = /obj/item/roller/adv
+ sort_string = "MBBAF"
+
+/datum/design/item/medical/improved_analyzer
+ name = "improved health analyzer"
+ desc = "A prototype version of the regular health analyzer, able to distinguish the location of more serious injuries as well as accurately determine radiation levels."
+ id = "improved_analyzer"
+ req_tech = list(TECH_MAGNET = 5, TECH_BIO = 6)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 1500)
+ build_path = /obj/item/device/healthanalyzer/improved
+ sort_string = "MBBAG"
+
+/datum/design/item/implant
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+/datum/design/item/implant/AssembleDesignName()
+ ..()
+ name = "Implantable biocircuit design ([item_name])"
+
+/datum/design/item/implant/chemical
+ name = "chemical"
+ id = "implant_chem"
+ req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3)
+ build_path = /obj/item/weapon/implantcase/chem
+ sort_string = "MFAAA"
+
+/datum/design/item/implant/freedom
+ name = "freedom"
+ id = "implant_free"
+ req_tech = list(TECH_ILLEGAL = 2, TECH_BIO = 3)
+ build_path = /obj/item/weapon/implantcase/freedom
+ sort_string = "MFAAB"
+
+// These are in here because Robotics is close enough to Medical and I don't want to make a new brains.dm file
+/datum/design/item/dronebrain
+ name = "Robotic intelligence circuit"
+ id = "dronebrain"
+ req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_DATA = 4)
+ build_type = PROTOLATHE | PROSFAB
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500)
+ build_path = /obj/item/device/mmi/digital/robot
+ category = "Misc"
+ sort_string = "VACAC"
+
+/datum/design/item/posibrain
+ name = "Positronic brain"
+ id = "posibrain"
+ req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4)
+ build_type = PROTOLATHE | PROSFAB
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100)
+ build_path = /obj/item/device/mmi/digital/posibrain
+ category = "Misc"
+ sort_string = "VACAB"
+
+/datum/design/item/mmi
+ name = "Man-machine interface"
+ id = "mmi"
+ req_tech = list(TECH_DATA = 2, TECH_BIO = 3)
+ build_type = PROTOLATHE | PROSFAB
+ materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500)
+ build_path = /obj/item/device/mmi
+ category = "Misc"
+ sort_string = "VACBA"
\ No newline at end of file
diff --git a/code/modules/research/designs/mining_toys.dm b/code/modules/research/designs/mining_toys.dm
new file mode 100644
index 0000000000..f9b76032cb
--- /dev/null
+++ b/code/modules/research/designs/mining_toys.dm
@@ -0,0 +1,48 @@
+// Assorted Mining-related items
+
+/datum/design/item/weapon/mining/AssembleDesignName()
+ ..()
+ name = "Mining equipment design ([item_name])"
+
+/datum/design/item/weapon/mining/jackhammer
+ id = "jackhammer"
+ req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "silver" = 500)
+ build_path = /obj/item/weapon/pickaxe/jackhammer
+ sort_string = "KAAAA"
+
+/datum/design/item/weapon/mining/drill
+ id = "drill"
+ req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1000) //expensive, but no need for miners.
+ build_path = /obj/item/weapon/pickaxe/drill
+ sort_string = "KAAAB"
+
+/datum/design/item/weapon/mining/plasmacutter
+ id = "plasmacutter"
+ req_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 500, "gold" = 500, "phoron" = 500)
+ build_path = /obj/item/weapon/pickaxe/plasmacutter
+ sort_string = "KAAAC"
+
+/datum/design/item/weapon/mining/pick_diamond
+ id = "pick_diamond"
+ req_tech = list(TECH_MATERIAL = 6)
+ materials = list("diamond" = 3000)
+ build_path = /obj/item/weapon/pickaxe/diamond
+ sort_string = "KAAAD"
+
+/datum/design/item/weapon/mining/drill_diamond
+ id = "drill_diamond"
+ req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 1000, "diamond" = 2000)
+ build_path = /obj/item/weapon/pickaxe/diamonddrill
+ sort_string = "KAAAE"
+
+/datum/design/item/device/depth_scanner
+ desc = "Used to check spatial depth and density of rock outcroppings."
+ id = "depth_scanner"
+ req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 1000)
+ build_path = /obj/item/device/depth_scanner
+ sort_string = "KAAAF"
\ No newline at end of file
diff --git a/code/modules/research/designs/misc.dm b/code/modules/research/designs/misc.dm
new file mode 100644
index 0000000000..29231a7cd9
--- /dev/null
+++ b/code/modules/research/designs/misc.dm
@@ -0,0 +1,203 @@
+/*
+//
+// THIS IS GOING TO GET REAL DAMN BLOATED, SO LET'S TRY TO AVOID THAT IF POSSIBLE
+//
+*/
+
+/datum/design/item/hud
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+/datum/design/item/hud/AssembleDesignName()
+ ..()
+ name = "HUD glasses prototype ([item_name])"
+
+/datum/design/item/hud/AssembleDesignDesc()
+ desc = "Allows for the construction of \a [item_name] HUD glasses."
+
+/datum/design/item/hud/health
+ name = "health scanner"
+ id = "health_hud"
+ req_tech = list(TECH_BIO = 2, TECH_MAGNET = 3)
+ build_path = /obj/item/clothing/glasses/hud/health
+ sort_string = "GAAAA"
+
+/datum/design/item/hud/security
+ name = "security records"
+ id = "security_hud"
+ req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2)
+ build_path = /obj/item/clothing/glasses/hud/security
+ sort_string = "GAAAB"
+
+/datum/design/item/hud/mesons
+ name = "Optical meson scanners design"
+ desc = "Using the meson-scanning technology those glasses allow you to see through walls, floor or anything else."
+ id = "mesons"
+ req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ build_path = /obj/item/clothing/glasses/meson
+ sort_string = "GAAAC"
+
+/datum/design/item/device/ano_scanner
+ name = "Alden-Saraspova counter"
+ id = "ano_scanner"
+ desc = "Aids in triangulation of exotic particles."
+ req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000)
+ build_path = /obj/item/device/ano_scanner
+ sort_string = "UAAAH"
+
+/datum/design/item/light_replacer
+ name = "Light replacer"
+ desc = "A device to automatically replace lights. Refill with working lightbulbs."
+ id = "light_replacer"
+ req_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 1500, "silver" = 150, "glass" = 3000)
+ build_path = /obj/item/device/lightreplacer
+ sort_string = "VAAAH"
+
+datum/design/item/laserpointer
+ name = "laser pointer"
+ desc = "Don't shine it in your eyes!"
+ id = "laser_pointer"
+ req_tech = list(TECH_MAGNET = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 100, "glass" = 50)
+ build_path = /obj/item/device/laser_pointer
+ sort_string = "VAAAI"
+
+/datum/design/item/paicard
+ name = "'pAI', personal artificial intelligence device"
+ id = "paicard"
+ req_tech = list(TECH_DATA = 2)
+ materials = list("glass" = 500, DEFAULT_WALL_MATERIAL = 500)
+ build_path = /obj/item/device/paicard
+ sort_string = "VABAI"
+
+/datum/design/item/communicator
+ name = "Communicator"
+ id = "communicator"
+ req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500)
+ build_path = /obj/item/device/communicator
+ sort_string = "VABAJ"
+
+/datum/design/item/beacon
+ name = "Bluespace tracking beacon design"
+ id = "beacon"
+ req_tech = list(TECH_BLUESPACE = 1)
+ materials = list (DEFAULT_WALL_MATERIAL = 20, "glass" = 10)
+ build_path = /obj/item/device/radio/beacon
+ sort_string = "VADAA"
+
+/datum/design/item/gps
+ name = "Triangulating device design"
+ desc = "Triangulates approximate co-ordinates using a nearby satellite network."
+ id = "gps"
+ req_tech = list(TECH_MATERIAL = 2, TECH_DATA = 2, TECH_BLUESPACE = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 500)
+ build_path = /obj/item/device/gps
+ sort_string = "VADAB"
+
+/datum/design/item/beacon_locator
+ name = "Beacon tracking pinpointer"
+ desc = "Used to scan and locate signals on a particular frequency."
+ id = "beacon_locator"
+ req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 500)
+ build_path = /obj/item/device/beacon_locator
+ sort_string = "VADAC"
+
+/datum/design/item/bag_holding
+ name = "'Bag of Holding', an infinite capacity bag prototype"
+ desc = "Using localized pockets of bluespace this bag prototype offers incredible storage capacity with the contents weighting nothing. It's a shame the bag itself is pretty heavy."
+ id = "bag_holding"
+ req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6)
+ materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250)
+ build_path = /obj/item/weapon/storage/backpack/holding
+ sort_string = "VAEAA"
+
+/datum/design/item/dufflebag_holding
+ name = "'DuffleBag of Holding', an infinite capacity dufflebag prototype"
+ desc = "A minaturized prototype of the popular Bag of Holding, the Dufflebag of Holding is, functionally, identical to the bag of holding, but comes in a more stylish and compact form."
+ id = "dufflebag_holding"
+ req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6)
+ materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250)
+ build_path = /obj/item/weapon/storage/backpack/holding/duffle
+ sort_string = "VAEAB"
+
+/datum/design/item/experimental_welder
+ name = "Experimental welding tool"
+ desc = "A welding tool that generate fuel for itself."
+ id = "expwelder"
+ req_tech = list(TECH_ENGINEERING = 4, TECH_PHORON = 3, TECH_MATERIAL = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120, "phoron" = 100)
+ build_path = /obj/item/weapon/weldingtool/experimental
+ sort_string = "VASCA"
+
+/datum/design/item/hand_drill
+ name = "Hand drill"
+ desc = "A simple powered hand drill."
+ id = "handdrill"
+ req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100)
+ build_path = /obj/item/weapon/tool/screwdriver/power
+ sort_string = "VASDA"
+
+/datum/design/item/jaws_life
+ name = "Jaws of life"
+ desc = "A set of jaws of life, compressed through the magic of science."
+ id = "jawslife"
+ req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100)
+ build_path = /obj/item/weapon/tool/crowbar/power
+ sort_string = "VASEA"
+
+/datum/design/item/device/t_scanner_upg
+ name = "Upgraded T-ray Scanner"
+ desc = "An upgraded version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
+ id = "upgradedtscanner"
+ req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 4, TECH_MATERIAL = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 500, "phoron" = 150)
+ build_path = /obj/item/device/t_scanner/upgraded
+ sort_string = "VASSA"
+
+/datum/design/item/device/t_scanner_adv
+ name = "Advanced T-ray Scanner"
+ desc = "An advanced version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
+ id = "advancedtscanner"
+ req_tech = list(TECH_MAGNET = 6, TECH_ENGINEERING = 6, TECH_MATERIAL = 6)
+ materials = list(DEFAULT_WALL_MATERIAL = 1250, "phoron" = 500, "silver" = 50)
+ build_path = /obj/item/device/t_scanner/advanced
+ sort_string = "VASSB"
+
+/datum/design/item/translator
+ name = "handheld translator"
+ id = "translator"
+ req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000)
+ build_path = /obj/item/device/universal_translator
+ sort_string = "HABQA"
+
+/datum/design/item/ear_translator
+ name = "earpiece translator"
+ id = "ear_translator"
+ req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5) //It's been hella miniaturized.
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000, "gold" = 1000)
+ build_path = /obj/item/device/universal_translator/ear
+ sort_string = "HABQB"
+
+/datum/design/item/xenoarch_multi_tool
+ name = "xenoarcheology multitool"
+ id = "xenoarch_multitool"
+ req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3)
+ build_path = /obj/item/device/xenoarch_multi_tool
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500, "phoron" = 500)
+ sort_string = "HABQC"
+
+/datum/design/item/excavationdrill
+ name = "Excavation Drill"
+ id = "excavationdrill"
+ req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3)
+ build_type = PROTOLATHE
+ materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000)
+ build_path = /obj/item/weapon/pickaxe/excavationdrill
+ sort_string = "HABQD"
diff --git a/code/modules/research/designs/pdas.dm b/code/modules/research/designs/pdas.dm
new file mode 100644
index 0000000000..4aca3062b9
--- /dev/null
+++ b/code/modules/research/designs/pdas.dm
@@ -0,0 +1,92 @@
+/datum/design/item/pda
+ name = "PDA design"
+ desc = "Cheaper than whiny non-digital assistants."
+ id = "pda"
+ req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ build_path = /obj/item/device/pda
+ sort_string = "VAAAA"
+
+// Cartridges
+/datum/design/item/pda_cartridge
+ req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+/datum/design/item/pda_cartridge/AssembleDesignName()
+ ..()
+ name = "PDA accessory ([item_name])"
+
+/datum/design/item/pda_cartridge/cart_basic
+ id = "cart_basic"
+ build_path = /obj/item/weapon/cartridge
+ sort_string = "VBAAA"
+
+/datum/design/item/pda_cartridge/engineering
+ id = "cart_engineering"
+ build_path = /obj/item/weapon/cartridge/engineering
+ sort_string = "VBAAB"
+
+/datum/design/item/pda_cartridge/atmos
+ id = "cart_atmos"
+ build_path = /obj/item/weapon/cartridge/atmos
+ sort_string = "VBAAC"
+
+/datum/design/item/pda_cartridge/medical
+ id = "cart_medical"
+ build_path = /obj/item/weapon/cartridge/medical
+ sort_string = "VBAAD"
+
+/datum/design/item/pda_cartridge/chemistry
+ id = "cart_chemistry"
+ build_path = /obj/item/weapon/cartridge/chemistry
+ sort_string = "VBAAE"
+
+/datum/design/item/pda_cartridge/security
+ id = "cart_security"
+ build_path = /obj/item/weapon/cartridge/security
+ sort_string = "VBAAF"
+
+/datum/design/item/pda_cartridge/janitor
+ id = "cart_janitor"
+ build_path = /obj/item/weapon/cartridge/janitor
+ sort_string = "VBAAG"
+
+/datum/design/item/pda_cartridge/science
+ id = "cart_science"
+ build_path = /obj/item/weapon/cartridge/signal/science
+ sort_string = "VBAAH"
+
+/datum/design/item/pda_cartridge/quartermaster
+ id = "cart_quartermaster"
+ build_path = /obj/item/weapon/cartridge/quartermaster
+ sort_string = "VBAAI"
+
+/datum/design/item/pda_cartridge/hop
+ id = "cart_hop"
+ build_path = /obj/item/weapon/cartridge/hop
+ sort_string = "VBAAJ"
+
+/datum/design/item/pda_cartridge/hos
+ id = "cart_hos"
+ build_path = /obj/item/weapon/cartridge/hos
+ sort_string = "VBAAK"
+
+/datum/design/item/pda_cartridge/ce
+ id = "cart_ce"
+ build_path = /obj/item/weapon/cartridge/ce
+ sort_string = "VBAAL"
+
+/datum/design/item/pda_cartridge/cmo
+ id = "cart_cmo"
+ build_path = /obj/item/weapon/cartridge/cmo
+ sort_string = "VBAAM"
+
+/datum/design/item/pda_cartridge/rd
+ id = "cart_rd"
+ build_path = /obj/item/weapon/cartridge/rd
+ sort_string = "VBAAN"
+
+/datum/design/item/pda_cartridge/captain
+ id = "cart_captain"
+ build_path = /obj/item/weapon/cartridge/captain
+ sort_string = "VBAAO"
\ No newline at end of file
diff --git a/code/modules/research/designs/powercells.dm b/code/modules/research/designs/powercells.dm
new file mode 100644
index 0000000000..1ae3a3c361
--- /dev/null
+++ b/code/modules/research/designs/powercells.dm
@@ -0,0 +1,71 @@
+/datum/design/item/powercell
+ build_type = PROTOLATHE | MECHFAB
+
+/datum/design/item/powercell/AssembleDesignName()
+ name = "Power Cell Model ([item_name])"
+
+/datum/design/item/powercell/AssembleDesignDesc()
+ if(build_path)
+ var/obj/item/weapon/cell/C = build_path
+ desc = "Allows the construction of power cells that can hold [initial(C.maxcharge)] units of energy."
+
+/datum/design/item/powercell/Fabricate()
+ var/obj/item/weapon/cell/C = ..()
+ C.charge = 0 //shouldn't produce power out of thin air.
+ return C
+
+/datum/design/item/powercell/basic
+ name = "basic"
+ build_type = PROTOLATHE | MECHFAB
+ id = "basic_cell"
+ req_tech = list(TECH_POWER = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
+ build_path = /obj/item/weapon/cell
+ category = "Misc"
+ sort_string = "DAAAA"
+
+/datum/design/item/powercell/high
+ name = "high-capacity"
+ build_type = PROTOLATHE | MECHFAB
+ id = "high_cell"
+ req_tech = list(TECH_POWER = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60)
+ build_path = /obj/item/weapon/cell/high
+ category = "Misc"
+ sort_string = "DAAAB"
+
+/datum/design/item/powercell/super
+ name = "super-capacity"
+ id = "super_cell"
+ req_tech = list(TECH_POWER = 3, TECH_MATERIAL = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70)
+ build_path = /obj/item/weapon/cell/super
+ category = "Misc"
+ sort_string = "DAAAC"
+
+/datum/design/item/powercell/hyper
+ name = "hyper-capacity"
+ id = "hyper_cell"
+ req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 400, "gold" = 150, "silver" = 150, "glass" = 70)
+ build_path = /obj/item/weapon/cell/hyper
+ category = "Misc"
+ sort_string = "DAAAD"
+
+/datum/design/item/powercell/device
+ name = "device"
+ build_type = PROTOLATHE
+ id = "device"
+ materials = list(DEFAULT_WALL_MATERIAL = 350, "glass" = 25)
+ build_path = /obj/item/weapon/cell/device
+ category = "Misc"
+ sort_string = "DAABA"
+
+/datum/design/item/powercell/weapon
+ name = "weapon"
+ build_type = PROTOLATHE
+ id = "weapon"
+ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
+ build_path = /obj/item/weapon/cell/device/weapon
+ category = "Misc"
+ sort_string = "DAABB"
\ No newline at end of file
diff --git a/code/modules/research/designs/stock_parts.dm b/code/modules/research/designs/stock_parts.dm
new file mode 100644
index 0000000000..fb629e7ad7
--- /dev/null
+++ b/code/modules/research/designs/stock_parts.dm
@@ -0,0 +1,178 @@
+/*
+ Various Stock Parts
+*/
+
+/datum/design/item/stock_part
+ build_type = PROTOLATHE
+
+/datum/design/item/stock_part/AssembleDesignName()
+ ..()
+ name = "Component design ([item_name])"
+
+/datum/design/item/stock_part/AssembleDesignDesc()
+ if(!desc)
+ desc = "A stock part used in the construction of various devices."
+
+/datum/design/item/stock_part/basic_capacitor
+ id = "basic_capacitor"
+ req_tech = list(TECH_POWER = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ build_path = /obj/item/weapon/stock_parts/capacitor
+ sort_string = "CAAAA"
+
+/datum/design/item/stock_part/adv_capacitor
+ id = "adv_capacitor"
+ req_tech = list(TECH_POWER = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ build_path = /obj/item/weapon/stock_parts/capacitor/adv
+ sort_string = "CAAAB"
+
+/datum/design/item/stock_part/super_capacitor
+ id = "super_capacitor"
+ req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, "gold" = 20)
+ build_path = /obj/item/weapon/stock_parts/capacitor/super
+ sort_string = "CAAAC"
+
+/datum/design/item/stock_part/micro_mani
+ id = "micro_mani"
+ req_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 30)
+ build_path = /obj/item/weapon/stock_parts/manipulator
+ sort_string = "CAABA"
+
+/datum/design/item/stock_part/nano_mani
+ id = "nano_mani"
+ req_tech = list(TECH_MATERIAL = 3, TECH_DATA = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 30)
+ build_path = /obj/item/weapon/stock_parts/manipulator/nano
+ sort_string = "CAABB"
+
+/datum/design/item/stock_part/pico_mani
+ id = "pico_mani"
+ req_tech = list(TECH_MATERIAL = 5, TECH_DATA = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 30)
+ build_path = /obj/item/weapon/stock_parts/manipulator/pico
+ sort_string = "CAABC"
+
+/datum/design/item/stock_part/basic_matter_bin
+ id = "basic_matter_bin"
+ req_tech = list(TECH_MATERIAL = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 80)
+ build_path = /obj/item/weapon/stock_parts/matter_bin
+ sort_string = "CAACA"
+
+/datum/design/item/stock_part/adv_matter_bin
+ id = "adv_matter_bin"
+ req_tech = list(TECH_MATERIAL = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 80)
+ build_path = /obj/item/weapon/stock_parts/matter_bin/adv
+ sort_string = "CAACB"
+
+/datum/design/item/stock_part/super_matter_bin
+ id = "super_matter_bin"
+ req_tech = list(TECH_MATERIAL = 5)
+ materials = list(DEFAULT_WALL_MATERIAL = 80)
+ build_path = /obj/item/weapon/stock_parts/matter_bin/super
+ sort_string = "CAACC"
+
+/datum/design/item/stock_part/basic_micro_laser
+ id = "basic_micro_laser"
+ req_tech = list(TECH_MAGNET = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20)
+ build_path = /obj/item/weapon/stock_parts/micro_laser
+ sort_string = "CAADA"
+
+/datum/design/item/stock_part/high_micro_laser
+ id = "high_micro_laser"
+ req_tech = list(TECH_MAGNET = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20)
+ build_path = /obj/item/weapon/stock_parts/micro_laser/high
+ sort_string = "CAADB"
+
+/datum/design/item/stock_part/ultra_micro_laser
+ id = "ultra_micro_laser"
+ req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5)
+ materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20, "uranium" = 10)
+ build_path = /obj/item/weapon/stock_parts/micro_laser/ultra
+ sort_string = "CAADC"
+
+/datum/design/item/stock_part/basic_sensor
+ id = "basic_sensor"
+ req_tech = list(TECH_MAGNET = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20)
+ build_path = /obj/item/weapon/stock_parts/scanning_module
+ sort_string = "CAAEA"
+
+/datum/design/item/stock_part/adv_sensor
+ id = "adv_sensor"
+ req_tech = list(TECH_MAGNET = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20)
+ build_path = /obj/item/weapon/stock_parts/scanning_module/adv
+ sort_string = "CAAEB"
+
+/datum/design/item/stock_part/phasic_sensor
+ id = "phasic_sensor"
+ req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20, "silver" = 10)
+ build_path = /obj/item/weapon/stock_parts/scanning_module/phasic
+ sort_string = "CAAEC"
+
+/datum/design/item/stock_part/subspace_ansible
+ id = "s-ansible"
+ req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 80, "silver" = 20)
+ build_path = /obj/item/weapon/stock_parts/subspace/ansible
+ sort_string = "UAAAA"
+
+/datum/design/item/stock_part/hyperwave_filter
+ id = "s-filter"
+ req_tech = list(TECH_DATA = 3, TECH_MAGNET = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 40, "silver" = 10)
+ build_path = /obj/item/weapon/stock_parts/subspace/sub_filter
+ sort_string = "UAAAB"
+
+/datum/design/item/stock_part/subspace_amplifier
+ id = "s-amplifier"
+ req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 30, "uranium" = 15)
+ build_path = /obj/item/weapon/stock_parts/subspace/amplifier
+ sort_string = "UAAAC"
+
+/datum/design/item/stock_part/subspace_treatment
+ id = "s-treatment"
+ req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 10, "silver" = 20)
+ build_path = /obj/item/weapon/stock_parts/subspace/treatment
+ sort_string = "UAAAD"
+
+/datum/design/item/stock_part/subspace_analyzer
+ id = "s-analyzer"
+ req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 15)
+ build_path = /obj/item/weapon/stock_parts/subspace/analyzer
+ sort_string = "UAAAE"
+
+/datum/design/item/stock_part/subspace_crystal
+ id = "s-crystal"
+ req_tech = list(TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ materials = list("glass" = 1000, "silver" = 20, "gold" = 20)
+ build_path = /obj/item/weapon/stock_parts/subspace/crystal
+ sort_string = "UAAAF"
+
+/datum/design/item/stock_part/subspace_transmitter
+ id = "s-transmitter"
+ req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5, TECH_BLUESPACE = 3)
+ materials = list("glass" = 100, "silver" = 10, "uranium" = 15)
+ build_path = /obj/item/weapon/stock_parts/subspace/transmitter
+ sort_string = "UAAAG"
+
+// RPED lives here because it handles stock parts
+/datum/design/item/stock_part/RPED
+ name = "Rapid Part Exchange Device"
+ desc = "Special mechanical module made to store, sort, and apply standard machine parts."
+ id = "rped"
+ req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 5000)
+ build_path = /obj/item/weapon/storage/part_replacer
+ sort_string = "CBAAA"
\ No newline at end of file
diff --git a/code/modules/research/designs/uncommented.dm b/code/modules/research/designs/uncommented.dm
new file mode 100644
index 0000000000..7bbf53571a
--- /dev/null
+++ b/code/modules/research/designs/uncommented.dm
@@ -0,0 +1,69 @@
+
+/* Uncomment if someone makes these buildable
+/datum/design/circuit/general_alert
+ name = "general alert console"
+ id = "general_alert"
+ build_path = /obj/item/weapon/circuitboard/general_alert
+
+// Removal of loyalty implants. Can't think of a way to add this to the config option.
+/datum/design/item/implant/loyalty
+ name = "loyalty"
+ id = "implant_loyal"
+ req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000)
+ build_path = /obj/item/weapon/implantcase/loyalty"
+
+/datum/design/rust_core_control
+ name = "Circuit Design (RUST core controller)"
+ desc = "Allows for the construction of circuit boards used to build a core control console for the RUST fusion engine."
+ id = "rust_core_control"
+ req_tech = list("programming" = 4, "engineering" = 4)
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "sacid" = 20)
+ build_path = "/obj/item/weapon/circuitboard/rust_core_control"
+
+datum/design/rust_fuel_control
+ name = "Circuit Design (RUST fuel controller)"
+ desc = "Allows for the construction of circuit boards used to build a fuel injector control console for the RUST fusion engine."
+ id = "rust_fuel_control"
+ req_tech = list("programming" = 4, "engineering" = 4)
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "sacid" = 20)
+ build_path = "/obj/item/weapon/circuitboard/rust_fuel_control"
+
+datum/design/rust_fuel_port
+ name = "Internal circuitry (RUST fuel port)"
+ desc = "Allows for the construction of circuit boards used to build a fuel injection port for the RUST fusion engine."
+ id = "rust_fuel_port"
+ req_tech = list("engineering" = 4, "materials" = 5)
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "sacid" = 20, "uranium" = 3000)
+ build_path = "/obj/item/weapon/module/rust_fuel_port"
+
+datum/design/rust_fuel_compressor
+ name = "Circuit Design (RUST fuel compressor)"
+ desc = "Allows for the construction of circuit boards used to build a fuel compressor of the RUST fusion engine."
+ id = "rust_fuel_compressor"
+ req_tech = list("materials" = 6, "phorontech" = 4)
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "diamond" = 1000)
+ build_path = "/obj/item/weapon/module/rust_fuel_compressor"
+
+datum/design/rust_core
+ name = "Internal circuitry (RUST tokamak core)"
+ desc = "The circuit board that for a RUST-pattern tokamak fusion core."
+ id = "pacman"
+ req_tech = list(bluespace = 3, phorontech = 4, magnets = 5, powerstorage = 6)
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "diamond" = 2000)
+ build_path = "/obj/item/weapon/circuitboard/rust_core"
+
+datum/design/rust_injector
+ name = "Internal circuitry (RUST tokamak core)"
+ desc = "The circuit board that for a RUST-pattern particle accelerator."
+ id = "pacman"
+ req_tech = list(powerstorage = 3, engineering = 4, phorontech = 4, materials = 6)
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "uranium" = 2000)
+ build_path = "/obj/item/weapon/circuitboard/rust_core"
+*/
diff --git a/code/modules/research/designs/weapons.dm b/code/modules/research/designs/weapons.dm
new file mode 100644
index 0000000000..828856aeba
--- /dev/null
+++ b/code/modules/research/designs/weapons.dm
@@ -0,0 +1,193 @@
+/datum/design/item/weapon/AssembleDesignName()
+ ..()
+ name = "Weapon prototype ([item_name])"
+
+/datum/design/item/weapon/AssembleDesignDesc()
+ if(!desc)
+ if(build_path)
+ var/obj/item/I = build_path
+ desc = initial(I.desc)
+ ..()
+
+/datum/design/item/weapon/stunrevolver
+ id = "stunrevolver"
+ req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 4000)
+ build_path = /obj/item/weapon/gun/energy/stunrevolver
+ sort_string = "TAAAA"
+
+/datum/design/item/weapon/nuclear_gun
+ id = "nuclear_gun"
+ req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "uranium" = 500)
+ build_path = /obj/item/weapon/gun/energy/gun/nuclear
+ sort_string = "TAAAB"
+
+/datum/design/item/weapon/lasercannon
+ desc = "The lasing medium of this prototype is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core."
+ id = "lasercannon"
+ req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1000, "diamond" = 2000)
+ build_path = /obj/item/weapon/gun/energy/lasercannon
+ sort_string = "TAAAC"
+
+/datum/design/item/weapon/phoronpistol
+ id = "ppistol"
+ req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "phoron" = 3000)
+ build_path = /obj/item/weapon/gun/energy/toxgun
+ sort_string = "TAAAD"
+
+/datum/design/item/weapon/decloner
+ id = "decloner"
+ req_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 7, TECH_BIO = 5, TECH_POWER = 6)
+ materials = list("gold" = 5000,"uranium" = 10000)
+ build_path = /obj/item/weapon/gun/energy/decloner
+ sort_string = "TAAAE"
+
+/datum/design/item/weapon/smg
+ id = "smg"
+ desc = "An compact reliable SMG firing armor piercing ammo."
+ req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 8000, "silver" = 2000, "diamond" = 1000)
+ build_path = /obj/item/weapon/gun/projectile/automatic/saber
+ sort_string = "TAABA"
+
+/datum/design/item/weapon/ammo_9mm
+ id = "ammo_9mm"
+ req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 3750, "silver" = 100)
+ build_path = /obj/item/ammo_magazine/box/c9mm
+ sort_string = "TAACA"
+
+/datum/design/item/weapon/stunshell
+ desc = "A stunning shell for a shotgun."
+ id = "stunshell"
+ req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 4000)
+ build_path = /obj/item/ammo_casing/a12g/stunshell
+ sort_string = "TAACB"
+
+/datum/design/item/weapon/chemsprayer
+ desc = "An advanced chem spraying device."
+ id = "chemsprayer"
+ req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000)
+ build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer
+ sort_string = "TABAA"
+
+/datum/design/item/weapon/rapidsyringe
+ id = "rapidsyringe"
+ req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000)
+ build_path = /obj/item/weapon/gun/launcher/syringe/rapid
+ sort_string = "TABAB"
+
+/datum/design/item/weapon/temp_gun
+ desc = "A gun that shoots high-powered glass-encased energy temperature bullets."
+ id = "temp_gun"
+ req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 500, "silver" = 3000)
+ build_path = /obj/item/weapon/gun/energy/temperature
+ sort_string = "TABAC"
+
+/datum/design/item/weapon/large_grenade
+ id = "large_Grenade"
+ req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 3000)
+ build_path = /obj/item/weapon/grenade/chem_grenade/large
+ sort_string = "TACAA"
+
+/datum/design/item/weapon/dartgun
+ desc = "A gun that fires small hollow chemical-payload darts."
+ id = "dartgun_r"
+ req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_BIO = 4, TECH_MAGNET = 3, TECH_ILLEGAL = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "gold" = 5000, "silver" = 2500, "glass" = 750)
+ build_path = /obj/item/weapon/gun/projectile/dartgun/research
+ sort_string = "TACAB"
+
+/datum/design/item/weapon/dartgunmag_small
+ id = "dartgun_mag_s"
+ req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 300, "gold" = 100, "silver" = 100, "glass" = 300)
+ build_path = /obj/item/ammo_magazine/chemdart/small
+ sort_string = "TACAC"
+
+/datum/design/item/weapon/dartgun_ammo_small
+ id = "dartgun_ammo_s"
+ req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "gold" = 30, "silver" = 30, "glass" = 50)
+ build_path = /obj/item/ammo_casing/chemdart/small
+ sort_string = "TACAD"
+
+/datum/design/item/weapon/dartgunmag_med
+ id = "dartgun_mag_m"
+ req_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 500, "gold" = 150, "silver" = 150, "diamond" = 200, "glass" = 400)
+ build_path = /obj/item/ammo_magazine/chemdart
+ sort_string = "TACAE"
+
+/datum/design/item/weapon/dartgun_ammo_med
+ id = "dartgun_ammo_m"
+ req_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 80, "gold" = 40, "silver" = 40, "glass" = 60)
+ build_path = /obj/item/ammo_casing/chemdart
+ sort_string = "TACAF"
+
+/datum/design/item/weapon/fuelrod
+ id = "fuelrod_gun"
+ req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_PHORON = 4, TECH_ILLEGAL = 5, TECH_MAGNET = 5)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "gold" = 500, "silver" = 500, "uranium" = 1000, "phoron" = 3000, "diamond" = 1000)
+ build_path = /obj/item/weapon/gun/magnetic/fuelrod
+ sort_string = "TACBA"
+
+/datum/design/item/weapon/flora_gun
+ id = "flora_gun"
+ req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "uranium" = 500)
+ build_path = /obj/item/weapon/gun/energy/floragun
+ sort_string = "TBAAA"
+
+// Xenobio Tools
+/datum/design/item/weapon/slimebation
+ id = "slimebation"
+ req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2, TECH_POWER = 3, TECH_COMBAT = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000)
+ build_path = /obj/item/weapon/melee/baton/slime
+ sort_string = "TBAAB"
+
+/datum/design/item/weapon/slimetaser
+ id = "slimetaser"
+ req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 3, TECH_POWER = 4, TECH_COMBAT = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000)
+ build_path = /obj/item/weapon/gun/energy/taser/xeno
+ sort_string = "TBAAC"
+
+// Phase Weapons
+/datum/design/item/weapon/phase_pistol
+ id = "phasepistol"
+ req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2, TECH_POWER = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 4000)
+ build_path = /obj/item/weapon/gun/energy/phasegun/pistol
+ sort_string = "TPAAA"
+
+/datum/design/item/weapon/phase_carbine
+ id = "phasecarbine"
+ req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_POWER = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1500)
+ build_path = /obj/item/weapon/gun/energy/phasegun
+ sort_string = "TPAAB"
+
+/datum/design/item/weapon/phase_rifle
+ id = "phaserifle"
+ req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2000, "silver" = 500)
+ build_path = /obj/item/weapon/gun/energy/phasegun/rifle
+ sort_string = "TPAAC"
+
+/datum/design/item/weapon/phase_cannon
+ id = "phasecannon"
+ req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4, TECH_POWER = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "silver" = 1000, "diamond" = 750)
+ build_path = /obj/item/weapon/gun/energy/phasegun/cannon
+ sort_string = "TPAAD"
\ No newline at end of file
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index b90937343c..1e1d54f9bc 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -91,7 +91,7 @@
/obj/machinery/r_n_d/protolathe/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(busy)
- user << "\The [src] is busy. Please wait for completion of previous operation."
+ to_chat(user, "\The [src] is busy. Please wait for completion of previous operation.")
return 1
if(default_deconstruction_screwdriver(user, O))
if(linked_console)
@@ -107,20 +107,20 @@
if(istype(O, /obj/item/weapon/gripper/no_use/loader))
return 0 //Sheet loaders weren't finishing attack(), this prevents the message "You can't stuff that gripper into this" without preventing the rest of the attack sequence from finishing
if(panel_open)
- user << "You can't load \the [src] while it's opened."
+ to_chat(user, "You can't load \the [src] while it's opened.")
return 1
if(!linked_console)
- user << "\The [src] must be linked to an R&D console first!"
+ to_chat(user, "\The [src] must be linked to an R&D console first!")
return 1
if(!istype(O, /obj/item/stack/material))
- user << "You cannot insert this item into \the [src]!"
+ to_chat(user, "You cannot insert this item into \the [src]!")
return 1
if(stat)
return 1
var/obj/item/stack/material/S = O
if(!(S.material.name in materials))
- user << "The [src] doesn't accept [S.material]!"
+ to_chat(user, "The [src] doesn't accept [S.material]!")
return
busy = 1
@@ -140,9 +140,9 @@
materials[S.material.name] += amnt
S.use(1)
count++
- user << "You insert [count] [sname] into the fabricator."
+ to_chat(user, "You insert [count] [sname] into the fabricator.")
else
- user << "The fabricator cannot hold more [sname]."
+ to_chat(user, "The fabricator cannot hold more [sname].")
busy = 0
var/stacktype = S.type
diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm
index bc5dc64652..7696c92a51 100644
--- a/code/modules/security levels/keycard authentication.dm
+++ b/code/modules/security levels/keycard authentication.dm
@@ -27,7 +27,7 @@
/obj/machinery/keycard_auth/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(stat & (NOPOWER|BROKEN))
- user << "This device is not powered."
+ to_chat(user, "This device is not powered.")
return
if(istype(W,/obj/item/weapon/card/id))
var/obj/item/weapon/card/id/ID = W
@@ -41,11 +41,11 @@
event_triggered_by = usr
broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices
- if(istype(W, /obj/item/weapon/screwdriver))
- user << "You begin removing the faceplate from the [src]"
+ if(W.is_screwdriver())
+ to_chat(user, "You begin removing the faceplate from the [src]")
playsound(src, W.usesound, 50, 1)
if(do_after(user, 10 * W.toolspeed))
- user << "You remove the faceplate from the [src]"
+ to_chat(user, "You remove the faceplate from the [src]")
var/obj/structure/frame/A = new /obj/structure/frame(loc)
var/obj/item/weapon/circuitboard/M = new circuit(A)
A.frame_type = M.board_type
@@ -70,12 +70,12 @@
/obj/machinery/keycard_auth/attack_hand(mob/user as mob)
if(user.stat || stat & (NOPOWER|BROKEN))
- user << "This device is not powered."
+ to_chat(user, "This device is not powered.")
return
if(!user.IsAdvancedToolUser())
return 0
if(busy)
- user << "This device is busy."
+ to_chat(user, "This device is busy.")
return
user.set_machine(src)
@@ -105,10 +105,10 @@
/obj/machinery/keycard_auth/Topic(href, href_list)
..()
if(busy)
- usr << "This device is busy."
+ to_chat(usr, "This device is busy.")
return
if(usr.stat || stat & (BROKEN|NOPOWER))
- usr << "This device is without power."
+ to_chat(usr, "This device is without power.")
return
if(href_list["triggerevent"])
event = href_list["triggerevent"]
@@ -132,7 +132,7 @@
/obj/machinery/keycard_auth/proc/broadcast_request()
icon_state = "auth_on"
- for(var/obj/machinery/keycard_auth/KA in world)
+ for(var/obj/machinery/keycard_auth/KA in machines)
if(KA == src) continue
KA.reset()
spawn()
@@ -174,7 +174,7 @@
feedback_inc("alert_keycard_auth_maintRevoke",1)
if("Emergency Response Team")
if(is_ert_blocked())
- usr << "All emergency response teams are dispatched and can not be called at this time."
+ to_chat(usr, "All emergency response teams are dispatched and can not be called at this time.")
return
trigger_armed_response_team(1)
diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm
index b67e6f70a2..1798ebd67f 100644
--- a/code/modules/shieldgen/emergency_shield.dm
+++ b/code/modules/shieldgen/emergency_shield.dm
@@ -254,10 +254,10 @@
/obj/machinery/shieldgen/attack_hand(mob/user as mob)
if(locked)
- user << "The machine is locked, you are unable to use it."
+ to_chat(user, "The machine is locked, you are unable to use it.")
return
if(is_open)
- user << "The panel must be closed before operating this machine."
+ to_chat(user, "The panel must be closed before operating this machine.")
return
if (src.active)
@@ -272,7 +272,7 @@
"You hear heavy droning.")
src.shields_up()
else
- user << "The device must first be secured to the floor."
+ to_chat(user, "The device must first be secured to the floor.")
return
/obj/machinery/shieldgen/emag_act(var/remaining_charges, var/mob/user)
@@ -282,50 +282,50 @@
return 1
/obj/machinery/shieldgen/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
playsound(src, W.usesound, 100, 1)
if(is_open)
- user << "You close the panel."
+ to_chat(user, "You close the panel.")
is_open = 0
else
- user << "You open the panel and expose the wiring."
+ to_chat(user, "You open the panel and expose the wiring.")
is_open = 1
else if(istype(W, /obj/item/stack/cable_coil) && malfunction && is_open)
var/obj/item/stack/cable_coil/coil = W
- user << "You begin to replace the wires."
+ to_chat(user, "You begin to replace the wires.")
//if(do_after(user, min(60, round( ((getMaxHealth()/health)*10)+(malfunction*10) ))) //Take longer to repair heavier damage
if(do_after(user, 30))
if (coil.use(1))
health = max_health
malfunction = 0
- user << "You repair the [src]!"
+ to_chat(user, "You repair the [src]!")
update_icon()
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
if(locked)
- user << "The bolts are covered, unlocking this would retract the covers."
+ to_chat(user, "The bolts are covered, unlocking this would retract the covers.")
return
if(anchored)
playsound(src, W.usesound, 100, 1)
- user << "You unsecure the [src] from the floor!"
+ to_chat(user, "You unsecure the [src] from the floor!")
if(active)
- user << "The [src] shuts off!"
+ to_chat(user, "The [src] shuts off!")
src.shields_down()
anchored = 0
else
if(istype(get_turf(src), /turf/space)) return //No wrenching these in space!
playsound(src, W.usesound, 100, 1)
- user << "You secure the [src] to the floor!"
+ to_chat(user, "You secure the [src] to the floor!")
anchored = 1
else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
if(src.allowed(user))
src.locked = !src.locked
- user << "The controls are now [src.locked ? "locked." : "unlocked."]"
+ to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]")
else
- user << "Access denied."
+ to_chat(user, "Access denied.")
else
..()
diff --git a/code/modules/shieldgen/handheld_defuser.dm b/code/modules/shieldgen/handheld_defuser.dm
index a2909fa7e6..d65a0060a8 100644
--- a/code/modules/shieldgen/handheld_defuser.dm
+++ b/code/modules/shieldgen/handheld_defuser.dm
@@ -7,11 +7,6 @@
var/obj/item/weapon/cell/device/cell
var/enabled = 0
-/obj/item/weapon/shield_diffuser/update_icon()
- if(enabled)
- icon_state = "hdiffuser_on"
- else
- icon_state = "hdiffuser_off"
/obj/item/weapon/shield_diffuser/New()
cell = new(src)
@@ -24,6 +19,9 @@
processing_objects.Remove(src)
. = ..()
+/obj/item/weapon/shield_diffuser/get_cell()
+ return cell
+
/obj/item/weapon/shield_diffuser/process()
if(!enabled)
return
@@ -34,6 +32,12 @@
if(istype(S) && cell.checked_use(10 KILOWATTS * CELLRATE))
qdel(S)
+/obj/item/weapon/shield_diffuser/update_icon()
+ if(enabled)
+ icon_state = "hdiffuser_on"
+ else
+ icon_state = "hdiffuser_off"
+
/obj/item/weapon/shield_diffuser/attack_self()
enabled = !enabled
update_icon()
diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm
index 995df27b48..37c55e5911 100644
--- a/code/modules/shieldgen/sheldwallgen.dm
+++ b/code/modules/shieldgen/sheldwallgen.dm
@@ -158,7 +158,7 @@
/obj/machinery/shieldwallgen/attackby(obj/item/W, mob/user)
- if(istype(W, /obj/item/weapon/wrench))
+ if(W.is_wrench())
if(active)
user << "Turn off the field generator first."
return
diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm
index 1b8f2def84..ae51705984 100644
--- a/code/modules/shieldgen/shield_capacitor.dm
+++ b/code/modules/shieldgen/shield_capacitor.dm
@@ -45,7 +45,7 @@
updateDialog()
else
user << "Access denied."
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
src.anchored = !src.anchored
playsound(src, W.usesound, 75, 1)
src.visible_message("\icon[src] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].")
diff --git a/code/modules/shieldgen/shield_diffuser.dm b/code/modules/shieldgen/shield_diffuser.dm
index 1d2edb43cb..c30f8a7351 100644
--- a/code/modules/shieldgen/shield_diffuser.dm
+++ b/code/modules/shieldgen/shield_diffuser.dm
@@ -5,8 +5,8 @@
icon = 'icons/obj/machines/shielding.dmi'
icon_state = "fdiffuser_on"
use_power = 2
- idle_power_usage = 100
- active_power_usage = 2000
+ idle_power_usage = 25 // Previously 100.
+ active_power_usage = 500 // Previously 2000
anchored = 1
density = 0
level = 1
diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm
index aa504fd7a6..7c63d0a623 100644
--- a/code/modules/shieldgen/shield_gen.dm
+++ b/code/modules/shieldgen/shield_gen.dm
@@ -64,7 +64,7 @@
updateDialog()
else
user << "Access denied."
- else if(istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
src.anchored = !src.anchored
playsound(src, W.usesound, 75, 1)
src.visible_message("\icon[src] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].")
diff --git a/code/modules/shuttles/shuttle_specops.dm b/code/modules/shuttles/shuttle_specops.dm
index 74acd095f7..47c3aca5ab 100644
--- a/code/modules/shuttles/shuttle_specops.dm
+++ b/code/modules/shuttles/shuttle_specops.dm
@@ -182,10 +182,10 @@
sleep(10)
var/spawn_marauder[] = new()
- for(var/obj/effect/landmark/L in world)
+ for(var/obj/effect/landmark/L in landmarks_list)
if(L.name == "Marauder Entry")
spawn_marauder.Add(L)
- for(var/obj/effect/landmark/L in world)
+ for(var/obj/effect/landmark/L in landmarks_list)
if(L.name == "Marauder Exit")
var/obj/effect/portal/P = new(L.loc)
P.invisibility = 101//So it is not seen by anyone.
diff --git a/code/modules/spells/aoe_turf/conjure/forcewall.dm b/code/modules/spells/aoe_turf/conjure/forcewall.dm
index 0c5ada5bd1..6d6bfdc3d8 100644
--- a/code/modules/spells/aoe_turf/conjure/forcewall.dm
+++ b/code/modules/spells/aoe_turf/conjure/forcewall.dm
@@ -33,6 +33,7 @@
opacity = 0
density = 1
unacidable = 1
+ invisibility = 101
/obj/effect/forcefield/bullet_act(var/obj/item/projectile/Proj, var/def_zone)
var/turf/T = get_turf(src.loc)
diff --git a/code/modules/surgery/_defines.dm b/code/modules/surgery/_defines.dm
index 900f3e4545..a76fb4e970 100644
--- a/code/modules/surgery/_defines.dm
+++ b/code/modules/surgery/_defines.dm
@@ -1 +1 @@
-#define SURGERY_FAILURE -1
+#define SURGERY_FAILURE -1
\ No newline at end of file
diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm
index 5465e7d03e..2f832fdb9f 100644
--- a/code/modules/surgery/bones.dm
+++ b/code/modules/surgery/bones.dm
@@ -9,9 +9,11 @@
/datum/surgery_step/glue_bone
allowed_tools = list(
- /obj/item/weapon/surgical/bonegel = 100, \
- /obj/item/weapon/screwdriver = 75
+ /obj/item/weapon/surgical/bonegel = 100
)
+
+ allowed_procs = list(IS_SCREWDRIVER = 75)
+
can_infect = 1
blood_level = 1
@@ -49,10 +51,11 @@
/datum/surgery_step/set_bone
allowed_tools = list(
- /obj/item/weapon/surgical/bonesetter = 100, \
- /obj/item/weapon/wrench = 75 \
+ /obj/item/weapon/surgical/bonesetter = 100
)
+ allowed_procs = list(IS_WRENCH = 75)
+
min_duration = 60
max_duration = 70
@@ -92,10 +95,11 @@
/datum/surgery_step/mend_skull
allowed_tools = list(
- /obj/item/weapon/surgical/bonesetter = 100, \
- /obj/item/weapon/wrench = 75 \
+ /obj/item/weapon/surgical/bonesetter = 100
)
+ allowed_procs = list(IS_WRENCH = 75)
+
min_duration = 60
max_duration = 70
@@ -130,9 +134,11 @@
/datum/surgery_step/finish_bone
allowed_tools = list(
- /obj/item/weapon/surgical/bonegel = 100, \
- /obj/item/weapon/screwdriver = 75
+ /obj/item/weapon/surgical/bonegel = 100
)
+
+ allowed_procs = list(IS_SCREWDRIVER = 75)
+
can_infect = 1
blood_level = 1
@@ -169,8 +175,9 @@
/datum/surgery_step/clamp_bone
allowed_tools = list(
- /obj/item/weapon/surgical/bone_clamp = 100
- )
+ /obj/item/weapon/surgical/bone_clamp = 100
+ )
+
can_infect = 1
blood_level = 1
diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm
index 2ab82cd2ae..3513691706 100644
--- a/code/modules/surgery/encased.dm
+++ b/code/modules/surgery/encased.dm
@@ -20,8 +20,8 @@
/datum/surgery_step/open_encased/saw
allowed_tools = list(
- /obj/item/weapon/surgical/circular_saw = 100, \
- /obj/item/weapon/material/knife/machete/hatchet = 75
+ /obj/item/weapon/surgical/circular_saw = 100, \
+ /obj/item/weapon/material/knife/machete/hatchet = 75
)
min_duration = 50
@@ -69,10 +69,11 @@
/datum/surgery_step/open_encased/retract
allowed_tools = list(
- /obj/item/weapon/surgical/retractor = 100, \
- /obj/item/weapon/crowbar = 75
+ /obj/item/weapon/surgical/retractor = 100
)
+ allowed_procs = list(IS_CROWBAR = 75)
+
min_duration = 30
max_duration = 40
@@ -103,10 +104,6 @@
affected.open = 3
- // Whoops!
- if(prob(10))
- affected.fracture()
-
/datum/surgery_step/open_encased/retract/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if (!hasorgans(target))
return
@@ -125,10 +122,11 @@
/datum/surgery_step/open_encased/close
allowed_tools = list(
- /obj/item/weapon/surgical/retractor = 100, \
- /obj/item/weapon/crowbar = 75
+ /obj/item/weapon/surgical/retractor = 100,
)
+ allowed_procs = list(IS_CROWBAR = 75)
+
min_duration = 20
max_duration = 40
@@ -182,10 +180,11 @@
/datum/surgery_step/open_encased/mend
allowed_tools = list(
- /obj/item/weapon/surgical/bonegel = 100, \
- /obj/item/weapon/screwdriver = 75
+ /obj/item/weapon/surgical/bonegel = 100
)
+ allowed_procs = list(IS_SCREWDRIVER = 75)
+
min_duration = 20
max_duration = 40
diff --git a/code/modules/surgery/external_repair.dm b/code/modules/surgery/external_repair.dm
new file mode 100644
index 0000000000..b26d803b34
--- /dev/null
+++ b/code/modules/surgery/external_repair.dm
@@ -0,0 +1,215 @@
+//Procedures in this file: Organic limb repair
+//////////////////////////////////////////////////////////////////
+// LIMB REPAIR SURGERY //
+//////////////////////////////////////////////////////////////////
+/datum/surgery_step/repairflesh/
+ priority = 1
+ can_infect = 1
+ blood_level = 1
+ req_open = 1
+
+/datum/surgery_step/repairflesh/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (target.stat == DEAD) // Sorry defibs, your subjects need to have pumping fluids for these to work.
+ return 0
+ if (isslime(target))
+ return 0
+ if (target_zone == O_EYES || target_zone == O_MOUTH)
+ return 0
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (affected == null)
+ return 0
+ if (affected.is_stump())
+ return 0
+ if (affected.robotic >= ORGAN_ROBOT)
+ return 0
+ return 1
+
+
+//////////////////////////////////////////////////////////////////
+// SCAN STEP //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/repairflesh/scan_injury
+ allowed_tools = list(
+ /obj/item/weapon/autopsy_scanner = 100,
+ /obj/item/device/healthanalyzer = 80,
+ /obj/item/device/analyzer = 10
+ )
+
+ priority = 2
+
+ can_infect = 0 //The only exception here. Sweeping a scanner probably won't transfer many germs.
+
+ min_duration = 20
+ max_duration = 40
+
+/datum/surgery_step/repairflesh/scan_injury/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(affected.burn_stage || affected.brute_stage)
+ return 0
+ return 1
+ return 0
+
+/datum/surgery_step/repairflesh/scan_injury/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] begins scanning [target]'s [affected] with \the [tool].", \
+ "You begin scanning [target]'s [affected] with \the [tool].")
+ ..()
+
+/datum/surgery_step/repairflesh/scan_injury/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] finishes scanning [target]'s [affected].", \
+ "You finish scanning [target]'s [affected].")
+ if(affected.brute_dam)
+ to_chat(user, "The muscle in [target]'s [affected] is notably bruised.")
+ if(affected.status & ORGAN_BROKEN)
+ to_chat(user, "\The [target]'s [affected] is broken!")
+ affected.brute_stage = max(1, affected.brute_stage)
+ if(affected.burn_dam)
+ to_chat(user, "\The muscle in [target]'s [affected] is notably charred.")
+ affected.burn_stage = max(1, affected.burn_stage)
+
+/datum/surgery_step/repairflesh/scan_injury/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, dropping \the [tool] onto [target]'s [affected]!" , \
+ "Your hand slips, dropping \the [tool] onto [target]'s [affected]!" )
+ affected.createwound(BRUISE, 10)
+
+//////////////////////////////////////////////////////////////////
+// BURN STEP //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/repairflesh/repair_burns
+ allowed_tools = list(
+ /obj/item/stack/medical/advanced/ointment = 100,
+ /obj/item/weapon/surgical/FixOVein = 100,
+ /obj/item/weapon/surgical/hemostat = 60,
+ /obj/item/stack/medical/ointment = 50,
+ /obj/item/weapon/tape_roll = 30,
+ /obj/item/taperoll = 10
+ )
+
+ priority = 3
+
+ min_duration = 90
+ max_duration = 120
+
+/datum/surgery_step/repairflesh/repair_burns/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(affected.burn_stage < 1 || !(affected.burn_dam))
+ return 0
+ if(affected.burn_dam < affected.brute_dam)
+ return 0
+ return 1
+ return 0
+
+/datum/surgery_step/repairflesh/repair_burns/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(istype(tool, /obj/item/weapon/tape_roll) || istype(tool, /obj/item/taperoll))
+ user.visible_message("[user] begins taping up [target]'s [affected] with \the [tool].", \
+ "You begin taping up [target]'s [affected] with \the [tool].")
+ affected.jostle_bone(10)
+ else if(istype(tool, /obj/item/weapon/surgical/hemostat) || istype(tool, /obj/item/weapon/surgical/FixOVein))
+ user.visible_message("[user] begins mending the charred blood vessels in [target]'s [affected] with \the [tool].", \
+ "You begin mending the charred blood vessels in [target]'s [affected] with \the [tool].")
+ else
+ user.visible_message("[user] begins coating the charred tissue in [target]'s [affected] with \the [tool].", \
+ "You begin coating the charred tissue in [target]'s [affected] with \the [tool].")
+ ..()
+
+/datum/surgery_step/repairflesh/repair_burns/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(istype(tool, /obj/item/weapon/tape_roll) || istype(tool, /obj/item/taperoll))
+ user.visible_message("[user] finishes taping up [target]'s [affected] with \the [tool].", \
+ "You finish taping up [target]'s [affected] with \the [tool].")
+ affected.createwound(BRUISE, 10)
+ affected.heal_damage(0, 25, 0, 0)
+ if(!(affected.burn_dam))
+ affected.burn_stage = 0
+ if(istype(tool, /obj/item/stack))
+ var/obj/item/stack/T = tool
+ T.use(1)
+ ..()
+
+/datum/surgery_step/repairflesh/repair_burns/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, tearing up [target]'s [affected] with \the [tool].", \
+ "Your hand slips, tearing up [target]'s [affected] with \the [tool].")
+ affected.createwound(BRUISE, 10)
+ affected.createwound(CUT, 5)
+ if(istype(tool, /obj/item/stack) && prob(30))
+ var/obj/item/stack/T = tool
+ T.use(1)
+ ..()
+
+//////////////////////////////////////////////////////////////////
+// BRUTE STEP //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/repairflesh/repair_brute
+ allowed_tools = list(
+ /obj/item/stack/medical/advanced/bruise_pack = 100,
+ /obj/item/weapon/surgical/cautery = 100,
+ /obj/item/weapon/surgical/bonesetter = 60,
+ /obj/item/stack/medical/bruise_pack = 50,
+ /obj/item/weapon/tape_roll = 40,
+ /obj/item/taperoll = 10
+ )
+
+ priority = 3
+
+ min_duration = 90
+ max_duration = 120
+
+/datum/surgery_step/repairflesh/repair_brute/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(affected.brute_stage < 1 || !(affected.brute_dam))
+ return 0
+ if(affected.brute_dam < affected.burn_dam)
+ return 0
+ return 1
+ return 0
+
+/datum/surgery_step/repairflesh/repair_brute/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(istype(tool, /obj/item/weapon/tape_roll) || istype(tool, /obj/item/taperoll))
+ user.visible_message("[user] begins taping up [target]'s [affected] with \the [tool].", \
+ "You begin taping up [target]'s [affected] with \the [tool].")
+ affected.jostle_bone(10)
+ else if(istype(tool, /obj/item/weapon/surgical/FixOVein) || istype(tool, /obj/item/weapon/surgical/bonesetter))
+ user.visible_message("[user] begins mending the torn tissue in [target]'s [affected] with \the [tool].", \
+ "You begin mending the torn tissue in [target]'s [affected] with \the [tool].")
+ else
+ user.visible_message("[user] begins coating the tissue in [target]'s [affected] with \the [tool].", \
+ "You begin coating the tissue in [target]'s [affected] with \the [tool].")
+ ..()
+
+/datum/surgery_step/repairflesh/repair_brute/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(istype(tool, /obj/item/weapon/tape_roll) || istype(tool, /obj/item/taperoll))
+ user.visible_message("[user] finishes taping up [target]'s [affected] with \the [tool].", \
+ "You finish taping up [target]'s [affected] with \the [tool].")
+ affected.createwound(BRUISE, 10)
+ affected.heal_damage(25, 0, 0, 0)
+ if(!(affected.brute_dam))
+ affected.brute_stage = 0
+ if(istype(tool, /obj/item/stack))
+ var/obj/item/stack/T = tool
+ T.use(1)
+ ..()
+
+/datum/surgery_step/repairflesh/repair_brute/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, tearing up [target]'s [affected] with \the [tool].", \
+ "Your hand slips, tearing up [target]'s [affected] with \the [tool].")
+ affected.createwound(BRUISE, 10)
+ affected.createwound(CUT, 5)
+ if(istype(tool, /obj/item/stack) && prob(30))
+ var/obj/item/stack/T = tool
+ T.use(1)
+ ..()
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index b3fae927bb..30f50b14ec 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -88,9 +88,11 @@
/datum/surgery_step/face/fix_face
allowed_tools = list(
- /obj/item/weapon/surgical/retractor = 100, \
- /obj/item/weapon/crowbar = 55, \
- /obj/item/weapon/material/kitchen/utensil/fork = 75)
+ /obj/item/weapon/surgical/retractor = 100, \
+ /obj/item/weapon/material/kitchen/utensil/fork = 75
+ )
+
+ allowed_procs = list(IS_CROWBAR = 55)
min_duration = 80
max_duration = 100
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index f74c7dda64..64de0aeef4 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -28,9 +28,9 @@
/datum/surgery_step/generic/cut_open
allowed_tools = list(
- /obj/item/weapon/surgical/scalpel = 100, \
- /obj/item/weapon/material/knife = 75, \
- /obj/item/weapon/material/shard = 50, \
+ /obj/item/weapon/surgical/scalpel = 100, \
+ /obj/item/weapon/material/knife = 75, \
+ /obj/item/weapon/material/shard = 50, \
)
req_open = 0
@@ -72,10 +72,10 @@
/datum/surgery_step/generic/cut_with_laser
allowed_tools = list(
- /obj/item/weapon/surgical/scalpel/laser3 = 95, \
- /obj/item/weapon/surgical/scalpel/laser2 = 85, \
- /obj/item/weapon/surgical/scalpel/laser1 = 75, \
- /obj/item/weapon/melee/energy/sword = 5
+ /obj/item/weapon/surgical/scalpel/laser3 = 95, \
+ /obj/item/weapon/surgical/scalpel/laser2 = 85, \
+ /obj/item/weapon/surgical/scalpel/laser1 = 75, \
+ /obj/item/weapon/melee/energy/sword = 5
)
priority = 2
req_open = 0
@@ -118,8 +118,9 @@
/datum/surgery_step/generic/incision_manager
allowed_tools = list(
- /obj/item/weapon/surgical/scalpel/manager = 100
+ /obj/item/weapon/surgical/scalpel/manager = 100
)
+
priority = 2
req_open = 0
min_duration = 80
@@ -163,9 +164,9 @@
/datum/surgery_step/generic/clamp_bleeders
allowed_tools = list(
- /obj/item/weapon/surgical/hemostat = 100, \
- /obj/item/stack/cable_coil = 75, \
- /obj/item/device/assembly/mousetrap = 20
+ /obj/item/weapon/surgical/hemostat = 100, \
+ /obj/item/stack/cable_coil = 75, \
+ /obj/item/device/assembly/mousetrap = 20
)
min_duration = 40
@@ -202,11 +203,12 @@
/datum/surgery_step/generic/retract_skin
allowed_tools = list(
- /obj/item/weapon/surgical/retractor = 100, \
- /obj/item/weapon/crowbar = 75, \
- /obj/item/weapon/material/kitchen/utensil/fork = 50
+ /obj/item/weapon/surgical/retractor = 100, \
+ /obj/item/weapon/material/kitchen/utensil/fork = 50
)
+ allowed_procs = list(IS_CROWBAR = 75)
+
min_duration = 30
max_duration = 40
@@ -261,10 +263,10 @@
/datum/surgery_step/generic/cauterize
allowed_tools = list(
- /obj/item/weapon/surgical/cautery = 100, \
- /obj/item/clothing/mask/smokable/cigarette = 75, \
- /obj/item/weapon/flame/lighter = 50, \
- /obj/item/weapon/weldingtool = 25
+ /obj/item/weapon/surgical/cautery = 100, \
+ /obj/item/clothing/mask/smokable/cigarette = 75, \
+ /obj/item/weapon/flame/lighter = 50, \
+ /obj/item/weapon/weldingtool = 25
)
min_duration = 70
@@ -302,8 +304,8 @@
/datum/surgery_step/generic/amputate
allowed_tools = list(
- /obj/item/weapon/surgical/circular_saw = 100, \
- /obj/item/weapon/material/knife/machete/hatchet = 75
+ /obj/item/weapon/surgical/circular_saw = 100, \
+ /obj/item/weapon/material/knife/machete/hatchet = 75
)
req_open = 0
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index c8872e05cc..8e21e9e8a3 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -44,9 +44,9 @@
/datum/surgery_step/cavity/make_space
allowed_tools = list(
- /obj/item/weapon/surgical/surgicaldrill = 100, \
- /obj/item/weapon/pen = 75, \
- /obj/item/stack/rods = 50
+ /obj/item/weapon/surgical/surgicaldrill = 100, \
+ /obj/item/weapon/pen = 75, \
+ /obj/item/stack/rods = 50
)
min_duration = 60
@@ -77,10 +77,10 @@
/datum/surgery_step/cavity/close_space
priority = 2
allowed_tools = list(
- /obj/item/weapon/surgical/cautery = 100, \
- /obj/item/clothing/mask/smokable/cigarette = 75, \
- /obj/item/weapon/flame/lighter = 50, \
- /obj/item/weapon/weldingtool = 25
+ /obj/item/weapon/surgical/cautery = 100, \
+ /obj/item/clothing/mask/smokable/cigarette = 75, \
+ /obj/item/weapon/flame/lighter = 50, \
+ /obj/item/weapon/weldingtool = 25
)
min_duration = 60
@@ -156,11 +156,12 @@
/datum/surgery_step/cavity/implant_removal
allowed_tools = list(
- /obj/item/weapon/surgical/hemostat = 100, \
- /obj/item/weapon/wirecutters = 75, \
- /obj/item/weapon/material/kitchen/utensil/fork = 20
+ /obj/item/weapon/surgical/hemostat = 100, \
+ /obj/item/weapon/material/kitchen/utensil/fork = 20
)
+ allowed_procs = list(IS_WIRECUTTER = 75)
+
min_duration = 80
max_duration = 100
diff --git a/code/modules/surgery/neck.dm b/code/modules/surgery/neck.dm
index 6cd347586b..5b1522d60c 100644
--- a/code/modules/surgery/neck.dm
+++ b/code/modules/surgery/neck.dm
@@ -59,9 +59,11 @@
priority = 3 //Do this instead of expanding the skull cavity
allowed_tools = list(
/obj/item/weapon/surgical/surgicaldrill = 100,
- /obj/item/weapon/screwdriver = 75,
/obj/item/weapon/melee/changeling/arm_blade = 15,
- /obj/item/weapon/pickaxe = 5)
+ /obj/item/weapon/pickaxe = 5
+ )
+
+ allowed_procs = list(IS_SCREWDRIVER = 75)
min_duration = 200 //Very. Very. Carefully.
max_duration = 300
@@ -100,9 +102,10 @@
priority = 3 //Do this instead of picking around for implants.
allowed_tools = list(
/obj/item/weapon/surgical/hemostat = 100,
- /obj/item/weapon/wirecutters = 60,
/obj/item/weapon/melee/changeling/claw = 40) //Surprisingly, claws are kind of okay at picking things out.
+ allowed_procs = list(IS_WIRECUTTER = 60)
+
min_duration = 90
max_duration = 120
@@ -216,9 +219,10 @@
priority = 3 //Do this instead of searching for objects in the skull.
allowed_tools = list(
/obj/item/weapon/surgical/hemostat = 100,
- /obj/item/weapon/wirecutters = 60,
/obj/item/weapon/melee/changeling/claw = 20) //Claws. Good for digging, not so much for moving.
+ allowed_procs = list(IS_WIRECUTTER = 60)
+
min_duration = 90
max_duration = 120
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index d54a4aff14..2f2e1cb44a 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -20,9 +20,10 @@
/datum/surgery_step/internal/remove_embryo
allowed_tools = list(
/obj/item/weapon/surgical/hemostat = 100, \
- /obj/item/weapon/wirecutters = 75, \
/obj/item/weapon/material/kitchen/utensil/fork = 20
)
+
+ allowed_procs = list(IS_WIRECUTTER = 75)
blood_level = 2
min_duration = 80
@@ -212,10 +213,11 @@
allowed_tools = list(
/obj/item/weapon/surgical/hemostat = 100, \
- /obj/item/weapon/wirecutters = 75, \
/obj/item/weapon/material/kitchen/utensil/fork = 20
)
+ allowed_procs = list(IS_WIRECUTTER = 75)
+
min_duration = 60
max_duration = 80
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index 4debf4017c..7fccfa8071 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -28,10 +28,12 @@
/datum/surgery_step/robotics/unscrew_hatch
allowed_tools = list(
- /obj/item/weapon/screwdriver = 100,
/obj/item/weapon/coin = 50,
/obj/item/weapon/material/knife = 50
)
+
+ allowed_procs = list(IS_SCREWDRIVER = 100)
+
req_open = 0
min_duration = 90
@@ -66,10 +68,11 @@
/datum/surgery_step/robotics/open_hatch
allowed_tools = list(
/obj/item/weapon/surgical/retractor = 100,
- /obj/item/weapon/crowbar = 100,
/obj/item/weapon/material/kitchen/utensil = 50
)
+ allowed_procs = list(IS_CROWBAR = 100)
+
min_duration = 30
max_duration = 40
@@ -102,10 +105,11 @@
/datum/surgery_step/robotics/close_hatch
allowed_tools = list(
/obj/item/weapon/surgical/retractor = 100,
- /obj/item/weapon/crowbar = 100,
/obj/item/weapon/material/kitchen/utensil = 50
)
+ allowed_procs = list(IS_CROWBAR = 100)
+
min_duration = 70
max_duration = 100
@@ -148,7 +152,7 @@
/datum/surgery_step/robotics/repair_brute/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(istype(tool,/obj/item/weapon/weldingtool))
+ if(istype(tool, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/welder = tool
if(!welder.isOn() || !welder.remove_fuel(1,user))
return 0
@@ -188,7 +192,7 @@
/datum/surgery_step/robotics/repair_burn/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(istype(tool,/obj/item/stack/cable_coil/))
+ if(istype(tool, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = tool
if(affected.burn_dam == 0)
to_chat(user, "There are no burnt wires here!")
@@ -229,9 +233,10 @@
allowed_tools = list(
/obj/item/stack/nanopaste = 100, \
/obj/item/weapon/surgical/bonegel = 30, \
- /obj/item/weapon/screwdriver = 70, \
)
+ allowed_procs = list(IS_SCREWDRIVER = 100)
+
min_duration = 70
max_duration = 90
@@ -348,9 +353,7 @@
///////////////////////////////////////////////////////////////
/datum/surgery_step/robotics/attach_organ_robotic
- allowed_tools = list(
- /obj/item/weapon/screwdriver = 100,
- )
+ allowed_procs = list(IS_SCREWDRIVER = 100)
min_duration = 100
max_duration = 120
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index b06221e5c9..837e10a5a0 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -10,6 +10,10 @@
// type path referencing tools that can be used for this step, and how well are they suited for it
var/list/allowed_tools = null
+
+ // List of procs that can be called if allowed_tools fails
+ var/list/allowed_procs = null
+
// type paths referencing races that this step applies to.
var/list/allowed_species = null
var/list/disallowed_species = null
@@ -23,55 +27,73 @@
//How much blood this step can get on surgeon. 1 - hands, 2 - full body.
var/blood_level = 0
- //returns how well tool is suited for this step
- proc/tool_quality(obj/item/tool)
- for (var/T in allowed_tools)
- if (istype(tool,T))
- return allowed_tools[T]
+//returns how well tool is suited for this step
+/datum/surgery_step/proc/tool_quality(obj/item/tool)
+ for (var/T in allowed_tools)
+ if (istype(tool,T))
+ return allowed_tools[T]
+
+ for(var/P in allowed_procs)
+ switch(P)
+ if(IS_SCREWDRIVER)
+ if(tool.is_screwdriver())
+ return allowed_procs[P]
+ if(IS_CROWBAR)
+ if(tool.is_crowbar())
+ return allowed_procs[P]
+ if(IS_WIRECUTTER)
+ if(tool.is_wirecutter())
+ return allowed_procs[P]
+ if(IS_WRENCH)
+ if(tool.is_wrench())
+ return allowed_procs[P]
+ return 0
+
+
+// Checks if this step applies to the user mob at all
+/datum/surgery_step/proc/is_valid_target(mob/living/carbon/human/target)
+ if(!hasorgans(target))
return 0
- // Checks if this step applies to the user mob at all
- proc/is_valid_target(mob/living/carbon/human/target)
- if(!hasorgans(target))
- return 0
+ if(allowed_species)
+ for(var/species in allowed_species)
+ if(target.species.get_bodytype() == species)
+ return 1
- if(allowed_species)
- for(var/species in allowed_species)
- if(target.species.get_bodytype() == species)
- return 1
+ if(disallowed_species)
+ for(var/species in disallowed_species)
+ if(target.species.get_bodytype() == species)
+ return 0
- if(disallowed_species)
- for(var/species in disallowed_species)
- if(target.species.get_bodytype() == species)
- return 0
-
- return 1
+ return 1
- // checks whether this step can be applied with the given user and target
- proc/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return 0
+// checks whether this step can be applied with the given user and target
+/datum/surgery_step/proc/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return 0
- // does stuff to begin the step, usually just printing messages. Moved germs transfering and bloodying here too
- proc/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (can_infect && affected)
- spread_germs_to_organ(affected, user)
- if (ishuman(user) && prob(60))
- var/mob/living/carbon/human/H = user
- if (blood_level)
- H.bloody_hands(target,0)
- if (blood_level > 1)
- H.bloody_body(target,0)
- return
+// does stuff to begin the step, usually just printing messages. Moved germs transfering and bloodying here too
+/datum/surgery_step/proc/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (can_infect && affected)
+ spread_germs_to_organ(affected, user)
+ if (ishuman(user) && prob(60))
+ var/mob/living/carbon/human/H = user
+ if (blood_level)
+ H.bloody_hands(target,0)
+ if (blood_level > 1)
+ H.bloody_body(target,0)
+ return
+
+// does stuff to end the step, which is normally print a message + do whatever this step changes
+/datum/surgery_step/proc/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return
+
+// stuff that happens when the step fails
+/datum/surgery_step/proc/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return null
- // does stuff to end the step, which is normally print a message + do whatever this step changes
- proc/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return
- // stuff that happens when the step fails
- proc/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return null
/proc/spread_germs_to_organ(var/obj/item/organ/external/E, var/mob/living/carbon/human/user)
if(!istype(user) || !istype(E)) return
diff --git a/code/modules/surgery/~defines.dm b/code/modules/surgery/~defines.dm
index 6b27ac56f5..61f9b143f2 100644
--- a/code/modules/surgery/~defines.dm
+++ b/code/modules/surgery/~defines.dm
@@ -1 +1 @@
-#undef SURGERY_FAILURE
+#undef SURGERY_FAILURE
\ No newline at end of file
diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm
index 5a49797262..af34ab6b2b 100644
--- a/code/modules/tables/tables.dm
+++ b/code/modules/tables/tables.dm
@@ -89,15 +89,15 @@
if(health < maxhealth)
switch(health / maxhealth)
if(0.0 to 0.5)
- user << "It looks severely damaged!"
+ to_chat(user, "It looks severely damaged!")
if(0.25 to 0.5)
- user << "It looks damaged!"
+ to_chat(user, "It looks damaged!")
if(0.5 to 1.0)
- user << "It has a few scrapes and dents."
+ to_chat(user, "It has a few scrapes and dents.")
/obj/structure/table/attackby(obj/item/weapon/W, mob/user)
- if(reinforced && istype(W, /obj/item/weapon/screwdriver))
+ if(reinforced && W.is_screwdriver())
remove_reinforced(W, user)
if(!reinforced)
update_desc()
@@ -105,7 +105,7 @@
update_material()
return 1
- if(carpeted && istype(W, /obj/item/weapon/crowbar))
+ if(carpeted && W.is_crowbar())
user.visible_message("\The [user] removes the carpet from \the [src].",
"You remove the carpet from \the [src].")
new /obj/item/stack/tile/carpet(loc)
@@ -122,9 +122,9 @@
update_icon()
return 1
else
- user << "You don't have enough carpet!"
+ to_chat(user, "You don't have enough carpet!")
- if(!reinforced && !carpeted && material && istype(W, /obj/item/weapon/wrench))
+ if(!reinforced && !carpeted && material && W.is_wrench())
remove_material(W, user)
if(!material)
update_connections(1)
@@ -135,14 +135,14 @@
update_material()
return 1
- if(!carpeted && !reinforced && !material && istype(W, /obj/item/weapon/wrench))
+ if(!carpeted && !reinforced && !material && W.is_wrench())
dismantle(W, user)
return 1
if(health < maxhealth && istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/F = W
if(F.welding)
- user << "You begin reparing damage to \the [src]."
+ to_chat(user, "You begin reparing damage to \the [src].")
playsound(src, F.usesound, 50, 1)
if(!do_after(user, 20 * F.toolspeed) || !F.remove_fuel(1, user))
return
@@ -197,19 +197,19 @@
/obj/structure/table/proc/reinforce_table(obj/item/stack/material/S, mob/user)
if(reinforced)
- user << "\The [src] is already reinforced!"
+ to_chat(user, "\The [src] is already reinforced!")
return
if(!can_reinforce)
- user << "\The [src] cannot be reinforced!"
+ to_chat(user, "\The [src] cannot be reinforced!")
return
if(!material)
- user << "Plate \the [src] before reinforcing it!"
+ to_chat(user, "Plate \the [src] before reinforcing it!")
return
if(flipped)
- user << "Put \the [src] back in place before reinforcing it!"
+ to_chat(user, "Put \the [src] back in place before reinforcing it!")
return
reinforced = common_material_add(S, user, "reinforc")
@@ -234,12 +234,12 @@
/obj/structure/table/proc/common_material_add(obj/item/stack/material/S, mob/user, verb) // Verb is actually verb without 'e' or 'ing', which is added. Works for 'plate'/'plating' and 'reinforce'/'reinforcing'.
var/material/M = S.get_material()
if(!istype(M))
- user << "You cannot [verb]e \the [src] with \the [S]."
+ to_chat(user, "You cannot [verb]e \the [src] with \the [S].")
return null
if(manipulating) return M
manipulating = 1
- user << "You begin [verb]ing \the [src] with [M.display_name]."
+ to_chat(user, "You begin [verb]ing \the [src] with [M.display_name].")
if(!do_after(user, 20) || !S.use(1))
manipulating = 0
return null
@@ -250,7 +250,7 @@
// Returns the material to set the table to.
/obj/structure/table/proc/common_material_remove(mob/user, material/M, delay, what, type_holding, sound)
if(!M.stack_type)
- user << "You are unable to remove the [what] from this [src]!"
+ to_chat(user, "You are unable to remove the [what] from this [src]!")
return M
if(manipulating) return M
@@ -268,13 +268,13 @@
manipulating = 0
return null
-/obj/structure/table/proc/remove_reinforced(obj/item/weapon/screwdriver/S, mob/user)
+/obj/structure/table/proc/remove_reinforced(obj/item/weapon/S, mob/user)
reinforced = common_material_remove(user, reinforced, 40 * S.toolspeed, "reinforcements", "screws", S.usesound)
-/obj/structure/table/proc/remove_material(obj/item/weapon/wrench/W, mob/user)
+/obj/structure/table/proc/remove_material(obj/item/weapon/W, mob/user)
material = common_material_remove(user, material, 20 * W.toolspeed, "plating", "bolts", W.usesound)
-/obj/structure/table/proc/dismantle(obj/item/weapon/wrench/W, mob/user)
+/obj/structure/table/proc/dismantle(obj/item/W, mob/user)
if(manipulating) return
manipulating = 1
user.visible_message("\The [user] begins dismantling \the [src].",
@@ -459,7 +459,8 @@
*/
/proc/dirs_to_corner_states(list/dirs)
- if(!istype(dirs)) return
+ if(!istype(dirs))
+ return
var/list/ret = list(NORTHWEST, SOUTHEAST, NORTHEAST, SOUTHWEST)
diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm
index f9c14af3a5..e8927197dc 100644
--- a/code/modules/vehicles/cargo_train.dm
+++ b/code/modules/vehicles/cargo_train.dm
@@ -63,7 +63,7 @@
return ..()
/obj/vehicle/train/cargo/trolley/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(open && istype(W, /obj/item/weapon/wirecutters))
+ if(open && W.is_wirecutter())
passenger_allowed = !passenger_allowed
user.visible_message("[user] [passenger_allowed ? "cuts" : "mends"] a cable in [src].","You [passenger_allowed ? "cut" : "mend"] the load limiter cable.")
else
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index 13dc84f0e4..3180ace629 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -118,13 +118,13 @@
if(istype(W, /obj/item/weapon/hand_labeler))
return
if(mechanical)
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
if(!locked)
open = !open
update_icon()
- user << "Maintenance panel is now [open ? "opened" : "closed"]."
+ to_chat(user, "Maintenance panel is now [open ? "opened" : "closed"].")
playsound(src, W.usesound, 50, 1)
- else if(istype(W, /obj/item/weapon/crowbar) && cell && open)
+ else if(W.is_crowbar() && cell && open)
remove_cell(user)
else if(istype(W, /obj/item/weapon/cell) && !cell && open)
@@ -139,11 +139,11 @@
playsound(src, T.usesound, 50, 1)
user.visible_message("[user] repairs [src]!"," You repair [src]!")
else
- user << "Unable to repair with the maintenance panel closed."
+ to_chat(user, "Unable to repair with the maintenance panel closed.")
else
- user << "[src] does not need a repair."
+ to_chat(user, "[src] does not need a repair.")
else
- user << "Unable to repair while [src] is off."
+ to_chat(user, "Unable to repair while [src] is off.")
else if(hasvar(W,"force") && hasvar(W,"damtype"))
user.setClickCooldown(user.get_attack_speed(W))
@@ -237,7 +237,7 @@
emagged = 1
if(locked)
locked = 0
- user << "You bypass [src]'s controls."
+ to_chat(user, "You bypass [src]'s controls.")
return TRUE
/obj/vehicle/proc/explode()
@@ -300,7 +300,7 @@
C.forceMove(src)
cell = C
powercheck()
- usr << "You install [C] in [src]."
+ to_chat(usr, "You install [C] in [src].")
/obj/vehicle/proc/remove_cell(var/mob/living/carbon/human/H)
if(!mechanical)
@@ -308,7 +308,7 @@
if(!cell)
return
- usr << "You remove [cell] from [src]."
+ to_chat(usr, "You remove [cell] from [src].")
cell.forceMove(get_turf(H))
H.put_in_hands(cell)
cell = null
diff --git a/code/modules/virus2/centrifuge.dm b/code/modules/virus2/centrifuge.dm
index 026bea5e5d..7b7da04116 100644
--- a/code/modules/virus2/centrifuge.dm
+++ b/code/modules/virus2/centrifuge.dm
@@ -9,8 +9,8 @@
var/obj/item/weapon/reagent_containers/glass/beaker/vial/sample = null
var/datum/disease2/disease/virus2 = null
-/obj/machinery/computer/centrifuge/attackby(var/obj/O as obj, var/mob/user as mob)
- if(istype(O, /obj/item/weapon/screwdriver))
+/obj/machinery/computer/centrifuge/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(O.is_screwdriver())
return ..(O,user)
if(default_unfasten_wrench(user, O, 20))
@@ -18,7 +18,7 @@
if(istype(O,/obj/item/weapon/reagent_containers/glass/beaker/vial))
if(sample)
- user << "\The [src] is already loaded."
+ to_chat(user, "\The [src] is already loaded.")
return
sample = O
diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm
index d9a875050d..31cb84d665 100644
--- a/code/modules/virus2/diseasesplicer.dm
+++ b/code/modules/virus2/diseasesplicer.dm
@@ -11,8 +11,8 @@
var/splicing = 0
var/scanning = 0
-/obj/machinery/computer/diseasesplicer/attackby(var/obj/I as obj, var/mob/user as mob)
- if(istype(I, /obj/item/weapon/screwdriver))
+/obj/machinery/computer/diseasesplicer/attackby(var/obj/item/I as obj, var/mob/user as mob)
+ if(I.is_screwdriver())
return ..(I,user)
if(default_unfasten_wrench(user, I, 20))
@@ -21,7 +21,7 @@
if(istype(I,/obj/item/weapon/virusdish))
var/mob/living/carbon/c = user
if (dish)
- user << "\The [src] is already loaded."
+ to_chat(user, "\The [src] is already loaded.")
return
dish = I
@@ -29,7 +29,7 @@
I.loc = src
if(istype(I,/obj/item/weapon/diseasedisk))
- user << "You upload the contents of the disk onto the buffer."
+ to_chat(user, "You upload the contents of the disk onto the buffer.")
memorybank = I:effect
species_buffer = I:species
analysed = I:analysed
diff --git a/code/modules/xenoarcheaology/artifacts/replicator.dm b/code/modules/xenoarcheaology/artifacts/replicator.dm
index c14bbb12a3..a0f0ab92da 100644
--- a/code/modules/xenoarcheaology/artifacts/replicator.dm
+++ b/code/modules/xenoarcheaology/artifacts/replicator.dm
@@ -45,7 +45,7 @@
/obj/item/weapon/material/knife/butch,
/obj/item/weapon/caution,
/obj/item/weapon/caution/cone,
- /obj/item/weapon/crowbar,
+ /obj/item/weapon/tool/crowbar,
/obj/item/weapon/clipboard,
/obj/item/weapon/cell,
/obj/item/weapon/surgical/circular_saw,
@@ -59,9 +59,9 @@
/obj/item/weapon/pickaxe,
/obj/item/weapon/shovel,
/obj/item/weapon/weldingtool,
- /obj/item/weapon/wirecutters,
- /obj/item/weapon/wrench,
- /obj/item/weapon/screwdriver,
+ /obj/item/weapon/tool/wirecutters,
+ /obj/item/weapon/tool/wrench,
+ /obj/item/weapon/tool/screwdriver,
/obj/item/weapon/grenade/chem_grenade/cleaner,
/obj/item/weapon/grenade/chem_grenade/metalfoam)
@@ -125,6 +125,9 @@
user << browse(dat, "window=alien_replicator")
/obj/machinery/replicator/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
+ if(!W.canremove || !user.canUnEquip(W)) //No armblades, no grabs. No other-thing-I-didn't-think-of.
+ to_chat(user, "You cannot put \the [W] into the machine.")
+ return
user.drop_item()
W.loc = src
stored_materials.Add(W)
diff --git a/code/modules/xenoarcheaology/finds/find_spawning.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm
index 42e8408c45..39cf1776e6 100644
--- a/code/modules/xenoarcheaology/finds/find_spawning.dm
+++ b/code/modules/xenoarcheaology/finds/find_spawning.dm
@@ -146,11 +146,11 @@
if(13)
item_type = "tool"
if(prob(25))
- new_item = new /obj/item/weapon/wrench(src.loc)
+ new_item = new /obj/item/weapon/tool/wrench(src.loc)
else if(prob(25))
- new_item = new /obj/item/weapon/crowbar(src.loc)
+ new_item = new /obj/item/weapon/tool/crowbar(src.loc)
else
- new_item = new /obj/item/weapon/screwdriver(src.loc)
+ new_item = new /obj/item/weapon/tool/screwdriver(src.loc)
additional_desc = "[pick("It doesn't look safe.",\
"You wonder what it was used for",\
"There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains on it")]."
@@ -417,11 +417,11 @@
var/list/alien_stuff = list(
/obj/item/device/multitool/alien,
/obj/item/stack/cable_coil/alien,
- /obj/item/weapon/crowbar/alien,
- /obj/item/weapon/screwdriver/alien,
+ /obj/item/weapon/tool/crowbar/alien,
+ /obj/item/weapon/tool/screwdriver/alien,
/obj/item/weapon/weldingtool/alien,
- /obj/item/weapon/wirecutters/alien,
- /obj/item/weapon/wrench/alien,
+ /obj/item/weapon/tool/wirecutters/alien,
+ /obj/item/weapon/tool/wrench/alien,
/obj/item/weapon/surgical/FixOVein/alien,
/obj/item/weapon/surgical/bone_clamp/alien,
/obj/item/weapon/surgical/cautery/alien,
diff --git a/code/modules/xenoarcheaology/finds/misc.dm b/code/modules/xenoarcheaology/finds/misc.dm
index 129033bf6e..04e7b788de 100644
--- a/code/modules/xenoarcheaology/finds/misc.dm
+++ b/code/modules/xenoarcheaology/finds/misc.dm
@@ -13,9 +13,6 @@
if(prob(30))
icon_state = "crystal2"
set_light(3, 3, "#CC00CC")
- else if(prob(30))
- icon_state = "crystal3"
- set_light(3, 3, "#FF003B")
else
set_light(3, 3, "#33CC33")
diff --git a/code/modules/xenoarcheaology/misc.dm b/code/modules/xenoarcheaology/misc.dm
index c85c89ee49..0f51e4fd77 100644
--- a/code/modules/xenoarcheaology/misc.dm
+++ b/code/modules/xenoarcheaology/misc.dm
@@ -41,8 +41,8 @@
/obj/structure/bookcase/manuals/xenoarchaeology
name = "Xenoarchaeology Manuals bookcase"
-/obj/structure/bookcase/manuals/xenoarchaeology/New()
- ..()
+/obj/structure/bookcase/manuals/xenoarchaeology/initialize()
+ . = ..()
new /obj/item/weapon/book/manual/excavation(src)
new /obj/item/weapon/book/manual/mass_spectrometry(src)
new /obj/item/weapon/book/manual/materials_chemistry_analysis(src)
@@ -53,23 +53,22 @@
/obj/structure/closet/secure_closet/xenoarchaeologist
name = "Xenoarchaeologist Locker"
- req_access = list(access_tox_storage)
icon_state = "secureres1"
icon_closed = "secureres"
icon_locked = "secureres1"
icon_opened = "secureresopen"
icon_broken = "secureresbroken"
icon_off = "secureresoff"
+ req_access = list(access_tox_storage)
-/obj/structure/closet/secure_closet/xenoarchaeologist/New()
- ..()
- new /obj/item/clothing/under/rank/scientist(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/glasses/science(src)
- new /obj/item/device/radio/headset/headset_sci(src)
- new /obj/item/weapon/storage/belt/archaeology(src)
- new /obj/item/weapon/storage/excavation(src)
+ starts_with = list(
+ /obj/item/clothing/under/rank/scientist,
+ /obj/item/clothing/suit/storage/toggle/labcoat,
+ /obj/item/clothing/shoes/white,
+ /obj/item/clothing/glasses/science,
+ /obj/item/device/radio/headset/headset_sci,
+ /obj/item/weapon/storage/belt/archaeology,
+ /obj/item/weapon/storage/excavation)
/obj/structure/closet/excavation
name = "Excavation tools"
@@ -77,23 +76,22 @@
icon_closed = "toolcloset"
icon_opened = "toolclosetopen"
-/obj/structure/closet/excavation/New()
- ..()
- new /obj/item/weapon/storage/belt/archaeology(src)
- new /obj/item/weapon/storage/excavation(src)
- new /obj/item/device/flashlight/lantern(src)
- new /obj/item/device/ano_scanner(src)
- new /obj/item/device/depth_scanner(src)
- new /obj/item/device/core_sampler(src)
- new /obj/item/device/gps(src)
- new /obj/item/device/beacon_locator(src)
- new /obj/item/device/radio/beacon(src)
- new /obj/item/clothing/glasses/meson(src)
- new /obj/item/weapon/pickaxe(src)
- new /obj/item/device/measuring_tape(src)
- new /obj/item/weapon/pickaxe/hand(src)
- new /obj/item/weapon/storage/bag/fossils(src)
- new /obj/item/weapon/hand_labeler(src)
+ starts_with = list(
+ /obj/item/weapon/storage/belt/archaeology,
+ /obj/item/weapon/storage/excavation,
+ /obj/item/device/flashlight/lantern,
+ /obj/item/device/ano_scanner,
+ /obj/item/device/depth_scanner,
+ /obj/item/device/core_sampler,
+ /obj/item/device/gps,
+ /obj/item/device/beacon_locator,
+ /obj/item/device/radio/beacon,
+ /obj/item/clothing/glasses/meson,
+ /obj/item/weapon/pickaxe,
+ /obj/item/device/measuring_tape,
+ /obj/item/weapon/pickaxe/hand,
+ /obj/item/weapon/storage/bag/fossils,
+ /obj/item/weapon/hand_labeler)
/obj/machinery/alarm/isolation
req_one_access = list(access_research, access_atmospherics, access_engine_equip)
diff --git a/code/modules/xenoarcheaology/tools/equipment.dm b/code/modules/xenoarcheaology/tools/equipment.dm
index 1c2b1f9773..5bc7694df5 100644
--- a/code/modules/xenoarcheaology/tools/equipment.dm
+++ b/code/modules/xenoarcheaology/tools/equipment.dm
@@ -1,8 +1,10 @@
/obj/item/clothing/suit/bio_suit/anomaly
name = "Anomaly suit"
desc = "A sealed bio suit capable of insulating against exotic alien energies."
+ icon = 'icons/obj/clothing/spacesuits.dmi'
icon_state = "engspace_suit"
item_state = "engspace_suit"
+ update_icon_define = "icons/mob/spacesuit.dmi"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
/obj/item/clothing/head/bio_hood/anomaly
diff --git a/code/modules/xenoarcheaology/tools/suspension_generator.dm b/code/modules/xenoarcheaology/tools/suspension_generator.dm
index ac56f7de92..c85307f3ee 100644
--- a/code/modules/xenoarcheaology/tools/suspension_generator.dm
+++ b/code/modules/xenoarcheaology/tools/suspension_generator.dm
@@ -24,7 +24,7 @@
M.weakened = max(M.weakened, 3)
cell.charge -= power_use
if(prob(5))
- M << "[pick("You feel tingly","You feel like floating","It is hard to speak","You can barely move")]."
+ to_chat(M, "[pick("You feel tingly","You feel like floating","It is hard to speak","You can barely move")].")
for(var/obj/item/I in T)
if(!suspension_field.contents.len)
@@ -81,7 +81,7 @@
if(anchored)
activate()
else
- usr << "You are unable to activate [src] until it is properly secured on the ground."
+ to_chat(usr, "You are unable to activate [src] until it is properly secured on the ground.")
else
deactivate()
else if(href_list["insertcard"])
@@ -91,9 +91,9 @@
I.loc = src
auth_card = I
if(attempt_unlock(I, usr))
- usr << "You insert [I], the console flashes \'Access granted.\'"
+ to_chat(usr, "You insert [I], the console flashes \'Access granted.\'")
else
- usr << "You insert [I], the console flashes \'Access denied.\'"
+ to_chat(usr, "You insert [I], the console flashes \'Access denied.\'")
else if(href_list["ejectcard"])
if(auth_card)
if(ishuman(usr))
@@ -122,44 +122,44 @@
icon_state = "suspension0"
cell = null
- user << "You remove the power cell"
+ to_chat(user, "You remove the power cell")
/obj/machinery/suspension_gen/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(!locked && !suspension_field && default_deconstruction_screwdriver(user, W))
return
- else if (istype(W, /obj/item/weapon/wrench))
+ else if(W.is_wrench())
if(!suspension_field)
if(anchored)
anchored = 0
else
anchored = 1
playsound(loc, W.usesound, 50, 1)
- user << "You wrench the stabilising legs [anchored ? "into place" : "up against the body"]."
+ to_chat(user, "You wrench the stabilising legs [anchored ? "into place" : "up against the body"].")
if(anchored)
desc = "It is resting securely on four stubby legs."
else
desc = "It has stubby legs bolted up against it's body for stabilising."
else
- user << "You are unable to secure [src] while it is active!"
+ to_chat(user, "You are unable to secure [src] while it is active!")
else if (istype(W, /obj/item/weapon/cell))
if(panel_open)
if(cell)
- user << "There is a power cell already installed."
+ to_chat(user, "There is a power cell already installed.")
else
user.drop_item()
W.loc = src
cell = W
- user << "You insert the power cell."
+ to_chat(user, "You insert the power cell.")
icon_state = "suspension1"
else if(istype(W, /obj/item/weapon/card))
var/obj/item/weapon/card/I = W
if(!auth_card)
if(attempt_unlock(I, user))
- user << "You swipe [I], the console flashes \'Access granted.\'"
+ to_chat(user, "You swipe [I], the console flashes \'Access granted.\'")
else
- user << "You swipe [I], console flashes \'Access denied.\'"
+ to_chat(user, "You swipe [I], console flashes \'Access denied.\'")
else
- user << "Remove [auth_card] first."
+ to_chat(user, "Remove [auth_card] first.")
/obj/machinery/suspension_gen/proc/attempt_unlock(var/obj/item/weapon/card/C, var/mob/user)
if(!panel_open)
@@ -207,7 +207,7 @@
var/turf/T = get_turf(suspension_field)
for(var/mob/living/M in T)
- M << "You no longer feel like floating."
+ to_chat(M, "You no longer feel like floating.")
M.weakened = min(M.weakened, 3)
src.visible_message("\icon[src] [src] deactivates with a gentle shudder.")
@@ -225,7 +225,7 @@
set category = "Object"
if(anchored)
- usr << "You cannot rotate [src], it has been firmly fixed to the floor."
+ to_chat(usr, "You cannot rotate [src], it has been firmly fixed to the floor.")
else
set_dir(turn(dir, 90))
@@ -235,7 +235,7 @@
set category = "Object"
if(anchored)
- usr << "You cannot rotate [src], it has been firmly fixed to the floor."
+ to_chat(usr, "You cannot rotate [src], it has been firmly fixed to the floor.")
else
set_dir(turn(dir, -90))
diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm
index 5f8c30ecad..78a1a992e7 100644
--- a/code/modules/xenoarcheaology/tools/tools.dm
+++ b/code/modules/xenoarcheaology/tools/tools.dm
@@ -257,7 +257,7 @@
if(processing_objects.Find(src))
//scan radios in the world to try and find one
var/cur_dist = 999
- for(var/obj/item/device/radio/beacon/R in world)
+ for(var/obj/item/device/radio/beacon/R in all_beacons)
if(R.z == src.z && R.frequency == src.frequency)
var/check_dist = get_dist(src,R)
if(check_dist < cur_dist)
diff --git a/code/modules/xenobio2/machinery/core_extractor.dm b/code/modules/xenobio2/machinery/core_extractor.dm
index e772558fcc..8bb5bc42fb 100644
--- a/code/modules/xenobio2/machinery/core_extractor.dm
+++ b/code/modules/xenobio2/machinery/core_extractor.dm
@@ -32,16 +32,16 @@
/obj/machinery/slime/extractor/attackby(var/obj/item/W, var/mob/user)
//Let's try to deconstruct first.
- if(istype(W, /obj/item/weapon/screwdriver) && !inuse)
+ if(W.is_screwdriver() && !inuse)
default_deconstruction_screwdriver(user, W)
return
- if(istype(W, /obj/item/weapon/crowbar))
+ if(W.is_crowbar())
default_deconstruction_crowbar(user, W)
return
if(panel_open)
- user << "Close the panel first!"
+ to_chat(user, "Close the panel first!")
var/obj/item/weapon/grab/G = W
@@ -49,7 +49,7 @@
return ..()
if(G.state < 2)
- user << "You need a better grip to do that!"
+ to_chat(user, "You need a better grip to do that!")
return
move_into_extractor(user,G.affecting)
@@ -62,20 +62,20 @@
/obj/machinery/slime/extractor/proc/move_into_extractor(var/mob/user,var/mob/living/victim)
if(src.occupant)
- user << "The core extractor is full, empty it first!"
+ to_chat(user, "The core extractor is full, empty it first!")
return
if(inuse)
- user << "The core extractor is locked and running, wait for it to finish."
+ to_chat(user, "The core extractor is locked and running, wait for it to finish.")
return
- if(!(istype(victim, /mob/living/simple_animal/xeno/slime)) )
- user << "This is not a suitable subject for the core extractor!"
+ if(!(istype(victim, /mob/living/simple_animal/xeno/slime)))
+ to_chat(user, "This is not a suitable subject for the core extractor!")
return
var/mob/living/simple_animal/xeno/slime/S = victim
if(S.is_child)
- user << "This subject is not developed enough for the core extractor!"
+ to_chat(user, "This subject is not developed enough for the core extractor!")
return
user.visible_message("[user] starts to put [victim] into the core extractor!")
diff --git a/code/modules/xenobio2/machinery/gene_manipulators.dm b/code/modules/xenobio2/machinery/gene_manipulators.dm
index 98c2fa8160..da12c49d68 100644
--- a/code/modules/xenobio2/machinery/gene_manipulators.dm
+++ b/code/modules/xenobio2/machinery/gene_manipulators.dm
@@ -24,7 +24,7 @@
if(genes.len)
var/choice = alert(user, "Are you sure you want to wipe the disk?", "Xenobiological Data", "No", "Yes")
if(src && user && genes && choice && choice == "Yes" && user.Adjacent(get_turf(src)))
- user << "You wipe the disk data."
+ to_chat(user, "You wipe the disk data.")
name = initial(name)
desc = initial(name)
genes = list()
@@ -67,24 +67,24 @@
return
if(istype(W,/obj/item/weapon/disk/xenobio))
if(loaded_disk)
- user << "There is already a data disk loaded."
+ to_chat(user, "There is already a data disk loaded.")
return
else
var/obj/item/weapon/disk/xenobio/B = W
if(B.genes && B.genes.len)
if(!disk_needs_genes)
- user << "That disk already has gene data loaded."
+ to_chat(user, "That disk already has gene data loaded.")
return
else
if(disk_needs_genes)
- user << "That disk does not have any gene data loaded."
+ to_chat(user, "That disk does not have any gene data loaded.")
return
user.drop_from_inventory(W)
W.forceMove(src)
loaded_disk = W
- user << "You load [W] into [src]."
+ to_chat(user, "You load [W] into [src].")
return
..()
@@ -137,14 +137,14 @@
/obj/machinery/xenobio/extractor/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/xenoproduct))
if(product)
- user << "There is already a xenobiological product loaded."
+ to_chat(user, "There is already a xenobiological product loaded.")
return
else
var/obj/item/xenoproduct/B = W
user.drop_from_inventory(B)
B.forceMove(src)
product = B
- user << "You load [B] into [src]."
+ to_chat(user, "You load [B] into [src].")
return
..()
@@ -280,7 +280,7 @@
if(istype(W,/obj/item/weapon/grab))
var/obj/item/weapon/grab/G = W
if(occupant)
- user << "There is already an organism loaded."
+ to_chat(user, "There is already an organism loaded.")
return
else
if(isxeno(G.affecting))
@@ -289,9 +289,9 @@
user.drop_from_inventory(G)
X.forceMove(src)
occupant = X
- user << "You load [X] into [src]."
+ to_chat(user, "You load [X] into [src]."
else
- user << "This specimen is incompatible with the machinery!"
+ to_chat(user, "This specimen is incompatible with the machinery!")
return
..()
@@ -374,15 +374,15 @@
/obj/machinery/xenobio/editor/proc/move_into_editor(var/mob/user,var/mob/living/victim)
if(src.occupant)
- user << "The [src] is full, empty it first!"
+ to_chat(user, "The [src] is full, empty it first!")
return
if(in_use)
- user << "The [src] is locked and running, wait for it to finish."
+ to_chat(user, "The [src] is locked and running, wait for it to finish.")
return
if(!(istype(victim, /mob/living/simple_animal/xeno/slime)) )
- user << "This is not a suitable subject for the [src]!"
+ to_chat(user, "This is not a suitable subject for the [src]!")
return
user.visible_message("[user] starts to put [victim] into the [src]!")
diff --git a/code/modules/xenobio2/machinery/injector.dm b/code/modules/xenobio2/machinery/injector.dm
index dc9bad89f1..c181f1f104 100644
--- a/code/modules/xenobio2/machinery/injector.dm
+++ b/code/modules/xenobio2/machinery/injector.dm
@@ -93,11 +93,11 @@
/obj/machinery/xenobio2/manualinjector/attackby(var/obj/item/W, var/mob/user)
//Let's try to deconstruct first.
- if(istype(W, /obj/item/weapon/screwdriver))
+ if(W.is_screwdriver())
default_deconstruction_screwdriver(user, W)
return
- if(istype(W, /obj/item/weapon/crowbar) && !occupant)
+ if(W.is_crowbar() && !occupant)
default_deconstruction_crowbar(user, W)
return
diff --git a/code/modules/xenobio2/machinery/slime_replicator.dm b/code/modules/xenobio2/machinery/slime_replicator.dm
index 077e330008..8fb54929fe 100644
--- a/code/modules/xenobio2/machinery/slime_replicator.dm
+++ b/code/modules/xenobio2/machinery/slime_replicator.dm
@@ -30,11 +30,11 @@
/obj/machinery/slime/replicator/attackby(var/obj/item/W, var/mob/user)
//Let's try to deconstruct first.
- if(istype(W, /obj/item/weapon/screwdriver) && !inuse)
+ if(W.is_screwdriver() && !inuse)
default_deconstruction_screwdriver(user, W)
return
- if(istype(W, /obj/item/weapon/crowbar))
+ if(W.is_crowbar())
default_deconstruction_crowbar(user, W)
return
diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm
index c5bccc437d..5950743cf6 100644
--- a/code/unit_tests/map_tests.dm
+++ b/code/unit_tests/map_tests.dm
@@ -41,7 +41,7 @@
var/list/zs_to_test = using_map.unit_test_z_levels || list(1) //Either you set it, or you just get z1
- for(var/area/A in world)
+ for(var/area/A in all_areas)
if((A.z in zs_to_test) && !(A.type in exempt_areas))
area_test_count++
var/area_good = 1
@@ -112,9 +112,15 @@
/datum/unit_test/active_edges/start_test()
var/active_edges = air_master.active_edges.len
+ var/list/edge_log = list()
+ if(active_edges)
+ for(var/connection_edge/E in air_master.active_edges)
+ edge_log += "Active Edge [E] ([E.type])"
+ for(var/turf/T in E.connecting_turfs)
+ edge_log += "+--- Connecting Turf [T] @ [T.x], [T.y], [T.z]"
if(active_edges)
- fail("Maps contained [active_edges] active edges at round-start.")
+ fail("Maps contained [active_edges] active edges at round-start.\n" + edge_log.Join("\n"))
else
pass("No active edges.")
diff --git a/code/world.dm b/code/world.dm
index 6fb6a1a01a..bf5a43bb27 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -88,28 +88,7 @@ var/global/datum/global_init/init = new ()
if(config.generate_map)
if(using_map.perform_map_generation())
using_map.refresh_mining_turfs()
-/*
- if(config.generate_asteroid)
- // These values determine the specific area that the map is applied to.
- // Because we do not use Bay's default map, we check the config file to see if custom parameters are needed, so we need to avoid hardcoding.
- if(config.asteroid_z_levels)
- for(var/z_level in config.asteroid_z_levels)
- // In case we got fed a string instead of a number...
- z_level = text2num(z_level)
- if(!isnum(z_level))
- // If it's still not a number, we probably got fed some nonsense string.
- admin_notice("Error: ASTEROID_Z_LEVELS config wasn't given a number.")
- // Now for the actual map generating. This occurs for every z-level defined in the config.
- new /datum/random_map/automata/cave_system(null,1,1,z_level,300,300)
- // Let's add ore too.
- new /datum/random_map/noise/ore(null, 1, 1, z_level, 64, 64)
- else
- admin_notice("Error: No asteroid z-levels defined in config!")
- // Update all turfs to ensure everything looks good post-generation. Yes,
- // it's brute-forcey, but frankly the alternative is a mine turf rewrite.
- for(var/turf/simulated/mineral/M in world) // Ugh.
- M.update_icon()
-*/
+
// Create frame types.
populate_frame_types()
diff --git a/config/example/config.txt b/config/example/config.txt
index 23c5818162..d9d73c6ccb 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -243,8 +243,8 @@ GUEST_BAN
## Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR
ALLOW_HOLIDAYS
-##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother.
-TICKLAG 0.9
+##Defines the ticklag for the world. 0.6 is the normal one, 0.5 is smoother
+TICKLAG 0.6
## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered.
TICKCOMP 0
@@ -401,4 +401,10 @@ STARLIGHT 0
#DEFAULT_BRAIN_HEALTH 400
## Default language prefix keys, separated with spaces. Only single character keys are supported. If unset, defaults to , # and -
-# DEFAULT_LANGUAGE_PREFIXES , # -
\ No newline at end of file
+# DEFAULT_LANGUAGE_PREFIXES , # -
+
+## Uncomment to enable the Panic Bunker by default. This will prevent all unseen-before players from connecting. Requires SQL.
+# PANIC_BUNKER
+
+## Uncomment to enable Paranoia Logging. This will notify admins and write to a file any time a new player (byond or your server) connects.
+# PARANOIA_LOGGING
diff --git a/config/names/first_name_skrell.txt b/config/names/first_name_skrell.txt
new file mode 100644
index 0000000000..122b093765
--- /dev/null
+++ b/config/names/first_name_skrell.txt
@@ -0,0 +1,600 @@
+Kaexae
+Xaaq'xuer
+Xaaq'taq
+Kae'xer
+Xeq'aeq'qerr
+Ke'xuer
+Xeteq
+Kae'xum
+Kerrker
+Kerrquex'xum
+Taeqxuq
+Kae'quex'xeu
+Keqaeq'xeu
+Ke'ter
+Xue'xerr
+Keqqux'kea
+Qerrqux
+Kerrxae'qer
+Taeqxerr
+Kerr'xum
+Kaexuer
+Qerr'xaeq'xeu
+Xue'xum
+Xeqteq'qerr
+Kerrkeax'qux
+Xaaq'qux
+Xae'xuer
+Xertaq'qux
+Xum'xuer
+Keq'taq'kea
+Keq'quex'xeu
+Qerraeq
+Xeq'xum
+Xeq'qux'xum
+Xer'xuq
+Keq'teq
+Kae'keax
+Keqxer
+Kae'xerr'xeu
+Xaequx
+Ke'teq'xum
+Xaaqxerr
+Xer'keax'kea
+Qerrxae'qux
+Xae'xer
+Qerrteq
+Xeq'xuer
+Xe'xaeq'xum
+Xeteq'qerr
+Xaaq'aeq'xeu
+Xae'xaeq'qer
+Keaeq'xum
+Xaaq'teq
+Keq'ker
+Ke'keax
+Kexum'kea
+Xeq'xum
+Qerr'xaeq'kea
+Xexum
+Taeq'xer'xe
+Qerraeq
+Xeq'keax'qux
+Xuequx
+Kexuq
+Teqxaeq'qer
+Xeqtaq'qer
+Xaexuq
+Xueaeq'qux
+Taeqxae
+Keqxuer
+Xum'aeq
+Xeqkeax'kea
+Kerrxuer
+Xaeteq
+Keqxaeq'qerr
+Xum'quex
+Taeq'teq
+Xer'xaeq
+Teq'taq
+Xe'xuq
+Kerrxer
+Kerr'xaeq'kea
+Xeqteq
+Xeqxuq'qerr
+Kerr'xum'xe
+Xe'qux
+Xexaeq
+Qerrxaeq'qer
+Teqqux'kea
+Ke'xuer
+Xerqux'xeu
+Kaexaeq'xeu
+Xeq'qux
+Xeker
+Ke'xae
+Kerrxae'qux
+Kae'aeq'qerr
+Xeq'qux'xeu
+Xeqquex'xeu
+Kerr'xaeq
+Kerr'aeq
+Xaaqxae
+Xertaq'qux
+Xaaq'ker'xum
+Kae'xuer'xe
+Xue'aeq'xeu
+Qerr'xuq
+Kequex'qerr
+Xer'ter'xe
+Qerr'ter'qerr
+Xeq'keax'qux
+Keq'ker
+Ke'qux'qerr
+Xumter'qux
+Xue'qux'xe
+Xaeaeq
+Xumxuer'xeu
+Kerr'xuq'qux
+Keq'xaeq
+Xum'xuq'xeu
+Kerr'xer
+Xae'keax
+Kequex
+Kae'qux
+Keqkeax
+Qarrker
+Xaaqker'xum
+Xue'xaeq'qux
+Taeq'xaeq'xe
+Xue'xerr
+Teqkeax
+Xaaq'keax
+Ke'xaeq'qer
+Kerrxuer
+Kaeter'qux
+Qarr'xerr
+Xerxum'qux
+Xumqux
+Taeq'teq'xeu
+Qerrxuer'qer
+Xe'ker
+Qerrter'kea
+Kaeteq'qux
+Teq'xuer'xum
+Ke'xae'xeu
+Teqxuq'qer
+Keq'xaeq
+Xaaq'xae
+Xum'xer
+Xeter
+Xaaq'quex'kea
+Kexum
+Qarrkeax'qer
+Keq'xerr
+Qarrxerr'qerr
+Qarrxerr'qer
+Xer'ker
+Xaexum'xe
+Kaexerr'qux
+Xuexum
+Xaaq'xer
+Qerr'quex
+Qerr'ker
+Xum'teq'qerr
+Kerrxaeq
+Xeq'xae
+Xue'aeq'xe
+Qarr'xuer
+Qarr'xerr'qerr
+Kaexerr'xum
+Kaeter'xum
+Xuexuq
+Xuekeax'xeu
+Xaaq'ker
+Keqxer
+Teq'xer
+Qarrker
+Xer'ter
+Xae'ter'kea
+Ke'quex'xe
+Xaeter
+Xer'xae
+Qarr'xae'xum
+Xeqxuq
+Keqter'xum
+Xeker
+Taeqxerr'qer
+Keqxer'kea
+Xumquex
+Xaaq'xuq
+Kerrxum
+Xexerr
+Xerxerr'qerr
+Xaaq'xerr
+Xum'ker'qer
+Xequx
+Xer'xae
+Kaexerr'xe
+Xe'taq
+Xeq'xuer'qerr
+Xue'taq
+Teqxer
+Xaaq'xerr'xe
+Xer'quex'xum
+Xaeaeq
+Taeqaeq
+Xaeter'qer
+Xerkeax
+Xuequex'xe
+Keqxerr
+Taeqxae'qer
+Teqqux
+Xae'quex'qux
+Xe'xum
+Xaaqxer
+Xeq'aeq'xum
+Xuexuq'qerr
+Xe'taq'qux
+Qarr'xae
+Xe'keax'qer
+Qerrxum'qerr
+Xer'xer
+Qarr'quex'qerr
+Taeq'xer'qux
+Taeqtaq
+Ke'aeq'xum
+Xueter
+Kaeker
+Xeter'kea
+Qarrter
+Qerrxae
+Xaaqxum'xeu
+Xum'xuer
+Xe'xae
+Qarrter'qer
+Kequx
+Kerr'aeq'kea
+Teq'taq'kea
+Xexum'qerr
+Qerr'quex'xeu
+Xeker'qux
+Kerr'quex'qerr
+Xum'ker'qer
+Keqxuq'xeu
+Keqxuq'xeu
+Xer'teq'xum
+Kaeker'qerr
+Xumtaq
+Xexuer
+Xueter'xum
+Kaeteq
+Ke'teq
+Qerrxuq
+Teq'xum'qerr
+Xaaq'xae
+Keter'xum
+Xeqqux
+Xae'taq
+Qerrtaq'qux
+Keq'ter
+Xaequex'xum
+Kaeter
+Xaaqtaq
+Kae'xer'qer
+Kaequx
+Kae'xum
+Taeqaeq'qux
+Kexaeq'kea
+Xer'xae'qer
+Xae'ker
+Xue'xuer
+Xeq'taq'xe
+Kaexae'qux
+Teq'xae'xe
+Teq'xuer
+Qerrqux'xeu
+Xuexaeq
+Kerr'xuq'kea
+Xerquex'kea
+Keq'ker
+Kaexum
+Kerrquex
+Kexer
+Keq'quex'qerr
+Xae'xae
+Qerr'ker
+Kexerr
+Xaaqquex
+Keq'quex'xum
+Xerter'qux
+Xuexaeq'xe
+Xae'xuq'kea
+Kae'xuer'kea
+Xer'xum'kea
+Xer'quex'kea
+Kerrxuq'qux
+Qerrxuer
+Xeq'xerr'qerr
+Qarr'xuq'qux
+Xaaq'xuq
+Xerxaeq'qux
+Xertaq
+Kerr'teq'xeu
+Xer'aeq'kea
+Xe'ter'qerr
+Teq'xae
+Kerrxerr
+Taeqxaeq
+Xueker
+Keqxae'qerr
+Taeqkeax
+Kexaeq'xum
+Xuekeax'xe
+Xumxum
+Xeq'ter'xeu
+Taeqquex
+Xer'xer
+Keqxae'xeu
+Kaexum
+Keq'xaeq
+Qerr'quex'xum
+Kaexuq'qux
+Xaequx'xe
+Kae'xum
+Keqkeax
+Kexuer
+Xeter
+Xexuq'xeu
+Xe'aeq
+Xum'keax'xe
+Xer'ker'xum
+Xerxuq'qer
+Xaekeax'xe
+Kaequex'xe
+Keqxer
+Xeker'qer
+Teqker'qerr
+Keqxer
+Teq'xer
+Xaaq'xum
+Qerrter
+Ke'xuer
+Kae'xerr'xeu
+Qarrteq'kea
+Teq'aeq'qux
+Teq'xum'qux
+Xae'xuq
+Xaekeax
+Qerr'teq
+Kerrteq'qer
+Keqxerr
+Qarr'xerr'xum
+Kekeax
+Xae'xae'kea
+Xumteq
+Xuequx'qer
+Qarr'xer
+Taeq'xuq
+Ke'xum
+Kae'xerr
+Xumxum'qerr
+Keqteq'qer
+Teqker'qerr
+Qarr'keax
+Xeqxer
+Qarrxuq'xe
+Keqkeax
+Xaaq'ter'kea
+Xaaq'aeq
+Kerr'keax
+Keqxuer
+Qerr'xerr'kea
+Qarr'teq'qerr
+Kerr'teq'qerr
+Qarr'taq'qer
+Qarrxuer'xeu
+Kae'ter
+Keaeq'xum
+Teqker'xum
+Xaaq'aeq'qux
+Keq'qux'qer
+Xae'xuq'kea
+Ke'xuq'qux
+Qerr'qux
+Xaaq'qux'qer
+Xue'keax
+Xaaqxerr'kea
+Taeqteq'xe
+Xuetaq
+Xaaqxuq'qerr
+Qerrxae'xe
+Xeqxuer
+Xeqxaeq'xum
+Xue'ker'qer
+Kekeax'xeu
+Qarr'xae'qux
+Xae'ker'qux
+Qarr'xum'xum
+Xum'xaeq'xeu
+Qerrxer'qerr
+Xaeaeq'qer
+Xaaq'quex'qerr
+Qerr'aeq
+Xum'taq
+Kerr'xum'xeu
+Xaeaeq'kea
+Taeqxerr'kea
+Taeq'qux'xum
+Xaaq'xae
+Qerr'quex
+Qarrker
+Qarr'qux'xeu
+Xaaqaeq'qux
+Xuetaq
+Xaexum
+Xae'xaeq
+Xaaq'taq'xe
+Kerrxaeq'xe
+Kae'xer'kea
+Kerr'xae'qer
+Keqxum'qer
+Qarr'taq'xe
+Taeq'quex'qer
+Xum'xuer
+Xer'xuq'qerr
+Xeqteq'xum
+Xae'xaeq
+Xaekeax'qer
+Xeq'xum
+Qarr'ter'qer
+Qarr'xerr
+Kae'xae'xum
+Taeq'xuq
+Kae'xuq'kea
+Xue'xum'qux
+Xae'xerr
+Taeq'xaeq
+Xaexuq
+Xaequx
+Keqter
+Kae'xuer
+Xaaqaeq
+Kae'taq'xeu
+Keqter'kea
+Taeqaeq
+Xae'qux
+Qerr'qux
+Qarr'xuq'kea
+Xeq'xuer
+Keqqux
+Xaaq'taq'xum
+Kae'xerr
+Xue'xae'kea
+Qarraeq
+Taeq'xum
+Qerrxer
+Teq'xum
+Xaaq'ker'xeu
+Kerr'xaeq
+Xaaq'xerr'xeu
+Xaaqxuq'xeu
+Taeqter'qer
+Teq'xuer
+Xaaqker
+Qerr'xaeq'qux
+Qerr'quex'qux
+Xaaqxerr
+Keqtaq'xeu
+Kerrxuq
+Taeqxuq'xe
+Taeq'xuq
+Xexuq'qerr
+Taeq'xae'qux
+Kerr'aeq'qer
+Teqtaq
+Qerr'taq'xeu
+Xeqxaeq'kea
+Keteq
+Qarr'quex'xeu
+Kae'xer
+Xaaqxuer
+Xum'xum
+Taeqquex'xeu
+Xue'teq
+Xumxuq
+Teqxer
+Xaeteq'xum
+Kaexum'qerr
+Xaaq'qux
+Xe'xum
+Qerr'xaeq
+Keqxaeq'xe
+Xum'xerr
+Xuexaeq'xum
+Xaaq'xum'kea
+Xumteq
+Teq'keax'xeu
+Xaequex
+Ke'ker'kea
+Xeq'xuq
+Xaaq'quex'xeu
+Teq'teq'qux
+Qarr'keax
+Xequex
+Xeqqux
+Xerxerr'xum
+Kae'teq
+Xaaq'qux'xum
+Xuetaq'qer
+Xaexerr
+Xexuer
+Xaaq'xerr'qer
+Xexae'kea
+Xaexuq'qer
+Xe'ker
+Keq'quex'kea
+Qarrqux'qux
+Xaaqtaq'kea
+Teqxae
+Teq'xuq
+Ke'aeq
+Xae'aeq
+Kerr'ter
+Xue'xuq'qer
+Ke'xaeq
+Taeq'xuer'xeu
+Xeq'xae
+Qerrkeax'kea
+Xae'xuq
+Teq'keax
+Qerr'teq'qer
+Kaexuq'xe
+Qarrxaeq'xeu
+Qerrtaq
+Xe'ker'xum
+Kaexuer
+Teqxuer'xe
+Xumxuer'kea
+Kerr'xuer
+Xer'teq'xum
+Xumteq'qerr
+Ke'quex
+Taeq'aeq'qerr
+Xue'ter'xe
+Xeq'xae'xeu
+Xer'xum
+Qarr'xae
+Qerrker'qux
+Taeq'keax'xeu
+Xum'quex'xeu
+Kae'ter
+Xe'quex'xe
+Keqxum
+Kerr'quex'qer
+Xaaqxae'qer
+Xaaqteq'qer
+Keqqux
+Teq'aeq
+Keteq
+Xumxae'xum
+Xumxum
+Qarrxaeq'kea
+Keker
+Xeq'aeq'qer
+Teqter
+Qarrxaeq'kea
+Teq'quex
+Keqxum
+Teq'xuer
+Xumter'kea
+Qarr'xae
+Xae'xuer'xeu
+Xaaqxaeq'kea
+Qerr'xuq'xeu
+Xum'xae'qux
+Xumxaeq
+Xumxum
+Kexum'xe
+Kae'aeq
+Xer'teq
+Qarrxerr'xum
+Taeq'taq
+Taeq'taq'qux
+Kaexum'xeu
+Xumtaq
+Xae'xer
+Kerr'ker
+Qarr'xum'qer
+Qerr'xuer'qux
+Xue'qux'xe
+Qerr'qux'xum
+Teqquex'qerr
+Taeqquex
+Qarrxerr
+Ketaq
+Xekeax
+Kequex
+Xetaq
+Ke'xae'xe
+Teq'quex'qux
diff --git a/config/names/last_name_skrell.txt b/config/names/last_name_skrell.txt
new file mode 100644
index 0000000000..5f67fbc536
--- /dev/null
+++ b/config/names/last_name_skrell.txt
@@ -0,0 +1,600 @@
+Xer'taq'qer
+Xaaq'ter'qux
+Xaaq'xuer
+Xerxuer'xum
+Qarrqux
+Xueaeq'qux
+Xe'aeq
+Keqter
+Xaexer
+Kaeteq
+Ke'aeq'xeu
+Kerrxum
+Teqxuq'xeu
+Xexaeq
+Qerr'xerr'xum
+Xaeker'qux
+Kexer'kea
+Ke'aeq
+Keqxae'kea
+Qarraeq'xe
+Xuekeax
+Keq'quex
+Kae'quex'qux
+Qerr'taq'xum
+Taeq'taq'xum
+Kae'xaeq'xe
+Xaaq'teq'qux
+Teqker
+Qerrxum'xeu
+Xeq'xaeq'xe
+Kae'keax
+Xue'xae
+Taeq'taq
+Keter'xeu
+Xumker'xe
+Teqteq
+Xexuer
+Qerrxerr
+Kaequex'qerr
+Kaequx'xe
+Xum'xaeq
+Xe'taq
+Xuexer
+Xe'qux'xeu
+Xe'xerr'kea
+Qerr'xum
+Xaaqtaq
+Xuexum'xum
+Qerrxer
+Xaexuq
+Xeq'aeq
+Xaaq'xaeq
+Xerqux
+Xeq'xuq'xeu
+Kaexum
+Taeqteq'xeu
+Kerrter'qux
+Xeq'teq
+Teqxae'xe
+Xae'ker'kea
+Keqxuq
+Xumxae'kea
+Xeq'xerr'kea
+Kae'quex
+Kae'ter
+Teqter'xe
+Xeq'xerr'xeu
+Xerxum'qux
+Xe'qux
+Qarr'aeq
+Xue'xum'xe
+Xaaq'ter'qux
+Teq'xer
+Kerrtaq
+Qerr'aeq
+Xaaq'aeq
+Xaaqxuer
+Qerr'quex
+Kaeker
+Xae'taq
+Teq'xaeq
+Xexuq
+Keqqux
+Kaeker
+Xeqxum
+Xae'taq'qerr
+Kexerr
+Ke'xerr'qux
+Xeraeq'xum
+Kae'qux'qux
+Xerkeax'xum
+Qarrxum
+Kaexuer
+Qerrquex
+Kerr'xer
+Xeq'taq
+Xeqker
+Kerrquex'xum
+Xeteq
+Qarrxuer
+Xaaqqux'qerr
+Xae'xer
+Xae'xae
+Taeqxuer'qerr
+Xumqux'qux
+Xuexerr'qerr
+Ke'xae'xum
+Xerxuer
+Xeqtaq
+Xeqquex
+Xuekeax
+Keq'xuq'qerr
+Xaeter
+Xumxerr
+Xeqxaeq'xe
+Xae'ker
+Qerr'ker
+Xeq'aeq
+Kae'keax
+Qerrkeax
+Xeqxerr
+Keqxaeq
+Xae'xuq
+Kerrkeax'qer
+Qarrxum'xum
+Teq'xum'xeu
+Kerrxer
+Xe'xum
+Kexae'xeu
+Xerxerr'xe
+Xum'ter
+Xe'keax
+Qarr'xer'kea
+Xaaq'aeq
+Xaaqker'qerr
+Ke'ker
+Qerr'xum
+Qerr'xae'xe
+Qarr'ter'xum
+Kaexerr
+Qarrtaq'qux
+Xumxaeq
+Xaeaeq'xe
+Qarr'xae'qux
+Xer'xum'qerr
+Kae'xuq
+Xaaq'qux'kea
+Teqtaq
+Kekeax
+Xe'keax'qerr
+Kerr'keax'qerr
+Xeqkeax
+Xer'xaeq
+Xerter'kea
+Xum'xuq'xe
+Teqaeq
+Ke'teq'qux
+Xer'xuq'kea
+Keq'xum'xeu
+Xerxuer'xeu
+Xum'keax'xum
+Xaaq'ter
+Xuetaq
+Taeq'xuer'qux
+Xuexum'xe
+Xeq'quex'kea
+Xum'xer
+Xeqaeq
+Qerr'ker
+Xumxum
+Xeqxum
+Xae'taq'qerr
+Taeq'ker
+Xue'xae'xe
+Xer'taq'xe
+Xum'xaeq
+Kaexuq'xum
+Kaexuq'qux
+Ke'xum'xum
+Qerr'xerr'xum
+Ke'xuq'qux
+Taeq'xaeq
+Xumtaq
+Xetaq
+Kaexerr'xum
+Kequx
+Xuexerr'xeu
+Xeaeq
+Keq'qux'kea
+Xeq'xaeq
+Xuexum
+Ke'xerr'xe
+Xe'xum
+Kerr'xaeq
+Xeqkeax'qux
+Kaeteq
+Xer'quex
+Teqaeq'qerr
+Xaexerr
+Xaeter
+Xumxuer'qer
+Teqxae
+Taeqtaq'qerr
+Kerr'qux
+Xuequex
+Xaaqtaq'kea
+Teq'keax
+Ke'xuer'kea
+Xum'quex'xeu
+Xaexer'kea
+Kerr'quex'xum
+Qarrxaeq'xum
+Kerr'xaeq'xeu
+Xaaq'xerr'xum
+Xeqxaeq
+Xaaqxae'xeu
+Qerrxae
+Xae'xer
+Xexer
+Qarrter'xe
+Xaaq'taq'xum
+Taeq'aeq
+Teq'xer
+Xaexae'xum
+Ke'aeq
+Teqxuer
+Qerrxuq
+Xaaq'ker
+Xeq'quex
+Kerr'qux
+Xekeax'qerr
+Kerr'qux'xum
+Ke'teq
+Qarrxae'xum
+Qerr'ter'qux
+Qerr'keax
+Taeqxuer'kea
+Qerr'xae
+Keqker'xeu
+Xueter
+Xae'teq'kea
+Xumkeax'qux
+Keq'keax
+Qarr'xerr'qux
+Xuekeax'qerr
+Taeq'xuq'xe
+Keq'aeq'xe
+Xue'xuer'qux
+Qerr'quex'qux
+Xaexerr'qux
+Qerrxaeq
+Qerr'xerr
+Qarr'xuer
+Qerrxae
+Taeq'xaeq'xeu
+Kerr'ter
+Kerrker'qux
+Kaexae'xum
+Kerrtaq'qerr
+Xae'aeq'qer
+Xer'xerr
+Kae'xuer'qux
+Qerr'xer'qerr
+Keq'taq'qer
+Taeqxer'xum
+Xaaq'xuq
+Xue'qux
+Taeq'xaeq
+Xe'teq'xe
+Teq'xuq
+Taeq'xum'qux
+Xaaqter'xum
+Taeq'taq
+Xaaqxerr'qer
+Xuetaq'qerr
+Xum'xae
+Qerrxer'xe
+Qerr'xaeq'kea
+Xeq'ker
+Xeqteq'qerr
+Kerr'aeq'qer
+Xum'teq'qerr
+Xuexuq'kea
+Xue'taq
+Xum'qux'xe
+Kerrker
+Xue'ter'xeu
+Xaexaeq
+Xaexerr'kea
+Teqtaq'kea
+Xuexuer'xe
+Xue'xae'xeu
+Taeq'quex
+Keqteq
+Kae'aeq'xum
+Teqaeq'qerr
+Xaaqxum
+Qarr'teq'qux
+Kaexer
+Xue'xum
+Qerrtaq'qer
+Taeq'teq'qux
+Xueter
+Xum'ker'xe
+Xue'keax
+Xum'quex'qerr
+Kaeaeq'qerr
+Xeqxae
+Keqxuer'xeu
+Xeqxum
+Teqxuq
+Kaeker
+Xaaq'taq
+Keqquex'kea
+Xe'ker
+Xeq'aeq'kea
+Xue'qux
+Xerxuq
+Taeq'quex
+Kequx'qux
+Xueker'qux
+Teqxum'qer
+Kerrxuq'qer
+Xerker
+Xue'xuer
+Xue'qux
+Taeq'xuq
+Keq'qux'xum
+Qarr'quex'xe
+Kae'xer'kea
+Qarr'xum'xeu
+Keqker'xum
+Ketaq
+Xue'teq
+Xuexerr
+Xeqker
+Xe'xum'xeu
+Xeq'ter'qerr
+Taeqxuq
+Kaeter
+Keq'taq
+Xum'xum
+Xumxuer'xum
+Teqter'qerr
+Keq'qux'xe
+Keq'xer'qer
+Xueaeq'xeu
+Taeqxuer'kea
+Keqxae'xeu
+Kae'taq
+Xerkeax
+Xeqker
+Kerrxer
+Taeq'xerr'xe
+Qerr'xerr'qerr
+Xe'ker'xe
+Kae'qux'qerr
+Kaequex
+Xaaq'teq'qer
+Xumxerr
+Xe'quex
+Qerr'xum'qux
+Qerrxae
+Qerrquex
+Kae'xae'qerr
+Qarrquex
+Kerrxae
+Xaaq'taq'xeu
+Qarr'xae'qux
+Xeqker
+Xaaqxuq'qer
+Xaaqter
+Xerxerr
+Xue'taq'qer
+Qarrxer'qerr
+Xae'ter'xum
+Kerrter'qerr
+Kerrter'kea
+Xae'aeq
+Xe'xer
+Teq'keax'xeu
+Kexum'xe
+Xueteq
+Kae'keax
+Xaaq'keax
+Xaaq'quex'qux
+Taeqqux
+Taeq'xum
+Xerxuer
+Qerrxer
+Xaexuer
+Teqter
+Qarr'xer
+Qarrxaeq'xum
+Ke'teq
+Teq'xae
+Kaexerr
+Qarr'teq
+Xer'ker
+Xaexuer'qux
+Xeq'qux
+Taeqxer
+Taeqxaeq
+Xumxuer
+Taeqxuer'qerr
+Kae'xuer
+Qerrter
+Taeq'aeq'kea
+Taeq'xer'xum
+Kerrter
+Xum'xuer
+Xue'ker'qux
+Xaaqter'qux
+Xue'ter'xe
+Xueteq
+Xaaq'xae
+Xaexerr'qerr
+Ke'aeq'qerr
+Xaaq'xuq'xeu
+Xuekeax
+Xumteq
+Xexuq
+Taeq'ker'xeu
+Xaaqaeq
+Qarrxum
+Xerxuq'xum
+Kaexerr
+Xeq'ter'xeu
+Keqaeq
+Xeqxuer'xum
+Teqkeax'xeu
+Kae'aeq'kea
+Ke'xerr
+Ke'xuq
+Kae'quex
+Xeqxae
+Kaeter
+Xeqxer
+Kae'xuer
+Taeqtaq'xum
+Teq'qux'xeu
+Xaequex'xum
+Qarrquex
+Xaaq'qux
+Keqquex
+Qerrker'qerr
+Xexae'xe
+Xerxae
+Xaaqker'kea
+Kexer'qerr
+Xaeaeq
+Xaaqqux
+Qarr'xer'qer
+Keq'xuq
+Kae'keax
+Qerr'teq'qer
+Kae'xaeq'qer
+Xaexer
+Kerrxer'xeu
+Kaekeax
+Xaaq'xaeq'xeu
+Xae'xae
+Qarr'keax
+Teqqux'qerr
+Xeq'ter'qerr
+Taeq'ker
+Qerrteq'xeu
+Keqqux'xeu
+Xaaqteq'qerr
+Teqteq'xe
+Xaaqter
+Xaaqkeax
+Xeqqux
+Xaaq'xerr
+Teq'ker'qerr
+Xer'taq'qerr
+Qarrxum'qux
+Xum'taq'qux
+Qarr'xer'xeu
+Xerxerr'qux
+Kerr'teq
+Xum'taq'kea
+Xaequex
+Kaeaeq'xe
+Xe'xaeq'xum
+Xuexuer'qer
+Kerrxuq
+Kerrxuer'qerr
+Kaeteq
+Xaaqxuer
+Xeq'xum'qerr
+Xumxer
+Xe'ter'xeu
+Xueaeq
+Keq'keax
+Xueter
+Xaexaeq
+Keqxaeq
+Ke'aeq
+Xumxum'qerr
+Xumxae'xum
+Xaaqxuer
+Ke'ker
+Ke'xer
+Xuekeax'qerr
+Keq'teq
+Kerr'ter'qux
+Xe'xerr
+Qerrxae
+Ke'quex'xeu
+Keqxuq
+Kerrxuer
+Keq'xae
+Qarr'xuq
+Xumxuq
+Qarr'teq'qer
+Xe'xae'xeu
+Xuexum
+Xequx
+Xaaq'teq'xum
+Xue'xuq
+Kae'quex'qer
+Qarrxer'qerr
+Xumaeq'xeu
+Qarrkeax
+Kae'xer'qux
+Xeq'qux'qer
+Xueker'qux
+Teqquex
+Xae'xaeq'xum
+Taeqkeax
+Xaaq'teq'qux
+Keqxerr'xe
+Xue'ter'xe
+Xe'xaeq
+Qerrker
+Xaexum'qer
+Keqteq'xum
+Taeq'xae'xum
+Kaexuer'qux
+Xe'ter
+Xae'taq'qux
+Qarr'aeq
+Xae'xum
+Qarrxum'xum
+Keqxer'xum
+Qarr'xerr
+Teqxae
+Ke'xae'xe
+Teqkeax'qux
+Xe'taq
+Xaetaq
+Keq'teq'kea
+Keqxaeq
+Xue'xuq
+Qarr'xerr'qer
+Xequex
+Keqxum
+Keqtaq
+Qarr'ker'xum
+Kerr'xer'qer
+Kerrxae'xum
+Xum'xae
+Kaequex'qux
+Xuequx'xe
+Xumquex'qer
+Taeqker
+Xae'quex
+Xer'teq'xe
+Xerxerr
+Ke'xuq'qer
+Taeqxerr'kea
+Xaaq'xaeq'kea
+Keq'teq
+Xue'aeq'xeu
+Xaaqxer'xeu
+Ke'ker'qerr
+Xue'quex
+Taeqtaq
+Teqter
+Kequex'xe
+Xuexuer'qerr
+Xeqxum
+Xue'taq
+Xer'xuq'qerr
+Xeqxaeq'xe
+Qerr'xaeq
+Xeqxae'qer
+Taeqtaq'kea
+Xer'teq
+Qerr'xaeq'xum
+Xaaq'xae
+Xum'xuq
+Xaaqxaeq
+Xaexum
+Xaaqxum'xe
+Xertaq
+Xuexuq'qerr
+Xaaq'xae'kea
+Qerr'teq'qer
diff --git a/html/changelog.html b/html/changelog.html
index 6f16ef8461..f3acb4a5d6 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -53,6 +53,151 @@
-->
+ 01 August 2018
+ KasparoVv updated:
+
+ - You can now change the order of your body markings at character creation. Shift markings up or down layers at will to design the character you've always wanted, more easily than ever before.
+
+ Mechoid updated:
+
+ - Added the Gigaphone. Currently unused.
+
+ Mewchild updated:
+
+ - Ports several AI core sprites from ages and places past
+
+ PrismaticGynoid updated:
+
+ - Adds four types of colorblindness to the traits in the setup menu.
+ - pAIs can now be picked up while unfolded, and can display more than 9 emotions.
+
+
+ 14 July 2018
+ Anewbe updated:
+
+ - Certain languages now require assistance for a species to speak, but not understand, much like EAL.
+ - Alai can only be `spoken` by Taj and Teshari.
+ - Adds a voicebox/larynx organ. Its only purpose at the moment is to assist in speaking certain langauges.
+ - Language implants, like the EAL implant, now affect the voicebox organ, instead of being a freefloating implant.
+ - Adds a language implant for Common Skrellian.
+
+ Atermonera updated:
+
+ - Steel sheets can be used to construct Roofing Tiles
+ - Roofing tiles can be used on tiles under open spaces or space tiles in multiZ maps to place a lattice and plating on the space above
+ - Roofing tiles can be used on outdoor turfs to make them indoors
+ - Both functions work together on multiZ maps with outdoor turfs, only one roofing tile is used per tile roofed.
+
+ Mechoid updated:
+
+ - Adds a new surgical procedure for fixing brute and burn on limbs.
+
+
+ 12 July 2018
+ Anewbe updated:
+
+ - Technomancer Apportation now properly checks for range and scepter, again.
+
+
+ 21 June 2018
+ Anewbe updated:
+
+ - Added a biomass reagent, made from protein, sugar, and phoron.
+ - Cloners and bioprinters now use the biomass reagent. Both can be refilled or have their capacity increased by replacing the bottles they spawn with.
+ - Mapped in a bioprinter, for further testing.
+ - Adds the ability to make robolimb brands more or less vulnerable to brute or burn.
+ - Makes VeyMed limbs more vulnerable to brute and burn.
+
+ Mechoid updated:
+
+ - Allow AIs to create and take control of mindless drones from fabricators.
+
+
+ 08 June 2018
+ Anewbe updated:
+
+ - Merc mobs in PoIs no longer drop gear. This is to help us balance the PoIs that contain them, and by extension every other PoI.
+ - Merc mobs have been shuffled around in their PoIs. At some point, this may actually be randomized, but for now, expect slightly different placements.
+ - Adds a laser rifle and ion rifle version of the Merc mob, for variety.
+ - PoI turrets are lethal again, and will likely shoot crawlers.
+ - Certain mobs, namely robots and mercs, now have some amount of armor.
+ - Ranged mercs will now knife people when cornered, rather than punch them really hard.
+
+ Mechoid updated:
+
+ - Added some background things for Events.
+ - Ion rifles hit the correct 3x3 instead of 5x5
+ - Seed Storage Vendors are now hackable. Can choose from various lists of concerning plants.
+
+
+ 24 May 2018
+ Anewbe updated:
+
+ - Moving items out of one's active hand cancels any zoom-in they may be providing.
+ - Meteor events should be a lot less brutal.
+
+ Arokha updated:
+
+ - Added a 'Client FPS' setting in the Global tab of character setup for adjusting the FPS to your preference.
+ - Added a 'fake SSAO' toggle to Global in character setup, ported from /tg/. Looks like drop shadows on (almost) everything.
+
+ Atermonera updated:
+
+ - Laptops no longer consume IDs indefinitely.
+
+ Mechoid updated:
+
+ - Promethean limbs store more damage.
+ - Promethean limbs, in addition to normal severing rules, have a higher chance to be splattered or ashed once they reach maximum damage.
+ - Limbs can now spread their damage to neighbors with the spread_dam var, when reaching max damage.
+
+ PrismaticGynoid updated:
+
+ - Added laser pointers. Available in your loadout, and printed and upgraded by R&D.
+
+ lorwp updated:
+
+ - Search and Rescue can now add certain medical restricted items to their loadouts
+
+
+ 01 May 2018
+ Mechoid updated:
+
+ - Skrell can be affected by flashbangs from a range of 8 tiles without protection.
+ - Promethean regen consumes additional nutrition.
+ - Many healing chemicals are less effective on Prometheans due to the natural regeneration.
+ - Lots of other Promethean tweaks. No seriously, I'm not putting the list here.
+
+ PrismaticGynoid updated:
+
+ - Adds new skrell sprites to hardsuit helmets that were missing them.
+
+
+ 28 April 2018
+ Anewbe updated:
+
+ - Communicator visibility (the thing that lets people see your communicator when you're a ghost) is now saved to character slots, rather than globally.
+ - Jobs that are set to Never on your preferences are hidden by default on the Late Join selection menu. There is a button to reveal them.
+
+ Arokha updated:
+
+ - Nerve reattaching surgery now works correctly. (Hemostat on limb)
+ - Limbs dropped by people have appropriate flags.
+
+ Atermonera updated:
+
+ - Human examine code has received a major refactor. If you encounter unusual behaviour that seems wrong, please report it.
+
+ Cerebulon updated:
+
+ - Pumpkins are no longer green ovals. They now grow on actual vines.
+
+ schnayy updated:
+
+ - Space carp plushies now load sprites and are all selectable from loadout.
+ - Adds several newer plushies to the gift vendor as well as adjusting cost of gift vendor's contents.
+
+
19 April 2018
Anewbe updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 098cc09e28..3d08f88364 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -4088,3 +4088,116 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- tweak: RD office now has its telescreen back.
lorwp:
- bugfix: Pilot headsets can now fallback to shortwave radio
+2018-04-28:
+ Anewbe:
+ - tweak: Communicator visibility (the thing that lets people see your communicator
+ when you're a ghost) is now saved to character slots, rather than globally.
+ - tweak: Jobs that are set to Never on your preferences are hidden by default on
+ the Late Join selection menu. There is a button to reveal them.
+ Arokha:
+ - bugfix: Nerve reattaching surgery now works correctly. (Hemostat on limb)
+ - bugfix: Limbs dropped by people have appropriate flags.
+ Atermonera:
+ - tweak: Human examine code has received a major refactor. If you encounter unusual
+ behaviour that seems wrong, please report it.
+ Cerebulon:
+ - bugfix: Pumpkins are no longer green ovals. They now grow on actual vines.
+ schnayy:
+ - bugfix: Space carp plushies now load sprites and are all selectable from loadout.
+ - tweak: Adds several newer plushies to the gift vendor as well as adjusting cost
+ of gift vendor's contents.
+2018-05-01:
+ Mechoid:
+ - tweak: Skrell can be affected by flashbangs from a range of 8 tiles without protection.
+ - tweak: Promethean regen consumes additional nutrition.
+ - tweak: Many healing chemicals are less effective on Prometheans due to the natural
+ regeneration.
+ - tweak: Lots of other Promethean tweaks. No seriously, I'm not putting the list
+ here.
+ PrismaticGynoid:
+ - rscadd: Adds new skrell sprites to hardsuit helmets that were missing them.
+2018-05-24:
+ Anewbe:
+ - bugfix: Moving items out of one's active hand cancels any zoom-in they may be
+ providing.
+ - tweak: Meteor events should be a lot less brutal.
+ Arokha:
+ - rscadd: Added a 'Client FPS' setting in the Global tab of character setup for
+ adjusting the FPS to your preference.
+ - rscadd: Added a 'fake SSAO' toggle to Global in character setup, ported from /tg/.
+ Looks like drop shadows on (almost) everything.
+ Atermonera:
+ - bugfix: Laptops no longer consume IDs indefinitely.
+ Mechoid:
+ - rsctweak: Promethean limbs store more damage.
+ - rsctweak: Promethean limbs, in addition to normal severing rules, have a higher
+ chance to be splattered or ashed once they reach maximum damage.
+ - rscadd: Limbs can now spread their damage to neighbors with the spread_dam var,
+ when reaching max damage.
+ PrismaticGynoid:
+ - rscadd: Added laser pointers. Available in your loadout, and printed and upgraded
+ by R&D.
+ lorwp:
+ - tweak: Search and Rescue can now add certain medical restricted items to their
+ loadouts
+2018-06-08:
+ Anewbe:
+ - tweak: Merc mobs in PoIs no longer drop gear. This is to help us balance the PoIs
+ that contain them, and by extension every other PoI.
+ - tweak: Merc mobs have been shuffled around in their PoIs. At some point, this
+ may actually be randomized, but for now, expect slightly different placements.
+ - rscadd: Adds a laser rifle and ion rifle version of the Merc mob, for variety.
+ - tweak: PoI turrets are lethal again, and will likely shoot crawlers.
+ - rscadd: Certain mobs, namely robots and mercs, now have some amount of armor.
+ - rscadd: Ranged mercs will now knife people when cornered, rather than punch them
+ really hard.
+ Mechoid:
+ - rscadd: Added some background things for Events.
+ - bugfix: Ion rifles hit the correct 3x3 instead of 5x5
+ - rscadd: Seed Storage Vendors are now hackable. Can choose from various lists of
+ concerning plants.
+2018-06-21:
+ Anewbe:
+ - rscadd: Added a biomass reagent, made from protein, sugar, and phoron.
+ - tweak: Cloners and bioprinters now use the biomass reagent. Both can be refilled
+ or have their capacity increased by replacing the bottles they spawn with.
+ - experiment: Mapped in a bioprinter, for further testing.
+ - rscadd: Adds the ability to make robolimb brands more or less vulnerable to brute
+ or burn.
+ - rscdel: Makes VeyMed limbs more vulnerable to brute and burn.
+ Mechoid:
+ - rscadd: Allow AIs to create and take control of mindless drones from fabricators.
+2018-07-12:
+ Anewbe:
+ - bugfix: Technomancer Apportation now properly checks for range and scepter, again.
+2018-07-14:
+ Anewbe:
+ - tweak: Certain languages now require assistance for a species to speak, but not
+ understand, much like EAL.
+ - tweak: Alai can only be `spoken` by Taj and Teshari.
+ - rscadd: Adds a voicebox/larynx organ. Its only purpose at the moment is to assist
+ in speaking certain langauges.
+ - tweak: Language implants, like the EAL implant, now affect the voicebox organ,
+ instead of being a freefloating implant.
+ - rscadd: Adds a language implant for Common Skrellian.
+ Atermonera:
+ - rscadd: Steel sheets can be used to construct Roofing Tiles
+ - rscadd: Roofing tiles can be used on tiles under open spaces or space tiles in
+ multiZ maps to place a lattice and plating on the space above
+ - rscadd: Roofing tiles can be used on outdoor turfs to make them indoors
+ - rscadd: Both functions work together on multiZ maps with outdoor turfs, only one
+ roofing tile is used per tile roofed.
+ Mechoid:
+ - rscadd: Adds a new surgical procedure for fixing brute and burn on limbs.
+2018-08-01:
+ KasparoVv:
+ - rscadd: You can now change the order of your body markings at character creation.
+ Shift markings up or down layers at will to design the character you've always
+ wanted, more easily than ever before.
+ Mechoid:
+ - rscadd: Added the Gigaphone. Currently unused.
+ Mewchild:
+ - rscadd: Ports several AI core sprites from ages and places past
+ PrismaticGynoid:
+ - rscadd: Adds four types of colorblindness to the traits in the setup menu.
+ - tweak: pAIs can now be picked up while unfolded, and can display more than 9 emotions.
diff --git a/html/changelogs/Atermonera - supply_nanoUI_refactor.yml b/html/changelogs/Atermonera - supply_nanoUI_refactor.yml
new file mode 100644
index 0000000000..03c9df495b
--- /dev/null
+++ b/html/changelogs/Atermonera - supply_nanoUI_refactor.yml
@@ -0,0 +1,5 @@
+author: Atermonera
+delete-after: True
+changes:
+ - rscadd: "The supply controller has been refactored and shifted to nanoUI."
+ - rscadd: "The ordering and control consoles are now generally upgraded in terms of information and options."
diff --git a/html/changelogs/Cerebulon - pumpkins.yml b/html/changelogs/Cerebulon - pumpkins.yml
deleted file mode 100644
index 42edb7ad6f..0000000000
--- a/html/changelogs/Cerebulon - pumpkins.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-author: Cerebulon
-
-
-delete-after: True
-
-changes:
- - bugfix: "Pumpkins no longer green ovals. Now grow on actual vines."
diff --git a/html/changelogs/Anewbe - Communicators.yml b/html/changelogs/Neerti-ambience.yml
similarity index 81%
rename from html/changelogs/Anewbe - Communicators.yml
rename to html/changelogs/Neerti-ambience.yml
index 0982267786..e711c67cfe 100644
--- a/html/changelogs/Anewbe - Communicators.yml
+++ b/html/changelogs/Neerti-ambience.yml
@@ -1,36 +1,37 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# maptweak
-# spellcheck (typo fixes)
-# experiment
-#################################
-
-# Your name.
-author: Anewbe
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
-# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
-changes:
- - tweak: "Communicator visibility (the thing that lets people see your communicator when you're a ghost) is now saved to character slots, rather than globally."
\ No newline at end of file
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Neerti
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - soundadd: "Adds new ambience sounds for various areas, especially on the surface of Sif."
+ - sounddel: "Removes low and high-pitched droning from available ambience. Consider trying ambience again if you had turned it off to avoid those."
diff --git a/html/changelogs/arokha - pol-limbprint.yml b/html/changelogs/arokha - pol-limbprint.yml
deleted file mode 100644
index b80cbe68d0..0000000000
--- a/html/changelogs/arokha - pol-limbprint.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# maptweak
-# spellcheck (typo fixes)
-# experiment
-#################################
-
-# Your name.
-author: Arokha
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
-# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
-changes:
- - bugfix: "Nerve reattaching surgery now works correctly. (Hemostat on limb)"
- - bugfix: "Limbs dropped by people don't have appropriate flags."
diff --git a/html/changelogs/atermonera-refactorexamine.yml b/html/changelogs/atermonera-refactorexamine.yml
deleted file mode 100644
index 46b0c302c4..0000000000
--- a/html/changelogs/atermonera-refactorexamine.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Atermonera
-delete-after: True
-changes:
- - tweak: "Human examine code has received a major refactor. If you encounter unusual behaviour that seems wrong, please report it."
\ No newline at end of file
diff --git a/html/changelogs/schnayy-plushietweak.yml b/html/changelogs/schnayy-plushietweak.yml
deleted file mode 100644
index 45e93e5e4f..0000000000
--- a/html/changelogs/schnayy-plushietweak.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-# Your name.
-author: schnayy
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
- - bugfix: "Space carp plushies now load sprites and are all selectable from loadout."
- - tweak: "Adds several newer plushies to the gift vendor as well as adjusting cost of gift vendor's contents."
\ No newline at end of file
diff --git a/icons/480x480.dmi b/icons/480x480.dmi
index 90ea9fbd55..0b6d072855 100644
Binary files a/icons/480x480.dmi and b/icons/480x480.dmi differ
diff --git a/icons/effects/64x64.dmi b/icons/effects/64x64.dmi
new file mode 100644
index 0000000000..79eabaac4f
Binary files /dev/null and b/icons/effects/64x64.dmi differ
diff --git a/icons/effects/96x256.dmi b/icons/effects/96x256.dmi
new file mode 100644
index 0000000000..978f0fbcda
Binary files /dev/null and b/icons/effects/96x256.dmi differ
diff --git a/icons/effects/timestop.dmi b/icons/effects/timestop.dmi
new file mode 100644
index 0000000000..0e69eba984
Binary files /dev/null and b/icons/effects/timestop.dmi differ
diff --git a/icons/effects/weather.dmi b/icons/effects/weather.dmi
index d0df90a44a..5ae794c898 100644
Binary files a/icons/effects/weather.dmi and b/icons/effects/weather.dmi differ
diff --git a/icons/holomap_markers.dmi b/icons/holomap_markers.dmi
new file mode 100644
index 0000000000..3ea32c120d
Binary files /dev/null and b/icons/holomap_markers.dmi differ
diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi
index f5fbc438a7..d0946d1564 100644
Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 90cc743bcf..e503b0d1b9 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 601d40b4dc..b3b9a852c9 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index 54b20e0165..1ed8e7cf12 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/belt_mirror.dmi b/icons/mob/belt_mirror.dmi
index d8e8291a80..3881b1c746 100644
Binary files a/icons/mob/belt_mirror.dmi and b/icons/mob/belt_mirror.dmi differ
diff --git a/icons/mob/ears.dmi b/icons/mob/ears.dmi
index cf2530e219..1df73dc111 100644
Binary files a/icons/mob/ears.dmi and b/icons/mob/ears.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 412f267e90..a98cb6061c 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 78b0b2e1d4..75929194f9 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_face_m.dmi b/icons/mob/human_face_m.dmi
index 5fb0b983d3..457dd0e5df 100644
Binary files a/icons/mob/human_face_m.dmi and b/icons/mob/human_face_m.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi b/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi
index 7a0211e603..798d4ae73d 100644
Binary files a/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi and b/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt1.dmi b/icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt1.dmi
new file mode 100644
index 0000000000..76bd5844a2
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt1.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt2.dmi b/icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt2.dmi
new file mode 100644
index 0000000000..c013926769
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt2.dmi differ
diff --git a/icons/mob/human_races/markings.dmi b/icons/mob/human_races/markings.dmi
index e4e4101b4b..d89377dbf1 100644
Binary files a/icons/mob/human_races/markings.dmi and b/icons/mob/human_races/markings.dmi differ
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index 9a8adaeae0..c02abf60c8 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/lefthand_guns.dmi b/icons/mob/items/lefthand_guns.dmi
index 1a830a6e49..3dce22596f 100644
Binary files a/icons/mob/items/lefthand_guns.dmi and b/icons/mob/items/lefthand_guns.dmi differ
diff --git a/icons/mob/items/lefthand_holder.dmi b/icons/mob/items/lefthand_holder.dmi
index a3af18a5d0..9f47a4743a 100644
Binary files a/icons/mob/items/lefthand_holder.dmi and b/icons/mob/items/lefthand_holder.dmi differ
diff --git a/icons/mob/items/lefthand_storage.dmi b/icons/mob/items/lefthand_storage.dmi
index d7e1c4ec10..6b5a4defb8 100644
Binary files a/icons/mob/items/lefthand_storage.dmi and b/icons/mob/items/lefthand_storage.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index d2b58c3297..0e16db099e 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/mob/items/righthand_guns.dmi b/icons/mob/items/righthand_guns.dmi
index 8a7c74bf3d..f13fb1c997 100644
Binary files a/icons/mob/items/righthand_guns.dmi and b/icons/mob/items/righthand_guns.dmi differ
diff --git a/icons/mob/items/righthand_holder.dmi b/icons/mob/items/righthand_holder.dmi
index ee4b26869e..7ac02b7720 100644
Binary files a/icons/mob/items/righthand_holder.dmi and b/icons/mob/items/righthand_holder.dmi differ
diff --git a/icons/mob/items/righthand_storage.dmi b/icons/mob/items/righthand_storage.dmi
index 66646547c5..783540cefc 100644
Binary files a/icons/mob/items/righthand_storage.dmi and b/icons/mob/items/righthand_storage.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index d1c15d8b61..e99e3a5d36 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/mob/pai.dmi b/icons/mob/pai.dmi
index 23744fddda..df6010159b 100644
Binary files a/icons/mob/pai.dmi and b/icons/mob/pai.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index 8b9a9c9cc4..fbbc875bc6 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/mob/spacesuit.dmi b/icons/mob/spacesuit.dmi
new file mode 100644
index 0000000000..188593823e
Binary files /dev/null and b/icons/mob/spacesuit.dmi differ
diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi
index 31f409043f..0868e30f9f 100644
Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ
diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi
index 0283191265..1746fef25e 100644
Binary files a/icons/mob/species/skrell/suit.dmi and b/icons/mob/species/skrell/suit.dmi differ
diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi
index cac6e5f53d..93135f7106 100644
Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ
diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi
index d7028d66a6..71a5c85389 100644
Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ
diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi
index eb2b0d6753..be709c012d 100644
Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index ec10064bcf..8c4876821d 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi
index 25cc585aed..98d45f3ac9 100644
Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ
diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi
index 7c9e5022cf..d48cf7f882 100644
Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index c75364ed56..e45ec90933 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index 0aeb148539..59e77909e9 100644
Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 9e50b538ac..a3daa966cf 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index ceea8bf2b7..56d3a65124 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/apc_repair.dmi b/icons/obj/apc_repair.dmi
index df295e2551..4d4a024ba8 100644
Binary files a/icons/obj/apc_repair.dmi and b/icons/obj/apc_repair.dmi differ
diff --git a/icons/obj/clothing/backpack.dmi b/icons/obj/clothing/backpack.dmi
index e64ac2d3b0..efef48c11d 100644
Binary files a/icons/obj/clothing/backpack.dmi and b/icons/obj/clothing/backpack.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index a0c2983ea7..a369471b51 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 8d0e7de5e8..164a90c0c1 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/spacesuits.dmi b/icons/obj/clothing/spacesuits.dmi
new file mode 100644
index 0000000000..1be8028b74
Binary files /dev/null and b/icons/obj/clothing/spacesuits.dmi differ
diff --git a/icons/obj/clothing/species/skrell/hats.dmi b/icons/obj/clothing/species/skrell/hats.dmi
index d132ea5183..3cd80e33ea 100644
Binary files a/icons/obj/clothing/species/skrell/hats.dmi and b/icons/obj/clothing/species/skrell/hats.dmi differ
diff --git a/icons/obj/clothing/species/skrell/suits.dmi b/icons/obj/clothing/species/skrell/suits.dmi
index 30d404ac82..ab7190e8ce 100644
Binary files a/icons/obj/clothing/species/skrell/suits.dmi and b/icons/obj/clothing/species/skrell/suits.dmi differ
diff --git a/icons/obj/clothing/species/tajaran/hats.dmi b/icons/obj/clothing/species/tajaran/hats.dmi
index 0f2ebda4e1..0b38c7a178 100644
Binary files a/icons/obj/clothing/species/tajaran/hats.dmi and b/icons/obj/clothing/species/tajaran/hats.dmi differ
diff --git a/icons/obj/clothing/species/tajaran/suits.dmi b/icons/obj/clothing/species/tajaran/suits.dmi
index d9b3a8ff35..98660fb867 100644
Binary files a/icons/obj/clothing/species/tajaran/suits.dmi and b/icons/obj/clothing/species/tajaran/suits.dmi differ
diff --git a/icons/obj/clothing/species/unathi/hats.dmi b/icons/obj/clothing/species/unathi/hats.dmi
index 13a59eeabc..641ccce45e 100644
Binary files a/icons/obj/clothing/species/unathi/hats.dmi and b/icons/obj/clothing/species/unathi/hats.dmi differ
diff --git a/icons/obj/clothing/species/unathi/suits.dmi b/icons/obj/clothing/species/unathi/suits.dmi
index 5c0f9c3e20..240bbc7738 100644
Binary files a/icons/obj/clothing/species/unathi/suits.dmi and b/icons/obj/clothing/species/unathi/suits.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index ab8812741a..d45dac6e1f 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi
index b71acb7ada..52433ab5e3 100644
Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ
diff --git a/icons/obj/deadringer.dmi b/icons/obj/deadringer.dmi
new file mode 100644
index 0000000000..6220057782
Binary files /dev/null and b/icons/obj/deadringer.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index e0e3305d44..1b834792bd 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/fulton.dmi b/icons/obj/fulton.dmi
new file mode 100644
index 0000000000..c56c275b3b
Binary files /dev/null and b/icons/obj/fulton.dmi differ
diff --git a/icons/obj/fulton_balloon.dmi b/icons/obj/fulton_balloon.dmi
new file mode 100644
index 0000000000..5a1fa98e14
Binary files /dev/null and b/icons/obj/fulton_balloon.dmi differ
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index 3ea938e4ee..ddf2e1c64e 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index 9059e15769..35dee6f7c5 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/machines/stationmap.dmi b/icons/obj/machines/stationmap.dmi
new file mode 100644
index 0000000000..f57bf08913
Binary files /dev/null and b/icons/obj/machines/stationmap.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 02c1c642cf..7b00c401d2 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi
index 9928e2fee2..aaedd14968 100644
Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index bc57493646..e5db3aeb3e 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 35d09318ee..efc1184dd5 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/icons/obj/props/prism.dmi b/icons/obj/props/prism.dmi
new file mode 100644
index 0000000000..0b938c7ef0
Binary files /dev/null and b/icons/obj/props/prism.dmi differ
diff --git a/icons/obj/props/projectile_lock.dmi b/icons/obj/props/projectile_lock.dmi
new file mode 100644
index 0000000000..cf74d73796
Binary files /dev/null and b/icons/obj/props/projectile_lock.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 3b88c088e9..c19111ab72 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index 2cdc20c704..8cce2e7f15 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/icons/turf/wall_masks.dmi b/icons/turf/wall_masks.dmi
index 64d17ff86b..bda615cd5c 100644
Binary files a/icons/turf/wall_masks.dmi and b/icons/turf/wall_masks.dmi differ
diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi
index 5717b496e8..1569985184 100644
Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 571152d5c2..3fd0f7cd0f 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -1811,7 +1811,7 @@ window "mainwindow"
right-click = false
saved-params = "pos;size;is-minimized;is-maximized"
on-size = ""
- title = "Space Station 13"
+ title = "Polaris Station 13"
titlebar = true
statusbar = true
can-close = true
diff --git a/maps/example/example_areas.dm b/maps/example/example_areas.dm
index 8e01e14055..d66be8dea8 100644
--- a/maps/example/example_areas.dm
+++ b/maps/example/example_areas.dm
@@ -4,10 +4,12 @@
lift_floor_label = "Floor 2"
lift_floor_name = "Top Floor"
lift_announce_str = "Arriving at Top Floor."
+ ambience = AMBIENCE_AESTHETIC
/area/turbolift/example_ground
name = "lift (ground floor)"
lift_floor_label = "Floor 1"
lift_floor_name = "First Floor"
lift_announce_str = "Arriving at First Floor."
- base_turf = /turf/simulated/floor
\ No newline at end of file
+ base_turf = /turf/simulated/floor
+ ambience = AMBIENCE_AESTHETIC
\ No newline at end of file
diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm
index abf0a707e8..47dda06147 100644
--- a/maps/northern_star/polaris-1.dmm
+++ b/maps/northern_star/polaris-1.dmm
@@ -56,7 +56,7 @@
"abd" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/turf/simulated/floor,/area/maintenance/auxsolarstarboard)
"abe" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "solar_chapel_pump"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "solar_chapel_airlock"; pixel_x = 0; pixel_y = 28; req_access = list(13); tag_airpump = "solar_chapel_pump"; tag_chamber_sensor = "solar_chapel_sensor"; tag_exterior_door = "solar_chapel_outer"; tag_interior_door = "solar_chapel_inner"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_chapel_sensor"; pixel_x = 0; pixel_y = -26},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor,/area/maintenance/auxsolarstarboard)
"abf" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_inner"; locked = 1; name = "Engineering External Access"; req_access = list(11,13)},/turf/simulated/floor,/area/maintenance/auxsolarstarboard)
-"abg" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_access = list(11,13)},/turf/simulated/floor,/area/maintenance/auxsolarstarboard)
+"abg" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_access = list(11,13)},/turf/simulated/floor,/area/maintenance/auxsolarstarboard)
"abh" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/maintenance/auxsolarstarboard)
"abi" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/maintenance/auxsolarstarboard)
"abj" = (/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Port Solar Access"; req_access = list(11)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/maintenance/auxsolarstarboard)
@@ -85,9 +85,9 @@
"abG" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "library_maint_outer"; locked = 1; name = "Library Maintenance EVA External Access"; req_access = list(13)},/turf/simulated/floor,/area/maintenance/library)
"abH" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "library_maint_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "library_maint_pump"},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor,/area/maintenance/library)
"abI" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "library_maint_airlock"; name = "Airlock Console"; pixel_y = 25; req_access = list(13); tag_airpump = "library_maint_pump"; tag_chamber_sensor = "library_maint_sensor"; tag_exterior_door = "library_maint_outer"; tag_interior_door = "library_maint_inner"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor,/area/maintenance/library)
-"abJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "library_maint_inner"; locked = 1; name = "Library Maintenance EVA Internal Access"; req_access = list(13)},/turf/simulated/floor,/area/maintenance/library)
-"abK" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "library_maint_airlock"; name = "interior access button"; pixel_x = 0; pixel_y = 25; req_access = list(13)},/turf/simulated/floor,/area/maintenance/library)
-"abL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/maintenance/library)
+"abJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "library_maint_inner"; locked = 1; name = "Library Maintenance EVA Internal Access"; req_access = list(13)},/turf/simulated/floor,/area/maintenance/library)
+"abK" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "library_maint_airlock"; name = "interior access button"; pixel_x = 0; pixel_y = 25; req_access = list(13)},/turf/simulated/floor,/area/maintenance/library)
+"abL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/maintenance/library)
"abM" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"},/turf/simulated/floor,/area/maintenance/library)
"abN" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor,/area/maintenance/library)
"abO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless,/area/solar/auxstarboard)
@@ -406,13 +406,13 @@
"ahP" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore)
"ahQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atm{pixel_x = 32},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore)
"ahR" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"ahS" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"ahT" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"ahS" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"ahT" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"ahU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/carpet,/area/chapel/main)
"ahV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/carpet,/area/chapel/main)
"ahW" = (/turf/simulated/floor/carpet,/area/chapel/main)
-"ahX" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"ahY" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"ahX" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"ahY" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"ahZ" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"aia" = (/turf/simulated/floor/tiled/dark,/area/chapel/main)
"aib" = (/turf/simulated/floor/tiled,/area/maintenance/chapel)
@@ -459,12 +459,12 @@
"aiQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore)
"aiR" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore)
"aiS" = (/obj/machinery/newscaster{pixel_x = -30},/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"aiT" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 8},/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"aiT" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 8},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"aiU" = (/obj/effect/floor_decal/chapel,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"aiV" = (/obj/structure/table/woodentable,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/chapel/main)
"aiW" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/carpet,/area/chapel/main)
"aiX" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/chapel/main)
-"aiY" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"aiY" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"aiZ" = (/obj/effect/floor_decal/chapel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"aja" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"ajb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/chapel/main)
@@ -475,7 +475,7 @@
"ajg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/maintenance/chapel)
"ajh" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/tiled,/area/maintenance/chapel)
"aji" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/maintenance/chapel)
-"ajj" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "chapel_maint_inner"; locked = 1; name = "Chapel Maintenance EVA Internal Access"; req_access = list(13)},/turf/simulated/floor,/area/maintenance/chapel)
+"ajj" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "chapel_maint_inner"; locked = 1; name = "Chapel Maintenance EVA Internal Access"; req_access = list(13)},/turf/simulated/floor,/area/maintenance/chapel)
"ajk" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "chapel_maint_airlock"; name = "Airlock Console"; pixel_y = 25; req_access = list(13); tag_airpump = "chapel_maint_pump"; tag_chamber_sensor = "chapel_maint_sensor"; tag_exterior_door = "chapel_maint_outer"; tag_interior_door = "chapel_maint_inner"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor,/area/maintenance/chapel)
"ajl" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "chapel_maint_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "chapel_maint_pump"},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor,/area/maintenance/chapel)
"ajm" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "chapel_maint_outer"; locked = 1; name = "Chapel Maintenance EVA External Access"; req_access = list(13)},/turf/simulated/floor,/area/maintenance/chapel)
@@ -560,8 +560,8 @@
"akN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore)
"akO" = (/obj/structure/disposalpipe/segment,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore)
"akP" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"akQ" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 1},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"akR" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 4},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"akQ" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 1},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"akR" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 4},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"akS" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"akT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/chapel/main)
"akU" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/chapel/main)
@@ -571,7 +571,7 @@
"akY" = (/obj/structure/table/rack,/obj/item/weapon/storage/briefcase{pixel_x = -2; pixel_y = -5},/obj/item/weapon/storage/briefcase{pixel_x = 3; pixel_y = 0},/obj/machinery/light,/turf/simulated/floor/lino,/area/security/detectives_office)
"akZ" = (/turf/simulated/floor/lino,/area/security/detectives_office)
"ala" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/lino,/area/security/detectives_office)
-"alb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/security{c_tag = "SEC - Detective Office"; dir = 1},/obj/structure/disposalpipe/segment,/obj/structure/flora/pottedplant{ icon_state = "plant-10"},/turf/simulated/floor/lino,/area/security/detectives_office)
+"alb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/security{c_tag = "SEC - Detective Office"; dir = 1},/obj/structure/disposalpipe/segment,/obj/structure/flora/pottedplant{icon_state = "plant-10"},/turf/simulated/floor/lino,/area/security/detectives_office)
"alc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light,/turf/simulated/floor/lino,/area/security/detectives_office)
"ald" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = 12; pixel_y = -24},/turf/simulated/floor/lino,/area/security/detectives_office)
"ale" = (/obj/structure/noticeboard{pixel_y = -30},/turf/simulated/floor/lino,/area/security/detectives_office)
@@ -603,12 +603,12 @@
"alE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore)
"alF" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; pixel_x = 26},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore)
"alG" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"alH" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"alH" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"alI" = (/obj/effect/floor_decal/chapel,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"alJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"alK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/chapel/main)
"alL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"alM" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"alM" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"alN" = (/obj/effect/floor_decal/chapel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"alO" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"alP" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/maintenance/chapel)
@@ -696,7 +696,7 @@
"ant" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore)
"anu" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore)
"anv" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/civilian_hallway_fore)
-"anw" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 1},/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"anw" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 1},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"anx" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"any" = (/turf/simulated/wall,/area/vacant/vacant_site)
"anz" = (/obj/machinery/smartfridge/drinks,/turf/simulated/floor/wood,/area/vacant/vacant_site)
@@ -744,9 +744,9 @@
"aop" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor/wood,/area/library)
"aoq" = (/obj/machinery/librarycomp{pixel_y = 0},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/library)
"aor" = (/obj/machinery/libraryscanner,/turf/simulated/floor/wood,/area/library)
-"aos" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/obj/item/device/retail_scanner/civilian{ icon_state = "retail_idle"; dir = 1},/obj/item/device/camera,/obj/item/device/tape,/turf/simulated/floor/carpet,/area/library)
+"aos" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/obj/item/device/retail_scanner/civilian{icon_state = "retail_idle"; dir = 1},/obj/item/device/camera,/obj/item/device/tape,/turf/simulated/floor/carpet,/area/library)
"aot" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/invisible,/obj/item/clothing/under/suit_jacket/red,/obj/machinery/light,/obj/item/weapon/barcodescanner,/turf/simulated/floor/carpet,/area/library)
-"aou" = (/obj/structure/table/rack,/obj/item/weapon/storage/firstaid/adv,/obj/item/bodybag/cryobag,/obj/item/weapon/crowbar,/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/sign/poster{pixel_y = 32},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard)
+"aou" = (/obj/structure/table/rack,/obj/item/weapon/storage/firstaid/adv,/obj/item/bodybag/cryobag,/obj/item/weapon/tool/crowbar,/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/sign/poster{pixel_y = 32},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard)
"aov" = (/obj/effect/floor_decal/corner/paleblue{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard)
"aow" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard)
"aox" = (/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard)
@@ -754,9 +754,9 @@
"aoz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore)
"aoA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore)
"aoB" = (/obj/structure/table/glass,/obj/machinery/status_display{pixel_x = 32; pixel_y = 0},/obj/item/weapon/book/codex/lore/vir,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/civilian_hallway_fore)
-"aoC" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 8},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"aoC" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 8},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"aoD" = (/obj/effect/floor_decal/chapel,/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"aoE" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 8},/obj/item/weapon/stool/padded,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"aoE" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 8},/obj/item/weapon/stool/padded,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"aoF" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor,/area/vacant/vacant_site)
"aoG" = (/turf/simulated/floor/wood,/area/vacant/vacant_site)
"aoH" = (/obj/random/drinkbottle,/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/drinkbottle,/turf/simulated/floor/wood,/area/vacant/vacant_site)
@@ -887,7 +887,7 @@
"arc" = (/obj/structure/closet/secure_closet/security,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/glasses/hud/security,/turf/simulated/floor/tiled,/area/security/security_lockerroom)
"ard" = (/obj/structure/closet/secure_closet/security,/obj/machinery/light,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/glasses/hud/security,/turf/simulated/floor/tiled,/area/security/security_lockerroom)
"are" = (/obj/structure/table/standard,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/item/clothing/accessory/badge/holo,/obj/item/clothing/accessory/badge/holo,/obj/item/clothing/accessory/badge/holo/cord,/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/tiled,/area/security/security_lockerroom)
-"arf" = (/obj/structure/table/standard,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/turf/simulated/floor/tiled,/area/security/security_lockerroom)
+"arf" = (/obj/structure/table/standard,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/turf/simulated/floor/tiled,/area/security/security_lockerroom)
"arg" = (/obj/structure/curtain/open/shower/security,/obj/machinery/shower{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/northleft{name = "Shower"; req_access = list()},/turf/simulated/floor/tiled/freezer,/area/security/security_bathroom)
"arh" = (/obj/structure/curtain/open/shower/security,/obj/machinery/shower{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/northright{dir = 1; name = "Shower"; req_access = list()},/turf/simulated/floor/tiled/freezer,/area/security/security_bathroom)
"ari" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{brightness_color = "#DA0205"; brightness_power = 1; brightness_range = 5},/turf/simulated/floor/tiled/freezer,/area/security/security_bathroom)
@@ -1114,7 +1114,7 @@
"avv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/security/security_equiptment_storage)
"avw" = (/obj/machinery/computer/prisoner,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/warden)
"avx" = (/obj/structure/filingcabinet/chestdrawer,/obj/effect/floor_decal/industrial/outline/grey,/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled/dark,/area/security/warden)
-"avy" = (/obj/structure/table/reinforced,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 26},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/network/security{c_tag = "SEC - Warden's Office"},/obj/item/weapon/crowbar,/obj/item/device/radio/off,/obj/item/weapon/wrench,/obj/item/device/retail_scanner/security,/turf/simulated/floor/tiled/dark,/area/security/warden)
+"avy" = (/obj/structure/table/reinforced,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 26},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/network/security{c_tag = "SEC - Warden's Office"},/obj/item/weapon/tool/crowbar,/obj/item/device/radio/off,/obj/item/weapon/tool/wrench,/obj/item/device/retail_scanner/security,/turf/simulated/floor/tiled/dark,/area/security/warden)
"avz" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/light_switch{pixel_x = 14; pixel_y = 24},/obj/machinery/photocopier,/turf/simulated/floor/tiled/dark,/area/security/warden)
"avA" = (/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Warden's Office"},/turf/simulated/floor/tiled/dark,/area/security/warden)
"avB" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/dark,/area/security/warden)
@@ -1138,7 +1138,7 @@
"avT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/floor_decal/corner/red{dir = 4},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
"avU" = (/obj/machinery/computer/area_atmos/area,/turf/simulated/floor,/area/security/riot_control)
"avV" = (/obj/machinery/atmospherics/binary/pump,/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/security/riot_control)
-"avW" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/portable_atmospherics/powered/scrubber,/obj/item/weapon/wrench,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/security/riot_control)
+"avW" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/portable_atmospherics/powered/scrubber,/obj/item/weapon/tool/wrench,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/security/riot_control)
"avX" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor,/area/maintenance/security_starboard)
"avY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/maintenance/security_starboard)
"avZ" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/maintenance/security_starboard)
@@ -1240,14 +1240,14 @@
"axR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
"axS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
"axT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/floor_decal/corner/red{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
-"axU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/red{dir = 5},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
-"axV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/computer/cryopod{density = 0; layer = 3.3; pixel_y = 32},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
-"axW" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
-"axX" = (/obj/effect/floor_decal/corner/red{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
-"axY" = (/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
+"axU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/red{dir = 5},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
+"axV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/computer/cryopod{density = 0; layer = 3.3; pixel_y = 32},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
+"axW" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
+"axX" = (/obj/effect/floor_decal/corner/red{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
+"axY" = (/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
"axZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
"aya" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore)
-"ayb" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/west{location = "Security"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/security/security_cell_hallway)
+"ayb" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/west{location = "Security"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/security/security_cell_hallway)
"ayc" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/security_starboard)
"ayd" = (/obj/effect/decal/cleanable/blood/oil,/obj/item/trash/tastybread,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"aye" = (/obj/item/seeds/poppyseed,/obj/item/seeds/poppyseed,/obj/item/seeds/poppyseed,/turf/simulated/floor,/area/maintenance/security_starboard)
@@ -1603,7 +1603,7 @@
"aEQ" = (/obj/item/weapon/caution/cone,/turf/simulated/floor,/area/maintenance/pool)
"aER" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/maintenance/pool)
"aES" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor,/area/maintenance/pool)
-"aET" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/void/security,/obj/item/clothing/head/helmet/space/void/security,/obj/item/device/suit_cooling_unit,/obj/item/weapon/tank/oxygen,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/white{ icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 8},/obj/machinery/door/window/brigdoor/eastright{name = "EVA Suit"},/turf/simulated/floor/tiled/dark,/area/security/armoury)
+"aET" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/void/security,/obj/item/clothing/head/helmet/space/void/security,/obj/item/device/suit_cooling_unit,/obj/item/weapon/tank/oxygen,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/white{icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 8},/obj/machinery/door/window/brigdoor/eastright{name = "EVA Suit"},/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aEU" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aEV" = (/obj/structure/table/rack,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aEW" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
@@ -1732,7 +1732,7 @@
"aHp" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/range)
"aHq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/range)
"aHr" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/security/range)
-"aHs" = (/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/window/westright{name = "Range Access"; req_access = list(63)},/turf/simulated/floor/tiled,/area/security/range)
+"aHs" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/window/westright{name = "Range Access"; req_access = list(63)},/turf/simulated/floor/tiled,/area/security/range)
"aHt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/security/range)
"aHu" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/security/range)
"aHv" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/turf/simulated/floor/tiled,/area/security/range)
@@ -1861,7 +1861,7 @@
"aJO" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/range)
"aJP" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/range)
"aJQ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/security/range)
-"aJR" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/window/westright{name = "Range Access"; req_access = list(63)},/turf/simulated/floor/tiled,/area/security/range)
+"aJR" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/window/westright{name = "Range Access"; req_access = list(63)},/turf/simulated/floor/tiled,/area/security/range)
"aJS" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/security/range)
"aJT" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/security/range)
"aJU" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/blanks{pixel_x = 2; pixel_y = -2},/obj/item/weapon/storage/box/blanks,/turf/simulated/floor/tiled,/area/security/range)
@@ -1908,7 +1908,7 @@
"aKJ" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/item/weapon/storage/box/shotgunshells,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/green/full,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunammo,/obj/machinery/door/window/brigdoor/northleft{name = "Ammo"; req_access = list(2)},/turf/simulated/floor/tiled/dark,/area/security/tactical)
"aKK" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/machinery/door/window/brigdoor/northright{name = "Ammo"},/obj/item/ammo_magazine/s45,/obj/item/ammo_magazine/s45,/turf/simulated/floor/tiled/dark,/area/security/tactical)
"aKL" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/yellow/full,/obj/machinery/door/window/brigdoor/northleft{name = "Combat Armor"; req_access = list(2)},/obj/item/clothing/gloves/arm_guard/combat,/obj/item/clothing/shoes/leg_guard/combat,/obj/item/clothing/suit/armor/combat,/obj/item/clothing/head/helmet/combat,/turf/simulated/floor/tiled/dark,/area/security/tactical)
-"aKM" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/yellow/full{ icon_state = "corner_white_full"; dir = 4},/obj/machinery/door/window/brigdoor/northright{name = "Combat Armor"},/obj/item/clothing/gloves/arm_guard/combat,/obj/item/clothing/shoes/leg_guard/combat,/obj/item/clothing/suit/armor/combat,/obj/item/clothing/head/helmet/combat,/turf/simulated/floor/tiled/dark,/area/security/tactical)
+"aKM" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/yellow/full{icon_state = "corner_white_full"; dir = 4},/obj/machinery/door/window/brigdoor/northright{name = "Combat Armor"},/obj/item/clothing/gloves/arm_guard/combat,/obj/item/clothing/shoes/leg_guard/combat,/obj/item/clothing/suit/armor/combat,/obj/item/clothing/head/helmet/combat,/turf/simulated/floor/tiled/dark,/area/security/tactical)
"aKN" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/range)
"aKO" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/security/range)
"aKP" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/security/range)
@@ -2117,11 +2117,11 @@
"aOK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_two)
"aOL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_two)
"aOM" = (/obj/machinery/camera/network/northern_star{c_tag = "Hall - Recreation Aft"; dir = 4},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway)
-"aON" = (/obj/item/inflatable/door/torn,/obj/item/weapon/screwdriver,/turf/simulated/floor,/area/maintenance/pool)
+"aON" = (/obj/item/inflatable/door/torn,/obj/item/weapon/tool/screwdriver,/turf/simulated/floor,/area/maintenance/pool)
"aOO" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = -28; pixel_y = 0},/obj/structure/closet/walllocker/emerglocker{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station)
"aOP" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station)
"aOQ" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "large_escape_pod_2"; pixel_x = 26; pixel_y = -26; tag_door = "large_escape_pod_2_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station)
-"aOR" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/obj/random/medical/lite,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station)
+"aOR" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/tool/crowbar,/obj/random/medical/lite,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station)
"aOS" = (/obj/structure/bed/chair{dir = 1},/obj/structure/closet/walllocker/emerglocker{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station)
"aOT" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station)
"aOU" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/substation/security)
@@ -2423,7 +2423,7 @@
"aUE" = (/turf/simulated/wall,/area/maintenance/engineering/pumpstation)
"aUF" = (/obj/machinery/space_heater,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aUG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
-"aUH" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 6},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
+"aUH" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 6},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aUI" = (/obj/machinery/atmospherics/binary/pump/high_power/on{dir = 4; name = "Pump station in"; target_pressure = 4500},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aUJ" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aUK" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
@@ -2456,7 +2456,7 @@
"aVl" = (/turf/simulated/wall,/area/maintenance/medbay_fore)
"aVm" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/medbay_fore)
"aVn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Pump Station"; req_one_access = list(11,24)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
-"aVo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
+"aVo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aVp" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aVq" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aVr" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
@@ -2546,7 +2546,7 @@
"aWX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"aWY" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"aWZ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/camera/network/civilian{c_tag = "CIV - Park Fore"; dir = 2},/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/tiled,/area/hydroponics/garden)
-"aXa" = (/obj/effect/floor_decal/spline/fancy/wood{ icon_state = "spline_fancy"; dir = 10},/obj/structure/flora/ausbushes/fernybush,/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/grass,/area/hydroponics/garden)
+"aXa" = (/obj/effect/floor_decal/spline/fancy/wood{icon_state = "spline_fancy"; dir = 10},/obj/structure/flora/ausbushes/fernybush,/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/grass,/area/hydroponics/garden)
"aXb" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 2},/obj/structure/flora/ausbushes/sparsegrass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"aXc" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 2},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"aXd" = (/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
@@ -2574,7 +2574,7 @@
"aXz" = (/obj/machinery/door/airlock/glass_engineeringatmos{name = "Pump Station Atmospherics"; req_one_access = list(11,24)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aXA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aXB" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
-"aXC" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
+"aXC" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aXD" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aXE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/medbay_fore)
"aXF" = (/turf/space,/area/skipjack_station/northwest_solars)
@@ -2618,7 +2618,7 @@
"aYr" = (/obj/structure/bed/chair/wood{dir = 4},/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"aYs" = (/obj/structure/table/woodentable,/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"aYt" = (/obj/structure/bed/chair/wood{dir = 8},/obj/effect/floor_decal/corner/green/full{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics/garden)
-"aYu" = (/obj/effect/floor_decal/spline/fancy/wood{ icon_state = "spline_fancy"; dir = 10},/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/grass,/area/hydroponics/garden)
+"aYu" = (/obj/effect/floor_decal/spline/fancy/wood{icon_state = "spline_fancy"; dir = 10},/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/grass,/area/hydroponics/garden)
"aYv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hydroponics/garden)
"aYw" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central_two)
"aYx" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
@@ -2638,11 +2638,11 @@
"aYL" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/storage/toolbox/emergency,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/turf/simulated/floor/plating,/area/maintenance/medbay_fore)
"aYM" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor/tiled/hydro,/area/maintenance/engineering/pumpstation)
"aYN" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/red{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
-"aYO" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
-"aYP" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/structure/table/steel_reinforced,/obj/random/tech_supply,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/random/maintenance/engineering,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
-"aYQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation)
-"aYR" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
-"aYS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
+"aYO" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
+"aYP" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/structure/table/steel_reinforced,/obj/random/tech_supply,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/random/maintenance/engineering,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
+"aYQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation)
+"aYR" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
+"aYS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aYT" = (/obj/machinery/atmospherics/tvalve/digital/mirrored/bypass{dir = 4},/obj/machinery/camera/network/engineering{c_tag = "ENG - Pump Station"; dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aYU" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aYV" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
@@ -2688,7 +2688,7 @@
"aZJ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/ai_monitored/storage/emergency/eva)
"aZK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled,/area/ai_monitored/storage/emergency/eva)
"aZL" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/ai_monitored/storage/emergency/eva)
-"aZM" = (/obj/effect/floor_decal/corner/yellow/full{ icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled/white,/area/ai_monitored/storage/emergency/eva)
+"aZM" = (/obj/effect/floor_decal/corner/yellow/full{icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled/white,/area/ai_monitored/storage/emergency/eva)
"aZN" = (/obj/effect/floor_decal/corner/brown{dir = 6},/turf/simulated/floor/tiled/white,/area/ai_monitored/storage/emergency/eva)
"aZO" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/white,/area/ai_monitored/storage/emergency/eva)
"aZP" = (/turf/simulated/floor/tiled/white,/area/ai_monitored/storage/emergency/eva)
@@ -2697,7 +2697,7 @@
"aZS" = (/turf/simulated/wall,/area/medical/surgery_storage)
"aZT" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor,/area/maintenance/medbay_fore)
"aZU" = (/obj/machinery/floodlight,/turf/simulated/floor,/area/maintenance/medbay_fore)
-"aZV" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 9},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = 12; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
+"aZV" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 9},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = 12; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aZW" = (/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
"aZX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation)
"aZY" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation)
@@ -2728,27 +2728,27 @@
"bax" = (/obj/machinery/recharge_station,/turf/simulated/floor/bluegrid,/area/ai_cyborg_station)
"bay" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hydroponics/garden)
"baz" = (/obj/structure/flora/ausbushes/leafybush,/turf/simulated/floor/grass,/area/hydroponics/garden)
-"baA" = (/obj/effect/floor_decal/spline/fancy/wood{ icon_state = "spline_fancy"; dir = 10},/obj/structure/flora/ausbushes/sparsegrass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
+"baA" = (/obj/effect/floor_decal/spline/fancy/wood{icon_state = "spline_fancy"; dir = 10},/obj/structure/flora/ausbushes/sparsegrass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"baB" = (/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"baC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"baD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"baE" = (/obj/structure/table/reinforced,/obj/effect/floor_decal/industrial/warning,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = 12; pixel_y = -24},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/emergency/eva)
"baF" = (/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/briefcase/inflatable{pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = -3},/obj/structure/table/reinforced,/obj/effect/floor_decal/industrial/warning,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/emergency/eva)
"baG" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/emergency/eva)
-"baH" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/industrial/warning,/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/camera/network/civilian{c_tag = "CIV - Emergency EVA"; dir = 1},/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/emergency/eva)
+"baH" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/industrial/warning,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/camera/network/civilian{c_tag = "CIV - Emergency EVA"; dir = 1},/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/emergency/eva)
"baI" = (/obj/structure/table/woodentable,/obj/machinery/light,/obj/effect/floor_decal/corner/brown{dir = 10},/obj/random/maintenance/engineering,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/tiled/white,/area/ai_monitored/storage/emergency/eva)
"baJ" = (/obj/effect/floor_decal/corner/brown{dir = 10},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled/white,/area/ai_monitored/storage/emergency/eva)
"baK" = (/obj/effect/floor_decal/corner/brown/full{dir = 4},/turf/simulated/floor/tiled/white,/area/ai_monitored/storage/emergency/eva)
"baL" = (/obj/effect/floor_decal/corner/yellow/full,/obj/effect/decal/cleanable/blood/oil,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/white,/area/ai_monitored/storage/emergency/eva)
"baM" = (/obj/effect/floor_decal/corner/yellow{dir = 10},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/white,/area/ai_monitored/storage/emergency/eva)
-"baN" = (/obj/effect/floor_decal/corner/yellow{dir = 10},/obj/structure/table/marble,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/taperoll/engineering,/obj/item/weapon/crowbar,/turf/simulated/floor/tiled/white,/area/ai_monitored/storage/emergency/eva)
+"baN" = (/obj/effect/floor_decal/corner/yellow{dir = 10},/obj/structure/table/marble,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/taperoll/engineering,/obj/item/weapon/tool/crowbar,/turf/simulated/floor/tiled/white,/area/ai_monitored/storage/emergency/eva)
"baO" = (/obj/structure/table/marble,/turf/simulated/floor/tiled/yellow,/area/ai_monitored/storage/emergency/eva)
"baP" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage)
"baQ" = (/obj/structure/closet/crate/freezer,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage)
"baR" = (/obj/machinery/iv_drip,/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage)
"baS" = (/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/turf/simulated/floor,/area/maintenance/medbay_fore)
"baT" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor,/area/maintenance/medbay_fore)
-"baU" = (/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/effect/decal/cleanable/cobweb2{ icon_state = "cobweb1"},/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/turf/simulated/floor/plating,/area/mine/unexplored/upper_level)
+"baU" = (/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/effect/decal/cleanable/cobweb2{icon_state = "cobweb1"},/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/turf/simulated/floor/plating,/area/mine/unexplored/upper_level)
"baV" = (/obj/structure/closet/crate,/obj/item/clothing/shoes/boots/combat,/obj/item/weapon/tank/air,/obj/item/weapon/tank/air,/obj/item/weapon/tank/air,/obj/item/clothing/mask/gas,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/cargo,/obj/random/maintenance/medical,/turf/simulated/floor/plating,/area/mine/unexplored/upper_level)
"baW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Pump Station"; req_one_access = list(11,24)},/turf/simulated/floor,/area/maintenance/medbay_fore)
"baX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
@@ -2869,7 +2869,7 @@
"bdi" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/water/pool,/area/hydroponics/garden)
"bdj" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/flora/ausbushes/reedbush,/turf/simulated/floor/water/pool,/area/hydroponics/garden)
"bdk" = (/obj/structure/bed/chair/wood{dir = 1},/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/tiled,/area/hydroponics/garden)
-"bdl" = (/obj/effect/floor_decal/spline/fancy/wood{ icon_state = "spline_fancy"; dir = 10},/obj/structure/flora/ausbushes/sunnybush,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/grass,/area/hydroponics/garden)
+"bdl" = (/obj/effect/floor_decal/spline/fancy/wood{icon_state = "spline_fancy"; dir = 10},/obj/structure/flora/ausbushes/sunnybush,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/grass,/area/hydroponics/garden)
"bdm" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bdn" = (/turf/simulated/floor/tiled,/area/medical/surgeryobs)
"bdo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/tiled,/area/medical/surgeryobs)
@@ -2911,7 +2911,7 @@
"bdY" = (/obj/structure/bed/chair/wood{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"bdZ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/water/pool,/area/hydroponics/garden)
"bea" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics/garden)
-"beb" = (/obj/effect/floor_decal/spline/fancy/wood{ icon_state = "spline_fancy"; dir = 9},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
+"beb" = (/obj/effect/floor_decal/spline/fancy/wood{icon_state = "spline_fancy"; dir = 9},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"bec" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 1},/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"bed" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 5},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"bee" = (/obj/effect/floor_decal/corner/green/full,/turf/simulated/floor/tiled,/area/hydroponics/garden)
@@ -2984,7 +2984,7 @@
"bft" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/effect/floor_decal/corner/pink{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/exam_room)
"bfu" = (/obj/structure/filingcabinet/medical{desc = "A large cabinet with hard copy medical records."; name = "Medical Records"},/obj/machinery/camera/network/medbay{c_tag = "MED - Examination Room"},/obj/effect/floor_decal/corner/pink{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/exam_room)
"bfv" = (/obj/structure/closet/secure_closet/medical1,/obj/effect/floor_decal/corner/pink/full{dir = 1},/obj/random/medical,/turf/simulated/floor/tiled/white,/area/medical/exam_room)
-"bfw" = (/obj/item/weapon/wrench,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/structure/table/glass,/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/cryo)
+"bfw" = (/obj/item/weapon/tool/wrench,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/structure/table/glass,/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/cryo)
"bfx" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/cryo)
"bfy" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/cryo)
"bfz" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
@@ -3004,8 +3004,8 @@
"bfN" = (/turf/simulated/wall/r_wall,/area/server)
"bfO" = (/obj/machinery/r_n_d/server/robotics,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server)
"bfP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; icon_state = "map_vent_out"; use_power = 1},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server)
-"bfQ" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled/dark,/area/server)
-"bfR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/server)
+"bfQ" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled/dark,/area/server)
+"bfR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/server)
"bfS" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/machinery/light/small{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/turf/simulated/floor/tiled/dark,/area/server)
"bfT" = (/obj/machinery/camera/network/research{c_tag = "SCI - Server Room"},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/tiled/dark,/area/server)
"bfU" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer_1"; use_power = 1; power_setting = 20; set_temperature = 73},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/server)
@@ -3030,7 +3030,7 @@
"bgn" = (/obj/structure/table/standard,/obj/item/weapon/aiModule/oxygen,/obj/item/weapon/aiModule/oneHuman,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access = list(20)},/obj/item/weapon/aiModule/purge,/obj/item/weapon/aiModule/antimov,/obj/item/weapon/aiModule/teleporterOffline,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/bluegrid,/area/ai_upload)
"bgo" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/maintenance/central)
"bgp" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 4},/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/machinery/camera/network/civilian{c_tag = "CIV - Park Port"; dir = 4},/turf/simulated/floor/grass,/area/hydroponics/garden)
-"bgq" = (/obj/effect/floor_decal/spline/plain{ icon_state = "spline_plain_full"; dir = 1},/obj/structure/showcase{desc = "It looks almost lifelike."; icon = 'icons/obj/statue.dmi'; icon_state = "hos"; name = "Statue"},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"bgq" = (/obj/effect/floor_decal/spline/plain{icon_state = "spline_plain_full"; dir = 1},/obj/structure/showcase{desc = "It looks almost lifelike."; icon = 'icons/obj/statue.dmi'; icon_state = "hos"; name = "Statue"},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"bgr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"bgs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"bgt" = (/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics/garden)
@@ -3054,9 +3054,9 @@
"bgL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/exam_room)
"bgM" = (/obj/effect/floor_decal/corner/pink{dir = 6},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 16},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/exam_room)
"bgN" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/effect/floor_decal/corner/pink{dir = 9},/obj/machinery/light{dir = 8},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/cryo)
-"bgO" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/cryo)
+"bgO" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/cryo)
"bgP" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/cryo)
-"bgQ" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/obj/effect/floor_decal/corner/pink{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/cryo)
+"bgQ" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/obj/effect/floor_decal/corner/pink{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/cryo)
"bgR" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
"bgS" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
"bgT" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
@@ -3107,7 +3107,7 @@
"bhM" = (/turf/simulated/wall/r_wall,/area/ai)
"bhN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/vault/bolted{name = "AI core"; req_access = list(16)},/obj/machinery/door/blast/regular{id = "AICore"; name = "AI core maintenance hatch"},/turf/simulated/floor/bluegrid,/area/ai_upload)
"bhO" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/maintenance/central)
-"bhP" = (/obj/effect/floor_decal/spline/fancy/wood{ icon_state = "spline_fancy"; dir = 10},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
+"bhP" = (/obj/effect/floor_decal/spline/fancy/wood{icon_state = "spline_fancy"; dir = 10},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"bhQ" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 6},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"bhR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hydroponics/garden)
"bhS" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hydroponics/garden)
@@ -3155,7 +3155,7 @@
"biI" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/maintenance/research_shuttle)
"biJ" = (/obj/machinery/r_n_d/server/core,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server)
"biK" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; external_pressure_bound_default = 0; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server)
-"biL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/server)
+"biL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/server)
"biM" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -26},/turf/simulated/floor/tiled/dark,/area/server)
"biN" = (/obj/machinery/computer/rdservercontrol,/turf/simulated/floor/tiled/dark,/area/server)
"biO" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor/tiled/dark,/area/server)
@@ -3254,7 +3254,7 @@
"bkD" = (/obj/structure/table/woodentable,/obj/item/weapon/book/codex/lore/vir,/turf/simulated/floor/tiled,/area/hydroponics/garden)
"bkE" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/hydroponics/garden)
"bkF" = (/obj/structure/bed/chair/wood,/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/tiled,/area/hydroponics/garden)
-"bkG" = (/obj/effect/floor_decal/spline/fancy/wood{ icon_state = "spline_fancy"; dir = 9},/obj/structure/flora/ausbushes/sunnybush,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/grass,/area/hydroponics/garden)
+"bkG" = (/obj/effect/floor_decal/spline/fancy/wood{icon_state = "spline_fancy"; dir = 9},/obj/structure/flora/ausbushes/sunnybush,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/grass,/area/hydroponics/garden)
"bkH" = (/obj/machinery/newscaster{pixel_x = -30},/turf/simulated/floor/tiled,/area/medical/surgeryobs)
"bkI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/bed/chair{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/surgeryobs)
"bkJ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled,/area/medical/surgeryobs)
@@ -3273,7 +3273,7 @@
"bkW" = (/obj/structure/bed/chair/wheelchair,/obj/effect/floor_decal/corner/pink{dir = 6},/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/tiled/white,/area/medical/exam_room)
"bkX" = (/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/cryo)
"bkY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/medical/cryo)
-"bkZ" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/cryo)
+"bkZ" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/cryo)
"bla" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/steel,/area/medical/cryo)
"blb" = (/obj/machinery/computer/crew,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -26},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
"blc" = (/obj/machinery/computer/med_data,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
@@ -3337,7 +3337,7 @@
"bmi" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/obj/item/weapon/pen,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/effect/floor_decal/corner/purple{dir = 5},/turf/simulated/floor/tiled/white,/area/rnd/lab)
"bmj" = (/obj/item/weapon/stock_parts/console_screen,/obj/structure/table/standard,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/effect/floor_decal/corner/purple/full{dir = 1},/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/tiled/white,/area/rnd/lab)
"bmk" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
-"bml" = (/obj/structure/closet/crate,/obj/item/weapon/crowbar,/turf/simulated/floor/tiled,/area/teleporter)
+"bml" = (/obj/structure/closet/crate,/obj/item/weapon/tool/crowbar,/turf/simulated/floor/tiled,/area/teleporter)
"bmm" = (/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/teleporter)
"bmn" = (/obj/structure/table/standard,/obj/structure/flora/pottedplant{icon_state = "plant-09"; name = "Steve"; pixel_y = 15},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled/dark,/area/ai)
"bmo" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled/dark,/area/ai)
@@ -3387,10 +3387,10 @@
"bng" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/research/station)
"bnh" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_dock_outer"; locked = 1; name = "Research Elevator Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "research_dock_airlock"; name = "exterior access button"; pixel_x = -6; pixel_y = -26; req_one_access = list(13,65)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/rnd/docking)
"bni" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/rnd/docking)
-"bnj" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/rnd/docking)
-"bnk" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_dock_inner"; locked = 1; name = "Research Elevator Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/rnd/docking)
-"bnl" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "research_dock_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_one_access = list(13,65)},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/docking)
-"bnm" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled/white,/area/rnd/docking)
+"bnj" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/rnd/docking)
+"bnk" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_dock_inner"; locked = 1; name = "Research Elevator Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/rnd/docking)
+"bnl" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "research_dock_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_one_access = list(13,65)},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/docking)
+"bnm" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled/white,/area/rnd/docking)
"bnn" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/docking)
"bno" = (/obj/effect/floor_decal/corner/purple{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_research{name = "Research Dock Hallway"; req_access = list(47)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/white,/area/rnd/docking)
"bnp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled/white,/area/rnd/docking)
@@ -3503,7 +3503,7 @@
"bps" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{dir = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 21},/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1343; name = "Private Channel"; pixel_x = 0; pixel_y = -21},/obj/item/device/radio/intercom{broadcasting = 1; dir = 4; listening = 1; name = "Common Channel"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/bluegrid,/area/ai)
"bpt" = (/obj/structure/flora/ausbushes/lavendergrass,/turf/simulated/floor/grass,/area/hydroponics/garden)
"bpu" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 5},/obj/structure/flora/ausbushes/sparsegrass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
-"bpv" = (/obj/effect/floor_decal/spline/fancy/wood{ icon_state = "spline_fancy"; dir = 9},/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/grass,/area/hydroponics/garden)
+"bpv" = (/obj/effect/floor_decal/spline/fancy/wood{icon_state = "spline_fancy"; dir = 9},/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/grass,/area/hydroponics/garden)
"bpw" = (/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"bpx" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bpy" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/northern_star{c_tag = "Hall - Central Primary Starboard Mid 1"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
@@ -3663,7 +3663,7 @@
"bsw" = (/obj/structure/bed/chair/wood{dir = 8},/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"bsx" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bsy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/reception)
-"bsz" = (/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/structure/flora/pottedplant{ icon_state = "plant-10"},/turf/simulated/floor/tiled/white,/area/medical/reception)
+"bsz" = (/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/structure/flora/pottedplant{icon_state = "plant-10"},/turf/simulated/floor/tiled/white,/area/medical/reception)
"bsA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/reception)
"bsB" = (/obj/item/roller,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/obj/structure/table/glass,/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/reception)
"bsC" = (/obj/structure/table/standard,/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/med_data/laptop,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/machinery/camera/network/medbay{c_tag = "MED - Lobby Fore"; dir = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/reception)
@@ -3774,13 +3774,13 @@
"buD" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"buE" = (/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"buF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/heads/cmo)
-"buG" = (/obj/structure/flora/pottedplant{ icon_state = "plant-01"},/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
+"buG" = (/obj/structure/flora/pottedplant{icon_state = "plant-01"},/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
"buH" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/corner/paleblue{dir = 5},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
"buI" = (/obj/effect/floor_decal/corner/paleblue{dir = 1},/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/mob/living/simple_animal/cat/fluff/Runtime,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
"buJ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
"buK" = (/obj/effect/floor_decal/corner/paleblue{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
"buL" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/paleblue/full{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
-"buM" = (/obj/machinery/clonepod{biomass = 600},/obj/effect/floor_decal/corner/mauve/full,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
+"buM" = (/obj/machinery/clonepod/full,/obj/effect/floor_decal/corner/mauve/full,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"buN" = (/obj/machinery/computer/cloning,/obj/effect/floor_decal/corner/mauve{dir = 10},/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"buO" = (/obj/machinery/dna_scannernew,/obj/effect/floor_decal/corner/mauve{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"buP" = (/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
@@ -3926,7 +3926,7 @@
"bxz" = (/obj/machinery/disposal,/obj/effect/floor_decal/corner/paleblue{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/tiled,/area/medical/morgue)
"bxA" = (/turf/simulated/floor/tiled,/area/medical/morgue)
"bxB" = (/obj/effect/floor_decal/corner/paleblue{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue)
-"bxC" = (/obj/structure/morgue{ icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue/full{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue)
+"bxC" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue/full{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue)
"bxD" = (/obj/structure/closet/l3closet/virology,/obj/item/clothing/mask/gas,/obj/effect/floor_decal/corner/lime{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/virology)
"bxE" = (/obj/effect/floor_decal/corner/lime{dir = 5},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/virology)
"bxF" = (/obj/effect/floor_decal/corner/lime{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology)
@@ -4016,7 +4016,7 @@
"bzl" = (/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/medical/morgue)
"bzm" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue)
"bzn" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/medical/morgue)
-"bzo" = (/obj/structure/morgue{ icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled,/area/medical/morgue)
+"bzo" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled,/area/medical/morgue)
"bzp" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/medbay_fore)
"bzq" = (/obj/effect/floor_decal/corner/lime{dir = 10},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/tiled/white,/area/medical/virology)
"bzr" = (/obj/machinery/embedded_controller/radio/airlock/access_controller{id_tag = "virology_airlock_control"; name = "Virology Access Console"; pixel_x = 8; pixel_y = -22; tag_exterior_door = "virology_airlock_exterior"; tag_interior_door = "virology_airlock_interior"},/obj/effect/floor_decal/industrial/warning/corner,/obj/effect/floor_decal/corner/lime{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology)
@@ -4039,7 +4039,7 @@
"bzI" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/terminal{dir = 4},/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor,/area/maintenance/auxsolarport)
"bzJ" = (/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Solar - Fore Port"},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/maintenance/auxsolarport)
"bzK" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport)
-"bzL" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "arrivals_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/turf/simulated/floor,/area/maintenance/research)
+"bzL" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "arrivals_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/turf/simulated/floor,/area/maintenance/research)
"bzM" = (/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor,/area/maintenance/research)
"bzN" = (/obj/structure/closet/emcloset,/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,/area/maintenance/research)
"bzO" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{pixel_x = 12; pixel_y = -25},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor,/area/maintenance/disposal)
@@ -4143,7 +4143,7 @@
"bBI" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/turf/simulated/floor,/area/maintenance/auxsolarport)
"bBJ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "solar_tool_pump"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "solar_tool_airlock"; pixel_x = 0; pixel_y = 28; req_access = list(13); tag_airpump = "solar_tool_pump"; tag_chamber_sensor = "solar_tool_sensor"; tag_exterior_door = "solar_tool_outer"; tag_interior_door = "solar_tool_inner"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_tool_sensor"; pixel_x = 0; pixel_y = -26},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor,/area/maintenance/auxsolarport)
"bBK" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_tool_inner"; locked = 1; name = "Engineering External Access"; req_access = list(11,13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/maintenance/auxsolarport)
-"bBL" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_access = list(11,13)},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor,/area/maintenance/auxsolarport)
+"bBL" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_access = list(11,13)},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor,/area/maintenance/auxsolarport)
"bBM" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/maintenance/auxsolarport)
"bBN" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/maintenance/auxsolarport)
"bBO" = (/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Port Solar Access"; req_access = list(11)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/maintenance/auxsolarport)
@@ -4152,12 +4152,12 @@
"bBR" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/maintenance/research)
"bBS" = (/obj/machinery/door/airlock/maintenance{name = "Disposal Access"; req_access = list(12)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor,/area/maintenance/disposal)
"bBT" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor,/area/maintenance/disposal)
-"bBU" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/obj/effect/floor_decal/corner/purple{dir = 9},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
+"bBU" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/obj/effect/floor_decal/corner/purple{dir = 9},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
"bBV" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
-"bBW" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 10},/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
+"bBW" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 10},/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
"bBX" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
"bBY" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
-"bBZ" = (/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/crowbar/red,/obj/item/clothing/glasses/science,/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
+"bBZ" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/crowbar/red,/obj/item/clothing/glasses/science,/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
"bCa" = (/obj/structure/table/reinforced,/obj/machinery/button/ignition{id = "Xenobio"; pixel_x = -6; pixel_y = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
"bCb" = (/obj/machinery/computer/security/telescreen{desc = "Used to monitor the proceedings inside the test chamber."; name = "Test Chamber Monitor"; network = list("Miscellaneous Reseach"); pixel_x = 32; pixel_y = 0},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/purple,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
"bCc" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/network/research{c_tag = "SCI - Research Hallway Center"; dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research)
@@ -4277,7 +4277,7 @@
"bEm" = (/obj/structure/closet/secure_closet/hydroponics,/obj/effect/floor_decal/corner/lime/full{dir = 8},/turf/simulated/floor/tiled,/area/hydroponics)
"bEn" = (/obj/effect/floor_decal/corner/lime{dir = 5},/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/tiled,/area/hydroponics)
"bEo" = (/obj/effect/floor_decal/corner/lime{dir = 5},/obj/structure/closet/secure_closet/hydroponics,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics)
-"bEp" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/closet/crate/hydroponics{desc = "All you need to start your own honey farm."; name = "beekeeping crate"},/obj/item/beehive_assembly,/obj/item/bee_smoker,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/bee_pack,/obj/item/weapon/crowbar,/obj/effect/floor_decal/corner/lime/full{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics)
+"bEp" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/closet/crate/hydroponics{desc = "All you need to start your own honey farm."; name = "beekeeping crate"},/obj/item/beehive_assembly,/obj/item/bee_smoker,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/bee_pack,/obj/item/weapon/tool/crowbar,/obj/effect/floor_decal/corner/lime/full{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics)
"bEq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access = list(35)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hydroponics)
"bEr" = (/obj/machinery/navbeacon/delivery/south{location = "Hydroponics"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading,/turf/simulated/floor/tiled,/area/hydroponics)
"bEs" = (/obj/structure/kitchenspike,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen)
@@ -4313,7 +4313,7 @@
"bEW" = (/obj/structure/table/steel,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = 3; pixel_y = -5},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = -9},/obj/effect/floor_decal/corner/paleblue{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/medical/morgue)
"bEX" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/paleblue{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue)
"bEY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/medical/morgue)
-"bEZ" = (/obj/structure/morgue{ icon_state = "morgue1"; dir = 8},/turf/simulated/floor/tiled,/area/medical/morgue)
+"bEZ" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/turf/simulated/floor/tiled,/area/medical/morgue)
"bFa" = (/obj/structure/morgue,/turf/simulated/floor/tiled,/area/medical/morgue)
"bFb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/medical/morgue)
"bFc" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/closet/l3closet/virology,/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled/white,/area/medical/virology)
@@ -4346,7 +4346,7 @@
"bFD" = (/turf/simulated/wall/r_wall,/area/assembly/robotics)
"bFE" = (/obj/structure/table/reinforced,/obj/machinery/door/window/southright{name = "Robotics Desk"; req_access = list(29)},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/assembly/robotics)
"bFF" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
-"bFG" = (/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
+"bFG" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
"bFH" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
"bFI" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/obj/effect/floor_decal/corner/blue/full{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop)
"bFJ" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/effect/floor_decal/corner/blue{dir = 5},/obj/machinery/computer/guestpass{pixel_x = 0; pixel_y = 30},/obj/item/weapon/folder/blue_hop,/obj/item/weapon/pen,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop)
@@ -4395,9 +4395,9 @@
"bGA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"bGB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"bGC" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
-"bGD" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
+"bGD" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"bGE" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
-"bGF" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
+"bGF" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"bGG" = (/obj/structure/filingcabinet/chestdrawer{desc = "A large drawer filled with autopsy reports."; name = "Autopsy Reports"},/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/turf/simulated/floor/tiled,/area/medical/morgue)
"bGH" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue)
"bGI" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/morgue)
@@ -4488,16 +4488,16 @@
"bIp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/paleblue,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -26},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue)
"bIq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor/tiled,/area/medical/morgue)
"bIr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/medical/morgue)
-"bIs" = (/obj/structure/morgue{ icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue)
+"bIs" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue)
"bIt" = (/obj/structure/morgue,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue)
"bIu" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/light,/obj/machinery/camera/network/medbay{c_tag = "MED - Morgue"; dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue)
"bIv" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue)
-"bIw" = (/obj/structure/morgue{ icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue)
+"bIw" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue)
"bIx" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virology_airlock_exterior"; locked = 1; name = "Virology Exterior Airlock"; req_access = list(39)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = -24; pixel_y = 0; req_access = list(39)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/black,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/medical/virology)
"bIy" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/wall/r_wall,/area/medical/virology)
"bIz" = (/obj/structure/table/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/gas,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/random/maintenance/research,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/research)
"bIA" = (/obj/structure/table/standard,/obj/structure/table/standard,/obj/item/stack/cable_coil,/obj/item/device/multitool,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/sparker{id = "Xenobio"; pixel_x = -25},/turf/simulated/floor/reinforced,/area/rnd/misc_lab)
-"bIB" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/turf/simulated/floor/reinforced,/area/rnd/misc_lab)
+"bIB" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/simulated/floor/reinforced,/area/rnd/misc_lab)
"bIC" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "map_injector"; id = "n2_in"; use_power = 1},/turf/simulated/floor/reinforced,/area/rnd/misc_lab)
"bID" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/rnd/research)
"bIE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/rnd/research)
@@ -4538,7 +4538,7 @@
"bJn" = (/obj/machinery/door/airlock/freezer{name = "Kitchen cold room"; req_access = list(28)},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen)
"bJo" = (/obj/machinery/camera/network/northern_star{c_tag = "Hall - Central Primary Starboard Mid 3"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bJp" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
-"bJq" = (/obj/effect/floor_decal/corner/paleblue/full,/obj/structure/flora/pottedplant{ icon_state = "plant-10"},/turf/simulated/floor/tiled/white,/area/medical/reception)
+"bJq" = (/obj/effect/floor_decal/corner/paleblue/full,/obj/structure/flora/pottedplant{icon_state = "plant-10"},/turf/simulated/floor/tiled/white,/area/medical/reception)
"bJr" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/reception)
"bJs" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/camera/network/medbay{c_tag = "MED - Lobby Aft"; dir = 1},/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/medical/reception)
"bJt" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/newscaster{pixel_y = -30},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/reception)
@@ -4651,7 +4651,7 @@
"bLw" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/patient_wing)
"bLx" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/paleblue{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/patient_wing)
"bLy" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/southleft{name = "Medical Delivery"; req_access = list(5)},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/medical/patient_wing)
-"bLz" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/west{location = "Medbay"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/medical/patient_wing)
+"bLz" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/west{location = "Medbay"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/medical/patient_wing)
"bLA" = (/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/turf/simulated/floor/tiled/dark,/area/medical/virologyaccess)
"bLB" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/virologyaccess)
"bLC" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/medical/virologyaccess)
@@ -4685,7 +4685,7 @@
"bMe" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/table/standard,/obj/item/device/robotanalyzer,/obj/item/device/robotanalyzer,/obj/item/device/mmi/digital/robot,/turf/simulated/floor/tiled,/area/assembly/robotics)
"bMf" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics)
"bMg" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics)
-"bMh" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/effect/floor_decal/corner/pink{dir = 6},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool{pixel_x = 3},/obj/item/device/multitool{pixel_x = 3},/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/turf/simulated/floor/tiled,/area/assembly/robotics)
+"bMh" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/effect/floor_decal/corner/pink{dir = 6},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool{pixel_x = 3},/obj/item/device/multitool{pixel_x = 3},/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/turf/simulated/floor/tiled,/area/assembly/robotics)
"bMi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/assembly/robotics)
"bMj" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
"bMk" = (/obj/structure/closet/secure_closet/hop2,/obj/effect/floor_decal/corner/blue{dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop)
@@ -4725,7 +4725,7 @@
"bMS" = (/obj/effect/floor_decal/corner/beige{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
"bMT" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/beige{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
"bMU" = (/obj/effect/floor_decal/corner/beige{dir = 5},/obj/structure/sink{dir = 2; icon_state = "sink"; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
-"bMV" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/screwdriver,/obj/effect/floor_decal/corner/beige{dir = 5},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 1; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
+"bMV" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/tool/screwdriver,/obj/effect/floor_decal/corner/beige{dir = 5},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 1; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
"bMW" = (/obj/machinery/button/remote/blast_door{id = "chemwindow"; name = "Pharmacy Windows Shutter Control"; pixel_x = 0; pixel_y = 24; pixel_z = 0},/obj/machinery/light_switch{pixel_x = 12; pixel_y = 25},/obj/effect/floor_decal/corner/beige{dir = 5},/obj/structure/table/reinforced,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
"bMX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/chemistry)
"bMY" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/structure/closet/secure_closet/paramedic,/obj/random/medical,/obj/random/medical,/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay)
@@ -4762,7 +4762,7 @@
"bND" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/medical/virologyaccess)
"bNE" = (/turf/simulated/floor/tiled,/area/medical/virologyaccess)
"bNF" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled,/area/medical/virologyaccess)
-"bNG" = (/obj/structure/closet/crate,/obj/random/maintenance/cargo,/turf/simulated/shuttle/floor{ icon_state = "floor_yellow"},/area/shuttle/mining/station)
+"bNG" = (/obj/structure/closet/crate,/obj/random/maintenance/cargo,/turf/simulated/shuttle/floor{icon_state = "floor_yellow"},/area/shuttle/mining/station)
"bNH" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/mining/station)
"bNI" = (/obj/machinery/computer/shuttle_control/mining{name = "mining elevator control console"},/turf/simulated/shuttle/floor,/area/shuttle/mining/station)
"bNJ" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/mining/station)
@@ -4861,7 +4861,7 @@
"bPy" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/virologyaccess)
"bPz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/medical/virologyaccess)
"bPA" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/medical/virologyaccess)
-"bPB" = (/turf/simulated/shuttle/floor{ icon_state = "floor_yellow"},/area/shuttle/mining/station)
+"bPB" = (/turf/simulated/shuttle/floor{icon_state = "floor_yellow"},/area/shuttle/mining/station)
"bPC" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/mining/station)
"bPD" = (/turf/simulated/shuttle/floor,/area/shuttle/mining/station)
"bPE" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/mining/station)
@@ -4909,7 +4909,7 @@
"bQu" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/captain)
"bQv" = (/turf/simulated/floor/tiled/freezer,/area/crew_quarters/captain)
"bQw" = (/obj/structure/toilet{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/captain)
-"bQx" = (/obj/machinery/navbeacon/delivery/east{location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/bar)
+"bQx" = (/obj/machinery/navbeacon/delivery/east{location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/bar)
"bQy" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/southleft,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/bar)
"bQz" = (/obj/structure/closet/secure_closet/bar{req_access = list(25)},/obj/item/weapon/storage/secure/safe{pixel_z = 30},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bQA" = (/obj/structure/reagent_dispensers/beerkeg,/obj/machinery/camera/network/civilian{c_tag = "CIV - Bar Storage"; dir = 2},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/wood,/area/crew_quarters/bar)
@@ -4957,7 +4957,7 @@
"bRq" = (/turf/simulated/wall,/area/hallway/secondary/escape/medical_escape_pod_hallway)
"bRr" = (/obj/machinery/door/airlock/glass_medical{name = "Medical Escape Pod"},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/medical_escape_pod_hallway)
"bRs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_medical{name = "Medical Escape Pod"},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/medical_escape_pod_hallway)
-"bRt" = (/obj/structure/ore_box,/obj/machinery/light{dir = 8},/turf/simulated/shuttle/floor{ icon_state = "floor_yellow"},/area/shuttle/mining/station)
+"bRt" = (/obj/structure/ore_box,/obj/machinery/light{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor_yellow"},/area/shuttle/mining/station)
"bRu" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "mining_shuttle"; pixel_x = 25; pixel_y = -8; req_one_access = list(13,48); tag_door = "mining_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/mining/station)
"bRv" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/research)
"bRw" = (/obj/effect/decal/cleanable/generic,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/plating,/area/maintenance/research)
@@ -5000,7 +5000,7 @@
"bSh" = (/obj/item/weapon/stool/padded,/obj/machinery/light{dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bSi" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bSj" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bSk" = (/obj/structure/flora/pottedplant{ icon_state = "plant-01"},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria)
+"bSk" = (/obj/structure/flora/pottedplant{icon_state = "plant-01"},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria)
"bSl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
"bSm" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access = list(28)},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bSn" = (/obj/machinery/door/blast/shutters{dir = 2; id = "kitchen"; layer = 3.3; name = "Kitchen Shutters"},/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
@@ -5060,7 +5060,7 @@
"bTp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera/network/research{c_tag = "SCI - Xenoflora"; dir = 2},/turf/simulated/floor/tiled/hydro,/area/rnd/xenobiology/xenoflora)
"bTq" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/hydro,/area/rnd/xenobiology/xenoflora)
"bTr" = (/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
-"bTs" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light{dir = 1},/obj/item/weapon/wrench,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
+"bTs" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light{dir = 1},/obj/item/weapon/tool/wrench,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
"bTt" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/biogenerator,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
"bTu" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/seed_extractor,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
"bTv" = (/obj/machinery/reagentgrinder,/obj/structure/table/glass,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
@@ -5068,7 +5068,7 @@
"bTx" = (/obj/structure/table/standard,/obj/machinery/light,/obj/structure/closet/secure_closet/medical_wall{name = "anesthetic closet"; pixel_x = -32; req_access = list(29)},/obj/item/weapon/tank/anesthetic,/obj/item/weapon/tank/anesthetic,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/breath/medical,/obj/item/weapon/storage/box/gloves,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bTy" = (/obj/machinery/optable{name = "Robotics Operating Table"},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bTz" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/computer/operating{name = "Robotics Operating Computer"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
-"bTA" = (/obj/structure/table/standard,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/hemostat,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
+"bTA" = (/obj/structure/table/standard,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/crowbar,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/hemostat,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bTB" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/light,/obj/machinery/computer/operating{name = "Robotics Operating Computer"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bTC" = (/obj/structure/table/standard,/obj/machinery/newscaster{pixel_x = 28; pixel_y = 1},/obj/machinery/cell_charger,/turf/simulated/floor/tiled,/area/assembly/robotics)
"bTD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central_four)
@@ -5078,7 +5078,7 @@
"bTH" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bTI" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera/network/command{c_tag = "COM - Conference Room"},/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bTJ" = (/turf/simulated/floor/wood,/area/bridge/meeting_room)
-"bTK" = (/obj/structure/table/woodentable,/obj/item/device/retail_scanner/command{ icon_state = "retail_idle"; dir = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room)
+"bTK" = (/obj/structure/table/woodentable,/obj/item/device/retail_scanner/command{icon_state = "retail_idle"; dir = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bTL" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Bridge"},/obj/machinery/light_switch{pixel_x = 36; pixel_y = 0},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bTM" = (/obj/effect/floor_decal/corner/blue{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/bridge_hallway)
"bTN" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue{dir = 6},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/bridge_hallway)
@@ -5154,7 +5154,7 @@
"bVf" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/hydro,/area/rnd/xenobiology/xenoflora)
"bVg" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/hydro,/area/rnd/xenobiology/xenoflora)
"bVh" = (/obj/effect/floor_decal/corner/green/full,/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Port to Isolation"},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
-"bVi" = (/obj/effect/floor_decal/corner/green{dir = 10},/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/obj/machinery/meter,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
+"bVi" = (/obj/effect/floor_decal/corner/green{dir = 10},/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/obj/machinery/meter,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
"bVj" = (/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
"bVk" = (/obj/effect/floor_decal/corner/green{dir = 10},/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Xenobiologist"},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
"bVl" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/obj/structure/table/glass,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 30; pixel_y = 0},/obj/item/weapon/storage/box/botanydisk,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
@@ -5173,7 +5173,7 @@
"bVy" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/command{name = "Conference Room"; req_access = list(19)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bVz" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/bridge_hallway)
"bVA" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue{dir = 6},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/bridge_hallway)
-"bVB" = (/obj/structure/flora/pottedplant{ icon_state = "plant-10"},/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bVB" = (/obj/structure/flora/pottedplant{icon_state = "plant-10"},/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bVC" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bVD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bVE" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 28},/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain)
@@ -5193,7 +5193,7 @@
"bVS" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
"bVT" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/weapon/material/kitchen/utensil/spoon{pixel_x = 2},/obj/item/weapon/material/kitchen/utensil/fork,/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
"bVU" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
-"bVV" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cash_register/civilian{ icon_state = "register_idle"; dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
+"bVV" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cash_register/civilian{icon_state = "register_idle"; dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
"bVW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/cafeteria)
"bVX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central_two)
"bVY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "chemwindow"; name = "Chemistry Window Shutters"; opacity = 0},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/chemistry)
@@ -5201,7 +5201,7 @@
"bWa" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 2; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -21},/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay)
"bWb" = (/obj/effect/floor_decal/corner/pink{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay)
"bWc" = (/obj/effect/floor_decal/corner/pink{dir = 6},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay)
-"bWd" = (/obj/structure/table/rack,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/structure/sign/poster{pixel_x = 0; pixel_y = -32},/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay)
+"bWd" = (/obj/structure/table/rack,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/structure/sign/poster{pixel_x = 0; pixel_y = -32},/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay)
"bWe" = (/obj/effect/floor_decal/corner/pink/full,/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled/white,/area/medical/patient_c)
"bWf" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/structure/table/glass,/obj/item/weapon/paper_bin,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/simulated/floor/tiled/white,/area/medical/patient_c)
"bWg" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/tiled/white,/area/medical/patient_c)
@@ -5377,9 +5377,9 @@
"bZu" = (/turf/simulated/wall,/area/maintenance/cargo)
"bZv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/cargo)
"bZw" = (/obj/machinery/door/window/northright{name = "Xenoflora Containment"; req_access = list(47)},/turf/simulated/floor/tiled/hydro,/area/rnd/xenobiology/xenoflora_storage)
-"bZx" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled/hydro,/area/rnd/xenobiology/xenoflora_storage)
+"bZx" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled/hydro,/area/rnd/xenobiology/xenoflora_storage)
"bZy" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor/tiled/hydro,/area/rnd/xenobiology/xenoflora_storage)
-"bZz" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled/hydro,/area/rnd/xenobiology/xenoflora_storage)
+"bZz" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled/hydro,/area/rnd/xenobiology/xenoflora_storage)
"bZA" = (/obj/effect/floor_decal/corner/green/full{dir = 8},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
"bZB" = (/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
"bZC" = (/obj/effect/floor_decal/corner/green/full{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora)
@@ -5414,7 +5414,7 @@
"caf" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/lino,/area/crew_quarters/bar)
"cag" = (/obj/structure/table/reinforced,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/simulated/floor/lino,/area/crew_quarters/bar)
"cah" = (/turf/simulated/floor/lino,/area/crew_quarters/bar)
-"cai" = (/obj/structure/table/reinforced,/obj/machinery/cash_register/civilian{ icon_state = "register_idle"; dir = 8},/obj/machinery/door/blast/shutters{dir = 4; id = "bar"; layer = 3.1; name = "Bar Shutters"},/turf/simulated/floor/lino,/area/crew_quarters/bar)
+"cai" = (/obj/structure/table/reinforced,/obj/machinery/cash_register/civilian{icon_state = "register_idle"; dir = 8},/obj/machinery/door/blast/shutters{dir = 4; id = "bar"; layer = 3.1; name = "Bar Shutters"},/turf/simulated/floor/lino,/area/crew_quarters/bar)
"caj" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria)
"cak" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria)
"cal" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria)
@@ -5489,7 +5489,7 @@
"cbC" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"cbD" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"cbE" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"cbF" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/barman_recipes,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/item/weapon/screwdriver,/obj/item/weapon/flame/lighter/zippo,/obj/machinery/light_switch{pixel_x = -36; pixel_y = 0},/obj/machinery/button/remote/blast_door{id = "bar"; name = "Bar Shutters"; pixel_x = -26; pixel_y = 0},/turf/simulated/floor/lino,/area/crew_quarters/bar)
+"cbF" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/barman_recipes,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/item/weapon/tool/screwdriver,/obj/item/weapon/flame/lighter/zippo,/obj/machinery/light_switch{pixel_x = -36; pixel_y = 0},/obj/machinery/button/remote/blast_door{id = "bar"; name = "Bar Shutters"; pixel_x = -26; pixel_y = 0},/turf/simulated/floor/lino,/area/crew_quarters/bar)
"cbG" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/lino,/area/crew_quarters/bar)
"cbH" = (/obj/item/weapon/stool/padded,/obj/effect/landmark/start{name = "Bartender"},/turf/simulated/floor/lino,/area/crew_quarters/bar)
"cbI" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria)
@@ -5501,7 +5501,7 @@
"cbO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/medical_emergency_hallway)
"cbP" = (/obj/effect/floor_decal/corner/pink{dir = 9},/turf/simulated/floor/tiled,/area/hallway/secondary/medical_emergency_hallway)
"cbQ" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/pink{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/medical_emergency_hallway)
-"cbR" = (/obj/effect/decal/cleanable/cobweb2{ icon_state = "cobweb1"},/obj/effect/decal/cleanable/cobweb2{icon_state = "spiderling"; name = "dead spider"},/turf/simulated/floor,/area/maintenance/medbay_aft)
+"cbR" = (/obj/effect/decal/cleanable/cobweb2{icon_state = "cobweb1"},/obj/effect/decal/cleanable/cobweb2{icon_state = "spiderling"; name = "dead spider"},/turf/simulated/floor,/area/maintenance/medbay_aft)
"cbS" = (/turf/simulated/floor,/area/maintenance/medbay_aft)
"cbT" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor,/area/maintenance/medbay_aft)
"cbU" = (/obj/effect/floor_decal/corner/pink/full,/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled/white,/area/medical/patient_e)
@@ -5542,7 +5542,7 @@
"ccD" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/item/weapon/reagent_containers/glass/rag,/obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask,/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/simulated/floor/lino,/area/crew_quarters/bar)
"ccE" = (/obj/machinery/door/window/southleft{name = "Bar"; req_access = list(25)},/obj/structure/disposalpipe/segment,/turf/simulated/floor/lino,/area/crew_quarters/bar)
"ccF" = (/obj/structure/table/reinforced,/obj/machinery/door/blast/shutters{dir = 2; id = "bar"; layer = 3.1; name = "Bar Shutters"},/turf/simulated/floor/lino,/area/crew_quarters/bar)
-"ccG" = (/obj/structure/flora/pottedplant{ icon_state = "plant-01"},/turf/simulated/floor/tiled,/area/crew_quarters/bar)
+"ccG" = (/obj/structure/flora/pottedplant{icon_state = "plant-01"},/turf/simulated/floor/tiled,/area/crew_quarters/bar)
"ccH" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria)
"ccI" = (/obj/machinery/vending/coffee,/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria)
"ccJ" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria)
@@ -5577,7 +5577,7 @@
"cdm" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/button/remote/blast_door{dir = 2; id = "Skynet_launch"; name = "Mech Bay Door Control"; pixel_x = 0; pixel_y = -26; req_access = list(29)},/turf/simulated/floor/tiled,/area/assembly/chargebay)
"cdn" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
"cdo" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
-"cdp" = (/obj/machinery/computer/station_alert/all,/obj/effect/floor_decal/corner/yellow/full{ icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/bridge)
+"cdp" = (/obj/machinery/computer/station_alert/all,/obj/effect/floor_decal/corner/yellow/full{icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/bridge)
"cdq" = (/obj/machinery/computer/power_monitor,/obj/effect/floor_decal/corner/yellow{dir = 5},/turf/simulated/floor/tiled,/area/bridge)
"cdr" = (/obj/machinery/computer/rcon,/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/yellow/full{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/bridge)
"cds" = (/obj/machinery/computer/shuttle_control/mining,/obj/effect/floor_decal/corner/brown/full{dir = 8},/obj/machinery/camera/network/command{c_tag = "COM - Bridge Port"},/turf/simulated/floor/tiled,/area/bridge)
@@ -5739,7 +5739,7 @@
"cgs" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor,/area/maintenance/medbay_aft)
"cgt" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/medbay_aft)
"cgu" = (/turf/simulated/floor/plating,/area/maintenance/medbay_aft)
-"cgv" = (/obj/structure/closet/crate,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/item/weapon/crowbar,/obj/item/weapon/wirecutters,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/turf/simulated/floor,/area/maintenance/medbay_aft)
+"cgv" = (/obj/structure/closet/crate,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/wirecutters,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/turf/simulated/floor,/area/maintenance/medbay_aft)
"cgw" = (/turf/space,/obj/structure/shuttle/engine/propulsion{dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/large_escape_pod1/station)
"cgx" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/shuttle/large_escape_pod1/station)
"cgy" = (/obj/machinery/atmospherics/unary/cryo_cell{layer = 3.3},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station)
@@ -5858,7 +5858,7 @@
"ciH" = (/obj/structure/table/reinforced,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/aicard,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/blue/full,/obj/machinery/light,/turf/simulated/floor/tiled,/area/bridge)
"ciI" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/blue/full{dir = 4},/turf/simulated/floor/tiled,/area/bridge)
"ciJ" = (/obj/machinery/computer/crew,/obj/effect/floor_decal/corner/white/full,/turf/simulated/floor/tiled,/area/bridge)
-"ciK" = (/obj/machinery/computer/med_data,/obj/effect/floor_decal/corner/white/full{ icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/bridge)
+"ciK" = (/obj/machinery/computer/med_data,/obj/effect/floor_decal/corner/white/full{icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/bridge)
"ciL" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/folder/red,/obj/item/weapon/folder/blue,/obj/item/weapon/pen,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/blue/full,/obj/machinery/light,/turf/simulated/floor/tiled,/area/bridge)
"ciM" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge)
"ciN" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donut,/obj/effect/floor_decal/corner/blue/full{dir = 4},/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/bridge)
@@ -5886,7 +5886,7 @@
"cjj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/medbay_aft)
"cjk" = (/obj/structure/table/rack,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/storage/box/lights/mixed,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/turf/simulated/floor/plating,/area/maintenance/medbay_aft)
"cjl" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station)
-"cjm" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/wrench,/obj/random/medical/lite,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station)
+"cjm" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/tool/wrench,/obj/random/medical/lite,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station)
"cjn" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire{layer = 2.9; pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = -2},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station)
"cjo" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station)
"cjp" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station)
@@ -6066,7 +6066,7 @@
"cmH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three)
"cmI" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_three)
"cmJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/central_three)
-"cmK" = (/obj/structure/flora/pottedplant{ icon_state = "plant-01"},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three)
+"cmK" = (/obj/structure/flora/pottedplant{icon_state = "plant-01"},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three)
"cmL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_three)
"cmM" = (/obj/structure/safe,/obj/item/clothing/under/color/yellow,/obj/item/key,/obj/item/toy/katana,/obj/item/weapon/melee/chainofcommand,/obj/item/weapon/disk/nuclear{name = "authentication disk"},/obj/item/weapon/moneybag/vault,/turf/simulated/floor/tiled/dark,/area/security/nuke_storage)
"cmN" = (/turf/simulated/floor/tiled/dark,/area/security/nuke_storage)
@@ -6127,7 +6127,7 @@
"cnQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/quartermaster/office)
"cnR" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/office)
"cnS" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/structure/table/standard,/obj/effect/floor_decal/corner/brown{dir = 6},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/office)
-"cnT" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/tiled,/area/quartermaster/foyer)
+"cnT" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/tiled,/area/quartermaster/foyer)
"cnU" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/flora/pottedplant,/turf/simulated/floor/tiled,/area/quartermaster/foyer)
"cnV" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/foyer)
"cnW" = (/obj/effect/floor_decal/corner/brown{dir = 4},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/tiled,/area/quartermaster/foyer)
@@ -6248,7 +6248,7 @@
"cqh" = (/obj/structure/closet/crate/medical,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/medbay_aft)
"cqi" = (/obj/machinery/autolathe,/obj/effect/floor_decal/corner/brown{dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/office)
"cqj" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/office)
-"cqk" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/tiled,/area/quartermaster/office)
+"cqk" = (/obj/machinery/computer/supplycomp/control,/turf/simulated/floor/tiled,/area/quartermaster/office)
"cql" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/office)
"cqm" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/foyer)
"cqn" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/foyer)
@@ -6487,7 +6487,7 @@
"cuM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/docking_hallway)
"cuN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/docking_hallway)
"cuO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/vacant/vacant_shop)
-"cuP" = (/obj/item/weapon/crowbar,/turf/simulated/floor/tiled,/area/vacant/vacant_shop)
+"cuP" = (/obj/item/weapon/tool/crowbar,/turf/simulated/floor/tiled,/area/vacant/vacant_shop)
"cuQ" = (/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled,/area/vacant/vacant_shop)
"cuR" = (/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = -4; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = 8; pixel_y = -4},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = -4; pixel_y = -4},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = 8},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = -4},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = 8; pixel_y = 12},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = -4; pixel_y = 12},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
"cuS" = (/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/drinks/glass2/square{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/glass2/square{pixel_x = 0; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/glass2/square{pixel_x = -8; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/glass2/square{pixel_x = 8; pixel_y = 4},/obj/item/weapon/reagent_containers/food/drinks/glass2/square{pixel_x = 0; pixel_y = 4},/obj/item/weapon/reagent_containers/food/drinks/glass2/square{pixel_x = -8; pixel_y = 4},/obj/machinery/camera/network/civilian{c_tag = "CIV - Cafe Back Room"; dir = 2},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
@@ -6519,7 +6519,7 @@
"cvs" = (/obj/structure/curtain/open/shower,/obj/machinery/door/window/southright{name = "Shower"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_12)
"cvt" = (/obj/structure/table/standard,/obj/item/weapon/tape_roll,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/obj/effect/floor_decal/corner/brown/full,/turf/simulated/floor/tiled,/area/quartermaster/office)
"cvu" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/obj/effect/floor_decal/corner/brown{dir = 10},/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/quartermaster/office)
-"cvv" = (/obj/structure/table/standard,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = -12; pixel_y = -24},/obj/effect/floor_decal/corner/brown{dir = 8},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/item/device/retail_scanner/civilian{ icon_state = "retail_idle"; dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office)
+"cvv" = (/obj/structure/table/standard,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = -12; pixel_y = -24},/obj/effect/floor_decal/corner/brown{dir = 8},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/item/device/retail_scanner/civilian{icon_state = "retail_idle"; dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office)
"cvw" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/office)
"cvx" = (/obj/effect/floor_decal/corner/brown{dir = 10},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/obj/structure/flora/pottedplant,/turf/simulated/floor/tiled,/area/quartermaster/foyer)
"cvy" = (/obj/effect/floor_decal/corner/brown{dir = 10},/obj/machinery/status_display/supply_display{pixel_y = -32},/turf/simulated/floor/tiled,/area/quartermaster/foyer)
@@ -6703,7 +6703,7 @@
"cyU" = (/obj/machinery/camera/network/civilian{c_tag = "CIV - Residential Elevator Starboard"; dir = 8},/turf/simulated/floor/tiled/dark,/area/crew_quarters/sleep/elevator)
"cyV" = (/obj/item/frame,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/tiled,/area/vacant/vacant_shop)
"cyW" = (/obj/item/stack/cable_coil/green,/turf/simulated/floor/tiled,/area/vacant/vacant_shop)
-"cyX" = (/obj/structure/table/marble,/obj/machinery/door/blast/shutters{dir = 2; id = "coffeeshop"; layer = 3.1; name = "Cafe Shutters"},/obj/machinery/cash_register/civilian{ icon_state = "register_idle"; dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
+"cyX" = (/obj/structure/table/marble,/obj/machinery/door/blast/shutters{dir = 2; id = "coffeeshop"; layer = 3.1; name = "Cafe Shutters"},/obj/machinery/cash_register/civilian{icon_state = "register_idle"; dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cyY" = (/obj/structure/table/marble,/obj/machinery/door/blast/shutters{dir = 2; id = "coffeeshop"; layer = 3.1; name = "Cafe Shutters"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cyZ" = (/obj/machinery/door/window/southright{name = "Coffee Shop"; req_one_access = list(25,28)},/obj/machinery/door/blast/shutters{dir = 2; id = "coffeeshop"; layer = 3.1; name = "Cafe Shutters"},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cza" = (/obj/machinery/door/airlock/multi_tile/glass,/obj/effect/floor_decal/corner/brown/full{dir = 8},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
@@ -6758,7 +6758,7 @@
"czX" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/quartermaster/qm)
"czY" = (/obj/structure/table/standard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/turf/simulated/floor/tiled,/area/quartermaster/qm)
"czZ" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Quartermaster"},/turf/simulated/floor/tiled,/area/quartermaster/qm)
-"cAa" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/tiled,/area/quartermaster/qm)
+"cAa" = (/obj/machinery/computer/supplycomp/control,/turf/simulated/floor/tiled,/area/quartermaster/qm)
"cAb" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/maintenance/apmaint)
"cAc" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/maintenance/apmaint)
"cAd" = (/obj/structure/table/rack,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/turf/simulated/floor,/area/maintenance/apmaint)
@@ -6789,7 +6789,7 @@
"cAC" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/vacant/vacant_shop)
"cAD" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/vacant/vacant_shop)
"cAE" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/vacant/vacant_shop)
-"cAF" = (/obj/effect/floor_decal/corner/brown/full{dir = 8},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = 32},/obj/structure/flora/pottedplant{ icon_state = "plant-01"},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
+"cAF" = (/obj/effect/floor_decal/corner/brown/full{dir = 8},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = 32},/obj/structure/flora/pottedplant{icon_state = "plant-01"},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cAG" = (/obj/effect/floor_decal/corner/brown{dir = 5},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cAH" = (/obj/effect/floor_decal/corner/brown{dir = 5},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cAI" = (/obj/effect/floor_decal/corner/brown{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
@@ -6874,7 +6874,7 @@
"cCj" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/maintenance/evahallway)
"cCk" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/vacant/vacant_shop)
"cCl" = (/obj/effect/floor_decal/corner/brown{dir = 9},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
-"cCm" = (/obj/effect/floor_decal/corner/yellow/full{ icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
+"cCm" = (/obj/effect/floor_decal/corner/yellow/full{icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cCn" = (/obj/effect/floor_decal/corner/yellow{dir = 5},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cCo" = (/obj/effect/floor_decal/corner/yellow{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cCp" = (/obj/effect/floor_decal/corner/yellow{dir = 6},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
@@ -7082,7 +7082,7 @@
"cGj" = (/obj/effect/floor_decal/corner/yellow{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cGk" = (/obj/effect/floor_decal/corner/yellow{dir = 6},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cGl" = (/obj/effect/floor_decal/corner/yellow{dir = 10},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
-"cGm" = (/obj/effect/floor_decal/corner/yellow/full{ icon_state = "corner_white_full"; dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
+"cGm" = (/obj/effect/floor_decal/corner/yellow/full{icon_state = "corner_white_full"; dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cGn" = (/obj/effect/floor_decal/corner/brown{dir = 6},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cGo" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/docking_hallway2)
"cGp" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/crew_quarters/locker)
@@ -7336,7 +7336,7 @@
"cLd" = (/obj/structure/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/longue_area)
"cLe" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/longue_area)
"cLf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/longue_area)
-"cLg" = (/obj/structure/flora/pottedplant{ icon_state = "plant-10"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/docking_hallway2)
+"cLg" = (/obj/structure/flora/pottedplant{icon_state = "plant-10"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/docking_hallway2)
"cLh" = (/obj/structure/table/standard,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/soap,/obj/random/soap,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet)
"cLi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet)
"cLj" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet)
@@ -7421,7 +7421,7 @@
"cMK" = (/obj/structure/curtain/open/shower,/obj/machinery/door/window/southright{name = "Shower"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_8)
"cML" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/storage)
"cMM" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/status_display/supply_display{pixel_y = -32},/turf/simulated/floor,/area/quartermaster/storage)
-"cMN" = (/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/storage)
+"cMN" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/storage)
"cMO" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/quartermaster/storage)
"cMP" = (/obj/machinery/button/remote/blast_door{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = 26; pixel_y = 0; req_access = list(31)},/turf/simulated/floor/tiled,/area/quartermaster/storage)
"cMQ" = (/obj/machinery/button/remote/blast_door{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -26; pixel_y = 0; req_access = list(31)},/turf/simulated/floor/tiled,/area/quartermaster/warehouse)
@@ -7442,7 +7442,7 @@
"cNf" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/secondary/engineering_hallway)
"cNg" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/engineering_hallway)
"cNh" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/secondary/engineering_hallway)
-"cNi" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/item/weapon/wirecutters,/turf/simulated/floor/tiled,/area/construction)
+"cNi" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/item/weapon/tool/wirecutters,/turf/simulated/floor/tiled,/area/construction)
"cNj" = (/obj/machinery/suit_cycler/medical,/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/eva)
"cNk" = (/obj/machinery/door/airlock/glass_command{name = "E.V.A. Cycler Access"; req_one_access = list(18)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva)
"cNl" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/eva)
@@ -7518,9 +7518,9 @@
"cOD" = (/obj/structure/table/reinforced,/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/rods{amount = 50},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva)
"cOE" = (/obj/effect/floor_decal/corner/red/full,/obj/structure/filingcabinet/chestdrawer,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/security/checkpoint2)
"cOF" = (/obj/effect/floor_decal/corner/red{dir = 10},/obj/machinery/light,/turf/simulated/floor/tiled,/area/security/checkpoint2)
-"cOG" = (/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/device/flash,/obj/machinery/camera/network/security{c_tag = "SEC - Arrival Checkpoint"; dir = 1},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor/tiled,/area/security/checkpoint2)
+"cOG" = (/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/device/flash,/obj/machinery/camera/network/security{c_tag = "SEC - Arrival Checkpoint"; dir = 1},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor/tiled,/area/security/checkpoint2)
"cOH" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
-"cOI" = (/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
+"cOI" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
"cOJ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
"cOK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
"cOL" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
@@ -7767,7 +7767,7 @@
"cTs" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
"cTt" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
"cTu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/table/standard,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmos RC"; pixel_x = 0; pixel_y = 28},/obj/item/device/t_scanner,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/radio/headset/headset_eng,/obj/item/weapon/cartridge/atmos,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/item/clothing/ears/earmuffs,/obj/item/clothing/ears/earmuffs,/obj/item/weapon/cartridge/atmos,/obj/item/device/pipe_painter,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"cTv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/standard,/obj/structure/closet/fireaxecabinet{pixel_y = 32},/obj/machinery/cell_charger,/obj/item/weapon/wrench,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"cTv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/standard,/obj/structure/closet/fireaxecabinet{pixel_y = 32},/obj/machinery/cell_charger,/obj/item/weapon/tool/wrench,/turf/simulated/floor/tiled,/area/engineering/atmos)
"cTw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/standard,/obj/machinery/newscaster{pixel_y = 30},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/belt/utility/atmostech,/obj/item/weapon/storage/belt/utility/atmostech,/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Fore Starboard"; dir = 2},/turf/simulated/floor/tiled,/area/engineering/atmos)
"cTx" = (/obj/effect/decal/warning_stripes,/obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/visible/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos)
"cTy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -7815,7 +7815,7 @@
"cUo" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/starboard)
"cUp" = (/obj/machinery/newscaster{pixel_x = 31; pixel_y = 3},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/starboard)
"cUq" = (/turf/simulated/wall,/area/crew_quarters/visitor_dining)
-"cUr" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/corner/white/diagonal{ icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dining)
+"cUr" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/corner/white/diagonal{icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dining)
"cUs" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dining)
"cUt" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dining)
"cUu" = (/obj/machinery/vending/cigarette,/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor's Dinning"; dir = 2},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dining)
@@ -7825,7 +7825,7 @@
"cUy" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
"cUz" = (/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
"cUA" = (/turf/simulated/wall,/area/crew_quarters/visitor_lodging)
-"cUB" = (/obj/effect/floor_decal/corner/white/diagonal{ icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
+"cUB" = (/obj/effect/floor_decal/corner/white/diagonal{icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
"cUC" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
"cUD" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
"cUE" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atm{pixel_y = 30},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
@@ -7990,7 +7990,7 @@
"cXH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry)
"cXI" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry)
"cXJ" = (/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry)
-"cXK" = (/obj/structure/closet/crate,/obj/item/weapon/bedsheet/orange,/obj/item/weapon/bedsheet/orange,/obj/item/weapon/bedsheet/yellow,/obj/item/weapon/bedsheet/purple,/obj/item/weapon/bedsheet/red,/obj/item/weapon/bedsheet/brown,/obj/item/weapon/bedsheet/green,/obj/effect/floor_decal/corner/white/diagonal{ icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/blue,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/machinery/light_switch{pixel_x = -12; pixel_y = -24},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry)
+"cXK" = (/obj/structure/closet/crate,/obj/item/weapon/bedsheet/orange,/obj/item/weapon/bedsheet/orange,/obj/item/weapon/bedsheet/yellow,/obj/item/weapon/bedsheet/purple,/obj/item/weapon/bedsheet/red,/obj/item/weapon/bedsheet/brown,/obj/item/weapon/bedsheet/green,/obj/effect/floor_decal/corner/white/diagonal{icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/blue,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/machinery/light_switch{pixel_x = -12; pixel_y = -24},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry)
"cXL" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
"cXM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/atmos)
"cXN" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8056,19 +8056,19 @@
"cYV" = (/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
"cYW" = (/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white{dir = 8},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
"cYX" = (/obj/structure/bed/chair{dir = 1},/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
-"cYY" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white/diagonal{ icon_state = "corner_white_diagonal"; dir = 4},/obj/item/device/communicator,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
+"cYY" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white/diagonal{icon_state = "corner_white_diagonal"; dir = 4},/obj/item/device/communicator,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
"cYZ" = (/obj/structure/closet/wardrobe/suit,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry)
"cZa" = (/obj/structure/closet/wardrobe/xenos,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry)
"cZb" = (/obj/structure/closet/wardrobe/mixed,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white{dir = 8},/obj/item/clothing/accessory/storage/knifeharness,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry)
"cZc" = (/obj/structure/closet/wardrobe/white,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white{dir = 8},/obj/machinery/light,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry)
"cZd" = (/obj/structure/closet/wardrobe/grey,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry)
-"cZe" = (/obj/structure/closet/wardrobe/black,/obj/effect/floor_decal/corner/white/diagonal{ icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/blue,/obj/random/maintenance/clean,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry)
-"cZf" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"cZe" = (/obj/structure/closet/wardrobe/black,/obj/effect/floor_decal/corner/white/diagonal{icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/blue,/obj/random/maintenance/clean,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry)
+"cZf" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos)
"cZg" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"cZh" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"cZi" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"cZi" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"cZj" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"cZk" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"cZk" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
"cZl" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"cZm" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 10; icon_state = "intact"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"cZn" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8081,7 +8081,7 @@
"cZu" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/engineering/break_room)
"cZv" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/carpet,/area/engineering/break_room)
"cZw" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/carpet,/area/engineering/break_room)
-"cZx" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/corner/white{ icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 8},/obj/machinery/camera/network/engineering{c_tag = "ENG - Foyer"; dir = 4},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/tiled,/area/engineering/foyer)
+"cZx" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/corner/white{icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 8},/obj/machinery/camera/network/engineering{c_tag = "ENG - Foyer"; dir = 4},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/tiled,/area/engineering/foyer)
"cZy" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"},/turf/simulated/floor/tiled,/area/engineering/foyer)
"cZz" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 10; icon_state = "intact"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/foyer)
"cZA" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/foyer)
@@ -8116,7 +8116,7 @@
"dad" = (/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/turf/simulated/wall/r_wall,/area/engineering/atmos)
"dae" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
"daf" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
-"dag" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/valve/digital/open{dir = 4; name = "Mixed Air Inlet Valve"},/obj/effect/floor_decal/corner/white{ icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dag" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/valve/digital/open{dir = 4; name = "Mixed Air Inlet Valve"},/obj/effect/floor_decal/corner/white{icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dah" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dai" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos)
"daj" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8129,13 +8129,13 @@
"daq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/break_room)
"dar" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/reinforced,/obj/item/weapon/storage/box/glasses/square,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/turf/simulated/floor/tiled,/area/engineering/break_room)
"das" = (/obj/structure/bed/chair/office/dark,/turf/simulated/floor/carpet,/area/engineering/break_room)
-"dat" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/corner/white{ icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 8},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/tiled,/area/engineering/foyer)
+"dat" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/corner/white{icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 8},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/tiled,/area/engineering/foyer)
"dau" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/foyer)
"dav" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/blue{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red,/obj/effect/floor_decal/corner/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer)
"daw" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/table/reinforced,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/effect/floor_decal/corner/yellow{dir = 1},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/turf/simulated/floor/tiled,/area/engineering/foyer)
"dax" = (/obj/machinery/computer/station_alert,/obj/effect/floor_decal/corner/yellow/full{dir = 1},/turf/simulated/floor/tiled,/area/engineering/foyer)
"day" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engineering_monitoring)
-"daz" = (/obj/machinery/computer/power_monitor,/obj/effect/floor_decal/corner/yellow/full{ icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
+"daz" = (/obj/machinery/computer/power_monitor,/obj/effect/floor_decal/corner/yellow/full{icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
"daA" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
"daB" = (/obj/structure/table/reinforced,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/machinery/alarm{pixel_y = 25},/obj/effect/floor_decal/corner/yellow{dir = 5},/obj/machinery/button/remote/blast_door{id = "atmoslockdown"; name = "Atmospherics Lockdown"; pixel_x = 6; pixel_y = -12; req_access = newlist(); req_one_access = list(10,24)},/obj/machinery/button/remote/blast_door{id = "englockdown"; name = "Engineering Lockdown"; pixel_x = -6; pixel_y = -12; req_access = list(10)},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
"daC" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Atmospheric Technician"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/light_switch{pixel_x = -12; pixel_y = 24},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
@@ -8161,16 +8161,16 @@
"daW" = (/obj/machinery/light/small{dir = 8},/obj/machinery/camera/network/engineering{c_tag = "Atmos Tank - Air"; dir = 4},/turf/simulated/floor/reinforced/airmix,/area/engineering/atmos)
"daX" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/reinforced/airmix,/area/engineering/atmos)
"daY" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/reinforced/airmix,/area/engineering/atmos)
-"daZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "air_in"; name = "Mixed Air Supply Control"; output_tag = "air_out"; pressure_setting = 2000; sensors = list("air_sensor" = "Tank")},/obj/effect/floor_decal/corner/white{ icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 8},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"daZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "air_in"; name = "Mixed Air Supply Control"; output_tag = "air_out"; pressure_setting = 2000; sensors = list("air_sensor" = "Tank")},/obj/effect/floor_decal/corner/white{icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 8},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dba" = (/obj/machinery/atmospherics/binary/pump{dir = 2; name = "Air Tank Bypass Pump"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dbb" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dbc" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dbd" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dbe" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dbf" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dbg" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dbh" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dbi" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{ icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dbg" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dbh" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dbi" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dbj" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dbk" = (/obj/machinery/meter,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/visible/red{dir = 4; initialize_directions = 11},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dbl" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8200,7 +8200,7 @@
"dbJ" = (/obj/structure/closet/wardrobe/white,/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge)
"dbK" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge)
"dbL" = (/obj/structure/closet/wardrobe/black,/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge)
-"dbM" = (/obj/machinery/light,/obj/structure/flora/pottedplant{ icon_state = "plant-01"},/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge)
+"dbM" = (/obj/machinery/light,/obj/structure/flora/pottedplant{icon_state = "plant-01"},/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge)
"dbN" = (/obj/machinery/atm{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge)
"dbO" = (/obj/structure/closet/wardrobe/suit,/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge)
"dbP" = (/obj/structure/closet/wardrobe/xenos,/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge)
@@ -8225,7 +8225,7 @@
"dci" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dcj" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dck" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dcl" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ icon_state = "map"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dcl" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{icon_state = "map"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dcm" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dcn" = (/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 36; pixel_y = 0},/obj/machinery/power/apc/super{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dco" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engineering/break_room)
@@ -8273,7 +8273,7 @@
"dde" = (/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
"ddf" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
"ddg" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/starboard)
-"ddh" = (/obj/structure/flora/pottedplant{ icon_state = "plant-06"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/starboard)
+"ddh" = (/obj/structure/flora/pottedplant{icon_state = "plant-06"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/starboard)
"ddi" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
"ddj" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
"ddk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
@@ -8282,15 +8282,15 @@
"ddn" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/vacant/vacant_site2)
"ddo" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/vacant/vacant_site2)
"ddp" = (/obj/structure/closet/crate,/obj/item/stack/material/steel{amount = 50},/obj/item/stack/rods,/turf/simulated/floor/tiled,/area/vacant/vacant_site2)
-"ddq" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 5},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
+"ddq" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 5},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
"ddr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Air Mix to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dds" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"ddt" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{ icon_state = "map"; dir = 8},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"ddu" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"ddt" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{icon_state = "map"; dir = 8},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"ddu" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled,/area/engineering/atmos)
"ddv" = (/obj/machinery/space_heater,/turf/simulated/floor/tiled,/area/engineering/atmos)
"ddw" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/engineering/atmos)
"ddx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"ddy" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"ddy" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos)
"ddz" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4; name = "Air to Ports"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"ddA" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"ddB" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8342,25 +8342,25 @@
"dev" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/sign/directions/medical{dir = 1; pixel_y = 32},/obj/structure/sign/directions/engineering{dir = 1; pixel_y = 32; pixel_z = -8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
"dew" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
"dex" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dey" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dez" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"deA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deB" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deC" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deD" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/directions/medical{dir = 8; pixel_y = 32},/obj/structure/sign/directions/science{dir = 8; pixel_y = 32; pixel_z = -8},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/directions/cargo{dir = 8; pixel_y = 32; pixel_z = 8},/obj/structure/sign/directions/security{dir = 8; pixel_y = 32},/obj/structure/sign/directions/engineering{dir = 8; pixel_y = 32; pixel_z = -8},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deF" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"dey" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"dez" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"deA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deB" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deC" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deD" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/directions/medical{dir = 8; pixel_y = 32},/obj/structure/sign/directions/science{dir = 8; pixel_y = 32; pixel_z = -8},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/directions/cargo{dir = 8; pixel_y = 32; pixel_z = 8},/obj/structure/sign/directions/security{dir = 8; pixel_y = 32},/obj/structure/sign/directions/engineering{dir = 8; pixel_y = 32; pixel_z = -8},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deF" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
"deG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deH" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deI" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deH" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deI" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
"deJ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deL" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deM" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deN" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Hallway Starboard 1"; dir = 2},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deO" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/directions/security{dir = 8; pixel_y = 32},/obj/structure/sign/directions/engineering{dir = 8; pixel_y = 32; pixel_z = -8},/obj/structure/sign/directions/cargo{dir = 8; pixel_y = 32; pixel_z = 8},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deP" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Hallway Starboard 2"; dir = 2},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
-"deQ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deL" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deM" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deN" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Hallway Starboard 1"; dir = 2},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deO" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/directions/security{dir = 8; pixel_y = 32},/obj/structure/sign/directions/engineering{dir = 8; pixel_y = 32; pixel_z = -8},/obj/structure/sign/directions/cargo{dir = 8; pixel_y = 32; pixel_z = 8},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deP" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Hallway Starboard 2"; dir = 2},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
+"deQ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
"deR" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
"deS" = (/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Hallway Starboard 3"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/starboard)
"deT" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor,/area/vacant/vacant_site2)
@@ -8368,28 +8368,28 @@
"deV" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/vacant/vacant_site2)
"deW" = (/turf/simulated/floor/reinforced/oxygen,/area/engineering/atmos)
"deX" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "o2_in"; use_power = 1},/turf/simulated/floor/reinforced/oxygen,/area/engineering/atmos)
-"deY" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/engineering/atmos)
-"deZ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
-"dfa" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
-"dfb" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/blue/full{dir = 8},/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Port"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dfc" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"deY" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/engineering/atmos)
+"deZ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
+"dfa" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
+"dfb" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/blue/full{dir = 8},/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Port"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dfc" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dfd" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 0; tag_north = 2; tag_south = 1; tag_west = 3; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dfe" = (/obj/structure/dispenser,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dff" = (/turf/simulated/wall,/area/engineering/atmos)
"dfg" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dfh" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{ icon_state = "map"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dfh" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{icon_state = "map"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dfi" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8; name = "Ports to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dfj" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dfk" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics"; req_access = list(24)},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dfl" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/engineering/foyer)
-"dfm" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer)
-"dfn" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Hallway"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/foyer)
-"dfo" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/foyer)
-"dfp" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/foyer)
-"dfq" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/foyer)
-"dfr" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer)
-"dfs" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer)
-"dft" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer)
+"dfj" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dfk" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics"; req_access = list(24)},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dfl" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/engineering/foyer)
+"dfm" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer)
+"dfn" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Hallway"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/foyer)
+"dfo" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/foyer)
+"dfp" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/foyer)
+"dfq" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/foyer)
+"dfr" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer)
+"dfs" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer)
+"dft" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer)
"dfu" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer)
"dfv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/foyer)
"dfw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/window/westleft{name = "Engineering Reception Desk"; req_access = list(10); req_one_access = newlist()},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/foyer)
@@ -8400,7 +8400,7 @@
"dfB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
"dfC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/camera/network/engineering{c_tag = "ENG - Monitoring Room"; dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/yellow{dir = 10},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
"dfD" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
-"dfE" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/obj/effect/floor_decal/corner/yellow/full{ icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
+"dfE" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/obj/effect/floor_decal/corner/yellow/full{icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
"dfF" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access = list(12)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/engineering)
"dfG" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/escape/dock_escape_pod_hallway_port)
"dfH" = (/obj/structure/sign/pods{dir = 1},/turf/simulated/wall,/area/hallway/secondary/escape/dock_escape_pod_hallway_port)
@@ -8447,10 +8447,10 @@
"dgw" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/reinforced/oxygen,/area/engineering/atmos)
"dgx" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "o2_sensor"},/turf/simulated/floor/reinforced/oxygen,/area/engineering/atmos)
"dgy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "o2_in"; name = "Oxygen Supply Control"; output_tag = "o2_out"; sensors = list("o2_sensor" = "Tank")},/obj/effect/floor_decal/corner/blue{dir = 9},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dgz" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dgA" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dgz" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dgA" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dgB" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/binary/pump{dir = 4; name = "O2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dgC" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{ icon_state = "map"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dgC" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{icon_state = "map"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dgD" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dgE" = (/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dgF" = (/obj/structure/frame,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8490,18 +8490,18 @@
"dhn" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
"dho" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
"dhp" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dhq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dhr" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dhs" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dht" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dhu" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dhv" = (/obj/structure/cable/green,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/power/apc/super/critical{dir = 2; is_critical = 1; name = "south bump"; pixel_y = -24},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dhw" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Hallway Port 3"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dhx" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dhy" = (/obj/machinery/light,/obj/machinery/embedded_controller/radio/docking_port_multi{child_names_txt = "Airlock One;Airlock Two;Airlock Three;Airlock Four"; child_tags_txt = "escape_dock_north_airlock;escape_dock_south_airlock;escape_dock_snorth_airlock;escape_dock_ssouth_airlock"; frequency = 1380; id_tag = "escape_dock"; pixel_x = 0; pixel_y = -25; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dhz" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Hallway Port 4"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dhA" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
-"dhB" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"dhq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"dhr" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"dhs" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"dht" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"dhu" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"dhv" = (/obj/structure/cable/green,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/power/apc/super/critical{dir = 2; is_critical = 1; name = "south bump"; pixel_y = -24},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"dhw" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Hallway Port 3"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"dhx" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"dhy" = (/obj/machinery/light,/obj/machinery/embedded_controller/radio/docking_port_multi{child_names_txt = "Airlock One;Airlock Two;Airlock Three;Airlock Four"; child_tags_txt = "escape_dock_north_airlock;escape_dock_south_airlock;escape_dock_snorth_airlock;escape_dock_ssouth_airlock"; frequency = 1380; id_tag = "escape_dock"; pixel_x = 0; pixel_y = -25; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"dhz" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Hallway Port 4"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"dhA" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
+"dhB" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
"dhC" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
"dhD" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port)
"dhE" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
@@ -8522,24 +8522,24 @@
"dhT" = (/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/weldingtool,/turf/simulated/floor/tiled,/area/vacant/vacant_site2)
"dhU" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/vacant/vacant_site2)
"dhV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "o2_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0; use_power = 1},/turf/simulated/floor/reinforced/oxygen,/area/engineering/atmos)
-"dhW" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/engineering/atmos)
-"dhX" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
+"dhW" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/engineering/atmos)
+"dhX" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
"dhY" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
"dhZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/valve/digital/open{dir = 4; name = "Oxygen Outlet Valve"},/obj/effect/floor_decal/corner/blue/full,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dia" = (/obj/machinery/atmospherics/pipe/manifold/visible/green,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dib" = (/obj/machinery/atmospherics/omni/mixer{active_power_usage = 7500; tag_east = 0; tag_east_con = null; tag_north = 2; tag_north_con = null; tag_south = 1; tag_south_con = 0.79; tag_west = 1; tag_west_con = 0.21; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dic" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"did" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{ icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"did" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos)
"die" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dif" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dig" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{ icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dig" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dih" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dii" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dij" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dik" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dil" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dim" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"din" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{ icon_state = "map"; dir = 1},/obj/machinery/meter,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/workshop)
+"din" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{icon_state = "map"; dir = 1},/obj/machinery/meter,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/workshop)
"dio" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/corner/yellow{dir = 9},/turf/simulated/floor/tiled,/area/engineering/workshop)
"dip" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/engineering/workshop)
"diq" = (/turf/simulated/floor/tiled,/area/engineering/workshop)
@@ -8599,14 +8599,14 @@
"djs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/binary/pump{dir = 4; name = "O2 to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"djt" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dju" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/binary/pump{dir = 4; name = "N2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"djv" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{ icon_state = "map"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"djv" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{icon_state = "map"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"djw" = (/obj/machinery/atmospherics/tvalve/digital/mirrored{name = "Waste to Space"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"djx" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 10},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"djx" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 10},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
"djy" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos)
"djz" = (/obj/machinery/atmospherics/valve/digital,/turf/simulated/floor/tiled,/area/engineering/atmos)
"djA" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
"djB" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Starboard"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"djC" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{ icon_state = "intact"; dir = 5},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/workshop)
+"djC" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{icon_state = "intact"; dir = 5},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/workshop)
"djD" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/workshop)
"djE" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled,/area/engineering/workshop)
"djF" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_engineeringatmos{name = "Engineering Workshop"; req_one_access = list(11,24)},/turf/simulated/floor/tiled,/area/engineering/workshop)
@@ -8658,14 +8658,14 @@
"dkz" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled,/area/vacant/vacant_site2)
"dkA" = (/turf/simulated/floor/reinforced/nitrogen,/area/engineering/atmos)
"dkB" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "n2_in"; use_power = 1},/turf/simulated/floor/reinforced/nitrogen,/area/engineering/atmos)
-"dkC" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dkD" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dkC" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dkD" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dkE" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 2; tag_south = 5; tag_west = 4; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dkF" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dkF" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dkG" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dkH" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dkI" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dkJ" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dkI" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dkJ" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dkK" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden/red{dir = 1},/turf/simulated/wall/r_wall,/area/engineering/workshop)
"dkL" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled,/area/engineering/workshop)
"dkM" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/engineering/workshop)
@@ -8711,7 +8711,7 @@
"dlA" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/reinforced/nitrogen,/area/engineering/atmos)
"dlB" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/reinforced/nitrogen,/area/engineering/atmos)
"dlC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/obj/effect/floor_decal/corner/red{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dlD" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dlD" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dlE" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 0; tag_south = 6; tag_west = 2; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dlF" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 0; tag_north = 1; tag_south = 7; tag_west = 2; use_power = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dlG" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8737,7 +8737,7 @@
"dma" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D1)
"dmb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D1)
"dmc" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dmd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white/full{ icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
+"dmd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white/full{icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dme" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dmf" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc/super/critical{dir = 4; is_critical = 1; name = "east bump"; pixel_x = 24; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dmg" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc/super/critical{dir = 8; is_critical = 1; name = "west bump"; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
@@ -8762,8 +8762,8 @@
"dmz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/valve/digital/open{dir = 4; name = "Nitrogen Outlet Valve"},/obj/effect/floor_decal/corner/red/full,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dmA" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9; icon_state = "intact"},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dmB" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 5; icon_state = "intact"},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dmC" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dmD" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dmC" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dmD" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dmE" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 10; icon_state = "intact"},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dmF" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dmG" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8783,13 +8783,13 @@
"dmU" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod5/station)
"dmV" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "centcom_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dmW" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "centcom_shuttle_dock_pump"},/obj/machinery/light/small,/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dmX" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "centcom_shuttle_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "centcom_shuttle_dock_pump"; tag_chamber_sensor = "centcom_shuttle_dock_sensor"; tag_exterior_door = "centcom_shuttle_dock_outer"; tag_interior_door = "centcom_shuttle_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "centcom_shuttle_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dmY" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
+"dmX" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "centcom_shuttle_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "centcom_shuttle_dock_pump"; tag_chamber_sensor = "centcom_shuttle_dock_sensor"; tag_exterior_door = "centcom_shuttle_dock_outer"; tag_interior_door = "centcom_shuttle_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "centcom_shuttle_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
+"dmY" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dmZ" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "centcom_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dna" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white{dir = 6; icon_state = "corner_white"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dnb" = (/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dnc" = (/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dnd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white/diagonal{ icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dnd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white/diagonal{icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dne" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dnf" = (/obj/effect/floor_decal/corner/white{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dng" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/corner/white{dir = 5},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
@@ -8831,7 +8831,7 @@
"dnQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/D2)
"dnR" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dnS" = (/obj/effect/floor_decal/corner/white{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dnT" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/corner/white{ icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dnT" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/corner/white{icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dnU" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Dock 2 Fore"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dnV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/D3)
"dnW" = (/obj/machinery/light{dir = 8},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Dock 3 Fore"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
@@ -8839,7 +8839,7 @@
"dnY" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dnZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/D4)
"doa" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
-"dob" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white{ icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
+"dob" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white{icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
"doc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Dock 4 Fore"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
"dod" = (/turf/simulated/floor/tiled/freezer,/area/vacant/vacant_site2)
"doe" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/tiled/freezer,/area/vacant/vacant_site2)
@@ -8847,7 +8847,7 @@
"dog" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
"doh" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor/tiled,/area/engineering/atmos)
"doi" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"doj" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 10},/obj/effect/floor_decal/corner/black/full,/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Aft Port"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"doj" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 10},/obj/effect/floor_decal/corner/black/full,/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Aft Port"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dok" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "co2_in"; name = "Carbon Dioxide Supply Control"; output_tag = "co2_out"; sensors = list("co2_sensor" = "Tank")},/obj/effect/floor_decal/corner/black{dir = 10},/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dol" = (/obj/effect/floor_decal/corner/black/full{dir = 4},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "CO2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dom" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "CO2 to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8857,7 +8857,7 @@
"doq" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Phoron to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dor" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Aft Starboard"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dos" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2o_in"; name = "Nitrous Oxide Supply Control"; output_tag = "n2o_out"; sensors = list("n2o_sensor" = "Tank")},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/red,/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dot" = (/obj/effect/floor_decal/corner/white/diagonal{ icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/red,/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Transit"},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dot" = (/obj/effect/floor_decal/corner/white/diagonal{icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/red,/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Transit"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dou" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dov" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dow" = (/obj/structure/closet/toolcloset,/obj/item/device/flashlight,/turf/simulated/floor/tiled,/area/engineering/workshop)
@@ -8888,17 +8888,17 @@
"doV" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
"doW" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
"doX" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9; icon_state = "intact"},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
-"doY" = (/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 6},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
+"doY" = (/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 6},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
"doZ" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9; icon_state = "intact"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
"dpa" = (/turf/simulated/wall/r_wall,/area/maintenance/atmos_control)
"dpb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(24)},/turf/simulated/floor,/area/maintenance/atmos_control)
"dpc" = (/obj/structure/closet/toolcloset,/obj/item/device/flashlight,/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering/workshop)
"dpd" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled,/area/engineering/workshop)
-"dpe" = (/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/flashlight,/obj/item/weapon/wrench,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/engineering/workshop)
+"dpe" = (/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/flashlight,/obj/item/weapon/tool/wrench,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/engineering/workshop)
"dpf" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/electrical,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/tiled,/area/engineering/workshop)
"dpg" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/item/stack/rods{amount = 50},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/cell/high,/obj/item/stack/material/glass/phoronrglass{amount = 20},/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/turf/simulated/floor/tiled,/area/engineering/workshop)
"dph" = (/obj/structure/table/reinforced,/obj/item/device/floor_painter,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/t_scanner,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 3; name = "Engineering RC"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled,/area/engineering/workshop)
-"dpi" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/box/lights/mixed,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop)
+"dpi" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/box/lights/mixed,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop)
"dpj" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering/workshop)
"dpk" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green,/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Engineering Subgrid"; name_tag = "Engineering Subgrid"},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor,/area/maintenance/substation/engineering)
"dpl" = (/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Engineering"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/maintenance/substation/engineering)
@@ -8928,11 +8928,11 @@
"dpJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
"dpK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 28},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
"dpL" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/freezer,/area/vacant/vacant_site2)
-"dpM" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 6},/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
-"dpN" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
-"dpO" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
-"dpP" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
-"dpQ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 9},/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
+"dpM" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 6},/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
+"dpN" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
+"dpO" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
+"dpP" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
+"dpQ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 9},/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level)
"dpR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/maintenance/atmos_control)
"dpS" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/engineering/workshop)
"dpT" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/engineering)
@@ -8998,8 +8998,8 @@
"drb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/engineering)
"drc" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "d1a2_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "d1a2_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"drd" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "d1a2_dock_pump"},/obj/machinery/light/small,/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dre" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "d1a2_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "d1a2_dock_pump"; tag_chamber_sensor = "d1a2_dock_sensor"; tag_exterior_door = "d1a2_dock_outer"; tag_interior_door = "d1a2_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "d1a2_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"drf" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "d1a2_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
+"dre" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "d1a2_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "d1a2_dock_pump"; tag_chamber_sensor = "d1a2_dock_sensor"; tag_exterior_door = "d1a2_dock_outer"; tag_interior_door = "d1a2_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "d1a2_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
+"drf" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "d1a2_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"drg" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "d1a2_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(13)},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"drh" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dri" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/D1)
@@ -9058,21 +9058,21 @@
"dsj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering)
"dsk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/engineering)
"dsl" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dsm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dsn" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_north_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = 26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dso" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_north_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
-"dsp" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "escape_dock_north_airlock"; master_tag = "escape_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "escape_dock_north_mech"; tag_airpump = "escape_dock_north_pump"; tag_chamber_sensor = "escape_dock_north_sensor"; tag_exterior_door = "escape_dock_north_outer"; tag_interior_door = "escape_dock_north_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_mech"},/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
+"dsm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
+"dsn" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_north_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = 26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
+"dso" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_north_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
+"dsp" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "escape_dock_north_airlock"; master_tag = "escape_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "escape_dock_north_mech"; tag_airpump = "escape_dock_north_pump"; tag_chamber_sensor = "escape_dock_north_sensor"; tag_exterior_door = "escape_dock_north_outer"; tag_interior_door = "escape_dock_north_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_mech"},/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dsq" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "escape_dock_north_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dsr" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_north_outer"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dss" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_north_starboard_outer"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_dock_north_mech"; pixel_y = 19},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
"dst" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "escape_dock_north_starboard_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dsu" = (/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"},/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "escape_dock_snorth_airlock"; master_tag = "escape_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "escape_dock_north_starboard_mech"; tag_airpump = "escape_dock_north_starboard_pump"; tag_chamber_sensor = "escape_dock_north_starboard_sensor"; tag_exterior_door = "escape_dock_north_starboard_outer"; tag_interior_door = "escape_dock_north_starboard_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_starboard_mech"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dsv" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_north_starboard_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
-"dsw" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_snorth_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dsx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dsu" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"},/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "escape_dock_snorth_airlock"; master_tag = "escape_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "escape_dock_north_starboard_mech"; tag_airpump = "escape_dock_north_starboard_pump"; tag_chamber_sensor = "escape_dock_north_starboard_sensor"; tag_exterior_door = "escape_dock_north_starboard_outer"; tag_interior_door = "escape_dock_north_starboard_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_starboard_mech"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dsv" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_north_starboard_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
+"dsw" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_snorth_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dsx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dsy" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "arrivals_dock_north_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dsz" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
-"dsA" = (/obj/machinery/light/small,/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_north_airlock"; master_tag = "arrivals_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_north_mech"; tag_airpump = "arrivals_dock_north_pump"; tag_chamber_sensor = "arrivals_dock_north_sensor"; tag_exterior_door = "arrivals_dock_north_outer"; tag_interior_door = "arrivals_dock_north_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_mech"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dsz" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
+"dsA" = (/obj/machinery/light/small,/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_north_airlock"; master_tag = "arrivals_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_north_mech"; tag_airpump = "arrivals_dock_north_pump"; tag_chamber_sensor = "arrivals_dock_north_sensor"; tag_exterior_door = "arrivals_dock_north_outer"; tag_interior_door = "arrivals_dock_north_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_mech"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dsB" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_north_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "arrivals_dock_north_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dsC" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "arrivals_dock_north_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = -26; req_one_access = list(13)},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "arrival_dock_north_mech"; pixel_y = -19},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
"dsD" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1; name = "Arrival Airlock"},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
@@ -9080,16 +9080,16 @@
"dsF" = (/obj/machinery/light/small,/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dsG" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{icon_state = "door_locked"; locked = 1; name = "Arrival Airlock"},/obj/item/tape/engineering,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
"dsH" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/item/weapon/caution/cone,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
-"dsI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
-"dsJ" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "dock_three_fore_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
-"dsK" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_three_fore_inner"; locked = 1; name = "Dock Three Internal Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
+"dsI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
+"dsJ" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "dock_three_fore_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
+"dsK" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_three_fore_inner"; locked = 1; name = "Dock Three Internal Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
"dsL" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "dock_three_fore_airlock"; name = "Airlock Console"; pixel_y = 30; req_access = list(13); tag_airpump = "dock_three_fore_pump"; tag_chamber_sensor = "dock_three_fore_sensor"; tag_exterior_door = "dock_three_fore_outer"; tag_interior_door = "dock_three_fore_inner"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
-"dsM" = (/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "dock_three_fore_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
+"dsM" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "dock_three_fore_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dsN" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_three_fore_outer"; locked = 1; name = "Dock Three External Access"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
"dsO" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_four_fore_outer"; locked = 1; name = "Dock Four External Access"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4)
"dsP" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "dock_four_fore_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
-"dsQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"},/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "dock_four_fore_airlock"; name = "Airlock Console"; pixel_y = 30; req_access = list(13); tag_airpump = "dock_four_fore_pump"; tag_chamber_sensor = "dock_four_fore_sensor"; tag_exterior_door = "dock_four_fore_outer"; tag_interior_door = "dock_four_fore_inner"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
-"dsR" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_four_fore_inner"; locked = 1; name = "Dock Four Internal Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4)
+"dsQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"},/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "dock_four_fore_airlock"; name = "Airlock Console"; pixel_y = 30; req_access = list(13); tag_airpump = "dock_four_fore_pump"; tag_chamber_sensor = "dock_four_fore_sensor"; tag_exterior_door = "dock_four_fore_outer"; tag_interior_door = "dock_four_fore_inner"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
+"dsR" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_four_fore_inner"; locked = 1; name = "Dock Four Internal Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4)
"dsS" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "dock_four_fore_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
"dsT" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4)
"dsU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/airless,/area/solar/port)
@@ -9250,8 +9250,8 @@
"dvT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/engineering)
"dvU" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "specops_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dvV" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "specops_dock_pump"},/obj/machinery/light/small,/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dvW" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "specops_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "specops_dock_pump"; tag_chamber_sensor = "specops_dock_sensor"; tag_exterior_door = "specops_dock_outer"; tag_interior_door = "specops_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "specops_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dvX" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
+"dvW" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "specops_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "specops_dock_pump"; tag_chamber_sensor = "specops_dock_sensor"; tag_exterior_door = "specops_dock_outer"; tag_interior_door = "specops_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "specops_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
+"dvX" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dvY" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "specops_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dvZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dwa" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
@@ -9269,15 +9269,15 @@
"dwm" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"dwn" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "robotics_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "robotics_solar_pump"; tag_exterior_door = "robotics_solar_outer"; frequency = 1379; id_tag = "robotics_solar_airlock"; tag_interior_door = "robotics_solar_inner"; layer = 3.3; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_chamber_sensor = "robotics_solar_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "robotics_solar_sensor"; layer = 3.3; pixel_x = 12; pixel_y = -25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"dwo" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_inner"; locked = 1; name = "Engineering External Access"; req_access = list(11,13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"dwp" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; layer = 3.3; master_tag = "robotics_solar_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(11,13)},/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/portsolar)
+"dwp" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; layer = 3.3; master_tag = "robotics_solar_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(11,13)},/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"dwq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"dwr" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"dws" = (/obj/machinery/door/airlock/engineering{name = "Aft Port Solar Access"; req_access = list(11)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"dwt" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eng_port_airlock"; name = "interior access button"; pixel_x = 0; pixel_y = -25; req_one_access = list(11,24)},/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
"dwu" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
"dwv" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/effect/floor_decal/industrial/warning,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
-"dww" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
-"dwx" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
+"dww" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
+"dwx" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
"dwy" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/engineering{c_tag = "ENG - Hallway Starboard"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
"dwz" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
"dwA" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/effect/floor_decal/industrial/warning,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "engineering_dock_airlock"; name = "interior access button"; pixel_x = 30; pixel_y = -25; req_one_access = list(13,11,24)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
@@ -9329,22 +9329,22 @@
"dxu" = (/obj/machinery/door/airlock/maintenance_hatch{icon_state = "door_closed"; locked = 0; name = "Engine Access"; req_one_access = list(11)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled/steel,/area/engineering/engine_airlock)
"dxv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engineering/engine_airlock)
"dxw" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
-"dxx" = (/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
+"dxx" = (/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dxy" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "escape_dock_south_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "escape_dock_south_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dxz" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_outer"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "escape_dock_south_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = 26; req_one_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dxA" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_starboard_outer"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "escape_dock_south_starboard_airlock"; name = "exterior access button"; pixel_x = -4; pixel_y = 26; req_one_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
"dxB" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "escape_dock_south_starboard_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "escape_dock_south_starboard_sensor"; pixel_x = 0; pixel_y = 25},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dxC" = (/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dxC" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dxD" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_starboard_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
"dxE" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dxF" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/item/weapon/caution/cone,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dxG" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_three_mid_inner"; locked = 1; name = "Dock Three Internal Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
"dxH" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
-"dxI" = (/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "dock_three_mid_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "dock_three_mid_sensor"; pixel_x = 0; pixel_y = 25},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
+"dxI" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "dock_three_mid_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "dock_three_mid_sensor"; pixel_x = 0; pixel_y = 25},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dxJ" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "dock_three_mid_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = 26; req_access = list(13)},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_three_mid_outer"; locked = 1; name = "Dock Three External Access"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
"dxK" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_four_mid_outer"; locked = 1; name = "Dock Four External Access"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "dock_four_mid_airlock"; name = "exterior access button"; pixel_x = -4; pixel_y = 26; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4)
"dxL" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "dock_four_mid_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "dock_four_mid_sensor"; pixel_x = 0; pixel_y = 25},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
-"dxM" = (/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
+"dxM" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
"dxN" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_four_mid_inner"; locked = 1; name = "Dock Four Internal Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4)
"dxO" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/hallway/secondary/escape/dock_escape_pod_hallway_starboard)
"dxP" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Escape Pods Starboard 1"},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/dock_escape_pod_hallway_starboard)
@@ -9379,34 +9379,34 @@
"dys" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
"dyt" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dyu" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dyv" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_south_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = -26; req_one_access = list(13)},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dyw" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
+"dyv" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_south_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = -26; req_one_access = list(13)},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
+"dyw" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dyx" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "escape_dock_south_airlock"; master_tag = "escape_dock"; pixel_y = -30; req_one_access = list(13); tag_airlock_mech_sensor = "escape_dock_south_mech"; tag_airpump = "escape_dock_south_pump"; tag_chamber_sensor = "escape_dock_south_sensor"; tag_exterior_door = "escape_dock_south_outer"; tag_interior_door = "escape_dock_south_inner"; tag_shuttle_mech_sensor = "shuttle_dock_south_mech"},/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dyy" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "escape_dock_south_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dyz" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_outer"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dyA" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_starboard_outer"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
"dyB" = (/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "escape_dock_south_starboard_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dyC" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "escape_dock_ssouth_airlock"; master_tag = "escape_dock"; pixel_y = -30; req_one_access = list(13); tag_airlock_mech_sensor = "escape_dock_south_starboard_mech"; tag_airpump = "escape_dock_south_starboard_pump"; tag_chamber_sensor = "escape_dock_south_starboard_sensor"; tag_exterior_door = "escape_dock_south_starboard_outer"; tag_interior_door = "escape_dock_south_starboard_inner"; tag_shuttle_mech_sensor = "shuttle_dock_south_starboard_mech"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dyD" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_starboard_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
-"dyE" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_ssouth_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dyD" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_starboard_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
+"dyE" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_ssouth_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dyF" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "arrivals_dock_south_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dyG" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
-"dyH" = (/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_south_airlock"; master_tag = "arrivals_dock"; pixel_y = -30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_south_mech"; tag_airpump = "arrivals_dock_south_pump"; tag_chamber_sensor = "arrivals_dock_south_sensor"; tag_exterior_door = "arrivals_dock_south_outer"; tag_interior_door = "arrivals_dock_south_inner"; tag_shuttle_mech_sensor = "shuttle_dock_south_mech"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dyG" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
+"dyH" = (/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_south_airlock"; master_tag = "arrivals_dock"; pixel_y = -30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_south_mech"; tag_airpump = "arrivals_dock_south_pump"; tag_chamber_sensor = "arrivals_dock_south_sensor"; tag_exterior_door = "arrivals_dock_south_outer"; tag_interior_door = "arrivals_dock_south_inner"; tag_shuttle_mech_sensor = "shuttle_dock_south_mech"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dyI" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_south_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "arrivals_dock_south_sensor"; pixel_x = 0; pixel_y = 25},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dyJ" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "arrivals_dock_south_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = 26; req_one_access = list(13)},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "arrivals_dock_south_mech"; pixel_y = 19},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
"dyK" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1; name = "Arrival Airlock"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
"dyL" = (/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dyM" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/item/tape/engineering,/obj/machinery/door/airlock/glass_external{icon_state = "door_locked"; locked = 1; name = "Arrival Airlock"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
"dyN" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/obj/item/weapon/caution/cone,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
-"dyO" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "dock_three_mid_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
-"dyP" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_three_mid_inner"; locked = 1; name = "Dock Three Internal Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
+"dyO" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "dock_three_mid_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
+"dyP" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_three_mid_inner"; locked = 1; name = "Dock Three Internal Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
"dyQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "dock_three_mid_airlock"; name = "Airlock Console"; pixel_y = -30; req_access = list(13); tag_airpump = "dock_three_mid_pump"; tag_chamber_sensor = "dock_three_mid_sensor"; tag_exterior_door = "dock_three_mid_outer"; tag_interior_door = "dock_three_mid_inner"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dyR" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "dock_three_mid_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dyS" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_three_mid_outer"; locked = 1; name = "Dock Three External Access"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
"dyT" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_four_mid_outer"; locked = 1; name = "Dock Four External Access"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4)
"dyU" = (/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "dock_four_mid_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
"dyV" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "dock_four_mid_airlock"; name = "Airlock Console"; pixel_y = -30; req_access = list(13); tag_airpump = "dock_four_mid_pump"; tag_chamber_sensor = "dock_four_mid_sensor"; tag_exterior_door = "dock_four_mid_outer"; tag_interior_door = "dock_four_mid_inner"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
-"dyW" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_four_mid_inner"; locked = 1; name = "Dock Four Internal Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4)
+"dyW" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_four_mid_inner"; locked = 1; name = "Dock Four Internal Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4)
"dyX" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "dock_four_mid_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
"dyY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
"dyZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
@@ -9531,8 +9531,8 @@
"dBo" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eng_starboard_airlock"; name = "exterior access button"; pixel_x = 0; pixel_y = 25; req_access = newlist(); req_one_access = list(11,24)},/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/airless,/area/engineering/aft_hallway)
"dBp" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "d1a4_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "d1a4_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dBq" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "d1a4_dock_pump"},/obj/machinery/light/small,/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dBr" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "d1a4_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "d1a4_dock_pump"; tag_chamber_sensor = "d1a4_dock_sensor"; tag_exterior_door = "d1a4_dock_outer"; tag_interior_door = "d1a4_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "d1a4_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dBs" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "d1a4_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
+"dBr" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "d1a4_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "d1a4_dock_pump"; tag_chamber_sensor = "d1a4_dock_sensor"; tag_exterior_door = "d1a4_dock_outer"; tag_interior_door = "d1a4_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "d1a4_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
+"dBs" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "d1a4_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dBt" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "d1a4_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(13)},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dBu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dBv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
@@ -9554,7 +9554,7 @@
"dBL" = (/turf/simulated/shuttle/floor,/area/shuttle/constructionsite/station)
"dBM" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "engineering_shuttle"; pixel_x = 25; pixel_y = 5; req_one_access = list(13,11,24); tag_door = "engineering_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/constructionsite/station)
"dBN" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_waste)
-"dBO" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 6},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/engineering/engine_waste)
+"dBO" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 6},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/engineering/engine_waste)
"dBP" = (/obj/machinery/atmospherics/pipe/simple/visible/black,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/engineering/engine_waste)
"dBQ" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor,/area/engineering/engine_waste)
"dBR" = (/obj/machinery/power/smes/buildable{charge = 1e+007; cur_coils = 4; input_attempt = 1; input_level = 500000; output_level = 500000; RCon_tag = "Engine - Main"},/obj/structure/cable,/obj/effect/engine_setup/smes/main,/turf/simulated/floor/plating,/area/engineering/engine_smes)
@@ -9601,7 +9601,7 @@
"dCG" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/space,/area/space)
"dCH" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/space,/area/space)
"dCI" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/structure/lattice,/turf/space,/area/space)
-"dCJ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ icon_state = "intact"; dir = 10},/turf/space,/area/space)
+"dCJ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{icon_state = "intact"; dir = 10},/turf/space,/area/space)
"dCK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dCL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dCM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
@@ -9618,7 +9618,7 @@
"dCX" = (/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/syndicate_station/southwest)
"dCY" = (/obj/machinery/computer/atmos_alert,/obj/machinery/light{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/constructionsite/station)
"dCZ" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/constructionsite/station)
-"dDa" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
+"dDa" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"dDb" = (/obj/machinery/atmospherics/pipe/simple/visible/black,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"dDc" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineEmitterPortWest"; name = "Engine Room Blast Doors"; pixel_x = 0; pixel_y = 25; req_access = null; req_one_access = list(11,24)},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dDd" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -9637,9 +9637,9 @@
"dDq" = (/obj/machinery/portable_atmospherics/canister/phoron,/turf/simulated/floor,/area/engineering/engine_room)
"dDr" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dDs" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/obj/structure/lattice,/turf/space,/area/space)
-"dDt" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ icon_state = "intact"; dir = 10},/obj/structure/lattice,/turf/space,/area/space)
+"dDt" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{icon_state = "intact"; dir = 10},/obj/structure/lattice,/turf/space,/area/space)
"dDu" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/obj/structure/lattice,/turf/space,/area/space)
-"dDv" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ icon_state = "intact"; dir = 9},/obj/structure/lattice,/turf/space,/area/space)
+"dDv" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{icon_state = "intact"; dir = 9},/obj/structure/lattice,/turf/space,/area/space)
"dDw" = (/obj/structure/lattice,/obj/structure/grille/broken,/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/space)
"dDx" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dDy" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
@@ -9667,7 +9667,7 @@
"dDU" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/shuttle/constructionsite/station)
"dDV" = (/turf/simulated/floor,/area/engineering/engine_room)
"dDW" = (/obj/machinery/atmospherics/pipe/simple/visible/black,/turf/simulated/floor,/area/engineering/engine_room)
-"dDX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/engine_room)
+"dDX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/engine_room)
"dDY" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/engine_room)
"dDZ" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dEa" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -9699,7 +9699,7 @@
"dEA" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 4; tag_south = 2; tag_west = 0; use_power = 0},/obj/effect/engine_setup/atmo_filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dEB" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor,/area/engineering/engine_room)
"dEC" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 0; tag_north = 4; tag_south = 2; tag_west = 1; use_power = 0},/obj/effect/engine_setup/atmo_filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
-"dED" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/engine_room)
+"dED" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/engine_room)
"dEE" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/turf/simulated/floor,/area/engineering/engine_room)
"dEF" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dEG" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -9708,20 +9708,20 @@
"dEJ" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/effect/engine_setup/pump_max,/turf/simulated/floor,/area/engineering/engine_room)
"dEK" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"dEL" = (/obj/machinery/atmospherics/valve/digital{dir = 4; name = "Emergency Cooling Valve 1"},/turf/simulated/floor/plating,/area/engineering/engine_room)
-"dEM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dEM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dEN" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"dEO" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/obj/effect/engine_setup/pump_max,/turf/simulated/floor,/area/engineering/engine_room)
"dEP" = (/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/engine_setup/coolant_canister,/turf/simulated/floor,/area/engineering/engine_room)
"dEQ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/space,/area/space)
-"dER" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ icon_state = "intact"; dir = 9},/turf/space,/area/space)
+"dER" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{icon_state = "intact"; dir = 9},/turf/space,/area/space)
"dES" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dET" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
+"dET" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dEU" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "trade_shuttle_dock_airlock"; pixel_x = 28; pixel_y = 0; req_one_access = list(13); tag_airpump = "trade_shuttle_dock_pump"; tag_chamber_sensor = "trade_shuttle_dock_sensor"; tag_exterior_door = "trade_shuttle_dock_outer"; tag_interior_door = "trade_shuttle_dock_inner"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dEV" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "admin_shuttle_dock_airlock"; pixel_x = -28; pixel_y = 0; req_one_access = list(13); tag_airpump = "admin_shuttle_dock_pump"; tag_chamber_sensor = "admin_shuttle_dock_sensor"; tag_exterior_door = "admin_shuttle_dock_outer"; tag_interior_door = "admin_shuttle_dock_inner"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dEW" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dEW" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dEX" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"},/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dEY" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
-"dEZ" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
+"dEZ" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dFa" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "dock_three_aft_airlock"; name = "Airlock Console"; pixel_x = 28; pixel_y = 0; req_access = list(13); tag_airpump = "dock_three_aft_pump"; tag_chamber_sensor = "dock_three_aft_sensor"; tag_exterior_door = "dock_three_aft_outer"; tag_interior_door = "dock_three_aft_inner"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dFb" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "nuke_shuttle_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4)
"dFc" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "nuke_shuttle_dock_airlock"; pixel_x = 0; pixel_y = 30; req_access = list(0); req_one_access = list(13); tag_airpump = "nuke_shuttle_dock_pump"; tag_chamber_sensor = "nuke_shuttle_dock_sensor"; tag_exterior_door = "nuke_shuttle_dock_outer"; tag_interior_door = "nuke_shuttle_dock_inner"},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4)
@@ -9731,14 +9731,14 @@
"dFg" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod4/station)
"dFh" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod3/station)
"dFi" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"dFj" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_xeno_pump"; tag_exterior_door = "solar_xeno_outer"; frequency = 1379; id_tag = "solar_xeno_airlock"; tag_interior_door = "solar_xeno_inner"; pixel_x = 25; req_access = list(13); tag_chamber_sensor = "solar_xeno_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_xeno_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "solar_xeno_pump"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/cee{ icon_state = "warningcee"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
+"dFj" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_xeno_pump"; tag_exterior_door = "solar_xeno_outer"; frequency = 1379; id_tag = "solar_xeno_airlock"; tag_interior_door = "solar_xeno_inner"; pixel_x = 25; req_access = list(13); tag_chamber_sensor = "solar_xeno_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_xeno_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "solar_xeno_pump"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"dFk" = (/turf/space,/area/skipjack_station/southwest_solars)
"dFl" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 5},/turf/simulated/floor,/area/engineering/engine_room)
"dFm" = (/obj/machinery/atmospherics/pipe/manifold/visible/black{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"dFn" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 9},/turf/simulated/floor,/area/engineering/engine_room)
"dFo" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dFp" = (/obj/machinery/power/emitter{anchored = 1; id = "EngineEmitter"; state = 2},/obj/structure/cable/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room)
-"dFq" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dFq" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dFr" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dFs" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dFt" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -9746,8 +9746,8 @@
"dFv" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 8},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dFw" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dFx" = (/obj/machinery/atmospherics/binary/pump/high_power{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/effect/engine_setup/pump_max,/turf/simulated/floor/plating,/area/engineering/engine_room)
-"dFy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engine_room)
-"dFz" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{ icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/space,/area/space)
+"dFy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dFz" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/space,/area/space)
"dFA" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Dock 1 End"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "trade_shuttle_dock_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dFB" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "trade_shuttle_dock_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "trade_shuttle_dock_sensor"; pixel_x = 30; pixel_y = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dFC" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "admin_shuttle_dock_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "admin_shuttle_dock_sensor"; pixel_x = -30; pixel_y = 8},/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
@@ -9778,7 +9778,7 @@
"dGb" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dGc" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dGd" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
-"dGe" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dGe" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dGf" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D1)
"dGg" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "trade_shuttle_dock_outer"; locked = 1; name = "Dock One External Access"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dGh" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "trade_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = 28; pixel_y = -6; req_access = list(13)},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "trade_shuttle_dock_outer"; locked = 1; name = "Dock One External Access"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
@@ -9799,7 +9799,7 @@
"dGw" = (/obj/machinery/atmospherics/pipe/manifold/visible/black{dir = 4},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/engine_room)
"dGx" = (/obj/machinery/camera/network/engine{c_tag = "ENG - Engine Core West"; dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dGy" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_access_hatch"; locked = 1; req_access = list(11)},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room)
-"dGz" = (/obj/structure/grille,/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{ icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{ icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced{ icon_state = "phoronrwindow"; dir = 8},/obj/machinery/door/blast/regular{dir = 8; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dGz" = (/obj/structure/grille,/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/obj/machinery/door/blast/regular{dir = 8; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dGA" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_access_hatch"; locked = 1; req_access = list(11)},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dGB" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/obj/machinery/meter,/obj/machinery/camera/network/engine{c_tag = "ENG - Engine Core East"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dGC" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -9815,18 +9815,18 @@
"dGM" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/engine_setup/coolant_canister,/turf/simulated/floor,/area/engineering/engine_room)
"dGN" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"dGO" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
-"dGP" = (/obj/structure/grille,/obj/structure/window/phoronreinforced{ icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{ icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced{ icon_state = "phoronrwindow"; dir = 8},/obj/machinery/door/blast/regular{dir = 1; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dGP" = (/obj/structure/grille,/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/obj/machinery/door/blast/regular{dir = 1; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dGQ" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1438; icon_state = "map_injector"; id = "cooling_in"; name = "Coolant Injector"; pixel_y = 1; power_rating = 30000; use_power = 1; volume_rate = 700},/obj/effect/floor_decal/industrial/warning/corner,/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room)
"dGR" = (/obj/machinery/air_sensor{frequency = 1438; id_tag = "engine_sensor"; output = 63},/obj/effect/floor_decal/industrial/warning,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room)
"dGS" = (/obj/machinery/atmospherics/unary/vent_pump/engine{dir = 1; external_pressure_bound = 100; external_pressure_bound_default = 0; frequency = 1438; icon_state = "map_vent_in"; id_tag = "cooling_out"; initialize_directions = 1; use_power = 1; pressure_checks = 1; pressure_checks_default = 1; pump_direction = 0},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room)
"dGT" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
-"dGU" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/engineering/engine_room)
-"dGV" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 6},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dGU" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dGV" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 6},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dGW" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9; icon_state = "intact"},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dGX" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/black,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dGY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/solar/starboard)
"dGZ" = (/obj/machinery/atmospherics/unary/heat_exchanger,/turf/simulated/floor,/area/engineering/engine_room)
-"dHa" = (/obj/structure/grille,/obj/structure/window/phoronreinforced{ icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{ icon_state = "phoronrwindow"; dir = 8},/obj/machinery/door/blast/regular{dir = 1; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dHa" = (/obj/structure/grille,/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/obj/machinery/door/blast/regular{dir = 1; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dHb" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room)
"dHc" = (/obj/machinery/power/supermatter{layer = 4},/obj/machinery/mass_driver{id = "enginecore"},/obj/effect/engine_setup/core,/turf/simulated/floor/greengrid/nitrogen,/area/engineering/engine_room)
"dHd" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room)
@@ -9835,11 +9835,11 @@
"dHg" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 9},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dHh" = (/obj/machinery/atmospherics/pipe/manifold/visible/black{dir = 8},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/engine_room)
"dHi" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 10},/turf/simulated/floor,/area/engineering/engine_room)
-"dHj" = (/obj/structure/grille,/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{ icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{ icon_state = "phoronrwindow"; dir = 8},/obj/machinery/door/blast/regular{dir = 1; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dHj" = (/obj/structure/grille,/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/obj/machinery/door/blast/regular{dir = 1; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dHk" = (/obj/effect/floor_decal/industrial/warning/cee,/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room)
"dHl" = (/turf/simulated/floor/greengrid/nitrogen,/area/engineering/engine_room)
"dHm" = (/obj/machinery/camera/network/engine{c_tag = "ENG - Engine Core South"; dir = 1},/obj/effect/floor_decal/industrial/warning/cee,/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room)
-"dHn" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{ icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dHn" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dHo" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dHp" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dHq" = (/obj/machinery/atmospherics/valve/digital{dir = 4; name = "Emergency Cooling Valve 2"},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -10175,4 +10175,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
-
diff --git a/maps/northern_star/polaris-2.dmm b/maps/northern_star/polaris-2.dmm
index 7ed9493bda..a2c9a941bd 100644
--- a/maps/northern_star/polaris-2.dmm
+++ b/maps/northern_star/polaris-2.dmm
@@ -660,7 +660,7 @@
"mJ" = (/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space)
"mK" = (/obj/structure/lattice,/turf/space,/area/space)
"mL" = (/obj/structure/table/reinforced,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
-"mM" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/obj/item/weapon/wrench,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"mM" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"mN" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"mO" = (/obj/effect/floor_decal/corner/blue{dir = 9},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"mP" = (/obj/structure/table/reinforced,/obj/item/device/aicard,/obj/item/weapon/pinpointer/advpinpointer,/obj/item/weapon/stamp/centcomm,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
@@ -685,7 +685,7 @@
"ni" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashshells,/obj/item/weapon/storage/box/flashshells,/obj/item/weapon/storage/box/stunshells,/obj/item/weapon/storage/box/stunshells,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/beanbags,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"nj" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/handcuffs{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"nk" = (/obj/structure/table/reinforced,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
-"nl" = (/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"nl" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/wrench,/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"nm" = (/obj/structure/table/rack,/obj/item/rig_module/device/drill,/obj/item/rig_module/device/drill,/obj/item/rig_module/maneuvering_jets,/obj/item/rig_module/maneuvering_jets,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"nn" = (/obj/structure/table/rack,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"no" = (/obj/structure/table/rack,/obj/item/rig_module/grenade_launcher,/obj/item/rig_module/grenade_launcher,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
@@ -711,7 +711,7 @@
"nI" = (/obj/structure/table/rack,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"nJ" = (/obj/structure/table/rack,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"nK" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
-"nL" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/obj/item/weapon/wrench,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"nL" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"nM" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; enabled = 0; req_one_access = list(103); use_power = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"nN" = (/obj/machinery/vending/snack{name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"nO" = (/obj/structure/closet/wardrobe/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
@@ -755,7 +755,7 @@
"oA" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"oB" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1441; listening = 0; name = "Spec Ops Intercom"; pixel_y = 28},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"oC" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
-"oD" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"oD" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"oE" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donut,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"oF" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"oG" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT1"; name = "Launch Bay #1"; p_open = 0},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops)
@@ -772,7 +772,7 @@
"oR" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/centcom/specops)
"oS" = (/obj/effect/floor_decal/corner/white{dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"oT" = (/obj/structure/table/reinforced,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
-"oU" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"oU" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"oV" = (/obj/structure/table/reinforced,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"oW" = (/obj/machinery/cell_charger,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"oX" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
@@ -981,7 +981,7 @@
"sS" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space)
"sT" = (/obj/structure/table/rack,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = 32},/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"sU" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = 32},/obj/item/weapon/gun/energy/ionrifle,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
-"sV" = (/obj/structure/table/rack,/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
+"sV" = (/obj/structure/table/rack,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"sW" = (/obj/structure/table/rack,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"sX" = (/obj/structure/table/rack,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"sY" = (/obj/structure/table/rack,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
@@ -1133,7 +1133,7 @@
"vO" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters_infirmary"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start)
"vP" = (/turf/simulated/shuttle/floor/white,/area/syndicate_station/start)
"vQ" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start)
-"vR" = (/obj/structure/table/standard,/obj/item/weapon/screwdriver,/obj/effect/spawner/newbomb/timer/syndicate,/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start)
+"vR" = (/obj/structure/table/standard,/obj/item/weapon/tool/screwdriver,/obj/effect/spawner/newbomb/timer/syndicate,/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start)
"vS" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "syndieshutters_workshop"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start)
"vT" = (/obj/structure/table/rack,/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"vU" = (/obj/structure/table/rack,/obj/item/weapon/rig/merc/empty,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
@@ -1212,7 +1212,7 @@
"xp" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor/white,/area/syndicate_station/start)
"xq" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/closet/secure_closet/medical_wall{pixel_x = 32; pixel_y = 0; req_access = list(150)},/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/gloves/sterile/latex,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/turf/simulated/shuttle/floor/white,/area/syndicate_station/start)
"xr" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start)
-"xs" = (/obj/item/weapon/crowbar,/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start)
+"xs" = (/obj/item/weapon/tool/crowbar,/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start)
"xt" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start)
"xu" = (/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start)
"xv" = (/obj/machinery/door/airlock/external,/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal)
@@ -1357,7 +1357,7 @@
"Ae" = (/obj/structure/closet/secure_closet/bar,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/restaurant)
"Af" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cash_register/civilian{ icon_state = "register_idle"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/restaurant)
"Ag" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/white/diagonal,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/restaurant)
-"Ah" = (/obj/machinery/computer/ordercomp,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command)
+"Ah" = (/obj/machinery/computer/supplycomp/control,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command)
"Ai" = (/obj/machinery/button/remote/blast_door{id = "crescent_checkpoint_access"; name = "Crescent Checkpoint Access"; pixel_x = -6; pixel_y = -24; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_thunderdome"; name = "Thunderdome Access"; pixel_x = 6; pixel_y = -24; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_vip_shuttle"; name = "VIP Shuttle Access"; pixel_x = 6; pixel_y = -34; req_access = list(101)},/obj/machinery/turretid{pixel_x = 28; pixel_y = -28; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command)
"Aj" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Centcom"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command)
"Ak" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command)
@@ -1710,7 +1710,7 @@
"GT" = (/obj/machinery/door/airlock{name = "Unit 4"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
"GU" = (/obj/machinery/door/airlock{name = "Unit 5"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
"GV" = (/obj/machinery/door/airlock{name = "Unit 6"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
-"GW" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
+"GW" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/tool/crowbar,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"GX" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access = list(1)},/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom)
"GY" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/material/ashtray/bronze{pixel_x = -1; pixel_y = 1},/obj/machinery/camera/network/crescent{c_tag = "Crescent Bar East"; dir = 4},/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
"GZ" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/material/ashtray/bronze{pixel_x = -1; pixel_y = 1},/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
@@ -1783,7 +1783,7 @@
"Io" = (/obj/machinery/bodyscanner{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
"Ip" = (/obj/machinery/body_scanconsole,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
"Iq" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/o2,/obj/effect/floor_decal/corner/green{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
-"Ir" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 5; pixel_y = 5},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/wrench,/obj/effect/floor_decal/corner/blue/full,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
+"Ir" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 5; pixel_y = 5},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/tool/wrench,/obj/effect/floor_decal/corner/blue/full,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
"Is" = (/obj/effect/floor_decal/corner/blue{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
"It" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/obj/effect/floor_decal/corner/blue,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
"Iu" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/obj/effect/floor_decal/corner/blue/full{dir = 4},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
@@ -1849,7 +1849,7 @@
"JC" = (/obj/machinery/atmospherics/unary/cryo_cell{layer = 3.3},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"JD" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"JE" = (/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
-"JF" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/wrench,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
+"JF" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/tool/wrench,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"JG" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire{layer = 2.9; pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = -2},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"JH" = (/obj/structure/closet/hydrant{pixel_x = -30; pixel_y = 0},/turf/simulated/shuttle/floor/yellow,/area/shuttle/escape/centcom)
"JI" = (/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor/yellow,/area/shuttle/escape/centcom)
@@ -1955,7 +1955,7 @@
"LE" = (/obj/structure/bed/chair{dir = 1},/obj/structure/disposalpipe/segment,/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
"LF" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
"LG" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/sleeping_agent{pixel_x = 1},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
-"LH" = (/obj/item/weapon/wrench,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
+"LH" = (/obj/item/weapon/tool/wrench,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
"LI" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
"LJ" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome)
"LK" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
@@ -1994,7 +1994,7 @@
"Mr" = (/obj/machinery/dna_scannernew,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"Ms" = (/obj/machinery/atmospherics/unary/cryo_cell{layer = 3.3},/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"Mt" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
-"Mu" = (/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/wrench,/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
+"Mu" = (/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/tool/wrench,/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"Mv" = (/obj/structure/closet/crate/medical,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/surgical/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/surgical/hemostat{pixel_y = 4},/obj/item/weapon/surgical/cautery{pixel_y = 4},/obj/item/weapon/surgical/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/nanopaste,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/surgical,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"Mw" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/unsimulated/beach/sand,/area/beach)
"Mx" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/unsimulated/beach/sand,/area/beach)
@@ -2302,8 +2302,8 @@
"Sn" = (/obj/structure/table/steel,/obj/item/clothing/glasses/regular,/obj/item/clothing/glasses/regular,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start)
"So" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor/red,/area/skipjack_station/start)
"Sp" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
-"Sq" = (/obj/item/weapon/wrench,/obj/item/weapon/mop,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
-"Sr" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/item/weapon/crowbar,/obj/item/device/suit_cooling_unit,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
+"Sq" = (/obj/item/weapon/tool/wrench,/obj/item/weapon/mop,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
+"Sr" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/item/weapon/tool/crowbar,/obj/item/device/suit_cooling_unit,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Ss" = (/obj/machinery/computer/shuttle,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
"St" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
"Su" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station)
diff --git a/maps/northern_star/polaris-3.dmm b/maps/northern_star/polaris-3.dmm
index 4c429df1ce..d74448f8d3 100644
--- a/maps/northern_star/polaris-3.dmm
+++ b/maps/northern_star/polaris-3.dmm
@@ -78,7 +78,7 @@
"bz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/tcomsat)
"bA" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/airless,/area/tcomsat)
"bB" = (/obj/structure/table/standard,/obj/item/device/radio/off,/turf/simulated/shuttle/floor/white,/area/derelict/ship)
-"bC" = (/obj/structure/table/standard,/obj/item/weapon/screwdriver,/obj/machinery/light,/turf/simulated/shuttle/floor/white,/area/derelict/ship)
+"bC" = (/obj/structure/table/standard,/obj/item/weapon/tool/screwdriver,/obj/machinery/light,/turf/simulated/shuttle/floor/white,/area/derelict/ship)
"bN" = (/obj/item/trash/cheesie,/turf/space,/area/space)
"bO" = (/obj/machinery/door/blast/regular{id = "oldship_gun"; name = "Pod Bay Door"},/turf/simulated/shuttle/plating,/area/derelict/ship)
"bP" = (/obj/machinery/mass_driver{dir = 8; icon_state = "mass_driver"; id = "oldship_gun"},/turf/simulated/shuttle/plating,/area/derelict/ship)
diff --git a/maps/northern_star/polaris-5.dmm b/maps/northern_star/polaris-5.dmm
index c1c909e168..f4f4ea7608 100644
--- a/maps/northern_star/polaris-5.dmm
+++ b/maps/northern_star/polaris-5.dmm
@@ -21,7 +21,7 @@
"au" = (/turf/simulated/floor/tiled/airless,/area/outpost/research/test_area)
"av" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/outpost/research/test_area)
"aw" = (/obj/structure/dispenser,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/mixing)
-"ax" = (/obj/structure/table/standard,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = 30},/obj/item/weapon/crowbar,/turf/simulated/floor/tiled/white,/area/outpost/research/mixing)
+"ax" = (/obj/structure/table/standard,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/screwdriver{pixel_y = 10},/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = 30},/obj/item/weapon/tool/crowbar,/turf/simulated/floor/tiled/white,/area/outpost/research/mixing)
"ay" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/white,/area/outpost/research/mixing)
"az" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/mixing)
"aA" = (/turf/simulated/wall,/area/outpost/research/hallway/toxins_hallway)
@@ -290,7 +290,7 @@
"fD" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/toxins_hallway)
"fE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "toxins_airlock_control"; name = "Toxins Access Button"; pixel_x = 26; pixel_y = 26; req_access = list(7)},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/toxins_hallway)
"fF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Toxins Access"; dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/toxins_hallway)
-"fG" = (/obj/item/weapon/wrench,/obj/structure/table/steel,/turf/simulated/floor/tiled/dark,/area/outpost/research/toxins_misc_lab)
+"fG" = (/obj/item/weapon/tool/wrench,/obj/structure/table/steel,/turf/simulated/floor/tiled/dark,/area/outpost/research/toxins_misc_lab)
"fH" = (/obj/machinery/pipedispenser,/turf/simulated/floor/tiled/dark,/area/outpost/research/toxins_misc_lab)
"fI" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored)
"fJ" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology)
@@ -882,7 +882,7 @@
"qX" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
"qY" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
"qZ" = (/obj/structure/table/rack,/obj/item/clothing/head/welding,/obj/item/weapon/weldingtool,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
-"ra" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/screwdriver{pixel_y = 15},/obj/item/weapon/melee/baton/loaded,/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
+"ra" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/tool/screwdriver{pixel_y = 15},/obj/item/weapon/melee/baton/loaded,/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
"rb" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"rc" = (/obj/machinery/conveyor{dir = 4; id = "anom"},/turf/simulated/floor/plating,/area/outpost/research/anomaly)
"rd" = (/obj/machinery/conveyor{dir = 4; id = "anom"},/obj/structure/plasticflaps/mining,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/outpost/research/anomaly)
@@ -909,7 +909,7 @@
"ry" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"rz" = (/obj/effect/floor_decal/corner/beige{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"rA" = (/obj/structure/table/glass,/obj/effect/floor_decal/corner/beige/full{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
-"rB" = (/obj/structure/table/standard,/obj/item/weapon/flame/lighter/random,/obj/item/weapon/crowbar,/obj/machinery/newscaster{layer = 3.3; pixel_x = -30; pixel_y = 0},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
+"rB" = (/obj/structure/table/standard,/obj/item/weapon/flame/lighter/random,/obj/item/weapon/tool/crowbar,/obj/machinery/newscaster{layer = 3.3; pixel_x = -30; pixel_y = 0},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
"rC" = (/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
"rD" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"rE" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
@@ -947,8 +947,8 @@
"sk" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/eva)
"sl" = (/obj/effect/floor_decal/corner/purple/full{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/outpost/research/eva)
"sm" = (/obj/effect/floor_decal/corner/purple{dir = 1},/obj/machinery/light{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/eva)
-"sn" = (/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/eva)
-"so" = (/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/research/eva)
+"sn" = (/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/tool/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/eva)
+"so" = (/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/tool/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/research/eva)
"sp" = (/obj/structure/dispenser/oxygen,/obj/effect/floor_decal/corner/purple{dir = 6},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/outpost/research/eva)
"sq" = (/obj/machinery/light/small,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored)
"sr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/analysis)
@@ -1470,7 +1470,7 @@
"Cn" = (/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery)
"Co" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery)
"Cp" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery)
-"Cq" = (/obj/structure/table/steel,/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery)
+"Cq" = (/obj/structure/table/steel,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/wrench,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery)
"Cr" = (/obj/structure/closet/crate,/obj/item/stack/material/phoron{amount = 50},/obj/item/stack/material/phoron{amount = 50},/obj/item/stack/material/phoron{amount = 50},/turf/simulated/floor/plating,/area/outpost/engineering/mining/power)
"Cs" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/sensor{long_range = 1; name_tag = "Asteroid Main Grid"},/turf/simulated/floor/plating,/area/outpost/engineering/mining/power)
"Ct" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/outpost/engineering/mining/power)
@@ -1586,13 +1586,13 @@
"Ez" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva)
"EA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva)
"EB" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva)
-"EC" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe/hammer,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/weapon/shovel,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/storage)
-"ED" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/weapon/shovel,/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/storage)
+"EC" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/crowbar,/obj/item/weapon/shovel,/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/storage)
+"ED" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe/hammer,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/crowbar,/obj/item/weapon/shovel,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/storage)
"EE" = (/turf/simulated/wall,/area/outpost/mining_main/storage)
"EF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/camera/network/mining{c_tag = "OPM - Mining Hallway Aft"; dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled,/area/outpost/mining_main/south_hall)
"EG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/outpost/mining_main/south_hall)
"EH" = (/obj/structure/disposalpipe/segment,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/blue,/turf/simulated/floor/tiled,/area/outpost/mining_main/south_hall)
-"EI" = (/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/steel,/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/mining_main/eva)
+"EI" = (/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/wrench,/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/steel,/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/mining_main/eva)
"EJ" = (/obj/item/stack/flag/green{pixel_x = -4; pixel_y = 0},/obj/item/stack/flag/red,/obj/item/stack/flag/yellow{pixel_x = 4},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/mining_main/eva)
"EK" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/storage)
"EL" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/storage)
@@ -1912,7 +1912,7 @@
"KN" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
"KO" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
"KP" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -2079,7 +2079,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadDjDwDwDwDwDwDw
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadDjDjDODwDwDPDwDQDRDSDTDUDVDWDXDYDZEaEaDtEbEcDtqOeJeJdndndnadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadDjDODwEdEeEfEfEgEhEiEjEkElEmEnEaEaEoDfEpEqDgdneJeJadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadDjDjErEsEtEsEsEuEvEwExEyEzEzEAEzEBDfDfdndndneJeJeJadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadDjDjECEDDwDwEEEFEGEHDgEaEaEIEJDfDfdndndneJeJeJadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadDjDjEDECDwDwEEEFEGEHDgEaEaEIEJDfDfdndndneJeJeJadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadDjDjDjEKELEEEMENDBDgEOEPDfDfDfdndndneJeJeJadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadDjDjDjEEEQERESDgDfDfDfdndndndndneJeJdnadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadDjDjETEUEVDfDfaddndndndndndneJeJdnadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/southern_cross/datums/supplypacks/munitions.dm b/maps/southern_cross/datums/supplypacks/munitions.dm
index 819e96d428..fa24358ceb 100644
--- a/maps/southern_cross/datums/supplypacks/munitions.dm
+++ b/maps/southern_cross/datums/supplypacks/munitions.dm
@@ -3,14 +3,33 @@
* related to sc weapons live.
*/
-/datum/supply_packs/munitions/bolt_rifles_explorer
- name = "Weapons - Surplus explorer rifles"
+/datum/supply_pack/munitions/bolt_rifles_explorer
+ name = "Weapons - Surplus Hunting Rifles"
contains = list(
- /obj/item/weapon/gun/projectile/shotgun/pump/rifle = 4,
- /obj/item/ammo_magazine/clip/c762 = 4,
- /obj/item/ammo_magazine/clip/c762/hunter = 8
+ /obj/item/weapon/gun/projectile/shotgun/pump/rifle = 2,
+ /obj/item/ammo_magazine/clip/c762/hunter = 6
)
cost = 50
containertype = /obj/structure/closet/crate/secure/weapon
- containername = "Explorer weapons crate"
+ containername = "Hunting Rifle crate"
access = access_explorer
+
+/datum/supply_pack/munitions/phase_carbines_explorer
+ name = "Weapons - Surplus Phase Carbines"
+ contains = list(
+ /obj/item/weapon/gun/energy/phasegun = 2,
+ )
+ cost = 25
+ containertype = /obj/structure/closet/crate/secure/weapon
+ containername = "Phase Carbine crate"
+ access = access_explorer
+
+/datum/supply_pack/munitions/phase_rifles_explorer
+ name = "Weapons - Phase Rifles"
+ contains = list(
+ /obj/item/weapon/gun/energy/phasegun/rifle = 2,
+ )
+ cost = 50
+ containertype = /obj/structure/closet/crate/secure/weapon
+ containername = "Phase Rifle crate"
+ access = access_explorer
\ No newline at end of file
diff --git a/maps/southern_cross/items/clothing/sc_suit.dm b/maps/southern_cross/items/clothing/sc_suit.dm
index ec157e3c87..e4487c177e 100644
--- a/maps/southern_cross/items/clothing/sc_suit.dm
+++ b/maps/southern_cross/items/clothing/sc_suit.dm
@@ -21,4 +21,4 @@
item_icons = list(slot_wear_suit_str = 'maps/southern_cross/icons/mob/sc_suit.dmi')
icon = 'maps/southern_cross/icons/obj/sc_suit.dmi'
armor = list(melee = 15, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 5)
- valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA)
\ No newline at end of file
+ valid_accessory_slots = (ACCESSORY_SLOT_INSIGNIA)
\ No newline at end of file
diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm
index 1bf344a7aa..ead72095da 100644
--- a/maps/southern_cross/southern_cross-1.dmm
+++ b/maps/southern_cross/southern_cross-1.dmm
@@ -39,7 +39,7 @@
"aaM" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod1/station)
"aaN" = (/turf/simulated/shuttle/wall,/area/shuttle/escape_pod2/station)
"aaO" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod2/station)
-"aaP" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/item/weapon/wrench,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/holofloor/wood,/area/crew_quarters/firstdeck/gym)
+"aaP" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/item/weapon/tool/wrench,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/holofloor/wood,/area/crew_quarters/firstdeck/gym)
"aaQ" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/cups,/turf/simulated/floor/holofloor/wood,/area/crew_quarters/firstdeck/gym)
"aaR" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/effect/floor_decal/rust,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/steel_dirty,/area/hallway/primary/firstdeck/auxdockfore)
"aaS" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/auxdockfore)
@@ -304,7 +304,7 @@
"afR" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/firstdeck/foreport)
"afS" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/closet/crate,/obj/item/weapon/toy/xmas_cracker,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/firstdeck/foreport)
"afT" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/device/paicard,/turf/simulated/floor/plating,/area/construction/firstdeck/construction5)
-"afU" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/item/weapon/wirecutters,/turf/simulated/floor/tiled,/area/construction/firstdeck/construction5)
+"afU" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/item/weapon/tool/wirecutters,/turf/simulated/floor/tiled,/area/construction/firstdeck/construction5)
"afV" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = -1},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet/firstdeck)
"afW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet/firstdeck)
"afX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet/firstdeck)
@@ -339,7 +339,7 @@
"agA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/foreport)
"agB" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/firstdeck/foreport)
"agC" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/construction/firstdeck/construction5)
-"agD" = (/obj/item/weapon/crowbar,/turf/simulated/floor/tiled,/area/construction/firstdeck/construction5)
+"agD" = (/obj/item/weapon/tool/crowbar,/turf/simulated/floor/tiled,/area/construction/firstdeck/construction5)
"agE" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plating,/area/construction/firstdeck/construction5)
"agF" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/undies_wardrobe,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet/firstdeck)
"agG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet/firstdeck)
@@ -526,7 +526,7 @@
"akf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/monotile,/area/hangar/three)
"akg" = (/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/industrial/danger{dir = 4},/turf/simulated/floor/tiled/steel,/area/hangar/one)
"akh" = (/obj/machinery/door/airlock/voidcraft/vertical{icon_state = "door_locked"; id_tag = "expshuttle1_door_L"; locked = 1; name = "shuttle side hatch"},/obj/machinery/button/remote/airlock{id = "expshuttle1_door_L"; name = "Side Hatch Control"; pixel_y = -26; req_one_access = null; specialfunctions = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
-"aki" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1380; id_tag = "shuttle1_inner"; name = "Internal Access"},/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 6},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "shuttle1_shuttle"; name = "interior access button"; pixel_x = 0; pixel_y = -26; req_access = null},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
+"aki" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1380; id_tag = "shuttle1_inner"; name = "Internal Access"},/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "shuttle1_shuttle"; name = "interior access button"; pixel_x = 0; pixel_y = -26; req_access = null},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"akj" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/manifold4w/visible,/obj/machinery/meter,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"akk" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"akl" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1380; id_tag = "shuttle1_outer"; name = "External Access"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "shuttle1_shuttle"; name = "exterior access button"; pixel_x = 0; pixel_y = 26; req_access = null},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
@@ -596,7 +596,7 @@
"alx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/monotile,/area/hangar/one)
"aly" = (/obj/machinery/space_heater,/turf/simulated/shuttle/plating,/area/shuttle/shuttle1/start)
"alz" = (/obj/machinery/door/airlock/multi_tile/metal{icon_state = "door_locked"; id_tag = "expshuttle1_door_cargo"; locked = 1},/obj/machinery/button/remote/airlock{desiredstate = 1; dir = 4; id = "expshuttle1_door_cargo"; name = "Rear Hatch Control"; pixel_x = -26; pixel_y = 0; req_access = list(67); specialfunctions = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
-"alA" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/turf/simulated/shuttle/wall/voidcraft/no_join,/area/shuttle/shuttle1/start)
+"alA" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/simulated/shuttle/wall/voidcraft/no_join,/area/shuttle/shuttle1/start)
"alB" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/wall/voidcraft/no_join,/area/shuttle/shuttle1/start)
"alC" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8; start_pressure = 740.5},/turf/simulated/shuttle/plating,/area/shuttle/shuttle1/start)
"alD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/monotile,/area/hangar/one)
@@ -669,7 +669,7 @@
"amS" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/ai_status_display{pixel_y = -32},/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod2/station)
"amT" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/light,/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod2/station)
"amU" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "large_escape_pod_2"; pixel_x = 26; pixel_y = -26; tag_door = "large_escape_pod_2_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station)
-"amV" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/obj/random/medical/lite,/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod2/station)
+"amV" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/tool/crowbar,/obj/random/medical/lite,/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod2/station)
"amW" = (/obj/structure/bed/chair{dir = 1},/obj/structure/closet/walllocker/emerglocker{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod2/station)
"amX" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod2/station)
"amY" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/space_heater,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/green/border{dir = 8},/turf/simulated/floor/tiled,/area/hangar/one)
@@ -1096,7 +1096,7 @@
"avd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/green/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
"ave" = (/obj/machinery/firealarm{pixel_y = 24},/obj/machinery/camera/network/first_deck{c_tag = "First Deck - Starboard Hallway Three"; dir = 2},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
"avf" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
-"avg" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
+"avg" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/obj/machinery/station_map{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
"avh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals5,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
"avi" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
"avj" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals5,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
@@ -1202,7 +1202,7 @@
"axf" = (/obj/structure/table/glass,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/item/roller,/obj/item/bodybag/cryobag,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/pill_bottle/spaceacillin,/turf/simulated/floor/tiled/white,/area/medical/first_aid_station/firstdeck)
"axg" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/table/glass,/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/medical/first_aid_station/firstdeck)
"axh" = (/obj/structure/extinguisher_cabinet{pixel_y = -30},/obj/structure/bed/chair/office/light{dir = 4},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station/firstdeck)
-"axi" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/machinery/camera/network/medbay{c_tag = "MED - FA Station Deck One"; dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/table/rack,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/roller,/obj/item/roller,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/medical/first_aid_station/firstdeck)
+"axi" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/machinery/camera/network/medbay{c_tag = "MED - FA Station Deck One"; dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/table/rack,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/roller,/obj/item/roller,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/medical/first_aid_station/firstdeck)
"axj" = (/obj/machinery/computer/crew,/turf/simulated/floor/tiled/techmaint,/area/medical/first_aid_station/firstdeck)
"axk" = (/turf/simulated/floor,/area/tcomm/tcomstorage)
"axl" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/tcomm/tcomstorage)
@@ -1226,7 +1226,7 @@
"axD" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/obj/structure/closet/medical_wall{pixel_y = -31},/obj/item/roller,/obj/item/bodybag/cryobag,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/pill_bottle/spaceacillin,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
"axE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/green/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
"axF" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
-"axG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
+"axG" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/brown/border,/obj/machinery/station_map{dir = 1; pixel_y = -32},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/port)
"axH" = (/obj/machinery/light,/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/green/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
"axI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
"axJ" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
@@ -1292,7 +1292,7 @@
"ayR" = (/turf/simulated/floor/plating,/area/construction/firstdeck/construction2)
"ayS" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/construction/firstdeck/construction2)
"ayT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled/steel_dirty,/area/construction/firstdeck/construction2)
-"ayU" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/item/weapon/wirecutters,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/steel_dirty,/area/construction/firstdeck/construction2)
+"ayU" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/item/weapon/tool/wirecutters,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/steel_dirty,/area/construction/firstdeck/construction2)
"ayV" = (/obj/structure/table/steel,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/construction/firstdeck/construction2)
"ayW" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/brown/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/port)
"ayX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/monotile,/area/hallway/primary/firstdeck/port)
@@ -1513,7 +1513,7 @@
"aDe" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/green/border{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/ascenter)
"aDf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/monotile,/area/hallway/primary/firstdeck/ascenter)
"aDg" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/camera/network/first_deck{c_tag = "First Deck - Center Three"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/ascenter)
-"aDh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/closet/crate,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/item/weapon/crowbar,/obj/item/weapon/wirecutters,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
+"aDh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/closet/crate,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/wirecutters,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
"aDi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
"aDj" = (/turf/simulated/wall/r_wall,/area/hangar/two)
"aDk" = (/turf/simulated/wall,/area/hangar/two)
@@ -1728,7 +1728,7 @@
"aHl" = (/turf/simulated/shuttle/wall/voidcraft,/area/shuttle/shuttle2/start)
"aHm" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/steel,/area/hangar/two)
"aHn" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod1/station)
-"aHo" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/wrench,/obj/random/medical/lite,/obj/structure/closet/walllocker/emerglocker{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod1/station)
+"aHo" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/tool/wrench,/obj/random/medical/lite,/obj/structure/closet/walllocker/emerglocker{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod1/station)
"aHp" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire{layer = 2.9; pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = -2},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/machinery/light,/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod1/station)
"aHq" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station)
"aHr" = (/obj/machinery/sleep_console,/obj/item/device/radio/intercom/department/medbay{dir = 1; pixel_x = 0; pixel_y = -21},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station)
@@ -1757,7 +1757,7 @@
"aHO" = (/turf/simulated/shuttle/wall/voidcraft/blue,/area/shuttle/shuttle2/start)
"aHP" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 4; start_pressure = 740.5},/turf/simulated/shuttle/plating,/area/shuttle/shuttle2/start)
"aHQ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/wall/voidcraft/hard_corner,/area/shuttle/shuttle2/start)
-"aHR" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 10},/turf/simulated/shuttle/wall/voidcraft/no_join,/area/shuttle/shuttle2/start)
+"aHR" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 10},/turf/simulated/shuttle/wall/voidcraft/no_join,/area/shuttle/shuttle2/start)
"aHS" = (/obj/machinery/door/airlock/multi_tile/metal{icon_state = "door_locked"; id_tag = "expshuttle2_door_cargo"; locked = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"aHT" = (/obj/machinery/button/remote/airlock{desiredstate = 1; dir = 8; id = "expshuttle2_door_cargo"; name = "Rear Hatch Control"; pixel_x = 26; pixel_y = 0; req_access = list(67); specialfunctions = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"aHU" = (/turf/simulated/shuttle/wall/voidcraft/hard_corner,/area/shuttle/shuttle2/start)
@@ -1839,7 +1839,7 @@
"aJs" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1380; id_tag = "shuttle2_outer"; name = "External Access"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "shuttle2"; name = "exterior access button"; pixel_x = 0; pixel_y = -26; req_access = null},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"aJt" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"aJu" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/manifold4w/visible,/obj/machinery/meter,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
-"aJv" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1380; id_tag = "shuttle2_inner"; name = "Internal Access"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "shuttle2"; name = "interior access button"; pixel_x = 0; pixel_y = 26; req_access = null},/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
+"aJv" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1380; id_tag = "shuttle2_inner"; name = "Internal Access"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "shuttle2"; name = "interior access button"; pixel_x = 0; pixel_y = 26; req_access = null},/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"aJw" = (/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"aJx" = (/obj/machinery/button/remote/airlock{id = "expshuttle2_door_L"; name = "Side Hatch Control"; pixel_y = 26; req_one_access = null; specialfunctions = 4},/obj/machinery/door/airlock/voidcraft/vertical{icon_state = "door_locked"; id_tag = "expshuttle2_door_L"; locked = 1; name = "shuttle side hatch"},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"aJy" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/turf/simulated/floor/tiled,/area/hangar/two)
@@ -1873,7 +1873,7 @@
"aKa" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/camera/network/first_deck{c_tag = "First Deck - Center Four"; dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/ascenter)
"aKb" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/ascenter)
"aKc" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/ascenter)
-"aKd" = (/obj/item/inflatable/door/torn,/obj/item/weapon/screwdriver,/turf/simulated/floor,/area/maintenance/firstdeck/aftstarboard)
+"aKd" = (/obj/item/inflatable/door/torn,/obj/item/weapon/tool/screwdriver,/turf/simulated/floor,/area/maintenance/firstdeck/aftstarboard)
"aKe" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
"aKf" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "shuttle2_sensor"; pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "shuttle2_pump"},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"aKg" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "shuttle2_shuttle"; pixel_y = -26; tag_airpump = "shuttle2_pump"; tag_chamber_sensor = "shuttle2_sensor"; tag_exterior_door = "shuttle2_outer"; tag_interior_door = "shuttle2_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "shuttle2_pump"},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
@@ -1903,7 +1903,7 @@
"aKE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/monofloor{dir = 1},/area/hangar/two)
"aKF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/turf/simulated/floor/tiled,/area/hangar/two)
"aKG" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating,/area/quartermaster/storage)
-"aKH" = (/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/storage)
+"aKH" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/storage)
"aKI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "cargo_bay"; name = "cargo bay hatch controller"; pixel_x = 30; pixel_y = 0; req_one_access = list(13,31); tag_door = "cargo_bay_door"},/turf/simulated/floor/tiled,/area/quartermaster/storage)
"aKJ" = (/turf/unsimulated/mask,/area/quartermaster/storage)
"aKK" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/substation/firstdeck/cargo)
@@ -1995,7 +1995,7 @@
"aMs" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aMt" = (/obj/machinery/computer/security/engineering,/obj/machinery/light{dir = 1},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aMu" = (/obj/machinery/space_heater,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
-"aMv" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
+"aMv" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aMw" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aMx" = (/obj/machinery/atmospherics/binary/pump/high_power/on{dir = 4; name = "Pump station in"; target_pressure = 4500},/obj/machinery/firealarm{pixel_y = 24},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aMy" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
@@ -2025,13 +2025,13 @@
"aMW" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/aft)
"aMX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/steeldecal/steel_decals5{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/green/bordercorner2{dir = 9},/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/green/bordercorner2,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/aft)
"aMY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/red,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
-"aMZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
-"aNa" = (/obj/machinery/computer/station_alert,/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
-"aNb" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/engineering/auxiliary_engineering)
-"aNc" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/space_heater,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
-"aNd" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
-"aNe" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
-"aNf" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 10},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
+"aMZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
+"aNa" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/engineering/auxiliary_engineering)
+"aNb" = (/obj/machinery/computer/station_alert,/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
+"aNc" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
+"aNd" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/space_heater,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
+"aNe" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 10},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
+"aNf" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aNg" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8; icon_state = "map"},/obj/machinery/meter,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aNh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{req_access = null; req_one_access = list(12,67)},/turf/simulated/floor/plating,/area/storage/emergency_storage/firstdeck/as_emergency)
"aNi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
@@ -2124,7 +2124,7 @@
"aOR" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning/full,/turf/simulated/floor/plating,/area/engineering/auxiliary_engineering)
"aOS" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aOT" = (/obj/machinery/atmospherics/tvalve/mirrored/bypass{dir = 4},/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
-"aOU" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{ icon_state = "map"; dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
+"aOU" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{icon_state = "map"; dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aOV" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/empty,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aOW" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/random/obstruction,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
"aOX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/binary/pump/on{dir = 8; target_pressure = 200},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
@@ -2158,7 +2158,7 @@
"aPz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aPA" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aPB" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
-"aPC" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
+"aPC" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aPD" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/empty,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering)
"aPE" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
"aPF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
@@ -2342,7 +2342,7 @@
"aTb" = (/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/aft)
"aTc" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/aft)
"aTd" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/security/checkpoint3)
-"aTe" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/crowbar,/obj/item/weapon/pen,/obj/item/device/flash,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/security/checkpoint3)
+"aTe" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/tool/crowbar,/obj/item/weapon/pen,/obj/item/device/flash,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/security/checkpoint3)
"aTf" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/monotile,/area/security/checkpoint3)
"aTg" = (/obj/machinery/computer/secure_data,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 22},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/checkpoint3)
"aTh" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/white/border{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard)
@@ -2398,7 +2398,7 @@
"aUf" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod6/station)
"aUg" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftport)
"aUh" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftport)
-"aUi" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/aft)
+"aUi" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard)
"aUj" = (/obj/structure/stairs/east,/turf/simulated/floor/tiled/dark,/area/hallway/primary/firstdeck/aft)
"aUk" = (/turf/simulated/wall,/area/hallway/primary/firstdeck/auxdockaft)
"aUl" = (/obj/structure/sign/directions/bridge{dir = 1; pixel_y = 10},/obj/structure/sign/directions/science{dir = 1},/obj/structure/sign/directions/medical{dir = 1; pixel_y = -10},/turf/simulated/wall,/area/hallway/primary/firstdeck/auxdockaft)
@@ -2517,7 +2517,7 @@
"aWu" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/rnd/test_area)
"aWv" = (/obj/structure/table/rack,/obj/item/clothing/gloves/arm_guard/riot,/obj/item/clothing/shoes/leg_guard/riot,/obj/item/clothing/suit/armor/riot/alt,/obj/item/clothing/head/helmet/riot,/obj/item/weapon/shield/riot,/obj/item/weapon/melee/baton/loaded,/obj/effect/floor_decal/corner/red/full{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor/southleft{name = "Riot Armor"; req_access = list(1)},/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aWw" = (/obj/structure/table/rack,/obj/item/clothing/gloves/arm_guard/riot,/obj/item/clothing/shoes/leg_guard/riot,/obj/item/clothing/suit/armor/riot/alt,/obj/item/clothing/head/helmet/riot,/obj/item/weapon/shield/riot,/obj/item/weapon/melee/baton/loaded,/obj/effect/floor_decal/corner/red{dir = 5},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/window/brigdoor/southright{name = "Riot Armor"},/turf/simulated/floor/tiled/dark,/area/security/armoury)
-"aWx" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/void/security,/obj/item/clothing/head/helmet/space/void/security,/obj/item/device/suit_cooling_unit,/obj/item/weapon/tank/oxygen,/obj/effect/floor_decal/corner/white{ icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/southleft{name = "EVA Suit"; req_access = list(1)},/turf/simulated/floor/tiled/dark,/area/security/armoury)
+"aWx" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/void/security,/obj/item/clothing/head/helmet/space/void/security,/obj/item/device/suit_cooling_unit,/obj/item/weapon/tank/oxygen,/obj/effect/floor_decal/corner/white{icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/southleft{name = "EVA Suit"; req_access = list(1)},/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aWy" = (/obj/structure/table/rack,/obj/item/clothing/gloves/arm_guard/riot,/obj/item/clothing/shoes/leg_guard/riot,/obj/item/clothing/suit/armor/riot/alt,/obj/item/clothing/head/helmet/riot,/obj/item/weapon/shield/riot,/obj/item/weapon/melee/baton/loaded,/obj/effect/floor_decal/corner/red{dir = 5},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor/southleft{name = "Riot Armor"; req_access = list(1)},/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aWz" = (/obj/structure/table/rack,/obj/item/clothing/gloves/arm_guard/riot,/obj/item/clothing/shoes/leg_guard/riot,/obj/item/clothing/suit/armor/riot/alt,/obj/item/clothing/head/helmet/riot,/obj/item/weapon/shield/riot,/obj/item/weapon/melee/baton/loaded,/obj/effect/floor_decal/corner/red/full{dir = 1},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/window/brigdoor/southright{name = "Riot Armor"},/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aWA" = (/obj/machinery/light{dir = 1},/obj/machinery/camera/network/research{c_tag = "SCI - Toxins Test Chamber Fore"; network = list("Research","Toxins Test Area")},/turf/simulated/floor/tiled/airless,/area/rnd/test_area)
@@ -2573,7 +2573,7 @@
"aXy" = (/obj/structure/sink{pixel_y = 16},/obj/structure/mirror{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/freezer,/area/security/security_restroom)
"aXz" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = -1},/obj/machinery/door/window/westright{name = "Shower"},/obj/structure/curtain/open/shower/security,/turf/simulated/floor/tiled/freezer,/area/security/security_restroom)
"aXA" = (/turf/simulated/wall,/area/security/security_restroom)
-"aXB" = (/obj/structure/table/standard,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/machinery/recharger/wallcharger{pixel_x = -24; pixel_y = -4},/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/red/border{dir = 9},/obj/item/weapon/hand_labeler,/turf/simulated/floor/tiled,/area/security/security_lockerroom)
+"aXB" = (/obj/structure/table/standard,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/machinery/recharger/wallcharger{pixel_x = -24; pixel_y = -4},/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/red/border{dir = 9},/obj/item/weapon/hand_labeler,/turf/simulated/floor/tiled,/area/security/security_lockerroom)
"aXC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/turf/simulated/floor/tiled,/area/security/security_lockerroom)
"aXD" = (/obj/structure/closet/secure_closet/security,/obj/item/clothing/glasses/hud/security,/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/red/border{dir = 5},/turf/simulated/floor/tiled,/area/security/security_lockerroom)
"aXE" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/range)
@@ -2705,7 +2705,7 @@
"baa" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge,/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/turf/simulated/floor/tiled/dark,/area/security/prison)
"bab" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge,/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/simulated/floor/tiled/dark,/area/security/prison)
"bac" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/security/prison)
-"bad" = (/obj/structure/cryofeed{dir = 2},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/industrial/warning/cee{ icon_state = "warningcee"; dir = 1},/obj/machinery/camera/network/prison{c_tag = "SEC - Common Brig 2"; dir = 8},/turf/simulated/floor/tiled/techfloor/grid,/area/security/prison)
+"bad" = (/obj/structure/cryofeed{dir = 2},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 1},/obj/machinery/camera/network/prison{c_tag = "SEC - Common Brig 2"; dir = 8},/turf/simulated/floor/tiled/techfloor/grid,/area/security/prison)
"bae" = (/turf/simulated/wall/r_wall,/area/security/security_equiptment_storage)
"baf" = (/obj/machinery/flasher/portable,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/security_equiptment_storage)
"bag" = (/obj/machinery/flasher/portable,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/camera/network/security{c_tag = "SEC - Equipment Storage"},/turf/simulated/floor/tiled,/area/security/security_equiptment_storage)
@@ -2840,7 +2840,7 @@
"bcF" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/tiled,/area/security/main)
"bcG" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/security/main)
"bcH" = (/obj/machinery/light{dir = 4},/obj/structure/table/standard,/obj/item/weapon/storage/box/donut,/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/red/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/security/main)
-"bcI" = (/obj/structure/table/steel_reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/magnetic_controller{autolink = 1},/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/glasses/sunglasses{pixel_x = 3; pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud/aviator,/obj/item/clothing/ears/earmuffs,/obj/item/clothing/ears/earmuffs,/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/obj/item/weapon/screwdriver,/turf/simulated/floor/tiled,/area/security/range)
+"bcI" = (/obj/structure/table/steel_reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/magnetic_controller{autolink = 1},/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/glasses/sunglasses{pixel_x = 3; pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud/aviator,/obj/item/clothing/ears/earmuffs,/obj/item/clothing/ears/earmuffs,/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/obj/item/weapon/tool/screwdriver,/turf/simulated/floor/tiled,/area/security/range)
"bcJ" = (/obj/machinery/door/window/northleft{name = "Range Access"},/obj/effect/floor_decal/industrial/loading{dir = 1},/turf/simulated/floor/tiled,/area/security/range)
"bcK" = (/obj/structure/table/steel_reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/gun/energy/laser/practice,/turf/simulated/floor/tiled,/area/security/range)
"bcL" = (/obj/structure/table/steel_reinforced,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/laser/practice,/turf/simulated/floor/tiled,/area/security/range)
@@ -2859,7 +2859,7 @@
"bcY" = (/obj/machinery/computer/prisoner,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 30},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/warden)
"bcZ" = (/obj/structure/filingcabinet/chestdrawer,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/camera/network/security{c_tag = "SEC - Warden's Office"},/obj/item/device/radio/intercom/department/security{pixel_y = 21},/turf/simulated/floor/tiled/dark,/area/security/warden)
"bda" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/warden)
-"bdb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/steel_reinforced,/obj/item/weapon/book/codex/corp_regs,/obj/item/weapon/stamp/denied{pixel_x = 5},/obj/item/weapon/stamp/ward,/obj/item/weapon/crowbar,/obj/item/device/radio/off,/obj/item/weapon/wrench,/obj/item/device/retail_scanner/security,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/warden)
+"bdb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/steel_reinforced,/obj/item/weapon/book/codex/corp_regs,/obj/item/weapon/stamp/denied{pixel_x = 5},/obj/item/weapon/stamp/ward,/obj/item/weapon/tool/crowbar,/obj/item/device/radio/off,/obj/item/weapon/tool/wrench,/obj/item/device/retail_scanner/security,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/warden)
"bdc" = (/obj/structure/closet/secure_closet/warden,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/light_switch{pixel_x = 36; pixel_y = 0},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/warden)
"bdd" = (/obj/machinery/camera/network/security{c_tag = "SEC - Brig Hallway Fore"; dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/brig)
"bde" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/brig)
@@ -3078,7 +3078,7 @@
"bhj" = (/obj/effect/floor_decal/corner/red/full{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "Atmos Tank - Nitrogen"; dir = 2},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/reinforced/nitrogen,/area/engineering/atmos)
"bhk" = (/obj/effect/floor_decal/corner/blue/full{dir = 8},/obj/machinery/air_sensor{frequency = 1441; id_tag = "o2_sensor"},/turf/simulated/floor/reinforced/oxygen,/area/engineering/atmos)
"bhl" = (/obj/effect/floor_decal/corner/blue/full{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "Atmos Tank - Oxygen"; dir = 2},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/reinforced/oxygen,/area/engineering/atmos)
-"bhm" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/obj/effect/floor_decal/corner/white{ icon_state = "corner_white"; dir = 1},/turf/simulated/floor/reinforced/airmix,/area/engineering/atmos)
+"bhm" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/obj/effect/floor_decal/corner/white{icon_state = "corner_white"; dir = 1},/turf/simulated/floor/reinforced/airmix,/area/engineering/atmos)
"bhn" = (/obj/machinery/camera/network/engineering{c_tag = "Atmos Tank - Air"; dir = 2},/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/corner/white/diagonal,/obj/effect/floor_decal/corner/blue{dir = 4},/turf/simulated/floor/reinforced/airmix,/area/engineering/atmos)
"bho" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/structure/lattice,/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/space)
"bhp" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "waste_sensor"; output = 63},/obj/effect/floor_decal/corner/lime/full{dir = 8},/turf/simulated/floor/reinforced/airless,/area/engineering/atmos)
@@ -3220,7 +3220,7 @@
"bjV" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/structure/lattice,/turf/space,/area/space)
"bjW" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/structure/lattice,/turf/space,/area/space)
"bjX" = (/obj/machinery/atmospherics/pipe/tank/nitrous_oxide{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/plating,/area/security/riot_control)
-"bjY" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/powered/scrubber,/obj/item/weapon/wrench,/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/structure/extinguisher_cabinet{pixel_y = -30},/turf/simulated/floor/plating,/area/security/riot_control)
+"bjY" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/powered/scrubber,/obj/item/weapon/tool/wrench,/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/structure/extinguisher_cabinet{pixel_y = -30},/turf/simulated/floor/plating,/area/security/riot_control)
"bjZ" = (/obj/structure/table/reinforced,/obj/machinery/microscope,/obj/item/device/radio/intercom/department/security{pixel_y = 21},/turf/simulated/floor/tiled/freezer,/area/security/detectives_office)
"bka" = (/obj/structure/table/reinforced,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/tiled/freezer,/area/security/detectives_office)
"bkb" = (/obj/machinery/computer/security/wooden_tv,/obj/structure/window/reinforced{dir = 8},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/lino,/area/security/detectives_office)
@@ -3249,10 +3249,10 @@
"bky" = (/turf/simulated/wall/r_wall,/area/maintenance/substation/security)
"bkz" = (/obj/machinery/button/remote/blast_door{id = "Cell 1"; name = "Cell 1 Door"; pixel_x = -1; pixel_y = 28; req_access = null; req_one_access = list(2,4)},/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/red/bordercorner{dir = 1},/obj/machinery/button/flasher{id = "Cell 1"; name = "Cell 1 Flash"; pixel_x = -1; pixel_y = 36; req_access = list(2,4)},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
"bkA" = (/turf/simulated/wall/r_wall,/area/engineering/atmos)
-"bkB" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 6},/turf/simulated/wall/r_wall,/area/engineering/atmos)
-"bkC" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{ icon_state = "map"; dir = 4},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
+"bkB" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 6},/obj/machinery/door/firedoor/glass,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
+"bkC" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 6},/turf/simulated/wall/r_wall,/area/engineering/atmos)
"bkD" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/door/firedoor/glass,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
-"bkE" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 6},/obj/machinery/door/firedoor/glass,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
+"bkE" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{icon_state = "map"; dir = 4},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
"bkF" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
"bkG" = (/obj/machinery/door/firedoor/glass,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
"bkH" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/door/firedoor/glass,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
@@ -3367,7 +3367,7 @@
"bmM" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bmN" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bmO" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 8},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bmP" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bmP" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bmQ" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 10; icon_state = "intact"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bmR" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bmS" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/meter{frequency = 1443; id = "mair_out_meter"; name = "Mixed Air Tank Out"},/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -3388,7 +3388,7 @@
"bnh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/security/detectives_office)
"bni" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/carpet,/area/security/detectives_office)
"bnj" = (/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/carpet,/area/security/detectives_office)
-"bnk" = (/obj/structure/flora/pottedplant{ icon_state = "plant-10"},/turf/simulated/floor/lino,/area/security/detectives_office)
+"bnk" = (/obj/structure/flora/pottedplant{icon_state = "plant-10"},/turf/simulated/floor/lino,/area/security/detectives_office)
"bnl" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green,/obj/effect/wingrille_spawn/reinforced/polarized{id = "detoffice"},/turf/simulated/floor/plating,/area/security/detectives_office)
"bnm" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/red/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/security/lobby)
"bnn" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/security/lobby)
@@ -3411,7 +3411,7 @@
"bnE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/sign/warning/high_voltage{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"bnF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/portable_atmospherics/powered/scrubber,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bnG" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bnH" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bnH" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bnI" = (/obj/machinery/atmospherics/omni/mixer{active_power_usage = 7500; tag_east = 2; tag_east_con = null; tag_north = 1; tag_north_con = 0.21; tag_south = 0; tag_south_con = null; tag_west = 1; tag_west_con = 0.79; use_power = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bnJ" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bnK" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -3421,7 +3421,7 @@
"bnO" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/machinery/atmospherics/valve/digital,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bnP" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Air Mix to Port"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bnQ" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/green,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bnR" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bnR" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bnS" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bnT" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bnU" = (/obj/structure/closet,/obj/random/contraband,/obj/random/contraband,/obj/random/maintenance/security,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/maintenance/security_port)
@@ -3463,17 +3463,17 @@
"boE" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"boF" = (/obj/effect/floor_decal/corner/black/full{dir = 8},/obj/machinery/air_sensor{frequency = 1441; id_tag = "co2_sensor"},/turf/simulated/floor/reinforced/carbon_dioxide,/area/engineering/atmos)
"boG" = (/obj/effect/floor_decal/corner/black/full{dir = 1},/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "co2_in"; pixel_y = 1; use_power = 1},/turf/simulated/floor/reinforced/carbon_dioxide,/area/engineering/atmos)
-"boH" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/meter,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
-"boI" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/space,/area/space)
-"boJ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/glass,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
-"boK" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "co2_in"; name = "Carbon Dioxide Supply Control"; output_tag = "co2_out"; sensors = list("co2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/black/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/black/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"boL" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"boM" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/binary/pump{dir = 2; name = "N2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"boH" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/glass,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
+"boI" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "co2_in"; name = "Carbon Dioxide Supply Control"; output_tag = "co2_out"; sensors = list("co2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/black/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/black/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"boJ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/meter,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
+"boK" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/space,/area/space)
+"boL" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"boM" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/binary/pump{dir = 2; name = "N2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"boN" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 2; tag_north = 4; tag_south = 1; tag_west = 5; use_power = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"boO" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"boO" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/binary/pump{dir = 2; name = "O2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"boP" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 2; tag_north = 3; tag_south = 0; tag_west = 1; use_power = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"boQ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/binary/pump{dir = 2; name = "O2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"boR" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{ icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"boQ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"boR" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"boS" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"boT" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{dir = 4; initialize_directions = 11},/turf/simulated/floor/tiled,/area/engineering/atmos)
"boU" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -3513,19 +3513,19 @@
"bpC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 4},/obj/machinery/meter,/obj/structure/closet/crate,/obj/item/clothing/mask/gas,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/random/maintenance/research,/obj/random/maintenance/cargo,/obj/random/maintenance/security,/obj/random/maintenance/security,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"bpD" = (/obj/effect/floor_decal/corner/black/full,/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Carbon Dioxide"; dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/reinforced/carbon_dioxide,/area/engineering/atmos)
"bpE" = (/obj/effect/floor_decal/corner/black/full{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "co2_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0; use_power = 1},/turf/simulated/floor/reinforced/carbon_dioxide,/area/engineering/atmos)
-"bpF" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/meter,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
-"bpG" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/space,/area/space)
+"bpF" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/meter,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
+"bpG" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/space,/area/space)
"bpH" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
"bpI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/valve/digital{dir = 4; name = "CO2 Outlet Valve"},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/black/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/black/bordercorner2{dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bpJ" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "CO2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bpK" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bpL" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bpM" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/obj/machinery/space_heater,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bpL" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bpM" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/obj/machinery/space_heater,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bpN" = (/obj/machinery/atmospherics/pipe/manifold/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bpO" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Mixing to Transit"},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bpP" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bpP" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bpQ" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Mixing to Transit"},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bpR" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{ icon_state = "map"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bpR" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{icon_state = "map"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bpS" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bpT" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bpU" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -3567,9 +3567,9 @@
"bqE" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bqF" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bqG" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bqH" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{ icon_state = "map"; dir = 1},/obj/machinery/meter,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bqH" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bqI" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bqJ" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{ icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bqJ" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{icon_state = "map"; dir = 1},/obj/machinery/meter,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bqK" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bqL" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bqM" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -3612,8 +3612,8 @@
"brx" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/airless,/area/hallway/secondary/eva_hallway)
"bry" = (/obj/effect/floor_decal/corner/orange/full{dir = 8},/obj/machinery/air_sensor{frequency = 1441; id_tag = "tox_sensor"},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Phoron"; dir = 4},/turf/simulated/floor/reinforced/phoron,/area/engineering/atmos)
"brz" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "tox_in"; pixel_y = 1; use_power = 1},/obj/effect/floor_decal/corner/purple/diagonal,/obj/effect/floor_decal/corner/orange{dir = 4},/turf/simulated/floor/reinforced/phoron,/area/engineering/atmos)
-"brA" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "tox_in"; name = "Phoron Supply Control"; output_tag = "tox_out"; sensors = list("tox_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/orange/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"brB" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"brA" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "tox_in"; name = "Phoron Supply Control"; output_tag = "tox_out"; sensors = list("tox_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/orange/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"brB" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos)
"brC" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 0; tag_north = 2; tag_south = 1; tag_west = 6; use_power = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
"brD" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"brE" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8; icon_state = "map"},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -3689,9 +3689,9 @@
"bsW" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bsX" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bsY" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bsZ" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{ icon_state = "map"; dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bta" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"btb" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bsZ" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{icon_state = "map"; dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bta" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"btb" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"btc" = (/obj/machinery/atmospherics/tvalve/digital{dir = 8; name = "Waste to Space"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"btd" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bte" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -3734,7 +3734,7 @@
"btP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/eva_hallway)
"btQ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/eva_hallway)
"btR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/eva_hallway)
-"btS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/hallway/secondary/eva_hallway)
+"btS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/eva_hallway)
"btT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera/network/second_deck{c_tag = "Second Deck - Fore Starboard Hallway One"; dir = 1},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/hallway/secondary/eva_hallway)
"btU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/eva_hallway)
"btV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/eva_hallway)
@@ -3804,14 +3804,14 @@
"bvh" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "fore_starboard_outer"; locked = 1; name = "External Airlock Access"; req_access = list(13)},/turf/simulated/floor/airless,/area/maintenance/research)
"bvi" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/maintenance/research)
"bvj" = (/obj/machinery/atmospherics/pipe/simple/hidden/red,/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/maintenance/research)
-"bvk" = (/obj/effect/floor_decal/corner/white/diagonal{ icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2o_sensor"},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Nitrous Oxide"; dir = 4},/turf/simulated/floor/reinforced/n20,/area/engineering/atmos)
+"bvk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/secondary/eva_hallway)
"bvl" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "n2o_in"; pixel_y = 1; use_power = 1},/turf/simulated/floor/reinforced/n20,/area/engineering/atmos)
-"bvm" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
-"bvn" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2o_in"; name = "Nitrous Oxide Supply Control"; output_tag = "n2o_out"; sensors = list("n2o_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/white/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bvm" = (/obj/effect/floor_decal/corner/white/diagonal{icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2o_sensor"},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Nitrous Oxide"; dir = 4},/turf/simulated/floor/reinforced/n20,/area/engineering/atmos)
+"bvn" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
"bvo" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 2; tag_south = 0; tag_west = 7; use_power = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bvp" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bvq" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bvr" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{ icon_state = "map"; dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bvq" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2o_in"; name = "Nitrous Oxide Supply Control"; output_tag = "n2o_out"; sensors = list("n2o_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/white/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bvr" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{icon_state = "map"; dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bvs" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/pipedispenser/disposal,/obj/structure/window/reinforced,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bvt" = (/obj/machinery/computer/security/engineering,/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/yellow/border{dir = 9},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring)
"bvu" = (/obj/machinery/computer/atmos_alert,/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/yellow/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring)
@@ -3867,7 +3867,7 @@
"bws" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/floor/plating,/area/maintenance/research)
"bwt" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/closet/crate/internals,/obj/item/weapon/tank/emergency/oxygen/engi,/obj/item/weapon/tank/emergency/oxygen/engi,/obj/item/weapon/tank/emergency/oxygen/double,/obj/random/tank,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/research)
"bwu" = (/obj/machinery/light/small{dir = 8},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/reinforced/n20,/area/engineering/atmos)
-"bwv" = (/obj/effect/floor_decal/corner/white/diagonal{ icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/red,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "n2o_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0; use_power = 1},/turf/simulated/floor/reinforced/n20,/area/engineering/atmos)
+"bwv" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bww" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/obj/machinery/door/firedoor/glass,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos)
"bwx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/valve/digital{dir = 4; name = "N2O Outlet Valve"},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/white/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bwy" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "N2O to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -3945,7 +3945,7 @@
"bxS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/binary/pump{dir = 4; name = "N2O to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bxT" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"bxU" = (/obj/structure/table/standard,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/belt/utility/atmostech,/obj/item/weapon/storage/belt/utility/atmostech,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"bxV" = (/obj/structure/table/standard,/obj/structure/closet/fireaxecabinet{pixel_y = -32},/obj/machinery/cell_charger,/obj/item/device/multitool{pixel_x = 5},/obj/item/weapon/wrench,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"bxV" = (/obj/structure/table/standard,/obj/structure/closet/fireaxecabinet{pixel_y = -32},/obj/machinery/cell_charger,/obj/item/device/multitool{pixel_x = 5},/obj/item/weapon/tool/wrench,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bxW" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/obj/machinery/meter,/obj/structure/closet/firecloset,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bxX" = (/obj/machinery/atmospherics/valve/digital{dir = 4; name = "Emergency Cooling Valve 1"},/obj/structure/closet/firecloset,/turf/simulated/floor/tiled,/area/engineering/atmos)
"bxY" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{dir = 4; initialize_directions = 11},/obj/machinery/meter,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -4152,8 +4152,8 @@
"bBR" = (/obj/machinery/atmospherics/pipe/simple/hidden/red,/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
"bBS" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
"bBT" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{dir = 5; icon_state = "intact"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/sortjunction/flipped{dir = 4; name = "Atmospherics"; sortType = "Atmospherics"},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
-"bBU" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
-"bBV" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
+"bBU" = (/obj/effect/floor_decal/corner/white/diagonal{icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/red,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "n2o_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0; use_power = 1},/turf/simulated/floor/reinforced/n20,/area/engineering/atmos)
+"bBV" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
"bBW" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{dir = 10; icon_state = "intact"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
"bBX" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
"bBY" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
@@ -4185,7 +4185,7 @@
"bCy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/maintenance{req_access = list(12)},/turf/simulated/floor/plating,/area/storage/auxillary)
"bCz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/research)
"bCA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/research)
-"bCB" = (/obj/structure/table,/obj/item/stack/material/plastic,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool/hugetank,/turf/simulated/floor/plating,/area/maintenance/research)
+"bCB" = (/obj/structure/table,/obj/item/stack/material/plastic,/obj/item/weapon/tool/wrench,/obj/item/weapon/weldingtool/hugetank,/turf/simulated/floor/plating,/area/maintenance/research)
"bCC" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/research)
"bCD" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/research)
"bCE" = (/obj/item/weapon/rig/hazmat/equipped,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/obj/machinery/door/window/southright{name = "RD Suit"; req_one_access = list(30)},/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/blue/border,/obj/effect/floor_decal/corner/blue/border{dir = 9},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/hor)
@@ -4225,8 +4225,8 @@
"bDm" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor,/area/engineering/storage)
"bDn" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Hallway 2"; dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
"bDo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/red{dir = 1},/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway)
-"bDp" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway)
-"bDq" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway)
+"bDp" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
+"bDq" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway)
"bDr" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
"bDs" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
"bDt" = (/obj/structure/table/reinforced,/obj/effect/floor_decal/industrial/warning,/obj/structure/extinguisher_cabinet{pixel_x = 28; pixel_y = 0},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
@@ -4299,7 +4299,7 @@
"bEI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/catwalk,/turf/simulated/floor,/area/engineering/storage)
"bEJ" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 36; pixel_y = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/catwalk,/turf/simulated/floor,/area/engineering/storage)
"bEK" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 10},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
-"bEL" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway)
+"bEL" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway)
"bEM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway)
"bEN" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/outline/grey,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway)
"bEO" = (/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
@@ -4378,11 +4378,11 @@
"bGj" = (/obj/machinery/newscaster{pixel_y = 30},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 6},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
"bGk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
"bGl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
-"bGm" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
-"bGn" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{ icon_state = "map"; dir = 1},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/machinery/camera/network/research{c_tag = "SCI - Toxins Lab 1"; dir = 2},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
-"bGo" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled/white,/area/rnd/mixing)
-"bGp" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{ icon_state = "map"; dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
-"bGq" = (/obj/machinery/atmospherics/pipe/simple/visible/red{ icon_state = "intact"; dir = 10},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
+"bGm" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway)
+"bGn" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled/white,/area/rnd/mixing)
+"bGo" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{icon_state = "map"; dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
+"bGp" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
+"bGq" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{icon_state = "map"; dir = 1},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/machinery/camera/network/research{c_tag = "SCI - Toxins Lab 1"; dir = 2},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
"bGr" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/white,/area/rnd/mixing)
"bGs" = (/turf/simulated/wall,/area/rnd/mixing)
"bGt" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eng_port_pump"},/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eng_port_airlock"; pixel_x = -25; req_access = list(13); req_one_access = null; tag_airpump = "eng_port_pump"; tag_chamber_sensor = "eng_port_sensor"; tag_exterior_door = "eng_port_outer"; tag_interior_door = "eng_port_inner"},/turf/simulated/floor,/area/engineering/drone_fabrication)
@@ -4535,9 +4535,9 @@
"bJk" = (/obj/machinery/camera/network/research{c_tag = "SCI - Toxins Gas Storage"; dir = 1},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled/dark,/area/rnd/storage)
"bJl" = (/obj/machinery/computer/area_atmos,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/rnd/storage)
"bJm" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled/dark,/area/rnd/storage)
-"bJn" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/table/standard,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/weapon/crowbar,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
+"bJn" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/table/standard,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/screwdriver{pixel_y = 10},/obj/item/weapon/tool/crowbar,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
"bJo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
-"bJp" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/industrial/warning/cee{ icon_state = "warningcee"; dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
+"bJp" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 10},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
"bJq" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/obj/machinery/meter,/turf/simulated/floor/tiled/white,/area/rnd/mixing)
"bJr" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
"bJs" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled/steel,/area/rnd/mixing)
@@ -4605,7 +4605,7 @@
"bKC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/closet/bombcloset,/obj/machinery/light{dir = 8},/obj/structure/sign/warning/nosmoking_2{pixel_x = -32},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
"bKD" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
"bKE" = (/obj/machinery/atmospherics/binary/passive_gate{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
-"bKF" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
+"bKF" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
"bKG" = (/obj/structure/sign/warning/hot_exhaust,/turf/simulated/wall/r_wall,/area/rnd/mixing)
"bKH" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 5},/turf/simulated/wall/r_wall,/area/rnd/mixing)
"bKI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 1},/turf/simulated/wall/r_wall,/area/rnd/mixing)
@@ -4636,8 +4636,8 @@
"bLh" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/engineering/hallway/engineer_hallway)
"bLi" = (/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/yellow/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/engineering/foyer)
"bLj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/red{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/foyer)
-"bLk" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/foyer)
-"bLl" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer)
+"bLk" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
+"bLl" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer)
"bLm" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/powered/scrubber,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer)
"bLn" = (/obj/structure/dispenser{phorontanks = 0},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/engineering/engineer_eva)
"bLo" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engineer_eva)
@@ -4879,7 +4879,7 @@
"bPQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/reinforced/airless,/area/rnd/mixing)
"bPR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; external_pressure_bound_default = 0; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0; use_power = 1},/obj/machinery/sparker{dir = 2; id = "mixingsparker"; pixel_x = -22},/turf/simulated/floor/reinforced/airless,/area/rnd/mixing)
"bPS" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/simulated/floor/reinforced/airless,/area/rnd/mixing)
-"bPT" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ icon_state = "intact"; dir = 9},/turf/simulated/floor/reinforced/airless,/area/rnd/mixing)
+"bPT" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/foyer)
"bPU" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 9},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor,/area/engineering/engine_waste)
"bPV" = (/turf/simulated/floor,/area/engineering/engine_waste)
"bPW" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_waste)
@@ -5068,9 +5068,9 @@
"bTx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/rnd/mixing)
"bTy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/rnd/mixing)
"bTz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/rnd/mixing)
-"bTA" = (/obj/item/weapon/wrench,/turf/simulated/floor/tiled,/area/rnd/mixing)
+"bTA" = (/obj/item/weapon/tool/wrench,/turf/simulated/floor/tiled,/area/rnd/mixing)
"bTB" = (/obj/machinery/pipedispenser,/turf/simulated/floor/tiled,/area/rnd/mixing)
-"bTC" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ icon_state = "intact"; dir = 10},/obj/structure/lattice,/turf/space,/area/space)
+"bTC" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{icon_state = "intact"; dir = 9},/turf/simulated/floor/reinforced/airless,/area/rnd/mixing)
"bTD" = (/turf/simulated/wall/r_wall,/area/engineering/engine_room)
"bTE" = (/obj/structure/sign/warning/radioactive,/turf/simulated/wall/r_wall,/area/engineering/engine_room)
"bTF" = (/obj/machinery/atmospherics/pipe/simple/visible/black,/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineEmitterPortWest"; layer = 3.3; name = "Engine Waste Handling Access"},/turf/simulated/floor,/area/engineering/engine_room)
@@ -5107,7 +5107,7 @@
"bUk" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/turf/simulated/floor/tiled/freezer,/area/engineering/engi_restroom)
"bUl" = (/obj/structure/sink{pixel_y = 16},/obj/structure/mirror{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/freezer,/area/engineering/engi_restroom)
"bUm" = (/obj/structure/undies_wardrobe,/obj/structure/window/basic,/turf/simulated/floor/tiled/freezer,/area/engineering/engi_restroom)
-"bUn" = (/obj/structure/closet/crate,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/item/weapon/crowbar,/obj/item/weapon/wirecutters,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/security,/obj/random/maintenance/security,/turf/simulated/floor,/area/maintenance/engineering)
+"bUn" = (/obj/structure/closet/crate,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/wirecutters,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/security,/obj/random/maintenance/security,/turf/simulated/floor,/area/maintenance/engineering)
"bUo" = (/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor/plating,/area/maintenance/engineering)
"bUp" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/grass,/area/hallway/primary/seconddeck/fpcenter)
"bUq" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/navbeacon/patrol{location = "CH2"; next_patrol = "CH3"},/turf/simulated/floor/tiled/dark,/area/hallway/primary/seconddeck/fpcenter)
@@ -5150,11 +5150,11 @@
"bVb" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bVc" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bVd" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
-"bVe" = (/obj/structure/table/standard,/obj/structure/window/reinforced,/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/hemostat,/obj/item/stack/cable_coil,/obj/item/weapon/weldingtool/hugetank,/obj/effect/floor_decal/industrial/warning,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
-"bVf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/closet/crate,/obj/item/weapon/wrench,/obj/item/weapon/crowbar/red,/obj/machinery/computer/security/telescreen{desc = "Used to monitor the proceedings inside the test chamber."; name = "Test Chamber Monitor"; network = list("Miscellaneous Reseach"); pixel_x = -32; pixel_y = -4},/obj/machinery/camera/network/research{c_tag = "SCI - Miscellaneous Research"; dir = 4},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
+"bVe" = (/obj/structure/table/standard,/obj/structure/window/reinforced,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/crowbar,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/hemostat,/obj/item/stack/cable_coil,/obj/item/weapon/weldingtool/hugetank,/obj/effect/floor_decal/industrial/warning,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
+"bVf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/closet/crate,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/crowbar/red,/obj/machinery/computer/security/telescreen{desc = "Used to monitor the proceedings inside the test chamber."; name = "Test Chamber Monitor"; network = list("Miscellaneous Reseach"); pixel_x = -32; pixel_y = -4},/obj/machinery/camera/network/research{c_tag = "SCI - Miscellaneous Research"; dir = 4},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
"bVg" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
"bVh" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/purple/border{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
-"bVi" = (/obj/effect/floor_decal/industrial/warning/cee{ icon_state = "warningcee"; dir = 1},/obj/machinery/door/window/westright{name = "Test Chamber"; req_one_access = list(7,29)},/obj/machinery/door/window/eastleft{name = "Test Chamber"; req_one_access = list(7,29)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 2; icon_state = "pdoor0"; id = "misclab"; name = "Test Chamber Blast Doors"; opacity = 0},/turf/simulated/floor/tiled/dark,/area/rnd/misc_lab)
+"bVi" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{icon_state = "intact"; dir = 10},/obj/structure/lattice,/turf/space,/area/space)
"bVj" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/reinforced,/area/rnd/misc_lab)
"bVk" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/reinforced,/area/rnd/misc_lab)
"bVl" = (/obj/machinery/portable_atmospherics/canister,/obj/machinery/camera/network/research{c_tag = "Research - Miscellaneous Test Chamber"; dir = 8; network = list("Research","Miscellaneous Reseach")},/turf/simulated/floor/reinforced,/area/rnd/misc_lab)
@@ -5169,14 +5169,14 @@
"bVu" = (/obj/machinery/portable_atmospherics/canister,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/rnd/mixing)
"bVv" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/obj/structure/lattice,/turf/space,/area/space)
"bVw" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/space,/area/space)
-"bVx" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ icon_state = "intact"; dir = 9},/turf/space,/area/space)
+"bVx" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 1},/obj/machinery/door/window/westright{name = "Test Chamber"; req_one_access = list(7,29)},/obj/machinery/door/window/eastleft{name = "Test Chamber"; req_one_access = list(7,29)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 2; icon_state = "pdoor0"; id = "misclab"; name = "Test Chamber Blast Doors"; opacity = 0},/turf/simulated/floor/tiled/dark,/area/rnd/misc_lab)
"bVy" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 8; icon_state = "intact"},/obj/structure/grille,/turf/space,/area/space)
"bVz" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 10},/obj/structure/grille,/turf/space,/area/space)
-"bVA" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 6},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport1"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor,/area/engineering/engine_room)
+"bVA" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{icon_state = "intact"; dir = 9},/turf/space,/area/space)
"bVB" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
-"bVC" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine radiator viewport shutters."; id = "EngineRadiatorViewport1"; name = "Engine Radiator Viewport Shutters"; pixel_x = 0; pixel_y = 25; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
+"bVC" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine radiator viewport shutters."; id = "EngineRadiatorViewport1"; name = "Engine Radiator Viewport Shutters"; pixel_x = 0; pixel_y = 25; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
"bVD" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/engine_room)
-"bVE" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
+"bVE" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 6},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport1"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor,/area/engineering/engine_room)
"bVF" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 10; icon_state = "intact"},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
"bVG" = (/obj/machinery/atmospherics/pipe/manifold/visible/black{dir = 8},/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"bVH" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
@@ -5265,7 +5265,7 @@
"bXm" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/rnd/mixing)
"bXn" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/rnd/mixing)
"bXo" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/black,/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
-"bXp" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport1"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/manifold/visible/green{ icon_state = "map"; dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
+"bXp" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
"bXq" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/atmospherics/pipe/cap/visible{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"bXr" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/engineering/engine_room)
"bXs" = (/obj/machinery/atmospherics/pipe/cap/visible{dir = 1},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor,/area/engineering/engine_room)
@@ -5281,7 +5281,7 @@
"bXC" = (/obj/structure/closet/secure_closet/engineering_electrical,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/engineering/workshop)
"bXD" = (/obj/machinery/vending/tool,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/workshop)
"bXE" = (/obj/structure/closet/toolcloset,/obj/item/device/flashlight,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/workshop)
-"bXF" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar/red,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/tiled/dark,/area/engineering/workshop)
+"bXF" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/tiled/dark,/area/engineering/workshop)
"bXG" = (/obj/machinery/computer/station_alert/all,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief)
"bXH" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief)
"bXI" = (/obj/structure/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Chief Engineer"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief)
@@ -5310,7 +5310,7 @@
"bYf" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Central Substation Bypass"},/turf/simulated/floor,/area/maintenance/substation/central)
"bYg" = (/obj/random/obstruction,/turf/simulated/floor/plating,/area/maintenance/central)
"bYh" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Central Maintenance Access"; req_one_access = list(12,19)},/turf/simulated/floor/plating,/area/maintenance/central)
-"bYi" = (/obj/structure/closet/crate,/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/teleporter)
+"bYi" = (/obj/structure/closet/crate,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/teleporter)
"bYj" = (/turf/simulated/floor/tiled,/area/teleporter)
"bYk" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/turf/simulated/floor/tiled,/area/teleporter)
"bYl" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled,/area/teleporter)
@@ -5364,7 +5364,7 @@
"bZh" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/engineering/workshop)
"bZi" = (/obj/machinery/vending/engivend,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/workshop)
"bZj" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/yellow/border{dir = 6},/turf/simulated/floor/tiled,/area/engineering/workshop)
-"bZk" = (/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/wrench,/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled/dark,/area/engineering/workshop)
+"bZk" = (/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/tool/wrench,/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled/dark,/area/engineering/workshop)
"bZl" = (/obj/machinery/computer/security/telescreen{desc = "Used to monitor the engine room."; layer = 3.3; name = "Engine Monitor"; network = list("Engine"); pixel_x = 0; pixel_y = -34},/obj/machinery/computer/atmos_alert,/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief)
"bZm" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief)
"bZn" = (/obj/machinery/camera/network/engineering{c_tag = "ENG - Chief Engineer's Office"; dir = 1},/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the engine core airlock hatch bolts."; id = "engine_access_hatch"; name = "Engine Hatch Bolt Control"; pixel_x = -6; pixel_y = -44; specialfunctions = 4},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for engine core."; id = "EngineVent"; name = "Engine Ventillatory Control"; pixel_x = 6; pixel_y = -44},/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/button/remote/blast_door{id = "englockdown"; name = "Engineering Lockdown"; pixel_x = -6; pixel_y = -34; req_access = list(10)},/obj/machinery/button/remote/blast_door{id = "atmoslockdown"; name = "Atmospherics Lockdown"; pixel_x = 6; pixel_y = -34; req_access = list(10)},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief)
@@ -5513,7 +5513,7 @@
"cca" = (/obj/machinery/computer/guestpass{pixel_x = 0; pixel_y = -30},/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/purple/border{dir = 6},/obj/effect/floor_decal/borderfloorwhite/corner2,/obj/effect/floor_decal/corner/purple/bordercorner2,/turf/simulated/floor/tiled/white,/area/rnd/research_foyer)
"ccb" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/assembly/robotics)
"ccc" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/purple/border,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
-"ccd" = (/obj/structure/table/standard,/obj/structure/reagent_dispensers/acid{density = 0; pixel_x = 0; pixel_y = -30},/obj/machinery/recharger{pixel_y = 0},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool{pixel_x = 3},/obj/item/device/multitool{pixel_x = 3},/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/purple/border,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
+"ccd" = (/obj/structure/table/standard,/obj/structure/reagent_dispensers/acid{density = 0; pixel_x = 0; pixel_y = -30},/obj/machinery/recharger{pixel_y = 0},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool{pixel_x = 3},/obj/item/device/multitool{pixel_x = 3},/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/purple/border,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"cce" = (/obj/structure/closet{name = "robotics parts"},/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/machinery/ai_status_display{pixel_y = -32},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/purple/border,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"ccf" = (/obj/structure/closet{name = "welding equipment"},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/machinery/light,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/purple/border,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"ccg" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/purple/border,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
@@ -5536,7 +5536,7 @@
"ccx" = (/obj/structure/closet/secure_closet/personal/patient,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/lime/border{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/virology)
"ccy" = (/obj/structure/table/glass,/obj/item/roller,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/tiled/white,/area/medical/virology)
"ccz" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/space,/area/space)
-"ccA" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ icon_state = "intact"; dir = 10},/turf/space,/area/space)
+"ccA" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport1"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/manifold/visible/green{icon_state = "map"; dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
"ccB" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 9},/obj/structure/grille,/turf/space,/area/space)
"ccC" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/atmospherics/pipe/cap/visible,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor,/area/engineering/engine_room)
"ccD" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/atmospherics/pipe/cap/visible,/turf/simulated/floor,/area/engineering/engine_room)
@@ -5604,8 +5604,8 @@
"cdN" = (/obj/machinery/smartfridge/secure/virology,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/lime/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology)
"cdO" = (/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/lime/border{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/virology)
"cdP" = (/obj/structure/bed/padded,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/item/weapon/bedsheet/green,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/lime/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology)
-"cdQ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ icon_state = "intact"; dir = 9},/obj/structure/lattice,/turf/space,/area/space)
-"cdR" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/engine_room)
+"cdQ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{icon_state = "intact"; dir = 10},/turf/space,/area/space)
+"cdR" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{icon_state = "intact"; dir = 9},/obj/structure/lattice,/turf/space,/area/space)
"cdS" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/turf/simulated/floor,/area/engineering/engine_room)
"cdT" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/turf/simulated/floor,/area/engineering/engine_room)
"cdU" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor,/area/engineering/engine_room)
@@ -5621,7 +5621,7 @@
"cee" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance_hatch{icon_state = "door_closed"; locked = 0; name = "Engine Access"; req_one_access = list(11)},/turf/simulated/floor/tiled,/area/engineering/engine_airlock)
"cef" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/hallway/engineer_hallway)
"ceg" = (/obj/machinery/door/window/westleft{name = "Engineering Delivery"; req_access = list(10)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "englockdown"; name = "Engineering Lockdown"; opacity = 0},/turf/simulated/floor/tiled,/area/engineering/hallway/engineer_hallway)
-"ceh" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/machinery/navbeacon/delivery/west{location = "Engineering"},/turf/simulated/floor/tiled,/area/engineering/hallway/engineer_hallway)
+"ceh" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/engine_room)
"cei" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cej" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{pixel_y = 23},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cek" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/apmaint)
@@ -5696,8 +5696,8 @@
"cfB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/medical/virology)
"cfC" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/disposaloutlet{dir = 4},/obj/machinery/shield_diffuser,/turf/simulated/floor/airless,/area/medical/virology)
"cfD" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/button/remote/blast_door{id = "EngineVent"; name = "Reactor Ventillatory Control"; pixel_x = -25; pixel_y = 0; req_access = list(10)},/turf/simulated/floor,/area/engineering/engine_room)
-"cfE" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/camera/network/engine{c_tag = "ENG - Engine Core 1"; dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/yellow{ icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/engine_room)
-"cfF" = (/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/atmospherics/pipe/manifold/visible/yellow{ icon_state = "map"; dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
+"cfE" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/navbeacon/delivery/west{location = "Engineering"},/turf/simulated/floor/tiled,/area/engineering/hallway/engineer_hallway)
+"cfF" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/camera/network/engine{c_tag = "ENG - Engine Core 1"; dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/yellow{icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/engine_room)
"cfG" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor,/area/engineering/engine_room)
"cfH" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9},/turf/simulated/floor,/area/engineering/engine_room)
"cfI" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/airlock_sensor/airlock_interior{id_tag = "eng_al_int_snsr"; master_tag = "engine_room_airlock"; pixel_x = 22; pixel_y = 0; req_access = list(10)},/obj/effect/engine_setup/pump_max,/turf/simulated/floor,/area/engineering/engine_room)
@@ -5854,7 +5854,7 @@
"ciD" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/engineering/engine_room)
"ciE" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/engineering/engine_room)
"ciF" = (/obj/machinery/atmospherics/valve/digital{dir = 4; name = "Emergency Cooling Valve 1"},/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/outline,/turf/simulated/floor,/area/engineering/engine_room)
-"ciG" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{ icon_state = "map"; dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor,/area/engineering/engine_room)
+"ciG" = (/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/atmospherics/pipe/manifold/visible/yellow{icon_state = "map"; dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"ciH" = (/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/power/sensor{name = "Powernet Sensor - Engine Power"; name_tag = "Engine Power"},/turf/simulated/floor,/area/engineering/engine_room)
"ciI" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/obj/effect/wingrille_spawn/reinforced_phoron,/turf/simulated/floor,/area/engineering/engine_monitoring)
"ciJ" = (/obj/machinery/computer/rcon,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
@@ -5961,7 +5961,7 @@
"ckG" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/engineering/engine_room)
"ckH" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/wingrille_spawn/reinforced_phoron,/turf/simulated/floor,/area/engineering/engine_monitoring)
"ckI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/power_monitor,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
-"ckJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; pixel_x = -6; pixel_y = -3; req_access = list(10)},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Reactor Blast Doors"; pixel_x = -6; pixel_y = 7; req_access = list(10)},/obj/machinery/button/remote/emitter{desc = "A remote control-switch for the engine emitter."; id = "EngineEmitter"; name = "Engine Emitter"; pixel_x = 6; pixel_y = 2; req_access = list(10)},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
+"ckJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; pixel_x = -6; pixel_y = -3; req_access = list(10)},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Reactor Blast Doors"; pixel_x = -6; pixel_y = 7; req_access = list(10)},/obj/machinery/button/remote/emitter{desc = "A remote control-switch for the engine emitter."; id = "EngineEmitter"; name = "Engine Emitter"; pixel_x = 6; pixel_y = 2; req_access = list(10)},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/engine_setup/shutters,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"ckK" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"ckL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"ckM" = (/obj/machinery/disposal,/obj/machinery/camera/network/engine{c_tag = "ENG - Monitoring Room"; dir = 8},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
@@ -6058,7 +6058,7 @@
"cmz" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"cmA" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"cmB" = (/obj/machinery/atmospherics/valve/digital{dir = 4; name = "Emergency Cooling Valve 2"},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/outline,/turf/simulated/floor,/area/engineering/engine_room)
-"cmC" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{ icon_state = "map"; dir = 4},/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
+"cmC" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{icon_state = "map"; dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor,/area/engineering/engine_room)
"cmD" = (/turf/simulated/floor,/area/engineering/engine_room)
"cmE" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/wingrille_spawn/reinforced_phoron,/turf/simulated/floor,/area/engineering/engine_monitoring)
"cmF" = (/obj/machinery/computer/security/engineering,/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
@@ -6316,7 +6316,7 @@
"crx" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/virusdish/random,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/lime/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology)
"cry" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/window/southright{dir = 2; name = "Virology Isolation Room"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/black,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/medical/virology)
"crz" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor,/area/engineering/engine_room)
-"crA" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{ icon_state = "intact"; dir = 6},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor,/area/engineering/engine_room)
+"crA" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{icon_state = "map"; dir = 4},/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"crB" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor,/area/engineering/engine_room)
"crC" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/engineering/engine_room)
"crD" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/turf/simulated/floor,/area/engineering/engine_room)
@@ -6410,10 +6410,10 @@
"ctn" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/lime/border{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/virology)
"cto" = (/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/virology)
"ctp" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/lime/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology)
-"ctq" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{ icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor,/area/engineering/engine_room)
+"ctq" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{icon_state = "intact"; dir = 6},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor,/area/engineering/engine_room)
"ctr" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1; dir = 4},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor,/area/engineering/engine_room)
"cts" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor,/area/engineering/engine_room)
-"ctt" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{ icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
+"ctt" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor,/area/engineering/engine_room)
"ctu" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9},/turf/simulated/floor,/area/engineering/engine_room)
"ctv" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/engine_room)
"ctw" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/alarm/nobreach{dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor,/area/engineering/engine_room)
@@ -6513,7 +6513,7 @@
"cvm" = (/obj/structure/bed/chair,/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/brown/border{dir = 5},/obj/machinery/atm{pixel_y = 30},/turf/simulated/floor/tiled,/area/quartermaster/foyer)
"cvn" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced/polarized{id = "quart_tint"},/obj/machinery/ai_status_display{layer = 4},/turf/simulated/floor/plating,/area/quartermaster/qm)
"cvo" = (/obj/structure/filingcabinet,/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/brown/border{dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/qm)
-"cvp" = (/obj/machinery/computer/supplycomp,/obj/machinery/status_display/supply_display{pixel_y = 32},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/brown/border{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/qm)
+"cvp" = (/obj/machinery/computer/supplycomp/control,/turf/simulated/floor/tiled,/area/quartermaster/qm)
"cvq" = (/obj/machinery/computer/security/mining,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/brown/border{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/qm)
"cvr" = (/obj/structure/table/standard,/obj/item/weapon/cartridge/quartermaster{pixel_x = 6; pixel_y = 5},/obj/item/weapon/cartridge/quartermaster,/obj/item/weapon/cartridge/quartermaster{pixel_x = -4; pixel_y = 7},/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = 0; pixel_y = 28},/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/brown/border{dir = 5},/turf/simulated/floor/tiled,/area/quartermaster/qm)
"cvs" = (/obj/structure/table/rack,/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/techmaint,/area/ai_monitored/storage/emergency/eva)
@@ -6593,10 +6593,10 @@
"cwO" = (/obj/machinery/disease2/diseaseanalyser,/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/lime/border{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/virology)
"cwP" = (/obj/structure/table/glass,/obj/item/roller,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled/white,/area/medical/virology)
"cwQ" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport2"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 10; icon_state = "intact"},/turf/simulated/floor,/area/engineering/engine_room)
-"cwR" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/engine_room)
+"cwR" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
"cwS" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1; dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor,/area/engineering/engine_room)
"cwT" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 10; icon_state = "intact"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor,/area/engineering/engine_room)
-"cwU" = (/obj/machinery/atmospherics/pipe/simple/visible/green{ icon_state = "intact"; dir = 6},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
+"cwU" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/engine_room)
"cwV" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor,/area/engineering/engine_room)
"cwW" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor,/area/engineering/engine_room)
"cwX" = (/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -6621,10 +6621,10 @@
"cxq" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/brown/border{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/qm)
"cxr" = (/turf/simulated/floor/tiled,/area/quartermaster/qm)
"cxs" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Quartermaster"},/obj/machinery/button/remote/blast_door{id = "crglockdown"; name = "Cargo Lockdown"; pixel_x = -24; pixel_y = -26; req_access = list()},/turf/simulated/floor/tiled,/area/quartermaster/qm)
-"cxt" = (/obj/structure/table/standard,/obj/item/weapon/coin/silver{pixel_x = -3; pixel_y = 3},/obj/item/weapon/coin/silver,/obj/item/device/retail_scanner/civilian{ icon_state = "retail_idle"; dir = 1},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/brown/border{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/qm)
+"cxt" = (/obj/machinery/atmospherics/pipe/simple/visible/green{icon_state = "intact"; dir = 6},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
"cxu" = (/obj/machinery/status_display,/turf/simulated/wall,/area/quartermaster/qm)
"cxv" = (/obj/structure/table/reinforced,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/briefcase/inflatable{pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = -3},/turf/simulated/floor/tiled/techmaint,/area/ai_monitored/storage/emergency/eva)
-"cxw" = (/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/machinery/camera/network/civilian{c_tag = "CIV - Emergency EVA"; dir = 1},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled/techmaint,/area/ai_monitored/storage/emergency/eva)
+"cxw" = (/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/machinery/camera/network/civilian{c_tag = "CIV - Emergency EVA"; dir = 1},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled/techmaint,/area/ai_monitored/storage/emergency/eva)
"cxx" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/techmaint,/area/ai_monitored/storage/emergency/eva)
"cxy" = (/obj/structure/flora/ausbushes/genericbush,/turf/simulated/floor/grass,/area/hallway/primary/seconddeck/apcenter)
"cxz" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/green/border{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/apcenter)
@@ -6764,7 +6764,7 @@
"cAd" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/bottle/stoxin{pixel_x = -6; pixel_y = 10},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = 5; pixel_y = 5},/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 1},/obj/random/medical,/obj/item/weapon/storage/firstaid/regular{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/regular,/obj/random/medical,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/masks{pixel_y = 0},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage)
"cAe" = (/obj/structure/closet/l3closet/medical,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/dark,/area/medical/biostorage)
"cAf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/dark,/area/medical/biostorage)
-"cAg" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/item/weapon/crowbar/red,/obj/item/weapon/crowbar/red,/turf/simulated/floor/tiled/dark,/area/medical/biostorage)
+"cAg" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/tool/crowbar/red,/turf/simulated/floor/tiled/dark,/area/medical/biostorage)
"cAh" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/medbay2)
"cAi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/medbay2)
"cAj" = (/turf/simulated/wall,/area/medical/medbay2)
@@ -6846,7 +6846,7 @@
"cBH" = (/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"},/turf/simulated/floor/tiled/white,/area/medical/foyer)
"cBI" = (/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/medical/foyer)
"cBJ" = (/obj/structure/bed/chair{dir = 8},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/foyer)
-"cBK" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/table/glass,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/screwdriver,/obj/machinery/button/remote/blast_door{id = "chemwindow"; name = "Pharmacy Windows Shutter Control"; pixel_x = 6; pixel_y = -18; pixel_z = 0},/obj/machinery/button/remote/blast_door{id = "chemcounter"; name = "Pharmacy Counter Lockdown Control"; pixel_x = -6; pixel_y = -18},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/beige/border{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
+"cBK" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/table/glass,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/tool/screwdriver,/obj/machinery/button/remote/blast_door{id = "chemwindow"; name = "Pharmacy Windows Shutter Control"; pixel_x = 6; pixel_y = -18; pixel_z = 0},/obj/machinery/button/remote/blast_door{id = "chemcounter"; name = "Pharmacy Counter Lockdown Control"; pixel_x = -6; pixel_y = -18},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/beige/border{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
"cBL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
"cBM" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/effect/floor_decal/industrial/outline/grey,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/chemistry)
"cBN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
@@ -6879,7 +6879,7 @@
"cCo" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/quartermaster/delivery)
"cCp" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/delivery)
"cCq" = (/obj/structure/table/steel,/obj/item/weapon/wrapping_paper,/obj/item/weapon/wrapping_paper,/obj/item/weapon/wrapping_paper,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/light_switch{pixel_x = 36; pixel_y = 0},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/brown/bordercorner,/turf/simulated/floor/tiled,/area/quartermaster/delivery)
-"cCr" = (/obj/machinery/computer/ordercomp,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/brown/border,/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/brown/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/foyer)
+"cCr" = (/obj/machinery/computer/supplycomp,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/brown/border,/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/brown/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/foyer)
"cCs" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/quartermaster/foyer)
"cCt" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/foyer)
"cCu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/quartermaster/foyer)
@@ -6916,7 +6916,7 @@
"cCZ" = (/obj/structure/closet/secure_closet/medical1,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/light_switch{pixel_x = -36},/obj/random/medical,/obj/random/medical,/obj/random/medical,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled/dark,/area/medical/medbay_emt_bay)
"cDa" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/pink/border{dir = 8},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 10},/obj/effect/floor_decal/corner/pink/bordercorner2{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay)
"cDb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/pink/border{dir = 4},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 5},/obj/effect/floor_decal/corner/pink/bordercorner2{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay)
-"cDc" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/structure/table/rack{dir = 8; layer = 2.6},/turf/simulated/floor/tiled/dark,/area/medical/medbay_emt_bay)
+"cDc" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/structure/table/rack{dir = 8; layer = 2.6},/turf/simulated/floor/tiled/dark,/area/medical/medbay_emt_bay)
"cDd" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced/polarized{id = "exam_window_tint"},/turf/simulated/floor/plating,/area/medical/exam_room)
"cDe" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{name = "Examination Room"; req_access = list(5)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/steel_grid,/area/medical/exam_room)
"cDf" = (/obj/structure/table/glass,/obj/machinery/recharger{pixel_y = 0},/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/camera/network/medbay{c_tag = "MED - Medical Break Area"; dir = 4},/obj/item/device/defib_kit/loaded,/turf/simulated/floor/tiled/white,/area/medical/reception)
@@ -7050,9 +7050,9 @@
"cFD" = (/obj/structure/sign/poster{pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/quartermaster/delivery)
"cFE" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access = list(50)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/steel_grid,/area/quartermaster/delivery)
"cFF" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/quartermaster/delivery)
-"cFG" = (/obj/structure/table/steel,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/item/weapon/pen,/obj/item/device/retail_scanner/civilian{ icon_state = "retail_idle"; dir = 1},/obj/machinery/light{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/brown/border{dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/office)
+"cFG" = (/obj/structure/table/standard,/obj/item/weapon/coin/silver{pixel_x = -3; pixel_y = 3},/obj/item/weapon/coin/silver,/obj/item/device/retail_scanner/civilian{icon_state = "retail_idle"; dir = 1},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/brown/border{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/qm)
"cFH" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Cargo Technician"},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/brown/border{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office)
-"cFI" = (/obj/machinery/computer/supplycomp,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/brown/border{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office)
+"cFI" = (/obj/machinery/computer/supplycomp/control,/turf/simulated/floor/tiled,/area/quartermaster/office)
"cFJ" = (/obj/structure/filingcabinet/filingcabinet,/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/brown/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office)
"cFK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/office)
"cFL" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/office)
@@ -7411,7 +7411,7 @@
"cMA" = (/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/pink/border{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"cMB" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/pink/border{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"cMC" = (/obj/structure/extinguisher_cabinet{pixel_x = 28; pixel_y = 0},/obj/machinery/firealarm{pixel_y = 24},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloorwhite{dir = 5},/obj/effect/floor_decal/corner/pink/border{dir = 5},/obj/machinery/computer/crew,/turf/simulated/floor/tiled/white,/area/medical/sleeper)
-"cMD" = (/obj/item/weapon/wrench,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/structure/table/glass,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/techmaint,/area/medical/cryo)
+"cMD" = (/obj/item/weapon/tool/wrench,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/structure/table/glass,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/techmaint,/area/medical/cryo)
"cME" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/tiled/techmaint,/area/medical/cryo)
"cMF" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/techmaint,/area/medical/cryo)
"cMG" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/techmaint,/area/medical/cryo)
@@ -7497,7 +7497,7 @@
"cOi" = (/obj/structure/morgue,/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/paleblue/border{dir = 9},/turf/simulated/floor/tiled,/area/medical/morgue)
"cOj" = (/obj/machinery/camera/network/medbay{c_tag = "MED - Morgue"; dir = 2},/obj/structure/sink{pixel_y = 16},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue)
"cOk" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue)
-"cOl" = (/obj/structure/morgue{ icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/turf/simulated/floor/tiled,/area/medical/morgue)
+"cOl" = (/obj/structure/table/steel,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/item/weapon/pen,/obj/item/device/retail_scanner/civilian{icon_state = "retail_idle"; dir = 1},/obj/machinery/light{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/brown/border{dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/office)
"cOm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/medbay2)
"cOn" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloorwhite/corner,/obj/effect/floor_decal/corner/paleblue/bordercorner,/turf/simulated/floor/tiled/white,/area/medical/medbay2)
"cOo" = (/obj/structure/extinguisher_cabinet{pixel_x = -28; pixel_y = 0},/obj/effect/floor_decal/borderfloorwhite/corner{dir = 8},/obj/effect/floor_decal/corner/paleblue/bordercorner{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/medical_lockerroom)
@@ -7558,7 +7558,7 @@
"cPr" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/obj/item/device/radio/intercom/department/medbay{dir = 1; pixel_x = 0; pixel_y = -21},/obj/machinery/vending/wallmed1{pixel_x = 25},/turf/simulated/floor/carpet/sblucarpet,/area/medical/psych)
"cPs" = (/obj/structure/morgue,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/turf/simulated/floor/tiled,/area/medical/morgue)
"cPt" = (/turf/simulated/floor/tiled,/area/medical/morgue)
-"cPu" = (/obj/structure/morgue{ icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue)
+"cPu" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/turf/simulated/floor/tiled,/area/medical/morgue)
"cPv" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{dir = 4; pixel_x = -22; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/medbay2)
"cPw" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/medbay2)
"cPx" = (/obj/machinery/status_display,/turf/simulated/wall,/area/medical/medical_lockerroom)
@@ -7685,8 +7685,8 @@
"cRO" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cRP" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 4},/obj/effect/floor_decal/corner/purple/bordercorner2{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cRQ" = (/obj/item/device/radio/intercom/department/medbay{dir = 2; pixel_x = 0; pixel_y = 21},/obj/machinery/camera/network/medbay{c_tag = "MED - Cloning"; dir = 2},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
-"cRR" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/bodybags{pixel_x = 1; pixel_y = 2},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
-"cRS" = (/obj/structure/table/standard,/obj/item/weapon/storage/laundry_basket,/obj/machinery/firealarm{pixel_y = 24},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
+"cRR" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/obj/machinery/organ_printer/flesh/full,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
+"cRS" = (/obj/structure/table/standard,/obj/item/weapon/storage/laundry_basket,/obj/machinery/firealarm{pixel_y = 24},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/obj/item/weapon/storage/box/bodybags,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cRT" = (/obj/structure/filingcabinet/chestdrawer{desc = "A large drawer filled with autopsy reports."; name = "Autopsy Reports"},/obj/machinery/alarm{dir = 4; pixel_x = -22; pixel_y = 0},/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/paleblue/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue)
"cRU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/medical/morgue)
"cRV" = (/obj/structure/table/steel,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 36; pixel_y = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/paleblue/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue)
@@ -7731,7 +7731,7 @@
"cSI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/medbay)
"cSJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/medbay)
"cSK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/medbay)
-"cSL" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/medbay)
+"cSL" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue)
"cSM" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/turf/simulated/floor/plating,/area/maintenance/medbay)
"cSN" = (/obj/machinery/status_display,/turf/simulated/wall,/area/medical/sleeper)
"cSO" = (/obj/machinery/ai_status_display,/turf/simulated/wall,/area/medical/sleeper)
@@ -7803,7 +7803,7 @@
"cUc" = (/obj/structure/closet/wardrobe/medic_white,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/ward)
"cUd" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/structure/curtain/open/privacy,/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/paleblue/border{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/ward)
"cUe" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/obj/structure/curtain/open/privacy,/obj/effect/floor_decal/borderfloorwhite{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/ward)
-"cUf" = (/obj/machinery/clonepod{biomass = 600},/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/purple/border{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
+"cUf" = (/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/purple/border{dir = 10},/obj/machinery/clonepod/full,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cUg" = (/obj/machinery/computer/cloning,/obj/machinery/light,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/purple/border,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cUh" = (/obj/machinery/dna_scannernew,/obj/effect/floor_decal/borderfloorwhite/corner{dir = 8},/obj/effect/floor_decal/corner/purple/bordercorner{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cUi" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
@@ -7850,7 +7850,7 @@
"cUX" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen)
"cUY" = (/obj/machinery/gibber,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen)
"cUZ" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/southright{name = "Kitchen Delivery"; req_access = list(28)},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen)
-"cVa" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/west{location = "Kitchen"},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen)
+"cVa" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/medbay)
"cVb" = (/obj/effect/wingrille_spawn/reinforced,/obj/structure/sign/warning/airlock{pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/medbay)
"cVc" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plating,/area/maintenance/medbay)
"cVd" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "aft_starboard_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = -26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/medbay)
@@ -7887,7 +7887,7 @@
"cVI" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/barrestroom)
"cVJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/barrestroom)
"cVK" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/barrestroom)
-"cVL" = (/obj/item/weapon/book/manual/barman_recipes,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/item/weapon/screwdriver,/obj/item/weapon/flame/lighter/zippo,/obj/structure/table/marble,/obj/machinery/camera/network/civilian{c_tag = "CIV - Bar Fore"; dir = 4},/turf/simulated/floor/lino,/area/crew_quarters/bar)
+"cVL" = (/obj/item/weapon/book/manual/barman_recipes,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/item/weapon/tool/screwdriver,/obj/item/weapon/flame/lighter/zippo,/obj/structure/table/marble,/obj/machinery/camera/network/civilian{c_tag = "CIV - Bar Fore"; dir = 4},/turf/simulated/floor/lino,/area/crew_quarters/bar)
"cVM" = (/obj/effect/landmark/start{name = "Bartender"},/turf/simulated/floor/lino,/area/crew_quarters/bar)
"cVN" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/lino,/area/crew_quarters/bar)
"cVO" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/lino,/area/crew_quarters/bar)
@@ -7900,7 +7900,7 @@
"cVV" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/green/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
"cVW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/monotile,/area/hallway/primary/seconddeck/aft)
"cVX" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/green/bordercorner,/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
-"cVY" = (/obj/structure/table/marble,/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/food/condiment/small/sugar,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/button/remote/blast_door{id = "coffeeshop"; name = "Cafe Shutters"; pixel_x = 0; pixel_y = -26},/obj/item/device/retail_scanner/civilian{ icon_state = "retail_idle"; dir = 1},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
+"cVY" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/west{location = "Kitchen"},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen)
"cVZ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
"cWa" = (/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
"cWb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
@@ -7963,7 +7963,7 @@
"cXg" = (/obj/machinery/ai_status_display,/turf/simulated/wall,/area/crew_quarters/bar)
"cXh" = (/obj/structure/disposalpipe/segment,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/green/border{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
"cXi" = (/obj/structure/extinguisher_cabinet{pixel_x = 28; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
-"cXj" = (/obj/structure/table/marble,/obj/machinery/cash_register/civilian{ icon_state = "register_idle"; dir = 1},/obj/machinery/door/blast/shutters{dir = 2; id = "coffeeshop"; layer = 3.1; name = "Cafe Shutters"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
+"cXj" = (/obj/structure/table/marble,/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/food/condiment/small/sugar,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/button/remote/blast_door{id = "coffeeshop"; name = "Cafe Shutters"; pixel_x = 0; pixel_y = -26},/obj/item/device/retail_scanner/civilian{icon_state = "retail_idle"; dir = 1},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
"cXk" = (/obj/structure/table/marble,/obj/machinery/door/blast/shutters{dir = 2; id = "coffeeshop"; layer = 3.1; name = "Cafe Shutters"},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
"cXl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/window/southright{name = "Coffee Shop"; req_one_access = list(25,28)},/obj/machinery/door/blast/shutters{dir = 2; id = "coffeeshop"; layer = 3.1; name = "Cafe Shutters"},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
"cXm" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/crew_quarters/coffee_shop)
@@ -8201,9 +8201,9 @@
"dbK" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
"dbL" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass,/turf/simulated/floor/tiled/steel_grid,/area/crew_quarters/cafeteria)
"dbM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
-"dbN" = (/obj/structure/bed/chair/wood,/obj/effect/floor_decal/corner/yellow/full{ icon_state = "corner_white_full"; dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
+"dbN" = (/obj/structure/table/marble,/obj/machinery/cash_register/civilian{icon_state = "register_idle"; dir = 1},/obj/machinery/door/blast/shutters{dir = 2; id = "coffeeshop"; layer = 3.1; name = "Cafe Shutters"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
"dbO" = (/obj/structure/bed/chair/wood,/obj/effect/floor_decal/corner/yellow/full{dir = 1},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
-"dbP" = (/obj/structure/bed/chair/wood,/obj/effect/floor_decal/corner/yellow/full{ icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
+"dbP" = (/obj/structure/bed/chair/wood,/obj/effect/floor_decal/corner/yellow/full{icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
"dbQ" = (/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/brown/border{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
"dbR" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/door/blast/shutters{dir = 8; id = "kitchen"; layer = 3.3; name = "Kitchen Shutters"},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"dbS" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/weapon/reagent_containers/food/snacks/mint,/obj/item/weapon/packageWrap,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
@@ -8295,7 +8295,7 @@
"ddA" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/cafeteria)
"ddB" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/brown/border{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
"ddC" = (/obj/structure/bed/chair/wood{dir = 1},/obj/effect/floor_decal/corner/yellow/full,/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
-"ddD" = (/obj/structure/bed/chair/wood{dir = 1},/obj/effect/floor_decal/corner/yellow/full{ icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
+"ddD" = (/obj/structure/bed/chair/wood,/obj/effect/floor_decal/corner/yellow/full{icon_state = "corner_white_full"; dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
"ddE" = (/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/brown/border{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
"ddF" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"ddG" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
@@ -8354,7 +8354,7 @@
"deH" = (/obj/structure/table/marble,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"deI" = (/obj/machinery/cooker/cereal,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"deJ" = (/obj/machinery/cooker/candy,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
-"deK" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/item/weapon/crowbar,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance,/obj/random/maintenance,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/plating,/area/maintenance/chapel)
+"deK" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/item/weapon/tool/crowbar,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance,/obj/random/maintenance,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/plating,/area/maintenance/chapel)
"deL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/chapel)
"deM" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/light{dir = 8},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/holodeck_control)
"deN" = (/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/holodeck_control)
@@ -8397,7 +8397,7 @@
"dfy" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/camera/network/civilian{c_tag = "CIV - Hydroponics Starboard"; dir = 2},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lime/border{dir = 1},/turf/simulated/floor/tiled/hydro,/area/hydroponics)
"dfz" = (/obj/machinery/smartfridge/drying_rack,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lime/border{dir = 1},/turf/simulated/floor/tiled/hydro,/area/hydroponics)
"dfA" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/southright{name = "Hydroponics Delivery"; req_access = list(35)},/turf/simulated/floor/tiled,/area/hydroponics)
-"dfB" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/west{location = "Hydroponics"},/turf/simulated/floor/tiled,/area/hydroponics)
+"dfB" = (/obj/structure/bed/chair/wood{dir = 1},/obj/effect/floor_decal/corner/yellow/full{icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
"dfC" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/camera/network/civilian{c_tag = "CIV - Holodeck Starboard"; dir = 8},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/holodeck_control)
"dfD" = (/obj/machinery/computer/HolodeckControl,/turf/simulated/floor/tiled,/area/holodeck_control)
"dfE" = (/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/holodeck_control)
@@ -8470,7 +8470,7 @@
"dgT" = (/obj/machinery/vending/hydronutrients,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lime/border,/turf/simulated/floor/tiled/hydro,/area/hydroponics)
"dgU" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lime/border,/turf/simulated/floor/tiled/hydro,/area/hydroponics)
"dgV" = (/obj/structure/closet/secure_closet/hydroponics,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lime/border,/turf/simulated/floor/tiled/hydro,/area/hydroponics)
-"dgW" = (/obj/structure/closet/crate/hydroponics{desc = "All you need to start your own honey farm."; name = "beekeeping crate"},/obj/item/beehive_assembly,/obj/item/bee_smoker,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/bee_pack,/obj/item/weapon/crowbar,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lime/border,/turf/simulated/floor/tiled/hydro,/area/hydroponics)
+"dgW" = (/obj/structure/closet/crate/hydroponics{desc = "All you need to start your own honey farm."; name = "beekeeping crate"},/obj/item/beehive_assembly,/obj/item/bee_smoker,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/bee_pack,/obj/item/weapon/tool/crowbar,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lime/border,/turf/simulated/floor/tiled/hydro,/area/hydroponics)
"dgX" = (/obj/structure/table/rack,/obj/item/weapon/flame/lighter/random,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/chapel)
"dgY" = (/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/holodeck_control)
"dgZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/holodeck_control)
@@ -8523,12 +8523,12 @@
"dhU" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
"dhV" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/monotile,/area/hallway/primary/seconddeck/aft)
"dhW" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/green/bordercorner,/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
-"dhX" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"dhY" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"dhX" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/west{location = "Hydroponics"},/turf/simulated/floor/tiled,/area/hydroponics)
+"dhY" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"dhZ" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/candle_box,/turf/simulated/floor/carpet,/area/chapel/main)
"dia" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/chapel/main)
-"dib" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 1},/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"dic" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"dib" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"dic" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 1},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"did" = (/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/lino,/area/chapel/office)
"die" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/lino,/area/chapel/office)
"dif" = (/obj/structure/table/wooden_reinforced,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen/blue{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/lino,/area/chapel/office)
@@ -8551,9 +8551,9 @@
"diw" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
"dix" = (/turf/simulated/wall,/area/chapel/main)
"diy" = (/obj/structure/extinguisher_cabinet{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"diz" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"diz" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"diA" = (/obj/effect/floor_decal/chapel,/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"diB" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 8},/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"diB" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"diC" = (/obj/effect/floor_decal/chapel,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"diD" = (/obj/machinery/door/firedoor,/obj/effect/wingrille_spawn/reinforced/polarized{id = "chapel"},/turf/simulated/floor/plating,/area/chapel/office)
"diE" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/camera/network/civilian{c_tag = "CIV - Chapel Office"; dir = 4},/turf/simulated/floor/lino,/area/chapel/office)
@@ -8621,10 +8621,10 @@
"djO" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/extinguisher_cabinet{pixel_y = -30},/turf/simulated/floor/wood,/area/library)
"djP" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass{name = "Library"},/turf/simulated/floor/tiled/steel_grid,/area/library)
"djQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
-"djR" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/table/bench/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"djR" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 8},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"djS" = (/obj/effect/floor_decal/chapel,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/bench/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"djT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/chapel/main)
-"djU" = (/obj/effect/floor_decal/chapel{ icon_state = "chapel"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/bench/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
+"djU" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/table/bench/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"djV" = (/obj/effect/floor_decal/chapel,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/table/bench/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"djW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/bench/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"djX" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main)
@@ -8793,7 +8793,7 @@
"dne" = (/obj/structure/closet,/obj/item/weapon/lipstick/purple,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/locker)
"dnf" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/maintenance/locker)
"dng" = (/turf/simulated/shuttle/wall/no_join,/area/shuttle/cryo/station)
-"dnh" = (/obj/structure/cryofeed{dir = 2},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/industrial/warning/cee{ icon_state = "warningcee"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/cryo/station)
+"dnh" = (/obj/effect/floor_decal/chapel{icon_state = "chapel"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/bench/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"dni" = (/turf/simulated/shuttle/wall/hard_corner,/area/shuttle/cryo/station)
"dnj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway2)
"dnk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway2)
@@ -8814,7 +8814,7 @@
"dnz" = (/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/green/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
"dnA" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
"dnB" = (/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/green/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
-"dnC" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
+"dnC" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/station_map{dir = 4; pixel_x = -32},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/aft)
"dnD" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/seconddeck/locker/locker_toilet)
"dnE" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/seconddeck/locker/locker_toilet)
"dnF" = (/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/seconddeck/locker/locker_toilet)
@@ -9000,7 +9000,7 @@
"drd" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/locker)
"dre" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/locker)
"drf" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/locker)
-"drg" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{ icon_state = "burst_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/cryo/station)
+"drg" = (/obj/structure/cryofeed{dir = 2},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/cryo/station)
"drh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/green/border{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway2)
"dri" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway2)
"drj" = (/obj/structure/bed/chair,/obj/machinery/camera/network/second_deck{c_tag = "Second Deck - Civilian Hallway Two"; dir = 8},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/docking_hallway2)
@@ -9046,7 +9046,7 @@
"drX" = (/obj/machinery/lapvend,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary)
"drY" = (/obj/machinery/computer/security,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/checkpoint2)
"drZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/checkpoint2)
-"dsa" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/crowbar,/obj/item/weapon/pen,/obj/item/device/flash,/obj/machinery/camera/network/security{c_tag = "SEC - Arrival Checkpoint"; dir = 8},/obj/machinery/light{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/checkpoint2)
+"dsa" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/tool/crowbar,/obj/item/weapon/pen,/obj/item/device/flash,/obj/machinery/camera/network/security{c_tag = "SEC - Arrival Checkpoint"; dir = 8},/obj/machinery/light{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/checkpoint2)
"dsb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
"dsc" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/seconddeck/locker)
"dsd" = (/obj/structure/closet/wardrobe/mixed,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/crew_quarters/seconddeck/locker)
@@ -9320,7 +9320,7 @@
"dxl" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_north_starboard_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dxm" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "arrivals_dock_north_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dxn" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
-"dxo" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_north_airlock"; master_tag = "arrivals_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_north_mech"; tag_airpump = "arrivals_dock_north_pump"; tag_chamber_sensor = "arrivals_dock_north_sensor"; tag_exterior_door = "arrivals_dock_north_outer"; tag_interior_door = "arrivals_dock_north_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_mech"},/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dxo" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/cryo/station)
"dxp" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_north_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dxq" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
"dxr" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "dock3_north_outer"; locked = 1; name = "External Airlock Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
@@ -9421,7 +9421,7 @@
"dzi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled/monotile,/area/hallway/secondary/entry/D2)
"dzj" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dzk" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
-"dzl" = (/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dzl" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_north_airlock"; master_tag = "arrivals_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_north_mech"; tag_airpump = "arrivals_dock_north_pump"; tag_chamber_sensor = "arrivals_dock_north_sensor"; tag_exterior_door = "arrivals_dock_north_outer"; tag_interior_door = "arrivals_dock_north_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_mech"},/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dzm" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "arrivals_dock_south_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_south_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dzn" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "arrivals_dock_south_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
"dzo" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "dock3_south_outer"; locked = 1; name = "External Airlock Access"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "dock3_south_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
@@ -9439,7 +9439,7 @@
"dzA" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_south_starboard_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dzB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/turf/simulated/floor/tiled/monotile,/area/hallway/secondary/entry/D2)
"dzC" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "arrivals_dock_south_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dzD" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
+"dzD" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dzE" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_south_airlock"; master_tag = "arrivals_dock"; pixel_y = -30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_south_mech"; tag_airpump = "arrivals_dock_south_pump"; tag_chamber_sensor = "arrivals_dock_south_sensor"; tag_exterior_door = "arrivals_dock_south_outer"; tag_interior_door = "arrivals_dock_south_inner"; tag_shuttle_mech_sensor = "arrivals_dock_south_mech"},/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dzF" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_south_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dzG" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
@@ -9607,7 +9607,7 @@
"dCM" = (/obj/machinery/porta_turret/ai_defense,/obj/effect/floor_decal/industrial/outline/grey,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/ai)
"dCN" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled/techfloor,/area/ai)
"dCO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/greengrid,/area/ai)
-"dCP" = (/obj/effect/floor_decal/industrial/warning/cee{ icon_state = "warningcee"; dir = 1},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/ai)
+"dCP" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
"dCQ" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/techfloor,/area/ai)
"dCR" = (/obj/machinery/porta_turret/ai_defense,/obj/effect/floor_decal/industrial/outline/grey,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled/techfloor,/area/ai)
"dCS" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/thirddeck/forestarboard)
@@ -9894,8 +9894,8 @@
"dIn" = (/obj/machinery/ai_status_display,/turf/simulated/wall/r_wall,/area/hallway/primary/thirddeck/starboard)
"dIo" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/starboard)
"dIp" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/starboard)
-"dIq" = (/obj/machinery/firealarm{pixel_y = 24},/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/starboard)
-"dIr" = (/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/hallway/primary/thirddeck/starboard)
+"dIq" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 1},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/ai)
+"dIr" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/hallway/primary/thirddeck/starboard)
"dIs" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"},/turf/simulated/wall/r_wall,/area/hallway/primary/thirddeck/starboard)
"dIt" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/turf/simulated/wall/r_wall,/area/hallway/primary/thirddeck/starboard)
"dIu" = (/turf/simulated/wall/r_wall,/area/hallway/primary/thirddeck/starboard)
@@ -10004,8 +10004,8 @@
"dKt" = (/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/blue/bordercorner,/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/starboard)
"dKu" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/starboard)
"dKv" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/monotile,/area/hallway/primary/thirddeck/starboard)
-"dKw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/starboard)
-"dKx" = (/obj/structure/sign/deck/third,/obj/machinery/atmospherics/pipe/simple/hidden{ icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/hallway/primary/thirddeck/starboard)
+"dKw" = (/obj/machinery/firealarm{pixel_y = 24},/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/starboard)
+"dKx" = (/obj/structure/sign/deck/third,/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/hallway/primary/thirddeck/starboard)
"dKy" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/wall/r_wall,/area/hallway/primary/thirddeck/starboard)
"dKz" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/wall/r_wall,/area/hallway/primary/thirddeck/starboard)
"dKA" = (/turf/simulated/shuttle/wall,/area/shuttle/escape_pod7/station)
@@ -10144,7 +10144,7 @@
"dNd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central)
"dNe" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central)
"dNf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central)
-"dNg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central)
+"dNg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/station_map{dir = 1; pixel_y = -32},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/fpcenter)
"dNh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central)
"dNi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central)
"dNj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central)
@@ -10237,7 +10237,7 @@
"dOS" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/heads/sc/sd)
"dOT" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/window/northright,/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/heads/sc/sd)
"dOU" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftstarboard)
-"dOV" = (/obj/structure/closet/crate,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/item/weapon/crowbar,/obj/item/weapon/wirecutters,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/maintenance/thirddeck/aftstarboard)
+"dOV" = (/obj/structure/closet/crate,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/wirecutters,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/maintenance/thirddeck/aftstarboard)
"dOW" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftstarboard)
"dOX" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftport)
"dOY" = (/obj/structure/table/steel,/obj/random/tech_supply,/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftport)
@@ -10576,6 +10576,12 @@
"dVt" = (/obj/random/plushielarge,/turf/simulated/floor/plating,/area/maintenance/locker)
"dVu" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/structure/table/rack{dir = 1},/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/thirddeck/foreport)
"dVv" = (/obj/structure/table/rack,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftstarboard)
+"dVw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/starboard)
+"dVx" = (/obj/machinery/station_map{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/port)
+"dVy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/paleblue/border,/obj/machinery/station_map{dir = 1; pixel_y = -32},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/starboard)
+"dVz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/station_map{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/apcenter)
+"dVA" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/obj/machinery/station_map{dir = 8; pixel_x = 32},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
+"dVB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/station_map{dir = 1; pixel_y = -32},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10706,7 +10712,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaakLasPapkakLasQasQasQasQasQarTasRasSasTasUasVasWasXasYapuasZapuapuapuapuataatbatcatdapCapCapCapCateadlarUarUadlatfarUatgathatiatjatkatlatmatmatnatmatmaurauraurauratoatoatoatoatoatpatqatratsattatuatvatwatpatxatyatzatAatBatCatDatEadFatDatDatDatDaqgaqgaqgaqgatFatGatHatIaqmaqmaqmaqmatJaqmatKatLatMatNatOatDatPatQatRatSatSatSatSatSalralOalOalraaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaafaaaaaaaaaatTatUapkakLasQasQasQasQasQatVatWatXatYatZauaaubaucaudatZaueaucaufatWaugauhauiaujaukaukaukaulaumaunauoaupauqauzausautauuaukauvauwauxauyauBauDauCauFauEavLauGavMauratoatoatoatoatoatpauIauJauKattauLauMauNatpauOauPauQauRauSauTauUauVauWauXauYauZavaavbauRavcauSauSavdasFauRaveavfavgavaavhauRaviavaavjavkauRavlavmauSavnatSatSatSatSatSalravoalOavpaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafatTapkavqakLasQasQasQasQasQavravsavtavuavuavvavwavwavxavyavzavwavAavwavwavBavCavDavwavwavyavwavwavAavwavEavFavGavHavwavIavwavwavJavKavwavNavPavOavRavQawOavSawQauratoatoatoatoatoatpavTavUavVavWavXavYavZatpawaawbawcawdawdaweawdawfawgawhawiawjawkawlawlawmawlawlawnawoawlawlawmawpawlawqawlawrawlawlawsawtawtawuawvawwatSatSatSatSatSalrawxalOavpaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaafaaaaaaaaaatTapkawyakLasQasQasQasQasQawzawAawBawCawDawEawFawGawHawIawJawKawAawAawLawMatbawNawAawAawPawAawRawAawSawTawUawVawWawXawYawZaxaaxbaxcauyaxdauDaxeaxgaxfaxiaxhaxjauratoatoatoatoatoatpaxkaxlaxmattavZaxnaxoatpaxpaxqaxrasGaxsaxtaxuaxvaxwauXaxxaxyaxzaxAaxBaxsaxDaxsaxEasFasGaxFaxsaxGaxHaxIasGaxJaxzaxKaxLasGaxMaxNaxsaxOatSatSatSatSatSalraxPalOavpaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaafaaaaaaaaaatTapkawyakLasQasQasQasQasQawzawAawBawCawDawEawFawGawHawIawJawKaxGawAawLawMatbawNawAawAawPawAawRawAawSawTawUawVawWawXawYawZaxaaxbaxcauyaxdauDaxeaxgaxfaxiaxhaxjauratoatoatoatoatoatpaxkaxlaxmattavZaxnaxoatpaxpaxqaxrasGaxsaxtaxuaxvaxwauXaxxaxyaxzaxAaxBaxsaxDaxsaxEasFasGaxFaxsaUiaxHaxIasGaxJaxzaxKaxLasGaxMaxNaxsaxOatSatSatSatSatSalraxPalOavpaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaakLapkapkakLaxQasQasQasQasQarTaxRaxSarUaxTaxUaxVaxWaxXaxVaxYaxVaxVaxVaxVaxZatbayaarUarUarUarUarUarUarUarUarUaybaycarUaydayeayfaygayhayiaxCatmatnayjatmatmatmatmauraynatoatoatoatoatpayoaypayqattatuazvatuatpayraysaytayuatPayvatDaywayxatDatDatDatDayyayyayyayyayzayAayBayCayDayDayDayDayEayDayFayGayHayIayJayKatPayLatRayMatSatSatSatSalrayNalOalraaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaakLayOapkakLakLakLakLakLakLarTarUarUarUayPapkaxVayQayRaySayTayUayRayVaxVayWayXayYaybayZazaazbazcazcazdazeazfazgazhaybasoasoaziazjazkazlaykazmaznazoazpaykaylaymauHauHazsaztazuauHatpatpatpatpatpatpaAlatpatpazwazxazyazzasyasyayxazAazBazCazDazEazFayyazGazHazIayyazJasFazKayDazLazMayDazNazOazPayDazQazRazSazTazTazTazUalralralralralralrarRalOalraaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaakLakLapkapkapkapkaqDaqDaqDaqDaqDazVazWazWazXaxVayQayRayRazYayRayRayVaxVazZaAaaAaaAbazbazbaAcaAcaAcaAcaAcaAcaAcaAdaybaaaaaaaAeaAfaAgaAhauAazrazqaAjaAiauAaAnaAoaApaAkaAraAsaAtaAuaAvaAwaAxaAyaAzaAAaABaACaAzaADaAEaAFaAGaaaaaaayxaAHazBaAIaAIaAIaAIaAJaAKaALaAMaANaAOaAPaAPayDaAQaARaASazNaATaAUayDaAVaAWaAXaAYaAZaBaaBbaBcaBdaBdaBearRarRarRalralraaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10725,7 +10731,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaCsaEEaFOaFQaFQaFQaFQaFQaFQaFQaIHaIIaIIaIIaFTaLdaKJaKJaKJaKJaKJaKpaLeaLfaLgaKqaLhaAcaAcaAcaLiazhaLjaLkaLlaLmaKtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKQaLnaLoaLpaLqaLraKQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKyaLsaLtaLuaLvaElaLwaDjaJraLxaGxaGyaGyaHkaLyaJwaJwaJwaLzaHkaGyaGyaGBaLxaJyaDjaDkaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaCsaLAaFOaFQaFQaFQaFQaFQaFQaFQaFRaEPaEPaEPaLBaLCaKJaKJaKJaKJaKJaKpaLDaLEaLFaKqaAcaAcaAcaLGaybaLHaKsaLIaLlaLJaKtaaaaaaaaaaaaaLKaLLaLMaLLaLNaaaaaaaLOaLOaLPaJUaLQaLRaLRaLRaLRaLRaLRaLSaLSaLSaLRaLRaLRaLRaKyaLTaLtaLUaKzaElaDkaDjaDjaLVaLWaGyaGyaKhaLXaLXaJwaLXaLXaKhaGyaGyaGBaLYaDjaDjaDjaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaCsaEEaFOaFQaFQaFQaFQaFQaFQaFQaFRaLZaEPaEPaFTaMaaKJaKJaKJaKJaKJaKpaKqaMbaKqaKqaMcaMdaMeaMfaMfaMgaKsaMhaLlaMiaKtaaaaaaaaaaaaaMjaMkaMlaMmaMjaaaaaaaaaaLOaMnaJUaMoaMpaMqaMraMsaMtaLSaMuaMvaMwaMxaMyaMzaLRaMAaMBaLtaLuaKzaMCaDjaDjaMDaMEaLWaGyaGyaHOaMFaKhaMGaKhaHlaHOaGyaGyaGBaMHaMIaDjaDkaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaCsaEEaFOaFPaFQaFQaFQaFQaFQaFPaFRaMJaMKaMLaMMaCsaMNaKJaKJaKJaKJaMfaDOaDOaDOaybaybaybaybaMfaMOaLHaKsaKsaMPaKsaKtaMQaMQaMQaMRaMjaMSaMTaMUaMjaMVaMQaMQaMQaMWaMXaMWaLRaMqaMYaMZaNaaNbaNcaNdaNeaNfaNgaMzaLRaKzaKzaNhaKzaKzaNiaDkaDjaNjaNkaLWaGyaGyaKhaNlaNmaJwaNmaNnaKhaGyaGyaGBaNkaJyaDjaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaCsaEEaFOaFPaFQaFQaFQaFQaFQaFPaFRaMJaMKaMLaMMaCsaMNaKJaKJaKJaKJaMfaDOaDOaDOaybaybaybaybaMfaMOaLHaKsaKsaMPaKsaKtaMQaMQaMQaMRaMjaMSaMTaMUaMjaMVaMQaMQaMQaMWaMXaMWaLRaMqaMYaMZaNbaNaaNdaNcaNfaNeaNgaMzaLRaKzaKzaNhaKzaKzaNiaDkaDjaNjaNkaLWaGyaGyaKhaNlaNmaJwaNmaNnaKhaGyaGyaGBaNkaJyaDjaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaCsaNoaNpaNqaNraNraNsaNtaNtaNuaNvaNwaCtaCtaCtaCsaMfaMfaMfaMfaMfaMfaNxaNxaNxaNyaNzaybaNAaNBaAcaNCaNDaNEaNFaNGaNHaMQaNIaNJaNKaNLaNMaNNaNMaNLaNOaNPaNQaMQaNRaNSaNRaLRaNTaNUaNVaNWaNXaNYaNZaOaaObaOcaMzaLRaOdaOeaOfaOgaOhaOiaAIaOjaOkaNkaGxaGyaGyaHOaHUaOlaOmaOnaHUaHOaGyaGyaGBaNkaJyaDjaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaCsaCsaOoaOpaOqaOqaOraOqaOqaOsaOtaOuaCuaDOaOvaAcaAcaAcaOwaAcaAcaAcaAcaAcaOxaAcaAcaOyaAcaAcaAcaAcaAcaAcaAcaLHaOzaMQaOAaOAaOBaOCaODaOEaOFaOGaOHaOAaOIaMQaIpaOJaOKaLRaOLaOMaONaOOaOPaOQaORaOSaOTaOUaOVaLRaOWaOXaOYaOZaPaaPbaAIaDjaPcaNkaGxaGyaGyaGyaHOaPdaPeaPfaHOaGyaGyaGyaGBaNkaJyaDjaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaCsaCsaCOaDRaCOaCsaCOaDRaCOaCsaCsaCsaDOaOvaMfaFcaFcaFcaFcaFcaMfaPgaPhaMfaMfaMfaMfaMfaMfaMfaFcaFcaAcaAcazhaPiaMQaPjaOAaPkaPlaPlaPmaPnaPnaPoaOAaPpaMQaPqaPraPsaLRaPtaPuaPvaPwaPxaPyaPzaPAaPBaPCaPDaLRaPEaPFaPGaPHaFuaFuaPIaDjaDjaNkaPJaPKaPKaPKaPKaPKaPKaPKaPKaPKaPKaPKaPLaPMaDjaDjaafaafaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10740,7 +10746,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSRaRyaRyaRyaRyaRyaRyaSSaSTaRyaSUaSVaSWaSXaSYaSZaTaaTbaTcaTdaTeaTfaTgaREaThaTiaREaREaREaREaREaREaTjaaaaaaaaaaTkaaaaaaaaaaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTlaTlaTmaTlaTnaRMaToaTpaTqaTraTbaTbaTbaTsaTbaTtaTuaTvaTwaTxaTyaTzaTAaTBaTCaSaaTDaTEaTFaTEaTEaSeaaaaaaaaaaTkaaaaaaaaaaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTGaTHaTIaTJaTKaTLaTMaTNaRyaTOaTPaTQaTRaRnaTSaTTaTUaTcaTdaTVaTWaTXaREaTYaTZaUaaUbaUcaUdaUeaUfaSeaaaaaaaaaaTkaaaaaaaaaaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTlaTlaTmaTlaTnaRMaUgaUhaRyaUiaKRaUjaUkaUlaUmaUnaUmaUoaUkaUpaUqaUraREaUsaUtaSaaTDaTEaTFaTEaTEaSeaaaaaaaaaaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTlaTlaTmaTlaTnaRMaUgaUhaRydnCaKRaUjaUkaUlaUmaUnaUmaUoaUkaUpaUqaUraREaUsaUtaSaaTDaTEaTFaTEaTEaSeaaaaaaaaaaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUuaUvaUvaUvaUvaUvaRyaUwaUwaRMaUxaUkaUkaUkaUyaUzaUAaUzaUBaUkaUCaUCaUCaREaUDaUEaREaUvaUvaUvaUvaUvaUuaaaaTkaTkaTkaTkaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUFaUGaUHaUFaUIaUJaUKaULaUMaUNaUOaUPaUQaURaUSaUTaUUaUVaUWaUXaUYaULaUYaUZaUMaVaaVbaVcaVdaUFaVeaVfaUFaTkaTkaTkaTkaTkaTkaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVgaVhaViaVjaVkaVlaVmaVnaVoaVpaVqaVraVraVraVraVsaVtaVuaVraVraVraVraVvaVwaVxaVyaVmaVlaVzaVAaVBaVCaVDaTkaTkaTkaTkaTkaTkaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10927,100 +10933,100 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaaaaaabgvbibbicbgvbidbiebgvbifbigbgvbgwbgvbihbiibgvaaaaaaaaaaaaaadaadaaaaaaaaaaadaaaaaaaaabgxbijbikbilbgybimbinbcRbiobipbcRbiqbirbisbitbiubivbiwbixbiybizbiAbiBbiCbiDbiEbiFbiGbiHbiIbiJbiKbiLbiKbiKbiMbiKbiNbiObiPbiQbiRbiSbiTbiUbiVbiWbiXbiYbiZaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaafaaaaaaaabaaaaaaaaabgvbjabjbbgvbjabjbbgvbjcbjdbgvbgwbgvbjabjebgvaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaabgxbjfbjgbjhbgybjibjjbcRbjkbjlbcRbjmbjnbjmbjmbjobjpbjqbjmbjrbjsbjtbjubjvbjwbjxbjubjybjsbjzbjAbjBbjCbfgbjDbjEbjFbjGbjHbjIbjJbjKbjLbjMbjNbjObjPbjQbjRbjSaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhbjTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaabjUbgwaaabjUbgwaaabjVbjVaaabgwaaabjUbjWaaaaaaaaaaaaaaaaaaaafbfGaaaaaaaaaaaaaaaaaabgxbjXbjgbjYbgxbcNbcNbcNbcNbcRbcRbjZbkabkbbkcbkdbkebkfbkgbjrbkhbkibkjbkkbklbkmbknbkobkpbkqbkrbksbktbkubkqbkvbkvbkvbkvbkvbkvbkvbkvbkwbkxbkybkybkybEBbkyaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaafaaaaaaaaaaaaaaabkAbkBbkCbkDbkEbkCbkFbkGbkHbkIbkJbkFbkGbkKbkLbkMbkAbkAaaaaaaaaaaaaaadaaaaaaaadaaaaaaaaabgxbgxbkNbgxbgxbkObkPbkQbjrbkRbkSbkTbkUbkVbkWbkXbkYbkZblablbblcbldbleblfblgblhblibljblkbllblmblnbloblpblqbkvblrblsbltblublvblwbkvblxblybkyblzblAblBbkyaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbhgaafaafaafaafaaaaaaaaaaafaafaafaafbhhaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaafaaaaaaaaaaaaaaabkAbkCbkEbkDbkBbkEbkFbkGbkHbkIbkJbkFbkGbkKbkLbkMbkAbkAaaaaaaaaaaaaaadaaaaaaaadaaaaaaaaabgxbgxbkNbgxbgxbkObkPbkQbjrbkRbkSbkTbkUbkVbkWbkXbkYbkZblablbblcbldbleblfblgblhblibljblkbllblmblnbloblpblqbkvblrblsbltblublvblwbkvblxblybkyblzblAblBbkyaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbhgaafaafaafaafaaaaaaaaaaafaafaafaafbhhaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaafaaaaaaaaaaaabkAblCblDblEblFblGblHblIblJblKblLblMblNblOblPblQblRblSblTbkAaafaafaafaadaafabcaadaafaafaafblUblVblVblVblWblXblYblZbjrbmabmbbmcbmdbmebkZbmfbmgbmhbmibmjbmkbldbmlbmmbmnbmoblcbljbmpbmqbmrbmsbmtbmubmvbkvbmwbmxbmybmzbmAbmBbmCbmDbmEbmFbmGbmHbmIbkyaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmJbhgbmJaaaaaaaafaaaaaaaaaaafaaaaaabmJbhhbmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaafaaaaaaaaaaaabkAbmKbmLbmMbmNbmLbmObmPbmQbmRbmLbmSbmNbmTbmMbmUbmLbmVbmWbkAaaaaaaaaaaafaaaaaaaaaaaaaaaaaablUbmXbmYbmZblWblWbnablWbjrbnbbncbndbnebnfbngbnhbnibnjbnkbnlbnmbnnbnobnpbnqbnrbnobnsblkbntbnubnvbnwbnxbnybkvbnzbnAbmAbnBbmAbnCbmCbnDbnEbkybkybkybkybkyaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbhgaafaafaafaafaaaaaaaaaaafaafaafaafbhhaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaafbgvbgvbgvbgvaaabkGbnFbnGbmObmPbnHbnIbnJbnKbnLbnMbnNbnObnPbnQbnRbmQbnSbnTbkGaaaaaaaaaaafaaaaaaaaaaaaaaaaaablUblUbnUbnVbnWbnXbnYblVbjrbnZboabmbbobbocbkZbodbmfboebofbjrbogbohboibojbokbolbombonboobkqbopboqborbosbotbkvboubovbowboxbmyboybmCbozboAboBboCboDboEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaabgvboFboGboHboIboJboKboLboMboNboLboOboPboQboOboRboSboTboUbmMbmUboVboWboXbkGaaaaaaaaaaafaaaaaaaaaaabaaaaaaaaaboYboZbpablYbpbbnYblVbpcbpdbpebpfbpgbphbkZbpibkZbpjbpkbjrbjubjubjubplbpmbpnbjubpobjubkqbppbpqbprbpsbptbkvbpubpvbmAbpwbmxbpxbmCbpybpzbpAbpBbpCboEaaaaaaaaaaabaagaaaaaaaaaaaaaaaaafabcaadaadaadaadaadaagaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaabgvboFboGboJboKboHboIboLboMboNboLboQboPboOboQboRboSboTboUbmMbmUboVboWboXbkGaaaaaaaaaaafaaaaaaaaaaabaaaaaaaaaboYboZbpablYbpbbnYblVbpcbpdbpebpfbpgbphbkZbpibkZbpjbpkbjrbjubjubjubplbpmbpnbjubpobjubkqbppbpqbprbpsbptbkvbpubpvbmAbpwbmxbpxbmCbpybpzbpAbpBbpCboEaaaaaaaaaaabaagaaaaaaaaaaaaaaaaafabcaadaadaadaadaadaagaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaabgvbpDbpEbpFbpGbpHbpIbpJbpKbmPbpLbpMbpMbpNbnHbpObpPbmPbpQbpRbpSbpTbpUbpVbpWbpWbpWbpWbpWaaaaaaaaaaaaaaaaaaaaaboYboZbpXbpYbpZbqablVbjrbqbbqcbqdbqebqfbqgbqhbqibqjbqkbjrbqlbjubqmbqnbqobqpbqmbqqbjubqrbkqbkqbkqbkqbkqbkvbqsbqtbqubqvbqwbqxbmCbqybqzbqAbqBbqBboEaaaaaaaaaaaaaadaaaaaaaaaaaaaafaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadKaafaafaafaafbgvbgvbgvbgvaaabqCbqDbqEbmMbmNbqFbqGbqHbqIbqJbqKbqLbqMbqJbqNbpTbmTbqObqPbpWbqQbqRbqSbpWbqTbqUbqUaaaaaabqVblUbqWbqXbqYbqZbrabrbbrbbrbbrbbrbbrbbrcbrbbrbbrbbrbbrbbrbbrbbrbbrbbrdbrebrfbrfbrgbrhbribribrjbrkbrlbrmbrnbmCbrobrpbrqbrobrobmCbmCbrrbrsbrtbrubrvbrwbrxaafaafaafaadaaaaaaaaaaafaafaaaaaaaafaaaaaaaafaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabgvbrybrzboHboIboJbrAboLbrBbrCboUbrDbmLbmTbmUbmLbrEbnJbrFbnJbrGbrHbrIbrJbrKbrLbrMbrNbrObrPbrQbqUbqUaaabrRbrSbrTbrUbrVbrWbrXbrYbrZbsabsbbscbsdbsebsfbsgbshbsibsjbskbslbsmbsnbsobspbsqbsrbssbsubsvbtPbswbsxbsybszbsAbsBbsCbsDbsEbsFbsGbsHbsIbsJbsKbsLbsMbsNbsObsPaaaaaaaaaabcaadaadaadaagaabaaaaaaaafaaaaaaaafaaaaafaafbsQaafaafaaaaaaaaaaaeaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaabgvbsRbsSbpFbpGbsTbsUbmTbsVbsWbsXbsYbqJbsZbpTbtabtbbtcbtdbtebtfbtgbthbtibtjbtkbtlbtmbtnbtobtpbtqbqUaaabtrbrSbtsbttbtubtvbtwbtxbtybtzbtAbtzbtBbtzbtCbtDbtzbtEbtFbtGbtHbtIbtJbtKbtLbtMbtNbtObtQbtRbuTbtQbtSbtTbtUbtVbtWbtVbtXbtVbtYbtZbuabubbucbudbsLbuebufbsObugaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabuhbuibujbukaaaaafaaabulaaaaafaaaaaaaagaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaabaaaaaabhhaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadKaafaafaafaafbgvbgvbgvbgvaaabqCbqDbqEbmMbmNbqFbqGbqJbqIbqHbqKbqLbqMbqHbqNbpTbmTbqObqPbpWbqQbqRbqSbpWbqTbqUbqUaaaaaabqVblUbqWbqXbqYbqZbrabrbbrbbrbbrbbrbbrbbrcbrbbrbbrbbrbbrbbrbbrbbrbbrbbrdbrebrfbrfbrgbrhbribribrjbrkbrlbrmbrnbmCbrobrpbrqbrobrobmCbmCbrrbrsbrtbrubrvbrwbrxaafaafaafaadaaaaaaaaaaafaafaaaaaaaafaaaaaaaafaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabgvbrybrzboJboKboHbrAboLbrBbrCboUbrDbmLbmTbmUbmLbrEbnJbrFbnJbrGbrHbrIbrJbrKbrLbrMbrNbrObrPbrQbqUbqUaaabrRbrSbrTbrUbrVbrWbrXbrYbrZbsabsbbscbsdbsebsfbsgbshbsibsjbskbslbsmbsnbsobspbsqbsrbssbsubsvbtPbswbsxbsybszbsAbsBbsCbsDbsEbsFbsGbsHbsIbsJbsKbsLbsMbsNbsObsPaaaaaaaaaabcaadaadaadaagaabaaaaaaaafaaaaaaaafaaaaafaafbsQaafaafaaaaaaaaaaaeaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaabgvbsRbsSbpFbpGbsTbsUbmTbsVbsWbsXbsYbqHbsZbpTbtabtbbtcbtdbtebtfbtgbthbtibtjbtkbtlbtmbtnbtobtpbtqbqUaaabtrbrSbtsbttbtubtvbtwbtxbtybtzbtAbtzbtBbtzbtCbtDbtzbtEbtFbtGbtHbtIbtJbtKbtLbtMbtNbtObtQbtRbuTbtSbvkbtTbtUbtVbtWbtVbtXbtVbtYbtZbuabubbucbudbsLbuebufbsObugaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabuhbuibujbukaaaaafaaabulaaaaafaaaaaaaagaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaabaaaaaabhhaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaafbgvbgvbgvbgvaaabqCbumbqEbmMbmNbunbuobupbuqburbsWbusbutbutbutbuubutbutbuvbuwbuwbuwbuwbuwbuxbuybuzbqTbqTblUblUbuAbuBbuCbuDbuEbrbbuFbuGbuHbuGbuIbuJbuGbuKbuLbuHbuKbuMbuNbuObuPbuQbspbuRbuSbuUbuVbvXbvYbuWbuXbuWbuYbuWbuWbuWbuZbvabvbbvabuZbuZbvcbvdbrtbvebvfbrwbrwaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabvgbvhbvhbvgbvgbvgbvibvjaaaaafaaaaaaaafaaaaaaaaaaaaaabbhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaadabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaabgvbvkbvlboHboIbvmbvnboLbrBbvobvpbvqboObvrboOboTbvsbutbvtbvubvvbvwbvxbuvbvybvzbvAbvBbuwbvCbvDbvEbvFbvGbvHbvIbvJbvKblUblUbvLbrbbvMbvNbvObvNbvPbrbbvQbuPbrbbvRbuPbrbbvSbuPbrYbvTbvUbvVbvWbxhbxjbzybxjbuWbwabwbbwcbwdbwebuWbwfbwgbwhbwibwjbuZbwkbvZbvZbwlbwmbwnbvgaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabwobwpbwqbwrbwsbwsbwtbvjbvibviaaaaaaaafaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaabgvbwubwvbpFbpGbwwbwxbwybwzbwAbwBbwCbwBbwDbwBbwEbwFbwGbwHbwIbwJbwKbwLbuvbwMbwNbwObwPbwQbwRbwSbwTbwUbwUbwUbwUbwUbwUbwVbwWbwXbrbbwYbvNbwZbvNbvPbrbbvNbxabrbbvNbxbbrbbvNbxcbrbbxdbxebxfbxgbxhclfclgcnebuWbxkbxlbxmbxnbxobuWbxpbxqbxrbxsbxtbuZbxubxvbvZbxwbxibxxbvgaaaaaaaaaaaaaaabvgbvgbvibvibvibvgbxybxzbxAbxBbxCbxDbxEbxFbxGbvibvgbxHbxHbxIbxIaafaafaafbhgaafaafaafaafbxJbxKbxLbhgbxMbxNbxObxPbxQaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaabgvbvmbvlboJboKbvnbvqboLbrBbvobvpbwvboQbvrboQboTbvsbutbvtbvubvvbvwbvxbuvbvybvzbvAbvBbuwbvCbvDbvEbvFbvGbvHbvIbvJbvKblUblUbvLbrbbvMbvNbvObvNbvPbrbbvQbuPbrbbvRbuPbrbbvSbuPbrYbvTbvUbvVbvWbxhbxjbzybxjbuWbwabwbbwcbwdbwebuWbwfbwgbwhbwibwjbuZbwkbvZbvZbwlbwmbwnbvgaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabwobwpbwqbwrbwsbwsbwtbvjbvibviaaaaaaaafaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaabgvbwubBUbpFbpGbwwbwxbwybwzbwAbwBbwCbwBbwDbwBbwEbwFbwGbwHbwIbwJbwKbwLbuvbwMbwNbwObwPbwQbwRbwSbwTbwUbwUbwUbwUbwUbwUbwVbwWbwXbrbbwYbvNbwZbvNbvPbrbbvNbxabrbbvNbxbbrbbvNbxcbrbbxdbxebxfbxgbxhclfclgcnebuWbxkbxlbxmbxnbxobuWbxpbxqbxrbxsbxtbuZbxubxvbvZbxwbxibxxbvgaaaaaaaaaaaaaaabvgbvgbvibvibvibvgbxybxzbxAbxBbxCbxDbxEbxFbxGbvibvgbxHbxHbxIbxIaafaafaafbhgaafaafaafaafbxJbxKbxLbhgbxMbxNbxObxPbxQaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaafbgvbgvbgvbgvaaabxRbxSbqEbxTbxUbxVbxWbxXbxYbmTbxZbyabwGbybbycbydbyebyfbuvbygbyhbyibyjbuwbvCbykbylbuxbuxbuxbuxbuxbuxbuxbymbynbrbbyobvNbypbyqbvPbrbbyrbysbrbbyrbytbrbbyrbyubrbbyvbywbyxbxgbxhcnfcoUcJZbuWbyybyzbyAbyBbyCbuWbyDbxqbyEbxqbyFbuZbyGbxvbvZbvZbyHbvZbvZbvgbvgbvgbvgbvgbvgbxibyIbyJbyKbyKbyLbyMbyMbyLbyNbyObyPbyQbyRbySbyTbxHbyUbyVbxIbxIaaaaaabhgaaaaaaaaaaafbyWbyXbyYbyZbzabyZbyWbzbbyWaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadJaaaaaaaaaaaaaaaaaaaaaaaaaaabkAbzcbzdbzebkAbkAbzfbzgbzhbzgbzibzjbzkbuvbutbzlbutbuvbuvbuwbuwbzmbuwbuwbuxbznbzobzpbuxbzqbzrbzsbztbuxbymbynbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbzubzvbzwbzxbxhcOBdcSdfrbuWbzAbzBbzCbzDbzEbuWbzFbzGbzHbxqbzIbuZbzJbzKbzLbzMbzNbzNbzNbzNbzNbzNbzObzNbzNbzNbzNbzPbzQbzRbzSbzTbzUbzVbzWbyObyPbzXbyObzYbzZbAabAbbAcbAdbxIaaaaaabhgaaaaaaaaaaaabyWbAebyZbAfbAgbAhbyWbAibyWaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaaaaabAjaaaaaaaaaaaaaaabAjaaaaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaafaaaaaaaaaaaaaaaaaabAkbAkbAkbAkbAkbAkbAkbAkbAkbAlbAmbAnbAobApbAqbArbAsbAtbAtbAubAvbAwbAxbAybAzbAAbABbACbvCbADbAEbAFbuxbDJbymbymbymbAGbAHbAIbwUbAJbAKbALbAMbwUbwUbwUbwUbwUbwUbANbAObwUbAPbAQbuxbARbASbATbxhbxhbxhbxhbuWbAVbAWbAXbAYbAZbuWbBabBbbBcbBdbBebuZbBfbxibBgbBhbBibBjbBkbxibxibBlbBlbBlbBlbBlbBlbBlbBmbBnbBobBpbBqbBrbBrbBrbBrbBsbBsbBsbBsbBsbBtbBubBvbBwbBwbBxbBwbBxbBwbBxbBwbBwbBybBzbBAbBBbBCbyWbBDbyWbyWaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaaaaabAjbAjbAjbAjbAjbAjbAjaaaaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaafaaaaaabBEbBFbBGbBHbAkbBIbBJbBKbBLbBMbBMbBNbAkbBObBPbBQbBRbBSbBTbBUbBVbBUbBWbBXbBYbBZbCabCbbCcbCdbCebCfbvCbCgbzobChbuxbCibCjbymbymbuxbCkbClbymbCmbCnbuxbuxbCobuxbuxbCpbymbymbAQbCqbymbCrbuxbuxbCsbCtbCubvZbvZbCvbyJbuWbCwbCxbuWbuWbuWbuWbuZbuZbCybuZbuZbuZbBfbxibCzbCAbBibwnbCBbCCbCDbBlbCEbCFbCGbCHbCIbBlbCJbCJbCKbCJbCJbBrbCLbCMbCNbBsbCObBsbCPbBsbCQbCRbCSbBwbCTbCUbCVbCVbCWbCXbCYbBwbCZbDabDbbDcbDdbDebDfbDgbyWaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaadaadaaaaabaaaaaaaaabBEbDhbDhbDibAkbDjbDjbDjbDkbBMbDlbDmbAkbDnbDobDpbDqbDrbDsbDtbCfbDubDvbDwbDxbDubDybDybDzbDAbDBbDybuxbDCbDDbDEbuxbuxbuxbDFbymbuxbCrbDGbDGbDHbDGbDGbDIbymbImbuxbDKbymbDLbuxbvFbymbCrbymbuxbDMbDNbDObvZbxibxibzzbDPbxibDQbAUbAUbAUbAUbBgbDRbDSbDTbDUbDVbDWbDXbDYbvZbDZbDZbDZbDZbEabBlbEbbEcbEdbEebEfbFMbEhbEibEjbEkbElbBrbEmbEnbEobBsbEpbBsbEqbBsbBsbErbEsbEtbEubEvbCVbEwbExbEybEzbBwbEAbEAbEAbFUbEAbEAbEAbEAbEAbEAaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaagaadaadaadaagaafaaaaafaaaaaaaaaaaaaaaaaaaaabBEbECbEDbEEbAkbEFbEGbEGbEHbEGbEIbEJbAkbEKbELbEMbENbEObEPbEQbERbESbETbEUbEVbEWbEXbEYbEZbFabFbbFcbuxbFdbFebFfbFgbFhbuxbvGbvFbuxbFibDGbFjbFkbFlbDGbFmbFnbChbuxbzpbymbFobuxbvGbymbFpbFqbFrbFsbFtbFubFvbDTbFwbDTbFxbDTbFybDTbDTbDTbDTbFzbFAbFBbFBbFBbFBbFBbFBbFCbFDbDZbFEbFFbFGbEabFHbFIbFJbFKbFLbFVbFMbFNbFObFPbEjbFQbBrbFRbFSbFTbGbbGibFWbFXbFYbBsbFZbGabHybGcbGdbGebGdbGfbGgbGhbKrbGjbGkbGlbGmbGnbGobGpbGqbGrbGsaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaaaaabAjbAjbAjbAjbAjbAjbAjaaaaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaafaaaaaabBEbBFbBGbBHbAkbBIbBJbBKbBLbBMbBMbBNbAkbBObBPbBQbBRbBSbBTbDpbBVbDpbBWbBXbBYbBZbCabCbbCcbCdbCebCfbvCbCgbzobChbuxbCibCjbymbymbuxbCkbClbymbCmbCnbuxbuxbCobuxbuxbCpbymbymbAQbCqbymbCrbuxbuxbCsbCtbCubvZbvZbCvbyJbuWbCwbCxbuWbuWbuWbuWbuZbuZbCybuZbuZbuZbBfbxibCzbCAbBibwnbCBbCCbCDbBlbCEbCFbCGbCHbCIbBlbCJbCJbCKbCJbCJbBrbCLbCMbCNbBsbCObBsbCPbBsbCQbCRbCSbBwbCTbCUbCVbCVbCWbCXbCYbBwbCZbDabDbbDcbDdbDebDfbDgbyWaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaadaadaaaaabaaaaaaaaabBEbDhbDhbDibAkbDjbDjbDjbDkbBMbDlbDmbAkbDnbDobELbDqbDrbDsbDtbCfbDubDvbDwbDxbDubDybDybDzbDAbDBbDybuxbDCbDDbDEbuxbuxbuxbDFbymbuxbCrbDGbDGbDHbDGbDGbDIbymbImbuxbDKbymbDLbuxbvFbymbCrbymbuxbDMbDNbDObvZbxibxibzzbDPbxibDQbAUbAUbAUbAUbBgbDRbDSbDTbDUbDVbDWbDXbDYbvZbDZbDZbDZbDZbEabBlbEbbEcbEdbEebEfbFMbEhbEibEjbEkbElbBrbEmbEnbEobBsbEpbBsbEqbBsbBsbErbEsbEtbEubEvbCVbEwbExbEybEzbBwbEAbEAbEAbFUbEAbEAbEAbEAbEAbEAaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaagaadaadaadaagaafaaaaafaaaaaaaaaaaaaaaaaaaaabBEbECbEDbEEbAkbEFbEGbEGbEHbEGbEIbEJbAkbEKbGmbEMbENbEObEPbEQbERbESbETbEUbEVbEWbEXbEYbEZbFabFbbFcbuxbFdbFebFfbFgbFhbuxbvGbvFbuxbFibDGbFjbFkbFlbDGbFmbFnbChbuxbzpbymbFobuxbvGbymbFpbFqbFrbFsbFtbFubFvbDTbFwbDTbFxbDTbFybDTbDTbDTbDTbFzbFAbFBbFBbFBbFBbFBbFBbFCbFDbDZbFEbFFbFGbEabFHbFIbFJbFKbFLbFVbFMbFNbFObFPbEjbFQbBrbFRbFSbFTbGbbGibFWbFXbFYbBsbFZbGabHybGcbGdbGebGdbGfbGgbGhbKrbGjbGkbGlbGpbGqbGnbGobJpbGrbGsaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaabBEbGtbGubGvbAkbGwbEGbEGbGxbGybGzbGAbGBbGCbGDbGEbGFbEObGGbGHbERbGIbGJbGKbGLbGMbEXbGNbGObGPbGQbGRbuxbGSbGTbGUbGVbFhbuxbAQbAQbuxbGWbDGbGXbFkbGYbDGbuxbuxbuxbuxbGZbGZbGZbuxbuxbuxbuxbuxbHabHbbHcbHdbHabvZbvZbvZbvZbvZbvibvibvibvZbvZbvZbvZbFBbHebHfbHgbHhbFBbHibHjbHkbHlbHmbHnbEabHobHpbEcbHqbHrbHsbEgbHtbHubHvbHwbHxbKtbHzbHAbHBbBsbHCbHDbHEbHFbBsbHGbHHbBwbHIbHJbHKbHJbHKbHJbHLbEtbHMbHNbHObHPbHQbHRbHSbHTbHUbHVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaafaaabHWbHWbHWbHWbHWbHWbHWbHXbHXbBEbHYbHZbDibAkbIabIabIbbIcbIdbIebIfbAkbIgbIhbIibIjbIkbIlccMbCfbInbIobIpbIqbIrbDybIsbItbIubIvbIwbIxbIxbIybIxbIxbIxbIxbuxbuxbuxbIzbDGbIAbIBbICbDGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIDbIEbIFbIGbIHbIIbIDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFBbIJbIKbILbILbIMbINbBqbDZbIObIPbIQbEabIRbISbITbIUbIVbIWbEgbEjbHubIXbIYbIZbBrbJabJbbJcbBsbJdbJebJfbJgbBsbJhbJibBwbBwbJjbJkbJlbJjbJmbJjbBwbJnbJobJpbJqbJrbJsbJtbJqbJubJvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaafbHWbHWbJwbJxbJybJzbJAbHWbJBbJCbJDbJEbJFbJGbAkbIabIabJHbJIbJJbJKbJLbAkbJMbJNbJObJPbCfbERbJQbCfbJRbJSbJTbJUbJVbDybGNbJWbJXbJYbJZbIxbKabKbbKcbKdbKebIxbKfbKgbuxbCrbDGbKhbKibDGbDGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIDbKjbKkbHcbKlbKmbIDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFBbFBbKnbKobKpbFBbKqbvZbEabDZbKzbDZbEabBlbEgbKsbOobKsbKubBlbKvbxIbKwbxIbKxbBrbBrbBrbBrbKybBsbPEbBsbBsbBsbHGbKAbyVbBwbBwbBwbBwbBwbBwbBwbBwbKBbKCbKDbKEbKFbKBbKGbKBbKHbKIbKJbKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaafaafbKLbKMbKMbKMbKMbKNbKObKPbKQbKRbKSbKTbKUbHWbKVbKWbKXbKYbKZbBEbAkbAkbAkbAkbAkbAkbAkbAkbAkbLabLbbLcbLdbLebLfbLgbLhbLibLjbLkbLlbLmbEXbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbIxbLybLzbLAbCrbDGbDGbDGbDGaaaaaaaaaaaaaaaaaabLBbLBbLCbLCbLCbLBbLBbLDbLEbHcbLFbLGbLHbLHbIDbIDbIDbLHbLHaaaaaaaaaaaaaaaaaabFBbFBbFBbFBbFBbLIbBqbLJbLKbLLbLMbLNbLObLPbLQbLRbLSbLTbLUbLVbLWbLXbLYbLZbMabMbbMcbMbbMdbMebMfbMgbMhbMibMjbMkbMlbMmbMmbMnbMobMpbMmbMqbMrbJvbMsbMtbMubMvbMwbMxbMybMzbMAbMAbMBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaabaaaaadaadaadaadaadaadaadaagaadaaaaaaaaaaaabMCbMDbMEbKMbMDbKNbMFbMGbMHbMIbMJbMKbMLbMMbMNbMObMPbMQbBEbMRbMSbMTbMUbMVbMWbMXbMYbMZbNabNbbNcbNdbNebNfbNgbNhbNibNjbNkbLkbLlbLmbEXbNlbJWbNmbNnbNobIxbNpbNqbNrbNsbNtbIxbNubNvbuxbCrbymbuxaaaaaaaaaaabaaaaaabLCbLCbLBbNwbNxbNybNzbNAbNBbNCbNDbHcbNEbNFbNGbNHbNIbNJbNKbNLbLHbIDbIDaaaaaaaabaaaaaaaaabvZbNMbDXbNNbBqbCKbNObNPbNQbNRbNSbNTbNUbNVbNWbNXbNYbNXbNZbOabObbNXbOabNXbOcbOdbOebNXbOfbOgbNWbNYbOabOhbNZbNXbOibOjbOkbOhbOlbOmbOnbPGbOpbOqbOrbOsbOtbOubOvbOwbOxbOxdgpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaadaadaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKLbMDbMDbKMbMDbKNbMFbOybOzbOAbOBbOCbODbHWbOEbKXbOFbOGbOHbOIbOJbOKbOLbOMbONbOObOPbOQbORbOSbOTbOKbOUbOVbLgbNhbOWbNjbOXbOYbOZbPabDybDybDzbPbbDzbDybIxbIxbPcbPdbNsbPebIxbPfbPgbAQbCrbymbuxaaaaaaaaaaaaaaabLCbLCbPhbPibPhbPjbPkbPlbNAbNAbPmbNDbHcbNEbPmbNHbNHbPnbPobPpbPqbPrbPqbIDbIDaaaaaaaaaaaaaaabvZbPsbPtbPubPvbPvbPwbPxbPwbPwbPwbPwbPybPzbCSbPAbPAbPAbPAbPBbPAbPAbPAbPAbPAbPAbPAbPCbPDbSWbPFbPFbPFbPFbPFbPFbPFbTabPHbPIbPJbPKbPLbJvbPMbPNbMubPObPPbPQbMybPRbPSbPTbMBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaafaaabHWbHWbHWbHWbHWbHWbHWbHXbHXbBEbHYbHZbDibAkbIabIabIbbIcbIdbIebIfbAkbIgbIhbIibIjbIkbIlccMbCfbInbIobIpbIqbIrbDybIsbItbIubIvbIwbIxbIxbIybIxbIxbIxbIxbuxbuxbuxbIzbDGbIAbIBbICbDGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIDbIEbIFbIGbIHbIIbIDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFBbIJbIKbILbILbIMbINbBqbDZbIObIPbIQbEabIRbISbITbIUbIVbIWbEgbEjbHubIXbIYbIZbBrbJabJbbJcbBsbJdbJebJfbJgbBsbJhbJibBwbBwbJjbJkbJlbJjbJmbJjbBwbJnbJobKFbJqbJrbJsbJtbJqbJubJvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaafbHWbHWbJwbJxbJybJzbJAbHWbJBbJCbJDbJEbJFbJGbAkbIabIabJHbJIbJJbJKbJLbAkbJMbJNbJObJPbCfbERbJQbCfbJRbJSbJTbJUbJVbDybGNbJWbJXbJYbJZbIxbKabKbbKcbKdbKebIxbKfbKgbuxbCrbDGbKhbKibDGbDGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIDbKjbKkbHcbKlbKmbIDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFBbFBbKnbKobKpbFBbKqbvZbEabDZbKzbDZbEabBlbEgbKsbOobKsbKubBlbKvbxIbKwbxIbKxbBrbBrbBrbBrbKybBsbPEbBsbBsbBsbHGbKAbyVbBwbBwbBwbBwbBwbBwbBwbBwbKBbKCbKDbKEbLkbKBbKGbKBbKHbKIbKJbKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaafaafbKLbKMbKMbKMbKMbKNbKObKPbKQbKRbKSbKTbKUbHWbKVbKWbKXbKYbKZbBEbAkbAkbAkbAkbAkbAkbAkbAkbAkbLabLbbLcbLdbLebLfbLgbLhbLibLjbPTbLlbLmbEXbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbIxbLybLzbLAbCrbDGbDGbDGbDGaaaaaaaaaaaaaaaaaabLBbLBbLCbLCbLCbLBbLBbLDbLEbHcbLFbLGbLHbLHbIDbIDbIDbLHbLHaaaaaaaaaaaaaaaaaabFBbFBbFBbFBbFBbLIbBqbLJbLKbLLbLMbLNbLObLPbLQbLRbLSbLTbLUbLVbLWbLXbLYbLZbMabMbbMcbMbbMdbMebMfbMgbMhbMibMjbMkbMlbMmbMmbMnbMobMpbMmbMqbMrbJvbMsbMtbMubMvbMwbMxbMybMzbMAbMAbMBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaabaaaaadaadaadaadaadaadaadaagaadaaaaaaaaaaaabMCbMDbMEbKMbMDbKNbMFbMGbMHbMIbMJbMKbMLbMMbMNbMObMPbMQbBEbMRbMSbMTbMUbMVbMWbMXbMYbMZbNabNbbNcbNdbNebNfbNgbNhbNibNjbNkbPTbLlbLmbEXbNlbJWbNmbNnbNobIxbNpbNqbNrbNsbNtbIxbNubNvbuxbCrbymbuxaaaaaaaaaaabaaaaaabLCbLCbLBbNwbNxbNybNzbNAbNBbNCbNDbHcbNEbNFbNGbNHbNIbNJbNKbNLbLHbIDbIDaaaaaaaabaaaaaaaaabvZbNMbDXbNNbBqbCKbNObNPbNQbNRbNSbNTbNUbNVbNWbNXbNYbNXbNZbOabObbNXbOabNXbOcbOdbOebNXbOfbOgbNWbNYbOabOhbNZbNXbOibOjbOkbOhbOlbOmbOnbPGbOpbOqbOrbOsbOtbOubOvbOwbOxbOxdgpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaadaadaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKLbMDbMDbKMbMDbKNbMFbOybOzbOAbOBbOCbODbHWbOEbKXbOFbOGbOHbOIbOJbOKbOLbOMbONbOObOPbOQbORbOSbOTbOKbOUbOVbLgbNhbOWbNjbOXbOYbOZbPabDybDybDzbPbbDzbDybIxbIxbPcbPdbNsbPebIxbPfbPgbAQbCrbymbuxaaaaaaaaaaaaaaabLCbLCbPhbPibPhbPjbPkbPlbNAbNAbPmbNDbHcbNEbPmbNHbNHbPnbPobPpbPqbPrbPqbIDbIDaaaaaaaaaaaaaaabvZbPsbPtbPubPvbPvbPwbPxbPwbPwbPwbPwbPybPzbCSbPAbPAbPAbPAbPBbPAbPAbPAbPAbPAbPAbPAbPCbPDbSWbPFbPFbPFbPFbPFbPFbPFbTabPHbPIbPJbPKbPLbJvbPMbPNbMubPObPPbPQbMybPRbPSbTCbMBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMCbKMbKMbKMbKMbKNbKObPUbPVbPVbPWbPXbPYbHWbPZbQabQbbQcbDibQdbQebQfbQgbQhbQibQhbQhbQjbQhbQgbQkbQlbQmbQnbQobQpbQkbQqbQrbQsbOZbQtbQubQvbQwbQxbQybQzbQAbQBbQCbQDbNsbQEbIxbQFbPgbAQbCrbQGbuxaaaaaaaaaaaabLCbLCbQHbQIbQJbQKbQLbQMbQNbQJbQObQPbQQbHcbQRbQPbQSbNEbQTbQUbQVbQWbNEbQXbQYbIDbIDaaaaaaaaaaaabvZbQZbvZbvZbPvbRabRbbRcbRdbRebRfbRgbRhbRibEsbRjbRkbRlbRmbRnbRobRpbRqbRrbRsbRtbPAbPCbRubRvbRwbRxbPFbRybRzbRAbPFbRBbRCbPIbPIbRDbREbRFbRGbRHbRIbRJbKBbKKbKBbKBbKBbKBbKGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabHWbRKbRLbRMbRNbRObRPbHWbRQbRRbQbbRSbDibRTbRUbQgbQgbRVbRWbRXbRYbRZbSabSbbQkbScbSdbSebSfbSgbShbSibSjbSkbEVbSlbSmbSnbSobSpbSqbSrbSsbStbStbSubStbStbStbStbuxbuxbCrbSvbuxaaaaaaaaabLCbLCbQHbQIbSwbSwbSxbSybSzbSAbSAbSBbSCbSDbSEbSFbSGbSHbSIbSJbSJbSKbSLbSMbSMbQXbQYbIDbIDaaaaaaaaabvZbSNbSObSPbPvbSQbSRbSSbSTbSUbSVbWObSXbSYbSZcdnbTbbTcbTdbTdbTdbTebTfbTgbThbTibTjbPCbTkbTlbTmbTnbTobTobTobTobPFbTpbTqbTrbPIbTsbTtbKBbTubTvbTwbTxbTybTzbTAbTBbJvaaaaaaaabaaaaaaaaaabcaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaafaaaaaaaaabKLbTCbKLbTCbKLbTCbKLbTCbKLbTCbKLbTCaafaafbTDbTEbTDbTDbTDbTDbTDbTEbTFbTGbTDbBEbTHbQbbTIbDibTJbTKbQgbTLbTMbTNbTObTPbTQbTRbTSbQkbTTbTUbTVbTWbTXbTYbTZbSjbUabEVbUbbUcbUdbUebUfbUgbUhbUibStbUjbUkbUlbUlbUmbStbUnbymbCrbUobGZaaaaaaaaabLCbUpbQIbSwbUqbUrbUsbUtbUubUvbUwbUxbUybUzbUAbUBbQPbUCbNEbUDbUEbUFbUGbUHbUIbSMbQXbUJbIDaaaaaaaaabvibUKbxibULbPvbUMbUNbUObUPbUQbURbUSbUTbUUbUVbRjbUWbUXbUYbUZbUYbVabTibVbbVcbVdbVebPCbVfbVgbVhbVibVjbVkbTobVlbPFbVmbVnbVobPIbVpbVqbKBbVrbVsbVtbVtbVtbVsbVsbVubHVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabVvbVwbVxbVwbVxbVwbVxbVwbVxbVwbVxbVwbVybVzbVAbVBbVCbVDbVBbVEbVBbVFbVGbVHbVIbBEbVJbVKbVLbVMbVNbVObQgbVPbTMbVQbVRbVSbVTbTRbVUbQkbVVbVWbVXbVYbVZbWabNjbWbbWcbWdbWebWfbWgbWhbWibWjbUhbWkbWlbWmbWnbWobWpbWqbStbWrbymbCrbWsbGZaaaaaabLBbLBbWtbQJbSwbWubWvbWwbWxbWybWxbWxbWzbWAbKjbWBbWCbWDbWDbWEbWFbWGbWDbWDbWHbUHbSMbNEbWIbLHbLHaaaaaabvibUKbxibWJbPvbWKbWLbWMbUPbWNbPvbPvbxHcfqbxHbPCbPCbWPbWQbWRbWSbVabWTbWUbWVbWWbWXbPCbWYbWZbXabXbbVjbXcbTobXdbPFbXebXfbXgbPIbXhbBvbKBbVrbXibXjbXkbXlbXmbXnbVubGsaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabMCbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbVybXobXpbXqbXrbXsbXtbXrbXsbXubXvbXwbXxbBEbXybXzbKZbDibXAbXBbQgbXCbTMbTObXDbXEbTObTRbXFbQkbXGbXHbXIbXJbXKbXLbXMbXNbXObGLbXPbUcbQwbXQbXRbXRbXSbQwbStbXTbXUbXVbXWbXXbStbWrbymbCrbDLbGZaaaaaabLBbXYbXZbYabYbbYcbWwbWwbYdbYebYfbWwbYgbWAbWAbYhbWDbWDbYibYjbYkbYlbYmbWDbWDbYnbYobYpbYqbYrbLHaaaaaabvibUKbYscvCbPvbYtbYubYubYvbYwbUSbYxbYybYzbYAbYBbRjbYCbYDbYDbYDbYEbYFbYFbYGbYHbYFbYIbYJbYKbYLbYMbTobTobTobYNbPFbYObYPbYQbPIbRDbREbKBbYRbKBbKBbKBbKBbKBbKBbKBbKBbYSbYSaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabKLbTCbKLbTCbKLbTCbKLbTCbKLbTCbKLbTCaadbYTbYUbYVbYWbYXbYVbYWbYXbXubYYbYZbZabBEbZbbZcbZbbDibZdbZebQgbZfbZgbZhbZibXEbZhbZjbZkbQkbZlbZmbZnbZobZpbZqbSibOXbEVbEVbSlbZrbZsbQwbQwbQwbQwbZtbStbZubStbZvbStbStbStbuxbymbCrbZwbuxaaaaaabLCbZxbZybZzbZAbZBbZCbZDbZEbZFbZGbWwbZHbZHbZIbZJbWDbZKbZLbZMbZMbZNbZObZPbWDbZQbZRbZSbYqbZTbIDaaaaaabvZbUKbAUbvZbPvbZUbZVbZWbZWbZXbZYbZZcaacabcaccadcaecafcagcagcagcahcaicajcakcalcambYIcancaocapcaqbPFcarcascatbPFcaucavcawbPIbRDbREcaxcaycazcaAcaBcaCcaDcaEcaFcaGcaHcaIcaIcaHcaHcaHcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabVvbVwbVxbVwbVxbVwbVxbVwbVxbVwbVxbVwbVycaJbTDcaKbYWbYXbYVbYWbYXbXucaLcaMcaMcaMcaMcaMcaMcaMcaNcaObQgcaPcaQcaRcaScaTcaUcaVcaWbQkbQkcaXbQkcaYcaZbQkcbacbbbEVcbccbdbQucbecbfcbgcbhcbicbjbStcbkbStcblbStcbmcbncbobymbCrbymbuxaaaaaabLCcbpcbqcbrcbscbtcbucbvcbwcbxcbycbzcbAcbBcbCcbDbWDcbEcbFcbGcbHcbIbZOcbJcbKcbLcbMcbNcbOcbPbIDaaaaaabvZbUKcbQcbRbPvbPvcbScbTcbUcbVbUScbWcbXcbYcbZccaccbcccccdcceccfccgcaicchcciccjcckbYIbPFcclbPFbPFbPFbPFbPFbPFbPFbPIbPIbPIbPIccmccncaxccoccpccqccrccscctcaCcaFcaFcaHccuccvccwcaHccxccycaHcaHaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbVvcczccAcczccAcczccAcczccAcczccAcczbVyccBbTDccCbYWccDccEbYWccDbXuccFcaMccGccHccIccJccKcaMbXAccLcaWcaWcaWcaWcaWcaWcaWcaWcaWcCibQkbQkbQkbQkbQkbQkccNccObDxccPccNccQccQccQccQccQccQccQccRccRccRccRbStccSccTbuxccUccVccWbuxaaaaaabLCccXccYccZcdacdbbWwbWwbWwbWwbWwbWwcdccddcddcdebWDbWDbWDbWDbWDcdfbZOcdgbWDcdhcbMcdicbOcdjbIDaaaaaabvZcdkbxibxicdlbPvbPvbPvbPvbPvbPvcdmcipcdocipcdmbPCbPCbPCbPCbPCbPCbYIcdpcdqcdqcdrbYIcdscdscdscdtcducdvcdwcdxcdycdzcdAbxHcdBcdCcdDcdEcdFcdGcdHccrccscdIcaCcdJcaFcdKcdLcdMcdNcaIcdOcdMcdPcaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabMCcdQbMCcdQbMCcdQbMCcdQbMCcdQbMCcdQaafaafbTDcdRcdScdTcdUcdVcdTcdWcdXcdYcdZceacebceccedceebXAcefcegcehceicejcekcekcekcekcekcekcekcekcekcelcemcenceocepceqceqcerbuxcescescetbDLceubymbAQbAQbvFbvGbuxcevbuxbuxbymbCrcewbuxaaaaaabLBcexccYbQJceycezceAceBceCceDceEceFceGceHceHceIceHceHceHceJceKceLceMceNbWDbNEceObNEcbObNGbLHaaaaaabvZcePceQceQceQceRceSbxiceTceUbvZceVceWceXceWceYceZcfacfbcfccfdcfebYIbYIcffcfgbYIbYIcfhcficficfjcfkcflcfmcfmcfmcdvcfnbxHcfocfpbOncoHcfrcfscftccrccsccscdIcdIcaFcaHcfucfvcfwcfxcfycfzcfAcfBcfCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaabTDcfDbXrcfEcfFcfGcfHbXucfIcaMcaMcaMcaMcfJcfKcfLcfMcfNcfOcfOcfPcfQcfRcfRcfRcfRcfRcfRcfRcencencencfScfTcfUcfVcfWcfXcfYcfZcgacgbcgacgacgacgacgacgccgccgccgccgdcgccgccgccgecgfbuxbLCbLCbLBcggccYcghcgicgjcgkcglcglcgmceEcgnbWAbWAbWAbWAbWAbWAbWAcgnbWEcgocgpcgqbWDcgrcgscgtcgucgvbLHcgwcgwbvZbUKbxibAUbCCbCDcgxbxicgybxicgzcgAcgBcgCcgDcgAcgEcfacgFcgGcgHcgIcgJcgKcgLcgMcgNcgNcgOcdtcdtcdtcdtcdtcdtcdtcfmcdvcgPbxHcgQcgRcgScaxcgTcgUcgVccrccscdIcgWcgXcaFcaHcgYcgZchacaHcaIchbcaIcaHcaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaafaaaaaaaaabKLbVibKLbVibKLbVibKLbVibKLbVibKLbViaafaafbTDbTEbTDbTDbTDbTDbTDbTEbTFbTGbTDbBEbTHbQbbTIbDibTJbTKbQgbTLbTMbTNbTObTPbTQbTRbTSbQkbTTbTUbTVbTWbTXbTYbTZbSjbUabEVbUbbUcbUdbUebUfbUgbUhbUibStbUjbUkbUlbUlbUmbStbUnbymbCrbUobGZaaaaaaaaabLCbUpbQIbSwbUqbUrbUsbUtbUubUvdNgbUxbUybUzbUAbUBbQPbUCbNEbUDbUEbUFbUGbUHbUIbSMbQXbUJbIDaaaaaaaaabvibUKbxibULbPvbUMbUNbUObUPbUQbURbUSbUTbUUbUVbRjbUWbUXbUYbUZbUYbVabTibVbbVcbVdbVebPCbVfbVgbVhbVxbVjbVkbTobVlbPFbVmbVnbVobPIbVpbVqbKBbVrbVsbVtbVtbVtbVsbVsbVubHVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabVvbVwbVAbVwbVAbVwbVAbVwbVAbVwbVAbVwbVybVzbVEbVBbVCbVDbVBbXpbVBbVFbVGbVHbVIbBEbVJbVKbVLbVMbVNbVObQgbVPbTMbVQbVRbVSbVTbTRbVUbQkbVVbVWbVXbVYbVZbWabNjbWbbWcbWdbWebWfbWgbWhbWibWjbUhbWkbWlbWmbWnbWobWpbWqbStbWrbymbCrbWsbGZaaaaaabLBbLBbWtbQJbSwbWubWvbWwbWxbWybWxbWxbWzbWAbKjbWBbWCbWDbWDbWEbWFbWGbWDbWDbWHbUHbSMbNEbWIbLHbLHaaaaaabvibUKbxibWJbPvbWKbWLbWMbUPbWNbPvbPvbxHcfqbxHbPCbPCbWPbWQbWRbWSbVabWTbWUbWVbWWbWXbPCbWYbWZbXabXbbVjbXcbTobXdbPFbXebXfbXgbPIbXhbBvbKBbVrbXibXjbXkbXlbXmbXnbVubGsaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabMCbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbVybXoccAbXqbXrbXsbXtbXrbXsbXubXvbXwbXxbBEbXybXzbKZbDibXAbXBbQgbXCbTMbTObXDbXEbTObTRbXFbQkbXGbXHbXIbXJbXKbXLbXMbXNbXObGLbXPbUcbQwbXQbXRbXRbXSbQwbStbXTbXUbXVbXWbXXbStbWrbymbCrbDLbGZaaaaaabLBbXYbXZbYabYbbYcbWwbWwbYdbYebYfbWwbYgbWAbWAbYhbWDbWDbYibYjbYkbYlbYmbWDbWDbYnbYobYpbYqbYrbLHaaaaaabvibUKbYscvCbPvbYtbYubYubYvbYwbUSbYxbYybYzbYAbYBbRjbYCbYDbYDbYDbYEbYFbYFbYGbYHbYFbYIbYJbYKbYLbYMbTobTobTobYNbPFbYObYPbYQbPIbRDbREbKBbYRbKBbKBbKBbKBbKBbKBbKBbKBbYSbYSaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabKLbVibKLbVibKLbVibKLbVibKLbVibKLbViaadbYTbYUbYVbYWbYXbYVbYWbYXbXubYYbYZbZabBEbZbbZcbZbbDibZdbZebQgbZfbZgbZhbZibXEbZhbZjbZkbQkbZlbZmbZnbZobZpbZqbSibOXbEVbEVbSlbZrbZsbQwbQwbQwbQwbZtbStbZubStbZvbStbStbStbuxbymbCrbZwbuxaaaaaabLCbZxbZybZzbZAbZBbZCbZDbZEbZFbZGbWwbZHbZHbZIbZJbWDbZKbZLbZMbZMbZNbZObZPbWDbZQbZRbZSbYqbZTbIDaaaaaabvZbUKbAUbvZbPvbZUbZVbZWbZWbZXbZYbZZcaacabcaccadcaecafcagcagcagcahcaicajcakcalcambYIcancaocapcaqbPFcarcascatbPFcaucavcawbPIbRDbREcaxcaycazcaAcaBcaCcaDcaEcaFcaGcaHcaIcaIcaHcaHcaHcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabVvbVwbVAbVwbVAbVwbVAbVwbVAbVwbVAbVwbVycaJbTDcaKbYWbYXbYVbYWbYXbXucaLcaMcaMcaMcaMcaMcaMcaMcaNcaObQgcaPcaQcaRcaScaTcaUcaVcaWbQkbQkcaXbQkcaYcaZbQkcbacbbbEVcbccbdbQucbecbfcbgcbhcbicbjbStcbkbStcblbStcbmcbncbobymbCrbymbuxaaaaaabLCcbpcbqcbrcbscbtcbucbvcbwcbxcbycbzcbAcbBcbCcbDbWDcbEcbFcbGcbHcbIbZOcbJcbKcbLcbMcbNcbOcbPbIDaaaaaabvZbUKcbQcbRbPvbPvcbScbTcbUcbVbUScbWcbXcbYcbZccaccbcccccdcceccfccgcaicchcciccjcckbYIbPFcclbPFbPFbPFbPFbPFbPFbPFbPIbPIbPIbPIccmccncaxccoccpccqccrccscctcaCcaFcaFcaHccuccvccwcaHccxccycaHcaHaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbVvcczcdQcczcdQcczcdQcczcdQcczcdQcczbVyccBbTDccCbYWccDccEbYWccDbXuccFcaMccGccHccIccJccKcaMbXAccLcaWcaWcaWcaWcaWcaWcaWcaWcaWcCibQkbQkbQkbQkbQkbQkccNccObDxccPccNccQccQccQccQccQccQccQccRccRccRccRbStccSccTbuxccUccVccWbuxaaaaaabLCccXccYccZcdacdbbWwbWwbWwbWwbWwbWwcdccddcddcdebWDbWDbWDbWDbWDcdfbZOcdgbWDcdhcbMcdicbOcdjbIDaaaaaabvZcdkbxibxicdlbPvbPvbPvbPvbPvbPvcdmcipcdocipcdmbPCbPCbPCbPCbPCbPCbYIcdpcdqcdqcdrbYIcdscdscdscdtcducdvcdwcdxcdycdzcdAbxHcdBcdCcdDcdEcdFcdGcdHccrccscdIcaCcdJcaFcdKcdLcdMcdNcaIcdOcdMcdPcaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabMCcdRbMCcdRbMCcdRbMCcdRbMCcdRbMCcdRaafaafbTDcehcdScdTcdUcdVcdTcdWcdXcdYcdZceacebceccedceebXAcefcegcfEceicejcekcekcekcekcekcekcekcekcekcelcemcenceocepceqceqcerbuxcescescetbDLceubymbAQbAQbvFbvGbuxcevbuxbuxbymbCrcewbuxaaaaaabLBcexccYbQJceycezceAceBceCceDceEceFceGceHceHceIceHceHceHceJceKceLceMceNbWDbNEceObNEcbObNGbLHaaaaaabvZcePceQceQceQceRceSbxiceTceUbvZceVceWceXceWceYceZcfacfbcfccfdcfebYIbYIcffcfgbYIbYIcfhcficficfjcfkcflcfmcfmcfmcdvcfnbxHcfocfpbOncoHcfrcfscftccrccsccscdIcdIcaFcaHcfucfvcfwcfxcfycfzcfAcfBcfCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaabTDcfDbXrcfFciGcfGcfHbXucfIcaMcaMcaMcaMcfJcfKcfLcfMcfNcfOcfOcfPcfQcfRcfRcfRcfRcfRcfRcfRcencencencfScfTcfUcfVcfWcfXcfYcfZcgacgbcgacgacgacgacgacgccgccgccgccgdcgccgccgccgecgfbuxbLCbLCbLBcggccYcghcgicgjcgkcglcglcgmceEcgnbWAbWAbWAbWAbWAbWAbWAcgnbWEcgocgpcgqbWDcgrcgscgtcgucgvbLHcgwcgwbvZbUKbxibAUbCCbCDcgxbxicgybxicgzcgAcgBcgCcgDcgAcgEcfacgFcgGcgHcgIcgJcgKcgLcgMcgNcgNcgOcdtcdtcdtcdtcdtcdtcdtcfmcdvcgPbxHcgQcgRcgScaxcgTcgUcgVccrccscdIcgWcgXcaFcaHcgYcgZchacaHcaIchbcaIcaHcaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaabTEbTDchcchcbTDchdchechfbXuchgchhchichjchkchlchmchnchochpchqchrchschtcfRchuchuchuchuchuchvchwchxcenchychzchAchBchCchDchEbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxchFchGchHchIbLBchJchKchLchMchNcgkcgkchOchPceEchQbWAchRchRchRchRchRbWAchSbWDchTchUbWDbWDchVchWchVchXchYchZciacibciccidbvgbvZbvZbvZbvZbvZbvZbvZbvZciecifcigcihcieceZceZceZciiceZceZceZceZcijcikcgNcilcimcinciociociociociocdtcdvcdvcaGbxHcoIbxHbxHcaxciqcaxcaxccrcaFcaGcaHcaHcaHcaHcircgZciscitciucivciwcixcaHcaHaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafciybTDcizciAciBciCciDciEciFciGciHciIciJciKciLciMciNciOciPciQciRcfOciSciTcfRchuchuchuchuchuciUciVciWciXciYciZcjacjbcjccjdcjecjfcjgchCcjdcjhcjicjbcjjcjkcjlcjmcjbcjncjociWcjpcjqcjrcjscjtcjucjvbUwbUwcjwcjxcjycjzcgkceEceEceEcdcbWAchRchRchRchRchRbWAcgnbWDbWDbWDbWDciacjAcjBcjCcjDcjDcjEcjFcjGcjHcjIcjJcjKcjLcjMcjNcjOcjPcjQcjRcjNcjOcjScjTcjUcjVcjWcjXcjTcjYcjZckackbcijckcckdckeckfckgciociociociociocdtckhcdvckickjckkcklcaGckmcknckockpcaCckqckrcaHckscktcaHckucgZcdMcdMcdMcgZcdMckvckwcaIaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafciybTDcizciAciBciCciDciEciFcmCciHciIciJciKciLciMciNciOciPciQciRcfOciSciTcfRchuchuchuchuchuciUciVciWciXciYciZcjacjbcjccjdcjecjfcjgdVxcjdcjhcjicjbcjjcjkcjlcjmcjbcjncjociWcjpcjqcjrcjscjtcjucjvbUwbUwcjwcjxcjycjzcgkceEceEceEcdcbWAchRchRchRchRchRbWAcgnbWDbWDbWDbWDciacjAcjBcjCcjDcjDcjEcjFcjGcjHcjIcjJcjKcjLcjMcjNcjOcjPcjQcjRcjNcjOcjScjTcjUcjVcjWcjXcjTcjYcjZckackbcijckcckdckeckfckgciociociociociocdtckhcdvckickjckkcklcaGckmcknckockpcaCckqckrcaHckscktcaHckucgZcdMcdMcdMcgZcdMckvckwcaIaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackxckyckzckAckBckCckDckEckFckGckHckIckJckKckLckMchnbLgckNcfOcfOckOcencfRchuchuchuchuchuckPckQckRckSckTckUckVckWckXckWckYckUckZckUckUclaclbckUckUclccldcledhndhpdhqclhclicljclkcllclmcllcllcllcllcllclncloclpbYhclqclrceHclsbWAchRchRchRchRchRbWAcltbZJcluclvclwclxclyclzclAclAclAclAclAclBclCclDclEclFclGclHclIclHclHclJclKclHclIclLclHclMclHclHclNclHclHclOclPclJclQclRclSclTclUclVciociociociociocdtclWcdvclXclYclZcmacmbcmccmdcmecmfcmgcmhcmicmjcmkcmlcmmcmncmocmpcmqcmrcmscmtcdMcmucmvaafaafaafaadaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaaabTDcmwciAcmxcmycmzcmAcmBcmCcmDcmEcmFcmGcmHcmIcmJcmKcfOcfOcfOcmLcmMcmNcfRchuchuchuchuchucmOcmPciWciXcmQcmRcmScmTcjccmUcmVcmWcmXchCdhscmYcmZcmTcnacnbcnccndcngdhSdiqcnhcnicnjcnkcnlcnmcnncnobUwbUwcnpcnqcnrcnsbWAcntcnucddcddbWAchRchRchRchRchRbWAcnvcnwcnxcnybWAcnzcnAcnBcnCcnDcnDcnEcnFcnGcnHcnIcnJcjKcjLcjPcnKcjPcjPcnLcnMcnNcnOcnPcnQcnRcnRcnScnTcnLcnRcnUcnVcnWcnXckcckdcnYcnZcoaciociociociociocdtcobcoccaGcodcoecofcaGcogcohcogcoicojcokcolcaHcomconcaHcoocopcoqcdMcorcgZcdMcoscotcaIaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaaabTDcmwciAcmxcmycmzcmAcmBcrAcmDcmEcmFcmGcmHcmIcmJcmKcfOcfOcfOcmLcmMcmNcfRchuchuchuchuchucmOcmPciWciXcmQcmRcmScmTcjccmUcmVcmWcmXchCdhscmYcmZcmTcnacnbcnccndcngdhSdiqcnhcnicnjcnkcnlcnmcnncnobUwbUwcnpcnqcnrcnsbWAcntcnucddcddbWAchRchRchRchRchRbWAcnvcnwcnxcnybWAcnzcnAcnBcnCcnDcnDcnEcnFcnGcnHcnIcnJcjKcjLcjPcnKcjPcjPcnLcnMcnNcnOcnPcnQdVycnRcnScnTcnLcnRcnUcnVcnWcnXckcckdcnYcnZcoaciociociociociocdtcobcoccaGcodcoecofcaGcogcohcogcoicojcokcolcaHcomconcaHcoocopcoqcdMcorcgZcdMcoscotcaIaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaabTEbTDchcchcbTDcoucovcowbXucoxchhcoycozcoAcoBcoCcoDcoEcoFcoGcmLcrQcrOcfRchuchuchuchuchuchvcoJcoKcencencoLchEcoMchCcoNcoOcoPcoPcoPcoPcoPcoPcoQcoQcoRcoScoQdirdwgdwqditcoTcoVcoWchGcoXcnsbLBcoYchKchLcoZchNbLBbWAcgncpacpbcpcbWAchRchRchRchRchRcpdcpdcpecpdcpdcpdcpdcpfchWchVchXcpgchZcphcpiciccpjcpkcpkcpkcplcpmcpncpncpncpncpncpocpncpncpncpncpncpncppcpqcprcnVcpsciecptcgNcpuciecinciociociociociocdtcpvcdvcaGcpwcpxcpycpzcpzcpzcpAcpzcpBcpzcpzcaHcaHcaHcaHcpCcpDcpEcpFcpGcpHcpIcpJcaHcaHaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaabTDcpKcpLcpMcpNchecmDbXucpOcpPcpPcpQcpPcpRcpScpPcoEcmLcmLcmLcpUcpTcfRcfRcfRcfRcfRcfRcfRcencencencpVcpWcpXcpYcpZcqacpXcqbcqccqdcqecqfcqgcqhcqicqjcqkcqlcoQdwTdwWdwTdwUcqncqocoVbLCbLCcqpcqqcqrcqscqtcqubWzcqvcqwcqxcqxcqxcqycqycqzcqAcqBcqpcpdcqCcqDcqEcqFcqGcpdcqHcqIcjCcqJcqKchZcgwcgwcpkcqLcqMcqNcqOcqPcqPcqQcqRcqScqTcqUcqVcqWcqXcqYcqZcracracrbcrccrdcrecrfcrgcrhcrhcrhcricdtcdtcdtcdtcdtcdtcdtcfmcdvcrjcpwcrkcrlcrmcrncrocrpcrqcrrcrscrtcrucrvcrvcaHcrwcgZcrxcaHcaIcrycaIcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabKLbTCbKLbTCbKLbTCbKLbTCbKLbTCbKLbTCaafaafbTDcrzbXrcrAcrBcrCcrDcrEcrFcrGcrHcrIcrJcrKcrLcpPcuXcrMcrNcrNcrPcuZcrRcrRcrRcrScrTcrUcrVcpVcpVcrWcpVcencrXcrXcrXcrXcrXcoPcrYcrZcsacsbcsccoQcsdcsecsfcsgcoQdyidypdybdwUcshcqocoVaaaaaacqpcsicqrcsjcskcslbWzcsmcsncqxcsocspcsqcsrcsjcsjcsjcsscstcsucsvcswcsxcsycpdcszcsAcjDcsBcsCchZaaaaaacpkcsDcsEcsFcpkcsGcsHcpncsIcsJcsKcsLcsMcsNcsOcsPcsQcsRcsScpncsTcsUcsVcsVcsWcrhcdvcdvcsXcfmcfmcfmcfmcfmcfmcfmcfmcdvcsYcpwcsZctacrmctbctcctdctectfctgcthcticrvcrvctjctkctlctmcaIctnctoctpcaHaaaaaaaaaaaaaadabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbVvbVwbVxbVwbVxbVwbVxbVwbVxbVwbVxbVwbVybVzbTDctqctrctscttctrctuctvctwcpPctxctyctzctActBcpPcuXctCctDctDctFctEctDctGctGctHctHctIctJctIctKctIctIctLctLctMctNctMctLctLctOctOctOctPctOctOctQctRctScoQcoQdUPdUQdBMdwUctTcqocoVaaaaaactUctVctWctXcskctYbWzctZcuacubcuccudcuecufcugcuhcsjcuicujcukculcumcuncuocpdcupcsAcuqcurcuscgwaaaaaacpkcutcuucuucuucuvcuwcuucuucuxcuxcuxcuycuzcuAcuzcuzcuzcuzcuBcuCcuDcuEcuFcuCcuGcuGcuGcuGcuGcuGcuGcuHcuHcuHcuHcuIcuIcuIcuIcuJcuKcuLctbcuMcrqcrqcrqcrqcrqcrvcrvcrvcaHcuNcorcuOcaIcdOcdMcdPcaHaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabVvcczccAcczccAcczccAcczccAcczccAcczbVycaJbTDcaKcuPcuQcuRcuScuQcuTcuUcpPcpPcpPcpPcpPcpPcpPcuXcuVctDcuWcuYcxbctDcvacvbcvccvcctIcvdctIcvecvfcvgcvhcvicvjcvkcvjcvlcvmcvncvocvpcvqcvrctOcvscvtcvucvvcoQdUSdUTdURdwUcvwcqocoVaaaaaactUcvxcvycvzcvAcvBbWzcDQcvDcqxcvEcvFcvGcvHcvIcvJcsjcvKcvLcvMcvNcumcvOcvPcvQcvRcsAcvScvTcvUcgwaaaaaacpkcsDcuucvVcvWcvXcvYcvZcwacwbcwccwdcuycwecwfcwgcwhcwicwjcwkcwlcwmcwncwocwpcwqcwrcwscwtcwucwvcwwcwxcwycwzcwAcwBcwCcwDcwEcwFcwGcrmcwHcwIcwJcrqcrqcrqcwKcwLcwIcrvcaHcwMcwNcwOcaHccxcwPcaHcaHaafaafaafaadaXGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabMCcdQbMCcdQbMCcdQbMCcdQbMCcdQbMCcdQaadbYTcwQcwRcwScwTcwUcwScwTcwVcwWcwXcwYbTDcfRcrMcrNcrNcrNcwZctDcxacxccxdctDcvacxectHctHctIcxfcxgcxhcxicxjcxkcxlcxlcxlcxmcxncxocxpcxqcxrcxscxtcxucxvcxwcxxcvvcoQdwUdwUdwUdwUcoVcqocoVaaaaaactUcxycqrcxzcxAcxBbWzcxCcxDcqxcxEcxFcxGcsrcxHcxIcxJcvKcxKcxLcxMcxNcxOcxPcpdcvRcxQcxRcxScxTcgwaaaaaacpkcsDcuucxUcxVcxWcxXcxYcxZcyacybcyccuzcydcyecyfcygcyhcyicyjcykcylcymcyncyocypcyqcyrcyscyrcytcwwcyucyvcywcwAcyxcyycyzcwEcyAcyBcrmcrmcrmcrmcrmcrmcrmcrmcrmcpzcpzcaHcyCcaIcaHcaHcaHcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabKLbVibKLbVibKLbVibKLbVibKLbVibKLbViaafaafbTDcrzbXrctqcrBcrCcrDcrEcrFcrGcrHcrIcrJcrKcrLcpPcuXcrMcrNcrNcrPcuZcrRcrRcrRcrScrTcrUcrVcpVcpVcrWcpVcencrXcrXcrXcrXcrXcoPcrYcrZcsacsbcsccoQcsdcsecsfcsgcoQdyidypdybdwUcshcqocoVaaaaaacqpcsicqrcsjcskcslbWzcsmcsncqxcsocspcsqcsrcsjcsjcsjcsscstcsucsvcswcsxcsycpdcszcsAcjDcsBcsCchZaaaaaacpkcsDcsEcsFcpkcsGcsHcpncsIcsJcsKcsLcsMcsNcsOcsPcsQcsRcsScpncsTcsUcsVcsVcsWcrhcdvcdvcsXcfmcfmcfmcfmcfmcfmcfmcfmcdvcsYcpwcsZctacrmctbctcctdctectfctgcthcticrvcrvctjctkctlctmcaIctnctoctpcaHaaaaaaaaaaaaaadabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbVvbVwbVAbVwbVAbVwbVAbVwbVAbVwbVAbVwbVybVzbTDcttctrctscwRctrctuctvctwcpPctxctyctzctActBcpPcuXctCctDctDctFctEctDctGctGctHctHctIctJctIctKctIctIctLctLctMctNctMctLctLctOctOctOctPctOctOctQctRctScoQcoQdUPdUQdBMdwUctTcqocoVaaaaaactUctVctWctXcskctYbWzctZcuacubcuccudcuecufcugcuhcsjcuicujcukculcumcuncuocpdcupcsAcuqcurcuscgwaaaaaacpkcutcuucuucuucuvcuwcuucuucuxcuxcuxcuycuzcuAcuzcuzcuzcuzcuBcuCcuDcuEcuFcuCcuGcuGcuGcuGcuGcuGcuGcuHcuHcuHcuHcuIcuIcuIcuIcuJcuKcuLctbcuMcrqcrqcrqcrqcrqcrvcrvcrvcaHcuNcorcuOcaIcdOcdMcdPcaHaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabVvcczcdQcczcdQcczcdQcczcdQcczcdQcczbVycaJbTDcaKcuPcuQcuRcuScuQcuTcuUcpPcpPcpPcpPcpPcpPcpPcuXcuVctDcuWcuYcxbctDcvacvbcvccvcctIcvdctIcvecvfcvgcvhcvicvjcvkcvjcvlcvmcvncvocvpcvqcvrctOcvscvtcvucvvcoQdUSdUTdURdwUcvwcqocoVaaaaaactUcvxcvycvzcvAcvBbWzcDQcvDcqxcvEcvFcvGcvHcvIcvJcsjcvKcvLcvMcvNcumcvOcvPcvQcvRcsAcvScvTcvUcgwaaaaaacpkcsDcuucvVcvWcvXcvYcvZcwacwbcwccwdcuycwecwfcwgcwhcwicwjcwkcwlcwmcwncwocwpcwqcwrcwscwtcwucwvcwwcwxcwycwzcwAcwBcwCcwDcwEcwFcwGcrmcwHcwIcwJcrqcrqcrqcwKcwLcwIcrvcaHcwMcwNcwOcaHccxcwPcaHcaHaafaafaafaadaXGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabMCcdRbMCcdRbMCcdRbMCcdRbMCcdRbMCcdRaadbYTcwQcwUcwScwTcxtcwScwTcwVcwWcwXcwYbTDcfRcrMcrNcrNcrNcwZctDcxacxccxdctDcvacxectHctHctIcxfcxgcxhcxicxjcxkcxlcxlcxlcxmcxncxocxpcxqcxrcxscFGcxucxvcxwcxxcvvcoQdwUdwUdwUdwUcoVcqocoVaaaaaactUcxycqrcxzcxAcxBbWzcxCcxDcqxcxEcxFcxGcsrcxHcxIcxJcvKcxKcxLcxMcxNcxOcxPcpdcvRcxQcxRcxScxTcgwaaaaaacpkcsDcuucxUcxVcxWcxXcxYcxZcyacybcyccuzcydcyecyfcygcyhcyicyjcykcylcymcyncyocypcyqcyrcyscyrcytcwwcyucyvcywcwAcyxcyycyzcwEcyAcyBcrmcrmcrmcrmcrmcrmcrmcrmcrmcpzcpzcaHcyCcaIcaHcaHcaHcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaadaaaaaaaaabKLbKMbKMbKMbKMbKMbKMbKMcyDbKMbKMbKMbVybXocyEcyFcyGcyHcyIcyJcyHcyKcyLcyLcyMbTDcfRcyNcmLcyOcyOcyPcyOctDcyRcyQctDctDcyTcyUcyVctIcyWcyXcyYcyZczaczbcxlcxlczcczdczeczfctOczgczhcziczjctOcoQcoQczkcoQcoQcqmcqmcqmcqmcoVcqoczlaaaaaacqpcsicqrczmcznczobWAbWAczpcqxcxEczqczrcsrcsjcvAcsjczscpdcztczuczvczwcpdcpdczxczyczzczAczBchZaaaaaaczCcsDcuuczDczEcxWczFczGcxZczHczIczJcuzczKcyeczLczMczNczOczPczQczRczSczTczUczVczWczXczYczXczZcAacAbcAccAdcwAcAecAfcAgcwEcAhcAicAjcAkcAlcAmcAncAocApcAqcArcAsbYScAtcAuaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabVvcczccAcczccAcczccAcczccAcczccAcczbVyccBbTDbTDcAvcAwcAxbVEcAxcAycyLcyLcAzbTDcfRcyNcmLcyOcAAcABcACctDcAEcyScAFctDcAGcAHcAIctIcAJcAKcALcAMcANcAOcAPcAQcAQcARczecAScATcAUcAVcAWcAXctOcAYcAZcBacBbcBccqmcBdcqmcBecoVcqoczlaaaaaacqpcqpcBfcsjcuhcBgcBhbWAcBicqxcqxcqxcqxcBjcBkcBlcBkcBmcpdcpdcBncBocpdcpdcBpcBqcBrcjDcBschZchZaaaaaaczCcsDcuucuucBtcBucBvcBwcxZcBxcBycBzcuzcBAcBBcBCcBCcBDcBEcBFcBGcBHcBIcwocBJcypcBKcBLcBMcBNcBOcuGcBPcBQcBRcwAcBScBTcBUcwEcBVcBWcBXcBYcBYcAmcBZcCacCbcAmcAmcAsaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabMCcdQbMCcdQbMCcdQbMCcdQbMCcdQbMCcdQaafaafaafbTEbTDbTDbTDbTDbTDbTDbTDbTDbTDbTDcfRcCccencyOcCdcABcCectDcCfcADcNpcCjcCkcClcCmctIcCncCocCpcCqctIcCrcCscCtcCtcCucCvcCwcxpcCxcCycxrcCzctOcAYcCAcCBcCCcBbcBbcqmcBdcqmcoVcqoczlaaaaaaaaactUcCDcCEcuhcCFcCGcCHcCIcCJcCKcCKcCLcCMcCNcskcCOcCMcCPcnDcCQcCRcCScCTcCUcCVcBrcCWcCXcgwaaaaaaaaaczCcsDcCYcuucCZcDacDbcDccxZcDdcDecDdcuzcDfcyecDgcDhcDicDjcDkcDlcwmcDmcwocDncypcDoczXcDpczXcDqcuGcDrcDscDtcwAcDucDvcDwcwEcDxcDycDzcDAcDBcDCcDDcDEcApcDFcDGcAsaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabVvcczcdQcczcdQcczcdQcczcdQcczcdQcczbVyccBbTDbTDcAvcAwcAxbXpcAxcAycyLcyLcAzbTDcfRcyNcmLcyOcAAcABcACctDcAEcyScAFctDcAGcAHcAIctIcAJcAKcALcAMcANcAOcAPcAQcAQcARczecAScATcAUcAVcAWcAXctOcAYcAZcBacBbcBccqmcBdcqmcBecoVcqoczlaaaaaacqpcqpcBfcsjcuhcBgcBhbWAcBicqxcqxcqxcqxcBjcBkcBlcBkcBmcpdcpdcBncBocpdcpdcBpcBqcBrcjDcBschZchZaaaaaaczCcsDcuucuucBtcBucBvcBwcxZcBxcBycBzcuzcBAcBBcBCcBCcBDcBEcBFcBGcBHcBIcwocBJcypcBKcBLcBMcBNcBOcuGcBPcBQcBRcwAcBScBTcBUcwEcBVcBWcBXcBYcBYcAmcBZcCacCbcAmcAmcAsaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabMCcdRbMCcdRbMCcdRbMCcdRbMCcdRbMCcdRaafaafaafbTEbTDbTDbTDbTDbTDbTDbTDbTDbTDbTDcfRcCccencyOcCdcABcCectDcCfcADcNpcCjcCkcClcCmctIcCncCocCpcCqctIcCrcCscCtcCtcCucCvcCwcxpcCxcCycxrcCzctOcAYcCAcCBcCCcBbcBbcqmcBdcqmcoVcqoczlaaaaaaaaactUcCDcCEcuhcCFcCGcCHcCIcCJdVzcCKcCLcCMcCNcskcCOcCMcCPcnDcCQcCRcCScCTcCUcCVcBrcCWcCXcgwaaaaaaaaaczCcsDcCYcuucCZcDacDbcDccxZcDdcDecDdcuzcDfcyecDgcDhcDicDjcDkcDlcwmcDmcwocDncypcDoczXcDpczXcDqcuGcDrcDscDtcwAcDucDvcDwcwEcDxcDycDzcDAcDBcDCcDDcDEcApcDFcDGcAsaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacDHcDIcDJcDKcDLcDLcDMcDNcXVcChcCgcPXcyOcDRcDScDTctDctDctDctDcDUcDVcDWcDUctIcDXctIcDYcDZctIcEacEbcEccEccEdcEecEactOcEfcEgcEhcEictOcEjcEjcEjcEkcEjcBbcBbcBbcqmcoVcqocoVaaaaaaaaactUctUcElcCEcuhcuhcEmcEncEocEocEpcEqcErcEscEtcEucErcEvcEwcExcExcEycEzcBrcBrcCWcEAcgwcgwaaaaaaaaacpkcsDcEBcuucuucECcEDcEEcxZcEFcEGcEHcuzcEIcEJcEKcELcEMcENcEOcEPcEQcERcEScETcuGcEUcEVcEWcEXcEYcuGcDOcFacFbcwAcFccFdcFecwEcFfcFgcFhcFicFjcAmcFkcFlcFmcAscAscAsaafaafaafabcaafaaaaaaaagaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacDHcFncFocFpcFqcDHcDHcDHcMXcEZcDPcFtcyOcyOcyOcyOcGTcFvcFwcFxcDUcFycFzcFAcFBcFCcFDcFEcFFctIcFGcFHcFIcFJcFKcFLcFMctOcxpcFNcxpcFOctOcFPcFQcFRcFScEjcoVcoVcFTcoVcoVcFUcoVaaaaaaaaaaaactUctUcElcCEcsjcFVcFWcFXcFYcsjcFZcGacGbcskcGccGacGdcjDcGecGfcGgcGhcjDcCWcEAcgwcgwaaaaaaaaaaaacpkcsDcGicGjcGkcGlcGmcGncGocGpcGqcGrcuzcGscuzcuzcGtcGucGtcuycuEcGvcuEcGwcuEcuGcwwcGxcGycwwcuGcuGcGzcGAcFrcwAcwEcGCcwEcwEcFfcFgcFhcGDcGEcAmcGFcGGcGHcAsaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacDHcFncFocFpcFqcDHcDHcDHcMXcEZcDPcFtcyOcyOcyOcyOcGTcFvcFwcFxcDUcFycFzcFAcFBcFCcFDcFEcFFctIcOlcFHcFIcFJcFKcFLcFMctOcxpcFNcxpcFOctOcFPcFQcFRcFScEjcoVcoVcFTcoVcoVcFUcoVaaaaaaaaaaaactUctUcElcCEcsjcFVcFWcFXcFYcsjcFZcGacGbcskcGccGacGdcjDcGecGfcGgcGhcjDcCWcEAcgwcgwaaaaaaaaaaaacpkcsDcGicGjcGkcGlcGmcGncGocGpcGqcGrcuzcGscuzcuzcGtcGucGtcuycuEcGvcuEcGwcuEcuGcwwcGxcGycwwcuGcuGcGzcGAcFrcwAcwEcGCcwEcwEcFfcFgcFhcGDcGEcAmcGFcGGcGHcAsaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacFpcGIcFpcGJcGKcGLcDHcGMcGBcLFcFscGPcGQcGRcGScGTcFucGUcGVcFxcDUcGWcGXcGYcGZcHacDUcHbcHccHdcHecHfcHgcHgcHhcHicHjcHkcHlcHmcHncHocEjcHpcHqcHrcHscEjcHtcHucBbcHvcHwcHxcoVaaaaaaaaaaaaaaactUctUcHycHzcHycHAcHBcHCcHDcHDcHEcslcskcslcHEcHFcHFcHGcHHcHIcHJcHKcHJcgwcgwaaaaaaaaaaaaaaacpkcHLcHMcGjcHNcHOcHPcHQcHRcHScHTcHUcHVcHWcHXcHYcHZcIacHUcIbcIccIdcIecIfcIgcIhcIicIjcIkcIlcImcIncIocIpcIqcIrcIscItcIucIvcIwcIxcIycIzcIAcAmcAmcIBcAmcAsaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaagaafaafaafaagaadaadaadaadaadaadaagaaaaaaaaacFpcICcIDcIEcGKcIFcIGcIHcGNcKtcIJcIKcGQcGRcGScGTcGTcILcIMcFxcDUcINcIOcIPcIQcIRcIScITcIUcIVcIWcIXcIVcIVcIYcIZcJacJbcJccITcJdcJecJfcJgcJhcJicJjcJkcHtcHucBbcFUcBbcJlcoVaaaaaaaaaaabaaaaaactUctUcqpcJmcJncJocJpcHDcsicJqcslcskcslcJrczBcHFcJscJtcJucJvchZcgwcgwaaaaaaaabaaaaaaaaacpkcJwcJxcGjcGkcJycJzcJAcJBcJCcJDcJEcJFcJGcJHcJIcJJcJIcJEcJKcJLcJMcJNcJOcJPcJQcJRcJScJTcJUcJVcJWcJXcJYdUUcKacJXcKbcJXcKccJXcKdcKecKfcKgcKhcKicKjcKkcKlaaaaaaaabaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaacDHcKmcKncKocGKcKpcDHcKqcKrcGOcKscKtcKucKtcKucKvcKwcKxcIMcIMcDUcKycKzcKzcKAcKBcKCcHgcKDcHgcKEcHgcHgcHgcKDcKFcKGcKGcKGcKGcKGcKGcKHcKIcKJcKKcKLcEjcHtcHucBbcKMcKNcKNcKNcKNcKNaaaaaaaaaaaaaaaaaacqpcqpctUctUctUcqpcqpcqpcKOcKPcKQcqpchZchZcgwcgwcgwchZchZaaaaaaaaaaaaaaaaaacKRcKRcKRcKRcKScKTcKTcIIcKVcKTcKWcKXcKYcKXcKZcLacLbcLccLdcLccLbcLbcLbcLecLfcLgcLbcLhcLicLjcLkcLjcLhcLhcLlcLmcLncLmcLlcAjcLocLpcLqcLrcAjcLscLtcLucLvcLwcLxcLyaaaaaaaaaaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafcLzcLAcDHcLBcLCcLDcDHcKqcLEcLFcLGcLHcLIcLJcLKcLLcGTcLMcIMcIMcDUcLNcLOcKzcLPcLQcDUcLRcLScHgcLTcLUcLUcLUcLScLVcKGcLWcLWcLWcLWcLWcLXcLYcLYcLZcLYcoVcoVcoVcBbcFUcKNcMacMbcMccKNcKNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactUcMdcMecMfcMgcMhctUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKRcKRcMicMjcKRcMkcKVcMlcMmcMncKTcMocMpcMqcMrcMscKZcMtcMucMvcMwcMxcLbcMycMzcMAcMBcMCcLhcMDcMEcMFcMGcMHcMIcMJcMKcMLcMMcMNcMOcMOcMOcMOcMOcMOcMPcMQcMRcMScMTcMUcMVaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaacMWcDHcFpcFpcDHcDHcMXcMYcMYcMXcMZcNacMXcMXcLLcGTcIMcIMcIMcDUcNbcNccNdcNecNfcDUcNgcHgcHgcNhcNicHgcHgcHgcNjcNkcLWcLWcLWcLWcLWcLXcNlcNmcNncLYcNocQkcoVcBbcNqcNrcNscNscNtcNucKNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactUcNvcNwcNxcNycNzctUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKRcNAcNBcNCcKRcNDcKVcNEcNFcNGcKTcNHcNIcNJcNKcNLcNMcNNcNOcNPcNQcNRcLccNScNTcNUcNVcNWcNXcNYcNZcOacObcOccLhcOdcOecOfcOgcOhcMOcOicOjcOkcOlcMOcOmcOncLucOocOpcOqcLyaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacMXcOrcOscOtcMXcLLcGTcIMcIMcIMcDUcDUcDUcDUcDUcDUcDUcOucOvcHgcHgcOwcOwcOwcHgcOxcOycLWcLWcLWcLWcLWcLXcOzcOAdUVcLYcOCcBbcODcOEcOFcKNcOGcOHcOIcOJcKNcoVcoVcoVcoVczlczlczlcoVcoVcoVcoVcoVcOKcOLcMfcOMcOKcpkcpkcpkcpkcpkczCczCczCcpkcpkcpkcpkcKRcONcOOcOPcKRcOQcKVcORcOScOTcKTcOUcOVcOWcOXcOYcKZcOZcPacPbcPccPdcLfcNScNTcPecPfcPgcPhcPicPjcPkcPlcPmcLhcPncPocPpcPqcPrcMOcPscPtcPtcPucMOcPvcPwcPxcPycPzcPAcKlaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacMXcPBcPCcPDcMXcLLcGTcGTcPEcIMcFucFucIMcIMcIMcPFcGTcEacPGcEacEacPHcPIcPJcPKcPLcPMcLWcLWcLWcLWcLWcLXcPNcPOcPPcLYcPQcPRcoVcPScPTcKNcKNcKNcKNcKNcKNcPUcPVcPWcQZcPYcPZcQacQacQacQacQacQacQbcQccQdcQecQfcQgcQgcQgcQgcQgcQgcQhcQicpkcQjcSpcQlcKRcQmcOOcQncKRcQocKVcKVcQpcKVcKTcQqcQrcQscQtcQucKXcQvcQwcQxcQycPdcLccNScQzcQAcQBcQCcQDcQEcQFcQGcQHcQIcLhcLlcLlcLlcLlcLlcMOcPscQJcQKcPucMOcQLcQMcKlcKlcKlcKlcKlaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaacMWcDHcFpcFpcDHcDHcMXcMYcMYcMXcMZcNacMXcMXcLLcGTcIMcIMcIMcDUcNbcNccNdcNecNfcDUcNgcHgcHgcNhcNicHgcHgcHgcNjcNkcLWcLWcLWcLWcLWcLXcNlcNmcNncLYcNocQkcoVcBbcNqcNrcNscNscNtcNucKNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactUcNvcNwcNxcNycNzctUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKRcNAcNBcNCcKRcNDcKVcNEcNFcNGcKTcNHcNIcNJcNKcNLcNMcNNcNOcNPcNQcNRcLccNScNTcNUcNVcNWcNXcNYcNZcOacObcOccLhcOdcOecOfcOgcOhcMOcOicOjcOkcPucMOcOmcOncLucOocOpcOqcLyaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacMXcOrcOscOtcMXcLLcGTcIMcIMcIMcDUcDUcDUcDUcDUcDUcDUcOucOvcHgcHgcOwcOwcOwcHgcOxcOycLWcLWcLWcLWcLWcLXcOzcOAdUVcLYcOCcBbcODcOEcOFcKNcOGcOHcOIcOJcKNcoVcoVcoVcoVczlczlczlcoVcoVcoVcoVcoVcOKcOLcMfcOMcOKcpkcpkcpkcpkcpkczCczCczCcpkcpkcpkcpkcKRcONcOOcOPcKRcOQcKVcORcOScOTcKTcOUcOVcOWcOXcOYcKZcOZcPacPbcPccPdcLfcNScNTcPecPfcPgcPhcPicPjcPkcPlcPmcLhcPncPocPpcPqcPrcMOcPscPtcPtcSLcMOcPvcPwcPxcPycPzcPAcKlaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacMXcPBcPCcPDcMXcLLcGTcGTcPEcIMcFucFucIMcIMcIMcPFcGTcEacPGcEacEacPHcPIcPJcPKcPLcPMcLWcLWcLWcLWcLWcLXcPNcPOcPPcLYcPQcPRcoVcPScPTcKNcKNcKNcKNcKNcKNcPUcPVcPWcQZcPYcPZcQacQacQacQacQacQacQbcQccQdcQecQfcQgcQgcQgcQgcQgcQgcQhcQicpkcQjcSpcQlcKRcQmcOOcQncKRcQocKVcKVcQpcKVcKTcQqcQrcQscQtcQucKXcQvcQwcQxcQycPdcLccNScQzcQAcQBcQCcQDcQEcQFcQGcQHcQIcLhcLlcLlcLlcLlcLlcMOcPscQJcQKcSLcMOcQLcQMcKlcKlcKlcKlcKlaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaafaaaaaaaaaaaacMXcQNcQNcMXcMXcLLcIMcGTcGTcFucFucGTcGTcGTcGTcGTcGTcQOcQOcQOcEacEacEacEacQPcQQcKGcLWcLWcLWcLWcLWcLXcLYcKUcLYcLYcoVcoVcoVcQScQTcQUcHwcQVcQWcQXcHwcQacQYdFLcRacRbcRccPUcAYcPUcPUcRdcRecoVcRfcRgcRhcpkcRicRjcRicRkcRlcRmcRncQocRmcsFcsFcRocKRcKRcRpcKRcKRcQocpkcGjcRqcRrcLacRscRtcRucRvcRwcKZcRxcRycRzcRAcRBcLbcRCcRDcREcRFcRGcRHcRIcRJcRKcRLcRMcRNcROcRPcRQcRRcRScMOcRTcRUcPtcRVcMOcRWcRXcpwaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaadaadaaaaaaaaacMXcRYcRZcSacMXcSbcKvcSccSdcSecSfcSgcShcIMcSicIMcSjcSkcSkcSkcSlcSmcSmcEacEacEacKGcKGcKGcKGcKGcKGcKGcQOcSncQOcGTcSocGTdTdcBbcFUcBbcSqcSrcPScSscBbcPUcPUcRdcPUcPUcStcAYcSucSvcSwcSucSucSucSxcSycSzcSAcSAcSAcSAcSAcSAcSAcSBcSCcSDcSDcSDcSEcSFcSGcSHcSDcSDcSIcSJcSKcSLcSMcLacLacLacLacLacLacLacSNcLbcLbcLbcSOcLbcSPcSQcSRcSScSPcLhcSTcLhcLhcLhcMIcSUcSVcSWcSXcSYcSZcTacPtcTbcTccTdcTecTfcTgcpwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaadaadaaaaaaaaacMXcRYcRZcSacMXcSbcKvcSccSdcSecSfcSgcShcIMcSicIMcSjcSkcSkcSkcSlcSmcSmcEacEacEacKGcKGcKGcKGcKGcKGcKGcQOcSncQOcGTcSocGTdTdcBbcFUcBbcSqcSrcPScSscBbcPUcPUcRdcPUcPUcStcAYcSucSvcSwcSucSucSucSxcSycSzcSAcSAcSAcSAcSAcSAcSAcSBcSCcSDcSDcSDcSEcSFcSGcSHcSDcSDcSIcSJcSKcVacSMcLacLacLacLacLacLacLacSNcLbcLbcLbcSOcLbcSPcSQcSRcSScSPcLhcSTcLhcLhcLhcMIcSUcSVcSWcSXcSYcSZcTacPtcTbcTccTdcTecTfcTgcpwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfGaafaafaafaafaaaaaaaaacMXcMXcSbcKucKucKucThcTicTicTicTjcTicTicTicTkcKucKucKucKucThcKucKucKucKucKucKucKucKucTlcTmcTncTocTpcKucTqcTrcTscTtcTucTucTucTucTucTucTucSucSucSucSucSucSucSucTvcTwcTxcTycSucTzcTAcTBcSAcTCcTDcTEcTFcTGcSAcTHcsFcsEcsFcsFcTIcTJcTJcTJcTJcTJcTJcTKcTLcsFcTMcTNcTOcTPcTQcTQcTRcTScTTcTUcTVcTWcTXcSRcTYcTZcUacUbcUccSRcUdcTWcTVcTUcUecSUcUfcUgcUhcUicUjcMOcUkcUlcUmcUncUocUpcUqcpwaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaacMXcMXcMYcMYcMYcMXcMXcMXcMYcMYcMYcMXcMXcMXcMXcMXcMXcMXcMXcIMcIMcIMcIMcIMcIMcIMcIMcIMcIMcIMcMXcMXcMXcMXcUrcUscUtcTucUucUvcUwcUxcUycTucUzcUAcUBcUCcUDcUEcUFcUGcUGcUHcUIcSucUJcUKcULcUMcUNcUOcUPcUQcURcSAcUScUTcpkcUUcUVcRmcTJcUWcUXcUYcUZcVacsFcTLcVbcVccVdcVecVfcVgcVhcGjcTScVicUacVjcVkcVlcSRcVmcVncVocVpcVqcSRcVrcVkcVjcUacVscSUcSUcSUcSUcVtcSUcMOcMOcMOcMOcMOcMOcVucVvcVwaafaafaafabcaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacMXcMXcVxcVycVzcVAcVBcVCcVDcVEcVFcMXcMXaaaaaaaaaczlcVGcVHcTucTucTucVIcVJcVKcTucVLcVMcVNcVOcVPcVQcSucVRcVScVTcVUcSucVVcVWcVXcSAcVYcVZcWacWbcWccSAcWdcWecTJcTJcTJcTJcTJcWfcWgcWhcWicWjcqMcWkcWlcWmcWmcWlcWncWocWpcWqcWrcWscWtcWucWvcWwcWxcWycWzcWAcWycWycWxcWAcWBcWCcWycWDcWEcQRcWGcWHcWIcWJcWKcWLcWMcWNcWOcWPcWQcWRcWSaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaagaadaadaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaacMXcMXcMXcMYcMYcMYcMYcMYcMXcMXcMXaaaaaaaaaaaaczlcWTcWUcTucWVcWWcWXcWYcWZcTucXacXbcXccXdcXecXfcSucSucXgcSucSucSucXhcUKcXicSAcSAcXjcXkcXlcXmcSAcXncXocXpcXqcXrcXscTJcXtcXucXvcXwcTJcXxcQocXycXzcXAcXBcXCcXCcXDcGjcTScXEcXFcXGcXHcXIcXJcXKcXLcXMcXNcXKcXOcXPcXQcXRcXScXTcXUcWFcXWcXXcXYcXZcYacYbcYccYdcYecYfcYgcYhcYiaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaacMXcMXcMYcMYcMYcMXcMXcMXcMYcMYcMYcMXcMXcMXcMXcMXcMXcMXcMXcIMcIMcIMcIMcIMcIMcIMcIMcIMcIMcIMcMXcMXcMXcMXcUrcUscUtcTucUucUvcUwcUxcUycTucUzcUAcUBcUCcUDcUEcUFcUGcUGcUHcUIcSucUJcUKcULcUMcUNcUOcUPcUQcURcSAcUScUTcpkcUUcUVcRmcTJcUWcUXcUYcUZcVYcsFcTLcVbcVccVdcVecVfcVgcVhcGjcTScVicUacVjcVkcVlcSRcVmcVncVocVpcVqcSRcVrcVkcVjcUacVscSUcSUcSUcSUcVtcSUcMOcMOcMOcMOcMOcMOcVucVvcVwaafaafaafabcaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacMXcMXcVxcVycVzcVAcVBcVCcVDcVEcVFcMXcMXaaaaaaaaaczlcVGcVHcTucTucTucVIcVJcVKcTucVLcVMcVNcVOcVPcVQcSucVRcVScVTcVUcSucVVcVWcVXcSAcXjcVZcWacWbcWccSAcWdcWecTJcTJcTJcTJcTJcWfcWgcWhcWicWjcqMcWkcWlcWmcWmcWlcWncWocWpcWqcWrcWscWtcWucWvcWwcWxcWycWzcWAcWycWycWxcWAcWBcWCcWycWDcWEcQRcWGcWHcWIcWJcWKcWLcWMcWNcWOcWPcWQcWRcWSaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaagaadaadaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaacMXcMXcMXcMYcMYcMYcMYcMYcMXcMXcMXaaaaaaaaaaaaczlcWTcWUcTucWVcWWcWXcWYcWZcTucXacXbcXccXdcXecXfcSucSucXgcSucSucSucXhcUKcXicSAcSAdbNcXkcXlcXmcSAcXncXocXpcXqcXrcXscTJcXtcXucXvcXwcTJcXxcQocXycXzcXAcXBcXCcXCcXDcGjcTScXEcXFcXGcXHcXIcXJcXKcXLcXMcXNcXKcXOcXPcXQcXRcXScXTcXUcWFcXWcXXcXYcXZcYacYbcYccYdcYecYfcYgcYhcYiaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaabaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacUrcVGcVHcTucTucTucTucYjcTucYkcYlcYlcYmcYlcYlcYncYocYpcYqcYrcYscYtcYucUKcYvcYwcYxcYycYzcYAcYBcYCcYDcYEcYFcYGcYHcYIcTJcTJcTJcYJcTJcTJcpkcYKcYLcYMcYNcYOcTRczCczCcTRcTScTScYPcYQcYRcYScYRcSPcYTcYUcYVcSPcYWcYXcYYcYZcYYcZacZbcZbcZbcZccZdcZccZecZfcZgcZfcZhcZicZjcZicWSaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaagaadaadabcaagaagaadaadaadaadaafaaeaaaaafaagaadaadaadaadaadaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacUrcUscZkcZlcZmcZncSucZocTwcZpcZqcZqcZrcZqcZqcZscTwcZtcZucZvcZwcYtcZxcZycZzcZAcZBcZCcXocZDcZEcXocZFcZGcZHcZIcZJcZKcZLcZMcZNcZOcZPcTJcZQcZRcZScZTcZTcTRaaaaaaaafaaaaaaaaacYPcZUcZVcZWcZXcZYcZYcZZcZYcZYdaadabdacdaddaedafdagdahcZbdaidajdakcZedaldamdancZhcWScYicWScVwaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacUrcUrdaodapdaqdaqdaqdardasdatdatdaudatdavdatdawdaxdaydazdaAdazdaBdaCdaDdaEdaFdaGdaHdaIdaJdaKdaJdaJdaLdaMdaNdaOdaPdaQdaRdaQdaQdaSdaTcTJdaUcZRdaVdaWdaXdaYaaaaaaaafaaaaaaaaacYPdaZdbadbbdbcdbddbedbfdbgdbhdbidbjdbkdblcYYdbmdbndbocZbdbpdbqdbrcZedbsdbtdbucZhaaaaaaaaaaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafabcaagaadaafaaaaaaaaaaadaadaadaaaaaaaaaaaacUrdbvdbwdbxdbydbzdbAcSudbBdbCdbDdbEdbFcTwcTwcZocTwdbGcTwdbHcTwdbIdbJdbKcUKcULdbLdbMdbNdbOcXodbPdbOcZFdbQdbRcZKcZJdbSdbTdbUdbVdbWdbXcTJdbYdbZdaVaaaaaaaaaaaaaaaaafaaaaaaaaacYPdcadcbdccdcddbddcedcfdcgdbhdchdcidcjdckcYYdcldcmdcncZbdcodcpdcqcZedcrdcsdctcZhaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafabcaagaadaafaaaaaaaaaaadaadaadaaaaaaaaaaaacUrdbvdbwdbxdbydbzdbAcSudbBdbCdbDdbEdbFcTwcTwcZocTwdbGcTwdbHcTwdbIdbJdbKcUKcULdbLdbMddDdbOcXodbPdbOcZFdbQdbRcZKcZJdbSdbTdbUdbVdbWdbXcTJdbYdbZdaVaaaaaaaaaaaaaaaaafaaaaaaaaacYPdcadcbdccdcddbddcedcfdcgdbhdchdcidcjdckcYYdcldcmdcncZbdcodcpdcqcZedcrdcsdctcZhaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaacUrdcudcvdcwdcxdcydcycSudczdcAdbDdcBdcCdcDcTwdcEdcFdbGdcGdcHdcIdbIdcJdcKdcLdcMcYwdcNdcOdcPdcQdcRdcPcZFdbQdUWdcTcZJdcUdcVdcWcZKdbWdcXcTJdcYdcZdaVaaaaaaaaaaaaaaaaafaaaaaaaaacYPddaddbddcddddbdddeddfdcgdbhddgddhddiddjcYWddkddkddkddkddlddmddlddnddoddpddocZhaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaadaafaafaafcUrddqddrddrddrddrddrddrddrddrddsddrddrddrddtdducSuddvcZtddwcZvddxcYtddycUKddzddAddBddCddDcXoddCddDcZFddEdbRddFddGddHddIddHddHddJddKcTJddLddMcZSaaaaaaaaaaaaaaaaafaafaafaafcYPcYPddNddOddPddQddRddSddTddQddUddVddWcYWcYWaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaagabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaadaafaafaafcUrddqddrddrddrddrddrddrddrddrddsddrddrddrddtdducSuddvcZtddwcZvddxcYtddycUKddzddAddBddCdfBcXoddCdfBcZFddEdbRddFddGddHddIddHddHddJddKcTJddLddMcZSaaaaaaaaaaaaaaaaafaafaafaafcYPcYPddNddOddPddQddRddSddTddQddUddVddWcYWcYWaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaagabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaczlddXddYddZddZddZddZddZddZddZddZddZddZddYdeadebddrdeccTwdedcTwcTwcYtddycUKdeeddAdefcXocXocXocXocXocZFdegdbRcZKcZJcZKcZKcZKcZKcZKdehcTJdeidejcZSaaaaaaaaaaaaaadaagaaaaaaaaaaafcYPcYPcYPcYPddQddQddQddQddQcYWcYWcYWcYWaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczlddXdekddZddZddZddZddZddZddZddZddZddZddYdeldemddrdendeodepdeqdercSudescVWdetcYwdeudevdewdexdeydezdeAdeBdeCdeDdeEdeFdeGdeHdeIcZKdeJcTJdeKdeLcZSaaaaaaaaaaagaadaaaaaaaaaaaaaagaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaczlddXdeMddZddZddZddZddZddZddZddZddZddZddYdeNdeOddrcSucSudePcSucSucSudeQcUKdeRdeSdeTdeTdeUdeUdeUdeVdeWdeXdeTdeYdeZdeTdeUdeUdeUdeUdeTdeTdfadcZcZSaafaafaafaadaaaaabaaaaaaaaaaadaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaafaafaadaadaadaafaaeaagaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafcUrddXddYddZddZddZddZddZddZddZddZddZddZdfbdfcdfddfeddrdffdfgdfgdfhdfidfjcUKdfkdfkdeUdfldfmdfndfodfpdfqdUXdfsdftdfudfvdfwdfxdfydfzdfAdfBdaUdcZcZSaaaaaaaaaaadaaaaaaaaaaaaaaaaadaadaaaaaaaaaaafaaaaaaaaaaafaaaaadaadaafaadaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafcUrddXddYddZddZddZddZddZddZddZddZddZddZdfbdfcdfddfeddrdffdfgdfgdfhdfidfjcUKdfkdfkdeUdfldfmdfndfodfpdfqdUXdfsdftdfudfvdfwdfxdfydfzdfAdhXdaUdcZcZSaaaaaaaaaaadaaaaaaaaaaaaaaaaadaadaaaaaaaaaaafaaaaaaaaaaafaaaaadaadaafaadaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaczlddXddYddZddZddZddZddZddZddZddZddZddZdfCdfDdfEdfFdfGdfHdfIdfJdfKdfLdfMcZydfNcULdfOdfPdfQdfRdfSdfQdfTdfUdfUdfUdfVdfWdfUdfUdfXdfUdfYdeTdfZdcZdaVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaadaagaaaaadaadaadaagaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaczlddXdgaddZddZddZddZddZddZddZddZddZddZddYdgbdgcdgddgedgfdggdghcULcSzdgidgjdgkdgldgmdgndgodUYdgqdgqdgrdgqdgsdgqdgtdgudgvdgwdgxdgvdgydgzdgAdgBdaVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafcUrddXddYddZddZddZddZddZddZddZddZddZddZdfbdfcdgCdgDddrdgEdgFdgGdgHdfidgIcTAdgJdfkdeUdgKdgLdgMdgNdgOdgPdgQdgRdgSdgTdgNdgOdgUdgVdgVdgWdeTdgXdcZdaVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaczlddXdeMddZddZddZddZddZddZddZddZddZddZddYdgYdgZddrdhadhbdhadhadhadfidhcdhddhedeTdeTdhfdeTdeTdeTdeTdhgdeTdeTdeTdeTdeTdeTdeTdeTdeTdeTdeTdhhdhicZSaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaczldhkdekddZddZddZddZddZddZddZddZddZddZddYdeldhldhmdVadhodUZdVcdhrdVbcTBcTAdhtdhudhvdhwdhxdhydhzdhxdhAdhvdhBdhCdhDdhEdhFdhGdhBdhHdhIdhJdhKdhLcZSaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaczldhkddYddZddZddZddZddZddZddZddZddZddZddYdhMdhNdhmdhOdhPdhQdhRdVddhTdhUdhVdhWdhudhxdhXdhYdhZdiadibdicdhxdhBdiddiedifdigdihdhBdiidijdikdildimcZSaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaadaafaafaafcUrdhkddrddrdindiodipddrddrddrddrddrddrddrddrddrddrdVfdVedisdVgdhrdiudivcVWdiwdixdiydizdiAdhydhydiBdiCdhxdiDdiEdiFdiGdiHdiIdhBdiJdiKdikdiLdimcZSaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaczldhkddYddZddZddZddZddZddZddZddZddZddZddYdhMdhNdhmdhOdhPdhQdhRdVddhTdhUdhVdhWdhudhxdhYdibdhZdiadicdizdhxdhBdiddiedifdigdihdhBdiidijdikdildimcZSaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaadaafaafaafcUrdhkddrddrdindiodipddrddrddrddrddrddrddrddrddrddrdVfdVedisdVgdhrdiudivcVWdiwdixdiydiBdiAdhydhydjRdiCdhxdiDdiEdiFdiGdiHdiIdhBdiJdiKdikdiLdimcZSaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaacUrdhkcvwdiMdiNdiMdiOdiMdiPdiQdiRdiQdiSdiTdiUdiVdiMdiWdhadhadhadhadiXdfkcUKdiYdixdiZdjadiZdhydjbdiZdjcdjddjedjfdjfdjgdjfdjhdhBdjidjjdjkdjldjmcZSaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaacUrdhkctTdiMdjndjodjpdjqdiPdjrdiRdjsdiSdjtdjsdjsdjudjsdjsdiQdjsdjvdbKdfkcUKdjwdhudhxdhXdhYdhydhydibdicdjxdhBdiDdiDdjydiDdiDdhBdixdixdixdhhdjzdjAdjAdjAaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUrdjBdjCdiMdjDdjEdjFdjsdjGdjHdjIdjJdjIdjKdjLdjMdjNdjLdjOdjLdjLdjPdhTdhUdhVdjQdhudiZdjRdjSdjTdjTdjUdjVdjWdjXdjYdjYdjZdkadkbdkcdkddkbdkbdkedkfdkgdkhdkiaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaacUrdhkctTdiMdjndjodjpdjqdiPdjrdiRdjsdiSdjtdjsdjsdjudjsdjsdiQdjsdjvdbKdfkcUKdjwdhudhxdhYdibdhydhydicdizdjxdhBdiDdiDdjydiDdiDdhBdixdixdixdhhdjzdjAdjAdjAaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUrdjBdjCdiMdjDdjEdjFdjsdjGdjHdjIdjJdjIdjKdjLdjMdjNdjLdjOdjLdjLdjPdhTdhUdhVdjQdhudiZdjUdjSdjTdjTdnhdjVdjWdjXdjYdjYdjZdkadkbdkcdkddkbdkbdkedkfdkgdkhdkiaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUrdkjdkkdkldkmdkndkodkpdkqdkrdksdktdkudkvdjsdjsdjsdkwdiMdkxdiMdiMdiMdkycZydkzdixdkAdkBdkCdkDdkEdkFdkGdkHdkIdkJdkHdkKdkLdkMdkNdkOdkNdkNdkPdkQdkRdkSdkiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUrdkTdkUdiMdkVdkWdkXdjsdkYdjsdjsdkZdjsdkvdladlbdlcdlddkxdledlfdlgdiMdlhcUKdlidixdhudhudixdljdlkdixdlldhudixdixdlmdixdlndixdlodlpdlqdhxdlrdlsdixdjAdjAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUrcAYdltdiMdludjsdlvdjsdkYdlwdlxdlydlzdlAdlBdlCdlDdlDdlEdlFdlGdlHdiMdfkdlIdlJdlKdlLdlMdlNdlOdlPdlQdlRddzdlSdixdlTdlUdlVdixdlWdlWdlXdlYdlZdmadmbdmcdmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUrcUrcUrcUrcUrcUrcUrdmediMdiMdmfdmgdmhdkYdmidlxdmjdlzdmkdmldmjdmmdmndkxdmodmpdmqdiMdmrdmsdmtdmudmvdmwdmxdmydmzdmAdmBdmCdmDdixdixdixdixdixdixdixdixdixdmEdmFdmFdmFdmGdmGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdmHdmHdmIdmHdmHdmJdmKdmLdmMdiMdmNdmOdmOdmPdmQdiMdiMdiMdiMdiMdiMdiMdiMdiMdiMdiMdiMdmRdmSdcLdmTdmUdmUdmUdmUdmUdmUdmUdmUdmUdmUdmUdmVdmWdmVdmXdmYdmZdnadmVdnbdncdmFdnddnednfaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdnhdnhdnhdnidnidmKdnjdnkdnkdnldnkdnmdnndnodnpdnqdnrdnsdntdnudnvdnwdnxdnydnzdnAdnBdfkcUKdnCdmUdnDdnEdnFdnGdnHdnIdmUdnJdnKdmUdmXdmXdmXdmXdmXdmXdmXdmXdnLdnMdnNdnMdnOdnfaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdrgdrgdrgdnidnidmKdnjdnkdnkdnldnkdnmdnndnodnpdnqdnrdnsdntdnudnvdnwdnxdnydnzdnAdnBdfkcUKdVAdmUdnDdnEdnFdnGdnHdnIdmUdnJdnKdmUdmXdmXdmXdmXdmXdmXdmXdmXdnLdnMdnNdnMdnOdnfaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmIdnPdnQdnRdnRdnSdmIdnTdnUdnVdnWdnXdnYdnZdoadobdocdoddoedofdogdohdoidojdokdoldomdomdomdondoodopdmUdmUdmUdoqdordosdotdoudovdowdmUdoxdoydozdoAdoBdoCdoDdmXdnbdnMdmFdoEdoFdnfaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdoGdoHdoHdoIdoJdoKdoLdoMdoNdoOdoPdoQdoRdoPdoPdoOdoSdoTdoUdoVdoWdoXdoYdoZdpadpbdoYdfkdpcdpddmUdpedpfdpgdphdpidpjdmUdpkdnKdmUdpldpmdpndpodppdpqdprdmXdnbdpsdmFdmFdmGdmGaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdptdoHdoHdoIdoJdoKdoLdpudpvdoOdpwdpxdpydpzdpAdoOdpBdpBdpCdpBdpDdpEdpFdpGdpFdpHdpIdpJdpcdpKdmUdmUdmUdmUdpLdmUdmUdmUdmUdmUdmUdpMdpmdpndpNdpOdpmdpPdmXdpQdnMdVtdpRdmGaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmIdpSdpTdpUdpUdnSdmIdmKdpVdpudpWdoPdpXdpYdpZdpXdpXdqadqbdqcdqddqcdqedpEdqfdqgdqhdpFdqidfkdpcdqjdqkdqldqmdqndqodqpdqqdqrdqsdqtdqudqvdqvdqvdqwdqxdqxdqydqzdqAdqBdnMdqCdnfaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdqDdqDdqDdnidnidmKdqEdpudqFdoPdqGdqHdqIdqJdqKdoOdqLdqMdqNdqcdqOdpEdqPdqQdqRdpFdqidfkdqSdqjdqkdqldqTdqUdqUdqVdqWdqUdqXdqUdqYdqZdradrbdqYdqUdrcdqUdmXdrddrednMdrfdnfaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdmHdmHdmIdmHdmHdrgdmKdrhdridrjdoOdrkdrldrmdrndrodoOdrpdrqdrrdqcdrsdpEdrtdrudrvdrwdrxdfkdrydrzdrAdrBdrCdrDdrEdqUdqWdrFdrGdrGdrHdrGdrIdrIdrJdrIdrIdmXdmXdrKdrLdnMdrMdnfaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdmHdmHdmIdmHdmHdxodmKdrhdridrjdoOdrkdrldrmdrndrodoOdrpdrqdrrdqcdrsdpEdrtdrudrvdrwdrxdfkdrydrzdrAdrBdrCdrDdrEdqUdqWdrFdrGdrGdrHdrGdrIdrIdrJdrIdrIdmXdmXdrKdrLdnMdrMdnfaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmKdmKdmKdmKdmKdmKdmKdrNdrOdpWdoPdrPdrQdrRdrSdrTdoOdrUdqcdrVdrWdrXdpEdrYdrZdsadpFdqidfkcUKdsbdscdsddqTdsedsfdqUdqWdsgdrGdshdsidsjdrIdskdsldsmdrIdsndmXdsodspdmGdmGdmGaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmKdsqdsrdqFdoPdssdpxdssdstdsudoOdsvdqcdswdqcdsxdpEdsydszdsAdpFdsBdsCcTAdsDdscdsEdsFdsGdsHdqUdsIdsJdrGdsKdsLdsMdrIdsNdsOdsPdrIdsQdmXdsRdsSdmGaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsTdsTdsTdsTdsTaaaaaaaaaaaaaaaaaadmKdsUdsVdoXdoOdsWdsXdsYdssdsZdtadtbdtcdtddtcdtedpEdpEdpEdpEdtfdtgdthdtidtjdtgdtkdtldtmdsHdtndqUdsJdrGdtodtpdtqdrIdtrdtsdttdrIdsndmXdtudtvdmGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11038,15 +11044,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsTdsTdsTaaaaaaaaadsTdsTdsTaaaaaaaaaaaadvjdwsdwwdvjaaaaaaaafaaadvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaafaaaaaadvkdwxdvwdvxdvkaaaaaaaafaaadwldwldwldwldwldwldwlaaaaaaaaaaafaaaaaadvodwydwvdvoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsTdsTaaaaaaaaaaaaaaadsTdsTaaaaaaaaaaaaduUdwzdwAduUaaaaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaaaaduYdwBdwCdwDduYaaaaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaaaaadvedwEdwFdveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaadwGduUduUduUduUdwHdwIdwhdwJdwKdwLdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdwMdwNdwOdwPdwQdwRdwSdvkdVjdVjdVkdwldwldwldwldwldwldwldwldwlaaaaaadVndVldVmdwXdwYdwZdvedvedvedvedxaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdxbdxcdxddxedxfdxgdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxhdxidxjdxkdxldvwdxmdxndxodxpdxqdwldwldwldwldwldwldwldwldwlaaaaaadxrdxsdxtdxudxvdxwdveaaaaaaaaaaaadxxdxxaaaaaaaaaaaaaaadxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdxbdxcdxddxedxfdxgdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxhdxidxjdxkdxldvwdxmdxndzldxpdxqdwldwldwldwldwldwldwldwldwlaaaaaadxrdxsdxtdxudxvdxwdveaaaaaaaaaaaadxxdxxaaaaaaaaaaaaaaadxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdwsdxydxddxzdxAdxBdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxCdxDdxEdxkdxFdxGdxHdxIdxJdxKdxLdwldwldwldwldwldwldwldwldwlaaaaaadxMdxNdxOdxudxPdwvdvoaaaaaaaaaaaadxxdxxdxxaaaaaaaaadxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQaaaaaaaaaaaadvjdvjdxRdxSdwhdxTdxUdvDdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxVdxWdxXdwPdxYdxZdyadvkdvkdVjdVjdwldwldwldwldwldwldwldwldwlaaaaaadvNdVodycdyddyedyfdvodvoaaaaaaaaadxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdygdyhdVpdwhdyjdwjdwkdykduUaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaduYdyldvxdvwdvxdymduYaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaadvedyndwmdwndyodwpdVqdyqdvNdxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdyrdysdytdyudyvdvUdwtdywduUaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaduYdyxdvxdyydvxdyzduYaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaadvedyAdwudvZdyBdyCdyDdyEdyFdxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdvDdvDdvDdvjdyGdyHdyIdyJduUaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaduYdyKdvxdyLdyMdyNduYaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaadvedyOdyPdyQdyRdvodvNdvNdvOdxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQaaaaaaaaaaaadvjdvjdySdyTdwhdwJdwKdvDdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxVdwNdwOdwPdyUdyVdyWdvkdvkdVjdVjdwldwldwldwldwldwldwldwldwlaaaaaadvNdVldVmdwXdyXdyYdvodvoaaaaaaaaadxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdwsdyZdzadzbdzcdzddvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdzedzfdzgdzhdxFdzidzjdzkdzldzmdzndwldwldwldwldwldwldwldwldwlaaaaaadzodzpdzqdzrdzsdwvdvoaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdwsdztdzadzudzvdzwdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdzxdzydzzdzhdzAdzBdzCdzDdzEdzFdzGdwldwldwldwldwldwldwldwldwlaaaaaadzHdzIdzJdzrdzKdwvdveaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdwsdyZdzadzbdzcdzddvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdzedzfdzgdzhdxFdzidzjdzkdzDdzmdzndwldwldwldwldwldwldwldwldwlaaaaaadzodzpdzqdzrdzsdwvdvoaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdwsdztdzadzudzvdzwdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdzxdzydzzdzhdzAdzBdzCdCPdzEdzFdzGdwldwldwldwldwldwldwldwldwlaaaaaadzHdzIdzJdzrdzKdwvdveaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaadwGduUduUduUduUdzLdzMdwhdxTdxUdwLdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdwMdxWdxXdwPdzNdyVdzOdvkdVjdVjdVkdwldwldwldwldwldwldwldwldwlaaaaaadVndVodVrdwXdzPdzQdvedvedvedvedxaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdzRdzSduUaaaaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaaaaduYdzTdzUdzVduYaaaaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaaaaadvedzWdzXdveaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdzYdzZdvjaaaaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaaaadvudAadAbdvxdvuaaaaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaaaaadvodAcdAddvoaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11203,7 +11209,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaafaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBPdBcdBcdBQdBRdBSdBTdBUdBVdBWdBXdBYdBZdCadBcdBcdCbdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBraaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaadBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaadaadaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdCcdCcdCcdCcdCcdCcdAVdAVdAVdAVdAVdAVdAVdBcdBcdBcdBIdBJdBKdBLdCddBLdCedBmdBNdBcdBcdBcdAVdAVdAVdAVdAVdAVdAVdCfdCfdCfdCfdCfdCfdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaagaafaaaaafaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdAVdAVdAVdAVdAVdCgdChdChdChdChdCidCjdCkdCldCmdCcdAVdAVdAVdAVdAVdCndCodCodCpdCpdCqdCrdCsdBLdBLdBLdBAdCtdCudBcdBcdAVdAVdAVdAVdAVdAVdAVdAVdCfdCvdCwdCxdCydCzdCAdCAdCAdCAdCBdAVdAVdAVdAVdAVdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdCDdAVdCEdCEdCEdCgdCFdCGdCHdCIdCJdCldCldCldCKdCcdAVdAVdAVdAVdAVdCLdAVdAVdBcdBcdBcdCMdCNdCOdCPdCOdCQdCRdBcdBcdBcdAVdAVdAVdAVdAVdAVdAVdAVdCfdCSdCTdCUdCUdCVdCWdCXdCYdCZdCBdDadDadDadAVdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdCDdAVdCEdCEdCEdCgdCFdCGdCHdCIdCJdCldCldCldCKdCcdAVdAVdAVdAVdAVdCLdAVdAVdBcdBcdBcdCMdCNdCOdIqdCOdCQdCRdBcdBcdBcdAVdAVdAVdAVdAVdAVdAVdAVdCfdCSdCTdCUdCUdCVdCWdCXdCYdCZdCBdDadDadDadAVdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaafaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdDcdDddDddDddDedDddDddDddDedDddDddDddDedDddDddDddDedDddDddDddDedDddDddDfdDgdDhdDidDjdDkdDldDmdDndDodDpdDqdDrdDsdDtdCcaaaaaaaaaaaaaaadDuaaaaaadBcdBcdBcdBjdDvdDwdDxdDydDzdBedBcdBcdBcaaaaaadDAaaaaaaaaaaaaaaadCfdDBdDCdDDdDDdDEdDFdDGdDHdDIdDJdDKdDLdDMdDNdDOdDPdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDRdDSdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdAVdCEdDTdDUdDVdDWdDXdDYdCIdDZdCldEadEbdCcdCcaaaaaaaaaaaaaaadDuaaaaaaaaaaaadBcdBcdBcdBcdEcdBcdBcdBcdBcaaaaaaaaaaaadDAaaaaaaaaaaaaaaadCfdCfdEddEedCUdEfdCWdEgdEhdEidEjdEkdEldDadAVdAVdAVdAVdEmdAVdAVdAVdEmdAVdAVdAVdEmdAVdAVdAVdEmdAVdAVdAVdEmdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEnaaaaaaaaadEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBGdEodBudAVdBGdEodBudAVdBGdEodBudAVdBGdEodBudAVdBGdEodBudAVdAVdAVdAVdAVdAVdCgdChdChdChdCcdEpdEqdCcdCcdCcaaaaaaaaaaaaaaaaaadCLdAVdAVdAVdErdErdErdErdBcdEsdEtdEudErdErdErdAVdAVdAVdAVaaaaaaaaaaaaaaaaaadCfdCfdCfdEvdEwdCfdCAdCAdCAdCBdAVdAVdAVdAVdAVdAVdBDdExdBFdAVdBDdExdBFdAVdBDdExdBFdAVdBDdExdBFdAVdBDdExdBFdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11218,15 +11224,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndE
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdGAdCldCcaaaaaadGddGBdGCdGDdGEdGFdGGdGHdGgdFpdFpdFpdGIdGJdGKdGLdGMdGNdGOdFsdFsdFsdGsdGPdGQdGRdGSdGTdGUdGVdGxaaaaaadCfdCUdGWdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdGXdGYdCcaaaaaadGddGZdHadHbdGEdHcdHddHedGgdHfdHgdHgdHhdHgdHgdHidHgdHgdHjdHgdHgdHkdGsdHldHmdHndGSdHodHpdHqdGxaaaaaadCfdHrdHsdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdCcdHtdEqdCcaaaaaadGddHudHvdHwdGEdHxdHydHzdGgdHAdHBdHCdHDdHEdHFdHGdHEdHEdHHdHIdHBdHAdGsdHJdHKdHLdGSdHMdHNdHOdGxaaaaaadCfdEvdHPdCfdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdHQdHQdHRdHSdHTdHUdHVdHWdHXdHYdHYdGddHZdIadIbdGgdIcdGEdGEdIddHAdHCdIedIedIedIedIedIedIedIedIedIfdHAdIgdIhdIidGSdGsdIjdIkdIldGxdImdImdIndIodIpdIqdIrdIsdItdIudIudAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdHQdHQdHRdHSdHTdHUdHVdHWdHXdHYdHYdGddHZdIadIbdGgdIcdGEdGEdIddHAdHCdIedIedIedIedIedIedIedIedIedIfdHAdIgdIhdIidGSdGsdIjdIkdIldGxdImdImdIndIodIpdKwdIrdIsdItdIudIudAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdIvdIwdIxdIydIzdIAdIBdICdIDdIEdIFdIGdIHdIIdIJdIKdILdIMdINdIOdIPdIQdIRdIedISdISdISdISdISdIedITdIUdIVdIWdIXdIYdIZdJadJbdIYdJcdJddJedJfdIWdJgdJhdJidJjdJkdJldJmdJndAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdJodIwdJpdJqdIzdJrdJsdJtdJudJvdJwdJxdJydJzdJAdJBdJCdJDdJEdJFdJGdJHdJIdIedISdISdISdISdISdIedJIdJJdJKdJLdJMdJNdJOdJPdJOdJNdJQdJRdJOdJSdJLdJTdJUdJVdJjdJWdJXdJmdJYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdHQdHQdJZdKadKbdKcdKddKedIDdIEdKfdKgdKhdKidKfdKjdKkdKidKedIDdKldKmdIedIedISdISdISdISdISdIedIedKndKodIWdIXdKpdKqdKrdKsdKpdKtdKudKsdJfdIWdIXdKvdKwdKxdKydKzdIudIudAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdHQdHQdJZdKadKbdKcdKddKedIDdIEdKfdKgdKhdKidKfdKjdKkdKidKedIDdKldKmdIedIedISdISdISdISdISdIedIedKndKodIWdIXdKpdKqdKrdKsdKpdKtdKudKsdJfdIWdIXdKvdVwdKxdKydKzdIudIudAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdKAdKAdKBdKAdKCdKDdKEdKFdKGdKHdKHdKHdKHdKIdKJdKIdKKdKLdKMdKNdKOdKPdJHdKQdIedISdISdISdISdISdIedKQdJJdKRdKSdKTdKUdKVdKWdKXdKYdKZdLadImdImdIudLbdJhdLcdLddLedLfdLgdLfdLfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdLhdLidLjdLkdLldLmdLndKFdLodKHdLpdLqdLrdLrdLsdLtdKLdLudLvdLwdKKdLxdLydLzdIedISdISdISdISdISdIedLAdLBdLCdKWdLDdLEdLFdKVdLGdLHdLIdLadAVdAVdIudLJdJhdLKdLLdLMdLNdLOdLPdLQdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdKAdKAdKBdKAdKCdLRdLSdLTdLUdLVdKHdKHdLWdLXdLYdLZdKLdMadMbdMcdKKdMddMedIedMfdMgdMhdMidMjdIedMkdIedMldMddKWdMmdMndModKVdMpdMqdMrdLadAVdAVdMsdMtdMudMvdMwdLedLfdLgdLfdLfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdMxdMxdMxdMxdMxdMydMzdKHdMAdMBdMCdMDdMDdMEdKLdMFdMGdMHdKKdMIdMJdMKdMLdMMdMNdMNdMNdMOdMPdMQdMNdMRdKWdMSdMTdMUdKVdMVdMWdMXdLaaaaaaadMYdMZdNadMYdMYdMYdMYdMYdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNbdNcdKHdKHdKHdKHdKHdKHdKHdKKdKKdKKdKKdKKdNddNedNfdNgdNhdNhdNidNjdNkdNldNmdNndNodKWdKWdKWdKWdKWdLadLadLadLaaaaaaadMYdNpdNqdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNbdNcdKHdKHdKHdKHdKHdKHdKHdKKdKKdKKdKKdKKdNddNedNfdVBdNhdNhdNidNjdNkdNldNmdNndNodKWdKWdKWdKWdKWdLadLadLadLaaaaaaadMYdNpdNqdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNrdNsdMxaaaaaadNtdNudNvdNwdNxdNydNzdNAdNtdNBdNCdNDdNEdNFdNGdNHdNGdNEdNEdNDdNIdNJdNKdNLdNMdNNdNOdNKdNPdNQdNKaaaaaadMYdNRdNSdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaafaafaafaadaXGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNbdNTdMxaaaaaadNtdNUdNVdNWdNXdNYdNZdOadNtdObdOcdIedOddOedHBdHAdHBdOfdOgdIedOhdOidNKdOjdOkdOldOmdOndOodOpdNKaaaaaadMYdOqdOrdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNbdOsdOtaaaaaadOudNydOvdOwdOxdOydOzdOAdOBdOCdODdOEdOddOFdOGdOHdOIdHBdOJdOKdOLdOMdONdOOdOPdOQdORdNKdOSdOTdNKaaaaaadOUdOVdOWdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/southern_cross/southern_cross-3.dmm b/maps/southern_cross/southern_cross-3.dmm
index a71ef934cb..22059a006f 100644
--- a/maps/southern_cross/southern_cross-3.dmm
+++ b/maps/southern_cross/southern_cross-3.dmm
@@ -47,7 +47,7 @@
"aU" = (/obj/structure/table/steel,/obj/machinery/cell_charger,/obj/item/weapon/cell/high,/obj/effect/floor_decal/corner/brown{dir = 5},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main/storage)
"aV" = (/obj/structure/table/steel,/obj/machinery/recharger,/obj/effect/floor_decal/corner/brown/full{dir = 1},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/item/clothing/head/hardhat/orange,/turf/simulated/floor/tiled,/area/surface/outpost/mining_main/storage)
"aW" = (/obj/structure/table/steel,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/pickaxe,/obj/effect/floor_decal/corner/brown/full{dir = 8},/obj/item/device/gps/mining,/obj/item/device/gps/mining,/obj/item/device/gps/mining,/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
-"aX" = (/obj/effect/floor_decal/corner/brown{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/structure/table/steel,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
+"aX" = (/obj/effect/floor_decal/corner/brown{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/structure/table/steel,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/wrench,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
"aY" = (/obj/effect/floor_decal/corner/brown{dir = 5},/obj/structure/table/steel,/obj/item/stack/flag/green{pixel_x = -4; pixel_y = 0},/obj/item/stack/flag/red,/obj/item/stack/flag/yellow{pixel_x = 4},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
"aZ" = (/obj/structure/closet/secure_closet/miner,/obj/item/clothing/shoes/boots/winter/mining,/obj/item/clothing/suit/storage/hooded/wintercoat/miner,/obj/effect/floor_decal/corner/brown{dir = 5},/obj/item/clothing/head/hardhat/orange,/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
"ba" = (/obj/structure/table/steel,/obj/item/weapon/mining_scanner,/obj/item/weapon/mining_scanner,/obj/item/weapon/mining_scanner,/obj/effect/floor_decal/corner/brown{dir = 5},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
@@ -98,8 +98,8 @@
"bT" = (/obj/structure/ore_box,/obj/effect/floor_decal/corner/brown{dir = 10},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main/storage)
"bU" = (/obj/structure/reagent_dispensers/watertank,/obj/effect/floor_decal/corner/brown{dir = 10},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main/storage)
"bV" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/floor_decal/corner/brown{dir = 10},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main/storage)
-"bW" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe/hammer,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/weapon/shovel,/obj/effect/floor_decal/corner/brown{dir = 10},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main/storage)
-"bX" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe/hammer,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/weapon/shovel,/obj/effect/floor_decal/corner/brown{dir = 10},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main/storage)
+"bW" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe/hammer,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/crowbar,/obj/item/weapon/shovel,/obj/effect/floor_decal/corner/brown{dir = 10},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main/storage)
+"bX" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe/hammer,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/crowbar,/obj/item/weapon/shovel,/obj/effect/floor_decal/corner/brown{dir = 10},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main/storage)
"bY" = (/obj/effect/floor_decal/corner/brown{dir = 8},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
"bZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
"ca" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
@@ -117,7 +117,7 @@
"cm" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/surface/outpost/main/gateway)
"cn" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/tiled/techfloor,/area/surface/outpost/main/gateway)
"co" = (/obj/machinery/ai_status_display,/turf/simulated/wall,/area/surface/outpost/main/gateway)
-"cp" = (/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 0; pixel_y = 28},/obj/structure/table/glass,/obj/machinery/recharger,/obj/item/weapon/screwdriver,/obj/item/device/defib_kit/loaded,/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/paleblue/border{dir = 9},/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
+"cp" = (/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 0; pixel_y = 28},/obj/structure/table/glass,/obj/machinery/recharger,/obj/item/weapon/tool/screwdriver,/obj/item/device/defib_kit/loaded,/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/paleblue/border{dir = 9},/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
"cq" = (/obj/machinery/sleep_console{dir = 4},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
"cr" = (/obj/machinery/sleeper{dir = 4},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
"cs" = (/obj/structure/bed/roller,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 22},/obj/effect/floor_decal/borderfloorwhite{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
@@ -128,7 +128,7 @@
"cx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
"cy" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/corner/brown,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
"cz" = (/obj/machinery/mech_recharger,/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
-"cA" = (/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/steel,/obj/machinery/light,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
+"cA" = (/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/wrench,/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/steel,/obj/machinery/light,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
"cB" = (/obj/machinery/mech_recharger,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
"cC" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled,/area/surface/outpost/mining_main)
"cD" = (/turf/simulated/wall/r_wall,/area/surface/outpost/mining_main/refinery)
@@ -172,7 +172,7 @@
"dp" = (/obj/machinery/gateway{dir = 6},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor/tiled/techfloor,/area/surface/outpost/main/gateway)
"dq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/atm{pixel_x = 30},/turf/simulated/floor/tiled/dark,/area/surface/outpost/main/gateway)
"dr" = (/obj/machinery/computer/crew,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
-"ds" = (/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/table/glass,/obj/item/weapon/wrench,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
+"ds" = (/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/table/glass,/obj/item/weapon/tool/wrench,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
"dt" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/surface/outpost/main/first_aid)
"du" = (/obj/machinery/atmospherics/unary/cryo_cell{layer = 3.3},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/surface/outpost/main/first_aid)
"dv" = (/obj/random/maintenance/clean,/obj/random/maintenance/security,/obj/random/contraband,/obj/random/drinkbottle,/turf/simulated/floor/plating,/area/surface/outpost/mining_main/storage)
@@ -248,7 +248,7 @@
"eN" = (/obj/effect/floor_decal/industrial/warning/dust{ icon_state = "warning_dust"; dir = 4},/obj/structure/cable/heavyduty{icon_state = "1-2"},/obj/effect/overlay/snow/floor,/turf/simulated/floor/tiled/asteroid_steel,/area/surface/outside/path/plains)
"eO" = (/obj/machinery/computer/secure_data,/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/red/border{dir = 10},/turf/simulated/floor/tiled,/area/surface/outpost/main/security)
"eP" = (/obj/machinery/computer/security,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/red/border,/turf/simulated/floor/tiled,/area/surface/outpost/main/security)
-"eQ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/device/flash,/obj/item/weapon/pen,/obj/item/weapon/crowbar,/obj/machinery/light,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/red/border,/turf/simulated/floor/tiled,/area/surface/outpost/main/security)
+"eQ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/device/flash,/obj/item/weapon/pen,/obj/item/weapon/tool/crowbar,/obj/machinery/light,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/red/border,/turf/simulated/floor/tiled,/area/surface/outpost/main/security)
"eR" = (/obj/structure/closet/crate,/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/red/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/surface/outpost/main/security)
"eS" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/surface/outpost/main/security)
"eT" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/red/bordercorner,/turf/simulated/floor/tiled,/area/surface/outpost/main/security)
@@ -259,7 +259,7 @@
"eY" = (/obj/structure/closet/emcloset,/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/machinery/light_switch{pixel_x = 11; pixel_y = -24},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/blue,/turf/simulated/floor/tiled,/area/surface/outpost/main/gateway)
"eZ" = (/obj/structure/closet/l3closet/scientist,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloorwhite/corner{dir = 8},/obj/effect/floor_decal/corner/paleblue/bordercorner{dir = 8},/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
"fa" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
-"fb" = (/obj/structure/table/glass,/obj/item/weapon/crowbar,/obj/item/bodybag,/obj/item/bodybag/cryobag,/obj/effect/floor_decal/borderfloorwhite/corner,/obj/effect/floor_decal/corner/paleblue/bordercorner,/obj/item/bodybag/cryobag,/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
+"fb" = (/obj/structure/table/glass,/obj/item/weapon/tool/crowbar,/obj/item/bodybag,/obj/item/bodybag/cryobag,/obj/effect/floor_decal/borderfloorwhite/corner,/obj/effect/floor_decal/corner/paleblue/bordercorner,/obj/item/bodybag/cryobag,/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
"fc" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/adv{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/o2{pixel_x = 0; pixel_y = 0},/obj/machinery/light,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
"fd" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/fire{pixel_x = 0; pixel_y = 0},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled/white,/area/surface/outpost/main/first_aid)
"fe" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled,/area/surface/outpost/main/first_aid)
@@ -373,7 +373,7 @@
"hi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/surface/outpost/main)
"hj" = (/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/green/bordercorner,/turf/simulated/floor/tiled,/area/surface/outpost/main)
"hk" = (/obj/machinery/mech_recharger,/obj/structure/extinguisher_cabinet{pixel_x = -25},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled/steel_grid,/area/surface/outpost/main/first_aid)
-"hl" = (/obj/structure/table/steel,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool,/obj/machinery/ai_status_display{pixel_y = -32},/turf/simulated/floor/tiled/steel_grid,/area/surface/outpost/main/first_aid)
+"hl" = (/obj/structure/table/steel,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool,/obj/machinery/ai_status_display{pixel_y = -32},/turf/simulated/floor/tiled/steel_grid,/area/surface/outpost/main/first_aid)
"hm" = (/obj/machinery/mech_recharger,/turf/simulated/floor/tiled/steel_grid,/area/surface/outpost/main/first_aid)
"hn" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/paleblue/border,/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/white/bordercorner2,/obj/structure/closet/secure_closet/medical_wall{name = "O- Blood Locker"; pixel_x = 0; pixel_y = -32},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/machinery/iv_drip,/turf/simulated/floor/tiled,/area/surface/outpost/main/first_aid)
"ho" = (/obj/structure/closet/secure_closet/sar,/obj/machinery/light,/obj/item/weapon/storage/box/bodybags,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/white/border,/obj/item/roller/adv,/obj/item/weapon/storage/pill_bottle/spaceacillin,/turf/simulated/floor/tiled,/area/surface/outpost/main/first_aid)
@@ -463,7 +463,7 @@
"iU" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ icon_state = "map"; dir = 4},/turf/simulated/floor/plating,/area/surface/outpost/mining_main/gen_room)
"iV" = (/obj/machinery/light/small{dir = 4},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/surface/outpost/mining_main/gen_room)
"iW" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/highsecurity{name = "Telecommunication Hub"; req_one_access = list(10,48,65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/techmaint,/area/surface/outpost/main/telecomms)
-"iX" = (/obj/structure/table/standard,/obj/item/weapon/crowbar/red,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = 11; pixel_y = -24},/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/item/weapon/crowbar/red,/turf/simulated/floor/tiled,/area/surface/outpost/main/teleporter)
+"iX" = (/obj/structure/table/standard,/obj/item/weapon/tool/crowbar/red,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = 11; pixel_y = -24},/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/item/weapon/tool/crowbar/red,/turf/simulated/floor/tiled,/area/surface/outpost/main/teleporter)
"iY" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light,/turf/simulated/floor/tiled,/area/surface/outpost/main/teleporter)
"iZ" = (/obj/machinery/bluespace_beacon,/obj/item/device/radio/beacon,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/turf/simulated/floor/tiled,/area/surface/outpost/main/teleporter)
"ja" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/machinery/camera/network/main_outpost{c_tag = "MO - Teleporter"; dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/tiled,/area/surface/outpost/main/teleporter)
@@ -552,7 +552,7 @@
"kF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/steel_grid,/area/surface/outpost/main/garage)
"kG" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled/steel_grid,/area/surface/outpost/main/garage)
"kH" = (/obj/machinery/mech_recharger,/obj/effect/decal/mecha_wreckage/ripley,/obj/machinery/light,/turf/simulated/floor/tiled/steel_grid,/area/surface/outpost/main/garage)
-"kI" = (/obj/item/inflatable/door/torn,/obj/item/weapon/screwdriver,/turf/simulated/floor,/area/surface/outpost/main/garage)
+"kI" = (/obj/item/inflatable/door/torn,/obj/item/weapon/tool/screwdriver,/turf/simulated/floor,/area/surface/outpost/main/garage)
"kJ" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/surface/outpost/main/garage)
"kK" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/surface/outpost/main/garage)
"kL" = (/obj/structure/cable/heavyduty{icon_state = "1-2"},/obj/effect/overlay/snow/floor,/turf/simulated/floor/tiled/steel/sif/planetuse,/area/surface/outside/plains/outpost)
@@ -647,7 +647,7 @@
"mw" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/surface/outpost/main/gym)
"mx" = (/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/surface/outpost/main/gym)
"my" = (/obj/effect/floor_decal/borderfloor/corner{dir = 1},/turf/simulated/floor/tiled,/area/surface/outpost/main/gym)
-"mz" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/item/weapon/wrench,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/surface/outpost/main/gym)
+"mz" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/item/weapon/tool/wrench,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/surface/outpost/main/gym)
"mA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/surface/outpost/main)
"mB" = (/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/surface/outpost/main)
"mC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/surface/outpost/main)
@@ -658,7 +658,7 @@
"mH" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/surface/outpost/main)
"mI" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/light,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/surface/outpost/main)
"mJ" = (/obj/machinery/light/small{dir = 8; pixel_x = 0},/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/effect/overlay/snow/floor,/turf/simulated/floor/tiled/steel/sif/planetuse,/area/surface/outpost/main)
-"mK" = (/obj/structure/closet/crate,/obj/item/weapon/crowbar/red,/obj/item/frame/light,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/surface/outpost/main/construction_area)
+"mK" = (/obj/structure/closet/crate,/obj/item/weapon/tool/crowbar/red,/obj/item/frame/light,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/surface/outpost/main/construction_area)
"mL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/surface/outpost/main/construction_area)
"mM" = (/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/plating,/area/surface/outpost/main/gen_room/smes)
"mN" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 22},/turf/simulated/floor/plating,/area/surface/outpost/main/gen_room/smes)
@@ -881,7 +881,7 @@
"qW" = (/obj/structure/closet/wardrobe/suit,/obj/item/clothing/shoes/boots/winter,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/item/clothing/suit/storage/hooded/wintercoat,/turf/simulated/floor/tiled/steel_grid,/area/surface/outpost/main)
"qX" = (/obj/structure/closet/wardrobe/grey,/obj/item/clothing/shoes/boots/winter,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/extinguisher_cabinet{pixel_y = -30},/turf/simulated/floor/tiled/steel_grid,/area/surface/outpost/main)
"qY" = (/obj/machinery/mech_recharger,/turf/simulated/floor/tiled/steel_grid,/area/surface/outpost/main)
-"qZ" = (/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/steel,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/tiled,/area/surface/outpost/main)
+"qZ" = (/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/wrench,/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/steel,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/tiled,/area/surface/outpost/main)
"ra" = (/obj/machinery/mech_recharger,/obj/machinery/light,/turf/simulated/floor/tiled/steel_grid,/area/surface/outpost/main)
"rb" = (/turf/simulated/wall,/area/surface/outpost/main)
"rc" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/turf/simulated/floor/tiled,/area/surface/outpost/main)
@@ -1277,7 +1277,7 @@
"yC" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/obj/structure/extinguisher_cabinet{pixel_x = -25},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoresearch/xenoflora)
"yD" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoresearch/xenoflora)
"yE" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoresearch/xenoflora)
-"yF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/closet/crate/hydroponics{desc = "All you need to start your own honey farm."; name = "beekeeping crate"},/obj/item/beehive_assembly,/obj/item/bee_smoker,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/bee_pack,/obj/item/weapon/crowbar,/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoresearch/xenoflora)
+"yF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/closet/crate/hydroponics{desc = "All you need to start your own honey farm."; name = "beekeeping crate"},/obj/item/beehive_assembly,/obj/item/bee_smoker,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/honey_frame,/obj/item/bee_pack,/obj/item/weapon/tool/crowbar,/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoresearch/xenoflora)
"yG" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoresearch/xenoflora)
"yH" = (/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoresearch/xenoflora)
"yI" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoresearch/xenoflora)
@@ -1337,7 +1337,7 @@
"zK" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/door/window/brigdoor/westleft{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoresearch/xenobiology)
"zL" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/brigdoor/eastright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/surface/outpost/research/xenoresearch/xenobiology)
"zM" = (/obj/structure/extinguisher_cabinet{pixel_x = -25},/turf/simulated/floor/tiled/hydro,/area/surface/outpost/research/xenoresearch/xenoflora)
-"zN" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/machinery/meter,/obj/item/weapon/wrench,/turf/simulated/floor/tiled/hydro,/area/surface/outpost/research/xenoresearch/xenoflora)
+"zN" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/machinery/meter,/obj/item/weapon/tool/wrench,/turf/simulated/floor/tiled/hydro,/area/surface/outpost/research/xenoresearch/xenoflora)
"zO" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor/tiled/hydro,/area/surface/outpost/research/xenoresearch/xenoflora)
"zP" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Isolation to Waste"},/obj/effect/floor_decal/industrial/warning/full,/obj/machinery/door/window/westright{name = "Xenoflora Containment"; req_access = list(55)},/turf/simulated/floor/plating,/area/surface/outpost/research/xenoresearch/xenoflora)
"zQ" = (/obj/effect/floor_decal/corner/green{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoresearch/xenoflora)
@@ -1430,7 +1430,7 @@
"Bz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/effect/wingrille_spawn/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/surface/outpost/research/xenoresearch/xenobiology)
"BA" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/reinforced,/area/surface/outpost/research/xenoresearch/xenobiology)
"BB" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/obj/machinery/meter,/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoresearch/xenoflora)
-"BC" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/item/weapon/wrench,/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoresearch/xenoflora)
+"BC" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/item/weapon/tool/wrench,/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoresearch/xenoflora)
"BD" = (/obj/effect/floor_decal/corner/green{dir = 4},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoresearch/xenoflora)
"BE" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/syringes,/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoresearch/xenoflora)
"BF" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/reagent_containers/glass/bucket,/obj/effect/floor_decal/corner/green/full{dir = 1},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoresearch/xenoflora)
@@ -1558,7 +1558,7 @@
"DX" = (/turf/unsimulated/wall/planetary/sif{icon_state = "rock-dark"},/area/surface/outpost/wall)
"DY" = (/obj/effect/step_trigger/teleporter/wild/to_wild,/turf/simulated/shuttle/floor/voidcraft/external,/area/surface/outpost/wall)
"DZ" = (/turf/simulated/shuttle/wall/voidcraft,/area/surface/outside/lake/romsele)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacadadadabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaeaeaeababababababababab
aaafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafagafafafafafafafafafafafafafafafafahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahaiajajajahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahafafafafafafafafafafafafafafagafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafakakakafafafafafafafafaa
diff --git a/maps/southern_cross/southern_cross-4.dmm b/maps/southern_cross/southern_cross-4.dmm
index 365cd32aac..4688297ec4 100644
--- a/maps/southern_cross/southern_cross-4.dmm
+++ b/maps/southern_cross/southern_cross-4.dmm
@@ -60,7 +60,7 @@
"bh" = (/obj/effect/floor_decal/industrial/outline/grey,/obj/structure/closet/crate,/turf/simulated/floor/tiled/dark,/area/surface/outpost/research/xenoarcheology/longtermstorage)
"bi" = (/obj/effect/floor_decal/corner/purple{dir = 9},/obj/machinery/status_display{pixel_x = -32},/obj/machinery/floodlight,/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoarcheology/exp_prep)
"bj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoarcheology/exp_prep)
-"bk" = (/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoarcheology/exp_prep)
+"bk" = (/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/tool/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoarcheology/exp_prep)
"bl" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoarcheology/exp_prep)
"bm" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoarcheology/exp_prep)
"bn" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/surface/outpost/research/xenoarcheology/exp_prep)
@@ -98,7 +98,7 @@
"bT" = (/obj/effect/floor_decal/corner/purple/full,/obj/machinery/suspension_gen,/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoarcheology/exp_prep)
"bU" = (/obj/machinery/suspension_gen,/obj/effect/floor_decal/corner/purple{dir = 10},/obj/structure/extinguisher_cabinet{pixel_y = -30},/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoarcheology/exp_prep)
"bV" = (/obj/effect/floor_decal/corner/purple{dir = 10},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoarcheology/exp_prep)
-"bW" = (/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/obj/effect/floor_decal/corner/purple{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Expedition Prep"; dir = 1},/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoarcheology/exp_prep)
+"bW" = (/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/tool/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/obj/effect/floor_decal/corner/purple{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Expedition Prep"; dir = 1},/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoarcheology/exp_prep)
"bX" = (/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/item/weapon/storage/belt/archaeology,/obj/item/clothing/suit/space/anomaly,/obj/item/clothing/head/helmet/space/anomaly,/obj/item/clothing/mask/breath,/obj/structure/window/reinforced,/obj/machinery/door/window/northleft,/turf/simulated/floor/tiled/dark,/area/surface/outpost/research/xenoarcheology/exp_prep)
"bY" = (/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/weapon/storage/belt/archaeology,/obj/item/clothing/suit/space/anomaly,/obj/item/clothing/head/helmet/space/anomaly,/obj/item/clothing/mask/breath,/obj/structure/window/reinforced,/obj/machinery/door/window/northright,/turf/simulated/floor/tiled/dark,/area/surface/outpost/research/xenoarcheology/exp_prep)
"bZ" = (/obj/structure/table/steel,/obj/item/device/suit_cooling_unit,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = 11; pixel_y = -24},/obj/structure/cable/blue,/obj/item/device/suit_cooling_unit,/obj/item/device/gps/science,/obj/item/device/gps/science,/obj/item/device/gps/science,/turf/simulated/floor/tiled/dark,/area/surface/outpost/research/xenoarcheology/exp_prep)
@@ -183,10 +183,10 @@
"dA" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 36; pixel_y = 0},/obj/structure/table/standard,/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/effect/floor_decal/corner/purple{dir = 6},/obj/item/weapon/storage/box/glasses/square{pixel_x = 1; pixel_y = 4},/obj/item/weapon/storage/box/cups,/obj/item/weapon/hand_labeler,/turf/simulated/floor/tiled/neutral,/area/surface/outpost/research/xenoarcheology)
"dB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/glass,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass_research{name = "Outpost Hallway"; req_access = list(47)},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoarcheology)
"dC" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/surface/outpost/research/xenoarcheology/anomaly)
-"dD" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/screwdriver{pixel_y = 15},/obj/item/weapon/melee/baton/loaded,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoarcheology/anomaly)
+"dD" = (/obj/structure/table/steel,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/wrench,/obj/effect/floor_decal/industrial/warning/dust{ icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/asteroid_steel,/area/surface/outpost/mining_main/cave)
"dE" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoarcheology/anomaly)
"dF" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoarcheology/anomaly)
-"dG" = (/obj/structure/table/standard,/obj/item/weapon/flame/lighter/random,/obj/item/weapon/crowbar,/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{dir = 8},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoarcheology/anomaly)
+"dG" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/tool/screwdriver{pixel_y = 15},/obj/item/weapon/melee/baton/loaded,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoarcheology/anomaly)
"dH" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/effect/floor_decal/industrial/warning/full,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/surface/outpost/research/xenoarcheology/anomaly)
"dI" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/button/remote/blast_door{id = "xenoarch_cell2"; name = "Cell 2"; pixel_x = 26; pixel_y = 0},/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoarcheology/anomaly)
"dJ" = (/turf/simulated/floor/plating{ icon_state = "asteroidplating2"},/area/surface/cave/explored/normal)
@@ -421,8 +421,8 @@
"ie" = (/turf/simulated/wall/dungeon,/area/surface/cave/unexplored/normal)
"if" = (/obj/item/stack/flag/green,/turf/simulated/mineral/floor/ignore_mapgen/sif,/area/surface/cave/explored/normal)
"ig" = (/obj/item/stack/flag/red{amount = 1},/turf/simulated/mineral/floor/ignore_mapgen/sif,/area/surface/cave/explored/normal)
+"ih" = (/obj/structure/table/standard,/obj/item/weapon/flame/lighter/random,/obj/item/weapon/tool/crowbar,/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{dir = 8},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoarcheology/anomaly)
"ii" = (/obj/effect/floor_decal/industrial/warning/dust{ icon_state = "warning_dust"; dir = 1},/obj/machinery/floodlight,/turf/simulated/floor/tiled/asteroid_steel,/area/surface/outpost/mining_main/cave)
-"il" = (/obj/structure/table/steel,/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/effect/floor_decal/industrial/warning/dust{ icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/asteroid_steel,/area/surface/outpost/mining_main/cave)
"im" = (/turf/simulated/floor/tiled/asteroid_steel,/area/surface/outpost/mining_main/cave)
"in" = (/obj/effect/floor_decal/industrial/warning/dust{ icon_state = "warning_dust"; dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/asteroid_steel,/area/surface/outpost/mining_main/cave)
"io" = (/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/warning/dust{ icon_state = "warning_dust"; dir = 4},/turf/simulated/floor/tiled/asteroid_steel,/area/surface/outpost/mining_main/cave)
@@ -676,9 +676,9 @@ adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafaeapbAaTbBbCbDbEbFbGbHbIbJbKbLbMbNbObNaNbPbQbRbSayafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgLaeaeaeaeaeaeaeaead
adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafaeapbTbUbVbWbXbYbZcacbcccdavcebMcfcgchaNayayayayayafafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgLaeaeaeaeaeaeaeaead
adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafaeapapapapapapapapapcicjckavclcmcncncocpcqcrcsctcuafafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgLaeaeaeaeaeaeaeaead
-adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaecviigqgpiliicvafafafaecAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcuafafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgLaeaeaeaeaeaeaeaead
+adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaecviigqgpdDiicvafafafaecAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcuafafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgLaeaeaeaeaeaeaeaead
adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeinimimimimimioafafafaecAdadbdccEdddedfandgdhdiaxdjdkdkdldmdndodpdqdrcuafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgLaeaeaeaeaeaeaeaead
-adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeipimimimimimiqafafaeaecAdudvdwdxdydzdAamandBandCdDdEdFdGdHdIcucucucucudJafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgLaeaeaeaeaeaeaeaead
+adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeipimimimimimiqafafaeaecAdudvdwdxdydzdAamandBandCdGdEdFihdHdIcucucucucudJafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgLaeaeaeaeaeaeaeaead
adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeipimimimimimiqafafafaecAdKdLdMdNdOdPdQcIdRdSdTaxdUdVdWdXdYdZeaebecedeedJafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgLaeaeaeaeaeaeaeaead
adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeipirisirimitiqafafafeicAdNdNcAejekelemeneodSdTbKepbNbNeqereseteueveweedJafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgLaeaeaeaeaeaeaeaead
adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeipimimimimiuiqafafafeyanezeAaneBeBeCeDeEeFdSdTaxeGeHeIeJeKeLeMeNeOePeedJafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgLaeaeaeaeaeaeaeaead
diff --git a/maps/southern_cross/southern_cross-5.dmm b/maps/southern_cross/southern_cross-5.dmm
index 8d343fbf8e..11bfad0b0f 100644
--- a/maps/southern_cross/southern_cross-5.dmm
+++ b/maps/southern_cross/southern_cross-5.dmm
@@ -39,6 +39,7 @@
"aM" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/white,/area/derelict/ship)
"aN" = (/obj/structure/table/standard,/obj/item/device/analyzer,/turf/simulated/shuttle/floor/white,/area/derelict/ship)
"aO" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/white,/area/derelict/ship)
+"aP" = (/obj/structure/table/standard,/obj/item/weapon/tool/screwdriver,/obj/machinery/light,/turf/simulated/shuttle/floor/white,/area/derelict/ship)
"aS" = (/obj/machinery/door/window/northright,/turf/simulated/shuttle/floor/white,/area/derelict/ship)
"aT" = (/obj/item/weapon/bedsheet,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/bed/padded,/turf/simulated/shuttle/floor/white,/area/derelict/ship)
"aU" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor/white,/area/derelict/ship)
@@ -59,7 +60,6 @@
"bk" = (/obj/machinery/mass_driver{dir = 8; icon_state = "mass_driver"; id = "oldship_gun"},/turf/simulated/shuttle/plating,/area/derelict/ship)
"bl" = (/obj/machinery/door/airlock/glass{name = "Pod Bay"},/turf/simulated/shuttle/floor/white,/area/derelict/ship)
"bm" = (/obj/machinery/computer/pod{id = "oldship_gun"},/turf/simulated/shuttle/floor/white,/area/derelict/ship)
-"bn" = (/obj/structure/table/standard,/obj/item/weapon/screwdriver,/obj/machinery/light,/turf/simulated/shuttle/floor/white,/area/derelict/ship)
"bo" = (/obj/structure/table/standard,/obj/item/device/radio/off,/turf/simulated/shuttle/floor/white,/area/derelict/ship)
"bp" = (/turf/simulated/mineral/vacuum,/area/mine/unexplored)
"bq" = (/turf/simulated/mineral/floor/ignore_mapgen/vacuum,/area/mine/explored)
@@ -209,7 +209,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacacacacacabacacacababalalaiajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjbkazacacacacacacblacacababababalaiajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbmacacacacacababababaaaaababaiajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacbnboababababaaaaaaaaababawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacaPboababababaaaaaaaaababawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/southern_cross/southern_cross-6.dmm b/maps/southern_cross/southern_cross-6.dmm
index 2a5f34223d..250cd4ca5d 100644
--- a/maps/southern_cross/southern_cross-6.dmm
+++ b/maps/southern_cross/southern_cross-6.dmm
@@ -10,7 +10,7 @@
"aj" = (/obj/structure/table/rack/holorack,/obj/item/clothing/under/dress/dress_saloon,/obj/item/clothing/head/pin/flower,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre)
"ak" = (/obj/effect/landmark/costume,/obj/structure/table/rack/holorack,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre)
"al" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom)
-"am" = (/obj/structure/flora/pottedplant{ icon_state = "plant-10"},/obj/structure/window/reinforced/holowindow{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_courtroom)
+"am" = (/obj/structure/flora/pottedplant{icon_state = "plant-10"},/obj/structure/window/reinforced/holowindow{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_courtroom)
"an" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_courtroom)
"ao" = (/turf/simulated/floor/holofloor/reinforced,/area/holodeck/source_wildlife)
"ap" = (/turf/simulated/floor/holofloor/reinforced,/area/holodeck/source_plating)
@@ -45,7 +45,7 @@
"aS" = (/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea)
"aT" = (/obj/effect/decal/cleanable/dirt,/obj/structure/holostool,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea)
"aU" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea)
-"aV" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{ icon_state = "spline_fancy"; dir = 10},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
+"aV" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{icon_state = "spline_fancy"; dir = 10},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
"aW" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 6},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
"aX" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/spline/fancy/wood{dir = 1},/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea)
"aY" = (/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre)
@@ -79,7 +79,7 @@
"bA" = (/obj/structure/table/woodentable/holotable,/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom)
"bB" = (/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt)
"bC" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt)
-"bD" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{ icon_state = "spline_fancy"; dir = 9},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
+"bD" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{icon_state = "spline_fancy"; dir = 9},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
"bE" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 5},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
"bF" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/spline/fancy/wood,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea)
"bG" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet{dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom)
@@ -95,7 +95,7 @@
"bQ" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre)
"bR" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre)
"bS" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/obj/effect/floor_decal/carpet{dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre)
-"bT" = (/obj/structure/flora/pottedplant{ icon_state = "plant-06"},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre)
+"bT" = (/obj/structure/flora/pottedplant{icon_state = "plant-06"},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre)
"bU" = (/obj/effect/floor_decal/carpet{dir = 5},/obj/effect/floor_decal/carpet{dir = 6},/obj/effect/floor_decal/carpet{dir = 10},/obj/effect/floor_decal/carpet{dir = 9},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre)
"bV" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom)
"bW" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/obj/structure/bed/chair/holochair{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom)
@@ -109,7 +109,7 @@
"ce" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/wall,/area/space)
"cf" = (/turf/simulated/floor/holofloor/space,/area/holodeck/source_space)
"cg" = (/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield)
-"ch" = (/obj/structure/flora/pottedplant{ icon_state = "plant-06"},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall)
+"ch" = (/obj/structure/flora/pottedplant{icon_state = "plant-06"},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall)
"ci" = (/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall)
"cj" = (/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball)
"ck" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball)
@@ -195,7 +195,7 @@
"dM" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet{dir = 8},/area/holodeck/source_meetinghall)
"dN" = (/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball)
"dO" = (/obj/machinery/door/window/holowindoor{base_state = "right"; dir = 8; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_basketball)
-"dP" = (/turf/unsimulated/beach/sand{ icon_state = "beach"},/area/holodeck/source_beach)
+"dP" = (/turf/unsimulated/beach/sand{icon_state = "beach"},/area/holodeck/source_beach)
"dQ" = (/obj/machinery/door/window/holowindoor{base_state = "right"; dir = 8; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_thunderdomecourt)
"dR" = (/obj/structure/window/reinforced/holowindow{dir = 1},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt)
"dS" = (/obj/machinery/door/window/holowindoor{dir = 1; name = "Green Corner"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt)
@@ -292,7 +292,7 @@
"fF" = (/obj/structure/table/rack,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"fG" = (/obj/structure/table/rack,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"fH" = (/obj/structure/table/rack,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
-"fI" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/obj/item/weapon/wrench,/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
+"fI" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"fJ" = (/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"fK" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; enabled = 0; req_one_access = list(103); use_power = 0},/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"fL" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
@@ -323,10 +323,10 @@
"gk" = (/obj/effect/floor_decal/corner/purple{dir = 6},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"gl" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/device/flash,/obj/item/device/flash,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"gm" = (/obj/structure/table/rack,/obj/item/device/lightreplacer,/obj/item/device/lightreplacer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
-"gn" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/obj/item/weapon/wrench,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"gn" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"go" = (/obj/structure/table/reinforced,/obj/item/weapon/stamp/centcomm,/obj/item/weapon/pen,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"gp" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
-"gq" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"gq" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"gr" = (/obj/machinery/door/airlock,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"gs" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
"gt" = (/obj/effect/floor_decal/corner/yellow,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
@@ -383,7 +383,7 @@
"hs" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/table/rack,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"ht" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating/airless,/area/shuttle/response_ship/start)
"hu" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
-"hv" = (/obj/machinery/computer/shuttle_control/web/ert{ icon_state = "flightcomp_center"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
+"hv" = (/obj/machinery/computer/shuttle_control/web/ert{icon_state = "flightcomp_center"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
"hw" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
"hx" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "response_shuttle"; pixel_x = 0; pixel_y = -25; tag_door = "response_shuttle_door"},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
"hy" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "response_shuttle_door"; locked = 1; name = "Forward Docking Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
@@ -394,7 +394,7 @@
"hD" = (/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hE" = (/obj/machinery/pipedispenser/orderable,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hF" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
-"hG" = (/obj/structure/table/reinforced,/obj/item/device/defib_kit,/obj/item/device/defib_kit,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/screwdriver,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
+"hG" = (/obj/structure/table/reinforced,/obj/item/device/defib_kit,/obj/item/device/defib_kit,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/tool/screwdriver,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hH" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hI" = (/obj/item/roller,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hJ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/autoinjectors,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
@@ -406,7 +406,7 @@
"hP" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/command,/obj/item/clothing/head/helmet/ert/command,/obj/item/weapon/storage/backpack/ert/commander,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hQ" = (/obj/structure/table/reinforced,/obj/item/device/aicard,/obj/item/weapon/stamp/centcomm,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hR" = (/obj/item/device/radio/intercom/specops{pixel_y = -21},/obj/machinery/computer/communications,/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
-"hS" = (/obj/structure/flight_right{ icon_state = "right"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
+"hS" = (/obj/structure/flight_right{icon_state = "right"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
"hT" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
"hU" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
"hV" = (/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
@@ -425,7 +425,7 @@
"ii" = (/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"ij" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"ik" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
-"il" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/obj/item/weapon/wrench,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
+"il" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"im" = (/obj/structure/table/reinforced,/obj/item/weapon/pinpointer/advpinpointer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"in" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; dir = 8; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/specops)
"io" = (/obj/machinery/shield_gen,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
@@ -527,7 +527,7 @@
"kg" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_2_recovery"; pixel_x = -25; pixel_y = 25; req_one_access = list(13); tag_door = "escape_pod_2_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac)
"kh" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/plating,/area/centcom/evac)
"ki" = (/obj/machinery/door/blast/regular{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome)
-"kj" = (/turf/unsimulated/floor{ icon_state = "asteroid"},/area/centcom/main_hall)
+"kj" = (/turf/unsimulated/floor{icon_state = "asteroid"},/area/centcom/main_hall)
"kk" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/turf/simulated/shuttle/plating,/area/centcom/evac)
"kl" = (/turf/simulated/shuttle/plating,/area/centcom/evac)
"km" = (/obj/machinery/door/airlock/maintenance_hatch{req_access = list(101)},/turf/simulated/shuttle/floor/black,/area/centcom/evac)
@@ -593,10 +593,10 @@
"lu" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/command)
"lv" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/turf/simulated/shuttle/plating,/area/centcom/evac)
"lw" = (/turf/simulated/shuttle/wall/dark/no_join,/area/centcom/evac)
-"lx" = (/obj/structure/closet/secure_closet/security,/turf/simulated/shuttle/floor{ icon_state = "floor_red"},/area/centcom/evac)
-"ly" = (/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/shuttle/floor{ icon_state = "floor_red"},/area/centcom/evac)
-"lz" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/shuttle/floor{ icon_state = "floor_red"},/area/centcom/evac)
-"lA" = (/obj/structure/table/rack,/turf/simulated/shuttle/floor{ icon_state = "floor_red"},/area/centcom/evac)
+"lx" = (/obj/structure/closet/secure_closet/security,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac)
+"ly" = (/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac)
+"lz" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac)
+"lA" = (/obj/structure/table/rack,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac)
"lB" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/centcom/evac)
"lC" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor,/area/centcom/evac)
"lD" = (/turf/simulated/shuttle/plating,/area/shuttle/large_escape_pod2/centcom)
@@ -614,7 +614,7 @@
"lP" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/shuttle/floor/yellow,/area/shuttle/transport1/centcom)
"lQ" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Centcom"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom)
"lR" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom)
-"lS" = (/turf/simulated/shuttle/floor{ icon_state = "floor_red"},/area/centcom/evac)
+"lS" = (/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac)
"lT" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
"lU" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve)
"lV" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve)
@@ -637,7 +637,7 @@
"mm" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom)
"mn" = (/obj/machinery/computer/shuttle_control/centcom,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom)
"mo" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access = list(1)},/turf/simulated/shuttle/plating,/area/centcom/evac)
-"mp" = (/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access = list(1)},/turf/simulated/shuttle/floor{ icon_state = "floor_red"},/area/centcom/evac)
+"mp" = (/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access = list(1)},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac)
"mq" = (/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
"mr" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve)
"ms" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall)
@@ -645,7 +645,7 @@
"mu" = (/obj/machinery/biogenerator,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mv" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mw" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/fryer,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
-"mx" = (/obj/machinery/computer/ordercomp,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command)
+"mx" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/supplycomp/control,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command)
"my" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command)
"mz" = (/obj/machinery/computer/robotics,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command)
"mA" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating/airless,/area/shuttle/transport1/centcom)
@@ -655,7 +655,7 @@
"mE" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/shuttle/floor/yellow,/area/shuttle/transport1/centcom)
"mF" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle"; pixel_x = 0; pixel_y = -25; tag_door = "centcom_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom)
"mG" = (/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom)
-"mH" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{ icon_state = "floor_red"},/area/centcom/evac)
+"mH" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac)
"mI" = (/obj/machinery/computer/pod{id = "thunderdomeaxe"; name = "Thunderdome Axe Supply"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
"mJ" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve)
"mK" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall)
@@ -665,8 +665,8 @@
"mO" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command)
"mP" = (/obj/machinery/button/remote/blast_door{id = "crescent_thunderdome"; name = "Thunderdome Access"; pixel_x = 6; pixel_y = -24; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_vip_shuttle"; name = "VIP Shuttle Access"; pixel_x = 6; pixel_y = -34; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_checkpoint_access"; name = "Crescent Checkpoint Access"; pixel_x = -6; pixel_y = -24; req_access = list(101)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command)
"mQ" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 26; pixel_y = 0; tag_door = "centcom_shuttle_bay_door"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command)
-"mR" = (/obj/machinery/computer/card,/turf/simulated/shuttle/floor{ icon_state = "floor_red"},/area/centcom/evac)
-"mS" = (/obj/machinery/computer/secure_data,/turf/simulated/shuttle/floor{ icon_state = "floor_red"},/area/centcom/evac)
+"mR" = (/obj/machinery/computer/card,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac)
+"mS" = (/obj/machinery/computer/secure_data,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac)
"mT" = (/obj/machinery/computer/pod{id = "thunderdomegen"; name = "Thunderdome General Supply"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
"mU" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/oven,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"mV" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/item/weapon/material/knife/machete/hatchet,/obj/item/weapon/material/knife/machete/hatchet,/obj/item/weapon/material/minihoe,/obj/item/weapon/material/minihoe,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
@@ -676,9 +676,9 @@
"mZ" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command)
"na" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "large_escape_pod_2_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 02"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac)
"nb" = (/obj/machinery/computer/pod{id = "thunderdomehea"; name = "Thunderdome Heavy Supply"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
-"nc" = (/obj/item/weapon/wrench,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
+"nc" = (/obj/item/weapon/tool/wrench,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
"nd" = (/obj/machinery/door/airlock/command{name = "Thunderdome Administration"; req_access = list(102)},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
-"ne" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 6},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"ne" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"nf" = (/obj/machinery/atmospherics/pipe/vent{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"ng" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome"; opacity = 1; req_access = list(101)},/obj/machinery/door/blast/regular{id = "crescent_thunderdome"; name = "Thunderdome"},/turf/unsimulated/floor{icon_state = "steel"},/area/tdome)
"nh" = (/obj/machinery/seed_storage/garden,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
@@ -715,7 +715,7 @@
"nM" = (/obj/machinery/door/airlock/external,/turf/simulated/shuttle/floor,/area/centcom/evac)
"nN" = (/obj/machinery/computer/pod{id = "thunderdome"; name = "Thunderdome Blast Door Control"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
"nO" = (/obj/item/weapon/extinguisher,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
-"nP" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
+"nP" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"nQ" = (/obj/structure/table/marble,/obj/item/weapon/storage/box/glasses/square,/obj/item/weapon/storage/box/glasses/square,/obj/effect/floor_decal/corner/white/diagonal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"nR" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/icecream_vat,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"nS" = (/obj/machinery/computer/security,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command)
@@ -736,8 +736,8 @@
"oh" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_bay_door"; locked = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/command)
"oi" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "large_escape_pod_1_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 01"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac)
"oj" = (/obj/structure/table/standard,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
-"ok" = (/obj/machinery/computer/arcade,/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
-"ol" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
+"ok" = (/obj/machinery/computer/arcade,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar)
+"ol" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar)
"om" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/vending/dinnerware,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"on" = (/obj/structure/flora/pottedplant/stoutbush,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/main_hall)
"oo" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall)
@@ -751,7 +751,7 @@
"ow" = (/obj/structure/toilet,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"ox" = (/turf/simulated/shuttle/plating,/area/shuttle/large_escape_pod1/centcom)
"oy" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin)
-"oz" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
+"oz" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar)
"oA" = (/obj/structure/flora/pottedplant,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar)
"oB" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/door/airlock/glass,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"oC" = (/obj/machinery/telecomms/broadcaster/preset_cent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall)
@@ -817,11 +817,11 @@
"pK" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/soylenviridians,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"pL" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"pM" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/candiedapple,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
-"pN" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
+"pN" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar)
"pO" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar)
"pP" = (/turf/unsimulated/wall,/area/centcom/bar)
"pQ" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
-"pR" = (/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
+"pR" = (/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar)
"pS" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/obj/structure/bed/padded,/obj/item/weapon/bedsheet/captain,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living)
"pT" = (/obj/effect/floor_decal/carpet{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living)
"pU" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living)
@@ -854,7 +854,7 @@
"qv" = (/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 6},/obj/structure/closet/secure_closet/personal,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living)
"qw" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/living)
"qx" = (/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/structure/table/standard,/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living)
-"qy" = (/turf/space,/obj/structure/shuttle/engine/propulsion{ icon_state = "propulsion_r"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/administration/centcom)
+"qy" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/administration/centcom)
"qz" = (/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"qA" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/shuttle/floor,/area/centcom/evac)
"qB" = (/turf/unsimulated/wall,/area/shuttle/trade)
@@ -862,7 +862,7 @@
"qD" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"qE" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/amanita_pie,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
"qF" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = 4; pixel_y = -2},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar)
-"qG" = (/obj/structure/bed/chair/wood/wings,/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
+"qG" = (/obj/structure/bed/chair/wood/wings,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar)
"qH" = (/obj/machinery/light,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom)
"qI" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom)
"qJ" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/simulated/shuttle/plating,/area/shuttle/administration/centcom)
@@ -915,7 +915,7 @@
"rE" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade)
"rF" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/storage/box/syndie_kit/clerical,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade)
"rG" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall)
-"rH" = (/obj/machinery/door/airlock/glass{name = "Bar"},/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
+"rH" = (/obj/machinery/door/airlock/glass{name = "Bar"},/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar)
"rI" = (/obj/machinery/floor_light,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/bar)
"rJ" = (/obj/structure/sink{pixel_y = 16},/obj/structure/mirror{pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar)
"rK" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor,/area/centcom/evac)
@@ -929,8 +929,8 @@
"rS" = (/obj/machinery/door/airlock/glass_centcom{name = "Bridge Access"; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall)
"rT" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar)
"rU" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar)
-"rV" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = 4; pixel_y = -2},/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/obj/item/weapon/flame/candle,/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
-"rW" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
+"rV" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = 4; pixel_y = -2},/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/obj/item/weapon/flame/candle,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar)
+"rW" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar)
"rX" = (/obj/machinery/optable,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom)
"rY" = (/obj/structure/table/reinforced,/obj/machinery/librarycomp,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom)
"rZ" = (/obj/structure/bookcase,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom)
@@ -938,8 +938,8 @@
"sb" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/vest/heavy/merc,/obj/item/clothing/suit/storage/vest/heavy,/obj/item/clothing/suit/storage/vest,/obj/item/clothing/head/helmet,/obj/item/clothing/head/helmet,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade)
"sc" = (/obj/structure/frame/computer,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade)
"sd" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/shuttle/trade)
-"se" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 8},/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
-"sf" = (/obj/machinery/media/jukebox,/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
+"se" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 8},/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar)
+"sf" = (/obj/machinery/media/jukebox,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar)
"sg" = (/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living)
"sh" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living)
"si" = (/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = -6},/obj/structure/table/standard,/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living)
@@ -951,7 +951,7 @@
"so" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod5/centcom)
"sp" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/shuttle/trade)
"sq" = (/obj/machinery/door/airlock/multi_tile/glass{dir = 4; req_access = list(160)},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade)
-"sr" = (/obj/structure/table/woodentable{dir = 5},/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor{ icon_state = "wood"},/area/centcom/bar)
+"sr" = (/obj/structure/table/woodentable{dir = 5},/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar)
"ss" = (/obj/machinery/floor_light,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/bar)
"st" = (/obj/machinery/light{dir = 8},/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom)
"su" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 3"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac)
@@ -996,7 +996,7 @@
"th" = (/obj/structure/table/reinforced,/obj/item/frame/light,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall)
"ti" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall)
"tj" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/mechanical,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall)
-"tk" = (/obj/item/weapon/crowbar,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall)
+"tk" = (/obj/item/weapon/tool/crowbar,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall)
"tl" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"tm" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"tn" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
@@ -1008,10 +1008,10 @@
"tt" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"tu" = (/obj/machinery/iv_drip,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"tv" = (/obj/structure/bed/roller,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
-"tw" = (/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/wrench,/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
-"tx" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/turf/simulated/shuttle/floor/white,/area/centcom/evac)
+"tw" = (/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/tool/wrench,/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
+"tx" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"ty" = (/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
-"tz" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/white,/area/centcom/evac)
+"tz" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"tA" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade)
"tB" = (/obj/machinery/door/airlock/silver{name = "Toilet"},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade)
"tC" = (/obj/structure/closet/wardrobe/pink,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade)
@@ -1034,7 +1034,7 @@
"tT" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade)
"tU" = (/turf/unsimulated/wall,/area/centcom/security)
"tV" = (/turf/unsimulated/wall,/area/centcom/medical)
-"tW" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -30; pixel_y = 0},/obj/structure/table/standard,/obj/item/device/defib_kit,/obj/item/device/defib_kit,/obj/machinery/recharger,/obj/item/weapon/screwdriver,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
+"tW" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -30; pixel_y = 0},/obj/structure/table/standard,/obj/item/device/defib_kit,/obj/item/device/defib_kit,/obj/machinery/recharger,/obj/item/weapon/tool/screwdriver,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"tX" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"tY" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"tZ" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "trade_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 25; pixel_y = 0; tag_door = "trade_shuttle_bay_door"},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade)
@@ -1086,7 +1086,7 @@
"uT" = (/obj/machinery/computer/operating,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"uU" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor/black,/area/centcom/evac)
"uV" = (/obj/structure/morgue,/turf/simulated/shuttle/floor/white,/area/centcom/evac)
-"uW" = (/obj/structure/morgue{ icon_state = "morgue1"; dir = 8},/turf/simulated/shuttle/floor/white,/area/centcom/evac)
+"uW" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/turf/simulated/shuttle/floor/white,/area/centcom/evac)
"uX" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/shuttle/merchant/home)
"uY" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "trade_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
"uZ" = (/turf/simulated/shuttle/wall/dark,/area/shuttle/merchant/home)
@@ -1197,7 +1197,7 @@
"xa" = (/obj/structure/table/bench/padded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security)
"xb" = (/obj/structure/morgue,/obj/effect/floor_decal/corner/blue/full{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
"xc" = (/obj/effect/floor_decal/corner/blue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
-"xd" = (/obj/structure/morgue{ icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/blue/full{dir = 1},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
+"xd" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/blue/full{dir = 1},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
"xe" = (/obj/machinery/door/airlock/multi_tile/glass{dir = 4; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
"xf" = (/obj/structure/table/steel_reinforced,/obj/random/medical,/obj/random/medical,/obj/random/medical,/obj/random/medical,/obj/structure/window/reinforced,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
"xg" = (/obj/machinery/door/window/southleft{name = "Cargo Hold"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
@@ -1209,7 +1209,7 @@
"xm" = (/obj/machinery/iv_drip,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
"xn" = (/obj/structure/table/glass,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
"xo" = (/obj/structure/morgue,/obj/effect/floor_decal/corner/blue{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
-"xp" = (/obj/structure/morgue{ icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/blue{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
+"xp" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/blue{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
"xq" = (/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home)
"xr" = (/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home)
"xs" = (/obj/machinery/vending/coffee,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
@@ -1356,7 +1356,7 @@
"Ad" = (/obj/structure/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
"Ae" = (/obj/structure/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/paleblue/full,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
"Af" = (/obj/machinery/computer/crew,/obj/effect/floor_decal/corner/paleblue/full,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical)
-"Ag" = (/turf/unsimulated/floor{ icon_state = "asteroid"},/area/centcom/terminal)
+"Ag" = (/turf/unsimulated/floor{icon_state = "asteroid"},/area/centcom/terminal)
"Ah" = (/turf/unsimulated/wall{icon = 'icons/obj/doors/Doormaint.dmi'; icon_state = "door_closed"; name = "Sealed Door"},/area/centcom/terminal)
"Ai" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/terminal)
"Aj" = (/obj/structure/closet/emcloset,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/terminal)
@@ -1369,9 +1369,9 @@
"Aq" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "tradeportshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home)
"Ar" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "tradeportshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home)
"As" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "tradeportshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home)
-"At" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/obj/machinery/atm{pixel_x = -32},/obj/machinery/meter,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
+"At" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/obj/machinery/atm{pixel_x = -32},/obj/machinery/meter,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
"Au" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "trade2_control"; pixel_x = -22; pixel_y = -32; req_one_access = list(150)},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
-"Av" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 10},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
+"Av" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 10},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
"Aw" = (/obj/structure/table/standard,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/void/merc,/obj/item/clothing/head/helmet/space/void/merc,/obj/item/clothing/head/helmet/space/void/merc,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
"Ax" = (/obj/structure/table/standard,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
"Ay" = (/obj/structure/table/standard,/obj/item/stack/material/steel{amount = 2},/obj/item/stack/material/steel{amount = 2},/obj/item/stack/material/glass{amount = 15},/obj/item/stack/material/glass{amount = 15},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
@@ -1384,7 +1384,7 @@
"AF" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
"AG" = (/obj/machinery/light,/turf/simulated/floor/carpet,/area/shuttle/merchant/home)
"AH" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet,/area/shuttle/merchant/home)
-"AI" = (/obj/structure/flora/pottedplant{ icon_state = "plant-10"},/turf/simulated/floor/carpet,/area/shuttle/merchant/home)
+"AI" = (/obj/structure/flora/pottedplant{icon_state = "plant-10"},/turf/simulated/floor/carpet,/area/shuttle/merchant/home)
"AJ" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "trade2_shuttle_inner"; locked = 1; name = "Ship Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
"AK" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "trade2_shuttle_inner"; locked = 1; name = "Ship Hatch"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
"AL" = (/obj/machinery/vending/engivend,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
@@ -1392,7 +1392,7 @@
"AN" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal)
"AO" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal)
"AP" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
-"AQ" = (/obj/effect/floor_decal/corner/white/diagonal{ icon_state = "corner_white_diagonal"; dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
+"AQ" = (/obj/effect/floor_decal/corner/white/diagonal{icon_state = "corner_white_diagonal"; dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
"AR" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
"AS" = (/obj/structure/table/standard,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"AT" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1331; id_tag = "trade2_vent"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1331; id_tag = "trade2_control"; pixel_x = -24; req_access = list(150); tag_airpump = "trade2_vent"; tag_chamber_sensor = "trade2_sensor"; tag_exterior_door = "trade2_shuttle_outer"; tag_interior_door = "trade2_shuttle_inner"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
@@ -1404,7 +1404,7 @@
"AZ" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "trade2_control"; pixel_x = 24; req_one_access = list(150)},/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "trade2_shuttle_outer"; locked = 1; name = "Ship Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home)
"Ba" = (/obj/structure/table/standard,/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"Bb" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
-"Bc" = (/obj/effect/floor_decal/industrial/loading{ icon_state = "loadingarea"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
+"Bc" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
"Bd" = (/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
"Be" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
"Bf" = (/obj/machinery/light{dir = 8},/obj/structure/bed/chair/shuttle{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
@@ -1412,8 +1412,8 @@
"Bh" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/closet/emcloset,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"Bi" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom)
"Bj" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom)
-"Bk" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
-"Bl" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
+"Bk" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
+"Bl" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"Bm" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom)
"Bn" = (/obj/structure/bed/chair/shuttle{dir = 1},/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"Bo" = (/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
@@ -1431,7 +1431,7 @@
"BA" = (/obj/effect/floor_decal/industrial/warning,/obj/effect/floor_decal/sign/dock/two,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
"BB" = (/obj/effect/floor_decal/corner/white{dir = 6; icon_state = "corner_white"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
"BC" = (/obj/effect/floor_decal/corner/white{dir = 5},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
-"BD" = (/obj/effect/floor_decal/corner/white{ icon_state = "corner_white"; dir = 1},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
+"BD" = (/obj/effect/floor_decal/corner/white{icon_state = "corner_white"; dir = 1},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
"BE" = (/turf/simulated/shuttle/wall/hard_corner,/area/shuttle/escape/centcom)
"BF" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal)
"BG" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
@@ -1480,7 +1480,7 @@
"Cx" = (/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
"Cy" = (/obj/structure/undies_wardrobe,/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
"Cz" = (/turf/simulated/shuttle/wall/no_join,/area/shuttle/escape/centcom)
-"CA" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
+"CA" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/tool/crowbar,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"CB" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"CC" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"CD" = (/obj/structure/table/woodentable,/obj/item/device/paicard,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
@@ -1503,14 +1503,14 @@
"CU" = (/obj/machinery/vending/hydronutrients,/turf/unsimulated/floor{icon_state = "grass0"; name = "grass"},/area/wizard_station)
"CV" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/under/psysuit,/obj/item/clothing/suit/wizrobe/psypurple,/obj/item/clothing/head/wizard/amp,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"CW" = (/mob/living/simple_animal/mouse/gray{desc = "He looks kingly."; name = "Arthur"},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
-"CX" = (/obj/structure/flora/pottedplant{ icon_state = "plant-24"},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
+"CX" = (/obj/structure/flora/pottedplant{icon_state = "plant-24"},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
"CY" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal)
"CZ" = (/obj/structure/bed/chair/shuttle{dir = 8},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"Da" = (/obj/structure/bed/chair/shuttle{dir = 4},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"Db" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/bed/chair/shuttle{dir = 8},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"Dc" = (/obj/machinery/photocopier,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"Dd" = (/obj/structure/bookcase,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
-"De" = (/obj/structure/flora/pottedplant{ icon_state = "plant-08"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
+"De" = (/obj/structure/flora/pottedplant{icon_state = "plant-08"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"Df" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/shoes/sandal/marisa{desc = "A set of fancy shoes that are as functional as they are comfortable."; name = "Gentlemans Shoes"},/obj/item/clothing/under/gentlesuit,/obj/item/clothing/suit/wizrobe/gentlecoat,/obj/item/clothing/head/wizard/cap,/obj/item/weapon/staff/gentcane,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"Dg" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"Dh" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
@@ -1533,7 +1533,7 @@
"Dy" = (/obj/structure/table/steel_reinforced,/obj/item/stack/telecrystal,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
"Dz" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"DA" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/head/philosopher_wig,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
-"DB" = (/obj/structure/flora/pottedplant{ icon_state = "plant-04"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
+"DB" = (/obj/structure/flora/pottedplant{icon_state = "plant-04"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"DC" = (/obj/structure/sign/electricshock,/turf/simulated/shuttle/wall/dark/hard_corner,/area/wizard_station)
"DD" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station)
"DE" = (/obj/machinery/computer/shuttle,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
@@ -1544,7 +1544,7 @@
"DJ" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/machinery/computer/station_alert/all,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"DK" = (/obj/structure/table/steel_reinforced,/obj/item/device/mmi/radio_enabled,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
"DL" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/material/knife/ritual,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
-"DM" = (/obj/structure/flora/pottedplant{ icon_state = "plant-03"},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
+"DM" = (/obj/structure/flora/pottedplant{icon_state = "plant-03"},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"DN" = (/obj/structure/reagent_dispensers/watertank,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station)
"DO" = (/obj/machinery/power/port_gen/pacman,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station)
"DP" = (/obj/structure/table/steel_reinforced,/obj/item/xenos_claw,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
@@ -1566,7 +1566,7 @@
"Ef" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/book/manual/engineering_hacking,/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"Eg" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"Eh" = (/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
-"Ei" = (/obj/effect/floor_decal/industrial/warning/corner{ icon_state = "warningcorner"; dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
+"Ei" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"Ej" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/obj/item/target,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station)
"Ek" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom)
"El" = (/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom)
@@ -1574,7 +1574,7 @@
"En" = (/obj/machinery/atmospherics/unary/cryo_cell{layer = 3.3},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"Eo" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"Ep" = (/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
-"Eq" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/wrench,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
+"Eq" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/tool/wrench,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"Er" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire{layer = 2.9; pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = -2},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom)
"Es" = (/obj/item/robot_parts/r_arm,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station)
"Et" = (/obj/item/robot_parts/l_leg,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station)
@@ -1679,7 +1679,7 @@
"Go" = (/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo)
"Gp" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "ninja_shuttle"; pixel_x = 0; pixel_y = -25; req_access = list(150)},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "ninja_shuttle_pump"},/obj/machinery/button/remote/blast_door{id = "blastninja"; name = "ship lockdown control"; pixel_x = -25},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start)
"Gq" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1331; id_tag = "ninja_shuttle_inner"; name = "Ship Internal Hatch"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start)
-"Gr" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "ninja_shuttle"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start)
+"Gr" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "ninja_shuttle"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start)
"Gs" = (/obj/structure/table/steel_reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start)
"Gt" = (/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 10},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo)
"Gu" = (/obj/effect/floor_decal/carpet,/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo)
@@ -1692,7 +1692,7 @@
"GB" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/storage/toolbox/syndicate{pixel_x = -1; pixel_y = 3},/obj/machinery/button/remote/blast_door{id = "ninjawindow"; name = "remote shutter control"; pixel_x = 0; pixel_y = -25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
"GC" = (/obj/structure/table/bench/wooden,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo)
"GD" = (/obj/structure/flight_right{dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
-"GE" = (/obj/machinery/computer/shuttle_control/web/ninja{ icon_state = "flightcomp_center"; dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
+"GE" = (/obj/machinery/computer/shuttle_control/web/ninja{icon_state = "flightcomp_center"; dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
"GF" = (/obj/structure/flight_left{dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
"GG" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "endgame_exit"},/obj/item/toy/plushie/mouse{desc = "A plushie of a small fuzzy rodent."; name = "Woodrat"},/turf/unsimulated/beach/sand,/area/beach)
"GH" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "endgame_exit"},/turf/unsimulated/beach/sand,/area/beach)
@@ -1705,9 +1705,9 @@
"GO" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo)
"GP" = (/obj/structure/flora/ausbushes/palebush,/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo)
"GQ" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo)
-"GR" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{ icon_state = "asteroid"},/area/ninja_dojo/dojo)
-"GS" = (/turf/unsimulated/floor{ icon_state = "asteroid"},/area/ninja_dojo/dojo)
-"GT" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{ icon_state = "asteroid"},/area/ninja_dojo/dojo)
+"GR" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "asteroid"},/area/ninja_dojo/dojo)
+"GS" = (/turf/unsimulated/floor{icon_state = "asteroid"},/area/ninja_dojo/dojo)
+"GT" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{icon_state = "asteroid"},/area/ninja_dojo/dojo)
"GU" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo)
"GV" = (/turf/unsimulated/floor{icon_state = "sandwater"},/area/beach)
"GW" = (/turf/unsimulated/beach/coastline{density = 1; opacity = 1},/area/beach)
@@ -1771,10 +1771,10 @@
"Ic" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/syndicate_elite/mothership)
"Id" = (/turf/simulated/mineral,/area/space)
"Ie" = (/turf/simulated/mineral,/area/skipjack_station)
-"If" = (/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
+"If" = (/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
"Ig" = (/obj/machinery/embedded_controller/radio/docking_port_multi{child_names_txt = "Airlock One;Airlock Two;Airlock Three;Airlock Four"; child_tags_txt = "escape_dock_north_airlock;escape_dock_south_airlock;escape_dock_snorth_airlock;escape_dock_ssouth_airlock"; frequency = 1380; id_tag = "escape_dock"; pixel_y = -32; req_one_access = list(13)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal)
"Ih" = (/obj/structure/table/standard,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station)
-"Ii" = (/obj/effect/decal/cleanable/cobweb2{ icon_state = "cobweb1"},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station)
+"Ii" = (/obj/effect/decal/cleanable/cobweb2{icon_state = "cobweb1"},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station)
"Ij" = (/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station)
"Ik" = (/obj/structure/bed,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/prison/solitary)
"Il" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/prison/solitary)
@@ -1794,7 +1794,7 @@
"Iz" = (/obj/effect/wingrille_spawn/reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership/elite_squad)
"IA" = (/turf/simulated/shuttle/wall/dark/no_join,/area/shuttle/syndicate_elite/mothership)
"IB" = (/obj/effect/landmark{name = "Syndicate-Commando-Bomb"},/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership)
-"IC" = (/obj/structure/inflatable,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
+"IC" = (/obj/structure/inflatable,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
"ID" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station)
"IE" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/glasses/square{pixel_x = 1; pixel_y = 4},/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station)
"IF" = (/obj/item/weapon/tray{pixel_y = 5},/obj/structure/table/standard,/obj/item/weapon/material/knife/butch,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station)
@@ -1845,10 +1845,10 @@
"Jy" = (/obj/machinery/door/airlock/centcom{name = "Storage"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"Jz" = (/obj/machinery/door/airlock/centcom{icon_state = "door_locked"; locked = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"JA" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken1"},/area/skipjack_station)
-"JB" = (/obj/structure/table/standard,/turf/unsimulated/floor{ icon_state = "wood"},/area/skipjack_station)
-"JC" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/brown,/turf/unsimulated/floor{ icon_state = "wood"},/area/skipjack_station)
-"JD" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/green,/turf/unsimulated/floor{ icon_state = "wood"},/area/skipjack_station)
-"JE" = (/obj/structure/table/standard,/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{ icon_state = "wood"},/area/skipjack_station)
+"JB" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station)
+"JC" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/brown,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station)
+"JD" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/green,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station)
+"JE" = (/obj/structure/table/standard,/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station)
"JF" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station)
"JG" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -28; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station)
"JH" = (/obj/machinery/shower{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station)
@@ -1867,8 +1867,8 @@
"JU" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station)
"JV" = (/obj/structure/curtain/open/shower/security,/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = -1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station)
"JW" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership)
-"JX" = (/obj/effect/landmark{name = "voxstart"},/turf/unsimulated/floor{ icon_state = "wood"},/area/skipjack_station)
-"JY" = (/turf/unsimulated/floor{ icon_state = "wood"},/area/skipjack_station)
+"JX" = (/obj/effect/landmark{name = "voxstart"},/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station)
+"JY" = (/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station)
"JZ" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 9},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/skipjack_station)
"Ka" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station)
"Kb" = (/obj/machinery/gibber,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station)
@@ -1888,7 +1888,7 @@
"Kp" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "steel_dirty"},/area/skipjack_station)
"Kq" = (/turf/unsimulated/floor{icon_state = "steel_dirty"},/area/skipjack_station)
"Kr" = (/obj/item/xenos_claw,/obj/item/organ/internal/brain/vox,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station)
-"Ks" = (/obj/item/weapon/ore,/turf/unsimulated/floor{ name = "plating"; icon_state = "asteroid_dug"},/area/skipjack_station)
+"Ks" = (/obj/item/weapon/ore,/turf/unsimulated/floor{name = "plating"; icon_state = "asteroid_dug"},/area/skipjack_station)
"Kt" = (/obj/effect/landmark{name = "Nuclear-Bomb"},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/syndicate_station)
"Ku" = (/obj/structure/table/reinforced,/obj/item/weapon/tray{pixel_y = 5},/obj/effect/landmark{name = "Nuclear-Code"},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station)
"Kv" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station)
@@ -1898,9 +1898,9 @@
"Kz" = (/obj/effect/landmark{name = "voxstart"},/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken2"},/area/skipjack_station)
"KA" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 10},/obj/effect/floor_decal/carpet{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/skipjack_station)
"KB" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station)
-"KC" = (/obj/structure/table/rack,/obj/item/clothing/glasses/thermal/plain/monocle,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
-"KD" = (/obj/structure/table/rack,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
-"KE" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/spikethrower,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
+"KC" = (/obj/structure/table/rack,/obj/item/clothing/glasses/thermal/plain/monocle,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
+"KD" = (/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
+"KE" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/spikethrower,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
"KF" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"KG" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"KH" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
@@ -1911,68 +1911,68 @@
"KM" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station)
"KN" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station)
"KO" = (/turf/simulated/floor/airless,/area/shuttle/syndicate_elite/mothership)
-"KP" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/blue,/turf/unsimulated/floor{ icon_state = "wood"},/area/skipjack_station)
-"KQ" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/unsimulated/floor{ icon_state = "wood"},/area/skipjack_station)
-"KR" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hop,/turf/unsimulated/floor{ icon_state = "wood"},/area/skipjack_station)
-"KS" = (/obj/item/weapon/ore,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
-"KT" = (/obj/item/clothing/head/xenos,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
+"KP" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/blue,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station)
+"KQ" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station)
+"KR" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hop,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station)
+"KS" = (/obj/item/weapon/ore,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
+"KT" = (/obj/item/clothing/head/xenos,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
"KU" = (/obj/machinery/door/airlock/centcom{name = "Suit Storage"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"KV" = (/obj/machinery/door/airlock/centcom{name = "Kitchen"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station)
"KW" = (/obj/machinery/door/airlock{name = "Restroom"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station)
"KX" = (/obj/effect/wingrille_spawn/reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station)
-"KY" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/skipjack_station)
-"KZ" = (/obj/item/weapon/storage/box,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
-"La" = (/obj/item/clothing/mask/gas/swat{desc = "A close-fitting mask clearly not made for a human face."; name = "\improper alien mask"},/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
+"KY" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station)
+"KZ" = (/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
+"La" = (/obj/item/clothing/mask/gas/swat{desc = "A close-fitting mask clearly not made for a human face."; name = "\improper alien mask"},/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
"Lb" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/mask/gas/syndicate,/obj/item/clothing/head/helmet/space/void/merc,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"Lc" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/green,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/green,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"Ld" = (/obj/machinery/vending/snack{name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
-"Le" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/syndicate_station)
-"Lf" = (/obj/structure/sign/double/map/right{pixel_y = 32},/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/syndicate_station)
-"Lg" = (/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/syndicate_station)
-"Lh" = (/obj/item/weapon/storage/box/syndie_kit/clerical,/obj/structure/table/standard,/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/syndicate_station)
+"Le" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
+"Lf" = (/obj/structure/sign/double/map/right{pixel_y = 32},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
+"Lg" = (/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
+"Lh" = (/obj/item/weapon/storage/box/syndie_kit/clerical,/obj/structure/table/standard,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
"Li" = (/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station)
"Lj" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station)
-"Lk" = (/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/skipjack_station)
-"Ll" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/skipjack_station)
+"Lk" = (/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station)
+"Ll" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station)
"Lm" = (/obj/machinery/suit_cycler/syndicate{locked = 0},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station)
"Ln" = (/obj/effect/decal/cleanable/cobweb2{icon_state = "spiderling"; name = "dead spider"},/turf/unsimulated/floor{icon_state = "steel_dirty"},/area/skipjack_station)
-"Lo" = (/obj/structure/table/rack,/obj/item/weapon/tank/vox,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
-"Lp" = (/obj/item/pizzabox/meat,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
+"Lo" = (/obj/structure/table/rack,/obj/item/weapon/tank/vox,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
+"Lp" = (/obj/item/pizzabox/meat,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
"Lq" = (/obj/structure/table/rack,/obj/item/weapon/storage/briefcase/inflatable,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"Lr" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/blue,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"Ls" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/med,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/med,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"Lt" = (/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
-"Lu" = (/obj/structure/bed/chair/comfy/black,/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/syndicate_station)
+"Lu" = (/obj/structure/bed/chair/comfy/black,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
"Lv" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station)
"Lw" = (/obj/structure/table/standard,/obj/item/device/radio/headset/syndicate/alt,/obj/item/device/radio/headset/syndicate/alt,/obj/item/device/radio/headset/syndicate/alt,/obj/item/device/radio/headset/syndicate/alt,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station)
-"Lx" = (/obj/structure/bed/chair,/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/skipjack_station)
-"Ly" = (/obj/item/weapon/tank/vox,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
+"Lx" = (/obj/structure/bed/chair,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station)
+"Ly" = (/obj/item/weapon/tank/vox,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
"Lz" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/orange,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/orange,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"LA" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/engie,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/engie,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"LB" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
-"LC" = (/obj/machinery/door/airlock/centcom{name = "Barracks"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/syndicate_station)
-"LD" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/syndicate_station)
-"LE" = (/obj/structure/table/glass,/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/syndicate_station)
-"LF" = (/obj/structure/bed/chair/comfy/black{dir = 8},/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/syndicate_station)
+"LC" = (/obj/machinery/door/airlock/centcom{name = "Barracks"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
+"LD" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
+"LE" = (/obj/structure/table/glass,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
+"LF" = (/obj/structure/bed/chair/comfy/black{dir = 8},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
"LG" = (/obj/machinery/door/airlock/centcom{name = "Barracks"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station)
"LH" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 8},/obj/item/clothing/glasses/sunglasses/prescription,/obj/item/clothing/glasses/sunglasses/prescription,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station)
-"LI" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/skipjack_station)
-"LJ" = (/obj/structure/table/steel,/obj/item/device/pda/syndicate,/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/skipjack_station)
-"LK" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/skipjack_station)
-"LL" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/item/weapon/tank/vox,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
-"LM" = (/obj/item/clothing/head/philosopher_wig,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
+"LI" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station)
+"LJ" = (/obj/structure/table/steel,/obj/item/device/pda/syndicate,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station)
+"LK" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station)
+"LL" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/item/weapon/tank/vox,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
+"LM" = (/obj/item/clothing/head/philosopher_wig,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
"LN" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"LO" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/red,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/red,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"LP" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"LQ" = (/obj/structure/table/glass,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"LR" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station)
-"LS" = (/obj/structure/table/steel,/obj/item/device/radio/uplink,/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/skipjack_station)
-"LT" = (/obj/item/weapon/gun/launcher/pneumatic,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
-"LU" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/syndicate_station)
+"LS" = (/obj/structure/table/steel,/obj/item/device/radio/uplink,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station)
+"LT" = (/obj/item/weapon/gun/launcher/pneumatic,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
+"LU" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station)
"LV" = (/obj/structure/table/standard,/obj/item/device/pda/syndicate,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station)
-"LW" = (/obj/item/weapon/storage/box/syndie_kit/spy,/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/skipjack_station)
-"LX" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{ name = "plating"; icon_state = "cult"},/area/skipjack_station)
-"LY" = (/obj/structure/ore_box,/turf/unsimulated/floor{ icon_state = "asteroid"},/area/skipjack_station)
+"LW" = (/obj/item/weapon/storage/box/syndie_kit/spy,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station)
+"LX" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station)
+"LY" = (/obj/structure/ore_box,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station)
"LZ" = (/obj/structure/table/rack,/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"Ma" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
"Mb" = (/obj/structure/table/rack,/obj/item/weapon/rig/merc/empty,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station)
@@ -2003,9 +2003,9 @@
"MA" = (/obj/structure/table/steel,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"MB" = (/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"MC" = (/obj/machinery/autolathe{hacked = 1; name = "hacked autolathe"},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
-"MD" = (/obj/structure/shuttle/engine/heater{ icon_state = "heater"; dir = 4},/turf/simulated/floor/airless,/area/syndicate_station/start)
-"ME" = (/obj/structure/shuttle/engine/router{ icon_state = "router"; dir = 8},/turf/simulated/floor/airless,/area/syndicate_station/start)
-"MF" = (/turf/space,/obj/structure/shuttle/engine/propulsion{ icon_state = "propulsion_r"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start)
+"MD" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/simulated/floor/airless,/area/syndicate_station/start)
+"ME" = (/obj/structure/shuttle/engine/router{icon_state = "router"; dir = 8},/turf/simulated/floor/airless,/area/syndicate_station/start)
+"MF" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start)
"MG" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_west_vent"},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"MH" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_west_sensor"; pixel_x = 25},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"MI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
@@ -2013,17 +2013,17 @@
"MK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"ML" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_east_sensor"; pixel_x = -25},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"MM" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_east_vent"},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
-"MN" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 6},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start)
+"MN" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start)
"MO" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "merc_shuttle_pump"},/obj/machinery/button/remote/blast_door{id = "smindicate"; name = "ship lockdown control"; pixel_x = -25},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
"MP" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "merc_shuttle_pump"},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "merc_shuttle_sensor"; pixel_x = 28; pixel_y = 8},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "merc_shuttle"; pixel_x = 24; pixel_y = -2; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
"MQ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start)
-"MR" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 10},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start)
+"MR" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 10},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start)
"MS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start)
"MT" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"MU" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"MV" = (/obj/machinery/recharger/wallcharger{pixel_x = -25},/obj/structure/table/steel,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"MW" = (/obj/machinery/light{dir = 4},/obj/structure/table/rack,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
-"MX" = (/turf/space,/obj/structure/shuttle/engine/propulsion{ icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start)
+"MX" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start)
"MY" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/machinery/meter,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"MZ" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "vox_west_vent"; tag_exterior_door = "vox_northwest_lock"; frequency = 1331; id_tag = "vox_west_control"; tag_interior_door = "vox_southwest_lock"; pixel_x = 24; req_access = list(150); tag_chamber_sensor = "vox_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "vox_west_vent"},/obj/machinery/light/small,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Na" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
@@ -2034,14 +2034,14 @@
"Nf" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1331; id_tag = "skipjack_shuttle"; pixel_x = -24; req_access = list(150); tag_airpump = "vox_east_vent"; tag_chamber_sensor = "vox_east_sensor"; tag_exterior_door = "vox_northeast_lock"; tag_interior_door = "vox_southeast_lock"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "vox_east_vent"},/obj/machinery/light/small,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Ng" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/obj/machinery/meter,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Nh" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "merc_shuttle"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
-"Ni" = (/obj/machinery/atmospherics/pipe/manifold/visible{ icon_state = "map"; dir = 8},/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1331; id_tag = "merc_shuttle_inner"; name = "Ship External Access"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
+"Ni" = (/obj/machinery/atmospherics/pipe/manifold/visible{icon_state = "map"; dir = 8},/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1331; id_tag = "merc_shuttle_inner"; name = "Ship External Access"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
"Nj" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "merc_shuttle_pump"},/obj/machinery/light/small,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
"Nk" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "merc_shuttle_pump"},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
"Nl" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1331; id_tag = "merc_shuttle_inner"; name = "Ship External Access"; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
"Nm" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "merc_shuttle"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"Nn" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"No" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
-"Np" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
+"Np" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"Nq" = (/obj/machinery/recharger/wallcharger{pixel_x = -25},/obj/structure/table/steel,/obj/item/weapon/storage/box/frags,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"Nr" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_closed"; id_tag = "vox_southwest_lock"; locked = 0; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Ns" = (/obj/machinery/light/small{dir = 8},/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
@@ -2051,14 +2051,14 @@
"Nw" = (/obj/machinery/button/remote/blast_door{id = "skipjackshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/wall/skipjack,/area/skipjack_station/start)
"Nx" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_closed"; id_tag = "vox_southeast_lock"; locked = 0; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Ny" = (/obj/machinery/porta_turret/ai_defense,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
-"Nz" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 5},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start)
+"Nz" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start)
"NA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/plating,/area/syndicate_station/start)
-"NB" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start)
-"NC" = (/obj/structure/table/steel,/obj/effect/spawner/newbomb/timer/syndicate,/obj/item/weapon/screwdriver,/obj/item/device/assembly/signaler{pixel_y = 2},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
+"NB" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start)
+"NC" = (/obj/structure/table/steel,/obj/effect/spawner/newbomb/timer/syndicate,/obj/item/weapon/tool/screwdriver,/obj/item/device/assembly/signaler{pixel_y = 2},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"ND" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"NE" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
"NF" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
-"NG" = (/turf/space,/obj/structure/shuttle/engine/propulsion{ icon_state = "propulsion_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start)
+"NG" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start)
"NH" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "vox_west_control"; pixel_x = -22; req_one_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"NI" = (/obj/structure/table/rack,/obj/item/weapon/material/harpoon,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/random/rigsuit,/obj/random/multiple/voidsuit,/obj/random/multiple/voidsuit,/obj/random/energy,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"NJ" = (/obj/structure/table/rack,/obj/random/rigsuit,/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
@@ -2090,11 +2090,11 @@
"Oj" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter/zippo,/obj/item/clothing/gloves/yellow,/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/weapon/card/emag,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Ok" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start)
"Ol" = (/obj/structure/table/steel_reinforced,/obj/machinery/button/remote/blast_door{id = "syndieshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
-"Om" = (/obj/structure/bed/chair/comfy/red{ icon_state = "comfychair_preview"; dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
+"Om" = (/obj/structure/bed/chair/comfy/red{icon_state = "comfychair_preview"; dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"On" = (/obj/machinery/light{dir = 4},/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"Oo" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/structure/bed/chair/comfy/red{dir = 4; icon_state = "comfychair_preview"},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"Op" = (/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
-"Oq" = (/obj/machinery/light{dir = 4},/obj/structure/bed/chair/comfy/red{ icon_state = "comfychair_preview"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
+"Oq" = (/obj/machinery/light{dir = 4},/obj/structure/bed/chair/comfy/red{icon_state = "comfychair_preview"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"Or" = (/obj/machinery/door/airlock/voidcraft{req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"Os" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"Ot" = (/obj/machinery/teleport/hub,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
@@ -2110,10 +2110,10 @@
"OD" = (/turf/space,/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating/airless/carry,/area/skipjack_station/start)
"OE" = (/obj/item/robot_parts/head,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"OF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start)
-"OG" = (/obj/structure/flight_right{ icon_state = "right"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
+"OG" = (/obj/structure/flight_right{icon_state = "right"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"OH" = (/obj/machinery/turretid{pixel_x = 32; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"OI" = (/obj/structure/bed/chair/comfy/red{dir = 4; icon_state = "comfychair_preview"},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
-"OJ" = (/obj/structure/bed/chair/comfy/red{ icon_state = "comfychair_preview"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
+"OJ" = (/obj/structure/bed/chair/comfy/red{icon_state = "comfychair_preview"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"OK" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"OL" = (/obj/machinery/turretid{pixel_x = 0; pixel_y = 32; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"OM" = (/obj/structure/table/rack,/obj/item/device/aicard,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
@@ -2121,7 +2121,7 @@
"OO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"OP" = (/obj/item/robot_parts/l_leg,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"OQ" = (/obj/machinery/computer/shuttle_control/web/syndicate{dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
-"OR" = (/obj/structure/bed/chair/comfy/red{ icon_state = "comfychair_preview"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
+"OR" = (/obj/structure/bed/chair/comfy/red{icon_state = "comfychair_preview"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"OS" = (/obj/machinery/door/airlock/voidcraft/vertical{req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"OT" = (/mob/living/simple_animal/cat/kitten{name = "Enola"},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"OU" = (/obj/machinery/door/airlock/voidcraft/vertical{req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
@@ -2136,7 +2136,7 @@
"Pd" = (/obj/structure/table/steel,/obj/machinery/recharger,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
"Pe" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Pf" = (/obj/item/robot_parts/robot_suit,/obj/item/robot_parts/r_leg,/obj/item/robot_parts/r_arm,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
-"Pg" = (/obj/structure/flight_left{ icon_state = "left"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
+"Pg" = (/obj/structure/flight_left{icon_state = "left"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"Ph" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"Pi" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
"Pj" = (/obj/machinery/recharge_station,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
@@ -2147,8 +2147,8 @@
"Po" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
"Pp" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/floor/white,/area/skipjack_station/start)
"Pq" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
-"Pr" = (/obj/item/weapon/wrench,/obj/item/weapon/mop,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
-"Ps" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/item/weapon/crowbar,/obj/item/device/suit_cooling_unit,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
+"Pr" = (/obj/item/weapon/tool/wrench,/obj/item/weapon/mop,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
+"Ps" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/item/weapon/tool/crowbar,/obj/item/device/suit_cooling_unit,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Pt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start)
"Pu" = (/obj/structure/table/steel_reinforced,/obj/machinery/recharger,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"Pv" = (/obj/structure/bed/chair/comfy/red,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
@@ -2178,8 +2178,8 @@
"PT" = (/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start)
"PU" = (/obj/machinery/light{dir = 1},/obj/structure/table/steel,/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/item/device/defib_kit/compact/combat/loaded,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"PV" = (/obj/structure/closet/secure_closet/medical_wall{pixel_y = 32; req_access = list(150)},/obj/item/bodybag,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 4; pixel_y = 7},/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/storage/firstaid/combat,/obj/item/weapon/storage/firstaid/clotting,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
-"PW" = (/obj/machinery/atmospherics/pipe/manifold/visible{ icon_state = "map"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
-"PX" = (/obj/machinery/atmospherics/pipe/simple/visible{ icon_state = "intact"; dir = 9},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
+"PW" = (/obj/machinery/atmospherics/pipe/manifold/visible{icon_state = "map"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
+"PX" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"PY" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating/airless,/area/skipjack_station/start)
"PZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Qa" = (/obj/structure/table/steel,/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
@@ -2188,9 +2188,9 @@
"Qd" = (/obj/machinery/door/window{dir = 8; name = "Cell"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"Qe" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"Qf" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
-"Qg" = (/obj/machinery/atmospherics/portables_connector{ icon_state = "map_connector"; dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
+"Qg" = (/obj/machinery/atmospherics/portables_connector{icon_state = "map_connector"; dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"Qh" = (/obj/structure/table/steel,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/regular,/obj/machinery/atmospherics/pipe/manifold/visible,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/adv,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
-"Qi" = (/obj/machinery/atmospherics/unary/freezer{ icon_state = "freezer_0"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
+"Qi" = (/obj/machinery/atmospherics/unary/freezer{icon_state = "freezer_0"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"Qj" = (/turf/simulated/shuttle/wall/no_join{base_state = "orange"; icon = 'icons/turf/shuttle_orange.dmi'; icon_state = "orange"},/area/centcom/evac)
"Qk" = (/obj/structure/table/standard,/obj/item/weapon/handcuffs/legcuffs,/turf/simulated/shuttle/floor/black,/area/skipjack_station/start)
"Ql" = (/obj/structure/table/standard,/obj/item/weapon/deck/cards,/turf/simulated/shuttle/floor/black,/area/skipjack_station/start)
@@ -2226,7 +2226,7 @@
"QP" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/steel,/obj/item/weapon/storage/firstaid/surgery,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"QQ" = (/obj/machinery/optable,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"QR" = (/obj/machinery/iv_drip,/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
-"QS" = (/obj/structure/shuttle/engine/heater{ icon_state = "heater"; dir = 4},/obj/machinery/turretid{pixel_x = 32; req_access = list(150)},/obj/machinery/turretid{pixel_x = 32; req_access = list(150)},/turf/simulated/floor/airless,/area/syndicate_station/start)
+"QS" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/machinery/turretid{pixel_x = 32; req_access = list(150)},/obj/machinery/turretid{pixel_x = 32; req_access = list(150)},/turf/simulated/floor/airless,/area/syndicate_station/start)
"QT" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor/black,/area/skipjack_station/start)
"QU" = (/obj/item/weapon/bedsheet/orange,/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start)
"QV" = (/obj/item/weapon/bedsheet/green,/obj/machinery/light/small{dir = 4},/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start)
@@ -2499,4 +2499,3 @@ aaaaRfababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
-
diff --git a/maps/southern_cross/southern_cross-8.dmm b/maps/southern_cross/southern_cross-8.dmm
index 13380f6c75..1d136a9a6d 100644
--- a/maps/southern_cross/southern_cross-8.dmm
+++ b/maps/southern_cross/southern_cross-8.dmm
@@ -55,7 +55,7 @@
"bc" = (/obj/structure/table/steel,/turf/simulated/floor/plating/external,/area/surface/outside/path/wilderness)
"bd" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plating/external,/area/surface/outside/path/wilderness)
"be" = (/obj/structure/closet,/obj/random/maintenance/clean,/turf/simulated/floor/plating/external,/area/surface/outside/path/wilderness)
-"bf" = (/obj/structure/closet/crate,/obj/random/powercell,/obj/item/weapon/screwdriver,/turf/simulated/floor/plating/external,/area/surface/outside/path/wilderness)
+"bf" = (/obj/structure/closet/crate,/obj/random/powercell,/obj/item/weapon/tool/screwdriver,/turf/simulated/floor/plating/external,/area/surface/outside/path/wilderness)
"bg" = (/obj/random/junk,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "mining_dock_1"; name = "shuttle bay controller"; pixel_x = 0; pixel_y = -26; tag_door = "mining_dock_1_door"},/turf/simulated/floor/plating/external,/area/surface/outside/path/wilderness)
"bh" = (/obj/machinery/space_heater,/turf/simulated/floor/plating/external,/area/surface/outside/path/wilderness)
"bi" = (/obj/item/weapon/banner/virgov,/turf/simulated/floor/plating/external,/area/surface/outside/path/wilderness)
@@ -329,3 +329,4 @@ aaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac
aaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacadacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacbqbrblbsbqacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacadacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaKaKaKacacacacacacacacaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbtbtbtbqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabububuaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/maps/southern_cross/southern_cross_areas.dm b/maps/southern_cross/southern_cross_areas.dm
index ffa2ca4d1a..92766ce1ab 100644
--- a/maps/southern_cross/southern_cross_areas.dm
+++ b/maps/southern_cross/southern_cross_areas.dm
@@ -57,6 +57,9 @@
name = "Southern Shoreline"
icon_state = "southeast"
+/area/surface/outside
+ ambience = AMBIENCE_SIF
+
// The area near the outpost, so POIs don't show up right next to the outpost.
/area/surface/outside/plains/outpost
name = "Outpost Perimeter"
@@ -122,7 +125,6 @@
flags = RAD_SHIELDED
/area/surface/cave
- ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg', 'sound/ambience/serspaceamb1.ogg')
// The bottom half that connects to the outpost and is safer.
/area/surface/cave/explored/normal
@@ -147,6 +149,7 @@
//Surface Outposts
/area/surface/outpost
+ ambience = AMBIENCE_GENERIC
// Main mining outpost
/area/surface/outpost/mining_main
@@ -281,6 +284,7 @@
/area/surface/outpost/main/gen_room
name = "\improper Main Outpost SMES"
icon_state = "substation"
+ ambience = AMBIENCE_ENGINEERING
/area/surface/outpost/main/gen_room/smes
name = "\improper Main Outpost Dorm SMES"
@@ -345,9 +349,11 @@
name = "The Wall"
icon_state = "red"
requires_power = FALSE
+ ambience = AMBIENCE_HIGHSEC
/area/surface/outpost/wall/checkpoint
name = "Checkpoint"
+ ambience = AMBIENCE_HIGHSEC
//Mining Station
@@ -364,7 +370,6 @@
/area/outpost/mining_station/gen_station
name = "Mining Station Generator Room"
icon_state = "substation"
- ambience = list('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg')
/area/outpost/mining_station/crew_area
name = "Mining Station Crew Area"
@@ -658,7 +663,7 @@
/area/tcomm/
icon_state = "tcomsatcham"
- ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+ holomap_color = HOLOMAP_AREACOLOR_COMMAND
/area/tcomm/entrance
name = "\improper Telecomms Teleporter"
@@ -667,7 +672,6 @@
/area/tcomm/tcomfoyer
name = "\improper Telecomms Foyer"
icon_state = "tcomsatfoyer"
- ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
/area/tcomm/chamber
name = "\improper Telecomms Central Compartment"
@@ -676,7 +680,6 @@
/area/tcomm/tcomstorage
name = "\improper Telecomms Storage"
icon_state = "tcomsatstore"
- ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
/area/tcomm/computer
name = "\improper Telecomms Control Room"
@@ -739,22 +742,27 @@
/area/crew_quarters/heads/sc/hop
name = "\improper Command - HoP's Office"
icon_state = "head_quarters"
+ holomap_color = HOLOMAP_AREACOLOR_COMMAND
/area/crew_quarters/heads/sc/hor
name = "\improper Research - RD's Office"
icon_state = "head_quarters"
+ holomap_color = HOLOMAP_AREACOLOR_SCIENCE
/area/crew_quarters/heads/sc/chief
name = "\improper Engineering - CE's Office"
icon_state = "head_quarters"
+ holomap_color = HOLOMAP_AREACOLOR_ENGINEERING
/area/crew_quarters/heads/sc/hos
name = "\improper Security - HoS' Office"
icon_state = "head_quarters"
+ holomap_color = HOLOMAP_AREACOLOR_SECURITY
/area/crew_quarters/heads/sc/cmo
name = "\improper Medbay - CMO's Office"
icon_state = "head_quarters"
+ holomap_color = HOLOMAP_AREACOLOR_MEDICAL
/area/engineering/engineer_eva
name = "\improper Engineering EVA"
@@ -896,6 +904,10 @@
//Deck Three (Z-3)
+/area/ai
+ holomap_color = HOLOMAP_AREACOLOR_COMMAND
+ ambience = AMBIENCE_AI
+
/area/ai/ai_cyborg_station
name = "\improper Cyborg Station"
icon_state = "ai_cyborg"
@@ -904,12 +916,10 @@
/area/ai/ai_upload
name = "\improper AI Upload Chamber"
icon_state = "ai_upload"
- ambience = list('sound/ambience/ambimalf.ogg')
/area/ai/ai_upload_foyer
name = "AI Upload Access"
icon_state = "ai_foyer"
- ambience = list('sound/ambience/ambimalf.ogg')
sound_env = SMALL_ENCLOSED
/area/ai/ai_server_room
@@ -921,6 +931,7 @@
name = "\improper Command - Station Director's Office"
icon_state = "captain"
sound_env = MEDIUM_SOFTFLOOR
+ holomap_color = HOLOMAP_AREACOLOR_COMMAND
area/crew_quarters/heads/sc/hop/quarters
name = "\improper Command - HoP's Quarters"
@@ -980,6 +991,7 @@ area/crew_quarters/heads/sc/hop/quarters
/area/maintenance/solars
icon_state = "SolarcontrolA"
sound_env = SMALL_ENCLOSED
+ holomap_color = HOLOMAP_AREACOLOR_ENGINEERING
/area/maintenance/solars/aftportsolar
name = "Solar Maintenance - Aft Port"
@@ -1000,6 +1012,7 @@ area/crew_quarters/heads/sc/hop/quarters
/area/solar
requires_power = 1
always_unpowered = 1
+ ambience = AMBIENCE_SPACE
/area/solar/aftportsolar
name = "\improper Aft Port Solar Array"
@@ -1020,6 +1033,7 @@ area/crew_quarters/heads/sc/hop/quarters
/area/thirddeck/roof
name = "\improper Third Deck Plating"
dynamic_lighting = 0
+ ambience = AMBIENCE_SPACE
// Shuttles
@@ -1030,6 +1044,7 @@ area/crew_quarters/heads/sc/hop/quarters
icon_state = "centcom"
requires_power = 0
flags = RAD_SHIELDED
+ ambience = AMBIENCE_HIGHSEC
/area/shuttle/response_ship/start
name = "\improper Response Team Base"
@@ -1211,6 +1226,7 @@ area/crew_quarters/heads/sc/hop/quarters
requires_power = 0
dynamic_lighting = 0
flags = RAD_SHIELDED
+ ambience = AMBIENCE_HIGHSEC
/area/syndicate_station
name = "\improper Mercenary Base"
@@ -1218,6 +1234,7 @@ area/crew_quarters/heads/sc/hop/quarters
requires_power = 0
dynamic_lighting = 0
flags = RAD_SHIELDED
+ ambience = AMBIENCE_HIGHSEC
/area/syndicate_station/start
name = "\improper Mercenary Ship"
@@ -1278,6 +1295,7 @@ area/crew_quarters/heads/sc/hop/quarters
requires_power = 0
dynamic_lighting = 0
flags = RAD_SHIELDED
+ ambience = AMBIENCE_HIGHSEC
/area/skipjack_station/transit
name = "transit"
@@ -1331,6 +1349,7 @@ area/crew_quarters/heads/sc/hop/quarters
icon_state = "green"
requires_power = 0
flags = RAD_SHIELDED
+ ambience = AMBIENCE_HIGHSEC
/area/ninja_dojo/dojo
name = "\improper Clan Dojo"
@@ -1560,7 +1579,9 @@ area/crew_quarters/heads/sc/hop/quarters
/area/wreck/ufoship
name = "\improper Wreck"
icon_state = "storage"
+ ambience = AMBIENCE_OTHERWORLDLY
/area/wreck/supplyshuttle
name = "\improper Wreck"
icon_state = "storage"
+ ambience = AMBIENCE_RUINS
diff --git a/maps/southern_cross/southern_cross_defines.dm b/maps/southern_cross/southern_cross_defines.dm
index 2fa51eef61..6010cac824 100644
--- a/maps/southern_cross/southern_cross_defines.dm
+++ b/maps/southern_cross/southern_cross_defines.dm
@@ -19,6 +19,11 @@
lobby_icon = 'icons/misc/title.dmi'
lobby_screens = list("mockingjay00") // New lobby screen if possible.
+ holomap_smoosh = list(list(
+ Z_LEVEL_STATION_ONE,
+ Z_LEVEL_STATION_TWO,
+ Z_LEVEL_STATION_THREE))
+
zlevel_datum_type = /datum/map_z_level/southern_cross
station_name = "NLS Southern Cross"
@@ -105,26 +110,40 @@
// Todo: Forest generation.
return 1
+// For making the 6-in-1 holomap, we calculate some offsets
+#define SOUTHERN_CROSS_MAP_SIZE 160 // Width and height of compiled in Southern Cross z levels.
+#define SOUTHERN_CROSS_HOLOMAP_CENTER_GUTTER 40 // 40px central gutter between columns
+#define SOUTHERN_CROSS_HOLOMAP_MARGIN_X ((HOLOMAP_ICON_SIZE - (2*SOUTHERN_CROSS_MAP_SIZE) - SOUTHERN_CROSS_HOLOMAP_CENTER_GUTTER) / 2) // 100
+#define SOUTHERN_CROSS_HOLOMAP_MARGIN_Y ((HOLOMAP_ICON_SIZE - (3*SOUTHERN_CROSS_MAP_SIZE)) / 2) // 60
+
/datum/map_z_level/southern_cross/station
flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES
+ holomap_legend_x = 220
+ holomap_legend_y = 160
/datum/map_z_level/southern_cross/station/station_one
z = Z_LEVEL_STATION_ONE
name = "Deck 1"
base_turf = /turf/space
transit_chance = 6
+ holomap_offset_x = SOUTHERN_CROSS_HOLOMAP_MARGIN_X - 40
+ holomap_offset_y = SOUTHERN_CROSS_HOLOMAP_MARGIN_Y + SOUTHERN_CROSS_MAP_SIZE*0
/datum/map_z_level/southern_cross/station/station_two
z = Z_LEVEL_STATION_TWO
name = "Deck 2"
base_turf = /turf/simulated/open
transit_chance = 6
+ holomap_offset_x = SOUTHERN_CROSS_HOLOMAP_MARGIN_X - 40
+ holomap_offset_y = SOUTHERN_CROSS_HOLOMAP_MARGIN_Y + SOUTHERN_CROSS_MAP_SIZE*1
/datum/map_z_level/southern_cross/station/station_three
z = Z_LEVEL_STATION_THREE
name = "Deck 3"
base_turf = /turf/simulated/open
transit_chance = 6
+ holomap_offset_x = HOLOMAP_ICON_SIZE - SOUTHERN_CROSS_HOLOMAP_MARGIN_X - SOUTHERN_CROSS_MAP_SIZE - 40
+ holomap_offset_y = SOUTHERN_CROSS_HOLOMAP_MARGIN_Y + SOUTHERN_CROSS_MAP_SIZE*1
/datum/map_z_level/southern_cross/empty_space
z = Z_LEVEL_EMPTY_SPACE
diff --git a/maps/southern_cross/southern_cross_jobs.dm b/maps/southern_cross/southern_cross_jobs.dm
index ac74199d42..a9f059f65e 100644
--- a/maps/southern_cross/southern_cross_jobs.dm
+++ b/maps/southern_cross/southern_cross_jobs.dm
@@ -76,7 +76,7 @@ var/const/access_explorer = 43
faction = "Station"
total_positions = 2
spawn_positions = 2
- supervisors = "the head of personnel"
+ supervisors = "the Head of Personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/pilot
economic_modifier = 4
@@ -84,7 +84,7 @@ var/const/access_explorer = 43
minimal_access = list(access_pilot, access_cargo, access_mining, access_mining_station)
outfit_type = /decl/hierarchy/outfit/job/pilot
- job_description = "You fly one of the shuttles that dock in the station hangars."
+ job_description = "A Pilot flies one of the shuttles between the Southern Cross and the outpost on Sif."
/datum/job/explorer
title = "Explorer"
@@ -94,7 +94,7 @@ var/const/access_explorer = 43
faction = "Station"
total_positions = 4
spawn_positions = 4
- supervisors = "the explorer leader and the head of personnel"
+ supervisors = "the Head of Personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/explorer
economic_modifier = 4
@@ -102,6 +102,7 @@ var/const/access_explorer = 43
minimal_access = list(access_explorer)
outfit_type = /decl/hierarchy/outfit/job/explorer2
+ job_description = "An Explorer searches for interesting things on the surface of Sif, and returns them to the station."
/*
alt_titles = list(
@@ -117,10 +118,12 @@ var/const/access_explorer = 43
faction = "Station"
total_positions = 2
spawn_positions = 2
- supervisors = "the chief medical officer"
+ supervisors = "the Chief Medical Officer"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/medical
economic_modifier = 4
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist, access_explorer)
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_explorer)
- outfit_type = /decl/hierarchy/outfit/job/medical/sar
\ No newline at end of file
+
+ outfit_type = /decl/hierarchy/outfit/job/medical/sar
+ job_description = "A Search and Rescue recovers individuals who are injured or dead on the surface of Sif."
\ No newline at end of file
diff --git a/maps/southern_cross/structures/closets/engineering.dm b/maps/southern_cross/structures/closets/engineering.dm
index db28e6573e..a80fa8eec8 100644
--- a/maps/southern_cross/structures/closets/engineering.dm
+++ b/maps/southern_cross/structures/closets/engineering.dm
@@ -5,33 +5,33 @@
/obj/structure/closet/secure_closet/engineering_chief_wardrobe
name = "chief engineer's wardrobe"
- req_access = list(access_ce)
icon_state = "securece1"
icon_closed = "securece"
icon_locked = "securece1"
icon_opened = "secureceopen"
icon_broken = "securecebroken"
icon_off = "secureceoff"
+ req_access = list(access_ce)
+ starts_with = list(
+ /obj/item/clothing/under/rank/chief_engineer,
+ /obj/item/clothing/under/rank/chief_engineer/skirt,
+ /obj/item/clothing/head/hardhat/white,
+ /obj/item/clothing/shoes/brown,
+ /obj/item/weapon/cartridge/ce,
+ /obj/item/device/radio/headset/heads/ce,
+ /obj/item/device/radio/headset/heads/ce/alt,
+ /obj/item/clothing/suit/storage/hazardvest,
+ /obj/item/clothing/mask/gas,
+ /obj/item/weapon/tank/emergency/oxygen/engi,
+ /obj/item/taperoll/engineering,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/engineering)
-/obj/structure/closet/secure_closet/engineering_chief_wardrobe/New()
- ..()
+/obj/structure/closet/secure_closet/engineering_chief_wardrobe/initialize()
if(prob(50))
- new /obj/item/weapon/storage/backpack/industrial(src)
+ starts_with += /obj/item/weapon/storage/backpack/industrial
else
- new /obj/item/weapon/storage/backpack/satchel/eng(src)
+ starts_with += /obj/item/weapon/storage/backpack/satchel/eng
if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/eng(src)
- new /obj/item/clothing/under/rank/chief_engineer(src)
- new /obj/item/clothing/under/rank/chief_engineer/skirt(src)
- new /obj/item/clothing/head/hardhat/white(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/weapon/cartridge/ce(src)
- new /obj/item/device/radio/headset/heads/ce(src)
- new /obj/item/device/radio/headset/heads/ce/alt(src)
- new /obj/item/clothing/suit/storage/hazardvest(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/weapon/tank/emergency/oxygen/engi(src)
- new /obj/item/taperoll/engineering(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src)
- return
\ No newline at end of file
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/eng
+ return ..()
diff --git a/maps/southern_cross/structures/closets/medical.dm b/maps/southern_cross/structures/closets/medical.dm
index d94f666556..2b59597d33 100644
--- a/maps/southern_cross/structures/closets/medical.dm
+++ b/maps/southern_cross/structures/closets/medical.dm
@@ -5,46 +5,47 @@
/obj/structure/closet/secure_closet/CMO_wardrobe
name = "chief medical officer's locker"
- req_access = list(access_cmo)
icon_state = "cmosecure1"
icon_closed = "cmosecure"
icon_locked = "cmosecure1"
icon_opened = "cmosecureopen"
icon_broken = "cmosecurebroken"
icon_off = "cmosecureoff"
+ req_access = list(access_cmo)
-/obj/structure/closet/secure_closet/CMO_wardrobe/New()
- ..()
+ starts_with = list(
+ /obj/item/clothing/under/rank/chief_medical_officer,
+ /obj/item/clothing/under/rank/chief_medical_officer/skirt,
+ /obj/item/clothing/suit/storage/toggle/labcoat/cmo,
+ /obj/item/clothing/suit/storage/toggle/labcoat/cmoalt,
+ /obj/item/weapon/cartridge/cmo,
+ /obj/item/clothing/gloves/sterile/latex,
+ /obj/item/clothing/shoes/brown,
+ /obj/item/device/radio/headset/heads/cmo,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/medical,
+ /obj/item/clothing/shoes/white)
+
+/obj/structure/closet/secure_closet/CMO_wardrobe/initialize()
if(prob(50))
- new /obj/item/weapon/storage/backpack/medic(src)
+ starts_with += /obj/item/weapon/storage/backpack/medic
else
- new /obj/item/weapon/storage/backpack/satchel/med(src)
+ starts_with += /obj/item/weapon/storage/backpack/satchel/med
if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/med(src)
- new /obj/item/clothing/shoes/white(src)
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/med
switch(pick("blue", "green", "purple", "black", "navyblue"))
if ("blue")
- new /obj/item/clothing/under/rank/medical/scrubs(src)
- new /obj/item/clothing/head/surgery/blue(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs
+ starts_with += /obj/item/clothing/head/surgery/blue
if ("green")
- new /obj/item/clothing/under/rank/medical/scrubs/green(src)
- new /obj/item/clothing/head/surgery/green(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/green
+ starts_with += /obj/item/clothing/head/surgery/green
if ("purple")
- new /obj/item/clothing/under/rank/medical/scrubs/purple(src)
- new /obj/item/clothing/head/surgery/purple(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/purple
+ starts_with += /obj/item/clothing/head/surgery/purple
if ("black")
- new /obj/item/clothing/under/rank/medical/scrubs/black(src)
- new /obj/item/clothing/head/surgery/black(src)
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/black
+ starts_with += /obj/item/clothing/head/surgery/black
if ("navyblue")
- new /obj/item/clothing/under/rank/medical/scrubs/navyblue(src)
- new /obj/item/clothing/head/surgery/navyblue(src)
- new /obj/item/clothing/under/rank/chief_medical_officer(src)
- new /obj/item/clothing/under/rank/chief_medical_officer/skirt(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat/cmoalt(src)
- new /obj/item/weapon/cartridge/cmo(src)
- new /obj/item/clothing/gloves/sterile/latex(src)
- new /obj/item/clothing/shoes/brown (src)
- new /obj/item/device/radio/headset/heads/cmo(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src)
- return
\ No newline at end of file
+ starts_with += /obj/item/clothing/under/rank/medical/scrubs/navyblue
+ starts_with += /obj/item/clothing/head/surgery/navyblue
+ return ..()
diff --git a/maps/southern_cross/structures/closets/misc.dm b/maps/southern_cross/structures/closets/misc.dm
index 43040e8657..69e8fcb431 100644
--- a/maps/southern_cross/structures/closets/misc.dm
+++ b/maps/southern_cross/structures/closets/misc.dm
@@ -4,41 +4,33 @@
name = "emergency weapon cabinet"
req_one_access = list(access_armory,access_captain)
-/obj/structure/closet/secure_closet/guncabinet/sidearm/New()
- ..()
- for(var/i = 1 to 4)
- new /obj/item/weapon/gun/energy/gun(src)
- return
+ starts_with = list(
+ /obj/item/weapon/gun/energy/gun = 4)
+
/obj/structure/closet/secure_closet/guncabinet/rifle
name = "rifle cabinet"
req_one_access = list(access_explorer,access_brig)
-/obj/structure/closet/secure_closet/guncabinet/rifle/New()
- ..()
- for(var/i = 1 to 9)
- new /obj/item/ammo_magazine/clip/c762/hunter(src)
+ starts_with = list(
+ /obj/item/ammo_magazine/clip/c762/hunter = 9,
+ /obj/item/weapon/gun/projectile/shotgun/pump/rifle = 2)
+
+/obj/structure/closet/secure_closet/guncabinet/rifle/initialize()
if(prob(85))
- new /obj/item/weapon/gun/projectile/shotgun/pump/rifle(src)
+ starts_with += /obj/item/weapon/gun/projectile/shotgun/pump/rifle
else
- new /obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever(src)
- new /obj/item/weapon/gun/projectile/shotgun/pump/rifle(src)
- new /obj/item/weapon/gun/projectile/shotgun/pump/rifle(src)
- return
+ starts_with += /obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever
+ return ..()
/obj/structure/closet/secure_closet/guncabinet/phase
name = "phase pistol cabinet"
req_one_access = list(access_explorer,access_brig)
-/obj/structure/closet/secure_closet/guncabinet/phase/New()
- ..()
- new /obj/item/weapon/gun/energy/phasegun(src)
- new /obj/item/weapon/gun/energy/phasegun(src)
- // One spare cell per gun
- new /obj/item/weapon/cell/device/weapon(src)
- new /obj/item/weapon/cell/device/weapon(src)
- // One spare gun permit per locker
- new /obj/item/clothing/accessory/permit/gun/planetside(src)
+ starts_with = list(
+ /obj/item/weapon/gun/energy/phasegun = 2,
+ /obj/item/weapon/cell/device/weapon = 2,
+ /obj/item/clothing/accessory/permit/gun/planetside)
//Explorer Lockers
@@ -46,30 +38,31 @@
name = "explorer locker"
req_access = list(access_explorer)
-/obj/structure/closet/secure_closet/explorer/New()
- ..()
+ starts_with = list(
+ /obj/item/clothing/under/explorer,
+ /obj/item/clothing/suit/storage/hooded/explorer,
+ /obj/item/clothing/mask/gas/explorer,
+ /obj/item/clothing/shoes/boots/winter/explorer,
+ /obj/item/clothing/gloves/black,
+ /obj/item/device/radio/headset/explorer,
+ /obj/item/device/flashlight,
+ /obj/item/device/gps/explorer,
+ /obj/item/weapon/storage/box/flare,
+ /obj/item/device/geiger,
+ /obj/item/weapon/cell/device,
+ /obj/item/device/radio,
+ /obj/item/stack/marker_beacon/thirty)
+
+/obj/structure/closet/secure_closet/explorer/initialize()
if(prob(50))
- new /obj/item/weapon/storage/backpack(src)
+ starts_with += /obj/item/weapon/storage/backpack
else
- new /obj/item/weapon/storage/backpack/satchel/norm(src)
+ starts_with += /obj/item/weapon/storage/backpack/satchel/norm
if(prob(75))
- new /obj/item/weapon/material/knife/tacknife/survival(src)
+ starts_with += /obj/item/weapon/material/knife/tacknife/survival
else
- new /obj/item/weapon/material/knife/machete(src)
- new /obj/item/clothing/under/explorer(src)
- new /obj/item/clothing/suit/storage/hooded/explorer(src)
- new /obj/item/clothing/mask/gas/explorer(src)
- new /obj/item/clothing/shoes/boots/winter/explorer(src)
- new /obj/item/clothing/gloves/black(src)
- new /obj/item/device/radio/headset/explorer(src)
- new /obj/item/device/flashlight(src)
- new /obj/item/device/gps/explorer(src)
- new /obj/item/weapon/storage/box/flare(src)
- new /obj/item/device/geiger(src)
- new /obj/item/weapon/cell/device(src)
- new /obj/item/device/radio(src)
- new /obj/item/stack/marker_beacon/thirty(src)
- return
+ starts_with += /obj/item/weapon/material/knife/machete
+ return ..()
//SAR Lockers
@@ -84,35 +77,32 @@
icon_off = "medicaloff"
req_access = list(access_medical_equip)
-
-/obj/structure/closet/secure_closet/sar/New()
- ..()
- new /obj/item/weapon/storage/backpack/dufflebag/emt(src)
- new /obj/item/weapon/storage/box/autoinjectors(src)
- new /obj/item/weapon/storage/box/syringes(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src)
- new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src)
- new /obj/item/weapon/storage/belt/medical/emt(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/clothing/suit/storage/hooded/wintercoat/medical/sar(src)
- new /obj/item/clothing/shoes/boots/winter/explorer(src)
- new /obj/item/device/radio/headset/sar(src)
- new /obj/item/weapon/cartridge/medical(src)
- new /obj/item/device/flashlight(src)
- new /obj/item/weapon/tank/emergency/oxygen/engi(src)
- new /obj/item/clothing/glasses/hud/health(src)
- new /obj/item/device/healthanalyzer(src)
- new /obj/item/device/radio/off(src)
- new /obj/random/medical(src)
- new /obj/item/weapon/crowbar(src)
- new /obj/item/weapon/extinguisher/mini(src)
- new /obj/item/weapon/storage/box/freezer(src)
- new /obj/item/clothing/accessory/storage/white_vest(src)
- new /obj/item/taperoll/medical(src)
- new /obj/item/device/gps(src)
- new /obj/item/device/geiger(src)
- new /obj/item/bodybag/cryobag(src)
- return
+ starts_with = list(
+ /obj/item/weapon/storage/backpack/dufflebag/emt,
+ /obj/item/weapon/storage/box/autoinjectors,
+ /obj/item/weapon/storage/box/syringes,
+ /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,
+ /obj/item/weapon/reagent_containers/glass/bottle/antitoxin,
+ /obj/item/weapon/storage/belt/medical/emt,
+ /obj/item/clothing/mask/gas,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/medical/sar,
+ /obj/item/clothing/shoes/boots/winter/explorer,
+ /obj/item/device/radio/headset/sar,
+ /obj/item/weapon/cartridge/medical,
+ /obj/item/device/flashlight,
+ /obj/item/weapon/tank/emergency/oxygen/engi,
+ /obj/item/clothing/glasses/hud/health,
+ /obj/item/device/healthanalyzer,
+ /obj/item/device/radio/off,
+ /obj/random/medical,
+ /obj/item/weapon/tool/crowbar,
+ /obj/item/weapon/extinguisher/mini,
+ /obj/item/weapon/storage/box/freezer,
+ /obj/item/clothing/accessory/storage/white_vest,
+ /obj/item/taperoll/medical,
+ /obj/item/device/gps,
+ /obj/item/device/geiger,
+ /obj/item/bodybag/cryobag)
//Pilot Locker
@@ -120,28 +110,29 @@
name = "pilot locker"
req_access = list(access_pilot)
-/obj/structure/closet/secure_closet/pilot/New()
- ..()
+ starts_with = list(
+ /obj/item/weapon/storage/backpack/parachute,
+ /obj/item/weapon/material/knife/tacknife/survival,
+ /obj/item/clothing/head/pilot,
+ /obj/item/clothing/under/rank/pilot1,
+ /obj/item/clothing/suit/storage/toggle/bomber/pilot,
+ /obj/item/clothing/mask/gas/half,
+ /obj/item/clothing/shoes/black,
+ /obj/item/clothing/gloves/fingerless,
+ /obj/item/device/radio/headset/pilot/alt,
+ /obj/item/device/flashlight,
+ /obj/item/weapon/reagent_containers/food/snacks/liquidfood,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle,
+ /obj/item/weapon/storage/box/flare,
+ /obj/item/weapon/cell/device,
+ /obj/item/device/radio)
+
+/obj/structure/closet/secure_closet/pilot/initialize()
if(prob(50))
- new /obj/item/weapon/storage/backpack(src)
+ starts_with += /obj/item/weapon/storage/backpack
else
- new /obj/item/weapon/storage/backpack/satchel/norm(src)
- new /obj/item/weapon/storage/backpack/parachute(src)
- new /obj/item/weapon/material/knife/tacknife/survival(src)
- new /obj/item/clothing/head/pilot(src)
- new /obj/item/clothing/under/rank/pilot1(src)
- new /obj/item/clothing/suit/storage/toggle/bomber/pilot(src)
- new /obj/item/clothing/mask/gas/half(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/gloves/fingerless(src)
- new /obj/item/device/radio/headset/pilot/alt(src)
- new /obj/item/device/flashlight(src)
- new /obj/item/weapon/reagent_containers/food/snacks/liquidfood(src)
- new /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle(src)
- new /obj/item/weapon/storage/box/flare(src)
- new /obj/item/weapon/cell/device(src)
- new /obj/item/device/radio(src)
- return
+ starts_with += /obj/item/weapon/storage/backpack/satchel/norm
+ return ..()
//Exotic Seeds Crate
@@ -149,14 +140,10 @@
name = "exotic seeds crate"
desc = "All you need to destroy that pesky planet."
-/obj/structure/closet/crate/hydroponics/exotic/New()
- ..()
- for(var/i = 1 to 6)
- new /obj/item/seeds/random(src)
- new /obj/item/seeds/kudzuseed(src)
- new /obj/item/seeds/replicapod(src)
- new /obj/item/seeds/replicapod(src)
- new /obj/item/seeds/ambrosiavulgarisseed(src)
- new /obj/item/seeds/ambrosiavulgarisseed(src)
- new /obj/item/seeds/libertymycelium(src)
- new /obj/item/seeds/reishimycelium(src)
\ No newline at end of file
+ starts_with = list(
+ /obj/item/seeds/random = 6,
+ /obj/item/seeds/replicapod = 2,
+ /obj/item/seeds/ambrosiavulgarisseed = 2,
+ /obj/item/seeds/kudzuseed,
+ /obj/item/seeds/libertymycelium,
+ /obj/item/seeds/reishimycelium)
diff --git a/maps/southern_cross/structures/closets/research.dm b/maps/southern_cross/structures/closets/research.dm
index 12d7c1d686..6630706df9 100644
--- a/maps/southern_cross/structures/closets/research.dm
+++ b/maps/southern_cross/structures/closets/research.dm
@@ -5,23 +5,21 @@
/obj/structure/closet/secure_closet/RD_wardrobe
name = "research director's locker"
- req_access = list(access_rd)
icon_state = "rdsecure1"
icon_closed = "rdsecure"
icon_locked = "rdsecure1"
icon_opened = "rdsecureopen"
icon_broken = "rdsecurebroken"
icon_off = "rdsecureoff"
+ req_access = list(access_rd)
-/obj/structure/closet/secure_closet/RD_wardrobe/New()
- ..()
- new /obj/item/clothing/under/rank/research_director(src)
- new /obj/item/clothing/under/rank/research_director/rdalt(src)
- new /obj/item/clothing/under/rank/research_director/dress_rd(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat(src)
- new /obj/item/weapon/cartridge/rd(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/shoes/leather(src)
- new /obj/item/clothing/gloves/sterile/latex(src)
- new /obj/item/device/radio/headset/heads/rd(src)
- return
\ No newline at end of file
+ starts_with = list(
+ /obj/item/clothing/under/rank/research_director,
+ /obj/item/clothing/under/rank/research_director/rdalt,
+ /obj/item/clothing/under/rank/research_director/dress_rd,
+ /obj/item/clothing/suit/storage/toggle/labcoat,
+ /obj/item/weapon/cartridge/rd,
+ /obj/item/clothing/shoes/white,
+ /obj/item/clothing/shoes/leather,
+ /obj/item/clothing/gloves/sterile/latex,
+ /obj/item/device/radio/headset/heads/rd)
diff --git a/maps/southern_cross/structures/closets/security.dm b/maps/southern_cross/structures/closets/security.dm
index fd1263cf8e..314e5a07b9 100644
--- a/maps/southern_cross/structures/closets/security.dm
+++ b/maps/southern_cross/structures/closets/security.dm
@@ -5,32 +5,33 @@
/obj/structure/closet/secure_closet/hos_wardrobe
name = "head of security's locker"
- req_access = list(access_hos)
icon_state = "hossecure1"
icon_closed = "hossecure"
icon_locked = "hossecure1"
icon_opened = "hossecureopen"
icon_broken = "hossecurebroken"
icon_off = "hossecureoff"
+ req_access = list(access_hos)
-/obj/structure/closet/secure_closet/hos_wardrobe/New()
- ..()
+ starts_with = list(
+ /obj/item/clothing/under/rank/head_of_security/jensen,
+ /obj/item/clothing/under/rank/head_of_security/corp,
+ /obj/item/clothing/suit/storage/vest/hoscoat/jensen,
+ /obj/item/clothing/suit/storage/vest/hoscoat,
+ /obj/item/weapon/cartridge/hos,
+ /obj/item/device/radio/headset/heads/hos,
+ /obj/item/clothing/glasses/sunglasses/sechud,
+ /obj/item/weapon/storage/box/holobadge/hos,
+ /obj/item/clothing/accessory/badge/holo/hos,
+ /obj/item/clothing/accessory/holster/waist,
+ /obj/item/clothing/head/beret/sec/corporate/hos,
+ /obj/item/clothing/mask/gas/half)
+
+/obj/structure/closet/secure_closet/hos_wardrobe/initialize()
if(prob(50))
- new /obj/item/weapon/storage/backpack/security(src)
+ starts_with += /obj/item/weapon/storage/backpack/security
else
- new /obj/item/weapon/storage/backpack/satchel/sec(src)
+ starts_with += /obj/item/weapon/storage/backpack/satchel/sec
if(prob(50))
- new /obj/item/weapon/storage/backpack/dufflebag/sec(src)
- new /obj/item/clothing/under/rank/head_of_security/jensen(src)
- new /obj/item/clothing/under/rank/head_of_security/corp(src)
- new /obj/item/clothing/suit/storage/vest/hoscoat/jensen(src)
- new /obj/item/clothing/suit/storage/vest/hoscoat(src)
- new /obj/item/weapon/cartridge/hos(src)
- new /obj/item/device/radio/headset/heads/hos(src)
- new /obj/item/clothing/glasses/sunglasses/sechud(src)
- new /obj/item/weapon/storage/box/holobadge/hos(src)
- new /obj/item/clothing/accessory/badge/holo/hos(src)
- new /obj/item/clothing/accessory/holster/waist(src)
- new /obj/item/clothing/head/beret/sec/corporate/hos(src)
- new /obj/item/clothing/mask/gas/half(src)
- return
\ No newline at end of file
+ starts_with += /obj/item/weapon/storage/backpack/dufflebag/sec
+ return ..()
diff --git a/maps/southern_cross/turfs/outdoors.dm b/maps/southern_cross/turfs/outdoors.dm
index 6c0e2b9035..167b1256f5 100644
--- a/maps/southern_cross/turfs/outdoors.dm
+++ b/maps/southern_cross/turfs/outdoors.dm
@@ -161,6 +161,5 @@
temperature = TCMB
// Step trigger to fall down to planet Sif
-/obj/effect/step_trigger/teleporter/planetary_fall/sif/initialize()
- planet = planet_sif
- . = ..()
+/obj/effect/step_trigger/teleporter/planetary_fall/sif/find_planet()
+ planet = planet_sif
\ No newline at end of file
diff --git a/maps/submaps/surface_submaps/mountains/backup/IceCave1.dmm b/maps/submaps/surface_submaps/mountains/backup/IceCave1.dmm
deleted file mode 100644
index 5f78f87858..0000000000
--- a/maps/submaps/surface_submaps/mountains/backup/IceCave1.dmm
+++ /dev/null
@@ -1,37 +0,0 @@
-"a" = (/turf/simulated/wall/dungeon/rock{block_tele = 0},/area/submap/cave/IceCave1)
-"b" = (/turf/template_noop,/area/submap/cave/IceCave1)
-"c" = (/turf/simulated/floor/outdoors/ice{outdoors = 0},/area/submap/cave/IceCave1)
-"d" = (/obj/machinery/crystal/ice,/turf/simulated/floor/outdoors/ice{outdoors = 0},/area/submap/cave/IceCave1)
-"e" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-"f" = (/obj/machinery/crystal/ice,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-
-(1,1,1) = {"
-aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaabbbbbbbbbbaaaaaaaaaa
-aacccccdccccccccddaabbbbbbbbbbaaaeeffaaa
-aaccccccccccccccddaaabbbbbbbbaaaeeeefeaa
-aaccccccccccccccaaaaaaaaaaaaaaaaeeeeeeaa
-aaccccccccccdcccaaaaaaaaaaaaaaaeeeeeeeaa
-aadccccccccccccdaaaaaaccccdccffeeeeeeaaa
-aaccccccccccccccaaaaaaccccccceeeeeeefaaa
-aacccccccccccccceeeeeedccccccfffaaaaaaaa
-aacccccccccdcccceeeeeeccdcccdfffaaaaaaab
-aaccdcccccccccccaaaaaaddaaaaaaaaaaabbbbb
-aaccccdccccccccdaaaaaaddafeeeeeaaaabbbbb
-aaccccccdcccccccaaffeefdafeeeeeaabbbbbbb
-aaccccccccccccccaaeeeeefaaaeaefaabbbbbbb
-aaaaaadddddddddeeeeefeeeeeeeaeeaabbbbbbb
-aaaaaafffeeeeddddffffffeefeeaeeaabbbbbbb
-aafffeeeeeeeeeccaaaaaaaaeeefafeaabbbbbbb
-aafeeeeeeeeeeeccaaaaaaaaffffaeeaabbbbbbb
-aaaffeaaaaaaaaccaaaaaaaeeeeeeeeaabbbbbbb
-aaaaeeaaaaaaaaccaaaaaaaeeeeeeaaaabbbbbbb
-aaaaeefaaaaaaaccccccddaeeeeeeaaaabbbbbbb
-aaaaaeefaaaaaaccccccddaafeaaaaabbbbbbbbb
-aaaafeeeaaaaaaaaddcceeeeeeaaaaabbbbbbbbb
-aaaffaeeeaaaaaaaddcceeeeeeaabbbbbbbbbbbb
-eaaaaaeeefaaaaaaaaaaaaeeefaabbbbbbbbbbbb
-eeaaaafeeaaaaaaaaaaaaaffffaabbbbbbbbbbbb
-eeeeeeeeeaaaaaaaaaaaaaaaaaaabbbbbbbbbbbb
-eeeeeeeeaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbb
-"}
diff --git a/maps/submaps/surface_submaps/mountains/backup/IceCave1A.dmm b/maps/submaps/surface_submaps/mountains/backup/IceCave1A.dmm
deleted file mode 100644
index 4bc4a5c69a..0000000000
--- a/maps/submaps/surface_submaps/mountains/backup/IceCave1A.dmm
+++ /dev/null
@@ -1,40 +0,0 @@
-"a" = (/turf/simulated/wall/solidrock{block_tele = 0},/area/submap/cave/IceCave1)
-"b" = (/turf/template_noop,/area/submap/cave/IceCave1)
-"c" = (/turf/simulated/floor/outdoors/ice{outdoors = 0},/area/submap/cave/IceCave1)
-"d" = (/obj/machinery/crystal/ice,/turf/simulated/floor/outdoors/ice{outdoors = 0},/area/submap/cave/IceCave1)
-"e" = (/obj/structure/loot_pile/surface/bones,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-"f" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-"g" = (/obj/machinery/crystal/ice,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-"h" = (/obj/random/firstaid,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-"i" = (/obj/random/ammo,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-
-(1,1,1) = {"
-aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaabbbbbbbbbbaaaaaaaaaa
-aacccccdccccccccddaabbbbbbbbbbaaaefggaaa
-aaccccccccccccccddaaabbbbbbbbaaagfffghaa
-aaccccccccccccccaaaaaaaaaaaaaaaafffffiaa
-aaccccccccccdcccaaaaaaaaaaaaaaaffffffeaa
-aadccccccccccccdaaaaaaccccdccggffffffaaa
-aaccccccccccccccaaaaaacccccccffffgefgaaa
-aaccccccccccccccffffffdccccccgggaaaaaaaa
-aacccccccccdccccffggffccdcccdgggaaaaaaab
-aaccdcccccccccccaaaaaaddaaaaaaaaaaabbbbb
-aaccccdccccccccdaaaaaaddageffffaaaabbbbb
-aaccccccdcccccccaaggffgdagfffffaabbbbbbb
-aaccccccccccccccaafffffgaaafafgaabbbbbbb
-aaaaaadddddddddfffffgfffffffaffaabbbbbbb
-aaaaaagggfffgddddggggggffgffaffaabbbbbbb
-aagggfffffffffccaaaaaaaafffgagfaabbbbbbb
-aagfffffffffffccaaaaaaaaggggaffaabbbbbbb
-aaaggfaaaaaaaaccaaaaaaagfffffffaabbbbbbb
-aaaaffaaaaaaaaccaaaaaaaffffffaaaabbbbbbb
-aaaaffgaaaaaaaccccccddafffffgaaaabbbbbbb
-aaaaaffgaaaaaaccccccddaagfaaaaabbbbbbbbb
-aaaagfffaaaaaaaaddccffgfffaaaaabbbbbbbbb
-aaaggafffaaaaaaaddccffffffaabbbbbbbbbbbb
-faaaaafffgaaaaaaaaaaaafffgaabbbbbbbbbbbb
-ffaaaagffaaaaaaaaaaaaaggggaabbbbbbbbbbbb
-fffffffffaaaaaaaaaaaaaaaaaaabbbbbbbbbbbb
-ffffffffaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbb
-"}
diff --git a/maps/submaps/surface_submaps/mountains/backup/IceCave1B.dmm b/maps/submaps/surface_submaps/mountains/backup/IceCave1B.dmm
deleted file mode 100644
index 4bc4a5c69a..0000000000
--- a/maps/submaps/surface_submaps/mountains/backup/IceCave1B.dmm
+++ /dev/null
@@ -1,40 +0,0 @@
-"a" = (/turf/simulated/wall/solidrock{block_tele = 0},/area/submap/cave/IceCave1)
-"b" = (/turf/template_noop,/area/submap/cave/IceCave1)
-"c" = (/turf/simulated/floor/outdoors/ice{outdoors = 0},/area/submap/cave/IceCave1)
-"d" = (/obj/machinery/crystal/ice,/turf/simulated/floor/outdoors/ice{outdoors = 0},/area/submap/cave/IceCave1)
-"e" = (/obj/structure/loot_pile/surface/bones,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-"f" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-"g" = (/obj/machinery/crystal/ice,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-"h" = (/obj/random/firstaid,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-"i" = (/obj/random/ammo,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-
-(1,1,1) = {"
-aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaabbbbbbbbbbaaaaaaaaaa
-aacccccdccccccccddaabbbbbbbbbbaaaefggaaa
-aaccccccccccccccddaaabbbbbbbbaaagfffghaa
-aaccccccccccccccaaaaaaaaaaaaaaaafffffiaa
-aaccccccccccdcccaaaaaaaaaaaaaaaffffffeaa
-aadccccccccccccdaaaaaaccccdccggffffffaaa
-aaccccccccccccccaaaaaacccccccffffgefgaaa
-aaccccccccccccccffffffdccccccgggaaaaaaaa
-aacccccccccdccccffggffccdcccdgggaaaaaaab
-aaccdcccccccccccaaaaaaddaaaaaaaaaaabbbbb
-aaccccdccccccccdaaaaaaddageffffaaaabbbbb
-aaccccccdcccccccaaggffgdagfffffaabbbbbbb
-aaccccccccccccccaafffffgaaafafgaabbbbbbb
-aaaaaadddddddddfffffgfffffffaffaabbbbbbb
-aaaaaagggfffgddddggggggffgffaffaabbbbbbb
-aagggfffffffffccaaaaaaaafffgagfaabbbbbbb
-aagfffffffffffccaaaaaaaaggggaffaabbbbbbb
-aaaggfaaaaaaaaccaaaaaaagfffffffaabbbbbbb
-aaaaffaaaaaaaaccaaaaaaaffffffaaaabbbbbbb
-aaaaffgaaaaaaaccccccddafffffgaaaabbbbbbb
-aaaaaffgaaaaaaccccccddaagfaaaaabbbbbbbbb
-aaaagfffaaaaaaaaddccffgfffaaaaabbbbbbbbb
-aaaggafffaaaaaaaddccffffffaabbbbbbbbbbbb
-faaaaafffgaaaaaaaaaaaafffgaabbbbbbbbbbbb
-ffaaaagffaaaaaaaaaaaaaggggaabbbbbbbbbbbb
-fffffffffaaaaaaaaaaaaaaaaaaabbbbbbbbbbbb
-ffffffffaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbb
-"}
diff --git a/maps/submaps/surface_submaps/mountains/backup/IceCave1C.dmm b/maps/submaps/surface_submaps/mountains/backup/IceCave1C.dmm
deleted file mode 100644
index 4bc4a5c69a..0000000000
--- a/maps/submaps/surface_submaps/mountains/backup/IceCave1C.dmm
+++ /dev/null
@@ -1,40 +0,0 @@
-"a" = (/turf/simulated/wall/solidrock{block_tele = 0},/area/submap/cave/IceCave1)
-"b" = (/turf/template_noop,/area/submap/cave/IceCave1)
-"c" = (/turf/simulated/floor/outdoors/ice{outdoors = 0},/area/submap/cave/IceCave1)
-"d" = (/obj/machinery/crystal/ice,/turf/simulated/floor/outdoors/ice{outdoors = 0},/area/submap/cave/IceCave1)
-"e" = (/obj/structure/loot_pile/surface/bones,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-"f" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-"g" = (/obj/machinery/crystal/ice,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-"h" = (/obj/random/firstaid,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-"i" = (/obj/random/ammo,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1)
-
-(1,1,1) = {"
-aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaabbbbbbbbbbaaaaaaaaaa
-aacccccdccccccccddaabbbbbbbbbbaaaefggaaa
-aaccccccccccccccddaaabbbbbbbbaaagfffghaa
-aaccccccccccccccaaaaaaaaaaaaaaaafffffiaa
-aaccccccccccdcccaaaaaaaaaaaaaaaffffffeaa
-aadccccccccccccdaaaaaaccccdccggffffffaaa
-aaccccccccccccccaaaaaacccccccffffgefgaaa
-aaccccccccccccccffffffdccccccgggaaaaaaaa
-aacccccccccdccccffggffccdcccdgggaaaaaaab
-aaccdcccccccccccaaaaaaddaaaaaaaaaaabbbbb
-aaccccdccccccccdaaaaaaddageffffaaaabbbbb
-aaccccccdcccccccaaggffgdagfffffaabbbbbbb
-aaccccccccccccccaafffffgaaafafgaabbbbbbb
-aaaaaadddddddddfffffgfffffffaffaabbbbbbb
-aaaaaagggfffgddddggggggffgffaffaabbbbbbb
-aagggfffffffffccaaaaaaaafffgagfaabbbbbbb
-aagfffffffffffccaaaaaaaaggggaffaabbbbbbb
-aaaggfaaaaaaaaccaaaaaaagfffffffaabbbbbbb
-aaaaffaaaaaaaaccaaaaaaaffffffaaaabbbbbbb
-aaaaffgaaaaaaaccccccddafffffgaaaabbbbbbb
-aaaaaffgaaaaaaccccccddaagfaaaaabbbbbbbbb
-aaaagfffaaaaaaaaddccffgfffaaaaabbbbbbbbb
-aaaggafffaaaaaaaddccffffffaabbbbbbbbbbbb
-faaaaafffgaaaaaaaaaaaafffgaabbbbbbbbbbbb
-ffaaaagffaaaaaaaaaaaaaggggaabbbbbbbbbbbb
-fffffffffaaaaaaaaaaaaaaaaaaabbbbbbbbbbbb
-ffffffffaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbb
-"}
diff --git a/maps/submaps/surface_submaps/mountains/backup/temple.dmm b/maps/submaps/surface_submaps/mountains/backup/temple.dmm
deleted file mode 100644
index 35a0478e3f..0000000000
--- a/maps/submaps/surface_submaps/mountains/backup/temple.dmm
+++ /dev/null
@@ -1,69 +0,0 @@
-"a" = (/turf/template_noop,/area/submap/AbandonedTemple)
-"b" = (/turf/simulated/mineral/floor,/area/submap/AbandonedTemple)
-"c" = (/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"d" = (/turf/simulated/wall/sandstone,/area/submap/AbandonedTemple)
-"e" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/carpet/turcarpet,/area/submap/AbandonedTemple)
-"f" = (/obj/effect/decal/remains/mummy1,/turf/simulated/floor/carpet/turcarpet,/area/submap/AbandonedTemple)
-"g" = (/turf/simulated/wall/sandstonediamond,/area/submap/AbandonedTemple)
-"h" = (/obj/item/weapon/flame/candle/everburn,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"i" = (/obj/item/weapon/ectoplasm,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"j" = (/obj/structure/table/wooden_reinforced,/obj/item/weapon/coin/diamond,/obj/item/weapon/coin/iron,/obj/item/weapon/coin/phoron,/obj/item/weapon/coin/platinum,/obj/item/weapon/coin/uranium,/obj/item/weapon/coin/diamond,/obj/item/weapon/coin/iron,/obj/item/weapon/coin/phoron,/obj/item/weapon/coin/platinum,/obj/item/weapon/coin/uranium,/obj/item/weapon/coin/diamond,/obj/item/weapon/coin/iron,/obj/item/weapon/coin/phoron,/obj/item/weapon/coin/platinum,/obj/item/weapon/coin/uranium,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"k" = (/obj/structure/table/wooden_reinforced,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/silver,/obj/item/weapon/coin/silver,/obj/item/weapon/coin/silver,/obj/item/weapon/coin/silver,/obj/item/weapon/coin/silver,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/silver,/obj/item/weapon/coin/silver,/obj/item/weapon/coin/silver,/obj/item/weapon/coin/silver,/obj/item/weapon/coin/silver,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"l" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"m" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"n" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"o" = (/obj/structure/loot_pile/maint/technical,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"p" = (/turf/simulated/floor/carpet/turcarpet,/area/submap/AbandonedTemple)
-"q" = (/obj/structure/table/woodentable,/obj/item/weapon/pen/red,/obj/item/weapon/flame/lighter/zippo/royal,/turf/simulated/floor/carpet/turcarpet,/area/submap/AbandonedTemple)
-"r" = (/obj/effect/rune,/obj/effect/decal/remains/human,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"s" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"t" = (/obj/machinery/artifact,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"u" = (/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/carpet/turcarpet,/area/submap/AbandonedTemple)
-"v" = (/obj/structure/table/woodentable,/obj/item/weapon/book/codex/lore/vir,/turf/simulated/floor/carpet/turcarpet,/area/submap/AbandonedTemple)
-"w" = (/obj/effect/decal/cleanable/blood/xeno,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"x" = (/obj/effect/decal/cleanable/blood/xeno,/obj/effect/decal/remains/posi,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"y" = (/obj/structure/table/woodentable,/obj/item/weapon/flame/candle/candleabra/everburn,/turf/simulated/floor/carpet/turcarpet,/area/submap/AbandonedTemple)
-"z" = (/obj/structure/simple_door/gold,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"A" = (/obj/effect/decal/remains/posi,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"B" = (/obj/machinery/crystal{icon_state = "crystal3"; light_color = "#f44256"; light_power = 3},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/crystal1)
-"C" = (/obj/structure/flora/pottedplant/dead,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"D" = (/obj/machinery/crystal{icon_state = "crystal3"; light_color = "#f44256"; light_power = 3},/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"E" = (/obj/effect/decal/remains/human,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"F" = (/obj/effect/decal/cleanable/blood,/obj/effect/decal/remains/human,/turf/simulated/floor/carpet/turcarpet,/area/submap/AbandonedTemple)
-"G" = (/obj/structure/table/woodentable,/obj/item/weapon/paper/alien{desc = ""; icon_state = "alienpaper_words"; info = "(On the screen of the tablet are several lines of characters written in a language you don't seem to recognize. At the end of each line is a set of numbers seperated by a colon. The screen flickers occasionally, as if damaged. Nothing about the tablet seems particularly interesting, but it does seem very, very old.)"},/turf/simulated/floor/carpet/turcarpet,/area/submap/AbandonedTemple)
-"H" = (/obj/effect/decal/cleanable/blood/xeno,/turf/simulated/floor/carpet/turcarpet,/area/submap/AbandonedTemple)
-"I" = (/obj/structure/table/bench/wooden,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"J" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"K" = (/obj/structure/table/bench/wooden,/obj/effect/decal/remains/xeno,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"L" = (/obj/structure/simple_door/sandstone,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"M" = (/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/flame/candle/candleabra/everburn,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"N" = (/obj/effect/decal/cleanable/cobweb2,/obj/item/weapon/flame/candle/candleabra/everburn,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/AbandonedTemple)
-"O" = (/obj/effect/decal/cleanable/blood,/turf/simulated/mineral/floor,/area/submap/AbandonedTemple)
-
-(1,1,1) = {"
-aaaaaaaaaaaaaaaaaaaaaaaaa
-aaabbbbbbbbbbbbbbbbbbaaaa
-aaccccccccccccccccccccaaa
-abcddddddddddddddddddcbaa
-abcdefghihgjkgclmgnodcbaa
-abcdpqgcrsgccgctcgccdcbaa
-abcduvghchgppgwccgcxdcbaa
-abcdpygzgggppgggzgncdcbaa
-abcdppgccccccccccgccdcbaa
-abcdppggggzggzggggcAdcbaa
-abcdwcgBCccccccCDgcndcbaa
-abcdcEgccwpFppcccgcldcbaa
-abcdcczcccpGyHlcczwndcbaa
-abcddsgccIIccIIccgnddcbaa
-abcmddgccccccccccgddJcbaa
-abbcmddccKIccIIcsddccbbaa
-abbbccddDccwsccDddccbbbaa
-abbbbccddddLLddddJcbbbbaa
-abbbbbccmdMccNdsccbbbbbaa
-abbbbbbbcdcwccdcbbbbbbbaa
-aabbbbbbcddLLddcbbbbbbaaa
-aaabbbbbsccccsccbbbbbaaaa
-aaaabbbbbbbbObbbbbbbaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaa
-"}
diff --git a/maps/submaps/surface_submaps/mountains/crashed_ufo.dmm b/maps/submaps/surface_submaps/mountains/crashed_ufo.dmm
index d98df50007..d9013d201b 100644
--- a/maps/submaps/surface_submaps/mountains/crashed_ufo.dmm
+++ b/maps/submaps/surface_submaps/mountains/crashed_ufo.dmm
@@ -9,7 +9,7 @@
"ai" = (/obj/machinery/porta_turret/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"aj" = (/obj/structure/loot_pile/surface/alien/engineering,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"ak" = (/obj/structure/prop/alien/computer,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
-"al" = (/obj/item/weapon/wrench/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
+"al" = (/obj/item/weapon/tool/wrench/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"am" = (/obj/structure/bed/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"an" = (/obj/structure/table/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo)
"ao" = (/obj/structure/table/alien,/obj/item/clothing/head/helmet/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
@@ -25,8 +25,8 @@
"ay" = (/obj/structure/prop/alien/computer{ icon_state = "console-c"; dir = 4},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"az" = (/obj/machinery/door/airlock/alien/locked{welded = 1},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"aA" = (/obj/structure/bed/alien,/obj/effect/decal/remains/xeno,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
-"aB" = (/obj/item/weapon/screwdriver/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
-"aC" = (/obj/item/weapon/wirecutters/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
+"aB" = (/obj/item/weapon/tool/screwdriver/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
+"aC" = (/obj/item/weapon/tool/wirecutters/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"aD" = (/obj/structure/table/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"aE" = (/obj/item/device/multitool/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"aF" = (/obj/structure/prop/alien/computer/camera/flipped{ icon_state = "camera_flipped"; dir = 4},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo)
@@ -34,7 +34,7 @@
"aH" = (/obj/machinery/porta_turret/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo)
"aI" = (/obj/machinery/door/airlock/alien/locked{p_open = 1},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"aJ" = (/obj/effect/decal/remains/robot,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
-"aK" = (/obj/item/weapon/crowbar/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
+"aK" = (/obj/item/weapon/tool/crowbar/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"aL" = (/obj/item/stack/cable_coil/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"aM" = (/obj/structure/table/alien,/obj/item/prop/alien/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"aN" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/obj/item/device/gps/internal/poi,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
diff --git a/maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm b/maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm
new file mode 100644
index 0000000000..4ffd4a2fab
--- /dev/null
+++ b/maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm
@@ -0,0 +1,118 @@
+"aa" = (/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"ab" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/submap/crashedcontainmentshuttle)
+"ac" = (/turf/simulated/shuttle/wall/dark,/area/submap/crashedcontainmentshuttle)
+"ad" = (/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"ae" = (/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
+"af" = (/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
+"ag" = (/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
+"ah" = (/obj/structure/grille,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
+"ai" = (/obj/random/landmine,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"aj" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"ak" = (/obj/structure/door_assembly/door_assembly_ext{anchored = 1},/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
+"al" = (/obj/structure/lattice,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"am" = (/obj/item/weapon/material/shard,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"an" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
+"ao" = (/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
+"ap" = (/obj/item/stack/rods,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"aq" = (/obj/structure/door_assembly/door_assembly_ext,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"ar" = (/obj/structure/grille,/obj/item/weapon/material/shard,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
+"as" = (/obj/item/weapon/material/shard,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
+"at" = (/obj/structure/loot_pile/maint/technical,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"au" = (/obj/item/stack/rods,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"av" = (/obj/structure/closet/walllocker/emerglocker/east,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"aw" = (/obj/structure/frame,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"ax" = (/obj/item/frame/mirror,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/shuttle/wall/dark,/area/submap/crashedcontainmentshuttle)
+"ay" = (/obj/effect/decal/mecha_wreckage/gygax{anchored = 1},/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"az" = (/obj/effect/gibspawner/generic,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"aA" = (/obj/structure/closet/medical_wall,/turf/simulated/shuttle/wall/dark,/area/submap/crashedcontainmentshuttle)
+"aB" = (/obj/structure/largecrate/animal/crashedshuttle,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
+"aC" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/lattice,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"aD" = (/obj/structure/shuttle/engine/propulsion{dir = 8},/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"aE" = (/obj/structure/extinguisher_cabinet,/turf/simulated/shuttle/wall/dark,/area/submap/crashedcontainmentshuttle)
+"aF" = (/obj/machinery/computer,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
+"aG" = (/obj/item/weapon/circuitboard/broken,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"aH" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
+"aI" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/stack/rods,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
+"aJ" = (/obj/item/stack/rods,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
+"aK" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/material/shard{icon_state = "medium"},/obj/item/stack/rods,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
+"aL" = (/obj/item/weapon/circuitboard/broken,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"aM" = (/obj/structure/frame,/obj/item/weapon/circuitboard/broken,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"aN" = (/obj/structure/table/steel_reinforced,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"aO" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/frame,/obj/item/weapon/circuitboard/broken,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
+"aP" = (/turf/simulated/floor/outdoors/rocks,/area/submap/crashedcontainmentshuttle)
+"aQ" = (/obj/item/clothing/suit/space/cult,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"aR" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"aS" = (/obj/structure/door_assembly/door_assembly_highsecurity{anchored = 1},/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"aT" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
+"aU" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
+"aV" = (/obj/effect/decal/remains/robot,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"aW" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"aX" = (/obj/structure/door_assembly/door_assembly_ext{anchored = 1},/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"aY" = (/obj/effect/decal/remains/human,/obj/effect/gibspawner/human,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"aZ" = (/obj/item/clothing/head/helmet/space/cult,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"bb" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"bc" = (/obj/structure/door_assembly,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
+"bd" = (/obj/item/weapon/material/knife/ritual,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"be" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/decal/remains/human,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"bf" = (/obj/structure/grille,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"bg" = (/obj/effect/gibspawner/generic,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"bh" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
+"bi" = (/obj/item/weapon/circuitboard/broken,/obj/effect/decal/remains/human,/obj/item/weapon/gun/energy/laser,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"bj" = (/obj/item/device/gps/internal/poi,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
+"bk" = (/obj/effect/decal/cleanable/vomit,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"bl" = (/obj/effect/decal/remains/robot,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
+"bm" = (/obj/effect/decal/cleanable/liquid_fuel,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"bn" = (/obj/effect/decal/cleanable/vomit,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
+"bo" = (/obj/effect/decal/cleanable/blood/drip,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"bp" = (/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
+"bq" = (/obj/item/weapon/circuitboard/broken,/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
+"br" = (/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
+"bs" = (/obj/structure/table/steel_reinforced,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
+"bt" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"},/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"bv" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
+"bw" = (/obj/item/weapon/material/knife/ritual,/obj/effect/decal/cleanable/blood,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
+"bx" = (/turf/simulated/shuttle/wall/dark/no_join,/area/submap/crashedcontainmentshuttle)
+"by" = (/obj/random/landmine,/obj/random/landmine,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"bz" = (/obj/effect/decal/remains/human,/obj/item/clothing/head/helmet/space/cult,/obj/effect/decal/cleanable/blood,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
+"bA" = (/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
+"bB" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
+"bC" = (/obj/effect/decal/cleanable/liquid_fuel,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"bD" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/random/landmine,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"bE" = (/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"bF" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
+"bG" = (/obj/structure/reagent_dispensers/fueltank,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"bH" = (/obj/structure/closet/crate{name = "landmines crate"; opened = 1},/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"bI" = (/obj/random/landmine,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
+"bJ" = (/obj/random/landmine,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
+"bK" = (/obj/random/landmine,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
+"bL" = (/obj/effect/decal/cleanable/blood,/obj/random/landmine,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
+"bM" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/remains/human,/obj/item/weapon/flame/lighter/random,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
+"bN" = (/obj/structure/toilet{dir = 8},/obj/effect/gibspawner/generic,/obj/effect/decal/remains/human,/obj/item/weapon/card/id/syndicate{age = "\\42"; blood_type = "\\O+"; desc = "A strange ID card."; dna_hash = "\[REDACTED]"; fingerprint_hash = "\\------"; name = "Aaron Presley's ID Card(Delivery Service) "; registered_name = "Aaron Presley"; sex = "\\Male"},/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaahaaaaaaaianaaaaaaaaaaaaaaajaaaaaaaa
+aaaaabacaaaaaaaaaaaaaaaaalaaaPaPaaamaaaaaaaaaaaaaa
+aaaaacaaaaadaaaaaaaaaialaPaPaPadaPaaaaaaapaaaaaaaa
+aaaaaaaaauaqakaracacataCacacananacabaaaaaaaaaaaaaa
+aaaDaGaaadaoaaadadaiaGbHbyayadadaWacabaaaaaaaaaaaa
+aaaQaaaRacaaadadaValbIbybIazbbadaNacanbJaaaaaaaaaa
+aaaaaYaZbdalalaladadadbIadadauadaNaAaeaTanaaaaapaa
+acaaaaaaaladauadadadacacaSacanadavacbhaeaeahaaaaaa
+aPadaDaRacadadadbiadacbjafafacadadadbKbpaHaraaaaaa
+aaaPadaaacaMadbkadbbacbvaBbwacaLadaSbKbqaHaoalaaaa
+aPbxaDaRacaWadbbadbbanblbLbzanadbbasaebraFaIaabeaa
+aPaPaaaaaaaabEazadadanacacacaEadadahaebpaHaoaabfaa
+aPaPadaaaJalbIadadaPaPadadadadadadacaeaeaeahaaaaaa
+adaaaaaaaaaoadadaPaPaPadacanacbcacacaTbsacacaaaaaa
+aPacaaaaamaladaWaPaPbbadaAbAaUbFaOacacacabaPaaaaaa
+aPaPaaaPacadadadadadadawaxbBagbnbNanabaPaPaaaaaaaa
+aaaaaGaRaaacaXalaoaKanananacacaranabaPaPaabgaaaaaa
+acaaaaaaaPaPaaaoaaaaalalaPaPaPalaPaPaaaaaaaaaaaaaa
+aaaGaaaaaaacaaaaadaaaabmaaboaaaaaaaaaaaaaaaaaaaaaa
+aabtaabgaaataaaaaaaabDbmboaabmbgaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaadaLaaaabmbGbMbmbmaaaaaaaaaaaaaaaaaaaa
+aaaaadadaaaaaaacaPbCbmbmbmaaaiaaaaaaaaaaaaaaaaaaaa
+aaaaaaadaaaaaaaPaPaaaaaabmaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/mountains/deadBeacon.dmm b/maps/submaps/surface_submaps/mountains/deadBeacon.dmm
index c94a76b9a5..85eefad2c5 100644
--- a/maps/submaps/surface_submaps/mountains/deadBeacon.dmm
+++ b/maps/submaps/surface_submaps/mountains/deadBeacon.dmm
@@ -27,7 +27,7 @@
"A" = (/obj/item/weapon/circuitboard/broken,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/deadBeacon)
"B" = (/obj/structure/grille/broken,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/submap/cave/deadBeacon)
"C" = (/obj/structure/loot_pile/maint/junk,/turf/simulated/floor/plating,/area/submap/cave/deadBeacon)
-"D" = (/obj/item/weapon/cigbutt,/obj/item/weapon/wrench,/obj/machinery/light/built,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"D" = (/obj/item/weapon/cigbutt,/obj/item/weapon/tool/wrench,/obj/machinery/light/built,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
"E" = (/obj/item/weapon/material/shard,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
"F" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
"G" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/submap/cave/deadBeacon)
diff --git a/maps/submaps/surface_submaps/mountains/deadspy.dmm b/maps/submaps/surface_submaps/mountains/deadspy.dmm
new file mode 100644
index 0000000000..15b57e5fce
--- /dev/null
+++ b/maps/submaps/surface_submaps/mountains/deadspy.dmm
@@ -0,0 +1,32 @@
+"a" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/mask/gas,/obj/item/clothing/suit/fire/firefighter,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"b" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"c" = (/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/obj/effect/decal/cleanable/molten_item,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"d" = (/obj/item/weapon/flamethrower,/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"e" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"f" = (/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"g" = (/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/obj/effect/decal/cleanable/ash,/obj/random/landmine,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"h" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/random/landmine,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"i" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/cleanable/molten_item,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"j" = (/obj/item/weapon/material/butterfly,/obj/effect/decal/cleanable/liquid_fuel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"k" = (/obj/effect/decal/remains/human,/obj/item/weapon/tool/wrench,/obj/item/clothing/head/hardhat,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"l" = (/obj/item/weapon/flame/lighter/zippo,/obj/effect/decal/cleanable/liquid_fuel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"m" = (/obj/effect/decal/remains/human,/obj/item/clothing/mask/balaclava,/obj/item/clothing/under/suit_jacket/really_black,/obj/effect/decal/cleanable/ash,/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/cleanable/ash,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"n" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/cleanable/ash,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"o" = (/obj/machinery/porta_turret/poi{desc = "Looking at this heavy caliber, tripod-mounted, little ol' number makes you want to square-dance."; lethal = 0; name = "sentry turret"},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"p" = (/obj/item/weapon/deadringer,/obj/effect/decal/cleanable/liquid_fuel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"q" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/cleanable/liquid_fuel,/obj/random/landmine,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"r" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/item/weapon/storage/fancy/cigarettes/professionals,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"s" = (/obj/item/weapon/card/emag_broken,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"t" = (/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/obj/random/landmine,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"u" = (/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/obj/effect/decal/cleanable/ash,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/deadspy)
+"v" = (/turf/simulated/mineral,/area/submap/deadspy)
+
+(1,1,1) = {"
+abbbbvv
+bcdefgb
+bfhijfk
+bflmnfo
+vfpqrfs
+vtfuffb
+vvbbbvb
+"}
diff --git a/maps/submaps/surface_submaps/mountains/digsite.dmm b/maps/submaps/surface_submaps/mountains/digsite.dmm
index 928a1a85ec..f97910d431 100644
--- a/maps/submaps/surface_submaps/mountains/digsite.dmm
+++ b/maps/submaps/surface_submaps/mountains/digsite.dmm
@@ -32,7 +32,7 @@
"F" = (/obj/structure/boulder,/obj/effect/decal/mecha_wreckage/ripley,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/digsite)
"G" = (/obj/structure/boulder,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/digsite)
"H" = (/obj/structure/loot_pile/maint/junk,/turf/simulated/floor/plating/external,/area/submap/cave/digsite)
-"I" = (/obj/structure/table/steel,/obj/item/weapon/wrench,/obj/item/weapon/storage/box/samplebags,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/digsite)
+"I" = (/obj/structure/table/steel,/obj/item/weapon/tool/wrench,/obj/item/weapon/storage/box/samplebags,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/digsite)
"J" = (/obj/structure/table/steel,/obj/item/stack/flag/yellow,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/digsite)
"K" = (/obj/random/toolbox,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/digsite)
"L" = (/obj/structure/closet/crate,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/digsite)
diff --git a/maps/submaps/surface_submaps/mountains/mountains.dm b/maps/submaps/surface_submaps/mountains/mountains.dm
index c661b94bec..56a267c475 100644
--- a/maps/submaps/surface_submaps/mountains/mountains.dm
+++ b/maps/submaps/surface_submaps/mountains/mountains.dm
@@ -30,6 +30,8 @@
#include "SwordCave.dmm"
#include "SupplyDrop1.dmm"
#include "BlastMine1.dmm"
+#include "crashedcontainmentshuttle.dmm"
+#include "deadspy.dmm"
#endif
// The 'mountains' is the mining z-level, and has a lot of caves.
@@ -184,6 +186,19 @@
cost = 10
allow_duplicates = TRUE
+/datum/map_template/surface/mountains/normal/crashedcontainmentshuttle
+ name = "Crashed Cargo Shuttle"
+ desc = "A severely damaged military shuttle, its cargo seems to remain intact."
+ mappath = 'maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm'
+ cost = 30
+
+/datum/map_template/surface/mountains/normal/deadspy
+ name = "Spy Remains"
+ desc = "W+M1 = Salt."
+ mappath = 'maps/submaps/surface_submaps/mountains/deadspy.dmm'
+ cost = 15
+
+
/**************
* Deep Caves *
**************/
diff --git a/maps/submaps/surface_submaps/mountains/mountains_areas.dm b/maps/submaps/surface_submaps/mountains/mountains_areas.dm
index 2555b558f9..9bcce0da1e 100644
--- a/maps/submaps/surface_submaps/mountains/mountains_areas.dm
+++ b/maps/submaps/surface_submaps/mountains/mountains_areas.dm
@@ -1,88 +1,123 @@
/area/submap/cave
name = "Cave Submap Area"
icon_state = "submap"
+ ambience = AMBIENCE_RUINS
/area/submap/cave/deadBeacon
name = "abandoned relay"
+ ambience = AMBIENCE_TECH_RUINS
/area/submap/cave/prepper1
name = "Prepper Bunker"
+ ambience = AMBIENCE_FOREBODING
/area/submap/cave/qShuttle
name = "Quarantined Shuttle"
+ ambience = AMBIENCE_RUINS
/area/submap/cave/AMine1
name = "Abandoned Mine"
/area/submap/cave/Scave1
name = "Spider Cave 1"
+ ambience = AMBIENCE_FOREBODING
/area/submap/cave/crashed_ufo
name = "Crashed Alien Vessel"
requires_power = FALSE
+ ambience = AMBIENCE_OTHERWORLDLY
/area/submap/cave/crystal1
name = "Crystaline Cave"
+ ambience = AMBIENCE_SPACE
/area/submap/cave/crystal2
name = "Crystaline Cave"
+ ambience = AMBIENCE_SPACE
/area/submap/cave/crystal3
name = "Crystaline Cave"
+ ambience = AMBIENCE_SPACE
/area/submap/cave/lost_explorer
name = "Final Resting Place"
+ ambience = AMBIENCE_GHOSTLY
/area/submap/Rockb1
name = "RockyBase1"
+ ambience = AMBIENCE_FOREBODING
/area/submap/Cavelake
name = "Cavelake"
+ ambience = AMBIENCE_SPACE
/area/submap/CaveTrench
name = "Cave River"
+ ambience = AMBIENCE_FOREBODING
/area/submap/CorgiRitual
name = "Dark Ritual"
+ ambience = AMBIENCE_UNHOLY
/area/submap/AbandonedTemple
name = "Abandoned Temple"
+ ambience = AMBIENCE_RUINS
/area/submap/CrashedMedShuttle
name = "Crashed Med Shuttle"
+ ambience = AMBIENCE_RUINS
/area/submap/cave/digsite
name = "Dig Site"
+ ambience = AMBIENCE_OTHERWORLDLY
/area/submap/cave/vault1
name = "Mine Vault"
+ ambience = AMBIENCE_FOREBODING
/area/submap/cave/vault2
name = "Mine Vault"
+ ambience = AMBIENCE_FOREBODING
/area/submap/cave/vault3
name = "Mine Vault"
+ ambience = AMBIENCE_FOREBODING
/area/submap/cave/vault4
name = "Mine Vault"
+ ambience = AMBIENCE_FOREBODING
/area/submap/cave/vault5
name = "Mine Vault"
+ ambience = AMBIENCE_FOREBODING
/area/submap/cave/IceCave1A
name = "Ice Cave 1A"
+ ambience = AMBIENCE_SPACE
/area/submap/cave/IceCave1B
name = "Ice Cave 1B"
+ ambience = AMBIENCE_SPACE
/area/submap/cave/IceCave1C
name = "Ice Cave 1C"
+ ambience = AMBIENCE_SPACE
/area/submap/cave/swordcave
name = "Cursed Sword Cave"
+ ambience = AMBIENCE_UNHOLY
/area/submap/cave/SupplyDrop1
name = "Supply Drop 1"
+ ambience = AMBIENCE_TECH_RUINS
/area/submap/cave/BlastMine1
- name = "Blast Mine 1"
\ No newline at end of file
+ name = "Blast Mine 1"
+
+/area/submap/crashedcontainmentshuttle
+ name = "Crashed Containment Shuttle"
+ ambience = AMBIENCE_HIGHSEC
+
+/area/submap/deadspy
+ name = "Dead Spy"
+ ambience = AMBIENCE_FOREBODING
\ No newline at end of file
diff --git a/maps/submaps/surface_submaps/mountains/quarantineshuttle.dmm b/maps/submaps/surface_submaps/mountains/quarantineshuttle.dmm
index b1610b1ec7..565fac90bf 100644
--- a/maps/submaps/surface_submaps/mountains/quarantineshuttle.dmm
+++ b/maps/submaps/surface_submaps/mountains/quarantineshuttle.dmm
@@ -64,7 +64,7 @@
"bl" = (/obj/structure/closet/crate/secure/science{icon_state = "scisecurecrateopen"; locked = 0; name = "Virus Samples - FRAGILE"; opened = 1},/obj/item/weapon/virusdish/random,/obj/item/weapon/virusdish/random,/obj/item/weapon/virusdish/random,/turf/simulated/shuttle/floor{ icon_state = "floor_yellow"},/area/submap/cave/qShuttle)
"bm" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/obj/effect/decal/remains/human,/obj/item/clothing/under/mbill{desc = "A uniform belonging to Major Bill's Transportation, a shipping megacorporation. This looks at least a few decades out of date."; name = "\improper old Major Bill's uniform"},/obj/item/clothing/head/soft/mbill{desc = "It's a ballcap bearing the colors of Major Bill's Shipping. This one looks at least a few decades out of date."; name = "old shipping cap"},/turf/simulated/shuttle/floor{ icon_state = "floor_white"},/area/submap/cave/qShuttle)
"bn" = (/obj/structure/table/standard,/obj/item/device/taperecorder,/turf/simulated/shuttle/floor,/area/submap/cave/qShuttle)
-"bo" = (/obj/item/weapon/crowbar/red,/turf/simulated/shuttle/floor{ icon_state = "floor_white"},/area/submap/cave/qShuttle)
+"bo" = (/obj/item/weapon/tool/crowbar/red,/turf/simulated/shuttle/floor{ icon_state = "floor_white"},/area/submap/cave/qShuttle)
"bp" = (/obj/item/trash/chips,/obj/effect/decal/cleanable/dirt,/turf/simulated/shuttle/floor{ icon_state = "floor_yellow"},/area/submap/cave/qShuttle)
"bq" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{ icon_state = "floor_yellow"},/area/submap/cave/qShuttle)
"br" = (/obj/structure/bed/chair,/obj/effect/decal/cleanable/dirt,/turf/simulated/shuttle/floor{ icon_state = "floor_white"},/area/submap/cave/qShuttle)
@@ -112,7 +112,7 @@
"ch" = (/obj/structure/table/steel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/qShuttle)
"ci" = (/obj/structure/table/steel,/obj/item/weapon/reagent_containers/syringe/antiviral,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/qShuttle)
"cj" = (/obj/structure/table/steel,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/qShuttle)
-"ck" = (/obj/structure/table/steel,/obj/item/weapon/crowbar/power,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/qShuttle)
+"ck" = (/obj/structure/table/steel,/obj/item/weapon/tool/crowbar/power,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/qShuttle)
"cl" = (/obj/structure/table/rack,/obj/item/clothing/head/bio_hood,/obj/item/clothing/suit/bio_suit,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/qShuttle)
"cm" = (/obj/item/weapon/weldingtool/largetank,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/qShuttle)
"cn" = (/obj/structure/closet/crate/medical,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/qShuttle)
diff --git a/maps/submaps/surface_submaps/plains/Diner.dmm b/maps/submaps/surface_submaps/plains/Diner.dmm
index 321a21131d..5abfd1a211 100644
--- a/maps/submaps/surface_submaps/plains/Diner.dmm
+++ b/maps/submaps/surface_submaps/plains/Diner.dmm
@@ -59,13 +59,12 @@
"bg" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/lino,/area/submap/Diner)
"bh" = (/obj/structure/bed/chair/office/light,/turf/simulated/floor/lino,/area/submap/Diner)
"bi" = (/turf/simulated/floor/lino,/area/submap/Diner)
-"bj" = (/obj/structure/bed/chair/wood{dir = 1},/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/submap/Diner)
"bk" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/lino,/area/submap/Diner)
"bl" = (/obj/structure/table/woodentable,/obj/item/weapon/cell/high,/turf/simulated/floor/lino,/area/submap/Diner)
"bm" = (/obj/structure/table/woodentable,/turf/simulated/floor/lino,/area/submap/Diner)
"bn" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/lino,/area/submap/Diner)
"bo" = (/obj/structure/simple_door/wood,/turf/simulated/floor/lino,/area/submap/Diner)
-"bp" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/windoor_assembly{ icon_state = "l_windoor_assembly01"; dir = 2},/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"bp" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/windoor_assembly{icon_state = "l_windoor_assembly01"; dir = 2},/turf/simulated/floor/tiled/white,/area/submap/Diner)
"bq" = (/obj/structure/bookcase,/turf/simulated/floor/lino,/area/submap/Diner)
"br" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/space_heater,/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/submap/Diner)
"bs" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
@@ -82,22 +81,22 @@
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaabababacabababababadaeaeadadadadadadadadabababaa
aaabababacacabababadadafafadagahaiajakalamadababaa
-aaabanacacacababadadafaoaoadapapapapapapapadadabaa
+aaabanacacacababadadafaxaxadapapapapapapapadadabaa
aaababacacacabadadaqafarasadatapauahavapapawadadaa
-aaababacacacabadafafafaxaxadapapapapapapapapayadaa
-aaababacacacabaeaoaoafafafadazazadaAadadaBadadadaa
+aaababacacacabadafafafaoaoadapapapapapapapapayadaa
+aaababacacacabaeaxaxafafafadazazadaAadadaBadadadaa
aaababacacacabaeaCaDafafaEaFafafadaGadaHaHaHaIadaa
-aaababacacacabaeaxaxafafaEaJafaKadaLadaMaHaHaNadaa
+aaababacacacabaeaoaoafafaEaJafaKadaLadaMaHaHaNadaa
aaababacacacabadafafafafaEaOafaPadaGadaQaHaHaHadaa
aaababacacacacadadadaRafaEaFafaSadaGadaTaHaHaUadaa
aaababacacacacazaVazafafaEaFafaWadaGadadadadadadaa
aaababacacacaXadadadaYafaEaFafaZadaGbabbaGaAbbaAaa
-aaanabacacacabaeaoaoafafaEaFafbcadbabababaaAaGaAaa
+aaanabacacacabaeaxaxafafaEaFafbcadbabababaaAaGaAaa
aaababacacacabaeaCaDafafaEaFafbdadbaadadadadadadaa
-aaababacacacabaeaxaxafafaEaFafbeadaGadbfbgbhbiadaa
-aaababacacacabadbjaoafafaEaOafahadaGadbkblbmbnadaa
+aaababacacacabaeaoaoafafaEaFafbeadaGadbfbgbhbiadaa
+aaababacacacabadaxaxafafaEaOafahadaGadbkblbmbnadaa
aaababacacacabaeaCaDafafaEaJafaKadaLbobibibibiadaa
-aaababacacacabaeaxaxafafaEaFahbpadaGadbibibqbqadaa
+aaababacacacabaeaoaoafafaEaFahbpadaGadbibibqbqadaa
aaababacacacabaeafafafafafafafafadadadadadadadadaa
aaababacacacabadadbrafafafafafafadbsbtbuadadadadaa
aaabababacabababadadafafbvaDbwafbxbtbtbtadadadabaa
diff --git a/maps/submaps/surface_submaps/plains/Oldhouse.dmm b/maps/submaps/surface_submaps/plains/Oldhouse.dmm
new file mode 100644
index 0000000000..747a4b3ebd
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/Oldhouse.dmm
@@ -0,0 +1,75 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/template_noop,/area/submap/Oldhouse)
+"c" = (/turf/simulated/wall/wood,/area/submap/Oldhouse)
+"d" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/Oldhouse)
+"e" = (/obj/structure/window/reinforced/full,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"f" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"g" = (/obj/item/stack/material/wood,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"h" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"i" = (/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"j" = (/turf/simulated/floor/wood{icon_state = "wood_broken6"},/area/submap/Oldhouse)
+"k" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/spiderling_remains,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"l" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"m" = (/obj/structure/closet/cabinet,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"n" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/carpet/turcarpet,/area/submap/Oldhouse)
+"o" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood{icon_state = "wood_broken4"},/area/submap/Oldhouse)
+"p" = (/turf/simulated/floor/wood{icon_state = "wood_broken2"},/area/submap/Oldhouse)
+"q" = (/obj/item/stack/material/wood,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"r" = (/turf/simulated/floor/carpet/turcarpet,/area/submap/Oldhouse)
+"s" = (/turf/simulated/floor/wood{icon_state = "wood_broken4"},/area/submap/Oldhouse)
+"t" = (/obj/structure/table/woodentable,/obj/item/weapon/paper,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"u" = (/obj/structure/simple_door/wood,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"v" = (/obj/structure/bed/chair/wood{icon_state = "wooden_chair"; dir = 1},/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"w" = (/obj/item/stack/material/wood,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"x" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/wood{icon_state = "wood_broken6"},/area/submap/Oldhouse)
+"y" = (/obj/effect/decal/remains/mouse,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"z" = (/obj/structure/table/woodentable,/obj/item/stack/material/wood,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"A" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"B" = (/obj/structure/bed/chair/comfy/teal,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"C" = (/obj/structure/bookcase,/turf/simulated/floor/carpet/turcarpet,/area/submap/Oldhouse)
+"D" = (/obj/structure/table,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"E" = (/obj/structure/table/woodentable,/obj/item/trash/candle,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"F" = (/obj/structure/table/woodentable,/obj/item/weapon/pen/blue,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"G" = (/obj/item/weapon/reagent_containers/food/snacks/chips,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/simulated/floor/carpet/turcarpet,/area/submap/Oldhouse)
+"H" = (/obj/structure/table/woodentable,/obj/item/weapon/flame/candle,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"I" = (/obj/structure/bed/chair/wood{icon_state = "wooden_chair"; dir = 8},/turf/simulated/floor/carpet/turcarpet,/area/submap/Oldhouse)
+"J" = (/obj/effect/decal/remains/mouse,/turf/simulated/floor/carpet/turcarpet,/area/submap/Oldhouse)
+"K" = (/obj/structure/table/woodentable,/obj/item/weapon/paper,/obj/item/weapon/paper,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"L" = (/obj/structure/table/woodentable,/obj/item/weapon/paper/crumpled,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"M" = (/obj/structure/frame,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"N" = (/mob/living/simple_animal/hostile/giant_spider{attack_armor_pen = 100; attacktext = list("lightly bonked"); desc = "Furry and brown, this spider is so goddamn fat you're surprised it even moves around."; faction = "neutral"; health = 400; melee_damage_lower = 1; melee_damage_upper = 3; melee_miss_chance = 30; move_speed = 5; name = "Mr. Tuddly"},/turf/simulated/floor/carpet/turcarpet,/area/submap/Oldhouse)
+"O" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/carpet/turcarpet,/area/submap/Oldhouse)
+"P" = (/obj/item/weapon/circuitboard/papershredder,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"Q" = (/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers,/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers,/turf/simulated/floor/carpet/turcarpet,/area/submap/Oldhouse)
+"R" = (/obj/effect/decal/cleanable/spiderling_remains,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"S" = (/obj/item/weapon/paper/crumpled,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"T" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/backpack/satchel,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"U" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/item/clothing/head/hood/winter,/obj/item/clothing/head/hood/winter,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"V" = (/obj/item/device/flashlight,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"W" = (/obj/structure/table/rack,/obj/item/clothing/shoes/boots/winter,/obj/item/clothing/shoes/boots/winter,/obj/item/clothing/shoes/boots/winter,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"X" = (/obj/structure/coatrack,/turf/simulated/floor/wood,/area/submap/Oldhouse)
+"Y" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood{icon_state = "wood_broken6"},/area/submap/Oldhouse)
+"Z" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood{icon_state = "wood_broken2"},/area/submap/Oldhouse)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaa
+abbcccccccbbbbbbbbcccccccbda
+abcccccccceeecceeeccccccccba
+accfcghhhiiiiiijiihhkhhclcca
+acmicinnoiipiiiiqiiirrscitca
+aeiiuinnhccccccccccirriuivea
+aeiicsnnwcxiiiyiiicirrzciiea
+acABclnniuiCrCCrCiuirrDciAca
+accEcFrriuiCrCCGCiuirrDcHcca
+abccclIriciCrCCJCichnrKcccba
+abbccLrrMciCrCCNCichOnlccbba
+abbbcciiPciCrCCQCicqiiccbbba
+abbbcciRicSiyiiisyciiiccbbba
+abbbcccuuccccccccccuucccdbba
+abbbbcciihhhiiiiiSiiiccbbbba
+abbbbbclTjhhUViWXiiYZcbbbbba
+abbbbbcccccccuucccccccbbbbba
+adbbbbbbbbbbbbbbbbbbbbbbbbba
+abbbbbbbbbbbbbbbbbbbbbbbbbba
+aaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/construction1.dmm b/maps/submaps/surface_submaps/plains/construction1.dmm
index 96dce1f425..23577514ee 100644
--- a/maps/submaps/surface_submaps/plains/construction1.dmm
+++ b/maps/submaps/surface_submaps/plains/construction1.dmm
@@ -8,7 +8,7 @@
"h" = (/obj/structure/firedoor_assembly,/obj/structure/grille,/turf/simulated/floor/plating/external,/area/submap/construction1)
"i" = (/obj/item/clothing/gloves/black,/turf/simulated/floor/outdoors/rocks,/area/template_noop)
"j" = (/turf/simulated/floor/tiled/external,/area/submap/construction1)
-"k" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating/external,/area/submap/construction1)
+"k" = (/obj/item/weapon/tool/wrench,/turf/simulated/floor/plating/external,/area/submap/construction1)
"l" = (/turf/simulated/wall,/area/submap/construction1)
"m" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/plating/external,/area/submap/construction1)
"n" = (/obj/item/weapon/pickaxe/drill,/turf/simulated/floor/outdoors/rocks,/area/template_noop)
@@ -27,7 +27,7 @@
"A" = (/obj/item/weapon/shovel,/turf/simulated/floor/plating/external,/area/submap/construction1)
"B" = (/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plating/external,/area/submap/construction1)
"C" = (/obj/item/weapon/weldingtool/largetank,/turf/simulated/floor/tiled/external,/area/submap/construction1)
-"D" = (/obj/item/weapon/crowbar,/turf/simulated/floor/plating/external,/area/submap/construction1)
+"D" = (/obj/item/weapon/tool/crowbar,/turf/simulated/floor/plating/external,/area/submap/construction1)
"E" = (/obj/item/clothing/glasses/welding,/turf/simulated/floor/plating/external,/area/submap/construction1)
"F" = (/obj/item/clothing/suit/storage/hazardvest,/turf/simulated/floor/plating/external,/area/submap/construction1)
diff --git a/maps/submaps/surface_submaps/plains/plains.dm b/maps/submaps/surface_submaps/plains/plains.dm
index 0d6a557d7a..c4e97e37d6 100644
--- a/maps/submaps/surface_submaps/plains/plains.dm
+++ b/maps/submaps/surface_submaps/plains/plains.dm
@@ -26,6 +26,7 @@
#include "Snow5.dmm"
#include "SupplyDrop2.dmm"
#include "RationCache.dmm"
+#include "Oldhouse.dmm"
#endif
@@ -193,4 +194,10 @@
name = "Supply Drop 2"
desc = "A drop pod that's clearly been here a while, most of the things inside are rusted and worthless."
mappath = 'maps/submaps/surface_submaps/plains/SupplyDrop2.dmm'
- cost = 8
\ No newline at end of file
+ cost = 8
+
+/datum/map_template/surface/plains/Oldhouse
+ name = "Oldhouse"
+ desc = "Someones old library it seems.."
+ mappath = 'maps/submaps/surface_submaps/plains/Oldhouse.dmm'
+ cost = 15
\ No newline at end of file
diff --git a/maps/submaps/surface_submaps/plains/plains_areas.dm b/maps/submaps/surface_submaps/plains/plains_areas.dm
index c488d83431..99f9fef12e 100644
--- a/maps/submaps/surface_submaps/plains/plains_areas.dm
+++ b/maps/submaps/surface_submaps/plains/plains_areas.dm
@@ -3,9 +3,11 @@
/area/submap/construction1
name = "construction site"
+ ambience = AMBIENCE_RUINS
/area/submap/camp1
name = "camp site"
+ ambience = AMBIENCE_SIF
/area/submap/house1
name = "old explorer's home"
@@ -15,6 +17,7 @@
/area/submap/Epod1
name = "Epod1"
+ ambience = AMBIENCE_FOREBODING
/area/submap/Rocky2
name = "Rocky2"
@@ -24,6 +27,7 @@
/area/submap/PascalB
name = "PascalB"
+ ambience = AMBIENCE_FOREBODING
/area/submap/bonfire
name = "abandoned bonfire"
@@ -39,6 +43,7 @@
/area/submap/Thiefc
name = "Thieves Cave"
+ ambience = AMBIENCE_FOREBODING
/area/submap/smol2
name = "Small 2"
@@ -54,27 +59,39 @@
/area/submap/PooledR
name = "Pooled Rocks"
+ ambience = AMBIENCE_SIF
/area/submap/Diner
name = "Diner"
+ ambience = AMBIENCE_SIF
/area/submap/snow1
name = "Snow1"
+ ambience = AMBIENCE_SIF
/area/submap/snow2
name = "Snow2"
+ ambience = AMBIENCE_SIF
/area/submap/snow3
name = "Snow3"
+ ambience = AMBIENCE_SIF
/area/submap/snow4
name = "Snow4"
+ ambience = AMBIENCE_SIF
/area/submap/snow5
name = "Snow5"
+ ambience = AMBIENCE_SIF
/area/submap/SupplyDrop2
name = "Supply Drop 2"
+ ambience = AMBIENCE_TECH_RUINS
/area/submap/RationCache
name = "Ration Cache"
+
+/area/submap/Oldhouse
+ name = "Oldhouse"
+ ambience = AMBIENCE_FOREBODING
diff --git a/maps/submaps/surface_submaps/wilderness/Blackshuttledown.dmm b/maps/submaps/surface_submaps/wilderness/Blackshuttledown.dmm
index e98d034fa7..54aa35cb70 100644
--- a/maps/submaps/surface_submaps/wilderness/Blackshuttledown.dmm
+++ b/maps/submaps/surface_submaps/wilderness/Blackshuttledown.dmm
@@ -5,7 +5,7 @@
"ae" = (/obj/effect/decal/cleanable/blood,/turf/template_noop,/area/submap/Blackshuttledown)
"af" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/Blackshuttledown)
"ag" = (/obj/structure/table/steel,/turf/template_noop,/area/submap/Blackshuttledown)
-"ah" = (/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Dosen't look friendly in the slightest."; name = "Unknown Individual"; say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!"); speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")},/turf/template_noop,/area/submap/Blackshuttledown)
+"ah" = (/mob/living/simple_animal/hostile/syndicate/ranged/poi,/turf/template_noop,/area/submap/Blackshuttledown)
"ai" = (/turf/template_noop,/turf/simulated/shuttle/wall/dark{icon_state = "dark6"; name = "Unknown Shuttle"},/area/submap/Blackshuttledown)
"aj" = (/turf/simulated/shuttle/wall/dark{icon_state = "dark0"; name = "Unknown Shuttle"},/area/submap/Blackshuttledown)
"ak" = (/turf/template_noop,/turf/simulated/shuttle/wall/dark{icon_state = "dark10"; name = "Unknown Shuttle"},/area/submap/Blackshuttledown)
@@ -14,22 +14,22 @@
"an" = (/obj/machinery/light{dir = 1},/obj/structure/table/rack,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/effect/floor_decal/borderfloor{dir = 9},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"ao" = (/obj/structure/dispenser/oxygen,/obj/effect/floor_decal/borderfloor{dir = 5},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"ap" = (/obj/machinery/door/airlock/external{density = 1; frequency = 1331; id_tag = "merc_shuttle_outer"; name = "Ship External Access"; req_access = list(150)},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
-"aq" = (/obj/effect/floor_decal/corner/green/border{ icon_state = "bordercolor"; dir = 9},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
-"ar" = (/obj/machinery/gibber,/obj/effect/floor_decal/corner/green/border{ icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
-"as" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/corner/green/border{ icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
-"at" = (/obj/machinery/bodyscanner{dir = 8},/obj/effect/floor_decal/corner/green/border{ icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
-"au" = (/obj/machinery/body_scanconsole,/obj/effect/floor_decal/corner/green/border{ icon_state = "bordercolor"; dir = 5},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
+"aq" = (/obj/effect/floor_decal/corner/green/border{icon_state = "bordercolor"; dir = 9},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
+"ar" = (/obj/machinery/gibber,/obj/effect/floor_decal/corner/green/border{icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
+"as" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/corner/green/border{icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
+"at" = (/obj/machinery/bodyscanner{dir = 8},/obj/effect/floor_decal/corner/green/border{icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
+"au" = (/obj/machinery/body_scanconsole,/obj/effect/floor_decal/corner/green/border{icon_state = "bordercolor"; dir = 5},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
"av" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark5"; name = "Unknown Shuttle"},/area/submap/Blackshuttledown)
"aw" = (/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown)
"ax" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/p90,/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown)
"ay" = (/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"az" = (/obj/effect/floor_decal/borderfloor{dir = 4},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"aA" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
-"aB" = (/obj/effect/floor_decal/corner/green/border{ icon_state = "bordercolor"; dir = 8},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
+"aB" = (/obj/effect/floor_decal/corner/green/border{icon_state = "bordercolor"; dir = 8},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
"aC" = (/obj/machinery/optable,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
"aD" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
"aE" = (/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
-"aF" = (/obj/machinery/organ_printer/flesh,/obj/effect/floor_decal/corner/green/border{ icon_state = "bordercolor"; dir = 5},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
+"aF" = (/obj/machinery/organ_printer/flesh,/obj/effect/floor_decal/corner/green/border{icon_state = "bordercolor"; dir = 5},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
"aG" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark9"; name = "Unknown Shuttle"},/area/submap/Blackshuttledown)
"aH" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark6"; name = "Unknown Shuttle"},/area/submap/Blackshuttledown)
"aI" = (/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/viscerator,/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown)
@@ -38,19 +38,19 @@
"aL" = (/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"aM" = (/obj/effect/floor_decal/borderfloor{dir = 5},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"aN" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
-"aO" = (/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Dosen't look friendly in the slightest."; name = "Unknown Individual"; say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!"); speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
-"aP" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/corner/green/border{ icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
+"aO" = (/mob/living/simple_animal/hostile/syndicate/melee/poi,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
+"aP" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/corner/green/border{icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
"aQ" = (/obj/structure/table/steel,/obj/effect/floor_decal/borderfloor/full,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"aR" = (/obj/structure/table/steel,/obj/item/weapon/grenade/smokebomb,/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown)
"aS" = (/obj/effect/floor_decal/borderfloor/corner,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"aT" = (/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"aU" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/borderfloor{dir = 6},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
-"aV" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/surgery,/obj/effect/floor_decal/corner/green/border{ icon_state = "bordercolor"; dir = 10},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
+"aV" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/surgery,/obj/effect/floor_decal/corner/green/border{icon_state = "bordercolor"; dir = 10},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
"aW" = (/obj/structure/table/standard,/obj/item/weapon/tank/anesthetic,/obj/effect/floor_decal/corner/green/border,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
"aX" = (/obj/effect/floor_decal/corner/green/border,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
"aY" = (/obj/structure/table/standard,/obj/item/clothing/gloves/sterile,/obj/item/clothing/gloves/sterile,/obj/effect/floor_decal/corner/green/border,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
"aZ" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/spray/sterilizine,/obj/item/weapon/reagent_containers/spray/sterilizine,/obj/effect/floor_decal/corner/green/border,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
-"ba" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/masks,/obj/effect/floor_decal/corner/green/border{ icon_state = "bordercolor"; dir = 6},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
+"ba" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/masks,/obj/effect/floor_decal/corner/green/border{icon_state = "bordercolor"; dir = 6},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown)
"bb" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 9},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bc" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 5},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bd" = (/obj/machinery/door/airlock/security{locked = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
@@ -63,7 +63,7 @@
"bk" = (/obj/structure/table/steel,/obj/item/weapon/material/knife,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bl" = (/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bm" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
-"bn" = (/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Dosen't look friendly in the slightest."; name = "Unknown Individual"; say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!"); speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bn" = (/mob/living/simple_animal/hostile/syndicate/ranged/poi,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bo" = (/obj/structure/table/steel,/obj/random/toolbox,/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
"bp" = (/obj/structure/table/steel,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
"bq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/submap/Blackshuttledown)
@@ -84,9 +84,9 @@
"bF" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/submap/Blackshuttledown)
"bH" = (/obj/machinery/power/apc{dir = 8; name = "BSD APC"; pixel_x = -24},/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
-"bI" = (/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Dosen't look friendly in the slightest."; name = "Unknown Individual"; say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!"); speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")},/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
+"bI" = (/mob/living/simple_animal/hostile/syndicate/melee/poi,/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown)
"bJ" = (/obj/machinery/computer/area_atmos,/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
-"bK" = (/obj/effect/floor_decal/borderfloor{dir = 4},/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Dosen't look friendly in the slightest."; name = "Unknown Individual"; say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!"); speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bK" = (/mob/living/simple_animal/hostile/syndicate/ranged/laser/poi,/turf/template_noop,/area/submap/Blackshuttledown)
"bL" = (/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bM" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"bN" = (/obj/structure/table/steel,/obj/item/weapon/paper{info = "We need to take a short stop. The engine's are in need of minor repairs due to turbulence, should be a week's time. We've got reserve food supplies but pleanty of locale fauna to subsist on too if need be. PCRC is keeping most of there assets near New Reykjavik and locale authorities are more mindful then most to travel in this kind of weather. Our outfit should be at the rendezvous point in less then ten days assuming the upper ecehelon hasn't dropped ties with us yet."; name = "Operation Progress/M-53"},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
@@ -119,6 +119,8 @@
"co" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/spider,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
"cp" = (/turf/template_noop,/turf/simulated/shuttle/wall/dark{icon_state = "dark5"; name = "Unknown Shuttle"},/area/submap/Blackshuttledown)
"cq" = (/turf/template_noop,/turf/simulated/shuttle/wall/dark{icon_state = "dark9"; name = "Unknown Shuttle"},/area/submap/Blackshuttledown)
+"cr" = (/obj/effect/floor_decal/borderfloor{dir = 4},/mob/living/simple_animal/hostile/syndicate/melee/poi,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"cs" = (/obj/effect/floor_decal/borderfloor{dir = 4},/mob/living/simple_animal/hostile/syndicate/ranged/laser/poi,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -128,7 +130,7 @@ aaabababababababababababababadadabababafabababafababaeababadadabababaa
aaababafabadadadababababafababababababababababababababababadadabababaa
aaabababababadadadabacababababagagagagagagabababababacabafabadabababaa
aaababababababadadabafababababagahabababagabababababababababababababaa
-aaabababababababaiajajajakababagabababahagabababafaiajajajajakabababaa
+aaabababababababaiajajajakababagabababbKagabababafaiajajajajakabababaa
aaabababababababajajajajajajajajajababajajajajajajajajajajajalamababaa
aaababababafababajajajajajajanaoajapapajaqarasatauajajajajajalamababaa
aaabababababababavajajawaxajayazajaAaAajaBaCaDaEaEaEaFajajaGababababaa
@@ -140,14 +142,14 @@ aaabababababbqbrblazajbsblblblbtajblblbububublblajbvblblbwalamabababaa
aaabababababbxbrblaKbybhblbzblblbAblblbBbCbCblblbDblblblbwalamabababaa
aaabababababbxbrblaSbEbFblblblblbAblblbCbCbCblblbDblblblbwalamabababaa
aaabababababbGbrblazajbsblblblbtajblblbububublblajbHblblbIalamabababaa
-aaabababababajbJbFbKajbLaTaTbFbMajbNbOblbPbnblblajbQbRbSajaGababababaa
+aaabababababajbJbFcsajbLaTaTbFbMajbNbOblbPbnblblajbQbRbSajaGababababaa
aaabababababavajbTbUajbdajajayazajajajajajajbAajajajajajaGabababababaa
aaababababababavajaQajawbVajaybWaLaLbXajbYblblblblbZcaajababababababaa
aaabafabababababavajajcbccajayaSaTaTcdajceblbYblbYajcfajbfabafabababaa
-aaabababababababaHajajcgchajaybKajaAaAajbYblbYblbYajciajajbfababababaa
+aaabababababababaHajajcgchajaycrajaAaAajbYblbYblbYajciajajbfababababaa
aaabababababababajajajajajajcjckajapapajbYclcmcncoajajajajalamabababaa
aaabababababababajajajajajajajajajababajajajajajajajajajajalamabababaa
-aaababafababababcpajajajcqababagahabababagabababcpajajajajcqababababaa
+aaababafababababcpajajajcqababagbKabababagabababcpajajajajcqababababaa
aaabababadabababababafababababagabababahagababafabafabababadadadababaa
aaababadadabacababababafabababagagagagagagababababacababadadadadababaa
aaabadadadabababababababaeababababababababababadadabababadadadadababaa
diff --git a/maps/submaps/surface_submaps/wilderness/DoomP.dmm b/maps/submaps/surface_submaps/wilderness/DoomP.dmm
index 1cfed6d4f5..df059b55df 100644
--- a/maps/submaps/surface_submaps/wilderness/DoomP.dmm
+++ b/maps/submaps/surface_submaps/wilderness/DoomP.dmm
@@ -16,7 +16,7 @@
"ap" = (/obj/effect/decal/remains/mouse,/obj/random/landmine,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
"aq" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
"ar" = (/obj/machinery/light/small,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
-"as" = (/obj/machinery/porta_turret,/turf/simulated/floor/plating,/area/submap/DoomP)
+"as" = (/obj/machinery/porta_turret/poi,/turf/simulated/floor/plating,/area/submap/DoomP)
"at" = (/turf/simulated/wall/r_wall,/area/submap/DoomP)
"au" = (/obj/structure/sign/warning/secure_area,/turf/simulated/wall/r_wall,/area/submap/DoomP)
"av" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/submap/DoomP)
@@ -24,7 +24,7 @@
"ax" = (/obj/effect/floor_decal/borderfloor{dir = 9},/turf/simulated/floor/tiled,/area/submap/DoomP)
"ay" = (/obj/structure/bed/chair,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
"az" = (/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aA" = (/obj/structure/bed/chair,/obj/effect/floor_decal/borderfloor{dir = 1},/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Even less friendly than he looks."; speak = list("Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Anyone else smell that?")},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aA" = (/obj/effect/floor_decal/borderfloor{dir = 1},/mob/living/simple_animal/hostile/syndicate/ranged/poi,/turf/simulated/floor/tiled,/area/submap/DoomP)
"aB" = (/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
"aC" = (/obj/machinery/vending/cigarette,/obj/effect/floor_decal/borderfloor{dir = 5},/turf/simulated/floor/tiled,/area/submap/DoomP)
"aD" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP)
@@ -36,14 +36,14 @@
"aJ" = (/obj/structure/table/standard,/obj/item/stack/material/phoron{amount = 25},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
"aK" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
"aL" = (/obj/structure/lattice,/turf/simulated/floor/outdoors/rocks,/area/submap/DoomP)
-"aM" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Even less friendly than he looks."; speak = list("Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Anyone else smell that?")},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aM" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP)
"aN" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/DoomP)
"aO" = (/obj/structure/table/standard,/obj/item/pizzabox,/turf/simulated/floor/tiled,/area/submap/DoomP)
"aP" = (/turf/simulated/floor/tiled,/area/submap/DoomP)
"aQ" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/borderfloor{dir = 4},/turf/simulated/floor/tiled,/area/submap/DoomP)
"aR" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
"aS" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
-"aT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
+"aT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/mob/living/simple_animal/hostile/syndicate/melee/poi,/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
"aU" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
"aV" = (/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
"aW" = (/obj/machinery/light/small,/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
@@ -56,7 +56,7 @@
"bd" = (/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled,/area/submap/DoomP)
"be" = (/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/DoomP)
"bf" = (/obj/machinery/light/small,/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/DoomP)
-"bg" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"bg" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/mob/living/simple_animal/hostile/syndicate/ranged/laser/poi,/turf/simulated/floor/tiled,/area/submap/DoomP)
"bh" = (/obj/machinery/door/airlock/hatch,/turf/simulated/floor/tiled,/area/submap/DoomP)
"bi" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
"bj" = (/obj/machinery/door/airlock/highsecurity,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
@@ -87,6 +87,7 @@
"bI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/submap/DoomP)
"bJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/submap/DoomP)
"bK" = (/obj/structure/lattice,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
+"bL" = (/mob/living/simple_animal/hostile/syndicate/melee/poi,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -118,13 +119,13 @@ aaabababacafafafafafafafakakakafafafafafacadadadadadadadadadadadadadadadadadadac
aaabababacafafafafafafafakakakakakafafafacadadadadadadadaradadadadadaradadadadadacacafafafafafafakakakakafafafafafacabaa
aaabababacafafafafafafafakakakakakafafafacadadasadadasadatauavavavauatadasadadasadacafafafafafafakakakakafafafafafacabaa
aaabababacafafafafafafafakakakakakakafafacatatatatatatatatatatawatatatatatatatatatatatafafafafafakakakakafafafafacacabaa
-aaabababacacafafafafafafakakakakakakafafacataxayazaAaBaAazaCataDataEaFaFaFaGaHaIaJaKatafafafafafakakakakafafafafacacabaa
+aaabababacacafafafafafafakakakakakakafafacataxayaAayaBayazaCataDataEaFaFaFaGaHaIaJaKatafafafafafakakakakafafafafacacabaa
aaabababacacacafafafafakakakakakakakafasaLataMaNaOaNaNaNaPaQataPataRaSaSaSaTaUaVaWaVataXasafafafakakakafafafafafafacabaa
aaabababababacacafafafakakakakakakakafafafataYaNaNaNaNaNaPaZatbaatatatatatatbbbcatatatafafafafafakakakafafafafafafacabaa
aaababababababacafafafakakakakakakakakafafatbdbebebfbebebgaPbhaPaPbiaPaPaPaPaPbiaPaPatafafafafafakakakafafafafafafafacaa
aaabababagabababacafafakakakakakakakakasaXatbjatatatatatatatatatatatatatatbkatatatatataXasafafafakakakafafafafafafafacaa
aaababababababacacafafafakakakakakakakakafatblbmbnbobpbqbrbsatbtbubvbwbvbxbybkbzbkbAatafafafafafakakakafafafafafafafacaa
-aaababababababacafafafafakakakakakakakakafatblblbBblblbBblblatbCbDbDbDbDbDbEatbFatbGatafafafafakakakakakafafafafafafacaa
+aaababababababacafafafafakakakakakakakakafatblblbBblbLbBblblatbCbDbDbDbDbDbEatbFatbGatafafafafakakakakakafafafafafafacaa
aaababababababacafafafafakakakakakakakakakatatatatatatatatatatatatbHbIbIbIbJatatatatatafafafafakakakakafafafafafafafacaa
aaabababababacacafafafakakakakakakakakakakafafafafaLacacadadadadbKadadadadadbKacacafafafafafafakakakakafafafafafafafacaa
aaabababababacafafafafakakakakakakakakakakakakafafasafacacacacacasadadadadadasacafafafafafafakakakakakafafafafafafacacaa
diff --git a/maps/submaps/surface_submaps/wilderness/Drugden.dmm b/maps/submaps/surface_submaps/wilderness/Drugden.dmm
index bf28d68eaa..a3f567a6ef 100644
--- a/maps/submaps/surface_submaps/wilderness/Drugden.dmm
+++ b/maps/submaps/surface_submaps/wilderness/Drugden.dmm
@@ -8,30 +8,30 @@
"h" = (/obj/random/trash,/turf/simulated/floor,/area/submap/Drugd)
"i" = (/obj/structure/closet/cabinet,/obj/item/weapon/lipstick/random,/turf/simulated/floor/carpet,/area/submap/Drugd)
"j" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/structure/curtain/open/bed,/turf/simulated/floor/carpet,/area/submap/Drugd)
-"k" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/pill/happy,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"k" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/pill/happy{name = "pill"},/turf/simulated/floor/carpet,/area/submap/Drugd)
"l" = (/turf/simulated/floor,/area/submap/Drugd)
"m" = (/obj/structure/curtain/black,/turf/simulated/floor,/area/submap/Drugd)
"n" = (/obj/random/trash,/turf/simulated/floor/carpet,/area/submap/Drugd)
"o" = (/turf/simulated/floor/carpet,/area/submap/Drugd)
"p" = (/mob/living/simple_animal/mouse,/turf/simulated/floor,/area/submap/Drugd)
"q" = (/obj/structure/closet/cabinet,/turf/simulated/floor/carpet,/area/submap/Drugd)
-"r" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/pill/methylphenidate,/turf/simulated/floor/carpet,/area/submap/Drugd)
-"s" = (/obj/structure/bed/chair/comfy/beige{ icon_state = "armchair_preview"; dir = 1},/turf/simulated/floor/carpet,/area/submap/Drugd)
-"t" = (/obj/item/weapon/reagent_containers/pill/citalopram,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"r" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/pill/methylphenidate{name = "pill"},/turf/simulated/floor/carpet,/area/submap/Drugd)
+"s" = (/obj/structure/bed/chair/comfy/beige{icon_state = "armchair_preview"; dir = 1},/turf/simulated/floor/carpet,/area/submap/Drugd)
+"t" = (/obj/item/weapon/reagent_containers/pill/citalopram{name = "pill"},/turf/simulated/floor/carpet,/area/submap/Drugd)
"u" = (/obj/random/junk,/turf/simulated/floor,/area/submap/Drugd)
"v" = (/obj/structure/closet/cabinet,/obj/item/weapon/contraband/poster,/turf/simulated/floor/carpet,/area/submap/Drugd)
"w" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor/carpet,/area/submap/Drugd)
"x" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/obj/item/weapon/reagent_containers/syringe/drugs,/turf/simulated/floor/carpet,/area/submap/Drugd)
-"y" = (/obj/structure/bed/chair/comfy/beige,/obj/item/weapon/reagent_containers/pill/citalopram,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"y" = (/obj/structure/bed/chair/comfy/beige,/obj/item/weapon/reagent_containers/pill/citalopram{name = "pill"},/turf/simulated/floor/carpet,/area/submap/Drugd)
"z" = (/obj/structure/loot_pile/maint/junk,/turf/simulated/floor,/area/submap/Drugd)
-"A" = (/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/citalopram,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"A" = (/obj/item/weapon/reagent_containers/pill/citalopram{name = "pill"},/obj/item/weapon/reagent_containers/pill/citalopram{name = "pill"},/turf/simulated/floor/carpet,/area/submap/Drugd)
"B" = (/obj/structure/table/standard,/obj/item/weapon/storage/pill_bottle/happy,/turf/simulated/floor/tiled,/area/submap/Drugd)
"C" = (/obj/structure/table/standard,/obj/item/stack/medical/splint,/turf/simulated/floor/tiled,/area/submap/Drugd)
"D" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/citalopram,/turf/simulated/floor/tiled,/area/submap/Drugd)
"E" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/pill/tramadol,/obj/item/weapon/reagent_containers/pill/tramadol,/turf/simulated/floor/tiled,/area/submap/Drugd)
"F" = (/obj/structure/closet/cabinet,/obj/item/clothing/accessory/jacket,/obj/item/weapon/material/butterfly/switchblade,/turf/simulated/floor/carpet,/area/submap/Drugd)
-"G" = (/obj/item/weapon/reagent_containers/pill/zoom,/obj/random/trash,/turf/simulated/floor/carpet,/area/submap/Drugd)
-"H" = (/obj/item/weapon/reagent_containers/pill/zoom,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"G" = (/obj/item/weapon/reagent_containers/pill/zoom{name = "pill"},/obj/random/trash,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"H" = (/obj/item/weapon/reagent_containers/pill/zoom{name = "pill"},/turf/simulated/floor/carpet,/area/submap/Drugd)
"I" = (/obj/structure/loot_pile/maint/boxfort,/turf/simulated/floor/carpet,/area/submap/Drugd)
"J" = (/obj/structure/table/standard,/obj/item/weapon/surgical/scalpel,/turf/simulated/floor/tiled,/area/submap/Drugd)
"K" = (/obj/item/wheelchair,/turf/simulated/floor/tiled,/area/submap/Drugd)
@@ -39,7 +39,7 @@
"M" = (/obj/structure/loot_pile/maint/junk,/turf/simulated/floor/tiled,/area/submap/Drugd)
"N" = (/obj/effect/floor_decal/rust,/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/Drugd)
"O" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/pill/zoom,/obj/item/weapon/reagent_containers/pill/zoom,/turf/simulated/floor,/area/submap/Drugd)
-"P" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/pill/tramadol,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"P" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/pill/tramadol{name = "pill"},/turf/simulated/floor/carpet,/area/submap/Drugd)
"Q" = (/mob/living/simple_animal/hostile/hivebot/range/guard,/turf/simulated/floor,/area/submap/Drugd)
"R" = (/obj/structure/girder,/turf/simulated/floor,/area/submap/Drugd)
"S" = (/obj/item/weapon/material/shard,/turf/simulated/floor,/area/submap/Drugd)
diff --git a/maps/submaps/surface_submaps/wilderness/Manor1.dmm b/maps/submaps/surface_submaps/wilderness/Manor1.dmm
new file mode 100644
index 0000000000..254316056f
--- /dev/null
+++ b/maps/submaps/surface_submaps/wilderness/Manor1.dmm
@@ -0,0 +1,188 @@
+"aa" = (/turf/template_noop,/area/submap/Manor1)
+"ab" = (/turf/simulated/wall/wood,/area/submap/Manor1)
+"ac" = (/obj/structure/window/reinforced/full,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ad" = (/obj/structure/bed/chair/wood{icon_state = "wooden_chair"; dir = 4},/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ae" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"af" = (/obj/structure/bed/chair/wood{icon_state = "wooden_chair"; dir = 8},/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ag" = (/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ah" = (/obj/structure/flora/pottedplant/dead,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ai" = (/obj/structure/flora/pottedplant/drooping,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aj" = (/obj/structure/table/woodentable,/obj/item/clothing/mask/smokable/cigarette/cigar,/obj/item/weapon/material/ashtray/glass,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ak" = (/obj/structure/flora/pottedplant/dead,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"al" = (/obj/structure/table/woodentable,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"am" = (/obj/structure/table/woodentable,/obj/item/device/flashlight,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"an" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ao" = (/obj/structure/mopbucket,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ap" = (/obj/structure/sink,/turf/simulated/wall/wood,/area/submap/Manor1)
+"aq" = (/turf/simulated/floor/carpet/bcarpet,/area/submap/Manor1)
+"ar" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/carpet/bcarpet,/area/submap/Manor1)
+"as" = (/obj/structure/simple_door/wood,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"at" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/obj/effect/decal/cleanable/blood/gibs/robot,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"au" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"av" = (/obj/structure/janitorialcart,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aw" = (/obj/structure/table/woodentable,/obj/item/weapon/mop,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ax" = (/obj/structure/closet/cabinet,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ay" = (/obj/effect/decal/cleanable/blood/gibs/robot/limb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"az" = (/obj/structure/table/woodentable,/obj/item/trash/candle,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aA" = (/obj/effect/decal/cleanable/dirt,/obj/effect/spider/stickyweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aB" = (/obj/effect/decal/cleanable/dirt,/obj/effect/spider/stickyweb,/mob/living/simple_animal/hostile/giant_spider/lurker,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aC" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/maglight,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aD" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aE" = (/obj/structure/closet/cabinet,/obj/effect/decal/cleanable/cobweb2,/obj/item/clothing/head/hood/winter,/obj/item/clothing/shoes/boots/winter,/obj/item/clothing/suit/storage/hooded/wintercoat,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aF" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aG" = (/obj/structure/table/woodentable,/obj/item/weapon/paper,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aH" = (/obj/structure/table/woodentable,/obj/item/weapon/pen,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aI" = (/obj/structure/flora/pottedplant/dead,/obj/effect/spider/stickyweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aJ" = (/obj/effect/spider/stickyweb,/mob/living/simple_animal/hostile/giant_spider/lurker,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aK" = (/obj/effect/spider/stickyweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aL" = (/obj/structure/fireplace,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aM" = (/mob/living/simple_animal/hostile/giant_spider/lurker,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aN" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aO" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aP" = (/obj/structure/bed/chair/wood,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aQ" = (/turf/simulated/floor/carpet/purcarpet,/area/submap/Manor1)
+"aR" = (/obj/structure/table/standard,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aS" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aT" = (/obj/structure/closet/cabinet,/obj/random/projectile/shotgun,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aU" = (/obj/structure/bookcase,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aV" = (/obj/structure/table/woodentable,/obj/item/weapon/material/kitchen/utensil/fork,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aW" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aX" = (/obj/structure/table/standard,/obj/item/weapon/material/knife,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aY" = (/obj/machinery/cooker/oven,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aZ" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ba" = (/obj/machinery/cooker/grill,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bb" = (/obj/structure/table/standard,/obj/item/weapon/tray,/obj/item/weapon/tray,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bc" = (/obj/structure/table/standard,/obj/item/weapon/material/knife/butch,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bd" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle,/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"be" = (/obj/random/trash,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bf" = (/obj/structure/closet/cabinet,/obj/item/clothing/head/hood/winter,/obj/item/clothing/shoes/boots/winter,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/random/contraband,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bg" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bh" = (/obj/structure/bed/chair/wood{icon_state = "wooden_chair"; dir = 1},/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bi" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/holofloor/wood{icon_state = "wood_broken0"},/area/submap/Manor1)
+"bj" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bk" = (/obj/random/plushielarge,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bl" = (/turf/simulated/floor/carpet/blucarpet,/area/submap/Manor1)
+"bm" = (/obj/structure/loot_pile/surface/bones,/obj/item/clothing/accessory/sweater/blue,/turf/simulated/floor/carpet/blucarpet,/area/submap/Manor1)
+"bn" = (/obj/structure/window/reinforced/full,/turf/template_noop,/area/submap/Manor1)
+"bo" = (/obj/item/weapon/material/twohanded/baseballbat/metal,/turf/simulated/floor/carpet/blucarpet,/area/submap/Manor1)
+"bp" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/carpet/blucarpet,/area/submap/Manor1)
+"bq" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"br" = (/obj/structure/bed/chair/comfy/purp{icon_state = "comfychair_preview"; dir = 4},/turf/simulated/floor/holofloor/wood{icon_state = "wood_broken5"},/area/submap/Manor1)
+"bs" = (/obj/structure/table,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bt" = (/obj/structure/bed/chair/wood{icon_state = "wooden_chair"; dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bu" = (/obj/structure/bed/chair/wood{icon_state = "wooden_chair"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bv" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/sugar,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bw" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/carpet/blucarpet,/area/submap/Manor1)
+"bx" = (/obj/structure/bed/chair/comfy/purp{icon_state = "comfychair_preview"; dir = 4},/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"by" = (/obj/structure/closet/cabinet,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/item/clothing/head/hood/winter,/obj/item/clothing/shoes/boots/winter,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bz" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bA" = (/obj/structure/table/standard,/obj/item/weapon/material/kitchen/utensil/fork,/obj/item/weapon/material/kitchen/utensil/fork,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bB" = (/obj/structure/closet/secure_closet/freezer/fridge,/obj/item/weapon/reagent_containers/food/snacks/stew,/obj/item/weapon/reagent_containers/food/snacks/stew,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bC" = (/obj/item/weapon/shovel,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bD" = (/obj/structure/bed/chair/wood{icon_state = "wooden_chair"; dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bE" = (/obj/structure/table/standard,/obj/item/weapon/material/kitchen/utensil/spoon,/obj/item/weapon/material/kitchen/utensil/spoon,/obj/item/weapon/material/kitchen/utensil/spoon,/obj/effect/spider/stickyweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bF" = (/obj/structure/table/standard,/obj/effect/spider/stickyweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bG" = (/obj/structure/closet/secure_closet/freezer/fridge,/obj/item/weapon/reagent_containers/food/snacks/sausage,/obj/item/weapon/reagent_containers/food/snacks/sausage,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bH" = (/obj/effect/decal/cleanable/dirt,/obj/structure/flora/pottedplant/drooping,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bI" = (/obj/effect/decal/cleanable/dirt,/obj/structure/flora/pottedplant/dead,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bJ" = (/obj/structure/table/standard,/obj/item/weapon/material/kitchen/rollingpin,/obj/effect/spider/stickyweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bK" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bL" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/candle_box,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bM" = (/obj/machinery/papershredder,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bN" = (/obj/structure/simple_door/wood,/turf/simulated/floor/carpet/purcarpet,/area/submap/Manor1)
+"bO" = (/obj/machinery/icecream_vat,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bP" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/carpet/blucarpet,/area/submap/Manor1)
+"bQ" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bR" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/table/woodentable,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bS" = (/obj/structure/flora/pottedplant/subterranean,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bT" = (/obj/item/weapon/material/minihoe,/turf/simulated/floor/carpet/blucarpet,/area/submap/Manor1)
+"bU" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/carpet/purcarpet,/area/submap/Manor1)
+"bV" = (/turf/simulated/floor/holofloor/wood{icon_state = "wood_broken6"},/area/submap/Manor1)
+"bW" = (/obj/machinery/washing_machine,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bX" = (/obj/structure/table/woodentable,/obj/structure/bedsheetbin,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bY" = (/obj/structure/table/rack,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"bZ" = (/obj/structure/closet/crate,/obj/item/stack/cable_coil/random_belt,/obj/random/cash,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ca" = (/obj/structure/table/woodentable,/obj/item/weapon/melee/umbrella/random,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cb" = (/obj/structure/closet/cabinet,/obj/random/gun/random,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cc" = (/obj/structure/closet/cabinet,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/random/medical,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cd" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ce" = (/obj/structure/bed/double,/obj/item/weapon/bedsheet/rddouble,/obj/structure/curtain/open/bed,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cf" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/wallet/random,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cg" = (/obj/structure/flora/pottedplant/dead,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ch" = (/obj/structure/loot_pile/surface/bones,/obj/item/clothing/accessory/sweater,/turf/simulated/floor/carpet/blucarpet,/area/submap/Manor1)
+"ci" = (/obj/structure/closet/crate,/obj/item/weapon/flame/lighter/random,/obj/random/powercell,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cj" = (/obj/structure/closet/cabinet,/obj/item/clothing/shoes/boots/winter,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/item/clothing/head/hood/winter,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ck" = (/obj/effect/decal/cleanable/spiderling_remains,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cl" = (/turf/simulated/floor/carpet/turcarpet,/area/submap/Manor1)
+"cm" = (/obj/effect/decal/cleanable/blood,/obj/structure/bed/chair/comfy/purp{icon_state = "comfychair_preview"; dir = 4},/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cn" = (/obj/structure/closet/crate,/obj/item/weapon/storage/wallet/random,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"co" = (/obj/structure/coatrack,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cp" = (/obj/structure/loot_pile/surface/bones,/obj/item/clothing/suit/storage/hooded/wintercoat,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cq" = (/obj/structure/loot_pile/surface/bones,/obj/item/clothing/under/suit_jacket,/obj/item/clothing/shoes/black,/obj/random/projectile/random,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cr" = (/obj/structure/simple_door/wood,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/carpet/purcarpet,/area/submap/Manor1)
+"cs" = (/obj/item/weapon/material/twohanded/spear,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"ct" = (/obj/structure/closet/cabinet{opened = 1},/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cu" = (/obj/effect/decal/remains,/obj/item/weapon/material/knife/tacknife/combatknife,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cv" = (/obj/structure/sink{pixel_y = 30},/turf/simulated/floor/tiled/hydro,/area/submap/Manor1)
+"cw" = (/turf/simulated/floor/tiled/hydro,/area/submap/Manor1)
+"cx" = (/obj/structure/table/standard,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/tiled/hydro,/area/submap/Manor1)
+"cy" = (/obj/structure/table/standard,/obj/item/weapon/towel/random,/obj/item/weapon/towel/random,/turf/simulated/floor/tiled/hydro,/area/submap/Manor1)
+"cz" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/spider/stickyweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cA" = (/obj/item/weapon/paper/crumpled,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cB" = (/turf/simulated/floor/holofloor/wood{icon_state = "wood_broken3"},/area/submap/Manor1)
+"cC" = (/obj/effect/decal/cleanable/spiderling_remains,/obj/effect/spider/stickyweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cD" = (/obj/structure/closet/crate,/obj/item/clothing/suit/armor/vest,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cE" = (/obj/structure/closet/crate,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cF" = (/obj/structure/simple_door/wood,/turf/simulated/floor/tiled/hydro,/area/submap/Manor1)
+"cG" = (/obj/structure/toilet{icon_state = "toilet00"; dir = 8},/turf/simulated/floor/tiled/hydro,/area/submap/Manor1)
+"cH" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/hydro,/area/submap/Manor1)
+"cI" = (/obj/item/stack/material/wood,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cJ" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/obj/structure/curtain/open/shower,/obj/random/soap,/turf/simulated/floor/tiled/hydro,/area/submap/Manor1)
+"cK" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/hydro,/area/submap/Manor1)
+"cL" = (/obj/structure/toilet{icon_state = "toilet00"; dir = 1},/turf/simulated/floor/tiled/hydro,/area/submap/Manor1)
+"cM" = (/obj/structure/table/woodentable,/obj/item/device/laptop,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"cN" = (/turf/template_noop,/area/template_noop)
+"cO" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/Manor1)
+
+(1,1,1) = {"
+cNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcN
+cNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacababacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacN
+cNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababadaeafagahaiagadajafababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacN
+cNaaaaaaaaaaaaaaaaababababababababababababagagagagagagagagagagagagababababababababababababababaaaaaaaaaaaacN
+cNaaaacOaaaaaaaaabababakagagagalamalagananagagagagananananagagagagagagagagalalalagagagaiabaoapabaaaacOaaaacN
+cNaaaaaaaaaaaaababalabagaqaqaqaqarararararararaqarararararararaqaqaqaqaqaqaqaqaqaqaqaqagasagagababaaaaaaaacN
+cNaaaaaaaaaaababatauabagaqaqaqaqaqaqaqarararararararararararararaqaqaqaqaqaqaqaqaqaqaqagabavagawababaaaaaacN
+cNaaaaaaaaaaabaxagayabagaqagagazalalaganananaAaBaAagananagagagagagagagagagalalaCagagaqagababababababaaaaaacN
+cNaaaaaaaaaaababasababagaqagabababababababababababababababababababababababababababagaqagabaDagagaEabaaaaaacN
+cNaaaaaacOaaabagagagasagaqagabaFaGagalaHabaIaJaKagagaLaLagagagagahabagaMagagagaNabagaqagabaOagagalabaaaaaacN
+cNaaaaaaaaaaabasabababagaqagabagagagagagabaKaKaPaPagaQaQagaPaPagagabaRagaRaRagaSabagaqagabababasababaaaaaacN
+cNaaaaaaaaaaabagagaTabagaqagabagaUagaUagabagadalaVafaQaQadaValafagabaRagaWaXagaYabalaqagasagagagagabaaaaaacN
+cNaaaaaaaaaaabagagaMabagaqagabagaUagaUagabagadalalafaQaQadalalafagabaRagaZaRagbaabagaqagabababasababaaaaaacN
+cNaaaaaaaaaaabaDalaOabagaqagabagaUagaUagabagadalalafaQaQadalalafagabbbagaRbcagbdabagaqagabaOagagalabaaaaaacN
+cNaaaaaaaaaaabababababagaqagabagagagaganabagadalalafaQaQadalalafagabagagagagagagabagaqagabaDbeagbfabaaaaaacN
+cNaaaaaaaaaaabaDalbgabalaqagabagaUagaUanabagadalalafaQaQadalalafagabagagagagagagabagaqagababababababaaaaaacN
+cNaaaaaaaaababagbhagabazaqagasagaUagaUanabagadaGalafaQaQadalalafagabagagagagagagabagaqagabbiagagagababaaaacN
+cNaaaaaaababbjagagbkabalaqagabagaUanaUanabagadalalafaQaQadalalafagabagagagagagagabagaqagabagblbmagagababaacN
+cNaaaaaabnagagagagaOabagaqanabanananananabanadalalafaQaQadalalafagasagagagagagagasagaqagasagbobpbqbrbsacaacN
+cNaaaaaabnagagagagalabagaranabagaUanaUagabanbtalalafaQaQadalalbuanabagagaRbvagagabagaqagabagblbwagbxbsacaacN
+cNaaaaaaababagagagbyabanaranabagaUanaUagabanbtalalafaQaQadalbzbuanabagagbAaRagbBabagaqagabagblblagbCababaacN
+cNaaaaaaaaababagagagabanaragabagaUanaUagabananbhbhagaQaQagbhbDananabagagbEbFagbGabagaqagabalblblagababaaaacN
+cNaaaaaaaaaaabagagagabagaragabagaganagagabbHananagagaQaQaganananbIabagagbFbJagbKabagaqagabaDblblalabaaaaaacN
+cNaaaaaaaaaaabagagagasagaqagabaGbLbMagaiababababababbNbNababababababbOaKaKaKagagabagaqagabalblblalabaaaaaacN
+cNaaaaaaaaaaabazalagabagaqagababababasabababababalalaQaQalalabababababababababababagaqagabalbwbPalabaaaaaacN
+cNaaaaaaaaaaabababababbQaqagagananananananananasagagaQaQagagasagagagagagagagagagagagaqagabazblbPalabaaaaaacN
+cNaaaaaaaaababbRazbSabbqaqagagagagananananananasagagaQaQagagasagagagagagagagagagagagaqagabalblbTagababaaaacN
+cNaaaaaaababagagagagabagaqagababababasabababababalagbUaQagalabababababababababababagaqagabagblblbVagababaacN
+cNaaaaaaacagagagagbqasbqaqagabbWbXabagabbYagbZabalagbUbUagcaabcbccagcdcecfagagcgabagaqagasagbpchagbxbsacaacN
+cNaacOaaacagagagbqagabagaqagabagagasagabagagciabcjckbUbUagcjabagclclclclclclclaDabagaqagabbqbwblagcmagacaacN
+cNaaaaaaababagbQbQagabahaqagabbWazabagasagagcnababcobUbUcoababagclclclclclclclalabahaqahabagbwblagcpababaacN
+cNaaaaaaaaababcqagagababasabababababagabagagagaKababcrcrababagagclclclclclclclalababasababcsblbwagababaaaacN
+cNaaaaaaaaaaabctagcuabcvcwcxabcycwasagabbYagaKaKczabbUbUabazafagclclclclclclclagagagagahabagcAcBagabaaaaaacN
+cNaaaaaaaaaaababalagabcwabababcwcwabagabbYcCaJcDcEabbUbUabalagagagagagclclclclclclclclagabcAbqagababaaaaaacN
+cNaaaaaaaaaaaaababalabcwcFcGabcwcHabasabababababababbNbNabababababahagclclclclclclclclagabagcIababaaaaaaaacN
+cNaaaaaaaaaaaaaaabababcwabababcwcHabcwcvababaaaaaaaaaaaaaaaaaaaaababalclclclclclclclclagabcIababaaaaaaaaaacN
+cNaaaaaaaaaaaaaaaaababcwcFcGabcwcJabcKcLabaaaaaaaaaaaaaaaaaaaaaaaaabcMalalagagagagagagahabababaaaaaacOaaaacN
+cNaaaaaacOaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaacN
+cNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacN
+cNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcN
+"}
diff --git a/maps/submaps/surface_submaps/wilderness/Rockybase.dmm b/maps/submaps/surface_submaps/wilderness/Rockybase.dmm
index cb62587c48..f8eec63f26 100644
--- a/maps/submaps/surface_submaps/wilderness/Rockybase.dmm
+++ b/maps/submaps/surface_submaps/wilderness/Rockybase.dmm
@@ -11,7 +11,7 @@
"ak" = (/mob/living/simple_animal/hostile/malf_drone/lesser,/turf/template_noop,/area/submap/Rockybase)
"al" = (/turf/simulated/floor,/area/submap/Rockybase)
"am" = (/obj/effect/decal/remains/posi,/turf/simulated/floor,/area/submap/Rockybase)
-"an" = (/obj/machinery/porta_turret/stationary,/turf/simulated/floor,/area/submap/Rockybase)
+"an" = (/obj/machinery/porta_turret/poi,/turf/simulated/floor,/area/submap/Rockybase)
"ao" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/submap/Rockybase)
"ap" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/template_noop)
"aq" = (/obj/effect/floor_decal/industrial/danger,/turf/simulated/floor,/area/submap/Rockybase)
@@ -38,28 +38,28 @@
"aL" = (/obj/item/weapon/stool,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"aM" = (/obj/item/weapon/storage/belt/janitor,/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"aN" = (/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aO" = (/obj/structure/table/standard,/obj/item/device/laptop,/obj/effect/floor_decal/corner/red/border{ icon_state = "bordercolor"; dir = 9},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aP" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/red/border{ icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aQ" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/pistol,/obj/effect/floor_decal/corner/red/border{ icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aR" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun/taser,/obj/effect/floor_decal/corner/red/border{ icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aS" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/corner/red/border{ icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aT" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/red/border{ icon_state = "bordercolor"; dir = 5},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aO" = (/obj/structure/table/standard,/obj/item/device/laptop,/obj/effect/floor_decal/corner/red/border{icon_state = "bordercolor"; dir = 9},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aP" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/red/border{icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aQ" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/pistol,/obj/effect/floor_decal/corner/red/border{icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aR" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun/taser,/obj/effect/floor_decal/corner/red/border{icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aS" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/corner/red/border{icon_state = "bordercolor"; dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aT" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/red/border{icon_state = "bordercolor"; dir = 5},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"aU" = (/turf/simulated/floor/tiled/techfloor,/area/submap/Rockybase)
"aV" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/simulated/floor/tiled/techfloor,/area/submap/Rockybase)
-"aW" = (/obj/machinery/vending/hydronutrients,/obj/effect/floor_decal/corner/lime/border{ icon_state = "bordercolor"; dir = 9},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aX" = (/obj/structure/closet/crate/hydroponics,/obj/effect/floor_decal/corner/lime/border{ icon_state = "bordercolor"; dir = 5},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aW" = (/obj/machinery/vending/hydronutrients,/obj/effect/floor_decal/corner/lime/border{icon_state = "bordercolor"; dir = 9},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aX" = (/obj/structure/closet/crate/hydroponics,/obj/effect/floor_decal/corner/lime/border{icon_state = "bordercolor"; dir = 5},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"aY" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
"aZ" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
"ba" = (/obj/structure/janitorialcart,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bb" = (/obj/structure/table/standard,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bc" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bd" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "Carl's absolutly fucked in the head. He's trying to squeeze as much drone production out as he can since he's worried we're gonna get found out but he's getting sloppier with each batch. Now's he's telling us he can speed the time on the IFF encoding. I already have a hard enough time getting these damn things not to stare at walls and now he's gonna shortchange the only part of these tincans that tells em not to turn us into paste on a wall. I told Richter to get out while he can, We're counting days before either some Sif task force shows up at our door or these things decide we aren't there friends anymore."; name = "Note"},/obj/effect/floor_decal/corner/red/border{ icon_state = "bordercolor"; dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bd" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "Carl's absolutly fucked in the head. He's trying to squeeze as much drone production out as he can since he's worried we're gonna get found out but he's getting sloppier with each batch. Now's he's telling us he can speed the time on the IFF encoding. I already have a hard enough time getting these damn things not to stare at walls and now he's gonna shortchange the only part of these tincans that tells em not to turn us into paste on a wall. I told Richter to get out while he can, We're counting days before either some Sif task force shows up at our door or these things decide we aren't there friends anymore."; name = "Note"},/obj/effect/floor_decal/corner/red/border{icon_state = "bordercolor"; dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"be" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bf" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bg" = (/obj/machinery/vending/security,/obj/effect/floor_decal/corner/red/border{ icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bg" = (/obj/machinery/vending/security,/obj/effect/floor_decal/corner/red/border{icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bh" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/cell/device/weapon,/turf/simulated/floor/tiled/techfloor,/area/submap/Rockybase)
-"bi" = (/obj/effect/floor_decal/corner/lime/border{ icon_state = "bordercolor"; dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bj" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/floor_decal/corner/lime/border{ icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bi" = (/obj/effect/floor_decal/corner/lime/border{icon_state = "bordercolor"; dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bj" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/floor_decal/corner/lime/border{icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bk" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
"bl" = (/obj/item/mecha_parts/part/gygax_left_leg,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
"bm" = (/obj/machinery/light,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
@@ -67,17 +67,17 @@
"bo" = (/obj/structure/closet/crate/trashcart,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bp" = (/obj/structure/loot_pile/maint/trash,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bq" = (/obj/structure/table/standard,/obj/item/weapon/storage/bag/trash,/obj/item/weapon/storage/bag/trash,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"br" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/obj/effect/floor_decal/corner/red/border{ icon_state = "bordercolor"; dir = 10},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"br" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/obj/effect/floor_decal/corner/red/border{icon_state = "bordercolor"; dir = 10},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bs" = (/obj/machinery/light,/obj/structure/table/standard,/obj/item/weapon/pen,/obj/effect/floor_decal/corner/red/border,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bt" = (/obj/effect/floor_decal/corner/red/border,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bu" = (/obj/effect/floor_decal/corner/red/border,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bv" = (/obj/machinery/door/airlock/security{icon_state = "door_locked"; locked = 1},/turf/simulated/floor/tiled/techfloor,/area/submap/Rockybase)
"bw" = (/obj/machinery/light,/turf/simulated/floor/tiled/techfloor,/area/submap/Rockybase)
"bx" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle/pistol,/turf/simulated/floor/tiled/techfloor,/area/submap/Rockybase)
-"by" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/effect/floor_decal/corner/lime/border{ icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"by" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/effect/floor_decal/corner/lime/border{icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bz" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bA" = (/obj/effect/floor_decal/corner/lime/border{ icon_state = "bordercolor"; dir = 8},/mob/living/bot/farmbot{faction = "malf_drone"; name = "Mr. Weddleton"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bB" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/effect/floor_decal/corner/lime/border{ icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bA" = (/obj/effect/floor_decal/corner/lime/border{icon_state = "bordercolor"; dir = 8},/mob/living/bot/farmbot{faction = "malf_drone"; name = "Mr. Weddleton"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bB" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/effect/floor_decal/corner/lime/border{icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bC" = (/obj/effect/decal/remains/posi,/turf/template_noop,/area/template_noop)
"bD" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"bE" = (/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
@@ -139,7 +139,6 @@
"cI" = (/obj/structure/girder,/turf/simulated/floor,/area/submap/Rockybase)
"cJ" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"cK" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
-"cL" = (/obj/machinery/drone_fabricator{fabricator_tag = "Unknown"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"cM" = (/obj/machinery/drone_fabricator{fabricator_tag = "Unknown"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"cN" = (/obj/machinery/mecha_part_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"cO" = (/obj/machinery/pros_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase)
@@ -163,14 +162,14 @@
"dg" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"dh" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"di" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/submap/Rockybase)
-"dj" = (/obj/item/mecha_parts/part/gygax_right_leg,/obj/effect/floor_decal/corner/lime/border{ icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"dj" = (/obj/item/mecha_parts/part/gygax_right_leg,/obj/effect/floor_decal/corner/lime/border{icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"dk" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/mecha_parts/part/gygax_left_arm,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
"dl" = (/obj/machinery/vending,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"dm" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"dn" = (/obj/machinery/power/smes/buildable/point_of_interest,/obj/structure/cable/green,/turf/simulated/floor,/area/submap/Rockybase)
"do" = (/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"dp" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/hostile/malf_drone/lesser,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"dq" = (/obj/structure/closet/secure_closet/hydroponics,/obj/effect/floor_decal/corner/lime/border{ icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"dq" = (/obj/structure/closet/secure_closet/hydroponics,/obj/effect/floor_decal/corner/lime/border{icon_state = "bordercolor"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"dr" = (/obj/effect/decal/cleanable/blood/oil,/turf/template_noop,/area/template_noop)
"ds" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"dt" = (/obj/machinery/mech_recharger,/turf/simulated/floor/tiled,/area/submap/Rockybase)
@@ -182,8 +181,8 @@
"dz" = (/obj/item/weapon/surgical/surgicaldrill,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"dA" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/tiled,/area/submap/Rockybase)
"dB" = (/obj/effect/decal/cleanable/dirt,/mob/living/bot/medbot{faction = "malf_drone"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"dC" = (/obj/machinery/vending/hydroseeds,/obj/effect/floor_decal/corner/lime/border{ icon_state = "bordercolor"; dir = 10},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"dD" = (/obj/structure/closet/crate/secure/hydrosec,/obj/effect/floor_decal/corner/lime/border{ icon_state = "bordercolor"; dir = 6},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"dC" = (/obj/machinery/vending/hydroseeds,/obj/effect/floor_decal/corner/lime/border{icon_state = "bordercolor"; dir = 10},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"dD" = (/obj/structure/closet/crate/secure/hydrosec,/obj/effect/floor_decal/corner/lime/border{icon_state = "bordercolor"; dir = 6},/turf/simulated/floor/tiled,/area/submap/Rockybase)
"dE" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/structure/gravemarker{dir = 1},/turf/template_noop,/area/template_noop)
"dF" = (/obj/effect/gibspawner/robot,/turf/template_noop,/area/template_noop)
"dG" = (/obj/effect/gibspawner/human,/turf/template_noop,/area/template_noop)
@@ -212,9 +211,9 @@ aaaaaaaaafaiatatatbOatatbPbQbQbRbRbRbQbQbQbSaNalbTbUbQbVbQbRbRbRbQbQbQbQbQbUbQbQ
aaaaaaaaafaiatatbXaybYatatatatatatatatatatatalalatatatatbZatatatatcaatatatatatatatatatatbibyatataiaiaiafaaaaaaaa
aaaaaaaaafaiatatcbcbayatcccdcecfcgchcicjckclalcmcnatcocpaNcqcratcscaaNctcucvbLaNaNaNcwatbibyatataiaiaiafaaaaaaaa
aaaaaaaaafaiatatcxbOcyataNaNaNaNaNaNaNaNaNcacaalczataNaNcAcBcCatcDaNbLbLcEcFcGcHcIaNcJatbibBatataiaiaiagaaaaaaaa
-aaaaaaaaafaiatatcbcbcKataNcLaNaNcMaNaNcNaNcOcaalcPatcQbLcRcScTatcUaNbLcVcWcXcYcWcZalaNatbibyatataiaiafafaaaaaaaa
+aaaaaaaaafaiatatcbcbcKataNcMaNaNcMaNaNcNaNcOcaalcPatcQbLcRcScTatcUaNbLcVcWcXcYcWcZalaNatbibyatataiaiafafaaaaaaaa
aaaaaaaaafaiatatcxbOayatcQaNaNdaaNdbaNdcbLdccacaddatdedfdgdfdhataNaNbLdicYcYcWcHalcmaNatbidjatataiaiafafaaaaaaaa
-aaaaabaaafaiatatcbcbdkataNcLaNaNalalbLbLbLbLaNaNdlataNaNdmcSdnatdoaNaNdpcWcGcGcGcGalbLatbidqatataiakafafaaaadraa
+aaaaabaaafaiatatcbcbdkataNcMaNaNalalbLbLbLbLaNaNdlataNaNdmcSdnatdoaNaNdpcWcGcGcGcGalbLatbidqatataiakafafaaaadraa
aaaaaaaaafaiatatcxbOayataNaNaNaNaNaNdsdtaNdtaNaNcpatdudvdwaNdxatdyaNdzaNaNdAcIdAbLbLdBatdCdDatataiaiafafaaaabCaa
aaaaaaaaafaiaiatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatataiaiafafafaaaaaaaa
aaaaaaaaafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaa
diff --git a/maps/submaps/surface_submaps/wilderness/wilderness.dm b/maps/submaps/surface_submaps/wilderness/wilderness.dm
index c10f45c6ad..da28429ea7 100644
--- a/maps/submaps/surface_submaps/wilderness/wilderness.dm
+++ b/maps/submaps/surface_submaps/wilderness/wilderness.dm
@@ -26,6 +26,7 @@
#include "CaveS.dmm"
#include "Drugden.dmm"
#include "Musk.dmm"
+#include "Manor1.dmm"
#endif
@@ -201,4 +202,10 @@
name = "Musk"
desc = "0 to 60 in 1.9 seconds."
mappath = 'maps/submaps/surface_submaps/wilderness/Musk.dmm'
- cost = 10
\ No newline at end of file
+ cost = 10
+
+/datum/map_template/surface/wilderness/deep/Manor1
+ name = "Manor1"
+ desc = "Whodunit"
+ mappath = 'maps/submaps/surface_submaps/wilderness/Manor1.dmm'
+ cost = 20
\ No newline at end of file
diff --git a/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm b/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm
index 8e37e52da4..8f48951167 100644
--- a/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm
+++ b/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm
@@ -1,80 +1,110 @@
/area/submap
name = "Submap Area"
icon_state = "submap"
+ ambience = AMBIENCE_RUINS
/area/submap/spider1
name = "spider nest"
+ ambience = AMBIENCE_FOREBODING
/area/submap/Field1
name = "Field 1"
+ ambience = AMBIENCE_SIF
/area/submap/Lake1
name = "Lake 1"
+ ambience = AMBIENCE_SIF
/area/submap/MilitaryCamp1
name = "Military Camp 1"
+ ambience = AMBIENCE_HIGHSEC
/area/submap/Mudpit
name = "Mudpit"
+ ambience = AMBIENCE_SIF
/area/submap/Rocky1
name = "Rocky1"
+ ambience = AMBIENCE_SIF
/area/submap/Rocky2
name = "Rocky2"
+ ambience = AMBIENCE_SIF
/area/submap/Rocky3
name = "Rocky3"
+ ambience = AMBIENCE_SIF
/area/submap/Shack1
name = "Shack1"
+ ambience = AMBIENCE_RUINS
/area/submap/Small1
name = "Small1"
+ ambience = AMBIENCE_SIF
/area/submap/SnowR1
name = "SnowR1"
+ ambience = AMBIENCE_SIF
/area/submap/BoomBase
name = "Boom1"
+ ambience = AMBIENCE_FOREBODING
/area/submap/Blackshuttledown
name = "BSD"
requires_power = FALSE
+ ambience = AMBIENCE_HIGHSEC
/area/submap/Cragzone1
name = "Craggy1"
+ ambience = AMBIENCE_SIF
/area/submap/Lab1
name = "Lab1"
+ ambience = AMBIENCE_RUINS
/area/submap/Rocky4
name = "Rocky4"
+ ambience = AMBIENCE_SIF
/area/submap/DJOutpost1
name = "DJOutpost1"
+ ambience = AMBIENCE_TECH_RUINS
/area/submap/DJOutpost2
name = "DJOutpost2"
+ ambience = AMBIENCE_GHOSTLY
/area/submap/MHR
name = "Manhack Rock"
+ ambience = AMBIENCE_FOREBODING
/area/submap/Rockybase
name = "Rockybase"
+ ambience = AMBIENCE_HIGHSEC
/area/submap/GovPatrol
name = "GovPatrol"
+ ambience = AMBIENCE_GHOSTLY
/area/submap/DecoupledEngine
name = "DecoupledEngine"
+ ambience = AMBIENCE_FOREBODING
/area/submap/DoomP
name = "DoomP"
+ ambience = AMBIENCE_HIGHSEC
/area/submap/CaveS
name = "CaveS"
+ ambience = AMBIENCE_FOREBODING
/area/submap/Drugd
name = "DrugDen"
+ ambience = AMBIENCE_FOREBODING
+
+/area/submap/Manor1
+ name = "Manor1"
+ ambience = AMBIENCE_FOREBODING
diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm
index 8b4a4ab8ab..05153e5ba9 100644
--- a/maps/~map_system/maps.dm
+++ b/maps/~map_system/maps.dm
@@ -51,6 +51,12 @@ var/list/all_maps = list()
//Also including them lets us override already created jobs, letting us keep the datums to a minimum mostly.
//This is probably a lot longer explanation than it needs to be.
+ var/list/holomap_smoosh // List of lists of zlevels to smoosh into single icons
+ var/list/holomap_offset_x = list()
+ var/list/holomap_offset_y = list()
+ var/list/holomap_legend_x = list()
+ var/list/holomap_legend_y = list()
+
var/station_name = "BAD Station"
var/station_short = "Baddy"
var/dock_name = "THE PirateBay"
@@ -110,7 +116,7 @@ var/list/all_maps = list()
// Update all turfs to ensure everything looks good post-generation. Yes,
// it's brute-forcey, but frankly the alternative is a mine turf rewrite.
- for(var/turf/simulated/mineral/M in world) // Ugh.
+ for(var/turf/simulated/mineral/M in turfs) // Ugh.
M.update_icon()
/datum/map/proc/get_network_access(var/network)
@@ -157,6 +163,12 @@ var/list/all_maps = list()
var/turf/base_turf // Type path of the base turf for this z
var/transit_chance = 0 // Percentile chance this z will be chosen for map-edge space transit.
+// Holomaps
+ var/holomap_offset_x = -1 // Number of pixels to offset the map right (for centering) for this z
+ var/holomap_offset_y = -1 // Number of pixels to offset the map up (for centering) for this z
+ var/holomap_legend_x = 96 // x position of the holomap legend for this z
+ var/holomap_legend_y = 96 // y position of the holomap legend for this z
+
// Default constructor applies itself to the parent map datum
/datum/map_z_level/New(var/datum/map/map)
if(!z) return
@@ -176,6 +188,17 @@ var/list/all_maps = list()
map.base_turf_by_z["[z]"] = base_turf
if(transit_chance)
map.accessible_z_levels["[z]"] = transit_chance
+ // Holomaps
+ // Auto-center the map if needed (Guess based on maxx/maxy)
+ if (holomap_offset_x < 0)
+ holomap_offset_x = ((HOLOMAP_ICON_SIZE - world.maxx) / 2)
+ if (holomap_offset_x < 0)
+ holomap_offset_y = ((HOLOMAP_ICON_SIZE - world.maxy) / 2)
+ // Assign them to the map lists
+ LIST_NUMERIC_SET(map.holomap_offset_x, z, holomap_offset_x)
+ LIST_NUMERIC_SET(map.holomap_offset_y, z, holomap_offset_y)
+ LIST_NUMERIC_SET(map.holomap_legend_x, z, holomap_legend_x)
+ LIST_NUMERIC_SET(map.holomap_legend_y, z, holomap_legend_y)
/datum/map_z_level/Destroy(var/force)
crash_with("Attempt to delete a map_z_level instance [log_info_line(src)]")
diff --git a/nano/README.md b/nano/README.md
new file mode 100644
index 0000000000..5497050a2e
--- /dev/null
+++ b/nano/README.md
@@ -0,0 +1,39 @@
+# NanoUI Templates
+
+NanoUI uses doT (https://olado.github.io/doT/index.html) as its templating engine.
+
+## Template Markup Tags
+
+Markup tags are used to add dynamic content to the template.
+TODO - This documentation is incomplete.
+
+### Print Tag
+- The print tag outputs variable as text to the UI.
+`{{:data.variable}}`
+
+### If Tag
+- The if tag displays content conditionally based on the provided expression being true.
+- When combined with the else tag the if tag can also show content if the provided expression is false.
+- The else tag can optionally have an expression provided (e.g. "`{{else expression2}}`"), giving it "elseif" functionality.
+
+`{{if expression}} {{/if}}`
+`{{if expression}} {{else}} {{/if}}`
+`{{if expression1}} {{else expression2}} {{/if}}`
+
+### For Tag
+- Loop through entries in an array (an array is a list with a numeric index (it does not use strings as keys).
+- Each time the `for` tag iterates though the array it sets a variable (default "value") to the data of the current entry (another variable, default "index", contains the index). An example of this is using the print tag to print the contents (e.g. `{{:value.key1}}` and `{{:value.key2}}`).
+- If combined with an `empty` tag the for tag can display content when the array is empty.
+
+`{{for array}} {{/for}}`
+`{{for array}} {{empty}} {{/for}}`
+
+
+### Tansclusion Tag
+- Include the contents of another template which has been added to the ui.
+`{{#def.atmosphericScan}}`
+
+- You first must have added a template to the ui server side in your DM code:
+`ui.add_template("atmosphericScan", "atmospheric_scan.tmpl")`
+
+- Then you can reference it in the main template. The tag will be replaced by the contents of the named template. All tags in the named template are evaluated as normal.
diff --git a/nano/js/nano_state.js b/nano/js/nano_state.js
index e211895cee..92965d1ab2 100644
--- a/nano/js/nano_state.js
+++ b/nano/js/nano_state.js
@@ -7,7 +7,8 @@ function NanoStateClass() {
return;
}
- this.key = this.key.toLowerCase();
+ this.key = this.key.toLowerCase();
+
NanoStateManager.addState(this);*/
}
@@ -17,99 +18,102 @@ NanoStateClass.prototype.contentRendered = false;
NanoStateClass.prototype.mapInitialised = false;
NanoStateClass.prototype.isCurrent = function () {
- return NanoStateManager.getCurrentState() == this;
+ return NanoStateManager.getCurrentState() == this;
};
NanoStateClass.prototype.onAdd = function (previousState) {
- // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
- NanoBaseCallbacks.addCallbacks();
- NanoBaseHelpers.addHelpers();
+ // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
+
+ NanoBaseCallbacks.addCallbacks();
+ NanoBaseHelpers.addHelpers();
};
NanoStateClass.prototype.onRemove = function (nextState) {
- // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
- NanoBaseCallbacks.removeCallbacks();
- NanoBaseHelpers.removeHelpers();
+ // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
+
+ NanoBaseCallbacks.removeCallbacks();
+ NanoBaseHelpers.removeHelpers();
};
NanoStateClass.prototype.onBeforeUpdate = function (data) {
- // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
- data = NanoStateManager.executeBeforeUpdateCallbacks(data);
- return data; // Return data to continue, return false to prevent onUpdate and onAfterUpdate
+ // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
+
+ data = NanoStateManager.executeBeforeUpdateCallbacks(data);
+
+ return data; // Return data to continue, return false to prevent onUpdate and onAfterUpdate
};
NanoStateClass.prototype.onUpdate = function (data) {
- // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
- try
- {
- if (!this.layoutRendered || (data['config'].hasOwnProperty('autoUpdateLayout') && data['config']['autoUpdateLayout']))
- {
- $("#uiLayout").html(NanoTemplate.parse('layout', data)); // render the 'mail' template to the #mainTemplate div
- this.layoutRendered = true;
- }
- if (!this.contentRendered || (data['config'].hasOwnProperty('autoUpdateContent') && data['config']['autoUpdateContent']))
- {
- var content = "";
- var keys = NanoTemplate.getKeys();
- for (i = 0; i < keys.length; i++) {
- if(keys[i] == "layout"){ continue; }
- content += NanoTemplate.parse(keys[i], data);
- }
- $("#uiContent").html(content); // render the 'mail' template to the #mainTemplate div
- this.contentRendered = true;
- }
- if (NanoTemplate.templateExists('mapContent'))
- {
- if (!this.mapInitialised)
- {
- // Add drag functionality to the map ui
- $('#uiMap').draggable();
- $('#uiMapTooltip')
- .off('click')
- .on('click', function (event) {
- event.preventDefault();
- $(this).fadeOut(400);
- });
- this.mapInitialised = true;
- }
+ // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
- $("#uiMapContent").html(NanoTemplate.parse('mapContent', data)); // render the 'mapContent' template to the #uiMapContent div
+ try
+ {
+ if (!this.layoutRendered || (data['config'].hasOwnProperty('autoUpdateLayout') && data['config']['autoUpdateLayout']))
+ {
+ $("#uiLayout").html(NanoTemplate.parse('layout', data)); // render the 'layout' template to the #uiLayout div
+ this.layoutRendered = true;
+ }
+ if (!this.contentRendered || (data['config'].hasOwnProperty('autoUpdateContent') && data['config']['autoUpdateContent']))
+ {
+ $("#uiContent").html(NanoTemplate.parse('main', data)); // render the 'main' template to the #uiContent div
+ this.contentRendered = true;
+ }
+ if (NanoTemplate.templateExists('mapContent'))
+ {
+ if (!this.mapInitialised)
+ {
+ // Add drag functionality to the map ui
+ $('#uiMap').draggable();
- if (data['config'].hasOwnProperty('showMap') && data['config']['showMap'])
- {
- $('#uiContent').addClass('hidden');
- $('#uiMapWrapper').removeClass('hidden');
- }
- else
- {
- $('#uiMapWrapper').addClass('hidden');
- $('#uiContent').removeClass('hidden');
- }
- }
- if (NanoTemplate.templateExists('mapHeader'))
- {
- $("#uiMapHeader").html(NanoTemplate.parse('mapHeader', data)); // render the 'mapHeader' template to the #uiMapHeader div
- }
- if (NanoTemplate.templateExists('mapFooter'))
- {
- $("#uiMapFooter").html(NanoTemplate.parse('mapFooter', data)); // render the 'mapFooter' template to the #uiMapFooter div
- }
- }
- catch(error)
- {
- alert('ERROR: An error occurred while rendering the UI: ' + error.message);
- return;
- }
+ $('#uiMapTooltip')
+ .off('click')
+ .on('click', function (event) {
+ event.preventDefault();
+ $(this).fadeOut(400);
+ });
+
+ this.mapInitialised = true;
+ }
+
+ $("#uiMapContent").html(NanoTemplate.parse('mapContent', data)); // render the 'mapContent' template to the #uiMapContent div
+
+ if (data['config'].hasOwnProperty('showMap') && data['config']['showMap'])
+ {
+ $('#uiContent').addClass('hidden');
+ $('#uiMapWrapper').removeClass('hidden');
+ }
+ else
+ {
+ $('#uiMapWrapper').addClass('hidden');
+ $('#uiContent').removeClass('hidden');
+ }
+ }
+ if (NanoTemplate.templateExists('mapHeader'))
+ {
+ $("#uiMapHeader").html(NanoTemplate.parse('mapHeader', data)); // render the 'mapHeader' template to the #uiMapHeader div
+ }
+ if (NanoTemplate.templateExists('mapFooter'))
+ {
+ $("#uiMapFooter").html(NanoTemplate.parse('mapFooter', data)); // render the 'mapFooter' template to the #uiMapFooter div
+ }
+ }
+ catch(error)
+ {
+ alert('ERROR: An error occurred while rendering the UI: ' + error.message);
+ return;
+ }
};
NanoStateClass.prototype.onAfterUpdate = function (data) {
- // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
- NanoStateManager.executeAfterUpdateCallbacks(data);
+ // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
+
+ NanoStateManager.executeAfterUpdateCallbacks(data);
};
NanoStateClass.prototype.alertText = function (text) {
- // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
- alert(text);
+ // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
+
+ alert(text);
};
diff --git a/nano/js/nano_template.js b/nano/js/nano_template.js
index b2f894fd07..f8f5d26594 100644
--- a/nano/js/nano_template.js
+++ b/nano/js/nano_template.js
@@ -1,15 +1,15 @@
var NanoTemplate = function () {
- var _templateData = {};
+ var _templateData = {};
- var _templates = {};
- var _compiledTemplates = {};
+ var _templates = {};
+ var _compiledTemplates = {};
var _helpers = {};
- var init = function () {
- // We store templateData in the body tag, it's as good a place as any
+ var init = function () {
+ // We store templateData in the body tag, it's as good a place as any
_templateData = $('body').data('templateData');
if (_templateData == null)
@@ -18,101 +18,94 @@ var NanoTemplate = function () {
}
loadNextTemplate();
- };
+ };
- var loadNextTemplate = function () {
- // we count the number of templates for this ui so that we know when they've all been rendered
- var templateCount = Object.size(_templateData);
+ var loadNextTemplate = function () {
+ // we count the number of templates for this ui so that we know when they've all been rendered
+ var templateCount = Object.size(_templateData);
- if (!templateCount)
- {
- $(document).trigger('templatesLoaded');
- return;
- }
+ if (!templateCount)
+ {
+ $(document).trigger('templatesLoaded');
+ return;
+ }
- // load markup for each template and register it
- for (var key in _templateData)
- {
- if (!_templateData.hasOwnProperty(key))
- {
- continue;
- }
+ // load markup for each template and register it
+ for (var key in _templateData)
+ {
+ if (!_templateData.hasOwnProperty(key))
+ {
+ continue;
+ }
- $.when($.ajax({
- url: _templateData[key],
- cache: false,
- dataType: 'text'
- }))
- .done(function(templateMarkup) {
+ $.when($.ajax({
+ url: _templateData[key],
+ cache: false,
+ dataType: 'text'
+ }))
+ .done(function(templateMarkup) {
- templateMarkup += '';
+ templateMarkup += '';
- try
- {
- NanoTemplate.addTemplate(key, templateMarkup);
- }
- catch(error)
- {
- alert('ERROR: An error occurred while loading the UI: ' + error.message);
- return;
- }
+ try
+ {
+ NanoTemplate.addTemplate(key, templateMarkup);
+ }
+ catch(error)
+ {
+ alert('ERROR: An error occurred while loading the UI: ' + error.message);
+ return;
+ }
- delete _templateData[key];
+ delete _templateData[key];
- loadNextTemplate();
- })
- .fail(function () {
- alert('ERROR: Loading template ' + key + '(' + _templateData[key] + ') failed!');
- });
+ loadNextTemplate();
+ })
+ .fail(function () {
+ alert('ERROR: Loading template ' + key + '(' + _templateData[key] + ') failed!');
+ });
- return;
- }
- }
+ return;
+ }
+ }
- var compileTemplates = function () {
+ var compileTemplates = function () {
- for (var key in _templates) {
- try {
- _compiledTemplates[key] = doT.template(_templates[key], null, _templates)
- }
- catch (error) {
- alert(error.message);
- }
- }
- };
+ for (var key in _templates) {
+ try {
+ _compiledTemplates[key] = doT.template(_templates[key], null, _templates)
+ }
+ catch (error) {
+ alert(error.message);
+ }
+ }
+ };
- return {
- init: function () {
- init();
- },
- addTemplate: function (key, templateString) {
- _templates[key] = templateString;
- },
- templateExists: function (key) {
- return _templates.hasOwnProperty(key);
- },
- getKeys: function () {
- var _keys = [];
- for(var key in _templates) {
- _keys.push(key);
- }
- return _keys;
- },
- parse: function (templateKey, data) {
- if (!_compiledTemplates.hasOwnProperty(templateKey) || !_compiledTemplates[templateKey]) {
- if (!_templates.hasOwnProperty(templateKey)) {
- alert('ERROR: Template "' + templateKey + '" does not exist in _compiledTemplates!');
- return 'Templateerror (does not exist)';
- }
- compileTemplates();
- }
- if (typeof _compiledTemplates[templateKey] != 'function') {
- alert(_compiledTemplates[templateKey]);
- alert('ERROR: Template "' + templateKey + '" failed to compile!');
- return 'Template error (failed to compile)';
- }
- return _compiledTemplates[templateKey].call(this, data['data'], data['config'], _helpers);
- },
+ return {
+ init: function () {
+ init();
+ },
+ addTemplate: function (key, templateString) {
+ _templates[key] = templateString;
+ },
+ templateExists: function (key) {
+ return _templates.hasOwnProperty(key);
+ },
+ parse: function (templateKey, data) {
+ if (!_compiledTemplates.hasOwnProperty(templateKey) || !_compiledTemplates[templateKey]) {
+ if (!_templates.hasOwnProperty(templateKey)) {
+ alert('ERROR: Template "' + templateKey + '" does not exist in _compiledTemplates!');
+ return 'Template error (does not exist)';
+ }
+ compileTemplates();
+ }
+ if (typeof _compiledTemplates[templateKey] != 'function') {
+ alert(_compiledTemplates[templateKey]);
+ alert('ERROR: Template "' + templateKey + '" failed to compile!');
+ return 'Template error (failed to compile)';
+ }
+ return _compiledTemplates[templateKey].call(this, data['data'], data['config'], _helpers);
+ },
addHelper: function (helperName, helperFunction) {
if (!jQuery.isFunction(helperFunction)) {
alert('NanoTemplate.addHelper failed to add ' + helperName + ' as it is not a function.');
@@ -136,7 +129,7 @@ var NanoTemplate = function () {
delete _helpers[helperName];
}
}
- }
+ }
}();
diff --git a/nano/templates/atmospheric_scan.tmpl b/nano/templates/atmospheric_scan.tmpl
new file mode 100644
index 0000000000..df1f6bf06a
--- /dev/null
+++ b/nano/templates/atmospheric_scan.tmpl
@@ -0,0 +1,57 @@
+
+ {{if data.aircontents.reading == 1}}
+
+ Pressure:
+
+
+ {{:helper.string('{1} kPa', data.aircontents.pressure < 80 || data.aircontents.pressure > 120 ? 'bad' : data.aircontents.pressure < 95 || data.aircontents.pressure > 110 ? 'average' : 'good' , data.aircontents.pressure)}}
+
+
+ Temperature:
+
+
+ {{:helper.string('{1} °C', data.aircontents.temp < 5 || data.aircontents.temp > 35 ? 'bad' : data.aircontents.temp < 15 || data.aircontents.temp > 25 ? 'average' : 'good' , data.aircontents.temp)}}
+
+
+
+ Oxygen:
+
+
+ {{:helper.string('{1}%', data.aircontents.oxygen < 17 ? 'bad' : data.aircontents.oxygen < 19 ? 'average' : 'good' , data.aircontents.oxygen)}}
+
+
+ Nitrogen:
+
+
+ {{:helper.string('{1}%', data.aircontents.nitrogen > 82 ? 'bad' : data.aircontents.nitrogen > 80 ? 'average' : 'good' , data.aircontents.nitrogen)}}
+
+ {{if data.aircontents.carbon_dioxide > 0}}
+
+ Carbon Dioxide:
+
+
+ {{:helper.string('{1}%', data.aircontents.carbon_dioxide > 5 ? 'bad' : 'good' , data.aircontents.carbon_dioxide)}}
+
+ {{/if}}
+ {{if data.aircontents.phoron > 0}}
+
+ Phoron:
+
+
+ {{:helper.string('{1}%', data.aircontents.phoron > 0 ? 'bad' : 'good' , data.aircontents.phoron)}}
+
+ {{/if}}
+ {{if data.aircontents.other > 0}}
+
+ Unknown:
+
+
+ {{:data.aircontents.other}}%
+
+ {{/if}}
+ {{else}}
+
+ Unable to get air reading
+
+ {{/if}}
+
\ No newline at end of file
diff --git a/nano/templates/communicator.tmpl b/nano/templates/communicator.tmpl
index 6ef7de1607..716034a7f4 100644
--- a/nano/templates/communicator.tmpl
+++ b/nano/templates/communicator.tmpl
@@ -243,63 +243,7 @@ Used In File(s): code\game\objects\items\devices\communicator\communicator.dm
{{:helper.link('Home', 'home', {'switch_tab' : 1})}}
Current Conditions:
-
- {{if data.aircontents.reading == 1}}
-
- Pressure:
-
-
- {{:helper.string('{1} kPa', data.aircontents.pressure < 80 || data.aircontents.pressure > 120 ? 'bad' : data.aircontents.pressure < 95 || data.aircontents.pressure > 110 ? 'average' : 'good' , data.aircontents.pressure)}}
-
-
- Temperature:
-
-
- {{:helper.string('{1} °C', data.aircontents.temp < 5 || data.aircontents.temp > 35 ? 'bad' : data.aircontents.temp < 15 || data.aircontents.temp > 25 ? 'average' : 'good' , data.aircontents.temp)}}
-
-
-
- Oxygen:
-
-
- {{:helper.string('{1}%', data.aircontents.oxygen < 17 ? 'bad' : data.aircontents.oxygen < 19 ? 'average' : 'good' , data.aircontents.oxygen)}}
-
-
- Nitrogen:
-
-
- {{:helper.string('{1}%', data.aircontents.nitrogen > 82 ? 'bad' : data.aircontents.nitrogen > 80 ? 'average' : 'good' , data.aircontents.nitrogen)}}
-
- {{if data.aircontents.carbon_dioxide > 0}}
-
- Carbon Dioxide:
-
-
- {{:helper.string('{1}%', data.aircontents.carbon_dioxide > 5 ? 'bad' : 'good' , data.aircontents.carbon_dioxide)}}
-
- {{/if}}
- {{if data.aircontents.phoron > 0}}
-
- Phoron:
-
-
- {{:helper.string('{1}%', data.aircontents.phoron > 0 ? 'bad' : 'good' , data.aircontents.phoron)}}
-
- {{/if}}
- {{if data.aircontents.other > 0}}
-
- Unknown:
-
-
- {{:data.aircontents.other}}%
-
- {{/if}}
- {{else}}
-
- Unable to get air reading
-
- {{/if}}
-
+ {{#def.atmosphericScan}}
Weather Reports:
{{for data.weather}}
diff --git a/nano/templates/pda.tmpl b/nano/templates/pda.tmpl
index 1e6a5f2d82..04ee2abfd9 100644
--- a/nano/templates/pda.tmpl
+++ b/nano/templates/pda.tmpl
@@ -318,60 +318,7 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
{{else data.mode == 3}}
Atmospheric Scan
-
- {{if data.aircontents.reading == 1}}
-
- Pressure:
-
-
- {{:helper.string('{1} kPa', data.aircontents.pressure < 80 || data.aircontents.pressure > 120 ? 'bad' : data.aircontents.pressure < 95 || data.aircontents.pressure > 110 ? 'average' : 'good' , data.aircontents.pressure)}}
-
-
- Temperature:
-
-
- {{:helper.string('{1} °C', data.aircontents.temp < 5 || data.aircontents.temp > 35 ? 'bad' : data.aircontents.temp < 15 || data.aircontents.temp > 25 ? 'average' : 'good' , data.aircontents.temp)}}
-
-
-
- Oxygen:
-
-
- {{:helper.string('{1}%', data.aircontents.oxygen < 17 ? 'bad' : data.aircontents.oxygen < 19 ? 'average' : 'good' , data.aircontents.oxygen)}}
-
-
- Nitrogen:
-
-
- {{:helper.string('{1}%', data.aircontents.nitrogen > 82 ? 'bad' : data.aircontents.nitrogen > 80 ? 'average' : 'good' , data.aircontents.nitrogen)}}
-
-
- Carbon Dioxide:
-
-
- {{:helper.string('{1}%', data.aircontents.carbon_dioxide > 5 ? 'bad' : 'good' , data.aircontents.carbon_dioxide)}}
-
-
- Phoron:
-
-
- {{:helper.string('{1}%', data.aircontents.phoron > 0 ? 'bad' : 'good' , data.aircontents.phoron)}}
-
-
- {{if data.aircontents.other > 0}}
-
- Unknown:
-
-
- {{:data.aircontents.other}}%
-
- {{/if}}
- {{else}}
-
- Unable to get air reading
-
- {{/if}}
-
+ {{#def.atmosphericScan}}
diff --git a/nano/templates/supply_records.tmpl b/nano/templates/supply_records.tmpl
new file mode 100644
index 0000000000..23a3f3c5ee
--- /dev/null
+++ b/nano/templates/supply_records.tmpl
@@ -0,0 +1,226 @@
+Supply Records
+
+
+
+
+ Supply points: {{:data.supply_points}}
+
+
+
+ Supply Shuttle
+
+ Location:
+ Engines:
+
+
+ {{:data.shuttle.location}}
+ {{:data.shuttle.engine}}
+
+ {{if data.shuttle.mode == 4}}
+
+ ETA:
+
+
+ {{:data.shuttle.time}} minutes
+
+ {{/if}}
+ {{if data.shuttle_auth}}
+
+ {{if data.shuttle.launch == 1 && data.shuttle.mode == 0}}
+ {{:helper.link('Send away', 'suitcase', {'send_shuttle' : 'send_away'})}}
+ {{else data.shuttle.launch == 2 && (data.shuttle.mode == 3 || data.shuttle.mode == 1)}}
+ {{:helper.link('Cancel launch', 'stop', {'send_shuttle' : 'cancel_shuttle'})}}
+ {{else data.shuttle.launch == 1 && data.shuttle.mode == 5}}
+ {{:helper.link('Send shuttle', 'suitcase', {'send_shuttle' : 'send_to_station'})}}
+ {{/if}}
+ {{if data.shuttle.force}}
+ {{:helper.link('Force launch', 'alert', {'send_shuttle' : 'force_shuttle'})}}
+ {{/if}}
+ {{/if}}
+
+
+
+
+{{if data.currentTab == 0}}
+
+
+
+ {{:helper.link('Request items', 'note', {'switch_tab' : 1})}}
+
+
+
+
+ {{:helper.link('View accepted orders', 'cart', {'switch_tab' : "Approved"})}}
+
+
+
+
+ {{:helper.link('View pending requests', 'cart', {'switch_tab' : "Requested"})}}
+
+
+
+ {{:helper.link('View order history', 'document', {'switch_tab' : "All"})}}
+
+
+
+ {{:helper.link('View export history', 'document', {'switch_tab' : "Export"})}}
+
+
+
+{{else}}
+ {{:helper.link('Back to menu', 'arrowreturn-1-w', {'switch_tab' : 0})}}
+
+
+
+ {{if data.currentTab == 1}}
+ {{for data.supply_packs}}
+
+ {{:helper.link(value.name, 'bookmark', {'switch_tab' : value.name})}}
+
+ {{/for}}
+
+
+ {{else data.currentTab == "Export"}}
+ Exported Crates
+ {{for data.receipts}}
+
+
+ {{for value.title :titleVal:titleIndex}}
+
+ {{:titleVal.field}}
+
+
+ {{:titleVal.entry}}
+ {{if data.order_auth}}
+
+ {{:helper.link('Edit', 'wrench', {'order_ref' : value.ref, 'edit' : titleVal.field, 'default' : titleVal.entry, 'user' : data.user})}}
+
+ {{/if}}
+
+ {{/for}}
+
+ {{if value.error}}
+
+
+ Error
+
+
+
+ {{:value.error}}
+
+ {{else}}
+ {{for value.contents :contentVal:contentIndex}}
+
+ {{:contentVal.quantity}}x {{:contentVal.object}} - {{:contentVal.value}} points
+
+ {{if data.order_auth}}
+
+ {{:helper.link('Edit Quantity','wrench', {'export_ref' : value.ref, 'edit' : 1, 'default' : contentVal.quantity, 'index' : contentIndex, 'user' : data.user})}}
+ {{:helper.link('Delete Entry', 'trash', {'export_ref' : value.ref, 'delete' : 1, 'index' : contentIndex, 'user' : data.user})}}
+
+ {{/if}}
+ {{/for}}
+ {{/if}}
+
+ {{if data.order_auth}}
+ {{:helper.link('Add item to record', 'plus', {'export_ref' : value.ref, 'add_item' : 1, 'user' : data.user})}}
+ {{:helper.link('Delete record', 'trash', {'export_ref' : value.ref, 'delete' : 1, 'user' : data.user})}}
+ {{/if}}
+
+ {{empty}}
+ No receipts on record!
+ {{/for}}
+
+
+
+
+
+ {{else data.currentTab == "Approved" || data.currentTab == "Requested" || data.currentTab == "All"}}
+ {{:data.currentTab}} Orders
+ {{for data.orders}}
+ {{if (value.status == data.currentTab) || (data.currentTab == "All")}}
+
+
+ {{for value.entries :entryVal:entryIndex}}
+
+ {{if entryVal.entry}}
+
+ {{:entryVal.field}}
+
+
+ {{:entryVal.entry}}
+ {{if data.order_auth}}
+
+ {{:helper.link('Edit', 'wrench', {'order_ref' : value.ref, 'edit' : entryVal.field, 'default' : entryVal.entry, 'user' : data.user})}}
+
+ {{/if}}
+
+ {{/if}}
+ {{/for}}
+
+ {{if data.currentTab == "All"}}
+
+ Status
+
+
+ {{:value.status}}
+
+ {{if data.order_auth}}
+ {{:helper.link('Delete record', 'trash', {'order_ref' : value.ref, 'delete' : 1, 'user' : data.user})}}
+ {{/if}}
+ {{/if}}
+
+ {{if data.order_auth && data.currentTab == "Requested"}}
+ {{:helper.link('Approve', 'check', {'order_ref' : value.ref, 'approve' : 1, 'user' : data.user})}}
+ {{:helper.link('Deny', 'cancel', {'order_ref' : value.ref, 'deny' : 1, 'user' : data.user})}}
+ {{/if}}
+
+ {{/if}}
+ {{empty}}
+ No orders on record!
+ {{/for}}
+
+ {{if data.currentTab == "Requested" && data.order_auth}}
+ {{:helper.link('Clear all requests', 'trash', {'clear_all_requests' : 1, 'user' : data.user})}}
+ {{/if}}
+
+
+
+ {{else}}
+ {{for data.supply_packs}}
+ {{if data.currentTab == value.name}}
+
+ {{:helper.link('Back to categories', 'arrow-return-1-w', {'switch_tab' : 1})}}
+
+
+ {{for value.category_packs :packValue:packIndex}}
+ {{if !packValue.contraband || data.contraband}}
+
+
+ {{:helper.link(packValue.name + ' - ' + packValue.cost, packValue.expand ? 'folder-open' : 'folder-collapsed', {'cartridge_topic' : 1, 'pack_ref' : packValue.ref, 'expand' : 1})}}
+
+
+ {{if packValue.expand}}
+
+
+ {{if packValue.random}}
+ Contains any {{:packValue.random}} of:
+ {{/if}}
+
+ {{for packValue.manifest :manifestElem:manifestIndex}}
+ {{:manifestElem}}
+ {{/for}}
+
+
+
+ {{:helper.link('Request', 'cart', {'cartridge_topic' : 1, 'pack_ref' : packValue.ref, 'request' : 1, 'user' : data.user})}}
+
+
+
+ {{/if}}
+ {{/if}}
+ {{/for}}
+ {{/if}}
+ {{/for}}
+ {{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/polaris.dme b/polaris.dme
index 88ac2729d2..2b58a56879 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -30,6 +30,7 @@
#include "code\__defines\damage_organs.dm"
#include "code\__defines\dna.dm"
#include "code\__defines\gamemode.dm"
+#include "code\__defines\holomap.dm"
#include "code\__defines\inventory_sizes.dm"
#include "code\__defines\items_clothing.dm"
#include "code\__defines\lighting.dm"
@@ -48,6 +49,7 @@
#include "code\__defines\species_languages.dm"
#include "code\__defines\stat_tracking.dm"
#include "code\__defines\subsystems.dm"
+#include "code\__defines\supply.dm"
#include "code\__defines\targeting.dm"
#include "code\__defines\turfs.dm"
#include "code\__defines\unit_tests.dm"
@@ -171,7 +173,6 @@
#include "code\controllers\Processes\mob.dm"
#include "code\controllers\Processes\nanoui.dm"
#include "code\controllers\Processes\obj.dm"
-#include "code\controllers\Processes\planet.dm"
#include "code\controllers\Processes\radiation.dm"
#include "code\controllers\Processes\scheduler.dm"
#include "code\controllers\Processes\sun.dm"
@@ -185,10 +186,12 @@
#include "code\controllers\subsystems\airflow.dm"
#include "code\controllers\subsystems\atoms.dm"
#include "code\controllers\subsystems\garbage.dm"
+#include "code\controllers\subsystems\holomaps.dm"
#include "code\controllers\subsystems\lighting.dm"
#include "code\controllers\subsystems\machines.dm"
#include "code\controllers\subsystems\orbits.dm"
#include "code\controllers\subsystems\overlays.dm"
+#include "code\controllers\subsystems\planets.dm"
#include "code\controllers\subsystems\shuttles.dm"
#include "code\controllers\subsystems\xenoarch.dm"
#include "code\datums\ai_law_sets.dm"
@@ -329,6 +332,7 @@
#include "code\datums\wires\particle_accelerator.dm"
#include "code\datums\wires\radio.dm"
#include "code\datums\wires\robot.dm"
+#include "code\datums\wires\seedstorage.dm"
#include "code\datums\wires\smartfridge.dm"
#include "code\datums\wires\smes.dm"
#include "code\datums\wires\suit_storage_unit.dm"
@@ -352,7 +356,6 @@
#include "code\game\shuttle_engines.dm"
#include "code\game\skincmd.dm"
#include "code\game\sound.dm"
-#include "code\game\supplyshuttle.dm"
#include "code\game\trader_visit.dm"
#include "code\game\antagonist\_antagonist_setup.dm"
#include "code\game\antagonist\antagonist.dm"
@@ -802,6 +805,7 @@
#include "code\game\objects\effects\explosion_particles.dm"
#include "code\game\objects\effects\gibs.dm"
#include "code\game\objects\effects\glowshroom.dm"
+#include "code\game\objects\effects\item_pickup_ghost.dm"
#include "code\game\objects\effects\landmarks.dm"
#include "code\game\objects\effects\manifest.dm"
#include "code\game\objects\effects\mines.dm"
@@ -857,6 +861,7 @@
#include "code\game\objects\items\devices\geiger.dm"
#include "code\game\objects\items\devices\gps.dm"
#include "code\game\objects\items\devices\hacktool.dm"
+#include "code\game\objects\items\devices\laserpointer.dm"
#include "code\game\objects\items\devices\lightreplacer.dm"
#include "code\game\objects\items\devices\locker_painter.dm"
#include "code\game\objects\items\devices\megaphone.dm"
@@ -941,7 +946,6 @@
#include "code\game\objects\items\weapons\syndie.dm"
#include "code\game\objects\items\weapons\tape.dm"
#include "code\game\objects\items\weapons\teleportation.dm"
-#include "code\game\objects\items\weapons\tools.dm"
#include "code\game\objects\items\weapons\towels.dm"
#include "code\game\objects\items\weapons\traps.dm"
#include "code\game\objects\items\weapons\trays.dm"
@@ -1030,6 +1034,11 @@
#include "code\game\objects\items\weapons\tanks\jetpack.dm"
#include "code\game\objects\items\weapons\tanks\tank_types.dm"
#include "code\game\objects\items\weapons\tanks\tanks.dm"
+#include "code\game\objects\items\weapons\tools\crowbar.dm"
+#include "code\game\objects\items\weapons\tools\screwdriver.dm"
+#include "code\game\objects\items\weapons\tools\weldingtool.dm"
+#include "code\game\objects\items\weapons\tools\wirecutters.dm"
+#include "code\game\objects\items\weapons\tools\wrench.dm"
#include "code\game\objects\random\_random.dm"
#include "code\game\objects\random\guns_and_ammo.dm"
#include "code\game\objects\random\maintenance.dm"
@@ -1037,7 +1046,6 @@
#include "code\game\objects\random\misc.dm"
#include "code\game\objects\random\mob.dm"
#include "code\game\objects\random\spacesuits.dm"
-#include "code\game\objects\structures\alien_props.dm"
#include "code\game\objects\structures\barsign.dm"
#include "code\game\objects\structures\bedsheet_bin.dm"
#include "code\game\objects\structures\bonfire.dm"
@@ -1065,6 +1073,7 @@
#include "code\game\objects\structures\morgue.dm"
#include "code\game\objects\structures\musician.dm"
#include "code\game\objects\structures\noticeboard.dm"
+#include "code\game\objects\structures\plasticflaps.dm"
#include "code\game\objects\structures\railing.dm"
#include "code\game\objects\structures\safe.dm"
#include "code\game\objects\structures\signs.dm"
@@ -1108,7 +1117,13 @@
#include "code\game\objects\structures\flora\grass.dm"
#include "code\game\objects\structures\flora\trees.dm"
#include "code\game\objects\structures\ghost_pods\ghost_pods.dm"
+#include "code\game\objects\structures\ghost_pods\mysterious.dm"
#include "code\game\objects\structures\ghost_pods\silicon.dm"
+#include "code\game\objects\structures\props\alien_props.dm"
+#include "code\game\objects\structures\props\beam_prism.dm"
+#include "code\game\objects\structures\props\projectile_lock.dm"
+#include "code\game\objects\structures\props\prop.dm"
+#include "code\game\objects\structures\props\puzzledoor.dm"
#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm"
#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm"
#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm"
@@ -1236,6 +1251,7 @@
#include "code\modules\admin\verbs\dice.dm"
#include "code\modules\admin\verbs\getlogs.dm"
#include "code\modules\admin\verbs\grief_fixers.dm"
+#include "code\modules\admin\verbs\lightning_strike.dm"
#include "code\modules\admin\verbs\map_template_loadverb.dm"
#include "code\modules\admin\verbs\mapping.dm"
#include "code\modules\admin\verbs\massmodvar.dm"
@@ -1248,6 +1264,7 @@
#include "code\modules\admin\verbs\SDQL.dm"
#include "code\modules\admin\verbs\SDQL_2.dm"
#include "code\modules\admin\verbs\SDQL_2_parser.dm"
+#include "code\modules\admin\verbs\smite.dm"
#include "code\modules\admin\verbs\striketeam.dm"
#include "code\modules\admin\verbs\ticklag.dm"
#include "code\modules\admin\verbs\tripAI.dm"
@@ -1261,6 +1278,7 @@
#include "code\modules\alarm\fire_alarm.dm"
#include "code\modules\alarm\motion_alarm.dm"
#include "code\modules\alarm\power_alarm.dm"
+#include "code\modules\artifice\deadringer.dm"
#include "code\modules\assembly\assembly.dm"
#include "code\modules\assembly\helpers.dm"
#include "code\modules\assembly\holder.dm"
@@ -1320,7 +1338,6 @@
#include "code\modules\client\preference_setup\global\01_ui.dm"
#include "code\modules\client\preference_setup\global\02_settings.dm"
#include "code\modules\client\preference_setup\global\03_pai.dm"
-#include "code\modules\client\preference_setup\global\04_ooc.dm"
#include "code\modules\client\preference_setup\global\setting_datums.dm"
#include "code\modules\client\preference_setup\loadout\gear_tweaks.dm"
#include "code\modules\client\preference_setup\loadout\loadout.dm"
@@ -1555,6 +1572,10 @@
#include "code\modules\holodeck\HolodeckControl.dm"
#include "code\modules\holodeck\HolodeckObjects.dm"
#include "code\modules\holodeck\HolodeckPrograms.dm"
+#include "code\modules\holomap\generate_holomap.dm"
+#include "code\modules\holomap\holomap_area.dm"
+#include "code\modules\holomap\holomap_datum.dm"
+#include "code\modules\holomap\station_holomap.dm"
#include "code\modules\hydroponics\_hydro_setup.dm"
#include "code\modules\hydroponics\grown.dm"
#include "code\modules\hydroponics\grown_inedible.dm"
@@ -1651,6 +1672,7 @@
#include "code\modules\mining\abandonedcrates.dm"
#include "code\modules\mining\alloys.dm"
#include "code\modules\mining\coins.dm"
+#include "code\modules\mining\fulton.dm"
#include "code\modules\mining\machine_input_output_plates.dm"
#include "code\modules\mining\machine_processing.dm"
#include "code\modules\mining\machine_stacking.dm"
@@ -1686,6 +1708,7 @@
#include "code\modules\mob\transform_procs.dm"
#include "code\modules\mob\typing_indicator.dm"
#include "code\modules\mob\update_icons.dm"
+#include "code\modules\mob\_modifiers\aura.dm"
#include "code\modules\mob\_modifiers\cloning.dm"
#include "code\modules\mob\_modifiers\modifiers.dm"
#include "code\modules\mob\_modifiers\modifiers_misc.dm"
@@ -1804,6 +1827,7 @@
#include "code\modules\mob\living\carbon\human\species\species_helpers.dm"
#include "code\modules\mob\living\carbon\human\species\species_hud.dm"
#include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm"
+#include "code\modules\mob\living\carbon\human\species\outsider\event.dm"
#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm"
#include "code\modules\mob\living\carbon\human\species\outsider\skeleton.dm"
#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm"
@@ -1869,6 +1893,7 @@
#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm"
+#include "code\modules\mob\living\silicon\robot\drone\drone_remote_control.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules\event.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules\station.dm"
@@ -1886,6 +1911,7 @@
#include "code\modules\mob\living\simple_animal\aliens\hivebot.dm"
#include "code\modules\mob\living\simple_animal\aliens\mimic.dm"
#include "code\modules\mob\living\simple_animal\aliens\shade.dm"
+#include "code\modules\mob\living\simple_animal\aliens\statue.dm"
#include "code\modules\mob\living\simple_animal\animals\bat.dm"
#include "code\modules\mob\living\simple_animal\animals\bear.dm"
#include "code\modules\mob\living\simple_animal\animals\carp.dm"
@@ -1986,13 +2012,16 @@
#include "code\modules\organs\internal\liver.dm"
#include "code\modules\organs\internal\lungs.dm"
#include "code\modules\organs\internal\organ_internal.dm"
+#include "code\modules\organs\internal\voicebox.dm"
#include "code\modules\organs\subtypes\diona.dm"
+#include "code\modules\organs\subtypes\indestructible.dm"
#include "code\modules\organs\subtypes\machine.dm"
#include "code\modules\organs\subtypes\seromi.dm"
#include "code\modules\organs\subtypes\slime.dm"
#include "code\modules\organs\subtypes\standard.dm"
#include "code\modules\organs\subtypes\unathi.dm"
#include "code\modules\organs\subtypes\unbreakable.dm"
+#include "code\modules\organs\subtypes\unseverable.dm"
#include "code\modules\organs\subtypes\vox.dm"
#include "code\modules\organs\subtypes\xenos.dm"
#include "code\modules\overmap\_defines.dm"
@@ -2104,6 +2133,7 @@
#include "code\modules\projectiles\guns\vox.dm"
#include "code\modules\projectiles\guns\energy\laser.dm"
#include "code\modules\projectiles\guns\energy\nuclear.dm"
+#include "code\modules\projectiles\guns\energy\phase.dm"
#include "code\modules\projectiles\guns\energy\pulse.dm"
#include "code\modules\projectiles\guns\energy\special.dm"
#include "code\modules\projectiles\guns\energy\stun.dm"
@@ -2127,6 +2157,7 @@
#include "code\modules\projectiles\guns\projectile\sniper.dm"
#include "code\modules\projectiles\guns\projectile\sniper\collapsible_sniper.dm"
#include "code\modules\projectiles\projectile\animate.dm"
+#include "code\modules\projectiles\projectile\arc.dm"
#include "code\modules\projectiles\projectile\beams.dm"
#include "code\modules\projectiles\projectile\bullets.dm"
#include "code\modules\projectiles\projectile\change.dm"
@@ -2224,6 +2255,17 @@
#include "code\modules\research\rdmachines.dm"
#include "code\modules\research\research.dm"
#include "code\modules\research\server.dm"
+#include "code\modules\research\designs\ai_modules.dm"
+#include "code\modules\research\designs\circuit_assembly.dm"
+#include "code\modules\research\designs\circuits.dm"
+#include "code\modules\research\designs\illegal.dm"
+#include "code\modules\research\designs\medical.dm"
+#include "code\modules\research\designs\mining_toys.dm"
+#include "code\modules\research\designs\misc.dm"
+#include "code\modules\research\designs\pdas.dm"
+#include "code\modules\research\designs\powercells.dm"
+#include "code\modules\research\designs\stock_parts.dm"
+#include "code\modules\research\designs\weapons.dm"
#include "code\modules\scripting\Errors.dm"
#include "code\modules\scripting\IDE.dm"
#include "code\modules\scripting\Options.dm"
@@ -2300,6 +2342,7 @@
#include "code\modules\surgery\_defines.dm"
#include "code\modules\surgery\bones.dm"
#include "code\modules\surgery\encased.dm"
+#include "code\modules\surgery\external_repair.dm"
#include "code\modules\surgery\face.dm"
#include "code\modules\surgery\generic.dm"
#include "code\modules\surgery\implant.dm"
@@ -2435,7 +2478,6 @@
#include "interface\interface.dm"
#include "interface\skin.dmf"
#include "maps\southern_cross\southern_cross.dm"
-#include "maps\submaps\_readme.dm"
#include "maps\submaps\space_submaps\space.dm"
#include "maps\submaps\surface_submaps\mountains\mountains.dm"
#include "maps\submaps\surface_submaps\mountains\mountains_areas.dm"
diff --git a/sound/ambience/ambimalf.ogg b/sound/ambience/ai/ai1.ogg
similarity index 100%
rename from sound/ambience/ambimalf.ogg
rename to sound/ambience/ai/ai1.ogg
diff --git a/sound/ambience/ambigen2.ogg b/sound/ambience/ambigen2.ogg
deleted file mode 100644
index 6a5a2d27c9..0000000000
Binary files a/sound/ambience/ambigen2.ogg and /dev/null differ
diff --git a/sound/ambience/ambigen1.ogg b/sound/ambience/arrivals/arrivals1.ogg
similarity index 100%
rename from sound/ambience/ambigen1.ogg
rename to sound/ambience/arrivals/arrivals1.ogg
diff --git a/sound/ambience/ambigen14.ogg b/sound/ambience/arrivals/arrivals2.ogg
similarity index 100%
rename from sound/ambience/ambigen14.ogg
rename to sound/ambience/arrivals/arrivals2.ogg
diff --git a/sound/ambience/ambicha1.ogg b/sound/ambience/chapel/chapel1.ogg
similarity index 100%
rename from sound/ambience/ambicha1.ogg
rename to sound/ambience/chapel/chapel1.ogg
diff --git a/sound/ambience/ambicha2.ogg b/sound/ambience/chapel/chapel2.ogg
similarity index 100%
rename from sound/ambience/ambicha2.ogg
rename to sound/ambience/chapel/chapel2.ogg
diff --git a/sound/ambience/ambicha3.ogg b/sound/ambience/chapel/chapel3.ogg
similarity index 100%
rename from sound/ambience/ambicha3.ogg
rename to sound/ambience/chapel/chapel3.ogg
diff --git a/sound/ambience/ambicha4.ogg b/sound/ambience/chapel/chapel4.ogg
similarity index 100%
rename from sound/ambience/ambicha4.ogg
rename to sound/ambience/chapel/chapel4.ogg
diff --git a/sound/ambience/engineering/engineering1.ogg b/sound/ambience/engineering/engineering1.ogg
new file mode 100644
index 0000000000..c832c677d5
Binary files /dev/null and b/sound/ambience/engineering/engineering1.ogg differ
diff --git a/sound/ambience/engineering/engineering2.ogg b/sound/ambience/engineering/engineering2.ogg
new file mode 100644
index 0000000000..9651049c25
Binary files /dev/null and b/sound/ambience/engineering/engineering2.ogg differ
diff --git a/sound/ambience/engineering/engineering3.ogg b/sound/ambience/engineering/engineering3.ogg
new file mode 100644
index 0000000000..63afd437a6
Binary files /dev/null and b/sound/ambience/engineering/engineering3.ogg differ
diff --git a/sound/ambience/foreboding/foreboding1.ogg b/sound/ambience/foreboding/foreboding1.ogg
new file mode 100644
index 0000000000..b6e65c0bf6
Binary files /dev/null and b/sound/ambience/foreboding/foreboding1.ogg differ
diff --git a/sound/ambience/foreboding/foreboding2.ogg b/sound/ambience/foreboding/foreboding2.ogg
new file mode 100644
index 0000000000..dde64a9858
Binary files /dev/null and b/sound/ambience/foreboding/foreboding2.ogg differ
diff --git a/sound/ambience/ambigen3.ogg b/sound/ambience/generic/generic1.ogg
similarity index 100%
rename from sound/ambience/ambigen3.ogg
rename to sound/ambience/generic/generic1.ogg
diff --git a/sound/ambience/ambigen4.ogg b/sound/ambience/generic/generic2.ogg
similarity index 100%
rename from sound/ambience/ambigen4.ogg
rename to sound/ambience/generic/generic2.ogg
diff --git a/sound/ambience/ambigen5.ogg b/sound/ambience/generic/generic3.ogg
similarity index 100%
rename from sound/ambience/ambigen5.ogg
rename to sound/ambience/generic/generic3.ogg
diff --git a/sound/ambience/ambigen6.ogg b/sound/ambience/generic/generic4.ogg
similarity index 100%
rename from sound/ambience/ambigen6.ogg
rename to sound/ambience/generic/generic4.ogg
diff --git a/sound/ambience/ambimo1.ogg b/sound/ambience/ghostly/ghostly1.ogg
similarity index 100%
rename from sound/ambience/ambimo1.ogg
rename to sound/ambience/ghostly/ghostly1.ogg
diff --git a/sound/ambience/ambimo2.ogg b/sound/ambience/ghostly/ghostly2.ogg
similarity index 100%
rename from sound/ambience/ambimo2.ogg
rename to sound/ambience/ghostly/ghostly2.ogg
diff --git a/sound/ambience/highsec/highsec1.ogg b/sound/ambience/highsec/highsec1.ogg
new file mode 100644
index 0000000000..265b51f2c9
Binary files /dev/null and b/sound/ambience/highsec/highsec1.ogg differ
diff --git a/sound/ambience/highsec/highsec2.ogg b/sound/ambience/highsec/highsec2.ogg
new file mode 100644
index 0000000000..761c63a480
Binary files /dev/null and b/sound/ambience/highsec/highsec2.ogg differ
diff --git a/sound/ambience/holy/holy1.ogg b/sound/ambience/holy/holy1.ogg
new file mode 100644
index 0000000000..cd53dc2789
Binary files /dev/null and b/sound/ambience/holy/holy1.ogg differ
diff --git a/sound/ambience/holy/holy2.ogg b/sound/ambience/holy/holy2.ogg
new file mode 100644
index 0000000000..4532dd0a81
Binary files /dev/null and b/sound/ambience/holy/holy2.ogg differ
diff --git a/sound/ambience/lava/lava1.ogg b/sound/ambience/lava/lava1.ogg
new file mode 100644
index 0000000000..b552965faa
Binary files /dev/null and b/sound/ambience/lava/lava1.ogg differ
diff --git a/sound/ambience/ambigen7.ogg b/sound/ambience/maintenance/maintenance1.ogg
similarity index 100%
rename from sound/ambience/ambigen7.ogg
rename to sound/ambience/maintenance/maintenance1.ogg
diff --git a/sound/ambience/ambigen8.ogg b/sound/ambience/maintenance/maintenance2.ogg
similarity index 100%
rename from sound/ambience/ambigen8.ogg
rename to sound/ambience/maintenance/maintenance2.ogg
diff --git a/sound/ambience/ambigen9.ogg b/sound/ambience/maintenance/maintenance3.ogg
similarity index 100%
rename from sound/ambience/ambigen9.ogg
rename to sound/ambience/maintenance/maintenance3.ogg
diff --git a/sound/ambience/ambigen10.ogg b/sound/ambience/maintenance/maintenance4.ogg
similarity index 100%
rename from sound/ambience/ambigen10.ogg
rename to sound/ambience/maintenance/maintenance4.ogg
diff --git a/sound/ambience/ambigen11.ogg b/sound/ambience/maintenance/maintenance5.ogg
similarity index 100%
rename from sound/ambience/ambigen11.ogg
rename to sound/ambience/maintenance/maintenance5.ogg
diff --git a/sound/ambience/ambigen12.ogg b/sound/ambience/maintenance/maintenance6.ogg
similarity index 100%
rename from sound/ambience/ambigen12.ogg
rename to sound/ambience/maintenance/maintenance6.ogg
diff --git a/sound/ambience/otherworldly/otherworldly1.ogg b/sound/ambience/otherworldly/otherworldly1.ogg
new file mode 100644
index 0000000000..77599fac5b
Binary files /dev/null and b/sound/ambience/otherworldly/otherworldly1.ogg differ
diff --git a/sound/ambience/otherworldly/otherworldly2.ogg b/sound/ambience/otherworldly/otherworldly2.ogg
new file mode 100644
index 0000000000..3bc051cf5a
Binary files /dev/null and b/sound/ambience/otherworldly/otherworldly2.ogg differ
diff --git a/sound/ambience/otherworldly/otherworldly3.ogg b/sound/ambience/otherworldly/otherworldly3.ogg
new file mode 100644
index 0000000000..3ef1211897
Binary files /dev/null and b/sound/ambience/otherworldly/otherworldly3.ogg differ
diff --git a/sound/ambience/ruins/ruins1.ogg b/sound/ambience/ruins/ruins1.ogg
new file mode 100644
index 0000000000..ff4cef4a41
Binary files /dev/null and b/sound/ambience/ruins/ruins1.ogg differ
diff --git a/sound/ambience/ruins/ruins2.ogg b/sound/ambience/ruins/ruins2.ogg
new file mode 100644
index 0000000000..2dc408e2b6
Binary files /dev/null and b/sound/ambience/ruins/ruins2.ogg differ
diff --git a/sound/ambience/ruins/ruins3.ogg b/sound/ambience/ruins/ruins3.ogg
new file mode 100644
index 0000000000..ad56a915f9
Binary files /dev/null and b/sound/ambience/ruins/ruins3.ogg differ
diff --git a/sound/ambience/ruins/ruins4.ogg b/sound/ambience/ruins/ruins4.ogg
new file mode 100644
index 0000000000..2073b5a277
Binary files /dev/null and b/sound/ambience/ruins/ruins4.ogg differ
diff --git a/sound/ambience/ruins/ruins5.ogg b/sound/ambience/ruins/ruins5.ogg
new file mode 100644
index 0000000000..4b6c79a72d
Binary files /dev/null and b/sound/ambience/ruins/ruins5.ogg differ
diff --git a/sound/ambience/ruins/ruins6.ogg b/sound/ambience/ruins/ruins6.ogg
new file mode 100644
index 0000000000..ed88fcd52d
Binary files /dev/null and b/sound/ambience/ruins/ruins6.ogg differ
diff --git a/sound/ambience/seag1.ogg b/sound/ambience/seag1.ogg
deleted file mode 100644
index 8b26eeefc4..0000000000
Binary files a/sound/ambience/seag1.ogg and /dev/null differ
diff --git a/sound/ambience/seag2.ogg b/sound/ambience/seag2.ogg
deleted file mode 100644
index b0c714b77b..0000000000
Binary files a/sound/ambience/seag2.ogg and /dev/null differ
diff --git a/sound/ambience/seag3.ogg b/sound/ambience/seag3.ogg
deleted file mode 100644
index 6385e87e1d..0000000000
Binary files a/sound/ambience/seag3.ogg and /dev/null differ
diff --git a/sound/ambience/shore.ogg b/sound/ambience/shore.ogg
deleted file mode 100644
index d3edf17961..0000000000
Binary files a/sound/ambience/shore.ogg and /dev/null differ
diff --git a/sound/ambience/sif/sif1.ogg b/sound/ambience/sif/sif1.ogg
new file mode 100644
index 0000000000..6ce351521b
Binary files /dev/null and b/sound/ambience/sif/sif1.ogg differ
diff --git a/sound/ambience/space/space1.ogg b/sound/ambience/space/space1.ogg
new file mode 100644
index 0000000000..44b4c62c36
Binary files /dev/null and b/sound/ambience/space/space1.ogg differ
diff --git a/sound/ambience/serspaceamb1.ogg b/sound/ambience/space/space_serithi.ogg
similarity index 100%
rename from sound/ambience/serspaceamb1.ogg
rename to sound/ambience/space/space_serithi.ogg
diff --git a/sound/ambience/tech_ruins/tech_ruins1.ogg b/sound/ambience/tech_ruins/tech_ruins1.ogg
new file mode 100644
index 0000000000..5f21514e5c
Binary files /dev/null and b/sound/ambience/tech_ruins/tech_ruins1.ogg differ
diff --git a/sound/ambience/tech_ruins/tech_ruins2.ogg b/sound/ambience/tech_ruins/tech_ruins2.ogg
new file mode 100644
index 0000000000..bd6428bff3
Binary files /dev/null and b/sound/ambience/tech_ruins/tech_ruins2.ogg differ
diff --git a/sound/ambience/tech_ruins/tech_ruins3.ogg b/sound/ambience/tech_ruins/tech_ruins3.ogg
new file mode 100644
index 0000000000..effd23b132
Binary files /dev/null and b/sound/ambience/tech_ruins/tech_ruins3.ogg differ
diff --git a/sound/ambience/unholy/unholy1.ogg b/sound/ambience/unholy/unholy1.ogg
new file mode 100644
index 0000000000..d78dc46a4c
Binary files /dev/null and b/sound/ambience/unholy/unholy1.ogg differ
diff --git a/sound/ambience/vaporwave.ogg b/sound/ambience/vaporwave.ogg
new file mode 100644
index 0000000000..4374f46710
Binary files /dev/null and b/sound/ambience/vaporwave.ogg differ
diff --git a/sound/effects/hypospray.ogg b/sound/effects/hypospray.ogg
new file mode 100644
index 0000000000..e4dd0331d0
Binary files /dev/null and b/sound/effects/hypospray.ogg differ
diff --git a/sound/effects/ointment.ogg b/sound/effects/ointment.ogg
new file mode 100644
index 0000000000..efafb431a4
Binary files /dev/null and b/sound/effects/ointment.ogg differ
diff --git a/sound/effects/rip1.ogg b/sound/effects/rip1.ogg
new file mode 100644
index 0000000000..ab0fabbb3d
Binary files /dev/null and b/sound/effects/rip1.ogg differ
diff --git a/sound/effects/rip2.ogg b/sound/effects/rip2.ogg
new file mode 100644
index 0000000000..93a5cec50f
Binary files /dev/null and b/sound/effects/rip2.ogg differ
diff --git a/sound/effects/tape.ogg b/sound/effects/tape.ogg
new file mode 100644
index 0000000000..7a7047e324
Binary files /dev/null and b/sound/effects/tape.ogg differ
diff --git a/sound/effects/thunder/thunder1.ogg b/sound/effects/thunder/thunder1.ogg
new file mode 100644
index 0000000000..7ec34e88e8
Binary files /dev/null and b/sound/effects/thunder/thunder1.ogg differ
diff --git a/sound/effects/thunder/thunder10.ogg b/sound/effects/thunder/thunder10.ogg
new file mode 100644
index 0000000000..43aefb098f
Binary files /dev/null and b/sound/effects/thunder/thunder10.ogg differ
diff --git a/sound/effects/thunder/thunder2.ogg b/sound/effects/thunder/thunder2.ogg
new file mode 100644
index 0000000000..bc2f581dda
Binary files /dev/null and b/sound/effects/thunder/thunder2.ogg differ
diff --git a/sound/effects/thunder/thunder3.ogg b/sound/effects/thunder/thunder3.ogg
new file mode 100644
index 0000000000..0df287aa78
Binary files /dev/null and b/sound/effects/thunder/thunder3.ogg differ
diff --git a/sound/effects/thunder/thunder4.ogg b/sound/effects/thunder/thunder4.ogg
new file mode 100644
index 0000000000..6c671b8010
Binary files /dev/null and b/sound/effects/thunder/thunder4.ogg differ
diff --git a/sound/effects/thunder/thunder5.ogg b/sound/effects/thunder/thunder5.ogg
new file mode 100644
index 0000000000..3d5187a716
Binary files /dev/null and b/sound/effects/thunder/thunder5.ogg differ
diff --git a/sound/effects/thunder/thunder6.ogg b/sound/effects/thunder/thunder6.ogg
new file mode 100644
index 0000000000..65aef886ff
Binary files /dev/null and b/sound/effects/thunder/thunder6.ogg differ
diff --git a/sound/effects/thunder/thunder7.ogg b/sound/effects/thunder/thunder7.ogg
new file mode 100644
index 0000000000..b72848a2b6
Binary files /dev/null and b/sound/effects/thunder/thunder7.ogg differ
diff --git a/sound/effects/thunder/thunder8.ogg b/sound/effects/thunder/thunder8.ogg
new file mode 100644
index 0000000000..a25fe21e32
Binary files /dev/null and b/sound/effects/thunder/thunder8.ogg differ
diff --git a/sound/effects/thunder/thunder9.ogg b/sound/effects/thunder/thunder9.ogg
new file mode 100644
index 0000000000..9ebc1045bf
Binary files /dev/null and b/sound/effects/thunder/thunder9.ogg differ
diff --git a/sound/effects/uncloak.ogg b/sound/effects/uncloak.ogg
new file mode 100644
index 0000000000..a2cedc8c73
Binary files /dev/null and b/sound/effects/uncloak.ogg differ
diff --git a/sound/items/fulext_deploy.wav b/sound/items/fulext_deploy.wav
new file mode 100644
index 0000000000..9fbcb7e3f8
Binary files /dev/null and b/sound/items/fulext_deploy.wav differ
diff --git a/sound/items/fultext_launch.wav b/sound/items/fultext_launch.wav
new file mode 100644
index 0000000000..a623a89ada
Binary files /dev/null and b/sound/items/fultext_launch.wav differ
diff --git a/sound/items/vending.ogg b/sound/items/vending.ogg
new file mode 100644
index 0000000000..477c3c295f
Binary files /dev/null and b/sound/items/vending.ogg differ
|
|