Files
Bubberstation/code/datums/status_effects/wound_effects.dm
Ghom 999bde8f84 Most screen alerts now fit the player's hud style. (#93493)
## About The Pull Request
Most screen alerts that use the midnight hud style no longer have the
button baked in their icon. Other screen alerts with their own
background or shape (robot and mech alerts, atmos, heretic buffs or
debuffs etc.) are not affected. Also updated a couple sprites but didn't
spend too much time on them. Mostly reusing existing assets.

Montage of how the alerts look on threee different hud styles
(Operative, Trasen-Knox, Detective, ALSO I FIXED THE BUCKLED ALERT
ALREADY):
<img width="293" height="323" alt="image"
src="https://github.com/user-attachments/assets/3a2b972b-aa5a-4c27-a454-c8c39acf6e20"
/>
It looks only a smidge iffy on the syndicate since the top and bottom
borders aren't layered over all the overlays, but it isn't something to
worry about in this PR.

## Why It's Good For The Game
Screen alerts always had the midnight hud button baked in their icon
states (now overlays), which completely disregard the player's hud
setting, much unlike action alerts buttons. Melbert has also said that
it'd be nice if the code for action buttons could also be used in screen
alerts and viceversa, to slim things down. That's obviously not what I'm
doing today, but having most of the screen alerts already without the
baked background will surely help if we ever pursue that objective.

## Changelog

🆑
refactor: Refactored screen alerts a little. Most should now fit the
player's hud style. Report any issue.
imageadd: A few screen alerts have been polished/updated a little.
/🆑
2025-10-31 15:30:39 -06:00

225 lines
7.6 KiB
Plaintext

// The shattered remnants of your broken limbs fill you with determination!
/atom/movable/screen/alert/status_effect/determined
name = "Determined"
desc = "The serious wounds you've sustained have put your body into fight-or-flight mode! Now's the time to look for an exit!"
use_user_hud_icon = TRUE
overlay_state = "wounded"
/datum/status_effect/determined
id = "determined"
alert_type = /atom/movable/screen/alert/status_effect/determined
remove_on_fullheal = TRUE
/datum/status_effect/determined/on_apply()
. = ..()
owner.visible_message(span_danger("[owner]'s body tenses up noticeably, gritting against [owner.p_their()] pain!"), span_notice("<b>Your senses sharpen as your body tenses up from the wounds you've sustained!</b>"), \
vision_distance=COMBAT_MESSAGE_RANGE)
if(ishuman(owner))
var/mob/living/carbon/human/human_owner = owner
human_owner.physiology.bleed_mod *= WOUND_DETERMINATION_BLEED_MOD
/datum/status_effect/determined/on_remove()
owner.visible_message(span_danger("[owner]'s body slackens noticeably!"), span_warning("<b>Your adrenaline rush dies off, and the pain from your wounds come aching back in...</b>"), vision_distance=COMBAT_MESSAGE_RANGE)
if(ishuman(owner))
var/mob/living/carbon/human/human_owner = owner
human_owner.physiology.bleed_mod /= WOUND_DETERMINATION_BLEED_MOD
return ..()
/datum/status_effect/limp
id = "limp"
status_type = STATUS_EFFECT_REPLACE
tick_interval = STATUS_EFFECT_NO_TICK
alert_type = /atom/movable/screen/alert/status_effect/limp
on_remove_on_mob_delete = TRUE
var/msg_stage = 0//so you dont get the most intense messages immediately
/// The left leg of the limping person
var/obj/item/bodypart/leg/left/left
/// The right leg of the limping person
var/obj/item/bodypart/leg/right/right
/// Which leg we're limping with next
var/obj/item/bodypart/next_leg
/// How many deciseconds we limp for on the left leg
var/slowdown_left = 0
/// How many deciseconds we limp for on the right leg
var/slowdown_right = 0
/// The chance we limp with the left leg each step it takes
var/limp_chance_left = 0
/// The chance we limp with the right leg each step it takes
var/limp_chance_right = 0
/datum/status_effect/limp/on_apply()
if(!iscarbon(owner))
return FALSE
var/mob/living/carbon/carbon_owner = owner
left = carbon_owner.get_bodypart(BODY_ZONE_L_LEG)
right = carbon_owner.get_bodypart(BODY_ZONE_R_LEG)
update_limp(src)
RegisterSignal(carbon_owner, COMSIG_MOVABLE_MOVED, PROC_REF(check_step))
RegisterSignal(carbon_owner, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(on_limb_removed))
RegisterSignals(carbon_owner, list(COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_POST_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB), PROC_REF(update_limp))
return TRUE
/datum/status_effect/limp/on_remove()
UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_POST_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB))
left = null
right = null
/atom/movable/screen/alert/status_effect/limp
name = "Limping"
desc = "One or more of your legs has been wounded, slowing down steps with that leg! Get it fixed, or at least in a sling of gauze!"
icon_state = "injury"
/datum/status_effect/limp/proc/check_step(mob/whocares, OldLoc, Dir, forced)
SIGNAL_HANDLER
if(!owner.client || owner.body_position == LYING_DOWN || !owner.has_gravity() || (owner.movement_type & (FLYING|FLOATING)) || forced || owner.buckled)
return
// less limping while we have determination still
var/determined_mod = owner.has_status_effect(/datum/status_effect/determined) ? 0.5 : 1
if(SEND_SIGNAL(owner, COMSIG_CARBON_LIMPING) & COMPONENT_CANCEL_LIMP)
return
if(next_leg == left)
if(prob(limp_chance_left * determined_mod))
owner.client.move_delay += slowdown_left * determined_mod
next_leg = right
else
if(prob(limp_chance_right * determined_mod))
owner.client.move_delay += slowdown_right * determined_mod
next_leg = left
/// We need to make sure that we properly clear these refs if one of the owner's limbs gets deleted
/datum/status_effect/limp/proc/on_limb_removed(datum/source, obj/item/bodypart/limb_lost, special, dismembered)
SIGNAL_HANDLER
if(limb_lost == left)
left = null
if(limb_lost == right)
right = null
update_limp() // calling this with no arg so we know it's coming from here and not a signal
/datum/status_effect/limp/proc/update_limp(datum/source)
SIGNAL_HANDLER
var/mob/living/carbon/carbon_mob = owner
if(source) // if we don't have a source, that means we are calling it from on_limb_removed. In that case we do not want to reassign these to the about-to-be-removed limbs (which can cause hanging refs)
left = carbon_mob.get_bodypart(BODY_ZONE_L_LEG)
right = carbon_mob.get_bodypart(BODY_ZONE_R_LEG)
if(!left && !right)
carbon_mob.remove_status_effect(src)
return
slowdown_left = 0
slowdown_right = 0
limp_chance_left = 0
limp_chance_right = 0
// technically you can have multiple wounds causing limps on the same limb, even if practically only bone wounds cause it in normal gameplay
if(left)
for(var/thing in left.wounds)
var/datum/wound/wound = thing
slowdown_left += wound.limp_slowdown
limp_chance_left = max(limp_chance_left, wound.limp_chance)
if(right)
for(var/thing in right.wounds)
var/datum/wound/wound = thing
slowdown_right += wound.limp_slowdown
limp_chance_right = max(limp_chance_right, wound.limp_chance)
// this handles losing your leg with the limp and the other one being in good shape as well
if(!slowdown_left && !slowdown_right)
carbon_mob.remove_status_effect(src)
return
/////////////////////////
//////// WOUNDS /////////
/////////////////////////
// wound status effect base
/datum/status_effect/wound
id = "wound"
status_type = STATUS_EFFECT_MULTIPLE
var/obj/item/bodypart/linked_limb
var/datum/wound/linked_wound
alert_type = NONE
/datum/status_effect/wound/on_creation(mob/living/new_owner, incoming_wound)
linked_wound = incoming_wound
linked_limb = linked_wound.limb
return ..()
/datum/status_effect/wound/on_remove()
linked_wound = null
linked_limb = null
UnregisterSignal(owner, COMSIG_CARBON_LOSE_WOUND)
/datum/status_effect/wound/on_apply()
if(!iscarbon(owner))
return FALSE
RegisterSignal(owner, COMSIG_CARBON_LOSE_WOUND, PROC_REF(check_remove))
return TRUE
/// check if the wound getting removed is the wound we're tied to
/datum/status_effect/wound/proc/check_remove(mob/living/L, datum/wound/W)
SIGNAL_HANDLER
if(W == linked_wound)
qdel(src)
/datum/status_effect/wound/nextmove_modifier()
var/mob/living/carbon/C = owner
if(C.get_active_hand() == linked_limb)
return linked_wound.get_action_delay_mult()
return ..()
/datum/status_effect/wound/nextmove_adjust()
var/mob/living/carbon/C = owner
if(C.get_active_hand() == linked_limb)
return linked_wound.get_action_delay_increment()
return ..()
// bones
/datum/status_effect/wound/blunt/bone
// blunt
/datum/status_effect/wound/blunt/bone/moderate
id = "disjoint"
/datum/status_effect/wound/blunt/bone/severe
id = "hairline"
/datum/status_effect/wound/blunt/bone/critical
id = "compound"
// slash
/datum/status_effect/wound/slash/flesh/moderate
id = "abrasion"
/datum/status_effect/wound/slash/flesh/severe
id = "laceration"
/datum/status_effect/wound/slash/flesh/critical
id = "avulsion"
// pierce
/datum/status_effect/wound/pierce/moderate
id = "breakage"
/datum/status_effect/wound/pierce/severe
id = "puncture"
/datum/status_effect/wound/pierce/critical
id = "rupture"
// burns
/datum/status_effect/wound/burn/flesh/moderate
id = "seconddeg"
/datum/status_effect/wound/burn/flesh/severe
id = "thirddeg"
/datum/status_effect/wound/burn/flesh/critical
id = "fourthdeg"