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 = (
{ ])} tabIndex={!disabled ? 0 : undefined} onClick={(event) => { - if (!disabled && onClick) { - onClick(event); - } + handleButtonClick(event); }} onKeyDown={(event) => { if (!captureKeys) { diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotAccess.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotAccess.tsx index a5780f93e3..9234107589 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotAccess.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotAccess.tsx @@ -29,7 +29,7 @@ export const ModifyRobotAccess = (props: { return ( <> {!target.active && } - + {!target.active && } - + {!target.active && } - +
Robot to salvage diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx index 1662c8053c..a0cadfb4ec 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx @@ -27,7 +27,7 @@ export const ModifyRobotPKA = (props: { target: Target }) => { {!target.pka ? ( {target.name} has no PKA installed. ) : ( - + Remaining Capacity: {target.pka.capacity} diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotRadio.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotRadio.tsx index 5af3a8cd06..02a6828c9d 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotRadio.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotRadio.tsx @@ -25,7 +25,7 @@ export const ModifyRobotRadio = (props: { target: Target }) => { return ( <> {!target.active && } - + { /> - + { has_inherent_laws, has_supplied_laws, isAI, + isMalf, + isSlaved, + active_ais, + selected_ai, channel, channels, law_sets, @@ -90,9 +94,8 @@ export const ModifyRobot = (props) => { tabs[6] = ( { has_inherent_laws={has_inherent_laws} has_supplied_laws={has_supplied_laws} isAI={isAI} + isMalf={isMalf} channel={channel} channels={channels} /> ); tabs[7] = ( -
+
{ <> setRobotName(value)} /> @@ -162,7 +166,7 @@ export const ModifyRobot = (props) => { + + + + )} + + {!!target?.module && ( + + + + act('select_ai', { + new_ai: value, + }) + } + /> + + + + + + + + + )} + {!!target && diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/types.ts b/tgui/packages/tgui/interfaces/ModifyRobot/types.ts index d5bb7aeadf..5191e38422 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/types.ts +++ b/tgui/packages/tgui/interfaces/ModifyRobot/types.ts @@ -24,9 +24,13 @@ export type Data = { has_inherent_laws: number; has_supplied_laws: number; isAI: BooleanLike; + isMalf: BooleanLike; + isSlaved: string | null; channel: string; channels: { channel: string }[]; law_sets: law_pack[]; + active_ais: DropdownEntry[]; + selected_ai: string | null; }; export type DropdownEntry = { @@ -38,6 +42,7 @@ export type Target = { name: string; ckey: string; module: string; + emagged: BooleanLike; active: BooleanLike; crisis_override: BooleanLike; active_restrictions: string[]; diff --git a/tools/build/build.js b/tools/build/build.js index 5f1a101940..ea668b6608 100644 --- a/tools/build/build.js +++ b/tools/build/build.js @@ -417,6 +417,20 @@ export const TguiBenchTarget = new Juke.Target({ executes: () => yarn('tgui:bench'), }); +export const TguiPrettierFix = new Juke.Target({ + dependsOn: [YarnTarget], + executes: () => yarn('tgui:prettier-fix'), +}); + +export const TguiEslintFix = new Juke.Target({ + dependsOn: [YarnTarget], + executes: () => yarn('tgui:eslint-fix'), +}); + +export const TguiFix = new Juke.Target({ + dependsOn: [TguiPrettierFix, TguiEslintFix], +}); + export const TestTarget = new Juke.Target({ dependsOn: [DmTestTarget, TguiTestTarget], }); diff --git a/vorestation.dme b/vorestation.dme index a2e7d000d8..99e1d1f7da 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3006,6 +3006,7 @@ #include "code\modules\mob\living\carbon\human\species\station\prometheans.dm" #include "code\modules\mob\living\carbon\human\species\station\prometheans_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\prommie_blob.dm" +#include "code\modules\mob\living\carbon\human\species\station\replicant_crew.dm" #include "code\modules\mob\living\carbon\human\species\station\station.dm" #include "code\modules\mob\living\carbon\human\species\station\station_special_abilities_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\station_special_vr.dm"