refactor death

This commit is contained in:
bridge
2025-12-29 21:46:26 +08:00
parent aef6fe6f74
commit 6a4059280a
7 changed files with 192 additions and 19 deletions

View File

@@ -6,7 +6,7 @@ if TYPE_CHECKING:
from src.classes.world import World
from src.classes.avatar import Avatar
def handle_death(world: World, avatar: Avatar, reason: Union[str, DeathReason] = DeathReason.UNKNOWN) -> None:
def handle_death(world: World, avatar: Avatar, reason: Union[str, DeathReason]) -> None:
"""
处理角色死亡的统一入口。
负责将角色标记为死亡,清理行动队列,但保留角色数据。
@@ -14,14 +14,11 @@ def handle_death(world: World, avatar: Avatar, reason: Union[str, DeathReason] =
Args:
world: 世界对象
avatar: 死亡的角色
reason: 死亡原因DeathReason枚举或字符串)
reason: 死亡原因DeathReason对象或字符串)
"""
# 如果传入的是枚举,转为字符串值
reason_str = reason.value if isinstance(reason, DeathReason) else str(reason)
reason_str = str(reason)
# 标记为死亡(软删除)
avatar.set_dead(reason_str, world.month_stamp)
# 可以在这里触发其他逻辑,比如检查是否有继承人等

View File

@@ -1,11 +1,24 @@
from __future__ import annotations
from enum import Enum
from dataclasses import dataclass
from typing import Optional
class DeathReason(Enum):
class DeathType(Enum):
OLD_AGE = "老死"
BATTLE = "战死"
SERIOUS_INJURY = "重伤"
UNKNOWN = "未知"
@dataclass
class DeathReason:
death_type: DeathType
killer_name: Optional[str] = None
def __str__(self) -> str:
return self.value
if self.death_type == DeathType.BATTLE:
killer = self.killer_name if self.killer_name else "未知角色"
return f"{killer}杀害"
elif self.death_type == DeathType.SERIOUS_INJURY:
return "重伤不治身亡"
elif self.death_type == DeathType.OLD_AGE:
return "寿元耗尽而亡"
return self.death_type.value

View File

@@ -188,7 +188,16 @@ def get_relations_strs(avatar: "Avatar", max_lines: int = 12) -> list[str]:
grouped: dict[str, list[str]] = defaultdict(list)
for other, rel in relations.items():
label = get_relation_label(rel, avatar, other)
grouped[label].append(other.name)
display_name = other.name
# 死亡标记
if getattr(other, "is_dead", False):
# death_info 是一个可选的字典,其中 'reason' 已经被 handle_death 格式化好了
d_info = getattr(other, "death_info", None)
reason = d_info["reason"] if d_info and "reason" in d_info else "未知原因"
display_name = f"{other.name}(已故:{reason})"
grouped[label].append(display_name)
lines: list[str] = []
processed_labels = set()