40 lines
1.5 KiB
Python
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
|