add detailed relation

This commit is contained in:
bridge
2025-10-24 01:36:18 +08:00
parent c3f4f1c182
commit 7c63aba0c7
3 changed files with 29 additions and 7 deletions

View File

@@ -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 ""

View File

@@ -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:
"""
从凡人中来的新修士:最低境界、随机位置,不分配宗门/法宝。
"""

View File

@@ -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)