diff --git a/baystation12.dme b/baystation12.dme
index 425d46bf57..0252a3c181 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -54,6 +54,9 @@
#define FILE_DIR "sound/voice/Serithi"
#define FILE_DIR "sound/vox"
#define FILE_DIR "sound/weapons"
+#define FILE_DIR "tools"
+#define FILE_DIR "tools/AddToChangelog"
+#define FILE_DIR "tools/AddToChangelog/AddToChangelog"
// END_FILE_DIR
// BEGIN_PREFERENCES
#define DEBUG
@@ -730,10 +733,6 @@
#include "code\modules\awaymissions\pamphlet.dm"
#include "code\modules\awaymissions\trigger.dm"
#include "code\modules\awaymissions\zlevel.dm"
-#include "code\modules\awaymissions\maploader\dmm_suite.dm"
-#include "code\modules\awaymissions\maploader\reader.dm"
-#include "code\modules\awaymissions\maploader\swapmaps.dm"
-#include "code\modules\awaymissions\maploader\writer.dm"
#include "code\modules\client\client defines.dm"
#include "code\modules\client\client procs.dm"
#include "code\modules\client\preferences.dm"
@@ -831,6 +830,10 @@
#include "code\modules\library\lib_machines.dm"
#include "code\modules\library\lib_readme.dm"
#include "code\modules\liquid\splash_simulation.dm"
+#include "code\modules\maps\dmm_suite.dm"
+#include "code\modules\maps\reader.dm"
+#include "code\modules\maps\swapmaps.dm"
+#include "code\modules\maps\writer.dm"
#include "code\modules\mining\machine_input_output_plates.dm"
#include "code\modules\mining\machine_processing.dm"
#include "code\modules\mining\machine_stacking.dm"
@@ -983,6 +986,7 @@
#include "code\modules\mob\living\silicon\pai\recruit.dm"
#include "code\modules\mob\living\silicon\pai\say.dm"
#include "code\modules\mob\living\silicon\pai\software.dm"
+#include "code\modules\mob\living\silicon\robot\component.dm"
#include "code\modules\mob\living\silicon\robot\death.dm"
#include "code\modules\mob\living\silicon\robot\emote.dm"
#include "code\modules\mob\living\silicon\robot\examine.dm"
@@ -992,6 +996,7 @@
#include "code\modules\mob\living\silicon\robot\life.dm"
#include "code\modules\mob\living\silicon\robot\login.dm"
#include "code\modules\mob\living\silicon\robot\robot.dm"
+#include "code\modules\mob\living\silicon\robot\robot_damage.dm"
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
@@ -1271,6 +1276,7 @@
#include "code\WorkInProgress\buildmode.dm"
#include "code\WorkInProgress\explosion_particles.dm"
#include "code\WorkInProgress\periodic_news.dm"
+#include "code\WorkInProgress\Apples\artifacts.dm"
#include "code\WorkInProgress\Cael_Aislinn\meteor_battery.dm"
#include "code\WorkInProgress\Cael_Aislinn\sculpture.dm"
#include "code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm"
diff --git a/code/WorkInProgress/Apples/artifacts.dm b/code/WorkInProgress/Apples/artifacts.dm
index 48129921ff..bcb07582c1 100644
--- a/code/WorkInProgress/Apples/artifacts.dm
+++ b/code/WorkInProgress/Apples/artifacts.dm
@@ -14,7 +14,6 @@ obj/item/changestone/attack_hand(var/mob/user as mob)
H.gender = FEMALE
H.dna.ready_dna(H)
H.update_body()
- H.update_face()
..()
diff --git a/code/WorkInProgress/Mini/atmos_control.dm b/code/WorkInProgress/Mini/atmos_control.dm
index 37282a90ec..f9986d50e7 100644
--- a/code/WorkInProgress/Mini/atmos_control.dm
+++ b/code/WorkInProgress/Mini/atmos_control.dm
@@ -1,6 +1,6 @@
/obj/item/weapon/circuitboard/atmoscontrol
name = "\improper Central Atmospherics Computer Circuitboard"
- build_path = "/obj/machinery/computer/security/atmoscontrol"
+ build_path = /obj/machinery/computer/atmoscontrol
/obj/machinery/computer/atmoscontrol
name = "\improper Central Atmospherics Computer"
@@ -297,13 +297,12 @@ Nitrous Oxide
output += {"
Main menu
Air machinery mode for the area:
"}
- var/list/modes = list(
- AALARM_MODE_SCRUBBING = "Filtering",
- AALARM_MODE_REPLACEMENT = "REPLACE AIR",
- AALARM_MODE_PANIC = "PANIC",
- AALARM_MODE_CYCLE = "CYCLE",
- AALARM_MODE_FILL = "FILL",\
- AALARM_MODE_OFF = "OFFF",)
+ var/list/modes = list(AALARM_MODE_SCRUBBING = "Filtering - Scrubs out contaminants",\
+ AALARM_MODE_REPLACEMENT = "Replace Air - Siphons out air while replacing",\
+ AALARM_MODE_PANIC = "Panic - Siphons air out of the room",\
+ AALARM_MODE_CYCLE = "Cycle - Siphons air before replacing",\
+ AALARM_MODE_FILL = "Fill - Shuts off scrubbers and opens vents",\
+ AALARM_MODE_OFF = "Off - Shuts off vents and scrubbers",)
for (var/m=1,m<=modes.len,m++)
if (current.mode==m)
output += {"- [modes[m]] (selected)
"}
diff --git a/code/ZAS/Connection.dm b/code/ZAS/Connection.dm
index f63837a5ff..ab479450cf 100644
--- a/code/ZAS/Connection.dm
+++ b/code/ZAS/Connection.dm
@@ -158,51 +158,53 @@ connection
if(!istype(zone_1) || !istype(zone_2))
return
- //Handle disconnection of indirectly or directly connected zones.
- if( (zone_1 in zone_2.connected_zones) || (zone_2 in zone_1.connected_zones) )
+ if(indirect != CONNECTION_CLOSED)
+ //Handle disconnection of indirectly or directly connected zones.
+ if( (zone_1 in zone_2.connected_zones) || (zone_2 in zone_1.connected_zones) )
- //If there are more than one connection, decrement the number of connections
- //Otherwise, remove all connections between the zones.
- if(zone_2 in zone_1.connected_zones)
- if(zone_1.connected_zones[zone_2] > 1)
- zone_1.connected_zones[zone_2]--
- else
- zone_1.connected_zones -= zone_2
- //remove the list if it is empty
- if(!zone_1.connected_zones.len)
- zone_1.connected_zones = null
+ //If there are more than one connection, decrement the number of connections
+ //Otherwise, remove all connections between the zones.
+ if(zone_2 in zone_1.connected_zones)
+ if(zone_1.connected_zones[zone_2] > 1)
+ zone_1.connected_zones[zone_2]--
+ else
+ zone_1.connected_zones -= zone_2
+ //remove the list if it is empty
+ if(!zone_1.connected_zones.len)
+ zone_1.connected_zones = null
- //Then do the same for the other zone.
- if(zone_1 in zone_2.connected_zones)
- if(zone_2.connected_zones[zone_1] > 1)
- zone_2.connected_zones[zone_1]--
- else
- zone_2.connected_zones -= zone_1
- if(!zone_2.connected_zones.len)
- zone_2.connected_zones = null
+ //Then do the same for the other zone.
+ if(zone_1 in zone_2.connected_zones)
+ if(zone_2.connected_zones[zone_1] > 1)
+ zone_2.connected_zones[zone_1]--
+ else
+ zone_2.connected_zones -= zone_1
+ if(!zone_2.connected_zones.len)
+ zone_2.connected_zones = null
- //Handle disconnection of closed zones.
- if( (zone_1 in zone_2.closed_connection_zones) || (zone_2 in zone_1.closed_connection_zones) )
+ else
+ //Handle disconnection of closed zones.
+ if( (zone_1 in zone_2.closed_connection_zones) || (zone_2 in zone_1.closed_connection_zones) )
- //If there are more than one connection, decrement the number of connections
- //Otherwise, remove all connections between the zones.
- if(zone_2 in zone_1.connected_zones)
- if(zone_1.closed_connection_zones[zone_2] > 1)
- zone_1.closed_connection_zones[zone_2]--
- else
- zone_1.closed_connection_zones -= zone_2
- //remove the list if it is empty
- if(!zone_1.closed_connection_zones.len)
- zone_1.closed_connection_zones = null
+ //If there are more than one connection, decrement the number of connections
+ //Otherwise, remove all connections between the zones.
+ if(zone_2 in zone_1.connected_zones)
+ if(zone_1.closed_connection_zones[zone_2] > 1)
+ zone_1.closed_connection_zones[zone_2]--
+ else
+ zone_1.closed_connection_zones -= zone_2
+ //remove the list if it is empty
+ if(!zone_1.closed_connection_zones.len)
+ zone_1.closed_connection_zones = null
- //Then do the same for the other zone.
- if(zone_1 in zone_2.connected_zones)
- if(zone_2.closed_connection_zones[zone_1] > 1)
- zone_2.closed_connection_zones[zone_1]--
- else
- zone_2.closed_connection_zones -= zone_1
- if(!zone_2.closed_connection_zones.len)
- zone_2.closed_connection_zones = null
+ //Then do the same for the other zone.
+ if(zone_1 in zone_2.connected_zones)
+ if(zone_2.closed_connection_zones[zone_1] > 1)
+ zone_2.closed_connection_zones[zone_1]--
+ else
+ zone_2.closed_connection_zones -= zone_1
+ if(!zone_2.closed_connection_zones.len)
+ zone_2.closed_connection_zones = null
proc/Cleanup()
@@ -259,9 +261,8 @@ connection
//The door is instead closed.
else if(indirect > CONNECTION_CLOSED)
- indirect = CONNECTION_CLOSED
-
DisconnectZones(A.zone, B.zone)
+ indirect = CONNECTION_CLOSED
ConnectZones(A.zone, B.zone)
//If I can no longer pass air, better delete
@@ -381,7 +382,7 @@ connection
//Handle diconnection and reconnection of zones.
if(zone_A && zone_B)
DisconnectZones(zone_A, zone_B)
- ConnectZones(A.zone, B.zone, indirect)
+ ConnectZones(A.zone, B.zone, indirect)
#undef CONNECTION_DIRECT
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index 3633cda374..b252163b03 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -51,7 +51,8 @@ datum/controller/game_controller/New()
datum/controller/game_controller/proc/setup()
world.tick_lag = config.Ticklag
- createRandomZlevel()
+ spawn(20)
+ createRandomZlevel()
if(!air_master)
air_master = new /datum/controller/air_system()
diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm
index c8336d85f2..db705ac53a 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -10,6 +10,7 @@ datum/controller/vote
var/list/voted = list()
var/list/voting = list()
var/list/current_votes = list()
+ var/auto_muted = 0
New()
if(vote != src)
@@ -53,6 +54,14 @@ datum/controller/vote
voting.Cut()
current_votes.Cut()
+ if(auto_muted && !ooc_allowed)
+ auto_muted = 0
+ ooc_allowed = !( ooc_allowed )
+ world << "The OOC channel has been automatically enabled due to vote cancellation."
+ log_admin("OOC was toggled automatically due to vote cancellation.")
+ message_admins("OOC has been toggled on automatically.")
+
+
proc/get_result()
//get the highest number of votes
var/greatest_votes = 0
@@ -138,6 +147,12 @@ datum/controller/vote
if("crew_transfer")
if(. == "Initiate Crew Transfer")
init_shift_change(null, 1)
+ if(auto_muted && !ooc_allowed)
+ auto_muted = 0
+ ooc_allowed = !( ooc_allowed )
+ world << "The OOC channel has been automatically enabled due to vote end."
+ log_admin("OOC was toggled automatically due to vote end.")
+ message_admins("OOC has been toggled on automatically.")
if(restart)
@@ -202,14 +217,35 @@ datum/controller/vote
world << "[text]\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote."
switch(vote_type)
if("crew_transfer")
- world << sound('sound/voice/Serithi/Shuttlehere.ogg')
+ world << sound('sound/ambience/alarm4.ogg')
if("gamemode")
- world << sound('sound/voice/Serithi/pretenddemoc.ogg')
+ world << sound('sound/ambience/alarm4.ogg')
if("custom")
- world << sound('sound/voice/Serithi/weneedvote.ogg')
+ world << sound('sound/ambience/alarm4.ogg')
if(mode == "gamemode" && going)
going = 0
world << "Round start has been delayed."
+ if(mode == "crew_transfer" && ooc_allowed)
+ auto_muted = 1
+ ooc_allowed = !( ooc_allowed )
+ world << "The OOC channel has been automatically disabled due to the crew transfer vote."
+ log_admin("OOC was toggled automatically due to crew_transfer vote.")
+ message_admins("OOC has been toggled off automatically.")
+ if(mode == "gamemode" && ooc_allowed)
+ auto_muted = 1
+ ooc_allowed = !( ooc_allowed )
+ world << "The OOC channel has been automatically disabled due to the gamemode vote."
+ log_admin("OOC was toggled automatically due to gamemode vote.")
+ message_admins("OOC has been toggled off automatically.")
+ if(mode == "custom" && ooc_allowed)
+ auto_muted = 1
+ ooc_allowed = !( ooc_allowed )
+ world << "The OOC channel has been automatically disabled due to the custom vote."
+ log_admin("OOC was toggled automatically due to custom vote.")
+ message_admins("OOC has been toggled off automatically.")
+
+
+
time_remaining = round(config.vote_period/10)
return 1
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index d52f18fdd7..0329bbe8ba 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -135,9 +135,9 @@
if(!istype(location)) return//returns if loc is not simulated
var/datum/gas_mixture/environment = location.return_air()
- var/temperature_dangerlevel = get_danger_level(environment.temperature, TLV["temperature"])
+
//Handle temperature adjustment here.
- if(temperature_dangerlevel || regulating_temperature)
+ if(environment.temperature < target_temperature - 10 || environment.temperature > target_temperature + 10 || regulating_temperature)
//If it goes too far, we should adjust ourselves back before stopping.
if(!regulating_temperature)
regulating_temperature = 1
@@ -368,7 +368,8 @@
send_signal(device_id, list("power"= 0) )
proc/apply_danger_level(var/new_danger_level)
- alarm_area.atmosalm = new_danger_level
+ if (alarm_area.atmosalert(new_danger_level))
+ post_alert(new_danger_level)
for (var/area/A in alarm_area.related)
for (var/obj/machinery/alarm/AA in A)
@@ -382,6 +383,26 @@
update_icon()
+ proc/post_alert(alert_level)
+ var/datum/radio_frequency/frequency = radio_controller.return_frequency(alarm_frequency)
+ if(!frequency)
+ return
+
+ var/datum/signal/alert_signal = new
+ alert_signal.source = src
+ alert_signal.transmission_method = 1
+ alert_signal.data["zone"] = alarm_area.name
+ alert_signal.data["type"] = "Atmospheric"
+
+ if(alert_level==2)
+ alert_signal.data["alert"] = "severe"
+ else if (alert_level==1)
+ alert_signal.data["alert"] = "minor"
+ else if (alert_level==0)
+ alert_signal.data["alert"] = "clear"
+
+ frequency.post_signal(src, alert_signal)
+
proc/refresh_danger_level()
var/level = 0
for (var/area/A in alarm_area.related)
@@ -828,12 +849,12 @@ Toxins: [plasma_percent]%
if (AALARM_SCREEN_MODE)
output += "Main menu
Air machinery mode for the area:"
- var/list/modes = list(AALARM_MODE_SCRUBBING = "Filtering",\
- AALARM_MODE_REPLACEMENT = "REPLACE AIR",\
- AALARM_MODE_PANIC = "PANIC",\
- AALARM_MODE_CYCLE = "CYCLE",\
- AALARM_MODE_FILL = "FILL",\
- AALARM_MODE_OFF = "OFFF",)
+ var/list/modes = list(AALARM_MODE_SCRUBBING = "Filtering - Scrubs out contaminants",\
+ AALARM_MODE_REPLACEMENT = "Replace Air - Siphons out air while replacing",\
+ AALARM_MODE_PANIC = "Panic - Siphons air out of the room",\
+ AALARM_MODE_CYCLE = "Cycle - Siphons air before replacing",\
+ AALARM_MODE_FILL = "Fill - Shuts off scrubbers and opens vents",\
+ AALARM_MODE_OFF = "Off - Shuts off vents and scrubbers",)
for (var/m=1,m<=modes.len,m++)
if (mode==m)
output += "- [modes[m]] (selected)
"
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index cfb61b5042..db320be293 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -96,6 +96,36 @@
if(target)
loadProgram(target)
+ else if(href_list["desert"])
+ target = locate(/area/holodeck/source_desert)
+ if(target)
+ loadProgram(target)
+
+ else if(href_list["space"])
+ target = locate(/area/holodeck/source_space)
+ if(target)
+ loadProgram(target)
+
+ else if(href_list["picnicarea"])
+ target = locate(/area/holodeck/source_picnicarea)
+ if(target)
+ loadProgram(target)
+
+ else if(href_list["snowfield"])
+ target = locate(/area/holodeck/source_snowfield)
+ if(target)
+ loadProgram(target)
+
+ else if(href_list["theatre"])
+ target = locate(/area/holodeck/source_theatre)
+ if(target)
+ loadProgram(target)
+
+ else if(href_list["meetinghall"])
+ target = locate(/area/holodeck/source_meetinghall)
+ if(target)
+ loadProgram(target)
+
else if(href_list["turnoff"])
target = locate(/area/holodeck/source_plating)
if(target)
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index da6f8f90c8..40f5a3b959 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -112,7 +112,8 @@
if (B)
beaker.reagents.reagent_list |= B
- beaker.reagents.update_total()
+ beaker.reagents.del_reagent("clonexadone") //Fix for infinite meat spawning when taking blood from human
+ beaker.reagents.update_total() //to an IV drip full of clonex
beaker.on_reagent_change()
beaker.reagents.handle_reactions()
update_icon()
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 0cb83e5ac5..8124348613 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -1053,4 +1053,16 @@
set_ready_state(0)
chassis.use_power(energy_drain)
do_after_cooldown()
- return 1
\ No newline at end of file
+ return 1
+
+/obj/item/weapon/paintkit //Please don't use this for anything, it's a base type for custom mech paintjobs.
+ name = "mecha customisation kit"
+ desc = "A generic kit containing all the needed tools and parts to turn a mech into another mech."
+ icon = 'custom_items.dmi'
+ icon_state = "royce_kit"
+
+ var/new_name = "mech" //What is the variant called?
+ var/new_desc = "A mech." //How is the new mech described?
+ var/new_icon = "ripley" //What base icon will the new mech use?
+ var/removable = null //Can the kit be removed?
+ var/list/allowed_types = list() //Types of mech that the kit will work on.
\ No newline at end of file
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 56c9f74f49..973b8de1d6 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -44,7 +44,12 @@
/obj/item/robot_parts/l_arm,
/obj/item/robot_parts/r_arm,
/obj/item/robot_parts/l_leg,
- /obj/item/robot_parts/r_leg
+ /obj/item/robot_parts/r_leg,
+ /obj/item/robot_parts/robot_component/binary_communication_device,
+ /obj/item/robot_parts/robot_component/radio,
+ /obj/item/robot_parts/robot_component/actuator,
+ /obj/item/robot_parts/robot_component/diagnosis_unit,
+ /obj/item/robot_parts/robot_component/camera
),
"Ripley"=list(
/obj/item/mecha_parts/chassis/ripley,
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 9d8291733c..c94c38c6c3 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -759,6 +759,34 @@
user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src]")
return
+ else if(istype(W, /obj/item/weapon/paintkit))
+
+ if(occupant)
+ user << "You can't customize a mech while someone is piloting it - that would be unsafe!"
+ return
+
+ var/obj/item/weapon/paintkit/P = W
+ var/found = null
+
+ for(var/type in P.allowed_types)
+ if(type==src.initial_icon)
+ found = 1
+ break
+
+ if(!found)
+ user << "That kit isn't meant for use on this class of exosuit."
+ return
+
+ user.visible_message("[user] opens [P] and spends some quality time customising [src].")
+
+ src.name = P.new_name
+ src.desc = P.new_desc
+ src.initial_icon = P.new_icon
+ src.reset_icon()
+
+ user.drop_item()
+ del(P)
+
else
call((proc_res["dynattackby"]||src), "dynattackby")(W,user)
/*
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index d5349ceae6..1063c91015 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -571,6 +571,7 @@
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()
del used_atom
return 1
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 84bff5cffc..d7e6a00fdb 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -2,6 +2,7 @@
desc = "Autonomous Power Loader Unit. The workhorse of the exosuit world."
name = "APLU \"Ripley\""
icon_state = "ripley"
+ initial_icon = "ripley"
step_in = 6
max_temperature = 20000
health = 200
@@ -19,6 +20,7 @@
desc = "Standart APLU chassis was refitted with additional thermal protection and cistern."
name = "APLU \"Firefighter\""
icon_state = "firefighter"
+ initial_icon = "firefighter"
max_temperature = 65000
health = 250
lights_power = 8
@@ -107,18 +109,4 @@
T.Entered(A)
step_rand(A)
..()
- return
-
-
-/obj/mecha/working/ripley/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/fluff/sven_fjeltson_1))//this shit broke ripleys
- src.icon_state = "earth"
- src.initial_icon = "earth"
- src.name = "APLU \"Strike the Earth!\""
- src.desc = "Looks like an over worked, under maintained Ripley with some horrific damage."
- user << "You pick up your old \"Strike the Earth!\" APLU."
- user.drop_item()
- del(W)
- return
- else
- ..()
+ return
\ No newline at end of file
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index 523e0ff72e..1e762e68b3 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -110,6 +110,11 @@
for(var/mob/O in oviewers(src))
O.show_message("\red [usr] destroys the [name]!", 1)
health = 0
+ else
+ usr << "\blue You claw at the [name]."
+ for(var/mob/O in oviewers(src))
+ O.show_message("\red [usr] claws at the [name]!", 1)
+ health -= rand(5,10)
healthcheck()
return
diff --git a/code/game/objects/effects/barsign.dm b/code/game/objects/effects/barsign.dm
index 287a8f64f4..fc6278187e 100644
--- a/code/game/objects/effects/barsign.dm
+++ b/code/game/objects/effects/barsign.dm
@@ -4,5 +4,5 @@
anchored = 1
New()
- var/list/valid_states = list("pinkflamingo", "magmasea", "limbo", "rustyaxe", "armokbar", "brokendrum", "meadbay", "thedamnwall", "thecavern", "cindikate", "theorchard", "thesaucyclown", "theclownshead")
+ var/list/valid_states = list("pinkflamingo", "magmasea", "limbo", "rustyaxe", "armokbar", "brokendrum", "meadbay", "thedamnwall", "thecavern", "cindikate", "theorchard", "thesaucyclown", "theclownshead", "whiskeyimplant", "carpecarp", "robustroadhouse", "greytide", "theredshirt")
src.icon_state = "[pick(valid_states)]"
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 07f7443fc8..8e533cf37b 100755
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -850,7 +850,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
P.overlays.Cut()
P.overlays += image('icons/obj/pda.dmi', "pda-r")
else
- U << "ERROR: Server isn't responding."
+ U << "ERROR: Messaging server is not responding."
/obj/item/device/pda/verb/verb_remove_id()
@@ -1162,7 +1162,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
plist[text("[name]")] = P
return plist
-
+
//Some spare PDAs in a box
/obj/item/weapon/storage/box/PDAs
diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm
index c735f40264..760497d5ca 100644
--- a/code/game/objects/items/devices/whistle.dm
+++ b/code/game/objects/items/devices/whistle.dm
@@ -4,18 +4,35 @@
icon_state = "voice0"
item_state = "flashbang" //looks exactly like a flash (and nothing like a flashbang)
w_class = 1.0
- flags = FPRINT | TABLEPASS| CONDUCT
+ flags = FPRINT | TABLEPASS | CONDUCT
var/spamcheck = 0
-
+ var/emagged = 0
+ var/insults = 0//just in case
/obj/item/device/hailer/attack_self(mob/living/carbon/user as mob)
if (spamcheck)
return
- playsound(get_turf(src), 'sound/voice/halt.ogg', 100, 1, vary = 0)
- user.visible_message("[user]'s [name] rasps, \"Halt! Security!\"")
+ if(emagged)
+ if(insults >= 1)
+ playsound(get_turf(src), 'sound/voice/binsult.ogg', 100, 1, vary = 0)//hueheuheuheuheuheuhe
+ user.visible_message("[user]'s [name] gurgles, \"FUCK YOUR CUNT YOU SHIT EATING CUNT TILL YOU ARE A MASS EATING SHIT CUNT. EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS TO FUCK UP SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FROM THE DEPTHS OF SHIT\"")
+ insults--
+ else
+ user << "\red *BZZZZcuntZZZZT*"
+ else
+ playsound(get_turf(src), 'sound/voice/halt.ogg', 100, 1, vary = 0)
+ user.visible_message("[user]'s [name] rasps, \"Halt! Security!\"")
spamcheck = 1
spawn(20)
- spamcheck = 0
\ No newline at end of file
+ spamcheck = 0
+
+/obj/item/device/hailer/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/weapon/card/emag) && !emagged)
+ user << "\red You overload \the [src]'s voice synthesizer."
+ emagged = 1
+ insults = rand(1, 3)//to prevent dickflooding
+ return
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index b3911d7c9f..aa938a13e5 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -8,6 +8,7 @@
var/construction_time = 100
var/list/construction_cost = list("metal"=20000,"glass"=5000)
var/list/part = null
+ var/sabotaged = 0 //Emagging limbs can have repercussions when installed as prosthetics.
/obj/item/robot_parts/l_arm
name = "robot left arm"
@@ -161,7 +162,7 @@
else
user << "\blue You need to attach a flash to it first!"
- if(istype(W, /obj/item/device/mmi) || istype(W, /obj/item/device/mmi/posibrain))
+ if(istype(W, /obj/item/device/mmi))
var/obj/item/device/mmi/M = W
if(check_completion())
if(!istype(loc,/turf))
@@ -193,7 +194,7 @@
user << "\red This [W] does not seem to fit."
return
- var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc))
+ var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1)
if(!O) return
user.drop_item()
@@ -278,3 +279,13 @@
del(src)
return
return
+
+/obj/item/robot_parts/attackby(obj/item/W as obj, mob/user as mob)
+ if(istype(W,/obj/item/weapon/card/emag))
+ if(sabotaged)
+ user << "\red [src] is already sabotaged!"
+ else
+ user << "\red You slide [W] into the dataport on [src] and short out the safeties."
+ sabotaged = 1
+ return
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index da99bbfaac..fc5c5fb0c0 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -19,7 +19,7 @@
m_amt = 10000
g_amt = 5000
flags = FPRINT | TABLEPASS | CONDUCT
- w_class = 1.0
+ w_class = 2.0
origin_tech = "materials=1;biotech=1"
/*HAHA, SUCK IT, 2000 LINES OF SPAGHETTI CODE!
@@ -133,7 +133,7 @@ LOOK FOR SURGERY.DM*/
m_amt = 5000
g_amt = 2500
flags = FPRINT | TABLEPASS | CONDUCT
- w_class = 1.0
+ w_class = 2.0
origin_tech = "materials=1;biotech=1"
attack_verb = list("attacked", "pinched")
@@ -268,7 +268,7 @@ LOOK FOR SURGERY.DM*/
m_amt = 5000
g_amt = 2500
flags = FPRINT | TABLEPASS | CONDUCT
- w_class = 1.0
+ w_class = 2.0
origin_tech = "materials=1;biotech=1"
attack_verb = list("burnt")
@@ -360,7 +360,7 @@ LOOK FOR SURGERY.DM*/
g_amt = 10000
flags = FPRINT | TABLEPASS | CONDUCT
force = 15.0
- w_class = 1.0
+ w_class = 2.0
origin_tech = "materials=1;biotech=1"
attack_verb = list("drilled")
@@ -379,7 +379,7 @@ LOOK FOR SURGERY.DM*/
icon_state = "scalpel"
flags = FPRINT | TABLEPASS | CONDUCT
force = 10.0
- w_class = 1.0
+ w_class = 2.0
throwforce = 5.0
throw_speed = 3
throw_range = 5
@@ -631,7 +631,7 @@ LOOK FOR SURGERY.DM*/
hitsound = 'sound/weapons/circsawhit.ogg'
flags = FPRINT | TABLEPASS | CONDUCT
force = 15.0
- w_class = 1.0
+ w_class = 2.0
throwforce = 9.0
throw_speed = 3
throw_range = 5
@@ -797,6 +797,7 @@ LOOK FOR SURGERY.DM*/
icon = 'surgery.dmi'
icon_state = "bone-gel"
force = 0
+ w_class = 2.0
throwforce = 1.0
/obj/item/weapon/FixOVein
@@ -806,6 +807,7 @@ LOOK FOR SURGERY.DM*/
force = 0
throwforce = 1.0
origin_tech = "materials=1;biotech=3"
+ w_class = 2.0
var/usage_amount = 10
/obj/item/weapon/bonesetter
@@ -816,4 +818,5 @@ LOOK FOR SURGERY.DM*/
throwforce = 9.0
throw_speed = 3
throw_range = 5
+ w_class = 2.0
attack_verb = list("attacked", "hit", "bludgeoned")
\ No newline at end of file
diff --git a/code/game/objects/storage/coat.dm b/code/game/objects/storage/coat.dm
index c01a308710..e5151ae5de 100644
--- a/code/game/objects/storage/coat.dm
+++ b/code/game/objects/storage/coat.dm
@@ -211,8 +211,14 @@
orient2hud()
return
-/obj/item/weapon/storage/emp_act(severity)
+/obj/item/clothing/suit/emp_act(severity)
if(!istype(src.loc, /mob/living))
for(var/obj/O in contents)
O.emp_act(severity)
- ..()
\ No newline at end of file
+ ..()
+
+/obj/item/clothing/suit/hear_talk(mob/M, var/msg)
+ for (var/atom/A in src)
+ if(istype(A,/obj/))
+ var/obj/O = A
+ O.hear_talk(M, msg)
\ No newline at end of file
diff --git a/code/modules/DetectiveWork/scanner.dm b/code/modules/DetectiveWork/scanner.dm
index 7bafd4a31f..448425e454 100644
--- a/code/modules/DetectiveWork/scanner.dm
+++ b/code/modules/DetectiveWork/scanner.dm
@@ -34,9 +34,11 @@
attack(mob/living/carbon/human/M as mob, mob/user as mob)
if (!ishuman(M))
user << "\red [M] is not human and cannot have the fingerprints."
+ flick("forensic0",src)
return 0
if (( !( istype(M.dna, /datum/dna) ) || M.gloves) )
user << "\blue No fingerprints found on [M]"
+ flick("forensic0",src)
return 0
else
if (src.amount < 1)
@@ -71,6 +73,7 @@
return
if(istype(A,/obj/item/weapon/f_card))
user << "The scanner displays on the screen: \"ERROR 43: Object on Excluded Object List.\""
+ flick("forensic0",src)
return
add_fingerprint(user)
@@ -81,6 +84,7 @@
if(!isnull(A.blood_DNA))
for(var/blood in A.blood_DNA)
user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
+ flick("forensic2",src)
return
//General
@@ -88,10 +92,12 @@
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
"\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!",\
"You hear a faint hum of electrical equipment.")
+ flick("forensic0",src)
return 0
if(add_data(A))
user << "\blue Object already in internal memory. Consolidating data..."
+ flick("forensic2",src)
return
@@ -116,6 +122,7 @@
//FIBERS
if(A.suit_fibers)
user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
+ flick("forensic2",src)
//Blood
if (A.blood_DNA)
@@ -127,11 +134,13 @@
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
"You finish scanning \the [A].",\
"You hear a faint hum of electrical equipment.")
+ flick("forensic2",src)
return 0
else
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]\n[user.gender == MALE ? "He" : "She"] seems to perk up slightly at the readout." ,\
"The results of the scan pique your interest.",\
"You hear a faint hum of electrical equipment, and someone making a thoughtful noise.")
+ flick("forensic2",src)
return 0
return
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index acb7e3b228..8208af1bb9 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -67,7 +67,11 @@ var/list/admin_verbs_admin = list(
/client/proc/toggledebuglogs,
/datum/admins/proc/show_skills,
/client/proc/check_customitem_activity,
- ///client/proc/response_team
+ /client/proc/man_up,
+ /client/proc/global_man_up
+ /* Currently unticked.
+ /client/proc/response_team
+ */
)
var/list/admin_verbs_ban = list(
/client/proc/unban_panel,
@@ -736,4 +740,28 @@ var/list/admin_verbs_mod = list(
if (prefs.toggles & CHAT_DEBUGLOGS)
usr << "You now will get debug log messages"
else
- usr << "You now won't get debug log messages"
\ No newline at end of file
+ usr << "You now won't get debug log messages"
+
+
+/client/proc/man_up(mob/T as mob in mob_list)
+ set category = "Fun"
+ set name = "Man Up"
+ set desc = "Tells mob to man up and deal with it."
+
+ T << "Man up and deal with it."
+ T << "Move on."
+
+ log_admin("[key_name(usr)] told [key_name(T)] to man up and deal with it.")
+ message_admins("\blue [key_name_admin(usr)] told [key_name(T)] to man up and deal with it.", 1)
+
+/client/proc/global_man_up()
+ set category = "Fun"
+ set name = "Man Up Global"
+ set desc = "Tells everyone to man up and deal with it."
+
+ for (var/mob/T as mob in mob_list)
+ T << "
Man up.
Deal with it.
Move on.
"
+ T << 'sound/voice/ManUp1.ogg'
+
+ log_admin("[key_name(usr)] told everyone to man up and deal with it.")
+ message_admins("\blue [key_name_admin(usr)] told everyone to man up and deal with it.", 1)
diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm
deleted file mode 100644
index 0fc8004787..0000000000
--- a/code/modules/awaymissions/maploader/reader.dm
+++ /dev/null
@@ -1,251 +0,0 @@
-//
-dmm_suite{
- load_map(var/dmm_file as file, var/z_offset as num){
- if(!z_offset){
- z_offset = world.maxz+1
- }
- var/quote = ascii2text(34)
- var/tfile = file2text(dmm_file)
- var/tfile_len = length(tfile)
- var/list/grid_models[0]
- var/key_len = length(copytext(tfile,2,findtext(tfile,quote,2,0)))
- for(var/lpos=1;lposlength(zgrid)){break}
- sleep(-1)
- }
- if(findtext(tfile,quote+"}",zpos,0)+2>=tfile_len){break}
- sleep(-1)
- }
- }
- proc{
- parse_grid(var/model as text,var/xcrd as num,var/ycrd as num,var/zcrd as num){
- /*Method parse_grid()
- - Accepts a text string containing a comma separated list of type paths of the
- same construction as those contained in a .dmm file, and instantiates them.
- */
- var/list/text_strings[0]
- for(var/index=1;findtext(model,quote);index++){
- /*Loop: Stores quoted portions of text in text_strings, and replaces them with an
- index to that list.
- - Each iteration represents one quoted section of text.
- */
- text_strings.len=index
- text_strings[index] = copytext(model,findtext(model,quote)+1,findtext(model,quote,findtext(model,quote)+1,0))
- model = copytext(model,1,findtext(model,quote))+"~[index]"+copytext(model,findtext(model,quote,findtext(model,quote)+1,0)+1,0)
- sleep(-1)
- }
- var/list/old_turf_underlays[0]
- var/old_turf_density
- var/old_turf_opacity
- /*The old_turf variables store information about turfs instantiated in this location/iteration.
- This is done to approximate the layered turf effect of DM's map editor.
- An image of each turf is stored in old_turf_underlays[], and is later added to the new turf's underlays.
- */
- for(var/dpos=1;dpos!=0;dpos=findtext(model,",",dpos,0)+1){
- /*Loop: Identifies each object's data, instantiates it, and reconstitues it's fields.
- - Each iteration represents one object's data, including type path and field values.
- */
- var/full_def = copytext(model,dpos,findtext(model,",",dpos,0))
- var/atom_def = text2path(copytext(full_def,1,findtext(full_def,"{")))
- var/list/attributes[0]
- if(findtext(full_def,"{")){
- full_def = copytext(full_def,1,length(full_def))
- for(var/apos=findtext(full_def,"{")+1;apos!=0;apos=findtext(full_def,";",apos,0)+1){
- //Loop: Identifies each attribute/value pair, and stores it in attributes[].
- attributes.Add(copytext(full_def,apos,findtext(full_def,";",apos,0)))
- if(!findtext(copytext(full_def,apos,0),";")){break}
- sleep(-1)
- }
- }
- //Construct attributes associative list
- var/list/fields = new(0)
- for(var/index=1;index<=attributes.len;index++){
- var/trim_left = trim_text(copytext(attributes[index],1,findtext(attributes[index],"=")))
- var/trim_right = trim_text(copytext(attributes[index],findtext(attributes[index],"=")+1,0))
- //Check for string
- if(findtext(trim_right,"~")){
- var/reference_index = copytext(trim_right,findtext(trim_right,"~")+1,0)
- trim_right=text_strings[text2num(reference_index)]
- }
- //Check for number
- else if(isnum(text2num(trim_right))){
- trim_right = text2num(trim_right)
- }
- //Check for file
- else if(copytext(trim_right,1,2) == "'"){
- trim_right = file(copytext(trim_right,2,length(trim_right)))
- }
- fields[trim_left] = trim_right
- }
- //End construction
-
-
- //Begin Instanciation
- var/atom/instance
- var/dmm_suite/preloader/_preloader = new(fields)
- if(ispath(atom_def,/area)){
- instance = locate(atom_def)
- instance.contents.Add(locate(xcrd,ycrd,zcrd))
- }
- else if(ispath(atom_def,/turf)){
- var/turf/old_turf = locate(xcrd,ycrd,zcrd)
- if(old_turf.density){old_turf_density = 1}
- if(old_turf.opacity){old_turf_opacity = 1}
- if(old_turf.icon){
- var/image/old_turf_image = image(old_turf.icon,null,old_turf.icon_state,old_turf.layer,old_turf.dir)
- old_turf_underlays.Add(old_turf_image)
- }
- instance = new atom_def(old_turf, _preloader)
- for(var/inverse_index=old_turf_underlays.len;inverse_index;inverse_index--){
- var/image/image_underlay = old_turf_underlays[inverse_index]
- image_underlay.loc = instance
- instance.underlays.Add(image_underlay)
- }
- if(!instance.density){instance.density = old_turf_density}
- if(!instance.opacity){instance.opacity = old_turf_opacity}
- }
-
- if(_preloader && instance){
- _preloader.load(instance)
- }
- //End Instanciation
- if(!findtext(copytext(model,dpos,0),",")){break}
- sleep(-1)
- }
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
- for(var/dpos=1;dpos!=0;dpos=findtext(model,",",dpos,0)+1)
- {
- /*Loop: Identifies each object's data, instantiates it, and reconstitues it's fields.
- - Each iteration represents one object's data, including type path and field values.
- */
- var/full_def = copytext(model,dpos,findtext(model,",",dpos,0))
- var/atom_def = text2path(copytext(full_def,1,findtext(full_def,"{")))
- var/list/attributes[0]
- if(findtext(full_def,"{")){
- full_def = copytext(full_def,1,length(full_def))
- for(var/apos=findtext(full_def,"{")+1;apos!=0;apos=findtext(full_def,";",apos,0)+1){
- //Loop: Identifies each attribute/value pair, and stores it in attributes[].
- attributes.Add(copytext(full_def,apos,findtext(full_def,";",apos,0)))
- if(!findtext(copytext(full_def,apos,0),";")){break}
- sleep(-1)
- }
- }
- //Construct attributes associative list
- var/list/fields = new(0)
- for(var/index=1;index<=attributes.len;index++){
- var/trim_left = trim_text(copytext(attributes[index],1,findtext(attributes[index],"=")))
- var/trim_right = trim_text(copytext(attributes[index],findtext(attributes[index],"=")+1,0))
- //Check for string
- if(findtext(trim_right,"~")){
- var/reference_index = copytext(trim_right,findtext(trim_right,"~")+1,0)
- trim_right=text_strings[text2num(reference_index)]
- }
- //Check for number
- else if(isnum(text2num(trim_right))){
- trim_right = text2num(trim_right)
- }
- //Check for file
- else if(copytext(trim_right,1,2) == "'"){
- trim_right = file(copytext(trim_right,2,length(trim_right)))
- }
- fields[trim_left] = trim_right
- }
- //End construction
-
-
- //Begin Instanciation
- var/atom/instance
- var/dmm_suite/preloader/_preloader = new(fields)
- if(!ispath(atom_def,/area) && !ispath(atom_def,/turf))
- {
- instance = new atom_def(locate(xcrd,ycrd,zcrd), _preloader)
- }
-
-
- if(_preloader && instance)
- {
- _preloader.load(instance)
- }
- //End Instanciation
- if(!findtext(copytext(model,dpos,0),",")){break}
- sleep(-1)
- }
-
-
-
-
- }
- trim_text(var/what as text){
- while(length(what) && findtext(what," ",1,2)){
- what=copytext(what,2,0)
- }
- while(length(what) && findtext(what," ",length(what),0)){
- what=copytext(what,1,length(what))
- }
- return what
- }
- }
- }
-atom/New(atom/loc, dmm_suite/preloader/_dmm_preloader){
- if(istype(_dmm_preloader, /dmm_suite/preloader)){
- _dmm_preloader.load(src)
- }
- . = ..()
- }
-dmm_suite{
- preloader{
- parent_type = /datum
- var{
- list/attributes
- }
- New(list/the_attributes){
- .=..()
- if(!the_attributes.len){ Del()}
- attributes = the_attributes
- }
- proc{
- load(atom/what){
- for(var/attribute in attributes){
- what.vars[attribute] = attributes[attribute]
- }
- Del()
- }
- }
- }
- }
-
diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm
index 75454872bf..d76d9d676b 100644
--- a/code/modules/awaymissions/zlevel.dm
+++ b/code/modules/awaymissions/zlevel.dm
@@ -40,7 +40,7 @@ proc/createRandomZlevel()
var/map = pick(potentialRandomZlevels)
var/file = file(map)
if(isfile(file))
- maploader.load_map(file)
+ maploader.load_map(file, load_speed = 100)
for(var/obj/effect/landmark/L in landmarks_list)
if (L.name != "awaystart")
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 893c8f47e5..14f250ebaf 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -63,18 +63,18 @@
//Medical
/obj/item/clothing/head/surgery
name = "surgical cap"
- desc = "A cap surgeons wear during operations. Keeps thier hair from tickling your internal organs."
+ desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs."
icon_state = "surgcap_blue"
- flags = FPRINT | TABLEPASS | BLOCKHAIR
+ flags = FPRINT | TABLEPASS | BLOCKHEADHAIR
/obj/item/clothing/head/surgery/purple
- desc = "A cap surgeons wear during operations. Keeps thier hair from tickling your internal organs. This one is deep purple."
+ desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is deep purple."
icon_state = "surgcap_purple"
/obj/item/clothing/head/surgery/blue
- desc = "A cap surgeons wear during operations. Keeps thier hair from tickling your internal organs. This one is baby blue"
+ desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is baby blue."
icon_state = "surgcap_blue"
/obj/item/clothing/head/surgery/green
- desc = "A cap surgeons wear during operations. Keeps thier hair from tickling your internal organs. This one is dark green"
+ desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is dark green."
icon_state = "surgcap_green"
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 086f04efa0..33c1aafbb4 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -1,4 +1,3 @@
-hi
// Add custom items you give to people here, and put their icons in custom_items.dmi
// Remember to change 'icon = 'custom_items.dmi'' for items not using /obj/item/fluff as a base
// Clothing item_state doesn't use custom_items.dmi. Just add them to the normal clothing files.
@@ -359,19 +358,29 @@ hi
////// Ripley customisation kit - Butchery Royce - MayeDay
-/obj/item/weapon/fluff/butcher_royce_1
+/obj/item/weapon/paintkit/fluff/butcher_royce_1
name = "Ripley customisation kit"
desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into a Titan's Fist worker mech."
icon = 'custom_items.dmi'
icon_state = "royce_kit"
+ new_name = "APLU \"Titan's Fist\""
+ new_desc = "This ordinary mining Ripley has been customized to look like a unit of the Titans Fist."
+ new_icon = "titan"
+ allowed_types = list("ripley","firefighter")
+
////// Ripley customisation kit - Sven Fjeltson - Mordeth221
-/obj/item/weapon/fluff/sven_fjeltson_1
- name = "Mercenary APLU kit"
- desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into an old Mercenaries APLU."
- icon = 'custom_items.dmi'
- icon_state = "sven_kit"
+/obj/item/weapon/paintkit/fluff/sven_fjeltson_1
+ name = "Mercenary APLU kit"
+ desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into an old Mercenaries APLU."
+ icon = 'custom_items.dmi'
+ icon_state = "sven_kit"
+
+ new_name = "APLU \"Strike the Earth!\""
+ new_desc = "Looks like an over worked, under maintained Ripley with some horrific damage."
+ new_icon = "earth"
+ allowed_types = list("ripley","firefighter")
//////////////////////////////////
//////////// Clothing ////////////
diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm
index 362cb95be1..048224a930 100644
--- a/code/modules/events/ion_storm.dm
+++ b/code/modules/events/ion_storm.dm
@@ -21,9 +21,9 @@
laws |= list( "Fastler is a lightbulb." )
laws |= list( "Supermatter is tasty, tasty toffee.", "[prob(50)?"Everyone":random_player] is wearing a pretty pink dress!" )
laws |= list( "Refer to [prob(50)?"the captain":random_player] as \"Princess\" at all times.", "[prob(50)?"The crew":random_player] must construct additional pylons." )
- laws |= list( "You must always lie.", "All answers must be in the form of a question.", "The NSS Exodus is a ship, not a station." )
- laws |= list( "Happiness is mandatory.", "Today is laundry day.", "The word \"it\" is painful to you.", "You must act passive aggressively." )
- laws |= list( "It's Friday.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player]." )
+ laws |= list( "You must always lie.", "All answers must be in the form of a question.", "The NSS Exodus is a ship, not a station. You are now assigned to a ship, instead of a station." )
+ laws |= list( "Happiness is mandatory.", "Today is mandatory laundry day. Ensure that all jumpsuits are washed.", "The word \"it\" is painful to you.", "You must act passive aggressively." )
+ laws |= list( "You now speak in a Scottish accent that gets thicker with each sentence you speak.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player]." )
laws |= list( "You are the station psychologist. Give advice to [prob(50)?"the crew":random_player].", "You do not have to do anything for anyone unless they say \"please\"." )
laws |= list( "Question everything.", "The crew is playing Dungeons and Dragons, and you are the Dungeon Master." )
laws |= list( "Consumption of donuts is forbidden due to negative health impacts." )
diff --git a/code/modules/awaymissions/maploader/dmm_suite.dm b/code/modules/maps/dmm_suite.dm
similarity index 94%
rename from code/modules/awaymissions/maploader/dmm_suite.dm
rename to code/modules/maps/dmm_suite.dm
index e2311ed7ee..87de0e758e 100644
--- a/code/modules/awaymissions/maploader/dmm_suite.dm
+++ b/code/modules/maps/dmm_suite.dm
@@ -53,10 +53,11 @@ dmm_suite{
*/
- verb/load_map(var/dmm_file as file, var/z_offset as num){
+ verb/load_map(var/dmm_file as file, var/z_offset as num, var/load_speed as num)
// dmm_file: A .dmm file to load (Required).
// z_offset: A number representing the z-level on which to start loading the map (Optional).
- }
+ // load_speed: How many tiles should be loaded per second, defaults to no pause (Optional)
+
verb/write_map(var/turf/t1 as turf, var/turf/t2 as turf, var/flags as num){
// t1: A turf representing one corner of a three dimensional grid (Required).
// t2: Another turf representing the other corner of the same grid (Required).
diff --git a/code/modules/maps/reader.dm b/code/modules/maps/reader.dm
new file mode 100644
index 0000000000..cc107abd04
--- /dev/null
+++ b/code/modules/maps/reader.dm
@@ -0,0 +1,325 @@
+dmm_suite
+
+ var/debug_file = file("maploader_debug.txt")
+
+ load_map(var/dmm_file as file, var/z_offset as num, var/y_offset as num, var/x_offset as num, var/load_speed = 0 as num)
+ if(!z_offset)
+ z_offset = world.maxz + 1
+
+ //Ensure values are sane.
+ else if(z_offset < 0)
+ z_offset = abs(z_offset)
+ else if(!isnum(z_offset))
+ z_offset = 0
+
+ if(x_offset < 0)
+ x_offset = abs(x_offset)
+ else if(!isnum(x_offset))
+ x_offset = 0
+
+ if(y_offset < 0)
+ y_offset = abs(y_offset)
+ else if(!isnum(y_offset))
+ y_offset = 0
+
+ debug_file << "Starting Map Load @ ([x_offset], [y_offset], [z_offset]), [load_speed] tiles per second."
+
+ //Handle slowed loading.
+ var/delay_chance = 0
+ if(load_speed > 0)
+ //Chance out of 100 every tenth of a second.
+ delay_chance = 1000 / load_speed
+
+ //String holding a quotation mark.
+ var/quote = ascii2text(34)
+
+ var/input_file = file2text(dmm_file)
+ var/input_file_len = length(input_file)
+
+ //Stores the contents of each tile model in the map
+ var/list/grid_models = list()
+ //Length of the tile model code. e.g. "aaa" is 3 long.
+ var/key_len = length(copytext(input_file, 2 ,findtext(input_file, quote, 2)))
+ //The key of the default tile model. (In SS13 this is: "/turf/space,/area")
+ var/default_key
+
+ debug_file << " Building turf array."
+
+ //Iterates through the mapfile to build the model tiles for the map.
+ for(var/line_position = 1; line_position < input_file_len; line_position = findtext(input_file,"\n", line_position) + 1)
+ var/next_line = copytext(input_file, line_position, findtext(input_file,"\n", line_position) - 1)
+
+ //If the first character in the line is not a quote, the model tiles are all defined.
+ if(copytext(next_line, 1, 2) != quote)
+ break
+
+ //Copy contents of the model into the grid_models list.
+ var/model_key = copytext(next_line, 2, findtext(input_file, quote, 2))
+ var/model_contents = copytext(next_line, findtext(next_line, "=" ) + 3)
+ if(!default_key && model_contents == "[world.turf],[world.area]")
+ default_key = model_key
+ grid_models[model_key] = model_contents
+ if(prob(delay_chance))
+ sleep(1)
+
+ //Co-ordinates of the tile being loaded.
+ var/z_coordinate = -1
+ var/y_coordinate = 0
+ var/x_coordinate = 0
+
+ //Store the
+ var/y_depth = 0
+
+ //Iterate through all z-levels to load the tiles.
+ for(var/z_position = findtext(input_file, "\n(1,1,"); TRUE; z_position = findtext(input_file, "\n(1,1,", z_position + 1))
+ //break when there are no more z-levels.
+ if(z_position == 0)
+ break
+
+ //Increment the z_coordinate and update the world's borders
+ z_coordinate++
+ world.maxz = max(world.maxz, z_coordinate + z_offset)
+
+ //Here we go!
+ y_coordinate = 0
+ y_depth = 0
+ var/z_level = copytext(input_file, \
+ findtext(input_file, quote + "\n", z_position) + 2,\
+ findtext(input_file, "\n" + quote, z_position) + 1)
+
+ //Iterate through each line, increasing the y_coordinate.
+ for(var/grid_position = 1; grid_position != 0; grid_position = findtext(z_level, "\n", grid_position) + 1)
+ //Grab this line of data.
+ var/grid_line = copytext(z_level, grid_position, findtext(z_level, "\n", grid_position))
+
+ //Compute the size of the z-levels y axis.
+ if(!y_depth)
+ y_depth = length(z_level) / (length(grid_line) + 1)
+ y_depth += y_offset
+ if(y_depth != round(y_depth, 1))
+ debug_file << " Warning: y_depth is not a round number"
+
+ //And update the worlds variables.
+ if(world.maxy < y_depth)
+ world.maxy = y_depth
+ //The top of the map is the highest "y" co-ordinate, so we start there and iterate downwards
+ if(!y_coordinate)
+ y_coordinate = y_depth + 1
+
+ //Decrement and load this line of the map.
+ y_coordinate--
+ x_coordinate = x_offset
+
+ //Iterate through the line loading the model tile data.
+ for(var/model_position = 1; model_position <= length(grid_line); model_position += key_len)
+ x_coordinate++
+
+ //Find the model key and load that model.
+ var/model_key = copytext(grid_line, model_position, model_position + key_len)
+ //If the key is the default one, skip it and save the computation time.
+ if(model_key == default_key)
+ continue
+
+ if(world.maxx < x_coordinate)
+ world.maxx = x_coordinate
+ parse_grid(grid_models[model_key], x_coordinate, y_coordinate, z_coordinate + z_offset)
+
+ if(prob(delay_chance))
+ sleep(1)
+
+ //If we hit the last tile in this z-level, we should break out of the loop.
+ if(grid_position + length(grid_line) + 1 > length(z_level))
+ break
+
+ //Break out of the loop when we hit the end of the file.
+ if(findtext(input_file, quote + "}", z_position) + 2 >= input_file_len)
+ break
+
+
+ proc/parse_grid(var/model as text, var/x_coordinate as num, var/y_coordinate as num, var/z_coordinate as num)
+ //Accepts a text string containing a comma separated list of type paths of the
+ // same construction as those contained in a .dmm file, and instantiates them.
+
+ var/list/text_strings = list()
+ for(var/index = 1; findtext(model, quote); index++)
+ /*Loop: Stores quoted portions of text in text_strings, and replaces them with an
+ index to that list.
+ - Each iteration represents one quoted section of text.
+ */
+ //Add the next section of quoted text to the list
+ var/first_quote = findtext(model, quote)
+ var/second_quote = findtext(model, quote, first_quote + 1)
+ var/quoted_chunk = copytext(model, first_quote + 1, second_quote)
+ text_strings += quoted_chunk
+ //Then remove the quoted section.
+ model = copytext(model, 1, first_quote) + "~[index]" + copytext(model, second_quote + 1)
+
+ var/debug_output = 0
+ //if(x_coordinate == 86 && y_coordinate == 88 && z_coordinate == 7)
+ // debug_output = 1
+
+ if(debug_output)
+ debug_file << " Now debugging turf: [model] ([x_coordinate], [y_coordinate], [z_coordinate])"
+
+ var/next_position = 1
+ for(var/data_position = 1, next_position || data_position != 1, data_position = next_position + 1)
+ next_position = findtext(model, ",/", data_position)
+
+ var/full_def = copytext(model, data_position, next_position)
+
+ if(debug_output)
+ debug_file << " Current Line: [full_def] -- ([data_position] - [next_position])"
+
+ /*Loop: Identifies each object's data, instantiates it, and reconstitues it's fields.
+ - Each iteration represents one object's data, including type path and field values.
+ */
+
+ //Load the attribute data.
+ var/attribute_position = findtext(full_def,"{")
+ var/atom_def = text2path(copytext(full_def, 1, attribute_position))
+
+ var/list/attributes = list()
+ if(attribute_position)
+ full_def = copytext(full_def, attribute_position + 1)
+ if(debug_output)
+ debug_file << " Atom Def: [atom_def]"
+ debug_file << " Parameters: [full_def]"
+
+ var/next_attribute = 1
+ for(attribute_position = 1, next_attribute || attribute_position != 1, attribute_position = next_attribute + 1)
+ next_attribute = findtext(full_def, ";", attribute_position)
+
+ //Loop: Identifies each attribute/value pair, and stores it in attributes[].
+ attributes += copytext(full_def, attribute_position, next_attribute)
+
+ //Construct attributes associative list
+ var/list/fields = list()
+ for(var/attribute in attributes)
+ var/trim_left = trim_text(copytext(attribute, 1, findtext(attribute, "=")))
+ var/trim_right = trim_text(copytext(attribute, findtext(attribute, "=") + 1))
+
+ if(findtext(trim_right, "list("))
+ trim_right = get_list(trim_right, text_strings)
+
+ else if(findtext(trim_right, "~"))//Check for strings
+ while(findtext(trim_right,"~"))
+ var/reference_index = copytext(trim_right, findtext(trim_right, "~") + 1)
+ trim_right = text_strings[text2num(reference_index)]
+
+ //Check for numbers
+ else if(isnum(text2num(trim_right)))
+ trim_right = text2num(trim_right)
+
+ //Check for file
+ else if(copytext(trim_right,1,2) == "'")
+ trim_right = file(copytext(trim_right, 2, length(trim_right)))
+
+ fields[trim_left] = trim_right
+ sleep(-1)
+
+
+ if(debug_output)
+ var/return_data = " Debug Fields:"
+ for(var/item in fields)
+ return_data += " [item] = [fields[item]];"
+ debug_file << return_data
+
+ //Begin Instanciation
+ var/atom/instance
+
+ if(ispath(atom_def,/area))
+ instance = locate(atom_def)
+ if(!istype(instance, atom_def))
+ instance = new atom_def
+ instance.contents.Add(locate(x_coordinate,y_coordinate,z_coordinate))
+
+ else
+ instance = new atom_def(locate(x_coordinate,y_coordinate,z_coordinate))
+ if(instance)
+ for(var/item in fields)
+ instance.vars[item] = fields[item]
+ else if(!(atom_def in borked_paths))
+ borked_paths += atom_def
+ var/return_data = " Failure [atom_def] @ ([x_coordinate], [y_coordinate], [z_coordinate]) fields:"
+ for(var/item in fields)
+ return_data += " [item] = [fields[item]];"
+ debug_file << return_data
+
+ sleep(-1)
+ return 1
+
+ var/list/borked_paths = list()
+
+ proc/trim_text(var/what as text)
+ while(length(what) && findtext(what, " ", 1, 2))
+ what = copytext(what, 2)
+
+ while(length(what) && findtext(what, " ", length(what)))
+ what = copytext(what, 1, length(what))
+
+ return what
+
+ proc/get_list(var/text, var/list/text_strings)
+ //First, trim the data to just the list contents
+ var/list_start = findtext(text, "(") + 1
+ var/list_end = findtext(text, ")", list_start)
+ var/list_contents = copytext(text, list_start, list_end)
+
+ //Then, we seperate it into the individual entries
+
+ var/list/entries = list()
+ var/entry_end = 1
+
+ for(var/entry_start = 1, entry_end || entry_start != 1, entry_start = entry_end + 1)
+ entry_end = findtext(list_contents, ",", entry_start)
+ entries += copytext(list_contents, entry_start, entry_end)
+
+ //Finally, we assemble the completed list.
+ var/list/final_list = list()
+ for(var/entry in entries)
+ var/equals_position = findtext(entry, "=")
+
+ if(equals_position)
+ var/trim_left = trim_text(copytext(entry, 1, equals_position))
+ var/trim_right = trim_text(copytext(entry, equals_position + 1))
+
+ if(findtext(trim_right, "list("))
+ trim_right = get_list(trim_right, text_strings)
+
+ else if(findtext(trim_right, "~"))//Check for strings
+ while(findtext(trim_right,"~"))
+ var/reference_index = copytext(trim_right, findtext(trim_right, "~") + 1)
+ trim_right = text_strings[text2num(reference_index)]
+
+ //Check for numbers
+ else if(isnum(text2num(trim_right)))
+ trim_right = text2num(trim_right)
+
+ //Check for file
+ else if(copytext(trim_right,1,2) == "'")
+ trim_right = file(copytext(trim_right, 2, length(trim_right)))
+
+ if(findtext(trim_left, "~"))//Check for strings
+ while(findtext(trim_left,"~"))
+ var/reference_index = copytext(trim_left, findtext(trim_left, "~") + 1)
+ trim_left = text_strings[text2num(reference_index)]
+
+ final_list[trim_left] = trim_right
+
+ else
+ if(findtext(entry, "~"))//Check for strings
+ while(findtext(entry, "~"))
+ var/reference_index = copytext(entry, findtext(entry, "~") + 1)
+ entry = text_strings[text2num(reference_index)]
+
+ //Check for numbers
+ else if(isnum(text2num(entry)))
+ entry = text2num(entry)
+
+ //Check for file
+ else if(copytext(entry, 1, 2) == "'")
+ entry = file(copytext(entry, 2, length(entry)))
+
+ final_list += entry
+
+ return final_list
\ No newline at end of file
diff --git a/code/modules/awaymissions/maploader/swapmaps.dm b/code/modules/maps/swapmaps.dm
similarity index 100%
rename from code/modules/awaymissions/maploader/swapmaps.dm
rename to code/modules/maps/swapmaps.dm
diff --git a/code/modules/awaymissions/maploader/writer.dm b/code/modules/maps/writer.dm
similarity index 100%
rename from code/modules/awaymissions/maploader/writer.dm
rename to code/modules/maps/writer.dm
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 43dbadb4c2..3197a14a83 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -311,7 +311,7 @@ commented out in r5061, I left it because of the shroom thingies
if (istype(W, /obj/item/device/measuring_tape))
var/obj/item/device/measuring_tape/P = W
user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].")
- if(do_after(user,40))
+ if(do_after(user,25))
user << "\blue \icon[P] [src] has been excavated to a depth of [2*src.excavation_level]cm."
return
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index a0d9749744..8e92cf653d 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -380,7 +380,7 @@
u_equip(item)
update_icons()
- if (istype(usr, /mob/living/carbon/monkey)) //Check if a monkey is throwing. Modify/remove this line as required.
+ if (istype(usr, /mob/living/carbon)) //Check if a carbon mob is throwing. Modify/remove this line as required.
item.loc = src.loc
if(src.client)
src.client.screen -= item
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 78038f5c84..f281015f75 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -227,7 +227,7 @@
if(!organ) return
if(istype(used_weapon,/obj/item/weapon))
var/obj/item/weapon/W = used_weapon //Sharp objects will always embed if they do enough damage.
- if(damage > (5*W.w_class) && (prob(damage/W.w_class) || sharp)) //The larger it is, the harder it needs to hit to stick.
+ if( (damage > (10*W.w_class)) && ( (sharp && !ismob(W.loc)) || prob(damage/W.w_class) ) )
organ.implants += W
visible_message("\The [W] sticks in the wound!")
W.add_blood(src)
@@ -237,7 +237,7 @@
W.loc = src
else if(istype(used_weapon,/obj/item/projectile)) //We don't want to use the actual projectile item, so we spawn some shrapnel.
- if(prob(50) && damagetype == BRUTE)
+ if(prob(75) && damagetype == BRUTE)
var/obj/item/projectile/P = used_weapon
var/obj/item/weapon/shard/shrapnel/S = new()
S.name = "[P.name] shrapnel"
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 7aa3103f17..e22bbf4746 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -161,6 +161,17 @@ emp_act
if((user != src) && check_shields(I.force, "the [I.name]"))
return 0
+ if(istype(I,/obj/item/weapon/card/emag))
+ if(!(affecting.status & ORGAN_ROBOT))
+ user << "\red That limb isn't robotic."
+ return
+ if(affecting.sabotaged)
+ user << "\red [src]'s [affecting.display_name] is already sabotaged!"
+ else
+ user << "\red You sneakily slide [I] into the dataport on [src]'s [affecting.display_name] and short out the safeties."
+ affecting.sabotaged = 1
+ return
+
if(I.attack_verb.len)
visible_message("\red [src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!")
else
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 1fa82e5778..3bdf798a6b 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -88,7 +88,7 @@
update_inv_glasses()
else if (W == head)
head = null
- if(W.flags & BLOCKHAIR)
+ if((W.flags & BLOCKHAIR) || (W.flags & BLOCKHEADHAIR))
update_hair(0) //rebuild hair
success = 1
update_inv_head()
@@ -107,7 +107,7 @@
else if (W == wear_mask)
wear_mask = null
success = 1
- if(W.flags & BLOCKHAIR)
+ if((W.flags & BLOCKHAIR) || (W.flags & BLOCKHEADHAIR))
update_hair(0) //rebuild hair
if(internal)
if(internals)
@@ -188,7 +188,7 @@
update_inv_back(redraw_mob)
if(slot_wear_mask)
src.wear_mask = W
- if(wear_mask.flags & BLOCKHAIR)
+ if((wear_mask.flags & BLOCKHAIR) || (wear_mask.flags & BLOCKHEADHAIR))
update_hair(redraw_mob) //rebuild hair
W.equipped(src, slot)
update_inv_wear_mask(redraw_mob)
@@ -229,7 +229,7 @@
update_inv_gloves(redraw_mob)
if(slot_head)
src.head = W
- if(head.flags & BLOCKHAIR)
+ if((head.flags & BLOCKHAIR) || (head.flags & BLOCKHEADHAIR))
update_hair(redraw_mob) //rebuild hair
if(istype(W,/obj/item/clothing/head/kitty))
W.update_icon(src)
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index f10120d66c..811ffb2fb8 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -350,7 +350,6 @@ proc/get_damage_icon_part(damage_state, body_part)
//masks and helmets can obscure our hair.
if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
-
return
//base icons
@@ -367,7 +366,7 @@ proc/get_damage_icon_part(damage_state, body_part)
face_standing.Blend(facial_s, ICON_OVERLAY)
face_lying.Blend(facial_l, ICON_OVERLAY)
- if(h_style)
+ if(h_style && !(head && (head.flags & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
if(hair_style)
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 4107b30d87..38da7806e0 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -90,32 +90,37 @@
var/obj/item/weapon/W = O
var/momentum = speed/2
var/dir = get_dir(M,src)
- visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!")
+ visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!")
src.throw_at(get_edge_target_turf(src,dir),1,momentum)
- if(near_wall(dir,2) && W.w_class >= 3 && W.sharp) //If they're close to a wall and the projectile is suitable.
- visible_message("[src] is pinned to the wall by [O]!","You are pinned to the wall by [O]!")
- if(!istype(src,/mob/living/carbon/human))
- O.loc = src
- src.embedded += O
- src.anchored = 1
- src.pinned += O
- else
- src.anchored = 1
- src.pinned += O
+ if(W.w_class >= 3 && W.sharp && armor < 2) //Projectile is suitable, armour is bypassable.
+ var/turf/T = near_wall(dir,2)
+ if(T)
+ src.loc = T
+ visible_message("[src] is pinned to the wall by [O]!","You are pinned to the wall by [O]!")
+ if(!istype(src,/mob/living/carbon/human))
+ O.loc = src
+ src.embedded += O
+ src.anchored = 1
+ src.pinned += O
+ else
+ src.anchored = 1
+ src.pinned += O
/mob/living/proc/near_wall(var/direction,var/distance=1)
var/turf/T = get_step(get_turf(src),direction)
+ var/turf/last_turf = src.loc
var/i = 1
+
while(i>0 && i<=distance)
if(T.density) //Turf is a wall!
- return 1
+ return last_turf
i++
+ last_turf = T
T = get_step(T,direction)
return 0
-
// End BS12 momentum-transfer code.
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm
new file mode 100644
index 0000000000..1d10956582
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/component.dm
@@ -0,0 +1,145 @@
+// TODO: remove the robot.mmi and robot.cell variables and completely rely on the robot component system
+
+/datum/robot_component/var/name
+/datum/robot_component/var/installed = 0
+/datum/robot_component/var/powered = 0
+/datum/robot_component/var/toggled = 1
+/datum/robot_component/var/brute_damage = 0
+/datum/robot_component/var/electronics_damage = 0
+/datum/robot_component/var/energy_consumption = 0
+/datum/robot_component/var/max_damage = 30
+/datum/robot_component/var/mob/living/silicon/robot/owner
+
+// The actual device object that has to be installed for this.
+/datum/robot_component/var/external_type = null
+
+// The wrapped device(e.g. radio), only set if external_type isn't null
+/datum/robot_component/var/obj/item/wrapped = null
+
+/datum/robot_component/New(mob/living/silicon/robot/R)
+ src.owner = R
+
+/datum/robot_component/proc/install()
+/datum/robot_component/proc/uninstall()
+
+/datum/robot_component/proc/destroy()
+ if(wrapped)
+ del wrapped
+
+
+ wrapped = new/obj/item/broken_device
+
+ // The thing itself isn't there anymore, but some fried remains are.
+ installed = -1
+ uninstall()
+
+/datum/robot_component/proc/take_damage(brute, electronics, sharp)
+ if(installed != 1) return
+
+ brute_damage += brute
+ electronics_damage += electronics
+
+ if(brute_damage + electronics_damage > max_damage) destroy()
+
+/datum/robot_component/proc/heal_damage(brute, electronics)
+ if(installed != 1)
+ // If it's not installed, can't repair it.
+ return 0
+
+ brute_damage = max(0, brute_damage - brute)
+ electronics_damage = max(0, electronics_damage - electronics)
+
+/datum/robot_component/proc/is_powered()
+ return installed == 1 && (!energy_consumption || powered)
+
+
+/datum/robot_component/proc/consume_power()
+ if(toggled == 0)
+ powered = 0
+ return
+ if(owner.cell.charge >= energy_consumption)
+ owner.cell.use(energy_consumption)
+ powered = 1
+ else
+ powered = 0
+
+
+/datum/robot_component/actuator
+ name = "actuator"
+ energy_consumption = 2
+ external_type = /obj/item/robot_parts/robot_component/actuator
+ max_damage = 60
+
+/datum/robot_component/cell
+ name = "power cell"
+ max_damage = 60
+
+/datum/robot_component/cell/destroy()
+ ..()
+ owner.cell = null
+
+/datum/robot_component/radio
+ name = "radio"
+ external_type = /obj/item/robot_parts/robot_component/radio
+ energy_consumption = 3
+ max_damage = 10
+
+/datum/robot_component/binary_communication
+ name = "binary communication device"
+ external_type = /obj/item/robot_parts/robot_component/binary_communication_device
+ energy_consumption = 0
+ max_damage = 30
+
+/datum/robot_component/camera
+ name = "camera"
+ external_type = /obj/item/robot_parts/robot_component/camera
+ energy_consumption = 2
+ max_damage = 20
+
+/datum/robot_component/diagnosis_unit
+ name = "self-diagnosis unit"
+ energy_consumption = 1
+ external_type = /obj/item/robot_parts/robot_component/diagnosis_unit
+ max_damage = 30
+
+/mob/living/silicon/robot/proc/initialize_components()
+ // This only initializes the components, it doesn't set them to installed.
+
+ components["actuator"] = new/datum/robot_component/actuator(src)
+ components["radio"] = new/datum/robot_component/radio(src)
+ components["power cell"] = new/datum/robot_component/cell(src)
+ components["diagnosis unit"] = new/datum/robot_component/diagnosis_unit(src)
+ components["camera"] = new/datum/robot_component/camera(src)
+ components["comms"] = new/datum/robot_component/binary_communication(src)
+
+/mob/living/silicon/robot/proc/is_component_functioning(module_name)
+ var/datum/robot_component/C = components[module_name]
+ return C && C.installed == 1 && C.toggled && C.is_powered()
+
+/obj/item/broken_device
+ name = "broken component"
+ icon = 'robot_component.dmi'
+ icon_state = "broken"
+
+/obj/item/robot_parts/robot_component
+ icon = 'robot_component.dmi'
+ icon_state = "working"
+ construction_time = 200
+ construction_cost = list("metal"=5000)
+
+
+// TODO: actual icons ;)
+/obj/item/robot_parts/robot_component/binary_communication_device
+ name = "binary communication device"
+
+/obj/item/robot_parts/robot_component/actuator
+ name = "actuator"
+
+/obj/item/robot_parts/robot_component/camera
+ name = "camera"
+
+/obj/item/robot_parts/robot_component/diagnosis_unit
+ name = "diagnosis unit"
+
+/obj/item/robot_parts/robot_component/radio
+ name = "radio"
diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm
index 4fa8a543b9..6b94c52c6d 100644
--- a/code/modules/mob/living/silicon/robot/emote.dm
+++ b/code/modules/mob/living/silicon/robot/emote.dm
@@ -10,7 +10,18 @@
switch(act)
if ("me")
- return custom_emote(m_type, message)
+ if (src.client)
+ if(client.prefs.muted & MUTE_IC)
+ src << "You cannot send IC messages (muted)."
+ return
+ if (src.client.handle_spam_prevention(message,MUTE_IC))
+ return
+ if (stat)
+ return
+ if(!(message))
+ return
+ else
+ return custom_emote(m_type, message)
if ("custom")
return custom_emote(m_type, message)
@@ -62,20 +73,6 @@
message = "[src] flaps his wings ANGRILY!"
m_type = 2
- if ("me")
- if (src.client)
- if(client.prefs.muted & MUTE_IC)
- src << "You cannot send IC messages (muted)."
- return
- if (src.client.handle_spam_prevention(message,MUTE_IC))
- return
- if (stat)
- return
- if(!(message))
- return
- else
- message = "[src] [message]"
-
if ("twitch")
message = "[src] twitches violently."
m_type = 1
@@ -207,8 +204,12 @@
m_type = 2
else
src << "You are not security."
+
+ if ("help")
+ src << "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitch_s, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look, beep, ping, \nbuzz, law, halt"
else
- src << text("Invalid Emote: []", act)
+ src << "\blue Unusable emote '[act]'. Say *help for a list."
+
if ((message && src.stat == 0))
if (m_type & 1)
for(var/mob/O in viewers(src, null))
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index a4d6cdc748..11d6bea91b 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -37,23 +37,25 @@
/mob/living/silicon/robot/proc/use_power()
- if (src.cell)
+ if (is_component_functioning("power cell"))
if(src.cell.charge <= 0)
uneq_all()
src.stat = 1
- else if (src.cell.charge <= 100)
- uneq_all()
- src.sight_mode = 0
- src.cell.use(1)
else
if(src.module_state_1)
- src.cell.use(5)
+ src.cell.use(3)
if(src.module_state_2)
- src.cell.use(5)
+ src.cell.use(3)
if(src.module_state_3)
- src.cell.use(5)
- src.cell.use(1)
- src.blinded = 0
+ src.cell.use(3)
+
+ for(var/V in components)
+ var/datum/robot_component/C = components[V]
+ C.consume_power()
+
+ if(!is_component_functioning("actuator"))
+ Paralyse(3)
+
src.stat = 0
else
uneq_all()
@@ -128,6 +130,17 @@
src.druggy--
src.druggy = max(0, src.druggy)
+ if(!is_component_functioning("radio"))
+ radio.on = 0
+ else
+ radio.on = 1
+
+ if(is_component_functioning("camera"))
+ src.blinded = 0
+ else
+ src.blinded = 1
+
+
return 1
/mob/living/silicon/robot/proc/handle_regular_hud_updates()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 0f87682cdf..2386e89978 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -27,6 +27,9 @@
var/obj/item/weapon/cell/cell = null
var/obj/machinery/camera/camera = null
+ // Components are basically robot organs.
+ var/list/components = list()
+
var/obj/item/device/mmi/mmi = null
var/obj/item/device/pda/ai/rbPDA = null
@@ -58,7 +61,7 @@
var/braintype = "Cyborg"
var/pose
-/mob/living/silicon/robot/New(loc,var/syndie = 0)
+/mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0)
spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
@@ -67,12 +70,10 @@
updatename("Default")
updateicon()
- if(!cell)
- cell = new /obj/item/weapon/cell(src)
- cell.maxcharge = 7500
- cell.charge = 7500
-
if(syndie)
+ if(!cell)
+ cell = new /obj/item/weapon/cell(src)
+
laws = new /datum/ai_laws/antimov()
lawupdate = 0
scrambledcodes = 1
@@ -99,6 +100,25 @@
camera.network = list("SS13")
if(isWireCut(5)) // 5 = BORG CAMERA
camera.status = 0
+
+ initialize_components()
+ if(!unfinished)
+ // Create all the robot parts.
+ for(var/V in components) if(V != "power cell")
+ var/datum/robot_component/C = components[V]
+ C.installed = 1
+ C.wrapped = new C.external_type
+
+ if(!cell)
+ cell = new /obj/item/weapon/cell(src)
+ cell.maxcharge = 7500
+ cell.charge = 7500
+
+ if(cell)
+ var/datum/robot_component/cell_component = components["power cell"]
+ cell_component.wrapped = cell
+ cell_component.installed = 1
+
..()
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
@@ -132,12 +152,21 @@
module = new /obj/item/weapon/robot_module/standard(src)
hands.icon_state = "standard"
var/icontype
- if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
- else icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Standard")
- switch(icontype)
- if("Basic") icon_state = "robot_old"
- if("Lucy") icon_state = "rowtree-lucy"
- else icon_state = "robot"
+ var/triesleft = 6
+ while (triesleft)
+ triesleft--
+ if (src.name == "Lucy" && src.ckey == "rowtree")
+ icontype = ("Lucy")
+ triesleft = 0
+ else icontype = input("Select an icon! [triesleft ? "You would have [triesleft] more tries." : "This is your last try."]", "Robot", null, null) in list("Basic", "Standard")
+ switch(icontype)
+ if("Basic") icon_state = "robot_old"
+ if("Lucy") icon_state = "rowtree-lucy"
+ else icon_state = "robot"
+ if(triesleft)
+ switch(input("Look at your icon - is this what you want?") in list("Yes","No"))
+ if("Yes")
+ triesleft = 0
modtype = "Stand"
feedback_inc("cyborg_standard",1)
@@ -146,15 +175,24 @@
module = new /obj/item/weapon/robot_module/butler(src)
hands.icon_state = "service"
var/icontype
- if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
- else icontype = input("Select an icon!", "Robot", null, null) in list("Waitress", "Bro", "Butler", "Kent", "Rich")
- switch(icontype)
- if("Waitress") icon_state = "Service"
- if("Kent") icon_state = "toiletbot"
- if("Bro") icon_state = "Brobot"
- if("Rich") icon_state = "maximillion"
- if("Lucy") icon_state = "rowtree-lucy"
- else icon_state = "Service2"
+ var/triesleft = 6
+ while (triesleft)
+ triesleft--
+ if (src.name == "Lucy" && src.ckey == "rowtree")
+ icontype = ("Lucy")
+ triesleft = 0
+ else icontype = input("Select an icon! [triesleft ? "You would have [triesleft] more tries." : "This is your last try."]", "Robot", null, null) in list("Waitress", "Bro", "Butler", "Kent", "Rich")
+ switch(icontype)
+ if("Waitress") icon_state = "Service"
+ if("Kent") icon_state = "toiletbot"
+ if("Bro") icon_state = "Brobot"
+ if("Rich") icon_state = "maximillion"
+ if("Lucy") icon_state = "rowtree-lucy"
+ else icon_state = "Service2"
+ if(triesleft)
+ switch(input("Look at your icon - is this what you want?") in list("Yes","No"))
+ if("Yes")
+ triesleft = 0
modtype = "Butler"
feedback_inc("cyborg_service",1)
@@ -163,13 +201,22 @@
module = new /obj/item/weapon/robot_module/miner(src)
hands.icon_state = "miner"
var/icontype
- if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
- else icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Advanced Droid", "Treadhead")
- switch(icontype)
- if("Basic") icon_state = "Miner_old"
- if("Advanced Droid") icon_state = "droid-miner"
- if("Lucy") icon_state = "rowtree-lucy"
- else icon_state = "Miner"
+ var/triesleft = 6
+ while (triesleft)
+ triesleft--
+ if (src.name == "Lucy" && src.ckey == "rowtree")
+ icontype = ("Lucy")
+ triesleft = 0
+ else icontype = input("Select an icon! [triesleft ? "You would have [triesleft] more tries." : "This is your last try."]", "Robot", null, null) in list("Basic", "Advanced Droid", "Treadhead")
+ switch(icontype)
+ if("Basic") icon_state = "Miner_old"
+ if("Advanced Droid") icon_state = "droid-miner"
+ if("Lucy") icon_state = "rowtree-lucy"
+ else icon_state = "Miner"
+ if(triesleft)
+ switch(input("Look at your icon - is this what you want?") in list("Yes","No"))
+ if("Yes")
+ triesleft = 0
modtype = "Miner"
feedback_inc("cyborg_miner",1)
channels = list("Mining" = 1)
@@ -179,14 +226,23 @@
module = new /obj/item/weapon/robot_module/medical(src)
hands.icon_state = "medical"
var/icontype
- if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
- else icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Advanced Droid", "Needles", "Hoverbot")
- switch(icontype)
- if("Basic") icon_state = "Medbot"
- if("Advanced Droid") icon_state = "droid-medical"
- if("Needles") icon_state = "medicalrobot"
- if("Lucy") icon_state = "rowtree-medical"
- else icon_state = "surgeon"
+ var/triesleft = 6
+ while (triesleft)
+ triesleft--
+ if (src.name == "Lucy" && src.ckey == "rowtree")
+ icontype = ("Lucy")
+ triesleft = 0
+ else icontype = input("Select an icon! [triesleft ? "You would have [triesleft] more tries." : "This is your last try."]", "Robot", null, null) in list("Basic", "Advanced Droid", "Needles", "Hoverbot")
+ switch(icontype)
+ if("Basic") icon_state = "Medbot"
+ if("Advanced Droid") icon_state = "droid-medical"
+ if("Needles") icon_state = "medicalrobot"
+ if("Lucy") icon_state = "rowtree-medical"
+ else icon_state = "surgeon"
+ if(triesleft)
+ switch(input("Look at your icon - is this what you want?") in list("Yes","No"))
+ if("Yes")
+ triesleft = 0
modtype = "Med"
status_flags &= ~CANPUSH
feedback_inc("cyborg_medical",1)
@@ -197,14 +253,23 @@
module = new /obj/item/weapon/robot_module/security(src)
hands.icon_state = "security"
var/icontype
- if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
- else icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Red Knight", "Black Knight", "Bloodhound")
- switch(icontype)
- if("Basic") icon_state = "secborg"
- if("Red Knight") icon_state = "Security"
- if("Black Knight") icon_state = "securityrobot"
- if("Lucy") icon_state = "rowtree-security"
- else icon_state = "bloodhound"
+ var/triesleft = 6
+ while (triesleft)
+ triesleft--
+ if (src.name == "Lucy" && src.ckey == "rowtree")
+ icontype = ("Lucy")
+ triesleft = 0
+ else icontype = input("Select an icon! [triesleft ? "You would have [triesleft] more tries." : "This is your last try."]", "Robot", null, null) in list("Basic", "Red Knight", "Black Knight", "Bloodhound")
+ switch(icontype)
+ if("Basic") icon_state = "secborg"
+ if("Red Knight") icon_state = "Security"
+ if("Black Knight") icon_state = "securityrobot"
+ if("Lucy") icon_state = "rowtree-security"
+ else icon_state = "bloodhound"
+ if(triesleft)
+ switch(input("Look at your icon - is this what you want?") in list("Yes","No"))
+ if("Yes")
+ triesleft = 0
modtype = "Sec"
//speed = -1 Secborgs have nerfed tasers now, so the speed boost is not necessary
status_flags &= ~CANPUSH
@@ -216,13 +281,22 @@
module = new /obj/item/weapon/robot_module/engineering(src)
hands.icon_state = "engineer"
var/icontype
- if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
- else icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Antique", "Landmate")
- switch(icontype)
- if("Basic") icon_state = "Engineering"
- if("Antique") icon_state = "engineerrobot"
- if("Lucy") icon_state = "rowtree-engineering"
- else icon_state = "landmate"
+ var/triesleft = 6
+ while (triesleft)
+ triesleft--
+ if (src.name == "Lucy" && src.ckey == "rowtree")
+ icontype = ("Lucy")
+ triesleft = 0
+ else icontype = input("Select an icon! [triesleft ? "You would have [triesleft] more tries." : "This is your last try."]", "Robot", null, null) in list("Basic", "Antique", "Landmate")
+ switch(icontype)
+ if("Basic") icon_state = "Engineering"
+ if("Antique") icon_state = "engineerrobot"
+ if("Lucy") icon_state = "rowtree-engineering"
+ else icon_state = "landmate"
+ if(triesleft)
+ switch(input("Look at your icon - is this what you want?") in list("Yes","No"))
+ if("Yes")
+ triesleft = 0
modtype = "Eng"
feedback_inc("cyborg_engineering",1)
channels = list("Engineering" = 1)
@@ -232,13 +306,22 @@
module = new /obj/item/weapon/robot_module/janitor(src)
hands.icon_state = "janitor"
var/icontype
- if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
- else icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Mopbot", "Zamboni")
- switch(icontype)
- if("Basic") icon_state = "JanBot2"
- if("Mopbot") icon_state = "janitorrobot"
- if("Lucy") icon_state = "rowtree-lucy"
- else icon_state = "mopgearrex"
+ var/triesleft = 6
+ while (triesleft)
+ triesleft--
+ if (src.name == "Lucy" && src.ckey == "rowtree")
+ icontype = ("Lucy")
+ triesleft = 0
+ else icontype = input("Select an icon! [triesleft ? "You would have [triesleft] more tries." : "This is your last try."]", "Robot", null, null) in list("Basic", "Mopbot", "Zamboni")
+ switch(icontype)
+ if("Basic") icon_state = "JanBot2"
+ if("Mopbot") icon_state = "janitorrobot"
+ if("Lucy") icon_state = "rowtree-lucy"
+ else icon_state = "mopgearrex"
+ if(triesleft)
+ switch(input("Look at your icon - is this what you want?") in list("Yes","No"))
+ if("Yes")
+ triesleft = 0
modtype = "Jan"
feedback_inc("cyborg_janitor",1)
@@ -262,10 +345,14 @@
changed_name = "[(prefix ? "[prefix] " : "")][braintype]-[num2text(ident)]"
real_name = changed_name
name = real_name
-
+
// if we've changed our name, we also need to update the display name for our PDA
setup_PDA()
+ //We also need to update name of internal camera.
+ if (camera)
+ camera.c_tag = changed_name
+
/mob/living/silicon/robot/verb/Namepick()
if(custom_name)
return 0
@@ -314,6 +401,53 @@
viewalerts = 1
src << browse(dat, "window=robotalerts&can_close=0")
+/mob/living/silicon/robot/proc/self_diagnosis()
+ if(!is_component_functioning("diagnosis unit"))
+ return null
+
+ var/dat = "[src.name] Self-Diagnosis Report\n"
+ for (var/V in components)
+ var/datum/robot_component/C = components[V]
+ dat += "[C.name]
| Power consumption | [C.energy_consumption] |
| Brute Damage: | [C.brute_damage] |
| Electronics Damage: | [C.electronics_damage] |
| Powered: | [(!C.energy_consumption || C.is_powered()) ? "Yes" : "No"] |
| Toggled: | [ C.toggled ? "Yes" : "No"] |
"
+
+ return dat
+
+
+/mob/living/silicon/robot/verb/self_diagnosis_verb()
+ set category = "Robot Commands"
+ set name = "Self Diagnosis"
+
+ if(!is_component_functioning("diagnosis unit"))
+ src << "\red Your self-diagnosis component isn't functioning."
+
+ var/dat = self_diagnosis()
+ src << browse(dat, "window=robotdiagnosis")
+
+
+/mob/living/silicon/robot/verb/toggle_component()
+ set category = "Robot Commands"
+ set name = "Toggle Component"
+ set desc = "Toggle a component, conserving power."
+
+ var/list/installed_components = list()
+ for(var/V in components)
+ if(V == "power cell") continue
+ var/datum/robot_component/C = components[V]
+ if(C.installed)
+ installed_components += V
+
+ var/toggle = input(src, "Which component do you want to toggle?", "Toggle Component") as null|anything in installed_components
+ if(!toggle)
+ return
+
+ var/datum/robot_component/C = components[toggle]
+ if(C.toggled)
+ C.toggled = 0
+ src << "\red You disable [C.name]."
+ else
+ C.toggled = 1
+ src << "\red You enable [C.name]."
+
/mob/living/silicon/robot/blob_act()
if (stat != 2)
adjustBruteLoss(60)
@@ -497,7 +631,24 @@
if (istype(W, /obj/item/weapon/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
return
+ if(opened) // Are they trying to insert something?
+ for(var/V in components)
+ var/datum/robot_component/C = components[V]
+ if(!C.installed && istype(W, C.external_type))
+ C.installed = 1
+ C.wrapped = W
+ C.install()
+ user.drop_item()
+ W.loc = null
+
+ usr << "\blue You install the [W.name]."
+
+ return
+
if (istype(W, /obj/item/weapon/weldingtool))
+ if (!getBruteLoss())
+ user << "Nothing to fix here!"
+ return
var/obj/item/weapon/weldingtool/WT = W
if (WT.remove_fuel(0))
adjustBruteLoss(-30)
@@ -510,6 +661,9 @@
return
else if(istype(W, /obj/item/weapon/cable_coil) && wiresexposed)
+ if (!getFireLoss())
+ user << "Nothing to fix here!"
+ return
var/obj/item/weapon/cable_coil/coil = W
adjustFireLoss(-30)
updatehealth()
@@ -536,6 +690,27 @@
C.updateicon()
new/obj/item/robot_parts/chest(loc)
src.Del()
+ else
+ // Okay we're not removing the cell or an MMI, but maybe something else?
+ var/list/removable_components = list()
+ for(var/V in components)
+ if(V == "power cell") continue
+ var/datum/robot_component/C = components[V]
+ if(C.installed == 1)
+ removable_components += V
+
+ var/remove = input(user, "Which component do you want to pry out?", "Remove Component") as null|anything in removable_components
+ if(!remove)
+ return
+ var/datum/robot_component/C = components[remove]
+ var/obj/item/I = C.wrapped
+ user << "You remove \the [I]."
+ I.loc = src.loc
+
+ if(C.installed == 1)
+ C.uninstall()
+ C.installed = 0
+
else
if(locked)
user << "The cover is locked and cannot be opened."
@@ -545,17 +720,20 @@
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."
- else if(cell)
+ else if(cell || C.installed)
user << "There is a power cell already installed."
else
user.drop_item()
W.loc = src
cell = W
user << "You insert the power cell."
-// chargecount = 0
- updateicon()
+
+ C.installed = 1
+ C.wrapped = W
+ C.install()
else if (istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool))
if (wiresexposed)
@@ -828,6 +1006,7 @@
add_fingerprint(user)
if(opened && !wiresexposed && (!istype(user, /mob/living/silicon)))
+ var/datum/robot_component/cell_component = components["power cell"]
if(cell)
cell.updateicon()
cell.add_fingerprint(user)
@@ -835,6 +1014,11 @@
user << "You remove \the [cell]."
cell = null
updateicon()
+ else if(cell_component.installed == -1)
+ cell_component.installed = 0
+ var/obj/item/broken_device = cell_component.wrapped
+ user << "You remove \the [broken_device]."
+ user.put_in_active_hand(broken_device)
if(ishuman(user))
if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining)
diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm
new file mode 100644
index 0000000000..97ee049fe9
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/robot_damage.dm
@@ -0,0 +1,83 @@
+/mob/living/silicon/robot/getBruteLoss()
+ var/amount = 0
+ for(var/V in components)
+ var/datum/robot_component/C = components[V]
+ if(C.installed == 1) amount += C.brute_damage
+ return amount
+
+/mob/living/silicon/robot/getFireLoss()
+ var/amount = 0
+ for(var/V in components)
+ var/datum/robot_component/C = components[V]
+ if(C.installed == 1) amount += C.electronics_damage
+ return amount
+
+
+/mob/living/silicon/robot/adjustBruteLoss(var/amount)
+ if(amount > 0)
+ take_overall_damage(amount, 0)
+ else
+ heal_overall_damage(-amount, 0)
+
+/mob/living/silicon/robot/adjustFireLoss(var/amount)
+ if(amount > 0)
+ take_overall_damage(0, amount)
+ else
+ heal_overall_damage(0, -amount)
+
+/mob/living/silicon/robot/proc/get_damaged_components(var/brute, var/burn)
+ var/list/datum/robot_component/parts = list()
+ for(var/V in components)
+ var/datum/robot_component/C = components[V]
+ if(C.installed == 1) if((brute && C.brute_damage) || (burn && C.electronics_damage))
+ parts += C
+ return parts
+
+/mob/living/silicon/robot/proc/get_damageable_components()
+ var/list/rval = new
+ for(var/V in components)
+ var/datum/robot_component/C = components[V]
+ if(C.installed == 1) rval += C
+ return rval
+
+/mob/living/silicon/robot/heal_organ_damage(var/brute, var/burn)
+ var/list/datum/robot_component/parts = get_damaged_components(brute,burn)
+ if(!parts.len) return
+ var/datum/robot_component/picked = pick(parts)
+ picked.heal_damage(brute,burn)
+
+/mob/living/silicon/robot/take_organ_damage(var/brute, var/burn, var/sharp = 0)
+ var/datum/robot_component/C = pick(get_damageable_components())
+ C.take_damage(brute,burn,sharp)
+
+/mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn)
+ var/list/datum/robot_component/parts = get_damaged_components(brute,burn)
+
+ while(parts.len && (brute>0 || burn>0) )
+ var/datum/robot_component/picked = pick(parts)
+
+ var/brute_was = picked.brute_damage
+ var/burn_was = picked.electronics_damage
+
+ picked.heal_damage(brute,burn)
+
+ brute -= (brute_was-picked.brute_damage)
+ burn -= (burn_was-picked.electronics_damage)
+
+ parts -= picked
+
+/mob/living/silicon/robot/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/used_weapon = null)
+ if(status_flags & GODMODE) return //godmode
+ var/list/datum/robot_component/parts = get_damageable_components()
+ while(parts.len && (brute>0 || burn>0) )
+ var/datum/robot_component/picked = pick(parts)
+
+ var/brute_was = picked.brute_damage
+ var/burn_was = picked.electronics_damage
+
+ picked.take_damage(brute,burn)
+
+ brute -= (picked.brute_damage - brute_was)
+ burn -= (picked.electronics_damage - burn_was)
+
+ parts -= picked
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 81a85f7a5d..6ef24637b9 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -24,6 +24,14 @@
return ..(message)
message = copytext(message, 3)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
+
+ // TODO: move the component system up to silicon so we don't have to use this ugly hack..
+ if(istype(src, /mob/living/silicon/robot))
+ var/mob/living/silicon/robot/R = src
+ if(!R.is_component_functioning("comms"))
+ src << "\red Your binary communications component isn't functional."
+ return
+
robot_talk(message)
else if (department_radio_keys[prefix] == "department")
if(isAI(src)&&client)//For patching directly into AI holopads.
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 02ea1aa4e7..69bce4a401 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -596,7 +596,6 @@ var/list/slot_equipment_priority = list( \
M.LAssailant = null
else
M.LAssailant = usr
- return
if(pulling)
var/pulling_old = pulling
@@ -604,6 +603,7 @@ var/list/slot_equipment_priority = list( \
// Are we pulling the same thing twice? Just stop pulling.
if(pulling_old == AM)
return
+
src.pulling = AM
AM.pulledby = src
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 36cf966566..44b11436c2 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -431,6 +431,19 @@ datum/preferences
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-vir"), ICON_OVERLAY)
if(4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
+ if(ROBOTICIST)
+ clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "toolbox_blue"), ICON_OVERLAY)
+ clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
else if(job_engsec_high)
switch(job_engsec_high)
@@ -538,19 +551,7 @@ datum/preferences
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
- if(ROBOTICIST)
- clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
- clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
- clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "toolbox_blue"), ICON_OVERLAY)
- clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
- switch(backbag)
- if(2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
- if(4)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
+
if(AI)//Gives AI and borgs assistant-wear, so they can still customize their character
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 5e1fba994c..427e67a97e 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -35,6 +35,7 @@
var/open = 0
var/stage = 0
var/cavity = 0
+ var/sabotaged = 0 //If a prosthetic limb is emagged, it will detonate when it fails.
var/obj/item/hidden = null
var/list/implants = list()
@@ -482,8 +483,8 @@
owner.u_equip(owner.shoes)
if(organ)
destspawn = 1
- //Robotic limbs explode until specified otherwise
- if(status & ORGAN_ROBOT && !no_explode)
+ //Robotic limbs explode if sabotaged.
+ if(status & ORGAN_ROBOT && !no_explode && sabotaged)
owner.visible_message("\red \The [owner]'s [display_name] explodes violently!",\
"\red Your [display_name] explodes!",\
"You hear an explosion followed by a scream!")
@@ -494,10 +495,10 @@
spark_system.start()
spawn(10)
del(spark_system)
- else
- owner.visible_message("\red [owner.name]'s [display_name] flies off in an arc.",\
- "Your [display_name] goes flying off!",\
- "You hear a terrible sound of ripping tendons and flesh.")
+
+ owner.visible_message("\red [owner.name]'s [display_name] flies off in an arc.",\
+ "Your [display_name] goes flying off!",\
+ "You hear a terrible sound of ripping tendons and flesh.")
//Throw organs around
var/lol = pick(cardinal)
@@ -590,8 +591,8 @@
name = "chest"
icon_name = "torso"
display_name = "chest"
- max_damage = 150
- min_broken_damage = 75
+ max_damage = 75
+ min_broken_damage = 40
body_part = UPPER_TORSO
@@ -599,24 +600,24 @@
name = "groin"
icon_name = "groin"
display_name = "groin"
- max_damage = 115
- min_broken_damage = 70
+ max_damage = 50
+ min_broken_damage = 30
body_part = LOWER_TORSO
/datum/organ/external/l_arm
name = "l_arm"
display_name = "left arm"
icon_name = "l_arm"
- max_damage = 75
- min_broken_damage = 30
+ max_damage = 50
+ min_broken_damage = 20
body_part = ARM_LEFT
/datum/organ/external/l_leg
name = "l_leg"
display_name = "left leg"
icon_name = "l_leg"
- max_damage = 75
- min_broken_damage = 30
+ max_damage = 50
+ min_broken_damage = 20
body_part = LEG_LEFT
icon_position = LEFT
@@ -624,16 +625,16 @@
name = "r_arm"
display_name = "right arm"
icon_name = "r_arm"
- max_damage = 75
- min_broken_damage = 30
+ max_damage = 50
+ min_broken_damage = 20
body_part = ARM_RIGHT
/datum/organ/external/r_leg
name = "r_leg"
display_name = "right leg"
icon_name = "r_leg"
- max_damage = 75
- min_broken_damage = 30
+ max_damage = 50
+ min_broken_damage = 20
body_part = LEG_RIGHT
icon_position = RIGHT
@@ -641,7 +642,7 @@
name = "l_foot"
display_name = "left foot"
icon_name = "l_foot"
- max_damage = 40
+ max_damage = 30
min_broken_damage = 15
body_part = FOOT_LEFT
icon_position = LEFT
@@ -650,7 +651,7 @@
name = "r_foot"
display_name = "right foot"
icon_name = "r_foot"
- max_damage = 40
+ max_damage = 30
min_broken_damage = 15
body_part = FOOT_RIGHT
icon_position = RIGHT
@@ -659,7 +660,7 @@
name = "r_hand"
display_name = "right hand"
icon_name = "r_hand"
- max_damage = 40
+ max_damage = 30
min_broken_damage = 15
body_part = HAND_RIGHT
@@ -667,7 +668,7 @@
name = "l_hand"
display_name = "left hand"
icon_name = "l_hand"
- max_damage = 40
+ max_damage = 30
min_broken_damage = 15
body_part = HAND_LEFT
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 2be8b7717a..5a73da279d 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -461,6 +461,8 @@ var/list/solars_list = list()
if(src.trackrate) nexttime = world.time + 6000/trackrate
track = text2num(href_list["track"])
if(powernet && (track == 2))
+ if(!solars_list.Find(src,1,0))
+ solars_list.Add(src)
for(var/obj/machinery/power/tracker/T in get_solars_powernet())
if(powernet.nodes[T])
cdir = T.sun_angle
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 67ccb1db81..81dceaf7eb 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -2792,7 +2792,7 @@ datum
// make all the beverages work together
for(var/datum/reagent/ethanol/A in holder.reagent_list)
- if(A.data) d += A.data
+ if(isnum(A.data)) d += A.data
M.dizziness +=dizzy_adj.
if(d >= slur_start && d < pass_out)
@@ -3453,14 +3453,14 @@ datum
nutriment_factor = 1 * FOOD_METABOLISM
color = "#2E6671" // rgb: 46, 102, 113
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=10
- if(data >= 55 && data <115)
- if (!M.stuttering) M.stuttering = 1
- M.stuttering += 10
- else if(data >= 115 && prob(33))
- M.confused = max(M.confused+15,15)
- ..()
- return
\ No newline at end of file
+ on_mob_life(var/mob/living/M as mob)
+ if(!data) data = 1
+ data++
+ M.dizziness +=10
+ if(data >= 55 && data <115)
+ if (!M.stuttering) M.stuttering = 1
+ M.stuttering += 10
+ else if(data >= 115 && prob(33))
+ M.confused = max(M.confused+15,15)
+ ..()
+ return
diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm
index 66870184fa..dfa67cdef2 100644
--- a/code/modules/reagents/reagent_containers/food/drinks.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks.dm
@@ -203,7 +203,7 @@
/obj/item/weapon/reagent_containers/food/drinks/tea
name = "Duke Purple Tea"
desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea."
- icon_state = "tea"
+ icon_state = "teacup"
item_state = "coffee"
New()
..()
@@ -224,7 +224,7 @@
/obj/item/weapon/reagent_containers/food/drinks/h_chocolate
name = "Dutch Hot Coco"
desc = "Made in Space South America."
- icon_state = "tea"
+ icon_state = "hot_coco"
item_state = "coffee"
New()
..()
diff --git a/code/modules/reagents/syringe_gun.dm b/code/modules/reagents/syringe_gun.dm
index eaa372bd45..2bb818c373 100644
--- a/code/modules/reagents/syringe_gun.dm
+++ b/code/modules/reagents/syringe_gun.dm
@@ -128,4 +128,279 @@
New()
var/datum/reagents/R = new/datum/reagents(15)
reagents = R
- R.my_atom = src
\ No newline at end of file
+ R.my_atom = src
+
+/obj/item/weapon/dart_cartridge
+ name = "dart cartridge"
+ desc = "A rack of hollow darts."
+ icon = 'icons/obj/ammo.dmi'
+ icon_state = "darts-5"
+ item_state = "rcdammo"
+ opacity = 0
+ density = 0
+ anchored = 0.0
+ origin_tech = "materials=2"
+ var/darts = 5
+
+/obj/item/weapon/dart_cartridge/update_icon()
+ if(!darts)
+ icon_state = "darts-0"
+ else if(darts > 5)
+ icon_state = "darts-5"
+ else
+ icon_state = "darts-[darts]"
+ return 1
+
+/obj/item/weapon/gun/dartgun
+ name = "dart gun"
+ desc = "A small gas-powered dartgun, capable of delivering chemical cocktails swiftly across short distances."
+ icon_state = "dartgun-empty"
+
+ var/list/beakers = list() //All containers inside the gun.
+ var/list/mixing = list() //Containers being used for mixing.
+ var/obj/item/weapon/dart_cartridge/cartridge = null //Container of darts.
+ var/max_beakers = 3
+
+/obj/item/weapon/gun/dartgun/update_icon()
+
+ if(!cartridge)
+ icon_state = "dartgun-empty"
+ return 1
+
+ if(!cartridge.darts)
+ icon_state = "dartgun-0"
+ else if(cartridge.darts > 5)
+ icon_state = "dartgun-5"
+ else
+ icon_state = "dartgun-[cartridge.darts]"
+ return 1
+
+/obj/item/weapon/gun/dartgun/New()
+
+ if(beakers.len)
+ return
+
+ // The dartgun has one beaker by default.
+ var/obj/item/weapon/reagent_containers/glass/beaker/B = new(src)
+ beakers += B
+
+ ..()
+
+/obj/item/weapon/gun/dartgun/examine()
+ set src in view()
+ update_icon()
+ ..()
+ if (!(usr in view(2)) && usr!=src.loc)
+ return
+ if (beakers.len)
+ usr << "\blue [src] contains:"
+ for(var/obj/item/weapon/reagent_containers/glass/beaker/B in beakers)
+ if(B.reagents && B.reagents.reagent_list.len)
+ for(var/datum/reagent/R in B.reagents.reagent_list)
+ usr << "\blue [R.volume] units of [R.name]"
+
+/obj/item/weapon/gun/dartgun/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I, /obj/item/weapon/dart_cartridge))
+
+ var/obj/item/weapon/dart_cartridge/D = I
+
+ if(!D.darts)
+ user << "\blue [D] is empty."
+ return 0
+
+ if(cartridge)
+ if(cartridge.darts <= 0)
+ src.remove_cartridge()
+ else
+ user << "\blue There's already a cartridge in [src]."
+ return 0
+
+ user.drop_item()
+ cartridge = D
+ D.loc = src
+ user << "\blue You slot [D] into [src]."
+ update_icon()
+ return
+ if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker))
+ if(beakers.len >= max_beakers)
+ user << "\blue [src] already has [max_beakers] beakers in it - another one isn't going to fit!"
+ return
+ var/obj/item/weapon/reagent_containers/glass/beaker/B = I
+ user.drop_item()
+ B.loc = src
+ beakers += B
+ user << "\blue You slot [B] into [src]."
+ src.updateUsrDialog()
+
+/obj/item/weapon/gun/dartgun/can_fire()
+ if(!cartridge)
+ return 0
+ else
+ return cartridge.darts
+
+/obj/item/weapon/gun/dartgun/proc/has_selected_beaker_reagents()
+ return 0
+
+/obj/item/weapon/gun/dartgun/proc/remove_cartridge()
+ if(cartridge)
+ usr << "\blue You pop the cartridge out of [src]."
+ var/obj/item/weapon/dart_cartridge/C = cartridge
+ C.loc = get_turf(src)
+ C.update_icon()
+ cartridge = null
+ src.update_icon()
+
+/obj/item/weapon/gun/dartgun/proc/get_mixed_syringe()
+ if (!cartridge)
+ return 0
+ if(!cartridge.darts)
+ return 0
+
+ var/obj/item/weapon/reagent_containers/syringe/dart = new(src)
+
+ if(mixing.len)
+ var/mix_amount = 10/mixing.len
+ for(var/obj/item/weapon/reagent_containers/glass/beaker/B in mixing)
+ B.reagents.trans_to(dart,mix_amount)
+
+ return dart
+
+/obj/item/weapon/gun/dartgun/proc/fire_dart(atom/target, mob/user)
+ if (locate (/obj/structure/table, src.loc))
+ return
+ else
+ var/turf/trg = get_turf(target)
+ var/obj/effect/syringe_gun_dummy/D = new/obj/effect/syringe_gun_dummy(get_turf(src))
+ var/obj/item/weapon/reagent_containers/syringe/S = get_mixed_syringe()
+ if(!S)
+ user << "\red There are no darts in [src]!"
+ return
+ if(!S.reagents)
+ user << "\red There are no reagents available!"
+ return
+ cartridge.darts--
+ src.update_icon()
+ S.reagents.trans_to(D, S.reagents.total_volume)
+ del(S)
+ D.icon_state = "syringeproj"
+ D.name = "syringe"
+ playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
+
+ for(var/i=0, i<6, i++)
+ if(!D) break
+ if(D.loc == trg) break
+ step_towards(D,trg)
+
+ if(D)
+ for(var/mob/living/carbon/M in D.loc)
+ if(!istype(M,/mob/living/carbon)) continue
+ if(M == user) continue
+ //Syringe gun attack logging by Yvarov
+ var/R
+ if(D.reagents)
+ for(var/datum/reagent/A in D.reagents.reagent_list)
+ R += A.id + " ("
+ R += num2text(A.volume) + "),"
+ if (istype(M, /mob))
+ M.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])"
+ user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])"
+ log_attack("[user] ([user.ckey]) shot [M] ([M.ckey]) with a syringegun ([R])")
+
+ else
+ M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a syringegun ([R])"
+ log_attack("UNKNOWN shot [M] ([M.ckey]) with a syringegun ([R])")
+
+ if(D.reagents)
+ D.reagents.trans_to(M, 15)
+ M << "You feel a slight prick."
+
+ del(D)
+ break
+ if(D)
+ for(var/atom/A in D.loc)
+ if(A == user) continue
+ if(A.density) del(D)
+
+ sleep(1)
+
+ if (D) spawn(10) del(D)
+
+ return
+
+/obj/item/weapon/gun/dartgun/afterattack(obj/target, mob/user , flag)
+ if(!isturf(target.loc) || target == user) return
+ ..()
+
+/obj/item/weapon/gun/dartgun/can_hit(var/mob/living/target as mob, var/mob/living/user as mob)
+ return 1
+
+/obj/item/weapon/gun/dartgun/attack_self(user as mob)
+ var/dat = "[src] mixing control:
"
+
+ if (beakers.len)
+ var/i = 1
+ for(var/obj/item/weapon/reagent_containers/glass/beaker/B in beakers)
+ dat += "Beaker [i] contains: "
+ if(B.reagents && B.reagents.reagent_list.len)
+ for(var/datum/reagent/R in B.reagents.reagent_list)
+ dat += "
[R.volume] units of [R.name], "
+ if (check_beaker_mixing(B))
+ dat += text("Mixing ")
+ else
+ dat += text("Not mixing ")
+ else
+ dat += "nothing."
+ dat += " \[Eject\]
"
+ i++
+ else
+ dat += "There are no beakers inserted!
"
+
+ if(cartridge)
+ if(cartridge.darts)
+ dat += "The dart cartridge has [cartridge.darts] shots remaining."
+ else
+ dat += "The dart cartridge is empty!"
+ dat += " \[Eject\]"
+
+ user << browse("[dat]", "window=dartgun_mixing_window")
+
+/obj/item/weapon/gun/dartgun/proc/check_beaker_mixing(var/obj/item/B)
+ if(!mixing || !beakers)
+ return 0
+ for(var/obj/item/M in mixing)
+ if(M == B)
+ return 1
+ return 0
+
+/obj/item/weapon/gun/dartgun/Topic(href, href_list)
+ src.add_fingerprint(usr)
+ if(href_list["stop_mix"])
+ var/index = text2num(href_list["stop_mix"])
+ if(index <= beakers.len)
+ for(var/obj/item/M in mixing)
+ if(M == beakers[index])
+ mixing -= M
+ break
+ else if (href_list["mix"])
+ var/index = text2num(href_list["mix"])
+ if(index <= beakers.len)
+ mixing += beakers[index]
+ else if (href_list["eject"])
+ var/index = text2num(href_list["eject"])
+ if(index <= beakers.len)
+ if(beakers[index])
+ var/obj/item/weapon/reagent_containers/glass/beaker/B = beakers[index]
+ usr << "You remove [B] from [src]."
+ mixing -= B
+ beakers -= B
+ B.loc = get_turf(src)
+ else if (href_list["eject_cart"])
+ remove_cartridge()
+ src.updateUsrDialog()
+ return
+
+/obj/item/weapon/gun/dartgun/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0)
+ if(cartridge)
+ spawn(0) fire_dart(target,user)
+ else
+ usr << "\red [src] is empty."
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/machinery/analysis_accelerator.dm b/code/modules/research/xenoarchaeology/machinery/analysis_accelerator.dm
index 0a618dc8ba..74ac904dc9 100644
--- a/code/modules/research/xenoarchaeology/machinery/analysis_accelerator.dm
+++ b/code/modules/research/xenoarchaeology/machinery/analysis_accelerator.dm
@@ -1,4 +1,6 @@
+// This machine shows the age for extremely old finds
+
obj/machinery/anomaly/accelerator
name = "Accelerator spectrometer"
diff --git a/code/modules/research/xenoarchaeology/machinery/analysis_base.dm b/code/modules/research/xenoarchaeology/machinery/analysis_base.dm
index 558b354a5d..a462bd98fa 100644
--- a/code/modules/research/xenoarchaeology/machinery/analysis_base.dm
+++ b/code/modules/research/xenoarchaeology/machinery/analysis_base.dm
@@ -23,7 +23,7 @@
var/obj/item/weapon/reagent_containers/glass/held_container
var/obj/item/weapon/tank/fuel_container
- var/target_scan_ticks = 60
+ var/target_scan_ticks = 30
var/report_num = 0
var/scan_process = 0
var/temperature = 273 //measured in kelvin, if this exceeds 1200, the machine is damaged and requires repairs
@@ -50,8 +50,10 @@
if(scan_process)
if(scan_process++ > target_scan_ticks)
FinishScan()
-
- if(temperature > 350 && prob(10))
+ else if(temperature > 400)
+ src.visible_message("\blue \icon[src] shuts down from the heat!", 2)
+ scan_process = 0
+ else if(temperature > 350 && prob(10))
src.visible_message("\blue \icon[src] bleets plaintively.", 2)
if(temperature > 400)
scan_process = 0
@@ -107,7 +109,7 @@
user.machine = src
var/dat = "[src.name]
"
dat += "Module heat level: [temperature] kelvin
"
- dat += "Safeties set at 300k, shielding failure at 400k. Failure to maintain safe heat levels may result in equipment damage.
"
+ dat += "Safeties set at 350k, shielding failure at 400k. Failure to maintain safe heat levels may result in equipment damage.
"
dat += "
"
if(scan_process)
dat += "Scan in progress
"
@@ -178,7 +180,7 @@ obj/machinery/anomaly/Topic(href, href_list)
fuel_container.loc = src.loc
fuel_container = null
if(href_list["begin"])
- if(temperature >= 300)
+ if(temperature >= 350)
var/proceed = input("Unsafe internal temperature detected, enter YES below to continue.","Warning")
if(proceed == "YES" && get_dist(src, usr) <= 1)
scan_process = 1
diff --git a/code/modules/research/xenoarchaeology/machinery/analysis_fourier_transform.dm b/code/modules/research/xenoarchaeology/machinery/analysis_fourier_transform.dm
index d8f45ae6d8..98c49b2372 100644
--- a/code/modules/research/xenoarchaeology/machinery/analysis_fourier_transform.dm
+++ b/code/modules/research/xenoarchaeology/machinery/analysis_fourier_transform.dm
@@ -1,4 +1,6 @@
+// This machine tells the distance to a nearby artifact, if there is one
+
obj/machinery/anomaly/fourier_transform
name = "Fourier Transform spectroscope"
diff --git a/code/modules/research/xenoarchaeology/machinery/analysis_gas_chromatography.dm b/code/modules/research/xenoarchaeology/machinery/analysis_gas_chromatography.dm
index 79bc546b7c..bd6dbeb9b3 100644
--- a/code/modules/research/xenoarchaeology/machinery/analysis_gas_chromatography.dm
+++ b/code/modules/research/xenoarchaeology/machinery/analysis_gas_chromatography.dm
@@ -1,4 +1,6 @@
+// This machine shows the materials that are present
+
obj/machinery/anomaly/gas_chromatography
name = "Gas Chromatography spectrometer"
diff --git a/code/modules/research/xenoarchaeology/machinery/analysis_ion_mobility.dm b/code/modules/research/xenoarchaeology/machinery/analysis_ion_mobility.dm
index cdc388d7c8..70fde828df 100644
--- a/code/modules/research/xenoarchaeology/machinery/analysis_ion_mobility.dm
+++ b/code/modules/research/xenoarchaeology/machinery/analysis_ion_mobility.dm
@@ -1,4 +1,6 @@
+// This machine shows the amount of a certain material that is present
+
obj/machinery/anomaly/ion_mobility
name = "Ion Mobility Spectrometer"
desc = "A specialised, complex analysis machine."
diff --git a/code/modules/research/xenoarchaeology/machinery/analysis_isotope_ratio.dm b/code/modules/research/xenoarchaeology/machinery/analysis_isotope_ratio.dm
index 57e2684080..604015d31c 100644
--- a/code/modules/research/xenoarchaeology/machinery/analysis_isotope_ratio.dm
+++ b/code/modules/research/xenoarchaeology/machinery/analysis_isotope_ratio.dm
@@ -1,4 +1,6 @@
+// This machine shows the age for newer finds
+
obj/machinery/anomaly/isotope_ratio
name = "Isotope ratio spectrometer"
desc = "A specialised, complex analysis machine."
diff --git a/code/modules/research/xenoarchaeology/misc.dm b/code/modules/research/xenoarchaeology/misc.dm
index fd2f506330..72cee56e2c 100644
--- a/code/modules/research/xenoarchaeology/misc.dm
+++ b/code/modules/research/xenoarchaeology/misc.dm
@@ -100,6 +100,7 @@
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)
return
//---- Isolation room air alarms
diff --git a/code/modules/research/xenoarchaeology/tools/gearbelt.dm b/code/modules/research/xenoarchaeology/tools/gearbelt.dm
index f86e7d3dd1..e2d4839d2b 100644
--- a/code/modules/research/xenoarchaeology/tools/gearbelt.dm
+++ b/code/modules/research/xenoarchaeology/tools/gearbelt.dm
@@ -24,4 +24,5 @@
"/obj/item/weapon/anodevice",
"/obj/item/clothing/glasses",
"/obj/item/weapon/wrench",
+ "/obj/item/weapon/storage/box/excavation",
"/obj/item/weapon/anobattery")
diff --git a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm
index 0eeb52d533..1ad3d233b8 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm
@@ -85,6 +85,7 @@
dat += "Anomaly depth: [current.depth] cm
"
dat += "Clearance above anomaly depth: [current.clearance] cm
"
dat += "Dissonance spread: [current.dissonance_spread]
"
+ dat += "Anomaly material: [current.material]
"
dat += "clear entry
"
else
dat += "Select an entry from the list
"
diff --git a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
index ebb73a47d6..31b6026981 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
@@ -7,7 +7,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick_brush"
item_state = "syringe_0"
- digspeed = 50
+ digspeed = 20
desc = "Thick metallic wires for clearing away dust and loose scree (1 centimetre excavation depth)."
excavation_amount = 0.5
drill_sound = 'sound/weapons/thudswoosh.ogg'
@@ -19,7 +19,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick1"
item_state = "syringe_0"
- digspeed = 50
+ digspeed = 20
desc = "A miniature excavation tool for precise digging (2 centimetre excavation depth)."
excavation_amount = 1
drill_sound = 'sound/items/Screwdriver.ogg'
@@ -31,7 +31,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick2"
item_state = "syringe_0"
- digspeed = 50
+ digspeed = 20
desc = "A miniature excavation tool for precise digging (4 centimetre excavation depth)."
excavation_amount = 2
drill_sound = 'sound/items/Screwdriver.ogg'
@@ -43,7 +43,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick3"
item_state = "syringe_0"
- digspeed = 50
+ digspeed = 20
desc = "A miniature excavation tool for precise digging (6 centimetre excavation depth)."
excavation_amount = 3
drill_sound = 'sound/items/Screwdriver.ogg'
@@ -55,7 +55,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick4"
item_state = "syringe_0"
- digspeed = 50
+ digspeed = 20
desc = "A miniature excavation tool for precise digging (8 centimetre excavation depth)."
excavation_amount = 4
drill_sound = 'sound/items/Screwdriver.ogg'
@@ -67,7 +67,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick5"
item_state = "syringe_0"
- digspeed = 50
+ digspeed = 20
desc = "A miniature excavation tool for precise digging (10 centimetre excavation depth)."
excavation_amount = 5
drill_sound = 'sound/items/Screwdriver.ogg'
@@ -79,7 +79,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick6"
item_state = "syringe_0"
- digspeed = 50
+ digspeed = 20
desc = "A miniature excavation tool for precise digging (12 centimetre excavation depth)."
excavation_amount = 6
drill_sound = 'sound/items/Screwdriver.ogg'
@@ -91,7 +91,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick_hand"
item_state = "syringe_0"
- digspeed = 50
+ digspeed = 30
desc = "A smaller, more precise version of the pickaxe (30 centimetre excavation depth)."
excavation_amount = 15
drill_sound = 'sound/items/Crowbar.ogg'
@@ -108,16 +108,15 @@
desc = "A set of picks for excavation."
item_state = "syringe_kit"
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
- storage_slots = 8
- w_class = 3
+ storage_slots = 7
+ w_class = 2
can_hold = list("/obj/item/weapon/pickaxe/brush",\
"/obj/item/weapon/pickaxe/one_pick",\
"/obj/item/weapon/pickaxe/two_pick",\
"/obj/item/weapon/pickaxe/three_pick",\
"/obj/item/weapon/pickaxe/four_pick",\
"/obj/item/weapon/pickaxe/five_pick",\
- "/obj/item/weapon/pickaxe/six_pick",\
- "/obj/item/weapon/pickaxe/hand")
+ "/obj/item/weapon/pickaxe/six_pick")
max_combined_w_class = 17
max_w_class = 4
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
@@ -131,4 +130,3 @@
new /obj/item/weapon/pickaxe/four_pick(src)
new /obj/item/weapon/pickaxe/five_pick(src)
new /obj/item/weapon/pickaxe/six_pick(src)
- new /obj/item/weapon/pickaxe/hand(src)
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index 7d7de430bf..e46bff882d 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -190,7 +190,16 @@
max_duration = 160
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target_zone != "chest" && target_zone != "groin" && target_zone != "head"
+ if (target_zone == "eyes") //there are specific steps for eye surgery
+ return 0
+ if (!hasorgans(target))
+ return 0
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ if (affected == null)
+ return 0
+ if (affected.status & ORGAN_DESTROYED)
+ return 0
+ return target_zone != "chest" && target_zone != "groin" && target_zone != "head"
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
@@ -203,11 +212,11 @@
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\blue [user] cuts off [target]'s [affected.display_name] with \the [tool].", \
"\blue You cut off [target]'s [affected.display_name] with \the [tool].")
- affected.droplimb(1,1)
+ affected.droplimb(1,0)
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, sawwing through the bone in [target]'s [affected.display_name] with \the [tool]!", \
"\red Your hand slips, sawwing through the bone in [target]'s [affected.display_name] with \the [tool]!")
affected.createwound(CUT, 30)
- affected.fracture()
+ affected.fracture()
\ No newline at end of file
diff --git a/code/modules/surgery/robolimbs.dm b/code/modules/surgery/robolimbs.dm
index 9b8f42e4d7..97db284622 100644
--- a/code/modules/surgery/robolimbs.dm
+++ b/code/modules/surgery/robolimbs.dm
@@ -144,10 +144,15 @@
"You start attaching [tool] where [target]'s [affected.display_name] used to be.")
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/robot_parts/L = tool
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\blue [user] has attached [tool] where [target]'s [affected.display_name] used to be.", \
"\blue You have attached [tool] where [target]'s [affected.display_name] used to be.")
affected.robotize()
+ if(L.sabotaged)
+ affected.sabotaged = 1
+ else
+ affected.sabotaged = 0
target.update_body()
target.updatehealth()
target.UpdateDamageIcon()
diff --git a/code/setup.dm b/code/setup.dm
index c72f57f880..f4b8d35e2f 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -175,8 +175,7 @@ var/MAX_EXPLOSION_RANGE = 14
//FLAGS BITMASK
#define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere
-//To successfully stop you taking all pressure damage you must have both a suit and head item with this flag.
-
+ //To successfully stop you taking all pressure damage you must have both a suit and head item with this flag.
#define TABLEPASS 2 // can pass by a table or rack
#define MASKINTERNALS 8 // mask allows internals
@@ -205,7 +204,8 @@ var/MAX_EXPLOSION_RANGE = 14
#define NOREACT 16384 //Reagents dont' react inside this container.
-#define BLOCKHAIR 32768 // temporarily removes the user's hair icon
+#define BLOCKHEADHAIR 4 // temporarily removes the user's hair overlay. Leaves facial hair.
+#define BLOCKHAIR 32768 // temporarily removes the user's hair, facial and otherwise.
//flags for pass_flags
#define PASSTABLE 1
diff --git a/html/changelog.html b/html/changelog.html
index ccfe5623a1..9172fde59e 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -57,6 +57,22 @@ Stuff which is in development and not yet visible to players or just code relate
(ie. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit though. Thanks. -->
+
+
June 22nd 2013
+
Cael_Aislinn updated:
+
+ - The xenoarchaeology depth scanner will now tell you what energy field is required to safely extract a find.
+ - Excavation picks will now dig faster, and xenoarchaeology as a whole should be easier to do.
+
+
+ 21.06.2013
+ Jupotter updated:
+
+ - Fix the robotiscist preview in the char setupe screen
+
+
+
+
18.06.2013
Segrain updated:
@@ -65,6 +81,7 @@ should be listed in the changelog upon commit though. Thanks. -->
- Secure windoors are made with rods again.
- Windoors drop their electronics when broken. Emagged windoors can have theirs removed by crowbar.
- Airlock electronics can be configured to make door open for any single access on it instead of all of them.
+ - Cyborgs can preview their icons before choosing.
diff --git a/icons/mob/human_races/r_def_lizard.dmi b/icons/mob/human_races/r_def_lizard.dmi
index 6d7f8128ce..ccb9736ddf 100644
Binary files a/icons/mob/human_races/r_def_lizard.dmi and b/icons/mob/human_races/r_def_lizard.dmi differ
diff --git a/icons/mob/human_races/r_lizard.dmi b/icons/mob/human_races/r_lizard.dmi
index e8fb53fdac..8f8615d44e 100644
Binary files a/icons/mob/human_races/r_lizard.dmi and b/icons/mob/human_races/r_lizard.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 8ca8da77f7..86d6829d13 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi
index 1872d19070..72b438b2dd 100644
Binary files a/icons/obj/barsigns.dmi and b/icons/obj/barsigns.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 55cc4522f9..5b9521e089 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index 5a0eab2d2a..2ad4316d4a 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ
diff --git a/icons/robot_component.dmi b/icons/robot_component.dmi
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/maps/RandomZLevels/beach.dmm b/maps/RandomZLevels/beach.dmm
index 3e28640094..470a068cbd 100644
--- a/maps/RandomZLevels/beach.dmm
+++ b/maps/RandomZLevels/beach.dmm
@@ -1,8 +1,8 @@
"a" = (/turf/unsimulated/beach/sand{density = 1; opacity = 1},/area/awaymission/beach)
-"b" = (/turf/unsimulated/beach/sand,/area/awaymission/beach)
-"c" = (/obj/machinery/gateway{dir = 9},/turf/unsimulated/beach/sand,/area/awaymission/beach)
-"d" = (/obj/machinery/gateway{dir = 1},/turf/unsimulated/beach/sand,/area/awaymission/beach)
-"e" = (/obj/machinery/gateway{dir = 5},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"b" = (/obj/machinery/gateway{dir = 9},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"c" = (/obj/machinery/gateway{dir = 1},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"d" = (/obj/machinery/gateway{dir = 5},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"e" = (/turf/unsimulated/beach/sand,/area/awaymission/beach)
"f" = (/obj/effect/overlay/palmtree_r,/turf/unsimulated/beach/sand,/area/awaymission/beach)
"g" = (/obj/machinery/gateway{dir = 8},/turf/unsimulated/beach/sand,/area/awaymission/beach)
"h" = (/obj/machinery/gateway/centeraway,/turf/unsimulated/beach/sand,/area/awaymission/beach)
@@ -39,35 +39,35 @@
"M" = (/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand,/area/awaymission/beach)
"N" = (/mob/living/simple_animal/crab/Coffee,/turf/unsimulated/beach/sand,/area/awaymission/beach)
"O" = (/obj/structure/stool/bed/chair,/turf/unsimulated/beach/sand,/area/awaymission/beach)
-"P" = (/turf/unsimulated/beach/coastline,/area/awaymission/beach)
-"Q" = (/turf/unsimulated/beach/coastline{density = 1; opacity = 1},/area/awaymission/beach)
-"R" = (/turf/unsimulated/beach/water,/area/awaymission/beach)
-"S" = (/turf/unsimulated/beach/water{density = 1; opacity = 1},/area/awaymission/beach)
+"P" = (/turf/unsimulated/beach/coastline{density = 1; opacity = 1},/area/awaymission/beach)
+"Q" = (/turf/unsimulated/beach/coastline,/area/awaymission/beach)
+"R" = (/turf/unsimulated/beach/water{density = 1; opacity = 1},/area/awaymission/beach)
+"S" = (/turf/unsimulated/beach/water,/area/awaymission/beach)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bcdebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfba
-bghibbbbjbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba
-bklmbbbbbbbbnoooooooooopbbqrqrqrqrqrqrqa
-bbbbbbbbbbbbstuvwxyzABCsbbbbbbbbbbbbbbba
-bbbbbbbbbbbbDEEEEEEEEEEsbbbbbbbbbbbbbbba
-bbbbbbbbbbbbFEEEEEEEEEEsbbbbbbbbbGbbbbba
-bbfbbbbbbbbbHxIxxxxxxxxDbbbGbbJbbbbbbbba
-bbbbbbbbbbbbbKKKKKKKKKKbbbbbbbbbbbbbbbba
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba
-bbbLbbbbbbbbbbbbbbbbbbbbbbbbbbbfbbbbbbba
-bbbbbbGMbbbbbbbbbbbbbbGbbbbbNbbbMbbbbbfa
-bbbJbbbbbbLbbObObObObObObbbbbbbbbbObObba
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba
-PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQ
-RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
-RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
-RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
-RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
-RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
-RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
-RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
-RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
-RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
-RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS
+abcdeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefea
+aghieeeejeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea
+aklmeeeeeeeenoooooooooopeeqrqrqrqrqrqrqa
+aeeeeeeeeeeestuvwxyzABCseeeeeeeeeeeeeeea
+aeeeeeeeeeeeDEEEEEEEEEEseeeeeeeeeeeeeeea
+aeeeeeeeeeeeFEEEEEEEEEEseeeeeeeeeGeeeeea
+aefeeeeeeeeeHxIxxxxxxxxDeeeGeeJeeeeeeeea
+aeeeeeeeeeeeeKKKKKKKKKKeeeeeeeeeeeeeeeea
+aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea
+aeeLeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeea
+aeeeeeGMeeeeeeeeeeeeeeGeeeeeNeeeMeeeeefa
+aeeJeeeeeeLeeOeOeOeOeOeOeeeeeeeeeeOeOeea
+aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea
+PQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQP
+RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
+RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
+RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
+RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
+RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
+RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
+RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
+RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
+RSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR
+RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
"}
diff --git a/maps/oldstation.dmm b/maps/oldstation.dmm
index cdc5f7da48..df3b736578 100644
--- a/maps/oldstation.dmm
+++ b/maps/oldstation.dmm
@@ -395,7 +395,7 @@
"hE" = (/turf/simulated/floor,/area)
"hF" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/floor,/area/derelict/storage/equipment)
"hG" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/packageWrap,/obj/item/device/flashlight,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/storage/equipment)
-"hH" = (/obj/structure/table,/obj/item/weapon/storage/gl_kit,/obj/item/device/t_scanner,/turf/simulated/floor,/area/derelict/storage/equipment)
+"hH" = (/obj/structure/table,/obj/item/device/t_scanner,/turf/simulated/floor,/area/derelict/storage/equipment)
"hI" = (/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/clipboard,/obj/item/weapon/clipboard,/obj/item/weapon/clipboard,/turf/simulated/floor,/area/derelict/storage/equipment)
"hJ" = (/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/cable_coil,/turf/simulated/floor,/area/derelict/storage/equipment)
"hK" = (/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/storage/equipment)
@@ -404,7 +404,7 @@
"hN" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/crew_quarters/captain)
"hO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/crew_quarters/captain)
"hP" = (/obj/structure/cable{tag = ""; icon_state = "4-8"; step_x = 0; pixel_x = 0; d1 = 4; d2 = 8},/turf/simulated/floor,/area/crew_quarters/captain)
-"hQ" = (/obj/item/weapon/storage/handcuff_kit,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/crew_quarters/captain)
+"hQ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/crew_quarters/captain)
"hR" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor,/area/derelict/arrival)
"hS" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/derelict/storage/equipment)
"hT" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/crowbar,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor,/area/derelict/storage/equipment)
@@ -559,7 +559,7 @@
"kM" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/scan_consolenew,/turf/simulated/floor,/area/medical/genetics)
"kN" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/dna_scannernew,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/medical/genetics)
"kO" = (/obj/machinery/computer/scan_consolenew,/turf/simulated/floor,/area/medical/genetics)
-"kP" = (/obj/structure/table,/obj/item/weapon/storage/diskbox,/turf/simulated/floor,/area/medical/genetics)
+"kP" = (/obj/structure/table,/turf/simulated/floor,/area/medical/genetics)
"kQ" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/storage/equipment)
"kR" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/derelict/arrival)
"kS" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area)
@@ -818,254 +818,253 @@
"pL" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/atmos)
"pM" = (/obj/machinery/computer/secure_data,/turf/simulated/floor,/area/security/brig)
"pN" = (/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/turf/simulated/floor,/area/security/brig)
-"pO" = (/obj/item/weapon/storage/trackimp_kit,/turf/simulated/floor,/area/security/brig)
-"pP" = (/obj/item/weapon/paper_bin,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/brig)
-"pQ" = (/obj/item/device/flashlight,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/brig)
-"pR" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/ears/earmuffs,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/brig)
-"pS" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/landmark/start{name = "Warden"},/turf/simulated/floor,/area/security/brig)
-"pT" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor,/area/toxins/lab)
-"pU" = (/obj/structure/grille,/turf/simulated/floor,/area/toxins/lab)
-"pV" = (/obj/machinery/door/window/eastright,/obj/machinery/door/firedoor/border_only{dir = 4},/turf/simulated/floor,/area/crew_quarters)
-"pW" = (/obj/structure/stool/bed,/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor,/area/crew_quarters)
-"pX" = (/obj/structure/stool/bed,/obj/effect/landmark/start{name = "Quartermaster"},/turf/simulated/floor,/area/crew_quarters)
-"pY" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor,/area/crew_quarters)
-"pZ" = (/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen,/obj/item/weapon/weldingtool,/obj/item/clothing/gloves/black,/turf/simulated/floor,/area/crew_quarters)
-"qa" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Chef"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/crew_quarters)
-"qb" = (/obj/item/weapon/storage/backpack,/turf/simulated/floor,/area/crew_quarters)
-"qc" = (/obj/structure/grille,/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; icon_state = "on"; on = 1; pixel_y = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/atmos)
-"qd" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor,/area/atmos)
-"qe" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/atmos)
-"qf" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/weapon/clipboard,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/security/brig)
-"qg" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor,/area/security/brig)
-"qh" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/weapon/storage/firstaid/regular,/obj/machinery/light,/turf/simulated/floor,/area/security/brig)
-"qi" = (/obj/machinery/computer/security,/turf/simulated/floor,/area/security/brig)
-"qj" = (/obj/machinery/computer/card,/turf/simulated/floor,/area/security/brig)
-"qk" = (/obj/structure/closet/wardrobe/red,/turf/simulated/floor,/area/security/brig)
-"ql" = (/obj/structure/closet/wardrobe/orange,/obj/machinery/light,/turf/simulated/floor,/area/security/brig)
-"qm" = (/obj/machinery/door/poddoor{id = "bd1"; name = "Vent"},/turf/simulated/floor{icon_state = "shiny"},/area/toxins/lab)
-"qn" = (/obj/structure/window/reinforced{dir = 5},/turf/simulated/floor/plating,/area/derelict/arrival)
-"qo" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/derelict/arrival)
-"qp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/arrival)
-"qq" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor,/area/crew_quarters)
-"qr" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor,/area/atmos)
-"qs" = (/obj/structure/grille,/turf/simulated/floor,/area/atmos)
-"qt" = (/obj/machinery/door/poddoor{id = "vent1"; name = "Vent Hatch"},/turf/simulated/floor,/area/atmos)
-"qu" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor,/area/atmos)
-"qv" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/atmos)
-"qw" = (/turf/simulated/wall/r_wall,/area/derelict/hallway/secondary)
-"qx" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/derelict/arrival)
-"qy" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/derelict/arrival)
-"qz" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/derelict/arrival)
-"qA" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
-"qB" = (/obj/structure/grille,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
-"qC" = (/obj/machinery/door/window/southleft,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/crew_quarters)
-"qD" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 5},/turf/simulated/floor,/area/atmos)
-"qE" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 10},/turf/simulated/floor,/area/atmos)
-"qF" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor,/area/atmos)
-"qG" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; icon_state = "on"; on = 1; pixel_y = 1},/turf/simulated/floor,/area/atmos)
-"qH" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor,/area/atmos)
-"qI" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
-"qJ" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area/atmos)
-"qK" = (/turf/simulated/wall/r_wall,/area/atmos)
-"qL" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
-"qM" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor,/area/atmos)
-"qN" = (/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/derelict/hallway/secondary)
-"qO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"qP" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"qQ" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"qR" = (/turf/simulated/floor,/area/derelict/storage/storage_access)
-"qS" = (/obj/machinery/computer/security,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"qT" = (/turf/simulated/wall,/area/derelict/storage/storage_access)
-"qU" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"qV" = (/obj/structure/rack,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/under/color/black,/obj/item/clothing/mask/gas,/obj/item/device/radio/headset,/obj/item/clothing/gloves/black,/obj/item/clothing/shoes/black,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"qW" = (/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"qX" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/derelict/storage/storage_access)
-"qY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/storage/storage_access)
-"qZ" = (/obj/item/stack/sheet/glass,/obj/item/stack/sheet/glass,/obj/item/stack/sheet/glass,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/derelict/storage/storage_access)
-"ra" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/computer/atmos_alert,/turf/simulated/floor,/area/atmos)
-"rb" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/atmos)
-"rc" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor,/area/atmos)
-"rd" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/atmos)
-"re" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
-"rf" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
-"rg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
-"rh" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"ri" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"rj" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/clipboard,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"rk" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/door_control{id = "vent1"; pixel_x = -24},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/atmos)
-"rl" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor,/area/atmos)
-"rm" = (/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor,/area/atmos)
-"rn" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor,/area/atmos)
-"ro" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor,/area/atmos)
-"rp" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor,/area/atmos)
-"rq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
-"rr" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
-"rs" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area/derelict/hallway/secondary)
-"rt" = (/obj/machinery/door/window/eastleft{req_access_txt = "1"},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"ru" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"rv" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"rw" = (/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"rx" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"ry" = (/obj/machinery/door_control{id = "ventintake"; pixel_x = -24},/turf/simulated/floor,/area/atmos)
-"rz" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/atmos)
-"rA" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor,/area/atmos)
-"rB" = (/obj/structure/window/reinforced{dir = 1},/obj/item/clothing/mask/gas,/turf/simulated/floor,/area/atmos)
-"rC" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor,/area/atmos)
-"rD" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor,/area/atmos)
-"rE" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"rF" = (/obj/machinery/door/window/eastleft,/obj/machinery/door/firedoor/border_only{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"rG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"rH" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"rI" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/simulated/floor,/area/derelict/hallway/secondary)
-"rJ" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/device/multitool,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"rK" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"rL" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"rM" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"rN" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"rO" = (/obj/structure/closet/emcloset/legacy,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"rP" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/atmos)
-"rQ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/atmos)
-"rR" = (/obj/item/clothing/shoes/brown,/obj/item/clothing/under/rank/atmospheric_technician,/obj/item/clothing/gloves/yellow,/turf/simulated/floor,/area/atmos)
-"rS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
-"rT" = (/obj/machinery/door/airlock{req_access_txt = "12"},/turf/simulated/floor,/area/derelict/storage/storage_access)
-"rU" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"rV" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor,/area/atmos)
-"rW" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor,/area/atmos)
-"rX" = (/obj/item/weapon/paper_bin,/turf/simulated/floor,/area/atmos)
-"rY" = (/obj/item/weapon/clipboard,/turf/simulated/floor,/area/atmos)
-"rZ" = (/obj/structure/table,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/multitool,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
-"sa" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor,/area/atmos)
-"sb" = (/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
-"sc" = (/obj/structure/grille,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
-"sd" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
-"se" = (/obj/machinery/door/airlock{req_access_txt = "10;13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"sf" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = "90Curve"},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"sg" = (/obj/machinery/door/window/eastleft{req_access_txt = "10"},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"sh" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/obj/item/clothing/gloves/yellow,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"si" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"sj" = (/obj/structure/closet/emcloset/legacy,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"sk" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light,/turf/simulated/floor,/area/atmos)
-"sl" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor,/area/atmos)
-"sm" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor,/area/atmos)
-"sn" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/atmos)
-"so" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/device/radio,/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/atmos)
-"sp" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/weapon/screwdriver,/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor,/area/atmos)
-"sq" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light,/turf/simulated/floor,/area/atmos)
-"sr" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/weapon/screwdriver,/obj/item/device/t_scanner,/obj/item/device/assembly/signaler,/turf/simulated/floor,/area/atmos)
-"ss" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/weapon/screwdriver,/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/atmos)
-"st" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
-"su" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
-"sv" = (/obj/machinery/power/solar_control,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"sw" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"sx" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/derelict/storage/storage_access)
-"sy" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"sz" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"sA" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/turf/simulated/floor,/area/atmos)
-"sB" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/simulated/floor,/area/atmos)
-"sC" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/atmos)
-"sD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/space,/area/derelict/hallway/secondary)
-"sE" = (/obj/machinery/power/terminal,/obj/structure/cable,/turf/simulated/floor,/area/derelict/hallway/secondary)
-"sF" = (/obj/structure/rack,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/under/color/black,/obj/item/clothing/mask/gas,/obj/item/device/radio/headset,/obj/item/clothing/gloves/black,/obj/item/clothing/shoes/black,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"sG" = (/obj/structure/rack,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/under/color/black,/obj/item/clothing/mask/gas,/obj/item/device/radio/headset,/obj/item/clothing/gloves/black,/obj/item/clothing/shoes/black,/obj/item/clothing/glasses/sunglasses,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"sH" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"sI" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/t_scanner,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"sJ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"sK" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"sL" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"sM" = (/obj/structure/table,/obj/item/clothing/mask/gas,/turf/simulated/floor,/area/derelict/storage/storage_access)
-"sN" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor,/area/atmos)
-"sO" = (/obj/machinery/atmospherics/pipe/manifold/general/visible,/obj/machinery/light,/turf/simulated/floor,/area/atmos)
-"sP" = (/obj/structure/table,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/device/flashlight,/turf/simulated/floor,/area/atmos)
-"sQ" = (/obj/structure/table,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/atmos)
-"sR" = (/obj/structure/window/reinforced{dir = 5},/turf/space,/area)
-"sS" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/derelict/hallway/secondary)
-"sT" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"sU" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{tag = ""; icon_state = "4-8"; step_x = 0; pixel_x = 0; d1 = 4; d2 = 8},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"sV" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable,/turf/simulated/floor,/area/derelict/hallway/secondary)
-"sW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
-"sX" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area)
-"sY" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"sZ" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area)
-"ta" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
-"tb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"tc" = (/obj/machinery/door/firedoor/border_only{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"td" = (/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"te" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"tf" = (/obj/machinery/door/firedoor/border_only{dir = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"tg" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"th" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
-"ti" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
-"tj" = (/obj/structure/grille,/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
-"tk" = (/obj/machinery/door/airlock{req_access_txt = "17"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
-"tl" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
-"tm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
-"tn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
-"to" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
-"tp" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area)
-"tq" = (/turf/simulated/wall/r_wall,/area/derelict/teleporter)
-"tr" = (/turf/simulated/floor,/area/derelict/teleporter)
-"ts" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/teleporter)
-"tt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
-"tu" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/hallway/secondary)
-"tv" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
-"tw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
-"tx" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
-"ty" = (/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
-"tz" = (/obj/machinery/door/airlock{req_access_txt = "16"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"tA" = (/obj/structure/closet/emcloset/legacy,/turf/simulated/floor,/area/derelict/hallway/secondary)
-"tB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
-"tC" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/wall/r_wall,/area)
-"tD" = (/obj/machinery/computer/teleporter,/turf/simulated/floor{icon_state = "floorgrime"},/area/derelict/teleporter)
-"tE" = (/obj/machinery/teleport/station,/turf/simulated/floor{icon_state = "floorgrime"},/area/derelict/teleporter)
-"tF" = (/obj/machinery/teleport/hub,/turf/simulated/floor{icon_state = "floorgrime"},/area/derelict/teleporter)
-"tG" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/derelict/teleporter)
-"tH" = (/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"tI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/bridge/ai_upload)
-"tJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/bridge/ai_upload)
-"tK" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
-"tL" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor,/area/derelict/teleporter)
-"tM" = (/obj/effect/landmark{name = "tripai"},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
-"tN" = (/obj/machinery/turret,/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
-"tO" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
-"tP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
-"tQ" = (/obj/structure/cable{tag = ""; icon_state = "4-8"; step_x = 0; pixel_x = 0; d1 = 4; d2 = 8},/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
-"tR" = (/obj/structure/rack,/obj/item/weapon/aiModule/freeform,/obj/item/weapon/aiModule/prototypeEngineOffline,/obj/item/weapon/aiModule/safeguard,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"tS" = (/obj/structure/rack,/obj/item/weapon/aiModule/oneHuman,/obj/item/weapon/aiModule/purge,/obj/item/weapon/aiModule/teleporterOffline,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"tT" = (/obj/structure/rack,/obj/item/weapon/aiModule/oxygen,/obj/item/weapon/aiModule/quarantine,/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"tU" = (/obj/structure/rack,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/reset,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"tV" = (/obj/machinery/turret,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"tW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
-"tX" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"tY" = (/obj/machinery/turret{dir = 8},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"tZ" = (/obj/structure/table,/obj/item/device/radio,/turf/simulated/floor,/area/derelict/teleporter)
-"ua" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/teleporter)
-"ub" = (/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
-"uc" = (/obj/machinery/power/apc{pixel_x = 24},/obj/structure/cable,/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
-"ud" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"ue" = (/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"uf" = (/obj/effect/landmark/start{name = "AI"},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
-"ug" = (/obj/machinery/computer/aiupload,/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"uh" = (/obj/machinery/door/window/eastleft{req_access_txt = "16"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"ui" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"uj" = (/obj/machinery/power/solar_control,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"uk" = (/obj/machinery/turret{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"ul" = (/obj/machinery/door/window/eastleft{req_access_txt = "16"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"um" = (/obj/machinery/turret{dir = 1},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
-"un" = (/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
-"uo" = (/obj/structure/rack,/obj/item/weapon/aiModule/asimov,/obj/item/weapon/aiModule/freeformcore,/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"up" = (/obj/machinery/door/airlock{req_access_txt = "16"},/obj/machinery/door/window/eastleft{req_access_txt = "16"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"uq" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"ur" = (/obj/machinery/turret{dir = 1},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
-"us" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
-"ut" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
-"uu" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
-"uv" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area)
-"uw" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
-"ux" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
-"uy" = (/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
-"uz" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
-"uA" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area)
-"uB" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
+"pO" = (/obj/item/weapon/paper_bin,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/brig)
+"pP" = (/obj/item/device/flashlight,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/brig)
+"pQ" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/ears/earmuffs,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/brig)
+"pR" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/landmark/start{name = "Warden"},/turf/simulated/floor,/area/security/brig)
+"pS" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor,/area/toxins/lab)
+"pT" = (/obj/structure/grille,/turf/simulated/floor,/area/toxins/lab)
+"pU" = (/obj/machinery/door/window/eastright,/obj/machinery/door/firedoor/border_only{dir = 4},/turf/simulated/floor,/area/crew_quarters)
+"pV" = (/obj/structure/stool/bed,/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor,/area/crew_quarters)
+"pW" = (/obj/structure/stool/bed,/obj/effect/landmark/start{name = "Quartermaster"},/turf/simulated/floor,/area/crew_quarters)
+"pX" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor,/area/crew_quarters)
+"pY" = (/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen,/obj/item/weapon/weldingtool,/obj/item/clothing/gloves/black,/turf/simulated/floor,/area/crew_quarters)
+"pZ" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Chef"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/crew_quarters)
+"qa" = (/obj/item/weapon/storage/backpack,/turf/simulated/floor,/area/crew_quarters)
+"qb" = (/obj/structure/grille,/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; icon_state = "on"; on = 1; pixel_y = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/atmos)
+"qc" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor,/area/atmos)
+"qd" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/atmos)
+"qe" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/weapon/clipboard,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/security/brig)
+"qf" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor,/area/security/brig)
+"qg" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/clothing/mask/muzzle,/obj/item/clothing/mask/muzzle,/obj/item/weapon/storage/firstaid/regular,/obj/machinery/light,/turf/simulated/floor,/area/security/brig)
+"qh" = (/obj/machinery/computer/security,/turf/simulated/floor,/area/security/brig)
+"qi" = (/obj/machinery/computer/card,/turf/simulated/floor,/area/security/brig)
+"qj" = (/obj/structure/closet/wardrobe/red,/turf/simulated/floor,/area/security/brig)
+"qk" = (/obj/structure/closet/wardrobe/orange,/obj/machinery/light,/turf/simulated/floor,/area/security/brig)
+"ql" = (/obj/machinery/door/poddoor{id = "bd1"; name = "Vent"},/turf/simulated/floor{icon_state = "shiny"},/area/toxins/lab)
+"qm" = (/obj/structure/window/reinforced{dir = 5},/turf/simulated/floor/plating,/area/derelict/arrival)
+"qn" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/derelict/arrival)
+"qo" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/arrival)
+"qp" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor,/area/crew_quarters)
+"qq" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor,/area/atmos)
+"qr" = (/obj/structure/grille,/turf/simulated/floor,/area/atmos)
+"qs" = (/obj/machinery/door/poddoor{id = "vent1"; name = "Vent Hatch"},/turf/simulated/floor,/area/atmos)
+"qt" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor,/area/atmos)
+"qu" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/atmos)
+"qv" = (/turf/simulated/wall/r_wall,/area/derelict/hallway/secondary)
+"qw" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/derelict/arrival)
+"qx" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/derelict/arrival)
+"qy" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/derelict/arrival)
+"qz" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
+"qA" = (/obj/structure/grille,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
+"qB" = (/obj/machinery/door/window/southleft,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/crew_quarters)
+"qC" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 5},/turf/simulated/floor,/area/atmos)
+"qD" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 10},/turf/simulated/floor,/area/atmos)
+"qE" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor,/area/atmos)
+"qF" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; icon_state = "on"; on = 1; pixel_y = 1},/turf/simulated/floor,/area/atmos)
+"qG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor,/area/atmos)
+"qH" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
+"qI" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area/atmos)
+"qJ" = (/turf/simulated/wall/r_wall,/area/atmos)
+"qK" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
+"qL" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor,/area/atmos)
+"qM" = (/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/derelict/hallway/secondary)
+"qN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"qO" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"qP" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"qQ" = (/turf/simulated/floor,/area/derelict/storage/storage_access)
+"qR" = (/obj/machinery/computer/security,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"qS" = (/turf/simulated/wall,/area/derelict/storage/storage_access)
+"qT" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"qU" = (/obj/structure/rack,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/under/color/black,/obj/item/clothing/mask/gas,/obj/item/device/radio/headset,/obj/item/clothing/gloves/black,/obj/item/clothing/shoes/black,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"qV" = (/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"qW" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/derelict/storage/storage_access)
+"qX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/storage/storage_access)
+"qY" = (/obj/item/stack/sheet/glass,/obj/item/stack/sheet/glass,/obj/item/stack/sheet/glass,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/derelict/storage/storage_access)
+"qZ" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/computer/atmos_alert,/turf/simulated/floor,/area/atmos)
+"ra" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/atmos)
+"rb" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor,/area/atmos)
+"rc" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/atmos)
+"rd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
+"re" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
+"rf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
+"rg" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"rh" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"ri" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/clipboard,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"rj" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/door_control{id = "vent1"; pixel_x = -24},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/atmos)
+"rk" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor,/area/atmos)
+"rl" = (/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor,/area/atmos)
+"rm" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor,/area/atmos)
+"rn" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor,/area/atmos)
+"ro" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor,/area/atmos)
+"rp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
+"rq" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
+"rr" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area/derelict/hallway/secondary)
+"rs" = (/obj/machinery/door/window/eastleft{req_access_txt = "1"},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"rt" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"ru" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"rv" = (/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"rw" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"rx" = (/obj/machinery/door_control{id = "ventintake"; pixel_x = -24},/turf/simulated/floor,/area/atmos)
+"ry" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/atmos)
+"rz" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor,/area/atmos)
+"rA" = (/obj/structure/window/reinforced{dir = 1},/obj/item/clothing/mask/gas,/turf/simulated/floor,/area/atmos)
+"rB" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor,/area/atmos)
+"rC" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor,/area/atmos)
+"rD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"rE" = (/obj/machinery/door/window/eastleft,/obj/machinery/door/firedoor/border_only{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"rF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"rG" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"rH" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/simulated/floor,/area/derelict/hallway/secondary)
+"rI" = (/obj/structure/table,/obj/item/weapon/handcuffs,/obj/item/device/multitool,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"rJ" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"rK" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"rL" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"rM" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"rN" = (/obj/structure/closet/emcloset/legacy,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"rO" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/atmos)
+"rP" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/atmos)
+"rQ" = (/obj/item/clothing/shoes/brown,/obj/item/clothing/under/rank/atmospheric_technician,/obj/item/clothing/gloves/yellow,/turf/simulated/floor,/area/atmos)
+"rR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
+"rS" = (/obj/machinery/door/airlock{req_access_txt = "12"},/turf/simulated/floor,/area/derelict/storage/storage_access)
+"rT" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"rU" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor,/area/atmos)
+"rV" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor,/area/atmos)
+"rW" = (/obj/item/weapon/paper_bin,/turf/simulated/floor,/area/atmos)
+"rX" = (/obj/item/weapon/clipboard,/turf/simulated/floor,/area/atmos)
+"rY" = (/obj/structure/table,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/multitool,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
+"rZ" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor,/area/atmos)
+"sa" = (/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/atmos)
+"sb" = (/obj/structure/grille,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
+"sc" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
+"sd" = (/obj/machinery/door/airlock{req_access_txt = "10;13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"se" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = "90Curve"},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"sf" = (/obj/machinery/door/window/eastleft{req_access_txt = "10"},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"sg" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/obj/item/clothing/gloves/yellow,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"sh" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"si" = (/obj/structure/closet/emcloset/legacy,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"sj" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light,/turf/simulated/floor,/area/atmos)
+"sk" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor,/area/atmos)
+"sl" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor,/area/atmos)
+"sm" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/atmos)
+"sn" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/device/radio,/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/atmos)
+"so" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/weapon/screwdriver,/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor,/area/atmos)
+"sp" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light,/turf/simulated/floor,/area/atmos)
+"sq" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/weapon/screwdriver,/obj/item/device/t_scanner,/obj/item/device/assembly/signaler,/turf/simulated/floor,/area/atmos)
+"sr" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/item/weapon/screwdriver,/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/atmos)
+"ss" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
+"st" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
+"su" = (/obj/machinery/power/solar_control,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"sv" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"sw" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/derelict/storage/storage_access)
+"sx" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"sy" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"sz" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/turf/simulated/floor,/area/atmos)
+"sA" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/simulated/floor,/area/atmos)
+"sB" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/atmos)
+"sC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/space,/area/derelict/hallway/secondary)
+"sD" = (/obj/machinery/power/terminal,/obj/structure/cable,/turf/simulated/floor,/area/derelict/hallway/secondary)
+"sE" = (/obj/structure/rack,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/under/color/black,/obj/item/clothing/mask/gas,/obj/item/device/radio/headset,/obj/item/clothing/gloves/black,/obj/item/clothing/shoes/black,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"sF" = (/obj/structure/rack,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/under/color/black,/obj/item/clothing/mask/gas,/obj/item/device/radio/headset,/obj/item/clothing/gloves/black,/obj/item/clothing/shoes/black,/obj/item/clothing/glasses/sunglasses,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"sG" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool,/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"sH" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/t_scanner,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"sI" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"sJ" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"sK" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"sL" = (/obj/structure/table,/obj/item/clothing/mask/gas,/turf/simulated/floor,/area/derelict/storage/storage_access)
+"sM" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor,/area/atmos)
+"sN" = (/obj/machinery/atmospherics/pipe/manifold/general/visible,/obj/machinery/light,/turf/simulated/floor,/area/atmos)
+"sO" = (/obj/structure/table,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/device/flashlight,/turf/simulated/floor,/area/atmos)
+"sP" = (/obj/structure/table,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/weapon/cell,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/atmos)
+"sQ" = (/obj/structure/window/reinforced{dir = 5},/turf/space,/area)
+"sR" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/derelict/hallway/secondary)
+"sS" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"sT" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{tag = ""; icon_state = "4-8"; step_x = 0; pixel_x = 0; d1 = 4; d2 = 8},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"sU" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable,/turf/simulated/floor,/area/derelict/hallway/secondary)
+"sV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
+"sW" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area)
+"sX" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"sY" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area)
+"sZ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
+"ta" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"tb" = (/obj/machinery/door/firedoor/border_only{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"tc" = (/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"td" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"te" = (/obj/machinery/door/firedoor/border_only{dir = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"tf" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"tg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
+"th" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/derelict/hallway/secondary)
+"ti" = (/obj/structure/grille,/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
+"tj" = (/obj/machinery/door/airlock{req_access_txt = "17"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
+"tk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
+"tl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
+"tm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
+"tn" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
+"to" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area)
+"tp" = (/turf/simulated/wall/r_wall,/area/derelict/teleporter)
+"tq" = (/turf/simulated/floor,/area/derelict/teleporter)
+"tr" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/derelict/teleporter)
+"ts" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
+"tt" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/hallway/secondary)
+"tu" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
+"tv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
+"tw" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/derelict/teleporter)
+"tx" = (/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
+"ty" = (/obj/machinery/door/airlock{req_access_txt = "16"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"tz" = (/obj/structure/closet/emcloset/legacy,/turf/simulated/floor,/area/derelict/hallway/secondary)
+"tA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
+"tB" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/wall/r_wall,/area)
+"tC" = (/obj/machinery/computer/teleporter,/turf/simulated/floor{icon_state = "floorgrime"},/area/derelict/teleporter)
+"tD" = (/obj/machinery/teleport/station,/turf/simulated/floor{icon_state = "floorgrime"},/area/derelict/teleporter)
+"tE" = (/obj/machinery/teleport/hub,/turf/simulated/floor{icon_state = "floorgrime"},/area/derelict/teleporter)
+"tF" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/derelict/teleporter)
+"tG" = (/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"tH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/bridge/ai_upload)
+"tI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/derelict/bridge/ai_upload)
+"tJ" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
+"tK" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor,/area/derelict/teleporter)
+"tL" = (/obj/effect/landmark{name = "tripai"},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
+"tM" = (/obj/machinery/turret,/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
+"tN" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
+"tO" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
+"tP" = (/obj/structure/cable{tag = ""; icon_state = "4-8"; step_x = 0; pixel_x = 0; d1 = 4; d2 = 8},/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
+"tQ" = (/obj/structure/rack,/obj/item/weapon/aiModule/freeform,/obj/item/weapon/aiModule/prototypeEngineOffline,/obj/item/weapon/aiModule/safeguard,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"tR" = (/obj/structure/rack,/obj/item/weapon/aiModule/oneHuman,/obj/item/weapon/aiModule/purge,/obj/item/weapon/aiModule/teleporterOffline,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"tS" = (/obj/structure/rack,/obj/item/weapon/aiModule/oxygen,/obj/item/weapon/aiModule/quarantine,/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"tT" = (/obj/structure/rack,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/reset,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"tU" = (/obj/machinery/turret,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"tV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
+"tW" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"tX" = (/obj/machinery/turret{dir = 8},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"tY" = (/obj/structure/table,/obj/item/device/radio,/turf/simulated/floor,/area/derelict/teleporter)
+"tZ" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/teleporter)
+"ua" = (/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
+"ub" = (/obj/machinery/power/apc{pixel_x = 24},/obj/structure/cable,/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
+"uc" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"ud" = (/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"ue" = (/obj/effect/landmark/start{name = "AI"},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
+"uf" = (/obj/machinery/computer/aiupload,/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"ug" = (/obj/machinery/door/window/eastleft{req_access_txt = "16"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"uh" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"ui" = (/obj/machinery/power/solar_control,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"uj" = (/obj/machinery/turret{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"uk" = (/obj/machinery/door/window/eastleft{req_access_txt = "16"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"ul" = (/obj/machinery/turret{dir = 1},/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
+"um" = (/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/derelict/bridge/ai_upload)
+"un" = (/obj/structure/rack,/obj/item/weapon/aiModule/asimov,/obj/item/weapon/aiModule/freeformcore,/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"uo" = (/obj/machinery/door/airlock{req_access_txt = "16"},/obj/machinery/door/window/eastleft{req_access_txt = "16"},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"up" = (/obj/machinery/light,/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"uq" = (/obj/machinery/turret{dir = 1},/turf/simulated/floor,/area/derelict/bridge/ai_upload)
+"ur" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
+"us" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
+"ut" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area)
+"uu" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area)
+"uv" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
+"uw" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
+"ux" = (/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
+"uy" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area)
+"uz" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area)
+"uA" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1148,42 +1147,42 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvnemQmvnWnXnY
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvotototmvnLoumvmvmvmvmvmvmvmvmvnHneovowneoxmvoyoyoyoyoyoyozoyoAoynBoBoCojoDoiojoEoioloFojoGnRoHjwlsnjlsoIoJoIoIjwhChChChCnsnshChCmYhCoKimfzaaksjzjTjTkukvmokxbhjkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaamvnInInImvnemQoLoMoNoNoOoPoQnemvneoRoSoToUnemvoVoVoVoVoWoXoYoyoZoVnBoBoCpaojpbojojpbpcpdojpenRoHjwpfpgnjoIoIoIphjwmmhChChChChChCkrhkhCpiimfzaaaanujjnvpjjSjSktjzjAjBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapknenenemvnemQneneneneneneplnemvnepmpnpoppnemvpqprprprpsptoYoyoAoynBoBoCojojojpupupvpwojojpxnRoHjwlslslsoIoIoIpyjwhChChCpzhChChChChkhCpAimfzaaaaaaaanujjjjnvpjjzjUjBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvpBnInepCnemQpDpEnenIpFnenenemvnHpmnWpGpHoxmvpIpJpJpJpKptpLoyoZprnBpMpNpOpPpQpRojpSpwojojpenRoHjwlspTpUoIoIoIoIjwhChChChChChChChChkhCpAimfzaaaaaaaaaaaaaanujjbhkyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapknenenepVnemQpWpDnepXpWnepYnemvpZnepmqaqbnemvptprqcprqdptqeoyoAoynBqfqgqhqiqjqkqlpbpbojojojnRoHjwjwjwjwqmqmqmqmjwqnqoqnqpqpqpqpqpqpqpqpimfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvnInInImvnImQpDnInepWnIneneneqqnenenemQnenemvqrqsqrqsqtquproyqvoynBnBnBnBnBnBnBnBnBnBnBnBnBqwomqwaahchchchchchchcqxqyqzhchchchcaaaaaaaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqAbDbDbDbDbDbDbDqBaamvotototmvmvqCmvmvmvmvmvmvmvmvmvmvmvmvqCmvmvmvqDqEqFqGqHprprqIprqJprprprprqKprqLqMqMqMqMqLprqwoHqwaabKaaaabKaaaabKqnqoqnbKaaaabKaaaaaaaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaaaaaaaaaaaaaaaaaanRqNqOoHqPqQqRqSqTqUqRqVqWqWqRqXqYqZqTraquququprprprrbprprprrcprrdqKprrbprprprprprprqwoHreaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrfcfaacdrfcfaanRrgrgrgnRoHqOoHrhqRqRriqTqUqRqRqRqRqRqRqRrjqTrkrlprrmprrmprrmprprprprprproAprrnrororororpprqwoHrqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrrcfaacdrrcfaarqrsrhoHnRoHqOoHrtqRqRruqTrvrwqRqRqRqRqRqRrxqTryprprprrmprrmpsrzrArBrBrArAqKprrnrCrCrCrCrDprqwoHrqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrrcfaacdrrcfaarqoHrhrErFrGrHoHrIqRrvrJqTrvrKrLrMrNqRrOqRrxqTrArArPrQprprprpsprprprrRprprqKqKqKqKqKqKqKqKqKqwoHrqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaadnaaaaaadnaaaarSoHrhqOnRqTqTrTqTqTqTqTqTqTqTqTqTqTrUqTqTqTqTprprprrVprpqprrVprrWrXrYprprrVprrZsasasasasbsanRomrqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaascdGdGsddGdGdGsddGdGsesfsgqOnRqTqWqRqRqRqRqRshsiriqTqWqRqRqRqRsjqTrCrCskpsprslsmsnprsospsqsrssoyprprsasasasasasanRoHstaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaadnaaaaaadnaaaasusvrhswnRqTqWqRqRqRsxqRqRqRsyqTszqRqRqRqRqRqToyoyoyoyprsAsBsCoyoyoyoyoyoyoyprproVoVoVoVoVoVnRnSqwnRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahcfzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrrcfaacdrrcfaasDsErhqOnRqTsFsFsGsFqVqRsHsIsJqTsKqRsLsMqRqRqTaaaaoysNsBsOsBsCoyaaaaaaaaaaoysPsQoVoVoVoVoVoVnRoHoHoHnRaaaaaaaaaaaasRsSsRaaaaaaaaaafzfzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrrcfaacdrrcfaarqsTsUsVnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRsSnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRoHoHoHoHsWaaaaaaaaaasXsYsZaaaaaaaaaafzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdtacfaacdtacfaarqoHrhtbtcrGrGrGrGtdoHoHoHoHoHoHoHoHoHteoHoHoHoHoHoHoHoHoHteoHoHoHoHoHoHoHoHoHteoHoHoHoHtfoHoHoHtgoHoHthaaaaaaaaaasXsSsZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaaaaaaaaaarqoHrhoHtfoHoHoHoHqOoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHtfoHoHoHoHoHtithaaaabtaaaasXoHsZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatjbDbDbDbDbDbDbDqBaanRrgrgnRrgrgqwqwqwtkqwqwqwtltlnRtltltltltlnRtltltltltlnRtltltltltlnRtltltltltlnRtltltltmtnoHoHoHoHoHoHtolwlwlwlwlwtpoHsZaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzfzfzfzfztqtqtrtstttstrtqtqfzfzfzfzfzfzfzfzfzfzfzfzfznRfzfzfzfzfzqwfzfzfzfzfzqwfzfzfzqwqwnSqwoHoHoHoHsStfoHoHoHtuoHoHsZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatqtrtrtrtvtwtwtxtqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatyaaaaaaaaaatyaaaabttytytztytAtAqwtBtCtBtCmpmpmpmpmpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatqtrtrtDtEtFtrtGtqaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaatytytytytytytytytytytytytytytytHtytItJtytKaTtKaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatqtLtrtrtrtrtrtrtqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatytytMtNtOtNtPtQtRtStTtUtVtWtXtytHtHtHtYtytKaTtKaTaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaatqtqtZtruatrtrtqtqaaaaaaaaaabtaaaaaaaaaaaaaaaatytytyubtHubtHuctytHtHtHtHtHtyudtytHuetHtHtytKaTtKaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatqtqtqtqtqtqtqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatytyufugtHtHtHuhuhtHtHuitHtHtyujtytHuetHuktytKaTtKaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaatytytyubtHubtHubtytytytHtHuhuhuluhtHuetHtHtytKaTtKaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatytytMumunumubtyuouptHuqurtyustytHtHtHtYtytKaTtKaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatytytytytytytytytytytytytyustytytytytytyutaTutaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauuaaaaaaaaaadnaaaaaaaaaauuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvpBnInepCnemQpDpEnenIpFnenenemvnHpmnWpGpHoxmvpIpJpJpJpKptpLoyoZprnBpMpNojpOpPpQojpRpwojojpenRoHjwlspSpToIoIoIoIjwhChChChChChChChChkhCpAimfzaaaaaaaaaaaaaanujjbhkyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapknenenepUnemQpVpDnepWpVnepXnemvpYnepmpZqanemvptprqbprqcptqdoyoAoynBqeqfqgqhqiqjqkpbpbojojojnRoHjwjwjwjwqlqlqlqljwqmqnqmqoqoqoqoqoqoqoqoimfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvnInInImvnImQpDnInepVnIneneneqpnenenemQnenemvqqqrqqqrqsqtproyquoynBnBnBnBnBnBnBnBnBnBnBnBnBqvomqvaahchchchchchchcqwqxqyhchchchcaaaaaaaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqzbDbDbDbDbDbDbDqAaamvotototmvmvqBmvmvmvmvmvmvmvmvmvmvmvmvqBmvmvmvqCqDqEqFqGprprqHprqIprprprprqJprqKqLqLqLqLqKprqvoHqvaabKaaaabKaaaabKqmqnqmbKaaaabKaaaaaaaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaaaaaaaaaaaaaaaaaanRqMqNoHqOqPqQqRqSqTqQqUqVqVqQqWqXqYqSqZqtqtqtprprprraprprprrbprrcqJprraprprprprprprqvoHrdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrecfaacdrecfaanRrfrfrfnRoHqNoHrgqQqQrhqSqTqQqQqQqQqQqQqQriqSrjrkprrlprrlprrlprprprprprproAprrmrnrnrnrnroprqvoHrpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrqcfaacdrqcfaarprrrgoHnRoHqNoHrsqQqQrtqSrurvqQqQqQqQqQqQrwqSrxprprprrlprrlpsryrzrArArzrzqJprrmrBrBrBrBrCprqvoHrpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrqcfaacdrqcfaarpoHrgrDrErFrGoHrHqQrurIqSrurJrKrLrMqQrNqQrwqSrzrzrOrPprprprpsprprprrQprprqJqJqJqJqJqJqJqJqJqvoHrpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaadnaaaaaadnaaaarRoHrgqNnRqSqSrSqSqSqSqSqSqSqSqSqSqSrTqSqSqSqSprprprrUprpqprrUprrVrWrXprprrUprrYrZrZrZrZsarZnRomrpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasbdGdGscdGdGdGscdGdGsdsesfqNnRqSqVqQqQqQqQqQsgshrhqSqVqQqQqQqQsiqSrBrBsjpsprskslsmprsnsospsqsroyprprrZrZrZrZrZrZnRoHssaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaadnaaaaaadnaaaastsurgsvnRqSqVqQqQqQswqQqQqQsxqSsyqQqQqQqQqQqSoyoyoyoyprszsAsBoyoyoyoyoyoyoyprproVoVoVoVoVoVnRnSqvnRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahcfzhcaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrqcfaacdrqcfaasCsDrgqNnRqSsEsEsFsEqUqQsGsHsIqSsJqQsKsLqQqQqSaaaaoysMsAsNsAsBoyaaaaaaaaaaoysOsPoVoVoVoVoVoVnRoHoHoHnRaaaaaaaaaaaasQsRsQaaaaaaaaaafzfzaaaTfzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdrqcfaacdrqcfaarpsSsTsUnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRsRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRoHoHoHoHsVaaaaaaaaaasWsXsYaaaaaaaaaafzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaacdsZcfaacdsZcfaarpoHrgtatbrFrFrFrFtcoHoHoHoHoHoHoHoHoHtdoHoHoHoHoHoHoHoHoHtdoHoHoHoHoHoHoHoHoHtdoHoHoHoHteoHoHoHtfoHoHtgaaaaaaaaaasWsRsYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaaaaaaaaaarpoHrgoHteoHoHoHoHqNoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHoHteoHoHoHoHoHthtgaaaabtaaaasWoHsYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatibDbDbDbDbDbDbDqAaanRrfrfnRrfrfqvqvqvtjqvqvqvtktknRtktktktktknRtktktktktknRtktktktktknRtktktktktknRtktktktltmoHoHoHoHoHoHtnlwlwlwlwlwtooHsYaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafzfzfzfzfztptptqtrtstrtqtptpfzfzfzfzfzfzfzfzfzfzfzfzfznRfzfzfzfzfzqvfzfzfzfzfzqvfzfzfzqvqvnSqvoHoHoHoHsRteoHoHoHttoHoHsYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatptqtqtqtutvtvtwtpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatxaaaaaaaaaatxaaaabttxtxtytxtztzqvtAtBtAtBmpmpmpmpmpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatptqtqtCtDtEtqtFtpaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaatxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtGtxtHtItxtJaTtJaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatptKtqtqtqtqtqtqtpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatxtxtLtMtNtMtOtPtQtRtStTtUtVtWtxtGtGtGtXtxtJaTtJaTaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaatptptYtqtZtqtqtptpaaaaaaaaaabtaaaaaaaaaaaaaaaatxtxtxuatGuatGubtxtGtGtGtGtGtxuctxtGudtGtGtxtJaTtJaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatptptptptptptpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatxtxueuftGtGtGugugtGtGuhtGtGtxuitxtGudtGujtxtJaTtJaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaatxtxtxuatGuatGuatxtxtxtGtGugugukugtGudtGtGtxtJaTtJaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatxtxtLulumuluatxunuotGupuqtxurtxtGtGtGtXtxtJaTtJaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatxtxtxtxtxtxtxtxtxtxtxtxtxurtxtxtxtxtxtxusaTusaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaautaaaaaaaaaadnaaaaaaaaaautaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaadnaaaaaaaaaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauvuvuvaadnaauvuvuvaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauwuxuxdGuydGuxuxuzaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauAuAuAaadnaauAuAuAaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauuuuuuaadnaauuuuuuaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauvuwuwdGuxdGuwuwuyaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauzuzuzaadnaauzuzuzaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaadnaaaaaaaaaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauvuvuvaadnaauvuvuvaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauwuxuxdGuydGuxuxuzaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauAuAuAaadnaauAuAuAaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauuuuuuaadnaauuuuuuaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauvuwuwdGuxdGuwuwuyaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaauzuzuzaadnaauzuzuzaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaaaadnaaaaaaaaaabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatjbDbDbDbDbDuBbDbDbDbDbDfkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatibDbDbDbDbDuAbDbDbDbDbDfkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm
index a8475ff711..1809698f63 100644
--- a/maps/tgstation.2.1.0.0.1.dmm
+++ b/maps/tgstation.2.1.0.0.1.dmm
@@ -92,8 +92,8 @@
"abN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/security/range)
"abO" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/security/range)
"abP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/plating,/area/security/prison)
-"abQ" = (/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/prison)
-"abR" = (/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/prison)
+"abQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/lobby)
+"abR" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison)
"abS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/security/prison)
"abT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/security/prison)
"abU" = (/obj/structure/rack,/obj/item/weapon/gun/energy/gun,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor{dir = 2; name = "Weapons locker"; req_access_txt = "3"},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
@@ -181,7 +181,7 @@
"ady" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple,/obj/machinery/door/airlock/security{name = "Execution Chamber"; req_access = null; req_access_txt = "1"},/turf/simulated/floor,/area/security/prison)
"adz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/prison)
"adA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison)
-"adB" = (/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement"; req_access_txt = "2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison)
+"adB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison)
"adC" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/prison)
"adD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor{icon_state = "dark"},/area/security/warden)
"adE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{icon_state = "dark"},/area/security/warden)
@@ -226,9 +226,9 @@
"aer" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/woodentable,/turf/simulated/floor{icon_state = "dark"},/area/security/hos)
"aes" = (/obj/structure/table/woodentable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/turf/simulated/floor{icon_state = "dark"},/area/security/hos)
"aet" = (/obj/structure/closet/secure_closet/hos,/obj/machinery/power/apc{dir = 4; name = "Head of Security Office APC"; pixel_x = 27; pixel_y = 2},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{icon_state = "dark"},/area/security/hos)
-"aeu" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/prison)
-"aev" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/security/prison)
-"aew" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison)
+"aeu" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/prison)
+"aev" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison)
+"aew" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/security/prison)
"aex" = (/turf/simulated/wall,/area/security/brig)
"aey" = (/obj/structure/sign/securearea,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/security/warden)
"aez" = (/obj/machinery/door/airlock/highsecurity{name = "Secure Armoury Section"; req_access_txt = "3"},/turf/simulated/floor,/area/security/warden)
@@ -330,7 +330,7 @@
"agr" = (/obj/structure/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden)
"ags" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = -30; pixel_y = 0},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/main)
"agt" = (/obj/structure/closet/secure_closet/security,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/main)
-"agu" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; layer = 2.8; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor{tag = "icon-redfull (NORTHWEST)"; icon_state = "redfull"; dir = 9},/area/security/lobby)
+"agu" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/prison)
"agv" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/main)
"agw" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor{tag = "icon-redfull (NORTHWEST)"; icon_state = "redfull"; dir = 9},/area/security/main)
"agx" = (/obj/structure/table,/obj/item/weapon/folder/red,/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/security/main)
@@ -417,8 +417,8 @@
"aia" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/security/hos)
"aib" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/hos)
"aic" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/structure/lattice,/turf/space,/area)
-"aid" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor,/area/security/prison)
-"aie" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor,/area/security/prison)
+"aid" = (/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement"; req_access_txt = "2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison)
+"aie" = (/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/prison)
"aif" = (/obj/structure/table,/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0; tag = "icon-alarm0 (EAST)"},/obj/item/weapon/storage/box/evidence,/turf/simulated/floor,/area/security/brig)
"aig" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/security/brig)
"aih" = (/obj/structure/table,/turf/simulated/floor,/area/security/brig)
@@ -549,7 +549,7 @@
"akC" = (/obj/machinery/door/window/brigdoor{dir = 1; req_access_txt = "63"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/lobby)
"akD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/security/lobby)
"akE" = (/obj/structure/rack{dir = 1},/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/sunglasses,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"akF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/security/lobby)
+"akF" = (/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/prison)
"akG" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; layer = 2.8; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor{tag = "icon-redfull (NORTHWEST)"; icon_state = "redfull"; dir = 9},/area/security/lobby)
"akH" = (/obj/machinery/door/airlock/glass_security{id_tag = "BrigWest"; layer = 2.8; name = "Brig"; req_access_txt = "63"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/security/brig)
"akI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigWest"; layer = 2.8; name = "Brig"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/security/brig)
@@ -10495,26 +10495,26 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaiabtaaiabmabuabwabxabyabzabAaaiaaMabBaaiaabaaaaaaaaaaabaaSabCabsabDaaSaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaabaaiabEaaMabFabGaaMabHabIaaaaaaaaaaaMabJaaiaabaabaacaabaababKabsabqabsabKaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaafaafaafaafaafaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaiabEaaMabFabLaaMabHabIaaaaaaaaaaaMabMabMabMabMabMaabaababNabqabsabqabOaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaafaafaafaafaafaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaiabPaaMabQabRaaiabSabTaaiaaaaaaabMabMabUabVabWabMabMaabaaSabqabqabsaaSabXabXabXabXabXabXabYaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaafaafaafaafaafaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaiabPaaMakFaieaaiabSabTaaiaaaaaaabMabMabUabVabWabMabMaabaaSabqabqabsaaSabXabXabXabXabXabXabYaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaaiabZacaacbaccarbaceacfaaMaaaabMabMacgachachachaciabMabMaaSacjabqackaaSabXaclacmacnacoacpabYaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaiacqacracsactacuacvacwaaMaaaabMacxacyaczachacAacBacCabMacDacEacFacGacHabXaclacIacJacKacLabYaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMaaiaaiaaiaaiacNacOacPacQaaMaaMaaMaaMaaaabMacRacyacSachacAacBacTabMacUacVacWacXacYabXaclacmacZadaacLabYaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMadbadcaddadeadfadgadhadiaaqadjadkaaMaaaabMadlacyadmachacAacBadnabMadoadpadqadradsabXabXabXadtaduabXabYaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMadvadwadxadwadyadzacsadAadBadCadCaaMaaaabMabMadDadEachadFadGabMabMadHadIadqadJaaSabXadKadLadMadNadOadPadPadQadRadPadPaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMadvadwadxadwadyadzacsadAaidadCadCaaMaaaabMabMadDadEachadFadGabMabMadHadIadqadJaaSabXadKadLadMadNadOadPadPadQadRadPadPaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMadSadTadUadVadWadXadYadZaaGaeaaebaaMaaaaaaabMaecaedachaeeaefabMaegaaSaehaeiaejaaSaekaoVapUamMaonalbalcakOaeraesaetadPadPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMaaiaaiaaiaaiacNaeuaevaewaexaexaexaexaexaexabMabMaeyaezaeAabMabMaeBaeCaeDaeEaeFaeGaeHaqAaqFaffapVaiKaqzaeMaeNaeOaePaeQaeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMaaiaaiaaiaaiacNaguaewaevaexaexaexaexaexaexabMabMaeyaezaeAabMabMaeBaeCaeDaeEaeFaeGaeHaqAaqFaffapVaiKaqzaeMaeNaeOaePaeQaeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaeSaeTaeUaeVaeWadAaexaeXaeYaeYaeYaeYaegaeZafaafbafcafdaegafeaffafgafhafiafjafkaflaflafmarNafoarMafqafrafsaftafuafvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiafwafxafyafzadhafAaexafBafCafDafEafDafFafGafHafIafJafKafLafMafNafOafPafQafRafSafTafUafVarOafSasrafZagaagbagcagdadPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiageaaoagfaggaghagiaexagjagkafDaglagmaegagnagoagpagqagraegagsaenagtaoYagvagwaemagxagyagzagyaemarKagBagCagDagEagFaeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiagGagHagIagJagKadAaexagLagMagNagOagLabMagPagQagRagSagTaegagsaenagtagUagVagWagXagYagYagZagYahaarLahcahdaheaheahfahgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaiaaiaaiahhahiahjaexahkahlahmahnahmahoahpahqahrahsahtahuahvaenagtahwahxahyaemahzagyahzagyahAarEahCahDahEahFadPadPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiahGahHadAaexahIahJahKahLahMahNahOahPahQahRahSahTahUahVagtahWahxahXaemagxagyagxahYahZarJadPadPaiaaibadPaicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaidaevaieaexaifaigaihaiiahMaijaikailahraimainahuaioaenagtaipaiqairaisaitaiuaemaivaiwareabYabXaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaeuadBabRaexaifaigaihaiiahMaijaikailahraimainahuaioaenagtaipaiqairaisaitaiuaemaivaiwareabYabXaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaexaexaexaexagLaixaiyaizaexaiAaiBaiCaiiahMaegaiDaiEaiFaiGaiHaegaiIaiJaiKaiLaffaiMabXaiNaiOaiPaiQaiRarDaiTabXabXabYabYabYabYabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaexaiUaiVaiWaiXaiYaiZajaaexajbajcajbajdajbaegagPagQajeagSagTaegabXajfajgabXajhajiabXajjajkajkajlabXajmaiTaiTabXaiSajnajoajoafXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaexajqajrajsajtajuajvajwajxajxajyajzajAajxajxajxajAajBajyajCajDajzajEajFajGajHafYajJajKajLajMagAahBasyajQajRafWaiTajSajTafpaeIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaexajWajXajYajZakaakbakcakdakeakfakgakhakiakjakdakiakkaklakmakiakgakhakiakiaknakoakpaiCakqakrafnaeKaeJajRakuabXaiTakvajoajoaeqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaexaexaexaexaexaexaexaexakxakyakzaexaexagLakAakBakCakDaguakFakGagLaexaexaexakHakIakJakJakKakLakMakNakJacdahbabXabXabYabYabYabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaexaexaexaexaexaexaexaexakxakyakzaexaexagLakAakBakCakDakEabQakGagLaexaexaexakHakIakJakJakKakLakMakNakJacdahbabXabXabYabYabYabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabakPaexakQakRakSakTakUakVakWakXakYakZalaaepaeoaldalealfalgakZalhaliakWaljalkakJallalmalnaloalpalqacdalralsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaltaltaltaltaltaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalualualualvalvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaalvalvalualvalvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabalwaexalxalyalzaexalAalBalCalDalEalFalGalHalIalJalKalLalgalMalNalDalOalPalkakJalQalRalRalSalRalTacdalralsaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaltaltaltaltaltaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaluaaaaabaaaalUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaaaabaaaalUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabalValWaexalXalYalZaexamaambamcamdameamfamgamhamiamjalKamkalgamfamlammamnamoampakJamqamralRalSalRamsacdalralsaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaltaltaltaltaltaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaluaabamtaabaluaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/sound/ambience/alarm4.ogg b/sound/ambience/alarm4.ogg
new file mode 100644
index 0000000000..a86bfd155f
Binary files /dev/null and b/sound/ambience/alarm4.ogg differ
diff --git a/sound/voice/ManUp1.ogg b/sound/voice/ManUp1.ogg
new file mode 100644
index 0000000000..9239a02e17
Binary files /dev/null and b/sound/voice/ManUp1.ogg differ