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