Upgrades the Modsuit Adapter Shell (#70286)

Code improvements are much appreciated as some things may be rather hacky.

Adds more options to the currently very limited modsuit adapter shell. Right now you can only select a module and activate (not deploy) the suit.

This has some major problems as you literally can't even deploy the suit to activate it so that's rendered useless and selecting a module is like... kind of a weird input anyways but I won't judge so I left it in. Please comment down below if you'd like for me to add an "Activate Selected Module" input and "On Module Activated" output as those are certainly possible to do. I was just a little torn on how balanced that would be.

Changes:

"Module to Select" input is now an option. You can still use a string input, but simply inserting it into the suit and activating it, then accessing the circuit that way will give you a list of all modules that the modsuit has.
Modsuit quick deploy (RMB) no longer tries to deploy the rest of the pieces when used while the suit is only partially deployed. It will now instead retract the extended pieces. This makes the "Toggle Deployment" input less prone to errors. (Why was it like this in the first place? Having to manually retract the already extended pieces sucks ass.)
Added Inputs:

"Toggle Deployment" is a new signal input that does exactly what it says it does. It simply tries to extend or retract all pieces of the modsuit depending on it's current state.
Added Outputs:

"Activated" is a new number output that outputs 1 if the suit is activated and 0 if it's not.
"Deployed" is a new number output that outputs 1 if all parts of the suit are extended and 0 if they aren't.
"Deployed Parts" is a new string list output that outputs a list of the names of all currently deployed parts.
"On Deploy" is a new signal output that outputs a signal whenever all parts of the suit are deployed or retracted, regardless of the method used.
"Finished Toggling" is a new signal output that outputs a signal whenever the suit has finished activating or deactivating, regardless of the method used.
This commit is contained in:
RikuTheKiller
2022-10-05 17:16:19 +01:00
committed by GitHub
parent 6cc68d1c34
commit a2577296e6
4 changed files with 123 additions and 13 deletions
+93 -9
View File
@@ -79,7 +79,10 @@
var/obj/item/mod/module/attached_module
/// The name of the module to select
var/datum/port/input/module_to_select
var/datum/port/input/option/module_to_select
/// The signal to toggle deployment of the modsuit
var/datum/port/input/toggle_deploy
/// The signal to toggle the suit
var/datum/port/input/toggle_suit
@@ -90,32 +93,56 @@
/// A reference to the wearer of the MODsuit
var/datum/port/output/wearer
/// Whether or not the suit is deployed
var/datum/port/output/deployed
/// Whether or not the suit is activated
var/datum/port/output/activated
/// The name of the last selected module
var/datum/port/output/selected_module
/// A list of the names of all currently deployed parts
var/datum/port/output/deployed_parts
/// The signal that is triggered when a module is selected
var/datum/port/output/on_module_selected
/// The signal that is triggered when the suit is deployed by a signal
var/datum/port/output/on_deploy
/// The signal that is triggered when the suit has finished toggling itself after being activated by a signal
var/datum/port/output/on_toggle_finish
/obj/item/circuit_component/mod_adapter_core/populate_options()
module_to_select = add_option_port("Module to Select", list())
/obj/item/circuit_component/mod_adapter_core/populate_ports()
// Input Signals
module_to_select = add_input_port("Module to Select", PORT_TYPE_STRING)
toggle_deploy = add_input_port("Toggle Deployment", PORT_TYPE_SIGNAL)
toggle_suit = add_input_port("Toggle Suit", PORT_TYPE_SIGNAL)
select_module = add_input_port("Select Module", PORT_TYPE_SIGNAL)
// States
wearer = add_output_port("Wearer", PORT_TYPE_ATOM)
deployed = add_output_port("Deployed", PORT_TYPE_NUMBER)
activated = add_output_port("Activated", PORT_TYPE_NUMBER)
selected_module = add_output_port("Selected Module", PORT_TYPE_STRING)
deployed_parts = add_output_port("Deployed Parts", PORT_TYPE_LIST(PORT_TYPE_STRING))
// Output Signals
on_module_selected = add_output_port("On Module Selected", PORT_TYPE_SIGNAL)
on_deploy = add_output_port("On Deploy", PORT_TYPE_SIGNAL)
on_toggle_finish = add_output_port("Finished Toggling", PORT_TYPE_SIGNAL)
/obj/item/circuit_component/mod_adapter_core/register_shell(atom/movable/shell)
. = ..()
if(istype(shell, /obj/item/mod/module))
attached_module = shell
RegisterSignal(attached_module, COMSIG_MOVABLE_MOVED, .proc/on_move)
RegisterSignal(attached_module, COMSIG_MOVABLE_MOVED, .proc/on_move)
/obj/item/circuit_component/mod_adapter_core/unregister_shell(atom/movable/shell)
UnregisterSignal(attached_module, COMSIG_MOVABLE_MOVED)
attached_module = null
if(attached_module)
UnregisterSignal(attached_module, COMSIG_MOVABLE_MOVED)
attached_module = null
return ..()
/obj/item/circuit_component/mod_adapter_core/input_received(datum/port/input/port)
@@ -127,29 +154,86 @@
module = potential_module
if(COMPONENT_TRIGGERED_BY(toggle_suit, port))
INVOKE_ASYNC(attached_module.mod, /obj/item/mod/control.proc/toggle_activate, attached_module.mod.wearer)
if(COMPONENT_TRIGGERED_BY(toggle_deploy, port))
INVOKE_ASYNC(attached_module.mod, /obj/item/mod/control.proc/quick_deploy, attached_module.mod.wearer)
if(attached_module.mod.active && module && COMPONENT_TRIGGERED_BY(select_module, port))
INVOKE_ASYNC(module, /obj/item/mod/module.proc/on_select)
/obj/item/circuit_component/mod_adapter_core/proc/on_move(atom/movable/source, atom/old_loc, dir, forced)
SIGNAL_HANDLER
if(istype(source.loc, /obj/item/mod/control))
RegisterSignal(source.loc, COMSIG_MOD_MODULE_SELECTED, .proc/on_module_select)
RegisterSignal(source.loc, COMSIG_ITEM_EQUIPPED, .proc/equip_check)
equip_check()
var/obj/item/mod/control/mod = source.loc
RegisterSignal(mod, COMSIG_MOD_MODULE_SELECTED, .proc/on_module_select)
RegisterSignal(mod, COMSIG_MOD_DEPLOYED, .proc/on_mod_part_toggled)
RegisterSignal(mod, COMSIG_MOD_RETRACTED, .proc/on_mod_part_toggled)
RegisterSignal(mod, COMSIG_MOD_TOGGLED, .proc/on_mod_toggled)
RegisterSignal(mod, COMSIG_MOD_MODULE_ADDED, .proc/on_module_changed)
RegisterSignal(mod, COMSIG_MOD_MODULE_REMOVED, .proc/on_module_changed)
RegisterSignal(mod, COMSIG_ITEM_EQUIPPED, .proc/equip_check)
wearer.set_output(mod.wearer)
var/modules_list = list()
for(var/obj/item/mod/module/module in mod.modules)
if(module.module_type != MODULE_PASSIVE)
modules_list += module.name
module_to_select.possible_options = modules_list
if (module_to_select.possible_options.len)
module_to_select.set_value(module_to_select.possible_options[1])
else if(istype(old_loc, /obj/item/mod/control))
UnregisterSignal(old_loc, list(COMSIG_MOD_MODULE_SELECTED, COMSIG_ITEM_EQUIPPED))
UnregisterSignal(old_loc, COMSIG_MOD_DEPLOYED)
UnregisterSignal(old_loc, COMSIG_MOD_RETRACTED)
UnregisterSignal(old_loc, COMSIG_MOD_TOGGLED)
UnregisterSignal(old_loc, COMSIG_MOD_MODULE_ADDED)
UnregisterSignal(old_loc, COMSIG_MOD_MODULE_REMOVED)
selected_module.set_output(null)
wearer.set_output(null)
deployed.set_output(FALSE)
activated.set_output(FALSE)
/obj/item/circuit_component/mod_adapter_core/proc/on_module_select(datum/source, obj/item/mod/module/module)
SIGNAL_HANDLER
selected_module.set_output(module.name)
on_module_selected.set_output(COMPONENT_SIGNAL)
/obj/item/circuit_component/mod_adapter_core/proc/on_module_changed()
SIGNAL_HANDLER
var/modules_list = list()
for(var/obj/item/mod/module/module in attached_module.mod.modules)
if(module.module_type != MODULE_PASSIVE)
modules_list += module.name
module_to_select.possible_options = modules_list
if (module_to_select.possible_options.len)
module_to_select.set_value(module_to_select.possible_options[1])
/obj/item/circuit_component/mod_adapter_core/proc/on_mod_part_toggled()
SIGNAL_HANDLER
var/string_list = list()
var/is_deployed = TRUE
for(var/obj/item/part as anything in attached_module.mod.mod_parts)
if(part.loc == attached_module.mod)
is_deployed = FALSE
else
var/part_name = "Undefined"
if(istype(part, /obj/item/clothing/head/mod))
part_name = "Helmet"
if(istype(part, /obj/item/clothing/suit/mod))
part_name = "Chestplate"
if(istype(part, /obj/item/clothing/gloves/mod))
part_name = "Gloves"
if(istype(part, /obj/item/clothing/shoes/mod))
part_name = "Boots"
string_list += part_name
deployed_parts.set_output(string_list)
deployed.set_output(is_deployed)
on_deploy.set_output(COMPONENT_SIGNAL)
/obj/item/circuit_component/mod_adapter_core/proc/on_mod_toggled()
SIGNAL_HANDLER
activated.set_output(attached_module.mod.active)
on_toggle_finish.set_output(COMPONENT_SIGNAL)
/obj/item/circuit_component/mod_adapter_core/proc/equip_check()
SIGNAL_HANDLER
if(!attached_module.mod?.wearer)
return
wearer.set_output(attached_module.mod.wearer)