diff --git a/src/classes/relation.py b/src/classes/relation.py index bc1b020..11f03fe 100644 --- a/src/classes/relation.py +++ b/src/classes/relation.py @@ -137,9 +137,26 @@ def get_possible_post_relations(from_avatar: "Avatar", to_avatar: "Avatar") -> L return candidates -# ——— 悬浮提示:从“自身视角”格式化关系 ——— -def _label_from_self_perspective(relation: Relation) -> str: - # 以“我”为参照:有向关系需要取对偶后再显示(如 MASTER -> 徒弟)。 +# ——— 显示层:性别化称谓映射与标签工具 ——— +# 基于对方性别的细化: +GENDERED_DISPLAY: dict[tuple[Relation, str], str] = { + # 我 -> 对方:CHILD(我为子,对方为父/母) → 显示对方为 父亲/母亲 + (Relation.CHILD, "male"): "父亲", + (Relation.CHILD, "female"): "母亲", + # 我 -> 对方:PARENT(我为父/母,对方为子) → 显示对方为 儿子/女儿 + (Relation.PARENT, "male"): "儿子", + (Relation.PARENT, "female"): "女儿", +} + + +def _label_from_self_perspective(relation: Relation, other_gender: object | None = None) -> str: + # 优先使用性别化细化 + if other_gender is not None: + gender_value = getattr(other_gender, "value", None) or str(other_gender) + s = GENDERED_DISPLAY.get((relation, gender_value)) + if s: + return s + # 其余关系:以“我”为参照,取对偶再显示(MASTER -> 徒弟) counterpart = get_reciprocal(relation) return relation_display_names.get(counterpart, str(counterpart)) @@ -158,7 +175,7 @@ def get_relations_strs(avatar: "Avatar", max_lines: int = 6) -> list[str]: grouped: dict[str, list[str]] = defaultdict(list) for other, rel in relations.items(): - grouped[_label_from_self_perspective(rel)].append(other.name) + grouped[_label_from_self_perspective(rel, getattr(other, "gender", None))].append(other.name) lines: list[str] = [] for key in sorted(grouped.keys()): @@ -168,3 +185,8 @@ def get_relations_strs(avatar: "Avatar", max_lines: int = 6) -> list[str]: break return lines + +def relations_to_str(avatar: "Avatar", sep: str = ";", max_lines: int = 6) -> str: + lines = get_relations_strs(avatar, max_lines=max_lines) + return sep.join(lines) if lines else "无" + diff --git a/src/sim/new_avatar.py b/src/sim/new_avatar.py index e1b56eb..46a1dd3 100644 --- a/src/sim/new_avatar.py +++ b/src/sim/new_avatar.py @@ -54,7 +54,7 @@ def random_gender() -> Gender: return Gender.MALE if random.random() < 0.5 else Gender.FEMALE -def get_new_avatar_from_ordinary(world: World, current_month_stamp: MonthStamp, name: str, age: Age) -> Avatar: +def get_new_avatar_from_mortal(world: World, current_month_stamp: MonthStamp, name: str, age: Age) -> Avatar: """ 从凡人中来的新修士:最低境界、随机位置,不分配宗门/法宝。 """ diff --git a/src/sim/simulator.py b/src/sim/simulator.py index 6980839..ef35579 100644 --- a/src/sim/simulator.py +++ b/src/sim/simulator.py @@ -2,7 +2,7 @@ import random from src.classes.calendar import Month, Year, MonthStamp from src.classes.avatar import Avatar, Gender -from src.sim.new_avatar import get_new_avatar_from_ordinary +from src.sim.new_avatar import get_new_avatar_from_mortal from src.classes.age import Age from src.classes.cultivation import Realm from src.classes.world import World @@ -104,7 +104,7 @@ class Simulator: age = random.randint(16, 60) gender = random.choice(list(Gender)) name = get_random_name(gender) - new_avatar = get_new_avatar_from_ordinary(self.world, self.world.month_stamp, name, Age(age, Realm.Qi_Refinement)) + new_avatar = get_new_avatar_from_mortal(self.world, self.world.month_stamp, name, Age(age, Realm.Qi_Refinement)) self.world.avatar_manager.avatars[new_avatar.id] = new_avatar event = Event(self.world.month_stamp, f"{new_avatar.name}晋升为修士了。", related_avatars=[new_avatar.id]) events.append(event)