Mi2dRPGamEng/resources/logic/medical.py

40 lines
1.5 KiB
Python

from __future__ import annotations
from engine.character import Character
from engine.defs import DefRegistry
def _is_bleeding(part, registry: DefRegistry) -> bool:
if part.removed:
return True
for ailment in part.ailments:
ailment_def = registry.get_ailment_def(ailment.id)
if ailment_def is not None and ailment_def.causes_bleeding:
return True
return False
def treat_bleeding(character: Character, slot: str, item_def_id: str, registry: DefRegistry) -> bool:
"""Applies a bandage (organic species) or sealant (synthetic) to stop a body part's
bleeding - whether from being severed or from a causes_bleeding ailment (see
resources/logic/health_ticks.py::apply_bleeding_tick). Returns whether it actually helped:
False (no-op) if `item_def_id` isn't a treatment item this character's species can use (see
SpeciesDef.health_item_compatibility), the part isn't bleeding at all, or it's already
bandaged.
"""
if character.species_id is None:
return False
species = registry.get_species_def(character.species_id)
if item_def_id not in species.health_item_compatibility:
return False
part = character.get_or_create_body_part_override(slot)
if part is None or part.bandaged:
return False
if not _is_bleeding(part, registry):
return False
part.bandaged = True
character.log_medical_event(f"Treated bleeding on {slot} with {item_def_id}")
return True