diff --git a/bin/tgui-fix.cmd b/bin/tgui-fix.cmd
new file mode 100644
index 0000000000..f2844408ef
--- /dev/null
+++ b/bin/tgui-fix.cmd
@@ -0,0 +1,2 @@
+@echo off
+call "%~dp0\..\tools\build\build.bat" --wait-on-error tgui-fix %*
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 9478891464..77e1e2d74a 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -341,6 +341,7 @@
#define SPECIES_REPLICANT "Replicant"
#define SPECIES_REPLICANT_ALPHA "Alpha Replicant"
#define SPECIES_REPLICANT_BETA "Beta Replicant"
+#define SPECIES_REPLICANT_CREW "Gamma Replicant"
// Used to seperate simple animals by ""intelligence"".
#define SA_PLANT 1
diff --git a/code/_helpers/type2type.dm b/code/_helpers/type2type.dm
index 908618128c..c9dffc7c2b 100644
--- a/code/_helpers/type2type.dm
+++ b/code/_helpers/type2type.dm
@@ -574,3 +574,22 @@
continue
if(!isnull(path))
. += path
+
+/proc/path2text_list(list/L)
+ . = list()
+ for(var/key in L)
+ var/text = "[key]"
+ if(!isnull(L[text]))
+ .[text] = L[text]
+ continue
+ if(!isnull(L[key]))
+ .[text] = L[key]
+ continue
+ if(!isnull(text))
+ .[text] = ""
+
+/proc/check_list_copy(var/i)
+ if(islist(i))
+ var/list/l = i
+ return l.Copy()
+ return i
diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm
index 3b48fc1a84..d842dd8336 100644
--- a/code/datums/looping_sounds/_looping_sound.dm
+++ b/code/datums/looping_sounds/_looping_sound.dm
@@ -100,7 +100,7 @@
if(direct)
if(ismob(thing))
var/mob/M = thing
- if(M.check_sound_preference(pref_check))
+ if(!M.check_sound_preference(pref_check))
continue
SEND_SOUND(thing, S)
else
diff --git a/code/datums/supplypacks/engineering.dm b/code/datums/supplypacks/engineering.dm
index a8f763c7a2..846bba482f 100644
--- a/code/datums/supplypacks/engineering.dm
+++ b/code/datums/supplypacks/engineering.dm
@@ -330,6 +330,13 @@
containertype = /obj/structure/closet/crate/einstein
contains = list(/obj/item/weapon/circuitboard/fusion_fuel_compressor)
+/datum/supply_pack/eng/deuterium
+ name = "Deuterium crate"
+ cost = 50
+ containername = "Deuterium crate"
+ containertype = /obj/structure/closet/crate/einstein
+ contains = list(/obj/fiftyspawner/deuterium)
+
/datum/supply_pack/eng/tritium
name = "Tritium crate"
cost = 75
diff --git a/code/game/objects/effects/decals/posters/posters.dm b/code/game/objects/effects/decals/posters/posters.dm
index 74624bcb0d..a020f6ead2 100644
--- a/code/game/objects/effects/decals/posters/posters.dm
+++ b/code/game/objects/effects/decals/posters/posters.dm
@@ -3,7 +3,7 @@
if(exact)
return decls_repository.get_decl(path)
else
- var/list/L = decls_repository.get_decls_of_type(path)
+ var/list/L = decls_repository.get_decls_of_subtype(path) // Use get_decls_of_subtype instead of get_decls_of_type, or it will get the map placing icon_state
return L[pick(L)]
return null
diff --git a/code/game/objects/items/devices/scanners/sleevemate.dm b/code/game/objects/items/devices/scanners/sleevemate.dm
index 0109335b0d..d83bfe6352 100644
--- a/code/game/objects/items/devices/scanners/sleevemate.dm
+++ b/code/game/objects/items/devices/scanners/sleevemate.dm
@@ -72,6 +72,13 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
return
M = new_M
+ if(isrobot(M))
+ var/mob/living/silicon/robot/R = M
+ var/obj/item/device/dogborg/sleeper/S = locate() in R.module.modules
+ if(S && S.patient)
+ scan_mob(S.patient, user)
+ return
+
if(ishuman(M))
scan_mob(M, user)
else
diff --git a/code/game/objects/structures/alien/alien.dm b/code/game/objects/structures/alien/alien.dm
index cde036bc68..9b192408fa 100644
--- a/code/game/objects/structures/alien/alien.dm
+++ b/code/game/objects/structures/alien/alien.dm
@@ -81,6 +81,13 @@
health = 0
healthcheck()
return
+ if(locate(/obj/item/organ/internal/xenos/resinspinner/replicant) in M.internal_organs)
+ if(!do_after(M, 3 SECONDS))
+ return
+ visible_message ("[usr] strokes the [name] and it melts away!", 1)
+ health = 0
+ healthcheck()
+ return
visible_message("[usr] claws at the [name]!")
health -= rand(5,10)
healthcheck()
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 370d494f35..b16fb816b5 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -29,6 +29,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
equippable_item_whitelist = typecacheof(list(
/obj/item/weapon/storage/bag/trash,
/obj/item/weapon/mop,
+ /obj/item/weapon/mop/advanced,
/obj/item/weapon/reagent_containers/spray,
/obj/item/device/lightreplacer,
/obj/item/clothing/suit/caution,
@@ -49,7 +50,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
mybag = I
setTguiIcon("mybag", mybag)
- else if(istype(I, /obj/item/weapon/mop))
+ else if(istype(I, /obj/item/weapon/mop) || istype(I, /obj/item/weapon/mop/advanced))
if(mymop)
to_chat(user, "[src] already has \an [I].")
return FALSE
diff --git a/code/modules/admin/modify_robot.dm b/code/modules/admin/modify_robot.dm
index 1ffcf78be2..f90dede7e1 100644
--- a/code/modules/admin/modify_robot.dm
+++ b/code/modules/admin/modify_robot.dm
@@ -6,12 +6,14 @@
return
var/datum/eventkit/modify_robot/modify_robot = new()
- modify_robot.target = target
+ modify_robot.target = isrobot(target) ? target : null
+ modify_robot.selected_ai = target.is_slaved()
modify_robot.tgui_interact(src.mob)
/datum/eventkit/modify_robot
var/mob/living/silicon/robot/target
var/mob/living/silicon/robot/source
+ var/mob/living/silicon/ai/selected_ai
var/ion_law = "IonLaw"
var/zeroth_law = "ZerothLaw"
var/inherent_law = "InherentLaw"
@@ -49,6 +51,7 @@
.["target"]["name"] = target.name
.["target"]["ckey"] = target.ckey
.["target"]["module"] = target.module
+ .["target"]["emagged"] = target.emagged
.["target"]["crisis_override"] = target.crisis_override
.["target"]["active_restrictions"] = target.restrict_modules_to
var/list/possible_restrictions = list()
@@ -121,6 +124,15 @@
package_laws(., "supplied_laws", target.laws.supplied_laws)
.["isAI"] = isAI(target)
+ .["isMalf"] = is_malf(user)
+ .["isSlaved"] = target.is_slaved()
+ var/list/active_ais = list()
+ for(var/mob/living/silicon/ai/ai in active_ais())
+ if(!ai.loc)
+ continue
+ active_ais += list(list("displayText" = "[ai]", "value" = "\ref[ai]"))
+ .["active_ais"] = active_ais
+ .["selected_ai"] = selected_ai ? selected_ai.name : null
var/list/channels = list()
for(var/ch_name in target.law_channels())
@@ -144,14 +156,16 @@
target.real_name = params["new_name"]
return TRUE
if("select_target")
- target = locate(params["new_target"])
- log_and_message_admins("changed robot modifictation target to [target]")
+ var/new_target = locate(params["new_target"])
+ if(new_target != target)
+ target = locate(params["new_target"])
+ log_and_message_admins("changed robot modifictation target to [target]")
return TRUE
if("toggle_crisis")
target.crisis_override = !target.crisis_override
return TRUE
if("add_restriction")
- target.restrict_modules_to += params["new_restriction"]
+ target.restrict_modules_to |= params["new_restriction"]
return TRUE
if("remove_restriction")
target.restrict_modules_to -= params["rem_restriction"]
@@ -498,6 +512,41 @@
if(usr != target)
to_chat(usr, "Laws displayed.")
return TRUE
+ if("select_ai")
+ selected_ai = locate(params["new_ai"])
+ return TRUE
+ if("swap_sync")
+ var/new_ai = selected_ai ? selected_ai : select_active_ai_with_fewest_borgs()
+ if(new_ai)
+ target.lawupdate = 1
+ target.connect_to_ai(new_ai)
+ return TRUE
+ if("disconnect_ai")
+ if(target.is_slaved())
+ target.disconnect_from_ai()
+ target.lawupdate = 0
+ return TRUE
+ if("toggle_emag")
+ if(target.emagged)
+ target.emagged = 0
+ target.clear_supplied_laws()
+ target.clear_inherent_laws()
+ target.laws = new global.using_map.default_law_type
+ target.laws.show_laws(target)
+ target.hud_used.update_robot_modules_display()
+ else
+ target.emagged = 1
+ target.lawupdate = 0
+ target.disconnect_from_ai()
+ target.clear_supplied_laws()
+ target.clear_inherent_laws()
+ target.laws = new /datum/ai_laws/syndicate_override
+ if(target.bolt)
+ if(!target.bolt.malfunction)
+ target.bolt.malfunction = MALFUNCTION_PERMANENT
+ target.laws.show_laws(target)
+ target.hud_used.update_robot_modules_display()
+ return TRUE
/datum/eventkit/modify_robot/proc/get_target_items(var/mob/user)
var/list/target_items = list()
@@ -650,3 +699,9 @@
package_laws(packaged_laws, "supplied_laws", ALs.supplied_laws)
law_sets[++law_sets.len] = list("name" = ALs.name, "header" = ALs.law_header, "ref" = "\ref[ALs]","laws" = packaged_laws)
return law_sets
+
+/datum/eventkit/modify_robot/proc/is_malf(var/mob/user)
+ return (is_admin(user) && !target.is_slaved()) || is_special_role(user)
+
+/datum/eventkit/modify_robot/proc/is_special_role(var/mob/user)
+ return user.mind.special_role ? TRUE : FALSE
diff --git a/code/modules/admin/verbs/modify_robot.dm b/code/modules/admin/verbs/modify_robot.dm
index 540cc26d30..9a5c937028 100644
--- a/code/modules/admin/verbs/modify_robot.dm
+++ b/code/modules/admin/verbs/modify_robot.dm
@@ -229,7 +229,7 @@
var/selected_radio_channel = tgui_input_list(usr, "Please select the radio channel to add", "Channels", available_channels)
if(!selected_radio_channel || selected_radio_channel == "Cancel")
break
- if(selected_radio_channel == CHANNEL_SPECIAL_OPS)
+ if(selected_radio_channel == CHANNEL_SPECIAL_OPS || selected_radio_channel == CHANNEL_RESPONSE_TEAM)
target.radio.centComm = 1
if(selected_radio_channel == CHANNEL_RAIDER)
qdel(target.radio.keyslot)
@@ -249,7 +249,7 @@
var/selected_radio_channel = tgui_input_list(usr, "Please select the radio channel to remove", "Channels", target.radio.channels)
if(!selected_radio_channel || selected_radio_channel == "Cancel")
break
- if(selected_radio_channel == CHANNEL_SPECIAL_OPS)
+ if(selected_radio_channel == CHANNEL_SPECIAL_OPS || selected_radio_channel == CHANNEL_RESPONSE_TEAM && !(target.module.channels[CHANNEL_SPECIAL_OPS] || target.module.channels[CHANNEL_RESPONSE_TEAM]))
target.radio.centComm = 0
target.module.channels -= selected_radio_channel
if((selected_radio_channel == CHANNEL_MERCENARY || selected_radio_channel == CHANNEL_RAIDER) && !(target.module.channels[CHANNEL_RAIDER] || target.module.channels[CHANNEL_MERCENARY]))
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index f5035673a9..566b91fcd4 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -20,10 +20,11 @@
var/msg = "" + span_blue("[icon2html(cross, GLOB.admins)] " + span_purple("PRAY: ") + "[key_name(src, 1)] [ADMIN_QUE(src)] [ADMIN_PP(src)] [ADMIN_VV(src)] [ADMIN_SM(src)] ([admin_jump_link(src, src)]) [ADMIN_CA(src)] [ADMIN_SC(src)] [ADMIN_SMITE(src)]: [raw_msg]") + ""
for(var/client/C in GLOB.admins)
- if(R_ADMIN|R_EVENT & C.holder.rights)
- if(C.prefs?.read_preference(/datum/preference/toggle/show_chat_prayers))
- to_chat(C, msg, type = MESSAGE_TYPE_PRAYER, confidential = TRUE)
- C << 'sound/effects/ding.ogg'
+ if(!check_rights(R_ADMIN, 0, C))
+ continue
+ if(C.prefs?.read_preference(/datum/preference/toggle/show_chat_prayers))
+ to_chat(C, msg, type = MESSAGE_TYPE_PRAYER, confidential = TRUE)
+ C << 'sound/effects/ding.ogg'
to_chat(usr, "Your prayers have been received by the gods.", confidential = TRUE)
feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -32,13 +33,15 @@
/proc/CentCom_announce(var/msg, var/mob/Sender, var/iamessage)
msg = span_blue("" + span_orange("[uppertext(using_map.boss_short)]M[iamessage ? " IA" : ""]:") + "[key_name(Sender, 1)] [ADMIN_PP(Sender)] [ADMIN_VV(Sender)] [ADMIN_SM(Sender)] ([admin_jump_link(Sender)]) [ADMIN_CA(Sender)] [ADMIN_BSA(Sender)] [ADMIN_CENTCOM_REPLY(Sender)]: [msg]")
for(var/client/C in GLOB.admins) //VOREStation Edit - GLOB admins
- if(R_ADMIN|R_EVENT & C.holder.rights)
- to_chat(C,msg)
- C << 'sound/machines/signal.ogg'
+ if(!check_rights(R_ADMIN, 0, C))
+ continue
+ to_chat(C,msg)
+ C << 'sound/machines/signal.ogg'
/proc/Syndicate_announce(var/msg, var/mob/Sender)
msg = span_blue("" + span_crimson("ILLEGAL:") + "[key_name(Sender, 1)] [ADMIN_PP(Sender)] [ADMIN_VV(Sender)] [ADMIN_SM(Sender)] ([admin_jump_link(Sender)]) [ADMIN_CA(Sender)] [ADMIN_BSA(Sender)] [ADMIN_SYNDICATE_REPLY(Sender)]: [msg]")
for(var/client/C in GLOB.admins) //VOREStation Edit - GLOB admins
- if(R_ADMIN|R_EVENT & C.holder.rights)
- to_chat(C,msg)
- C << 'sound/machines/signal.ogg'
+ if(!check_rights(R_ADMIN, 0, C))
+ continue
+ to_chat(C,msg)
+ C << 'sound/machines/signal.ogg'
diff --git a/code/modules/awaymissions/redgate.dm b/code/modules/awaymissions/redgate.dm
index d9b0f6feb4..30e0faf740 100644
--- a/code/modules/awaymissions/redgate.dm
+++ b/code/modules/awaymissions/redgate.dm
@@ -1763,3 +1763,37 @@
//todo; throw the ball in a random direction
src.visible_message("\The [ball] bounces off \the [src]'s rim!")
global_announcer.autosay("[ball.last_holder] threw the HYPERball and +missed!+ |Oooh!|","Laserdome Announcer","Entertainment")
+
+/obj/structure/prop/machine/biosyphon/laserdome
+ name = "Laserdome Orientation Holo"
+ desc = {"This device is holoprojecting a wall of flickering text into the air. It seems to be incomprehensible gibberish at first, perhaps an alien language, but the longer you stare the more it starts to make sense, slowly coalescing into coherent sentences in your preferred language. The overall word choice is a little eclectic or unusual at times, and some words remain impossible for you to decipher, but you get the gist pretty quickly. It reads:
+ MANY GREETINGS, BRAVE VISITOR!
+ THE (LIGHT AMPLIFIED BY STIMULATED EMISSION OF RADIATION) DOME IS FINEST PHYSICAL EXERCISE AND RECREATIONAL FACILITY LOCATED UPON THIS RELATIVE SIDE OF THE \[illegible\] SUPERMASSIVE OBSIDIAN VOID.
+ OUR GREAT BRAINS HERE AT THE \[incomprehensible\] HAPPY FUN TIME CORPORATION ARE SURE YOU WILL DEFINITELY MUCH ENJOY PARTAKING IN THE SIGHTS AND SOUNDS OF OUR ESTABLISHMENT.
+ EVEN IF YOU DO NOT WISH TO BE (OR ARE PHYSICALLY INCAPABLE OF) TAKING PART IN THE ACCELERATED LIGHT GAMES, PLEASE WITNESS OUR HEROIC GLADIATORS BATTLE FOR YOUR ENJOYMENT, AND VISIT LOCAL SERVICES SUCH AS THE \[incoherent\] ACCELERATED SUSTENANCE JOINT.
+ PLEASE TO BE FOLLOWINGS FLOOR-BASED POINTED INDICATORS TOWARDS PLACEMENTS OF INTERESTING! AND BE SURE TO BE TAKINGS FREE RADIO HEADSET CHIP TO BE HEARING ARENA ANNOUNCER!
+ THANKINGS YOU FOR YOUR PATRONAGE!!!
+ (p.s. please to be cleanings up after selves, do not leave messes on concourse, thankings you again muchly)"}
+
+/obj/structure/prop/machine/biosyphon/laserdome/hyperball
+ name = "Laserdome HYPERball Orientation Holo"
+ desc = {"This device is holoprojecting a wall of flickering text into the air. It seems to be incomprehensible gibberish at first, perhaps an alien language, but the longer you stare the more it starts to make sense, slowly coalescing into coherent sentences in your preferred language. The overall word choice is a little eclectic or unusual at times, and some words remain impossible for you to decipher, but you get the gist pretty quickly. It reads:
+ RULES OF HYPERBALL ARE SIMPLE!
+ TAKE BALL, SLAM-DUNKIFY INTO OPPOSING TEAM GOAL!
+ THREE POINTS AWARD FOR THROW (BUT WATCH OUT, CAN MISS)!
+ SEVEN POINTS IF ENDUNKENING IS BY HAND!
+ POINTS AM DEDUCT IF OWN-DUNKING!
+ FIRST TEAM TO TWENTY-AND-ONE POINTS IS WIN!
+ MUST WEAR TEAM PLATINGS FOR SCORINGS TO COUNT!
+ GOOD LUCK!!!"}
+
+/obj/structure/prop/machine/biosyphon/laserdome/flagcap
+ name = "Laserdome Capture-The-Flag Orientation Holo"
+ desc = {"This device is holoprojecting a wall of flickering text into the air. It seems to be incomprehensible gibberish at first, perhaps an alien language, but the longer you stare the more it starts to make sense, slowly coalescing into coherent sentences in your preferred language. The overall word choice is a little eclectic or unusual at times, and some words remain impossible for you to decipher, but you get the gist pretty quickly. It reads:
+ RULES OF CAPTURING FLAG ARE SIMPLE!
+ GO TO ENEMY BASE, TAKE THEIR FLAG, BRING BACK TO OWN BASE!
+ NO SCORE IF ENEMY TEAM HAS FLAG, SO PROTECT OWN FLAG!
+ RETURN OWN FLAG TO BASE BY TOUCHINGS!
+ FIRST TEAM TO THREE CAPTURES IS WIN!
+ MUST WEAR TEAM PLATINGS FOR SCORINGS TO COUNT!
+ GOOD LUCK!!!"}
diff --git a/code/modules/client/preference_setup/general/02_language.dm b/code/modules/client/preference_setup/general/02_language.dm
index 4c7f408239..eee2513420 100644
--- a/code/modules/client/preference_setup/general/02_language.dm
+++ b/code/modules/client/preference_setup/general/02_language.dm
@@ -8,18 +8,19 @@
var/static/list/forbidden_prefixes = list(";", ":", ".", "!", "*", "^", "-")
/datum/category_item/player_setup_item/general/language/load_character(list/save_data)
- pref.alternate_languages = save_data["language"]
+ pref.alternate_languages = check_list_copy(save_data["language"])
pref.extra_languages = save_data["extra_languages"]
pref.language_prefixes = save_data["language_prefixes"]
+ pref.species = save_data["species"]
pref.preferred_language = save_data["preflang"]
- pref.language_custom_keys = save_data["language_custom_keys"]
+ pref.language_custom_keys = check_list_copy(save_data["language_custom_keys"])
/datum/category_item/player_setup_item/general/language/save_character(list/save_data)
- save_data["language"] = pref.alternate_languages
+ save_data["language"] = check_list_copy(pref.alternate_languages)
save_data["extra_languages"] = pref.extra_languages
save_data["language_prefixes"] = pref.language_prefixes
save_data["language_custom_keys"] = pref.language_custom_keys
- save_data["preflang"] = pref.preferred_language
+ save_data["preflang"] = check_list_copy(pref.preferred_language)
/datum/category_item/player_setup_item/general/language/sanitize_character()
if(!islist(pref.alternate_languages))
diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index 4e2a44a046..a71049c51e 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -113,16 +113,20 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.b_eyes = save_data["eyes_blue"]
pref.b_type = save_data["b_type"]
pref.disabilities = save_data["disabilities"]
- pref.organ_data = save_data["organ_data"]
- pref.rlimb_data = save_data["rlimb_data"]
- pref.body_markings = save_data["body_markings"]
+ pref.organ_data = check_list_copy(save_data["organ_data"])
+ pref.rlimb_data = check_list_copy(save_data["rlimb_data"])
+ pref.body_markings = check_list_copy(save_data["body_markings"])
+ for(var/i in pref.body_markings)
+ pref.body_markings[i] = check_list_copy(pref.body_markings[i])
+ for(var/j in pref.body_markings[i])
+ pref.body_markings[i][j] = check_list_copy(pref.body_markings[i][j])
pref.synth_color = save_data["synth_color"]
pref.r_synth = save_data["synth_red"]
pref.g_synth = save_data["synth_green"]
pref.b_synth = save_data["synth_blue"]
pref.synth_markings = save_data["synth_markings"]
pref.bgstate = save_data["bgstate"]
- pref.body_descriptors = save_data["body_descriptors"]
+ pref.body_descriptors = check_list_copy(save_data["body_descriptors"])
pref.ear_style = save_data["ear_style"]
pref.r_ears = save_data["r_ears"]
pref.g_ears = save_data["g_ears"]
@@ -178,16 +182,21 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
save_data["eyes_blue"] = pref.b_eyes
save_data["b_type"] = pref.b_type
save_data["disabilities"] = pref.disabilities
- save_data["organ_data"] = pref.organ_data
- save_data["rlimb_data"] = pref.rlimb_data
- save_data["body_markings"] = pref.body_markings
+ save_data["organ_data"] = check_list_copy(pref.organ_data)
+ save_data["rlimb_data"] = check_list_copy(pref.rlimb_data)
+ var/list/body_markings = check_list_copy(pref.body_markings)
+ for(var/i in pref.body_markings)
+ body_markings[i] = check_list_copy(body_markings[i])
+ for(var/j in body_markings[i])
+ body_markings[i][j] = check_list_copy(body_markings[i][j])
+ save_data["body_markings"] = body_markings
save_data["synth_color"] = pref.synth_color
save_data["synth_red"] = pref.r_synth
save_data["synth_green"] = pref.g_synth
save_data["synth_blue"] = pref.b_synth
save_data["synth_markings"] = pref.synth_markings
save_data["bgstate"] = pref.bgstate
- save_data["body_descriptors"] = pref.body_descriptors
+ save_data["body_descriptors"] = check_list_copy(pref.body_descriptors)
save_data["ear_style"] = pref.ear_style
save_data["r_ears"] = pref.r_ears
save_data["g_ears"] = pref.g_ears
diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm
index 57146e5832..554885046c 100644
--- a/code/modules/client/preference_setup/general/04_equipment.dm
+++ b/code/modules/client/preference_setup/general/04_equipment.dm
@@ -7,8 +7,10 @@
sort_order = 4
/datum/category_item/player_setup_item/general/equipment/load_character(list/save_data)
- pref.all_underwear = save_data["all_underwear"]
- pref.all_underwear_metadata = save_data["all_underwear_metadata"]
+ pref.all_underwear = check_list_copy(save_data["all_underwear"])
+ pref.all_underwear_metadata = check_list_copy(save_data["all_underwear_metadata"])
+ for(var/i in pref.all_underwear_metadata)
+ pref.all_underwear_metadata[i] = path2text_list(pref.all_underwear_metadata[i])
pref.backbag = save_data["backbag"]
pref.pdachoice = save_data["pdachoice"]
pref.communicator_visibility = save_data["communicator_visibility"]
@@ -17,7 +19,10 @@
/datum/category_item/player_setup_item/general/equipment/save_character(list/save_data)
save_data["all_underwear"] = pref.all_underwear
- save_data["all_underwear_metadata"] = pref.all_underwear_metadata
+ var/list/underwear = list()
+ for(var/i in pref.all_underwear_metadata)
+ underwear[i] = check_list_copy(pref.all_underwear_metadata[i])
+ save_data["all_underwear_metadata"] = underwear
save_data["backbag"] = pref.backbag
save_data["pdachoice"] = pref.pdachoice
save_data["communicator_visibility"] = pref.communicator_visibility
diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks.dm b/code/modules/client/preference_setup/loadout/gear_tweaks.dm
index f371fac6c1..ba5f621dbc 100644
--- a/code/modules/client/preference_setup/loadout/gear_tweaks.dm
+++ b/code/modules/client/preference_setup/loadout/gear_tweaks.dm
@@ -151,6 +151,11 @@ GLOBAL_DATUM_INIT(gear_tweak_free_matrix_recolor, /datum/gear_tweak/matrix_recol
continue
else
path = contents[metadata[i]]
+ if(!path)
+ var/mob/user = ismob(I.loc) ? I.loc : I.loc?.loc
+ if(istype(user))
+ to_chat(user, span_warning("The content \"[metadata[i]]\" from \"[I]\" does no longer exist and has not been loaded. Please replace it in the character setup."))
+ continue
new path(I)
/*
diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm
index fd92052458..71b42bcf97 100644
--- a/code/modules/client/preference_setup/loadout/loadout.dm
+++ b/code/modules/client/preference_setup/loadout/loadout.dm
@@ -46,17 +46,32 @@ var/list/gear_datums = list()
var/current_tab = "General"
/datum/category_item/player_setup_item/loadout/load_character(list/save_data)
- pref.gear_list = save_data["gear_list"]
+ pref.gear_list = list()
+ var/all_gear = check_list_copy(save_data["gear_list"])
+ for(var/i in all_gear)
+ var/list/entries = check_list_copy(all_gear["[i]"])
+ for(var/j in entries)
+ entries["[j]"] = path2text_list(entries["[j]"])
+ pref.gear_list["[i]"] = entries
pref.gear_slot = save_data["gear_slot"]
if(pref.gear_list!=null && pref.gear_slot!=null)
pref.gear = pref.gear_list["[pref.gear_slot]"]
else
- pref.gear = save_data["gear"]
+ pref.gear = check_list_copy(save_data["gear"])
pref.gear_slot = 1
/datum/category_item/player_setup_item/loadout/save_character(list/save_data)
pref.gear_list["[pref.gear_slot]"] = pref.gear
- save_data["gear_list"] = pref.gear_list
+ var/list/all_gear = list()
+ var/worn_gear = check_list_copy(pref.gear_list)
+ for(var/i in worn_gear)
+ var/list/entries = check_list_copy(worn_gear["[i]"])
+ if(!length(entries))
+ entries = check_list_copy(worn_gear[i])
+ for(var/j in entries)
+ entries["[j]"] = check_list_copy(entries["[j]"])
+ all_gear["[i]"] = entries
+ save_data["gear_list"] = all_gear
save_data["gear_slot"] = pref.gear_slot
/datum/category_item/player_setup_item/loadout/proc/valid_gear_choices(var/max_cost)
diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm
index 4557e0c5f5..3b5ec68c25 100644
--- a/code/modules/client/preference_setup/occupation/occupation.dm
+++ b/code/modules/client/preference_setup/occupation/occupation.dm
@@ -18,7 +18,7 @@
pref.job_talon_med = save_data["job_talon_med"]
pref.job_talon_high = save_data["job_talon_high"]
//VOREStation Add End
- pref.player_alt_titles = save_data["player_alt_titles"]
+ pref.player_alt_titles = check_list_copy(save_data["player_alt_titles"])
/datum/category_item/player_setup_item/occupation/save_character(list/save_data)
save_data["alternate_option"] = pref.alternate_option
@@ -36,7 +36,7 @@
save_data["job_talon_med"] = pref.job_talon_med
save_data["job_talon_high"] = pref.job_talon_high
//VOREStation Add End
- save_data["player_alt_titles"] = pref.player_alt_titles
+ save_data["player_alt_titles"] = check_list_copy(pref.player_alt_titles)
/datum/category_item/player_setup_item/occupation/sanitize_character()
pref.alternate_option = sanitize_integer(pref.alternate_option, 0, 2, initial(pref.alternate_option))
diff --git a/code/modules/client/preference_setup/skills/skills.dm b/code/modules/client/preference_setup/skills/skills.dm
index eef0512acc..60e916241f 100644
--- a/code/modules/client/preference_setup/skills/skills.dm
+++ b/code/modules/client/preference_setup/skills/skills.dm
@@ -3,12 +3,12 @@
sort_order = 1
/datum/category_item/player_setup_item/skills/load_character(list/save_data)
- pref.skills = save_data["skills"]
+ pref.skills = check_list_copy(save_data["skills"])
pref.used_skillpoints = save_data["used_skillpoints"]
pref.skill_specialization = save_data["skill_specialization"]
/datum/category_item/player_setup_item/skills/save_character(list/save_data)
- save_data["skills"] = pref.skills
+ save_data["skills"] = check_list_copy(pref.skills)
save_data["used_skillpoints"] = pref.used_skillpoints
save_data["skill_specialization"] = pref.skill_specialization
diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm
index da08d2b14e..b759c87b6b 100644
--- a/code/modules/client/preference_setup/vore/07_traits.dm
+++ b/code/modules/client/preference_setup/vore/07_traits.dm
@@ -125,15 +125,15 @@ var/global/list/valid_bloodreagents = list("default","iron","copper","phoron","s
pref.custom_ask = save_data["custom_ask"]
pref.custom_exclaim = save_data["custom_exclaim"]
- pref.custom_heat = save_data["custom_heat"]
- pref.custom_cold = save_data["custom_cold"]
+ pref.custom_heat = check_list_copy(save_data["custom_heat"])
+ pref.custom_cold = check_list_copy(save_data["custom_cold"])
/datum/category_item/player_setup_item/vore/traits/save_character(list/save_data)
save_data["custom_species"] = pref.custom_species
save_data["custom_base"] = pref.custom_base
- save_data["pos_traits"] = pref.pos_traits
- save_data["neu_traits"] = pref.neu_traits
- save_data["neg_traits"] = pref.neg_traits
+ save_data["pos_traits"] = check_list_copy(pref.pos_traits)
+ save_data["neu_traits"] = check_list_copy(pref.neu_traits)
+ save_data["neg_traits"] = check_list_copy(pref.neg_traits)
save_data["blood_color"] = pref.blood_color
save_data["blood_reagents"] = pref.blood_reagents
@@ -146,8 +146,8 @@ var/global/list/valid_bloodreagents = list("default","iron","copper","phoron","s
save_data["custom_ask"] = pref.custom_ask
save_data["custom_exclaim"] = pref.custom_exclaim
- save_data["custom_heat"] = pref.custom_heat
- save_data["custom_cold"] = pref.custom_cold
+ save_data["custom_heat"] = check_list_copy(pref.custom_heat)
+ save_data["custom_cold"] = check_list_copy(pref.custom_cold)
/datum/category_item/player_setup_item/vore/traits/sanitize_character()
if(!pref.pos_traits) pref.pos_traits = list()
diff --git a/code/modules/client/preference_setup/vore/08_nif.dm b/code/modules/client/preference_setup/vore/08_nif.dm
index e4a760be83..57a04413c7 100644
--- a/code/modules/client/preference_setup/vore/08_nif.dm
+++ b/code/modules/client/preference_setup/vore/08_nif.dm
@@ -21,7 +21,7 @@
pref.nif_path = save_data_file["nif_path"]
pref.nif_durability = save_data_file["nif_durability"]
- pref.nif_savedata = save_data_file["nif_savedata"]
+ pref.nif_savedata = check_list_copy(save_data_file["nif_savedata"])
/datum/category_item/player_setup_item/vore/nif/save_character()
var/datum/json_savefile/savefile = new /datum/json_savefile(nif_savefile_path(pref.client_ckey))
@@ -29,7 +29,7 @@
save_data_file["nif_path"] = pref.nif_path
save_data_file["nif_durability"] = pref.nif_durability
- save_data_file["nif_savedata"] = pref.nif_savedata
+ save_data_file["nif_savedata"] = check_list_copy(pref.nif_savedata)
savefile.set_entry("character[pref.default_slot]", save_data_file)
savefile.save()
diff --git a/code/modules/materials/materials/organic/resin.dm b/code/modules/materials/materials/organic/resin.dm
index 5d46999c29..4fe1d15cb9 100644
--- a/code/modules/materials/materials/organic/resin.dm
+++ b/code/modules/materials/materials/organic/resin.dm
@@ -19,17 +19,27 @@
var/mob/living/carbon/M = user
if(istype(M) && locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)
return TRUE
+ if(istype(M) && locate(/obj/item/organ/internal/xenos/resinspinner/replicant) in M.internal_organs)
+ return TRUE
return FALSE
/datum/material/resin/wall_touch_special(var/turf/simulated/wall/W, var/mob/living/L)
var/mob/living/carbon/M = L
if(istype(M) && locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)
- to_chat(M, "\The [W] shudders under your touch, starting to become porous.")
+ to_chat(M, "\The [W] shudders under your touch, starting to become porous.")
playsound(W, 'sound/effects/attackblob.ogg', 50, 1)
- if(do_after(L, 5 SECONDS))
- spawn(2)
- playsound(W, 'sound/effects/attackblob.ogg', 100, 1)
- W.dismantle_wall()
+ if(!do_after(L, 5 SECONDS))
+ return FALSE
+ playsound(W, 'sound/effects/attackblob.ogg', 100, 1)
+ W.dismantle_wall()
+ return TRUE
+ if(istype(M) && locate(/obj/item/organ/internal/xenos/resinspinner/replicant) in M.internal_organs)
+ to_chat(M, "\The [W] shudders under your touch, starting to become porous.")
+ playsound(W, 'sound/effects/attackblob.ogg', 50, 1)
+ if(!do_after(L, 5 SECONDS))
+ return FALSE
+ playsound(W, 'sound/effects/attackblob.ogg', 100, 1)
+ W.dismantle_wall()
return TRUE
return FALSE
diff --git a/code/modules/mob/living/carbon/human/species/station/replicant_crew.dm b/code/modules/mob/living/carbon/human/species/station/replicant_crew.dm
new file mode 100644
index 0000000000..d5d3ed3c04
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/station/replicant_crew.dm
@@ -0,0 +1,50 @@
+/datum/species/shapeshifter/replicant/crew
+ name = SPECIES_REPLICANT_CREW
+ blurb = "Replicants are one of the few remaining living examples of precursor technology. \
+ While their origins remain unknown, they are a facsimile of organic life held together by amalgamate, \
+ rubbery flesh and anomalous organs. Whilst their original purpose is speculated to be used through cortical \
+ mirrors as a way to 'wirelessly exist' in a different body via VR pods, this specific variant has had its \
+ forking capabilities severed in exchange for a more stable, self-sufficient (albeit weaker) form."
+
+ min_age = 18
+ max_age = 200
+ blood_color = "#C0C0C0"
+
+ radiation_mod = 1.2 //Affected more by radiation
+ siemens_coefficient = 1.5 //Don't get electrocuted
+
+ secondary_langs = list() // None by default
+
+ has_organ = list(
+ O_HEART = /obj/item/organ/internal/heart/replicant/rage/crew,
+ O_LUNGS = /obj/item/organ/internal/lungs/replicant/mending/crew,
+ O_VOICE = /obj/item/organ/internal/voicebox/replicant,
+ O_LIVER = /obj/item/organ/internal/liver/replicant,
+ O_KIDNEYS = /obj/item/organ/internal/kidneys/replicant,
+ O_BRAIN = /obj/item/organ/internal/brain/replicant/torso,
+ O_EYES = /obj/item/organ/internal/eyes/replicant,
+ O_AREJECT = /obj/item/organ/internal/immunehub/replicant,
+ O_VENTC = /obj/item/organ/internal/metamorphgland/replicant,
+ O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/replicant/crew,
+ O_RESIN = /obj/item/organ/internal/xenos/resinspinner/replicant,
+ O_STOMACH = /obj/item/organ/internal/stomach,
+ O_INTESTINE = /obj/item/organ/internal/intestine
+ )
+
+ appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_UNDERWEAR | HAS_LIPS
+ spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
+ color_mult = 1
+ valid_transform_species = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_SKRELL, SPECIES_ALTEVIAN, SPECIES_TESHARI, SPECIES_MONKEY, SPECIES_LLEILL, SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_RAPALA, SPECIES_NEVREAN, SPECIES_VASILISSAN, SPECIES_AKULA)
+
+ inherent_verbs = list(
+ /mob/living/carbon/human/proc/shapeshifter_select_shape,
+ /mob/living/carbon/human/proc/shapeshifter_select_colour,
+ /mob/living/carbon/human/proc/shapeshifter_select_hair,
+ /mob/living/carbon/human/proc/shapeshifter_select_hair_colors,
+ /mob/living/carbon/human/proc/shapeshifter_select_gender,
+ /mob/living/carbon/human/proc/shapeshifter_select_wings,
+ /mob/living/carbon/human/proc/shapeshifter_select_tail,
+ /mob/living/carbon/human/proc/shapeshifter_select_ears,
+ /mob/living/carbon/human/proc/shapeshifter_select_eye_colour,
+ /mob/living/proc/set_size
+ )
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm
index 47c99f1b4f..48fc001e64 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm
@@ -354,14 +354,14 @@ I think I covered everything.
body = pick(body_styles)
overlay_colors["Body"] = pick(bodycolors)
ears = pick(ear_styles)
- overlay_colors["Ears"] = "#[get_random_colour(0, 100, 150)]"
+ overlay_colors["Ears"] = get_random_colour(0, 100, 150)
mane = pick(mane_styles)
overlay_colors["Mane"] = pick(bodycolors)
horns = pick(horn_styles)
var/list/horncolors = list("#000000","#151515","#303030","#606060","#808080","#AAAAAA","#CCCCCC","#EEEEEE","#FFFFFF")
overlay_colors["Horns"] = pick(horncolors)
eyes = pick(eye_styles)
- overlay_colors["Eyes"] = "#[get_random_colour(1)]"
+ overlay_colors["Eyes"] = get_random_colour(1)
var/image/I = image(icon, "dragon_under[under][resting? "-rest" : (vore_fullness? "-[vore_fullness]" : null)]", pixel_x = -48)
I.color = overlay_colors["Underbelly"]
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index 621e875df6..23176642d8 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -398,7 +398,11 @@ var/list/organ_cache = list()
rejecting = null
if(istype(owner))
- var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in reagents.reagent_list
+ // VOREstation edit begin - Posibrains don't have blood reagents, so they crash this
+ var/datum/reagent/blood/organ_blood = null
+ if(reagents)
+ organ_blood = locate(/datum/reagent/blood) in reagents.reagent_list
+ // VOREstation edit end
if(!organ_blood || !organ_blood.data["blood_DNA"])
owner.vessel.trans_to(src, 5, 1, 1)
@@ -418,7 +422,11 @@ var/list/organ_cache = list()
if(!istype(target)) return
- var/datum/reagent/blood/transplant_blood = locate(/datum/reagent/blood) in reagents.reagent_list
+ // VOREstation edit begin - Posibrains don't have blood reagents, so they crash this
+ var/datum/reagent/blood/transplant_blood = null
+ if(reagents)
+ transplant_blood = locate(/datum/reagent/blood) in reagents.reagent_list
+ // VOREstation edit end
transplant_data = list()
if(!transplant_blood)
transplant_data["species"] = target?.species.name
diff --git a/code/modules/organs/subtypes/replicant.dm b/code/modules/organs/subtypes/replicant.dm
index 51605ab098..2aaa4c6fd2 100644
--- a/code/modules/organs/subtypes/replicant.dm
+++ b/code/modules/organs/subtypes/replicant.dm
@@ -53,6 +53,20 @@
can_reject = FALSE
icon_state = "plasma_grey"
+/obj/item/organ/internal/xenos/plasmavessel/replicant/crew/handle_organ_proc_special()
+ if(!istype(owner))
+ return
+
+ var/modifier = 1 - 0.5 * is_bruised()
+
+ if(owner.bloodstr.has_reagent("phoron"))
+ adjust_plasma(round(4 * modifier))
+
+ if(owner.ingested.has_reagent("phoron"))
+ adjust_plasma(round(2 * modifier))
+
+ adjust_plasma(2) //Make it a decent amount so people can actually build stuff without stealing all of medbays phoron
+
/obj/item/organ/internal/xenos/acidgland/replicant
name = "replicant aerosol tubule"
desc = "A long, rubbery tube that ends in a hard plastic-like bulb."
@@ -152,6 +166,22 @@
owner.add_modifier(/datum/modifier/berserk, 20 SECONDS)
take_damage(5)
+/obj/item/organ/internal/heart/replicant/rage/crew/handle_organ_proc_special()
+ if(!owner)
+ return
+
+ var/damage_tally = 0
+ var/pain_tally = 0
+ damage_tally += owner.getBruteLoss()
+ damage_tally += owner.getFireLoss()
+ pain_tally += owner.getHalLoss()
+
+ if(((damage_tally >= 50 || prev_damage_tally >= 50) && prev_damage_tally - damage_tally < 0) || pain_tally >= 60)
+ if(world.time > last_activation_time + 60 MINUTES) //Can only be activated once every 60 minutes to prevent it being able to be spammed
+ last_activation_time = world.time
+ owner.add_modifier(/datum/modifier/berserk, 40 SECONDS) //Lasts a little longer so that it can actually get some use seeing as it activates so infrequently
+ take_damage(5)
+
/obj/item/organ/internal/lungs/replicant/mending
name = "replicant hive lungs"
desc = "A pair of rubbery sacs with large portions dedicated to honeycombed nanite filters."
@@ -169,3 +199,15 @@
var/obj/item/organ/O = owner.internal_organs_by_name[o_tag]
if(O)
O.take_damage(-1 * modifier)
+
+/obj/item/organ/internal/lungs/replicant/mending/crew/handle_organ_proc_special()
+ if(!owner)
+ return
+
+ var/modifier = 1 - (0.5 * is_bruised())
+
+ if(istype(owner))
+ for(var/o_tag in repair_list)
+ var/obj/item/organ/O = owner.internal_organs_by_name[o_tag]
+ if(O)
+ O.take_damage(-0.01 * modifier) //Very very slow regen, but still cool flavour
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 6075e3e715..922ad8513b 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -113,6 +113,8 @@
for(var/atom/movable/A in affecting)
if(istype(A,/obj/effect/abstract)) // Flashlight's lights are not physical objects
continue
+ if(istype(A,/obj/effect/decal/jan_hud)) // Ignore these too
+ continue
if(!A.anchored)
if(A.loc == src.loc) // prevents the object from being affected if it's not currently here.
step(A,movedir)
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index 9e187d087d..d393f4759e 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -485,7 +485,17 @@
"You have installed \the [tool] into [target]'s [affected.name].")
var/obj/item/device/mmi/M = tool
- var/obj/item/organ/internal/mmi_holder/holder = new(target, 1)
+ // VOREstation edit begin - Select the proper mmi holder subtype based on the brain inserted
+ var/obj/item/organ/internal/mmi_holder/holder = null
+ if(istype(M,/obj/item/device/mmi/digital/posibrain/nano))
+ holder = new /obj/item/organ/internal/mmi_holder/posibrain/nano(target, 1)
+ else if(istype(M,/obj/item/device/mmi/digital/posibrain))
+ holder = new /obj/item/organ/internal/mmi_holder/posibrain(target, 1)
+ else if(istype(M,/obj/item/device/mmi/digital/robot))
+ holder = new /obj/item/organ/internal/mmi_holder/robot(target, 1)
+ else
+ holder = new /obj/item/organ/internal/mmi_holder(target, 1) // Fallback to old behavior if organic MMI or if no subtype exists.
+ //VOREstation edit end
target.internal_organs_by_name["brain"] = holder
user.drop_from_inventory(tool)
tool.loc = holder
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 0bf247f50b..760aa561a4 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -192,7 +192,14 @@
if(isnull(selected_surgery)) //They clicked 'cancel'
return 1
selected_surgery = available_surgeries[selected_surgery] //Sets the name they selected to be the datum.
-
+ // VOREstation edit start
+ if(istype(selected_surgery,/datum/surgery_step/generic/amputate))
+ var/obj/item/organ/external/affected = M.get_organ(zone)
+ to_chat(user, "You are preparing to amputate \the [M]'s [affected.name]!")
+ if(!do_after(user, 3 SECONDS, M))
+ to_chat(user, "You reconsider performing an amputation...")
+ return 0
+ // VOREstation edit end
M.op_stage.in_progress += zone
selected_surgery.begin_step(user, M, zone, src) //start on it
var/success = TRUE
diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm
index 0acc4626b1..2ae067c443 100644
--- a/code/modules/ventcrawl/ventcrawl.dm
+++ b/code/modules/ventcrawl/ventcrawl.dm
@@ -90,6 +90,13 @@ var/list/ventcrawl_machinery = list(
/mob/living/carbon/human/is_allowed_vent_crawl_item(var/obj/item/carried_item)
if(carried_item in organs)
return 1
+ if(species.name == SPECIES_REPLICANT_CREW)
+ if(istype(carried_item, /obj/item/clothing/under))
+ return 1 //Allow them to not vent crawl naked
+ if(istype(carried_item, /obj/item))
+ var/obj/item/I = carried_item
+ if(I.w_class <= 2)
+ return 1 //Allow them to carry items that fit in pockets
return ..()
/mob/living/proc/ventcrawl_carry()
diff --git a/code/modules/vore/chat_healthbars.dm b/code/modules/vore/chat_healthbars.dm
index 7442d99d59..0ddab45b7a 100644
--- a/code/modules/vore/chat_healthbars.dm
+++ b/code/modules/vore/chat_healthbars.dm
@@ -117,6 +117,16 @@
set category = "Abilities"
var/nuffin = TRUE
+
+ var/obj/belly/amprey = src.loc
+
+ if(istype(amprey))
+ var/datum/digest_mode/selective/DM_S = GLOB.digest_modes[DM_SELECT]
+ var/digest_mode = amprey.digest_mode == DM_SELECT ? DM_S.get_selective_mode(amprey, src) : amprey.digest_mode
+ to_chat(src, "[digest_mode] - You are in [amprey.owner]'s [amprey.name]:")
+ src.chat_healthbar(src, TRUE, TRUE)
+ nuffin = FALSE
+
for(var/obj/belly/b in vore_organs)
if(!b.contents.len)
continue
@@ -127,10 +137,10 @@
if(!belly_announce)
var/datum/digest_mode/selective/DM_S = GLOB.digest_modes[DM_SELECT]
var/digest_mode = b.digest_mode == DM_SELECT ? DM_S.get_selective_mode(b, thing) : b.digest_mode
- to_chat(src, "[digest_mode] - Within [b.name]:") //We only want to announce the belly if we found something
+ to_chat(src, "[digest_mode] - Within your [b.name]:") //We only want to announce the belly if we found something
belly_announce = TRUE
var/mob/living/ourmob = thing
ourmob.chat_healthbar(src, TRUE, TRUE)
nuffin = FALSE
if(nuffin)
- to_chat(src, "There are no mobs within any of your bellies to print health bars for.")
+ to_chat(src, "There are no mobs within any of your bellies to print health bars for, and you are not in a belly yourself.")
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index f987730c8c..702dc55e21 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -737,10 +737,10 @@
user.update_icon()
var/mob/living/carbon/victim = prey // Check for afk vore
- if(istype(victim) && !victim.client && !victim.ai_holder)
+ if(istype(victim) && !victim.client && !victim.ai_holder && victim.ckey)
log_and_message_admins("[key_name_admin(pred)] ate [key_name_admin(prey)] whilst the prey was AFK ([pred ? ADMIN_JMP(pred) : "null"])")
var/mob/living/carbon/victim_pred = pred // Check for afk vore
- if(istype(victim_pred) && !victim_pred.client && !victim_pred.ai_holder)
+ if(istype(victim_pred) && !victim_pred.client && !victim_pred.ai_holder && victim_pred.ckey)
log_and_message_admins("[key_name_admin(pred)] ate [key_name_admin(prey)] whilst the pred was AFK ([pred ? ADMIN_JMP(pred) : "null"])")
// Inform Admins
diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt
index 2878abf081..72481432c8 100644
--- a/config/alienwhitelist.txt
+++ b/config/alienwhitelist.txt
@@ -127,6 +127,7 @@ ontejbjoav - Black-Eyed Shadekin
ontejbjoav - Diona
oreganovulgaris - Xenochimera
oscarholmes - Protean
+oscarholmes - Gamma Replicant
owwy - Black-Eyed Shadekin
oxenfree - Protean
ozyton - Black-Eyed Shadekin
diff --git a/maps/redgate/laserdome.dmm b/maps/redgate/laserdome.dmm
index 82210f3698..91dd9acce8 100644
--- a/maps/redgate/laserdome.dmm
+++ b/maps/redgate/laserdome.dmm
@@ -45,6 +45,12 @@
/obj/structure/closet/lasertag/red/laserdome,
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/ctf_prep)
+"awb" = (
+/obj/structure/table/rack,
+/obj/random/drinksoft,
+/obj/random/desatti_snacks,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/store_1)
"awn" = (
/obj/item/weapon/bikehorn/rubberducky,
/turf/simulated/floor/tiled/white,
@@ -81,6 +87,12 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hyperball)
+"baX" = (
+/obj/effect/floor_decal/industrial/arrows/blue{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/arena/hyperball)
"bdI" = (
/obj/structure/table/bench/steel,
/obj/effect/floor_decal/corner/blue{
@@ -101,11 +113,16 @@
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hbl_prep)
"blC" = (
-/turf/simulated/floor/tiled/milspec/raised,
-/area/redgate/laserdome/lobby)
+/obj/structure/closet/secure_closet/freezer/fridge,
+/turf/simulated/floor/tiled/eris/cafe,
+/area/redgate/laserdome/lobby/restaurant)
"bqk" = (
/turf/simulated/wall/tgmc/darkwall/deco3,
/area/redgate/laserdome/arena/capture_the_flag)
+"brx" = (
+/obj/effect/floor_decal/corner/red/full,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"brB" = (
/obj/structure/flag_decor/blue,
/turf/simulated/wall/tgmc/darkwall,
@@ -116,6 +133,10 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/capture_the_flag)
+"bwE" = (
+/obj/structure/bed/chair/sofa/bench/left,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"bBP" = (
/obj/effect/floor_decal/corner/blue/diagonal,
/turf/simulated/floor/tiled/milspec,
@@ -124,13 +145,7 @@
/turf/simulated/wall/tgmc/darkwall/deco0,
/area/redgate/laserdome/arena/hyperball)
"bFM" = (
-/obj/structure/table/marble,
-/obj/item/weapon/reagent_containers/food/snacks/chickenfillet,
-/obj/item/weapon/reagent_containers/food/snacks/chickenfillet,
-/obj/item/weapon/reagent_containers/food/snacks/chickenfillet,
-/obj/item/weapon/reagent_containers/food/snacks/chickenfillet,
-/obj/item/weapon/reagent_containers/food/snacks/chickenfillet,
-/obj/item/weapon/reagent_containers/food/snacks/chickenfillet,
+/obj/structure/closet/secure_closet/freezer/meat,
/turf/simulated/floor/tiled/eris/cafe,
/area/redgate/laserdome/lobby/restaurant)
"bFV" = (
@@ -146,6 +161,21 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/capture_the_flag)
+"bRk" = (
+/obj/structure/table/marble,
+/obj/item/device/encryptionkey/ent,
+/obj/item/device/encryptionkey/ent,
+/obj/item/device/encryptionkey/ent,
+/obj/item/device/encryptionkey/ent,
+/obj/item/device/encryptionkey/ent,
+/obj/item/device/encryptionkey/ent,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
+"bVo" = (
+/obj/structure/table/rack,
+/obj/random/instrument,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/store_1)
"bXT" = (
/obj/effect/floor_decal/corner/red{
dir = 10
@@ -182,6 +212,28 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hyperball)
+"cIt" = (
+/obj/item/clothing/shoes/black,
+/obj/item/clothing/under/color/red,
+/obj/item/clothing/suit/redtag,
+/obj/item/clothing/gloves/red,
+/obj/item/clothing/head/redtag,
+/mob/living/carbon/human/dummy/mannequin/autoequip{
+ autorotate = 0;
+ name = "Laserdome Mannequin";
+ real_name = "Laserdome Mannequin"
+ },
+/obj/effect/floor_decal/corner/red{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
+"cIU" = (
+/obj/effect/floor_decal/arrow{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"cMi" = (
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/ctf_prep)
@@ -200,6 +252,20 @@
"cSX" = (
/turf/simulated/wall/tgmc/window/darkwall/reinf,
/area/redgate/laserdome/arena/capture_the_flag)
+"cUF" = (
+/obj/effect/floor_decal/industrial/arrows/blue{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/arena/capture_the_flag)
+"cUN" = (
+/obj/structure/table/marble,
+/obj/structure/prop/machine/random_radio{
+ desc = "It looks like a radio, but all the markings are in a strange language. It's tuned to a station playing music you don't recognize.";
+ pixel_y = 10
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"cXB" = (
/turf/simulated/wall/tgmc/darkwall/deco0,
/area/redgate/laserdome/arena/capture_the_flag)
@@ -213,6 +279,22 @@
/obj/structure/flag_decor/red,
/turf/simulated/wall/tgmc/darkwall,
/area/redgate/laserdome/arena/hyperball)
+"dbA" = (
+/obj/item/clothing/shoes/black,
+/obj/item/clothing/under/color/red,
+/obj/item/clothing/suit/redtag,
+/obj/item/clothing/gloves/red,
+/obj/item/clothing/head/redtag,
+/mob/living/carbon/human/dummy/mannequin/autoequip{
+ autorotate = 0;
+ name = "Laserdome Mannequin";
+ real_name = "Laserdome Mannequin"
+ },
+/obj/effect/floor_decal/corner/red/full{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"dhX" = (
/turf/space,
/area/redgate/laserdome/space)
@@ -256,13 +338,21 @@
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena)
"dJu" = (
-/obj/structure/closet/crate/bin,
-/turf/simulated/floor/tiled/milspec,
+/obj/structure/closet/crate/bin{
+ anchored = 1
+ },
+/turf/simulated/floor/tiled/monotile,
/area/redgate/laserdome/lobby/spaceview_lounge)
"dLr" = (
-/obj/structure/redgate/away,
-/turf/simulated/floor/tiled/milspec/raised,
-/area/redgate/laserdome/lobby)
+/obj/structure/table/marble,
+/obj/item/weapon/reagent_containers/food/snacks/chickenfillet,
+/obj/item/weapon/reagent_containers/food/snacks/chickenfillet,
+/obj/item/weapon/reagent_containers/food/snacks/chickenfillet,
+/obj/item/weapon/reagent_containers/food/snacks/chickenfillet,
+/obj/item/weapon/reagent_containers/food/snacks/chickenfillet,
+/obj/item/weapon/reagent_containers/food/snacks/chickenfillet,
+/turf/simulated/floor/tiled/eris/cafe,
+/area/redgate/laserdome/lobby/restaurant)
"dPZ" = (
/obj/effect/floor_decal/corner/yellow/diagonal,
/turf/simulated/floor/tiled/milspec,
@@ -304,6 +394,12 @@
/obj/machinery/chem_master/condimaster,
/turf/simulated/floor/tiled/eris/cafe,
/area/redgate/laserdome/lobby/restaurant)
+"erC" = (
+/obj/effect/floor_decal/arrow{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/spaceview_lounge)
"evM" = (
/obj/effect/floor_decal/corner/blue{
dir = 1
@@ -322,6 +418,12 @@
/obj/structure/table/marble,
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/lobby/store_1)
+"eJA" = (
+/obj/structure/bed/chair/sofa/bench/left{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"eND" = (
/obj/structure/hyperball_pedestal,
/obj/item/weapon/laserdome_hyperball,
@@ -432,6 +534,12 @@
/obj/effect/floor_decal/corner/yellow,
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hyperball)
+"fAL" = (
+/obj/structure/table/marble,
+/obj/item/device/encryptionkey/ent,
+/obj/item/device/encryptionkey/ent,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"fCY" = (
/obj/structure/flag_decor/blue,
/turf/simulated/wall/tgmc/darkwall,
@@ -486,12 +594,39 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hyperball)
+"gch" = (
+/obj/effect/floor_decal/corner/blue/full{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
+"geF" = (
+/obj/structure/table/rack,
+/obj/random/cigarettes,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/store_1)
"ggB" = (
/obj/effect/floor_decal/corner/blue{
dir = 5
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/capture_the_flag)
+"ghx" = (
+/obj/item/clothing/shoes/black,
+/obj/item/clothing/under/color/blue,
+/obj/item/clothing/suit/bluetag,
+/obj/item/clothing/gloves/blue,
+/obj/item/clothing/head/bluetag,
+/mob/living/carbon/human/dummy/mannequin/autoequip{
+ autorotate = 0;
+ name = "Laserdome Mannequin";
+ real_name = "Laserdome Mannequin"
+ },
+/obj/effect/floor_decal/corner/blue{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"giO" = (
/turf/simulated/wall/tgmc/darkwall,
/area/redgate/laserdome/lobby/store_1)
@@ -529,6 +664,11 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/ctf_prep)
+"gKd" = (
+/obj/structure/table/rack,
+/obj/random/drinksoft,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/store_1)
"gKy" = (
/obj/effect/floor_decal/corner/blue/full,
/obj/structure/closet/lasertag/blue/laserdome,
@@ -574,6 +714,10 @@
},
/turf/simulated/floor/tiled/white,
/area/redgate/laserdome/lobby/showers)
+"gZw" = (
+/obj/structure/flag_decor/red,
+/turf/simulated/wall/tgmc/darkwall,
+/area/redgate/laserdome/lobby)
"had" = (
/obj/effect/floor_decal/corner/red{
dir = 6
@@ -583,6 +727,12 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hyperball)
+"haQ" = (
+/obj/effect/floor_decal/arrow{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"heF" = (
/obj/structure/flag_decor,
/turf/simulated/wall/tgmc/darkwall,
@@ -617,6 +767,13 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/ctf_prep)
+"hiN" = (
+/obj/structure/table/marble,
+/obj/structure/prop/machine/biosyphon/laserdome/flagcap{
+ pixel_y = 6
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/arena/ctf_prep)
"hnp" = (
/obj/effect/floor_decal/steeldecal/steel_decals10{
dir = 4
@@ -648,6 +805,12 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/ctf_prep)
+"hxU" = (
+/obj/effect/floor_decal/corner/red{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"hBv" = (
/obj/machinery/body_scanconsole{
dir = 4
@@ -667,6 +830,12 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hyperball)
+"hPx" = (
+/obj/effect/floor_decal/corner/blue/full{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"icL" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/effect/floor_decal/corner/red/diagonal{
@@ -817,12 +986,34 @@
"jCB" = (
/turf/simulated/wall/tgmc/darkwall,
/area/redgate/laserdome/lobby/spaceview_lounge)
+"jIH" = (
+/obj/effect/floor_decal/arrow{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/arena/ctf_prep)
"jKh" = (
/obj/effect/floor_decal/corner/blue{
dir = 10
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/capture_the_flag)
+"jPA" = (
+/obj/item/clothing/shoes/black,
+/obj/item/clothing/under/color/blue,
+/obj/item/clothing/suit/bluetag,
+/obj/item/clothing/gloves/blue,
+/obj/item/clothing/head/bluetag,
+/mob/living/carbon/human/dummy/mannequin/autoequip{
+ autorotate = 0;
+ name = "Laserdome Mannequin";
+ real_name = "Laserdome Mannequin"
+ },
+/obj/effect/floor_decal/corner/blue{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"jQs" = (
/obj/effect/floor_decal/corner/yellow/full{
dir = 1
@@ -862,6 +1053,10 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hyperball)
+"kiJ" = (
+/obj/structure/table/marble,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"klg" = (
/obj/effect/floor_decal/corner/blue{
dir = 10
@@ -871,12 +1066,26 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/capture_the_flag)
+"kms" = (
+/obj/structure/table/rack,
+/obj/random/drinksoft,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/store_2)
+"kqL" = (
+/obj/structure/prop/machine/tgmc_console2,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"krH" = (
/obj/effect/floor_decal/corner/red{
dir = 8
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hyperball)
+"krQ" = (
+/obj/structure/table/rack,
+/obj/random/nukies_can_legal,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/store_1)
"ktn" = (
/obj/effect/floor_decal/corner/red{
dir = 6
@@ -897,6 +1106,12 @@
/obj/structure/closet/lasertag/red/laserdome,
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hbl_prep)
+"kEA" = (
+/obj/structure/bed/chair/sofa/bench/right{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"kFg" = (
/obj/effect/floor_decal/corner/red{
dir = 5
@@ -927,6 +1142,12 @@
/obj/machinery/recharger/wallcharger,
/turf/simulated/wall/tgmc/darkwall,
/area/redgate/laserdome/arena/capture_the_flag)
+"kPg" = (
+/obj/effect/floor_decal/corner/red{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"kRK" = (
/obj/effect/floor_decal/corner/blue{
dir = 5
@@ -948,6 +1169,12 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/capture_the_flag)
+"kUV" = (
+/obj/structure/table/rack,
+/obj/random/cigarettes,
+/obj/random/desatti_snacks,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/store_2)
"kYn" = (
/obj/effect/floor_decal/corner/red/full{
dir = 4
@@ -987,7 +1214,10 @@
/turf/simulated/floor/tiled/eris/cafe,
/area/redgate/laserdome/lobby/restaurant)
"lpp" = (
-/obj/structure/closet/secure_closet/freezer/fridge,
+/obj/structure/table/marble,
+/obj/item/weapon/reagent_containers/food/snacks/fries,
+/obj/item/weapon/reagent_containers/food/snacks/fries,
+/obj/item/weapon/reagent_containers/food/snacks/fries,
/turf/simulated/floor/tiled/eris/cafe,
/area/redgate/laserdome/lobby/restaurant)
"lDM" = (
@@ -1001,6 +1231,11 @@
},
/turf/simulated/floor/tiled/milspec/sterile,
/area/redgate/laserdome/lobby/aid_station)
+"lEw" = (
+/obj/structure/table/rack,
+/obj/random/flashlight,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/store_2)
"lEQ" = (
/obj/effect/floor_decal/corner/yellow{
dir = 9
@@ -1018,6 +1253,12 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/ctf_prep)
+"lPM" = (
+/obj/effect/floor_decal/corner/blue{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"lRb" = (
/obj/effect/floor_decal/corner/red{
dir = 8
@@ -1062,6 +1303,12 @@
"mhi" = (
/turf/simulated/wall/tgmc/darkwall,
/area/redgate/laserdome/lobby/store_2)
+"mib" = (
+/obj/structure/table/rack,
+/obj/random/drinksoft,
+/obj/random/desatti_snacks,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/store_2)
"mmm" = (
/obj/effect/floor_decal/corner/red{
dir = 10
@@ -1075,9 +1322,25 @@
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/lobby/store_1)
"myA" = (
-/obj/structure/closet/secure_closet/freezer/meat,
+/obj/structure/table/marble,
+/obj/random/pizzabox,
+/obj/random/pizzabox,
+/obj/random/pizzabox,
+/obj/random/pizzabox,
+/obj/item/weapon/material/knife/plastic,
/turf/simulated/floor/tiled/eris/cafe,
/area/redgate/laserdome/lobby/restaurant)
+"mBZ" = (
+/obj/structure/table/rack,
+/obj/random/instrument,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/store_2)
+"mCM" = (
+/obj/effect/floor_decal/industrial/arrows/blue{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/arena/hbl_prep)
"mIW" = (
/obj/effect/floor_decal/corner/blue{
dir = 10
@@ -1094,6 +1357,10 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hyperball)
+"mMT" = (
+/obj/structure/flag_decor/blue,
+/turf/simulated/wall/tgmc/darkwall,
+/area/redgate/laserdome/lobby)
"mPK" = (
/obj/effect/floor_decal/corner/blue{
dir = 9
@@ -1125,6 +1392,10 @@
/obj/structure/closet/lasertag/red/laserdome,
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/ctf_prep)
+"njI" = (
+/obj/structure/redgate/away,
+/turf/simulated/floor/tiled/milspec/raised,
+/area/redgate/laserdome/lobby)
"nlK" = (
/obj/effect/floor_decal/corner/blue{
dir = 5
@@ -1134,9 +1405,18 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hyperball)
+"nuz" = (
+/turf/simulated/floor/tiled/milspec/raised,
+/area/redgate/laserdome/lobby)
"nxb" = (
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/capture_the_flag)
+"nyb" = (
+/obj/effect/floor_decal/corner/red/full{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"nBo" = (
/obj/effect/floor_decal/corner/red{
dir = 5
@@ -1226,13 +1506,19 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hyperball)
+"ohk" = (
+/obj/structure/bed/chair/sofa/bench/right,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"ont" = (
-/obj/structure/closet/crate/bin,
/obj/machinery/light/small/neon/generic_green{
dir = 1;
pixel_y = -23
},
-/turf/simulated/floor/tiled/milspec,
+/obj/structure/closet/crate/bin{
+ anchored = 1
+ },
+/turf/simulated/floor/tiled/monotile,
/area/redgate/laserdome/lobby)
"oqT" = (
/obj/effect/floor_decal/corner/blue/full{
@@ -1272,6 +1558,10 @@
},
/turf/simulated/floor/tiled/milspec/sterile,
/area/redgate/laserdome/lobby/aid_station)
+"oAc" = (
+/obj/structure/bed/chair/sofa/bench,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"oHj" = (
/obj/machinery/recharger/wallcharger,
/turf/simulated/wall/tgmc/darkwall,
@@ -1327,16 +1617,21 @@
/obj/machinery/recharger/wallcharger,
/turf/simulated/wall/tgmc/darkwall,
/area/redgate/laserdome/arena/ctf_prep)
+"pex" = (
+/obj/effect/floor_decal/corner/red{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"pfr" = (
-/obj/structure/table/marble,
-/obj/item/weapon/reagent_containers/food/snacks/fries,
-/obj/item/weapon/reagent_containers/food/snacks/fries,
-/obj/item/weapon/reagent_containers/food/snacks/fries,
-/obj/item/weapon/reagent_containers/food/snacks/fries,
-/obj/item/weapon/reagent_containers/food/snacks/fries,
-/obj/item/weapon/reagent_containers/food/snacks/fries,
+/obj/machinery/door/airlock/freezer{
+ name = "Restaurant Backroom"
+ },
/turf/simulated/floor/tiled/eris/cafe,
/area/redgate/laserdome/lobby/restaurant)
+"pfA" = (
+/turf/simulated/wall/tgmc/window/darkwall/reinf,
+/area/redgate/laserdome/lobby)
"pgz" = (
/obj/structure/table/marble,
/obj/item/weapon/storage/firstaid/toxin{
@@ -1357,6 +1652,12 @@
},
/turf/simulated/floor/tiled/milspec/sterile,
/area/redgate/laserdome/lobby/aid_station)
+"poL" = (
+/obj/item/weapon/stool/baystool/padded{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"ppf" = (
/obj/structure/hyperball_goal/red,
/turf/simulated/floor/tiled/milspec/raised,
@@ -1364,6 +1665,18 @@
"pvv" = (
/turf/simulated/wall/tgmc/window/darkwall/reinf,
/area/redgate/laserdome/arena/hbl_prep)
+"pyU" = (
+/obj/structure/table/rack,
+/obj/random/cigarettes,
+/obj/random/nukies_can_legal,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/store_1)
+"pAB" = (
+/obj/effect/floor_decal/corner/blue{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"pBv" = (
/obj/effect/floor_decal/corner/blue/full{
dir = 4
@@ -1392,6 +1705,18 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/capture_the_flag)
+"pVQ" = (
+/obj/structure/table/marble,
+/obj/structure/prop/machine/biosyphon/laserdome{
+ pixel_y = 6
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
+"pXq" = (
+/obj/structure/table/rack,
+/obj/random/flashlight,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/store_1)
"pYa" = (
/obj/effect/floor_decal/corner/blue{
dir = 10
@@ -1458,6 +1783,12 @@
/obj/machinery/appliance/cooker/fryer,
/turf/simulated/floor/tiled/eris/cafe,
/area/redgate/laserdome/lobby/restaurant)
+"qJa" = (
+/obj/effect/floor_decal/industrial/arrows/red{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/arena/hyperball)
"qRv" = (
/obj/effect/floor_decal/corner/red{
dir = 1
@@ -1466,7 +1797,8 @@
/area/redgate/laserdome/arena/hyperball)
"qVN" = (
/obj/structure/table/rack,
-/obj/item/device/encryptionkey/ent,
+/obj/random/cigarettes,
+/obj/random/nukies_can_legal,
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/lobby/store_2)
"qWQ" = (
@@ -1481,6 +1813,12 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/capture_the_flag)
+"qYD" = (
+/obj/structure/bed/chair/sofa/bench{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"raq" = (
/obj/effect/floor_decal/corner/yellow{
dir = 6
@@ -1488,8 +1826,10 @@
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/capture_the_flag)
"rjJ" = (
-/obj/structure/closet/crate/bin,
-/turf/simulated/floor/tiled/milspec,
+/obj/structure/closet/crate/bin{
+ anchored = 1
+ },
+/turf/simulated/floor/tiled/monotile,
/area/redgate/laserdome/lobby)
"rkC" = (
/obj/machinery/light/small/neon/generic_green{
@@ -1592,6 +1932,12 @@
/obj/structure/closet/crate/bin,
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/ctf_prep)
+"sbU" = (
+/obj/effect/floor_decal/industrial/arrows/red{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/arena/hbl_prep)
"shp" = (
/obj/effect/floor_decal/corner/red{
dir = 10
@@ -1601,9 +1947,17 @@
/area/redgate/laserdome/arena/ctf_prep)
"sox" = (
/obj/structure/table/rack,
-/obj/item/device/encryptionkey/ent,
+/obj/random/drinksoft,
+/obj/random/drinksoft,
+/obj/random/desatti_snacks,
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/lobby/store_1)
+"soY" = (
+/obj/effect/floor_decal/industrial/arrows/red{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/arena/ctf_prep)
"suI" = (
/obj/effect/floor_decal/corner/yellow{
dir = 10
@@ -1658,6 +2012,22 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hyperball)
+"sRZ" = (
+/obj/item/clothing/shoes/black,
+/obj/item/clothing/under/color/red,
+/obj/item/clothing/suit/redtag,
+/obj/item/clothing/gloves/red,
+/obj/item/clothing/head/redtag,
+/mob/living/carbon/human/dummy/mannequin/autoequip{
+ autorotate = 0;
+ name = "Laserdome Mannequin";
+ real_name = "Laserdome Mannequin"
+ },
+/obj/effect/floor_decal/corner/red{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"sSK" = (
/obj/effect/floor_decal/corner/blue/diagonal,
/obj/effect/floor_decal/corner/blue/diagonal{
@@ -1674,6 +2044,10 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hyperball)
+"sWc" = (
+/obj/effect/floor_decal/arrow,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"sXa" = (
/obj/effect/floor_decal/corner/red/full,
/turf/simulated/floor/tiled/milspec,
@@ -1768,6 +2142,12 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hbl_prep)
+"tXj" = (
+/obj/effect/floor_decal/industrial/arrows/blue{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/arena/ctf_prep)
"tZO" = (
/turf/simulated/wall/tgmc/darkwall,
/area/redgate/laserdome/lobby/aid_station)
@@ -1787,6 +2167,10 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/ctf_prep)
+"udY" = (
+/obj/effect/floor_decal/arrow,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/arena/hbl_prep)
"ugA" = (
/obj/structure/curtain/open/privacy{
name = "shower curtain"
@@ -1877,6 +2261,12 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/capture_the_flag)
+"uCy" = (
+/obj/effect/floor_decal/corner/blue{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"uIp" = (
/obj/effect/floor_decal/corner/red/full{
dir = 8
@@ -1900,6 +2290,22 @@
/obj/structure/closet/lasertag/blue/laserdome,
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/ctf_prep)
+"uTh" = (
+/obj/item/clothing/shoes/black,
+/obj/item/clothing/under/color/blue,
+/obj/item/clothing/suit/bluetag,
+/obj/item/clothing/gloves/blue,
+/obj/item/clothing/head/bluetag,
+/mob/living/carbon/human/dummy/mannequin/autoequip{
+ autorotate = 0;
+ name = "Laserdome Mannequin";
+ real_name = "Laserdome Mannequin"
+ },
+/obj/effect/floor_decal/corner/blue/full{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"val" = (
/obj/effect/floor_decal/corner/red{
dir = 5
@@ -1924,6 +2330,12 @@
},
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/capture_the_flag)
+"vid" = (
+/obj/structure/table/rack,
+/obj/random/drinksoft,
+/obj/random/nukies_can_legal,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby/store_2)
"vjW" = (
/obj/effect/floor_decal/corner/red{
dir = 9
@@ -2030,6 +2442,12 @@
/obj/effect/floor_decal/corner/blue/full,
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hbl_prep)
+"vYY" = (
+/obj/effect/floor_decal/industrial/arrows/red{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/arena/capture_the_flag)
"vZq" = (
/obj/effect/floor_decal/corner/blue{
dir = 10
@@ -2053,6 +2471,13 @@
/obj/structure/table/bench/steel,
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/hbl_prep)
+"wkd" = (
+/obj/structure/table/marble,
+/obj/structure/prop/machine/biosyphon/laserdome/hyperball{
+ pixel_y = 6
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/arena/hbl_prep)
"wkM" = (
/obj/effect/map_effect/portal/line/side_b{
dir = 8
@@ -2087,6 +2512,10 @@
/obj/structure/table/marble,
/turf/simulated/floor/tiled/milspec/sterile,
/area/redgate/laserdome/lobby/aid_station)
+"wws" = (
+/obj/effect/floor_decal/corner/blue/full,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"wDy" = (
/obj/effect/floor_decal/corner/blue/full{
dir = 1
@@ -2197,9 +2626,17 @@
/turf/simulated/floor/tiled/milspec,
/area/redgate/laserdome/arena/capture_the_flag)
"xHi" = (
-/obj/structure/closet/crate/bin,
-/turf/simulated/floor/tiled/milspec,
+/obj/structure/closet/crate/bin{
+ anchored = 1
+ },
+/turf/simulated/floor/tiled/monotile,
/area/redgate/laserdome/lobby/restaurant)
+"xIq" = (
+/obj/effect/floor_decal/corner/red/full{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/laserdome/lobby)
"xIt" = (
/obj/effect/floor_decal/corner/red/diagonal{
dir = 1
@@ -6248,7 +6685,7 @@ asC
oes
fbv
evM
-xPN
+baX
fLE
wFI
oes
@@ -6345,7 +6782,7 @@ vkq
kOV
qsu
aIy
-nxb
+cUF
iyV
ayr
kOV
@@ -7858,7 +8295,7 @@ ikl
ikl
ikl
ikl
-ikl
+erC
ikl
ikl
ikl
@@ -8142,7 +8579,7 @@ ikl
ikl
ikl
ikl
-ikl
+erC
ikl
ikl
ikl
@@ -8426,7 +8863,7 @@ xLH
xMG
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
@@ -8710,7 +9147,7 @@ xMG
xMG
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
@@ -8718,8 +9155,8 @@ rkC
giO
mmw
sox
-sox
-sox
+pXq
+pyU
mmw
eCL
xLH
@@ -8995,7 +9432,7 @@ xMG
xMG
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
@@ -9139,13 +9576,13 @@ xMG
xMG
xMG
xMG
-xMG
+haQ
xMG
eCL
mmw
-sox
-sox
-sox
+awb
+geF
+bVo
mmw
eCL
xLH
@@ -9263,10 +9700,10 @@ vHZ
vHZ
vHZ
xLH
-xLH
-xLH
-xLH
-xLH
+uab
+uab
+uab
+uab
uab
uab
wHk
@@ -9279,15 +9716,15 @@ dCG
dCG
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
eCL
mmw
-sox
-sox
-sox
+pyU
+pXq
+gKd
mmw
eCL
xLH
@@ -9405,10 +9842,10 @@ vHZ
vHZ
vHZ
xLH
-xLH
-xLH
-xLH
-xLH
+uab
+bFV
+pPz
+pPz
uab
coy
pPz
@@ -9547,10 +9984,10 @@ vHZ
vHZ
vHZ
xLH
-xLH
-xLH
-xLH
-xLH
+uab
+blC
+pPz
+pPz
uab
twc
pPz
@@ -9563,7 +10000,7 @@ oWY
dCG
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
@@ -9689,12 +10126,12 @@ vHZ
vHZ
vHZ
xLH
-xLH
-xLH
-xLH
-xLH
uab
-lpp
+blC
+pPz
+pPz
+pfr
+pPz
pPz
pPz
pPz
@@ -9711,9 +10148,9 @@ xMG
jZT
giO
mmw
-sox
-sox
-sox
+krQ
+gKd
+awb
mmw
eCL
xLH
@@ -9831,12 +10268,12 @@ vHZ
vHZ
vHZ
xLH
-xLH
-xLH
-xLH
-xLH
uab
-myA
+bFM
+pPz
+pPz
+uab
+bFV
pPz
pPz
nVx
@@ -9847,7 +10284,7 @@ bFV
hfU
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
@@ -9973,10 +10410,10 @@ vHZ
vHZ
vHZ
xLH
-xLH
-xLH
-xLH
-xLH
+uab
+bFM
+pPz
+pPz
uab
nXX
pPz
@@ -10115,10 +10552,10 @@ vHZ
vHZ
vHZ
xLH
-xLH
-xLH
-xLH
-xLH
+uab
+bFM
+pPz
+pPz
uab
qAM
pPz
@@ -10131,7 +10568,7 @@ bFV
hfU
xMG
xMG
-xMG
+cIU
xMG
xMG
wPO
@@ -10257,10 +10694,10 @@ vHZ
vHZ
vHZ
xLH
-xLH
-xLH
-xLH
-xLH
+uab
+dLr
+pPz
+pPz
uab
qBt
pPz
@@ -10399,10 +10836,10 @@ vHZ
vHZ
vHZ
xLH
-xLH
-xLH
-xLH
-xLH
+uab
+fsP
+pPz
+pPz
uab
uzs
pPz
@@ -10415,7 +10852,7 @@ bFV
hfU
xMG
xMG
-xMG
+cIU
xMG
xMG
wPO
@@ -10541,10 +10978,10 @@ vHZ
vHZ
vHZ
xLH
-xLH
-xLH
-xLH
-xLH
+uab
+lpp
+pPz
+pPz
uab
gTS
pPz
@@ -10555,11 +10992,11 @@ pPz
pPz
bFV
hfU
+sWc
xMG
xMG
xMG
-xMG
-xMG
+haQ
aSF
rLV
aSF
@@ -10683,10 +11120,10 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
+uab
+lpp
+pPz
+pPz
uab
wFp
pPz
@@ -10699,7 +11136,7 @@ bFV
hfU
xMG
xMG
-xMG
+cIU
xMG
xMG
wPO
@@ -10825,10 +11262,10 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
+uab
+myA
+pPz
+pPz
uab
eqO
pPz
@@ -10967,10 +11404,10 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
+uab
+myA
+pPz
+pPz
uab
lgv
pPz
@@ -10983,7 +11420,7 @@ bFV
hfU
xMG
xMG
-xMG
+cIU
xMG
xMG
wPO
@@ -11109,15 +11546,15 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
uab
uab
-fsP
-pfr
-bFM
+uab
+uab
+uab
+uab
+uab
+uab
+uab
uab
uab
uab
@@ -11266,7 +11703,7 @@ rjJ
xMG
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
@@ -11412,7 +11849,7 @@ xMG
xMG
xMG
xMG
-xMG
+rjJ
vDA
vDA
vDA
@@ -11531,7 +11968,7 @@ xLH
ymc
wZd
mad
-cXM
+sbU
pCi
wZd
ymc
@@ -11550,11 +11987,11 @@ xMG
xMG
xMG
xMG
+cIU
xMG
xMG
xMG
xMG
-rjJ
vDA
fCY
vDA
@@ -11569,7 +12006,7 @@ vDA
vDA
jSI
fhw
-cMi
+soY
nEA
jSI
vDA
@@ -11689,13 +12126,13 @@ akp
vXs
pvv
xMG
+eJA
+ohk
xMG
xMG
xMG
-xMG
-xMG
-xMG
-xMG
+eJA
+ohk
xMG
qnI
diP
@@ -11815,7 +12252,7 @@ xLH
oIG
whp
cXM
-cXM
+sbU
cXM
uqG
yet
@@ -11831,13 +12268,13 @@ fxa
tVf
pvv
xMG
+qYD
+oAc
xMG
+cIU
xMG
-xMG
-xMG
-xMG
-xMG
-xMG
+qYD
+oAc
xMG
qnI
oVB
@@ -11853,7 +12290,7 @@ vDA
ngN
fqR
cMi
-cMi
+soY
cMi
rAb
shp
@@ -11973,13 +12410,13 @@ pvv
pvv
ymc
xMG
+kEA
+bwE
xMG
xMG
xMG
-xMG
-xMG
-xMG
-xMG
+kEA
+bwE
xMG
vDA
qnI
@@ -12117,9 +12554,9 @@ wgC
xMG
xMG
xMG
-blC
-blC
-blC
+xMG
+cIU
+xMG
xMG
xMG
xMG
@@ -12241,45 +12678,45 @@ xLH
oHj
dSM
cXM
-cXM
+wkd
cXM
uzE
+udY
cXM
+udY
cXM
+udY
cXM
+udY
cXM
+udY
cXM
-cXM
-cXM
-cXM
-cXM
-cXM
-cXM
+udY
uzE
+sWc
+xMG
+sWc
xMG
xMG
xMG
-blC
-dLr
-blC
-xMG
-xMG
+haQ
xMG
+haQ
+dWp
+jIH
+cMi
+jIH
+cMi
+jIH
+cMi
+jIH
+cMi
+jIH
+cMi
+jIH
dWp
cMi
-cMi
-cMi
-cMi
-cMi
-cMi
-cMi
-cMi
-cMi
-cMi
-cMi
-dWp
-cMi
-cMi
+hiN
cMi
sbo
pbF
@@ -12401,9 +12838,9 @@ blf
xMG
xMG
xMG
-blC
-blC
-blC
+xMG
+cIU
+xMG
xMG
xMG
xMG
@@ -12541,13 +12978,13 @@ pvv
pvv
ymc
xMG
+eJA
+ohk
xMG
xMG
xMG
-xMG
-xMG
-xMG
-xMG
+eJA
+ohk
xMG
vDA
qnI
@@ -12667,7 +13104,7 @@ xLH
wXJ
whp
cXM
-cXM
+mCM
cXM
bdI
fga
@@ -12683,13 +13120,13 @@ vjW
iJM
pvv
xMG
+qYD
+oAc
xMG
+cIU
xMG
-xMG
-xMG
-xMG
-xMG
-xMG
+qYD
+oAc
xMG
qnI
uIp
@@ -12705,7 +13142,7 @@ vDA
wED
hhi
cMi
-cMi
+tXj
cMi
rAb
tRw
@@ -12825,13 +13262,13 @@ qba
rWF
pvv
xMG
+kEA
+bwE
xMG
xMG
xMG
-xMG
-xMG
-xMG
-xMG
+kEA
+bwE
xMG
qnI
ucr
@@ -12951,7 +13388,7 @@ xLH
ymc
vsH
fbG
-cXM
+mCM
pYa
vsH
ymc
@@ -12970,7 +13407,7 @@ xMG
xMG
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
@@ -12989,7 +13426,7 @@ vDA
vDA
fCY
djp
-cMi
+tXj
xVN
fCY
vDA
@@ -13254,7 +13691,7 @@ xMG
xMG
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
@@ -13262,8 +13699,8 @@ jZT
mhi
xaR
qVN
-qVN
-qVN
+mib
+lEw
xaR
vIe
vDA
@@ -13538,7 +13975,7 @@ xMG
xMG
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
@@ -13687,9 +14124,9 @@ xMG
xMG
vIe
xaR
-qVN
-qVN
-qVN
+mBZ
+vid
+kms
xaR
vIe
xLH
@@ -13822,16 +14259,16 @@ xMG
xMG
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
xMG
vIe
xaR
-qVN
-qVN
-qVN
+kms
+kUV
+lEw
xaR
vIe
xLH
@@ -13966,7 +14403,7 @@ xMG
xMG
xMG
xMG
-xMG
+haQ
xMG
xMG
vIe
@@ -14106,7 +14543,7 @@ hGF
xMG
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
@@ -14246,7 +14683,7 @@ lcP
jho
hGF
xMG
-xMG
+sWc
xMG
xMG
xMG
@@ -14255,9 +14692,9 @@ xMG
ont
mhi
xaR
-qVN
-qVN
-qVN
+kms
+kUV
+vid
xaR
vIe
xLH
@@ -14390,7 +14827,7 @@ hGF
xMG
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
@@ -14675,7 +15112,7 @@ xMG
xMG
xMG
xMG
-xMG
+cIU
xMG
xMG
xMG
@@ -14959,7 +15396,7 @@ xMG
xMG
xMG
xMG
-xMG
+cIU
xMG
xMG
xLH
@@ -15099,9 +15536,9 @@ nXQ
xLH
xLH
xLH
-xLH
-xLH
-xLH
+xMG
+xMG
+xMG
xLH
xLH
xLH
@@ -15241,9 +15678,9 @@ nXQ
xLH
xLH
xLH
-xLH
-xLH
-xLH
+xMG
+xMG
+cIU
xLH
xLH
xLH
@@ -15383,9 +15820,9 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
+xMG
+xMG
+xMG
xLH
xLH
xLH
@@ -15520,19 +15957,19 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+mMT
+hPx
+jPA
+wws
+pfA
+xMG
+xMG
+cIU
+pfA
+nyb
+sRZ
+brx
+gZw
xLH
xLH
xLH
@@ -15663,17 +16100,17 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+pAB
+xMG
+lPM
+pfA
+xMG
+xMG
+xMG
+pfA
+pex
+xMG
+hxU
xLH
xLH
xLH
@@ -15805,17 +16242,17 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+pAB
+xMG
+lPM
+pfA
+xMG
+xMG
+cIU
+pfA
+pex
+xMG
+hxU
xLH
xLH
xLH
@@ -15947,17 +16384,17 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+pAB
+xMG
+lPM
+pfA
+xMG
+xMG
+xMG
+pfA
+pex
+xMG
+hxU
xLH
xLH
xLH
@@ -16088,19 +16525,19 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+mMT
+ghx
+xMG
+lPM
+pfA
+xMG
+xMG
+cIU
+pfA
+pex
+xMG
+cIt
+gZw
xLH
xLH
xLH
@@ -16231,17 +16668,17 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+pAB
+xMG
+lPM
+pfA
+xMG
+xMG
+xMG
+pfA
+pex
+xMG
+hxU
xLH
xLH
xLH
@@ -16373,17 +16810,17 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+pAB
+xMG
+lPM
+pfA
+xMG
+xMG
+cIU
+pfA
+pex
+xMG
+hxU
xLH
xLH
xLH
@@ -16515,17 +16952,17 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+pAB
+xMG
+lPM
+pfA
+xMG
+xMG
+xMG
+pfA
+pex
+xMG
+hxU
xLH
xLH
xLH
@@ -16656,19 +17093,19 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+mMT
+gch
+uCy
+uTh
+pfA
+xMG
+xMG
+cIU
+pfA
+dbA
+kPg
+xIq
+gZw
xLH
xLH
xLH
@@ -16803,9 +17240,9 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
+xMG
+xMG
+xMG
xLH
xLH
xLH
@@ -16943,12 +17380,12 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+cUN
+xMG
+xMG
+xMG
+cIU
+kiJ
xLH
xLH
xLH
@@ -17085,12 +17522,12 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+kqL
+poL
+kiJ
+xMG
+xMG
+xMG
xLH
xLH
xLH
@@ -17227,12 +17664,12 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+bRk
+kiJ
+pVQ
+xMG
+cIU
+xMG
xLH
xLH
xLH
@@ -17370,11 +17807,11 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+xMG
+xMG
+xMG
+xMG
+xMG
xLH
xLH
xLH
@@ -17511,13 +17948,13 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+fAL
+xMG
+nuz
+nuz
+nuz
+xMG
+fAL
xLH
xLH
xLH
@@ -17653,13 +18090,13 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+fAL
+xMG
+nuz
+njI
+nuz
+xMG
+fAL
xLH
xLH
xLH
@@ -17795,13 +18232,13 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+fAL
+xMG
+nuz
+nuz
+nuz
+xMG
+fAL
xLH
xLH
xLH
@@ -17938,11 +18375,11 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
-xLH
-xLH
+xMG
+xMG
+xMG
+xMG
+xMG
xLH
xLH
xLH
@@ -18081,9 +18518,9 @@ xLH
xLH
xLH
xLH
-xLH
-xLH
-xLH
+fAL
+fAL
+fAL
xLH
xLH
xLH
@@ -18176,7 +18613,7 @@ asC
oes
mUp
wlw
-xPN
+qJa
aue
tUV
oes
@@ -18273,7 +18710,7 @@ vkq
kOV
dxx
fYj
-nxb
+vYY
bZe
uBq
kOV
diff --git a/tgui/packages/tgui/components/Button.tsx b/tgui/packages/tgui/components/Button.tsx
index 7265006312..cb7f3b0af3 100644
--- a/tgui/packages/tgui/components/Button.tsx
+++ b/tgui/packages/tgui/components/Button.tsx
@@ -91,8 +91,20 @@ export const Button = (props: Props) => {
const toDisplay: ReactNode = content || children;
+ const ref = useRef(null);
+
+ function handleButtonClick(event) {
+ if (!disabled && onClick) {
+ onClick(event);
+ if (ref?.current) {
+ (ref.current as HTMLElement).blur();
+ }
+ }
+ }
+
let buttonContent = (