From 14ed7f5abbfd0758b2c402737680332745f0a522 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sun, 15 Sep 2024 20:57:00 +0200 Subject: [PATCH] Automated announcement systems now announce researched nodes. (#86093) ## About The Pull Request The idea was born from a small conversation about bepis nodes having low visibility, which somehow degressed into the idea of announcing researched nodes to the channels of the interested departments thru the announcement system machine, which is what I'm doing here, while also adding documentation, defines and purging some, not all, instances of camel cases from announcement_system.dm. Oh, by the by, like the arrival and new head arrival messages, it can be customized or disabled by interacting with the announcement system. ## Why It's Good For The Game I think it's helpful to let players know when the research of their dept is researched, and I think it's kinda interesting to announce bepis tech on common like it's some hot stuff while it actually isn't just because it's often missed out and miscellaneous. ## Changelog :cl: add: Automated announcement systems now announce researched nodes to their respective departments. You can stop this by either disabling the announcement systems or by using a multitool on the circuitboard of the console you're researching nodes from. /:cl: --- code/__DEFINES/machines.dm | 9 ++ code/__HELPERS/game.dm | 12 ++- code/game/machinery/announcement_system.dm | 85 ++++++++++++------- .../circuitboards/computer_circuitboards.dm | 23 +++++ code/modules/jobs/job_types/_job.dm | 18 +++- code/modules/research/designs.dm | 6 +- code/modules/research/rdconsole.dm | 7 +- code/modules/research/techweb/_techweb.dm | 6 +- .../modules/research/techweb/_techweb_node.dm | 30 ++++++- .../research/techweb/nodes/alien_nodes.dm | 3 + .../research/techweb/nodes/atmos_nodes.dm | 5 ++ .../research/techweb/nodes/bepis_nodes.dm | 11 +++ .../research/techweb/nodes/biology_nodes.dm | 4 + .../research/techweb/nodes/cyborg_nodes.dm | 13 +++ .../research/techweb/nodes/engi_nodes.dm | 6 ++ .../research/techweb/nodes/mech_nodes.dm | 12 +++ .../research/techweb/nodes/medbay_nodes.dm | 3 + .../research/techweb/nodes/mining_nodes.dm | 5 ++ .../research/techweb/nodes/modsuit_nodes.dm | 8 ++ .../research/techweb/nodes/research_nodes.dm | 5 ++ .../research/techweb/nodes/robo_nodes.dm | 2 + .../research/techweb/nodes/security_nodes.dm | 7 ++ .../research/techweb/nodes/service_nodes.dm | 3 + .../research/techweb/nodes/surgery_nodes.dm | 4 + .../modules/research/techweb/techweb_types.dm | 4 +- .../tgui/interfaces/AutomatedAnnouncement.tsx | 49 ++++++++++- 26 files changed, 292 insertions(+), 48 deletions(-) diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 9d2cf451c62..8dd8db3fd06 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -135,6 +135,15 @@ /// Max length of a status line in the status display #define MAX_STATUS_LINE_LENGTH 40 +///Define for automated system arrival announcement +#define AUTO_ANNOUNCE_ARRIVAL "ARRIVAL" +///Define for automated system announcement when a head of staff arrives +#define AUTO_ANNOUNCE_NEWHEAD "NEWHEAD" +///Define for automated system announcement for when the arrival shuttle is broken +#define AUTO_ANNOUNCE_ARRIVALS_BROKEN "ARRIVALS_BROKEN" +///Define for automated system announcement for researched nodes +#define AUTO_ANNOUNCE_NODE "NODE" + /// Blank Status Display #define SD_BLANK 0 /// Shows the emergency shuttle timer diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index c68b450c2c2..699ae8aa72c 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -243,8 +243,16 @@ if(!(character.mind.assigned_role.job_flags & JOB_ANNOUNCE_ARRIVAL)) return - var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems) - announcer.announce("ARRIVAL", character.real_name, rank, list()) //make the list empty to make it announce it in common + var/obj/machinery/announcement_system/announcer + var/list/available_machines = list() + for(var/obj/machinery/announcement_system/announce as anything in GLOB.announcement_systems) + if(announce.arrival_toggle) + available_machines += announce + break + if(!length(available_machines)) + return + announcer = pick(available_machines) + announcer.announce(AUTO_ANNOUNCE_ARRIVAL, character.real_name, rank, list()) //make the list empty to make it announce it in common ///Check if the turf pressure allows specialized equipment to work /proc/lavaland_equipment_pressure_check(turf/turf_to_check) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 1700abb0af1..c9e66c89c95 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -16,16 +16,26 @@ GLOBAL_LIST_EMPTY(announcement_systems) circuit = /obj/item/circuitboard/machine/announcement_system + ///The headset that we use for broadcasting var/obj/item/radio/headset/radio + ///The message that we send when someone is joining. var/arrival = "%PERSON has signed up as %RANK" - var/arrivalToggle = 1 + ///Whether the arrival message is sent + var/arrival_toggle = TRUE + ///The message that we send when a department head arrives. var/newhead = "%PERSON, %RANK, is the department head." - var/newheadToggle = 1 + ///Whether the newhead message is sent. + var/newhead_toggle = TRUE var/greenlight = "Light_Green" var/pinklight = "Light_Pink" var/errorlight = "Error_Red" + ///If true, researched nodes will be announced to the appropriate channels + var/announce_research_node = TRUE + /// The text that we send when announcing researched nodes. + var/node_message = "The '%NODE' techweb node has been researched" + /obj/machinery/announcement_system/Initialize(mapload) . = ..() GLOB.announcement_systems += src @@ -41,10 +51,10 @@ GLOBAL_LIST_EMPTY(announcement_systems) /obj/machinery/announcement_system/update_overlays() . = ..() - if(arrivalToggle) + if(arrival_toggle) . += greenlight - if(newheadToggle) + if(newhead_toggle) . += pinklight if(machine_stat & BROKEN) @@ -78,18 +88,25 @@ GLOBAL_LIST_EMPTY(announcement_systems) str = replacetext(str, "%RANK", "[rank]") return str -/obj/machinery/announcement_system/proc/announce(message_type, user, rank, list/channels) +/obj/machinery/announcement_system/proc/announce(message_type, target, rank, list/channels) if(!is_operational) return var/message - if(message_type == "ARRIVAL" && arrivalToggle) - message = CompileText(arrival, user, rank) - else if(message_type == "NEWHEAD" && newheadToggle) - message = CompileText(newhead, user, rank) - else if(message_type == "ARRIVALS_BROKEN") - message = "The arrivals shuttle has been damaged. Docking for repairs..." + switch(message_type) + if(AUTO_ANNOUNCE_ARRIVAL) + if(!arrival_toggle) + message = CompileText(arrival, target, rank) + return + if(AUTO_ANNOUNCE_NEWHEAD) + if(!newhead_toggle) + message = CompileText(newhead, target, rank) + return + if(AUTO_ANNOUNCE_ARRIVALS_BROKEN) + message = "The arrivals shuttle has been damaged. Docking for repairs..." + if(AUTO_ANNOUNCE_NODE) + message = replacetext(node_message, "%NODE", target) broadcast(message, channels) @@ -118,9 +135,11 @@ GLOBAL_LIST_EMPTY(announcement_systems) /obj/machinery/announcement_system/ui_data() var/list/data = list() data["arrival"] = arrival - data["arrivalToggle"] = arrivalToggle + data["arrivalToggle"] = arrival_toggle data["newhead"] = newhead - data["newheadToggle"] = newheadToggle + data["newheadToggle"] = newhead_toggle + data["node_message"] = node_message + data["node_toggle"] = announce_research_node return data /obj/machinery/announcement_system/ui_act(action, param) @@ -135,25 +154,28 @@ GLOBAL_LIST_EMPTY(announcement_systems) return switch(action) if("ArrivalText") - var/NewMessage = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) - if(!usr.can_perform_action(src, ALLOW_SILICON_REACH)) - return - if(NewMessage) - arrival = NewMessage - usr.log_message("updated the arrivals announcement to: [NewMessage]", LOG_GAME) + var/new_message = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) + if(new_message) + arrival = new_message + usr.log_message("updated the arrivals announcement to: [new_message]", LOG_GAME) if("NewheadText") - var/NewMessage = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) - if(!usr.can_perform_action(src, ALLOW_SILICON_REACH)) - return - if(NewMessage) - newhead = NewMessage - usr.log_message("updated the head announcement to: [NewMessage]", LOG_GAME) - if("NewheadToggle") - newheadToggle = !newheadToggle + var/new_message = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) + if(new_message) + newhead = new_message + usr.log_message("updated the head announcement to: [new_message]", LOG_GAME) + if("node_message") + var/new_message = trim(html_encode(param["new_text"]), MAX_MESSAGE_LEN) + if(new_message) + node_message = new_message + usr.log_message("updated the researched node announcement to: [node_message]", LOG_GAME) + if("newhead_toggle") + newhead_toggle = !newhead_toggle update_appearance() - if("ArrivalToggle") - arrivalToggle = !arrivalToggle + if("arrivalToggle") + arrival_toggle = !arrival_toggle update_appearance() + if("node_toggle") + announce_research_node = !announce_research_node add_fingerprint(usr) /obj/machinery/announcement_system/attack_robot(mob/living/silicon/user) @@ -173,6 +195,11 @@ GLOBAL_LIST_EMPTY(announcement_systems) arrival = pick("#!@%ERR-34%2 CANNOT LOCAT@# JO# F*LE!", "CRITICAL ERROR 99.", "ERR)#: DA#AB@#E NOT F(*ND!") newhead = pick("OV#RL()D: \[UNKNOWN??\] DET*#CT)D!", "ER)#R - B*@ TEXT F*O(ND!", "AAS.exe is not responding. NanoOS is searching for a solution to the problem.") + node_message = pick(list( + replacetext(/obj/machinery/announcement_system::node_message, "%NODE", /datum/techweb_node/mech_clown::display_name), + "R/NT1M3 A= ANNOUN-*#nt_SY!?EM.dm, LI%£ 86: N=0DE NULL!", + "BEPIS BEPIS BEPIS", + )) /obj/machinery/announcement_system/emp_act(severity) . = ..() diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 41950561571..9c3cde9f725 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -403,6 +403,29 @@ name = "R&D Console" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/rdconsole + var/silence_announcements = FALSE + +/obj/item/circuitboard/computer/rdconsole/examine(mob/user) + . = ..() + . += span_info("The board is configured to [silence_announcements ? "silence" : "announce"] researched nodes on radio.") + . += span_notice("The board mode can be changed with a [EXAMINE_HINT("multitool")].") + +/obj/item/circuitboard/computer/rdconsole/multitool_act(mob/living/user) + . = ..() + if(obj_flags & EMAGGED) + balloon_alert(user, "board mode is broken!") + return + silence_announcements = !silence_announcements + balloon_alert(user, "announcements [silence_announcements ? "enabled" : "disabled"]") + +/obj/item/circuitboard/computer/rdconsole/emag_act(mob/user, obj/item/card/emag/emag_card) + if (obj_flags & EMAGGED) + return FALSE + + obj_flags |= EMAGGED + silence_announcements = FALSE + to_chat(user, span_notice("You overload the node announcement chip, forcing every node to be announced on the common channel.")) + return TRUE /obj/item/circuitboard/computer/rdservercontrol name = "R&D Server Control" diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index a4f4157c74f..41ff0c058ce 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -220,10 +220,20 @@ dna.species.pre_equip_species_outfit(equipping, src, visual_only) equip_outfit_and_loadout(equipping.get_outfit(consistent), player_client?.prefs, visual_only) -/datum/job/proc/announce_head(mob/living/carbon/human/H, channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels. - if(H && GLOB.announcement_systems.len) - //timer because these should come after the captain announcement - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), CALLBACK(pick(GLOB.announcement_systems), TYPE_PROC_REF(/obj/machinery/announcement_system, announce), "NEWHEAD", H.real_name, H.job, channels), 1)) +/datum/job/proc/announce_head(mob/living/carbon/human/human, channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels. + if(!human) + return + var/obj/machinery/announcement_system/system + var/list/available_machines = list() + for(var/obj/machinery/announcement_system/announce as anything in GLOB.announcement_systems) + if(announce.newhead_toggle) + available_machines += announce + break + if(!length(available_machines)) + return + system = pick(available_machines) + //timer because these should come after the captain announcement + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), CALLBACK(system, TYPE_PROC_REF(/obj/machinery/announcement_system, announce), AUTO_ANNOUNCE_NEWHEAD, human.real_name, human.job, channels), 1)) //If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1 /datum/job/proc/player_old_enough(client/player) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 0420c732637..ac90479afc3 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -113,7 +113,7 @@ other types of metals and chemistry for reagents). * Args: * - stored_research - The techweb that's storing us. */ -/obj/item/disk/design_disk/proc/on_upload(datum/techweb/stored_research) +/obj/item/disk/design_disk/proc/on_upload(datum/techweb/stored_research, atom/research_source) return /obj/item/disk/design_disk/bepis @@ -134,9 +134,9 @@ other types of metals and chemistry for reagents). blueprints += new_entry ///Unhide and research our node so we show up in the R&D console. -/obj/item/disk/design_disk/bepis/on_upload(datum/techweb/stored_research) +/obj/item/disk/design_disk/bepis/on_upload(datum/techweb/stored_research, atom/research_source) stored_research.hidden_nodes -= bepis_node.id - stored_research.research_node(bepis_node, force = TRUE, auto_adjust_cost = FALSE) + stored_research.research_node(bepis_node, force = TRUE, auto_adjust_cost = FALSE, research_source = research_source) /** * Subtype of Bepis tech disk diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index d4dde8732a0..517eb7c5b9e 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -123,7 +123,7 @@ Nothing else in the console has ID requirements. user.investigate_log("researched [id]([json_encode(price)]) on techweb id [stored_research.id].", INVESTIGATE_RESEARCH) if(istype(stored_research, /datum/techweb/science)) SSblackbox.record_feedback("associative", "science_techweb_unlock", 1, list("id" = "[id]", "name" = TN.display_name, "price" = "[json_encode(price)]", "time" = ISOtime())) - if(stored_research.research_node_id(id)) + if(stored_research.research_node_id(id, research_source = src)) say("Successfully researched [TN.display_name].") var/logname = "Unknown" if(HAS_AI_ACCESS(user)) @@ -161,6 +161,9 @@ Nothing else in the console has ID requirements. balloon_alert(user, "security protocols disabled") playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) obj_flags |= EMAGGED + var/obj/item/circuitboard/computer/rdconsole/board = circuit + if(!(board.obj_flags & EMAGGED)) + board.silence_announcements = TRUE locked = FALSE return TRUE @@ -362,7 +365,7 @@ Nothing else in the console has ID requirements. if(D) stored_research.add_design(D, TRUE) say("Uploading blueprints from disk.") - d_disk.on_upload(stored_research) + d_disk.on_upload(stored_research, src) return TRUE if (params["type"] == RND_TECH_DISK) if (QDELETED(t_disk)) diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index fd6ca7949b4..3da8fe4e1c9 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -361,10 +361,10 @@ return TRUE -/datum/techweb/proc/research_node_id(id, force, auto_update_points, get_that_dosh_id) - return research_node(SSresearch.techweb_node_by_id(id), force, auto_update_points, get_that_dosh_id) +/datum/techweb/proc/research_node_id(id, force, auto_update_points, get_that_dosh_id, atom/research_source) + return research_node(SSresearch.techweb_node_by_id(id), force, auto_update_points, get_that_dosh_id, research_source) -/datum/techweb/proc/research_node(datum/techweb_node/node, force = FALSE, auto_adjust_cost = TRUE, get_that_dosh = TRUE) +/datum/techweb/proc/research_node(datum/techweb_node/node, force = FALSE, auto_adjust_cost = TRUE, get_that_dosh = TRUE, atom/research_source) if(!istype(node)) return FALSE update_node_status(node) diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index 23ad6fd213d..b6d3bd74d69 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -42,6 +42,12 @@ var/show_on_wiki = TRUE /// Hidden Mech nodes unlocked when mech fabricator emaged. var/illegal_mech_node = FALSE + /** + * If set, the researched node will be announced on these channels by an announcement system + * with 'announce_research_node' set to TRUE when researched by the station. + * Not every node has to be announced if you want, some are best kept a little "subtler", like Illegal Weapons. + */ + var/list/announce_channels /datum/techweb_node/error_node id = "ERROR" @@ -109,5 +115,25 @@ return techweb_point_display_generic(get_price(TN)) ///Proc called when the Station (Science techweb specific) researches a node. -/datum/techweb_node/proc/on_station_research() - SHOULD_CALL_PARENT(FALSE) +/datum/techweb_node/proc/on_station_research(atom/research_source) + SHOULD_CALL_PARENT(TRUE) + var/channels_to_use = announce_channels + if(istype(research_source, /obj/machinery/computer/rdconsole)) + var/obj/machinery/computer/rdconsole/console = research_source + var/obj/item/circuitboard/computer/rdconsole/board = console.circuit + if(board.silence_announcements) + return + if(board.obj_flags & EMAGGED) + channels_to_use = list(RADIO_CHANNEL_COMMON) + if(!length(channels_to_use) || starting_node) + return + var/obj/machinery/announcement_system/system + var/list/available_machines = list() + for(var/obj/machinery/announcement_system/announce as anything in GLOB.announcement_systems) + if(announce.announce_research_node) + available_machines += announce + break + if(!length(available_machines)) + return + system = pick(available_machines) + system.announce(AUTO_ANNOUNCE_NODE, display_name, channels = channels_to_use) diff --git a/code/modules/research/techweb/nodes/alien_nodes.dm b/code/modules/research/techweb/nodes/alien_nodes.dm index 58e8dbfc68f..331b91bae61 100644 --- a/code/modules/research/techweb/nodes/alien_nodes.dm +++ b/code/modules/research/techweb/nodes/alien_nodes.dm @@ -30,6 +30,7 @@ hidden = TRUE /datum/techweb_node/alientech/on_station_research() + . = ..() SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_ALIENTECH] = TRUE /datum/techweb_node/alien_engi @@ -59,6 +60,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) hidden = TRUE + announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/alien_surgery id = TECHWEB_NODE_ALIEN_SURGERY @@ -99,3 +101,4 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) discount_experiments = list(/datum/experiment/scanning/points/slime/hard = TECHWEB_TIER_5_POINTS) hidden = TRUE + announce_channels = list(RADIO_CHANNEL_MEDICAL) diff --git a/code/modules/research/techweb/nodes/atmos_nodes.dm b/code/modules/research/techweb/nodes/atmos_nodes.dm index f1ec74b50f4..a61a6a6b094 100644 --- a/code/modules/research/techweb/nodes/atmos_nodes.dm +++ b/code/modules/research/techweb/nodes/atmos_nodes.dm @@ -48,6 +48,7 @@ /datum/experiment/ordnance/gaseous/bz, /datum/experiment/ordnance/gaseous/noblium, ) + announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/plasma_control id = TECHWEB_NODE_PLASMA_CONTROL @@ -63,6 +64,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) required_experiments = list(/datum/experiment/ordnance/gaseous/plasma) + announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/fusion id = TECHWEB_NODE_FUSION @@ -84,6 +86,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) discount_experiments = list(/datum/experiment/ordnance/gaseous/nitrous_oxide = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/exp_tools id = TECHWEB_NODE_EXP_TOOLS @@ -105,6 +108,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/ordnance/gaseous/bz = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/rcd_upgrade id = TECHWEB_NODE_RCD_UPGRADE @@ -122,3 +126,4 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) discount_experiments = list(/datum/experiment/ordnance/gaseous/noblium = TECHWEB_TIER_5_POINTS) + announce_channels = list(RADIO_CHANNEL_ENGINEERING) diff --git a/code/modules/research/techweb/nodes/bepis_nodes.dm b/code/modules/research/techweb/nodes/bepis_nodes.dm index baefd8c11d0..f477569aea5 100644 --- a/code/modules/research/techweb/nodes/bepis_nodes.dm +++ b/code/modules/research/techweb/nodes/bepis_nodes.dm @@ -1,3 +1,5 @@ +//Nodes that are found inside Bepis Disks. + /datum/techweb_node/light_apps id = TECHWEB_NODE_LIGHT_APPS display_name = "Illumination Applications" @@ -10,6 +12,7 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE + announce_channels = list(RADIO_CHANNEL_COMMON) /datum/techweb_node/extreme_office id = TECHWEB_NODE_EXTREME_OFFICE @@ -22,6 +25,7 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE + announce_channels = list(RADIO_CHANNEL_COMMON) /datum/techweb_node/spec_eng id = TECHWEB_NODE_SPEC_ENG @@ -34,6 +38,7 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE + announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/aus_security id = TECHWEB_NODE_AUS_SECURITY @@ -46,6 +51,7 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE + announce_channels = list(RADIO_CHANNEL_SECURITY) /datum/techweb_node/interrogation id = TECHWEB_NODE_INTERROGATION @@ -58,6 +64,7 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE + announce_channels = list(RADIO_CHANNEL_SECURITY) /datum/techweb_node/sticky_advanced id = TECHWEB_NODE_STICKY_ADVANCED @@ -70,6 +77,7 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE + announce_channels = list(RADIO_CHANNEL_COMMON) /datum/techweb_node/tackle_advanced id = TECHWEB_NODE_TACKLE_ADVANCED @@ -83,6 +91,7 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE + announce_channels = list(RADIO_CHANNEL_SECURITY) /datum/techweb_node/mod_experimental id = TECHWEB_NODE_MOD_EXPERIMENTAL @@ -97,6 +106,7 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE + announce_channels = list(RADIO_CHANNEL_COMMON) /datum/techweb_node/posisphere id = TECHWEB_NODE_POSITRONIC_SPHERE @@ -108,3 +118,4 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE + announce_channels = list(RADIO_CHANNEL_SCIENCE) diff --git a/code/modules/research/techweb/nodes/biology_nodes.dm b/code/modules/research/techweb/nodes/biology_nodes.dm index 7b553445a9c..25f9163ab48 100644 --- a/code/modules/research/techweb/nodes/biology_nodes.dm +++ b/code/modules/research/techweb/nodes/biology_nodes.dm @@ -14,6 +14,7 @@ "mod_reagent_scanner", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cytology id = TECHWEB_NODE_CYTOLOGY @@ -60,6 +61,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/scanning/people/mutant = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) // Botany root node /datum/techweb_node/botany_equip @@ -88,6 +90,7 @@ "portaseeder", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + announce_channels = list(RADIO_CHANNEL_SERVICE) /datum/techweb_node/selection id = TECHWEB_NODE_SELECTION @@ -101,3 +104,4 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/scanning/random/plants/wild) discount_experiments = list(/datum/experiment/scanning/random/plants/traits = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SERVICE) diff --git a/code/modules/research/techweb/nodes/cyborg_nodes.dm b/code/modules/research/techweb/nodes/cyborg_nodes.dm index 8a9d09807d6..eeeed268be5 100644 --- a/code/modules/research/techweb/nodes/cyborg_nodes.dm +++ b/code/modules/research/techweb/nodes/cyborg_nodes.dm @@ -44,6 +44,7 @@ "borg_upgrade_restart", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/borg_service id = TECHWEB_NODE_BORG_SERVICES @@ -59,6 +60,7 @@ "borg_upgrade_service_cookbook", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/borg_mining id = TECHWEB_NODE_BORG_MINING @@ -71,6 +73,7 @@ "borg_upgrade_diamonddrill", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/borg_medical id = TECHWEB_NODE_BORG_MEDICAL @@ -87,6 +90,7 @@ "borg_upgrade_surgicalomnitool", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/borg_utility id = TECHWEB_NODE_BORG_UTILITY @@ -105,6 +109,7 @@ "borg_upgrade_trashofholding", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/borg_utility/New() . = ..() @@ -123,6 +128,7 @@ "borg_upgrade_inducer", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) // Implants root node /datum/techweb_node/passive_implants @@ -144,6 +150,7 @@ "c38_trac", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_SECURITY, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cyber/cyber_implants id = TECHWEB_NODE_CYBER_IMPLANTS @@ -157,6 +164,7 @@ "ci-herculean", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cyber/New() ..() @@ -174,6 +182,7 @@ "ci-antistun", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cyber/integrated_toolsets id = TECHWEB_NODE_INTERGRATED_TOOLSETS @@ -186,6 +195,7 @@ "ci-surgery", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cyber/cyber_organs id = TECHWEB_NODE_CYBER_ORGANS @@ -202,6 +212,7 @@ "cybernetic_heart_tier2", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cyber/cyber_organs_upgraded id = TECHWEB_NODE_CYBER_ORGANS_UPGRADED @@ -221,6 +232,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/scanning/people/augmented_organs) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cyber/cyber_organs_adv id = TECHWEB_NODE_CYBER_ORGANS_ADV @@ -236,3 +248,4 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) discount_experiments = list(/datum/experiment/scanning/people/android = TECHWEB_TIER_5_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) diff --git a/code/modules/research/techweb/nodes/engi_nodes.dm b/code/modules/research/techweb/nodes/engi_nodes.dm index 949b880d1f2..0d8572130fb 100644 --- a/code/modules/research/techweb/nodes/engi_nodes.dm +++ b/code/modules/research/techweb/nodes/engi_nodes.dm @@ -42,6 +42,7 @@ "super_cell", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/parts_adv id = TECHWEB_NODE_PARTS_ADV @@ -59,6 +60,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier2_any) + announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/parts_bluespace @@ -78,6 +80,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier3_any = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/telecomms id = TECHWEB_NODE_TELECOMS @@ -167,6 +170,7 @@ "tray_goggles", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/holographics id = TECHWEB_NODE_HOLOGRAPHICS @@ -211,6 +215,7 @@ "ci-sechud", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_ENGINEERING, RADIO_CHANNEL_SECURITY, RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/night_vision id = TECHWEB_NODE_NIGHT_VISION @@ -226,3 +231,4 @@ "security_hud_night", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_ENGINEERING, RADIO_CHANNEL_SECURITY, RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) diff --git a/code/modules/research/techweb/nodes/mech_nodes.dm b/code/modules/research/techweb/nodes/mech_nodes.dm index b09957076d7..82d6484bf02 100644 --- a/code/modules/research/techweb/nodes/mech_nodes.dm +++ b/code/modules/research/techweb/nodes/mech_nodes.dm @@ -36,6 +36,7 @@ "mech_radio", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_clown id = TECHWEB_NODE_MECH_CLOWN @@ -60,6 +61,7 @@ "borg_transform_clown", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SECURITY) //The dread upon security when they hear this... /datum/techweb_node/mech_medical id = TECHWEB_NODE_MECH_MEDICAL @@ -96,6 +98,7 @@ "clarke_peri", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SUPPLY) /datum/techweb_node/mech_combat id = TECHWEB_NODE_MECH_COMBAT @@ -112,6 +115,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) required_experiments = list(/datum/experiment/scanning/random/mecha_equipped_scan) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_assault id = TECHWEB_NODE_MECH_ASSAULT @@ -132,6 +136,7 @@ "durand_targ", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_light id = TECHWEB_NODE_MECH_LIGHT @@ -152,6 +157,7 @@ "gygax_targ", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_heavy id = TECHWEB_NODE_MECH_HEAVY @@ -172,6 +178,7 @@ "savannah_ivanov_targ", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_infiltrator id = TECHWEB_NODE_MECH_INFILTRATOR @@ -192,6 +199,7 @@ "phazon_targ", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/justice id = "mecha_justice" @@ -222,6 +230,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/scanning/random/mecha_damage_scan = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_firearms id = TECHWEB_NODE_MECH_FIREARMS @@ -237,6 +246,7 @@ "mech_carbine_ammo", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_heavy_arms id = TECHWEB_NODE_MECH_HEAVY_ARMS @@ -252,6 +262,7 @@ "mech_missile_rack_ammo", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_equip_bluespace id = TECHWEB_NODE_MECH_EQUIP_BLUESPACE @@ -264,3 +275,4 @@ "mech_wormhole_gen", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) diff --git a/code/modules/research/techweb/nodes/medbay_nodes.dm b/code/modules/research/techweb/nodes/medbay_nodes.dm index fababbc55e7..897a2edf18e 100644 --- a/code/modules/research/techweb/nodes/medbay_nodes.dm +++ b/code/modules/research/techweb/nodes/medbay_nodes.dm @@ -60,6 +60,7 @@ "fluid_ducts", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_MEDICAL) /datum/techweb_node/medbay_equip_adv id = TECHWEB_NODE_MEDBAY_EQUIP_ADV @@ -79,6 +80,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/scanning/reagent/haloperidol) + announce_channels = list(RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cryostasis id = TECHWEB_NODE_CRYOSTASIS @@ -94,3 +96,4 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/scanning/reagent/cryostylane = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_MEDICAL) diff --git a/code/modules/research/techweb/nodes/mining_nodes.dm b/code/modules/research/techweb/nodes/mining_nodes.dm index d8a6539caa3..1bfa3a9284a 100644 --- a/code/modules/research/techweb/nodes/mining_nodes.dm +++ b/code/modules/research/techweb/nodes/mining_nodes.dm @@ -48,6 +48,7 @@ "mesons", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_SUPPLY) /datum/techweb_node/low_pressure_excavation id = TECHWEB_NODE_LOW_PRESSURE_EXCAVATION @@ -67,6 +68,7 @@ "borg_upgrade_hypermod", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + announce_channels = list(RADIO_CHANNEL_SUPPLY) /datum/techweb_node/plasma_mining id = TECHWEB_NODE_PLASMA_MINING @@ -78,6 +80,7 @@ "plasmacutter_adv", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SUPPLY) /datum/techweb_node/bitrunning id = TECHWEB_NODE_BITRUNNING @@ -90,6 +93,7 @@ "netpod", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SUPPLY) /datum/techweb_node/mining_adv id = TECHWEB_NODE_MINING_ADV @@ -102,3 +106,4 @@ "mech_diamond_drill", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_SUPPLY) diff --git a/code/modules/research/techweb/nodes/modsuit_nodes.dm b/code/modules/research/techweb/nodes/modsuit_nodes.dm index 955389f61ae..cc31a1fc1ef 100644 --- a/code/modules/research/techweb/nodes/modsuit_nodes.dm +++ b/code/modules/research/techweb/nodes/modsuit_nodes.dm @@ -36,6 +36,7 @@ "mod_sign_radio", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mod_entertainment id = TECHWEB_NODE_MOD_ENTERTAINMENT @@ -49,6 +50,7 @@ "mod_waddle", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SERVICE) /datum/techweb_node/mod_medical id = TECHWEB_NODE_MOD_MEDICAL @@ -63,6 +65,7 @@ "mod_patienttransport", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/mod_engi id = TECHWEB_NODE_MOD_ENGI @@ -77,6 +80,7 @@ "mod_mister_atmos", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/mod_security id = TECHWEB_NODE_MOD_SECURITY @@ -95,6 +99,7 @@ "mod_criminalcapture", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SECURITY) /datum/techweb_node/mod_medical_adv id = TECHWEB_NODE_MOD_MEDICAL_ADV @@ -108,6 +113,7 @@ "mod_statusreadout", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/mod_engi_adv id = TECHWEB_NODE_MOD_ENGI_ADV @@ -122,6 +128,7 @@ "mod_storage_expanded", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/mod_engi_adv/New() if(HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA)) //we'll really need the rad protection modsuit module @@ -139,3 +146,4 @@ "mod_kinesis", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) diff --git a/code/modules/research/techweb/nodes/research_nodes.dm b/code/modules/research/techweb/nodes/research_nodes.dm index b70d9582681..f05199ab65e 100644 --- a/code/modules/research/techweb/nodes/research_nodes.dm +++ b/code/modules/research/techweb/nodes/research_nodes.dm @@ -28,6 +28,7 @@ "bluespace_crystal", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/applied_bluespace id = TECHWEB_NODE_APPLIED_BLUESPACE @@ -49,6 +50,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) required_experiments = list(/datum/experiment/scanning/points/bluespace_crystal) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL, RADIO_CHANNEL_SERVICE, RADIO_CHANNEL_SUPPLY) /datum/techweb_node/bluespace_travel id = TECHWEB_NODE_BLUESPACE_TRAVEL @@ -67,6 +69,7 @@ "swapper", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/anomaly_research id = TECHWEB_NODE_ANOMALY_RESEARCH @@ -79,6 +82,7 @@ "reactive_armour", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/anomaly_shells id = TECHWEB_NODE_ANOMALY_SHELLS @@ -94,3 +98,4 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) discount_experiments = list(/datum/experiment/scanning/points/anomalies = TECHWEB_TIER_5_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) diff --git a/code/modules/research/techweb/nodes/robo_nodes.dm b/code/modules/research/techweb/nodes/robo_nodes.dm index ff018e85b7c..9cfa3028961 100644 --- a/code/modules/research/techweb/nodes/robo_nodes.dm +++ b/code/modules/research/techweb/nodes/robo_nodes.dm @@ -51,6 +51,7 @@ "remove_module", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/ai/New() . = ..() @@ -95,3 +96,4 @@ "purge_module", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_COMMAND) diff --git a/code/modules/research/techweb/nodes/security_nodes.dm b/code/modules/research/techweb/nodes/security_nodes.dm index 2d3dd63864f..97d2036207c 100644 --- a/code/modules/research/techweb/nodes/security_nodes.dm +++ b/code/modules/research/techweb/nodes/security_nodes.dm @@ -39,6 +39,8 @@ "electropack", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_SECURITY) + /datum/techweb_node/riot_supression id = TECHWEB_NODE_RIOT_SUPRESSION @@ -55,6 +57,7 @@ "bola_energy", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + announce_channels = list(RADIO_CHANNEL_SECURITY) /datum/techweb_node/explosives id = TECHWEB_NODE_EXPLOSIVES @@ -68,6 +71,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/ordnance/explosive/lowyieldbomb) + announce_channels = list(RADIO_CHANNEL_SECURITY, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/exotic_ammo id = TECHWEB_NODE_EXOTIC_AMMO @@ -81,6 +85,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/ordnance/explosive/highyieldbomb = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_SECURITY) /datum/techweb_node/electric_weapons id = TECHWEB_NODE_ELECTRIC_WEAPONS @@ -94,6 +99,7 @@ "lasershell", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_SECURITY) /datum/techweb_node/beam_weapons id = TECHWEB_NODE_BEAM_WEAPONS @@ -105,3 +111,4 @@ "nuclear_gun", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_SECURITY) diff --git a/code/modules/research/techweb/nodes/service_nodes.dm b/code/modules/research/techweb/nodes/service_nodes.dm index 3735dc41b3b..a2f6b030071 100644 --- a/code/modules/research/techweb/nodes/service_nodes.dm +++ b/code/modules/research/techweb/nodes/service_nodes.dm @@ -51,6 +51,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) discount_experiments = list(/datum/experiment/scanning/random/janitor_trash = TECHWEB_TIER_2_POINTS) + announce_channels = list(RADIO_CHANNEL_SERVICE) /datum/techweb_node/consoles id = TECHWEB_NODE_CONSOLES @@ -78,6 +79,7 @@ "bounty_pad", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_SERVICE) /datum/techweb_node/gaming id = TECHWEB_NODE_GAMING @@ -145,6 +147,7 @@ "roastingstick", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + announce_channels = list(RADIO_CHANNEL_SERVICE) // Fishing root node /datum/techweb_node/fishing_equip diff --git a/code/modules/research/techweb/nodes/surgery_nodes.dm b/code/modules/research/techweb/nodes/surgery_nodes.dm index 4be7a3256ac..7af1dacf1df 100644 --- a/code/modules/research/techweb/nodes/surgery_nodes.dm +++ b/code/modules/research/techweb/nodes/surgery_nodes.dm @@ -20,6 +20,7 @@ "surgery_heal_burn_upgrade", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) + announce_channels = list(RADIO_CHANNEL_MEDICAL) /datum/techweb_node/surgery_adv id = TECHWEB_NODE_SURGERY_ADV @@ -37,6 +38,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) required_experiments = list(/datum/experiment/autopsy/human) + announce_channels = list(RADIO_CHANNEL_MEDICAL) /datum/techweb_node/surgery_exp id = TECHWEB_NODE_SURGERY_EXP @@ -67,6 +69,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) discount_experiments = list(/datum/experiment/autopsy/nonhuman = TECHWEB_TIER_3_POINTS) + announce_channels = list(RADIO_CHANNEL_MEDICAL) /datum/techweb_node/surgery_tools id = TECHWEB_NODE_SURGERY_TOOLS @@ -80,3 +83,4 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/autopsy/xenomorph = TECHWEB_TIER_4_POINTS) + announce_channels = list(RADIO_CHANNEL_MEDICAL) diff --git a/code/modules/research/techweb/techweb_types.dm b/code/modules/research/techweb/techweb_types.dm index f5532e9e53f..407008b2844 100644 --- a/code/modules/research/techweb/techweb_types.dm +++ b/code/modules/research/techweb/techweb_types.dm @@ -6,10 +6,10 @@ organization = "Nanotrasen" should_generate_points = TRUE -/datum/techweb/science/research_node(datum/techweb_node/node, force = FALSE, auto_adjust_cost = TRUE, get_that_dosh = TRUE) +/datum/techweb/science/research_node(datum/techweb_node/node, force = FALSE, auto_adjust_cost = TRUE, get_that_dosh = TRUE, atom/research_source) . = ..() if(.) - node.on_station_research() + node.on_station_research(research_source) /datum/techweb/oldstation id = "CHARLIE" diff --git a/tgui/packages/tgui/interfaces/AutomatedAnnouncement.tsx b/tgui/packages/tgui/interfaces/AutomatedAnnouncement.tsx index f08ee83fd4f..f88b2da67f4 100644 --- a/tgui/packages/tgui/interfaces/AutomatedAnnouncement.tsx +++ b/tgui/packages/tgui/interfaces/AutomatedAnnouncement.tsx @@ -9,16 +9,29 @@ const TOOLTIP_TEXT = ` %RANK with their job. `; +const TOOLTIP_NODE = ` + %NODE will be replaced with the researched node. +`; + type Data = { arrivalToggle: BooleanLike; arrival: string; newheadToggle: BooleanLike; newhead: string; + node_toggle: BooleanLike; + node_message: string; }; export const AutomatedAnnouncement = (props) => { const { act, data } = useBackend(); - const { arrivalToggle, arrival, newheadToggle, newhead } = data; + const { + arrivalToggle, + arrival, + newheadToggle, + newhead, + node_toggle, + node_message, + } = data; return ( @@ -90,6 +103,40 @@ export const AutomatedAnnouncement = (props) => { +
act('node_toggle')} + /> + } + > + + + } + > + + act('node_message', { + newText: value, + }) + } + /> + + +
);