diff --git a/code/datums/config/config_types/config_game_world.dm b/code/datums/config/config_types/config_game_world.dm
index fe91d44250f..93df9d8f422 100644
--- a/code/datums/config/config_types/config_game_world.dm
+++ b/code/datums/config/config_types/config_game_world.dm
@@ -20,7 +20,8 @@
/decl/config/toggle/on/cult_ghostwriter,
/decl/config/toggle/allow_holidays,
/decl/config/toggle/humans_need_surnames,
- /decl/config/toggle/roundstart_level_generation
+ /decl/config/toggle/roundstart_level_generation,
+ /decl/config/toggle/lights_start_on
)
/decl/config/num/exterior_ambient_light
@@ -125,3 +126,7 @@
/decl/config/toggle/roundstart_level_generation
uid = "roundstart_level_generation"
desc = "Enable/Disable random level generation. Will behave strangely if turned off with a map that expects it on."
+
+/decl/config/toggle/lights_start_on
+ uid = "lights_start_on"
+ desc = "If true, most lightswitches start on by default. Otherwise, they start off."
\ No newline at end of file
diff --git a/code/datums/inventory_slots/slots/slot_shoes.dm b/code/datums/inventory_slots/slots/slot_shoes.dm
index 9ba3252eb8e..02c47d26787 100644
--- a/code/datums/inventory_slots/slots/slot_shoes.dm
+++ b/code/datums/inventory_slots/slots/slot_shoes.dm
@@ -22,7 +22,7 @@
var/blood_color
for(var/foot_tag in list(BP_L_FOOT, BP_R_FOOT))
var/obj/item/organ/external/stomper = GET_EXTERNAL_ORGAN(user, foot_tag)
- if(stomper && stomper.coating)
+ if(stomper && stomper.coating?.total_volume)
blood_color = stomper.coating.get_color()
break
if(blood_color)
@@ -38,7 +38,7 @@
return "[pronouns.He] [pronouns.is] wearing [_holding.get_examine_line()] on [pronouns.his] feet."
for(var/bp in list(BP_L_FOOT, BP_R_FOOT))
var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(owner, bp)
- if(E && E.coating)
+ if(E && E.coating?.total_volume)
if(user == owner)
return "There's something on your feet!"
return "There's something on [pronouns.his] feet!"
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index aa610cdf12f..85671b7bb5e 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -164,6 +164,15 @@
for(var/g in decls_repository.get_decl_paths_of_subtype(/decl/material/gas))
if(!env_info.important_gasses[g])
trace_gas += g
+ // not everything in these lists is a subtype of /decl/material/gas, so:
+ for(var/dangerous_gas in env_info.dangerous_gasses)
+ if(env_info.important_gasses[dangerous_gas] || !env_info.dangerous_gasses[dangerous_gas])
+ continue
+ trace_gas |= dangerous_gas
+ for(var/filtered_gas in env_info.filter_gasses)
+ if(env_info.important_gasses[filtered_gas])
+ continue
+ trace_gas |= filtered_gas
queue_icon_update()
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index 33a1bb173c2..8fc6978ab6f 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -14,7 +14,7 @@
z_flags = ZMM_MANGLE_PLANES
layer = ABOVE_WINDOW_LAYER
- var/on = 0
+ var/on = null // if null, takes from config option on init
var/area/connected_area = null
var/other_area = null
@@ -42,6 +42,8 @@
/obj/machinery/light_switch/LateInitialize()
. = ..()
+ if(isnull(on))
+ on = get_config_value(/decl/config/toggle/lights_start_on)
connected_area?.set_lightswitch(on)
update_icon()
diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm
index 088453f8012..5b40afb9144 100644
--- a/code/game/objects/items/__item.dm
+++ b/code/game/objects/items/__item.dm
@@ -860,7 +860,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
/obj/item/proc/get_examine_name()
. = name
- if(coating)
+ if(coating?.total_volume)
. = SPAN_WARNING("stained [.]")
if(gender == PLURAL)
. = "some [.]"
diff --git a/code/modules/chat_filter/_chat_filter.dm b/code/modules/chat_filter/_chat_filter.dm
index 95f52cf83a2..15beabc9ba0 100644
--- a/code/modules/chat_filter/_chat_filter.dm
+++ b/code/modules/chat_filter/_chat_filter.dm
@@ -7,7 +7,7 @@ var/global/list/chat_modifiers_in_use
var/list/all_filters = decls_repository.get_decls_of_type(/decl/chat_filter)
for(var/filtertype in all_filters)
var/decl/chat_filter/chat_filter = all_filters[filtertype]
- if(!chat_filter.disabled && chat_filter.filter_category != chat_filter.type)
+ if(!chat_filter.disabled)
if(chat_filter.can_deny_message)
global.chat_blockers_in_use += chat_filter
if(chat_filter.can_modify_message)
@@ -31,10 +31,10 @@ var/global/list/chat_modifiers_in_use
. = chat_filter.replace(., match)
/decl/chat_filter
+ abstract_type = /decl/chat_filter
var/name
var/disabled
var/summary
- var/filter_category = /decl/chat_filter
var/can_modify_message = FALSE
var/can_deny_message = FALSE
diff --git a/code/modules/chat_filter/_chat_filter_regex.dm b/code/modules/chat_filter/_chat_filter_regex.dm
index 3ddd4dee624..29982777e74 100644
--- a/code/modules/chat_filter/_chat_filter_regex.dm
+++ b/code/modules/chat_filter/_chat_filter_regex.dm
@@ -1,6 +1,7 @@
/decl/chat_filter/regexp
- filter_category = /decl/chat_filter/regexp
+ abstract_type = /decl/chat_filter/regexp
var/regex/filter_regex
/decl/chat_filter/regexp/match(var/message)
- . = filter_regex && findtext(message, filter_regex)
+ filter_regex.index = 0 // we use the global flag, so we need to reset this for every match or else repeat messages will break
+ . = filter_regex && filter_regex.Find(message)
diff --git a/code/modules/chat_filter/filter_markdown.dm b/code/modules/chat_filter/filter_markdown.dm
index 4b31c915db5..5421067fa56 100644
--- a/code/modules/chat_filter/filter_markdown.dm
+++ b/code/modules/chat_filter/filter_markdown.dm
@@ -1,27 +1,27 @@
/decl/chat_filter/regexp/markdown
- filter_category = /decl/chat_filter/regexp/markdown
+ abstract_type = /decl/chat_filter/regexp/markdown
can_modify_message = TRUE
var/format_char
var/format_replace_proc
/decl/chat_filter/regexp/markdown/Initialize()
. = ..()
- filter_regex = regex("([format_char])(.+?)([format_char])", "g")
+ filter_regex = regex("([REGEX_QUOTE(format_char)])(.+?)([REGEX_QUOTE(format_char)])", "g")
/decl/chat_filter/regexp/markdown/replace(var/message, var/match)
. = filter_regex.Replace(message, format_replace_proc)
/proc/chatFilterRegexBold(full_match, prefix_char, message_body, suffix_char)
- . = "[message_body]"
+ . = "[trim(message_body)]"
/decl/chat_filter/regexp/markdown/bold
name = "Bold"
summary = "Applies bold to speech and emote text that is surrounded by *asterisks*."
- format_char = "\\*"
+ format_char = "*"
format_replace_proc = /proc/chatFilterRegexBold
/proc/chatFilterRegexItalic(full_match, prefix_char, message_body, suffix_char)
- . = "[message_body]"
+ . = "[trim(message_body)]"
/decl/chat_filter/regexp/markdown/italic
name = "Italics"
diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm
index 5778a4ce922..4d63def2c68 100644
--- a/code/modules/emotes/emote_mob.dm
+++ b/code/modules/emotes/emote_mob.dm
@@ -117,8 +117,6 @@
if(!message || !emoter)
return
- message = html_decode(message)
-
name_anchor = findtext(message, anchor_char)
if(name_anchor > 0) // User supplied emote with visible_emote token (default ^)
pretext = copytext(message, 1, name_anchor)
@@ -139,11 +137,7 @@
if(end_char != " ")
pretext += " "
- // Grab the last character of the emote message.
- end_char = copytext(subtext, length(subtext), length(subtext) + 1)
- if(!(end_char in list(".", "?", "!", "\"", "-", "~"))) // gotta include ~ for all you fucking weebs
- // No punctuation supplied. Tack a period on the end.
- subtext += "."
+ handle_autopunctuation(subtext)
// Add a space to the subtext, unless it begins with an apostrophe or comma.
if(subtext != ".")
@@ -153,12 +147,9 @@
if(start_char != "," && start_char != "'")
subtext = " " + subtext
- pretext = capitalize(html_encode(pretext))
- nametext = html_encode(nametext)
- subtext = html_encode(subtext)
// Store the player's name in a nice bold, naturalement
nametext = "[emoter]"
- return pretext + nametext + subtext
+ return capitalize(pretext) + nametext + subtext
/mob/proc/custom_emote(var/m_type = VISIBLE_MESSAGE, var/message = null)
@@ -171,15 +162,16 @@
else
input = message
- if(input)
- message = format_emote(src, message)
- else
+ if(!input)
return
+ message = trim(html_encode(message))
+ message = filter_modify_message(message)
+ message = format_emote(src, message)
+
if (message)
log_emote("[name]/[key] : [message]")
//do not show NPC animal emotes to ghosts, it turns into hellscape
- message = filter_modify_message(message)
var/check_ghosts = client ? /datum/client_preference/ghost_sight : null
if(m_type == VISIBLE_MESSAGE)
visible_message(message, checkghosts = check_ghosts)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index aeddfea8312..7024317a429 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -204,7 +204,7 @@
criminal = R.get_criminalStatus()
msg += "Criminal status: \[[criminal]\]\n"
- msg += "Security records: \[View\]\n"
+ msg += "Security records: \[View\]\n"
if(hasHUD(user, HUD_MEDICAL))
var/perpname = "wot"
@@ -223,7 +223,7 @@
medical = R.get_status()
msg += "Physical status: \[[medical]\]\n"
- msg += "Medical records: \[View\]\n"
+ msg += "Medical records: \[View\]\n"
// Show IC/OOC info if available.
if(comments_record_id)
@@ -270,7 +270,7 @@
/mob/living/carbon/human/getHUDsource(hudtype)
var/obj/item/clothing/glasses/G = get_equipped_item(slot_glasses_str)
if(!istype(G))
- return
+ return ..()
if(G.glasses_hud_type & hudtype)
return G
if(G.hud && (G.hud.glasses_hud_type & hudtype))
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index b6c56f75e32..782bdbae84d 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -19,6 +19,7 @@
machine = null
CLEAR_HUD_ALERTS(src) // These will be set again in the various update procs below.
+ handle_hud_glasses() // Clear HUD overlay images. Done early so that organs, etc. can add them back.
//Handle temperature/pressure differences between body and environment
handle_environment(loc.return_air())
@@ -540,7 +541,6 @@
/mob/living/proc/handle_hud_icons()
handle_hud_icons_health()
- handle_hud_glasses()
/mob/living/proc/handle_hud_icons_health()
return
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 26cd2a57e2d..03e864618d9 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -100,18 +100,6 @@
returns[2] = null
return returns
-/mob/living/proc/format_say_message(var/message = null)
- if(!message)
- return
-
- message = html_decode(message)
-
- var/end_char = copytext_char(message, -1)
- if(!(end_char in list(".", "?", "!", "-", "~")))
- message += "."
-
- return html_encode(message)
-
/mob/living/proc/handle_mob_specific_speech(message, message_mode, verb = "says", decl/language/speaking)
SHOULD_CALL_PARENT(TRUE)
return FALSE
@@ -142,7 +130,8 @@
else
message = copytext_char(message, 3)
- message = trim_left(message)
+ // trim pre-language-parsing so we can get language and radio keys
+ message = trim(message)
//parse the language code and consume it
if(!speaking)
@@ -177,10 +166,10 @@
else
verb = say_quote(message, speaking)
- message = trim_left(message)
+ message = trim(html_encode(message)) // trim again post-language-parsing
message = handle_autohiss(message, speaking)
- message = format_say_message(message)
message = filter_modify_message(message)
+ message = handle_autopunctuation(message)
if(speaking && !speaking.can_be_spoken_properly_by(src))
message = speaking.muddle(message)
diff --git a/code/modules/mob/observer/eye/freelook/life.dm b/code/modules/mob/observer/eye/freelook/life.dm
index 6a8a6975fd7..98b9c477e1f 100644
--- a/code/modules/mob/observer/eye/freelook/life.dm
+++ b/code/modules/mob/observer/eye/freelook/life.dm
@@ -1,7 +1,7 @@
/mob/observer/eye/freelook/Life()
- . = ..()
+ ..()
// If we lost our client, reset the list of visible chunks so they update properly on return
- if(. && owner == src && !client)
+ if(owner == src && !client)
visibleChunks.Cut()
/*else if(owner && !owner.client)
visibleChunks.Cut()*/
diff --git a/code/modules/mob/observer/ghost/ghost.dm b/code/modules/mob/observer/ghost/ghost.dm
index d2e89e4e528..a03d9e7cf9e 100644
--- a/code/modules/mob/observer/ghost/ghost.dm
+++ b/code/modules/mob/observer/ghost/ghost.dm
@@ -109,8 +109,8 @@ Works together with spawning an observer, noted above.
/mob/observer/ghost/Life()
- . = ..()
- if(!. || !loc || !client)
+ ..()
+ if(!loc || !client)
return FALSE
handle_hud_glasses()
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 4d06bb5bfd1..a7363022c79 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -111,3 +111,12 @@ var/global/list/special_channel_keys = list(
var/obj/item/mask = get_equipped_item(slot_wear_mask_str)
if(istype(mask, /obj/item/clothing/mask/muzzle) || istype(mask, /obj/item/sealant))
. = mask
+
+/// Adds punctuation to an emote or speech message automatically.
+/mob/proc/handle_autopunctuation(message)
+ if(!message)
+ return
+ var/end_char = copytext_char(trim_right(strip_html_properly(message)), -1)
+ if(!(end_char in list(".", "?", "!", "-", "~")))
+ message += "."
+ return message
\ No newline at end of file
diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm
index 31df9783893..1c50131c7d4 100644
--- a/code/modules/modular_computers/computers/modular_computer/interaction.dm
+++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm
@@ -138,6 +138,7 @@
LAZYADD(., /decl/interaction_handler/remove_id/modular_computer)
LAZYADD(., /decl/interaction_handler/remove_pen/modular_computer)
LAZYADD(., /decl/interaction_handler/emergency_shutdown)
+ LAZYADD(., /decl/interaction_handler/remove_chargestick)
//
// Remove ID
@@ -149,7 +150,8 @@
. = ..()
if(.)
var/datum/extension/assembly/assembly = get_extension(target, /datum/extension/assembly)
- . = !!(assembly?.get_component(PART_CARD))
+ var/obj/item/stock_parts/computer/card_slot/card_slot = assembly?.get_component(PART_CARD)
+ return !!card_slot?.stored_card
/decl/interaction_handler/remove_id/modular_computer/invoked(atom/target, mob/user, obj/item/prop)
var/datum/extension/assembly/assembly = get_extension(target, /datum/extension/assembly)
@@ -186,4 +188,26 @@
return !isnull(assembly) && assembly.enabled
/decl/interaction_handler/emergency_shutdown/invoked(obj/item/modular_computer/target, mob/user, obj/item/prop)
- target.emergency_shutdown()
\ No newline at end of file
+ target.emergency_shutdown()
+
+//
+// Remove Charge-stick
+//
+/decl/interaction_handler/remove_chargestick
+ name = "Remove Chargestick"
+ icon = 'icons/screen/radial.dmi'
+ icon_state = "radial_eject"
+ expected_target_type = /obj/item/modular_computer
+
+/decl/interaction_handler/remove_chargestick/is_possible(atom/target, mob/user, obj/item/prop)
+ . = ..()
+ if(!.)
+ return .
+ var/datum/extension/assembly/assembly = get_extension(target, /datum/extension/assembly)
+ var/obj/item/stock_parts/computer/charge_stick_slot/mstick_slot = assembly.get_component(PART_MSTICK)
+ return !!mstick_slot?.stored_stick
+
+/decl/interaction_handler/remove_chargestick/invoked(atom/target, mob/user, obj/item/prop)
+ var/datum/extension/assembly/assembly = get_extension(target, /datum/extension/assembly)
+ var/obj/item/stock_parts/computer/charge_stick_slot/mstick_slot = assembly.get_component(PART_MSTICK)
+ mstick_slot.eject_stick(user)
\ No newline at end of file
diff --git a/maps/tether/atoms/areas.dm b/maps/tether/atoms/areas.dm
index 3840c41e32a..dda17598695 100644
--- a/maps/tether/atoms/areas.dm
+++ b/maps/tether/atoms/areas.dm
@@ -282,8 +282,8 @@
icon_state = "shuttle2"
base_turf = /turf/floor/natural/barren
-/area/shuttle/escape/centcom
- name = "\improper Emergency Shuttle CentCom"
+/area/shuttle/tram
+ name = "\improper Orange Line Tram"
icon_state = "shuttle"
/area/shuttle/specops/centcom
diff --git a/maps/tether/datums/jobs/civilian.dm b/maps/tether/datums/jobs/civilian.dm
index 9c39a8cf737..b1b020f4917 100644
--- a/maps/tether/datums/jobs/civilian.dm
+++ b/maps/tether/datums/jobs/civilian.dm
@@ -94,6 +94,7 @@
department_types = list(/decl/department/supply)
total_positions = 1
spawn_positions = 1
+ pto_type = PTO_CARGO
supervisors = "the head of personnel"
economic_power = 5
access = list(
@@ -139,6 +140,7 @@
department_types = list(/decl/department/supply)
total_positions = 3
spawn_positions = 3
+ pto_type = PTO_CARGO
supervisors = "the quartermaster and the head of personnel"
access = list(
access_maint_tunnels,
@@ -175,6 +177,7 @@
department_types = list(/decl/department/supply)
total_positions = 4
spawn_positions = 4
+ pto_type = PTO_CARGO
supervisors = "the quartermaster and the head of personnel"
economic_power = 5
access = list(
diff --git a/maps/tether/datums/jobs/command.dm b/maps/tether/datums/jobs/command.dm
index 955efdcc3b7..087a6adbfbd 100644
--- a/maps/tether/datums/jobs/command.dm
+++ b/maps/tether/datums/jobs/command.dm
@@ -15,6 +15,8 @@
head_position = TRUE
req_admin_notify = TRUE
disallow_jobhop = TRUE
+ pto_type = PTO_COMMAND
+ timeoff_factor = 5
guestbanned = TRUE
must_fill = TRUE
not_random_selectable = TRUE
@@ -57,6 +59,7 @@
head_position = TRUE
req_admin_notify = TRUE
disallow_jobhop = TRUE
+ pto_type = PTO_COMMAND
guestbanned = TRUE
not_random_selectable = TRUE
access = list(
@@ -154,6 +157,7 @@
title = "Command Secretary"
department_types = list(/decl/department/command, /decl/department/service)
disallow_jobhop = TRUE
+ pto_type = PTO_COMMAND // you count! for now...
total_positions = 2
spawn_positions = 2
supervisors = "Command staff"
diff --git a/maps/tether/datums/jobs/engineering.dm b/maps/tether/datums/jobs/engineering.dm
index f3a6e6e3f9c..e1a283ec61a 100644
--- a/maps/tether/datums/jobs/engineering.dm
+++ b/maps/tether/datums/jobs/engineering.dm
@@ -16,6 +16,8 @@
must_fill = TRUE
not_random_selectable = TRUE
disallow_jobhop = TRUE
+ pto_type = PTO_COMMAND
+ timeoff_factor = 3
access = list(
access_engine,
access_engine_equip,
@@ -95,6 +97,7 @@
total_positions = 8
spawn_positions = 8
+ pto_type = PTO_ENGINEERING
supervisors = "the chief engineer"
selection_color = "#5b4d20"
economic_power = 5
diff --git a/maps/tether/datums/jobs/medical.dm b/maps/tether/datums/jobs/medical.dm
index 77788d1178d..407ff9327b6 100644
--- a/maps/tether/datums/jobs/medical.dm
+++ b/maps/tether/datums/jobs/medical.dm
@@ -2,6 +2,8 @@
title = "Chief Medical Officer"
head_position = TRUE
disallow_jobhop = TRUE
+ pto_type = PTO_COMMAND
+ timeoff_factor = 3
department_types = list(
/decl/department/medical,
/decl/department/command
@@ -80,6 +82,7 @@
minimal_player_age = 3
total_positions = 5
spawn_positions = 3
+ pto_type = PTO_MEDICAL
supervisors = "the chief medical officer"
selection_color = "#013d3b"
economic_power = 7
@@ -134,6 +137,7 @@
minimal_player_age = 7
total_positions = 2
spawn_positions = 2
+ pto_type = PTO_MEDICAL
supervisors = "the chief medical officer"
selection_color = "#013d3b"
economic_power = 5
@@ -169,6 +173,7 @@
department_types = list(/decl/department/medical)
total_positions = 1
spawn_positions = 1
+ pto_type = PTO_MEDICAL
economic_power = 5
minimal_player_age = 3
supervisors = "the chief medical officer"
diff --git a/maps/tether/datums/jobs/offduty.dm b/maps/tether/datums/jobs/offduty.dm
index 4e0dd28b4dc..910ad61f308 100644
--- a/maps/tether/datums/jobs/offduty.dm
+++ b/maps/tether/datums/jobs/offduty.dm
@@ -12,6 +12,7 @@
access = list()
minimal_access = list()
outfit_type = /decl/hierarchy/outfit/job/generic/assistant
+ description = "Off-duty crew has no responsibilities or authority and is just here to spend their \"well-deserved\" time off."
/datum/job/offduty/get_access()
if(get_config_value(/decl/config/toggle/assistant_maint))
@@ -26,25 +27,37 @@
/datum/job/offduty/cargo
title = "Off-duty Cargo"
+ pto_type = PTO_CARGO
department_types = list(/decl/department/supply)
selection_color = "#9b633e"
/datum/job/offduty/engineering
title = "Off-duty Engineer"
+ pto_type = PTO_ENGINEERING
department_types = list(/decl/department/engineering)
selection_color = "#5b4d20"
/datum/job/offduty/medical
title = "Off-duty Medic"
+ pto_type = PTO_MEDICAL
department_types = list(/decl/department/medical)
selection_color = "#013d3b"
/datum/job/offduty/science
title = "Off-duty Scientist"
+ pto_type = PTO_SCIENCE
department_types = list(/decl/department/science)
selection_color = "#633d63"
/datum/job/offduty/security
title = "Off-duty Officer"
+ pto_type = PTO_SECURITY
department_types = list(/decl/department/security)
selection_color = "#601c1c"
+
+
+/datum/job/offduty/security
+ title = "Off-duty Command"
+ pto_type = PTO_COMMAND
+ department_types = list(/decl/department/command)
+ selection_color = "#9b633e"
diff --git a/maps/tether/datums/jobs/science.dm b/maps/tether/datums/jobs/science.dm
index eba32803e49..327b3f904b4 100644
--- a/maps/tether/datums/jobs/science.dm
+++ b/maps/tether/datums/jobs/science.dm
@@ -3,6 +3,8 @@
alt_titles = list("Chief Science Officer", "Research Supervisor")
head_position = TRUE
disallow_jobhop = TRUE
+ pto_type = PTO_COMMAND
+ timeoff_factor = 3
req_admin_notify = TRUE
guestbanned = TRUE
must_fill = TRUE
@@ -82,6 +84,7 @@
department_types = list(/decl/department/science)
total_positions = 8
spawn_positions = 5
+ pto_type = PTO_SCIENCE
supervisors = "the Research Director"
selection_color = "#633d63"
economic_power = 7
@@ -131,6 +134,7 @@
department_types = list(/decl/department/science)
total_positions = 2
spawn_positions = 2
+ pto_type = PTO_SCIENCE
supervisors = "the Chief Science Officer"
selection_color = "#633d63"
economic_power = 5
diff --git a/maps/tether/datums/jobs/security.dm b/maps/tether/datums/jobs/security.dm
index a824d580752..7f4c8e04581 100644
--- a/maps/tether/datums/jobs/security.dm
+++ b/maps/tether/datums/jobs/security.dm
@@ -2,6 +2,8 @@
title = "Head of Security"
head_position = TRUE
disallow_jobhop = TRUE
+ pto_type = PTO_COMMAND
+ timeoff_factor = 3
department_types = list(
/decl/department/security,
/decl/department/command
@@ -96,6 +98,7 @@
department_types = list(/decl/department/security)
total_positions = 1
spawn_positions = 1
+ pto_type = PTO_SECURITY
supervisors = "the head of security"
selection_color = "#601c1c"
economic_power = 5
@@ -193,6 +196,7 @@
department_types = list(/decl/department/security)
total_positions = 4
spawn_positions = 4
+ pto_type = PTO_SECURITY
supervisors = "the head of security"
selection_color = "#601c1c"
alt_titles = list("Junior Officer")
diff --git a/maps/tether/icons/hud.dmi b/maps/tether/icons/hud.dmi
index 16c0b5defac..84f34230f91 100644
Binary files a/maps/tether/icons/hud.dmi and b/maps/tether/icons/hud.dmi differ
diff --git a/maps/tether/main_dmms/tether-01-surface1.dmm b/maps/tether/main_dmms/tether-01-surface1.dmm
index 83f22ebcb7f..b4dda11e824 100644
--- a/maps/tether/main_dmms/tether-01-surface1.dmm
+++ b/maps/tether/main_dmms/tether-01-surface1.dmm
@@ -32655,6 +32655,10 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/floor/tiled/dark,
/area/tether/surfacebase/medical/triage)
+"rGX" = (
+/obj/effect/shuttle_landmark/escape_shuttle/station,
+/turf/floor/tiled/techfloor/grid,
+/area/tether/surfacebase/tram)
"rKM" = (
/obj/structure/stairs/long/north,
/turf/floor/tiled,
@@ -54171,7 +54175,7 @@ aqE
aqE
aqE
aqE
-aqE
+rGX
aqE
aqE
aqE
diff --git a/maps/tether/main_dmms/tether-10-colony.dmm b/maps/tether/main_dmms/tether-10-colony.dmm
index 334cca269c7..9585c827787 100644
--- a/maps/tether/main_dmms/tether-10-colony.dmm
+++ b/maps/tether/main_dmms/tether-10-colony.dmm
@@ -17,14 +17,10 @@
icon_state = "burst_l"
},
/turf/unsimulated/floor/shuttle_ceiling,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"af" = (
/turf/wall/shuttle/dark,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"ag" = (
/turf/unsimulated/floor/shuttle_ceiling,
/area/centcom/specops)
@@ -36,9 +32,7 @@
dir = 8
},
/turf/unsimulated/floor/shuttle_ceiling,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"aj" = (
/obj/structure/shuttle/engine/heater{
dir = 8
@@ -47,22 +41,16 @@
dir = 4
},
/turf/floor/airless,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"ak" = (
/obj/machinery/computer/modular/preset/civilian,
/obj/machinery/computer/shuttle_control/specops,
/turf/floor/shuttle/blue,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"al" = (
/obj/structure/bed/chair,
/turf/floor/shuttle/blue,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"am" = (
/obj/machinery/recharger/wallcharger{
pixel_x = 4;
@@ -70,9 +58,7 @@
},
/obj/structure/bed/chair,
/turf/floor/shuttle/blue,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"an" = (
/obj/machinery/recharger/wallcharger{
pixel_x = 4;
@@ -87,16 +73,12 @@
},
/obj/structure/bed/chair,
/turf/floor/shuttle/blue,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"ao" = (
/turf/wall/shuttle/dark{
hard_corner = 1
},
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"ap" = (
/obj/structure/window/reinforced{
dir = 1
@@ -194,6 +176,12 @@
icon_state = "dark"
},
/area/centcom/specops)
+"aw" = (
+/obj/effect/shuttle_landmark/escape_shuttle/start,
+/turf/floor/shuttle/white{
+ color = "#cccccc"
+ },
+/area/shuttle/tram)
"ax" = (
/obj/structure/window/reinforced{
dir = 1
@@ -275,14 +263,10 @@
dir = 8
},
/turf/floor/shuttle/blue,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"aC" = (
/turf/floor/shuttle/blue,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"aD" = (
/obj/machinery/embedded_controller/radio/simple_docking_controller{
id_tag = "specops_shuttle_fore";
@@ -292,9 +276,7 @@
dir = 1
},
/turf/floor/shuttle/blue,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"aE" = (
/obj/machinery/door/airlock/external/glass{
id_tag = "specops_shuttle_fore_hatch";
@@ -302,9 +284,7 @@
name = "Forward Docking Hatch"
},
/turf/floor,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"aF" = (
/obj/structure/rack,
/obj/item/ammo_casing/rocket,
@@ -452,17 +432,13 @@
pixel_y = -30
},
/turf/floor/shuttle/blue,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"aR" = (
/obj/machinery/computer/prisoner{
name = "Implant Management"
},
/turf/floor/shuttle/blue,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"aS" = (
/obj/machinery/embedded_controller/radio/simple_docking_controller{
id_tag = "specops_shuttle_port";
@@ -472,17 +448,13 @@
dir = 1
},
/turf/floor/shuttle/blue,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"aT" = (
/obj/structure/bed/chair{
dir = 1
},
/turf/floor/shuttle/blue,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"aU" = (
/obj/structure/bed/chair{
dir = 1
@@ -491,9 +463,7 @@
dir = 4
},
/turf/floor/shuttle/blue,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"aV" = (
/obj/structure/rack,
/obj/item/gun/energy/pulse_rifle,
@@ -639,9 +609,7 @@
icon_state = "burst_r"
},
/turf/unsimulated/floor/shuttle_ceiling,
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"bi" = (
/obj/machinery/door/airlock/external/glass{
id_tag = "specops_shuttle_port_hatch";
@@ -651,9 +619,7 @@
/turf/unsimulated/floor{
icon_state = "dark"
},
-/area/shuttle/specops/centcom{
- base_turf = /turf/unsimulated/floor/shuttle_ceiling
- })
+/area/shuttle/specops/centcom)
"bj" = (
/obj/structure/rack,
/obj/item/clothing/gloves/thick/swat{
@@ -9252,16 +9218,12 @@
/area/centcom/security)
"si" = (
/turf/wall/shuttle,
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"sj" = (
/obj/structure/grille,
/obj/structure/shuttle/window,
/turf/floor,
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"sk" = (
/obj/structure/table/woodentable{
dir = 5
@@ -9415,9 +9377,7 @@
/area/centcom/security)
"sB" = (
/turf/wall/shuttle/hard_corner,
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"sC" = (
/obj/structure/closet/hydrant{
pixel_x = -30;
@@ -9433,24 +9393,18 @@
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"sD" = (
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"sE" = (
/obj/structure/bed/chair/shuttle,
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"sF" = (
/obj/structure/bed/chair{
dir = 8
@@ -9641,17 +9595,13 @@
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"sX" = (
/obj/structure/table,
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"sY" = (
/obj/machinery/status_display{
pixel_y = 30
@@ -9663,9 +9613,7 @@
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"sZ" = (
/obj/structure/table/glass,
/obj/item/box/cups,
@@ -9844,9 +9792,7 @@
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"tm" = (
/obj/effect/floor_decal/borderfloorwhite{
dir = 4
@@ -10015,9 +9961,7 @@
name = "Shuttle Hatch"
},
/turf/floor/shuttle/yellow,
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"tC" = (
/obj/machinery/door/airlock/external/glass{
id_tag = "escape_shuttle_hatch_offsite";
@@ -10025,9 +9969,7 @@
name = "Shuttle Hatch"
},
/turf/floor/shuttle/yellow,
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"tD" = (
/obj/structure/table/glass,
/obj/item/roller,
@@ -10248,9 +10190,7 @@
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"ub" = (
/obj/structure/bed/chair/shuttle,
/obj/structure/emergency_dispenser{
@@ -10260,9 +10200,7 @@
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"uc" = (
/obj/effect/wingrille_spawn/reinforced/crescent,
/turf/unsimulated/floor/steel,
@@ -10330,18 +10268,14 @@
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"un" = (
/obj/structure/table,
/obj/random/maintenance/clean,
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"uo" = (
/obj/structure/flora/pottedplant{
icon_state = "plant-22"
@@ -10571,9 +10505,7 @@
"uP" = (
/obj/structure/sign/nanotrasen,
/turf/wall/shuttle,
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"uQ" = (
/obj/effect/floor_decal/steeldecal/steel_decals5{
dir = 8
@@ -10675,18 +10607,14 @@
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"vc" = (
/obj/structure/table,
/obj/random/plushie,
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"vd" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/blast/regular/open{
@@ -10781,9 +10709,7 @@
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"vl" = (
/obj/structure/bed/chair/shuttle{
dir = 1
@@ -10795,9 +10721,7 @@
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"vm" = (
/turf/unsimulated/wall,
/area/centcom/security/arrivals)
@@ -10979,7 +10903,6 @@
/area/centcom/restaurant)
"vJ" = (
/obj/structure/sign/directions/elevator{
- name = "\improper Elevator";
pixel_x = -30
},
/turf/unsimulated/floor/steel,
@@ -11300,17 +11223,13 @@
/obj/structure/grille,
/obj/structure/shuttle/window,
/turf/floor/shuttle/white,
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"wg" = (
/obj/effect/floor_decal/industrial/outline/blue,
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"wh" = (
/obj/machinery/computer/modular/preset/cardslot/personnel{
dir = 4
@@ -11587,18 +11506,14 @@
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"wD" = (
/obj/effect/floor_decal/industrial/outline/blue,
/obj/machinery/light,
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"wE" = (
/obj/machinery/computer/modular/preset/civilian{
dir = 4
@@ -11833,9 +11748,7 @@
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"xa" = (
/obj/structure/bed/chair/shuttle{
dir = 1
@@ -11844,9 +11757,7 @@
/turf/floor/shuttle/white{
color = "#cccccc"
},
-/area/shuttle/escape/centcom{
- base_turf = /turf/unsimulated/floor/techfloor_grid
- })
+/area/shuttle/tram)
"xb" = (
/obj/effect/floor_decal/borderfloorblack{
dir = 10
@@ -21641,7 +21552,7 @@ sD
sD
sD
sD
-sD
+aw
sD
sD
sD
diff --git a/maps/tether/submaps/tether_misc.dmm b/maps/tether/submaps/tether_misc.dmm
index ca36ec717a8..00169b4a277 100644
--- a/maps/tether/submaps/tether_misc.dmm
+++ b/maps/tether/submaps/tether_misc.dmm
@@ -29,6 +29,10 @@
/obj/structure/window/reinforced,
/turf/unsimulated/wall,
/area/space)
+"aA" = (
+/obj/effect/shuttle_landmark/escape_shuttle/transit,
+/turf/unsimulated/floor/techfloor_grid,
+/area/centcom/ferry)
"aI" = (
/obj/structure/window/reinforced{
dir = 4
@@ -586,8 +590,8 @@
/turf/floor/holofloor/tiled,
/area/holodeck/source_emptycourt)
"cC" = (
-/turf/unsimulated/floor/maglev,
-/area/space)
+/turf/unsimulated/dark_filler,
+/area/centcom/ferry)
"cO" = (
/obj/machinery/embedded_controller/radio/simple_docking_controller{
id_tag = "supply_shuttle";
@@ -1931,7 +1935,7 @@
/obj/effect/transit/light{
dir = 8
},
-/turf/unsimulated/mineral,
+/turf/unsimulated/dark_filler,
/area/centcom/ferry)
"nw" = (
/obj/machinery/door/window/holowindoor{
@@ -1978,8 +1982,12 @@
},
/area/holodeck/holodorm/source_zaddat)
"uC" = (
+/obj/effect/floor_decal/transit/orange{
+ dir = 8
+ },
+/obj/effect/step_trigger/lost_in_space/tram,
/turf/unsimulated/floor/techfloor_grid,
-/area/space)
+/area/centcom/ferry)
"vi" = (
/obj/structure/table,
/obj/item/firstaid/surgery,
@@ -2312,6 +2320,10 @@
},
/turf/floor/tiled/white,
/area/holodeck/holodorm/source_standard)
+"EV" = (
+/obj/effect/step_trigger/lost_in_space/tram,
+/turf/unsimulated/floor/maglev,
+/area/centcom/ferry)
"EX" = (
/obj/effect/floor_decal/borderfloorblack{
dir = 1
@@ -2574,6 +2586,13 @@
},
/turf/floor/tiled/white,
/area/holodeck/holodorm/source_standard)
+"Os" = (
+/obj/effect/floor_decal/transit/orange{
+ dir = 4
+ },
+/obj/effect/step_trigger/lost_in_space/tram,
+/turf/unsimulated/floor/techfloor_grid,
+/area/centcom/ferry)
"OJ" = (
/obj/effect/floor_decal/borderfloorwhite{
dir = 1
@@ -2728,6 +2747,10 @@
},
/turf/floor/tiled/white,
/area/holodeck/holodorm/source_standard)
+"YD" = (
+/obj/effect/step_trigger/lost_in_space/tram,
+/turf/unsimulated/floor/techfloor_grid,
+/area/centcom/ferry)
"ZY" = (
/obj/structure/table/glass/pglass,
/obj/effect/floor_decal/borderfloorwhite{
@@ -3319,7 +3342,6 @@ ap
ap
"}
(5,1,1) = {"
-gX
hl
hl
hl
@@ -3350,7 +3372,8 @@ hl
hl
hl
hl
-gX
+hl
+hl
ap
ap
ap
@@ -3461,7 +3484,7 @@ ap
ap
"}
(6,1,1) = {"
-gX
+cC
hm
hm
hm
@@ -3491,7 +3514,7 @@ hm
hv
hm
hm
-hm
+uC
mu
ap
ap
@@ -3603,7 +3626,7 @@ ap
ap
"}
(7,1,1) = {"
-gX
+cC
hn
hn
hn
@@ -3612,20 +3635,20 @@ hn
hn
ib
ib
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
lo
lo
hn
@@ -3633,8 +3656,8 @@ hn
hn
hn
hn
-hn
-gX
+YD
+cC
ap
ap
ap
@@ -3745,7 +3768,7 @@ ap
ap
"}
(8,1,1) = {"
-gX
+cC
ho
ho
ho
@@ -3753,30 +3776,30 @@ ho
ho
ho
ic
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-lx
ho
ho
ho
ho
ho
ho
-gX
+ho
+ho
+ho
+ho
+ho
+ho
+ho
+ho
+ho
+ho
+lx
+ho
+ho
+ho
+ho
+ho
+EV
+cC
ap
ap
ap
@@ -3887,7 +3910,7 @@ ap
ap
"}
(9,1,1) = {"
-gX
+cC
hn
hn
hn
@@ -3895,30 +3918,30 @@ hn
hn
hn
ib
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-lo
hn
hn
hn
hn
hn
hn
-gX
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+lo
+hn
+hn
+hn
+hn
+hn
+YD
+cC
ap
ap
ap
@@ -4029,7 +4052,7 @@ ap
ap
"}
(10,1,1) = {"
-gX
+cC
hn
hn
hn
@@ -4037,30 +4060,30 @@ hn
hn
hn
ib
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-lo
hn
hn
hn
hn
hn
hn
-gX
+hn
+aA
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+lo
+hn
+hn
+hn
+hn
+hn
+YD
+cC
ap
ap
ap
@@ -4171,7 +4194,7 @@ ap
ap
"}
(11,1,1) = {"
-gX
+cC
hn
hn
hn
@@ -4179,30 +4202,30 @@ hn
hn
hn
id
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-lo
hn
hn
hn
hn
hn
hn
-gX
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+lo
+hn
+hn
+hn
+hn
+hn
+YD
+cC
ap
ap
ap
@@ -4313,7 +4336,7 @@ ap
ap
"}
(12,1,1) = {"
-gX
+cC
hn
hn
hn
@@ -4321,30 +4344,30 @@ hn
hn
hn
id
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-lo
hn
hn
hn
hn
hn
hn
-gX
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+lo
+hn
+hn
+hn
+hn
+hn
+YD
+cC
ap
ap
ap
@@ -4455,7 +4478,7 @@ ap
ap
"}
(13,1,1) = {"
-gX
+cC
ho
ho
ho
@@ -4463,30 +4486,30 @@ ho
ho
ho
ie
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-cC
-lx
ho
ho
ho
ho
ho
ho
-gX
+ho
+ho
+ho
+ho
+ho
+ho
+ho
+ho
+ho
+ho
+lx
+ho
+ho
+ho
+ho
+ho
+EV
+cC
ap
ap
ap
@@ -4597,7 +4620,7 @@ ap
ap
"}
(14,1,1) = {"
-gX
+cC
hn
hn
hn
@@ -4606,20 +4629,20 @@ hn
hn
id
id
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
-uC
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
+hn
lo
lo
hn
@@ -4627,8 +4650,8 @@ hn
hn
hn
hn
-hn
-gX
+YD
+cC
ap
ap
ap
@@ -4739,7 +4762,7 @@ ap
ap
"}
(15,1,1) = {"
-gX
+cC
hp
hp
hp
@@ -4769,8 +4792,8 @@ hp
hp
hI
hp
-hp
-gX
+Os
+cC
ap
ap
ap
@@ -4881,7 +4904,6 @@ ap
ap
"}
(16,1,1) = {"
-gX
hl
hl
hl
@@ -4912,7 +4934,8 @@ hl
hl
hl
hl
-gX
+hl
+hl
ap
ap
ap
diff --git a/maps/tether/submaps/tether_ships.dmm b/maps/tether/submaps/tether_ships.dmm
index b5ccd2acfaf..5e7a49648fb 100644
--- a/maps/tether/submaps/tether_ships.dmm
+++ b/maps/tether/submaps/tether_ships.dmm
@@ -126,9 +126,6 @@
/obj/effect/step_trigger/lost_in_space,
/turf/space,
/area/space)
-"hx" = (
-/turf/unsimulated/mineral,
-/area/space)
"hz" = (
/obj/effect/step_trigger/thrower{
affect_ghosts = 1;
@@ -175,7 +172,7 @@
/obj/effect/transit/light{
dir = 4
},
-/turf/unsimulated/mineral,
+/turf/unsimulated/dark_filler,
/area/space)
"HC" = (
/obj/abstract/level_data_spawner/admin_level,
@@ -18759,7 +18756,7 @@ aa
aa
aa
aa
-hx
+dJ
gW
gW
gW
@@ -18781,7 +18778,7 @@ gW
gW
gW
gW
-hx
+dJ
aa
"}
(132,1,1) = {"
@@ -18901,7 +18898,7 @@ aa
aa
aa
aa
-hx
+dJ
gX
gX
gX
@@ -18923,7 +18920,7 @@ gX
gX
gX
hh
-hx
+dJ
aa
"}
(133,1,1) = {"
@@ -19043,7 +19040,7 @@ aa
aa
aa
aa
-hx
+dJ
gY
gY
gY
@@ -19065,7 +19062,7 @@ gY
gY
gY
gY
-hx
+dJ
aa
"}
(134,1,1) = {"
@@ -19185,7 +19182,7 @@ aa
aa
aa
aa
-hx
+dJ
gY
gY
gY
@@ -19207,7 +19204,7 @@ gY
gY
gY
gY
-hx
+dJ
aa
"}
(135,1,1) = {"
@@ -19327,7 +19324,7 @@ aa
aa
aa
aa
-hx
+dJ
gY
gY
gY
@@ -19349,7 +19346,7 @@ gY
gY
gY
gY
-hx
+dJ
aa
"}
(136,1,1) = {"
@@ -19469,7 +19466,7 @@ aa
aa
aa
aa
-hx
+dJ
gY
gY
gY
@@ -19491,7 +19488,7 @@ gY
gY
gY
gY
-hx
+dJ
aa
"}
(137,1,1) = {"
@@ -19611,7 +19608,7 @@ aa
aa
aa
aa
-hx
+dJ
gY
gY
gY
@@ -19633,7 +19630,7 @@ gY
gY
gY
gY
-hx
+dJ
aa
"}
(138,1,1) = {"
@@ -19753,7 +19750,7 @@ aa
aa
aa
aa
-hx
+dJ
gZ
gZ
gZ
@@ -19895,7 +19892,7 @@ aa
aa
aa
aa
-hx
+dJ
gW
gW
gW
@@ -19917,7 +19914,7 @@ gW
gW
gW
gW
-hx
+dJ
aa
"}
(140,1,1) = {"
diff --git a/maps/tether/tether.dm b/maps/tether/tether.dm
index 6e21f510bcf..90a7f8ee23e 100644
--- a/maps/tether/tether.dm
+++ b/maps/tether/tether.dm
@@ -59,6 +59,7 @@
#include "../../mods/content/lighthouse/_lighthouse.dme"
#include "../../mods/content/resleeving/_resleeving.dme"
+ #include "tether_evacuation.dm"
#include "tether_jobs.dm"
#include "tether_leveldata.dm"
#include "tether_unit_testing.dm"
diff --git a/maps/tether/tether_define.dm b/maps/tether/tether_define.dm
index 6b867422050..865a1ef604e 100644
--- a/maps/tether/tether_define.dm
+++ b/maps/tether/tether_define.dm
@@ -16,18 +16,15 @@
system_name = "Virgo-Erigone"
overmap_ids = list(OVERMAP_ID_SPACE)
num_exoplanets = 0
- // TODO: evac_controller_type = /datum/evacuation_controller/tram
-/*
shuttle_docked_message = "The scheduled Orange Line tram to the %dock_name% has arrived. It will depart in approximately %ETD%."
shuttle_leaving_dock = "The Orange Line tram has left the station. Estimate %ETA% until the tram arrives at %dock_name%."
shuttle_called_message = "A scheduled crew transfer to the %dock_name% is occuring. The tram will be arriving shortly. Those departing should proceed to the Orange Line tram station within %ETA%."
shuttle_recall_message = "The scheduled crew transfer has been cancelled."
- shuttle_name = "Automated Tram"
+ // shuttle_name = "Automated Tram" // todo: ATC port using SSradiochatter
emergency_shuttle_docked_message = "The evacuation tram has arrived at the tram station. You have approximately %ETD% to board the tram."
emergency_shuttle_leaving_dock = "The emergency tram has left the station. Estimate %ETA% until the tram arrives at %dock_name%."
emergency_shuttle_called_message = "An emergency evacuation has begun, and an off-schedule tram has been called. It will arrive at the tram station in approximately %ETA%."
emergency_shuttle_recall_message = "The evacuation tram has been recalled."
-*/
starting_money = 5000
diff --git a/maps/tether/tether_evacuation.dm b/maps/tether/tether_evacuation.dm
new file mode 100644
index 00000000000..4d4cb4500d6
--- /dev/null
+++ b/maps/tether/tether_evacuation.dm
@@ -0,0 +1,39 @@
+/datum/map/tether
+ evac_controller_type = /datum/evacuation_controller/shuttle/tram
+
+/datum/evacuation_controller/shuttle/tram
+ name = "departures tram controller"
+ evacuation_options = list(
+ EVAC_OPT_CALL_SHUTTLE = new /datum/evacuation_option/call_shuttle/tram,
+ EVAC_OPT_RECALL_SHUTTLE = new /datum/evacuation_option/recall_shuttle/tram
+ )
+
+/datum/evacuation_option/call_shuttle/tram
+ option_text = "Call emergency tram"
+ option_desc = "call the emergency tram"
+
+/datum/evacuation_option/recall_shuttle/tram
+ option_text = "Cancel tram call"
+ option_desc = "recall the emergency tram"
+
+/datum/shuttle/autodock/ferry/emergency/escape_shuttle
+ name = "Escape Shuttle"
+ warmup_time = 10
+ location = 1
+ shuttle_area = /area/shuttle/tram
+ waypoint_offsite = "nav_tram_start"
+ waypoint_station = "nav_tram_station"
+ landmark_transition = "nav_tram_transit"
+
+/obj/effect/shuttle_landmark/escape_shuttle/start
+ landmark_tag = "nav_tram_start"
+ base_area = /area/centcom/terminal
+ base_turf = /turf/unsimulated/floor/techfloor_grid
+
+/obj/effect/shuttle_landmark/escape_shuttle/transit
+ landmark_tag = "nav_tram_transit"
+ flags = SLANDMARK_FLAG_AUTOSET
+
+/obj/effect/shuttle_landmark/escape_shuttle/station
+ landmark_tag = "nav_tram_station"
+ flags = SLANDMARK_FLAG_AUTOSET
\ No newline at end of file
diff --git a/mods/content/dungeon_loot/loot_pile.dm b/mods/content/dungeon_loot/loot_pile.dm
index fc8dff5808a..b488fd95abf 100644
--- a/mods/content/dungeon_loot/loot_pile.dm
+++ b/mods/content/dungeon_loot/loot_pile.dm
@@ -62,7 +62,7 @@
return TRUE
//You already searched this one
- if(!allow_multiple_looting && (user.ckey in searched_by))
+ if(!allow_multiple_looting && LAZYISIN(user.ckey, searched_by))
to_chat(L, SPAN_WARNING("You can't find anything else vaguely useful in \the [src]. Another set of eyes might, however."))
return TRUE
@@ -72,7 +72,7 @@
return TRUE
// You found something!
- searched_by |= user.ckey
+ LAZYDISTINCTADD(searched_by, user.ckey)
var/obj/item/loot = null
var/span = "notice" // Blue
diff --git a/mods/content/genemodding/tail_organ.dm b/mods/content/genemodding/tail_organ.dm
index 6ff47865859..28247fc7712 100644
--- a/mods/content/genemodding/tail_organ.dm
+++ b/mods/content/genemodding/tail_organ.dm
@@ -4,3 +4,6 @@
/obj/item/organ/external/tail/proc/get_tail_colour()
return tail_colour || ((bodytype.appearance_flags & HAS_SKIN_COLOR) ? skin_colour : null)
+
+/obj/item/organ/external/tail/proc/get_tail_hair_colour()
+ return tail_hair_colour || (owner && GET_HAIR_COLOUR(owner))
\ No newline at end of file
diff --git a/mods/content/genemodding/update_icons.dm b/mods/content/genemodding/update_icons.dm
index d8592d3030a..65c5717d951 100644
--- a/mods/content/genemodding/update_icons.dm
+++ b/mods/content/genemodding/update_icons.dm
@@ -10,7 +10,7 @@
return // No tail data!
// These values may be null and are generally optional.
- var/hair_colour = GET_HAIR_COLOUR(src)
+ var/hair_colour = tail_organ.get_tail_hair_colour() // GENEMODDING EDIT
var/tail_hair = tail_organ.get_tail_hair()
var/tail_blend = tail_organ.get_tail_blend()
var/tail_hair_blend = tail_organ.get_tail_hair_blend()
diff --git a/mods/content/neural_interface/implant.dm b/mods/content/neural_interface/implant.dm
index 85caad1e2a7..c1a85a1c70c 100644
--- a/mods/content/neural_interface/implant.dm
+++ b/mods/content/neural_interface/implant.dm
@@ -125,13 +125,27 @@
os_full_name = "Nanite Interface Framework v2.0.0-rc1"
expected_type = /obj/item/organ/internal/augment/active/nif
-/mob/living/carbon/human/getHUDsource(hudtype)
+/mob/getHUDsource(hudtype)
if((. = ..()))
return .
var/obj/item/organ/internal/augment/active/nif/nif = get_organ(BP_AUGMENT_HEAD, /obj/item/organ/internal/augment/active/nif)
if(!nif?.is_usable())
return null
+ var/datum/extension/assembly/assembly = get_extension(nif, /datum/extension/assembly)
+ var/obj/item/stock_parts/computer/network_card/network_card = assembly.get_component(PART_NETWORK)
var/datum/extension/interactive/os/os = get_extension(nif, /datum/extension/interactive/os)
for(var/datum/computer_file/program/nifsoft/nif_hud/running_nifhud in os.running_programs)
if(hudtype == running_nifhud.hudtype)
- return nif
+ return network_card // I hate this.
+
+/* If we ever want to switch to returning the NIF instead of the network card, we have the following code.
+// Checks for NIF networks. TODO: /atom/proc/get_network()?
+/mob/getHUDnetwork(hudtype)
+ if((. = ..()))
+ return .
+ var/obj/item/organ/internal/augment/active/nif/nif = getHUDsource(hudtype)
+ if(!nif?.is_usable())
+ return null
+ var/datum/extension/interactive/os/os = get_extension(nif, /datum/extension/interactive/os)
+ return os.get_network()
+*/
\ No newline at end of file
diff --git a/nano/templates/timeclock.tmpl b/nano/templates/timeclock.tmpl
index 25f15d67cca..f9a315808f5 100644
--- a/nano/templates/timeclock.tmpl
+++ b/nano/templates/timeclock.tmpl
@@ -66,7 +66,7 @@
{{:helper.link('Go Off-Duty', 'alert', {'switch-to-offduty': 1})}}
{{else}}
- Insufficent Time Off Accrued
+ Insufficient Time Off Accrued
{{/if}}
{{else (data.job_datum.timeoff_factor < 0) }}
{{props data.job_choices }}