From 11cbbba018e861237ce4bed73f19b58874c22042 Mon Sep 17 00:00:00 2001 From: Sol N <116288367+flowercuco@users.noreply.github.com> Date: Wed, 5 Apr 2023 16:54:22 +0100 Subject: [PATCH] Replaceable Traitor Uplinks (#74315) ## About The Pull Request Following [from the suggestion in this hackmd ](https://hackmd.io/IkDWWkpfQa2lkdevsnLqhA?view#Replacement-Uplinks)with a few twists of my own, I have made a method for traitors to acquire a replacement traitor uplink that has its own set of flaws and limiters in order to prevent abuse. ![ZC0WYDFRzc](https://user-images.githubusercontent.com/116288367/228101432-9352390b-9538-4c62-8dc4-55e2e798c466.png) The basic pitch is as follows, all traitors now start with a new, crafting recipe exclusive to them, it costs a teleport beacon, a bluespace crystal, and some iron and cable coil, and then allows them to build a static, dense machine that they can synchronize with, which allows the machine to know what signal it should be looking out for from the traitor. ![dreamseeker_iErI3vju0C](https://user-images.githubusercontent.com/116288367/228094286-c2bca198-82cd-4ce0-a4a7-c26c24a9327c.gif) The traitor then uses any radio, sets it to the frequency that has been added to their static antagonist ui, and then speaks their codeword, also in the ui, and then a few things happen. ![dreamseeker_gbzSFeHuS5](https://user-images.githubusercontent.com/116288367/228094354-a649c713-f013-4ac2-b8d7-0754a852f987.gif) Most obviously, they get a replacement uplink that is in the conspicuous shape of the nukie or lone op uplink. This uplink can be unlocked by speaking your replacement codeword to it again, it remembers your previous TC amount and locks all other uplinks associated with your uplink handler(they can then be unlocked as normal). It also destroys any other replacement uplinks associated with your uplink handler, which means you can never have more than one replacement uplink. This means that if your uplink has been confiscated and you left it unlocked, if it hasn't been emptied out you can continue from where you were, and if you want to get back on the TC grind you won't lose the new TC to whoever stole your uplink. Of course, the new uplink can not be locked, so you have to be more careful with it or buy an uplink implant and destroy it. You can destroy your replacement uplink with a screwdriver right click, same for the machine. Additionally, the Syndicate Uplink Beacon has another quirk to it, which is that the teleporter beacon used to create it is intact, which means people eagle eyed on the teleporter console could go find you, not to mention that if you use an existing teleporter beacon, someone might notice its gone missing... oh also while making the replacement uplink i found a bug caused by a recent pr that broke debug uplinks due to them not having a purchase log. thats fixed too ## Why It's Good For The Game It can be easy to lose your uplink, and as a traitor having your uplink confiscated, even if it is locked, feels really bad. While the old traitor objectives were added back to prog traitor to prevent situations where a confiscated uplink meant that you were completely aimless, I think that having a backup solution would be good for more inexperienced traitors or for ones who get unlucky. Hopefully this is generally balanced well enough but there are a few levers that can be pulled, but overall I do think that making it so that traitors can always get a chance to get an uplink and do some objectives is good for the game. I like the idea of someone getting perma'd, someone breaks them out, they both craft a new uplink beacon, and then they go back and get the traitors old gear with stuff they got from the new uplink, I think that's a cool possibility to throw into the sandbox. ## Changelog :cl: add: Added new syndicate uplink beacon and associated systems that allow you to get a replacement traitor uplink fix: Debug & nukie uplinks no longer runtime and work properly again /:cl: --- code/__DEFINES/dcs/signals/signals_traitor.dm | 2 + code/__DEFINES/radio.dm | 2 + code/datums/components/crafting/crafting.dm | 9 +- code/datums/components/crafting/structures.dm | 14 +++ code/datums/components/uplink.dm | 39 +++++- .../datums/looping_sounds/machinery_sounds.dm | 13 ++ .../structures/syndicate_uplink_beacon.dm | 114 ++++++++++++++++++ .../antagonists/traitor/datum_traitor.dm | 15 +++ code/modules/uplink/uplink_devices.dm | 52 ++++++-- icons/obj/machines/telecomms.dmi | Bin 22336 -> 25530 bytes tgstation.dme | 1 + .../tgui/interfaces/AntagInfoTraitor.tsx | 26 +++- 12 files changed, 272 insertions(+), 15 deletions(-) create mode 100644 code/game/objects/structures/syndicate_uplink_beacon.dm diff --git a/code/__DEFINES/dcs/signals/signals_traitor.dm b/code/__DEFINES/dcs/signals/signals_traitor.dm index 66aebd7ae95..1728ef8c679 100644 --- a/code/__DEFINES/dcs/signals/signals_traitor.dm +++ b/code/__DEFINES/dcs/signals/signals_traitor.dm @@ -3,6 +3,8 @@ /// Called whenever the uplink handler receives any sort of update. Used by uplinks to update their UI. No arguments passed #define COMSIG_UPLINK_HANDLER_ON_UPDATE "uplink_handler_on_update" +/// Sent from the uplink handler when the traitor uses the syndicate uplink beacon to order a replacement uplink. +#define COMSIG_UPLINK_HANDLER_REPLACEMENT_ORDERED "uplink_handler_replacement_ordered" /// Called before the traitor objective is generated #define COMSIG_TRAITOR_OBJECTIVE_PRE_GENERATE "traitor_objective_pre_generate" diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index 9644a1c09f2..e75ff9ea9eb 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -90,6 +90,8 @@ #define FREQ_SIGNALER 1457 // the default for new signalers #define FREQ_COMMON 1459 // Common comms frequency, dark green +#define MIN_UNUSED_FREQ 1461 // Prevents rolling AI Private or Common + #define MAX_FREQ 1489 // ------------------------------------------------------ #define MAX_FREE_FREQ 1599 // ------------------------------------------------- diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 51f74fd389e..1b50b4e7b63 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -605,10 +605,15 @@ //Mind helpers -/datum/mind/proc/teach_crafting_recipe(R) +/// proc that teaches user a non-standard crafting recipe +/datum/mind/proc/teach_crafting_recipe(recipe) if(!learned_recipes) learned_recipes = list() - learned_recipes |= R + learned_recipes |= recipe + +/// proc that makes user forget a specific crafting recipe +/datum/mind/proc/forget_crafting_recipe(recipe) + learned_recipes -= recipe /datum/mind/proc/has_crafting_recipe(mob/user, potential_recipe) if(!learned_recipes) diff --git a/code/datums/components/crafting/structures.dm b/code/datums/components/crafting/structures.dm index 4a56852ecd5..2cbe2c35302 100644 --- a/code/datums/components/crafting/structures.dm +++ b/code/datums/components/crafting/structures.dm @@ -60,3 +60,17 @@ /obj/item/stack/cable_coil = 10, ) category = CAT_STRUCTURE + +/datum/crafting_recipe/syndicate_uplink_beacon + name = "Syndicate Uplink Beacon" + result = /obj/structure/syndicate_uplink_beacon + tool_behaviors = list(TOOL_SCREWDRIVER) + always_available = FALSE + time = 6 SECONDS + reqs = list( + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/cable_coil = 5, + /obj/item/beacon = 1, + /obj/item/stack/ore/bluespace_crystal = 1, + ) + category = CAT_STRUCTURE diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 50907528ce4..eea548a7551 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -65,6 +65,8 @@ RegisterSignal(parent, COMSIG_RADIO_NEW_MESSAGE, PROC_REF(new_message)) else if(istype(parent, /obj/item/pen)) RegisterSignal(parent, COMSIG_PEN_ROTATED, PROC_REF(pen_rotation)) + else if(istype(parent, /obj/item/uplink/replacement)) + RegisterSignal(parent, COMSIG_MOVABLE_HEAR, PROC_REF(on_heard)) if(owner) src.owner = owner @@ -86,6 +88,7 @@ else uplink_handler = uplink_handler_override RegisterSignal(uplink_handler, COMSIG_UPLINK_HANDLER_ON_UPDATE, PROC_REF(handle_uplink_handler_update)) + RegisterSignal(uplink_handler, COMSIG_UPLINK_HANDLER_REPLACEMENT_ORDERED, PROC_REF(handle_uplink_replaced)) if(!lockable) active = TRUE locked = FALSE @@ -96,6 +99,19 @@ SIGNAL_HANDLER SStgui.update_uis(src) +/// When a new uplink is made via the syndicate beacon it locks all lockable uplinks and destroys replacement uplinks +/datum/component/uplink/proc/handle_uplink_replaced() + SIGNAL_HANDLER + if(lockable) + lock_uplink() + if(!istype(parent, /obj/item/uplink/replacement)) + return + var/obj/item/uplink_item = parent + do_sparks(number = 3, cardinal_only = FALSE, source = uplink_item) + uplink_item.visible_message(span_warning("The [uplink_item] suddenly combusts!"), vision_distance = COMBAT_MESSAGE_RANGE) + new /obj/effect/decal/cleanable/ash(get_turf(uplink_item)) + qdel(uplink_item) + /// Adds telecrystals to the uplink. It is bad practice to use this outside of the component itself. /datum/component/uplink/proc/add_telecrystals(telecrystals_added) set_telecrystals(uplink_handler.telecrystals + telecrystals_added) @@ -236,7 +252,7 @@ data["extra_purchasable_stock"] = extra_purchasable_stock data["current_stock"] = remaining_stock data["shop_locked"] = uplink_handler.shop_locked - data["purchased_items"] = length(uplink_handler.purchase_log.purchase_log) + data["purchased_items"] = length(uplink_handler.purchase_log?.purchase_log) return data /datum/component/uplink/ui_static_data(mob/user) @@ -277,9 +293,7 @@ if("lock") if(!lockable) return TRUE - active = FALSE - locked = TRUE - SStgui.close_uis(src) + lock_uplink() if(!uplink_handler.has_objectives) return TRUE @@ -321,6 +335,12 @@ uplink_handler.abort_objective(objective) return TRUE +/// Proc that locks uplinks +/datum/component/uplink/proc/lock_uplink() + active = FALSE + locked = TRUE + SStgui.close_uis(src) + // Implant signal responses /datum/component/uplink/proc/implant_activation() SIGNAL_HANDLER @@ -459,6 +479,17 @@ return returnable_code +/// Proc that unlocks a locked replacement uplink when it hears the unlock code from their datum +/datum/component/uplink/proc/on_heard(datum/source, list/hearing_args) + SIGNAL_HANDLER + if(!locked) + return + if(!findtext(hearing_args[HEARING_RAW_MESSAGE], unlock_code)) + return + var/atom/replacement_uplink = parent + locked = FALSE + replacement_uplink.balloon_alert_to_viewers("beep", vision_distance = COMBAT_MESSAGE_RANGE) + /datum/component/uplink/proc/failsafe(mob/living/carbon/user) if(!parent) return diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm index 9287f927333..1e8ce73e992 100644 --- a/code/datums/looping_sounds/machinery_sounds.dm +++ b/code/datums/looping_sounds/machinery_sounds.dm @@ -132,3 +132,16 @@ mid_sounds = list('sound/effects/bubbles2.ogg' = 1) mid_length = 7 SECONDS volume = 25 + +/datum/looping_sound/typing + mid_sounds = list( + 'sound/machines/terminal_button01.ogg' = 1, + 'sound/machines/terminal_button02.ogg' = 1, + 'sound/machines/terminal_button03.ogg' = 1, + 'sound/machines/terminal_button04.ogg' = 1, + 'sound/machines/terminal_button05.ogg' = 1, + 'sound/machines/terminal_button06.ogg' = 1, + 'sound/machines/terminal_button07.ogg' = 1, + 'sound/machines/terminal_button08.ogg' = 1, + ) + mid_length = 0.3 SECONDS diff --git a/code/game/objects/structures/syndicate_uplink_beacon.dm b/code/game/objects/structures/syndicate_uplink_beacon.dm new file mode 100644 index 00000000000..f4d4ea6fe64 --- /dev/null +++ b/code/game/objects/structures/syndicate_uplink_beacon.dm @@ -0,0 +1,114 @@ +/// Device that traitors can craft in order to be sent a new, undisguised uplink +/obj/structure/syndicate_uplink_beacon + name = "suspicious beacon" + icon = 'icons/obj/machines/telecomms.dmi' + icon_state = "relay_traitor" + desc = "This ramshackle device seems capable of recieving and sending signals for some nefarious purpose." + density = TRUE + anchored = TRUE + /// Traitor's code that they speak into the radio + var/uplink_code = "" + /// weakref to person who is going to use the beacon to get a replacement uplink + var/datum/weakref/owner + /// while constructed the teleport beacon is still active + var/obj/item/beacon/teleport_beacon + /// Radio that the device needs to listen to the codeword from the traitor + var/obj/item/radio/listening_radio + /// prevents traitor from activating teleport_beacon proc too much in a small period of time + COOLDOWN_DECLARE(beacon_cooldown) + +/obj/structure/syndicate_uplink_beacon/Initialize(mapload) + . = ..() + register_context() + + var/static/list/tool_behaviors = list( + TOOL_SCREWDRIVER = list( + SCREENTIP_CONTEXT_RMB = "Deconstruct", + ), + ) + AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) + listening_radio = new(src) + listening_radio.canhear_range = 0 + teleport_beacon = new(src) + +/obj/structure/syndicate_uplink_beacon/attack_hand(mob/living/user, list/modifiers) + if(!IS_TRAITOR(user)) + balloon_alert(user, "don't know how to use!") + return + if(IS_WEAKREF_OF(owner, user)) + balloon_alert(user, "already synchronized to you!") + return + if(owner != null) + balloon_alert(user, "already claimed!") + return + var/datum/looping_sound/typing/typing_sounds = new(src, start_immediately = TRUE) + balloon_alert(user, "synchronizing...") + if(!do_after(user = user, delay = 3 SECONDS, target = src, interaction_key = REF(src))) + typing_sounds.stop() + return + typing_sounds.stop() + probe_traitor(user) + +/obj/structure/syndicate_uplink_beacon/screwdriver_act_secondary(mob/living/user, obj/item/tool) + tool.play_tool_sound(src) + balloon_alert(user, "deconstructing...") + if (!do_after(user, 5 SECONDS, target = src)) + return FALSE + var/turf/beacon_tile = get_turf(src) + new /obj/item/stack/sheet/iron/five(beacon_tile) + new /obj/item/stack/cable_coil/five(beacon_tile) + teleport_beacon.forceMove(beacon_tile) + teleport_beacon = null + qdel(src) + return TRUE + +/obj/structure/syndicate_uplink_beacon/Destroy() + QDEL_NULL(listening_radio) + if(teleport_beacon) + QDEL_NULL(teleport_beacon) + return ..() + +/// Proc reads the user, sets radio to the correct frequency and starts to listen for the replacement uplink code +/obj/structure/syndicate_uplink_beacon/proc/probe_traitor(mob/living/user) + owner = WEAKREF(user) + var/datum/antagonist/traitor/traitor_datum = user.mind.has_antag_datum(/datum/antagonist/traitor) + + uplink_code = traitor_datum.replacement_uplink_code + listening_radio.set_frequency(traitor_datum.replacement_uplink_frequency) + become_hearing_sensitive() + +/obj/structure/syndicate_uplink_beacon/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods, message_range) + if(ismob(speaker) || radio_freq != listening_radio.get_frequency()) + return + if(!findtext(message, uplink_code)) + return + teleport_uplink() + +/// Proc uses owners uplink handler to create replacement uplink and then lock or destroy their other uplinks +/obj/structure/syndicate_uplink_beacon/proc/teleport_uplink() + if(!COOLDOWN_FINISHED(src, beacon_cooldown)) + return + COOLDOWN_START(src, beacon_cooldown, 10 MINUTES) + + var/mob/living/resolved_owner = owner.resolve() + if(isnull(resolved_owner)) + return + + var/datum/antagonist/traitor/traitor_datum = resolved_owner.mind.has_antag_datum(/datum/antagonist/traitor) + if(isnull(traitor_datum)) + return + + var/datum/uplink_handler/uplink_handler = traitor_datum.uplink_handler + + SEND_SIGNAL(uplink_handler, COMSIG_UPLINK_HANDLER_REPLACEMENT_ORDERED) + new /obj/item/uplink/replacement(get_turf(src), /*owner = */resolved_owner, /*tc_amount = */0, /*uplink_handler_override = */uplink_handler) + flick("relay_traitor_activate", src) + do_sparks(number = 5, cardinal_only = FALSE, source = src) + log_traitor("[key_name(resolved_owner)] acquired a replacement uplink via the syndicate uplink beacon.") + +// Adds screentips +/obj/structure/syndicate_uplink_beacon/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(held_item || !IS_TRAITOR(user)) + return NONE + context[SCREENTIP_CONTEXT_LMB] = "Synchronize with beacon" + return CONTEXTUAL_SCREENTIP_SET diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 2d57748f754..486e6e37586 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -18,6 +18,10 @@ var/should_give_codewords = TRUE ///give this traitor an uplink? var/give_uplink = TRUE + /// Code that allows traitor to get a replacement uplink + var/replacement_uplink_code = "" + /// Radio frequency that traitor must speak on to get a replacement uplink + var/replacement_uplink_frequency = "" ///if TRUE, this traitor will always get hijacking as their final objective var/is_hijacker = FALSE @@ -47,6 +51,7 @@ if(give_uplink) owner.give_uplink(silent = TRUE, antag_datum = src) + generate_replacement_codes() var/datum/component/uplink/uplink = owner.find_syndicate_uplink() uplink_ref = WEAKREF(uplink) @@ -82,6 +87,8 @@ pick_employer() + owner.teach_crafting_recipe(/datum/crafting_recipe/syndicate_uplink_beacon) + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) return ..() @@ -139,8 +146,14 @@ result += "Force add objective
" return result +/// proc that generates the traitors replacement uplink code and radio frequency +/datum/antagonist/traitor/proc/generate_replacement_codes() + replacement_uplink_code = "[pick(GLOB.phonetic_alphabet)] [rand(10,99)]" + replacement_uplink_frequency = sanitize_frequency(rand(MIN_UNUSED_FREQ, MAX_FREQ), free = FALSE, syndie = FALSE) + /datum/antagonist/traitor/on_removal() owner.special_role = null + owner.forget_crafting_recipe(/datum/crafting_recipe/syndicate_uplink_beacon) return ..() /datum/antagonist/traitor/proc/pick_employer() @@ -258,6 +271,8 @@ data["theme"] = traitor_flavor["ui_theme"] data["code"] = uplink?.unlock_code data["failsafe_code"] = uplink?.failsafe_code + data["replacement_code"] = replacement_uplink_code + data["replacement_frequency"] = format_frequency(replacement_uplink_frequency) data["intro"] = traitor_flavor["introduction"] data["allies"] = traitor_flavor["allies"] data["goal"] = traitor_flavor["goal"] diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm index c9c2fa3174d..c2409773ada 100644 --- a/code/modules/uplink/uplink_devices.dm +++ b/code/modules/uplink/uplink_devices.dm @@ -23,15 +23,25 @@ /// The uplink flag for this type. /// See [`code/__DEFINES/uplink.dm`] var/uplink_flag = UPLINK_TRAITORS + /// If the uplink is lockable, which defaults to false which most subtypes of this item are for debug reasons + var/lockable_uplink = FALSE -/obj/item/uplink/Initialize(mapload, owner, tc_amount = 20) +/obj/item/uplink/Initialize(mapload, owner, tc_amount = 20, datum/uplink_handler/uplink_handler_override = null) . = ..() - AddComponent(/datum/component/uplink, owner, FALSE, TRUE, uplink_flag, tc_amount) + AddComponent(\ + /datum/component/uplink, \ + owner = owner, \ + lockable = lockable_uplink, \ + enabled = TRUE, \ + uplink_flag = uplink_flag, \ + starting_tc = tc_amount, \ + uplink_handler_override = uplink_handler_override, \ + ) /obj/item/uplink/debug name = "debug uplink" -/obj/item/uplink/debug/Initialize(mapload, owner, tc_amount = 9000) +/obj/item/uplink/debug/Initialize(mapload, owner, tc_amount = 9000, datum/uplink_handler/uplink_handler_override = null) . = ..() var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) hidden_uplink.name = "debug uplink" @@ -44,7 +54,7 @@ name = "debug nuclear uplink" uplink_flag = UPLINK_NUKE_OPS -/obj/item/uplink/nuclear/debug/Initialize(mapload, owner, tc_amount = 9000) +/obj/item/uplink/nuclear/debug/Initialize(mapload, owner, tc_amount = 9000, datum/uplink_handler/uplink_handler_override = null) . = ..() var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) hidden_uplink.name = "debug nuclear uplink" @@ -65,17 +75,45 @@ name = "dusty radio" desc = "A dusty looking radio." -/obj/item/uplink/old/Initialize(mapload, owner, tc_amount = 10) +/obj/item/uplink/old/Initialize(mapload, owner, tc_amount = 10, datum/uplink_handler/uplink_handler_override = null) . = ..() var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) hidden_uplink.name = "dusty radio" +// Uplink subtype used as replacement uplink +/obj/item/uplink/replacement + lockable_uplink = TRUE + +/obj/item/uplink/replacement/Initialize(mapload, owner, tc_amount = 10, datum/uplink_handler/uplink_handler_override = null) + . = ..() + var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) + var/mob/living/replacement_needer = owner + if(!istype(replacement_needer)) + return + var/datum/antagonist/traitor/traitor_datum = replacement_needer?.mind.has_antag_datum(/datum/antagonist/traitor) + hidden_uplink.unlock_code = traitor_datum?.replacement_uplink_code + become_hearing_sensitive() + +/obj/item/uplink/replacement/screwdriver_act_secondary(mob/living/user, obj/item/tool) + tool.play_tool_sound(src) + balloon_alert(user, "deconstructing...") + if (!do_after(user, 3 SECONDS, target = src)) + return FALSE + qdel(src) + return TRUE + +/obj/item/uplink/replacement/examine(mob/user) + . = ..() + if(!IS_TRAITOR(user)) + return + . += span_notice("You can destroy this device with a screwdriver.") + // Multitool uplink -/obj/item/multitool/uplink/Initialize(mapload, owner, tc_amount = 20) +/obj/item/multitool/uplink/Initialize(mapload, owner, tc_amount = 20, datum/uplink_handler/uplink_handler_override = null) . = ..() AddComponent(/datum/component/uplink, owner, FALSE, TRUE, UPLINK_TRAITORS, tc_amount) // Pen uplink -/obj/item/pen/uplink/Initialize(mapload, owner, tc_amount = 20) +/obj/item/pen/uplink/Initialize(mapload, owner, tc_amount = 20, datum/uplink_handler/uplink_handler_override = null) . = ..() AddComponent(/datum/component/uplink, owner, TRUE, FALSE, UPLINK_TRAITORS, tc_amount) diff --git a/icons/obj/machines/telecomms.dmi b/icons/obj/machines/telecomms.dmi index 93bb9c477aa946ad70cd929fe4cf8004abad6df8..ddce8a96a933b8f7d490869f13b7e3c1e697afe4 100644 GIT binary patch literal 25530 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 diff --git a/tgstation.dme b/tgstation.dme index 9caadb0df95..57e8cdf1b5c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2135,6 +2135,7 @@ #include "code\game\objects\structures\spawner.dm" #include "code\game\objects\structures\spirit_board.dm" #include "code\game\objects\structures\stairs.dm" +#include "code\game\objects\structures\syndicate_uplink_beacon.dm" #include "code\game\objects\structures\table_frames.dm" #include "code\game\objects\structures\tables_racks.dm" #include "code\game\objects\structures\tank_dispenser.dm" diff --git a/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx b/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx index cd79be0621d..07d1e1beff3 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx @@ -35,6 +35,8 @@ type Info = { intro: string; code: string; failsafe_code: string; + replacement_code: string; + replacement_frequency: string; has_uplink: BooleanLike; uplink_intro: string; uplink_unlock_info: string; @@ -120,8 +122,15 @@ const EmployerSection = (props, context) => { const UplinkSection = (props, context) => { const { data } = useBackend(context); - const { has_uplink, uplink_intro, uplink_unlock_info, code, failsafe_code } = - data; + const { + has_uplink, + uplink_intro, + uplink_unlock_info, + code, + failsafe_code, + replacement_code, + replacement_frequency, + } = data; return (
@@ -149,6 +158,19 @@ const UplinkSection = (props, context) => { )} +
+
+ If you lose your uplink, you can craft a Syndicate Uplink Beacon and + then speak{' '} + + {replacement_code} + {' '} + on radio frequency{' '} + + {replacement_frequency} + {' '} + after synchronizing with the beacon. +
); };