mud/src/mudlib/combat/stamina.py

73 lines
2.2 KiB
Python

"""Stamina cue broadcasts for combat strain visibility."""
from mudlib.commands.movement import send_nearby_message
from mudlib.entity import Entity
async def check_stamina_cues(entity: Entity) -> None:
"""Broadcast stamina strain messages when thresholds are crossed.
Thresholds (escalating severity):
- Below 75%: breathing heavily
- Below 50%: drenched in sweat
- Below 25%: visibly shaking from exhaustion
- Below 10%: can barely stand
Each threshold triggers only ONCE per descent. Track the last triggered
threshold to prevent spam.
Args:
entity: The entity to check stamina for
"""
if entity.max_stamina == 0:
return
stamina_pct = entity.stamina / entity.max_stamina
# Define thresholds from lowest to highest (check in reverse order)
thresholds = [
(
0.10,
"You can barely stand.",
f"{entity.name} can barely stand.",
),
(
0.25,
"You're visibly shaking from exhaustion.",
f"{entity.name} is visibly shaking from exhaustion.",
),
(
0.50,
"You're drenched in sweat.",
f"{entity.name} is drenched in sweat.",
),
(
0.75,
"You're breathing heavily.",
f"{entity.name} is breathing heavily.",
),
]
# Find the current threshold (highest threshold we're below)
current_threshold = None
self_msg = None
nearby_msg = None
for threshold, self_text, nearby_text in thresholds:
if stamina_pct < threshold:
current_threshold = threshold
self_msg = self_text
nearby_msg = nearby_text
break
# If we found a threshold and it's lower than the last triggered one
if current_threshold is not None and current_threshold < entity._last_stamina_cue:
# Send self-directed message
await entity.send(f"{self_msg}\r\n")
# Broadcast to nearby players (only if entity has a location)
if entity.location is not None:
await send_nearby_message(entity, entity.x, entity.y, f"{nearby_msg}\r\n")
# Update tracking
entity._last_stamina_cue = current_threshold