[MIRROR] Circuit action button refactor [MDB IGNORE] (#25798)

* Circuit action button refactor (#80379)

## About The Pull Request

This PR makes several changes to how circuit action buttons work:
- The MOD action and BCI action components have been merged into a
single component.
- MOD circuit actions can be pinned from the configuration menu. This
works the same way as pinning individual modules, and can be done both
by the wearer and a suit AI.
- Action components have an output pin for the user of the action. This
allows MOD module circuits to distinguish between the wearer and an AI.
- Creates a supertype for `/datum/action/item_action/mod/pinned_module`
named `/datum/action/item_action/mod/pinnable`, which implements common
functionality for pinned modules and pinned circuit module actions.

## Why It's Good For The Game

The prior functionality of circuit MOD actions was somewhat unintuitive,
requiring the user to select an action from a radial menu *after*
activating the module, whether from a pinned action or from the module
radial. Providing similar pinning functionality to modules themselves
makes MOD actions more readily usable.

Merging the two different types of circuit components into one was made
with the idea that adding new types of shells with equipment actions
would inflate the number of subtypes of
`/obj/item/circuit_component/equipment_action` without adding much
meaningful functionality.

## Changelog

🆑
qol: MOD wearers and internal AIs can pin the individual actions in a
MOD circuit module in a similar way to how they can pin modules. Circuit
module actions can be pinned from the configuration menu of the circuit
refactor: The MOD action and BCI action components have been merged into
one component - the Equipment Action component.
/🆑

* Circuit action button refactor

---------

Co-authored-by: Y0SH1M4S73R <legoboyo@earthlink.net>
This commit is contained in:
SkyratBot
2023-12-23 19:26:25 -05:00
committed by GitHub
co-authored by Y0SH1M4S73R
parent d0105dfe0f
commit 899063da95
13 changed files with 271 additions and 187 deletions
+30 -24
View File
@@ -117,26 +117,43 @@
/datum/action/item_action/mod/panel/ai
ai_action = TRUE
/datum/action/item_action/mod/pinned_module
/datum/action/item_action/mod/pinnable
/// A reference to the mob we are pinned to.
var/mob/pinner
/datum/action/item_action/mod/pinnable/New(Target, mob/user)
. = ..()
var/obj/item/mod/control/mod = Target
if(user == mod.ai_assistant)
ai_action = TRUE
pinner = user
RegisterSignal(user, COMSIG_QDELETING, PROC_REF(pinner_deleted))
/datum/action/item_action/mod/pinnable/Grant(mob/user)
if(pinner != user)
return
return ..()
/// If the guy whose UI we are pinned to got deleted
/datum/action/item_action/mod/pinnable/proc/pinner_deleted()
SIGNAL_HANDLER
pinner = null
qdel(src)
/datum/action/item_action/mod/pinnable/module
desc = "Activate the module."
/// Overrides the icon applications.
var/override = FALSE
/// Module we are linked to.
var/obj/item/mod/module/module
/// A reference to the mob we are pinned to.
var/mob/pinner
/// Timer until we remove our cooldown overlay
var/cooldown_timer
/datum/action/item_action/mod/pinned_module/New(Target, obj/item/mod/module/linked_module, mob/user)
var/obj/item/mod/control/mod = Target
if(user == mod.ai_assistant)
ai_action = TRUE
/datum/action/item_action/mod/pinnable/module/New(Target, mob/user, obj/item/mod/module/linked_module)
button_icon = linked_module.icon
button_icon_state = linked_module.icon_state
. = ..()
module = linked_module
pinner = user
module.pinned_to[REF(user)] = src
if(linked_module.allow_flags & MODULE_ALLOW_INCAPACITATED)
// clears check hands and check conscious
@@ -149,9 +166,8 @@
COMSIG_MODULE_USED,
), PROC_REF(module_interacted_with))
RegisterSignal(linked_module, COMSIG_MODULE_COOLDOWN_STARTED, PROC_REF(cooldown_started))
RegisterSignal(user, COMSIG_QDELETING, PROC_REF(pinner_deleted))
/datum/action/item_action/mod/pinned_module/Destroy()
/datum/action/item_action/mod/pinnable/module/Destroy()
deltimer(cooldown_timer)
UnregisterSignal(module, list(
COMSIG_MODULE_ACTIVATED,
@@ -164,23 +180,13 @@
pinner = null
return ..()
/datum/action/item_action/mod/pinned_module/Grant(mob/user)
if(pinner != user)
return
return ..()
/datum/action/item_action/mod/pinned_module/Trigger(trigger_flags)
/datum/action/item_action/mod/pinnable/module/Trigger(trigger_flags)
. = ..()
if(!.)
return
module.on_select()
/// If the guy whose UI we are pinned to got deleted
/datum/action/item_action/mod/pinned_module/proc/pinner_deleted()
pinner = null
qdel(src)
/datum/action/item_action/mod/pinned_module/apply_button_overlay(atom/movable/screen/movable/action_button/current_button, force)
/datum/action/item_action/mod/pinnable/module/apply_button_overlay(atom/movable/screen/movable/action_button/current_button, force)
current_button.cut_overlays()
if(override)
return ..()
@@ -194,12 +200,12 @@
current_button.add_overlay(image(icon = 'icons/hud/radial.dmi', icon_state = "module_cooldown"))
return ..()
/datum/action/item_action/mod/pinned_module/proc/module_interacted_with(datum/source)
/datum/action/item_action/mod/pinnable/module/proc/module_interacted_with(datum/source)
SIGNAL_HANDLER
build_all_button_icons(UPDATE_BUTTON_OVERLAY|UPDATE_BUTTON_STATUS)
/datum/action/item_action/mod/pinned_module/proc/cooldown_started(datum/source, cooldown_time)
/datum/action/item_action/mod/pinnable/module/proc/cooldown_started(datum/source, cooldown_time)
SIGNAL_HANDLER
deltimer(cooldown_timer)
+2 -2
View File
@@ -271,9 +271,9 @@
// Grant pinned actions to pin owners, gives AI pinned actions to the AI and not the wearer
/obj/item/mod/control/grant_action_to_bearer(datum/action/action)
if (!istype(action, /datum/action/item_action/mod/pinned_module))
if (!istype(action, /datum/action/item_action/mod/pinnable))
return ..()
var/datum/action/item_action/mod/pinned_module/pinned = action
var/datum/action/item_action/mod/pinnable/pinned = action
give_item_action(action, pinned.pinner, slot_flags)
/obj/item/mod/control/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
+1 -1
View File
@@ -53,7 +53,7 @@
"cooldown" = round(COOLDOWN_TIMELEFT(module, cooldown_timer), 1 SECONDS),
"id" = module.tgui_id,
"ref" = REF(module),
"configuration_data" = module.get_configuration()
"configuration_data" = module.get_configuration(user)
))
data["module_custom_status"] = module_custom_status
data["module_info"] = module_info
+3 -3
View File
@@ -250,7 +250,7 @@
return list()
/// Creates a list of configuring options for this module
/obj/item/mod/module/proc/get_configuration()
/obj/item/mod/module/proc/get_configuration(mob/user)
return list()
/// Generates an element of the get_configuration list with a display name, type and value
@@ -325,12 +325,12 @@
if(module_type == MODULE_PASSIVE)
return
var/datum/action/item_action/mod/pinned_module/existing_action = pinned_to[REF(user)]
var/datum/action/item_action/mod/pinnable/module/existing_action = pinned_to[REF(user)]
if(existing_action)
mod.remove_item_action(existing_action)
return
var/datum/action/item_action/mod/pinned_module/new_action = new(mod, src, user)
var/datum/action/item_action/mod/pinnable/module/new_action = new(mod, user, src)
mod.add_item_action(new_action)
/// On drop key, concels a device item.