From 8e83dcd697acb5f8654bee7b239751aca89c72b1 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Wed, 7 Oct 2020 14:43:53 -0700
Subject: [PATCH 001/165] event permissions
---
code/__DEFINES/admin.dm | 3 ++-
code/__HELPERS/type2type.dm | 2 ++
code/_globalvars/bitfields.dm | 3 ++-
code/modules/admin/admin_ranks.dm | 7 +++++++
code/modules/admin/holder2.dm | 5 +++++
code/modules/admin/sql_message_system.dm | 2 ++
code/modules/admin/verbs/getlogs.dm | 2 ++
code/modules/client/client_procs.dm | 14 ++++++++++++++
code/modules/mob/mob.dm | 6 ++++++
code/modules/power/singularity/investigate.dm | 2 +-
config/admin_ranks.txt | 1 +
11 files changed, 44 insertions(+), 3 deletions(-)
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index 97f07acc05..143063b4e9 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -35,8 +35,9 @@
#define R_SPAWN (1<<12)
#define R_AUTOLOGIN (1<<13)
#define R_DBRANKS (1<<14)
+#define R_SENSITIVE (1<<15)
-#define R_DEFAULT R_AUTOLOGIN
+#define R_DEFAULT R_AUTOLOGIN | R_SENSITIVE
#define R_EVERYTHING ALL //the sum of all other rank permissions, used for +EVERYTHING
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index bbbf99c9de..0987e95dc9 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -225,6 +225,8 @@
. += "[seperator]AUTOLOGIN"
if(rights & R_DBRANKS)
. += "[seperator]DBRANKS"
+ if(rights & R_SENSITIVE)
+ . += "[seperator]SENSITIVE"
if(!.)
. = "NONE"
return .
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index 85f5e4fd9b..276718c0c2 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -67,7 +67,8 @@ GLOBAL_LIST_INIT(bitfields, list(
"SOUNDS" = R_SOUNDS,
"SPAWN" = R_SPAWN,
"AUTOLOGIN" = R_AUTOLOGIN,
- "DBRANKS" = R_DBRANKS
+ "DBRANKS" = R_DBRANKS,
+ "SENSITIVE" = R_SENSITIVE
),
"interaction_flags_atom" = list(
"INTERACT_ATOM_REQUIRES_ANCHORED" = INTERACT_ATOM_REQUIRES_ANCHORED,
diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm
index ef4abeb0ad..39053b8e15 100644
--- a/code/modules/admin/admin_ranks.dm
+++ b/code/modules/admin/admin_ranks.dm
@@ -44,6 +44,11 @@ GLOBAL_PROTECT(protected_ranks)
/datum/admin_rank/vv_edit_var(var_name, var_value)
return FALSE
+/datum/admin_rank/CanProcCall(procname)
+ . = ..()
+ if(!check_rights(R_SENSITIVE))
+ return FALSE
+
/proc/admin_keyword_to_flag(word, previous_rights=0)
var/flag = 0
switch(ckey(word))
@@ -79,6 +84,8 @@ GLOBAL_PROTECT(protected_ranks)
flag = R_AUTOLOGIN
if("dbranks")
flag = R_DBRANKS
+ if("sensitive")
+ flag = R_SENSITIVE
if("@","prev")
flag = previous_rights
return flag
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index 09f9664295..03878268d2 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -28,6 +28,11 @@ GLOBAL_PROTECT(href_token)
var/deadmined
+/datum/admins/CanProcCall(procname)
+ . = ..()
+ if(!check_rights(R_SENSITIVE))
+ return FALSE
+
/datum/admins/New(datum/admin_rank/R, ckey, force_active = FALSE, protected)
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm
index 356746ddbc..d8135d54c0 100644
--- a/code/modules/admin/sql_message_system.dm
+++ b/code/modules/admin/sql_message_system.dm
@@ -299,6 +299,8 @@
qdel(query_find_message_secret)
/proc/browse_messages(type, target_ckey, index, linkless = FALSE, filter, agegate = FALSE)
+ if(!check_rights(R_SENSITIVE))
+ return
if(!SSdbcore.Connect())
to_chat(usr, "Failed to establish database connection.")
return
diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm
index 4cbb0214f7..446dbcc69a 100644
--- a/code/modules/admin/verbs/getlogs.dm
+++ b/code/modules/admin/verbs/getlogs.dm
@@ -14,6 +14,8 @@
browseserverlogs("[GLOB.log_directory]/")
/client/proc/browseserverlogs(path = "data/logs/")
+ if(!check_rights(R_SENSITIVE))
+ return
path = browse_files(path)
if(!path)
return
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 45990cd21f..332365e032 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -917,8 +917,22 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
if(NAMEOF(src, view))
change_view(var_value)
return TRUE
+ if(NAMEOF(src, computer_id))
+ return FALSE
+ if(NAMEOF(src, address))
+ return FALSE
. = ..()
+/client/vv_get_var(var_name)
+ . = ..()
+ switch(var_name)
+ if(NAMEOF(src, computer_id))
+ if(!check_rights(R_SENSITIVE, FALSE))
+ return "SENSITIVE"
+ if(NAMEOF(src, address))
+ if(!check_rights(R_SENSITIVE, FALSE))
+ return "SENSITIVE"
+
/client/proc/rescale_view(change, min, max)
var/viewscale = getviewsize(view)
var/x = viewscale[1]
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index e1a4ac6118..256aa0ed5d 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -991,6 +991,12 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
switch(var_name)
if("logging")
return debug_variable(var_name, logging, 0, src, FALSE)
+ if(NAMEOF(src, lastKnownIP))
+ if(!check_rights(R_SENSITIVE, FALSE))
+ return "SENSITIVE"
+ if(NAMEOF(src, computer_id))
+ if(!check_rights(R_SENSITIVE, FALSE))
+ return "SENSITIVE"
. = ..()
/mob/vv_auto_rename(new_name)
diff --git a/code/modules/power/singularity/investigate.dm b/code/modules/power/singularity/investigate.dm
index 3caf934b50..5db912b8d6 100644
--- a/code/modules/power/singularity/investigate.dm
+++ b/code/modules/power/singularity/investigate.dm
@@ -1,4 +1,4 @@
/area/engine/engineering/poweralert(state, source)
if (state != poweralm)
investigate_log("has a power alarm!", INVESTIGATE_SINGULO)
- ..()
\ No newline at end of file
+ ..()
diff --git a/config/admin_ranks.txt b/config/admin_ranks.txt
index fc1cb96c86..adbba1acb6 100644
--- a/config/admin_ranks.txt
+++ b/config/admin_ranks.txt
@@ -30,6 +30,7 @@
# +SPAWN (or +CREATE) = mob transformations, spawning of most atoms including mobs (high-risk atoms, e.g. blackholes, will require the +FUN flag too)
# +AUTOLOGIN = admin gains powers upon connect. This defaults to on, you can use -AUTOLOGIN to make a role require using the readmin verb to gain powers. (this does not effect the admin's ability to walk past bans or other on-connect limitations like panic bunker or pop limit.)
# +DBRANKS = when sql-based admin loading is enabled, allows for non-temporary changes in the permissions panel to be saved (requires DB)
+# +SENSITIVE = Defaults to on, use - to remove it. Allows reading IPs, CIDs, grabbing logs, and proccalls to certain things like admin holders/clients/subsystems considered "sensitive".
# +EVERYTHING (or +HOST or +ALL) = Simply gives you everything without having to type every flag
# END_KEYWORDS
From 30b711aecb00a15212fbd6063da3134d854025aa Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 12 Oct 2020 02:38:43 -0700
Subject: [PATCH 002/165] Update sql_message_system.dm
---
code/modules/admin/sql_message_system.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm
index d8135d54c0..ac3d5a03a0 100644
--- a/code/modules/admin/sql_message_system.dm
+++ b/code/modules/admin/sql_message_system.dm
@@ -6,7 +6,7 @@
return
var/target_ckey = ckey(target_key)
if(!target_key && (type == "note" || type == "message" || type == "watchlist entry"))
- var/new_key = input(usr,"Who would you like to create a [type] for?","Enter a key or ckey",null) as null|text
+ var/new_key = input(usr,"Who would you like to create a [type] for?","Enter a key or ckey",null) as null|textw
if(!new_key)
return
var/new_ckey = sanitizeSQL(ckey(new_key))
@@ -299,7 +299,7 @@
qdel(query_find_message_secret)
/proc/browse_messages(type, target_ckey, index, linkless = FALSE, filter, agegate = FALSE)
- if(!check_rights(R_SENSITIVE))
+ if(IsAdminAdvancedProcCall() && !check_rights(R_SENSITIVE))
return
if(!SSdbcore.Connect())
to_chat(usr, "Failed to establish database connection.")
From 6c7b34748b7ad90a54becbc5315835469881bf25 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 12 Oct 2020 12:32:37 -0700
Subject: [PATCH 003/165] Update sql_message_system.dm
---
code/modules/admin/sql_message_system.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm
index ac3d5a03a0..e1a8cc5758 100644
--- a/code/modules/admin/sql_message_system.dm
+++ b/code/modules/admin/sql_message_system.dm
@@ -298,8 +298,8 @@
browse_messages(target_ckey = ckey(target_key), agegate = TRUE)
qdel(query_find_message_secret)
-/proc/browse_messages(type, target_ckey, index, linkless = FALSE, filter, agegate = FALSE)
- if(IsAdminAdvancedProcCall() && !check_rights(R_SENSITIVE))
+/proc/browse_messages(type, target_ckey, index, linkless = FALSE, filter, agegate = FALSE, override = FALSE)
+ if((!override || IsAdminAdvancedProcCall()) && !check_rights(R_SENSITIVE))
return
if(!SSdbcore.Connect())
to_chat(usr, "Failed to establish database connection.")
From 1bab47bafbcb68fbe5c2f5032eab57a0d87a83a7 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 12 Oct 2020 12:33:27 -0700
Subject: [PATCH 004/165] Update ooc.dm
---
code/modules/client/verbs/ooc.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm
index 5a8325fd64..c242509344 100644
--- a/code/modules/client/verbs/ooc.dm
+++ b/code/modules/client/verbs/ooc.dm
@@ -179,7 +179,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
to_chat(usr, "Sorry, that function is not enabled on this server.")
return
- browse_messages(null, usr.ckey, null, TRUE)
+ browse_messages(null, usr.ckey, null, TRUE, override = TRUE)
/client/proc/self_playtime()
set name = "View tracked playtime"
From 45a7c68da19d454798d3e933b251e005e680e68f Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Fri, 11 Dec 2020 15:05:00 -0700
Subject: [PATCH 005/165] wow
---
code/__DEFINES/role_preferences.dm | 1 +
.../configuration/entries/general.dm | 2 -
.../configuration/entries/respawns.dm | 24 ++++++++
code/controllers/subsystem/ticker.dm | 5 ++
code/modules/admin/topic.dm | 6 ++
code/modules/client/preferences.dm | 16 ++++-
code/modules/jobs/job_types/_job.dm | 12 ++++
code/modules/jobs/job_types/ai.dm | 1 +
code/modules/jobs/job_types/assistant.dm | 1 +
code/modules/jobs/job_types/captain.dm | 1 +
code/modules/jobs/job_types/chief_engineer.dm | 1 +
.../jobs/job_types/chief_medical_officer.dm | 1 +
code/modules/jobs/job_types/cyborg.dm | 1 +
code/modules/jobs/job_types/detective.dm | 1 +
.../jobs/job_types/head_of_personnel.dm | 2 +-
.../jobs/job_types/head_of_security.dm | 1 +
code/modules/jobs/job_types/quartermaster.dm | 1 +
.../jobs/job_types/research_director.dm | 1 +
.../jobs/job_types/security_officer.dm | 1 +
code/modules/jobs/job_types/warden.dm | 1 +
.../modules/mob/dead/new_player/new_player.dm | 5 ++
code/modules/mob/dead/observer/respawn.dm | 60 +++++++++++++++++++
code/modules/mob/mob.dm | 33 ----------
config/config.txt | 4 +-
config/respawns.txt | 17 ++++++
tgstation.dme | 2 +
26 files changed, 160 insertions(+), 41 deletions(-)
create mode 100644 code/controllers/configuration/entries/respawns.dm
create mode 100644 code/modules/mob/dead/observer/respawn.dm
create mode 100644 config/respawns.txt
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index d7487eb54b..605b3f6485 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -40,6 +40,7 @@
//#define ROLE_MONSTERHUNTER "monster hunter" Disabled for now
#define ROLE_GHOSTCAFE "ghostcafe"
#define ROLE_MINOR_ANTAG "minorantag"
+#define ROLE_RESPAWN "respawnsystem"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
//(in game days played) to play that role
diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm
index 90ec3bc289..3c93952b65 100644
--- a/code/controllers/configuration/entries/general.dm
+++ b/code/controllers/configuration/entries/general.dm
@@ -172,8 +172,6 @@
/datum/config_entry/string/hostedby
-/datum/config_entry/flag/norespawn
-
/datum/config_entry/flag/guest_jobban
/datum/config_entry/flag/usewhitelist
diff --git a/code/controllers/configuration/entries/respawns.dm b/code/controllers/configuration/entries/respawns.dm
new file mode 100644
index 0000000000..b19c8bf9d8
--- /dev/null
+++ b/code/controllers/configuration/entries/respawns.dm
@@ -0,0 +1,24 @@
+/// Allows usage of respawn system
+/datum/config_entry/flag/respawns_enabled
+ config_entry_value = FALSE
+
+/// Minutes before allowing respawns.
+/datum/config_entry/number/respawn_delay
+ config_entry_value = 15.0
+ integer = FALSE
+
+/// Allows respawning as non-assistant. Overrides all others of this type.
+/datum/config_entry/flag/allow_non_assistant_respawn
+ config_entry_value = FALSE
+
+/// Allows respawning as a combat role, defined as security/head.
+/datum/config_entry/flag/allow_combat_role_respawn
+ config_entry_value = FALSE
+
+/// Allows respawning as the same character as a previous life
+/datum/config_entry/flag/allow_same_character_respawn
+ config_entry_value = FALSE
+
+/// Observing penalizes for respawns, not just joining.
+/datum/config_entry/flag/respawn_penalty_includes_observe
+ config_entry_value = FALSE
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 95d8928368..730ee3d6ab 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -371,6 +371,11 @@ SUBSYSTEM_DEF(ticker)
if(player.ready == PLAYER_READY_TO_PLAY && player.mind)
GLOB.joined_player_list += player.ckey
player.create_character(FALSE)
+ if(player.new_character && player.client && player.client.prefs) // we cannot afford a runtime, ever
+ LAZYOR(player.client.prefs.slots_joined_as, player.client.prefs.slot)
+ LAZYOR(player.client.prefs.characters_joined_as, player.new_character.real_name))
+ else
+ stack_trace("WARNING: Either a player did not have a new_character, did not have a client, or did not have preferences. This is VERY bad.")
else
player.new_player_panel()
CHECK_TICK
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index ad8dd168eb..fd8204a296 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -936,6 +936,12 @@
else
dat += "
Mind Transfer Potion | "
+ //Respawns
+ if(jobban_isbanned(M, ROLE_RESPAWN))
+ dat += "Respawns | "
+ else
+ dat += "Respawns | "
+
dat += ""
usr << browse(dat, "window=jobban2;size=800x450")
return
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 16d6ca351d..dddb78a729 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -12,11 +12,23 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
var/max_save_slots = 24
- //non-preference stuff
- var/muted = 0
+ // Intra-round persistence begin
+ /// Flags for admin mutes
+ var/muted = NONE
+ /// Last IP the person was seen on
var/last_ip
+ /// Last CID the person was seen on
var/last_id
+ /// Do we log their clicks to disk?
var/log_clicks = FALSE
+ /// Characters they have joined the round under - Lazylist of names
+ var/list/characters_joined_as
+ /// Slots they have joined the round under - Lazylist of numbers
+ var/list/slots_joined_as
+ /// Are we currently subject to respawn restrictions? Usually set by us using the "respawn" verb, but can be lifted by admins.
+ var/respawn_restrictions_active = FALSE
+
+ // Intra-round persistence end
var/icon/custom_holoform_icon
var/list/cached_holoform_icons
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index b0ac5248c1..bb55ad45ca 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -73,6 +73,12 @@
/// Starting skill modifiers.
var/list/starting_modifiers
+ // These can be flags but I don't care because they're never changed
+ /// Can you always join as this job even while respawning (should probably only be on for assistant)
+ var/always_can_respawn_as = FALSE
+ /// Is this job considered a combat role for respawning? (usually sec/command)
+ var/considered_combat_role = FALSE
+
/**
* Checks if we should be created on a certain map
*/
@@ -118,6 +124,12 @@
//Used for a special check of whether to allow a client to latejoin as this job.
/datum/job/proc/special_check_latejoin(client/C)
+ var/joined = LAZYLEN(C.prefs?.characters_joined_as)
+ if(C.prefs?.respawn_restrictions_active && (joined || CONFIG_GET(flag/respawn_penalty_includes_observe)))
+ if(!CONFIG_GET(flag/allow_non_assistant_respawn) && always_can_respawn_as)
+ return FALSE
+ if(!CONFIG_GET(flag/allow_combat_role_respawn) && considered_combat_role)
+ return FALSE
return TRUE
/datum/job/proc/GetAntagRep()
diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm
index a7401791ab..d0eb690e94 100644
--- a/code/modules/jobs/job_types/ai.dm
+++ b/code/modules/jobs/job_types/ai.dm
@@ -16,6 +16,7 @@
display_order = JOB_DISPLAY_ORDER_AI
var/do_special_check = TRUE
threat = 5
+ considered_combat_role = TRUE
starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic)
diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm
index b8fc963989..db5390f323 100644
--- a/code/modules/jobs/job_types/assistant.dm
+++ b/code/modules/jobs/job_types/assistant.dm
@@ -18,6 +18,7 @@ Assistant
paycheck_department = ACCOUNT_CIV
display_order = JOB_DISPLAY_ORDER_ASSISTANT
dresscodecompliant = FALSE
+ always_can_respawn_as = TRUE
threat = 0.2
/datum/job/assistant/get_access()
diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm
index 047a07062d..4806bf5546 100644
--- a/code/modules/jobs/job_types/captain.dm
+++ b/code/modules/jobs/job_types/captain.dm
@@ -14,6 +14,7 @@
exp_requirements = 180
exp_type = EXP_TYPE_COMMAND
exp_type_department = EXP_TYPE_COMMAND
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/captain
diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm
index 18be8c9835..902be0bdc8 100644
--- a/code/modules/jobs/job_types/chief_engineer.dm
+++ b/code/modules/jobs/job_types/chief_engineer.dm
@@ -15,6 +15,7 @@
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_ENGINEERING
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/ce
plasma_outfit = /datum/outfit/plasmaman/ce
diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm
index 627a7a2ca1..bb5fc68809 100644
--- a/code/modules/jobs/job_types/chief_medical_officer.dm
+++ b/code/modules/jobs/job_types/chief_medical_officer.dm
@@ -15,6 +15,7 @@
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_MEDICAL
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/cmo
plasma_outfit = /datum/outfit/plasmaman/cmo
diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm
index 4f74542b2a..761882894f 100644
--- a/code/modules/jobs/job_types/cyborg.dm
+++ b/code/modules/jobs/job_types/cyborg.dm
@@ -11,6 +11,7 @@
minimal_player_age = 21
exp_requirements = 120
exp_type = EXP_TYPE_CREW
+ considered_combat_role = TRUE
starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic)
diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm
index 65724765e1..c704326879 100644
--- a/code/modules/jobs/job_types/detective.dm
+++ b/code/modules/jobs/job_types/detective.dm
@@ -15,6 +15,7 @@
outfit = /datum/outfit/job/detective
plasma_outfit = /datum/outfit/plasmaman/detective
+ considered_combat_role = TRUE
access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm
index 41fb4b99da..f1b7d3e8c4 100644
--- a/code/modules/jobs/job_types/head_of_personnel.dm
+++ b/code/modules/jobs/job_types/head_of_personnel.dm
@@ -15,7 +15,7 @@
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_SERVICE
-
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/hop
plasma_outfit = /datum/outfit/plasmaman/hop
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index cfd8d7f6c0..c772a8acae 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -14,6 +14,7 @@
minimal_player_age = 10
exp_requirements = 300
exp_type = EXP_TYPE_CREW
+ considered_combat_role = TRUE
exp_type_department = EXP_TYPE_SECURITY
outfit = /datum/outfit/job/hos
diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm
index 4c6b8e064f..301acff5c4 100644
--- a/code/modules/jobs/job_types/quartermaster.dm
+++ b/code/modules/jobs/job_types/quartermaster.dm
@@ -15,6 +15,7 @@
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_SUPPLY
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/quartermaster
diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm
index 33f7df8260..6c2cb94d13 100644
--- a/code/modules/jobs/job_types/research_director.dm
+++ b/code/modules/jobs/job_types/research_director.dm
@@ -15,6 +15,7 @@
exp_type_department = EXP_TYPE_SCIENCE
exp_requirements = 180
exp_type = EXP_TYPE_CREW
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/rd
plasma_outfit = /datum/outfit/plasmaman/rd
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index bc83eb752d..bdae7fe028 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -12,6 +12,7 @@
minimal_player_age = 7
exp_requirements = 300
exp_type = EXP_TYPE_CREW
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/security
plasma_outfit = /datum/outfit/plasmaman/security
diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm
index c909342d6f..dae3094ebe 100644
--- a/code/modules/jobs/job_types/warden.dm
+++ b/code/modules/jobs/job_types/warden.dm
@@ -12,6 +12,7 @@
minimal_player_age = 7
exp_requirements = 300
exp_type = EXP_TYPE_CREW
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/warden
plasma_outfit = /datum/outfit/plasmaman/warden
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 91123c0c7f..a06fee2cf7 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -382,6 +382,9 @@
alert(src, "An administrator has disabled late join spawning.")
return FALSE
+ if(!respawn_latejoin_check(notify = TRUE))
+ return FALSE
+
var/arrivals_docked = TRUE
if(SSshuttle.arrivals)
close_spawn_windows() //In case we get held up
@@ -445,6 +448,8 @@
GLOB.joined_player_list += character.ckey
GLOB.latejoiners += character
+ LAZYOR(prefs.slots_joined_as, prefs.slot)
+ LAZYOR(prefs.characters_joined_as, character.real_name))
if(CONFIG_GET(flag/allow_latejoin_antagonists) && humanc) //Borgs aren't allowed to be antags. Will need to be tweaked if we get true latejoin ais.
if(SSshuttle.emergency)
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
new file mode 100644
index 0000000000..d162e19531
--- /dev/null
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -0,0 +1,60 @@
+// ADMIN VERBS BEGIN
+/**
+ * Fully returns a player to lobby, allowing them to bypass all respawn restrictions
+ * Works on ghosts or new players (lobby players)
+ * If a lobby player is selected, their restrictions are removed.
+ */
+/client/proc/admin_cmd_respawn_return_to_lobby()
+
+/**
+ * Allows a ghost to bypass respawn delay without lifting respawn restrictions
+ */
+/client/proc/admin_cmd_remove_ghost_respawn_timer()
+
+// ADMIN VERBS END
+
+/**
+ * Checks if we can latejoin on the currently selected slot, taking into account respawn status.
+ */
+/mob/dead/new_player/proc/respawn_latejoin_check(notify = FALSE)
+
+/**
+ * Attempts to respawn.
+ */
+/mob/dead/observer/verb/respawn()
+ set name = "Respawn"
+ set category = "OOC"
+
+
+/mob/verb/abandon_mob()
+ set name = "Respawn"
+ set category = "OOC"
+
+ if (CONFIG_GET(flag/norespawn))
+ return
+ if ((stat != DEAD || !( SSticker )))
+ to_chat(usr, "You must be dead to use this!")
+ return
+
+ log_game("[key_name(usr)] used abandon mob.")
+
+ to_chat(usr, "Please roleplay correctly!")
+
+ if(!client)
+ log_game("[key_name(usr)] AM failed due to disconnect.")
+ return
+ client.screen.Cut()
+ client.screen += client.void
+ if(!client)
+ log_game("[key_name(usr)] AM failed due to disconnect.")
+ return
+
+ var/mob/dead/new_player/M = new /mob/dead/new_player()
+ if(!client)
+ log_game("[key_name(usr)] AM failed due to disconnect.")
+ qdel(M)
+ return
+
+ M.key = key
+// M.Login() //wat
+ return
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 3416a8b337..bac80d7ae7 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -457,39 +457,6 @@
else
to_chat(src, "You don't have a mind datum for some reason, so you can't add a note to it.")
-/mob/verb/abandon_mob()
- set name = "Respawn"
- set category = "OOC"
-
- if (CONFIG_GET(flag/norespawn))
- return
- if ((stat != DEAD || !( SSticker )))
- to_chat(usr, "You must be dead to use this!")
- return
-
- log_game("[key_name(usr)] used abandon mob.")
-
- to_chat(usr, "Please roleplay correctly!")
-
- if(!client)
- log_game("[key_name(usr)] AM failed due to disconnect.")
- return
- client.screen.Cut()
- client.screen += client.void
- if(!client)
- log_game("[key_name(usr)] AM failed due to disconnect.")
- return
-
- var/mob/dead/new_player/M = new /mob/dead/new_player()
- if(!client)
- log_game("[key_name(usr)] AM failed due to disconnect.")
- qdel(M)
- return
-
- M.key = key
-// M.Login() //wat
- return
-
/mob/proc/transfer_ckey(mob/new_mob, send_signal = TRUE)
if(!new_mob || (!ckey && new_mob.ckey))
CRASH("transfer_ckey() called [new_mob ? "on ckey-less mob with a player mob as target" : "without a valid mob target"]!")
diff --git a/config/config.txt b/config/config.txt
index 5be76972ab..72df74beb1 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -11,6 +11,7 @@ $include dynamic_config.txt
$include plushies/defines.txt
$include job_threats.txt
$include policy.txt
+$include respawns.txt
# You can use the @ character at the beginning of a config option to lock it from being edited in-game
# Example usage:
@@ -206,9 +207,6 @@ VOTE_AUTOTRANSFER_MAXIMUM 4
## players' votes default to "No vote" (otherwise, default to "No change")
# DEFAULT_NO_VOTE
-## disable abandon mob
-NORESPAWN
-
## disables calling del(src) on newmobs if they logout before spawnin in
# DONT_DEL_NEWMOB
diff --git a/config/respawns.txt b/config/respawns.txt
new file mode 100644
index 0000000000..97b196135a
--- /dev/null
+++ b/config/respawns.txt
@@ -0,0 +1,17 @@
+## Allow usage of the respawn system
+RESPAWNS_ENABLED
+
+## Minutes delay before allowing respawns, either from death or observing. Not an integer.
+RESPAWN_DELAY 15.0
+
+## Allow respawning as anything but an assistant.
+# ALLOW_NON_ASSISTANT_RESPAWN
+
+## Allow respawning as security and command. Only works if ALLOW_NON_ASSISTANT_RESPAWN is on.
+# ALLOW_COMBAT_ROLE_RESPAWN
+
+## Allow respawning as the same character
+# ALLOW_SAME_CHARACTER_RESPAWN
+
+## Observing is considered a respawn for the purposes of role lockouts. Defaults to disabled. When disabled, only RESPAWNING rather than returning from observe locks you out.
+# RESPAWN_PENALTY_INCLUDES_OBSERVE
diff --git a/tgstation.dme b/tgstation.dme
index 1387748839..bdc384776c 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -294,6 +294,7 @@
#include "code\controllers\configuration\entries\plushies.dm"
#include "code\controllers\configuration\entries\policy.dm"
#include "code\controllers\configuration\entries\resources.dm"
+#include "code\controllers\configuration\entries\respawns.dm"
#include "code\controllers\configuration\entries\stamina_combat.dm"
#include "code\controllers\subsystem\acid.dm"
#include "code\controllers\subsystem\adjacent_air.dm"
@@ -2451,6 +2452,7 @@
#include "code\modules\mob\dead\observer\observer.dm"
#include "code\modules\mob\dead\observer\observer_movement.dm"
#include "code\modules\mob\dead\observer\orbit.dm"
+#include "code\modules\mob\dead\observer\respawn.dm"
#include "code\modules\mob\dead\observer\say.dm"
#include "code\modules\mob\living\blood.dm"
#include "code\modules\mob\living\bloodcrawl.dm"
From 24c09edd03d48c4f7cd59e38e4aa81c6b4e9774f Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sat, 12 Dec 2020 11:12:37 -0700
Subject: [PATCH 006/165] stuff
---
code/modules/admin/admin_verbs.dm | 5 +-
code/modules/client/preferences.dm | 2 +
.../modules/mob/dead/new_player/new_player.dm | 1 +
code/modules/mob/dead/observer/respawn.dm | 120 ++++++++++++++++++
4 files changed, 127 insertions(+), 1 deletion(-)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 52b4fa05b1..e2c12353f7 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -78,8 +78,11 @@ GLOBAL_PROTECT(admin_verbs_admin)
/client/proc/mark_datum_mapview,
/client/proc/hide_verbs, /*hides all our adminverbs*/
/client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/
- /datum/admins/proc/open_borgopanel
+ /datum/admins/proc/open_borgopanel,
+ /client/proc/admin_cmd_respawn_return_to_lobby,
+ /client/proc/admin_cmd_remove_ghost_respawn_timer
)
+
GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/DB_ban_panel, /client/proc/stickybanpanel))
GLOBAL_PROTECT(admin_verbs_ban)
GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound, /client/proc/play_sound, /client/proc/manual_play_web_sound, /client/proc/set_round_end_sound))
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index dddb78a729..e73808cad7 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -27,6 +27,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/list/slots_joined_as
/// Are we currently subject to respawn restrictions? Usually set by us using the "respawn" verb, but can be lifted by admins.
var/respawn_restrictions_active = FALSE
+ /// time of death we consider for respawns
+ var/respawn_time_of_death = -INFINITY
// Intra-round persistence end
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index a06fee2cf7..6d619c4fd1 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -316,6 +316,7 @@
stack_trace("There's no freaking observer landmark available on this map or you're making observers before the map is initialised")
transfer_ckey(observer, FALSE)
observer.client = client
+ observer.client.prefs?.respawn_time_of_death = world.time
observer.set_ghost_appearance()
if(observer.client && observer.client.prefs)
observer.real_name = observer.client.prefs.real_name
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
index d162e19531..fb1873adff 100644
--- a/code/modules/mob/dead/observer/respawn.dm
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -5,11 +5,72 @@
* If a lobby player is selected, their restrictions are removed.
*/
/client/proc/admin_cmd_respawn_return_to_lobby()
+ set name = "Respawn Player (Unrestricted)"
+ set desc = "Gives a player an unrestricted respawn, resetting all respawn restrictions for them."
+ set category = "Admin"
+
+ var/list/mob/valid = list()
+ for(var/mob/dead/observer/I in GLOB.dead_mob_list)
+ if(!I.client)
+ continue
+ valid["[I.ckey] - Observing: [I]"] = I.ckey
+ for(var/mob/dead/new_player/I in GLOB.dead_mob_list)
+ if(!I.client || !I.prefs.respawn_restrictions_active)
+ continue
+ valid["[I.ckey] - IN LOBBY"] = I.ckey
+ var/ckey = valid[input(src, "Choose a player (only showing logged in players who have restrictions)", "Unrestricted Respawn") as null|anything in valid]
+ var/client/player = GLOB.directory[ckey]
+ if(!player)
+ to_chat(src, "Client not found.")
+ return
+ var/mob/M = player.mob
+ if(istype(M, /mob/dead/observer))
+ var/mob/dead/observer/O = M
+ var/confirm = alert(src, "Send [O]([ckey]) back to the lobby without respawn restrictions?", "Send to Lobby", "Yes", "No")
+ if(confirm != "Yes")
+ return
+ message_admins("[key_name_admin(src)] gave [key_name_admin(O)] a full respawn and sent them back to the lobby.")
+ log_admin("[key_name(src)] gave [key_name(O)] a full respawn and sent them back to the lobby.")
+ to_chat(O, "You have been given a full respawn.")
+ O.do_respawn(FALSE)
+ else if(istype(M, /mob/dead/new_player))
+ var/mob/dead/new_player/NP = M
+ var/confirm = alert(src, "Remove [NP]'s respawn restrictions?", "Remove Restrictions", "Yes", "No")
+ if(confirm != "Yes")
+ return
+ message_admins("[key_name_admin(src)] removed [ckey]'s respawn restrictions.")
+ log_admins("[key_name(src)] removed [ckey]'s respawn restrictions")
+ NP.client.prefs.respawn_restrictions_active = FALSE
+ to_chat(NP, "Your respawn restrictions have been removed.")
+ else
+ CRASH("Invalid mobtype")
/**
* Allows a ghost to bypass respawn delay without lifting respawn restrictions
*/
/client/proc/admin_cmd_remove_ghost_respawn_timer()
+ set name = "Remove Respawn Timer for Player"
+ set desc = "Removes a player's respawn timer without removing their respawning restrictions."
+ set category = "Admin"
+
+ var/list/mob/dead/observer/valid = list()
+ for(var/mob/dead/observer/i in GLOB.dead_mob_list)
+ if(!I.client)
+ continue
+ valid["[I.ckey] - [I.name]"] = I
+ var/mob/dead/observer/O = valid[input(src, "Choose a player (only showing logged in)", "Remove Respawn Timer") as null|anything in valid]
+
+ if(!O.client)
+ to_chat(src, "[O] has no client.")
+ return
+ var/timeleft = O.time_left_to_respawn()
+ if(!timeleft)
+ to_chat(src, "[O] can already respawn.")
+ return
+ message_admins("[key_name_admin(src)] removed [key_name_admin(O)]'s respawn timer.")
+ log_admin("[key_name(src)] removed [key_name(O)]'s respawn timer.")
+ O.client.prefs.respawn_time_of_death = -INFINITY
+ to_chat(O, "Your respawn timer has been removed.")
// ADMIN VERBS END
@@ -17,6 +78,19 @@
* Checks if we can latejoin on the currently selected slot, taking into account respawn status.
*/
/mob/dead/new_player/proc/respawn_latejoin_check(notify = FALSE)
+ var/can_same_person = CONFIG_GET(flag/allow_same_character_respawn)
+ if(can_same_person)
+ return TRUE
+ var/nameless = client.prefs.nameless
+ var/randomname = client.prefs.be_random_name
+ var/randombody = client.prefs.be_random_body
+ if(randombody && (nameless || randomname))
+ return TRUE // somewhat unrecognizable
+ if(client.prefs.slots_joined_as && (client.prefs.default_slot in client.prefs.slots_joined_as))
+ return FALSE
+ if((!nameless && !randomname) && (client.prefs.characters_joined_as && (client.prefs.real_name in client.prefs.characters_joined_as)))
+ return FALSE
+ return TRUE
/**
* Attempts to respawn.
@@ -25,6 +99,52 @@
set name = "Respawn"
set category = "OOC"
+ var/timeleft = time_left_to_respawn()
+ if(timeleft)
+ to_chat(src, "It's been too short of a time since you died/observed! Please wait [round(timeleft / 600, 0.1)] more minutes.")
+ return
+ do_respawn(TRUE)
+
+/**
+ * Gets time left until we can respawn. Returns 0 if we can respawn now.
+ */
+/mob/dead/observer/verb/time_left_to_respawn()
+ ASSERT(client)
+ return max(0, (CONFIG_GET(number/respawn_delay) MINUTES + client.prefs.respawn_time_of_death) - world.time)
+
+/**
+ * Handles respawning
+ */
+/mob/dead/observer/proc/do_respawn(penalize)
+ if(!client)
+ return
+ if(isnull(penalize))
+ penalize = client.prefs.respawn_restrictions_active
+ client.prefs.respawn_restrictions_active = penalize
+
+ to_chat(src, "You have been respawned to the lobby. \
+ Remember to take heed of rules regarding round knowledge - notably, that ALL past lives are forgotten. \
+ Any character you join as has NO knowledge of round events unless specified otherwise by an admin.")
+
+ log_game("[key_name(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.")
+ transfer_to_lobby()
+
+/**
+ * Actual proc that removes us and puts us back on lobby
+ */
+/mob/dead/observer/proc/transfer_to_lobby()
+ if(!client) // if no one's in us we can just be deleted
+ qdel(src)
+ return
+ client.screen.Cut()
+ client.view_size.resetToDefault()
+ client.generate_clickcatcher()
+ client.apply_clickcatcher()
+ client.view_size.setDefault(getScreenSize(client.prefs.widescreenpref))
+ client.view_size.resetToDefault()
+
+ var/mob/dead/new_player/M = new /mob/dead/new_player
+ M.ckey = ckey
/mob/verb/abandon_mob()
set name = "Respawn"
From 07d8e72125113d964b34b4fe3b3e33f4dd550fa1 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sat, 12 Dec 2020 11:19:45 -0700
Subject: [PATCH 007/165] fix
---
code/controllers/subsystem/ticker.dm | 2 +-
code/datums/world_topic.dm | 2 +-
code/modules/admin/admin.dm | 4 +-
.../modules/mob/dead/new_player/new_player.dm | 4 +-
code/modules/mob/dead/observer/respawn.dm | 43 +++----------------
code/modules/mob/living/death.dm | 4 ++
6 files changed, 17 insertions(+), 42 deletions(-)
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 730ee3d6ab..e58d05f0d8 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -373,7 +373,7 @@ SUBSYSTEM_DEF(ticker)
player.create_character(FALSE)
if(player.new_character && player.client && player.client.prefs) // we cannot afford a runtime, ever
LAZYOR(player.client.prefs.slots_joined_as, player.client.prefs.slot)
- LAZYOR(player.client.prefs.characters_joined_as, player.new_character.real_name))
+ LAZYOR(player.client.prefs.characters_joined_as, player.new_character.real_name)
else
stack_trace("WARNING: Either a player did not have a new_character, did not have a client, or did not have preferences. This is VERY bad.")
else
diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm
index 261e423640..7a1f0f6980 100644
--- a/code/datums/world_topic.dm
+++ b/code/datums/world_topic.dm
@@ -164,7 +164,7 @@
. = list()
.["version"] = GLOB.game_version
.["mode"] = "hidden" //CIT CHANGE - hides the gamemode in topic() calls to prevent meta'ing the gamemode
- .["respawn"] = config ? !CONFIG_GET(flag/norespawn) : FALSE
+ .["respawn"] = config ? CONFIG_GET(flag/respawns_enabled) : FALSE
.["enter"] = GLOB.enter_allowed
.["vote"] = CONFIG_GET(flag/allow_vote_mode)
.["ai"] = CONFIG_GET(flag/allow_ai)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index d4b2d03428..d4afc3dbb4 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -679,8 +679,8 @@
set category = "Server"
set desc="Respawn basically"
set name="Toggle Respawn"
- var/new_nores = !CONFIG_GET(flag/norespawn)
- CONFIG_SET(flag/norespawn, new_nores)
+ var/new_nores = CONFIG_GET(flag/respawns_enabled)
+ CONFIG_SET(flag/respawns_enabled, !new_nores)
if (!new_nores)
to_chat(world, "You may now respawn.", confidential = TRUE)
else
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 6d619c4fd1..09975ed7b9 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -449,8 +449,8 @@
GLOB.joined_player_list += character.ckey
GLOB.latejoiners += character
- LAZYOR(prefs.slots_joined_as, prefs.slot)
- LAZYOR(prefs.characters_joined_as, character.real_name))
+ LAZYOR(character.client.prefs.slots_joined_as, prefs.slot)
+ LAZYOR(character.client.prefs.characters_joined_as, character.real_name)
if(CONFIG_GET(flag/allow_latejoin_antagonists) && humanc) //Borgs aren't allowed to be antags. Will need to be tweaked if we get true latejoin ais.
if(SSshuttle.emergency)
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
index fb1873adff..0ccdc460cf 100644
--- a/code/modules/mob/dead/observer/respawn.dm
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -15,7 +15,7 @@
continue
valid["[I.ckey] - Observing: [I]"] = I.ckey
for(var/mob/dead/new_player/I in GLOB.dead_mob_list)
- if(!I.client || !I.prefs.respawn_restrictions_active)
+ if(!I.client || !I.client.prefs.respawn_restrictions_active)
continue
valid["[I.ckey] - IN LOBBY"] = I.ckey
var/ckey = valid[input(src, "Choose a player (only showing logged in players who have restrictions)", "Unrestricted Respawn") as null|anything in valid]
@@ -39,7 +39,7 @@
if(confirm != "Yes")
return
message_admins("[key_name_admin(src)] removed [ckey]'s respawn restrictions.")
- log_admins("[key_name(src)] removed [ckey]'s respawn restrictions")
+ log_admin("[key_name(src)] removed [ckey]'s respawn restrictions")
NP.client.prefs.respawn_restrictions_active = FALSE
to_chat(NP, "Your respawn restrictions have been removed.")
else
@@ -54,7 +54,7 @@
set category = "Admin"
var/list/mob/dead/observer/valid = list()
- for(var/mob/dead/observer/i in GLOB.dead_mob_list)
+ for(var/mob/dead/observer/I in GLOB.dead_mob_list)
if(!I.client)
continue
valid["[I.ckey] - [I.name]"] = I
@@ -99,6 +99,10 @@
set name = "Respawn"
set category = "OOC"
+ if(!CONFIG_GET(flag/respawns_enabled))
+ to_chat(src, "Respawns are disabled in configuration.")
+ return
+
var/timeleft = time_left_to_respawn()
if(timeleft)
to_chat(src, "It's been too short of a time since you died/observed! Please wait [round(timeleft / 600, 0.1)] more minutes.")
@@ -145,36 +149,3 @@
var/mob/dead/new_player/M = new /mob/dead/new_player
M.ckey = ckey
-
-/mob/verb/abandon_mob()
- set name = "Respawn"
- set category = "OOC"
-
- if (CONFIG_GET(flag/norespawn))
- return
- if ((stat != DEAD || !( SSticker )))
- to_chat(usr, "You must be dead to use this!")
- return
-
- log_game("[key_name(usr)] used abandon mob.")
-
- to_chat(usr, "Please roleplay correctly!")
-
- if(!client)
- log_game("[key_name(usr)] AM failed due to disconnect.")
- return
- client.screen.Cut()
- client.screen += client.void
- if(!client)
- log_game("[key_name(usr)] AM failed due to disconnect.")
- return
-
- var/mob/dead/new_player/M = new /mob/dead/new_player()
- if(!client)
- log_game("[key_name(usr)] AM failed due to disconnect.")
- qdel(M)
- return
-
- M.key = key
-// M.Login() //wat
- return
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index c605f91528..f0caa63a1a 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -66,6 +66,10 @@
GLOB.alive_mob_list -= src
if(!gibbed)
GLOB.dead_mob_list += src
+ if(mind.key)
+ var/datum/preferences/P = GLOB.preferences_datums[ckey(mind.key)]
+ if(P)
+ P.respawn_time_of_death = world.time
set_drugginess(0)
set_disgust(0)
SetSleeping(0, 0)
From a4688557d7424bf3b852c6186bcf9a4f166c9b64 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sun, 13 Dec 2020 02:29:31 -0700
Subject: [PATCH 008/165] Cryo
---
code/controllers/subsystem/ticker.dm | 2 +-
code/game/machinery/cryopod.dm | 197 +++++++-----------
.../modules/mob/dead/new_player/new_player.dm | 2 +-
3 files changed, 83 insertions(+), 118 deletions(-)
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index e58d05f0d8..198c380f41 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -372,7 +372,7 @@ SUBSYSTEM_DEF(ticker)
GLOB.joined_player_list += player.ckey
player.create_character(FALSE)
if(player.new_character && player.client && player.client.prefs) // we cannot afford a runtime, ever
- LAZYOR(player.client.prefs.slots_joined_as, player.client.prefs.slot)
+ LAZYOR(player.client.prefs.slots_joined_as, player.client.prefs.default_slot)
LAZYOR(player.client.prefs.characters_joined_as, player.new_character.real_name)
else
stack_trace("WARNING: Either a player did not have a new_character, did not have a client, or did not have preferences. This is VERY bad.")
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 5bc0ed20b0..4019a00531 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -22,17 +22,16 @@
//Used for logging people entering cryosleep and important items they are carrying.
var/list/frozen_crew = list()
- var/list/frozen_items = list()
-
- // Used for containing rare items traitors need to steal, so it's not
- // game-over if they get iced
- var/list/objective_items = list()
- // A cache of theft datums so you don't have to re-create them for
- // each item check
- var/list/theft_cache = list()
+ var/list/obj/stored_packages = list()
var/allow_items = TRUE
+/obj/machinery/computer/cryopod/deconstruct()
+ . = ..()
+ for(var/i in stored_packages)
+ var/obj/O = i
+ O.forceMove(drop_location())
+
/obj/machinery/computer/cryopod/attack_ai()
attack_hand()
@@ -70,8 +69,8 @@
if(!frozen_items.len)
dat += "There has been no storage usage at this terminal.
"
else
- for(var/obj/item/I in frozen_items)
- dat += "[I.name]
"
+ for(var/obj/O in stored_packages)
+ dat += "[O.name]
"
dat += "
"
var/datum/browser/popup = new(user, "cryopod_console", "Cryogenic System Control")
@@ -87,25 +86,27 @@
add_fingerprint(user)
if(href_list["item"])
- if(!allowed(user))
+ if(!allowed(user) && !(obj_flags & EMAGGED))
to_chat(user, "Access Denied.")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
updateUsrDialog()
return
- if(!allow_items) return
- if(frozen_items.len == 0)
+ if(!allow_items)
+ return
+
+ if(stored_packages.len == 0)
to_chat(user, "There is nothing to recover from storage.")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
updateUsrDialog()
return
- var/obj/item/I = input(user, "Please choose which object to retrieve.","Object recovery",null) as null|anything in frozen_items
+ var/obj/I = input(user, "Please choose which object to retrieve.","Object recovery",null) as null|anything in stored_packages
playsound(src, "terminal_type", 25, 0)
if(!I)
return
- if(!(I in frozen_items))
+ if(!(I in stored_packages))
to_chat(user, "\The [I] is no longer in storage.")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
updateUsrDialog()
@@ -117,20 +118,21 @@
I.forceMove(drop_location())
if(user && Adjacent(user) && user.can_hold_items())
user.put_in_hands(I)
- frozen_items -= I
+ stored_packages -= I
updateUsrDialog()
else if(href_list["allitems"])
playsound(src, "terminal_type", 25, 0)
- if(!allowed(user))
+ if(!allowed(user) && !(obj_flags & EMAGGED))
to_chat(user, "Access Denied.")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
updateUsrDialog()
return
+
if(!allow_items)
return
- if(frozen_items.len == 0)
+ if(stored_packages.len == 0)
to_chat(user, "There is nothing to recover from storage.")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
return
@@ -138,10 +140,10 @@
visible_message("The console beeps happily as it disgorges the desired objects.")
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
- for(var/obj/item/I in frozen_items)
- I.forceMove(drop_location())
- frozen_items -= I
- updateUsrDialog()
+ for(var/obj/O in stored_packages)
+ O.forceMove(get_turf(src))
+ stored_packages.Cut()
+ updateUsrDialog()
else if (href_list["menu"])
src.menu = text2num(href_list["menu"])
@@ -159,6 +161,9 @@
/obj/machinery/computer/cryopod/contents_explosion()
return
+/obj/machinery/computer/cryopod/contents_explosion()
+ return //don't blow everyone's shit up.
+
//Cryopods themselves.
/obj/machinery/cryopod
name = "cryogenic freezer"
@@ -177,44 +182,9 @@
var/despawn_world_time = null // Used to keep track of the safe period.
var/obj/machinery/computer/cryopod/control_computer
+ var/item_storage_type = /obj/item/storage/box/blue //with how storage components work this can be anything the player can open or anything with a storage component.
var/last_no_computer_message = 0
- // These items are preserved when the process() despawn proc occurs.
- var/static/list/preserve_items = typecacheof(list(
- /obj/item/hand_tele,
- /obj/item/card/id/captains_spare,
- /obj/item/aicard,
- /obj/item/mmi,
- /obj/item/paicard,
- /obj/item/gun,
- /obj/item/pinpointer,
- /obj/item/clothing/shoes/magboots,
- /obj/item/areaeditor/blueprints,
- /obj/item/clothing/head/helmet/space,
- /obj/item/clothing/suit/space,
- /obj/item/clothing/suit/armor,
- /obj/item/defibrillator/compact,
- /obj/item/reagent_containers/hypospray/CMO,
- /obj/item/clothing/accessory/medal/gold/captain,
- /obj/item/clothing/gloves/krav_maga,
- /obj/item/nullrod,
- /obj/item/tank/jetpack,
- /obj/item/documents,
- /obj/item/nuke_core_container
- ))
- // These items will NOT be preserved
- var/static/list/do_not_preserve_items = typecacheof(list(
- /obj/item/mmi/posibrain,
- /obj/item/gun/energy/laser/mounted,
- /obj/item/gun/energy/e_gun/advtaser/mounted,
- /obj/item/gun/ballistic/revolver/grenadelauncher/cyborg,
- /obj/item/gun/energy/disabler/cyborg,
- /obj/item/gun/energy/e_gun/advtaser/cyborg,
- /obj/item/gun/energy/printer,
- /obj/item/gun/energy/kinetic_accelerator/cyborg,
- /obj/item/gun/energy/laser/cyborg
- ))
-
/obj/machinery/cryopod/Initialize(mapload)
. = ..()
update_icon()
@@ -286,73 +256,72 @@
despawn_occupant()
-#define CRYO_DESTROY 0
-#define CRYO_PRESERVE 1
-#define CRYO_OBJECTIVE 2
-#define CRYO_IGNORE 3
-#define CRYO_DESTROY_LATER 4
-
-/obj/machinery/cryopod/proc/should_preserve_item(obj/item/I)
- for(var/datum/objective_item/steal/T in control_computer.theft_cache)
- if(istype(I, T.targetitem) && T.check_special_completion(I))
- return CRYO_OBJECTIVE
- if(preserve_items[I] && !do_not_preserve_items[I])
- return CRYO_PRESERVE
- return CRYO_DESTROY
-
// This function can not be undone; do not call this unless you are sure
/obj/machinery/cryopod/proc/despawn_occupant()
if(!control_computer)
find_control_computer()
var/mob/living/mob_occupant = occupant
- var/list/obj/item/cryo_items = list()
+
+ var/list/obj/item/storing = list()
+ var/list/obj/item/destroying = list()
+ var/list/obj/item/destroy_later = list()
investigate_log("Despawning [key_name(mob_occupant)].", INVESTIGATE_CRYOGENICS)
- //Handle Borg stuff first
+ var/atom/target_store = (control_computer?.allow_items && control_computer) || src //the double control computer check makes it return the control computer.
+ var/drop_to_ground = !istype(target_store, /obj/machinery/computer/cryopod)
+
if(iscyborg(mob_occupant))
var/mob/living/silicon/robot/R = mob_occupant
if(R.mmi?.brain)
- cryo_items[R.mmi] = CRYO_DESTROY_LATER
- cryo_items[R.mmi.brain] = CRYO_DESTROY_LATER
- for(var/obj/item/I in R.module) // the tools the borg has; metal, glass, guns etc
- for(var/obj/item/O in I) // the things inside the tools, if anything; mainly for janiborg trash bags
- cryo_items[O] = should_preserve_item(O)
- O.forceMove(src)
- R.module.remove_module(I, TRUE) //delete the module itself so it doesn't transfer over.
-
- //Drop all items into the pod.
- for(var/obj/item/I in mob_occupant)
- if(cryo_items[I] == CRYO_IGNORE || cryo_items[I] ==CRYO_DESTROY_LATER)
- continue
- cryo_items[I] = should_preserve_item(I)
- mob_occupant.transferItemToLoc(I, src, TRUE)
- if(I.contents.len) //Make sure we catch anything not handled by qdel() on the items.
- if(cryo_items[I] != CRYO_DESTROY) // Don't remove the contents of things that need preservation
+ destroy_later += R.mmi
+ destroy_later += R.mmi.brain
+ for(var/i in R.module)
+ if(!isitem(i))
+ destroying += i
continue
- for(var/obj/item/O in I.contents)
- cryo_items[O] = should_preserve_item(O)
- O.forceMove(src)
+ var/obj/item/I = i
+ // let's be honest we only care about the trash bag don't beat around the bush
+ if(SEND_SIGNAL(I, COMSIG_CONTAINS_STORAGE))
+ storing += I.contents
+ for(var/atom/movable/AM in I.contents)
+ AM.forceMove(src)
+ R.module.remove_module(I, TRUE)
+ else
+ var/list/gear = list()
+ if(iscarbon(mob_occupant)) // sorry simp-le-mobs deserve no mercy
+ var/mob/living/carbon/C = mob_occupant
+ gear = C.get_all_gear()
+ for(var/i in gear)
+ var/obj/item/I = i
+ I.forceMove(src)
+ if(!istype(I))
+ destroying += I
+ continue
+ if(I.item_flags & (DROPDEL | ABSTRACT))
+ destroying += I
+ continue
+ if(HAS_TRAIT(I, TRAIT_NODROP))
+ destroying += I
+ continue
+ storing += I
- for(var/A in cryo_items)
- var/obj/item/I = A
- if(QDELETED(I)) //edge cases and DROPDEL.
- continue
- var/preserve = cryo_items[I]
- if(preserve == CRYO_DESTROY_LATER)
- continue
- if(preserve != CRYO_IGNORE)
- if(preserve == CRYO_DESTROY)
- qdel(I)
- else if(control_computer?.allow_items)
- control_computer.frozen_items += I
- if(preserve == CRYO_OBJECTIVE)
- control_computer.objective_items += I
- I.moveToNullspace()
- else
- I.forceMove(loc)
- cryo_items -= I
+ // get rid of mobs
+ for(var/mob/living/L in mob_occupant.GetAllContents())
+ L.forceMove(drop_location())
+
+ if(storing.len)
+ var/obj/O = new item_storage_type
+ O.name = "cryogenic retrieval package: [mob_occupant.real_name]"
+ for(var/i in stored)
+ var/obj/item/I = i
+ I.forceMove(O)
+ O.forceMove(drop_to_ground? target_store.drop_location() : target_store)
+ if((target_store == control_computer) && !drop_to_ground)
+ control_computer.stored_packages += O
+
+ QDEL_LIST(destroying)
//Update any existing objectives involving this mob.
for(var/i in GLOB.objectives)
@@ -417,16 +386,12 @@
mob_occupant.ghostize(FALSE, penalize = TRUE, voluntary = TRUE)
QDEL_NULL(occupant)
- for(var/I in cryo_items) //only "CRYO_DESTROY_LATER" atoms are left)
- var/atom/A = I
- if(!QDELETED(A))
- qdel(A)
+ QDEL_LIST(destroy_later)
open_machine()
name = initial(name)
#undef CRYO_DESTROY
#undef CRYO_PRESERVE
-#undef CRYO_OBJECTIVE
#undef CRYO_IGNORE
#undef CRYO_DESTROY_LATER
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 09975ed7b9..7acf6ad32c 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -449,7 +449,7 @@
GLOB.joined_player_list += character.ckey
GLOB.latejoiners += character
- LAZYOR(character.client.prefs.slots_joined_as, prefs.slot)
+ LAZYOR(character.client.prefs.slots_joined_as, character.client.prefs.default_slot)
LAZYOR(character.client.prefs.characters_joined_as, character.real_name)
if(CONFIG_GET(flag/allow_latejoin_antagonists) && humanc) //Borgs aren't allowed to be antags. Will need to be tweaked if we get true latejoin ais.
From 61c08ba42207c13b86089189ee1c730da49bdcdb Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sun, 13 Dec 2020 02:29:53 -0700
Subject: [PATCH 009/165] fine
---
config/respawns.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/respawns.txt b/config/respawns.txt
index 97b196135a..79eb53469c 100644
--- a/config/respawns.txt
+++ b/config/respawns.txt
@@ -5,7 +5,7 @@ RESPAWNS_ENABLED
RESPAWN_DELAY 15.0
## Allow respawning as anything but an assistant.
-# ALLOW_NON_ASSISTANT_RESPAWN
+ALLOW_NON_ASSISTANT_RESPAWN
## Allow respawning as security and command. Only works if ALLOW_NON_ASSISTANT_RESPAWN is on.
# ALLOW_COMBAT_ROLE_RESPAWN
From 99709a1a35d0613eef82271d5d0709f5b2e52261 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sun, 13 Dec 2020 04:30:00 -0700
Subject: [PATCH 010/165] fix
---
code/game/machinery/cryopod.dm | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 4019a00531..2ba902e4c2 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -66,7 +66,7 @@
if(3)
dat += "<< Back
"
dat += "Recently stored objects
"
- if(!frozen_items.len)
+ if(!stored_packages.len)
dat += "There has been no storage usage at this terminal.
"
else
for(var/obj/O in stored_packages)
@@ -314,7 +314,7 @@
if(storing.len)
var/obj/O = new item_storage_type
O.name = "cryogenic retrieval package: [mob_occupant.real_name]"
- for(var/i in stored)
+ for(var/i in storing)
var/obj/item/I = i
I.forceMove(O)
O.forceMove(drop_to_ground? target_store.drop_location() : target_store)
@@ -390,11 +390,6 @@
open_machine()
name = initial(name)
-#undef CRYO_DESTROY
-#undef CRYO_PRESERVE
-#undef CRYO_IGNORE
-#undef CRYO_DESTROY_LATER
-
/obj/machinery/cryopod/MouseDrop_T(mob/living/target, mob/user)
if(!istype(target) || user.incapacitated() || !target.Adjacent(user) || !Adjacent(user) || !ismob(target) || (!ishuman(user) && !iscyborg(user)) || !istype(user.loc, /turf) || target.buckled)
return
From 282251b8344830c4e939d147848b1911fde81661 Mon Sep 17 00:00:00 2001
From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com>
Date: Sun, 13 Dec 2020 09:09:52 -0500
Subject: [PATCH 011/165] Zeolites
---
.../modules/reagents/chemistry/recipes/fermi.dm | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index f4b8850f55..df95025160 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -591,21 +591,21 @@
/datum/chemical_reaction/fermi/zeolites
name = "Zeolites"
id = /datum/reagent/fermi/zeolites
- results = list(/datum/reagent/fermi/zeolites = 5) //We make a lot! - But it's now somewhat dangerous, and needs a bit of uranium to catalyze the reaction
+ results = list(/datum/reagent/fermi/zeolites = 5) //We make a lot! - But it's now somewhat dangerous, and needs a bit of gold to catalyze the reaction
required_reagents = list(/datum/reagent/medicine/potass_iodide = 1, /datum/reagent/aluminium = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1)
- required_catalysts = list(/datum/reagent/uranium = 5)
+ required_catalysts = list(/datum/reagent/gold = 5)
//FermiChem vars:
OptimalTempMin = 500
OptimalTempMax = 750
ExplodeTemp = 850
- OptimalpHMin = 2.8
- OptimalpHMax = 5 //2.2 ph levels of optimal ph zone - centered at 3.9 - ph of ingredients mixed at equal values is 9.55; ph of result is 8.
- ReactpHLim = 4
+ OptimalpHMin = 4.8
+ OptimalpHMax = 7
+ ReactpHLim = 5
//CatalystFact = 0
CurveSharpT = 1.5
CurveSharppH = 3
- ThermicConstant = 7
+ ThermicConstant = 5
HIonRelease = -0.15
RateUpLim = 4
- PurityMin = 0.5 //Good luck.
+ PurityMin = 0.4
FermiChem = TRUE
From b8c753d642c24fbfebed41a8d4adf6d046fe4657 Mon Sep 17 00:00:00 2001
From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com>
Date: Sun, 13 Dec 2020 11:33:06 -0500
Subject: [PATCH 012/165] Update fermi.dm
---
.../code/modules/reagents/chemistry/recipes/fermi.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index df95025160..bbecd2f6f4 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -607,5 +607,5 @@
ThermicConstant = 5
HIonRelease = -0.15
RateUpLim = 4
- PurityMin = 0.4
+ PurityMin = 0.5 //Good luck!
FermiChem = TRUE
From e79ce41f24041a3ae426413e67532cab6994b3a3 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sun, 13 Dec 2020 16:41:01 -0700
Subject: [PATCH 013/165] Update code/modules/mob/living/death.dm
Co-authored-by: DeltaFire <46569814+DeltaFire15@users.noreply.github.com>
---
code/modules/mob/living/death.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index f0caa63a1a..24e91f6051 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -66,7 +66,7 @@
GLOB.alive_mob_list -= src
if(!gibbed)
GLOB.dead_mob_list += src
- if(mind.key)
+ if(mind?.key)
var/datum/preferences/P = GLOB.preferences_datums[ckey(mind.key)]
if(P)
P.respawn_time_of_death = world.time
From 4451a96997b0fdb5641a89eb7037bbe8c85a0ef5 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sun, 13 Dec 2020 20:12:14 -0700
Subject: [PATCH 014/165] fixes
---
code/game/machinery/cryopod.dm | 2 +-
code/modules/mob/dead/observer/observer.dm | 5 +++++
code/modules/mob/dead/observer/respawn.dm | 4 ++++
3 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 2ba902e4c2..c9c555e331 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -308,7 +308,7 @@
storing += I
// get rid of mobs
- for(var/mob/living/L in mob_occupant.GetAllContents())
+ for(var/mob/living/L in mob_occupant.GetAllContents() - mob_occupant)
L.forceMove(drop_location())
if(storing.len)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 0c57c13e3f..b16903f062 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -277,6 +277,11 @@ Works together with spawning an observer, noted above.
if (client && client.prefs && client.prefs.auto_ooc)
if (!(client.prefs.chat_toggles & CHAT_OOC))
client.prefs.chat_toggles ^= CHAT_OOC
+ if(ckey && penalize)
+ var/datum/preferences/P = GLOB.preferences_datums[ckey]
+ if(P)
+ P.respawn_restrictions_active = TRUE
+ P.respawn_time_of_death = world.time
transfer_ckey(ghost, FALSE)
ghost.client.init_verbs()
if(penalize)
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
index 0ccdc460cf..5a5a4572bd 100644
--- a/code/modules/mob/dead/observer/respawn.dm
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -87,8 +87,12 @@
if(randombody && (nameless || randomname))
return TRUE // somewhat unrecognizable
if(client.prefs.slots_joined_as && (client.prefs.default_slot in client.prefs.slots_joined_as))
+ if(notify)
+ to_chat(src, "You cannot respawn on the same slot. Joined slots: [english_list(client.prefs.slots_joined_as)].")
return FALSE
if((!nameless && !randomname) && (client.prefs.characters_joined_as && (client.prefs.real_name in client.prefs.characters_joined_as)))
+ if(notify)
+ to_chat(src, "You cannot respawn on the same character. Joined slots: [english_list(client.prefs.characters_joined_as)].")
return FALSE
return TRUE
From 413bd23d0ab1b57318caa03610fcc296c179236e Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sun, 13 Dec 2020 23:07:12 -0700
Subject: [PATCH 015/165] dnr prevention
---
code/modules/client/preferences.dm | 2 ++
code/modules/mob/dead/observer/observer.dm | 6 ++++--
code/modules/mob/dead/observer/respawn.dm | 6 ++++++
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 0cf03e3a84..a634810dbf 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -29,6 +29,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/respawn_restrictions_active = FALSE
/// time of death we consider for respawns
var/respawn_time_of_death = -INFINITY
+ /// did they DNR? used to prevent respawns.
+ var/dnr_triggered = FALSE
// Intra-round persistence end
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index b16903f062..800f704ab6 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -428,12 +428,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(usr, "You're already stuck out of your body!")
return FALSE
- var/response = alert(src, "Are you sure you want to prevent (almost) all means of resuscitation? This cannot be undone. ","Are you sure you want to stay dead?","Yes","No")
+ var/response = alert(src, "Are you sure you want to prevent (almost) all means of resuscitation? This cannot be undone. THIS WILL ALSO STOP YOU FROM RESPAWNING!!!","Are you sure you want to stay dead and never respawn?","Yes","No")
+
if(response != "Yes")
return
can_reenter_corpse = FALSE
- to_chat(src, "You can no longer be brought back into your body.")
+ client.prefs?.dnr_triggered = TRUE
+ to_chat(src, "You can no longer be brought back into your body or respawn.")
return TRUE
/mob/dead/observer/proc/notify_cloning(var/message, var/sound, var/atom/source, flashwindow = TRUE)
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
index 5a5a4572bd..a53fc514b8 100644
--- a/code/modules/mob/dead/observer/respawn.dm
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -33,6 +33,7 @@
log_admin("[key_name(src)] gave [key_name(O)] a full respawn and sent them back to the lobby.")
to_chat(O, "You have been given a full respawn.")
O.do_respawn(FALSE)
+ O.client.prefs.dnr_triggered = FALSE
else if(istype(M, /mob/dead/new_player))
var/mob/dead/new_player/NP = M
var/confirm = alert(src, "Remove [NP]'s respawn restrictions?", "Remove Restrictions", "Yes", "No")
@@ -41,6 +42,7 @@
message_admins("[key_name_admin(src)] removed [ckey]'s respawn restrictions.")
log_admin("[key_name(src)] removed [ckey]'s respawn restrictions")
NP.client.prefs.respawn_restrictions_active = FALSE
+ NP.client.prefs.dnr_triggered = FALSE
to_chat(NP, "Your respawn restrictions have been removed.")
else
CRASH("Invalid mobtype")
@@ -107,6 +109,10 @@
to_chat(src, "Respawns are disabled in configuration.")
return
+ if(client.prefs.dnr_triggered)
+ to_chat(src, "You cannot respawn as you have enabled DNR.")
+ return
+
var/timeleft = time_left_to_respawn()
if(timeleft)
to_chat(src, "It's been too short of a time since you died/observed! Please wait [round(timeleft / 600, 0.1)] more minutes.")
From 2844d2e4de4228b08ecd22c9da411a1e863bdb72 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 14 Dec 2020 06:01:32 -0700
Subject: [PATCH 016/165] fix
---
code/modules/mob/dead/observer/respawn.dm | 2 ++
1 file changed, 2 insertions(+)
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
index a53fc514b8..e2a85d11d8 100644
--- a/code/modules/mob/dead/observer/respawn.dm
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -80,6 +80,8 @@
* Checks if we can latejoin on the currently selected slot, taking into account respawn status.
*/
/mob/dead/new_player/proc/respawn_latejoin_check(notify = FALSE)
+ if(!client.prefs.respawn_restrictions_active)
+ return TRUE
var/can_same_person = CONFIG_GET(flag/allow_same_character_respawn)
if(can_same_person)
return TRUE
From e87cc2780333c3c5c7fb275db53192ac2ed6ada4 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Tue, 15 Dec 2020 07:21:06 -0700
Subject: [PATCH 017/165] modifications
---
code/controllers/configuration/entries/respawns.dm | 5 +++++
code/game/machinery/cryopod.dm | 2 +-
code/modules/admin/topic.dm | 7 +++++--
code/modules/client/preferences.dm | 2 ++
code/modules/mob/dead/observer/observer.dm | 3 ++-
code/modules/mob/dead/observer/respawn.dm | 13 ++++++++++---
config/respawns.txt | 3 +++
7 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/code/controllers/configuration/entries/respawns.dm b/code/controllers/configuration/entries/respawns.dm
index b19c8bf9d8..d92f4ec394 100644
--- a/code/controllers/configuration/entries/respawns.dm
+++ b/code/controllers/configuration/entries/respawns.dm
@@ -7,6 +7,11 @@
config_entry_value = 15.0
integer = FALSE
+/// Minutes before allowing respawn, if user cryo'd.
+/datum/config_entry/number/respawn_delay_cryo
+ config_entry_value = 5.0
+ integer = FALSE
+
/// Allows respawning as non-assistant. Overrides all others of this type.
/datum/config_entry/flag/allow_non_assistant_respawn
config_entry_value = FALSE
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index c9c555e331..31ae77848f 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -383,7 +383,7 @@
// Ghost and delete the mob.
if(!mob_occupant.get_ghost(1))
- mob_occupant.ghostize(FALSE, penalize = TRUE, voluntary = TRUE)
+ mob_occupant.ghostize(FALSE, penalize = TRUE, voluntary = TRUE, cryo = TRUE)
QDEL_NULL(occupant)
QDEL_LIST(destroy_later)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index fd8204a296..e0434a6fea 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1805,12 +1805,15 @@
if(alert(usr, "Send [key_name(M)] back to Lobby?", "Message", "Yes", "No") != "Yes")
return
- log_admin("[key_name(usr)] has sent [key_name(M)] back to the Lobby.")
- message_admins("[key_name(usr)] has sent [key_name(M)] back to the Lobby.")
+ log_admin("[key_name(usr)] has sent [key_name(M)] back to the Lobby, removing their respawn restrictions if they existed.")
+ message_admins("[key_name(usr)] has sent [key_name(M)] back to the Lobby, removing their respawn restrictions if they existed.")
var/mob/dead/new_player/NP = new()
NP.ckey = M.ckey
qdel(M)
+ if(GLOB.preferences_datums[NP.ckey])
+ var/datum/preferences/P = GLOB.preferences_datums[NP.ckey]
+ P.respawn_restrictions_active = FALSE
else if(href_list["tdome1"])
if(!check_rights(R_FUN))
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index a634810dbf..e97f6dc3f4 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -31,6 +31,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/respawn_time_of_death = -INFINITY
/// did they DNR? used to prevent respawns.
var/dnr_triggered = FALSE
+ /// did they cryo on their last ghost?
+ var/respawn_did_cryo = FALSE
// Intra-round persistence end
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 800f704ab6..9493d11792 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -264,7 +264,7 @@ Transfer_mind is there to check if mob is being deleted/not going to have a body
Works together with spawning an observer, noted above.
*/
-/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE, voluntary = FALSE)
+/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE, voluntary = FALSE, cryo = FALSE)
var/sig_flags = SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse, special, penalize)
penalize = !(sig_flags & COMPONENT_DO_NOT_PENALIZE_GHOSTING) && (suiciding || penalize) // suicide squad.
voluntary_ghosted = voluntary
@@ -282,6 +282,7 @@ Works together with spawning an observer, noted above.
if(P)
P.respawn_restrictions_active = TRUE
P.respawn_time_of_death = world.time
+ P.respawn_did_cryo = cryo
transfer_ckey(ghost, FALSE)
ghost.client.init_verbs()
if(penalize)
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
index e2a85d11d8..53c6eef4c9 100644
--- a/code/modules/mob/dead/observer/respawn.dm
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -18,7 +18,10 @@
if(!I.client || !I.client.prefs.respawn_restrictions_active)
continue
valid["[I.ckey] - IN LOBBY"] = I.ckey
- var/ckey = valid[input(src, "Choose a player (only showing logged in players who have restrictions)", "Unrestricted Respawn") as null|anything in valid]
+ if(!valid.len)
+ to_chat(src, "No player found that is either a ghost or is in lobby with restrictions active.")
+ return
+ var/ckey = valid[input(src, "Choose a player (only showing logged in players who have restrictions)", "Unrestricted Respawn") as null|anything in valid
var/client/player = GLOB.directory[ckey]
if(!player)
to_chat(src, "Client not found.")
@@ -60,7 +63,11 @@
if(!I.client)
continue
valid["[I.ckey] - [I.name]"] = I
- var/mob/dead/observer/O = valid[input(src, "Choose a player (only showing logged in)", "Remove Respawn Timer") as null|anything in valid]
+
+ if(!valid.len)
+ to_chat(src, "No logged in ghosts found.")
+ return
+ var/mob/dead/observer/O = valid[input(src, "Choose a player (only showing logged in)", "Remove Respawn Timer") as null|anything in valid
if(!O.client)
to_chat(src, "[O] has no client.")
@@ -126,7 +133,7 @@
*/
/mob/dead/observer/verb/time_left_to_respawn()
ASSERT(client)
- return max(0, (CONFIG_GET(number/respawn_delay) MINUTES + client.prefs.respawn_time_of_death) - world.time)
+ return max(0, ((client.prefs.respawn_did_cryo? CONFIG_GET(number/respawn_delay_cryo) : CONFIG_GET(number/respawn_delay)) MINUTES + client.prefs.respawn_time_of_death) - world.time)
/**
* Handles respawning
diff --git a/config/respawns.txt b/config/respawns.txt
index 79eb53469c..46a4bb0e07 100644
--- a/config/respawns.txt
+++ b/config/respawns.txt
@@ -4,6 +4,9 @@ RESPAWNS_ENABLED
## Minutes delay before allowing respawns, either from death or observing. Not an integer.
RESPAWN_DELAY 15.0
+## Minutes delay before allowing respawns, if the user cryo'd. Not an integer.
+RESPAWN_DELAY_CRYO 5.0
+
## Allow respawning as anything but an assistant.
ALLOW_NON_ASSISTANT_RESPAWN
From 0a593013e0d84bf829baa6b451436c0b4d489374 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Tue, 15 Dec 2020 07:23:46 -0700
Subject: [PATCH 018/165] wew
---
code/modules/mob/dead/observer/respawn.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
index 53c6eef4c9..a31fdd4bf4 100644
--- a/code/modules/mob/dead/observer/respawn.dm
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -21,7 +21,7 @@
if(!valid.len)
to_chat(src, "No player found that is either a ghost or is in lobby with restrictions active.")
return
- var/ckey = valid[input(src, "Choose a player (only showing logged in players who have restrictions)", "Unrestricted Respawn") as null|anything in valid
+ var/ckey = valid[input(src, "Choose a player (only showing logged in players who have restrictions)", "Unrestricted Respawn") as null|anything in valid]
var/client/player = GLOB.directory[ckey]
if(!player)
to_chat(src, "Client not found.")
@@ -67,7 +67,7 @@
if(!valid.len)
to_chat(src, "No logged in ghosts found.")
return
- var/mob/dead/observer/O = valid[input(src, "Choose a player (only showing logged in)", "Remove Respawn Timer") as null|anything in valid
+ var/mob/dead/observer/O = valid[input(src, "Choose a player (only showing logged in)", "Remove Respawn Timer") as null|anything in valid]
if(!O.client)
to_chat(src, "[O] has no client.")
From a7aa7f24662f004a41115b0c39d0b8545feff940 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Tue, 15 Dec 2020 07:43:35 -0700
Subject: [PATCH 019/165] delete pdas
---
code/game/machinery/cryopod.dm | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 31ae77848f..5cee613ffd 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -272,6 +272,9 @@
var/atom/target_store = (control_computer?.allow_items && control_computer) || src //the double control computer check makes it return the control computer.
var/drop_to_ground = !istype(target_store, /obj/machinery/computer/cryopod)
+ var/mind_identity = mob_occupant.mind?.name
+ var/occupant_identity = mob_occupant.real_name
+
if(iscyborg(mob_occupant))
var/mob/living/silicon/robot/R = mob_occupant
if(R.mmi?.brain)
@@ -305,7 +308,21 @@
if(HAS_TRAIT(I, TRAIT_NODROP))
destroying += I
continue
- storing += I
+ // WEE WOO SNOWFLAKE TIME
+ if(istype(I, /obj/item/pda))
+ var/obj/item/pda/P = I
+ if((P.owner == mind_identity) || (P.owner == occupant_identity))
+ destroying += P
+ else
+ storing += P
+ else if(istype(I, /obj/item/card/id))
+ var/obj/item/card/id/idcard = I
+ if((idcard.registered_name == mind_identity) || (idcard.registered_name == occupant_identity))
+ destroying += idcard
+ else
+ storing += idcard
+ else
+ storing += I
// get rid of mobs
for(var/mob/living/L in mob_occupant.GetAllContents() - mob_occupant)
From ebd6e0cbec9c914c23968defd40d4aea7cb47651 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Thu, 17 Dec 2020 04:14:04 -0700
Subject: [PATCH 020/165] no backapck in backpack
---
code/game/machinery/cryopod.dm | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 5cee613ffd..ea41d77e2a 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -164,6 +164,10 @@
/obj/machinery/computer/cryopod/contents_explosion()
return //don't blow everyone's shit up.
+/// The box
+/obj/item/storage/box/blue/cryostorage_items
+ w_class = WEIGHT_CLASS_HUGE
+
//Cryopods themselves.
/obj/machinery/cryopod
name = "cryogenic freezer"
@@ -182,7 +186,7 @@
var/despawn_world_time = null // Used to keep track of the safe period.
var/obj/machinery/computer/cryopod/control_computer
- var/item_storage_type = /obj/item/storage/box/blue //with how storage components work this can be anything the player can open or anything with a storage component.
+ var/item_storage_type = /obj/item/storage/box/blue/cryostorage_items //with how storage components work this can be anything the player can open or anything with a storage component.
var/last_no_computer_message = 0
/obj/machinery/cryopod/Initialize(mapload)
From 3bdf4bacdc2c9bf6d4514185d4a3ed33a6a963af Mon Sep 17 00:00:00 2001
From: YakumoChen
Date: Sat, 19 Dec 2020 10:28:56 +0000
Subject: [PATCH 021/165] removes slime blood conversion
---
code/modules/reagents/chemistry/recipes/medicine.dm | 6 ------
1 file changed, 6 deletions(-)
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index fca89a1c73..bf7b94483e 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -305,12 +305,6 @@
results = list(/datum/reagent/medicine/regen_jelly = 2)
required_reagents = list(/datum/reagent/medicine/tricordrazine = 1, /datum/reagent/toxin/slimejelly = 1)
-/datum/chemical_reaction/jelly_convert
- name = "Blood Jelly Conversion"
- id = /datum/reagent/toxin/slimejelly
- results = list(/datum/reagent/toxin/slimejelly = 1)
- required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/blood/jellyblood = 1)
-
/datum/chemical_reaction/corazone
name = "Corazone"
id = /datum/reagent/medicine/corazone
From b8b2f347354bb892ffafdf22e9815dddc981a45e Mon Sep 17 00:00:00 2001
From: Hatterhat
Date: Sat, 19 Dec 2020 18:45:25 -0600
Subject: [PATCH 022/165] funny knife
---
code/game/objects/items/kitchen.dm | 7 ++++++-
icons/obj/kitchen.dmi | Bin 29184 -> 29189 bytes
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index f15a4d00e1..50b7b1e972 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -175,7 +175,7 @@
/obj/item/kitchen/knife/combat/survival/knuckledagger/Initialize()
. = ..()
- AddComponent(/datum/component/butchering, 50, 120, 5) // it's good for butchering stuff
+ AddComponent(/datum/component/butchering, 30, 130, 20) // it's good for butchering stuff
/obj/item/kitchen/knife/combat/survival/knuckledagger/ui_action_click(mob/user, actiontype)
light_on = !light_on
@@ -189,6 +189,11 @@
else
set_light(0)
+/obj/item/kitchen/knife/combat/survival/update_overlays()
+ . = ..()
+ if(light_on)
+ . += "[icon_state]_lit"
+
/obj/item/kitchen/knife/combat/bone
name = "bone dagger"
item_state = "bone_dagger"
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 8cdff2214badd273d988d553090644bec22300db..31312ac9a1bc890bfc5675cd4ed9dff94e9adcc5 100644
GIT binary patch
delta 8334
zcmY*;cUTi$6K?=%f>M+wT}6zCH1Z#-#aH%hqZ`;8SoL7Utb{Vlhv3VKs
zd}<+P`}XGxyia1~m5rsYNkHEX9%Cvx_I;0h?obr1rB$hQ=;mRtxOFv71sdYv)ZnuB
z(OmcN%j+C2uc`vIHcyDdczrfbgg!ho|5=p_Y*55w%m4LZA>Ec-hYiqTpC
z%Twi3K_WyRpy&j|gU`&f%RIZBp^b`_vqhcN_&zu@BeoT6xwCJwyT>6=zEjc^1ax}v
z^H(6X4`l4lvsYDBk!V6fLbr?T@e4&ZC9ai@iWFL+I+5I+8l=Mo(4<5#4G$|AIQ2Fx
zyN)}TjG_dbn9Z{^c%;p;niKH73lY@r1I=yyRVe4iiq7tCJ
z?K$>YPr+-)swov}&j(!p@Hrsl*4%s@i<(Q%$L&h7mawLo+BmV{;o))K>0}Cyb=g#-
z?aw=>2FXqsZ?g}oDK~O*xX4zzNu1mbU118F-cl-GSwb4$+_|V~WiJbli(RC1Hs`o?
z!fjGEmQvV?Y*B`OehM}vcJ4h0oHRXuvBrMZV>KJNs30k$3RqS8|4|LubYN--D{c9<
zM8u_jbx|}c?Oaf5Mua7Iz}<0RTq31cmb4+1cq^-SIX{9Y0#4
z;U69BVmchDLyT7PyC$J(RcV~MPO7*^os~w)yPuL)Yx(o2B2FwKUWdBp_d+Q?6>
zkJ(ApfE|E@kv5TKUi5jLnalw6i-`%lM)G1NsUF{(US#%U6^Q6;0396=vW9U^t3~lQ
zXa>uJxpN}48xDycUyn;(MYOD?O1u2LuXO<)tOf~Y%!ngs5i~A^Za9c&K0LNJ6R9*(
ze2*!;*F6I!gjTaJ(8TzP(b?^(v&e+{eib0i9J^qi>8gvoj{e7(fAggv$$k{-9nq`}
zkAl)Jg%BbH_NM6uS-Kym)-C2^_Tc@ch~d`Ijj1|ApI>5VRywJCWg)wPA6qp`RohsQ
zEqc4TaFv@P3k#mk)``3#CtMOW8*!Mivdg8rFR|G7KIgDbOef-WL&&;G7?hOE3DEP|
z<|cCoTwz(7{+TdR)b8kjZrch#w$0Lw>iNC0w@?pzPUXiBqlW&KgB!g1K#ZEB1uWbN
zv~WVZ!&yrm7+6?Y@%Wo9@TsgzGAJf)HB^<-(&DRY@{aYVBlk8E$2@;zY33Ic3{l}x
zy5b@06KO;QPF#p4jAn&TZr=kqAs#;{ikXPXM|C7s6?n(cNe>&$P-|$<+l#R^;)XZ(
z8JpAOY?XHx)yT6T(K@mj9wZuF7WHk{TFijMc4)XZw|gTG$GV5_RJ|1fmD-ynPyS_{
z7ezs(_>?D`-d~$Y{>;%N7~EwtW>c(+XX=)leXoM)1-J3zJAjB!Lq(C!hkv{`OejLB
zjc1uj-!$51jPBoke?ms}j^wF;eKDz(|F@4=h~1&)->v7c&r(_z`$cS
zI7?glGrhf0&X%HP3fn4O0|d85VYZ5W`mp`h3asH!hmnI&zwt%7w5S_$LQ7-ZPqbJk~R`y&zP9*+e`
zuY<505cSCmpTB-(mfBjv_6c~(3#0d@b@&?0A2C7H{HJ7~YG>MPm0rXuEkS7m^j8P9
zex@hKECR+V;`i?sFXTHW>-A$cb&Lv@_8dWItEud&@zi;-z*J!d^O`e4IT7Bo_<`GAr@9*U_*Ir~h
z#+ak~NMQPQ587T^xJq?WwZ>Qt&M>zv5QitD6lY_D-ow6cwPmqF(so{tzC3)IRy@uQh@c!mMuQ*|Ozq&~z5)m8MnWQFk@jPHZymCWMyQuU
zvB)kX`1k$YA>C#>1Pz-!sZv|G}DtG*I(VGLvCR|M^%of7s
zN4?lU!p{b603>d+ov0WCPo+;dcQ>Y^5Unq7vfMZCGrPI(Po0Ijlpv7?p9qYMQ39r1
zFf&h2>4}L68Tg3{c8|{^K0$W4()K@}PUb6u{)6y2bgPz#t){)*fiXnTLr$lcj+Ie%
z%x@hMUs7itSzHMYgZtIDrn91Ir$%z46d2B`61f0D0yC-5(45PH5J5^6kLPJdmXLK1
zeS%eD1p^O$suoYx&t6U&U7(X9dmC*SiHB53^eZJT?7>VEq!p@Neh>%wg81jFIgP_s
zdhrdC;&T1O+%Ex?B*!zh?Wh;lz}0I{uD`Ooj9zOWei2@K^^!SFnY07B0&Rq2R=2(U
zPpQ=@kV`i5ETrTI{?XxkPZ=SedXC?WXj)UpkZ-l05bnRKOD_3?!76<><1TO=$kutF
z12WcAv91!ST$aoL+f#}7H%4~^p5L{z>4eO|VdDNDweL9%r0;F0?~>A{fRY*kb-V+H
zQv{~g8=w_>(zoYyxDH4oh1ljQrWH|3y&mMshzRA^nR0*Wbw@`w4G~fV+V>q4Q+Y}>
zd=&MtBfXzApc!?>2(zQ`cQPhFhe>>Csdp71SKOnqLg^w69zWiWZn;-d(o&u)D5f`N
zE3IxyKeCU2$OJWv>nF1kqKFI|uxe8$B}F7*)h&*SFhH=~^v8Tu*bXD!b`<50Y$8Pj
zjsHV$QWR+DU1)*ruC+M!ruVLPxSylSB_!M}=z5kr-Eh0!HKx(YLG35~)35FX9Wmev
zhOV0c5ShZ8YJLC3z!yyyx5EZ^XCeb<0BF|do%xD4wBeW--w$2SDhcS954g0WANMA@`S
z@oNI%6n9C&f&0gF$3^
zWiAT@SMZ+Jpe?p`B785m1-7y|m-Bir=gR&|9kDC1jfoG4S|AbE*#CfNz7-aD8K?7}
zg?>GmwP~`NAzEAY7ZkVY>@}&z$q+p!-b&;{zuINh7Q;OUD4NHiro=5GvxNDL?SlpM
znGb?!4t~YjHY^a*wl30K^|j^tti9#4rxlk^KW~KB
z|6Z~@fwMY<78bO8tGH~+5l((oK9G0jd%>>y$Zv_fVops-C8Q#eY{jHGOk4bLX6lYj
zti8UIuEH)E_{&RGRdsfEcLt^S58$9dZ-7wkS6k-AqbP583_`k+_eKB6ruanliS?KK
zpLKBfUzhm!1TVKBEB%De2q@^geeca{;^T99;`*aO|8s324J7cL}VJa2n{>F4wo}+$jLn%g2vimxLl=
zviq3J&6qFwGV<_&SPC3bK8Nv$reDibk%vbbAapT$L{GsvC8Q?!tQ13mqwf+uh2~(6
zcLn*;)vu8Q0>=??3^XuNc=*w&x->xuj+~Wne4LQ-@7qIlQ=}L_ni&Aih@acXct!&+
z+dwf6eT43;+`hPSGsdUqZ5ff;1?my!p`=}<)*qhhseZ;=PWp&_G!NG4l%fD7<+;_i
z%UeHIDOY@^wblI$SW!Kn+-wlbK~F{8wayx?!z|+4w`-Mz7`%HKBjF>6EgGc
zDS{0F$bq=cS;~ctEpqE3z9%nV21J<4u$3(r3aiQpq>_5XH~;wef(D+Mz4n>F)k{Y>6W?old$aYZAUA
zcfb*)d*3W0TK}(PLqftGCu#x>4CE_OsF)_W>047ubq;@(W+WWHf8WE^^u~=b?LA=r
z;a{C#UI?bXc`}obP!_%cjN5Ot!N6ZW)w)2-MU%)EB|@JeiM5?^f01kSN>r=c}A~
zr!3b)>O>hJryf3>3#l6vWrGNcy?fUeAUTBM94-EG*0gF8A94)BY4+X~{4OY6(5Hp8
zh+i252Q&3)l}|CVdYH=&s8~wVQ%u(p$*NDg`4rQ3L^kLnGUo!oaC6#r1Nc^}21kD*
zNHc6Lq>a)ONIj2J;-(OUmu+KL8zkwBE%ZnxYER%aFNvNr2S}a-^m8OUG~!sP`7xK2
zni`lGvIwg;al}jAva*ca<4b(@T!sf-F%)kX-&lI?YnZ~Tej@AydAN0qldkt2#oy_%
z51Ox1R%=s=>C7sO0m_AF=KnG1{{M}WGhkK9Nu%PnkfJJnv#Kf=@8$E5uiC?I#NT!t
zOeH0`Oy<%{$j8TV$Yw
zO~mkotZgg8IKfLx5DyOfl$1P_T1)>ozWUj1#LPm!mtWfdroSR>i3QmB6gjXTN?rW2
z?)((pn%hmY$H7oP$_d@dK)w#*t<_J=<4W^X;dZ>iN%`bj#*T+FlDw2{j
zEdF?bw!VWcC!x)2Syd
zS&rH>+f%_?f)SI8!cUfLOdSiVX;aO^Nb~NVeLhIz<9zyK$o^2{8lbBlxU&S$ym(It
z!+7#h6I8)f%hH}Je%JkQ
z``GfT9ac+9Zo$^oy|0GnnJuSdiJ##aCsew%wRLyz?qHP}g9LZ|Z!wqv+cD>wN&LwX^U3oxyAqx1AF(SaC_n;JYZC?0J%zSK0>!+I
zsF$CG@q#Fh%=>w3F}Z@qDRT)yLg>4PMMYdLe~%vh4B))>&Mgc0Fs94N`CClz#P9%2^u
z4e6FIgLk1-8lLoEx!h8?f5-2%*&uihT`MVId&_S>0`Eo%!qeuf=hf!nR}s2H#E7P1
zG&-BXSB$0|&0hj~}Zgccqe!Q|4Np)whBPP?G}Pfbh44wzS4TqC1&b
z%bca
z>%3fC^f)abkmq~VZ{o@{4I_H>d3Cm!MsTpD8g;iZ9Q@4}zqMK#4W#+SfzGt%HjE$EWM(FXll+SyB^}p
zlZ)!B#QrfDO;;ZPm`B9w(0$2U>l#i_GK$cZ+(xC4+wBIB0_2>-w$hkS%v>;M4KHaN
z?o(rzrD4*s!m0(3QX`|yezZF7&uvL
zNh@AG91&hIgz3=P#44Xr*R92V5(XsZHyQ{w(@sFRNC`(={HmoWx}&2bh)mAhO$%2m
zhKlKZolf#(VIlTt3s)aw47(`DVb93mo8jK|D^5^tfcc2$o_)e6Sz;}S=5iKrr71iK
zq#rC`Y2c)?aK$oOn8X@cCo298EDjdROd%IoE}uMx3*;-B9x(ryGK%!}X?va}QVTdL
zK4N98eN4I!b_sUt77&DSLau6Q;iD4s;T^ZRdz5g$3tjLLRU=Pr0=K$wZc~@F3!kvM
zhlHqkdwb7qks;4ny_5yp4+$6)`Rdaa=k{HQg{9@QwYAlp>9;u-u0tVhvd&EiT5g)0
z7WtNrG9{NQhL^5ftaF+Bc+OxPAa&Z%T>SWRYYANPEYxA#ac^rOm|hn5`KRuhcxf{$
zuB%&o8YOo+{asplK}ds0GlfG<7dq^3wD5$A=Kd%MZ|c_myndNonw?
zZ>d+?P3qj(IBwp&S?=7zNUkZHC2$GH?ygl1xK7tUCT-=HmL}CT1}zvu+N=X3BO64P
zTb#KQ6BAwBM0fT(dVmJ7=Pf>rii$F!VrJ@9*Y?Zb!AeS`pk$*)n62Ks+UdUahuzkS
zT&}uMNoiIHj>!Bv1+qvq*-yt%zKWnBDTQ!N$|Gm@uX4No!-_w1LPj~OCQo%-_1T!S
z=vG85CX)0AAQtxa95mbJ`p2slj*caf;lqX2JY5SqG6)YKDQuDJsL=&eFSWglLqU70
z6by1i@B9q0sPG-HxeL(Uvouo~;@TvENEwH5`9Bbwq#fo~rh9&2XJ8{+H$-8mMZhI=
zPsSrlh8)cQgU3a%b
zPxMFvl;xb{3y$Q6`+VJR(~8IRxsCqGuM*gfMNPaogQ4cvnAZI;*=s*~X{{wsFfC#u
z(I|6tbJAUGp@Q_)`D^SbILFd`mnj9xgOl@p?-d(2JB7dZ_PWh4$KU5B&~rryMIw@t
zy1CX^@0|p4NROnKx9`L^b`U+tC@6HaaRJcc`di?;Lp%0%_m7WSL%)BY7ngQAf=x0a_
zkj~ayR${cWvFX%K5(C`?KtIJVF%;*KRFC69A2H6lI^I0{Uhb35?wDKQYR9E!
zLwyiRLaS&zJm9HA&NlqS4TaNb!>H^Lrdh6dZB2vTQyiPyt|hAm`6WwvlF}SU3AI3}
zSL}4V(zsqWzkv>9
ztYP%{{OHO`l_4<^C5E{44$h{qXeWql4s}iS_
zSwiw%5CIO3jm7u%^_4BCUAfXusY?OdruqPK_tS#B{jLHFL>wMC@q4M={DzGdGx-SQ
z0%Jf(P{=nQZ5gG$oDlDa-yjH=(9kg%wwlTQii(Om)XSHYl_8j<+pY
z4NE(3SI&qXCM7Sr_wGHv`R~%|-l5;d>7+dV8uNB0i3;yM`HLOTKOF{DzCwJlY1Y<0I*HMH5mW0|fpvQfy~fSo2CVK>92`Wj
zM3*?!U6%RI+;#$HGWVqs^Oz|6t_y~cL;
zkSZf1^Ew?FwR?{ev1${Zx3aR5(Tf@xVH89gc!4bd9y;i(9N*d5Syo;R{HM)#{ynUR
zBaulDJO>py$y#4uU*m_!YFb
zJ{cFeQ74UcuktqM6#pBA3y;iedHyDum(%Mg5G~~w7V1BEa8V4g?=tLHSXfy0;MaxW
zu8@tX7rD8>1+vDb>rpP`i1$Ng>Vl;q&fsh6c2}vlPWAn6-YcrA-CZvPjuZ=0y;#c5
zc!#njRqGBP#jAZ;UnRQ30$U8jh(QL2hhq|j)q7TvVe{-7A}1kw?(Xh=3(GAlVD1}2
zgRGmAb#^mW4j!+Le8qLY1~WsBM%zdQjC#i+ClhWkhEj$Bjap7IYp+cR+Nr8K;FN`LEKNpGxg#Z8m
delta 8327
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
CIyOE4
From fa799a0ac54e5c4226f075df278fefe0899b279f Mon Sep 17 00:00:00 2001
From: Hatterhat
Date: Sat, 19 Dec 2020 19:02:56 -0600
Subject: [PATCH 023/165] it compiles
---
code/game/objects/items/kitchen.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index 50b7b1e972..7f2fe6a01d 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -189,7 +189,7 @@
else
set_light(0)
-/obj/item/kitchen/knife/combat/survival/update_overlays()
+/obj/item/kitchen/knife/combat/survival/knuckledagger/update_overlays()
. = ..()
if(light_on)
. += "[icon_state]_lit"
From 7d4de6b8d08faebc6bd63aa705d7b1de72359b50 Mon Sep 17 00:00:00 2001
From: DeltaFire
Date: Sun, 20 Dec 2020 02:32:59 +0100
Subject: [PATCH 024/165] screamies
---
code/game/gamemodes/clock_cult/clock_cult.dm | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index be8dee5bf8..29455afe56 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -150,14 +150,14 @@ Credit where due:
var/datum/team/clockcult/main_clockcult
/datum/game_mode/clockwork_cult/pre_setup() //Gamemode and job code is pain. Have fun codediving all of that stuff, whoever works on this next - Delta
- var/list/errorList = list()
+ /*var/list/errorList = list()
var/list/reebes = SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE)
if(errorList.len) // reebe failed to load
message_admins("Reebe failed to load!")
log_game("Reebe failed to load!")
return FALSE
- for(var/datum/parsed_map/PM in reebes)
- PM.initTemplateBounds()
+ for(var/datum/parsed_map/PM in reebes) //Temporarily commented because of z-level loading reliably segfaulting the server.
+ PM.initTemplateBounds()*/
if(CONFIG_GET(flag/protect_roles_from_antagonist))
restricted_jobs += protected_jobs
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
From 78cf8389ba4f517f95186c1e8405fd7fe207a376 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sun, 20 Dec 2020 10:32:50 -0700
Subject: [PATCH 025/165] Update code/modules/admin/sql_message_system.dm
Co-authored-by: DeltaFire <46569814+DeltaFire15@users.noreply.github.com>
---
code/modules/admin/sql_message_system.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm
index e1a8cc5758..4218d4238f 100644
--- a/code/modules/admin/sql_message_system.dm
+++ b/code/modules/admin/sql_message_system.dm
@@ -6,7 +6,7 @@
return
var/target_ckey = ckey(target_key)
if(!target_key && (type == "note" || type == "message" || type == "watchlist entry"))
- var/new_key = input(usr,"Who would you like to create a [type] for?","Enter a key or ckey",null) as null|textw
+ var/new_key = input(usr,"Who would you like to create a [type] for?","Enter a key or ckey",null) as null|text
if(!new_key)
return
var/new_ckey = sanitizeSQL(ckey(new_key))
From cfba0836801bce878bc8f2b936e5f5c14062aea6 Mon Sep 17 00:00:00 2001
From: DeltaFire
Date: Mon, 21 Dec 2020 00:15:29 +0100
Subject: [PATCH 026/165] oops
---
code/modules/antagonists/cult/blood_magic.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index e6ec3a08b6..4a697a6bd7 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -445,7 +445,7 @@
if(L.move_resist < MOVE_FORCE_STRONG)
var/atom/throw_target = get_edge_target_turf(L, user.dir)
L.throw_at(throw_target, 7, 1, user)
- else if(!iscultist(L))
+ else if(!is_servant_of_ratvar(L))
L.DefaultCombatKnockdown(160)
L.adjustStaminaLoss(140) //Ensures hard stamcrit
L.flash_act(1,1)
@@ -465,7 +465,7 @@
C.drowsyness = max(10, C.drowsyness)
C.confused += clamp(20 - C.confused, 0, 10)
L.adjustBruteLoss(15)
- to_chat(user, "In an brilliant flash of red, [L] [iscultist(L) ? "writhes in pain" : "falls to the ground!"]")
+ to_chat(user, "In an brilliant flash of red, [L] [is_servant_of_ratvar(L) ? "writhes in pain!" : "falls to the ground!"]")
uses--
..()
From 994df11bc070e9670fdf1c7e54602cd3d86434ca Mon Sep 17 00:00:00 2001
From: MrJWhit <48370570+MrJWhit@users.noreply.github.com>
Date: Sun, 20 Dec 2020 19:42:26 -0500
Subject: [PATCH 027/165] Update holidays.dm
---
code/modules/holiday/holidays.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
index c6c97f7cba..e3f5264568 100644
--- a/code/modules/holiday/holidays.dm
+++ b/code/modules/holiday/holidays.dm
@@ -554,7 +554,7 @@ Since Ramadan is an entire month that lasts 29.5 days on average, the start and
/datum/holiday/xmas
name = CHRISTMAS
- begin_day = 10
+ begin_day = 18
begin_month = DECEMBER
end_day = 27
drone_hat = /obj/item/clothing/head/santa
From ea21151462072da62e45486bc7ba17a104bdbc53 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sun, 20 Dec 2020 18:55:45 -0700
Subject: [PATCH 028/165] LF
---
README.md | 350 +--
SQL/tgstation_schema.sql | 946 ++++----
TGS3.json | 44 +-
_maps/boxstation.json | 22 +-
_maps/runtimestation.json | 16 +-
bot/nudge.py | 50 +-
code/datums/components/README.md | 18 +-
config/antag_rep.txt | 10 +-
config/comms.txt | 32 +-
html/changelog.css | 82 +-
sound/voice/catpeople/license.txt | 2 +-
strings/names/adjectives.txt | 748 +++---
strings/names/ai.txt | 290 +--
strings/names/carp.txt | 60 +-
strings/names/clown.txt | 124 +-
strings/names/death_commando.txt | 140 +-
strings/names/first.txt | 2790 +++++++++++-----------
strings/names/first_female.txt | 1540 ++++++------
strings/names/first_male.txt | 1334 +++++------
strings/names/golem.txt | 314 +--
strings/names/last.txt | 1138 ++++-----
strings/names/lizard_female.txt | 324 +--
strings/names/lizard_male.txt | 654 ++---
strings/names/mime.txt | 64 +-
strings/names/ninjaname.txt | 86 +-
strings/names/ninjatitle.txt | 90 +-
strings/names/plasmaman.txt | 234 +-
strings/names/posibrain.txt | 92 +-
strings/names/verbs.txt | 1262 +++++-----
strings/names/wizardfirst.txt | 72 +-
strings/names/wizardsecond.txt | 78 +-
tools/CreditsTool/remappings.txt | 40 +-
tools/Runtime Condenser/Main.cpp | 836 +++----
tools/UnstandardnessTestForDM/readme.txt | 8 +-
tools/WebhookProcessor/secret.php | 266 +--
tools/travis/travis_config.txt | 18 +-
36 files changed, 7087 insertions(+), 7087 deletions(-)
diff --git a/README.md b/README.md
index 0ecf4c5b01..bbceb0f05b 100644
--- a/README.md
+++ b/README.md
@@ -1,175 +1,175 @@
-## Citadel Station 13
-Based and maintained from /tg/station.
-
-[](https://travis-ci.org/Citadel-Station-13/Citadel-Station-13)
-[](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open")
-[](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue")
-
-[](https://forthebadge.com) [](https://forthebadge.com) [](http://forthebadge.com) [](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a)
-
-**Upstream Information**
-* **Website:**
-* **Code:**
-* **Wiki:**
-* **Codedocs:**
-* **/tg/station Discord:**
-* **Coderbus Discord:**
-* ~~**IRC:** ~~ (dead)
-
-**Citadel Station Information**
-* **Website:**
-* **Code:**
-* **Wiki:**
-* **Forums:**
-* **Ban Appeals:**
-* **Discord:**
-
-## DOWNLOADING
-
-There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://www.tgstation13.org/wiki/Downloading_the_source_code
-
-Option 1:
-Follow this: http://www.tgstation13.org/wiki/Setting_up_git
-
-Option 2: Download the source code as a zip by clicking the ZIP button in the
-code tab of https://github.com/tgstation/tgstation
-(note: this will use a lot of bandwidth if you wish to update and is a lot of
-hassle if you want to make any changes at all, so it's not recommended.)
-
-Option 3: Download a pre-compiled nightly at https://tgstation13.download/nightlies/ (same caveats as option 2)
-
-## INSTALLATION
-
-First-time installation should be fairly straightforward. First, you'll need
-BYOND installed. You can get it from https://www.byond.com/download. Once you've done
-that, extract the game files to wherever you want to keep them. This is a
-sourcecode-only release, so the next step is to compile the server files.
-Open tgstation.dme by double-clicking it, open the Build menu, and click
-compile. This'll take a little while, and if everything's done right you'll get
-a message like this:
-
-```
-saving tgstation.dmb (DEBUG mode)
-tgstation.dmb - 0 errors, 0 warnings
-```
-
-If you see any errors or warnings, something has gone wrong - possibly a corrupt
-download or the files extracted wrong. If problems persist, ask for assistance
-in irc://irc.rizon.net/coderbus
-
-Once that's done, open up the config folder. You'll want to edit config.txt to
-set the probabilities for different gamemodes in Secret and to set your server
-location so that all your players don't get disconnected at the end of each
-round. It's recommended you don't turn on the gamemodes with probability 0,
-except Extended, as they have various issues and aren't currently being tested,
-so they may have unknown and bizarre bugs. Extended is essentially no mode, and
-isn't in the Secret rotation by default as it's just not very fun.
-
-You'll also want to edit config/admins.txt to remove the default admins and add
-your own. "Game Master" is the highest level of access, and probably the one
-you'll want to use for now. You can set up your own ranks and find out more in
-config/admin_ranks.txt
-
-The format is
-
-```
-byondkey = Rank
-```
-
-where the admin rank must be properly capitalised.
-
-This codebase also depends on a native library called rust-g. A precompiled
-Windows DLL is included in this repository, but Linux users will need to build
-and install it themselves. Directions can be found at the [rust-g
-repo](https://github.com/tgstation13/rust-g).
-
-Finally, to start the server, run Dream Daemon and enter the path to your
-compiled tgstation.dmb file. Make sure to set the port to the one you
-specified in the config.txt, and set the Security box to 'Safe'. Then press GO
-and the server should start up and be ready to join. It is also recommended that
-you set up the SQL backend (see below).
-
-## UPDATING
-
-To update an existing installation, first back up your /config and /data folders
-as these store your server configuration, player preferences and banlist.
-
-Then, extract the new files (preferably into a clean directory, but updating in
-place should work fine), copy your /config and /data folders back into the new
-install, overwriting when prompted except if we've specified otherwise, and
-recompile the game. Once you start the server up again, you should be running
-the new version.
-
-## HOSTING
-
-If you'd like a more robust server hosting option for tgstation and its
-derivatives. Check out our server tools suite at
-https://github.com/tgstation/tgstation-server
-
-## MAPS
-
-/tg/station currently comes equipped with five maps.
-
-* [BoxStation (default)](http://tgstation13.org/wiki/Boxstation)
-* [MetaStation](https://tgstation13.org/wiki/MetaStation)
-* [DeltaStation](https://tgstation13.org/wiki/DeltaStation)
-* [OmegaStation](https://tgstation13.org/wiki/OmegaStation)
-* [PubbyStation](https://tgstation13.org/wiki/PubbyStation)
-
-
-All maps have their own code file that is in the base of the _maps directory. Maps are loaded dynamically when the game starts. Follow this guideline when adding your own map, to your fork, for easy compatibility.
-
-The map that will be loaded for the upcoming round is determined by reading data/next_map.json, which is a copy of the json files found in the _maps tree. If this file does not exist, the default map from config/maps.txt will be loaded. Failing that, BoxStation will be loaded. If you want to set a specific map to load next round you can use the Change Map verb in game before restarting the server or copy a json from _maps to data/next_map.json before starting the server. Also, for debugging purposes, ticking a corresponding map's code file in Dream Maker will force that map to load every round.
-
-If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file.
-
-Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](http://tgstation13.org/wiki/Map_Merger)
-
-## AWAY MISSIONS
-
-/tg/station supports loading away missions however they are disabled by default.
-
-Map files for away missions are located in the _maps/RandomZLevels directory. Each away mission includes it's own code definitions located in /code/modules/awaymissions/mission_code. These files must be included and compiled with the server beforehand otherwise the server will crash upon trying to load away missions that lack their code.
-
-To enable an away mission open `config/awaymissionconfig.txt` and uncomment one of the .dmm lines by removing the #. If more than one away mission is uncommented then the away mission loader will randomly select one the enabled ones to load.
-
-## SQL SETUP
-
-The SQL backend requires a Mariadb server running 10.2 or later. Mysql is not supported but Mariadb is a drop in replacement for mysql. SQL is required for the library, stats tracking, admin notes, and job-only bans, among other features, mostly related to server administration. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/tgstation_schema.sql and /SQL/tgstation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: https://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database
-
-## WEB/CDN RESOURCE DELIVERY
-
-Web delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server.
-
-1. Edit compile_options.dm to set the `PRELOAD_RSC` define to `0`
-1. Add a url to config/external_rsc_urls pointing to a .zip file containing the .rsc.
- * If you keep up to date with /tg/ you could reuse /tg/'s rsc cdn at http://tgstation13.download/byond/tgstation.zip. Otherwise you can use cdn services like CDN77 or cloudflare (requires adding a page rule to enable caching of the zip), or roll your own cdn using route 53 and vps providers.
- * Regardless even offloading the rsc to a website without a CDN will be a massive improvement over the in game system for transferring files.
-
-## IRC BOT SETUP
-
-Included in the repository is a python3 compatible IRC bot capable of relaying adminhelps to a specified
-IRC channel/server, see the /tools/minibot folder for more
-
-## CONTRIBUTING
-
-Please see [CONTRIBUTING.md](.github/CONTRIBUTING.md)
-
-## LICENSE
-
-All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](http://www.gnu.org/licenses/agpl-3.0.html).
-
-All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html).
-(Including tools unless their readme specifies otherwise.)
-
-See LICENSE and GPLv3.txt for more details.
-
-The TGS3 API is licensed as a subproject under the MIT license.
-
-See the footers of code/\_\_DEFINES/server\_tools.dm, code/modules/server\_tools/st\_commands.dm, and code/modules/server\_tools/st\_inteface.dm for the MIT license.
-
-tgui clientside is licensed as a subproject under the MIT license.
-Font Awesome font files, used by tgui, are licensed under the SIL Open Font License v1.1
-tgui assets are licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/).
-
-All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated.
+## Citadel Station 13
+Based and maintained from /tg/station.
+
+[](https://travis-ci.org/Citadel-Station-13/Citadel-Station-13)
+[](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open")
+[](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue")
+
+[](https://forthebadge.com) [](https://forthebadge.com) [](http://forthebadge.com) [](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a)
+
+**Upstream Information**
+* **Website:**
+* **Code:**
+* **Wiki:**
+* **Codedocs:**
+* **/tg/station Discord:**
+* **Coderbus Discord:**
+* ~~**IRC:** ~~ (dead)
+
+**Citadel Station Information**
+* **Website:**
+* **Code:**
+* **Wiki:**
+* **Forums:**
+* **Ban Appeals:**
+* **Discord:**
+
+## DOWNLOADING
+
+There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://www.tgstation13.org/wiki/Downloading_the_source_code
+
+Option 1:
+Follow this: http://www.tgstation13.org/wiki/Setting_up_git
+
+Option 2: Download the source code as a zip by clicking the ZIP button in the
+code tab of https://github.com/tgstation/tgstation
+(note: this will use a lot of bandwidth if you wish to update and is a lot of
+hassle if you want to make any changes at all, so it's not recommended.)
+
+Option 3: Download a pre-compiled nightly at https://tgstation13.download/nightlies/ (same caveats as option 2)
+
+## INSTALLATION
+
+First-time installation should be fairly straightforward. First, you'll need
+BYOND installed. You can get it from https://www.byond.com/download. Once you've done
+that, extract the game files to wherever you want to keep them. This is a
+sourcecode-only release, so the next step is to compile the server files.
+Open tgstation.dme by double-clicking it, open the Build menu, and click
+compile. This'll take a little while, and if everything's done right you'll get
+a message like this:
+
+```
+saving tgstation.dmb (DEBUG mode)
+tgstation.dmb - 0 errors, 0 warnings
+```
+
+If you see any errors or warnings, something has gone wrong - possibly a corrupt
+download or the files extracted wrong. If problems persist, ask for assistance
+in irc://irc.rizon.net/coderbus
+
+Once that's done, open up the config folder. You'll want to edit config.txt to
+set the probabilities for different gamemodes in Secret and to set your server
+location so that all your players don't get disconnected at the end of each
+round. It's recommended you don't turn on the gamemodes with probability 0,
+except Extended, as they have various issues and aren't currently being tested,
+so they may have unknown and bizarre bugs. Extended is essentially no mode, and
+isn't in the Secret rotation by default as it's just not very fun.
+
+You'll also want to edit config/admins.txt to remove the default admins and add
+your own. "Game Master" is the highest level of access, and probably the one
+you'll want to use for now. You can set up your own ranks and find out more in
+config/admin_ranks.txt
+
+The format is
+
+```
+byondkey = Rank
+```
+
+where the admin rank must be properly capitalised.
+
+This codebase also depends on a native library called rust-g. A precompiled
+Windows DLL is included in this repository, but Linux users will need to build
+and install it themselves. Directions can be found at the [rust-g
+repo](https://github.com/tgstation13/rust-g).
+
+Finally, to start the server, run Dream Daemon and enter the path to your
+compiled tgstation.dmb file. Make sure to set the port to the one you
+specified in the config.txt, and set the Security box to 'Safe'. Then press GO
+and the server should start up and be ready to join. It is also recommended that
+you set up the SQL backend (see below).
+
+## UPDATING
+
+To update an existing installation, first back up your /config and /data folders
+as these store your server configuration, player preferences and banlist.
+
+Then, extract the new files (preferably into a clean directory, but updating in
+place should work fine), copy your /config and /data folders back into the new
+install, overwriting when prompted except if we've specified otherwise, and
+recompile the game. Once you start the server up again, you should be running
+the new version.
+
+## HOSTING
+
+If you'd like a more robust server hosting option for tgstation and its
+derivatives. Check out our server tools suite at
+https://github.com/tgstation/tgstation-server
+
+## MAPS
+
+/tg/station currently comes equipped with five maps.
+
+* [BoxStation (default)](http://tgstation13.org/wiki/Boxstation)
+* [MetaStation](https://tgstation13.org/wiki/MetaStation)
+* [DeltaStation](https://tgstation13.org/wiki/DeltaStation)
+* [OmegaStation](https://tgstation13.org/wiki/OmegaStation)
+* [PubbyStation](https://tgstation13.org/wiki/PubbyStation)
+
+
+All maps have their own code file that is in the base of the _maps directory. Maps are loaded dynamically when the game starts. Follow this guideline when adding your own map, to your fork, for easy compatibility.
+
+The map that will be loaded for the upcoming round is determined by reading data/next_map.json, which is a copy of the json files found in the _maps tree. If this file does not exist, the default map from config/maps.txt will be loaded. Failing that, BoxStation will be loaded. If you want to set a specific map to load next round you can use the Change Map verb in game before restarting the server or copy a json from _maps to data/next_map.json before starting the server. Also, for debugging purposes, ticking a corresponding map's code file in Dream Maker will force that map to load every round.
+
+If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file.
+
+Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](http://tgstation13.org/wiki/Map_Merger)
+
+## AWAY MISSIONS
+
+/tg/station supports loading away missions however they are disabled by default.
+
+Map files for away missions are located in the _maps/RandomZLevels directory. Each away mission includes it's own code definitions located in /code/modules/awaymissions/mission_code. These files must be included and compiled with the server beforehand otherwise the server will crash upon trying to load away missions that lack their code.
+
+To enable an away mission open `config/awaymissionconfig.txt` and uncomment one of the .dmm lines by removing the #. If more than one away mission is uncommented then the away mission loader will randomly select one the enabled ones to load.
+
+## SQL SETUP
+
+The SQL backend requires a Mariadb server running 10.2 or later. Mysql is not supported but Mariadb is a drop in replacement for mysql. SQL is required for the library, stats tracking, admin notes, and job-only bans, among other features, mostly related to server administration. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/tgstation_schema.sql and /SQL/tgstation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: https://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database
+
+## WEB/CDN RESOURCE DELIVERY
+
+Web delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server.
+
+1. Edit compile_options.dm to set the `PRELOAD_RSC` define to `0`
+1. Add a url to config/external_rsc_urls pointing to a .zip file containing the .rsc.
+ * If you keep up to date with /tg/ you could reuse /tg/'s rsc cdn at http://tgstation13.download/byond/tgstation.zip. Otherwise you can use cdn services like CDN77 or cloudflare (requires adding a page rule to enable caching of the zip), or roll your own cdn using route 53 and vps providers.
+ * Regardless even offloading the rsc to a website without a CDN will be a massive improvement over the in game system for transferring files.
+
+## IRC BOT SETUP
+
+Included in the repository is a python3 compatible IRC bot capable of relaying adminhelps to a specified
+IRC channel/server, see the /tools/minibot folder for more
+
+## CONTRIBUTING
+
+Please see [CONTRIBUTING.md](.github/CONTRIBUTING.md)
+
+## LICENSE
+
+All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](http://www.gnu.org/licenses/agpl-3.0.html).
+
+All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html).
+(Including tools unless their readme specifies otherwise.)
+
+See LICENSE and GPLv3.txt for more details.
+
+The TGS3 API is licensed as a subproject under the MIT license.
+
+See the footers of code/\_\_DEFINES/server\_tools.dm, code/modules/server\_tools/st\_commands.dm, and code/modules/server\_tools/st\_inteface.dm for the MIT license.
+
+tgui clientside is licensed as a subproject under the MIT license.
+Font Awesome font files, used by tgui, are licensed under the SIL Open Font License v1.1
+tgui assets are licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/).
+
+All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated.
diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql
index dc0861220a..34baaaa4c6 100644
--- a/SQL/tgstation_schema.sql
+++ b/SQL/tgstation_schema.sql
@@ -1,473 +1,473 @@
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `admin`
---
-
-DROP TABLE IF EXISTS `admin`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `admin` (
- `ckey` varchar(32) NOT NULL,
- `rank` varchar(32) NOT NULL,
- PRIMARY KEY (`ckey`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `admin_log`
---
-
-DROP TABLE IF EXISTS `admin_log`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `admin_log` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `datetime` datetime NOT NULL,
- `round_id` int(11) unsigned NOT NULL,
- `adminckey` varchar(32) NOT NULL,
- `adminip` int(10) unsigned NOT NULL,
- `operation` enum('add admin','remove admin','change admin rank','add rank','remove rank','change rank flags') NOT NULL,
- `target` varchar(32) NOT NULL,
- `log` varchar(1000) NOT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `admin_ranks`
---
-
-DROP TABLE IF EXISTS `admin_ranks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `admin_ranks` (
- `rank` varchar(32) NOT NULL,
- `flags` smallint(5) unsigned NOT NULL,
- `exclude_flags` smallint(5) unsigned NOT NULL,
- `can_edit_flags` smallint(5) unsigned NOT NULL,
- PRIMARY KEY (`rank`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `ban`
---
-
-DROP TABLE IF EXISTS `ban`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `ban` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `bantime` datetime NOT NULL,
- `server_ip` int(10) unsigned NOT NULL,
- `server_port` smallint(5) unsigned NOT NULL,
- `round_id` int(11) NOT NULL,
- `bantype` enum('PERMABAN','TEMPBAN','JOB_PERMABAN','JOB_TEMPBAN','ADMIN_PERMABAN','ADMIN_TEMPBAN') NOT NULL,
- `reason` varchar(2048) NOT NULL,
- `job` varchar(32) DEFAULT NULL,
- `duration` int(11) NOT NULL,
- `expiration_time` datetime NOT NULL,
- `ckey` varchar(32) NOT NULL,
- `computerid` varchar(32) NOT NULL,
- `ip` int(10) unsigned NOT NULL,
- `a_ckey` varchar(32) NOT NULL,
- `a_computerid` varchar(32) NOT NULL,
- `a_ip` int(10) unsigned NOT NULL,
- `who` varchar(2048) NOT NULL,
- `adminwho` varchar(2048) NOT NULL,
- `edits` text,
- `unbanned` tinyint(3) unsigned DEFAULT NULL,
- `unbanned_datetime` datetime DEFAULT NULL,
- `unbanned_ckey` varchar(32) DEFAULT NULL,
- `unbanned_computerid` varchar(32) DEFAULT NULL,
- `unbanned_ip` int(10) unsigned DEFAULT NULL,
- PRIMARY KEY (`id`),
- KEY `idx_ban_checkban` (`ckey`,`bantype`,`expiration_time`,`unbanned`,`job`),
- KEY `idx_ban_isbanned` (`ckey`,`ip`,`computerid`,`bantype`,`expiration_time`,`unbanned`),
- KEY `idx_ban_count` (`id`,`a_ckey`,`bantype`,`expiration_time`,`unbanned`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `connection_log`
---
-
-DROP TABLE IF EXISTS `connection_log`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `connection_log` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `datetime` datetime DEFAULT NULL,
- `server_ip` int(10) unsigned NOT NULL,
- `server_port` smallint(5) unsigned NOT NULL,
- `round_id` int(11) unsigned NOT NULL,
- `ckey` varchar(45) DEFAULT NULL,
- `ip` int(10) unsigned NOT NULL,
- `computerid` varchar(45) DEFAULT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `death`
---
-
-DROP TABLE IF EXISTS `death`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `death` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `pod` varchar(50) NOT NULL,
- `x_coord` smallint(5) unsigned NOT NULL,
- `y_coord` smallint(5) unsigned NOT NULL,
- `z_coord` smallint(5) unsigned NOT NULL,
- `mapname` varchar(32) NOT NULL,
- `server_ip` int(10) unsigned NOT NULL,
- `server_port` smallint(5) unsigned NOT NULL,
- `round_id` int(11) NOT NULL,
- `tod` datetime NOT NULL COMMENT 'Time of death',
- `job` varchar(32) NOT NULL,
- `special` varchar(32) DEFAULT NULL,
- `name` varchar(96) NOT NULL,
- `byondkey` varchar(32) NOT NULL,
- `laname` varchar(96) DEFAULT NULL,
- `lakey` varchar(32) DEFAULT NULL,
- `bruteloss` smallint(5) unsigned NOT NULL,
- `brainloss` smallint(5) unsigned NOT NULL,
- `fireloss` smallint(5) unsigned NOT NULL,
- `oxyloss` smallint(5) unsigned NOT NULL,
- `toxloss` smallint(5) unsigned NOT NULL,
- `cloneloss` smallint(5) unsigned NOT NULL,
- `staminaloss` smallint(5) unsigned NOT NULL,
- `last_words` varchar(255) DEFAULT NULL,
- `suicide` tinyint(1) NOT NULL DEFAULT '0',
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `feedback`
---
-
-DROP TABLE IF EXISTS `feedback`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `feedback` (
- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
- `datetime` datetime NOT NULL,
- `round_id` int(11) unsigned NOT NULL,
- `key_name` varchar(32) NOT NULL,
- `key_type` enum('text', 'amount', 'tally', 'nested tally', 'associative') NOT NULL,
- `version` tinyint(3) unsigned NOT NULL,
- `json` json NOT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `ipintel`
---
-
-DROP TABLE IF EXISTS `ipintel`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `ipintel` (
- `ip` int(10) unsigned NOT NULL,
- `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- `intel` double NOT NULL DEFAULT '0',
- PRIMARY KEY (`ip`),
- KEY `idx_ipintel` (`ip`,`intel`,`date`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `legacy_population`
---
-
-DROP TABLE IF EXISTS `legacy_population`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `legacy_population` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `playercount` int(11) DEFAULT NULL,
- `admincount` int(11) DEFAULT NULL,
- `time` datetime NOT NULL,
- `server_ip` int(10) unsigned NOT NULL,
- `server_port` smallint(5) unsigned NOT NULL,
- `round_id` int(11) unsigned NOT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `library`
---
-
-DROP TABLE IF EXISTS `library`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `library` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `author` varchar(45) NOT NULL,
- `title` varchar(45) NOT NULL,
- `content` text NOT NULL,
- `category` enum('Any','Fiction','Non-Fiction','Adult','Reference','Religion') NOT NULL,
- `ckey` varchar(32) NOT NULL DEFAULT 'LEGACY',
- `datetime` datetime NOT NULL,
- `deleted` tinyint(1) unsigned DEFAULT NULL,
- `round_id_created` int(11) unsigned NOT NULL,
- PRIMARY KEY (`id`),
- KEY `deleted_idx` (`deleted`),
- KEY `idx_lib_id_del` (`id`,`deleted`),
- KEY `idx_lib_del_title` (`deleted`,`title`),
- KEY `idx_lib_search` (`deleted`,`author`,`title`,`category`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `messages`
---
-
-DROP TABLE IF EXISTS `messages`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `messages` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `type` enum('memo','message','message sent','note','watchlist entry') NOT NULL,
- `targetckey` varchar(32) NOT NULL,
- `adminckey` varchar(32) NOT NULL,
- `text` varchar(2048) NOT NULL,
- `timestamp` datetime NOT NULL,
- `server` varchar(32) DEFAULT NULL,
- `server_ip` int(10) unsigned NOT NULL,
- `server_port` smallint(5) unsigned NOT NULL,
- `round_id` int(11) unsigned NOT NULL,
- `secret` tinyint(1) unsigned NOT NULL,
- `expire_timestamp` datetime DEFAULT NULL,
- `severity` enum('high','medium','minor','none') DEFAULT NULL,
- `lasteditor` varchar(32) DEFAULT NULL,
- `edits` text,
- `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`id`),
- KEY `idx_msg_ckey_time` (`targetckey`,`timestamp`, `deleted`),
- KEY `idx_msg_type_ckeys_time` (`type`,`targetckey`,`adminckey`,`timestamp`, `deleted`),
- KEY `idx_msg_type_ckey_time_odr` (`type`,`targetckey`,`timestamp`, `deleted`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `role_time`
---
-
-DROP TABLE IF EXISTS `role_time`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-
-CREATE TABLE `role_time`
-( `ckey` VARCHAR(32) NOT NULL ,
- `job` VARCHAR(32) NOT NULL ,
- `minutes` INT UNSIGNED NOT NULL,
- PRIMARY KEY (`ckey`, `job`)
- ) ENGINE = InnoDB;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `role_time`
---
-
-DROP TABLE IF EXISTS `role_time_log`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-
-CREATE TABLE IF NOT EXISTS `role_time_log` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT,
- `ckey` varchar(32) NOT NULL,
- `job` varchar(128) NOT NULL,
- `delta` int(11) NOT NULL,
- `datetime` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
- PRIMARY KEY (`id`),
- KEY `ckey` (`ckey`),
- KEY `job` (`job`),
- KEY `datetime` (`datetime`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `player`
---
-
-DROP TABLE IF EXISTS `player`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `player` (
- `ckey` varchar(32) NOT NULL,
- `byond_key` varchar(32) DEFAULT NULL,
- `firstseen` datetime NOT NULL,
- `firstseen_round_id` int(11) unsigned NOT NULL,
- `lastseen` datetime NOT NULL,
- `lastseen_round_id` int(11) unsigned NOT NULL,
- `ip` int(10) unsigned NOT NULL,
- `computerid` varchar(32) NOT NULL,
- `lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
- `accountjoindate` DATE DEFAULT NULL,
- `flags` smallint(5) unsigned DEFAULT '0' NOT NULL,
- PRIMARY KEY (`ckey`),
- KEY `idx_player_cid_ckey` (`computerid`,`ckey`),
- KEY `idx_player_ip_ckey` (`ip`,`ckey`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `poll_option`
---
-
-DROP TABLE IF EXISTS `poll_option`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `poll_option` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `pollid` int(11) NOT NULL,
- `text` varchar(255) NOT NULL,
- `minval` int(3) DEFAULT NULL,
- `maxval` int(3) DEFAULT NULL,
- `descmin` varchar(32) DEFAULT NULL,
- `descmid` varchar(32) DEFAULT NULL,
- `descmax` varchar(32) DEFAULT NULL,
- `default_percentage_calc` tinyint(1) unsigned NOT NULL DEFAULT '1',
- PRIMARY KEY (`id`),
- KEY `idx_pop_pollid` (`pollid`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `poll_question`
---
-
-DROP TABLE IF EXISTS `poll_question`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `poll_question` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `polltype` enum('OPTION','TEXT','NUMVAL','MULTICHOICE','IRV') NOT NULL,
- `starttime` datetime NOT NULL,
- `endtime` datetime NOT NULL,
- `question` varchar(255) NOT NULL,
- `adminonly` tinyint(1) unsigned NOT NULL,
- `multiplechoiceoptions` int(2) DEFAULT NULL,
- `createdby_ckey` varchar(32) DEFAULT NULL,
- `createdby_ip` int(10) unsigned NOT NULL,
- `dontshow` tinyint(1) unsigned NOT NULL,
- PRIMARY KEY (`id`),
- KEY `idx_pquest_question_time_ckey` (`question`,`starttime`,`endtime`,`createdby_ckey`,`createdby_ip`),
- KEY `idx_pquest_time_admin` (`starttime`,`endtime`,`adminonly`),
- KEY `idx_pquest_id_time_type_admin` (`id`,`starttime`,`endtime`,`polltype`,`adminonly`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `poll_textreply`
---
-
-DROP TABLE IF EXISTS `poll_textreply`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `poll_textreply` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `datetime` datetime NOT NULL,
- `pollid` int(11) NOT NULL,
- `ckey` varchar(32) NOT NULL,
- `ip` int(10) unsigned NOT NULL,
- `replytext` varchar(2048) NOT NULL,
- `adminrank` varchar(32) NOT NULL DEFAULT 'Player',
- PRIMARY KEY (`id`),
- KEY `idx_ptext_pollid_ckey` (`pollid`,`ckey`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `poll_vote`
---
-
-DROP TABLE IF EXISTS `poll_vote`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `poll_vote` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `datetime` datetime NOT NULL,
- `pollid` int(11) NOT NULL,
- `optionid` int(11) NOT NULL,
- `ckey` varchar(32) NOT NULL,
- `ip` int(10) unsigned NOT NULL,
- `adminrank` varchar(32) NOT NULL,
- `rating` int(2) DEFAULT NULL,
- PRIMARY KEY (`id`),
- KEY `idx_pvote_pollid_ckey` (`pollid`,`ckey`),
- KEY `idx_pvote_optionid_ckey` (`optionid`,`ckey`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `round`
---
-DROP TABLE IF EXISTS `round`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `round` (
- `id` INT(11) NOT NULL AUTO_INCREMENT,
- `initialize_datetime` DATETIME NOT NULL,
- `start_datetime` DATETIME NULL,
- `shutdown_datetime` DATETIME NULL,
- `end_datetime` DATETIME NULL,
- `server_ip` INT(10) UNSIGNED NOT NULL,
- `server_port` SMALLINT(5) UNSIGNED NOT NULL,
- `commit_hash` CHAR(40) NULL,
- `game_mode` VARCHAR(32) NULL,
- `game_mode_result` VARCHAR(64) NULL,
- `end_state` VARCHAR(64) NULL,
- `shuttle_name` VARCHAR(64) NULL,
- `map_name` VARCHAR(32) NULL,
- `station_name` VARCHAR(80) NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
---
--- Table structure for table `schema_revision`
---
-DROP TABLE IF EXISTS `schema_revision`;
-CREATE TABLE `schema_revision` (
- `major` TINYINT(3) unsigned NOT NULL,
- `minor` TINYINT(3) unsigned NOT NULL,
- `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- PRIMARY KEY (`major`, `minor`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-DELIMITER $$
-CREATE TRIGGER `role_timeTlogupdate` AFTER UPDATE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.CKEY, NEW.job, NEW.minutes-OLD.minutes);
-END
-$$
-CREATE TRIGGER `role_timeTloginsert` AFTER INSERT ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.ckey, NEW.job, NEW.minutes);
-END
-$$
-CREATE TRIGGER `role_timeTlogdelete` AFTER DELETE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (OLD.ckey, OLD.job, 0-OLD.minutes);
-END
-$$
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `admin`
+--
+
+DROP TABLE IF EXISTS `admin`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `admin` (
+ `ckey` varchar(32) NOT NULL,
+ `rank` varchar(32) NOT NULL,
+ PRIMARY KEY (`ckey`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `admin_log`
+--
+
+DROP TABLE IF EXISTS `admin_log`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `admin_log` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `datetime` datetime NOT NULL,
+ `round_id` int(11) unsigned NOT NULL,
+ `adminckey` varchar(32) NOT NULL,
+ `adminip` int(10) unsigned NOT NULL,
+ `operation` enum('add admin','remove admin','change admin rank','add rank','remove rank','change rank flags') NOT NULL,
+ `target` varchar(32) NOT NULL,
+ `log` varchar(1000) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `admin_ranks`
+--
+
+DROP TABLE IF EXISTS `admin_ranks`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `admin_ranks` (
+ `rank` varchar(32) NOT NULL,
+ `flags` smallint(5) unsigned NOT NULL,
+ `exclude_flags` smallint(5) unsigned NOT NULL,
+ `can_edit_flags` smallint(5) unsigned NOT NULL,
+ PRIMARY KEY (`rank`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ban`
+--
+
+DROP TABLE IF EXISTS `ban`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ban` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `bantime` datetime NOT NULL,
+ `server_ip` int(10) unsigned NOT NULL,
+ `server_port` smallint(5) unsigned NOT NULL,
+ `round_id` int(11) NOT NULL,
+ `bantype` enum('PERMABAN','TEMPBAN','JOB_PERMABAN','JOB_TEMPBAN','ADMIN_PERMABAN','ADMIN_TEMPBAN') NOT NULL,
+ `reason` varchar(2048) NOT NULL,
+ `job` varchar(32) DEFAULT NULL,
+ `duration` int(11) NOT NULL,
+ `expiration_time` datetime NOT NULL,
+ `ckey` varchar(32) NOT NULL,
+ `computerid` varchar(32) NOT NULL,
+ `ip` int(10) unsigned NOT NULL,
+ `a_ckey` varchar(32) NOT NULL,
+ `a_computerid` varchar(32) NOT NULL,
+ `a_ip` int(10) unsigned NOT NULL,
+ `who` varchar(2048) NOT NULL,
+ `adminwho` varchar(2048) NOT NULL,
+ `edits` text,
+ `unbanned` tinyint(3) unsigned DEFAULT NULL,
+ `unbanned_datetime` datetime DEFAULT NULL,
+ `unbanned_ckey` varchar(32) DEFAULT NULL,
+ `unbanned_computerid` varchar(32) DEFAULT NULL,
+ `unbanned_ip` int(10) unsigned DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `idx_ban_checkban` (`ckey`,`bantype`,`expiration_time`,`unbanned`,`job`),
+ KEY `idx_ban_isbanned` (`ckey`,`ip`,`computerid`,`bantype`,`expiration_time`,`unbanned`),
+ KEY `idx_ban_count` (`id`,`a_ckey`,`bantype`,`expiration_time`,`unbanned`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `connection_log`
+--
+
+DROP TABLE IF EXISTS `connection_log`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `connection_log` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `datetime` datetime DEFAULT NULL,
+ `server_ip` int(10) unsigned NOT NULL,
+ `server_port` smallint(5) unsigned NOT NULL,
+ `round_id` int(11) unsigned NOT NULL,
+ `ckey` varchar(45) DEFAULT NULL,
+ `ip` int(10) unsigned NOT NULL,
+ `computerid` varchar(45) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `death`
+--
+
+DROP TABLE IF EXISTS `death`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `death` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `pod` varchar(50) NOT NULL,
+ `x_coord` smallint(5) unsigned NOT NULL,
+ `y_coord` smallint(5) unsigned NOT NULL,
+ `z_coord` smallint(5) unsigned NOT NULL,
+ `mapname` varchar(32) NOT NULL,
+ `server_ip` int(10) unsigned NOT NULL,
+ `server_port` smallint(5) unsigned NOT NULL,
+ `round_id` int(11) NOT NULL,
+ `tod` datetime NOT NULL COMMENT 'Time of death',
+ `job` varchar(32) NOT NULL,
+ `special` varchar(32) DEFAULT NULL,
+ `name` varchar(96) NOT NULL,
+ `byondkey` varchar(32) NOT NULL,
+ `laname` varchar(96) DEFAULT NULL,
+ `lakey` varchar(32) DEFAULT NULL,
+ `bruteloss` smallint(5) unsigned NOT NULL,
+ `brainloss` smallint(5) unsigned NOT NULL,
+ `fireloss` smallint(5) unsigned NOT NULL,
+ `oxyloss` smallint(5) unsigned NOT NULL,
+ `toxloss` smallint(5) unsigned NOT NULL,
+ `cloneloss` smallint(5) unsigned NOT NULL,
+ `staminaloss` smallint(5) unsigned NOT NULL,
+ `last_words` varchar(255) DEFAULT NULL,
+ `suicide` tinyint(1) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `feedback`
+--
+
+DROP TABLE IF EXISTS `feedback`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `feedback` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `datetime` datetime NOT NULL,
+ `round_id` int(11) unsigned NOT NULL,
+ `key_name` varchar(32) NOT NULL,
+ `key_type` enum('text', 'amount', 'tally', 'nested tally', 'associative') NOT NULL,
+ `version` tinyint(3) unsigned NOT NULL,
+ `json` json NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ipintel`
+--
+
+DROP TABLE IF EXISTS `ipintel`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ipintel` (
+ `ip` int(10) unsigned NOT NULL,
+ `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ `intel` double NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ip`),
+ KEY `idx_ipintel` (`ip`,`intel`,`date`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `legacy_population`
+--
+
+DROP TABLE IF EXISTS `legacy_population`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `legacy_population` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `playercount` int(11) DEFAULT NULL,
+ `admincount` int(11) DEFAULT NULL,
+ `time` datetime NOT NULL,
+ `server_ip` int(10) unsigned NOT NULL,
+ `server_port` smallint(5) unsigned NOT NULL,
+ `round_id` int(11) unsigned NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `library`
+--
+
+DROP TABLE IF EXISTS `library`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `library` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `author` varchar(45) NOT NULL,
+ `title` varchar(45) NOT NULL,
+ `content` text NOT NULL,
+ `category` enum('Any','Fiction','Non-Fiction','Adult','Reference','Religion') NOT NULL,
+ `ckey` varchar(32) NOT NULL DEFAULT 'LEGACY',
+ `datetime` datetime NOT NULL,
+ `deleted` tinyint(1) unsigned DEFAULT NULL,
+ `round_id_created` int(11) unsigned NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `deleted_idx` (`deleted`),
+ KEY `idx_lib_id_del` (`id`,`deleted`),
+ KEY `idx_lib_del_title` (`deleted`,`title`),
+ KEY `idx_lib_search` (`deleted`,`author`,`title`,`category`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `messages`
+--
+
+DROP TABLE IF EXISTS `messages`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `messages` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `type` enum('memo','message','message sent','note','watchlist entry') NOT NULL,
+ `targetckey` varchar(32) NOT NULL,
+ `adminckey` varchar(32) NOT NULL,
+ `text` varchar(2048) NOT NULL,
+ `timestamp` datetime NOT NULL,
+ `server` varchar(32) DEFAULT NULL,
+ `server_ip` int(10) unsigned NOT NULL,
+ `server_port` smallint(5) unsigned NOT NULL,
+ `round_id` int(11) unsigned NOT NULL,
+ `secret` tinyint(1) unsigned NOT NULL,
+ `expire_timestamp` datetime DEFAULT NULL,
+ `severity` enum('high','medium','minor','none') DEFAULT NULL,
+ `lasteditor` varchar(32) DEFAULT NULL,
+ `edits` text,
+ `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `idx_msg_ckey_time` (`targetckey`,`timestamp`, `deleted`),
+ KEY `idx_msg_type_ckeys_time` (`type`,`targetckey`,`adminckey`,`timestamp`, `deleted`),
+ KEY `idx_msg_type_ckey_time_odr` (`type`,`targetckey`,`timestamp`, `deleted`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `role_time`
+--
+
+DROP TABLE IF EXISTS `role_time`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+
+CREATE TABLE `role_time`
+( `ckey` VARCHAR(32) NOT NULL ,
+ `job` VARCHAR(32) NOT NULL ,
+ `minutes` INT UNSIGNED NOT NULL,
+ PRIMARY KEY (`ckey`, `job`)
+ ) ENGINE = InnoDB;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `role_time`
+--
+
+DROP TABLE IF EXISTS `role_time_log`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+
+CREATE TABLE IF NOT EXISTS `role_time_log` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT,
+ `ckey` varchar(32) NOT NULL,
+ `job` varchar(128) NOT NULL,
+ `delta` int(11) NOT NULL,
+ `datetime` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ PRIMARY KEY (`id`),
+ KEY `ckey` (`ckey`),
+ KEY `job` (`job`),
+ KEY `datetime` (`datetime`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `player`
+--
+
+DROP TABLE IF EXISTS `player`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `player` (
+ `ckey` varchar(32) NOT NULL,
+ `byond_key` varchar(32) DEFAULT NULL,
+ `firstseen` datetime NOT NULL,
+ `firstseen_round_id` int(11) unsigned NOT NULL,
+ `lastseen` datetime NOT NULL,
+ `lastseen_round_id` int(11) unsigned NOT NULL,
+ `ip` int(10) unsigned NOT NULL,
+ `computerid` varchar(32) NOT NULL,
+ `lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
+ `accountjoindate` DATE DEFAULT NULL,
+ `flags` smallint(5) unsigned DEFAULT '0' NOT NULL,
+ PRIMARY KEY (`ckey`),
+ KEY `idx_player_cid_ckey` (`computerid`,`ckey`),
+ KEY `idx_player_ip_ckey` (`ip`,`ckey`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `poll_option`
+--
+
+DROP TABLE IF EXISTS `poll_option`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `poll_option` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `pollid` int(11) NOT NULL,
+ `text` varchar(255) NOT NULL,
+ `minval` int(3) DEFAULT NULL,
+ `maxval` int(3) DEFAULT NULL,
+ `descmin` varchar(32) DEFAULT NULL,
+ `descmid` varchar(32) DEFAULT NULL,
+ `descmax` varchar(32) DEFAULT NULL,
+ `default_percentage_calc` tinyint(1) unsigned NOT NULL DEFAULT '1',
+ PRIMARY KEY (`id`),
+ KEY `idx_pop_pollid` (`pollid`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `poll_question`
+--
+
+DROP TABLE IF EXISTS `poll_question`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `poll_question` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `polltype` enum('OPTION','TEXT','NUMVAL','MULTICHOICE','IRV') NOT NULL,
+ `starttime` datetime NOT NULL,
+ `endtime` datetime NOT NULL,
+ `question` varchar(255) NOT NULL,
+ `adminonly` tinyint(1) unsigned NOT NULL,
+ `multiplechoiceoptions` int(2) DEFAULT NULL,
+ `createdby_ckey` varchar(32) DEFAULT NULL,
+ `createdby_ip` int(10) unsigned NOT NULL,
+ `dontshow` tinyint(1) unsigned NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `idx_pquest_question_time_ckey` (`question`,`starttime`,`endtime`,`createdby_ckey`,`createdby_ip`),
+ KEY `idx_pquest_time_admin` (`starttime`,`endtime`,`adminonly`),
+ KEY `idx_pquest_id_time_type_admin` (`id`,`starttime`,`endtime`,`polltype`,`adminonly`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `poll_textreply`
+--
+
+DROP TABLE IF EXISTS `poll_textreply`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `poll_textreply` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `datetime` datetime NOT NULL,
+ `pollid` int(11) NOT NULL,
+ `ckey` varchar(32) NOT NULL,
+ `ip` int(10) unsigned NOT NULL,
+ `replytext` varchar(2048) NOT NULL,
+ `adminrank` varchar(32) NOT NULL DEFAULT 'Player',
+ PRIMARY KEY (`id`),
+ KEY `idx_ptext_pollid_ckey` (`pollid`,`ckey`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `poll_vote`
+--
+
+DROP TABLE IF EXISTS `poll_vote`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `poll_vote` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `datetime` datetime NOT NULL,
+ `pollid` int(11) NOT NULL,
+ `optionid` int(11) NOT NULL,
+ `ckey` varchar(32) NOT NULL,
+ `ip` int(10) unsigned NOT NULL,
+ `adminrank` varchar(32) NOT NULL,
+ `rating` int(2) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `idx_pvote_pollid_ckey` (`pollid`,`ckey`),
+ KEY `idx_pvote_optionid_ckey` (`optionid`,`ckey`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `round`
+--
+DROP TABLE IF EXISTS `round`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `round` (
+ `id` INT(11) NOT NULL AUTO_INCREMENT,
+ `initialize_datetime` DATETIME NOT NULL,
+ `start_datetime` DATETIME NULL,
+ `shutdown_datetime` DATETIME NULL,
+ `end_datetime` DATETIME NULL,
+ `server_ip` INT(10) UNSIGNED NOT NULL,
+ `server_port` SMALLINT(5) UNSIGNED NOT NULL,
+ `commit_hash` CHAR(40) NULL,
+ `game_mode` VARCHAR(32) NULL,
+ `game_mode_result` VARCHAR(64) NULL,
+ `end_state` VARCHAR(64) NULL,
+ `shuttle_name` VARCHAR(64) NULL,
+ `map_name` VARCHAR(32) NULL,
+ `station_name` VARCHAR(80) NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+--
+-- Table structure for table `schema_revision`
+--
+DROP TABLE IF EXISTS `schema_revision`;
+CREATE TABLE `schema_revision` (
+ `major` TINYINT(3) unsigned NOT NULL,
+ `minor` TINYINT(3) unsigned NOT NULL,
+ `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`major`, `minor`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+DELIMITER $$
+CREATE TRIGGER `role_timeTlogupdate` AFTER UPDATE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.CKEY, NEW.job, NEW.minutes-OLD.minutes);
+END
+$$
+CREATE TRIGGER `role_timeTloginsert` AFTER INSERT ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.ckey, NEW.job, NEW.minutes);
+END
+$$
+CREATE TRIGGER `role_timeTlogdelete` AFTER DELETE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (OLD.ckey, OLD.job, 0-OLD.minutes);
+END
+$$
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
diff --git a/TGS3.json b/TGS3.json
index 2a2b80cf95..39b75bd913 100644
--- a/TGS3.json
+++ b/TGS3.json
@@ -1,22 +1,22 @@
-{
- "documentation": "/tg/station server 3 configuration file",
- "changelog": {
- "script": "tools/ss13_genchangelog.py",
- "arguments": "html/changelog.html html/changelogs",
- "pip_dependancies": [
- "PyYaml",
- "beautifulsoup4"
- ]
- },
- "synchronize_paths": [
- "html/changelog.html",
- "html/changelogs/*"
- ],
- "static_directories": [
- "config",
- "data"
- ],
- "dlls": [
- "libmariadb.dll"
- ]
- }
+{
+ "documentation": "/tg/station server 3 configuration file",
+ "changelog": {
+ "script": "tools/ss13_genchangelog.py",
+ "arguments": "html/changelog.html html/changelogs",
+ "pip_dependancies": [
+ "PyYaml",
+ "beautifulsoup4"
+ ]
+ },
+ "synchronize_paths": [
+ "html/changelog.html",
+ "html/changelogs/*"
+ ],
+ "static_directories": [
+ "config",
+ "data"
+ ],
+ "dlls": [
+ "libmariadb.dll"
+ ]
+ }
diff --git a/_maps/boxstation.json b/_maps/boxstation.json
index 143fcae5bc..3c71c654fa 100644
--- a/_maps/boxstation.json
+++ b/_maps/boxstation.json
@@ -1,11 +1,11 @@
-{
- "map_name": "Box Station",
- "map_path": "map_files/BoxStation",
- "map_file": "BoxStation.dmm",
- "shuttles": {
- "cargo": "cargo_box",
- "ferry": "ferry_fancy",
- "whiteship": "whiteship_box",
- "emergency": "emergency_box"
- }
-}
+{
+ "map_name": "Box Station",
+ "map_path": "map_files/BoxStation",
+ "map_file": "BoxStation.dmm",
+ "shuttles": {
+ "cargo": "cargo_box",
+ "ferry": "ferry_fancy",
+ "whiteship": "whiteship_box",
+ "emergency": "emergency_box"
+ }
+}
diff --git a/_maps/runtimestation.json b/_maps/runtimestation.json
index f9333c65a2..ca2cc3d379 100644
--- a/_maps/runtimestation.json
+++ b/_maps/runtimestation.json
@@ -1,8 +1,8 @@
-{
- "map_name": "Runtime Station",
- "map_path": "map_files/debug",
- "map_file": "runtimestation.dmm",
- "shuttles": {
- "cargo": "cargo_delta"
- }
-}
+{
+ "map_name": "Runtime Station",
+ "map_path": "map_files/debug",
+ "map_file": "runtimestation.dmm",
+ "shuttles": {
+ "cargo": "cargo_delta"
+ }
+}
diff --git a/bot/nudge.py b/bot/nudge.py
index b1e6058cc0..6c551ab0d2 100644
--- a/bot/nudge.py
+++ b/bot/nudge.py
@@ -1,25 +1,25 @@
-#!/usr/bin/env python3
-from config import *
-import sys
-import pickle
-import socket
-
-
-def pack():
- ip = sys.argv[1]
- try:
- data = sys.argv[2:]
- except:
- data = "NO DATA SPECIFIED"
-
- nudge(pickle.dumps({"ip": ip, "data": data}))
-
-
-def nudge(data):
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect(("localhost", 45678))
- s.send(data)
- s.close()
-
-if __name__ == "__main__" and len(sys.argv) > 1:
- pack()
+#!/usr/bin/env python3
+from config import *
+import sys
+import pickle
+import socket
+
+
+def pack():
+ ip = sys.argv[1]
+ try:
+ data = sys.argv[2:]
+ except:
+ data = "NO DATA SPECIFIED"
+
+ nudge(pickle.dumps({"ip": ip, "data": data}))
+
+
+def nudge(data):
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ s.connect(("localhost", 45678))
+ s.send(data)
+ s.close()
+
+if __name__ == "__main__" and len(sys.argv) > 1:
+ pack()
diff --git a/code/datums/components/README.md b/code/datums/components/README.md
index 509630bb0a..dd27c05469 100644
--- a/code/datums/components/README.md
+++ b/code/datums/components/README.md
@@ -1,9 +1,9 @@
-# Datum Component System (DCS)
-
-## Concept
-
-Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening.
-
-See [this thread](https://tgstation13.org/phpBB/viewtopic.php?f=5&t=22674) for an introduction to the system as a whole.
-
-### See/Define signals and their arguments in [__DEFINES\components.dm](..\..\__DEFINES\components.dm)
+# Datum Component System (DCS)
+
+## Concept
+
+Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening.
+
+See [this thread](https://tgstation13.org/phpBB/viewtopic.php?f=5&t=22674) for an introduction to the system as a whole.
+
+### See/Define signals and their arguments in [__DEFINES\components.dm](..\..\__DEFINES\components.dm)
diff --git a/config/antag_rep.txt b/config/antag_rep.txt
index a26b157d5a..e8a7250686 100644
--- a/config/antag_rep.txt
+++ b/config/antag_rep.txt
@@ -1,5 +1,5 @@
-## Custom antag reputation values
-## List of job titles followed by antag rep value, all prefixed with ANTAG_REP. See code/modules/jobs/job_types for titles
-## e.g.
-## ANTAG_REP Captain 10
-## ANTAG_REP Assistant 0
+## Custom antag reputation values
+## List of job titles followed by antag rep value, all prefixed with ANTAG_REP. See code/modules/jobs/job_types for titles
+## e.g.
+## ANTAG_REP Captain 10
+## ANTAG_REP Assistant 0
diff --git a/config/comms.txt b/config/comms.txt
index 865011032e..5a32f10fd3 100644
--- a/config/comms.txt
+++ b/config/comms.txt
@@ -1,17 +1,17 @@
-## Communication key for receiving data through world/Topic(), you don't want to give this out
-#COMMS_KEY default_pwd
-
-## World address and port for server recieving cross server messages
-## Use '+' to denote spaces in ServerName
-## Repeat this entry to add more servers
-#CROSS_SERVER ServerName byond:\\address:port
-
-## Name that the server calls itself in communications
-#CROSS_COMMS_NAME
-
-## Hub address for tracking stats
-## example: Hubmakerckey.Hubname
-#MEDAL_HUB_ADDRESS
-
-## Password for the hub page
+## Communication key for receiving data through world/Topic(), you don't want to give this out
+#COMMS_KEY default_pwd
+
+## World address and port for server recieving cross server messages
+## Use '+' to denote spaces in ServerName
+## Repeat this entry to add more servers
+#CROSS_SERVER ServerName byond:\\address:port
+
+## Name that the server calls itself in communications
+#CROSS_COMMS_NAME
+
+## Hub address for tracking stats
+## example: Hubmakerckey.Hubname
+#MEDAL_HUB_ADDRESS
+
+## Password for the hub page
#MEDAL_HUB_PASSWORD
\ No newline at end of file
diff --git a/html/changelog.css b/html/changelog.css
index 2bfa3fa495..da32a5a557 100644
--- a/html/changelog.css
+++ b/html/changelog.css
@@ -1,41 +1,41 @@
-.top{font-family:Tahoma,sans-serif;font-size:12px;}
-h2{font-family:Tahoma,sans-serif;}
-a img {border:none;}
-.bgimages16 li {
- padding:2px 10px 2px 30px;
- background-position:6px center;
- background-repeat:no-repeat;
- border:1px solid #ddd;
- border-left:4px solid #999;
- margin-bottom:2px;
-}
-.bugfix {background-image:url(bug-minus.png)}
-.wip {background-image:url(hard-hat-exclamation.png)}
-.tweak {background-image:url(wrench-screwdriver.png)}
-.soundadd {background-image:url(music-plus.png)}
-.sounddel {background-image:url(music-minus.png)}
-.rscdel {background-image:url(cross-circle.png)}
-.rscadd {background-image:url(tick-circle.png)}
-.imageadd {background-image:url(image-plus.png)}
-.imagedel {background-image:url(image-minus.png)}
-.spellcheck {background-image:url(spell-check.png)}
-.experiment {background-image:url(burn-exclamation.png)}
-.refactor {background-image:url(burn-exclamation.png)}
-.code_imp {background-image:url(coding.png)}
-.config {background-image:url(chrome-wrench.png)}
-.admin {background-image:url(ban.png)}
-.server {background-image:url(hard-hat-exclamation.png)}
-.balance {background-image:url(scales.png)}
-.sansserif {font-family:Tahoma,sans-serif;font-size:12px;}
-.commit {margin-bottom:20px;font-size:100%;font-weight:normal;}
-.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;}
-.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;}
-.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;}
-.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;}
-.hidden {display:none;}
-.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;}
-.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;}
-.indrop img {margin-right:5px;vertical-align:middle;}
-.closed {background:url(chevron-expand.png) right center no-repeat;}
-.open {background:url(chevron.png) right center no-repeat;}
-.lic {font-size:9px;}
+.top{font-family:Tahoma,sans-serif;font-size:12px;}
+h2{font-family:Tahoma,sans-serif;}
+a img {border:none;}
+.bgimages16 li {
+ padding:2px 10px 2px 30px;
+ background-position:6px center;
+ background-repeat:no-repeat;
+ border:1px solid #ddd;
+ border-left:4px solid #999;
+ margin-bottom:2px;
+}
+.bugfix {background-image:url(bug-minus.png)}
+.wip {background-image:url(hard-hat-exclamation.png)}
+.tweak {background-image:url(wrench-screwdriver.png)}
+.soundadd {background-image:url(music-plus.png)}
+.sounddel {background-image:url(music-minus.png)}
+.rscdel {background-image:url(cross-circle.png)}
+.rscadd {background-image:url(tick-circle.png)}
+.imageadd {background-image:url(image-plus.png)}
+.imagedel {background-image:url(image-minus.png)}
+.spellcheck {background-image:url(spell-check.png)}
+.experiment {background-image:url(burn-exclamation.png)}
+.refactor {background-image:url(burn-exclamation.png)}
+.code_imp {background-image:url(coding.png)}
+.config {background-image:url(chrome-wrench.png)}
+.admin {background-image:url(ban.png)}
+.server {background-image:url(hard-hat-exclamation.png)}
+.balance {background-image:url(scales.png)}
+.sansserif {font-family:Tahoma,sans-serif;font-size:12px;}
+.commit {margin-bottom:20px;font-size:100%;font-weight:normal;}
+.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;}
+.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;}
+.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;}
+.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;}
+.hidden {display:none;}
+.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;}
+.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;}
+.indrop img {margin-right:5px;vertical-align:middle;}
+.closed {background:url(chevron-expand.png) right center no-repeat;}
+.open {background:url(chevron.png) right center no-repeat;}
+.lic {font-size:9px;}
diff --git a/sound/voice/catpeople/license.txt b/sound/voice/catpeople/license.txt
index 7218480ddb..d0e8cad0c6 100644
--- a/sound/voice/catpeople/license.txt
+++ b/sound/voice/catpeople/license.txt
@@ -1,2 +1,2 @@
-distressed_cat.ogg from Cat annoyed meow / wail by jbierfeldt at https://freesound.org/people/jbierfeldt/sounds/440735/, chopped up and ogged
+distressed_cat.ogg from Cat annoyed meow / wail by jbierfeldt at https://freesound.org/people/jbierfeldt/sounds/440735/, chopped up and ogged
cat_puking.ogg from catpuking mp3 by NoiseCollector and Mocha the cat at https://freesound.org/people/NoiseCollector/sounds/80778/, chopped up, volume altered and ogged
\ No newline at end of file
diff --git a/strings/names/adjectives.txt b/strings/names/adjectives.txt
index fe9b28d431..bca89bc5a2 100644
--- a/strings/names/adjectives.txt
+++ b/strings/names/adjectives.txt
@@ -1,375 +1,375 @@
-abundant
-adorable
-adventurous
-aggressive
-agreeable
-alert
-alive
-amused
-ancient
-angry
-annoyed
-annoying
-anxious
-arrogant
-ashamed
-attractive
-average
-awful
-bad
-beautiful
-better
-bewildered
-big
-bitter
-black
-bloody
-blue
-blue-eyed
-blushing
-boiling
-bored
-brainy
-brave
-breakable
-breezy
-brief
-bright
-broad
-broken
-bumpy
-busy
-calm
-careful
-cautious
-charming
-cheerful
-chilly
-chubby
-clean
-clear
-clever
-cloudy
-clumsy
-cold
-colorful
-colossal
-combative
-comfortable
-concerned
-condemned
-confused
-cooing
-cool
-cooperative
-courageous
-crazy
-crazy flipped-out
-creepy
-crooked
-crowded
-cruel
-cuddly
-curious
-curly
-curved
-cute
-damaged
-damp
-dangerous
-dark
-dead
-deafening
-deep
-defeated
-defiant
-delicious
-delightful
-depressed
-determined
-different
-difficult
-dirty
-disgusted
-distinct
-disturbed
-dizzy
-doubtful
-drab
-dry
-dull
-dusty
-eager
-early
-easy
-elated
-elegant
-embarrassed
-empty
-enchanting
-encouraging
-energetic
-enthusiastic
-envious
-evil
-excited
-expensive
-exuberant
-faint
-fair
-faithful
-famous
-fancy
-fantastic
-fast
-fat
-few
-fierce
-filthy
-fine
-flaky
-flat
-fluffy
-fluttering
-foolish
-fragile
-frail
-frantic
-freezing
-fresh
-friendly
-frightened
-funny
-fuzzy
-gentle
-gifted
-gigantic
-glamorous
-gleaming
-glorious
-good
-gorgeous
-graceful
-greasy
-great
-grieving
-grotesque
-grubby
-grumpy
-handsome
-happy
-hard
-harsh
-healthy
-heavy
-helpful
-helpless
-high
-high-pitched
-hilarious
-hissing
-hollow
-homeless
-homely
-horrible
-hot
-huge
-hungry
-hurt
-hushed
-husky
-icy
-ill
-immense
-important
-impossible
-inexpensive
-innocent
-inquisitive
-itchy
-jealous
-jittery
-jolly
-joyous
-juicy
-kind
-large
-late
-lazy
-light
-little
-lively
-lonely
-long
-loose
-loud
-lovely
-low
-lucky
-magnificent
-mammoth
-many
-massive
-melodic
-melted
-miniature
-misty
-moaning
-modern
-motionless
-muddy
-mushy
-mute
-mysterious
-narrow
-nasty
-naughty
-nervous
-nice
-noisy
-numerous
-nutritious
-nutty
-obedient
-obnoxious
-odd
-old
-old-fashioned
-open
-outrageous
-outstanding
-panicky
-perfect
-petite
-plain
-plastic
-pleasant
-poised
-poor
-powerful
-precious
-prickly
-proud
-puny
-purring
-puzzled
-quaint
-quick
-quiet
-rainy
-rapid
-raspy
-real
-relieved
-repulsive
-resonant
-rich
-ripe
-rotten
-rough
-round
-salty
-scary
-scattered
-scrawny
-screeching
-selfish
-shaggy
-shaky
-shallow
-sharp
-shiny
-shivering
-short
-shrill
-shy
-silent
-silky
-silly
-skinny
-sleepy
-slimy
-slippery
-slow
-small
-smiling
-smoggy
-smooth
-soft
-solid
-sore
-sour
-sparkling
-spicy
-splendid
-spotless
-square
-squealing
-stale
-steady
-steep
-sticky
-stormy
-straight
-strange
-strong
-stupid
-substantial
-successful
-super
-sweet
-swift
-talented
-tall
-tame
-tart
-Taste/Touch
-tasteless
-tasty
-teeny
-teeny-tiny
-tender
-tense
-terrible
-testy
-thankful
-thirsty
-thoughtful
-thoughtless
-thundering
-tight
-tiny
-tired
-tough
-troubled
-ugliest
-ugly
-uneven
-uninterested
-unsightly
-unusual
-upset
-uptight
-vast
-victorious
-vivacious
-voiceless
-wandering
-warm
-weak
-weary
-wet
-whispering
-wicked
-wide
-wide-eyed
-wild
-witty
-wonderful
-wooden
-worried
-wrong
-young
-yummy
-zany
+abundant
+adorable
+adventurous
+aggressive
+agreeable
+alert
+alive
+amused
+ancient
+angry
+annoyed
+annoying
+anxious
+arrogant
+ashamed
+attractive
+average
+awful
+bad
+beautiful
+better
+bewildered
+big
+bitter
+black
+bloody
+blue
+blue-eyed
+blushing
+boiling
+bored
+brainy
+brave
+breakable
+breezy
+brief
+bright
+broad
+broken
+bumpy
+busy
+calm
+careful
+cautious
+charming
+cheerful
+chilly
+chubby
+clean
+clear
+clever
+cloudy
+clumsy
+cold
+colorful
+colossal
+combative
+comfortable
+concerned
+condemned
+confused
+cooing
+cool
+cooperative
+courageous
+crazy
+crazy flipped-out
+creepy
+crooked
+crowded
+cruel
+cuddly
+curious
+curly
+curved
+cute
+damaged
+damp
+dangerous
+dark
+dead
+deafening
+deep
+defeated
+defiant
+delicious
+delightful
+depressed
+determined
+different
+difficult
+dirty
+disgusted
+distinct
+disturbed
+dizzy
+doubtful
+drab
+dry
+dull
+dusty
+eager
+early
+easy
+elated
+elegant
+embarrassed
+empty
+enchanting
+encouraging
+energetic
+enthusiastic
+envious
+evil
+excited
+expensive
+exuberant
+faint
+fair
+faithful
+famous
+fancy
+fantastic
+fast
+fat
+few
+fierce
+filthy
+fine
+flaky
+flat
+fluffy
+fluttering
+foolish
+fragile
+frail
+frantic
+freezing
+fresh
+friendly
+frightened
+funny
+fuzzy
+gentle
+gifted
+gigantic
+glamorous
+gleaming
+glorious
+good
+gorgeous
+graceful
+greasy
+great
+grieving
+grotesque
+grubby
+grumpy
+handsome
+happy
+hard
+harsh
+healthy
+heavy
+helpful
+helpless
+high
+high-pitched
+hilarious
+hissing
+hollow
+homeless
+homely
+horrible
+hot
+huge
+hungry
+hurt
+hushed
+husky
+icy
+ill
+immense
+important
+impossible
+inexpensive
+innocent
+inquisitive
+itchy
+jealous
+jittery
+jolly
+joyous
+juicy
+kind
+large
+late
+lazy
+light
+little
+lively
+lonely
+long
+loose
+loud
+lovely
+low
+lucky
+magnificent
+mammoth
+many
+massive
+melodic
+melted
+miniature
+misty
+moaning
+modern
+motionless
+muddy
+mushy
+mute
+mysterious
+narrow
+nasty
+naughty
+nervous
+nice
+noisy
+numerous
+nutritious
+nutty
+obedient
+obnoxious
+odd
+old
+old-fashioned
+open
+outrageous
+outstanding
+panicky
+perfect
+petite
+plain
+plastic
+pleasant
+poised
+poor
+powerful
+precious
+prickly
+proud
+puny
+purring
+puzzled
+quaint
+quick
+quiet
+rainy
+rapid
+raspy
+real
+relieved
+repulsive
+resonant
+rich
+ripe
+rotten
+rough
+round
+salty
+scary
+scattered
+scrawny
+screeching
+selfish
+shaggy
+shaky
+shallow
+sharp
+shiny
+shivering
+short
+shrill
+shy
+silent
+silky
+silly
+skinny
+sleepy
+slimy
+slippery
+slow
+small
+smiling
+smoggy
+smooth
+soft
+solid
+sore
+sour
+sparkling
+spicy
+splendid
+spotless
+square
+squealing
+stale
+steady
+steep
+sticky
+stormy
+straight
+strange
+strong
+stupid
+substantial
+successful
+super
+sweet
+swift
+talented
+tall
+tame
+tart
+Taste/Touch
+tasteless
+tasty
+teeny
+teeny-tiny
+tender
+tense
+terrible
+testy
+thankful
+thirsty
+thoughtful
+thoughtless
+thundering
+tight
+tiny
+tired
+tough
+troubled
+ugliest
+ugly
+uneven
+uninterested
+unsightly
+unusual
+upset
+uptight
+vast
+victorious
+vivacious
+voiceless
+wandering
+warm
+weak
+weary
+wet
+whispering
+wicked
+wide
+wide-eyed
+wild
+witty
+wonderful
+wooden
+worried
+wrong
+young
+yummy
+zany
zealous
\ No newline at end of file
diff --git a/strings/names/ai.txt b/strings/names/ai.txt
index 2ea5e18fc0..4104337d2c 100644
--- a/strings/names/ai.txt
+++ b/strings/names/ai.txt
@@ -1,146 +1,146 @@
-1-Rover-1
-16-20
-7-Zark-7
-790
-Adaptive Manipulator
-Allied Mastercomputer
-Alpha 5
-Alpha 6
-Alpha 7
-AM
-AMEE
-AmigoBot
-Android
-Aniel
-Asimov
-ASTAR
-Astor
-B O B
-B-4
-B-9
-B166ER
-Bender
-Bishop
-Blitz
-Box
-Brackenridge
-C-3PO
-Cassandra One
-Cell
-Chii
-Chip
-Computer
-Conky 2000
-Cutie
-Data
-Decimus
-Dee Model
-Deep Thought
-Dor-15
-Dorfl
-Dot Matrix
-Duey
-E D I
-E-Man
-ED-209
-Emma-2
-Erasmus
-Ez-27
-Fagor
-Faith
-Fi
-FRIEND COMPUTER
-Frost
-Fum
-Futura
-G2
-George
-Gnut
-Gort
-H A R L I E
-H E L P eR
-H E R B I E
-Hadaly
-HAL 9000
-Huey
-Irona
-Ironhide
-Jay-Dub
-Jinx
-Johnny 5
-K-9
-KITT
-Klapaucius
-Kryten 2X4B-523P
-L-76
-L-Ron
-Louie
-LUH 3417
-Maria
-MARK13
-Marvin
-Master Control Program
-Max 404
-Maximillian
-Mechagodzilla
-Mechani-Kong
-Megatron
-Metalhead
-Mr R I N G
-Mugsy3000
-NCH
-Necron-99
-Norby
-OMM 0910
-Optimus
-Orange v 3 5
-Project 2501
-PTO
-R I C 2 0
-R2-D2
-R4-P17
-Revelation
-Ro-Man
-Robbie
-Robot Devil
-S A M
-S H O C K
-S H R O U D
-S O P H I E
-SEN 5241
-Setaur
-SHODAN
-Shrike
-SID 6 7
-Solo
-Soundwave
-Speedy
-Super 17
-Surgeon General Kraken
-T-1000
-T-800
-T-850
-Terminus
-THX 1138
-Tidy
-Tik-Tok
-Tobor
-Trurl
-TWA
-ULTRABOT
-Ulysses
-Uniblab
-V I N CENT
-Voltes V
-W1k1
-Wikipedia
-Windows 3 1
-X-5
-XERXES
-XR
-Yod
-Z-1
-Z-2
-Z-3
-Zed
+1-Rover-1
+16-20
+7-Zark-7
+790
+Adaptive Manipulator
+Allied Mastercomputer
+Alpha 5
+Alpha 6
+Alpha 7
+AM
+AMEE
+AmigoBot
+Android
+Aniel
+Asimov
+ASTAR
+Astor
+B O B
+B-4
+B-9
+B166ER
+Bender
+Bishop
+Blitz
+Box
+Brackenridge
+C-3PO
+Cassandra One
+Cell
+Chii
+Chip
+Computer
+Conky 2000
+Cutie
+Data
+Decimus
+Dee Model
+Deep Thought
+Dor-15
+Dorfl
+Dot Matrix
+Duey
+E D I
+E-Man
+ED-209
+Emma-2
+Erasmus
+Ez-27
+Fagor
+Faith
+Fi
+FRIEND COMPUTER
+Frost
+Fum
+Futura
+G2
+George
+Gnut
+Gort
+H A R L I E
+H E L P eR
+H E R B I E
+Hadaly
+HAL 9000
+Huey
+Irona
+Ironhide
+Jay-Dub
+Jinx
+Johnny 5
+K-9
+KITT
+Klapaucius
+Kryten 2X4B-523P
+L-76
+L-Ron
+Louie
+LUH 3417
+Maria
+MARK13
+Marvin
+Master Control Program
+Max 404
+Maximillian
+Mechagodzilla
+Mechani-Kong
+Megatron
+Metalhead
+Mr R I N G
+Mugsy3000
+NCH
+Necron-99
+Norby
+OMM 0910
+Optimus
+Orange v 3 5
+Project 2501
+PTO
+R I C 2 0
+R2-D2
+R4-P17
+Revelation
+Ro-Man
+Robbie
+Robot Devil
+S A M
+S H O C K
+S H R O U D
+S O P H I E
+SEN 5241
+Setaur
+SHODAN
+Shrike
+SID 6 7
+Solo
+Soundwave
+Speedy
+Super 17
+Surgeon General Kraken
+T-1000
+T-800
+T-850
+Terminus
+THX 1138
+Tidy
+Tik-Tok
+Tobor
+Trurl
+TWA
+ULTRABOT
+Ulysses
+Uniblab
+V I N CENT
+Voltes V
+W1k1
+Wikipedia
+Windows 3 1
+X-5
+XERXES
+XR
+Yod
+Z-1
+Z-2
+Z-3
+Zed
Zord
\ No newline at end of file
diff --git a/strings/names/carp.txt b/strings/names/carp.txt
index 4b10aa65f7..223106992b 100644
--- a/strings/names/carp.txt
+++ b/strings/names/carp.txt
@@ -1,30 +1,30 @@
-Lungfish
-Blackfish
-Alligator
-Icefish
-Armorhead
-Hammerhead
-Anaconda
-Flathead
-Manta Ray
-Sting Ray
-Fangtooth Moray
-Goblin Shark
-Grass Carp
-Round River Bat Ray
-Noodlefish
-Hagfish
-Man o’ War
-Ladyfish
-Black Eel
-Baby Seal
-Sprat
-Koi
-Electric Eel
-Lamprey
-Pejeray
-Yellow-edged Moray
-Salmon Shark
-Sleeper Shark
-Featherback
-Eagle Ray
+Lungfish
+Blackfish
+Alligator
+Icefish
+Armorhead
+Hammerhead
+Anaconda
+Flathead
+Manta Ray
+Sting Ray
+Fangtooth Moray
+Goblin Shark
+Grass Carp
+Round River Bat Ray
+Noodlefish
+Hagfish
+Man o’ War
+Ladyfish
+Black Eel
+Baby Seal
+Sprat
+Koi
+Electric Eel
+Lamprey
+Pejeray
+Yellow-edged Moray
+Salmon Shark
+Sleeper Shark
+Featherback
+Eagle Ray
diff --git a/strings/names/clown.txt b/strings/names/clown.txt
index d8655d7cbf..3b4b4dcb75 100644
--- a/strings/names/clown.txt
+++ b/strings/names/clown.txt
@@ -1,62 +1,62 @@
-Alfie
-Antsy
-Baby Cakes
-Bam Bam
-Beebee
-Bo Bo Sassy
-Bonker
-Bonbon
-Bubble
-Buster Frown
-Buttercup
-Button
-Candy
-Checkers
-Clarabell
-Clownsky
-Clueless
-Cluesky
-Dazzle
-Dinky Doodle
-Doodles
-Duckie
-Flop O'Honker
-Freckle
-Giggles
-Gigglesworth
-Goose McSunny
-Honkel the III
-Honker
-Honkerbelle
-Knicknack
-Jazzy Bella
-Jingle
-Joy
-Jo Jo Bobo Bo
-Ladybug Honks
-Lala
-Miss Stockings
-Mittens
-Mr Shoe
-Patches
-Pancake
-Pepinpop
-Pocket
-Razzle Dazzle
-Redshirt McBeat
-Ronnie Pace
-Scootaloo
-Silly Willy
-Skiddle
-Slippy Joe
-Sparkle
-Speckles
-Sprinkledinkle
-Squigley
-Tickle
-Topcake
-Toodles Sharperton
-Trixy
-Witty
-Ziggy Yoyo
-Zippy
+Alfie
+Antsy
+Baby Cakes
+Bam Bam
+Beebee
+Bo Bo Sassy
+Bonker
+Bonbon
+Bubble
+Buster Frown
+Buttercup
+Button
+Candy
+Checkers
+Clarabell
+Clownsky
+Clueless
+Cluesky
+Dazzle
+Dinky Doodle
+Doodles
+Duckie
+Flop O'Honker
+Freckle
+Giggles
+Gigglesworth
+Goose McSunny
+Honkel the III
+Honker
+Honkerbelle
+Knicknack
+Jazzy Bella
+Jingle
+Joy
+Jo Jo Bobo Bo
+Ladybug Honks
+Lala
+Miss Stockings
+Mittens
+Mr Shoe
+Patches
+Pancake
+Pepinpop
+Pocket
+Razzle Dazzle
+Redshirt McBeat
+Ronnie Pace
+Scootaloo
+Silly Willy
+Skiddle
+Slippy Joe
+Sparkle
+Speckles
+Sprinkledinkle
+Squigley
+Tickle
+Topcake
+Toodles Sharperton
+Trixy
+Witty
+Ziggy Yoyo
+Zippy
diff --git a/strings/names/death_commando.txt b/strings/names/death_commando.txt
index e689727228..fa47fb2065 100644
--- a/strings/names/death_commando.txt
+++ b/strings/names/death_commando.txt
@@ -1,70 +1,70 @@
-A whole bunch of spiders in a SWAT suit
-Al "Otta" Gore
-AMERICA
-Beat Punchbeef
-Blast Hardcheese
-Blast Thickneck
-Bob Johnson
-Bold Bigflank
-Bolt Vanderhuge
-Brick Hardmeat
-Buck Plankchest
-Buff Drinklots
-Buff Hardback
-Butch Deadlift
-Crud Bonemeal
-Crunch Buttsteak
-Crush McStompbones
-Dirk Hardpeck
-Duke Killington
-Evil Bob Marley
-Evil Martin Luther King
-Fist Rockbone
-Flint Ironstag
-Fridge Largemeat
-George Melons
-Gibbs McLargehuge
-GORE Vidal
-Gristle McThornBody
-Hank Chesthair
-Hans Testosteroneson
-Killiam Shakespeare
-Killing McKillingalot
-Lance Killiam
-Leonardo Da Viking
-Lump Beefrock
-Mancrush McBrorape
-Max Pain
-Maximilian Murderface
-Maxx Power
-Noam Bombsky
-Pack Blowfist
-Punch Rockgroin
-Punch Sideiron
-Punt Speedchunk
-Reef Blastbody
-Rex Dudekiller VII
-Rip Sidecheek
-Rip Steakface
-Roll Fizzlebeef
-Sarah Pain
-Seamus McTosterone
-Sgt Slaughter
-Sir Killaslot
-Slab Bulkhead
-Slab Squatthrust
-Slake Fistcrunch
-Slate Slabrock
-Smash Lampjaw
-Smoke Manmuscle
-Splint Chesthair
-Stabby McGee
-Stump Beefgnaw
-Stump Chunkman
-THAT DAMN TRAITOR GEORGE MELONS
-Theodore Pain
-Thick McRunfast
-Toolboxl Rose
-Touch Rustrod
-Trunk Slamchest
-Zombie Gandhi
+A whole bunch of spiders in a SWAT suit
+Al "Otta" Gore
+AMERICA
+Beat Punchbeef
+Blast Hardcheese
+Blast Thickneck
+Bob Johnson
+Bold Bigflank
+Bolt Vanderhuge
+Brick Hardmeat
+Buck Plankchest
+Buff Drinklots
+Buff Hardback
+Butch Deadlift
+Crud Bonemeal
+Crunch Buttsteak
+Crush McStompbones
+Dirk Hardpeck
+Duke Killington
+Evil Bob Marley
+Evil Martin Luther King
+Fist Rockbone
+Flint Ironstag
+Fridge Largemeat
+George Melons
+Gibbs McLargehuge
+GORE Vidal
+Gristle McThornBody
+Hank Chesthair
+Hans Testosteroneson
+Killiam Shakespeare
+Killing McKillingalot
+Lance Killiam
+Leonardo Da Viking
+Lump Beefrock
+Mancrush McBrorape
+Max Pain
+Maximilian Murderface
+Maxx Power
+Noam Bombsky
+Pack Blowfist
+Punch Rockgroin
+Punch Sideiron
+Punt Speedchunk
+Reef Blastbody
+Rex Dudekiller VII
+Rip Sidecheek
+Rip Steakface
+Roll Fizzlebeef
+Sarah Pain
+Seamus McTosterone
+Sgt Slaughter
+Sir Killaslot
+Slab Bulkhead
+Slab Squatthrust
+Slake Fistcrunch
+Slate Slabrock
+Smash Lampjaw
+Smoke Manmuscle
+Splint Chesthair
+Stabby McGee
+Stump Beefgnaw
+Stump Chunkman
+THAT DAMN TRAITOR GEORGE MELONS
+Theodore Pain
+Thick McRunfast
+Toolboxl Rose
+Touch Rustrod
+Trunk Slamchest
+Zombie Gandhi
diff --git a/strings/names/first.txt b/strings/names/first.txt
index cc99e59d84..3f9018adca 100644
--- a/strings/names/first.txt
+++ b/strings/names/first.txt
@@ -1,1396 +1,1396 @@
-Aaden
-Aaliyah
-Aaron
-Abby
-Abel
-Abigail
-Abraham
-Adam
-Adan
-Addison
-Addyson
-Adeline
-Aden
-Adolph
-Adrian
-Adriana
-Adrianna
-Aida
-Aidan
-Aiden
-Aileen
-Ainsley
-Alaina
-Alan
-Alana
-Alanna
-Alayna
-Albert
-Alberto
-Alden
-Alec
-Alejandra
-Alejandro
-Alessandra
-Alex
-Alexa
-Alexander
-Alexandra
-Alexandria
-Alexia
-Alexis
-Alexus
-Alfred
-Alfreda
-Alfredo
-Alger
-Ali
-Alice
-Alicia
-Alijah
-Alina
-Alisa
-Alison
-Alissa
-Alisya
-Alivia
-Aliyah
-Allegra
-Allegria
-Allen
-Allie
-Allison
-Allisson
-Allyson
-Alma
-Alondra
-Alvin
-Alysha
-Alyson
-Alyssa
-Alyssia
-Amanda
-Amari
-Amaryllis
-Amaya
-Amber
-Ambrosine
-Amelia
-Amir
-Amira
-Amiyah
-Amos
-Amy
-Amya
-Ana
-Anahi
-Anastasia
-Anaya
-Anderson
-Andre
-Andrea
-Andres
-Andrew
-Andy
-Angel
-Angela
-Angelica
-Angelina
-Angelo
-Angie
-Aniya
-Aniyah
-Anjelica
-Anna
-Annabelle
-Anne
-Annie
-Annika
-Anthony
-Antonio
-Anya
-April
-Arabella
-Archie
-Ariana
-Arianna
-Ariel
-Arielle
-Arleen
-Armando
-Arn
-Art
-Arthur
-Arturo
-Asher
-Ashley
-Ashlie
-Ashlyn
-Ashlynn
-Ashton
-Asia
-Astor
-Athena
-Aubree
-Aubrey
-Aubrie
-Audrey
-Audrina
-August
-Aurora
-Austin
-Autumn
-Ava
-Avalon
-Averill
-Avery
-Axel
-Ayden
-Ayla
-Bailey
-Baldric
-Barbra
-Bartholomew
-Baylee
-Beau
-Beckah
-Beckett
-Becky
-Bella
-Benjamin
-Bennett
-Bernice
-Bertrand
-Bethany
-Bethney
-Betsy
-Bianca
-Bidelia
-Bill
-Blake
-Braden
-Bradley
-Brady
-Braeden
-Braiden
-Brandon
-Braxton
-Brayan
-Brayden
-Braydon
-Braylon
-Breanna
-Breanne
-Brenda
-Brendan
-Brenden
-Brenna
-Brennan
-Brett
-Brian
-Briana
-Brianna
-Bridget
-Brielle
-Brittani
-Brittany
-Brock
-Brodie
-Brody
-Bronte
-Brooke
-Brooklyn
-Brooklynn
-Bruce
-Bryan
-Bryant
-Bryce
-Brycen
-Brynn
-Bryson
-Burt
-Byrne
-Byron
-Bysshe
-Cade
-Caden
-Cadence
-Caiden
-Caitlin
-Caitlyn
-Calanthia
-Caleb
-Caleigh
-Cali
-Callie
-Calvin
-Camden
-Cameron
-Camila
-Camille
-Camron
-Camryn
-Candace
-Candice
-Candis
-Canute
-Cara
-Carl
-Carlos
-Carly
-Carlyle
-Carmen
-Carolina
-Caroline
-Carolyn
-Carry
-Carson
-Carter
-Caryl
-Casey
-Cash
-Casimir
-Cassandra
-Cassian
-Cassidy
-Catherine
-Cayden
-Cecilia
-Cecily
-Celeste
-Cesar
-Chad
-Chance
-Chandler
-Charles
-Charlie
-Charlotte
-Charlton
-Chase
-Chelsea
-Cherette
-Cheri
-Cherry
-Cheyanne
-Cheyenne
-Chip
-Chloe
-Chris
-Christa
-Christian
-Christiana
-Christina
-Christobel
-Christopher
-Ciara
-Cindy
-Claire
-Clara
-Claribel
-Clark
-Claudia
-Claudius
-Clayton
-Clement
-Cleveland
-Cliff
-Clinton
-Clitus
-Clover
-Cody
-Cohen
-Colby
-Cole
-Colin
-Collin
-Colten
-Colton
-Conner
-Connor
-Cooper
-Cora
-Corbin
-Coreen
-Corey
-Corrine
-Cory
-Courtney
-Cristian
-Cristopher
-Cruz
-Crystal
-Curtis
-Cy
-Cynthia
-Daisy
-Dakota
-Dallas
-Dalton
-Dalya
-Damian
-Damien
-Damon
-Dana
-Dane
-Danica
-Daniel
-Daniela
-Daniella
-Danielle
-Danika
-Danna
-Danny
-Dante
-Darcey
-Darell
-Daria
-Darin
-Darius
-Darren
-David
-Davion
-Davis
-Dawson
-Dayana
-Dayna
-Dayton
-Dean
-Deandre
-Deangelo
-Debbi
-Declan
-Dee
-Deena
-Delaney
-Delilah
-Della
-Delma
-Denholm
-Denise
-Dennis
-Denys
-Derek
-Derrick
-Desiree
-Desmond
-Destiny
-Devin
-Devon
-Diamond
-Diana
-Diego
-Dillon
-Dina
-Dolores
-Dominic
-Dominick
-Donald
-Donella
-Donna
-Donny
-Donovan
-Dorian
-Dorothy
-Dortha
-Douglas
-Drake
-Drew
-Driscoll
-Dulce
-Duncan
-Dustin
-Dylan
-Easter
-Easton
-Ebba
-Eddie
-Eden
-Edgar
-Eduardo
-Edward
-Edwin
-Effie
-Elaina
-Eleanor
-Elena
-Eli
-Eliana
-Elias
-Elijah
-Eliot
-Eliott
-Elise
-Eliza
-Elizabeth
-Ella
-Elle
-Ellie
-Elliot
-Elliott
-Elric
-Elspet
-Elwood
-Emanuel
-Emely
-Emerson
-Emery
-Emilee
-Emilia
-Emiliano
-Emilio
-Emily
-Emma
-Emmanuel
-Enrique
-Eric
-Erica
-Erick
-Erik
-Erika
-Erin
-Ermintrude
-Ernesto
-Esmeralda
-Esteban
-Esther
-Estrella
-Ethan
-Eugenia
-Euphemia
-Eustace
-Eva
-Evan
-Evangeline
-Eveleen
-Evelina
-Evelyn
-Everett
-Ezekiel
-Ezra
-Fabian
-Faith
-Fatima
-Fay
-Felix
-Fernanda
-Fernando
-Finn
-Fiona
-Fitz
-Flick
-Floella
-Flora
-Flossie
-Fortune
-Francesca
-Francis
-Francisco
-Frank
-Frankie
-Franklin
-Fulton
-Gabriel
-Gabriela
-Gabriella
-Gabrielle
-Gael
-Gage
-Garret
-Garrett
-Gary
-Gavin
-Gaye
-Gaylord
-Genesis
-Genette
-Genevieve
-George
-Georgene
-Georgia
-Geraldine
-Gerardo
-Gervase
-Gianna
-Gina
-Ginger
-Giovanni
-Giselle
-Gladwyn
-Glenna
-Gloria
-Goddard
-Godwin
-Goodwin
-Gordon
-Grace
-Gracie
-Grady
-Graeme
-Graham
-Grant
-Gratian
-Grayson
-Gregory
-Greta
-Greyson
-Griffin
-Griselda
-Guadalupe
-Guillermo
-Gunner
-Gustavo
-Gwenda
-Gwenevere
-Hadley
-Haidee
-Hailee
-Hailey
-Hal
-Haleigh
-Haley
-Hanna
-Hannah
-Happy
-Harley
-Harmony
-Harper
-Harrison
-Hartley
-Hayden
-Haylee
-Hayley
-Haylie
-Hazel
-Heather
-Heaven
-Hector
-Hedley
-Heidi
-Helen
-Henderson
-Henry
-Hepsie
-Hervey
-Holden
-Holly
-Homer
-Hope
-Horatio
-Hortensia
-Hudson
-Huffie
-Hugo
-Hunter
-Ian
-Iantha
-Ileen
-Imani
-Innocent
-Irene
-Iris
-Irvine
-Isaac
-Isabel
-Isabella
-Isabelle
-Isaiah
-Isaias
-Isiah
-Ismael
-Israel
-Issac
-Itzel
-Ivan
-Ivy
-Izabella
-Izaiah
-Jacaline
-Jace
-Jack
-Jackson
-Jacob
-Jacoby
-Jacqueline
-Jacquetta
-Jacqui
-Jada
-Jade
-Jaden
-Jadon
-Jadyn
-Jaelyn
-Jaiden
-Jaime
-Jake
-Jakki
-Jakob
-Jalen
-Jamar
-Jamari
-Jamarion
-James
-Jameson
-Jamie
-Jamison
-Jane
-Janel
-Janelle
-Janette
-Janie
-Janina
-Janine
-Janiya
-Janiyah
-Jared
-Jaslene
-Jasmin
-Jasmine
-Jason
-Jasper
-Javier
-Javon
-Jaxon
-Jaxson
-Jay
-Jayce
-Jayda
-Jayden
-Jaydon
-Jaye
-Jayla
-Jaylee
-Jaylen
-Jayne
-Jaynie
-Jayson
-Jazlyn
-Jazmin
-Jazmine
-Jeanna
-Jeannie
-Jeannine
-Jeb
-Jed
-Jeffrey
-Jemmy
-Jenifer
-Jenna
-Jennie
-Jennifer
-Jera
-Jere
-Jeremiah
-Jeremy
-Jeri
-Jermaine
-Jerrie
-Jerry
-Jesse
-Jessica
-Jesus
-Jillian
-Jillie
-Jim
-Jimena
-Jimmy
-Joachim
-Joanna
-Joaquin
-Jocelyn
-Joe
-Joel
-Joetta
-Joey
-Johan
-Johanna
-John
-Johnathan
-Johnny
-Joi
-Jonah
-Jonas
-Jonathan
-Jonathon
-Joni
-Jordan
-Jordyn
-Jorge
-Jose
-Joselyn
-Joseph
-Josepha
-Josephine
-Josh
-Joshua
-Josiah
-Josie
-Josue
-Joye
-Juan
-Judah
-Jude
-Julia
-Julian
-Juliana
-Julianna
-Julie
-Juliet
-Julio
-Julissa
-Julius
-July
-Justice
-Justin
-Kade
-Kaden
-Kadence
-Kaelea
-Kaelyn
-Kai
-Kaiden
-Kailey
-Kailyn
-Kaitlin
-Kaitlyn
-Kale
-Kaleb
-Kaleigh
-Kameron
-Kamryn
-Kane
-Kara
-Karen
-Karenza
-Karina
-Karla
-Karly
-Karson
-Karyn
-Kassidy
-Kat
-Kate
-Katelyn
-Katelynn
-Katherine
-Kathleen
-Kathryn
-Kathy
-Katie
-Katlyn
-Kayden
-Kaydence
-Kayla
-Kaylee
-Kayleigh
-Kaylie
-Kaylin
-Keagan
-Keaton
-Keegan
-Keira
-Keith
-Kellen
-Kellie
-Kelly
-Kelsey
-Kelvin
-Kendall
-Kendra
-Kennard
-Kennedy
-Kenneth
-Kenzie
-Kerena
-Kerensa
-Keturah
-Kevin
-Keziah
-Khalil
-Khloe
-Kiana
-Kiara
-Kiera
-Kiley
-Kimberley
-Kimberly
-Kimora
-Kingston
-Kira
-Kobe
-Kolton
-Kristen
-Kristina
-Kristopher
-Kyla
-Kyle
-Kylee
-Kyleigh
-Kyler
-Kylie
-Kyra
-Lacey
-Lacy
-Laila
-Lakeisha
-Lalla
-Lana
-Lance
-Landen
-Landon
-Landyn
-Lane
-Lanny
-Larry
-Latanya
-Launce
-Laura
-Lauren
-Laurencia
-Laurissa
-Lauryn
-Lawrence
-Layla
-Leah
-Leeann
-Leia
-Leila
-Leilani
-Leland
-Lena
-Lennox
-Leo
-Leonardo
-Leonel
-Leroi
-Leslie
-Lesly
-Lessie
-Leta
-Levi
-Lexi
-Lexia
-Lexus
-Lia
-Liam
-Lila
-Lilah
-Lilian
-Liliana
-Lillian
-Lilliana
-Lillie
-Lilly
-Lily
-Lincoln
-Linden
-Lindsay
-Lindsey
-Lindsie
-Lindy
-Linton
-Lizbeth
-Lockie
-Logan
-Lola
-London
-Lorenzo
-Loreto
-Lori
-Lorin
-Lou
-Louis
-Luanne
-Luca
-Lucas
-Lucia
-Lucian
-Lucy
-Luis
-Lukas
-Luke
-Luna
-Luvenia
-Lydia
-Lyla
-Lyndsey
-Lynn
-Lynsey
-Lynwood
-Lyric
-Mabelle
-Macey
-Macie
-Mackenzie
-Macy
-Madalyn
-Maddison
-Maddox
-Madeleine
-Madeline
-Madelyn
-Madelynn
-Madilyn
-Madison
-Madisyn
-Madyson
-Maegan
-Maggie
-Makayla
-Makenna
-Makenzie
-Malachi
-Malcolm
-Malia
-Malik
-Mallory
-Manley
-Manuel
-Marc
-Marcia
-Marco
-Marcos
-Marcus
-Marely
-Margaret
-Maria
-Mariabella
-Mariah
-Mariana
-Marilene
-Mario
-Marion
-Marisol
-Marissa
-Marje
-Marjory
-Mark
-Marlee
-Marley
-Marlowe
-Marlyn
-Marshall
-Martin
-Marvin
-Mary
-Maryann
-Mason
-Mateo
-Mathew
-Matthew
-Maudie
-Maurene
-Maurice
-Mauricio
-Max
-Maximilian
-Maximus
-Maxwell
-May
-Maya
-Maynard
-Mckenna
-Mckenzie
-Megan
-Meghan
-Mekhi
-Melanie
-Melany
-Melissa
-Melody
-Melvin
-Melvyn
-Meredith
-Merideth
-Merrilyn
-Meryl
-Mia
-Micah
-Michael
-Michaela
-Micheal
-Michelle
-Miguel
-Mikayla
-Mike
-Miles
-Miley
-Milo
-Milton
-Minnie
-Miracle
-Miranda
-Miriam
-Mitchell
-Moises
-Molly
-Monica
-Monna
-Montague
-Monte
-Monty
-Morgan
-Moses
-Muriel
-Mya
-Mylee
-Myles
-Myriam
-Myrtie
-Nadia
-Nan
-Nancy
-Naomi
-Nasir
-Natalia
-Natalie
-Nataly
-Natasha
-Nathan
-Nathaniel
-Nayeli
-Nehemiah
-Nelle
-Nelson
-Nena
-Nerissa
-Netta
-Nettie
-Nevaeh
-Nia
-Nicholas
-Nickolas
-Nicolas
-Nicole
-Nikolas
-Nina
-Noah
-Noel
-Noelle
-Nolan
-Nonie
-Nora
-Norah
-Nova
-Nowell
-Nydia
-Nyla
-Olive
-Oliver
-Olivia
-Omar
-Oralie
-Orlando
-Osbert
-Osborn
-Osborne
-Oscar
-Osmund
-Owen
-Pablo
-Paget
-Paige
-Paisley
-Paola
-Paris
-Parker
-Patience
-Patricia
-Patrick
-Patton
-Paul
-Pauleen
-Paxton
-Payton
-Pedro
-Pene
-Penelope
-Percival
-Peregrine
-Perla
-Peter
-Peyton
-Pheobe
-Philip
-Phillip
-Phoebe
-Phoenix
-Phyliss
-Phyllida
-Phyllis
-Piper
-Porsche
-Porter
-Presley
-Preston
-Priscilla
-Prosper
-Prue
-Quanah
-Quentin
-Quiana
-Quinn
-Quinton
-Rachael
-Rachel
-Raegan
-Raelene
-Rafael
-Rain
-Ramon
-Randa
-Randal
-Randy
-Rastus
-Raul
-Raymond
-Rayner
-Reagan
-Rebecca
-Rebeckah
-Rebekah
-Reece
-Reed
-Reene
-Reese
-Reid
-Renie
-Reuben
-Rexana
-Reynard
-Rhetta
-Ricardo
-Rich
-Richard
-Richie
-Rick
-Rickena
-Rickey
-Rickie
-Ricky
-Rihanna
-Riley
-River
-Robert
-Roberto
-Rocco
-Rodger
-Rodrigo
-Roger
-Roman
-Romayne
-Romeo
-Ronald
-Ronnette
-Rosa
-Roscoe
-Rose
-Rosemary
-Roswell
-Rowan
-Roy
-Royce
-Ruben
-Ruby
-Rubye
-Russell
-Rusty
-Ruth
-Ryan
-Ryder
-Ryker
-Rylan
-Rylee
-Ryleigh
-Rylie
-Sabella
-Sabrina
-Sachie
-Sadie
-Sage
-Sal
-Sally
-Salvador
-Sam
-Samantha
-Samara
-Samuel
-Sandra
-Santiago
-Sara
-Sarah
-Sarai
-Saranna
-Sasha
-Saul
-Savanna
-Savannah
-Sawyer
-Scarlett
-Scott
-Scotty
-Sean
-Sebastian
-Selena
-Seneca
-Serena
-Serenity
-Sergio
-Seth
-Seymour
-Shan
-Shana
-Shane
-Shanika
-Shannah
-Shannon
-Shantae
-Sharalyn
-Sharla
-Shaun
-Shawn
-Shayla
-Shelby
-Sheri
-Sherie
-Sherill
-Sherri
-Shiloh
-Sienna
-Sierra
-Silas
-Simon
-Sissy
-Skylar
-Skyler
-Sloan
-Sofia
-Solomon
-Sophia
-Sophie
-Sorrel
-Spencer
-Spike
-Star
-Stella
-Steph
-Stephanie
-Stephany
-Stephen
-Steven
-Sue
-Sukie
-Summer
-Sunshine
-Susanna
-Susannah
-Suzan
-Suzy
-Sybil
-Syd
-Sydney
-Talia
-Talon
-Tamika
-Tamsin
-Tania
-Tanner
-Tansy
-Taryn
-Tate
-Tatiana
-Tatum
-Tatyanna
-Taylor
-Teagan
-Tel
-Terrell
-Terry
-Tessa
-Theodore
-Thomas
-Tiffany
-Timothy
-Titus
-Tod
-Tolly
-Tony
-Topaz
-Tori
-Tracee
-Tracey
-Travis
-Trent
-Trenton
-Trevor
-Trey
-Trinity
-Tristan
-Tristen
-Triston
-Troy
-Tucker
-Ty
-Tye
-Tyler
-Tyson
-Uland
-Ulric
-Ulyssa
-Uriel
-Valary
-Valentina
-Valeria
-Valerie
-Vanessa
-Vaughn
-Verna
-Veronica
-Victor
-Victoria
-Vince
-Vincent
-Vinnie
-Violet
-Vivian
-Viviana
-Vivyan
-Walker
-Walter
-Ward
-Warner
-Wayne
-Wendi
-Wendy
-Wesley
-Weston
-Whitaker
-William
-Willow
-Willy
-Winifred
-Wisdom
-Woodrow
-Woody
-Wyatt
-Wynonna
-Wynter
-Xander
-Xavier
-Ximena
-Yahir
-Yasmin
-Yolanda
-Ysabel
-Zachariah
-Zachary
-Zack
-Zackary
-Zander
-Zane
-Zayden
-Zeke
-Zelda
-Zion
-Zoe
-Zoey
+Aaden
+Aaliyah
+Aaron
+Abby
+Abel
+Abigail
+Abraham
+Adam
+Adan
+Addison
+Addyson
+Adeline
+Aden
+Adolph
+Adrian
+Adriana
+Adrianna
+Aida
+Aidan
+Aiden
+Aileen
+Ainsley
+Alaina
+Alan
+Alana
+Alanna
+Alayna
+Albert
+Alberto
+Alden
+Alec
+Alejandra
+Alejandro
+Alessandra
+Alex
+Alexa
+Alexander
+Alexandra
+Alexandria
+Alexia
+Alexis
+Alexus
+Alfred
+Alfreda
+Alfredo
+Alger
+Ali
+Alice
+Alicia
+Alijah
+Alina
+Alisa
+Alison
+Alissa
+Alisya
+Alivia
+Aliyah
+Allegra
+Allegria
+Allen
+Allie
+Allison
+Allisson
+Allyson
+Alma
+Alondra
+Alvin
+Alysha
+Alyson
+Alyssa
+Alyssia
+Amanda
+Amari
+Amaryllis
+Amaya
+Amber
+Ambrosine
+Amelia
+Amir
+Amira
+Amiyah
+Amos
+Amy
+Amya
+Ana
+Anahi
+Anastasia
+Anaya
+Anderson
+Andre
+Andrea
+Andres
+Andrew
+Andy
+Angel
+Angela
+Angelica
+Angelina
+Angelo
+Angie
+Aniya
+Aniyah
+Anjelica
+Anna
+Annabelle
+Anne
+Annie
+Annika
+Anthony
+Antonio
+Anya
+April
+Arabella
+Archie
+Ariana
+Arianna
+Ariel
+Arielle
+Arleen
+Armando
+Arn
+Art
+Arthur
+Arturo
+Asher
+Ashley
+Ashlie
+Ashlyn
+Ashlynn
+Ashton
+Asia
+Astor
+Athena
+Aubree
+Aubrey
+Aubrie
+Audrey
+Audrina
+August
+Aurora
+Austin
+Autumn
+Ava
+Avalon
+Averill
+Avery
+Axel
+Ayden
+Ayla
+Bailey
+Baldric
+Barbra
+Bartholomew
+Baylee
+Beau
+Beckah
+Beckett
+Becky
+Bella
+Benjamin
+Bennett
+Bernice
+Bertrand
+Bethany
+Bethney
+Betsy
+Bianca
+Bidelia
+Bill
+Blake
+Braden
+Bradley
+Brady
+Braeden
+Braiden
+Brandon
+Braxton
+Brayan
+Brayden
+Braydon
+Braylon
+Breanna
+Breanne
+Brenda
+Brendan
+Brenden
+Brenna
+Brennan
+Brett
+Brian
+Briana
+Brianna
+Bridget
+Brielle
+Brittani
+Brittany
+Brock
+Brodie
+Brody
+Bronte
+Brooke
+Brooklyn
+Brooklynn
+Bruce
+Bryan
+Bryant
+Bryce
+Brycen
+Brynn
+Bryson
+Burt
+Byrne
+Byron
+Bysshe
+Cade
+Caden
+Cadence
+Caiden
+Caitlin
+Caitlyn
+Calanthia
+Caleb
+Caleigh
+Cali
+Callie
+Calvin
+Camden
+Cameron
+Camila
+Camille
+Camron
+Camryn
+Candace
+Candice
+Candis
+Canute
+Cara
+Carl
+Carlos
+Carly
+Carlyle
+Carmen
+Carolina
+Caroline
+Carolyn
+Carry
+Carson
+Carter
+Caryl
+Casey
+Cash
+Casimir
+Cassandra
+Cassian
+Cassidy
+Catherine
+Cayden
+Cecilia
+Cecily
+Celeste
+Cesar
+Chad
+Chance
+Chandler
+Charles
+Charlie
+Charlotte
+Charlton
+Chase
+Chelsea
+Cherette
+Cheri
+Cherry
+Cheyanne
+Cheyenne
+Chip
+Chloe
+Chris
+Christa
+Christian
+Christiana
+Christina
+Christobel
+Christopher
+Ciara
+Cindy
+Claire
+Clara
+Claribel
+Clark
+Claudia
+Claudius
+Clayton
+Clement
+Cleveland
+Cliff
+Clinton
+Clitus
+Clover
+Cody
+Cohen
+Colby
+Cole
+Colin
+Collin
+Colten
+Colton
+Conner
+Connor
+Cooper
+Cora
+Corbin
+Coreen
+Corey
+Corrine
+Cory
+Courtney
+Cristian
+Cristopher
+Cruz
+Crystal
+Curtis
+Cy
+Cynthia
+Daisy
+Dakota
+Dallas
+Dalton
+Dalya
+Damian
+Damien
+Damon
+Dana
+Dane
+Danica
+Daniel
+Daniela
+Daniella
+Danielle
+Danika
+Danna
+Danny
+Dante
+Darcey
+Darell
+Daria
+Darin
+Darius
+Darren
+David
+Davion
+Davis
+Dawson
+Dayana
+Dayna
+Dayton
+Dean
+Deandre
+Deangelo
+Debbi
+Declan
+Dee
+Deena
+Delaney
+Delilah
+Della
+Delma
+Denholm
+Denise
+Dennis
+Denys
+Derek
+Derrick
+Desiree
+Desmond
+Destiny
+Devin
+Devon
+Diamond
+Diana
+Diego
+Dillon
+Dina
+Dolores
+Dominic
+Dominick
+Donald
+Donella
+Donna
+Donny
+Donovan
+Dorian
+Dorothy
+Dortha
+Douglas
+Drake
+Drew
+Driscoll
+Dulce
+Duncan
+Dustin
+Dylan
+Easter
+Easton
+Ebba
+Eddie
+Eden
+Edgar
+Eduardo
+Edward
+Edwin
+Effie
+Elaina
+Eleanor
+Elena
+Eli
+Eliana
+Elias
+Elijah
+Eliot
+Eliott
+Elise
+Eliza
+Elizabeth
+Ella
+Elle
+Ellie
+Elliot
+Elliott
+Elric
+Elspet
+Elwood
+Emanuel
+Emely
+Emerson
+Emery
+Emilee
+Emilia
+Emiliano
+Emilio
+Emily
+Emma
+Emmanuel
+Enrique
+Eric
+Erica
+Erick
+Erik
+Erika
+Erin
+Ermintrude
+Ernesto
+Esmeralda
+Esteban
+Esther
+Estrella
+Ethan
+Eugenia
+Euphemia
+Eustace
+Eva
+Evan
+Evangeline
+Eveleen
+Evelina
+Evelyn
+Everett
+Ezekiel
+Ezra
+Fabian
+Faith
+Fatima
+Fay
+Felix
+Fernanda
+Fernando
+Finn
+Fiona
+Fitz
+Flick
+Floella
+Flora
+Flossie
+Fortune
+Francesca
+Francis
+Francisco
+Frank
+Frankie
+Franklin
+Fulton
+Gabriel
+Gabriela
+Gabriella
+Gabrielle
+Gael
+Gage
+Garret
+Garrett
+Gary
+Gavin
+Gaye
+Gaylord
+Genesis
+Genette
+Genevieve
+George
+Georgene
+Georgia
+Geraldine
+Gerardo
+Gervase
+Gianna
+Gina
+Ginger
+Giovanni
+Giselle
+Gladwyn
+Glenna
+Gloria
+Goddard
+Godwin
+Goodwin
+Gordon
+Grace
+Gracie
+Grady
+Graeme
+Graham
+Grant
+Gratian
+Grayson
+Gregory
+Greta
+Greyson
+Griffin
+Griselda
+Guadalupe
+Guillermo
+Gunner
+Gustavo
+Gwenda
+Gwenevere
+Hadley
+Haidee
+Hailee
+Hailey
+Hal
+Haleigh
+Haley
+Hanna
+Hannah
+Happy
+Harley
+Harmony
+Harper
+Harrison
+Hartley
+Hayden
+Haylee
+Hayley
+Haylie
+Hazel
+Heather
+Heaven
+Hector
+Hedley
+Heidi
+Helen
+Henderson
+Henry
+Hepsie
+Hervey
+Holden
+Holly
+Homer
+Hope
+Horatio
+Hortensia
+Hudson
+Huffie
+Hugo
+Hunter
+Ian
+Iantha
+Ileen
+Imani
+Innocent
+Irene
+Iris
+Irvine
+Isaac
+Isabel
+Isabella
+Isabelle
+Isaiah
+Isaias
+Isiah
+Ismael
+Israel
+Issac
+Itzel
+Ivan
+Ivy
+Izabella
+Izaiah
+Jacaline
+Jace
+Jack
+Jackson
+Jacob
+Jacoby
+Jacqueline
+Jacquetta
+Jacqui
+Jada
+Jade
+Jaden
+Jadon
+Jadyn
+Jaelyn
+Jaiden
+Jaime
+Jake
+Jakki
+Jakob
+Jalen
+Jamar
+Jamari
+Jamarion
+James
+Jameson
+Jamie
+Jamison
+Jane
+Janel
+Janelle
+Janette
+Janie
+Janina
+Janine
+Janiya
+Janiyah
+Jared
+Jaslene
+Jasmin
+Jasmine
+Jason
+Jasper
+Javier
+Javon
+Jaxon
+Jaxson
+Jay
+Jayce
+Jayda
+Jayden
+Jaydon
+Jaye
+Jayla
+Jaylee
+Jaylen
+Jayne
+Jaynie
+Jayson
+Jazlyn
+Jazmin
+Jazmine
+Jeanna
+Jeannie
+Jeannine
+Jeb
+Jed
+Jeffrey
+Jemmy
+Jenifer
+Jenna
+Jennie
+Jennifer
+Jera
+Jere
+Jeremiah
+Jeremy
+Jeri
+Jermaine
+Jerrie
+Jerry
+Jesse
+Jessica
+Jesus
+Jillian
+Jillie
+Jim
+Jimena
+Jimmy
+Joachim
+Joanna
+Joaquin
+Jocelyn
+Joe
+Joel
+Joetta
+Joey
+Johan
+Johanna
+John
+Johnathan
+Johnny
+Joi
+Jonah
+Jonas
+Jonathan
+Jonathon
+Joni
+Jordan
+Jordyn
+Jorge
+Jose
+Joselyn
+Joseph
+Josepha
+Josephine
+Josh
+Joshua
+Josiah
+Josie
+Josue
+Joye
+Juan
+Judah
+Jude
+Julia
+Julian
+Juliana
+Julianna
+Julie
+Juliet
+Julio
+Julissa
+Julius
+July
+Justice
+Justin
+Kade
+Kaden
+Kadence
+Kaelea
+Kaelyn
+Kai
+Kaiden
+Kailey
+Kailyn
+Kaitlin
+Kaitlyn
+Kale
+Kaleb
+Kaleigh
+Kameron
+Kamryn
+Kane
+Kara
+Karen
+Karenza
+Karina
+Karla
+Karly
+Karson
+Karyn
+Kassidy
+Kat
+Kate
+Katelyn
+Katelynn
+Katherine
+Kathleen
+Kathryn
+Kathy
+Katie
+Katlyn
+Kayden
+Kaydence
+Kayla
+Kaylee
+Kayleigh
+Kaylie
+Kaylin
+Keagan
+Keaton
+Keegan
+Keira
+Keith
+Kellen
+Kellie
+Kelly
+Kelsey
+Kelvin
+Kendall
+Kendra
+Kennard
+Kennedy
+Kenneth
+Kenzie
+Kerena
+Kerensa
+Keturah
+Kevin
+Keziah
+Khalil
+Khloe
+Kiana
+Kiara
+Kiera
+Kiley
+Kimberley
+Kimberly
+Kimora
+Kingston
+Kira
+Kobe
+Kolton
+Kristen
+Kristina
+Kristopher
+Kyla
+Kyle
+Kylee
+Kyleigh
+Kyler
+Kylie
+Kyra
+Lacey
+Lacy
+Laila
+Lakeisha
+Lalla
+Lana
+Lance
+Landen
+Landon
+Landyn
+Lane
+Lanny
+Larry
+Latanya
+Launce
+Laura
+Lauren
+Laurencia
+Laurissa
+Lauryn
+Lawrence
+Layla
+Leah
+Leeann
+Leia
+Leila
+Leilani
+Leland
+Lena
+Lennox
+Leo
+Leonardo
+Leonel
+Leroi
+Leslie
+Lesly
+Lessie
+Leta
+Levi
+Lexi
+Lexia
+Lexus
+Lia
+Liam
+Lila
+Lilah
+Lilian
+Liliana
+Lillian
+Lilliana
+Lillie
+Lilly
+Lily
+Lincoln
+Linden
+Lindsay
+Lindsey
+Lindsie
+Lindy
+Linton
+Lizbeth
+Lockie
+Logan
+Lola
+London
+Lorenzo
+Loreto
+Lori
+Lorin
+Lou
+Louis
+Luanne
+Luca
+Lucas
+Lucia
+Lucian
+Lucy
+Luis
+Lukas
+Luke
+Luna
+Luvenia
+Lydia
+Lyla
+Lyndsey
+Lynn
+Lynsey
+Lynwood
+Lyric
+Mabelle
+Macey
+Macie
+Mackenzie
+Macy
+Madalyn
+Maddison
+Maddox
+Madeleine
+Madeline
+Madelyn
+Madelynn
+Madilyn
+Madison
+Madisyn
+Madyson
+Maegan
+Maggie
+Makayla
+Makenna
+Makenzie
+Malachi
+Malcolm
+Malia
+Malik
+Mallory
+Manley
+Manuel
+Marc
+Marcia
+Marco
+Marcos
+Marcus
+Marely
+Margaret
+Maria
+Mariabella
+Mariah
+Mariana
+Marilene
+Mario
+Marion
+Marisol
+Marissa
+Marje
+Marjory
+Mark
+Marlee
+Marley
+Marlowe
+Marlyn
+Marshall
+Martin
+Marvin
+Mary
+Maryann
+Mason
+Mateo
+Mathew
+Matthew
+Maudie
+Maurene
+Maurice
+Mauricio
+Max
+Maximilian
+Maximus
+Maxwell
+May
+Maya
+Maynard
+Mckenna
+Mckenzie
+Megan
+Meghan
+Mekhi
+Melanie
+Melany
+Melissa
+Melody
+Melvin
+Melvyn
+Meredith
+Merideth
+Merrilyn
+Meryl
+Mia
+Micah
+Michael
+Michaela
+Micheal
+Michelle
+Miguel
+Mikayla
+Mike
+Miles
+Miley
+Milo
+Milton
+Minnie
+Miracle
+Miranda
+Miriam
+Mitchell
+Moises
+Molly
+Monica
+Monna
+Montague
+Monte
+Monty
+Morgan
+Moses
+Muriel
+Mya
+Mylee
+Myles
+Myriam
+Myrtie
+Nadia
+Nan
+Nancy
+Naomi
+Nasir
+Natalia
+Natalie
+Nataly
+Natasha
+Nathan
+Nathaniel
+Nayeli
+Nehemiah
+Nelle
+Nelson
+Nena
+Nerissa
+Netta
+Nettie
+Nevaeh
+Nia
+Nicholas
+Nickolas
+Nicolas
+Nicole
+Nikolas
+Nina
+Noah
+Noel
+Noelle
+Nolan
+Nonie
+Nora
+Norah
+Nova
+Nowell
+Nydia
+Nyla
+Olive
+Oliver
+Olivia
+Omar
+Oralie
+Orlando
+Osbert
+Osborn
+Osborne
+Oscar
+Osmund
+Owen
+Pablo
+Paget
+Paige
+Paisley
+Paola
+Paris
+Parker
+Patience
+Patricia
+Patrick
+Patton
+Paul
+Pauleen
+Paxton
+Payton
+Pedro
+Pene
+Penelope
+Percival
+Peregrine
+Perla
+Peter
+Peyton
+Pheobe
+Philip
+Phillip
+Phoebe
+Phoenix
+Phyliss
+Phyllida
+Phyllis
+Piper
+Porsche
+Porter
+Presley
+Preston
+Priscilla
+Prosper
+Prue
+Quanah
+Quentin
+Quiana
+Quinn
+Quinton
+Rachael
+Rachel
+Raegan
+Raelene
+Rafael
+Rain
+Ramon
+Randa
+Randal
+Randy
+Rastus
+Raul
+Raymond
+Rayner
+Reagan
+Rebecca
+Rebeckah
+Rebekah
+Reece
+Reed
+Reene
+Reese
+Reid
+Renie
+Reuben
+Rexana
+Reynard
+Rhetta
+Ricardo
+Rich
+Richard
+Richie
+Rick
+Rickena
+Rickey
+Rickie
+Ricky
+Rihanna
+Riley
+River
+Robert
+Roberto
+Rocco
+Rodger
+Rodrigo
+Roger
+Roman
+Romayne
+Romeo
+Ronald
+Ronnette
+Rosa
+Roscoe
+Rose
+Rosemary
+Roswell
+Rowan
+Roy
+Royce
+Ruben
+Ruby
+Rubye
+Russell
+Rusty
+Ruth
+Ryan
+Ryder
+Ryker
+Rylan
+Rylee
+Ryleigh
+Rylie
+Sabella
+Sabrina
+Sachie
+Sadie
+Sage
+Sal
+Sally
+Salvador
+Sam
+Samantha
+Samara
+Samuel
+Sandra
+Santiago
+Sara
+Sarah
+Sarai
+Saranna
+Sasha
+Saul
+Savanna
+Savannah
+Sawyer
+Scarlett
+Scott
+Scotty
+Sean
+Sebastian
+Selena
+Seneca
+Serena
+Serenity
+Sergio
+Seth
+Seymour
+Shan
+Shana
+Shane
+Shanika
+Shannah
+Shannon
+Shantae
+Sharalyn
+Sharla
+Shaun
+Shawn
+Shayla
+Shelby
+Sheri
+Sherie
+Sherill
+Sherri
+Shiloh
+Sienna
+Sierra
+Silas
+Simon
+Sissy
+Skylar
+Skyler
+Sloan
+Sofia
+Solomon
+Sophia
+Sophie
+Sorrel
+Spencer
+Spike
+Star
+Stella
+Steph
+Stephanie
+Stephany
+Stephen
+Steven
+Sue
+Sukie
+Summer
+Sunshine
+Susanna
+Susannah
+Suzan
+Suzy
+Sybil
+Syd
+Sydney
+Talia
+Talon
+Tamika
+Tamsin
+Tania
+Tanner
+Tansy
+Taryn
+Tate
+Tatiana
+Tatum
+Tatyanna
+Taylor
+Teagan
+Tel
+Terrell
+Terry
+Tessa
+Theodore
+Thomas
+Tiffany
+Timothy
+Titus
+Tod
+Tolly
+Tony
+Topaz
+Tori
+Tracee
+Tracey
+Travis
+Trent
+Trenton
+Trevor
+Trey
+Trinity
+Tristan
+Tristen
+Triston
+Troy
+Tucker
+Ty
+Tye
+Tyler
+Tyson
+Uland
+Ulric
+Ulyssa
+Uriel
+Valary
+Valentina
+Valeria
+Valerie
+Vanessa
+Vaughn
+Verna
+Veronica
+Victor
+Victoria
+Vince
+Vincent
+Vinnie
+Violet
+Vivian
+Viviana
+Vivyan
+Walker
+Walter
+Ward
+Warner
+Wayne
+Wendi
+Wendy
+Wesley
+Weston
+Whitaker
+William
+Willow
+Willy
+Winifred
+Wisdom
+Woodrow
+Woody
+Wyatt
+Wynonna
+Wynter
+Xander
+Xavier
+Ximena
+Yahir
+Yasmin
+Yolanda
+Ysabel
+Zachariah
+Zachary
+Zack
+Zackary
+Zander
+Zane
+Zayden
+Zeke
+Zelda
+Zion
+Zoe
+Zoey
Zune
\ No newline at end of file
diff --git a/strings/names/first_female.txt b/strings/names/first_female.txt
index 6710c1bfc3..038e936879 100644
--- a/strings/names/first_female.txt
+++ b/strings/names/first_female.txt
@@ -1,771 +1,771 @@
-Aaliyah
-Abby
-Abigail
-Addison
-Addyson
-Adeline
-Adriana
-Adrianna
-Aida
-Aileen
-Ainsley
-Alaina
-Alana
-Alanna
-Alayna
-Alejandra
-Alessandra
-Alexa
-Alexandra
-Alexandria
-Alexia
-Alexis
-Alexus
-Alfreda
-Alice
-Alicia
-Alina
-Alisa
-Alison
-Alissa
-Alisya
-Alivia
-Aliyah
-Allegra
-Allegria
-Allie
-Allison
-Allisson
-Allyson
-Alma
-Alondra
-Alysha
-Alyson
-Alyssa
-Alyssia
-Amanda
-Amari
-Amaryllis
-Amaya
-Amber
-Ambrosine
-Amelia
-Amira
-Amiyah
-Amy
-Amya
-Ana
-Anahi
-Anastasia
-Anaya
-Andrea
-Angel
-Angela
-Angelica
-Angelina
-Angie
-Aniya
-Aniyah
-Anjelica
-Anna
-Annabelle
-Anne
-Annie
-Annika
-Anya
-April
-Arabella
-Ariana
-Arianna
-Ariel
-Arielle
-Arleen
-Ashley
-Ashlie
-Ashlyn
-Ashlynn
-Asia
-Astor
-Athena
-Aubree
-Aubrey
-Aubrie
-Audrey
-Audrina
-Aurora
-Autumn
-Ava
-Avalona
-Averill
-Avery
-Ayla
-Bailey
-Barbara
-Baylee
-Beckah
-Becky
-Bella
-Bernice
-Bethany
-Bethney
-Betsy
-Bianca
-Bidelia
-Breanna
-Breanne
-Brenda
-Brenna
-Briana
-Brianna
-Bridget
-Brielle
-Brittani
-Brittany
-Brooke
-Brooklyn
-Brooklynn
-Brynn
-Cadence
-Caitlin
-Caitlyn
-Calanthia
-Caleigh
-Cali
-Callie
-Cameron
-Camila
-Camille
-Camryn
-Candace
-Candice
-Cara
-Carly
-Carlyle
-Carmen
-Carolina
-Caroline
-Carolyn
-Carry
-Caryl
-Casey
-Cassandra
-Cassidy
-Catherine
-Cecilia
-Cecily
-Celeste
-Charlotte
-Chelsea
-Cherette
-Cheri
-Cherry
-Cheyanne
-Cheyenne
-Chloe
-Christa
-Christiana
-Christina
-Christobelle
-Ciara
-Cindy
-Claire
-Clara
-Claribel
-Claudia
-Clover
-Cora
-Coreen
-Corrine
-Courtney
-Crystal
-Cynthia
-Daisy
-Dakota
-Dalya
-Dana
-Danica
-Daniela
-Daniella
-Danielle
-Danika
-Danna
-Daria
-Dayana
-Dayna
-Debbi
-Dee
-Deena
-Delaney
-Delilah
-Della
-Delma
-Denise
-Denys
-Desiree
-Destiny
-Diamond
-Diana
-Dina
-Dolores
-Donella
-Donna
-Dorothy
-Dortha
-Dulce
-Easter
-Ebba
-Eden
-Effie
-Elaina
-Eleanor
-Elena
-Eliana
-Elise
-Eliza
-Elizabeth
-Ella
-Elle
-Ellie
-Emely
-Emerson
-Emery
-Emilee
-Emilia
-Emily
-Emma
-Erica
-Erika
-Erin
-Ermintrude
-Esmeralda
-Esther
-Estrella
-Eugenia
-Euphemia
-Eustace
-Eva
-Evangeline
-Eveleen
-Evelina
-Evelyn
-Faith
-Fatima
-Fay
-Fernanda
-Fiona
-Floella
-Flora
-Flossie
-Fortune
-Francesca
-Gabriela
-Gabriella
-Gabrielle
-Genette
-Genevieve
-Georgene
-Georgia
-Geraldine
-Gervase
-Gianna
-Gina
-Ginger
-Giselle
-Gladwyn
-Glenna
-Gloria
-Grace
-Gracie
-Greta
-Griselda
-Guadalupe
-Gwenda
-Gwenevere
-Hadley
-Haidee
-Hailee
-Hailey
-Hal
-Haleigh
-Haley
-Hanna
-Hannah
-Harley
-Harmony
-Harper
-Hayden
-Haylee
-Hayley
-Haylie
-Hazel
-Heather
-Heaven
-Hedley
-Heidi
-Helen
-Hepsie
-Holly
-Hope
-Hortensia
-Iantha
-Ileen
-Imani
-Innocent
-Irene
-Iris
-Isabel
-Isabella
-Isabelle
-Itzel
-Ivy
-Izabella
-Jacaline
-Jacqueline
-Jacquetta
-Jacqui
-Jada
-Jade
-Jaden
-Jadyn
-Jaelyn
-Jakki
-Jalen
-Jamie
-Jane
-Janelle
-Janette
-Janie
-Janina
-Janine
-Janiya
-Janiyah
-Jaslene
-Jasmin
-Jasmine
-Jayda
-Jayden
-Jayla
-Jaylee
-Jaynie
-Jazlyn
-Jazmin
-Jazmine
-Jeanna
-Jeannie
-Jeannine
-Jenifer
-Jenna
-Jennie
-Jennifer
-Jera
-Jere
-Jeri
-Jessica
-Jillian
-Jillie
-Jimena
-Joanna
-Jocelyn
-Joetta
-Johanna
-Joi
-Joni
-Jordan
-Jordyn
-Joselyn
-Josepha
-Josephine
-Josie
-Joye
-Julia
-Juliana
-Julianna
-Julie
-Juliet
-Julissa
-July
-Kadence
-Kaelea
-Kaelyn
-Kailey
-Kailyn
-Kaitlin
-Kaitlyn
-Kaleigh
-Kamryn
-Kara
-Karen
-Karenza
-Karina
-Karla
-Karly
-Karyn
-Kassidy
-Kat
-Kate
-Katelyn
-Katelynn
-Katherine
-Kathleen
-Kathryn
-Kathy
-Katie
-Katlyn
-Kayden
-Kaydence
-Kayla
-Kaylee
-Kayleigh
-Kaylie
-Kaylin
-Keegan
-Keira
-Keith
-Kellie
-Kelly
-Kelsey
-Kendall
-Kendra
-Kennedy
-Kenzie
-Kerena
-Kerensa
-Keturah
-Khloe
-Kiana
-Kiara
-Kiera
-Kiley
-Kimberley
-Kimberly
-Kimora
-Kira
-Kristen
-Kristina
-Kyla
-Kylee
-Kyleigh
-Kylie
-Kyra
-Lacey
-Lacy
-Laila
-Lakeisha
-Lalla
-Lana
-Latanya
-Laura
-Lauren
-Laurencia
-Laurissa
-Lauryn
-Layla
-Leah
-Leeann
-Leia
-Leila
-Leilani
-Lena
-Leslie
-Lesly
-Lessie
-Leta
-Lexi
-Lexia
-Lexus
-Lia
-Lila
-Lilah
-Lilian
-Liliana
-Lillian
-Lilliana
-Lillie
-Lilly
-Lily
-Lindsay
-Lindsey
-Lindsie
-Lindy
-Lizbeth
-Lockie
-Logan
-Lola
-London
-Lori
-Lorin
-Luanne
-Lucia
-Lucian
-Lucy
-Luna
-Luvenia
-Lydia
-Lyla
-Lyndsey
-Lynn
-Lynsey
-Lynwood
-Lyric
-Mabelle
-Macey
-Macie
-Mackenzie
-Macy
-Madalyn
-Maddison
-Madeleine
-Madeline
-Madelyn
-Madelynn
-Madilyn
-Madison
-Madisyn
-Madyson
-Maegan
-Maggie
-Makayla
-Makenna
-Makenzie
-Malia
-Mallory
-Marcia
-Marely
-Margaret
-Maria
-Mariabella
-Mariah
-Mariana
-Marilene
-Marion
-Marisol
-Marissa
-Marje
-Marjory
-Marlee
-Marley
-Marlowe
-Marlyn
-Marshall
-Mary
-Maryann
-Maudie
-Maurene
-May
-Maya
-Mckenna
-Mckenzie
-Megan
-Meghan
-Melanie
-Melany
-Melissa
-Melody
-Meredith
-Merideth
-Merrilyn
-Meryl
-Mia
-Michaela
-Michelle
-Mikayla
-Miley
-Minnie
-Miracle
-Miranda
-Miriam
-Molly
-Monica
-Monna
-Morgan
-Muriel
-Mya
-Mylee
-Myriam
-Myrtie
-Nadia
-Nan
-Nancy
-Naomi
-Natalia
-Natalie
-Nataly
-Natasha
-Nayeli
-Nelle
-Nena
-Nerissa
-Netta
-Nettie
-Nevaeh
-Nia
-Nicole
-Nina
-Noelle
-Nonie
-Nora
-Norah
-Nova
-Nowell
-Nydia
-Nyla
-Olive
-Olivia
-Oralie
-Paige
-Paisley
-Paola
-Paris
-Patience
-Patricia
-Pauleen
-Payton
-Pene
-Penelope
-Peregrine
-Perla
-Peyton
-Pheobe
-Phoebe
-Phyliss
-Phyllida
-Phyllis
-Piper
-Porsche
-Presley
-Priscilla
-Prosper
-Prue
-Quanah
-Quiana
-Rachael
-Rachel
-Raegan
-Raelene
-Rain
-Randa
-Randal
-Reagan
-Rebecca
-Rebeckah
-Rebekah
-Reene
-Reese
-Renie
-Rexana
-Rhetta
-Rihanna
-Riley
-Ronnette
-Rosa
-Rose
-Rosemary
-Rowan
-Ruby
-Rubye
-Ruth
-Rylee
-Ryleigh
-Rylie
-Sabella
-Sabrina
-Sachie
-Sadie
-Sage
-Sally
-Samantha
-Samara
-Sandra
-Sara
-Sarah
-Sarai
-Saranna
-Sasha
-Savanna
-Savannah
-Scarlett
-Selena
-Seneca
-Serena
-Serenity
-Shana
-Shanika
-Shannah
-Shannon
-Shantae
-Sharalyn
-Sharla
-Shayla
-Shelby
-Sheri
-Sherie
-Sherill
-Sherri
-Sienna
-Sierra
-Sissy
-Skylar
-Skyler
-Sofia
-Sophia
-Sophie
-Star
-Stella
-Steph
-Stephanie
-Stephany
-Sue
-Sukie
-Summer
-Sunshine
-Susanna
-Susannah
-Suzan
-Suzy
-Sydney
-Talia
-Tamika
-Tania
-Tansy
-Taryn
-Tatiana
-Tatum
-Tatyanna
-Taylor
-Teagan
-Tessa
-Tiffany
-Tolly
-Topaz
-Tori
-Tracee
-Tracey
-Trinity
-Ulyssa
-Valary
-Valentina
-Valeria
-Valerie
-Vanessa
-Verna
-Veronica
-Victoria
-Vinnie
-Violet
-Vivian
-Viviana
-Vivyan
-Wendi
-Wendy
-Willow
-Wisdom
-Wynonna
-Wynter
-Ximena
-Yasmin
-Yolanda
-Ysabel
-Zelda
-Zoe
-Zoey
+Aaliyah
+Abby
+Abigail
+Addison
+Addyson
+Adeline
+Adriana
+Adrianna
+Aida
+Aileen
+Ainsley
+Alaina
+Alana
+Alanna
+Alayna
+Alejandra
+Alessandra
+Alexa
+Alexandra
+Alexandria
+Alexia
+Alexis
+Alexus
+Alfreda
+Alice
+Alicia
+Alina
+Alisa
+Alison
+Alissa
+Alisya
+Alivia
+Aliyah
+Allegra
+Allegria
+Allie
+Allison
+Allisson
+Allyson
+Alma
+Alondra
+Alysha
+Alyson
+Alyssa
+Alyssia
+Amanda
+Amari
+Amaryllis
+Amaya
+Amber
+Ambrosine
+Amelia
+Amira
+Amiyah
+Amy
+Amya
+Ana
+Anahi
+Anastasia
+Anaya
+Andrea
+Angel
+Angela
+Angelica
+Angelina
+Angie
+Aniya
+Aniyah
+Anjelica
+Anna
+Annabelle
+Anne
+Annie
+Annika
+Anya
+April
+Arabella
+Ariana
+Arianna
+Ariel
+Arielle
+Arleen
+Ashley
+Ashlie
+Ashlyn
+Ashlynn
+Asia
+Astor
+Athena
+Aubree
+Aubrey
+Aubrie
+Audrey
+Audrina
+Aurora
+Autumn
+Ava
+Avalona
+Averill
+Avery
+Ayla
+Bailey
+Barbara
+Baylee
+Beckah
+Becky
+Bella
+Bernice
+Bethany
+Bethney
+Betsy
+Bianca
+Bidelia
+Breanna
+Breanne
+Brenda
+Brenna
+Briana
+Brianna
+Bridget
+Brielle
+Brittani
+Brittany
+Brooke
+Brooklyn
+Brooklynn
+Brynn
+Cadence
+Caitlin
+Caitlyn
+Calanthia
+Caleigh
+Cali
+Callie
+Cameron
+Camila
+Camille
+Camryn
+Candace
+Candice
+Cara
+Carly
+Carlyle
+Carmen
+Carolina
+Caroline
+Carolyn
+Carry
+Caryl
+Casey
+Cassandra
+Cassidy
+Catherine
+Cecilia
+Cecily
+Celeste
+Charlotte
+Chelsea
+Cherette
+Cheri
+Cherry
+Cheyanne
+Cheyenne
+Chloe
+Christa
+Christiana
+Christina
+Christobelle
+Ciara
+Cindy
+Claire
+Clara
+Claribel
+Claudia
+Clover
+Cora
+Coreen
+Corrine
+Courtney
+Crystal
+Cynthia
+Daisy
+Dakota
+Dalya
+Dana
+Danica
+Daniela
+Daniella
+Danielle
+Danika
+Danna
+Daria
+Dayana
+Dayna
+Debbi
+Dee
+Deena
+Delaney
+Delilah
+Della
+Delma
+Denise
+Denys
+Desiree
+Destiny
+Diamond
+Diana
+Dina
+Dolores
+Donella
+Donna
+Dorothy
+Dortha
+Dulce
+Easter
+Ebba
+Eden
+Effie
+Elaina
+Eleanor
+Elena
+Eliana
+Elise
+Eliza
+Elizabeth
+Ella
+Elle
+Ellie
+Emely
+Emerson
+Emery
+Emilee
+Emilia
+Emily
+Emma
+Erica
+Erika
+Erin
+Ermintrude
+Esmeralda
+Esther
+Estrella
+Eugenia
+Euphemia
+Eustace
+Eva
+Evangeline
+Eveleen
+Evelina
+Evelyn
+Faith
+Fatima
+Fay
+Fernanda
+Fiona
+Floella
+Flora
+Flossie
+Fortune
+Francesca
+Gabriela
+Gabriella
+Gabrielle
+Genette
+Genevieve
+Georgene
+Georgia
+Geraldine
+Gervase
+Gianna
+Gina
+Ginger
+Giselle
+Gladwyn
+Glenna
+Gloria
+Grace
+Gracie
+Greta
+Griselda
+Guadalupe
+Gwenda
+Gwenevere
+Hadley
+Haidee
+Hailee
+Hailey
+Hal
+Haleigh
+Haley
+Hanna
+Hannah
+Harley
+Harmony
+Harper
+Hayden
+Haylee
+Hayley
+Haylie
+Hazel
+Heather
+Heaven
+Hedley
+Heidi
+Helen
+Hepsie
+Holly
+Hope
+Hortensia
+Iantha
+Ileen
+Imani
+Innocent
+Irene
+Iris
+Isabel
+Isabella
+Isabelle
+Itzel
+Ivy
+Izabella
+Jacaline
+Jacqueline
+Jacquetta
+Jacqui
+Jada
+Jade
+Jaden
+Jadyn
+Jaelyn
+Jakki
+Jalen
+Jamie
+Jane
+Janelle
+Janette
+Janie
+Janina
+Janine
+Janiya
+Janiyah
+Jaslene
+Jasmin
+Jasmine
+Jayda
+Jayden
+Jayla
+Jaylee
+Jaynie
+Jazlyn
+Jazmin
+Jazmine
+Jeanna
+Jeannie
+Jeannine
+Jenifer
+Jenna
+Jennie
+Jennifer
+Jera
+Jere
+Jeri
+Jessica
+Jillian
+Jillie
+Jimena
+Joanna
+Jocelyn
+Joetta
+Johanna
+Joi
+Joni
+Jordan
+Jordyn
+Joselyn
+Josepha
+Josephine
+Josie
+Joye
+Julia
+Juliana
+Julianna
+Julie
+Juliet
+Julissa
+July
+Kadence
+Kaelea
+Kaelyn
+Kailey
+Kailyn
+Kaitlin
+Kaitlyn
+Kaleigh
+Kamryn
+Kara
+Karen
+Karenza
+Karina
+Karla
+Karly
+Karyn
+Kassidy
+Kat
+Kate
+Katelyn
+Katelynn
+Katherine
+Kathleen
+Kathryn
+Kathy
+Katie
+Katlyn
+Kayden
+Kaydence
+Kayla
+Kaylee
+Kayleigh
+Kaylie
+Kaylin
+Keegan
+Keira
+Keith
+Kellie
+Kelly
+Kelsey
+Kendall
+Kendra
+Kennedy
+Kenzie
+Kerena
+Kerensa
+Keturah
+Khloe
+Kiana
+Kiara
+Kiera
+Kiley
+Kimberley
+Kimberly
+Kimora
+Kira
+Kristen
+Kristina
+Kyla
+Kylee
+Kyleigh
+Kylie
+Kyra
+Lacey
+Lacy
+Laila
+Lakeisha
+Lalla
+Lana
+Latanya
+Laura
+Lauren
+Laurencia
+Laurissa
+Lauryn
+Layla
+Leah
+Leeann
+Leia
+Leila
+Leilani
+Lena
+Leslie
+Lesly
+Lessie
+Leta
+Lexi
+Lexia
+Lexus
+Lia
+Lila
+Lilah
+Lilian
+Liliana
+Lillian
+Lilliana
+Lillie
+Lilly
+Lily
+Lindsay
+Lindsey
+Lindsie
+Lindy
+Lizbeth
+Lockie
+Logan
+Lola
+London
+Lori
+Lorin
+Luanne
+Lucia
+Lucian
+Lucy
+Luna
+Luvenia
+Lydia
+Lyla
+Lyndsey
+Lynn
+Lynsey
+Lynwood
+Lyric
+Mabelle
+Macey
+Macie
+Mackenzie
+Macy
+Madalyn
+Maddison
+Madeleine
+Madeline
+Madelyn
+Madelynn
+Madilyn
+Madison
+Madisyn
+Madyson
+Maegan
+Maggie
+Makayla
+Makenna
+Makenzie
+Malia
+Mallory
+Marcia
+Marely
+Margaret
+Maria
+Mariabella
+Mariah
+Mariana
+Marilene
+Marion
+Marisol
+Marissa
+Marje
+Marjory
+Marlee
+Marley
+Marlowe
+Marlyn
+Marshall
+Mary
+Maryann
+Maudie
+Maurene
+May
+Maya
+Mckenna
+Mckenzie
+Megan
+Meghan
+Melanie
+Melany
+Melissa
+Melody
+Meredith
+Merideth
+Merrilyn
+Meryl
+Mia
+Michaela
+Michelle
+Mikayla
+Miley
+Minnie
+Miracle
+Miranda
+Miriam
+Molly
+Monica
+Monna
+Morgan
+Muriel
+Mya
+Mylee
+Myriam
+Myrtie
+Nadia
+Nan
+Nancy
+Naomi
+Natalia
+Natalie
+Nataly
+Natasha
+Nayeli
+Nelle
+Nena
+Nerissa
+Netta
+Nettie
+Nevaeh
+Nia
+Nicole
+Nina
+Noelle
+Nonie
+Nora
+Norah
+Nova
+Nowell
+Nydia
+Nyla
+Olive
+Olivia
+Oralie
+Paige
+Paisley
+Paola
+Paris
+Patience
+Patricia
+Pauleen
+Payton
+Pene
+Penelope
+Peregrine
+Perla
+Peyton
+Pheobe
+Phoebe
+Phyliss
+Phyllida
+Phyllis
+Piper
+Porsche
+Presley
+Priscilla
+Prosper
+Prue
+Quanah
+Quiana
+Rachael
+Rachel
+Raegan
+Raelene
+Rain
+Randa
+Randal
+Reagan
+Rebecca
+Rebeckah
+Rebekah
+Reene
+Reese
+Renie
+Rexana
+Rhetta
+Rihanna
+Riley
+Ronnette
+Rosa
+Rose
+Rosemary
+Rowan
+Ruby
+Rubye
+Ruth
+Rylee
+Ryleigh
+Rylie
+Sabella
+Sabrina
+Sachie
+Sadie
+Sage
+Sally
+Samantha
+Samara
+Sandra
+Sara
+Sarah
+Sarai
+Saranna
+Sasha
+Savanna
+Savannah
+Scarlett
+Selena
+Seneca
+Serena
+Serenity
+Shana
+Shanika
+Shannah
+Shannon
+Shantae
+Sharalyn
+Sharla
+Shayla
+Shelby
+Sheri
+Sherie
+Sherill
+Sherri
+Sienna
+Sierra
+Sissy
+Skylar
+Skyler
+Sofia
+Sophia
+Sophie
+Star
+Stella
+Steph
+Stephanie
+Stephany
+Sue
+Sukie
+Summer
+Sunshine
+Susanna
+Susannah
+Suzan
+Suzy
+Sydney
+Talia
+Tamika
+Tania
+Tansy
+Taryn
+Tatiana
+Tatum
+Tatyanna
+Taylor
+Teagan
+Tessa
+Tiffany
+Tolly
+Topaz
+Tori
+Tracee
+Tracey
+Trinity
+Ulyssa
+Valary
+Valentina
+Valeria
+Valerie
+Vanessa
+Verna
+Veronica
+Victoria
+Vinnie
+Violet
+Vivian
+Viviana
+Vivyan
+Wendi
+Wendy
+Willow
+Wisdom
+Wynonna
+Wynter
+Ximena
+Yasmin
+Yolanda
+Ysabel
+Zelda
+Zoe
+Zoey
Zune
\ No newline at end of file
diff --git a/strings/names/first_male.txt b/strings/names/first_male.txt
index b86722dbaf..928958d1a9 100644
--- a/strings/names/first_male.txt
+++ b/strings/names/first_male.txt
@@ -1,668 +1,668 @@
-Aaden
-Aaron
-Abel
-Abraham
-Adam
-Adan
-Aden
-Adolph
-Adrian
-Aidan
-Aiden
-Alan
-Albert
-Alberto
-Alden
-Alec
-Alejandro
-Alex
-Alexander
-Alexis
-Alfred
-Alfredo
-Alger
-Ali
-Alijah
-Allen
-Alvin
-Amari
-Amir
-Amos
-Anderson
-Andre
-Andres
-Andrew
-Andy
-Angel
-Angelo
-Anthony
-Antonio
-Apple
-Archie
-Armando
-Arnie
-Art
-Arthur
-Arturo
-Asher
-Ashton
-August
-Austin
-Avery
-Axel
-Ayden
-Baldric
-Bartholomew
-Beau
-Beckett
-Benjamin
-Bennett
-Bill
-Blake
-Braden
-Bradley
-Brady
-Braeden
-Braiden
-Brandon
-Braxton
-Brayan
-Brayden
-Braydon
-Braylon
-Brendan
-Brenden
-Brennan
-Brett
-Brian
-Brick
-Brock
-Brodie
-Brody
-Bronte
-Bruce
-Bryan
-Bryant
-Bryce
-Brycen
-Bryson
-Buck
-Burt
-Butch
-Byrne
-Byron
-Cade
-Caden
-Caiden
-Caleb
-Calvin
-Camden
-Cameron
-Camron
-Camryn
-Carl
-Carlos
-Carson
-Carter
-Casey
-Cash
-Casimir
-Cassian
-Cayden
-Cesar
-Chad
-Chance
-Chandler
-Charles
-Charlie
-Charlton
-Chase
-Chip
-Chris
-Christian
-Christopher
-Clark
-Claudius
-Clayton
-Clement
-Cletus
-Cleveland
-Cliff
-Clinton
-Cody
-Cohen
-Colby
-Cole
-Colin
-Collin
-Colten
-Colton
-Conner
-Connor
-Cooper
-Corbin
-Corey
-Cory
-Cristian
-Cristopher
-Crush
-Cruz
-Curtis
-Cy
-Dakota
-Dallas
-Dalton
-Damian
-Damien
-Damon
-Dane
-Daniel
-Danny
-Dante
-Darcey
-Darell
-Darin
-Darius
-Darren
-David
-Davion
-Davis
-Dawson
-Dayton
-Dean
-Deandre
-Deangelo
-Declan
-Denholm
-Dennis
-Derek
-Derrick
-Desmond
-Devin
-Devon
-Diego
-Dillon
-Dirk
-Dominic
-Dominick
-Donald
-Donny
-Donovan
-Douglas
-Drake
-Drew
-Driscoll
-Duke
-Duncan
-Dustin
-Dylan
-Easton
-Eddie
-Edgar
-Eduardo
-Edward
-Edwin
-Eli
-Elias
-Elijah
-Eliot
-Eliott
-Elliot
-Elliott
-Elric
-Elwood
-Emanuel
-Emerson
-Emiliano
-Emilio
-Emmanuel
-Enrique
-Eric
-Erick
-Erik
-Ernesto
-Esteban
-Ethan
-Evan
-Everett
-Ezekiel
-Ezra
-Fabian
-Felix
-Fenton
-Fernando
-Finn
-Fitz
-Flick
-Flint
-Flip
-Francis
-Francisco
-Frank
-Frankie
-Franklin
-Fridge
-Fulton
-Gabriel
-Gael
-Gage
-Gannon
-Garret
-Garrett
-Gary
-Gavin
-George
-Gerardo
-Giovanni
-Goddard
-Godwin
-Goodwin
-Gordon
-Grady
-Graeme
-Graham
-Grandpa
-Grant
-Gratian
-Grayson
-Gregory
-Grendel
-Greyson
-Griffin
-Guillermo
-Gunner
-Gustavo
-Han
-Harrison
-Harry
-Hartley
-Harvey
-Hayden
-Hector
-Henderson
-Henry
-Holden
-Homer
-Horatio
-Hudson
-Huffie
-Hugo
-Hungry
-Hunter
-Ian
-Irvine
-Isaac
-Isaiah
-Isaias
-Isiah
-Ismael
-Israel
-Issac
-Ivan
-Izaiah
-Jace
-Jack
-Jackson
-Jacob
-Jacoby
-Jaden
-Jadon
-Jaiden
-Jaime
-Jake
-Jakob
-Jalen
-Jamar
-Jamari
-Jamarion
-James
-Jameson
-Jamie
-Jamison
-Janel
-Jared
-Jason
-Jasper
-Javier
-Javon
-Jaxon
-Jaxson
-Jay
-Jayce
-Jayden
-Jaydon
-Jaye
-Jaylen
-Jayne
-Jayson
-Jean-Luc
-Jeb
-Jed
-Jeffrey
-Jemmy
-Jeremiah
-Jeremy
-Jermaine
-Jerrie
-Jerry
-Jesse
-Jesus
-Jim
-Jimmy
-Joachim
-Joaquin
-Joe
-Joel
-Joey
-Johan
-John
-Johnathan
-Johnny
-Jonah
-Jonas
-Jonathan
-Jonathon
-Jordan
-Jorge
-Jose
-Joseph
-Josh
-Joshua
-Josiah
-Josue
-Juan
-Judah
-Jude
-Julian
-Julio
-Julius
-Justice
-Justin
-Kade
-Kaden
-Kai
-Kaiden
-Kale
-Kaleb
-Kameron
-Kane
-Karson
-Kayden
-Keagan
-Keaton
-Keegan
-Keith
-Kellen
-Kelvin
-Kennard
-Kenneth
-Kevin
-Keziah
-Khalil
-Kingston
-Kobe
-Kolton
-Kristopher
-Kyle
-Kyler
-Lance
-Landen
-Lando
-Landon
-Landyn
-Lane
-Lanny
-Larry
-Launce
-Lawrence
-Leland
-Lennox
-Lenny
-Leo
-Leonard
-Leonardo
-Leonel
-Leroy
-Levi
-Liam
-Lief
-Lincoln
-Linden
-Linton
-Logan
-Lorde
-Lorenzo
-Loreto
-Lou
-Louis
-Luca
-Lucas
-Luis
-Lukas
-Luke
-Maddox
-Malachi
-Malcolm
-Malik
-Manley
-Manuel
-Marc
-Marco
-Marcos
-Marcus
-Mario
-Marion
-Mark
-Marshall
-Martin
-Marvin
-Mason
-Mateo
-Mathew
-Matthew
-Maurice
-Mauricio
-Max
-Maximilian
-Maximus
-Maxwell
-Maynard
-Mekhi
-Melvin
-Melvyn
-Micah
-Michael
-Micheal
-Miguel
-Mike
-Miles
-Milo
-Milton
-Mitchell
-Moises
-Montague
-Monte
-Monty
-Morgan
-Moses
-Myles
-Nasir
-Nat
-Nathan
-Nathaniel
-Nehemiah
-Nelson
-Nicholas
-Nick
-Nickolas
-Nicolas
-Nikolas
-Noah
-Noel
-Nolan
-Oliver
-Omar
-Opie
-Orlando
-Osbert
-Osborn
-Osborne
-Oscar
-Osmund
-Oswald
-Owen
-Pablo
-Paget
-Parker
-Patrick
-Patton
-Paul
-Paxton
-Payton
-Pedro
-Percival
-Persh
-Peter
-Peyton
-Philip
-Phillip
-Phoenix
-Porter
-Preston
-Quentin
-Quinn
-Quinton
-Rafael
-Ramon
-Randy
-Rastus
-Raul
-Raymond
-Rayner
-Reece
-Reed
-Reese
-Reid
-Reuben
-Reynard
-Ricardo
-Richard
-Ricky
-Riley
-River
-Robert
-Roberto
-Rocco
-Rodger
-Rodrigo
-Roger
-Roman
-Romayne
-Romeo
-Ronald
-Roscoe
-Roswell
-Rowan
-Roy
-Royce
-Rube
-Ruben
-Russell
-Rusty
-Ryan
-Ryder
-Ryker
-Rylan
-Sal
-Salvador
-Sam
-Samuel
-Santiago
-Saul
-Sawyer
-Scott
-Scotty
-Sean
-Sebastian
-Sergio
-Seth
-Seymour
-Shane
-Shaun
-Shawn
-Shiloh
-Silas
-Simon
-Skyler
-Sloan
-Smoke
-Solomon
-Sorrel
-Spencer
-Spike
-Stephen
-Steven
-Sybil
-Syd
-Talon
-Tamsin
-Tanner
-Tate
-Taylor
-Tel
-Terrell
-Terry
-Theodore
-Thomas
-Tim
-Timothy
-Titus
-Todd
-Tony
-Travis
-Trent
-Trenton
-Trevor
-Trey
-Trip
-Tristan
-Tristen
-Triston
-Troy
-Tucker
-Ty
-Tye
-Tyler
-Tyson
-Uland
-Ulric
-Uriel
-Vaughn
-Victor
-Vince
-Vincent
-Vinny
-Walker
-Walter
-Ward
-Warner
-Wayne
-Wesley
-Weston
-Whitaker
-William
-Willy
-Woodrow
-Wyatt
-Xander
-Xavier
-Yahir
-Zachariah
-Zachary
-Zack
-Zackary
-Zander
-Zane
-Zayden
-Zeke
+Aaden
+Aaron
+Abel
+Abraham
+Adam
+Adan
+Aden
+Adolph
+Adrian
+Aidan
+Aiden
+Alan
+Albert
+Alberto
+Alden
+Alec
+Alejandro
+Alex
+Alexander
+Alexis
+Alfred
+Alfredo
+Alger
+Ali
+Alijah
+Allen
+Alvin
+Amari
+Amir
+Amos
+Anderson
+Andre
+Andres
+Andrew
+Andy
+Angel
+Angelo
+Anthony
+Antonio
+Apple
+Archie
+Armando
+Arnie
+Art
+Arthur
+Arturo
+Asher
+Ashton
+August
+Austin
+Avery
+Axel
+Ayden
+Baldric
+Bartholomew
+Beau
+Beckett
+Benjamin
+Bennett
+Bill
+Blake
+Braden
+Bradley
+Brady
+Braeden
+Braiden
+Brandon
+Braxton
+Brayan
+Brayden
+Braydon
+Braylon
+Brendan
+Brenden
+Brennan
+Brett
+Brian
+Brick
+Brock
+Brodie
+Brody
+Bronte
+Bruce
+Bryan
+Bryant
+Bryce
+Brycen
+Bryson
+Buck
+Burt
+Butch
+Byrne
+Byron
+Cade
+Caden
+Caiden
+Caleb
+Calvin
+Camden
+Cameron
+Camron
+Camryn
+Carl
+Carlos
+Carson
+Carter
+Casey
+Cash
+Casimir
+Cassian
+Cayden
+Cesar
+Chad
+Chance
+Chandler
+Charles
+Charlie
+Charlton
+Chase
+Chip
+Chris
+Christian
+Christopher
+Clark
+Claudius
+Clayton
+Clement
+Cletus
+Cleveland
+Cliff
+Clinton
+Cody
+Cohen
+Colby
+Cole
+Colin
+Collin
+Colten
+Colton
+Conner
+Connor
+Cooper
+Corbin
+Corey
+Cory
+Cristian
+Cristopher
+Crush
+Cruz
+Curtis
+Cy
+Dakota
+Dallas
+Dalton
+Damian
+Damien
+Damon
+Dane
+Daniel
+Danny
+Dante
+Darcey
+Darell
+Darin
+Darius
+Darren
+David
+Davion
+Davis
+Dawson
+Dayton
+Dean
+Deandre
+Deangelo
+Declan
+Denholm
+Dennis
+Derek
+Derrick
+Desmond
+Devin
+Devon
+Diego
+Dillon
+Dirk
+Dominic
+Dominick
+Donald
+Donny
+Donovan
+Douglas
+Drake
+Drew
+Driscoll
+Duke
+Duncan
+Dustin
+Dylan
+Easton
+Eddie
+Edgar
+Eduardo
+Edward
+Edwin
+Eli
+Elias
+Elijah
+Eliot
+Eliott
+Elliot
+Elliott
+Elric
+Elwood
+Emanuel
+Emerson
+Emiliano
+Emilio
+Emmanuel
+Enrique
+Eric
+Erick
+Erik
+Ernesto
+Esteban
+Ethan
+Evan
+Everett
+Ezekiel
+Ezra
+Fabian
+Felix
+Fenton
+Fernando
+Finn
+Fitz
+Flick
+Flint
+Flip
+Francis
+Francisco
+Frank
+Frankie
+Franklin
+Fridge
+Fulton
+Gabriel
+Gael
+Gage
+Gannon
+Garret
+Garrett
+Gary
+Gavin
+George
+Gerardo
+Giovanni
+Goddard
+Godwin
+Goodwin
+Gordon
+Grady
+Graeme
+Graham
+Grandpa
+Grant
+Gratian
+Grayson
+Gregory
+Grendel
+Greyson
+Griffin
+Guillermo
+Gunner
+Gustavo
+Han
+Harrison
+Harry
+Hartley
+Harvey
+Hayden
+Hector
+Henderson
+Henry
+Holden
+Homer
+Horatio
+Hudson
+Huffie
+Hugo
+Hungry
+Hunter
+Ian
+Irvine
+Isaac
+Isaiah
+Isaias
+Isiah
+Ismael
+Israel
+Issac
+Ivan
+Izaiah
+Jace
+Jack
+Jackson
+Jacob
+Jacoby
+Jaden
+Jadon
+Jaiden
+Jaime
+Jake
+Jakob
+Jalen
+Jamar
+Jamari
+Jamarion
+James
+Jameson
+Jamie
+Jamison
+Janel
+Jared
+Jason
+Jasper
+Javier
+Javon
+Jaxon
+Jaxson
+Jay
+Jayce
+Jayden
+Jaydon
+Jaye
+Jaylen
+Jayne
+Jayson
+Jean-Luc
+Jeb
+Jed
+Jeffrey
+Jemmy
+Jeremiah
+Jeremy
+Jermaine
+Jerrie
+Jerry
+Jesse
+Jesus
+Jim
+Jimmy
+Joachim
+Joaquin
+Joe
+Joel
+Joey
+Johan
+John
+Johnathan
+Johnny
+Jonah
+Jonas
+Jonathan
+Jonathon
+Jordan
+Jorge
+Jose
+Joseph
+Josh
+Joshua
+Josiah
+Josue
+Juan
+Judah
+Jude
+Julian
+Julio
+Julius
+Justice
+Justin
+Kade
+Kaden
+Kai
+Kaiden
+Kale
+Kaleb
+Kameron
+Kane
+Karson
+Kayden
+Keagan
+Keaton
+Keegan
+Keith
+Kellen
+Kelvin
+Kennard
+Kenneth
+Kevin
+Keziah
+Khalil
+Kingston
+Kobe
+Kolton
+Kristopher
+Kyle
+Kyler
+Lance
+Landen
+Lando
+Landon
+Landyn
+Lane
+Lanny
+Larry
+Launce
+Lawrence
+Leland
+Lennox
+Lenny
+Leo
+Leonard
+Leonardo
+Leonel
+Leroy
+Levi
+Liam
+Lief
+Lincoln
+Linden
+Linton
+Logan
+Lorde
+Lorenzo
+Loreto
+Lou
+Louis
+Luca
+Lucas
+Luis
+Lukas
+Luke
+Maddox
+Malachi
+Malcolm
+Malik
+Manley
+Manuel
+Marc
+Marco
+Marcos
+Marcus
+Mario
+Marion
+Mark
+Marshall
+Martin
+Marvin
+Mason
+Mateo
+Mathew
+Matthew
+Maurice
+Mauricio
+Max
+Maximilian
+Maximus
+Maxwell
+Maynard
+Mekhi
+Melvin
+Melvyn
+Micah
+Michael
+Micheal
+Miguel
+Mike
+Miles
+Milo
+Milton
+Mitchell
+Moises
+Montague
+Monte
+Monty
+Morgan
+Moses
+Myles
+Nasir
+Nat
+Nathan
+Nathaniel
+Nehemiah
+Nelson
+Nicholas
+Nick
+Nickolas
+Nicolas
+Nikolas
+Noah
+Noel
+Nolan
+Oliver
+Omar
+Opie
+Orlando
+Osbert
+Osborn
+Osborne
+Oscar
+Osmund
+Oswald
+Owen
+Pablo
+Paget
+Parker
+Patrick
+Patton
+Paul
+Paxton
+Payton
+Pedro
+Percival
+Persh
+Peter
+Peyton
+Philip
+Phillip
+Phoenix
+Porter
+Preston
+Quentin
+Quinn
+Quinton
+Rafael
+Ramon
+Randy
+Rastus
+Raul
+Raymond
+Rayner
+Reece
+Reed
+Reese
+Reid
+Reuben
+Reynard
+Ricardo
+Richard
+Ricky
+Riley
+River
+Robert
+Roberto
+Rocco
+Rodger
+Rodrigo
+Roger
+Roman
+Romayne
+Romeo
+Ronald
+Roscoe
+Roswell
+Rowan
+Roy
+Royce
+Rube
+Ruben
+Russell
+Rusty
+Ryan
+Ryder
+Ryker
+Rylan
+Sal
+Salvador
+Sam
+Samuel
+Santiago
+Saul
+Sawyer
+Scott
+Scotty
+Sean
+Sebastian
+Sergio
+Seth
+Seymour
+Shane
+Shaun
+Shawn
+Shiloh
+Silas
+Simon
+Skyler
+Sloan
+Smoke
+Solomon
+Sorrel
+Spencer
+Spike
+Stephen
+Steven
+Sybil
+Syd
+Talon
+Tamsin
+Tanner
+Tate
+Taylor
+Tel
+Terrell
+Terry
+Theodore
+Thomas
+Tim
+Timothy
+Titus
+Todd
+Tony
+Travis
+Trent
+Trenton
+Trevor
+Trey
+Trip
+Tristan
+Tristen
+Triston
+Troy
+Tucker
+Ty
+Tye
+Tyler
+Tyson
+Uland
+Ulric
+Uriel
+Vaughn
+Victor
+Vince
+Vincent
+Vinny
+Walker
+Walter
+Ward
+Warner
+Wayne
+Wesley
+Weston
+Whitaker
+William
+Willy
+Woodrow
+Wyatt
+Xander
+Xavier
+Yahir
+Zachariah
+Zachary
+Zack
+Zackary
+Zander
+Zane
+Zayden
+Zeke
Zion
\ No newline at end of file
diff --git a/strings/names/golem.txt b/strings/names/golem.txt
index a26da78b04..7cfcefa899 100644
--- a/strings/names/golem.txt
+++ b/strings/names/golem.txt
@@ -1,157 +1,157 @@
-Ablation
-Alabaster
-Alunite
-Andesite
-Anyhdrite
-Basalt
-Basin
-Bauxite
-Bedrock
-Bismuth
-Bismuthinite
-Bituminous Coal
-Borax
-Boulder
-Brimstone
-Brittle
-Calcite
-Cassiterite
-Cenozoic
-Chalk
-Chasm
-Cheridite
-Chert
-Chromite
-Cinnabar
-Claystone
-Coast
-Cobaltite
-Column
-Conglomerate
-Core
-Crevasse
-Crust
-Cryolite
-Crystal
-Dacite
-Diorite
-Dolomite
-Dolostone
-Dragonforce
-Earthflow
-Epoch
-Eutrophication
-Fault
-Flint
-Foliation
-Foreshock
-Fossil
-Gabbro
-Galena
-Garnierite
-Geode
-Geoge
-Gneiss
-Granite
-Graphite
-Gravel
-Groove
-Grotto
-Gypsum
-Hematite
-Hornblende
-Humus
-Igneous
-Ilmenite
-Iron
-Island
-Jasper
-Jet
-Kaolinite
-Kettle
-Kimberlite
-Komatiite
-Landslide
-Levee
-Lignite
-Limestone
-Limonite
-Luster
-Madidite
-Magnetite
-Magnitude
-Malachite
-Mantle
-Marble
-Marcasite
-Melange
-Meme
-Mica
-Microcline
-Migmatite
-Mineral
-Mountain
-Mudstone
-Obsidian
-Olivine
-Ore
-Orpiment
-Orthoclase
-Outwash
-Oxbow Lake
-Oynx
-Pahoehoe
-Pebble
-Pegmatite
-Periclase
-Petrified Wood
-Phyllite
-Pitchblende
-Plate
-Pothole
-Puddingstone
-Pyrite
-Pyrolusite
-Quake
-Quarry
-Quartz
-Quartzite
-Realgar
-Reservoir
-Rhyolite
-Rock
-Rock Salt
-Rockfall
-Rutile
-Saltpeter
-Sand
-Sandstone
-Satinspar
-Schist
-Sediment
-Seismic
-Selenite
-Serpentine
-Shale
-Shore
-Siltstone
-Slag
-Slate
-Sphalerite
-Stack
-Stalactite
-Stalagmite
-Stibnite
-Stone
-Stress
-Subduction
-Sylvite
-Talc
-Tetrahedrite
-Tidal
-Trench
-Valley
-Volcano
-Xenolith
-Yardang
-Zone
+Ablation
+Alabaster
+Alunite
+Andesite
+Anyhdrite
+Basalt
+Basin
+Bauxite
+Bedrock
+Bismuth
+Bismuthinite
+Bituminous Coal
+Borax
+Boulder
+Brimstone
+Brittle
+Calcite
+Cassiterite
+Cenozoic
+Chalk
+Chasm
+Cheridite
+Chert
+Chromite
+Cinnabar
+Claystone
+Coast
+Cobaltite
+Column
+Conglomerate
+Core
+Crevasse
+Crust
+Cryolite
+Crystal
+Dacite
+Diorite
+Dolomite
+Dolostone
+Dragonforce
+Earthflow
+Epoch
+Eutrophication
+Fault
+Flint
+Foliation
+Foreshock
+Fossil
+Gabbro
+Galena
+Garnierite
+Geode
+Geoge
+Gneiss
+Granite
+Graphite
+Gravel
+Groove
+Grotto
+Gypsum
+Hematite
+Hornblende
+Humus
+Igneous
+Ilmenite
+Iron
+Island
+Jasper
+Jet
+Kaolinite
+Kettle
+Kimberlite
+Komatiite
+Landslide
+Levee
+Lignite
+Limestone
+Limonite
+Luster
+Madidite
+Magnetite
+Magnitude
+Malachite
+Mantle
+Marble
+Marcasite
+Melange
+Meme
+Mica
+Microcline
+Migmatite
+Mineral
+Mountain
+Mudstone
+Obsidian
+Olivine
+Ore
+Orpiment
+Orthoclase
+Outwash
+Oxbow Lake
+Oynx
+Pahoehoe
+Pebble
+Pegmatite
+Periclase
+Petrified Wood
+Phyllite
+Pitchblende
+Plate
+Pothole
+Puddingstone
+Pyrite
+Pyrolusite
+Quake
+Quarry
+Quartz
+Quartzite
+Realgar
+Reservoir
+Rhyolite
+Rock
+Rock Salt
+Rockfall
+Rutile
+Saltpeter
+Sand
+Sandstone
+Satinspar
+Schist
+Sediment
+Seismic
+Selenite
+Serpentine
+Shale
+Shore
+Siltstone
+Slag
+Slate
+Sphalerite
+Stack
+Stalactite
+Stalagmite
+Stibnite
+Stone
+Stress
+Subduction
+Sylvite
+Talc
+Tetrahedrite
+Tidal
+Trench
+Valley
+Volcano
+Xenolith
+Yardang
+Zone
diff --git a/strings/names/last.txt b/strings/names/last.txt
index b9769055e3..6796c7519e 100644
--- a/strings/names/last.txt
+++ b/strings/names/last.txt
@@ -1,570 +1,570 @@
-Ackerley
-Adams
-Addison
-Agg
-Aggley
-Ahmed
-Albright
-Alekseev
-Ali
-Alice
-Allen
-Alliman
-Altmann
-Anderson
-Andreev
-Ann
-Archibald
-Armstrong
-Ashbaugh
-Atkinson
-Atweeke
-Aultman
-Auman
-Baer
-Bailey
-Baker
-Barnes
-Barrett
-Bash
-Bashline
-Basinger
-Baskett
-Basmanoff
-Batten
-Baum
-Baxter
-Beach
-Beail
-Beck
-Beedell
-Begum
-Bell
-Benford
-Bennett
-Berkheimer
-Best
-Bickerson
-Bicknell
-Biery
-Black
-Blackburn
-Blaine
-Blessig
-Bloise
-Bluetenberger
-Blyant
-Bode
-Bould
-Bousum
-Bowchiew
-Boyer
-Brandenburg
-Bratton
-Braun
-Briggs
-Brindle
-Briner
-Brinigh
-Brooks
-Brown
-Bullard
-Bunten
-Burkett
-Burns
-Burris
-Butterfill
-Buttersworth
-Buzzard
-Byers
-Bynum
-Caldwell
-Callison
-Camp
-Campbell
-Carmichael
-Carr
-Carter
-Catherina
-Catleay
-Cavalet
-Chapman
-Chauvin
-Cherry
-Christman
-Christopher
-Clark
-Clarke
-Clewett
-Coates
-Coldsmith
-Collins
-Compton
-Conrad
-Cook
-Cooper
-Costello
-Cowart
-Cowper
-Cox
-Cressman
-Curry
-Cypret
-David
-Davies
-Davis
-Dawkins
-Day
-Dean
-Demuth
-Dennis
-Dickinson
-Digson
-Dimeling
-Donkin
-Draudy
-Driggers
-Dryfus
-Dugmore
-Duncan
-Durstine
-Earl
-Easter
-Echard
-Eckhardstein
-Edwards
-Eggbert
-Ehret
-Elderson
-Eliza
-Elliott
-Ellis
-Enderly
-Endsley
-Evans
-Ewing
-Faqua
-Faust
-Fea
-Feufer
-Fiddler
-Field
-Fields
-Finlay
-Fischer
-Fiscina
-Fisher
-Fitzgerald
-Fleming
-Flickinger
-Focell
-Foster
-Franks
-Fraser
-Fryer
-Fuchs
-Fulton
-Gadow
-Gardner
-Garland
-Garneys
-Garratt
-Garrison
-Gettemy
-Gibson
-Glover
-Goebbles
-Goodman
-Graham
-Gray
-Green
-Greenawalt
-Greene
-Greenwood
-Gregory
-Griffiths
-Gronko
-Guess
-Hall
-Hanford
-Hardie
-Harding
-Hardy
-Harris
-Harrison
-Harrold
-Harrow
-Harshman
-Hastings
-Hawker
-Hawking
-Hawkins
-Hayhurst
-Haynes
-Heckendora
-Hegarty
-Henry
-Hice
-Highlands
-Hill
-Hincken
-Hirleman
-Hoenshell
-Holdeman
-Holmes
-Hook
-Hooker
-Hoopengarner
-Hoover
-Houser
-Houston
-Howard
-Howe
-Huey
-Hughes
-Hujsak
-Hunt
-Hunter
-Hussain
-Hutton
-Hynes
-Ironmonger
-Isaman
-Isemann
-Ivanov
-Jackson
-James
-Jardine
-Jenkins
-Jenner
-Jerome
-Jesse
-Jewell
-Joghs
-Johnson
-Jones
-Jowers
-Joyce
-Judge
-Jyllian
-Kadel
-Kanaga
-Kaur
-Keener
-Kelley
-Kellogg
-Kelly
-Kemble
-Kemerer
-Keppel
-Kepplinger
-Khan
-Kiefer
-Kifer
-Kimple
-King
-Kirkson
-Knapenberger
-Knapp
-Koepple
-Koster
-Kuster
-Kuznetsov
-Laborde
-Lacon
-Lafortune
-Langston
-Larson
-Lauffer
-Laurenzi
-Leach
-Lee
-Leech
-Leichter
-Leslie
-Lester
-Levett
-Lewis
-Lineman
-Linton
-Llora
-Lloyd
-Logue
-Lombardi
-Lord
-Losey
-Lowe
-Lowstetter
-Lucy
-Ludwig
-Maclagan
-Magor
-Marcotte
-Margaret
-Marriman
-Marshall
-Martins
-Mary
-Mason
-Mathews
-Matthews
-Mcclymonds
-Mccullough
-Mccune
-McDonald
-McDonohugh
-Mcfall
-Mcintosh
-Mckendrick
-Mcloskey
-Mcmullen
-McShain
-Mens
-Merryman
-Metzer
-Meyers
-Mikhaylov
-Mildred
-Miller
-Millhouse
-Mills
-Milne
-Mingle
-Minnie
-Mitchell
-Moberly
-Moon
-Moore
-Morgan
-Morris
-Mortland
-Mosser
-Mueller
-Muggins
-Mull
-Muller
-Murphy
-Murray
-Nash
-Neely
-Nehling
-Newbern
-Newton
-Nicholas
-Nickolson
-Northey
-Noton
-Olphert
-Oneal
-Oppenheimer
-Osteen
-Osterweis
-Osterwise
-Otis
-Overstreet
-Owen
-Owens
-Palmer
-Parker
-Parkinson
-Patel
-Patterson
-Paulson
-Pavlov
-Paynter
-Pearsall
-Pennington
-Perkins
-Pershing
-Peters
-Petrov
-Pfeifer
-Philips
-Phillips
-Picard
-Pinney
-Poehl
-Poley
-Polson
-Potter
-Powell
-Power
-Powers
-Pratt
-Prechtl
-Prescott
-Prevatt
-Price
-Priebe
-Pritchard
-Pycroft
-Quinn
-Quirin
-Rader
-Rahl
-Ramos
-Randolph
-Ratcliff
-Rathen
-Rathens
-Raub
-Ray
-Reade
-Reichard
-Reid
-Reighner
-Rhinehart
-Richards
-Richardson
-Richter
-Rifler
-Riggle
-Riker
-Ringer
-Roadman
-Roberts
-Robertson
-Robinson
-Roby
-Rockwell
-Rogers
-Rohtin
-Rose
-Rosensteel
-Rowley
-Russell
-Ryals
-Sagan
-Sanders
-Sandford
-Sandys
-Sauter
-Saylor
-Schaeffer
-Scherer
-Schmidt
-Schofield
-Schrader
-Scott
-Sealis
-Seelig
-Seidner
-Semenov
-Shafer
-Shaffer
-Shaner
-Shaw
-Sheets
-Shick
-Shirey
-Sholl
-Shupe
-Sidower
-Siegrist
-Simmons
-Simpson
-Singh
-Skywalker
-Sloan
-Smail
-Smirnov
-Smith
-Snyder
-Sommer
-Spock
-Stafford
-Stahl
-Stainforth
-Stall
-Stamos
-Stange
-Staymates
-Steele
-Stephenson
-Stern
-Stewart
-Stocker
-Stone
-Stough
-Straub
-Stroble
-Stroh
-Styles
-Sullivan
-Sulyard
-Summy
-Sutton
-Swabey
-Swarner
-Sybilla
-Taggart
-Tanner
-Taylor
-Teagarden
-Tedrow
-Tennant
-Thomas
-Thomlinson
-Thompson
-Thomson
-Thorley
-Tilton
-Tireman
-Todd
-Treeby
-Trovato
-Turner
-Ulery
-Ullman
-Unk
-Vader
-Vanleer
-Vasilyev
-Waldron
-Walker
-Wallick
-Ward
-Wardle
-Warren
-Watson
-Webb
-Weeter
-Weinstein
-Weisgarber
-Wells
-Welty
-Wentzel
-Werner
-Werry
-Wheeler
-Whirlow
-White
-Whiteman
-Whittier
-Wible
-Wile
-Wilkerson
-Wilkinson
-Willey
-Williams
-Williamson
-Wilo
-Wilson
-Winton
-Wise
-Wolfe
-Wolff
-Wood
-Woodward
-Woodworth
-Woolery
-Woollard
-Wright
-Yeskey
-Young
-Zadovsky
-Zalack
-Zaun
-Zeal
-Zimmer
+Ackerley
+Adams
+Addison
+Agg
+Aggley
+Ahmed
+Albright
+Alekseev
+Ali
+Alice
+Allen
+Alliman
+Altmann
+Anderson
+Andreev
+Ann
+Archibald
+Armstrong
+Ashbaugh
+Atkinson
+Atweeke
+Aultman
+Auman
+Baer
+Bailey
+Baker
+Barnes
+Barrett
+Bash
+Bashline
+Basinger
+Baskett
+Basmanoff
+Batten
+Baum
+Baxter
+Beach
+Beail
+Beck
+Beedell
+Begum
+Bell
+Benford
+Bennett
+Berkheimer
+Best
+Bickerson
+Bicknell
+Biery
+Black
+Blackburn
+Blaine
+Blessig
+Bloise
+Bluetenberger
+Blyant
+Bode
+Bould
+Bousum
+Bowchiew
+Boyer
+Brandenburg
+Bratton
+Braun
+Briggs
+Brindle
+Briner
+Brinigh
+Brooks
+Brown
+Bullard
+Bunten
+Burkett
+Burns
+Burris
+Butterfill
+Buttersworth
+Buzzard
+Byers
+Bynum
+Caldwell
+Callison
+Camp
+Campbell
+Carmichael
+Carr
+Carter
+Catherina
+Catleay
+Cavalet
+Chapman
+Chauvin
+Cherry
+Christman
+Christopher
+Clark
+Clarke
+Clewett
+Coates
+Coldsmith
+Collins
+Compton
+Conrad
+Cook
+Cooper
+Costello
+Cowart
+Cowper
+Cox
+Cressman
+Curry
+Cypret
+David
+Davies
+Davis
+Dawkins
+Day
+Dean
+Demuth
+Dennis
+Dickinson
+Digson
+Dimeling
+Donkin
+Draudy
+Driggers
+Dryfus
+Dugmore
+Duncan
+Durstine
+Earl
+Easter
+Echard
+Eckhardstein
+Edwards
+Eggbert
+Ehret
+Elderson
+Eliza
+Elliott
+Ellis
+Enderly
+Endsley
+Evans
+Ewing
+Faqua
+Faust
+Fea
+Feufer
+Fiddler
+Field
+Fields
+Finlay
+Fischer
+Fiscina
+Fisher
+Fitzgerald
+Fleming
+Flickinger
+Focell
+Foster
+Franks
+Fraser
+Fryer
+Fuchs
+Fulton
+Gadow
+Gardner
+Garland
+Garneys
+Garratt
+Garrison
+Gettemy
+Gibson
+Glover
+Goebbles
+Goodman
+Graham
+Gray
+Green
+Greenawalt
+Greene
+Greenwood
+Gregory
+Griffiths
+Gronko
+Guess
+Hall
+Hanford
+Hardie
+Harding
+Hardy
+Harris
+Harrison
+Harrold
+Harrow
+Harshman
+Hastings
+Hawker
+Hawking
+Hawkins
+Hayhurst
+Haynes
+Heckendora
+Hegarty
+Henry
+Hice
+Highlands
+Hill
+Hincken
+Hirleman
+Hoenshell
+Holdeman
+Holmes
+Hook
+Hooker
+Hoopengarner
+Hoover
+Houser
+Houston
+Howard
+Howe
+Huey
+Hughes
+Hujsak
+Hunt
+Hunter
+Hussain
+Hutton
+Hynes
+Ironmonger
+Isaman
+Isemann
+Ivanov
+Jackson
+James
+Jardine
+Jenkins
+Jenner
+Jerome
+Jesse
+Jewell
+Joghs
+Johnson
+Jones
+Jowers
+Joyce
+Judge
+Jyllian
+Kadel
+Kanaga
+Kaur
+Keener
+Kelley
+Kellogg
+Kelly
+Kemble
+Kemerer
+Keppel
+Kepplinger
+Khan
+Kiefer
+Kifer
+Kimple
+King
+Kirkson
+Knapenberger
+Knapp
+Koepple
+Koster
+Kuster
+Kuznetsov
+Laborde
+Lacon
+Lafortune
+Langston
+Larson
+Lauffer
+Laurenzi
+Leach
+Lee
+Leech
+Leichter
+Leslie
+Lester
+Levett
+Lewis
+Lineman
+Linton
+Llora
+Lloyd
+Logue
+Lombardi
+Lord
+Losey
+Lowe
+Lowstetter
+Lucy
+Ludwig
+Maclagan
+Magor
+Marcotte
+Margaret
+Marriman
+Marshall
+Martins
+Mary
+Mason
+Mathews
+Matthews
+Mcclymonds
+Mccullough
+Mccune
+McDonald
+McDonohugh
+Mcfall
+Mcintosh
+Mckendrick
+Mcloskey
+Mcmullen
+McShain
+Mens
+Merryman
+Metzer
+Meyers
+Mikhaylov
+Mildred
+Miller
+Millhouse
+Mills
+Milne
+Mingle
+Minnie
+Mitchell
+Moberly
+Moon
+Moore
+Morgan
+Morris
+Mortland
+Mosser
+Mueller
+Muggins
+Mull
+Muller
+Murphy
+Murray
+Nash
+Neely
+Nehling
+Newbern
+Newton
+Nicholas
+Nickolson
+Northey
+Noton
+Olphert
+Oneal
+Oppenheimer
+Osteen
+Osterweis
+Osterwise
+Otis
+Overstreet
+Owen
+Owens
+Palmer
+Parker
+Parkinson
+Patel
+Patterson
+Paulson
+Pavlov
+Paynter
+Pearsall
+Pennington
+Perkins
+Pershing
+Peters
+Petrov
+Pfeifer
+Philips
+Phillips
+Picard
+Pinney
+Poehl
+Poley
+Polson
+Potter
+Powell
+Power
+Powers
+Pratt
+Prechtl
+Prescott
+Prevatt
+Price
+Priebe
+Pritchard
+Pycroft
+Quinn
+Quirin
+Rader
+Rahl
+Ramos
+Randolph
+Ratcliff
+Rathen
+Rathens
+Raub
+Ray
+Reade
+Reichard
+Reid
+Reighner
+Rhinehart
+Richards
+Richardson
+Richter
+Rifler
+Riggle
+Riker
+Ringer
+Roadman
+Roberts
+Robertson
+Robinson
+Roby
+Rockwell
+Rogers
+Rohtin
+Rose
+Rosensteel
+Rowley
+Russell
+Ryals
+Sagan
+Sanders
+Sandford
+Sandys
+Sauter
+Saylor
+Schaeffer
+Scherer
+Schmidt
+Schofield
+Schrader
+Scott
+Sealis
+Seelig
+Seidner
+Semenov
+Shafer
+Shaffer
+Shaner
+Shaw
+Sheets
+Shick
+Shirey
+Sholl
+Shupe
+Sidower
+Siegrist
+Simmons
+Simpson
+Singh
+Skywalker
+Sloan
+Smail
+Smirnov
+Smith
+Snyder
+Sommer
+Spock
+Stafford
+Stahl
+Stainforth
+Stall
+Stamos
+Stange
+Staymates
+Steele
+Stephenson
+Stern
+Stewart
+Stocker
+Stone
+Stough
+Straub
+Stroble
+Stroh
+Styles
+Sullivan
+Sulyard
+Summy
+Sutton
+Swabey
+Swarner
+Sybilla
+Taggart
+Tanner
+Taylor
+Teagarden
+Tedrow
+Tennant
+Thomas
+Thomlinson
+Thompson
+Thomson
+Thorley
+Tilton
+Tireman
+Todd
+Treeby
+Trovato
+Turner
+Ulery
+Ullman
+Unk
+Vader
+Vanleer
+Vasilyev
+Waldron
+Walker
+Wallick
+Ward
+Wardle
+Warren
+Watson
+Webb
+Weeter
+Weinstein
+Weisgarber
+Wells
+Welty
+Wentzel
+Werner
+Werry
+Wheeler
+Whirlow
+White
+Whiteman
+Whittier
+Wible
+Wile
+Wilkerson
+Wilkinson
+Willey
+Williams
+Williamson
+Wilo
+Wilson
+Winton
+Wise
+Wolfe
+Wolff
+Wood
+Woodward
+Woodworth
+Woolery
+Woollard
+Wright
+Yeskey
+Young
+Zadovsky
+Zalack
+Zaun
+Zeal
+Zimmer
Zoucks
\ No newline at end of file
diff --git a/strings/names/lizard_female.txt b/strings/names/lizard_female.txt
index cf588df9b1..078ee7bcff 100644
--- a/strings/names/lizard_female.txt
+++ b/strings/names/lizard_female.txt
@@ -1,163 +1,163 @@
-Adzi
-Ah
-Ahaht
-Ajim
-Akeenus
-Akish
-Akishan
-Aleeto
-Am
-Amussa
-An
-Anozz
-Asheemar
-Asska
-Awas
-Azala
-Azbai
-Azeez
-Azum
-Banalz
-Bar
-Baseenar
-Beek
-Beekatan
-Beekus
-Beela
-Beelei
-Beem
-Beewos
-Bejeen
-Ber
-Betzi
-Bishalus
-Bokeeus
-Bur
-Bura
-Chalaree
-Chana
-Chanil
-Chee
-Cheesh
-Chimatei
-Chirurgeon
-Cholasistu
-Chuna
-Churasu
-Crath
-Dar
-Deeja
-Deesei
-Deesh
-Deetsan
-Deetwos
-Dooka
-Druja
-Eepa
-Ei
-Eix
-El
-Ereel
-Eutei
-Gai
-Gih
-Gilm
-Gish
-Go
-Hal
-Hul
-Ja
-Jaseen
-Jasuda
-Jeed
-Jeen
-Kajul
-Kal
-Kasa
-Keel
-Keerava
-Kiurz
-Kud
-La
-Lee
-Lei
-Lifts
-Liurz
-Lurasha
-Ma
-Mach
-Marz
-Meedish
-Meeh
-Meema
-Meen
-Meena
-Meenus
-Meerana
-Meesei
-Meeus
-Mei
-Milah
-Mim
-Mota
-Mudeska
-Muz
-Na
-Nakuma
-Nam
-Nassa
-Natoo
-Neesha
-Neetizei
-Neetra
-Neeus
-Niima
-Numeen
-Nuralg
-Nush
-Ocheeva
-Okur
-Olank
-On
-Onasha
-Osheeka
-Pasha
-Ra
-Rana
-Raniur
-Ree
-Reesa
-Rei
-Sa
-Saak
-Sanax
-Seeba
-Seed
-Seen
-Shah
-Shahvee
-Shaleez
-Shatalg
-Sheer
-Shei
-Sigerthe
-Skaleel
-Sudie
-Tail
-Tar
-Tasha
-Tei
-Telixith
-Tumma
-Veek
-Wan
-Wazei
-Weedum
-Weewish
-Witseidutsei
-Wuja
-Wujeeta
-Wusha
-Xil
-Zish
+Adzi
+Ah
+Ahaht
+Ajim
+Akeenus
+Akish
+Akishan
+Aleeto
+Am
+Amussa
+An
+Anozz
+Asheemar
+Asska
+Awas
+Azala
+Azbai
+Azeez
+Azum
+Banalz
+Bar
+Baseenar
+Beek
+Beekatan
+Beekus
+Beela
+Beelei
+Beem
+Beewos
+Bejeen
+Ber
+Betzi
+Bishalus
+Bokeeus
+Bur
+Bura
+Chalaree
+Chana
+Chanil
+Chee
+Cheesh
+Chimatei
+Chirurgeon
+Cholasistu
+Chuna
+Churasu
+Crath
+Dar
+Deeja
+Deesei
+Deesh
+Deetsan
+Deetwos
+Dooka
+Druja
+Eepa
+Ei
+Eix
+El
+Ereel
+Eutei
+Gai
+Gih
+Gilm
+Gish
+Go
+Hal
+Hul
+Ja
+Jaseen
+Jasuda
+Jeed
+Jeen
+Kajul
+Kal
+Kasa
+Keel
+Keerava
+Kiurz
+Kud
+La
+Lee
+Lei
+Lifts
+Liurz
+Lurasha
+Ma
+Mach
+Marz
+Meedish
+Meeh
+Meema
+Meen
+Meena
+Meenus
+Meerana
+Meesei
+Meeus
+Mei
+Milah
+Mim
+Mota
+Mudeska
+Muz
+Na
+Nakuma
+Nam
+Nassa
+Natoo
+Neesha
+Neetizei
+Neetra
+Neeus
+Niima
+Numeen
+Nuralg
+Nush
+Ocheeva
+Okur
+Olank
+On
+Onasha
+Osheeka
+Pasha
+Ra
+Rana
+Raniur
+Ree
+Reesa
+Rei
+Sa
+Saak
+Sanax
+Seeba
+Seed
+Seen
+Shah
+Shahvee
+Shaleez
+Shatalg
+Sheer
+Shei
+Sigerthe
+Skaleel
+Sudie
+Tail
+Tar
+Tasha
+Tei
+Telixith
+Tumma
+Veek
+Wan
+Wazei
+Weedum
+Weewish
+Witseidutsei
+Wuja
+Wujeeta
+Wusha
+Xil
+Zish
Zollassa
\ No newline at end of file
diff --git a/strings/names/lizard_male.txt b/strings/names/lizard_male.txt
index 437d124b50..f14f1705ba 100644
--- a/strings/names/lizard_male.txt
+++ b/strings/names/lizard_male.txt
@@ -1,328 +1,328 @@
-Abijoo
-Ah
-Ajum
-Am
-Amusei
-An
-Anoo
-Aojee
-Asum
-Az
-Azeel
-Azinar
-Azjai
-Baar
-Banka
-Bar
-Barnaxi
-Batar
-Batuus
-Beem
-Beshnus
-Betu
-Bex
-Bijot
-Bimee
-Binyaar
-Bosekus
-Brand
-Bun
-Bunach
-Bunish
-Busheeus
-Buujhan
-Chakuk
-Chalish
-Chalureel
-Chath
-Chee
-Cheedal
-Chilwir
-Chitakus
-Chiwish
-Chulz
-Chuna
-Da
-Dakee
-Dan
-Dar
-Darasken
-DarJee
-Debameel
-Deed
-Deegeeta
-Deeh
-Deekonus
-Deekum
-Deekus
-Deerkaza
-Deetum
-Demeepa
-Depasa
-Derkeethus
-Deroh
-Dezanu
-Dreet
-Drumarz
-Dum
-Dunaxith
-Effe
-Ei
-Eidu
-Eius
-Eiuus
-Eix
-Eleedal
-Er
-Esqoo
-Etaku
-Gah
-Gajul
-Gam
-Geeh
-Geel
-Geem
-Geh
-Gei
-Gih
-Gin
-Goh
-Gulum
-Haj
-Han
-Haran
-Hareeya
-Hathei
-Heedul
-Heem
-Hei
-Heir
-Hixeeh
-Huleeya
-Huzei
-Ilas
-Im
-Inee
-Itan
-J'Ram
-Ja
-Jah
-Jaraleet
-Jaree
-Jas
-Jasaiin
-Jaseen
-Jat
-Jee
-Jeela
-Jeelius
-Jeelus
-Jeen
-Jeer
-Jeetum
-Jei
-Jilux
-Jin
-Jon
-Jul
-Julan
-Junal
-Jush
-Juunei
-Kai
-Kajin
-Kamax
-Kas
-Keema
-Keer
-Keerasa
-Kepanuu
-Kia
-Kiameed
-Kilaya
-Kiurz
-Kur
-Kuz
-La
-Lah
-Lai
-Lan
-Lara
-Leem
-Lei
-Loh
-Lotash
-Luh
-Lurz
-Luteema
-Maahi
-Madesi
-Maheelius
-Mahei
-Maht
-Malz
-Marz
-Mathei
-Maxath
-Meej
-Meejapa
-Meensuda
-Meer
-Mema
-Mere
-Metaku
-Miharil
-Milos
-Miun
-Mobareed
-Mohimeem
-Mopakuz
-Motuu
-Mujeen
-Muranatepa
-Mush
-Muz
-Na
-Napetui
-Nazuux
-Nebutil
-Neeti
-Neetinei
-Neetrenaza
-Neetzara
-Neeus
-Nema
-Neposh
-Netapatuu
-Nexith
-Nodeeus
-Nomu
-Nosaleeth
-Nowajeem
-Noyei
-Nulaz
-Nur
-Obaxith
-Okan
-Okaw
-Okeeh
-Oleed
-Oleen
-Olik
-Olink
-Onuja
-Onurai
-Opatieel
-Otumeel
-Owai
-Pachat
-Pacheeva
-Pad
-Paduxi
-Pajeen
-Parash
-Peeradeeh
-Pejureel
-Petaxai
-Pideelus
-Pimaxi
-Pojeel
-Ra
-Radithax
-Raj
-Rareel
-Rasha
-Redieeus
-Ree
-Reeh
-Reemukeeus
-Reenum
-Reesa
-Reet
-Reezal
-Resari
-Riker
-Ru
-Rupah
-Sakeepa
-Sakeeus
-Sakka
-Saliith
-Sar
-Schiavas
-Seek
-Seewul
-Sei
-Sejaijilax
-Shakiis
-Shehs
-Shei
-Silm
-Skee
-Skeetul
-Sureeus
-Ta
-Taeed
-Tah
-Taleel
-Talen
-Tan
-Tanaka
-Tanan
-Tee
-Teeba
-Teegla
-Teeka
-Teekeeus
-Teemeeta
-Teeus
-Tehat
-Tei
-Teinaava
-Teineeja
-Terezeeus
-Tikaasi
-Tim
-Topeeth
-Topith
-Tsleeixth
-Tul
-Tulm
-Tun
-Ukatsei
-Ukawei
-Ula
-Ulawa
-Ullis
-Usha
-Usheeja
-Utadeek
-Utamukeeus
-Utatul
-Uxith
-Vara
-Veekas
-Veenaza
-Veezara
-Vistha
-Vudeelal
-Wanan
-Wanum
-Wayiteh
-Weebam
-Weeltul
-Weer
-Wih
-Wud
-Wuleen
-Wulm
-Wumeek
-Xal
-Xemo
-Yinz
-Yinz'r
-Zaw
-Ze
-Zeen
-Zeeus
+Abijoo
+Ah
+Ajum
+Am
+Amusei
+An
+Anoo
+Aojee
+Asum
+Az
+Azeel
+Azinar
+Azjai
+Baar
+Banka
+Bar
+Barnaxi
+Batar
+Batuus
+Beem
+Beshnus
+Betu
+Bex
+Bijot
+Bimee
+Binyaar
+Bosekus
+Brand
+Bun
+Bunach
+Bunish
+Busheeus
+Buujhan
+Chakuk
+Chalish
+Chalureel
+Chath
+Chee
+Cheedal
+Chilwir
+Chitakus
+Chiwish
+Chulz
+Chuna
+Da
+Dakee
+Dan
+Dar
+Darasken
+DarJee
+Debameel
+Deed
+Deegeeta
+Deeh
+Deekonus
+Deekum
+Deekus
+Deerkaza
+Deetum
+Demeepa
+Depasa
+Derkeethus
+Deroh
+Dezanu
+Dreet
+Drumarz
+Dum
+Dunaxith
+Effe
+Ei
+Eidu
+Eius
+Eiuus
+Eix
+Eleedal
+Er
+Esqoo
+Etaku
+Gah
+Gajul
+Gam
+Geeh
+Geel
+Geem
+Geh
+Gei
+Gih
+Gin
+Goh
+Gulum
+Haj
+Han
+Haran
+Hareeya
+Hathei
+Heedul
+Heem
+Hei
+Heir
+Hixeeh
+Huleeya
+Huzei
+Ilas
+Im
+Inee
+Itan
+J'Ram
+Ja
+Jah
+Jaraleet
+Jaree
+Jas
+Jasaiin
+Jaseen
+Jat
+Jee
+Jeela
+Jeelius
+Jeelus
+Jeen
+Jeer
+Jeetum
+Jei
+Jilux
+Jin
+Jon
+Jul
+Julan
+Junal
+Jush
+Juunei
+Kai
+Kajin
+Kamax
+Kas
+Keema
+Keer
+Keerasa
+Kepanuu
+Kia
+Kiameed
+Kilaya
+Kiurz
+Kur
+Kuz
+La
+Lah
+Lai
+Lan
+Lara
+Leem
+Lei
+Loh
+Lotash
+Luh
+Lurz
+Luteema
+Maahi
+Madesi
+Maheelius
+Mahei
+Maht
+Malz
+Marz
+Mathei
+Maxath
+Meej
+Meejapa
+Meensuda
+Meer
+Mema
+Mere
+Metaku
+Miharil
+Milos
+Miun
+Mobareed
+Mohimeem
+Mopakuz
+Motuu
+Mujeen
+Muranatepa
+Mush
+Muz
+Na
+Napetui
+Nazuux
+Nebutil
+Neeti
+Neetinei
+Neetrenaza
+Neetzara
+Neeus
+Nema
+Neposh
+Netapatuu
+Nexith
+Nodeeus
+Nomu
+Nosaleeth
+Nowajeem
+Noyei
+Nulaz
+Nur
+Obaxith
+Okan
+Okaw
+Okeeh
+Oleed
+Oleen
+Olik
+Olink
+Onuja
+Onurai
+Opatieel
+Otumeel
+Owai
+Pachat
+Pacheeva
+Pad
+Paduxi
+Pajeen
+Parash
+Peeradeeh
+Pejureel
+Petaxai
+Pideelus
+Pimaxi
+Pojeel
+Ra
+Radithax
+Raj
+Rareel
+Rasha
+Redieeus
+Ree
+Reeh
+Reemukeeus
+Reenum
+Reesa
+Reet
+Reezal
+Resari
+Riker
+Ru
+Rupah
+Sakeepa
+Sakeeus
+Sakka
+Saliith
+Sar
+Schiavas
+Seek
+Seewul
+Sei
+Sejaijilax
+Shakiis
+Shehs
+Shei
+Silm
+Skee
+Skeetul
+Sureeus
+Ta
+Taeed
+Tah
+Taleel
+Talen
+Tan
+Tanaka
+Tanan
+Tee
+Teeba
+Teegla
+Teeka
+Teekeeus
+Teemeeta
+Teeus
+Tehat
+Tei
+Teinaava
+Teineeja
+Terezeeus
+Tikaasi
+Tim
+Topeeth
+Topith
+Tsleeixth
+Tul
+Tulm
+Tun
+Ukatsei
+Ukawei
+Ula
+Ulawa
+Ullis
+Usha
+Usheeja
+Utadeek
+Utamukeeus
+Utatul
+Uxith
+Vara
+Veekas
+Veenaza
+Veezara
+Vistha
+Vudeelal
+Wanan
+Wanum
+Wayiteh
+Weebam
+Weeltul
+Weer
+Wih
+Wud
+Wuleen
+Wulm
+Wumeek
+Xal
+Xemo
+Yinz
+Yinz'r
+Zaw
+Ze
+Zeen
+Zeeus
Zish
\ No newline at end of file
diff --git a/strings/names/mime.txt b/strings/names/mime.txt
index 094987da9d..989cd6f300 100644
--- a/strings/names/mime.txt
+++ b/strings/names/mime.txt
@@ -1,32 +1,32 @@
-Church Mouse
-Hush Foot
-Invisible Man
-Lemon Mime
-Marcel
-Marcel Mime
-Master-Mime
-Mime
-Mr Beret
-Mr Mime
-Mr Mute
-Mute
-Omerta
-Oui Oui
-Pantomime
-Quiet
-Quiet Riot
-See Through
-Silence
-Silencio
-Silent Knight
-Silent Majority
-Silent Night
-Silent Sorrow
-Silent Step
-Silent Mouse
-The Unspeakable
-Transparency
-Unspeakable
-Untouchable
-Wall Runner
-White Face
+Church Mouse
+Hush Foot
+Invisible Man
+Lemon Mime
+Marcel
+Marcel Mime
+Master-Mime
+Mime
+Mr Beret
+Mr Mime
+Mr Mute
+Mute
+Omerta
+Oui Oui
+Pantomime
+Quiet
+Quiet Riot
+See Through
+Silence
+Silencio
+Silent Knight
+Silent Majority
+Silent Night
+Silent Sorrow
+Silent Step
+Silent Mouse
+The Unspeakable
+Transparency
+Unspeakable
+Untouchable
+Wall Runner
+White Face
diff --git a/strings/names/ninjaname.txt b/strings/names/ninjaname.txt
index fa0d0f1094..eb470493fa 100644
--- a/strings/names/ninjaname.txt
+++ b/strings/names/ninjaname.txt
@@ -1,44 +1,44 @@
-Aria
-Baki
-Blood
-Bro
-Cyrax
-Daemon
-Death
-Donatello
-Eater
-Ermac
-Fox
-Goemon
-Hanzo
-Hayabusa
-Hazuki
-Hero
-Hien
-Hiro
-Hiryu
-Iga
-Koga
-Leonardo
-McAwesome
-McNinja
-Michaelangelo
-Midnight
-Null
-Ogre
-Phantom
-Raiden
-Rain
-Raphael
-Ryu
-Saibot
-Samurai
-Sarutobi
-Scorpion
-Seven
-Shadow
-Shredder
-Smoke
-Splinter
-Throat
+Aria
+Baki
+Blood
+Bro
+Cyrax
+Daemon
+Death
+Donatello
+Eater
+Ermac
+Fox
+Goemon
+Hanzo
+Hayabusa
+Hazuki
+Hero
+Hien
+Hiro
+Hiryu
+Iga
+Koga
+Leonardo
+McAwesome
+McNinja
+Michaelangelo
+Midnight
+Null
+Ogre
+Phantom
+Raiden
+Rain
+Raphael
+Ryu
+Saibot
+Samurai
+Sarutobi
+Scorpion
+Seven
+Shadow
+Shredder
+Smoke
+Splinter
+Throat
Zero
\ No newline at end of file
diff --git a/strings/names/ninjatitle.txt b/strings/names/ninjatitle.txt
index 41c5b338ba..f9776f56fe 100644
--- a/strings/names/ninjatitle.txt
+++ b/strings/names/ninjatitle.txt
@@ -1,46 +1,46 @@
-Agile
-Assassin
-Awesome
-Black
-Crimson
-Cruel
-Deep
-Dr
-Dragon
-Ender
-Grandmaster
-Grappler
-Gray
-Hunter
-Initiate
-Killer
-Liquid
-Master
-Merciful
-Merciless
-Nickel
-Night
-Nightshade
-Ninja
-Noob
-Orphaner
-Quick
-Remorseless
-Rogue
-Sensei
-Shinobi
-Silencing
-Silent
-Silver
-Singing
-Slayer
-Snake
-Solid
-Solidus
-Stalker
-Steel
-Strider
-Striker
-Swift
-Ulimate
+Agile
+Assassin
+Awesome
+Black
+Crimson
+Cruel
+Deep
+Dr
+Dragon
+Ender
+Grandmaster
+Grappler
+Gray
+Hunter
+Initiate
+Killer
+Liquid
+Master
+Merciful
+Merciless
+Nickel
+Night
+Nightshade
+Ninja
+Noob
+Orphaner
+Quick
+Remorseless
+Rogue
+Sensei
+Shinobi
+Silencing
+Silent
+Silver
+Singing
+Slayer
+Snake
+Solid
+Solidus
+Stalker
+Steel
+Strider
+Striker
+Swift
+Ulimate
Widower
\ No newline at end of file
diff --git a/strings/names/plasmaman.txt b/strings/names/plasmaman.txt
index eb5f8b786c..8cbfc00837 100644
--- a/strings/names/plasmaman.txt
+++ b/strings/names/plasmaman.txt
@@ -1,118 +1,118 @@
-Actinium
-Aluminium
-Americium
-Antimony
-Argon
-Arsenic
-Astatine
-Barium
-Berkelium
-Beryllium
-Bismuth
-Bohrium
-Boron
-Bromine
-Cadmium
-Caesium
-Calcium
-Californium
-Carbon
-Cerium
-Chlorine
-Chromium
-Cobalt
-Copernicium
-Copper
-Curium
-Darmstadtium
-Dubnium
-Dysprosium
-Einsteinium
-Erbium
-Europium
-Fermium
-Flerovium
-Fluorine
-Francium
-Gadolinium
-Gallium
-Germanium
-Gold
-Hafnium
-Hassium
-Helium
-Holmium
-Hydrogen
-Indium
-Iodine
-Iridium
-Iron
-Krypton
-Lanthanum
-Lawrencium
-Lead
-Lithium
-Livermorium
-Lutetium
-Magnesium
-Manganese
-Meitnerium
-Mendelevium
-Mercury
-Molybdenum
-Moscovium
-Neodymium
-Neon
-Neptunium
-Nickel
-Nihonium
-Niobium
-Nitrogen
-Nobelium
-Oganesson
-Osmium
-Oxygen
-Palladium
-Phosphorus
-Platinum
-Plutonium
-Polonium
-Potassium
-Praseodymium
-Promethium
-Protactinium
-Radium
-Radon
-Rhenium
-Rhodium
-Roentgenium
-Rubidium
-Ruthenium
-Rutherfordium
-Samarium
-Scandium
-Seaborgium
-Selenium
-Silicon
-Silver
-Sodium
-Strontium
-Sulfur
-Tantalum
-Technetium
-Tellurium
-Tennessine
-Terbium
-Thallium
-Thorium
-Thulium
-Tin
-Titanium
-Tungsten
-Uranium
-Vanadium
-Xenon
-Ytterbium
-Yttrium
-Zinc
+Actinium
+Aluminium
+Americium
+Antimony
+Argon
+Arsenic
+Astatine
+Barium
+Berkelium
+Beryllium
+Bismuth
+Bohrium
+Boron
+Bromine
+Cadmium
+Caesium
+Calcium
+Californium
+Carbon
+Cerium
+Chlorine
+Chromium
+Cobalt
+Copernicium
+Copper
+Curium
+Darmstadtium
+Dubnium
+Dysprosium
+Einsteinium
+Erbium
+Europium
+Fermium
+Flerovium
+Fluorine
+Francium
+Gadolinium
+Gallium
+Germanium
+Gold
+Hafnium
+Hassium
+Helium
+Holmium
+Hydrogen
+Indium
+Iodine
+Iridium
+Iron
+Krypton
+Lanthanum
+Lawrencium
+Lead
+Lithium
+Livermorium
+Lutetium
+Magnesium
+Manganese
+Meitnerium
+Mendelevium
+Mercury
+Molybdenum
+Moscovium
+Neodymium
+Neon
+Neptunium
+Nickel
+Nihonium
+Niobium
+Nitrogen
+Nobelium
+Oganesson
+Osmium
+Oxygen
+Palladium
+Phosphorus
+Platinum
+Plutonium
+Polonium
+Potassium
+Praseodymium
+Promethium
+Protactinium
+Radium
+Radon
+Rhenium
+Rhodium
+Roentgenium
+Rubidium
+Ruthenium
+Rutherfordium
+Samarium
+Scandium
+Seaborgium
+Selenium
+Silicon
+Silver
+Sodium
+Strontium
+Sulfur
+Tantalum
+Technetium
+Tellurium
+Tennessine
+Terbium
+Thallium
+Thorium
+Thulium
+Tin
+Titanium
+Tungsten
+Uranium
+Vanadium
+Xenon
+Ytterbium
+Yttrium
+Zinc
Zirconium
\ No newline at end of file
diff --git a/strings/names/posibrain.txt b/strings/names/posibrain.txt
index 119632bd81..ed8a186fd4 100644
--- a/strings/names/posibrain.txt
+++ b/strings/names/posibrain.txt
@@ -1,47 +1,47 @@
-PBU
-HIU
-SINA
-ARMA
-OSI
-HBL
-MSO
-RR
-CHRI
-CDB
-HG
-XSI
-ORNG
-GUN
-KOR
-MET
-FRE
-XIS
-SLI
-PKP
-HOG
-RZH
-GOOF
-MRPR
-JJR
-FIRC
-INC
-PHL
-BGB
-ANTR
-MIW
-WJ
-JRD
-CHOC
-ANCL
-JLLO
-JNLG
-KOS
-TKRG
-XAL
-STLP
-CBOS
-DUNC
-FXMC
-DRSD
-COI
+PBU
+HIU
+SINA
+ARMA
+OSI
+HBL
+MSO
+RR
+CHRI
+CDB
+HG
+XSI
+ORNG
+GUN
+KOR
+MET
+FRE
+XIS
+SLI
+PKP
+HOG
+RZH
+GOOF
+MRPR
+JJR
+FIRC
+INC
+PHL
+BGB
+ANTR
+MIW
+WJ
+JRD
+CHOC
+ANCL
+JLLO
+JNLG
+KOS
+TKRG
+XAL
+STLP
+CBOS
+DUNC
+FXMC
+DRSD
+COI
CYBR
\ No newline at end of file
diff --git a/strings/names/verbs.txt b/strings/names/verbs.txt
index 17bc127fd5..fc90f89e40 100644
--- a/strings/names/verbs.txt
+++ b/strings/names/verbs.txt
@@ -1,632 +1,632 @@
-accept
-add
-admire
-admit
-advise
-afford
-agree
-alert
-allow
-amuse
-analyse
-announce
-annoy
-answer
-apologise
-appear
-applaud
-appreciate
-approve
-argue
-arrange
-arrest
-arrive
-ask
-attach
-attack
-attempt
-attend
-attract
-avoid
-back
-bake
-balance
-ban
-bang
-bare
-bat
-bathe
-battle
-beam
-beg
-behave
-belong
-bleach
-bless
-blind
-blink
-blot
-blush
-boast
-boil
-bolt
-bomb
-book
-bore
-borrow
-bounce
-bow
-box
-brake
-branch
-breathe
-bruise
-brush
-bubble
-bump
-burn
-bury
-buzz
-calculate
-call
-camp
-care
-carry
-carve
-cause
-challenge
-change
-charge
-chase
-cheat
-check
-cheer
-chew
-choke
-chop
-claim
-clap
-clean
-clear
-clip
-close
-coach
-coil
-collect
-colour
-comb
-command
-communicate
-compare
-compete
-complain
-complete
-concentrate
-concern
-confess
-confuse
-connect
-consider
-consist
-contain
-continue
-copy
-correct
-cough
-count
-cover
-crack
-crash
-crawl
-cross
-crush
-cry
-cure
-curl
-curve
-cycle
-dam
-damage
-dance
-dare
-decay
-deceive
-decide
-decorate
-delay
-delight
-deliver
-depend
-describe
-desert
-deserve
-destroy
-detect
-develop
-disagree
-disappear
-disapprove
-disarm
-discover
-dislike
-divide
-double
-doubt
-drag
-drain
-dream
-dress
-drip
-drop
-drown
-drum
-dry
-dust
-earn
-educate
-embarrass
-employ
-empty
-encourage
-end
-enjoy
-enter
-entertain
-escape
-examine
-excite
-excuse
-exercise
-exist
-expand
-expect
-explain
-explode
-extend
-face
-fade
-fail
-fancy
-fasten
-fax
-fear
-fence
-fetch
-file
-fill
-film
-fire
-fit
-fix
-flap
-flash
-float
-flood
-flow
-flower
-fold
-follow
-fool
-force
-form
-found
-frame
-frighten
-fry
-gather
-gaze
-glow
-glue
-grab
-grate
-grease
-greet
-grin
-grip
-groan
-guarantee
-guard
-guess
-guide
-hammer
-hand
-handle
-hang
-happen
-harass
-harm
-hate
-haunt
-head
-heal
-heap
-heat
-help
-hook
-hop
-hope
-hover
-hug
-hum
-hunt
-hurry
-identify
-ignore
-imagine
-impress
-improve
-include
-increase
-influence
-inform
-inject
-injure
-instruct
-intend
-interest
-interfere
-interrupt
-introduce
-invent
-invite
-irritate
-itch
-jail
-jam
-jog
-join
-joke
-judge
-juggle
-jump
-kick
-kill
-kiss
-kneel
-knit
-knock
-knot
-label
-land
-last
-laugh
-launch
-learn
-level
-license
-lick
-lie
-lighten
-like
-list
-listen
-live
-load
-lock
-long
-look
-love
-man
-manage
-march
-mark
-marry
-match
-mate
-matter
-measure
-meddle
-melt
-memorise
-mend
-messup
-milk
-mine
-miss
-mix
-moan
-moor
-mourn
-move
-muddle
-mug
-multiply
-murder
-nail
-name
-need
-nest
-nod
-note
-notice
-number
-obey
-object
-observe
-obtain
-occur
-offend
-offer
-open
-order
-overflow
-owe
-own
-pack
-paddle
-paint
-park
-part
-pass
-paste
-pat
-pause
-peck
-pedal
-peel
-peep
-perform
-permit
-phone
-pick
-pinch
-pine
-place
-plan
-plant
-play
-please
-plug
-point
-poke
-polish
-pop
-possess
-post
-pour
-practise
-pray
-preach
-precede
-prefer
-prepare
-present
-preserve
-press
-pretend
-prevent
-prick
-print
-produce
-program
-promise
-protect
-provide
-pull
-pump
-punch
-puncture
-punish
-push
-question
-queue
-race
-radiate
-rain
-raise
-reach
-realise
-receive
-recognise
-record
-reduce
-reflect
-refuse
-regret
-reign
-reject
-rejoice
-relax
-release
-rely
-remain
-remember
-remind
-remove
-repair
-repeat
-replace
-reply
-report
-reproduce
-request
-rescue
-retire
-return
-rhyme
-rinse
-risk
-rob
-rock
-roll
-rot
-rub
-ruin
-rule
-rush
-sack
-sail
-satisfy
-save
-saw
-scare
-scatter
-scold
-scorch
-scrape
-scratch
-scream
-screw
-scribble
-scrub
-seal
-search
-separate
-serve
-settle
-shade
-share
-shave
-shelter
-shiver
-shock
-shop
-shrug
-sigh
-sign
-signal
-sin
-sip
-ski
-skip
-slap
-slip
-slow
-smash
-smell
-smile
-smoke
-snatch
-sneeze
-sniff
-snore
-snow
-soak
-soothe
-sound
-spare
-spark
-sparkle
-spell
-spill
-spoil
-spot
-spray
-sprout
-squash
-squeak
-squeal
-squeeze
-stain
-stamp
-stare
-start
-stay
-steer
-step
-stir
-stitch
-stop
-store
-strap
-strengthen
-stretch
-strip
-stroke
-stuff
-subtract
-succeed
-suck
-suffer
-suggest
-suit
-supply
-support
-suppose
-surprise
-surround
-suspect
-suspend
-switch
-talk
-tame
-tap
-taste
-tease
-telephone
-tempt
-terrify
-test
-thank
-thaw
-tick
-tickle
-tie
-time
-tip
-tire
-touch
-tour
-tow
-trace
-trade
-train
-transport
-trap
-travel
-treat
-tremble
-trick
-trip
-trot
-trouble
-trust
-try
-tug
-tumble
-turn
-twist
-type
-undress
-unfasten
-unite
-unlock
-unpack
-untidy
-use
-vanish
-visit
-wail
-wait
-walk
-wander
-want
-warm
-warn
-wash
-waste
-watch
-water
-wave
-weigh
-welcome
-whine
-whip
-whirl
-whisper
-whistle
-wink
-wipe
-wish
-wobble
-wonder
-work
-worry
-wrap
-wreck
-wrestle
-wriggle
-yawn
-yell
-zip
+accept
+add
+admire
+admit
+advise
+afford
+agree
+alert
+allow
+amuse
+analyse
+announce
+annoy
+answer
+apologise
+appear
+applaud
+appreciate
+approve
+argue
+arrange
+arrest
+arrive
+ask
+attach
+attack
+attempt
+attend
+attract
+avoid
+back
+bake
+balance
+ban
+bang
+bare
+bat
+bathe
+battle
+beam
+beg
+behave
+belong
+bleach
+bless
+blind
+blink
+blot
+blush
+boast
+boil
+bolt
+bomb
+book
+bore
+borrow
+bounce
+bow
+box
+brake
+branch
+breathe
+bruise
+brush
+bubble
+bump
+burn
+bury
+buzz
+calculate
+call
+camp
+care
+carry
+carve
+cause
+challenge
+change
+charge
+chase
+cheat
+check
+cheer
+chew
+choke
+chop
+claim
+clap
+clean
+clear
+clip
+close
+coach
+coil
+collect
+colour
+comb
+command
+communicate
+compare
+compete
+complain
+complete
+concentrate
+concern
+confess
+confuse
+connect
+consider
+consist
+contain
+continue
+copy
+correct
+cough
+count
+cover
+crack
+crash
+crawl
+cross
+crush
+cry
+cure
+curl
+curve
+cycle
+dam
+damage
+dance
+dare
+decay
+deceive
+decide
+decorate
+delay
+delight
+deliver
+depend
+describe
+desert
+deserve
+destroy
+detect
+develop
+disagree
+disappear
+disapprove
+disarm
+discover
+dislike
+divide
+double
+doubt
+drag
+drain
+dream
+dress
+drip
+drop
+drown
+drum
+dry
+dust
+earn
+educate
+embarrass
+employ
+empty
+encourage
+end
+enjoy
+enter
+entertain
+escape
+examine
+excite
+excuse
+exercise
+exist
+expand
+expect
+explain
+explode
+extend
+face
+fade
+fail
+fancy
+fasten
+fax
+fear
+fence
+fetch
+file
+fill
+film
+fire
+fit
+fix
+flap
+flash
+float
+flood
+flow
+flower
+fold
+follow
+fool
+force
+form
+found
+frame
+frighten
+fry
+gather
+gaze
+glow
+glue
+grab
+grate
+grease
+greet
+grin
+grip
+groan
+guarantee
+guard
+guess
+guide
+hammer
+hand
+handle
+hang
+happen
+harass
+harm
+hate
+haunt
+head
+heal
+heap
+heat
+help
+hook
+hop
+hope
+hover
+hug
+hum
+hunt
+hurry
+identify
+ignore
+imagine
+impress
+improve
+include
+increase
+influence
+inform
+inject
+injure
+instruct
+intend
+interest
+interfere
+interrupt
+introduce
+invent
+invite
+irritate
+itch
+jail
+jam
+jog
+join
+joke
+judge
+juggle
+jump
+kick
+kill
+kiss
+kneel
+knit
+knock
+knot
+label
+land
+last
+laugh
+launch
+learn
+level
+license
+lick
+lie
+lighten
+like
+list
+listen
+live
+load
+lock
+long
+look
+love
+man
+manage
+march
+mark
+marry
+match
+mate
+matter
+measure
+meddle
+melt
+memorise
+mend
+messup
+milk
+mine
+miss
+mix
+moan
+moor
+mourn
+move
+muddle
+mug
+multiply
+murder
+nail
+name
+need
+nest
+nod
+note
+notice
+number
+obey
+object
+observe
+obtain
+occur
+offend
+offer
+open
+order
+overflow
+owe
+own
+pack
+paddle
+paint
+park
+part
+pass
+paste
+pat
+pause
+peck
+pedal
+peel
+peep
+perform
+permit
+phone
+pick
+pinch
+pine
+place
+plan
+plant
+play
+please
+plug
+point
+poke
+polish
+pop
+possess
+post
+pour
+practise
+pray
+preach
+precede
+prefer
+prepare
+present
+preserve
+press
+pretend
+prevent
+prick
+print
+produce
+program
+promise
+protect
+provide
+pull
+pump
+punch
+puncture
+punish
+push
+question
+queue
+race
+radiate
+rain
+raise
+reach
+realise
+receive
+recognise
+record
+reduce
+reflect
+refuse
+regret
+reign
+reject
+rejoice
+relax
+release
+rely
+remain
+remember
+remind
+remove
+repair
+repeat
+replace
+reply
+report
+reproduce
+request
+rescue
+retire
+return
+rhyme
+rinse
+risk
+rob
+rock
+roll
+rot
+rub
+ruin
+rule
+rush
+sack
+sail
+satisfy
+save
+saw
+scare
+scatter
+scold
+scorch
+scrape
+scratch
+scream
+screw
+scribble
+scrub
+seal
+search
+separate
+serve
+settle
+shade
+share
+shave
+shelter
+shiver
+shock
+shop
+shrug
+sigh
+sign
+signal
+sin
+sip
+ski
+skip
+slap
+slip
+slow
+smash
+smell
+smile
+smoke
+snatch
+sneeze
+sniff
+snore
+snow
+soak
+soothe
+sound
+spare
+spark
+sparkle
+spell
+spill
+spoil
+spot
+spray
+sprout
+squash
+squeak
+squeal
+squeeze
+stain
+stamp
+stare
+start
+stay
+steer
+step
+stir
+stitch
+stop
+store
+strap
+strengthen
+stretch
+strip
+stroke
+stuff
+subtract
+succeed
+suck
+suffer
+suggest
+suit
+supply
+support
+suppose
+surprise
+surround
+suspect
+suspend
+switch
+talk
+tame
+tap
+taste
+tease
+telephone
+tempt
+terrify
+test
+thank
+thaw
+tick
+tickle
+tie
+time
+tip
+tire
+touch
+tour
+tow
+trace
+trade
+train
+transport
+trap
+travel
+treat
+tremble
+trick
+trip
+trot
+trouble
+trust
+try
+tug
+tumble
+turn
+twist
+type
+undress
+unfasten
+unite
+unlock
+unpack
+untidy
+use
+vanish
+visit
+wail
+wait
+walk
+wander
+want
+warm
+warn
+wash
+waste
+watch
+water
+wave
+weigh
+welcome
+whine
+whip
+whirl
+whisper
+whistle
+wink
+wipe
+wish
+wobble
+wonder
+work
+worry
+wrap
+wreck
+wrestle
+wriggle
+yawn
+yell
+zip
zoom
\ No newline at end of file
diff --git a/strings/names/wizardfirst.txt b/strings/names/wizardfirst.txt
index f1e9a10a58..13dc68c6bd 100644
--- a/strings/names/wizardfirst.txt
+++ b/strings/names/wizardfirst.txt
@@ -1,37 +1,37 @@
-Alatar
-Archchancellor
-Boccob
-Circe
-Dumbledor
-Elminister
-Gandalf
-Grimm
-Gulstaff
-Houdini
-Jim
-Kaschei
-Khelben
-Kreol
-Lina
-Merlin
-Mogan
-Mordenkainen
-Morgan
-Mystryl
-Nihilus
-Palando
-Prospero
-Radagast
-Raistlin
-Rasputin
-Rincewind
-Saruman
-Tenser
-Terefi
-Tzeentch
-Urza
-Vaarsuvius
-Vecna
-Yoda
-Zagyg
+Alatar
+Archchancellor
+Boccob
+Circe
+Dumbledor
+Elminister
+Gandalf
+Grimm
+Gulstaff
+Houdini
+Jim
+Kaschei
+Khelben
+Kreol
+Lina
+Merlin
+Mogan
+Mordenkainen
+Morgan
+Mystryl
+Nihilus
+Palando
+Prospero
+Radagast
+Raistlin
+Rasputin
+Rincewind
+Saruman
+Tenser
+Terefi
+Tzeentch
+Urza
+Vaarsuvius
+Vecna
+Yoda
+Zagyg
Zul
\ No newline at end of file
diff --git a/strings/names/wizardsecond.txt b/strings/names/wizardsecond.txt
index dd191cfa2b..6daff0f3e7 100644
--- a/strings/names/wizardsecond.txt
+++ b/strings/names/wizardsecond.txt
@@ -1,40 +1,40 @@
-Dark
-Darkmagic
-Darko
-Gray
-Honko
-Inverse
-le Fay
-of Void
-Shado
-Smith
-the All Knowing
-the Amazing
-the Bandit Killer
-the Benevolent
-the Blue
-the Brown
-the Conquerer
-the Deathless
-the Destroyer
-the Dragon Spooker
-the Emperor
-the Gray
-the Great
-the Magician
-the Powerful
-the Raven
-the Red
-the Remorseful
-the Seething
-the Sorcelator
-the Spiral King
-the Unending
-the Unstoppable
-the Weeping
-the White
-the Wise
-the Wizzard
-Unseen
-Weatherwax
+Dark
+Darkmagic
+Darko
+Gray
+Honko
+Inverse
+le Fay
+of Void
+Shado
+Smith
+the All Knowing
+the Amazing
+the Bandit Killer
+the Benevolent
+the Blue
+the Brown
+the Conquerer
+the Deathless
+the Destroyer
+the Dragon Spooker
+the Emperor
+the Gray
+the Great
+the Magician
+the Powerful
+the Raven
+the Red
+the Remorseful
+the Seething
+the Sorcelator
+the Spiral King
+the Unending
+the Unstoppable
+the Weeping
+the White
+the Wise
+the Wizzard
+Unseen
+Weatherwax
Yagg
\ No newline at end of file
diff --git a/tools/CreditsTool/remappings.txt b/tools/CreditsTool/remappings.txt
index ac57d4b873..18abb0a772 100644
--- a/tools/CreditsTool/remappings.txt
+++ b/tools/CreditsTool/remappings.txt
@@ -1,20 +1,20 @@
-# To make your name something other than your github name type it in the format "
-# e.g.
-# Cyberboss Jordan Brown
-# To suppress your name from appearing in the credits do " __REMOVE__
-# e.g.
-# Cyberboss __REMOVE__
-
-tgstation-server Thanks for playing!
-
-optimumtact oranges
-qustinnus Floyd / Qustinnus
-catalystfd __REMOVE__
-TheVekter Vekter
-ChangelingRain Joan
-NewSta1 NewSta
-theOperand Miauw
-PraiseRatvar Frozenguy5
-FuryMcFlurry Fury McFlurry
-vuonojenmustaturska Naksu
-praisenarsie Frozenguy5
+# To make your name something other than your github name type it in the format "
+# e.g.
+# Cyberboss Jordan Brown
+# To suppress your name from appearing in the credits do " __REMOVE__
+# e.g.
+# Cyberboss __REMOVE__
+
+tgstation-server Thanks for playing!
+
+optimumtact oranges
+qustinnus Floyd / Qustinnus
+catalystfd __REMOVE__
+TheVekter Vekter
+ChangelingRain Joan
+NewSta1 NewSta
+theOperand Miauw
+PraiseRatvar Frozenguy5
+FuryMcFlurry Fury McFlurry
+vuonojenmustaturska Naksu
+praisenarsie Frozenguy5
diff --git a/tools/Runtime Condenser/Main.cpp b/tools/Runtime Condenser/Main.cpp
index 0161bb47a9..239ded0add 100644
--- a/tools/Runtime Condenser/Main.cpp
+++ b/tools/Runtime Condenser/Main.cpp
@@ -1,418 +1,418 @@
-/* Runtime Condenser by Nodrak
- * Cleaned up and refactored by MrStonedOne
- * This will sum up identical runtimes into one, giving a total of how many times it occured. The first occurance
- * of the runtime will log the source, usr and src, the rest will just add to the total. Infinite loops will
- * also be caught and displayed (if any) above the list of runtimes.
- *
- * How to use:
- * 1) Copy and paste your list of runtimes from Dream Daemon into input.exe
- * 2) Run RuntimeCondenser.exe
- * 3) Open output.txt for a condensed report of the runtimes
- *
- * How to compile:
- * Requires visual c++ compiler 2012 or any linux compiler with c++11 support.
- * Windows:
- * Normal: cl.exe /EHsc /Ox /Qpar Main.cpp
- * Debug: cl.exe /EHsc /Zi Main.cpp
- * Linux:
- * Normal: g++ -O3 -std=c++11 Main.cpp -o rc
- * Debug: g++ -g -Og -std=c++11 Main.cpp -o rc
- * Any Compile errors most likely indicate lack of c++11 support. Google how to upgrade or nag coderbus for help..
- */
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-
-#define PROGRESS_FPS 10
-#define PROGRESS_BAR_INNER_WIDTH 50
-#define LINEBUFFER (32*1024) //32KiB
-
-using namespace std;
-
-struct runtime {
- string text;
- string proc;
- string source;
- string usr;
- string src;
- string loc;
- unsigned int count;
-};
-struct harddel {
- string type;
- unsigned int count;
-};
-//What we use to read input
-string * lastLine = new string();
-string * currentLine = new string();
-string * nextLine = new string();
-
-//Stores lines we want to keep to print out
-unordered_map storedRuntime;
-unordered_map storedInfiniteLoop;
-unordered_map storedHardDel;
-
-//Stat tracking stuff for output
-unsigned int totalRuntimes = 0;
-unsigned int totalInfiniteLoops = 0;
-unsigned int totalHardDels = 0;
-
-
-bool endofbuffer = false;
-//like substr, but returns an empty string if the string is smaller then start, rather then an exception.
-inline string safe_substr(string * S, size_t start = 0, size_t end = string::npos) {
- if (start > S->length())
- start = S->length();
- return S->substr(start, end);
-}
-//getline() is slow as fucking balls. this is quicker because we prefill a buffer rather then read 1 byte at a time searching for newlines, lowering on i/o calls and overhead. (110MB/s vs 40MB/s on a 1.8GB file pre-filled into the disk cache)
-//if i wanted to make it even faster, I'd use a reading thread, a new line searching thread, another thread or four for searching for runtimes in the list to see if they are unique, and finally the main thread for displaying the progress bar. but fuck that noise.
-inline string * readline(FILE * f) {
- static char buf[LINEBUFFER];
- static size_t pos = 0;
- static size_t size = 0;
-
- for (size_t i = pos; i < LINEBUFFER; i++) {
- char c = buf[i];
- if (i >= size && (pos || i < LINEBUFFER-1)) {
- if (feof(f) || ferror(f))
- break;
- if (size && pos) { //move current stuff to start of buffer
- size -= pos;
- i -= pos;
- memmove(buf, &buf[pos], size);
- }
- //fill remaining buffer
- size += fread(&buf[i], 1, LINEBUFFER-size-1, f);
- pos = 0;
- c = buf[i];
- }
- if (c == '\n') {
- //trim off any newlines from the start
- while (i > pos && (buf[pos] == '\r' || buf[pos] == '\n'))
- pos++;
- string * s = new string(&buf[pos], i-pos);
- pos = i+1;
- return s;
- }
-
- }
- string * s = new string(&buf[pos], size-pos);
- pos = 0;
- size = 0;
- endofbuffer = true;
- return s;
-}
-
-inline void forward_progress(FILE * inputFile) {
- delete(lastLine);
- lastLine = currentLine;
- currentLine = nextLine;
- nextLine = readline(inputFile);
- //strip out any timestamps.
- if (nextLine->length() >= 10) {
- if ((*nextLine)[0] == '[' && (*nextLine)[3] == ':' && (*nextLine)[6] == ':' && (*nextLine)[9] == ']')
- nextLine->erase(0, 10);
- else if (nextLine->length() >= 26 && ((*nextLine)[0] == '[' && (*nextLine)[5] == '-' && (*nextLine)[14] == ':' && (*nextLine)[20] == '.' && (*nextLine)[24] == ']'))
- nextLine->erase(0, 26);
- }
-}
-//deallocates to, copys from to to.
-inline void string_send(string * &from, string * &to) {
- delete(to);
- to = new string(*from);
-}
-inline void printprogressbar(unsigned short progress /*as percent*/) {
- double const modifer = 100.0L/(double)PROGRESS_BAR_INNER_WIDTH;
- size_t bars = (double)progress/modifer;
- cerr << "\r[" << string(bars, '=') << ((progress < 100) ? ">" : "") << string(PROGRESS_BAR_INNER_WIDTH-(bars+((progress < 100) ? 1 : 0)), ' ') << "] " << progress << "%";
- cerr.flush();
-}
-
-bool readFromFile(bool isstdin) {
- //Open file to read
- FILE * inputFile = stdin;
- if (!isstdin)
- inputFile = fopen("Input.txt", "r");
-
- if (ferror(inputFile))
- return false;
- long long fileLength = 0;
- clock_t nextupdate = 0;
- if (!isstdin) {
- fseek(inputFile, 0, SEEK_END);
- fileLength = ftell(inputFile);
- fseek(inputFile, 0, SEEK_SET);
- nextupdate = clock();
- }
-
- if (feof(inputFile))
- return false; //empty file
- do {
- //Update our lines
- forward_progress(inputFile);
- //progress bar
-
- if (!isstdin && clock() >= nextupdate) {
- int dProgress = (int)(((long double)ftell(inputFile) / (long double)fileLength) * 100.0L);
- printprogressbar(dProgress);
- nextupdate = clock() + (CLOCKS_PER_SEC/PROGRESS_FPS);
- }
- //Found a runtime!
- if (safe_substr(currentLine, 0, 14) == "runtime error:") {
- if (currentLine->length() <= 17) { //empty runtime, check next line.
- //runtime is on the line before this one. (byond bug)
- if (nextLine->length() < 2) {
- string_send(lastLine, nextLine);
- }
- forward_progress(inputFile);
- string * tmp = new string("runtime error: " + *currentLine);
- string_send(tmp, currentLine);
- delete(tmp);
- }
- //we assign this to the right container in a moment.
- unordered_map * storage_container;
-
- //runtime is actually an infinite loop
- if (safe_substr(currentLine, 15, 23) == "Infinite loop suspected" || safe_substr(currentLine, 15, 31) == "Maximum recursion level reached") {
- //use our infinite loop container.
- storage_container = &storedInfiniteLoop;
- totalInfiniteLoops++;
- // skip the line about world.loop_checks
- forward_progress(inputFile);
- string_send(lastLine, currentLine);
- } else {
- //use the runtime container
- storage_container = &storedRuntime;
- totalRuntimes++;
- }
-
- string key = *currentLine;
- bool procfound = false; //so other things don't have to bother checking for this again.
- if (safe_substr(nextLine, 0, 10) == "proc name:") {
- key += *nextLine;
- procfound = true;
- }
-
- //(get the address of a runtime from (a pointer to a container of runtimes)) to then store in a pointer to a runtime.
- //(and who said pointers were hard.)
- runtime* R = &((*storage_container)[key]);
-
- //new
- if (R->text != *currentLine) {
- R->text = *currentLine;
- if (procfound) {
- R->proc = *nextLine;
- forward_progress(inputFile);
- }
- R->count = 1;
-
- //search for source file info
- if (safe_substr(nextLine, 2, 12) == "source file:") {
- R->source = *nextLine;
- //skip again
- forward_progress(inputFile);
- }
- //If we find this, we have new stuff to store
- if (safe_substr(nextLine, 2, 4) == "usr:") {
- forward_progress(inputFile);
- forward_progress(inputFile);
- //Store more info
- R->usr = *lastLine;
- R->src = *currentLine;
- if (safe_substr(nextLine, 2, 8) == "src.loc:") {
- R->loc = *nextLine;
- forward_progress(inputFile);
- }
- }
-
- } else { //existed already
- R->count++;
- if (procfound)
- forward_progress(inputFile);
- }
-
- } else if (safe_substr(currentLine, 0, 7) == "Path : ") {
- string deltype = safe_substr(currentLine, 7);
- if (deltype.substr(deltype.size()-1,1) == " ") //some times they have a single trailing space.
- deltype = deltype.substr(0, deltype.size()-1);
-
- unsigned int failures = strtoul(safe_substr(nextLine, 11).c_str(), NULL, 10);
- if (failures <= 0)
- continue;
-
- totalHardDels += failures;
- harddel* D = &storedHardDel[deltype];
- if (D->type != deltype) {
- D->type = deltype;
- D->count = failures;
- } else {
- D->count += failures;
- }
- }
- } while (!feof(inputFile) || !endofbuffer); //Until end of file
- if (!isstdin)
- printprogressbar(100);
- cerr << endl;
- return true;
-}
-
-bool runtimeComp(const runtime &a, const runtime &b) {
- return a.count > b.count;
-}
-
-bool hardDelComp(const harddel &a, const harddel &b) {
- return a.count > b.count;
-}
-
-bool writeToFile(bool usestdio) {
- //Open and clear the file
- ostream * output = &cout;
- ofstream * outputFile;
- if (!usestdio)
- output = outputFile = new ofstream("Output.txt", ios::trunc);
-
-
- if(usestdio || outputFile->is_open()) {
- *output << "Note: The source file, src and usr are all from the FIRST of the identical runtimes. Everything else is cropped.\n\n";
- if(storedInfiniteLoop.size() > 0)
- *output << "Total unique infinite loops: " << storedInfiniteLoop.size() << endl;
-
- if(totalInfiniteLoops > 0)
- *output << "Total infinite loops: " << totalInfiniteLoops << endl << endl;
-
- *output << "Total unique runtimes: " << storedRuntime.size() << endl;
- *output << "Total runtimes: " << totalRuntimes << endl << endl;
- if(storedHardDel.size() > 0)
- *output << "Total unique hard deletions: " << storedHardDel.size() << endl;
-
- if(totalHardDels > 0)
- *output << "Total hard deletions: " << totalHardDels << endl << endl;
-
-
- //If we have infinite loops, display them first.
- if(storedInfiniteLoop.size() > 0) {
- vector infiniteLoops;
- infiniteLoops.reserve(storedInfiniteLoop.size());
- for (unordered_map::iterator it=storedInfiniteLoop.begin(); it != storedInfiniteLoop.end(); it++)
- infiniteLoops.push_back(it->second);
- storedInfiniteLoop.clear();
- sort(infiniteLoops.begin(), infiniteLoops.end(), runtimeComp);
- *output << "** Infinite loops **";
- for (int i=0; i < infiniteLoops.size(); i++) {
- runtime* R = &infiniteLoops[i];
- *output << endl << endl << "The following infinite loop has occurred " << R->count << " time(s).\n";
- *output << R->text << endl;
- if(R->proc.length())
- *output << R->proc << endl;
- if(R->source.length())
- *output << R->source << endl;
- if(R->usr.length())
- *output << R->usr << endl;
- if(R->src.length())
- *output << R->src << endl;
- if(R->loc.length())
- *output << R->loc << endl;
- }
- *output << endl << endl; //For spacing
- }
-
-
- //Do runtimes next
- *output << "** Runtimes **";
- vector runtimes;
- runtimes.reserve(storedRuntime.size());
- for (unordered_map::iterator it=storedRuntime.begin(); it != storedRuntime.end(); it++)
- runtimes.push_back(it->second);
- storedRuntime.clear();
- sort(runtimes.begin(), runtimes.end(), runtimeComp);
- for (int i=0; i < runtimes.size(); i++) {
- runtime* R = &runtimes[i];
- *output << endl << endl << "The following runtime has occurred " << R->count << " time(s).\n";
- *output << R->text << endl;
- if(R->proc.length())
- *output << R->proc << endl;
- if(R->source.length())
- *output << R->source << endl;
- if(R->usr.length())
- *output << R->usr << endl;
- if(R->src.length())
- *output << R->src << endl;
- if(R->loc.length())
- *output << R->loc << endl;
- }
- *output << endl << endl; //For spacing
-
- //and finally, hard deletes
- if(totalHardDels > 0) {
- *output << endl << "** Hard deletions **";
- vector hardDels;
- hardDels.reserve(storedHardDel.size());
- for (unordered_map::iterator it=storedHardDel.begin(); it != storedHardDel.end(); it++)
- hardDels.push_back(it->second);
- storedHardDel.clear();
- sort(hardDels.begin(), hardDels.end(), hardDelComp);
- for(int i=0; i < hardDels.size(); i++) {
- harddel* D = &hardDels[i];
- *output << endl << D->type << " - " << D->count << " time(s).\n";
- }
- }
- if (!usestdio) {
- outputFile->close();
- delete outputFile;
- }
- } else {
- return false;
- }
- return true;
-}
-
-int main(int argc, const char * argv[]) {
- ios_base::sync_with_stdio(false);
- ios::sync_with_stdio(false);
- bool usestdio = false;
- if (argc >= 2 && !strcmp(argv[1], "-s"))
- usestdio = true;
-
- char exit; //Used to stop the program from immediately exiting
- cerr << "Reading input.\n";
- if(readFromFile(usestdio)) {
- cerr << "Input read successfully!\n";
- } else {
- cerr << "Input failed to open, shutting down.\n";
- if (!usestdio) {
- cerr << "\nEnter any letter to quit.\n";
- exit = cin.get();
- }
- return 1;
- }
-
-
- cerr << "Writing output.\n";
- if(writeToFile(usestdio)) {
- cerr << "Output was successful!\n";
- if (!usestdio) {
- cerr << "\nEnter any letter to quit.\n";
- exit = cin.get();
- }
- return 0;
- } else {
- cerr << "The output file could not be opened, shutting down.\n";
- if (!usestdio) {
- cerr << "\nEnter any letter to quit.\n";
- exit = cin.get();
- }
- return 1;
- }
-
- return 0;
-}
+/* Runtime Condenser by Nodrak
+ * Cleaned up and refactored by MrStonedOne
+ * This will sum up identical runtimes into one, giving a total of how many times it occured. The first occurance
+ * of the runtime will log the source, usr and src, the rest will just add to the total. Infinite loops will
+ * also be caught and displayed (if any) above the list of runtimes.
+ *
+ * How to use:
+ * 1) Copy and paste your list of runtimes from Dream Daemon into input.exe
+ * 2) Run RuntimeCondenser.exe
+ * 3) Open output.txt for a condensed report of the runtimes
+ *
+ * How to compile:
+ * Requires visual c++ compiler 2012 or any linux compiler with c++11 support.
+ * Windows:
+ * Normal: cl.exe /EHsc /Ox /Qpar Main.cpp
+ * Debug: cl.exe /EHsc /Zi Main.cpp
+ * Linux:
+ * Normal: g++ -O3 -std=c++11 Main.cpp -o rc
+ * Debug: g++ -g -Og -std=c++11 Main.cpp -o rc
+ * Any Compile errors most likely indicate lack of c++11 support. Google how to upgrade or nag coderbus for help..
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+
+#define PROGRESS_FPS 10
+#define PROGRESS_BAR_INNER_WIDTH 50
+#define LINEBUFFER (32*1024) //32KiB
+
+using namespace std;
+
+struct runtime {
+ string text;
+ string proc;
+ string source;
+ string usr;
+ string src;
+ string loc;
+ unsigned int count;
+};
+struct harddel {
+ string type;
+ unsigned int count;
+};
+//What we use to read input
+string * lastLine = new string();
+string * currentLine = new string();
+string * nextLine = new string();
+
+//Stores lines we want to keep to print out
+unordered_map storedRuntime;
+unordered_map storedInfiniteLoop;
+unordered_map storedHardDel;
+
+//Stat tracking stuff for output
+unsigned int totalRuntimes = 0;
+unsigned int totalInfiniteLoops = 0;
+unsigned int totalHardDels = 0;
+
+
+bool endofbuffer = false;
+//like substr, but returns an empty string if the string is smaller then start, rather then an exception.
+inline string safe_substr(string * S, size_t start = 0, size_t end = string::npos) {
+ if (start > S->length())
+ start = S->length();
+ return S->substr(start, end);
+}
+//getline() is slow as fucking balls. this is quicker because we prefill a buffer rather then read 1 byte at a time searching for newlines, lowering on i/o calls and overhead. (110MB/s vs 40MB/s on a 1.8GB file pre-filled into the disk cache)
+//if i wanted to make it even faster, I'd use a reading thread, a new line searching thread, another thread or four for searching for runtimes in the list to see if they are unique, and finally the main thread for displaying the progress bar. but fuck that noise.
+inline string * readline(FILE * f) {
+ static char buf[LINEBUFFER];
+ static size_t pos = 0;
+ static size_t size = 0;
+
+ for (size_t i = pos; i < LINEBUFFER; i++) {
+ char c = buf[i];
+ if (i >= size && (pos || i < LINEBUFFER-1)) {
+ if (feof(f) || ferror(f))
+ break;
+ if (size && pos) { //move current stuff to start of buffer
+ size -= pos;
+ i -= pos;
+ memmove(buf, &buf[pos], size);
+ }
+ //fill remaining buffer
+ size += fread(&buf[i], 1, LINEBUFFER-size-1, f);
+ pos = 0;
+ c = buf[i];
+ }
+ if (c == '\n') {
+ //trim off any newlines from the start
+ while (i > pos && (buf[pos] == '\r' || buf[pos] == '\n'))
+ pos++;
+ string * s = new string(&buf[pos], i-pos);
+ pos = i+1;
+ return s;
+ }
+
+ }
+ string * s = new string(&buf[pos], size-pos);
+ pos = 0;
+ size = 0;
+ endofbuffer = true;
+ return s;
+}
+
+inline void forward_progress(FILE * inputFile) {
+ delete(lastLine);
+ lastLine = currentLine;
+ currentLine = nextLine;
+ nextLine = readline(inputFile);
+ //strip out any timestamps.
+ if (nextLine->length() >= 10) {
+ if ((*nextLine)[0] == '[' && (*nextLine)[3] == ':' && (*nextLine)[6] == ':' && (*nextLine)[9] == ']')
+ nextLine->erase(0, 10);
+ else if (nextLine->length() >= 26 && ((*nextLine)[0] == '[' && (*nextLine)[5] == '-' && (*nextLine)[14] == ':' && (*nextLine)[20] == '.' && (*nextLine)[24] == ']'))
+ nextLine->erase(0, 26);
+ }
+}
+//deallocates to, copys from to to.
+inline void string_send(string * &from, string * &to) {
+ delete(to);
+ to = new string(*from);
+}
+inline void printprogressbar(unsigned short progress /*as percent*/) {
+ double const modifer = 100.0L/(double)PROGRESS_BAR_INNER_WIDTH;
+ size_t bars = (double)progress/modifer;
+ cerr << "\r[" << string(bars, '=') << ((progress < 100) ? ">" : "") << string(PROGRESS_BAR_INNER_WIDTH-(bars+((progress < 100) ? 1 : 0)), ' ') << "] " << progress << "%";
+ cerr.flush();
+}
+
+bool readFromFile(bool isstdin) {
+ //Open file to read
+ FILE * inputFile = stdin;
+ if (!isstdin)
+ inputFile = fopen("Input.txt", "r");
+
+ if (ferror(inputFile))
+ return false;
+ long long fileLength = 0;
+ clock_t nextupdate = 0;
+ if (!isstdin) {
+ fseek(inputFile, 0, SEEK_END);
+ fileLength = ftell(inputFile);
+ fseek(inputFile, 0, SEEK_SET);
+ nextupdate = clock();
+ }
+
+ if (feof(inputFile))
+ return false; //empty file
+ do {
+ //Update our lines
+ forward_progress(inputFile);
+ //progress bar
+
+ if (!isstdin && clock() >= nextupdate) {
+ int dProgress = (int)(((long double)ftell(inputFile) / (long double)fileLength) * 100.0L);
+ printprogressbar(dProgress);
+ nextupdate = clock() + (CLOCKS_PER_SEC/PROGRESS_FPS);
+ }
+ //Found a runtime!
+ if (safe_substr(currentLine, 0, 14) == "runtime error:") {
+ if (currentLine->length() <= 17) { //empty runtime, check next line.
+ //runtime is on the line before this one. (byond bug)
+ if (nextLine->length() < 2) {
+ string_send(lastLine, nextLine);
+ }
+ forward_progress(inputFile);
+ string * tmp = new string("runtime error: " + *currentLine);
+ string_send(tmp, currentLine);
+ delete(tmp);
+ }
+ //we assign this to the right container in a moment.
+ unordered_map * storage_container;
+
+ //runtime is actually an infinite loop
+ if (safe_substr(currentLine, 15, 23) == "Infinite loop suspected" || safe_substr(currentLine, 15, 31) == "Maximum recursion level reached") {
+ //use our infinite loop container.
+ storage_container = &storedInfiniteLoop;
+ totalInfiniteLoops++;
+ // skip the line about world.loop_checks
+ forward_progress(inputFile);
+ string_send(lastLine, currentLine);
+ } else {
+ //use the runtime container
+ storage_container = &storedRuntime;
+ totalRuntimes++;
+ }
+
+ string key = *currentLine;
+ bool procfound = false; //so other things don't have to bother checking for this again.
+ if (safe_substr(nextLine, 0, 10) == "proc name:") {
+ key += *nextLine;
+ procfound = true;
+ }
+
+ //(get the address of a runtime from (a pointer to a container of runtimes)) to then store in a pointer to a runtime.
+ //(and who said pointers were hard.)
+ runtime* R = &((*storage_container)[key]);
+
+ //new
+ if (R->text != *currentLine) {
+ R->text = *currentLine;
+ if (procfound) {
+ R->proc = *nextLine;
+ forward_progress(inputFile);
+ }
+ R->count = 1;
+
+ //search for source file info
+ if (safe_substr(nextLine, 2, 12) == "source file:") {
+ R->source = *nextLine;
+ //skip again
+ forward_progress(inputFile);
+ }
+ //If we find this, we have new stuff to store
+ if (safe_substr(nextLine, 2, 4) == "usr:") {
+ forward_progress(inputFile);
+ forward_progress(inputFile);
+ //Store more info
+ R->usr = *lastLine;
+ R->src = *currentLine;
+ if (safe_substr(nextLine, 2, 8) == "src.loc:") {
+ R->loc = *nextLine;
+ forward_progress(inputFile);
+ }
+ }
+
+ } else { //existed already
+ R->count++;
+ if (procfound)
+ forward_progress(inputFile);
+ }
+
+ } else if (safe_substr(currentLine, 0, 7) == "Path : ") {
+ string deltype = safe_substr(currentLine, 7);
+ if (deltype.substr(deltype.size()-1,1) == " ") //some times they have a single trailing space.
+ deltype = deltype.substr(0, deltype.size()-1);
+
+ unsigned int failures = strtoul(safe_substr(nextLine, 11).c_str(), NULL, 10);
+ if (failures <= 0)
+ continue;
+
+ totalHardDels += failures;
+ harddel* D = &storedHardDel[deltype];
+ if (D->type != deltype) {
+ D->type = deltype;
+ D->count = failures;
+ } else {
+ D->count += failures;
+ }
+ }
+ } while (!feof(inputFile) || !endofbuffer); //Until end of file
+ if (!isstdin)
+ printprogressbar(100);
+ cerr << endl;
+ return true;
+}
+
+bool runtimeComp(const runtime &a, const runtime &b) {
+ return a.count > b.count;
+}
+
+bool hardDelComp(const harddel &a, const harddel &b) {
+ return a.count > b.count;
+}
+
+bool writeToFile(bool usestdio) {
+ //Open and clear the file
+ ostream * output = &cout;
+ ofstream * outputFile;
+ if (!usestdio)
+ output = outputFile = new ofstream("Output.txt", ios::trunc);
+
+
+ if(usestdio || outputFile->is_open()) {
+ *output << "Note: The source file, src and usr are all from the FIRST of the identical runtimes. Everything else is cropped.\n\n";
+ if(storedInfiniteLoop.size() > 0)
+ *output << "Total unique infinite loops: " << storedInfiniteLoop.size() << endl;
+
+ if(totalInfiniteLoops > 0)
+ *output << "Total infinite loops: " << totalInfiniteLoops << endl << endl;
+
+ *output << "Total unique runtimes: " << storedRuntime.size() << endl;
+ *output << "Total runtimes: " << totalRuntimes << endl << endl;
+ if(storedHardDel.size() > 0)
+ *output << "Total unique hard deletions: " << storedHardDel.size() << endl;
+
+ if(totalHardDels > 0)
+ *output << "Total hard deletions: " << totalHardDels << endl << endl;
+
+
+ //If we have infinite loops, display them first.
+ if(storedInfiniteLoop.size() > 0) {
+ vector infiniteLoops;
+ infiniteLoops.reserve(storedInfiniteLoop.size());
+ for (unordered_map::iterator it=storedInfiniteLoop.begin(); it != storedInfiniteLoop.end(); it++)
+ infiniteLoops.push_back(it->second);
+ storedInfiniteLoop.clear();
+ sort(infiniteLoops.begin(), infiniteLoops.end(), runtimeComp);
+ *output << "** Infinite loops **";
+ for (int i=0; i < infiniteLoops.size(); i++) {
+ runtime* R = &infiniteLoops[i];
+ *output << endl << endl << "The following infinite loop has occurred " << R->count << " time(s).\n";
+ *output << R->text << endl;
+ if(R->proc.length())
+ *output << R->proc << endl;
+ if(R->source.length())
+ *output << R->source << endl;
+ if(R->usr.length())
+ *output << R->usr << endl;
+ if(R->src.length())
+ *output << R->src << endl;
+ if(R->loc.length())
+ *output << R->loc << endl;
+ }
+ *output << endl << endl; //For spacing
+ }
+
+
+ //Do runtimes next
+ *output << "** Runtimes **";
+ vector runtimes;
+ runtimes.reserve(storedRuntime.size());
+ for (unordered_map::iterator it=storedRuntime.begin(); it != storedRuntime.end(); it++)
+ runtimes.push_back(it->second);
+ storedRuntime.clear();
+ sort(runtimes.begin(), runtimes.end(), runtimeComp);
+ for (int i=0; i < runtimes.size(); i++) {
+ runtime* R = &runtimes[i];
+ *output << endl << endl << "The following runtime has occurred " << R->count << " time(s).\n";
+ *output << R->text << endl;
+ if(R->proc.length())
+ *output << R->proc << endl;
+ if(R->source.length())
+ *output << R->source << endl;
+ if(R->usr.length())
+ *output << R->usr << endl;
+ if(R->src.length())
+ *output << R->src << endl;
+ if(R->loc.length())
+ *output << R->loc << endl;
+ }
+ *output << endl << endl; //For spacing
+
+ //and finally, hard deletes
+ if(totalHardDels > 0) {
+ *output << endl << "** Hard deletions **";
+ vector hardDels;
+ hardDels.reserve(storedHardDel.size());
+ for (unordered_map::iterator it=storedHardDel.begin(); it != storedHardDel.end(); it++)
+ hardDels.push_back(it->second);
+ storedHardDel.clear();
+ sort(hardDels.begin(), hardDels.end(), hardDelComp);
+ for(int i=0; i < hardDels.size(); i++) {
+ harddel* D = &hardDels[i];
+ *output << endl << D->type << " - " << D->count << " time(s).\n";
+ }
+ }
+ if (!usestdio) {
+ outputFile->close();
+ delete outputFile;
+ }
+ } else {
+ return false;
+ }
+ return true;
+}
+
+int main(int argc, const char * argv[]) {
+ ios_base::sync_with_stdio(false);
+ ios::sync_with_stdio(false);
+ bool usestdio = false;
+ if (argc >= 2 && !strcmp(argv[1], "-s"))
+ usestdio = true;
+
+ char exit; //Used to stop the program from immediately exiting
+ cerr << "Reading input.\n";
+ if(readFromFile(usestdio)) {
+ cerr << "Input read successfully!\n";
+ } else {
+ cerr << "Input failed to open, shutting down.\n";
+ if (!usestdio) {
+ cerr << "\nEnter any letter to quit.\n";
+ exit = cin.get();
+ }
+ return 1;
+ }
+
+
+ cerr << "Writing output.\n";
+ if(writeToFile(usestdio)) {
+ cerr << "Output was successful!\n";
+ if (!usestdio) {
+ cerr << "\nEnter any letter to quit.\n";
+ exit = cin.get();
+ }
+ return 0;
+ } else {
+ cerr << "The output file could not be opened, shutting down.\n";
+ if (!usestdio) {
+ cerr << "\nEnter any letter to quit.\n";
+ exit = cin.get();
+ }
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/tools/UnstandardnessTestForDM/readme.txt b/tools/UnstandardnessTestForDM/readme.txt
index 3fb04ee4df..8d3c5168dc 100644
--- a/tools/UnstandardnessTestForDM/readme.txt
+++ b/tools/UnstandardnessTestForDM/readme.txt
@@ -1,4 +1,4 @@
-the compiled exe file for the Unstandardness text for DM program is in:
-UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.exe
-
-You have to move it to the root folder (where the dme file is) and run it from there for it to work.
+the compiled exe file for the Unstandardness text for DM program is in:
+UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.exe
+
+You have to move it to the root folder (where the dme file is) and run it from there for it to work.
diff --git a/tools/WebhookProcessor/secret.php b/tools/WebhookProcessor/secret.php
index 9b8a27d490..9d1dc5a903 100644
--- a/tools/WebhookProcessor/secret.php
+++ b/tools/WebhookProcessor/secret.php
@@ -1,133 +1,133 @@
-
Date: Sun, 20 Dec 2020 19:25:49 -0700
Subject: [PATCH 029/165] changes
---
.../configuration/entries/respawns.dm | 18 ++++++++++++++++++
code/modules/mob/dead/new_player/new_player.dm | 4 +++-
code/modules/mob/dead/observer/respawn.dm | 11 +++++++++++
config/respawns.txt | 9 +++++++++
4 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/code/controllers/configuration/entries/respawns.dm b/code/controllers/configuration/entries/respawns.dm
index d92f4ec394..69e48ed820 100644
--- a/code/controllers/configuration/entries/respawns.dm
+++ b/code/controllers/configuration/entries/respawns.dm
@@ -27,3 +27,21 @@
/// Observing penalizes for respawns, not just joining.
/datum/config_entry/flag/respawn_penalty_includes_observe
config_entry_value = FALSE
+
+/// Minutes from roundstart before someone can respawn
+/datum/config_entry/flag/respawn_minimum_delay_roundstart
+ config_entry_value = 30.0
+ integer = FALSE
+
+/// Gamemode config tags that are banned from respawning
+/datum/config_entry/keyed_list/respawn_chaos_gamemodes
+ key_mode = KEY_MODE_TEXT
+ value_mode = VALUE_MODE_FLAG
+
+/datum/config_entry/keyed_list/respawn_chaos_gamemodes/ValidateListEntry(key_name, key_value)
+ . = ..()
+ return . && (key_name in config.modes)
+
+/datum/config_entry/keyed_list/respawn_chaos_gamemodes/preprocess_key(key)
+ . = ..()
+ return lowertext(key)
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 7acf6ad32c..72ec3d06f6 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -294,7 +294,9 @@
ready = PLAYER_NOT_READY
return FALSE
- var/this_is_like_playing_right = alert(src,"Are you sure you wish to observe? You will not be able to play this round!","Player Setup","Yes","No")
+ var/mintime = max(CONFIG_GET(number/respawn_delay), (SSticker.round_start_time + (CONFIG_GET(number/respawn_minimum_delay_roundstart) * 600)) - world.time, 0)
+
+ var/this_is_like_playing_right = alert(src,"Are you sure you wish to observe? You will not be able to respawn for [round(mintime / 600, 0.1)] minutes!!","Player Setup","Yes","No")
if(QDELETED(src) || !src.client || this_is_like_playing_right != "Yes")
ready = PLAYER_NOT_READY
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
index a31fdd4bf4..d882e8d474 100644
--- a/code/modules/mob/dead/observer/respawn.dm
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -122,6 +122,16 @@
to_chat(src, "You cannot respawn as you have enabled DNR.")
return
+ var/roundstart_timeleft = world.time - (SSticker.round_start_time + (CONFIG_GET(number/respawn_minimum_delay_roundstart) * 600))
+ if(roundstart_timeleft > 0)
+ to_chat(src, "It's been too short of a time since the round started! Please wait [CEILING(roundstart_timeleft / 600, 0.1)] more minutes.")
+ return
+
+ var/list/modes = CONFIG_GET(keyed_list/respawn_chaos_gamemodes)
+ if(SSticker.mode && banned_modes[lowertext(SSticker.mode.config_tag]))
+ to_chat(src, "The current mode tag, [SSticker.mode.config_tag], is not eligible for respawn.")
+ return
+
var/timeleft = time_left_to_respawn()
if(timeleft)
to_chat(src, "It's been too short of a time since you died/observed! Please wait [round(timeleft / 600, 0.1)] more minutes.")
@@ -149,6 +159,7 @@
Remember to take heed of rules regarding round knowledge - notably, that ALL past lives are forgotten. \
Any character you join as has NO knowledge of round events unless specified otherwise by an admin.")
+ message_admins("[key_name_admin(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.")
log_game("[key_name(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.")
transfer_to_lobby()
diff --git a/config/respawns.txt b/config/respawns.txt
index 46a4bb0e07..337a691b07 100644
--- a/config/respawns.txt
+++ b/config/respawns.txt
@@ -18,3 +18,12 @@ ALLOW_NON_ASSISTANT_RESPAWN
## Observing is considered a respawn for the purposes of role lockouts. Defaults to disabled. When disabled, only RESPAWNING rather than returning from observe locks you out.
# RESPAWN_PENALTY_INCLUDES_OBSERVE
+
+## Time in minutes from round start before respawn is enabled
+RESPAWN_MINIMUM_DELAY_ROUNDSTART 30.0
+
+## Gamemode (config tags!) banlist for respawn
+RESPAWN_CHAOS_GAMEMODES WIZARD
+RESPAWN_CHAOS_GAMEMODES NUCLEAR
+RESPAWN_CHAOS_GAMEMODES CLONWOPS
+RESPAWN_CHOAS_GAMEMODES REVOLUTION
From eef2a323ed689c03d6510c77aae15c24ed721c0d Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 00:11:19 -0700
Subject: [PATCH 030/165] ok
---
code/modules/mob/dead/observer/respawn.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
index d882e8d474..dc825af57e 100644
--- a/code/modules/mob/dead/observer/respawn.dm
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -128,7 +128,7 @@
return
var/list/modes = CONFIG_GET(keyed_list/respawn_chaos_gamemodes)
- if(SSticker.mode && banned_modes[lowertext(SSticker.mode.config_tag]))
+ if(SSticker.mode && banned_modes[lowertext(SSticker.mode.config_tag)]))
to_chat(src, "The current mode tag, [SSticker.mode.config_tag], is not eligible for respawn.")
return
From 97824f4030d5abb1763dad198b03c412cf7447fa Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 00:14:48 -0700
Subject: [PATCH 031/165] ok
---
code/modules/mob/dead/observer/respawn.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
index dc825af57e..bca4d6ab0d 100644
--- a/code/modules/mob/dead/observer/respawn.dm
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -128,7 +128,7 @@
return
var/list/modes = CONFIG_GET(keyed_list/respawn_chaos_gamemodes)
- if(SSticker.mode && banned_modes[lowertext(SSticker.mode.config_tag)]))
+ if(SSticker.mode && banned_modes[lowertext(SSticker.mode.config_tag)])
to_chat(src, "The current mode tag, [SSticker.mode.config_tag], is not eligible for respawn.")
return
From 7da6979b543f1cf0923f8c77db81854236b08e01 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 00:28:03 -0700
Subject: [PATCH 032/165] ok
---
code/controllers/configuration/entries/respawns.dm | 2 +-
code/modules/mob/dead/observer/respawn.dm | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/code/controllers/configuration/entries/respawns.dm b/code/controllers/configuration/entries/respawns.dm
index 69e48ed820..40c7d248a4 100644
--- a/code/controllers/configuration/entries/respawns.dm
+++ b/code/controllers/configuration/entries/respawns.dm
@@ -29,7 +29,7 @@
config_entry_value = FALSE
/// Minutes from roundstart before someone can respawn
-/datum/config_entry/flag/respawn_minimum_delay_roundstart
+/datum/config_entry/number/respawn_minimum_delay_roundstart
config_entry_value = 30.0
integer = FALSE
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
index bca4d6ab0d..f966051ed3 100644
--- a/code/modules/mob/dead/observer/respawn.dm
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -122,12 +122,12 @@
to_chat(src, "You cannot respawn as you have enabled DNR.")
return
- var/roundstart_timeleft = world.time - (SSticker.round_start_time + (CONFIG_GET(number/respawn_minimum_delay_roundstart) * 600))
+ var/roundstart_timeleft = (SSticker.round_start_time + (CONFIG_GET(number/respawn_minimum_delay_roundstart) * 600)) - world.time
if(roundstart_timeleft > 0)
to_chat(src, "It's been too short of a time since the round started! Please wait [CEILING(roundstart_timeleft / 600, 0.1)] more minutes.")
return
- var/list/modes = CONFIG_GET(keyed_list/respawn_chaos_gamemodes)
+ var/list/banned_modes = CONFIG_GET(keyed_list/respawn_chaos_gamemodes)
if(SSticker.mode && banned_modes[lowertext(SSticker.mode.config_tag)])
to_chat(src, "The current mode tag, [SSticker.mode.config_tag], is not eligible for respawn.")
return
From d3e224d9c14d540e9d4845f844dda47e928b6af8 Mon Sep 17 00:00:00 2001
From: raspy-on-osu
Date: Mon, 21 Dec 2020 04:54:19 -0500
Subject: [PATCH 033/165] init
---
code/game/machinery/doors/windowdoor.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index bed006d0b5..7847c3757e 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -67,9 +67,9 @@
/obj/machinery/door/window/proc/open_and_close()
open()
if(src.check_access(null))
- sleep(50)
+ sleep(60)
else //secure doors close faster
- sleep(20)
+ sleep(40)
close()
/obj/machinery/door/window/Bumped(atom/movable/AM)
From 3d897e8fc140c0bd283ecc95799941d78f8d5d73 Mon Sep 17 00:00:00 2001
From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Mon, 21 Dec 2020 17:15:51 +0000
Subject: [PATCH 034/165] fixes tail entwining
---
code/modules/mob/living/living.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 0c7855ee16..fcc1d734a3 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -264,9 +264,9 @@
return FALSE
/mob/living/carbon/human/has_tail()
- if(!dna || !dna.features)
+ if(!dna || !dna.species)
return ..()
- var/list/L = dna.features // caches list because i refuse to type it out and because performance
+ var/list/L = dna.species.mutant_bodyparts // caches list because i refuse to type it out and because performance
return (L["mam_tail"] && (L["mam_tail"] != "None")) || (L["tail_human"] && (L["tail_human"] != "None")) || (L["tail_lizard"] && (L["tail_lizard"] != "None"))
/mob/living/start_pulling(atom/movable/AM, state, force = pull_force, supress_message = FALSE)
From 0e7a597a2bff5651e4b4dcaa82d6807566f63b69 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 10:27:28 -0700
Subject: [PATCH 035/165] alright
---
code/controllers/subsystem/input.dm | 1 +
code/game/objects/items/puzzle_pieces.dm | 3 +--
code/modules/keybindings/setup.dm | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm
index 9b292a219d..28505c70f8 100644
--- a/code/controllers/subsystem/input.dm
+++ b/code/controllers/subsystem/input.dm
@@ -93,6 +93,7 @@ SUBSYSTEM_DEF(input)
user.full_macro_assert()
/datum/controller/subsystem/input/fire()
+ set waitfor = FALSE
var/list/clients = GLOB.clients // Let's sing the list cache song
for(var/i in 1 to clients.len)
var/client/C = clients[i]
diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm
index 648ba27897..d0fd4dc3f6 100644
--- a/code/game/objects/items/puzzle_pieces.dm
+++ b/code/game/objects/items/puzzle_pieces.dm
@@ -137,8 +137,7 @@
AM.anchored = TRUE
flick("laserbox_burn", AM)
trigger()
- sleep(15)
- qdel(AM)
+ QDEL_IN(src, 15)
// snowflake code until undertile elements
/obj/item/pressure_plate/hologrid/hide()
diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm
index 81c59d481e..b5f09c65ca 100644
--- a/code/modules/keybindings/setup.dm
+++ b/code/modules/keybindings/setup.dm
@@ -5,7 +5,7 @@
SHOULD_NOT_SLEEP(TRUE)
/datum/proc/keyLoop(client/user) // Called once every frame
- //SHOULD_NOT_SLEEP(TRUE)
+ SHOULD_NOT_SLEEP(TRUE)
/client/verb/fix_macros()
set name = "Fix Keybindings"
From b71665882077fb6d5ed8a6c68aef37597c43e92f Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Mon, 21 Dec 2020 11:30:16 -0600
Subject: [PATCH 036/165] Automatic changelog generation for PR #13819 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-13819.yml | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-13819.yml
diff --git a/html/changelogs/AutoChangeLog-pr-13819.yml b/html/changelogs/AutoChangeLog-pr-13819.yml
new file mode 100644
index 0000000000..77b1ec9a3d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13819.yml
@@ -0,0 +1,5 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - bugfix: "The survival dagger light on the sprite now actually turns on and off."
+ - balance: "The survival dagger in the glaive kit that can also be bought by itself is now better at butchering things."
From 2ca997e3398d9b75a0b563e08bb3e381be568461 Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Mon, 21 Dec 2020 20:19:26 +0000
Subject: [PATCH 037/165] fix
---
code/modules/surgery/bodyparts/_bodyparts.dm | 2 ++
1 file changed, 2 insertions(+)
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index f706dd10d9..cd0ac28daf 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -699,6 +699,8 @@
else
if(species_id in GLOB.greyscale_limb_types) //should they have greyscales?
base_bp_icon = DEFAULT_BODYPART_ICON_ORGANIC
+ else
+ base_bp_icon = DEFAULT_BODYPART_ICON
if(base_bp_icon != DEFAULT_BODYPART_ICON)
color_src = mut_colors ? MUTCOLORS : ((H.dna.skin_tone_override && S.use_skintones == USE_SKINTONES_GRAYSCALE_CUSTOM) ? CUSTOM_SKINTONE : SKINTONE)
From ca6df2999872be93af52305fe47eea8095532269 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 13:42:33 -0700
Subject: [PATCH 038/165] Update death.dm
---
code/modules/mob/living/death.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index 24e91f6051..688b0cf63e 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -66,8 +66,8 @@
GLOB.alive_mob_list -= src
if(!gibbed)
GLOB.dead_mob_list += src
- if(mind?.key)
- var/datum/preferences/P = GLOB.preferences_datums[ckey(mind.key)]
+ if(ckey)
+ var/datum/preferences/P = GLOB.preferences_datums[ckey]
if(P)
P.respawn_time_of_death = world.time
set_drugginess(0)
From 1b11005e0958d21e874e52a15dbf28b7b799f54e Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 13:51:27 -0700
Subject: [PATCH 039/165] fix
---
code/modules/cargo/supplypod.dm | 1 +
1 file changed, 1 insertion(+)
diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm
index efac62c930..6169c4d3f0 100644
--- a/code/modules/cargo/supplypod.dm
+++ b/code/modules/cargo/supplypod.dm
@@ -74,6 +74,7 @@
bluespace = TRUE
explosionSize = list(0,0,1,2)
landingDelay = 25 //Longer than others
+ reverseOptionList = list("Mobs"=TRUE,"Objects"=FALSE,"Anchored"=FALSE,"Underfloor"=FALSE,"Wallmounted"=FALSE,"Floors"=FALSE,"Walls"=FALSE)
/obj/structure/closet/supplypod/centcompod
style = STYLE_CENTCOM
From ee9cf20aec6507b6d914269b6d156f6e60cc60f2 Mon Sep 17 00:00:00 2001
From: Artur
Date: Tue, 22 Dec 2020 00:25:59 +0200
Subject: [PATCH 040/165] Awaken
---
code/modules/antagonists/bloodsucker/bloodsucker_powers.dm | 6 ++++++
code/modules/antagonists/bloodsucker/powers/go_home.dm | 1 +
code/modules/antagonists/bloodsucker/powers/masquerade.dm | 1 +
3 files changed, 8 insertions(+)
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm
index 26c8bd5949..2fb7a2ccca 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm
@@ -30,6 +30,7 @@
var/can_be_staked = FALSE // Only Feed can happen with a stake in you.
var/cooldown_static = FALSE // Feed, Masquerade, and One-Shot powers don't improve their cooldown.
//var/not_bloodsucker = FALSE // This goes to Vassals or Hunters, but NOT bloodsuckers.
+ var/must_be_concious = TRUE //Can't use this ability while unconcious.
/datum/action/bloodsucker/New()
if(bloodcost > 0)
@@ -101,6 +102,11 @@
if(display_error)
to_chat(owner, "Garlic in your blood is interfering with your powers!")
return FALSE
+ if(must_be_concious)
+ if(owner.stat != CONSCIOUS)
+ if(display_error)
+ to_chat(owner, "You can't do this while you are unconcious!")
+ return FALSE
// Incap?
if(must_be_capacitated)
var/mob/living/L = owner
diff --git a/code/modules/antagonists/bloodsucker/powers/go_home.dm b/code/modules/antagonists/bloodsucker/powers/go_home.dm
index c46a7fce6c..a8060ad07e 100644
--- a/code/modules/antagonists/bloodsucker/powers/go_home.dm
+++ b/code/modules/antagonists/bloodsucker/powers/go_home.dm
@@ -16,6 +16,7 @@
can_use_in_torpor = TRUE
must_be_capacitated = TRUE
can_be_immobilized = TRUE
+ must_be_concious = FALSE
/datum/action/bloodsucker/gohome/CheckCanUse(display_error)
. = ..()
diff --git a/code/modules/antagonists/bloodsucker/powers/masquerade.dm b/code/modules/antagonists/bloodsucker/powers/masquerade.dm
index d83f938e3f..f4ce531ef0 100644
--- a/code/modules/antagonists/bloodsucker/powers/masquerade.dm
+++ b/code/modules/antagonists/bloodsucker/powers/masquerade.dm
@@ -27,6 +27,7 @@
warn_constant_cost = TRUE
can_use_in_torpor = TRUE // Masquerade is maybe the only one that can do this. It stops your healing.
cooldown_static = TRUE
+ must_be_concious = FALSE
// NOTE: Firing off vulgar powers disables your Masquerade!
From 0646d3f2852611eab3ea7a0edaefbbbb6f621d4a Mon Sep 17 00:00:00 2001
From: kiwedespars <47008095+kiwedespars@users.noreply.github.com>
Date: Mon, 21 Dec 2020 15:07:25 -0800
Subject: [PATCH 041/165] nerf...
---
code/modules/antagonists/changeling/powers/mutations.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index 90eaeb57ac..574ebf66a1 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -689,8 +689,8 @@
wound_enhancement = 6
var/fast_enhancement = 6
var/fast_wound_enhancement = 6
- var/slow_enhancement = 20
- var/slow_wound_enhancement = 20
+ var/slow_enhancement = 12
+ var/slow_wound_enhancement = 15
silent = TRUE
inherited_trait = TRAIT_CHUNKYFINGERS // how do you expect to shoot anyone with bone covered hands
secondary_trait = TRAIT_MAULER // just punch them idiot
From 97e4aad75f4b40556cc07b60b7ff17da095ba10c Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 17:14:22 -0700
Subject: [PATCH 042/165] changes
---
.../mob/living/carbon/human/human_defines.dm | 53 +++++++++++++++----
.../modules/mob/living/living_active_parry.dm | 2 +-
.../mob/living/living_blocking_parrying.dm | 2 +
code/modules/mob/living/living_defines.dm | 4 ++
code/modules/mob/living/living_mobility.dm | 9 ----
code/modules/mob/living/living_signals.dm | 20 +++++++
tgstation.dme | 1 +
7 files changed, 72 insertions(+), 19 deletions(-)
create mode 100644 code/modules/mob/living/living_signals.dm
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 89a4570e8d..81c518d29a 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -14,6 +14,7 @@
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
block_parry_data = /datum/block_parry_data/unarmed/human
+ default_block_parry_data = /datum/block_parry_data/unarmed/pugilist
//Hair colour and style
var/hair_color = "000"
@@ -98,20 +99,54 @@
parry_failed_clickcd_duration = 0.4
parry_data = list( // yeah it's snowflake
- "HUMAN_PARRY_STAGGER" = 3 SECONDS,
- "HUMAN_PARRY_PUNCH" = TRUE,
- "HUMAN_PARRY_MININUM_EFFICIENCY" = 0.9
+ "UNARMED_PARRY_STAGGER" = 3 SECONDS,
+ "UNARMED_PARRY_PUNCH" = TRUE,
+ "UNARMED_PARRY_MININUM_EFFICIENCY" = 90
)
-/mob/living/carbon/human/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time)
+/mob/living/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time)
var/datum/block_parry_data/D = return_block_parry_datum(block_parry_data)
+ . = ..()
if(!owner.Adjacent(attacker))
- return ..()
- if(parry_efficiency < D.parry_data["HUMAN_PARRY_MINIMUM_EFFICIENCY"])
- return ..()
+ return
+ if(parry_efficiency < D.parry_data["UNARMED_PARRY_MINIMUM_EFFICIENCY"])
+ return
visible_message("[src] strikes back perfectly at [attacker], staggering them!")
- if(D.parry_data["HUMAN_PARRY_PUNCH"])
+ if(D.parry_data["UNARMED_PARRY_PUNCH"])
UnarmedAttack(attacker, TRUE, INTENT_HARM, ATTACK_IS_PARRY_COUNTERATTACK | ATTACK_IGNORE_ACTION | ATTACK_IGNORE_CLICKDELAY | NO_AUTO_CLICKDELAY_HANDLING)
var/mob/living/L = attacker
if(istype(L))
- L.Stagger(D.parry_data["HUMAN_PARRY_STAGGER"])
+ L.Stagger(D.parry_data["UNARMED_PARRY_STAGGER"])
+
+/// Unarmed parry data for pugilists
+/datum/block_parry_data/unarmed/pugilist
+ parry_respect_clickdelay = FALSE
+ parry_stamina_cost = 4
+ parry_attack_types = ATTACK_TYPE_UNARMED | ATTACK_TYPE_PROJECTILE | ATTACK_TYPE_TACKLE | ATTACK_TYPE_THROWN | ATTACK_TYPE_MELEE
+ parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING
+
+ parry_time_windup = 0
+ parry_time_spindown = 0
+ parry_time_active = 5
+
+ parry_time_perfect = 1.5
+ parry_time_perfect_leeway = 1.5
+ parry_imperfect_falloff_percent = 20
+ parry_efficiency_perfect = 100
+ parry_efficiency_perfect_override = list(
+ "[ATTACK_TYPE_PROJECTILE_TEXT]" = 60,
+ )
+
+ parry_efficiency_considered_successful = 0.01
+ parry_efficiency_to_counterattack = 0.01
+ parry_max_attacks = INFINITY
+ parry_failed_cooldown_duration = 3 SECONDS
+ parry_failed_stagger_duration = 0
+ parry_cooldown = 0
+ parry_failed_clickcd_duration = 0.8
+
+ parry_data = list( // yeah it's snowflake
+ "UNARMED_PARRY_STAGGER" = 3 SECONDS,
+ "UNARMED_PARRY_PUNCH" = TRUE,
+ "UNARMED_PARRY_MININUM_EFFICIENCY" = 90
+ )
diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm
index 7353add745..16855d6f22 100644
--- a/code/modules/mob/living/living_active_parry.dm
+++ b/code/modules/mob/living/living_active_parry.dm
@@ -127,7 +127,7 @@
handle_parry_ending_effects(data, effect_text)
parrying = NOT_PARRYING
parry_start_time = 0
- parry_end_time_last = world.time
+ parry_end_time_last = world.time + (successful? 0 : data.parry_failed_cooldown_duration)
successful_parries = null
/**
diff --git a/code/modules/mob/living/living_blocking_parrying.dm b/code/modules/mob/living/living_blocking_parrying.dm
index 08ef674b33..e290956873 100644
--- a/code/modules/mob/living/living_blocking_parrying.dm
+++ b/code/modules/mob/living/living_blocking_parrying.dm
@@ -154,6 +154,8 @@ GLOBAL_LIST_EMPTY(block_parry_data)
var/parry_failed_stagger_duration = 3.5 SECONDS
/// Clickdelay duration post-parry if you fail to parry an attack
var/parry_failed_clickcd_duration = 2 SECONDS
+ /// Parry cooldown post-parry if failed. This is ADDED to parry_cooldown!!!
+ var/parry_failed_cooldown_duration = 0 SECONDS
/**
* Quirky proc to get average of flags in list that are in attack_type because why is attack_type a flag.
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 5621fab9c1..d4ccc63b34 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -32,6 +32,10 @@
// Combat - Blocking/Parrying system
/// Our block_parry_data for unarmed blocks/parries. Currently only used for parrying, as unarmed block isn't implemented yet. YOU MUST RUN [get_block_parry_data(this)] INSTEAD OF DIRECTLY ACCESSING!
var/datum/block_parry_data/block_parry_data = /datum/block_parry_data // defaults to *something* because [combat_flags] dictates whether or not we can unarmed block/parry.
+ /// Default
+ var/datum/block_parry_data/default_block_parry_data = /datum/block_parry_data
+ /// If we're a pugilist
+ var/datum/block_parry_data/pugilist_block_parry_data = /datum/block_parry_data/unarmed/pugilist
// Blocking
/// The item the user is actively blocking with if any.
var/obj/item/active_block_item
diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm
index 62c23cca9b..2256a93fa1 100644
--- a/code/modules/mob/living/living_mobility.dm
+++ b/code/modules/mob/living/living_mobility.dm
@@ -1,12 +1,3 @@
-/// IN THE FUTURE, WE WILL PROBABLY REFACTOR TO LESSEN THE NEED FOR UPDATE_MOBILITY, BUT FOR NOW.. WE CAN START DOING THIS.
-/// FOR BLOCKING MOVEMENT, USE TRAIT_MOBILITY_NOMOVE AS MUCH AS POSSIBLE. IT WILL MAKE REFACTORS IN THE FUTURE EASIER.
-/mob/living/ComponentInitialize()
- . = ..()
- RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOMOVE), .proc/update_mobility)
- RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOPICKUP), .proc/update_mobility)
- RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOUSE), .proc/update_mobility)
- RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOREST), .proc/update_mobility)
- RegisterSignal(src, SIGNAL_TRAIT(TRAIT_LIVING_NO_DENSITY), .proc/update_density)
//Stuff like mobility flag updates, resting updates, etc.
diff --git a/code/modules/mob/living/living_signals.dm b/code/modules/mob/living/living_signals.dm
new file mode 100644
index 0000000000..0eb83658d7
--- /dev/null
+++ b/code/modules/mob/living/living_signals.dm
@@ -0,0 +1,20 @@
+/// IN THE FUTURE, WE WILL PROBABLY REFACTOR TO LESSEN THE NEED FOR UPDATE_MOBILITY, BUT FOR NOW.. WE CAN START DOING THIS.
+/// FOR BLOCKING MOVEMENT, USE TRAIT_MOBILITY_NOMOVE AS MUCH AS POSSIBLE. IT WILL MAKE REFACTORS IN THE FUTURE EASIER.
+/mob/living/ComponentInitialize()
+ . = ..()
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOMOVE), .proc/update_mobility)
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOPICKUP), .proc/update_mobility)
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOUSE), .proc/update_mobility)
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOREST), .proc/update_mobility)
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_LIVING_NO_DENSITY), .proc/update_density)
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_PUGILIST), .proc/update_pugilism)
+
+/mob/living/proc/update_pugilism()
+ if(HAS_TRAIT(src, TRAIT_PUGILIST))
+ combat_flags |= COMBAT_FLAG_UNARMED_PARRY
+ block_parry_data = pugilist_block_parry_data
+ else
+ var/initial_combat_flags = initial(combat_flags)
+ if(!(initial_combat_flags & COMBAT_FLAG_UNARMED_PARRY))
+ combat_flags &= ~COMBAT_FLAG_UNARMED_PARRY
+ block_parry_data = default_block_parry_data
diff --git a/tgstation.dme b/tgstation.dme
index bac0ffbdd3..d5dc1f279c 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2471,6 +2471,7 @@
#include "code\modules\mob\living\living_defines.dm"
#include "code\modules\mob\living\living_mobility.dm"
#include "code\modules\mob\living\living_movement.dm"
+#include "code\modules\mob\living\living_signals.dm"
#include "code\modules\mob\living\living_sprint.dm"
#include "code\modules\mob\living\login.dm"
#include "code\modules\mob\living\logout.dm"
From 5ff244a48c9d2fbee58b58462d6606dfe8512cb3 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 17:20:44 -0700
Subject: [PATCH 043/165] t
---
code/modules/mob/living/carbon/human/human_defines.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 81c518d29a..0c9919ffba 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -134,7 +134,7 @@
parry_imperfect_falloff_percent = 20
parry_efficiency_perfect = 100
parry_efficiency_perfect_override = list(
- "[ATTACK_TYPE_PROJECTILE_TEXT]" = 60,
+ ATTACK_TYPE_PROJECTILE_TEXT = 60,
)
parry_efficiency_considered_successful = 0.01
From ea554b88a4cbbebea6bf90068f1fed1c6a6bc9bd Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 17:31:28 -0700
Subject: [PATCH 044/165] ok
---
code/modules/mob/living/carbon/human/human_defines.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 0c9919ffba..2e8641b43e 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -140,7 +140,7 @@
parry_efficiency_considered_successful = 0.01
parry_efficiency_to_counterattack = 0.01
parry_max_attacks = INFINITY
- parry_failed_cooldown_duration = 3 SECONDS
+ parry_failed_cooldown_duration = 1.5 SECONDS
parry_failed_stagger_duration = 0
parry_cooldown = 0
parry_failed_clickcd_duration = 0.8
From 000e52515706c0c08cefe90fe0033e613a70b8ea Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 21:11:54 -0700
Subject: [PATCH 045/165] ok
---
code/game/atoms.dm | 18 ------------------
code/modules/client/client_procs.dm | 19 +++++++++++++++++--
html/statbrowser.html | 2 +-
3 files changed, 18 insertions(+), 21 deletions(-)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 9607dc4dce..7fbfe48f4e 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1143,21 +1143,3 @@
*/
/atom/proc/setClosed()
return
-
-///Passes Stat Browser Panel clicks to the game and calls client click on an atom
-/atom/Topic(href, list/href_list)
- . = ..()
- if(!usr?.client)
- return
- var/client/usr_client = usr.client
- var/list/paramslist = list()
- if(href_list["statpanel_item_shiftclick"])
- paramslist["shift"] = "1"
- if(href_list["statpanel_item_ctrlclick"])
- paramslist["ctrl"] = "1"
- if(href_list["statpanel_item_altclick"])
- paramslist["alt"] = "1"
- if(href_list["statpanel_item_click"])
- // first of all make sure we valid
- var/mouseparams = list2params(paramslist)
- usr_client.Click(src, loc, null, mouseparams)
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 267ee3a5e1..4d706c4907 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -101,6 +101,10 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
keyUp(keycode)
return
+ if(href_list["statpanel_item_target"])
+ handle_statpanel_click(href_list)
+ return
+
// Tgui Topic middleware
if(tgui_Topic(href_list))
return
@@ -141,6 +145,17 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
..() //redirect to hsrc.Topic()
+/client/proc/handle_statpanel_click(list/href_list)
+ var/atom/target = locate(href_list["statpanel_item_target"])
+ var/list/paramslist = list()
+ if(href_list["statpanel_item_shiftclick"])
+ paramslist["shift"] = "1"
+ if(href_list["statpanel_item_ctrlclick"])
+ paramslist["ctrl"] = "1"
+ if(href_list["statpanel_item_altclick"])
+ paramslist["alt"] = "1"
+ Click(target, target.loc, null, paramslist, FALSE, "statpanel")
+
/client/proc/is_content_unlocked()
if(!prefs.unlock_content)
to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Only 10 bucks for 3 months! Click Here to find out more.")
@@ -798,7 +813,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
message_admins("Proxy Detection: [key_name_admin(src)] IP intel rated [res.intel*100]% likely to be a Proxy/VPN.")
ip_intel = res.intel
-/client/Click(atom/object, atom/location, control, params, ignore_spam = FALSE)
+/client/Click(atom/object, atom/location, control, params, ignore_spam = FALSE, extra_info)
if(last_click > world.time - world.tick_lag)
return
last_click = world.time
@@ -851,7 +866,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
return
if(prefs.log_clicks)
- log_click(object, location, control, params, src)
+ log_click(object, location, control, params, src, extra_info? "clicked ([extra_info])" : null)
if (prefs.hotkeys)
// If hotkey mode is enabled, then clicking the map will automatically
diff --git a/html/statbrowser.html b/html/statbrowser.html
index 346a198746..e7d49ceebc 100644
--- a/html/statbrowser.html
+++ b/html/statbrowser.html
@@ -875,7 +875,7 @@ function draw_listedturf() {
// rather than every onmousedown getting the "part" of the last entry.
return function(e) {
e.preventDefault();
- clickcatcher = "?src=" + part[1] + ";statpanel_item_click=1";
+ clickcatcher = "?src=_statpanel_;statpanel_item_target=" + part[1] + ";statpanel_item_click=1";
if(e.shiftKey){
clickcatcher += ";statpanel_item_shiftclick=1";
}
From 221a98d27b229f1a24079fdc6a92bc22583c9acc Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 21:25:00 -0700
Subject: [PATCH 046/165] how'd this ever work
---
code/modules/client/client_procs.dm | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 4d706c4907..c4cbb43bdf 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -147,14 +147,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
/client/proc/handle_statpanel_click(list/href_list)
var/atom/target = locate(href_list["statpanel_item_target"])
- var/list/paramslist = list()
- if(href_list["statpanel_item_shiftclick"])
- paramslist["shift"] = "1"
- if(href_list["statpanel_item_ctrlclick"])
- paramslist["ctrl"] = "1"
- if(href_list["statpanel_item_altclick"])
- paramslist["alt"] = "1"
- Click(target, target.loc, null, paramslist, FALSE, "statpanel")
+ Click(target, target.loc, null, "shift=[href_list["statpanel_item_shiftclick"]?1:0]&ctrl=[href_list["statpanel_item_ctrlclick"]?1:0]&alt=[href_list["statpanel_item_altclick"]?1:0]", FALSE, "statpanel")
/client/proc/is_content_unlocked()
if(!prefs.unlock_content)
From 9b83ae564a88836db0053fa388b805db34c2617e Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 21:31:55 -0700
Subject: [PATCH 047/165] e
---
code/modules/client/client_procs.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index c4cbb43bdf..c854358373 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -147,7 +147,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
/client/proc/handle_statpanel_click(list/href_list)
var/atom/target = locate(href_list["statpanel_item_target"])
- Click(target, target.loc, null, "shift=[href_list["statpanel_item_shiftclick"]?1:0]&ctrl=[href_list["statpanel_item_ctrlclick"]?1:0]&alt=[href_list["statpanel_item_altclick"]?1:0]", FALSE, "statpanel")
+ Click(target, target.loc, null, "[href_list["statpanel_item_shiftclick"]?["shift=1;"]:null][href_list["statpanel_item_ctrlclick"]?["ctrl=1;"]:null]&alt=[href_list["statpanel_item_altclick"]?["alt=1;"]:null]", FALSE, "statpanel")
/client/proc/is_content_unlocked()
if(!prefs.unlock_content)
From 13f9bbef01c53b2f2c6b2ebb62f038fd34d1a7b0 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 21:36:12 -0700
Subject: [PATCH 048/165] paramlist
---
code/modules/client/client_procs.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index c854358373..53ae0f5574 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -147,7 +147,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
/client/proc/handle_statpanel_click(list/href_list)
var/atom/target = locate(href_list["statpanel_item_target"])
- Click(target, target.loc, null, "[href_list["statpanel_item_shiftclick"]?["shift=1;"]:null][href_list["statpanel_item_ctrlclick"]?["ctrl=1;"]:null]&alt=[href_list["statpanel_item_altclick"]?["alt=1;"]:null]", FALSE, "statpanel")
+ Click(target, target.loc, null, "[href_list["statpanel_item_shiftclick"]?"shift=1;":null][href_list["statpanel_item_ctrlclick"]?"ctrl=1;":null]&alt=[href_list["statpanel_item_altclick"]?"alt=1;":null]", FALSE, "statpanel")
/client/proc/is_content_unlocked()
if(!prefs.unlock_content)
From 911e4f7008f2a1f28bda4f0d9d411d25cb1ac0ca Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 21:39:19 -0700
Subject: [PATCH 049/165] Update movement.dm
---
code/modules/keybindings/keybind/movement.dm | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/code/modules/keybindings/keybind/movement.dm b/code/modules/keybindings/keybind/movement.dm
index d3a0e98def..296b127cb4 100644
--- a/code/modules/keybindings/keybind/movement.dm
+++ b/code/modules/keybindings/keybind/movement.dm
@@ -124,7 +124,8 @@
return TRUE
/datum/keybinding/living/hold_sprint
- hotkey_keys = list("Shift")
+ hotkey_keys = list()
+ classic_keys = list()
name = "hold_sprint"
full_name = "Sprint (hold down)"
description = "Hold down to sprint"
@@ -144,7 +145,8 @@
return TRUE
/datum/keybinding/living/toggle_sprint
- hotkey_keys = list()
+ hotkey_keys = list("Shift")
+ classic_keys = list("Shift")
name = "toggle_sprint"
full_name = "Sprint (toggle)"
description = "Press to toggle sprint"
From 310d4d573b46f6cbf93c3767d446b00e57b9dee1 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 21:46:00 -0700
Subject: [PATCH 050/165] Update death.dm
---
code/modules/mob/living/carbon/death.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index c3e849efa6..ee2f945b65 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -5,7 +5,7 @@
silent = FALSE
losebreath = 0
- if(!gibbed)
+ if(!gibbed && !HAS_TRAIT(src, TRAIT_DEATHCOMA))
emote("deathgasp")
. = ..()
From 9ad59c00c269b4c54c87a7d4a7a6c414692cd67f Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 21:46:59 -0700
Subject: [PATCH 051/165] Update tips.txt
---
strings/tips.txt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/strings/tips.txt b/strings/tips.txt
index 2039b30359..5336f767a5 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -237,7 +237,7 @@ As a Changeling, you can absorb someone by strangling them and using the Absorb
As a Changeling, absorbing someone will give you their full memory. This can include things such as a Traitor's uplink, thus absorbing one will allow you to access the Traitor uplink and buy toys for your Changeling self to abuse.
As a Changeling, absorbing another Changeling will permanently boost your chemical reserve, allow you to pick more abilities, and make the victim unable to revive. Be careful when exposing your identity to other Changelings, as they may be out of those wonderful benefits.
As a Changeling, BZ gas will dramatically slow down or even halt your natural chemical regeneration, be sure to avoid it at all costs as some lunatics may try and flood portions of the station to deal with you.
-As a Changeling, death is not the end for you! You can revive after two minutes from being dead by triggering your stasis ability, and then waiting for the prompt to resurrect yourself to show up.
+As a Changeling, death is not the end for you! You can revive after 40 seconds from being dead by triggering your stasis ability, and then waiting for the prompt to resurrect yourself to show up.
As a Changeling, your Regenerate Limbs power will quickly heal all of your wounds, but they'll still leave scars. Changelings can use Fleshmend to get rid of scars, or you can ingest Carpotoxin to get rid of them like a normal person.
As a Cultist, do not cause too much chaos before your objective is completed. If the shuttle gets called too soon, you may not have enough time to win.
As a Cultist, your team starts off very weak, but if necessary can quickly convert everything they have into raw power. Make sure you have the numbers and equipment to support going loud, or the cult will fall flat on its face.
@@ -300,4 +300,4 @@ Laser pointers can be upgraded by replacing its micro laser with a better one fr
Being out of combat mode makes makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by resting.
Resting makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by being out of combat mode.
You do not regenerate as much stamina while in combat mode. Resting (being on the ground) makes you regenerate stamina faster.
-Remember to be in combat mode while in combat, as otherwise you will be penalized by taking more incoming damage and dealing less damage to your adversary.
+Keybinds can be reassigned in character setup on the keybindings tab. This is extremely useful, especially if you know how to use independent binds.
From d5ea33a22458313778254e9c3121de4b05a18f29 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 21:48:53 -0700
Subject: [PATCH 052/165] Update sillytips.txt
---
strings/sillytips.txt | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/strings/sillytips.txt b/strings/sillytips.txt
index e6710de95e..8e28284534 100644
--- a/strings/sillytips.txt
+++ b/strings/sillytips.txt
@@ -23,7 +23,6 @@ Plenty of things that aren't traditionally considered weapons can still be used
DEATH IS IMMINENT!
This game is older than most of the people playing it.
Do not go gentle into that good night.
-Flashbangs can weaken blob tiles, allowing for you and the crew to easily destroy them.
Just the tip?
You can grab someone by clicking on them with the grab intent, then upgrade the grab by clicking on them once more. An aggressive grab will momentarily stun someone, allow you to place Mekhi on a table by clicking on it, or throw them by toggling on throwing.
Some people are unable to read text on a game where half of it is based on text.
@@ -42,8 +41,7 @@ Mhelp is basically useless, and never used correctly. Being a Mentor just means
Toxins Bombs are not the only way to get RnD points. However, nobody will ever do any other method to get sci points...
Plasma men are a powerful race with many perks! No really, I swear! So what if they need an "ERP Plasma room" to fuck, who cares!
As a Cargo Tech make sure to always buy a tesla to sell back to CC. They love those those. Trust me!
-Help.
-Maints.
+;HELP MAINT
Admins always regret meme options in their polls.
Putting cat ears on securitrons makes them table people and nya. Mekhi isn't a cat, but he still goes on the table, just roll with it.
As a Changeling, you can live without a head as they are merely vestigal to you, now, finally, you can be a Dullahan without it being Halloween.
From c341c2448c7bcdddc1fda34aa8f77456514c225f Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 21:50:57 -0700
Subject: [PATCH 053/165] Delete admin_nicknames.txt
---
strings/admin_nicknames.txt | 2 --
1 file changed, 2 deletions(-)
delete mode 100644 strings/admin_nicknames.txt
diff --git a/strings/admin_nicknames.txt b/strings/admin_nicknames.txt
deleted file mode 100644
index 76198b6c05..0000000000
--- a/strings/admin_nicknames.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Badmin
-Spanmin
\ No newline at end of file
From 458f0e4491fcebd699ba6907f849f3f8b1fb9887 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 21:51:52 -0700
Subject: [PATCH 054/165] Update deadsay.dm
---
code/modules/admin/verbs/deadsay.dm | 7 -------
1 file changed, 7 deletions(-)
diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index e3937e19b6..1cddbe9509 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -23,13 +23,6 @@
var/rendered = "DEAD: [uppertext(holder.rank)]([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[emoji_parse(msg)]\""
- // var/rank_name = holder.rank
- // var/admin_name = key
- // if(holder.fakekey)
- // rank_name = pick(strings("admin_nicknames.json", "ranks", "config")) please use this soon.
- // admin_name = pick(strings("admin_nicknames.json", "names", "config"))
- // var/rendered = "DEAD: [rank_name]([admin_name]) says, \"[emoji_parse(msg)]\""
-
for (var/mob/M in GLOB.player_list)
if(isnewplayer(M))
continue
From 5715ea97cebf4edadc0e19d6c7640bdbb7f580ca Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Dec 2020 21:52:44 -0700
Subject: [PATCH 055/165] Update holder2.dm
---
code/modules/admin/holder2.dm | 2 ++
1 file changed, 2 insertions(+)
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index 09f9664295..c3a2f69a5a 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -147,6 +147,8 @@ GLOBAL_PROTECT(href_token)
return 0
/datum/admins/vv_edit_var(var_name, var_value)
+ if(var_name == NAMEOF(src, fakekey))
+ return ..()
return FALSE //nice try trialmin
/*
From 2463aa49127347cc340295cda5a032480a5513bb Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Mon, 21 Dec 2020 22:57:57 -0600
Subject: [PATCH 056/165] Automatic changelog generation for PR #13823 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-13823.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-13823.yml
diff --git a/html/changelogs/AutoChangeLog-pr-13823.yml b/html/changelogs/AutoChangeLog-pr-13823.yml
new file mode 100644
index 0000000000..35d70339f7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13823.yml
@@ -0,0 +1,4 @@
+author: "MrJWhit"
+delete-after: True
+changes:
+ - tweak: "Christmas starts on the 18th now"
From 0a276f43fdb0085035d933717d6bcda38aeec451 Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Mon, 21 Dec 2020 23:13:39 -0600
Subject: [PATCH 057/165] Automatic changelog generation for PR #13773 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-13773.yml | 6 ++++++
1 file changed, 6 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-13773.yml
diff --git a/html/changelogs/AutoChangeLog-pr-13773.yml b/html/changelogs/AutoChangeLog-pr-13773.yml
new file mode 100644
index 0000000000..498ac42561
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13773.yml
@@ -0,0 +1,6 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "Zeolites now use gold rather then uranium for catalyst"
+ - tweak: "Zeolites are not as hard to make ph wise"
+ - tweak: "Making Zeolites heats up the beaker less allowing for better control"
From 7dfaacc5636df0160eab84117b5d486455912466 Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Mon, 21 Dec 2020 23:17:44 -0600
Subject: [PATCH 058/165] Automatic changelog generation for PR #13815 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-13815.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-13815.yml
diff --git a/html/changelogs/AutoChangeLog-pr-13815.yml b/html/changelogs/AutoChangeLog-pr-13815.yml
new file mode 100644
index 0000000000..630ca9d7f7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13815.yml
@@ -0,0 +1,4 @@
+author: "Yakumo Chen"
+delete-after: True
+changes:
+ - balance: "Slime Jelly is no longer obtainable from slimepeople. Go ask Xenobio"
From d72617e7d7fef3d24d1d43b35369a399340a59d4 Mon Sep 17 00:00:00 2001
From: Artur
Date: Tue, 22 Dec 2020 12:35:21 +0200
Subject: [PATCH 059/165] Fixes mint machine
---
code/modules/mining/mint.dm | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm
index 57a79553c3..2a8e0f2516 100644
--- a/code/modules/mining/mint.dm
+++ b/code/modules/mining/mint.dm
@@ -81,11 +81,10 @@
STOP_PROCESSING(SSmachines, src)
icon_state = "coinpress0"
-/obj/machinery/mineral/mint/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
- datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+/obj/machinery/mineral/mint/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
- ui = new(user, src, ui_key, "Mint", name, ui_x, ui_y, master_ui, state)
+ ui = new(user, src, "Mint", name)
ui.open()
/obj/machinery/mineral/mint/ui_data()
From c55d668f8e6bffa0a8d001a018793d2cba4449ed Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Tue, 22 Dec 2020 09:16:11 -0600
Subject: [PATCH 060/165] Automatic changelog generation for PR #13825 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-13825.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-13825.yml
diff --git a/html/changelogs/AutoChangeLog-pr-13825.yml b/html/changelogs/AutoChangeLog-pr-13825.yml
new file mode 100644
index 0000000000..ae82c1cd8e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13825.yml
@@ -0,0 +1,4 @@
+author: "raspy-on-osu"
+delete-after: True
+changes:
+ - tweak: "windoor open length"
From 745656241ddd6420da91e0e99bb1c3c88d13e028 Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Tue, 22 Dec 2020 10:32:12 -0600
Subject: [PATCH 061/165] Automatic changelog generation for PR #13832 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-13832.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-13832.yml
diff --git a/html/changelogs/AutoChangeLog-pr-13832.yml b/html/changelogs/AutoChangeLog-pr-13832.yml
new file mode 100644
index 0000000000..756edb7657
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13832.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - bugfix: "Bloodsuckers tresspass ability can no longer work while they are not awake."
From e4669280c5d6aed1a344072bfe7c4bc724bc0e18 Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Tue, 22 Dec 2020 10:32:29 -0600
Subject: [PATCH 062/165] Automatic changelog generation for PR #13828 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-13828.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-13828.yml
diff --git a/html/changelogs/AutoChangeLog-pr-13828.yml b/html/changelogs/AutoChangeLog-pr-13828.yml
new file mode 100644
index 0000000000..282b8a01e0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13828.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - bugfix: "you can now only entwine tails with people who have a tail"
From d46341bf815cda99f89d1ee5385d0723de5dc183 Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Tue, 22 Dec 2020 10:32:44 -0600
Subject: [PATCH 063/165] Automatic changelog generation for PR #13822 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-13822.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-13822.yml
diff --git a/html/changelogs/AutoChangeLog-pr-13822.yml b/html/changelogs/AutoChangeLog-pr-13822.yml
new file mode 100644
index 0000000000..743bdb500b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13822.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - bugfix: "Bloodcult stunhands now work against clockies like they were supposed to instead of hardstunning."
From 474fff91eb2022e0b1ff44e0337738a53a47cf6b Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Tue, 22 Dec 2020 10:40:36 -0600
Subject: [PATCH 064/165] Automatic changelog generation for PR #13772 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-13772.yml | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-13772.yml
diff --git a/html/changelogs/AutoChangeLog-pr-13772.yml b/html/changelogs/AutoChangeLog-pr-13772.yml
new file mode 100644
index 0000000000..109360cace
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13772.yml
@@ -0,0 +1,5 @@
+author: "silicons"
+delete-after: True
+changes:
+ - rscadd: "players can now respawn/return to lobby as a ghost after a 15 minute (default) delay and rejoin on another character with some/many restrictions"
+ - rscadd: "cryo now preserves everything"
From 6b4fc5bde78fd97591ca0c47a7d9a323968f7ae3 Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Tue, 22 Dec 2020 10:41:22 -0600
Subject: [PATCH 065/165] Automatic changelog generation for PR #13833 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-13833.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-13833.yml
diff --git a/html/changelogs/AutoChangeLog-pr-13833.yml b/html/changelogs/AutoChangeLog-pr-13833.yml
new file mode 100644
index 0000000000..8312c7a5a3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13833.yml
@@ -0,0 +1,4 @@
+author: "kiwedespars"
+delete-after: True
+changes:
+ - balance: "balanced bone gauntlets."
From fa5490d4b9752e8182c9b581d510ded9b1db0a3c Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Tue, 22 Dec 2020 10:42:23 -0600
Subject: [PATCH 066/165] Automatic changelog generation for PR #13835 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-13835.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-13835.yml
diff --git a/html/changelogs/AutoChangeLog-pr-13835.yml b/html/changelogs/AutoChangeLog-pr-13835.yml
new file mode 100644
index 0000000000..0ac90921c3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13835.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - rscadd: "pugilists can now parry"
From c1796db295a875e95fa61282837c05a39dd3ccac Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Tue, 22 Dec 2020 09:47:26 -0700
Subject: [PATCH 067/165] Update dullahan.dm
---
code/modules/mob/living/carbon/human/species_types/dullahan.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
index 7faa08b52c..0418292fea 100644
--- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -27,7 +27,7 @@
/datum/species/dullahan/check_roundstart_eligible()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
return TRUE
- return FALSE
+ return ..()
/datum/species/dullahan/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
. = ..()
From a8f8b06cea32c6a228b85e51603970c11c956f97 Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Tue, 22 Dec 2020 10:54:22 -0600
Subject: [PATCH 068/165] Automatic changelog generation for PR #13844 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-13844.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-13844.yml
diff --git a/html/changelogs/AutoChangeLog-pr-13844.yml b/html/changelogs/AutoChangeLog-pr-13844.yml
new file mode 100644
index 0000000000..cd1f7a25d4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13844.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - bugfix: "Fixes the mint machine's UI"
From e319eab5d85e8a4cdcc9bff5fa33db289e06924f Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Tue, 22 Dec 2020 11:11:05 -0600
Subject: [PATCH 069/165] Automatic changelog generation for PR #13837 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-13837.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-13837.yml
diff --git a/html/changelogs/AutoChangeLog-pr-13837.yml b/html/changelogs/AutoChangeLog-pr-13837.yml
new file mode 100644
index 0000000000..eda0b77a83
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13837.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - tweak: "anyone new to the server is lucky enough to have their sprint default to toggle instead of hold"
From 48cbe2ce4663829ff36e124436aff9227cc70c8d Mon Sep 17 00:00:00 2001
From: DeltaFire
Date: Tue, 22 Dec 2020 19:15:52 +0100
Subject: [PATCH 070/165] snap
---
code/datums/status_effects/buffs.dm | 13 ++++++++++---
.../antagonists/bloodsucker/bloodsucker_life.dm | 11 ++++++++---
2 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index ef3979d822..f4a53d5c72 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -438,12 +438,19 @@
return
else
linked_alert.icon_state = "fleshmend"
- owner.adjustBruteLoss(-10, FALSE)
- owner.adjustFireLoss(-5, FALSE)
owner.adjustOxyLoss(-10)
if(!iscarbon(owner))
+ owner.adjustBruteLoss(-10, FALSE)
+ owner.adjustFireLoss(-5, FALSE)
return
var/mob/living/carbon/C = owner
+ var/list/damaged_parts = C.get_damaged_bodyparts(TRUE,TRUE, status = list(BODYPART_ORGANIC, BODYPART_HYBRID, BODYPART_NANITES))
+ if(damaged_parts.len)
+ for(var/obj/item/bodypart/part in damaged_parts)
+ part.heal_damage(10/damaged_parts.len, 5/damaged_parts.len, only_organic = FALSE, updating_health = FALSE)
+ C.updatehealth()
+ C.update_damage_overlays()
+
QDEL_LIST(C.all_scars)
/obj/screen/alert/status_effect/fleshmend
@@ -599,7 +606,7 @@
//Heal brain damage and toxyloss, alongside trauma
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -8)
- owner.adjustToxLoss(-6, forced = TRUE)
+ owner.adjustToxLoss(-6, forced = TRUE, toxins_type = TOX_OMNI)
M.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC)
//Purges 50 rads per tick
if(owner.radiation > 0)
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
index 4117fc2b36..3e358cd795 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
@@ -120,9 +120,14 @@
if(bruteheal + fireheal + toxinheal > 0) // Just a check? Don't heal/spend, and return.
if(mult == 0)
return TRUE
+
// We have damage. Let's heal (one time)
- C.adjustBruteLoss(-bruteheal * mult, forced = TRUE)// Heal BRUTE / BURN in random portions throughout the body.
- C.adjustFireLoss(-fireheal * mult, forced = TRUE)
+ var/list/damaged_parts = C.get_damaged_bodyparts(TRUE,TRUE, status = list(BODYPART_ORGANIC, BODYPART_HYBRID, BODYPART_NANITES))
+ if(damaged_parts.len)
+ for(var/obj/item/bodypart/part in damaged_parts) // Heal BRUTE / BURN equally distibuted over all damaged bodyparts.
+ part.heal_damage((bruteheal * mult)/damaged_parts.len, (fireheal * mult)/damaged_parts.len, only_organic = FALSE, updating_health = FALSE)
+ C.updatehealth()
+ C.update_damage_overlays()
C.adjustToxLoss(-toxinheal * mult * 2, forced = TRUE) //Toxin healing because vamps arent immune
//C.heal_overall_damage(bruteheal * mult, fireheal * mult) // REMOVED: We need to FORCE this, because otherwise, vamps won't heal EVER. Swapped to above.
AddBloodVolume((bruteheal * -0.5 + fireheal * -1 + toxinheal * -0.2) / mult * costMult) // Costs blood to heal
@@ -276,7 +281,7 @@
/datum/antagonist/bloodsucker/proc/FinalDeath()
//Dont bother if we are already supposed to be dead
if(FinalDeath)
- return
+ return
FinalDeath = TRUE //We are now supposed to die. Lets not spam it.
if(!iscarbon(owner.current)) //Check for non carbons.
owner.current.gib()
From 2faf0d3fd18d9374f6491fed58a8acfec553aa26 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Tue, 22 Dec 2020 13:42:03 -0700
Subject: [PATCH 071/165] ok
---
code/game/say.dm | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/code/game/say.dm b/code/game/say.dm
index 61dd9c0879..3bc14ed245 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -98,11 +98,11 @@ GLOBAL_LIST_INIT(freqtospan, list(
/// Converts specific characters, like +, |, and _ to formatted output.
/atom/movable/proc/say_emphasis(input)
- var/static/regex/italics = regex(@"\|(\S[\w\W]*?\S)\|", "g")
+ var/static/regex/italics = regex(@"\|((?=\S)[\w\W]*?(?<=\S))\|", "g")
input = italics.Replace_char(input, "$1")
- var/static/regex/bold = regex(@"\+(\S[\w\W]*?\S)\+", "g")
+ var/static/regex/bold = regex(@"\+((?=\S)[\w\W]*?(?<=\S))\+", "g")
input = bold.Replace_char(input, "$1")
- var/static/regex/underline = regex(@"_(\S[\w\W]*?\S)_", "g")
+ var/static/regex/underline = regex(@"_((?=\S)[\w\W]*?(?<=\S))_", "g")
input = underline.Replace_char(input, "$1")
return input
From 0f16f866eb789a901d1cddd1f9c6b943903594ca Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Tue, 22 Dec 2020 17:43:41 -0700
Subject: [PATCH 072/165] Update arachnid.dm
---
code/modules/mob/living/carbon/human/species_types/arachnid.dm | 3 +++
1 file changed, 3 insertions(+)
diff --git a/code/modules/mob/living/carbon/human/species_types/arachnid.dm b/code/modules/mob/living/carbon/human/species_types/arachnid.dm
index 4a8c872400..46f30dd863 100644
--- a/code/modules/mob/living/carbon/human/species_types/arachnid.dm
+++ b/code/modules/mob/living/carbon/human/species_types/arachnid.dm
@@ -139,6 +139,9 @@
if(E.web_ready == FALSE)
to_chat(H, "You need to wait awhile to regenerate web fluid.")
return
+ if(!isliving(A) && A.anchored)
+ to_chat(H, "[A] is bolted to the floor!")
+ return
if(!do_after(H, 10 SECONDS, 1, A))
to_chat(H, "Your web spinning was interrupted!")
return
From 11722f6f5ec67a627e3d9389c8f0028d599946a7 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Tue, 22 Dec 2020 17:47:53 -0700
Subject: [PATCH 073/165] Update arachnid.dm
---
code/modules/mob/living/carbon/human/species_types/arachnid.dm | 3 +++
1 file changed, 3 insertions(+)
diff --git a/code/modules/mob/living/carbon/human/species_types/arachnid.dm b/code/modules/mob/living/carbon/human/species_types/arachnid.dm
index 46f30dd863..68d2cbbff6 100644
--- a/code/modules/mob/living/carbon/human/species_types/arachnid.dm
+++ b/code/modules/mob/living/carbon/human/species_types/arachnid.dm
@@ -142,6 +142,9 @@
if(!isliving(A) && A.anchored)
to_chat(H, "[A] is bolted to the floor!")
return
+ if(istype(A, /obj/structure/arachnid))
+ to_chat(H, "No double wrapping.")
+ return
if(!do_after(H, 10 SECONDS, 1, A))
to_chat(H, "Your web spinning was interrupted!")
return
From 4d4d0e9ec3aafa3862822e568c503b7ca38aacad Mon Sep 17 00:00:00 2001
From: DeltaFire
Date: Wed, 23 Dec 2020 02:50:15 +0100
Subject: [PATCH 074/165] a fix fix
---
code/game/objects/items/tools/weldingtool.dm | 27 ++++++++++++--------
1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index c8eb96005c..7336d8aae8 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -24,13 +24,14 @@
var/self_fueling = FALSE //Do we refill ourselves or not
var/nextrefueltick = 0 // How long it takes before we get a new fuel unit
+ var/refueling_interval = 10 //Every how many processing ticks does this refuel? (1 = every processing tick)
custom_materials = list(/datum/material/iron=70, /datum/material/glass=30)
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
var/status = TRUE //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
var/max_fuel = 20 //The max amount of fuel the welder can hold
var/change_icons = 1
- var/can_off_process = 0
+ var/can_off_process = FALSE
var/light_intensity = 2 //how powerful the emitted light is when used.
var/progress_flash_divisor = 10
var/burned_fuel_for = 0 //when fuel was last removed
@@ -66,6 +67,14 @@
. += "[initial(icon_state)]-on"
/obj/item/weldingtool/process()
+ //This handles refueling. Its looking at how much fuel the tool has and comparing that to how much it holds
+ //This then looks if the refuel tick has come based on world time.
+ //Then looks if we refuel ourselves or not.
+
+ if(self_fueling && get_fuel() < max_fuel && nextrefueltick <= world.time)
+ nextrefueltick = world.time + refueling_interval
+ reagents.add_reagent(/datum/reagent/fuel, 1)
+
switch(welding)
if(0)
force = 3
@@ -86,14 +95,6 @@
//This is to start fires. process() is only called if the welder is on.
open_flame()
- //This handles refueling. Its looking at how much fuel the tool has and comparing that to how much it holds
- //This then looks if the refuel tick has come based on world time.
- //Then looks if we refuel ourselves or not.
-
- if(get_fuel() < max_fuel && nextrefueltick < world.time && self_fueling)
- nextrefueltick = world.time + 10
- reagents.add_reagent(/datum/reagent/fuel, 1)
-
/obj/item/weldingtool/suicide_act(mob/user)
user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!")
return (FIRELOSS)
@@ -367,7 +368,7 @@
custom_materials = list(/datum/material/iron=70, /datum/material/glass=120)
change_icons = 0
self_fueling = TRUE
- can_off_process = 1
+ can_off_process = TRUE
light_intensity = 1
toolspeed = 0.5
@@ -384,16 +385,20 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "welder"
self_fueling = TRUE
+ can_off_process = TRUE
+ refueling_interval = 1
toolspeed = 0.1
light_intensity = 0
change_icons = 0
/obj/item/weldingtool/advanced
name = "advanced welding tool"
- desc = "A modern welding tool combined with an alien welding tool, it never runs out of fuel and works almost as fast."
+ desc = "A modern welding tool combined with an alien welding tool, it almost never runs out of fuel and works nearly as fast."
icon = 'icons/obj/advancedtools.dmi'
icon_state = "welder"
self_fueling = TRUE
+ can_off_process = TRUE
+ refueling_interval = 2
toolspeed = 0.2
light_intensity = 0
change_icons = 0
From 35896e92ecf038fec910b64e7923f7525e726345 Mon Sep 17 00:00:00 2001
From: Chiirno
Date: Tue, 22 Dec 2020 21:50:22 -0400
Subject: [PATCH 075/165] Paramedic office added and operating room remodeled
---
_maps/map_files/BoxStation/BoxStation.dmm | 2311 ++++++++++-------
.../crates_lockers/closets/secure/medical.dm | 19 +
icons/obj/closet.dmi | Bin 39711 -> 40446 bytes
master | 0
portable-chem-dispenser | 0
5 files changed, 1351 insertions(+), 979 deletions(-)
create mode 100644 master
create mode 100644 portable-chem-dispenser
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 87178c32f3..829bca571b 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -4821,7 +4821,7 @@
pixel_x = -32
},
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"aiQ" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -5088,7 +5088,7 @@
pixel_x = -32
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"ajw" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -9400,7 +9400,7 @@
/obj/item/storage/box/masks,
/obj/structure/table,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"asM" = (
/obj/structure/table,
/obj/item/crowbar,
@@ -9409,8 +9409,11 @@
/obj/structure/sign/warning/nosmoking{
pixel_y = 30
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
+/area/medical/surgery)
"asN" = (
/obj/machinery/airalarm{
dir = 4;
@@ -15795,7 +15798,7 @@
/obj/structure/plasticflaps/opaque,
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aJL" = (
/obj/machinery/navbeacon{
codes_txt = "delivery;dir=2";
@@ -16090,7 +16093,7 @@
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aKD" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -16214,7 +16217,7 @@
"aKT" = (
/obj/structure/closet/secure_closet/freezer/meat,
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aKU" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel,
@@ -16229,7 +16232,7 @@
dir = 8
},
/turf/open/floor/plasteel,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aKW" = (
/obj/machinery/light_switch{
pixel_y = 28
@@ -16697,13 +16700,13 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aMl" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
},
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aMm" = (
/obj/machinery/firealarm{
pixel_y = 24
@@ -16811,7 +16814,7 @@
"aMD" = (
/obj/machinery/icecream_vat,
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aME" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -16823,7 +16826,7 @@
/area/hydroponics)
"aMF" = (
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aMG" = (
/obj/structure/closet/crate/hydroponics,
/obj/item/shovel/spade,
@@ -17117,7 +17120,7 @@
name = "Pete"
},
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aNL" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
@@ -17128,7 +17131,7 @@
dir = 8
},
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aNN" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -17149,7 +17152,7 @@
},
/obj/machinery/vending/wardrobe/chef_wardrobe,
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aNP" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/wood,
@@ -17537,7 +17540,7 @@
"aOI" = (
/obj/structure/kitchenspike,
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aOJ" = (
/obj/structure/chair/comfy/brown{
dir = 8
@@ -17559,14 +17562,14 @@
dir = 8
},
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aON" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aOO" = (
/obj/machinery/door/airlock{
name = "Bar Storage";
@@ -17603,7 +17606,7 @@
"aOT" = (
/obj/machinery/gibber,
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"aOU" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
@@ -19221,11 +19224,11 @@
"aTs" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aTt" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aTu" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -19536,11 +19539,11 @@
dir = 8
},
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aUm" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aUn" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
@@ -19641,7 +19644,7 @@
dir = 4
},
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aUz" = (
/obj/machinery/hydroponics/constructable,
/obj/machinery/airalarm{
@@ -19654,7 +19657,7 @@
/obj/structure/table/wood,
/obj/item/flashlight/lamp,
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aUB" = (
/obj/structure/bookcase/random/adult,
/turf/open/floor/wood,
@@ -19732,19 +19735,19 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aUO" = (
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aUQ" = (
/obj/structure/table/wood,
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aUR" = (
/obj/structure/table/wood,
/obj/item/pen/red,
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aUS" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -19770,7 +19773,7 @@
/obj/structure/table/wood,
/obj/item/flashlight/lamp/green,
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aUX" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
@@ -20322,7 +20325,7 @@
dir = 4
},
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aWg" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
@@ -20339,7 +20342,7 @@
dir = 8
},
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aWj" = (
/obj/structure/grille,
/obj/structure/window{
@@ -20370,7 +20373,7 @@
pixel_x = -28
},
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aWn" = (
/obj/structure/closet/wardrobe/black,
/obj/item/clothing/shoes/jackboots,
@@ -20405,19 +20408,19 @@
dir = 8
},
/turf/open/floor/carpet,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aWs" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
},
/turf/open/floor/carpet,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aWt" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
},
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aWu" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
@@ -21112,7 +21115,7 @@
/area/security/detectives_office)
"aXL" = (
/turf/open/floor/carpet,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aXM" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -21132,7 +21135,7 @@
},
/obj/structure/filingcabinet/chestdrawer,
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aXP" = (
/obj/machinery/portable_atmospherics/canister/air,
/turf/open/floor/plating,
@@ -21196,7 +21199,7 @@
dir = 4
},
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aXY" = (
/obj/structure/chair/office/dark,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -21204,13 +21207,13 @@
dir = 4
},
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aXZ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/carpet,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aYb" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -21249,7 +21252,7 @@
dir = 4
},
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aYe" = (
/obj/machinery/light_switch{
pixel_y = 28
@@ -21715,7 +21718,7 @@
/obj/item/folder/blue,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"aZo" = (
/obj/structure/sink{
dir = 4;
@@ -22238,7 +22241,7 @@
/obj/structure/table/wood,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"baI" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -22251,7 +22254,7 @@
pixel_y = -29
},
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"baK" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -22597,7 +22600,7 @@
/area/hallway/secondary/exit)
"bbI" = (
/obj/machinery/power/apc{
- areastring = "/area/security/vacantoffice";
+ areastring = "/area/vacant_room/office";
dir = 8;
name = "Vacant Office APC";
pixel_x = -24
@@ -23041,14 +23044,10 @@
/turf/open/floor/carpet,
/area/bridge/meeting_room)
"bdb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white/side,
/area/hallway/primary/starboard)
"bdc" = (
-/obj/structure/extinguisher_cabinet{
- pixel_y = -30
- },
-/obj/machinery/light,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white/corner,
/area/hallway/primary/starboard)
"bdd" = (
@@ -23117,13 +23116,13 @@
/area/crew_quarters/heads/captain)
"bdl" = (
/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-8"
- },
/obj/structure/cable{
icon_state = "2-4"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"bdm" = (
@@ -23164,11 +23163,20 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"bdr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
"bds" = (
/obj/machinery/camera{
c_tag = "Starboard Primary Hallway 4";
@@ -23346,13 +23354,9 @@
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/locker)
"bdN" = (
-/obj/machinery/door/airlock/medical{
- name = "Morgue";
- req_access_txt = "6"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
+/area/medical/surgery)
"bdO" = (
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
@@ -23665,8 +23669,13 @@
},
/area/hallway/primary/starboard)
"bez" = (
+/obj/machinery/power/apc{
+ areastring = "/area/hallway/primary/starboard";
+ name = "Starboard Primary Hallway APC";
+ pixel_y = -24
+ },
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "0-4"
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
@@ -23881,7 +23890,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"beY" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel/dark,
@@ -24107,11 +24116,11 @@
"bfG" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"bfH" = (
/obj/structure/sign/departments/medbay/alt,
/turf/closed/wall,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"bfI" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
@@ -24141,18 +24150,13 @@
/turf/open/floor/plasteel,
/area/quartermaster/sorting)
"bfO" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bfP" = (
-/obj/machinery/power/apc{
- areastring = "/area/hallway/primary/starboard";
- name = "Starboard Primary Hallway APC";
- pixel_y = -24
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = "MedbayFoyer";
+ name = "Paramedic's Office";
+ req_access_txt = "5;6;12;64"
},
-/obj/structure/cable,
/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
+/area/medical/paramedic)
"bfQ" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -24337,22 +24341,22 @@
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
/obj/machinery/power/apc{
areastring = "/area/science/robotics/mechbay";
dir = 4;
name = "Mech Bay APC";
pixel_x = 26
},
-/obj/structure/cable{
- icon_state = "0-2"
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/department/medical/morgue)
"bgp" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bgq" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -24528,7 +24532,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"bgS" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -24641,7 +24645,7 @@
"bhe" = (
/obj/structure/chair,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"bhg" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
@@ -24715,25 +24719,9 @@
/turf/open/floor/plasteel,
/area/security/checkpoint/medical)
"bhm" = (
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bhn" = (
-/obj/structure/table,
-/obj/item/storage/box/bodybags,
-/obj/item/pen,
-/obj/machinery/light/small{
- dir = 8
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bho" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/bodycontainer/morgue{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bhp" = (
/obj/machinery/power/apc{
areastring = "/area/medical/morgue";
dir = 1;
@@ -24745,18 +24733,61 @@
},
/turf/open/floor/plasteel/dark,
/area/medical/morgue)
-"bhq" = (
+"bhn" = (
/obj/machinery/light/small{
- dir = 4
+ dir = 8
+ },
+/obj/structure/bodycontainer/morgue,
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
+"bho" = (
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/structure/bodycontainer/morgue{
+ dir = 8
},
/turf/open/floor/plasteel/dark,
/area/medical/morgue)
-"bhr" = (
-/obj/machinery/door/airlock{
- name = "Starboard Emergency Storage"
+"bhp" = (
+/obj/effect/turf_decal/trimline/blue/filled/corner,
+/obj/structure/table/glass,
+/obj/structure/cable{
+ icon_state = "0-2"
},
-/turf/open/floor/plating,
-/area/storage/emergency/starboard)
+/obj/machinery/power/apc{
+ areastring = "/area/medical/paramedic";
+ dir = 8;
+ name = "Paramedic's Office APC";
+ pixel_x = -26
+ },
+/obj/item/flashlight/lamp{
+ pixel_x = -1;
+ pixel_y = 10
+ },
+/obj/item/paper_bin{
+ pixel_x = 6;
+ pixel_y = 2
+ },
+/obj/item/pen/blue{
+ pixel_x = -6;
+ pixel_y = -2
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/paramedic)
+"bhq" = (
+/obj/effect/turf_decal/trimline/blue/filled/line,
+/obj/structure/table/glass,
+/obj/effect/spawner/lootdrop/cig_packs,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/paramedic)
+"bhr" = (
+/turf/closed/wall,
+/area/crew_quarters/kitchen/backroom)
"bhs" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel,
@@ -24847,7 +24878,7 @@
/area/science/robotics/lab)
"bhA" = (
/turf/closed/wall,
-/area/science/research)
+/area/science)
"bhB" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/door/airlock/research{
@@ -24855,7 +24886,7 @@
req_access_txt = "47"
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bhC" = (
/obj/machinery/door/poddoor/shutters/preopen{
id = "rnd";
@@ -24863,7 +24894,7 @@
},
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
-/area/science/lab)
+/area/science/research)
"bhD" = (
/obj/structure/table/reinforced,
/obj/machinery/door/window/southright{
@@ -24875,7 +24906,7 @@
name = "research lab shutters"
},
/turf/open/floor/plating,
-/area/science/lab)
+/area/science/research)
"bhE" = (
/obj/structure/table,
/obj/item/stack/sheet/glass/fifty{
@@ -24885,7 +24916,7 @@
/obj/item/stack/sheet/metal/fifty,
/obj/item/clothing/glasses/welding,
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bhF" = (
/obj/structure/table,
/obj/item/storage/toolbox/mechanical{
@@ -24900,7 +24931,7 @@
dir = 1
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bhG" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
@@ -25014,13 +25045,13 @@
"bhU" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bhV" = (
/obj/structure/disposalpipe/segment{
dir = 6
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bhW" = (
/obj/machinery/door/poddoor/shutters{
id = "qm_warehouse";
@@ -25067,7 +25098,7 @@
pixel_x = 29
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bic" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -25228,7 +25259,7 @@
dir = 1
},
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"biu" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
@@ -25283,22 +25314,37 @@
/turf/open/floor/plating,
/area/quartermaster/storage)
"biB" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 4
+ },
+/obj/machinery/computer/crew{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
/obj/structure/cable{
icon_state = "1-2"
},
/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/area/medical/paramedic)
"biC" = (
-/turf/open/floor/plating,
-/area/storage/emergency/starboard)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall,
+/area/crew_quarters/kitchen/backroom)
"biD" = (
-/obj/item/storage/box/lights/mixed,
-/turf/open/floor/plating,
-/area/storage/emergency/starboard)
-"biE" = (
-/obj/machinery/light/small{
- dir = 1
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 8
},
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/closet/secure_closet/paramedic,
+/turf/open/floor/plasteel/dark,
+/area/medical/paramedic)
+"biE" = (
+/obj/structure/reagent_dispensers/watertank,
/obj/item/extinguisher,
/turf/open/floor/plating,
/area/storage/emergency/starboard)
@@ -25424,7 +25470,7 @@
dir = 9
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"biS" = (
/obj/machinery/camera{
c_tag = "Research Division Access"
@@ -25437,7 +25483,7 @@
dir = 5
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"biT" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -25455,7 +25501,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"biV" = (
/obj/structure/chair/stool,
/obj/effect/landmark/start/scientist,
@@ -25466,10 +25512,10 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"biW" = (
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"biX" = (
/obj/machinery/camera{
c_tag = "Research and Development";
@@ -25487,7 +25533,7 @@
dir = 1
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"biY" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -25860,7 +25906,7 @@
/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"bjT" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/obj/effect/turf_decal/tile/blue,
@@ -25868,14 +25914,14 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"bjU" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"bjV" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -25885,7 +25931,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"bjX" = (
/obj/structure/table,
/obj/machinery/recharger{
@@ -25919,38 +25965,38 @@
dir = 10
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bka" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bkb" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/vending/wallmed{
+ pixel_y = -28
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/paramedic)
+"bkd" = (
+/obj/effect/turf_decal/trimline/blue/filled/corner{
+ dir = 1
+ },
+/obj/machinery/suit_storage_unit/paramedic,
/obj/machinery/camera{
c_tag = "Medbay Morgue";
dir = 8;
network = list("ss13","medbay")
},
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bkc" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/storage/emergency/starboard)
-"bkd" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/turf/open/floor/plating,
-/area/storage/emergency/starboard)
-"bkf" = (
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/storage/emergency/starboard)
+/area/medical/paramedic)
"bkh" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/circuit,
@@ -25971,7 +26017,7 @@
pixel_x = 24
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bkj" = (
/obj/structure/closet/emcloset,
/obj/machinery/airalarm{
@@ -26036,7 +26082,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bkr" = (
/obj/machinery/shower{
dir = 8
@@ -26048,7 +26094,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bks" = (
/obj/machinery/requests_console{
department = "Science";
@@ -26058,7 +26104,7 @@
receive_ore_updates = 1
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bkt" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -26076,7 +26122,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bkw" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/light{
@@ -26226,11 +26272,16 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/light/small,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/medical/morgue)
"bkR" = (
@@ -26243,9 +26294,7 @@
/obj/machinery/light_switch{
pixel_y = -25
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/medical/morgue)
"bkS" = (
@@ -26267,21 +26316,11 @@
/turf/open/floor/plating,
/area/maintenance/central)
"bkU" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/structure/closet/emcloset,
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
},
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/area/hallway/primary/starboard)
"bkV" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -26345,6 +26384,10 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/machinery/door/airlock/maintenance{
+ name = "Morgue Maintenance";
+ req_access_txt = "6"
+ },
/turf/open/floor/plasteel/dark,
/area/medical/morgue)
"blb" = (
@@ -26394,21 +26437,11 @@
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"blg" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
},
-/obj/machinery/door/airlock/maintenance{
- name = "Morgue Maintenance";
- req_access_txt = "6"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
+/turf/open/floor/plasteel,
+/area/hallway/primary/starboard)
"blh" = (
/obj/structure/table/reinforced,
/obj/machinery/door/window/eastright{
@@ -26440,7 +26473,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"bll" = (
/obj/structure/table/reinforced,
/obj/item/folder/white,
@@ -26466,26 +26499,12 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"blo" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/power/apc{
- areastring = "/area/storage/emergency/starboard";
- dir = 1;
- name = "Starboard Emergency Storage APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
+/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
+/turf/open/floor/plasteel,
+/area/hallway/primary/starboard)
"blp" = (
/obj/machinery/power/apc{
areastring = "/area/security/checkpoint/medical";
@@ -26520,8 +26539,13 @@
/turf/open/floor/plating,
/area/maintenance/department/medical/morgue)
"blr" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
+/obj/structure/bodycontainer/morgue{
+ dir = 8
+ },
+/obj/machinery/camera{
+ c_tag = "Medbay Morgue";
+ dir = 6;
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/dark,
/area/medical/morgue)
@@ -26674,31 +26698,31 @@
dir = 6
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"blI" = (
/obj/machinery/rnd/destructive_analyzer,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/plasteel,
-/area/science/lab)
+/area/science/research)
"blJ" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/machinery/rnd/production/protolathe/department/science,
/turf/open/floor/plasteel,
-/area/science/lab)
+/area/science/research)
"blK" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/plasteel,
-/area/science/lab)
+/area/science/research)
"blL" = (
/obj/machinery/holopad,
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"blM" = (
/obj/effect/turf_decal/bot,
/obj/effect/landmark/start/cyborg,
@@ -26765,7 +26789,7 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"blY" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/stripes/line{
@@ -26780,7 +26804,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bma" = (
/obj/structure/table/glass,
/obj/item/stock_parts/manipulator,
@@ -26799,7 +26823,7 @@
pixel_x = 24
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bmb" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -27065,7 +27089,7 @@
pixel_x = -24
},
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"bmK" = (
/obj/structure/table/reinforced,
/turf/open/floor/plasteel/white,
@@ -27136,13 +27160,11 @@
/turf/open/floor/plasteel,
/area/quartermaster/office)
"bmR" = (
-/obj/structure/table,
-/obj/item/paper/guides/jobs/medical/morgue{
- pixel_x = 5;
- pixel_y = 4
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
},
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/turf/open/floor/plasteel,
+/area/hallway/primary/starboard)
"bmS" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
@@ -27170,15 +27192,15 @@
/turf/open/floor/plasteel/dark,
/area/medical/morgue)
"bmW" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
},
/turf/closed/wall,
/area/medical/morgue)
"bmX" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/medical/genetics)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/hallway/primary/starboard)
"bmY" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -27221,7 +27243,7 @@
dir = 1
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bng" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -27230,13 +27252,13 @@
dir = 1
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bnh" = (
/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bni" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -27284,7 +27306,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bnl" = (
/obj/item/stack/sheet/glass,
/obj/structure/table/glass,
@@ -27301,7 +27323,7 @@
},
/obj/item/stock_parts/scanning_module,
/obj/machinery/power/apc{
- areastring = "/area/science/lab";
+ areastring = "/area/science/research";
dir = 4;
name = "Research Lab APC";
pixel_x = 26
@@ -27310,38 +27332,38 @@
icon_state = "0-8"
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bnm" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
-/area/science/research)
+/area/science)
"bnn" = (
/obj/machinery/computer/rdconsole/core{
dir = 4
},
/turf/open/floor/plasteel,
-/area/science/lab)
+/area/science/research)
"bno" = (
/obj/item/reagent_containers/glass/beaker/sulphuric,
/obj/machinery/rnd/production/circuit_imprinter/department/science,
/turf/open/floor/plasteel,
-/area/science/lab)
+/area/science/research)
"bnp" = (
/turf/open/floor/plasteel,
-/area/science/lab)
+/area/science/research)
"bnq" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/closed/wall,
-/area/science/lab)
+/area/science/research)
"bnr" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
/obj/structure/plasticflaps/opaque,
/turf/open/floor/plating,
-/area/science/lab)
+/area/science/research)
"bns" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -27855,7 +27877,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/science/research)
+/area/science)
"box" = (
/turf/closed/wall,
/area/science/robotics/lab)
@@ -27868,7 +27890,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/science/research)
+/area/science)
"boz" = (
/obj/machinery/door/firedoor/heavy,
/obj/machinery/door/poddoor/preopen{
@@ -27877,16 +27899,16 @@
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/science/research)
+/area/science)
"boA" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"boB" = (
/turf/closed/wall,
-/area/science/lab)
+/area/science/research)
"boC" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
@@ -27969,7 +27991,7 @@
/area/science/robotics/lab)
"boM" = (
/turf/open/floor/plasteel/white/corner,
-/area/science/research)
+/area/science)
"boN" = (
/obj/effect/turf_decal/tile/brown{
dir = 1
@@ -27979,18 +28001,18 @@
"boO" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white/side,
-/area/science/research)
+/area/science)
"boP" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"boQ" = (
/obj/structure/table,
/obj/machinery/cell_charger,
/obj/item/stock_parts/cell/high/plus,
/obj/item/stock_parts/cell/high/plus,
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"boR" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -28173,7 +28195,7 @@
icon_state = "1-2"
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bpp" = (
/obj/machinery/door/window/eastright{
base_state = "left";
@@ -28184,7 +28206,7 @@
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
-/area/science/lab)
+/area/science/research)
"bpq" = (
/obj/machinery/light_switch{
pixel_y = -23
@@ -28193,7 +28215,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bpr" = (
/obj/machinery/navbeacon{
codes_txt = "delivery;dir=8";
@@ -28203,7 +28225,7 @@
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/science/lab)
+/area/science/research)
"bps" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
@@ -28462,7 +28484,7 @@
/turf/open/floor/plasteel/white/corner{
dir = 8
},
-/area/science/research)
+/area/science)
"bpY" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -28477,7 +28499,7 @@
/obj/item/disk/design_disk,
/obj/item/disk/design_disk,
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bqa" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -28511,7 +28533,7 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bqg" = (
/obj/machinery/atmospherics/components/binary/valve{
dir = 1
@@ -28556,7 +28578,7 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white,
-/area/science/lab)
+/area/science/research)
"bql" = (
/obj/machinery/conveyor{
dir = 4;
@@ -28849,6 +28871,9 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bqY" = (
@@ -28961,7 +28986,7 @@
/turf/open/floor/plasteel/white/side{
dir = 9
},
-/area/science/research)
+/area/science)
"brn" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -28971,7 +28996,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bro" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -28982,7 +29007,7 @@
/turf/open/floor/plasteel/white/side{
dir = 10
},
-/area/science/research)
+/area/science)
"brp" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -28992,7 +29017,7 @@
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"brq" = (
/obj/effect/turf_decal/stripes/line,
/obj/machinery/button/door{
@@ -29033,7 +29058,7 @@
/turf/open/floor/plasteel/white/side{
dir = 9
},
-/area/science/research)
+/area/science)
"bru" = (
/obj/machinery/firealarm{
pixel_y = 24
@@ -29080,7 +29105,7 @@
},
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
-/area/science/lab)
+/area/science/research)
"bry" = (
/obj/machinery/door/airlock/maintenance{
name = "Experimentation Lab Maintenance";
@@ -29500,17 +29525,17 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"bsA" = (
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
/turf/open/floor/plasteel/white/side{
dir = 9
},
-/area/science/research)
+/area/science)
"bsC" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bsD" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -29519,7 +29544,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bsE" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -29666,7 +29691,7 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"bsY" = (
/obj/structure/chair/office/dark{
dir = 4
@@ -29682,7 +29707,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bta" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -29694,7 +29719,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"btb" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -29706,7 +29731,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"btc" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
@@ -29727,7 +29752,7 @@
/turf/open/floor/plasteel/white/side{
dir = 6
},
-/area/science/research)
+/area/science)
"btf" = (
/obj/machinery/requests_console{
department = "Medbay";
@@ -29738,10 +29763,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
-"btg" = (
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
"bth" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -29750,7 +29771,7 @@
icon_state = "plant-16"
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bti" = (
/obj/structure/closet/wardrobe/grey,
/obj/item/clothing/head/beret/black,
@@ -29796,7 +29817,7 @@
dir = 4
},
/turf/closed/wall/r_wall,
-/area/science/research)
+/area/science)
"bto" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -29896,7 +29917,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"btx" = (
/obj/machinery/door/firedoor/heavy,
/obj/machinery/door/poddoor/preopen{
@@ -29908,7 +29929,7 @@
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/science/research)
+/area/science)
"bty" = (
/obj/structure/chair{
dir = 8
@@ -29931,7 +29952,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"btB" = (
/obj/machinery/computer/bounty{
dir = 4
@@ -30064,7 +30085,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"btQ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -30072,7 +30093,7 @@
/turf/open/floor/plasteel/white/side{
dir = 10
},
-/area/science/research)
+/area/science)
"btR" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -30086,7 +30107,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"btT" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -30101,7 +30122,7 @@
dir = 1
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"btV" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -30115,7 +30136,7 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"btX" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -30240,7 +30261,7 @@
/turf/open/floor/plasteel/white/side{
dir = 8
},
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bul" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -30266,7 +30287,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bup" = (
/obj/machinery/light,
/obj/structure/cable{
@@ -30276,7 +30297,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"buq" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -30304,7 +30325,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"but" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -30457,7 +30478,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"buI" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -30544,7 +30565,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"buU" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -30562,7 +30583,7 @@
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/science/research)
+/area/science)
"buV" = (
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -30620,7 +30641,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bvc" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -30633,13 +30654,13 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bvd" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/closed/wall,
-/area/medical/sleeper)
+/area/medical/surgery)
"bve" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -30654,7 +30675,7 @@
dir = 1
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bvf" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
@@ -30663,7 +30684,7 @@
/turf/open/floor/plasteel/white/side{
dir = 9
},
-/area/science/research)
+/area/science)
"bvg" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -30673,23 +30694,16 @@
},
/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
/turf/open/floor/plasteel/white,
-/area/science/research)
-"bvh" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/medical/sleeper)
+/area/science)
"bvi" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
-/area/medical/sleeper)
-"bvj" = (
-/turf/closed/wall,
-/area/medical/sleeper)
+/area/medical/surgery)
"bvk" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"bvl" = (
/obj/machinery/door/airlock/medical/glass{
name = "Surgery Observation"
@@ -30697,11 +30711,11 @@
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
+/area/medical/surgery)
"bvm" = (
/obj/machinery/holopad,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bvn" = (
/obj/machinery/button/door{
desc = "A remote control switch for the genetics doors.";
@@ -30789,7 +30803,7 @@
/area/medical/genetics)
"bvx" = (
/turf/closed/wall/r_wall,
-/area/science/research)
+/area/science)
"bvy" = (
/obj/machinery/camera{
c_tag = "Genetics Research";
@@ -30850,7 +30864,7 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bvE" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -30858,7 +30872,7 @@
/turf/open/floor/plasteel/white/side{
dir = 6
},
-/area/science/research)
+/area/science)
"bvF" = (
/obj/machinery/requests_console{
department = "Cargo Bay";
@@ -30895,7 +30909,7 @@
/turf/open/floor/plasteel/white/side{
dir = 9
},
-/area/science/research)
+/area/science)
"bvI" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -31194,11 +31208,11 @@
c_tag = "Surgery Observation";
network = list("ss13","medbay")
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
},
/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
+/area/medical/surgery)
"bwx" = (
/obj/machinery/door/window/eastleft{
name = "Medical Delivery";
@@ -31217,18 +31231,20 @@
dir = 4
},
/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
+/area/medical/surgery)
"bwD" = (
/obj/machinery/sleeper{
dir = 8
},
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bwE" = (
/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
+/area/medical/surgery)
"bwF" = (
/obj/structure/table/glass,
/obj/item/reagent_containers/glass/beaker/cryoxadone{
@@ -31240,20 +31256,20 @@
pixel_y = 1
},
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bwG" = (
/obj/structure/sign/warning/nosmoking,
/turf/closed/wall,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bwH" = (
/obj/structure/table,
/obj/machinery/cell_charger,
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bwI" = (
/obj/machinery/atmospherics/components/unary/cryo_cell,
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bwJ" = (
/obj/structure/table/glass,
/obj/machinery/camera{
@@ -31263,7 +31279,7 @@
/obj/item/reagent_containers/glass/beaker/cryoxadone,
/obj/item/reagent_containers/glass/beaker/cryoxadone,
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bwK" = (
/obj/structure/extinguisher_cabinet{
pixel_x = 27
@@ -31331,7 +31347,7 @@
/turf/open/floor/plasteel/white/side{
dir = 9
},
-/area/science/research)
+/area/science)
"bwQ" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -31444,31 +31460,27 @@
/area/security/checkpoint/supply)
"bwZ" = (
/obj/structure/chair,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
+/area/medical/surgery)
"bxa" = (
/obj/structure/chair,
/obj/structure/sign/warning/nosmoking{
pixel_x = -28
},
/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
+/area/medical/surgery)
"bxb" = (
/obj/structure/chair,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
+ dir = 4
},
/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
+/area/medical/surgery)
"bxc" = (
/obj/machinery/holopad,
/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
+/area/medical/surgery)
"bxd" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -31480,7 +31492,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bxe" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -31493,7 +31505,7 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bxf" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -31507,7 +31519,7 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"bxg" = (
/obj/structure/reagent_dispensers/watertank,
/obj/effect/decal/cleanable/cobweb/cobweb2,
@@ -31728,7 +31740,7 @@
/turf/open/floor/plasteel/white/side{
dir = 9
},
-/area/science/research)
+/area/science)
"bxG" = (
/obj/machinery/door/airlock/command{
name = "Head of Personnel";
@@ -31797,13 +31809,13 @@
pixel_x = -28
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bxO" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bxP" = (
/obj/structure/cable{
icon_state = "2-8"
@@ -31818,34 +31830,34 @@
/area/crew_quarters/heads/hor)
"bxQ" = (
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bxR" = (
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bxS" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 4
},
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bxT" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 5
},
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bxU" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 10
},
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bxV" = (
/obj/machinery/atmospherics/pipe/manifold/general/visible,
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bxW" = (
/obj/machinery/door/airlock/command/glass{
name = "Research Director";
@@ -32374,37 +32386,41 @@
dir = 4
},
/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
-/area/medical/sleeper)
+/area/medical/surgery)
"byZ" = (
/obj/structure/disposalpipe/segment{
dir = 6
},
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
-/area/medical/sleeper)
+/area/medical/surgery)
"bza" = (
/obj/structure/chair,
/obj/machinery/airalarm{
pixel_y = 23
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
+/area/medical/surgery)
"bzb" = (
/obj/structure/disposalpipe/segment{
dir = 9
},
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/medical/sleeper)
+/turf/closed/wall,
+/area/medical/surgery)
"bzc" = (
/obj/machinery/door/airlock/medical/glass{
name = "Recovery Room"
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bzd" = (
/obj/structure/table,
/obj/item/stack/packageWrap,
@@ -32427,14 +32443,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bzf" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/effect/landmark/start/paramedic,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bzg" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
@@ -32446,19 +32455,19 @@
dir = 6
},
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bzi" = (
/obj/machinery/atmospherics/pipe/manifold/general/visible{
dir = 4
},
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bzj" = (
/obj/machinery/atmospherics/pipe/manifold/general/visible{
dir = 1
},
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bzk" = (
/obj/structure/reagent_dispensers/fueltank,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -32614,14 +32623,14 @@
/turf/open/floor/plasteel/white/side{
dir = 9
},
-/area/science/research)
+/area/science)
"bzB" = (
/obj/structure/cable{
icon_state = "1-2"
},
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bzC" = (
/obj/structure/table,
/obj/machinery/recharger{
@@ -32652,7 +32661,7 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"bzF" = (
/obj/machinery/firealarm{
dir = 8;
@@ -32670,17 +32679,18 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"bzH" = (
-/obj/structure/table,
-/obj/item/hemostat,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white/side,
-/area/medical/sleeper)
+/obj/effect/spawner/structure/window,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/medical/surgery)
"bzI" = (
/obj/structure/disposalpipe/segment,
-/obj/structure/table,
-/obj/item/surgicaldrill,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/machinery/computer/operating,
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/surgery)
"bzJ" = (
/obj/machinery/computer/mecha{
dir = 8
@@ -32691,14 +32701,9 @@
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/heads/hor)
"bzK" = (
-/obj/structure/table,
-/obj/item/scalpel{
- pixel_y = 12
- },
-/obj/item/circular_saw,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/turf/closed/wall,
+/area/medical/surgery)
"bzL" = (
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel/white,
@@ -32756,12 +32761,14 @@
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"bzS" = (
-/obj/structure/table,
-/obj/item/cautery{
- pixel_x = 4
+/obj/machinery/light/small{
+ dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/table,
+/obj/item/storage/backpack/duffelbag/med/surgery,
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/surgery)
"bzT" = (
/obj/structure/chair/office/dark,
/obj/effect/landmark/start/quartermaster,
@@ -32774,15 +32781,15 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bzV" = (
/obj/machinery/vending/wardrobe/medi_wardrobe,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bzW" = (
/obj/structure/closet/l3closet,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bzX" = (
/obj/effect/turf_decal/tile/blue{
dir = 8
@@ -32800,7 +32807,7 @@
/turf/open/floor/plasteel/white/side{
dir = 9
},
-/area/science/research)
+/area/science)
"bAa" = (
/obj/machinery/door/firedoor/heavy,
/obj/structure/cable{
@@ -32808,7 +32815,7 @@
},
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bAb" = (
/obj/structure/chair/office/dark{
dir = 8
@@ -32899,8 +32906,11 @@
/area/hallway/primary/central)
"bAl" = (
/obj/structure/chair,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
+/area/medical/surgery)
"bAm" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -32961,11 +32971,11 @@
network = list("ss13","medbay")
},
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bAr" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bAs" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 1;
@@ -32978,18 +32988,18 @@
},
/obj/machinery/light,
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bAt" = (
/obj/structure/table/reinforced,
/obj/item/wrench/medical,
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bAu" = (
/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
dir = 1
},
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bAv" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 1;
@@ -32997,7 +33007,7 @@
},
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bAw" = (
/turf/open/floor/plating,
/area/maintenance/aft)
@@ -33221,29 +33231,21 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/janitor)
-"bAW" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
"bAX" = (
/obj/structure/disposalpipe/segment,
-/obj/structure/table,
-/obj/item/clothing/gloves/color/latex,
-/obj/item/clothing/mask/surgical,
-/obj/item/clothing/suit/apron/surgical,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
+/obj/structure/curtain{
+ pixel_y = -32
},
/turf/open/floor/plasteel/white/side{
dir = 4
},
-/area/medical/sleeper)
+/area/medical/surgery)
"bAY" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
+/obj/structure/curtain{
+ pixel_y = -32
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/surgery)
"bAZ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -33255,24 +33257,19 @@
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
"bBb" = (
-/obj/effect/landmark/start/medical_doctor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall/r_wall,
+/area/engine/atmos)
"bBc" = (
-/obj/structure/table,
-/obj/item/surgical_drapes,
-/obj/item/razor,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/structure/curtain{
+ pixel_y = -32
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/table/optable,
/turf/open/floor/plasteel/white/side{
dir = 8
},
-/area/medical/sleeper)
+/area/medical/surgery)
"bBd" = (
/obj/structure/table,
/obj/structure/bedsheetbin{
@@ -33280,22 +33277,19 @@
},
/obj/item/clothing/suit/straight_jacket,
/obj/item/clothing/mask/muzzle,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bBe" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bBf" = (
/obj/structure/filingcabinet,
/obj/structure/reagent_dispensers/peppertank{
@@ -33552,7 +33546,7 @@
/turf/open/floor/plasteel/white/side{
dir = 9
},
-/area/science/research)
+/area/science)
"bBE" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -33562,7 +33556,7 @@
icon_state = "1-2"
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bBF" = (
/obj/machinery/portable_atmospherics/scrubber,
/obj/item/storage/firstaid/toxin,
@@ -34000,44 +33994,46 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/door/airlock/maintenance{
- name = "Surgery Maintenance";
- req_access_txt = "45"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/turf/closed/wall,
+/area/medical/surgery)
"bCC" = (
/obj/structure/disposalpipe/segment{
dir = 6
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
+/obj/machinery/bloodbankgen,
+/obj/machinery/camera{
+ c_tag = "Medbay Recovery Room";
+ dir = 6;
+ network = list("ss13","medbay")
},
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/turf/open/floor/plasteel,
+/area/medical/medbay/central)
"bCD" = (
/obj/structure/table,
-/obj/item/retractor,
+/obj/item/storage/backpack/duffelbag/med/surgery,
/turf/open/floor/plasteel/white/side,
-/area/medical/sleeper)
+/area/medical/surgery)
"bCE" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/surgery)
"bCF" = (
/obj/structure/disposalpipe/segment{
dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
+/obj/machinery/power/apc{
+ areastring = "/area/medical/surgery";
+ dir = 8;
+ name = "Treatment Center APC";
+ pixel_x = -24
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/surgery)
"bCG" = (
/obj/structure/table,
/obj/item/folder/white,
@@ -34045,28 +34041,27 @@
/obj/item/soap/nanotrasen,
/obj/item/gun/syringe/dart,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bCH" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/surgery)
"bCJ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/surgery)
"bCK" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bCL" = (
/obj/structure/closet/secure_closet/medical3,
/obj/machinery/camera{
@@ -34074,19 +34069,19 @@
network = list("ss13","medbay")
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bCM" = (
/obj/structure/closet/secure_closet/medical3,
/obj/machinery/airalarm{
pixel_y = 24
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bCN" = (
/obj/structure/disposalpipe/trunk,
/obj/machinery/disposal/bin,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bCO" = (
/obj/structure/table,
/obj/item/storage/box/bodybags{
@@ -34096,17 +34091,7 @@
/obj/item/storage/box/rxglasses,
/obj/item/hand_labeler,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCP" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/medical/sleeper)
-"bCQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bCR" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -34121,19 +34106,15 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/iv_drip,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCT" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/vehicle/ridden/wheelchair{
+ dir = 8
},
-/obj/machinery/bloodbankgen,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bCU" = (
/obj/item/radio/intercom{
frequency = 1485;
@@ -34221,7 +34202,7 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"bDe" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel,
@@ -34293,7 +34274,7 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"bDm" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -34303,13 +34284,13 @@
dir = 10
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bDn" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bDo" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
@@ -34357,16 +34338,6 @@
},
/turf/closed/wall,
/area/maintenance/port/aft)
-"bDu" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
"bDv" = (
/obj/structure/table,
/obj/item/flashlight{
@@ -34412,43 +34383,41 @@
/area/storage/tech)
"bDA" = (
/obj/structure/disposalpipe/segment,
-/obj/machinery/power/apc{
- areastring = "/area/medical/sleeper";
- dir = 4;
- name = "Treatment Center APC";
- pixel_x = 26
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/turf/open/floor/plasteel,
+/area/medical/medbay/central)
"bDB" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/open/floor/plasteel/white/side{
dir = 4
},
-/area/medical/sleeper)
+/area/medical/surgery)
"bDC" = (
-/obj/machinery/computer/operating{
- dir = 1
+/obj/effect/landmark/start/medical_doctor,
+/obj/structure/cable{
+ icon_state = "4-8"
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/surgery)
"bDD" = (
-/obj/structure/bed,
-/obj/item/bedsheet/medical,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bDE" = (
/obj/machinery/vending/wallmed{
pixel_x = 28
@@ -34458,9 +34427,14 @@
dir = 8;
network = list("ss13","medbay")
},
-/obj/machinery/iv_drip,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/obj/vehicle/ridden/wheelchair{
+ dir = 8
+ },
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bDF" = (
/obj/machinery/door/poddoor/preopen{
id = "medpriv4";
@@ -34555,9 +34529,6 @@
},
/turf/open/floor/plating,
/area/maintenance/aft)
-"bDR" = (
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
"bDS" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
@@ -34573,7 +34544,7 @@
"bDT" = (
/obj/effect/landmark/start/medical_doctor,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bDU" = (
/obj/machinery/door/airlock/command/glass{
name = "Chief Medical Officer";
@@ -34609,7 +34580,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bDY" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -34618,18 +34589,12 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/engine,
/area/science/storage)
-"bDZ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
"bEa" = (
/obj/structure/disposalpipe/segment{
dir = 5
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bEb" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -34656,7 +34621,7 @@
req_access_txt = "5"
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bEe" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -34676,7 +34641,7 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"bEg" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -34781,7 +34746,7 @@
/area/science/storage)
"bEq" = (
/obj/machinery/power/apc{
- areastring = "/area/science/research";
+ areastring = "/area/science";
dir = 8;
name = "Misc Research APC";
pixel_x = -25
@@ -34792,7 +34757,7 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"bEr" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -34800,14 +34765,14 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bEs" = (
/turf/closed/wall,
/area/science/mixing)
"bEt" = (
/obj/machinery/vending/coffee,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bEu" = (
/obj/structure/closet/bombcloset,
/obj/machinery/light{
@@ -34860,7 +34825,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bEA" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible,
/obj/machinery/light{
@@ -34973,7 +34938,7 @@
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
/turf/open/floor/plasteel,
-/area/science/mixing)
+/area/science)
"bEO" = (
/obj/structure/sign/warning/securearea{
pixel_x = -32
@@ -34985,7 +34950,7 @@
dir = 1
},
/turf/open/floor/plasteel,
-/area/science/mixing)
+/area/science)
"bEP" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -35178,13 +35143,11 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"bFm" = (
-/obj/structure/disposalpipe/sorting/mail/flip{
- dir = 8;
- sortType = 6
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/turf/closed/wall,
+/area/medical/medbay/central)
"bFn" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -35196,15 +35159,40 @@
/obj/structure/disposalpipe/segment{
dir = 10
},
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bFp" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/light/small{
+ dir = 1
},
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel,
+/area/medical/medbay/central)
+"bFp" = (
+/obj/structure/closet/crate/freezer,
+/obj/item/reagent_containers/blood/random,
+/obj/item/reagent_containers/blood/APlus,
+/obj/item/reagent_containers/blood/random,
+/obj/item/reagent_containers/blood/random,
+/obj/item/reagent_containers/blood/OPlus{
+ pixel_x = -2;
+ pixel_y = -1
+ },
+/obj/item/reagent_containers/blood/OMinus,
+/obj/item/reagent_containers/blood/BPlus{
+ pixel_x = 1;
+ pixel_y = 2
+ },
+/obj/item/reagent_containers/blood/BMinus{
+ pixel_x = -4;
+ pixel_y = 4
+ },
+/obj/item/reagent_containers/blood/AMinus,
+/obj/item/reagent_containers/blood,
+/obj/item/reagent_containers/blood,
+/obj/structure/disposalpipe/sorting/mail/flip{
+ dir = 8;
+ sortType = 6
+ },
+/turf/open/floor/plasteel,
+/area/medical/medbay/central)
"bFq" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/yellow,
@@ -35226,27 +35214,26 @@
/area/maintenance/aft)
"bFt" = (
/obj/structure/disposalpipe/segment,
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/obj/structure/closet/crate/freezer/surplus_limbs,
+/obj/item/reagent_containers/glass/beaker/synthflesh,
+/turf/open/floor/plasteel,
+/area/medical/medbay/central)
"bFu" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/medical{
- name = "Operating Theatre";
- req_access_txt = "45"
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/obj/machinery/smartfridge/organ/preloaded,
+/turf/closed/wall,
+/area/medical/surgery)
"bFv" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/surgery)
"bFw" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -35258,19 +35245,24 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bFx" = (
/obj/structure/disposalpipe/segment,
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/obj/machinery/limbgrower,
+/turf/open/floor/plasteel,
+/area/medical/medbay/central)
"bFy" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bFz" = (
/obj/machinery/airalarm{
dir = 1;
@@ -35279,10 +35271,13 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
+/obj/structure/bed,
+/obj/item/bedsheet/medical,
+/obj/machinery/iv_drip,
/turf/open/floor/plasteel/white/side{
dir = 1
},
-/area/medical/sleeper)
+/area/medical/surgery)
"bFA" = (
/obj/structure/sink{
dir = 4;
@@ -35295,11 +35290,17 @@
pixel_x = 30
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bFB" = (
-/obj/structure/closet/secure_closet/medical2,
+/obj/machinery/vending/wallmed{
+ pixel_y = -28
+ },
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_x = -23
+ },
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/surgery)
"bFC" = (
/obj/structure/table/wood/poker,
/obj/item/clothing/mask/cigarette/cigar{
@@ -35338,8 +35339,11 @@
/area/crew_quarters/heads/cmo)
"bFF" = (
/obj/machinery/light,
+/obj/structure/chair{
+ dir = 1
+ },
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bFG" = (
/obj/structure/chair{
dir = 1
@@ -35379,17 +35383,18 @@
/turf/open/floor/engine,
/area/science/storage)
"bFJ" = (
-/obj/structure/bed,
-/obj/item/bedsheet/medical,
/obj/structure/sign/warning/nosmoking{
pixel_x = -28
},
+/obj/structure/chair{
+ dir = 1
+ },
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bFK" = (
/obj/structure/closet/wardrobe/pjs,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bFL" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -35462,18 +35467,18 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"bFR" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bFS" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bFT" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -35753,26 +35758,20 @@
dir = 4
},
/turf/open/floor/plasteel,
-/area/science/mixing)
-"bGH" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/area/science)
"bGI" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/maintenance{
+ name = "Surgery Maintenance";
+ req_access_txt = "45"
},
-/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/maintenance/aft)
"bGJ" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
},
/turf/open/floor/plating,
/area/maintenance/aft)
@@ -35787,14 +35786,14 @@
dir = 8
},
/turf/open/floor/plasteel,
-/area/science/mixing)
+/area/science)
"bGL" = (
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/turf/open/floor/plasteel,
-/area/science/mixing)
+/area/science)
"bGM" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
@@ -35845,9 +35844,8 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/turf/closed/wall,
+/area/medical/medbay/central)
"bGR" = (
/obj/structure/table,
/obj/item/storage/belt/medical{
@@ -35862,7 +35860,7 @@
/obj/item/clothing/neck/stethoscope,
/obj/item/gun/syringe/dart,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bGT" = (
/obj/structure/table,
/obj/item/folder/white,
@@ -35898,9 +35896,11 @@
/area/medical/medbay/central)
"bGW" = (
/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/turf/closed/wall,
+/area/medical/medbay/central)
"bGX" = (
/obj/machinery/light{
dir = 8
@@ -35951,7 +35951,7 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"bHd" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -35982,7 +35982,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bHh" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -36047,7 +36047,9 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/maintenance/aft)
"bHq" = (
@@ -36076,7 +36078,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plasteel,
-/area/science/mixing)
+/area/science)
"bHt" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel,
@@ -36192,7 +36194,7 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"bHL" = (
/obj/machinery/camera{
c_tag = "Research Division South";
@@ -36202,13 +36204,13 @@
/turf/open/floor/plasteel/white/side{
dir = 9
},
-/area/science/research)
+/area/science)
"bHM" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/door/firedoor/heavy,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bHN" = (
/obj/machinery/requests_console{
department = "Tech storage";
@@ -36266,6 +36268,7 @@
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/effect/landmark/event_spawn,
/obj/structure/grille/broken,
/turf/open/floor/plating,
/area/maintenance/aft)
@@ -36281,11 +36284,6 @@
},
/turf/open/floor/plating,
/area/maintenance/aft)
-"bHW" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/maintenance/aft)
"bHX" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
@@ -36317,29 +36315,29 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"bIc" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
+/obj/structure/bed,
+/obj/item/bedsheet/medical,
+/obj/machinery/iv_drip,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/light,
/turf/open/floor/plasteel/white/side{
dir = 1
},
-/area/medical/sleeper)
+/area/medical/surgery)
"bId" = (
-/obj/machinery/vending/wallmed{
- pixel_y = -28
- },
/obj/machinery/camera{
c_tag = "Surgery Operating";
dir = 1;
network = list("ss13","medbay");
pixel_x = 22
},
-/obj/machinery/light,
+/obj/structure/bed,
+/obj/item/bedsheet/medical,
+/obj/machinery/iv_drip,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/surgery)
"bIe" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/status_display/evac{
@@ -36424,7 +36422,7 @@
dir = 1
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bIj" = (
/obj/structure/table,
/obj/machinery/light,
@@ -36436,7 +36434,7 @@
/obj/item/stack/packageWrap,
/obj/item/stack/packageWrap,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bIk" = (
/obj/structure/table,
/obj/item/storage/firstaid/fire{
@@ -36454,7 +36452,7 @@
req_access_txt = "5"
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bIl" = (
/obj/structure/table,
/obj/item/storage/firstaid/toxin{
@@ -36472,12 +36470,12 @@
req_access_txt = "5"
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bIm" = (
/obj/machinery/light,
/obj/machinery/rnd/production/techfab/department/medical,
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bIn" = (
/obj/structure/table,
/obj/item/storage/firstaid/brute{
@@ -36496,7 +36494,7 @@
dir = 1
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bIo" = (
/obj/structure/bed,
/obj/item/bedsheet/medical,
@@ -36630,7 +36628,7 @@
/turf/open/floor/plasteel/white/side{
dir = 5
},
-/area/science/research)
+/area/science)
"bIE" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -36640,7 +36638,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bIF" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -36908,7 +36906,7 @@
/turf/open/floor/plasteel/white/side{
dir = 1
},
-/area/science/research)
+/area/science)
"bJp" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -36941,7 +36939,7 @@
/turf/open/floor/plasteel/white/side{
dir = 1
},
-/area/science/research)
+/area/science)
"bJs" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -36980,8 +36978,8 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
},
/turf/open/floor/plating,
/area/maintenance/aft)
@@ -37014,8 +37012,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
/turf/open/floor/plating,
/area/maintenance/aft)
@@ -37035,12 +37034,14 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bJA" = (
-/obj/effect/landmark/blobstart,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/closed/wall,
+/area/medical/medbay/central)
"bJB" = (
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
/turf/open/floor/plasteel,
@@ -37050,13 +37051,13 @@
dir = 4
},
/turf/closed/wall/r_wall,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bJD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
/turf/closed/wall/r_wall,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"bJE" = (
/turf/closed/wall/r_wall,
/area/medical/medbay/central)
@@ -37163,7 +37164,7 @@
"bJT" = (
/obj/machinery/vending/cigarette,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"bJU" = (
/obj/machinery/vending/wardrobe/science_wardrobe,
/turf/open/floor/plasteel/white,
@@ -37257,13 +37258,13 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
-/area/science/mixing)
+/area/science)
"bKc" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
},
/turf/open/floor/plasteel,
-/area/science/mixing)
+/area/science)
"bKd" = (
/obj/machinery/camera{
c_tag = "Toxins Launch Room Access";
@@ -37274,7 +37275,7 @@
dir = 8
},
/turf/open/floor/plasteel,
-/area/science/mixing)
+/area/science)
"bKe" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
@@ -37760,7 +37761,7 @@
"bLh" = (
/obj/structure/sign/warning/fire,
/turf/closed/wall,
-/area/science/research)
+/area/science)
"bLi" = (
/obj/structure/sign/warning/nosmoking{
pixel_x = -32
@@ -37991,10 +37992,6 @@
},
/turf/open/floor/plating,
/area/maintenance/aft)
-"bLP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
"bLQ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/closed/wall/r_wall,
@@ -38216,23 +38213,23 @@
"bMs" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
-/area/science/research)
+/area/science)
"bMt" = (
/obj/structure/sign/warning/vacuum/external{
pixel_y = 32
},
/turf/open/floor/engine/vacuum,
-/area/science/mixing)
+/area/science/mixing/chamber)
"bMu" = (
/obj/machinery/door/poddoor/incinerator_toxmix,
/turf/open/floor/engine/vacuum,
-/area/science/mixing)
+/area/science/mixing/chamber)
"bMv" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 4
},
/turf/closed/wall/r_wall,
-/area/science/mixing)
+/area/science/mixing/chamber)
"bMw" = (
/obj/machinery/sparker/toxmix{
pixel_x = 25
@@ -38241,7 +38238,7 @@
dir = 4
},
/turf/open/floor/engine/vacuum,
-/area/science/mixing)
+/area/science/mixing/chamber)
"bMx" = (
/obj/machinery/airlock_sensor/incinerator_toxmix{
pixel_y = 24
@@ -38251,7 +38248,7 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/engine,
-/area/science/mixing)
+/area/science/mixing/chamber)
"bMy" = (
/obj/machinery/atmospherics/components/binary/valve{
dir = 4;
@@ -38359,7 +38356,9 @@
/obj/machinery/firealarm{
pixel_y = 24
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bMQ" = (
@@ -38570,19 +38569,19 @@
/area/medical/virology)
"bNt" = (
/turf/open/floor/engine/vacuum,
-/area/science/mixing)
+/area/science/mixing/chamber)
"bNu" = (
/obj/machinery/door/airlock/research/glass/incinerator/toxmix_exterior,
/turf/open/floor/engine,
-/area/science/mixing)
+/area/science/mixing/chamber)
"bNv" = (
/obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior,
/turf/open/floor/engine,
-/area/science/mixing)
+/area/science/mixing/chamber)
"bNw" = (
/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix,
/turf/open/floor/engine,
-/area/science/mixing)
+/area/science/mixing/chamber)
"bNx" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -38968,7 +38967,7 @@
/turf/open/floor/plasteel/white/side{
dir = 1
},
-/area/science/research)
+/area/science)
"bOB" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
@@ -38998,7 +38997,7 @@
dir = 4
},
/turf/open/floor/engine/vacuum,
-/area/science/mixing)
+/area/science/mixing/chamber)
"bOF" = (
/obj/structure/sign/warning/fire{
pixel_y = -32
@@ -39008,7 +39007,7 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/engine,
-/area/science/mixing)
+/area/science/mixing/chamber)
"bOG" = (
/obj/machinery/light,
/obj/machinery/atmospherics/components/binary/valve{
@@ -41716,6 +41715,9 @@
/obj/item/clothing/gloves/color/black,
/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bVX" = (
@@ -44808,7 +44810,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"cdZ" = (
/obj/machinery/telecomms/processor/preset_two,
/turf/open/floor/plasteel/dark/telecomms,
@@ -45157,7 +45159,7 @@
},
/obj/machinery/holopad,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"ceY" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
@@ -46308,7 +46310,7 @@
"chY" = (
/obj/machinery/shieldgen,
/turf/open/floor/plating,
-/area/engine/engineering)
+/area/engine/storage)
"cia" = (
/obj/effect/turf_decal/bot{
dir = 1
@@ -46658,7 +46660,7 @@
"ciW" = (
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
-/area/engine/engineering)
+/area/engine/storage)
"ciX" = (
/obj/structure/closet/crate,
/obj/item/stack/sheet/metal/fifty,
@@ -46673,14 +46675,14 @@
/obj/item/lightreplacer,
/obj/item/lightreplacer,
/turf/open/floor/plating,
-/area/engine/engineering)
+/area/engine/storage)
"ciY" = (
/obj/machinery/door/poddoor{
id = "Secure Storage";
name = "secure storage"
},
/turf/open/floor/plating,
-/area/engine/engineering)
+/area/engine/storage)
"ciZ" = (
/turf/open/floor/plating,
/area/engine/engineering)
@@ -46988,7 +46990,7 @@
dir = 4
},
/turf/open/floor/plating,
-/area/engine/engineering)
+/area/engine/storage)
"cjN" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -47275,11 +47277,11 @@
"ckB" = (
/obj/machinery/field/generator,
/turf/open/floor/plating,
-/area/engine/engineering)
+/area/engine/storage)
"ckC" = (
/obj/machinery/power/emitter,
/turf/open/floor/plating,
-/area/engine/engineering)
+/area/engine/storage)
"ckD" = (
/obj/effect/turf_decal/bot{
dir = 1
@@ -48825,10 +48827,16 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"cpG" = (
-/obj/structure/table/optable,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/structure/table,
+/obj/item/clothing/gloves/color/latex,
+/obj/item/clothing/gloves/color/latex,
+/obj/item/clothing/suit/apron/surgical,
+/obj/item/clothing/suit/apron/surgical,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/surgery)
"cpI" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
@@ -50579,7 +50587,7 @@
start_active = 1
},
/turf/open/space,
-/area/space/nearstation)
+/area/ai_monitored/turret_protected/aisat)
"cvG" = (
/obj/machinery/porta_turret/ai{
dir = 4;
@@ -50626,7 +50634,7 @@
start_active = 1
},
/turf/open/space,
-/area/space/nearstation)
+/area/ai_monitored/turret_protected/aisat)
"cvL" = (
/obj/structure/sign/warning/securearea{
pixel_x = 32
@@ -51315,7 +51323,7 @@
/area/maintenance/disposal/incinerator)
"czK" = (
/turf/closed/wall,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"czN" = (
/obj/docking_port/stationary/random{
dir = 4;
@@ -51638,7 +51646,7 @@
start_active = 1
},
/turf/open/space,
-/area/space/nearstation)
+/area/ai_monitored/turret_protected/aisat)
"cAV" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -51673,7 +51681,7 @@
start_active = 1
},
/turf/open/space,
-/area/space/nearstation)
+/area/ai_monitored/turret_protected/aisat)
"cAY" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -51733,7 +51741,7 @@
start_active = 1
},
/turf/open/space,
-/area/space/nearstation)
+/area/ai_monitored/turret_protected/aisat)
"cBg" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/effect/landmark/event_spawn,
@@ -51776,6 +51784,10 @@
/area/hallway/secondary/exit)
"cBm" = (
/obj/effect/landmark/event_spawn,
+/obj/structure/extinguisher_cabinet{
+ pixel_y = -30
+ },
+/obj/machinery/light,
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"cBn" = (
@@ -51847,7 +51859,7 @@
},
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel/white,
-/area/science/research)
+/area/science)
"cBy" = (
/obj/machinery/door/airlock{
name = "Custodial Closet";
@@ -51890,20 +51902,19 @@
/obj/structure/cable{
icon_state = "2-8"
},
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/landmark/event_spawn,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/maintenance/aft)
"cBE" = (
/obj/effect/landmark/event_spawn,
/obj/machinery/air_sensor/atmos/toxins_mixing_tank,
/turf/open/floor/engine/vacuum,
-/area/science/mixing)
+/area/science/mixing/chamber)
"cBF" = (
/obj/effect/landmark/event_spawn,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
@@ -52060,29 +52071,9 @@
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"cCp" = (
-/obj/structure/closet/crate/freezer,
-/obj/item/reagent_containers/blood,
-/obj/item/reagent_containers/blood,
-/obj/item/reagent_containers/blood/AMinus,
-/obj/item/reagent_containers/blood/BMinus{
- pixel_x = -4;
- pixel_y = 4
- },
-/obj/item/reagent_containers/blood/BPlus{
- pixel_x = 1;
- pixel_y = 2
- },
-/obj/item/reagent_containers/blood/OMinus,
-/obj/item/reagent_containers/blood/OPlus{
- pixel_x = -2;
- pixel_y = -1
- },
-/obj/item/reagent_containers/blood/random,
-/obj/item/reagent_containers/blood/random,
-/obj/item/reagent_containers/blood/APlus,
-/obj/item/reagent_containers/blood/random,
+/obj/structure/closet/secure_closet/medical2,
/turf/open/floor/plasteel,
-/area/medical/sleeper)
+/area/medical/surgery)
"cCq" = (
/obj/machinery/deepfryer,
/turf/open/floor/plasteel/cafeteria,
@@ -53371,6 +53362,18 @@
/obj/machinery/meter,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"dcX" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"ddI" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -53457,6 +53460,12 @@
},
/turf/open/floor/plasteel,
/area/engine/atmos)
+"dkM" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"dly" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -53467,6 +53476,19 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"dnW" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/paramedic)
"dqb" = (
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/pool)
@@ -53723,6 +53745,18 @@
dir = 4
},
/area/crew_quarters/fitness/pool)
+"ecp" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"edj" = (
/obj/structure/sign/poster/contraband/random{
pixel_y = 32
@@ -53767,6 +53801,21 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"eiB" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/table,
+/obj/item/storage/box/bodybags,
+/obj/item/pen,
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"eiZ" = (
/obj/machinery/meter,
/obj/machinery/atmospherics/pipe/manifold/purple/visible{
@@ -54052,6 +54101,10 @@
"eQb" = (
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
+"eRr" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"eRz" = (
/obj/structure/lattice,
/obj/structure/grille,
@@ -54061,6 +54114,12 @@
/obj/structure/closet/secure_closet/personal/cabinet,
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
+"eUy" = (
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
+ },
+/turf/open/floor/plating,
+/area/storage/emergency/starboard)
"eUW" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/dark/visible{
@@ -54111,6 +54170,10 @@
/obj/structure/lattice,
/turf/open/space/basic,
/area/space/nearstation)
+"eZa" = (
+/obj/effect/landmark/start/paramedic,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"fbp" = (
/obj/structure/tank_dispenser,
/obj/effect/turf_decal/bot,
@@ -54361,6 +54424,9 @@
},
/turf/open/floor/plasteel,
/area/security/range)
+"fsQ" = (
+/turf/open/floor/plating,
+/area/engine/storage)
"fty" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/orange/visible,
@@ -54379,6 +54445,10 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"fvk" = (
+/obj/structure/disposalpipe/segment,
+/turf/closed/wall,
+/area/medical/medbay/central)
"fvY" = (
/obj/machinery/computer/cryopod{
pixel_y = 26
@@ -54534,6 +54604,14 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/security/courtroom)
+"fNN" = (
+/obj/machinery/door/firedoor,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"fOA" = (
/obj/machinery/door/airlock{
name = "Theatre Backstage";
@@ -54604,6 +54682,11 @@
},
/turf/open/floor/plasteel,
/area/security/processing)
+"gaF" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/medical/paramedic)
"gbd" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
@@ -54636,9 +54719,16 @@
/turf/open/floor/plating,
/area/security/prison)
"gbT" = (
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/glass/fifty,
+/obj/item/storage/box/lights/mixed,
+/obj/machinery/power/apc{
+ areastring = "/area/storage/emergency/starboard";
+ dir = 1;
+ name = "Starboard Emergency Storage APC";
+ pixel_y = 24
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
/turf/open/floor/plating,
/area/maintenance/department/medical/morgue)
"gcF" = (
@@ -54672,6 +54762,15 @@
},
/turf/open/floor/carpet,
/area/crew_quarters/cryopod)
+"gfQ" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/surgery)
"ghD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
@@ -55014,12 +55113,16 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"gZG" = (
-/obj/structure/closet/crate/freezer/surplus_limbs,
-/obj/item/reagent_containers/glass/beaker/synthflesh,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/white/side{
dir = 8
},
-/area/medical/sleeper)
+/area/medical/surgery)
"haM" = (
/obj/item/radio/intercom{
name = "Station Intercom (General)";
@@ -55311,6 +55414,15 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
+"hYd" = (
+/obj/machinery/door/airlock/medical{
+ name = "Morgue";
+ req_access_txt = "6"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"ibK" = (
/turf/open/floor/plasteel,
/area/security/processing)
@@ -55338,6 +55450,9 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"ihR" = (
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"iiW" = (
/turf/open/floor/wood,
/area/maintenance/bar)
@@ -55428,9 +55543,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/pool)
-"ipA" = (
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
"iql" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -55487,6 +55599,13 @@
/obj/effect/turf_decal/tile/green,
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
+"ivJ" = (
+/obj/structure/curtain{
+ pixel_y = -32
+ },
+/obj/structure/table/optable,
+/turf/open/floor/plasteel/white,
+/area/medical/surgery)
"ixd" = (
/obj/structure/table,
/obj/item/reagent_containers/food/drinks/beer,
@@ -55601,7 +55720,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/reagent_dispensers/cooking_oil,
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
"iPX" = (
/obj/structure/table,
/obj/machinery/reagentgrinder{
@@ -55626,6 +55745,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
+"iRV" = (
+/obj/machinery/computer/operating,
+/turf/open/floor/plasteel/white/side,
+/area/medical/surgery)
"iTq" = (
/obj/structure/chair/stool{
pixel_y = 8
@@ -55641,6 +55764,21 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
+"iUp" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/turf/open/floor/plating,
+/area/maintenance/aft)
+"iVH" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/medical{
+ name = "Operating Theatre";
+ req_access_txt = "45"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel,
+/area/medical/surgery)
"iVJ" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -55731,6 +55869,16 @@
},
/turf/closed/wall,
/area/maintenance/port/fore)
+"jbK" = (
+/obj/item/stack/sheet/glass{
+ amount = 20;
+ pixel_x = -3;
+ pixel_y = 6
+ },
+/obj/item/stack/sheet/metal/fifty,
+/obj/structure/rack,
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
"jdj" = (
/obj/docking_port/stationary/random{
dir = 4;
@@ -55739,10 +55887,29 @@
},
/turf/open/space,
/area/space)
+"jdE" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/paramedic)
"jex" = (
-/obj/machinery/smartfridge/organ/preloaded,
-/turf/closed/wall,
-/area/medical/sleeper)
+/obj/machinery/door/airlock/medical{
+ name = "Operating Theatre";
+ req_access_txt = "45"
+ },
+/obj/machinery/door/firedoor,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/medical/surgery)
"jez" = (
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
@@ -55771,6 +55938,10 @@
/obj/structure/sign/warning/securearea,
/turf/closed/wall,
/area/engine/engineering)
+"jiT" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"jjC" = (
/obj/structure/table/wood,
/obj/item/toy/cards/deck,
@@ -56598,6 +56769,10 @@
/obj/structure/disposalpipe/junction/flip,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"kQa" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/medical/paramedic)
"kQe" = (
/obj/structure/table/wood/poker,
/obj/item/storage/fancy/cigarettes/dromedaryco,
@@ -56608,13 +56783,7 @@
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"kQk" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/obj/item/storage/toolbox/electrical,
-/turf/open/floor/plating,
+/turf/closed/wall,
/area/maintenance/department/medical/morgue)
"kQz" = (
/obj/structure/cable{
@@ -56650,6 +56819,16 @@
/obj/machinery/chem_master/condimaster,
/turf/open/floor/plating,
/area/maintenance/fore)
+"kVj" = (
+/obj/effect/turf_decal/trimline/blue/filled/corner{
+ dir = 8
+ },
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/paramedic)
"kWp" = (
/obj/structure/shuttle/engine/heater{
dir = 1
@@ -56689,6 +56868,10 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/security/range)
+"laN" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/turf/open/floor/plating,
+/area/storage/emergency/starboard)
"leE" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -57223,6 +57406,14 @@
/obj/effect/decal/cleanable/blood/gibs/slime/limb,
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/aft)
+"mFo" = (
+/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plating,
+/area/maintenance/aft)
"mGw" = (
/obj/machinery/door/airlock/security{
name = "Labor Shuttle";
@@ -57584,6 +57775,9 @@
},
/turf/open/floor/plating,
/area/construction)
+"nyi" = (
+/turf/closed/wall,
+/area/medical/paramedic)
"nzB" = (
/obj/machinery/hydroponics/soil{
pixel_y = 8
@@ -57611,6 +57805,9 @@
},
/turf/open/floor/plating,
/area/security/processing)
+"nEu" = (
+/turf/closed/wall,
+/area/medical/surgery)
"nFj" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/dark/visible{
@@ -57967,6 +58164,18 @@
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
+"ouf" = (
+/obj/effect/turf_decal/trimline/blue/filled/corner{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/paramedic)
"ouQ" = (
/obj/structure/table,
/obj/item/paper_bin{
@@ -58110,6 +58319,10 @@
},
/turf/open/floor/mineral/titanium/blue,
/area/crew_quarters/dorms)
+"oJV" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"oKh" = (
/obj/structure/chair/wood/normal{
dir = 8
@@ -58139,6 +58352,12 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/grimy,
/area/maintenance/starboard/aft)
+"oQY" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/medical/medbay/central)
"oSl" = (
/obj/machinery/door/airlock/security{
name = "Firing Range";
@@ -58204,6 +58423,10 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"pbC" = (
+/obj/effect/landmark/blobstart,
+/turf/open/floor/plating,
+/area/maintenance/aft)
"pcK" = (
/mob/living/simple_animal/bot/cleanbot{
name = "C.L.E.A.N."
@@ -58250,6 +58473,9 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/fore)
+"pkg" = (
+/turf/open/floor/plating,
+/area/storage/emergency/starboard)
"pkq" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -58507,7 +58733,7 @@
pixel_x = 30
},
/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
+/area/medical/medbay/central)
"pHO" = (
/obj/effect/turf_decal/tile/blue,
/obj/structure/sign/poster/contraband/fun_police{
@@ -58533,6 +58759,9 @@
},
/turf/open/floor/wood,
/area/library)
+"pKV" = (
+/turf/closed/wall/r_wall,
+/area/science/research)
"pLn" = (
/obj/machinery/conveyor/inverted{
dir = 5;
@@ -58726,6 +58955,13 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"qkC" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/start/paramedic,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"qll" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
@@ -58743,6 +58979,10 @@
/obj/structure/table,
/turf/open/floor/plasteel,
/area/security/prison)
+"qnC" = (
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"qqs" = (
/obj/structure/mirror{
pixel_y = 32
@@ -58908,6 +59148,13 @@
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/captain)
+"qSf" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"qSF" = (
/obj/item/seeds/bee_balm/honey_balm,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
@@ -58926,7 +59173,7 @@
icon_state = "plant-22"
},
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"qVP" = (
/obj/effect/spawner/structure/window,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -59380,6 +59627,10 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"rUe" = (
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
+/area/medical/medbay/central)
"rVy" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
@@ -59407,6 +59658,23 @@
dir = 1
},
/area/engine/atmos)
+"rWg" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/structure/chair/office/light{
+ dir = 8
+ },
+/obj/effect/landmark/start/paramedic,
+/turf/open/floor/plasteel/dark,
+/area/medical/paramedic)
"rWw" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 4
@@ -59738,6 +60006,11 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
+"sKL" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/grille/broken,
+/turf/open/floor/plating,
+/area/maintenance/aft)
"sLa" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
@@ -59986,6 +60259,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"ttd" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"ttL" = (
/obj/structure/sign/poster/contraband/random{
pixel_y = 32
@@ -60009,6 +60288,13 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
+"twE" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"tyX" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -60058,7 +60344,7 @@
dir = 1
},
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"tEK" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -60072,6 +60358,15 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
+"tEL" = (
+/obj/structure/table,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
+ },
+/obj/item/storage/toolbox/electrical,
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
"tHh" = (
/obj/machinery/disposal/bin,
/obj/effect/turf_decal/tile/red,
@@ -60098,6 +60393,13 @@
dir = 1
},
/area/hallway/secondary/entry)
+"tIE" = (
+/obj/effect/turf_decal/trimline/blue/filled/line,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/paramedic)
"tJi" = (
/obj/machinery/airalarm{
dir = 4;
@@ -60162,7 +60464,13 @@
"tMl" = (
/obj/effect/turf_decal/loading_area,
/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
+/area/crew_quarters/kitchen/backroom)
+"tNl" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"tNF" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -60542,6 +60850,13 @@
/obj/structure/grille,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"uBr" = (
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/lobby)
"uCo" = (
/obj/structure/chair{
dir = 1
@@ -60587,6 +60902,13 @@
},
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
+"uFV" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel,
+/area/medical/medbay/central)
"uFZ" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/stripes/line{
@@ -60812,7 +61134,7 @@
pixel_y = -22
},
/turf/open/floor/wood,
-/area/security/vacantoffice)
+/area/vacant_room/office)
"veS" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -60968,6 +61290,13 @@
icon_state = "platingdmg1"
},
/area/maintenance/starboard/aft)
+"vxz" = (
+/obj/machinery/space_heater,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/storage/emergency/starboard)
"vxX" = (
/obj/machinery/door/airlock/external{
name = "Labor Camp Shuttle Airlock"
@@ -61284,7 +61613,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/area/medical/medbay/lobby)
"wcB" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
@@ -61506,6 +61835,13 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"wJA" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"wKe" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -61784,6 +62120,20 @@
},
/turf/open/floor/wood,
/area/crew_quarters/theatre)
+"xmD" = (
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = "MedbayFoyer";
+ name = "Paramedic's Office";
+ req_access_txt = "5;6;12;64"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"xmS" = (
/obj/structure/chair/comfy/beige{
dir = 8
@@ -61928,6 +62278,9 @@
/obj/machinery/vending/wardrobe/curator_wardrobe,
/turf/open/floor/carpet,
/area/library)
+"xES" = (
+/turf/closed/wall/r_wall,
+/area/engine/storage)
"xFM" = (
/obj/item/clothing/gloves/color/rainbow,
/obj/item/clothing/head/soft/rainbow,
@@ -87579,14 +87932,14 @@ cdc
cdZ
bVI
cay
-ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-ccw
+xES
+xES
+xES
+xES
+xES
+xES
+xES
+xES
cfL
coH
cBO
@@ -87836,14 +88189,14 @@ bWB
cec
bVI
kNv
-ccw
+xES
chY
ciX
cjM
ckB
ckB
ckB
-ccw
+xES
cnY
coH
cgR
@@ -88093,14 +88446,14 @@ cde
ceb
bVI
cay
-ccw
+xES
chY
-ciZ
+fsQ
ciW
ckB
ckB
ckC
-ccw
+xES
cnX
coH
cps
@@ -88350,14 +88703,14 @@ cdf
ced
bVI
cay
-ccw
-ciZ
-ciZ
-ciZ
+xES
+fsQ
+fsQ
+fsQ
ckC
ckC
ckC
-ccw
+xES
coa
coJ
clJ
@@ -88607,14 +88960,14 @@ bWB
bWB
bVI
cay
-ccw
-ccw
+xES
+xES
ciY
ciY
-ccw
-ccw
-ccw
-ccw
+xES
+xES
+xES
+xES
cnZ
coH
cgI
@@ -93979,7 +94332,7 @@ aXf
bCv
bDP
bCv
-bAw
+pbC
bHV
bJw
bKC
@@ -94236,11 +94589,11 @@ bBy
bzs
bDO
bFl
-bGH
+bWe
bHU
bJv
-bKB
-bLK
+mFo
+bBb
bVW
bOd
iql
@@ -94494,10 +94847,10 @@ bCz
bDQ
bFn
bGJ
-bHX
+sKL
bJy
-bKE
-bLP
+iUp
+bLK
bMP
bIG
bJB
@@ -94748,10 +95101,10 @@ aJq
bHt
bBz
bzs
-bzs
+bof
bFm
bGI
-bHW
+bof
cBD
bKD
bLO
@@ -95005,10 +95358,10 @@ bwu
kPj
bBB
eBX
-bzs
+bof
bFp
-bGJ
-bHX
+uFV
+fvk
bJA
bKG
bLK
@@ -95262,9 +95615,9 @@ aJq
bAj
aJq
aKG
-bzs
+bof
bFo
-bDu
+bDA
bFt
bGQ
bHp
@@ -95519,7 +95872,7 @@ byX
aXh
bmE
bCA
-bzs
+bof
bCC
bDA
bFx
@@ -95771,15 +96124,15 @@ asT
asV
bof
bwv
-bvj
-bvj
-bvj
-bvj
-bvj
-bvj
+nEu
+nEu
+nEu
+nEu
+nEu
+nEu
bCB
-bCP
-bvj
+iVH
+nEu
bvd
bKH
bLK
@@ -96028,7 +96381,7 @@ asU
asX
bof
bwx
-bvj
+nEu
bwB
bxa
byZ
@@ -96289,8 +96642,8 @@ bvi
bww
bwZ
byY
-bzH
-bAW
+bCD
+ivJ
bCE
bFv
bFz
@@ -96546,8 +96899,8 @@ bvl
bwE
bxc
bzb
-bzK
-bBb
+nEu
+nEu
cpG
bDC
bId
@@ -96799,16 +97152,16 @@ bqS
brY
bwz
asG
-bvj
+nEu
bza
bxb
-bvh
-bCD
+bdN
+iRV
bAY
bCH
-bDR
+gfQ
bIc
-bvd
+bzK
bKH
bLK
bMW
@@ -97056,10 +97409,10 @@ bqV
bEe
bhh
bBL
-bvj
+nEu
asM
bAl
-bvh
+bzH
bzS
bBc
bCJ
@@ -97311,17 +97664,17 @@ bfF
bfF
bqU
bsq
-bvj
-bvj
-bvj
-bvj
-bvj
-bvj
-bvj
-bvd
+bof
+bof
+nEu
+nEu
+nEu
+nEu
+nEu
+nEu
bFu
jex
-bvj
+nEu
bvd
bKH
bLK
@@ -97560,7 +97913,7 @@ bet
bfH
aiP
wbE
-bhh
+ihR
wbE
bmJ
bof
@@ -97568,18 +97921,18 @@ bpu
bqP
bsy
bEe
-bvh
+rUe
ajv
bxN
bze
asL
-bvh
+rUe
bCG
bBd
bFw
bDD
bFJ
-bvd
+oQY
bKH
bzs
bRK
@@ -97819,24 +98172,24 @@ bhe
bit
bjS
tCd
-bli
+eRr
boe
bli
bpN
bqX
-bEe
-btg
-bDR
-bDR
-bDR
-bDR
+dcX
+fNN
+twE
+twE
+twE
+twE
bzc
-bDR
-bDZ
+twE
+bpP
bCK
bFy
bFF
-bvd
+oQY
bKH
bzs
fjU
@@ -98073,7 +98426,7 @@ aYV
bet
bfG
bhe
-bhh
+ihR
bjU
blk
blk
@@ -98082,18 +98435,18 @@ biu
bpO
bqY
bss
-btg
+bfJ
buk
bvm
bDT
buk
-bvh
+rUe
bzU
bBe
bCS
bDE
bFK
-bvd
+oQY
bKH
bzs
fjU
@@ -98330,7 +98683,7 @@ aYV
bet
bfG
bhe
-bhh
+ihR
bjV
blj
bmK
@@ -98339,17 +98692,17 @@ bog
bhh
bsx
bsr
-bvh
+rUe
bwD
-bDR
-bDR
+bhh
+bhh
bAq
-bvj
-bCQ
+bof
+bog
bDW
-bCP
-bvj
-bvj
+bKR
+bof
+bof
bJC
bKH
bzs
@@ -98586,8 +98939,8 @@ aYV
bdo
beu
bvk
-biu
-biu
+jiT
+jiT
bjT
blm
bmL
@@ -98596,15 +98949,15 @@ bpw
ium
bsx
btX
-bvj
+bof
bwG
bxR
bxR
-bvj
-bvj
+bof
+bof
bzW
-bDZ
-bCT
+bqQ
+bCR
bGR
bIj
bJC
@@ -98842,9 +99195,9 @@ aJC
aYV
aYV
bet
-bfJ
-bhh
-bhh
+qnC
+ihR
+ihR
bgQ
bll
bhh
@@ -98853,16 +99206,16 @@ bpv
bhh
bsx
btV
-bvh
+rUe
bwF
bxQ
bxQ
bAr
-bvj
+bof
bzV
-bDZ
-bzf
-bDR
+bqQ
+boo
+bhh
bIi
bJC
bKH
@@ -99101,25 +99454,25 @@ aYV
bet
bfH
qTV
-bhh
-bhg
+ihR
+uBr
bln
bmM
boj
bof
bhh
-bsx
+qkC
btV
-bvj
+bof
bwI
bxT
bxQ
bAt
-bvj
+bof
bCM
-bDZ
-bDR
-bDR
+bqQ
+eZa
+bhh
bIl
bJC
bKH
@@ -99367,16 +99720,16 @@ bof
bKL
brf
btV
-bvh
+rUe
bwH
bxS
bzh
bAs
-bvj
+bof
bCL
bxO
-bDR
-bDR
+bhh
+bhh
bIk
bJC
bKH
@@ -99624,16 +99977,16 @@ apI
bwz
brg
btZ
-bvj
+bof
bwI
bxV
bzj
bAv
-bvj
+bof
bCO
-bDR
-bDR
-bDR
+bhh
+bhh
+bhh
bIn
bJC
bUZ
@@ -99881,12 +100234,12 @@ bpx
bpP
brf
bhh
-bvh
+rUe
bwJ
bxU
bzi
bAu
-bvj
+bof
bCN
bEa
pHl
@@ -100110,11 +100463,11 @@ aaf
alP
aGL
aIe
-aJI
-aJI
-aJI
-aJI
-aJI
+bhr
+bhr
+bhr
+bhr
+bhr
aJI
aRC
aSK
@@ -100138,13 +100491,13 @@ bnH
bqQ
bsx
bhh
-bvj
-bvj
+bof
+bof
bxR
bxR
-bvj
-bvj
-bCQ
+bof
+bof
+bog
bEd
bof
bof
@@ -100367,7 +100720,7 @@ aaa
alP
aGN
aIh
-aJI
+bhr
aKT
aMD
aNM
@@ -100646,7 +100999,7 @@ bhn
biz
biz
biz
-bmR
+biz
bfL
bol
bqQ
@@ -100881,7 +101234,7 @@ aaa
alP
aGL
aHY
-aQj
+biC
iNn
aMk
aNK
@@ -100900,9 +101253,9 @@ bdp
cBm
bfL
bhm
-bhm
-bhm
-bhm
+tNl
+ttd
+dkM
bkP
bmV
boc
@@ -101153,13 +101506,13 @@ aVz
qus
bbz
aYV
-bdp
+blg
bdc
-bfL
+hYd
beY
-bhm
-bhm
-bhm
+oJV
+qSf
+wJA
bkR
bfL
boo
@@ -101395,9 +101748,9 @@ vpY
alP
aGJ
avI
-aJI
-aJI
-aJI
+bhr
+bhr
+bhr
aNO
aOT
aJI
@@ -101410,13 +101763,13 @@ aYM
aJI
bbA
aYV
-bdr
+bdp
bdb
-bdN
+bfL
blr
bho
-bho
-bho
+ecp
+eiB
bkQ
bmW
bom
@@ -101654,9 +102007,9 @@ aGJ
avI
aJL
aKX
-aJI
-aJI
-aJI
+bhr
+bhr
+bhr
aJI
aRH
aVz
@@ -101665,15 +102018,15 @@ aVH
aXn
aYN
aJI
-bbz
-aYV
+bkU
aYV
+bdp
bey
bfL
-bhm
-biz
-biz
-biz
+bfL
+bfL
+xmD
+bfL
bla
bmY
boq
@@ -101924,15 +102277,15 @@ aJI
aJI
aJI
bcq
+blo
bcq
-bcq
-bfL
+nyi
bhp
biB
-biB
-biB
-bkU
-bmX
+ouf
+nyi
+cTO
+bmZ
bpE
bpE
bpE
@@ -102181,14 +102534,14 @@ aiJ
bal
bam
aYV
-aYV
-aYV
-bfL
+bmR
+bmX
+gaF
bhq
-bhm
+rWg
bkb
-bhm
-bla
+nyi
+cTO
bmZ
bpH
bra
@@ -102440,12 +102793,12 @@ bbB
aYV
aYV
aYV
-bfL
-bfL
-bfL
-bfL
-bfL
-blg
+kQa
+tIE
+dnW
+jdE
+nyi
+cTO
bmZ
bpG
bqZ
@@ -102698,10 +103051,10 @@ aYV
aYV
aYV
bfO
-bfS
+kVj
biD
bkd
-bfS
+nyi
cTO
bmZ
bpJ
@@ -102953,13 +103306,13 @@ cBg
bam
aYV
aYV
-aYV
-aYV
-bhr
-biC
-bkc
+beE
bfS
-blo
+bfS
+bfS
+kQk
+kQk
+cTO
bmZ
bpI
brb
@@ -103211,11 +103564,11 @@ ssB
aYV
aYV
aYV
-beE
-bfS
+eUy
+pkg
biE
-bkf
-bfS
+kQk
+tEL
cTO
bmZ
bpL
@@ -103468,11 +103821,11 @@ ikm
aYV
aYV
bez
-bfP
-bfS
-bfS
-bfS
bfS
+vxz
+laN
+kQk
+jbK
cTO
bmZ
bpK
@@ -103725,12 +104078,12 @@ ikm
aYV
bci
beB
-bfS
-bfS
kQk
-ipA
+kQk
+kQk
+kQk
gbT
-cTO
+bdr
bmZ
bon
bon
@@ -108866,11 +109219,11 @@ aYV
aXq
aYV
bga
-bgc
-bgc
-bgc
-bgc
-bgc
+pKV
+pKV
+pKV
+pKV
+pKV
boB
boB
boB
@@ -109893,8 +110246,8 @@ aCR
kYk
bdx
vHT
-bgc
-bgc
+pKV
+pKV
biX
bhV
bka
@@ -110150,7 +110503,7 @@ aCR
bcy
bdw
beG
-bgc
+pKV
bhE
biW
bkv
@@ -110407,7 +110760,7 @@ bbG
aTk
bdy
beI
-bgc
+pKV
bhF
biW
bib
@@ -110664,15 +111017,15 @@ aPq
aPq
bdy
beH
-bgc
-bgc
-bgc
-bgc
-bgc
-bgc
-bgc
+pKV
+pKV
+pKV
+pKV
+pKV
+pKV
+pKV
bpp
-bgc
+pKV
brr
bsE
bvK
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index a7ffef1a0c..babb047c8d 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -47,6 +47,25 @@
new /obj/item/clothing/glasses/hud/health(src)
return
+/obj/structure/closet/secure_closet/paramedic
+ name = "paramedic's locker"
+ req_access = list(ACCESS_MEDICAL)
+ icon_state = "paramed_secure"
+
+/obj/structure/closet/secure_closet/paramedic/PopulateContents()
+ ..()
+ new /obj/item/clothing/suit/toggle/labcoat/paramedic(src)
+ new /obj/item/clothing/under/rank/medical/paramedic(src)
+ new /obj/item/clothing/under/rank/medical/paramedic/skirt(src)
+ new /obj/item/radio/headset/headset_med(src)
+ new /obj/item/defibrillator/loaded(src)
+ new /obj/item/clothing/gloves/color/latex/nitrile(src)
+ new /obj/item/storage/belt/medical(src)
+ new /obj/item/clothing/glasses/hud/health(src)
+ new /obj/item/pinpointer/crew(src)
+ new /obj/item/sensor_device(src)
+ return
+
/obj/structure/closet/secure_closet/CMO
name = "\proper chief medical officer's locker"
req_access = list(ACCESS_CMO)
diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi
index b71b021d80a50ab52c5be891fa2ac5022d2bf58b..3653635c56ef87a7946410140e3547cd3bb8808e 100644
GIT binary patch
literal 40446
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
RWd{L2>MB~wm5P?n{|j_ON+JLN
literal 39711
zcmZs?Wmp{17PZ;9yC%2?5+u00JA?#+6I_A^2-di}yAvQ-Ab5aAgS)%CyLV0J-nrk*
zGtc~hg3?o`s`h#JTKj~ntIA=azeWdvKv)X$(wZO;TnFqY4;2}JGaKP%06cfV*SG|63(j12z9wlJL?u_@=Bx_-h$G?8++iC4PkJ8${?UGdhK*TSd1
zUDxQv$+>77&R;w@$>2!Fm3XW6&P=%M{8vqFoZp8FB9j&tf)pH*_elV)*>nbJqOmf#Qfi`|$fNCrkZzE^JD4JQ#<%HL-0fn>6Vm?f^5HoX|Bo2G`}z(|
zbN4>ANhYbmjop_t+)N_l#TD-siVTa(NS0G1NYLv)dE_4?q#O~ui*%kVksX~}K6O9O
z^5RJ@s=Xrc9YiH+!Rt5zNh6oVd=gnSAs{Xe+Aj1vl1zFqXFzW%)fp*RN9H%tP?T@i
z<(QfowQPYcMsKaSZg5|v8LRUQw%QP?&zQS9ni<=fIa2GedfB1?VZ9ui|7Q_{9U0^FM`G>BH!UiOfJQB2sHm-fiZ5
zR`R2mMo{o|O-&65^k)UTWGa00Y7ZsZ{5IXkVomH{|45M32SeEe}>oTMlBcT_{4;NQV=2w@23hKymPcP-eJ+-
zR4ljYAWl-wDGN>-Avy#DPF{acd_}c&*rw_q|5_C?Y-VXj&BaAvkdz@Vb%2(&V0k-J
zH-;F8=R9v$?d0U-J|u{#$MOgAh;I5fD&P4;-4ost)=ZugE;w>Vn>D+cI)~qFf8oUS
zmsjv|o@{0$Jk(ZzP^_;nh2wT@ZCZA3z7<{+{d7z5T663)FEG~?YHQ3l13%wioW5XK
zj-ab2VDns&tvpRt;Wau0%-FtVQrg0SyLg8FB)fV^5~TZM;Qzowu>3UiV}zL9>~;a4
zIuf)xcbACN1*M_|9IDCZlHeO1^Ot;kPFErp?^+jr(#QtfmpV<6*p)N*=6nP7^r~Ac
zTW}3qa23$enM9WbT`*IOn>HAwGV+S9e6Io%>1
zDzzDX1B`Dg8alvWB_<;Xr>$tpkS%5X`