From bf61287cdb5259792c9274f70db0a39fc04309b3 Mon Sep 17 00:00:00 2001 From: Wallem <66052067+Wallemations@users.noreply.github.com> Date: Fri, 7 Feb 2025 13:54:21 -0500 Subject: [PATCH] Makes integrated circuit nodes more colorful (#89360) ## About The Pull Request Makes it so nodes in an integrated circuit are colored depending on their category in the component menu. Before: ![1212121212121212](https://github.com/user-attachments/assets/aec4602f-c837-415f-8f42-0dcfb9e0e4aa) After: ![452345235345](https://github.com/user-attachments/assets/2a28f471-f0c1-4fda-9727-41db18894cb1) All categories (BCI has been changed to solid black since this for contrast purposes) ![e](https://private-user-images.githubusercontent.com/66052067/410190943-b66d26b0-29b5-4b3f-8e65-35e6a44b74d1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg3OTU0OTIsIm5iZiI6MTczODc5NTE5MiwicGF0aCI6Ii82NjA1MjA2Ny80MTAxOTA5NDMtYjY2ZDI2YjAtMjliNS00YjNmLThlNjUtMzVlNmE0NGI3NGQxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA1VDIyMzk1MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI5MzMxOWUyMzUxMmRkZTQwMThkOTNiNTk3OTEyOTExNWY4NjNkODE0YWJjZjE0MTQwYzM2YTZjYjY0ZGQ4ZDEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.uRa_SkIjdhzEbedzzLI1hDzOK-vpgC2ZNoQtvxo4ijE) If I was some sort of tgui magician I'd try to implement a way to add comment fields, but since I'm nowhere near that, I figured this was the least I could do. ## Why It's Good For The Game This makes it far easier to read integrated circuits and remember what they do. While there's still inherently some amount of confusion due to the nature of how node-based programming visually works, hopefully having it so nodes aren't all the same color helps a bit. ## Changelog :cl: Wallem qol: Integrated Circuit nodes are now colored depending on their type. /:cl: --- code/__DEFINES/wiremod.dm | 2 + .../wiremod/components/action/soundemitter.dm | 13 +++- code/modules/wiremod/core/component.dm | 22 ++++++- .../wiremod/core/integrated_circuit.dm | 2 + .../IntegratedCircuit/DisplayComponent.jsx | 18 +++++- .../IntegratedCircuit/ObjectComponent.jsx | 28 ++++++--- .../styles/interfaces/IntegratedCircuit.scss | 62 +++++++++++++++++++ 7 files changed, 133 insertions(+), 14 deletions(-) diff --git a/code/__DEFINES/wiremod.dm b/code/__DEFINES/wiremod.dm index 421650e3bf1..b606f938869 100644 --- a/code/__DEFINES/wiremod.dm +++ b/code/__DEFINES/wiremod.dm @@ -123,6 +123,8 @@ #define CIRCUIT_FLAG_REFUSE_MODULE (1<<5) /// This circuit component cannot be inserted into the same circuit multiple times. Only use this for major headaches. #define CIRCUIT_NO_DUPLICATES (1<<6) +/// This circuit component is currently disabled via configs +#define CIRCUIT_FLAG_DISABLED (1<<7) // Datatype flags /// The datatype supports manual inputs diff --git a/code/modules/wiremod/components/action/soundemitter.dm b/code/modules/wiremod/components/action/soundemitter.dm index 676ce874438..144a56295dd 100644 --- a/code/modules/wiremod/components/action/soundemitter.dm +++ b/code/modules/wiremod/components/action/soundemitter.dm @@ -33,11 +33,19 @@ var/list/options_map +/obj/item/circuit_component/soundemitter/Initialize(mapload) + if(CONFIG_GET(flag/disallow_circuit_sounds)) + update_ui_alerts(new_flag=CIRCUIT_FLAG_DISABLED) + . = ..() + /obj/item/circuit_component/soundemitter/get_ui_notices() . = ..() . += create_ui_notice("Sound Cooldown: [DisplayTimeText(sound_cooldown)]", "orange", "stopwatch") if(CONFIG_GET(flag/disallow_circuit_sounds)) . += create_ui_notice("Non-functional", "red", "exclamation") + update_ui_alerts(new_flag=CIRCUIT_FLAG_DISABLED) + else + update_ui_alerts(remove_flag=CIRCUIT_FLAG_DISABLED) /obj/item/circuit_component/soundemitter/populate_ports() @@ -79,10 +87,11 @@ /obj/item/circuit_component/soundemitter/input_received(datum/port/input/port) if(CONFIG_GET(flag/disallow_circuit_sounds)) - ui_color = "red" + // Without constantly checking the config 24/7 or sending a signal to every circuit, best we can do to update existing emitters is this. + update_ui_alerts(new_flag=CIRCUIT_FLAG_DISABLED) return else - ui_color = initial(ui_color) + update_ui_alerts(remove_flag=CIRCUIT_FLAG_DISABLED) if(!parent.shell) return diff --git a/code/modules/wiremod/core/component.dm b/code/modules/wiremod/core/component.dm index 07f3a5b55a3..7dda865fb64 100644 --- a/code/modules/wiremod/core/component.dm +++ b/code/modules/wiremod/core/component.dm @@ -64,6 +64,10 @@ /// The UI buttons of this circuit component. An assoc list that has this format: "button_icon" = "action_name" var/ui_buttons = null + /// The "important" UI tooltips of this circuit component. Used for important things like instant & disabled circuits, they're drawn next to the default tooltip icon. + /// An assoc list with the format ui_alerts["alert_icon"] = "alert_name". + var/ui_alerts = list() + /// Called when the option ports should be set up /obj/item/circuit_component/proc/populate_options() return @@ -86,8 +90,7 @@ trigger_input = add_input_port("Trigger", PORT_TYPE_SIGNAL, order = 2) if((circuit_flags & CIRCUIT_FLAG_OUTPUT_SIGNAL) && !trigger_output) trigger_output = add_output_port("Triggered", PORT_TYPE_SIGNAL, order = 2) - if(circuit_flags & CIRCUIT_FLAG_INSTANT) - ui_color = "orange" + update_ui_alerts() /obj/item/circuit_component/Destroy() if(parent) @@ -113,6 +116,21 @@ if(circuit_flags & CIRCUIT_FLAG_REFUSE_MODULE) . += span_notice("It's incompatible with module components.") +/// updates the ui alerts in the given component. new_flag adds flags, remove_flag removes them +/obj/item/circuit_component/proc/update_ui_alerts(new_flag, remove_flag) + if(new_flag) + circuit_flags |= new_flag + if(remove_flag) + circuit_flags &= ~remove_flag + if(circuit_flags & CIRCUIT_FLAG_INSTANT) + ui_alerts["tachometer-alt"] = "Instant" + else + ui_alerts -= "tachometer-alt" + if(circuit_flags & CIRCUIT_FLAG_DISABLED) + ui_alerts["exclamation"] = "Non-functional" + else + ui_alerts -= "exclamation" + /** * Called when a shell is registered from the component/the component is added to a circuit. * diff --git a/code/modules/wiremod/core/integrated_circuit.dm b/code/modules/wiremod/core/integrated_circuit.dm index 1023a59eb21..dfaef0abcaa 100644 --- a/code/modules/wiremod/core/integrated_circuit.dm +++ b/code/modules/wiremod/core/integrated_circuit.dm @@ -380,6 +380,8 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit) component_data["y"] = component.rel_y component_data["removable"] = component.removable component_data["color"] = component.ui_color + component_data["category"] = component.category + component_data["ui_alerts"] = component.ui_alerts component_data["ui_buttons"] = component.ui_buttons .["components"] += list(component_data) diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/DisplayComponent.jsx b/tgui/packages/tgui/interfaces/IntegratedCircuit/DisplayComponent.jsx index b0251a09e64..23269cd1567 100644 --- a/tgui/packages/tgui/interfaces/IntegratedCircuit/DisplayComponent.jsx +++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/DisplayComponent.jsx @@ -1,5 +1,6 @@ import { Component, createRef } from 'react'; import { Box, Button, Stack } from 'tgui-core/components'; +import { classes } from 'tgui-core/react'; import { noop } from './constants'; import { Port } from './Port'; @@ -39,24 +40,35 @@ export class DisplayComponent extends Component { render() { const { component, fixedSize, ...rest } = this.props; + const categoryClass = `ObjectComponent__Category__${component.category || 'Unassigned'}`; return (
{component.name} + {!!component.ui_alerts && + Object.keys(component.ui_alerts).map((icon) => ( + +