Basic mob stat panel gutting (#95543)

## About The Pull Request

Changes Guardian HUD to use action buttons instead of HUD elements,
which means their buttons
1. Can now be moved
2. Can be binded

Other Holoparasite HUD changes:

1- Moves some special buttons like explosive's explosion ability to be
where the "Toggle Mode" button typically is, to be consistent with some
other modes (assassin, gas) that also works like their unique ability.
2- Gives non-dextrous holoparasites the ability to move floors, since
they float.
3- Fixes dextrous holoparasites having 2 health HUDs
4- Moves "Check Guardian Type" verb to a new action button meant to
mimick the Antag UI Info button.

Gives Soulscythes a Combat mode indicator

Locks Revenant's combat mode indicator (cause it does nothing)

Adds another hoverable HUD element, basic mobs can now hover over their
healthdoll to see their Health %

<img width="85" height="123" alt="image"
src="https://github.com/user-attachments/assets/ad660ba4-296c-4699-9ec4-03a6e7b97880"
/>
<img width="95" height="101" alt="image"
src="https://github.com/user-attachments/assets/12d4d9d3-cf2c-4c52-81aa-17ce538b9d48"
/>


Adds a Unit Test to ensure all basic mobs have a HUD that shows some
form of health & combat mode (unless unnecessary like Revenants), to not
lose any information from basic mob conversion now that they lose the
stat panel.

## Why It's Good For The Game

This is yet another supplement of
https://github.com/tgstation/tgstation/pull/95383 - Removing stat panel
entries for all basic mobs is a great move towards lessening the
reliance of mobs on the stat panel.

This is also just good QoL for Holoparasites, especially since their
stat panel had 2 entries for "Master HP" and your "Own" HP, despite
Holoparasites not even having their own HP at all.

## Changelog

🆑
qol: Holoparasites' abilities are now action buttons, so you can rebind
or move them.
qol: Holoparasites now have floor change buttons.
fix: Holoparasites and Soulscythes now have a combat mode indicator.
fix: Dextrous holoparasites now have their inventory slot again while
non-dextrous had it taken away (not that they could use it).
/🆑
This commit is contained in:
John Willard
2026-04-13 17:05:57 -06:00
committed by GitHub
parent 928df286a6
commit 774c07cd9b
30 changed files with 232 additions and 170 deletions
+77
View File
@@ -0,0 +1,77 @@
/datum/action/cooldown/guardian
button_icon = 'icons/hud/guardian.dmi'
/datum/action/cooldown/guardian/IsAvailable(feedback)
. = ..()
if(!.)
return .
return !!isguardian(owner)
/datum/action/cooldown/guardian/check_type
name = "Check Type"
desc = "A reminder on what your abilities are."
//this is based off of the antag ui icon, if that changes then change this too please.
button_icon_state = /datum/action/antag_info::button_icon_state
default_button_position = SCRN_OBJ_INSERT_FIRST
/datum/action/cooldown/guardian/check_type/Activate(atom/target)
. = ..()
to_chat(owner, astype(owner, /mob/living/basic/guardian)?.playstyle_string)
/datum/action/cooldown/guardian/communicate
name = "Communicate"
desc = "Communicate telepathically with your user."
button_icon_state = "communicate"
default_button_position = ui_guardian_communication
/datum/action/cooldown/guardian/communicate/Activate()
astype(owner, /mob/living/basic/guardian)?.communicate()
/datum/action/cooldown/guardian/manifest
name = "Manifest"
desc = "Spring forth into battle!"
button_icon_state = "manifest"
default_button_position = ui_guardian_manifest
/datum/action/cooldown/guardian/manifest/Activate()
astype(owner, /mob/living/basic/guardian)?.manifest()
/datum/action/cooldown/guardian/recall
name = "Recall"
desc = "Return to your user."
button_icon_state = "recall"
default_button_position = ui_guardian_recall
/datum/action/cooldown/guardian/recall/Activate()
astype(owner, /mob/living/basic/guardian)?.recall()
/datum/action/cooldown/guardian/toggle_light
name = "Toggle Light"
desc = "Glow like star dust."
button_icon_state = "light"
/datum/action/cooldown/guardian/toggle_light/Activate()
astype(owner, /mob/living/basic/guardian)?.toggle_light()
/datum/action/cooldown/guardian/toggle_mode
name = "Toggle Mode"
desc = "Switch between ability modes."
button_icon_state = "toggle"
default_button_position = ui_guardian_special
/datum/action/cooldown/guardian/toggle_mode/Activate()
astype(owner, /mob/living/basic/guardian)?.toggle_modes()
/datum/action/cooldown/guardian/toggle_mode/assassin
name = "Toggle Stealth"
desc = "Enter or exit stealth."
button_icon_state = "stealth"
transparent_when_unavailable = TRUE
/datum/action/cooldown/guardian/toggle_mode/assassin/is_action_active(atom/movable/screen/movable/action_button/current_button)
return owner.has_status_effect(/datum/status_effect/guardian_stealth)
/datum/action/cooldown/guardian/toggle_mode/gases
name = "Toggle Gas"
desc = "Switch between possible gases."
button_icon_state = "gases"
+1 -8
View File
@@ -25,14 +25,13 @@
RegisterSignal(parent, COMSIG_CARBON_LIMB_DAMAGED, PROC_REF(on_limb_damage))
RegisterSignals(parent, COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES, PROC_REF(on_damage_adjusted))
RegisterSignal(parent, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(on_health_updated))
RegisterSignal(parent, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(on_status_tab_updated))
if (!isnull(host))
var/mob/living/living_parent = parent
living_parent.updatehealth()
/datum/component/life_link/UnregisterFromParent()
unregister_host()
UnregisterSignal(parent, list(COMSIG_CARBON_LIMB_DAMAGED, COMSIG_LIVING_HEALTH_UPDATE, COMSIG_MOB_GET_STATUS_TAB_ITEMS) + COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES)
UnregisterSignal(parent, list(COMSIG_CARBON_LIMB_DAMAGED, COMSIG_LIVING_HEALTH_UPDATE) + COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES)
/datum/component/life_link/InheritComponent(datum/component/new_comp, i_am_original, mob/living/host, datum/callback/on_passed_damage, datum/callback/on_linked_death)
register_host(host)
@@ -133,12 +132,6 @@
else
mob_parent.set_hud_image_state(STATUS_HUD, "hudhealthy")
/// When our status tab updates, draw how much HP our host has in there
/datum/component/life_link/proc/on_status_tab_updated(mob/living/source, list/items)
SIGNAL_HANDLER
var/healthpercent = health_percentage(host)
items += "Host Health: [round(healthpercent, 0.5)]%"
/// Called when our host dies, we should die too
/datum/component/life_link/proc/on_host_died(mob/living/source, gibbed)
SIGNAL_HANDLER