mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-22 20:48:56 +01:00
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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user