From a1210589b76c464c8ab1afe45b344a38a95245d3 Mon Sep 17 00:00:00 2001 From: bridge Date: Wed, 26 Nov 2025 21:56:39 +0800 Subject: [PATCH] update --- src/classes/auxiliary.py | 12 ++++++++---- src/classes/avatar.py | 3 +-- src/classes/celestial_phenomenon.py | 7 ++++++- src/classes/kill_and_grab.py | 8 ++++++-- src/classes/persona.py | 11 ++++++++--- src/classes/root.py | 13 +++++++++++++ src/classes/sect.py | 10 +++++++--- src/classes/technique.py | 10 +++++++--- src/classes/weapon.py | 11 ++++++++--- static/templates/ai.txt | 2 +- 10 files changed, 65 insertions(+), 22 deletions(-) diff --git a/src/classes/auxiliary.py b/src/classes/auxiliary.py index 46f2f76..1c686f7 100644 --- a/src/classes/auxiliary.py +++ b/src/classes/auxiliary.py @@ -24,6 +24,7 @@ class Auxiliary: sect_id: Optional[int] desc: str effects: dict[str, object] = field(default_factory=dict) + effect_desc: str = "" sect: Optional[Sect] = None # 特殊属性(用于存储实例特定数据) special_data: dict = field(default_factory=dict) @@ -34,7 +35,8 @@ class Auxiliary: def get_detailed_info(self) -> str: """获取详细信息""" - return f"{self.name}({self.grade},{self.desc})" + effect_part = f" 效果:{self.effect_desc}" if self.effect_desc else "" + return f"{self.name}({self.grade},{self.desc}){effect_part}" def get_colored_info(self) -> str: """获取带颜色标记的信息,供前端渲染使用""" @@ -42,13 +44,12 @@ class Auxiliary: return f"{self.get_info()}" def get_structured_info(self) -> dict: - from src.utils.effect_desc import format_effects_to_text return { "name": self.name, "desc": self.desc, "grade": self.grade.value, "color": self.grade.color_rgb, - "effect_desc": format_effects_to_text(self.effects), + "effect_desc": self.effect_desc, } @@ -71,7 +72,9 @@ def _load_auxiliaries() -> tuple[Dict[int, Auxiliary], Dict[str, Auxiliary], Dic sect_id = None effects = load_effect_from_str(get_str(row, "effects")) - + from src.utils.effect_desc import format_effects_to_text + effect_desc = format_effects_to_text(effects) + sect_obj: Optional[Sect] = sects_by_id.get(sect_id) if sect_id is not None else None # 解析grade @@ -89,6 +92,7 @@ def _load_auxiliaries() -> tuple[Dict[int, Auxiliary], Dict[str, Auxiliary], Dic sect_id=sect_id, desc=get_str(row, "desc"), effects=effects, + effect_desc=effect_desc, sect=sect_obj, ) diff --git a/src/classes/avatar.py b/src/classes/avatar.py index ce29ae1..459bd76 100644 --- a/src/classes/avatar.py +++ b/src/classes/avatar.py @@ -375,13 +375,12 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin): # 8. 灵根 from src.classes.root import format_root_cn - from src.utils.effect_desc import format_effects_to_text root_str = format_root_cn(self.root) info["root"] = root_str info["root_detail"] = { "name": root_str, "desc": f"包含元素:{'、'.join(str(e) for e in self.root.elements)}", - "effect_desc": format_effects_to_text(self.root.effects) + "effect_desc": self.root.effect_desc } # 9. 灵兽 diff --git a/src/classes/celestial_phenomenon.py b/src/classes/celestial_phenomenon.py index 19a7f9a..3ff7d42 100644 --- a/src/classes/celestial_phenomenon.py +++ b/src/classes/celestial_phenomenon.py @@ -44,6 +44,7 @@ class CelestialPhenomenon: name: str rarity: Rarity effects: dict[str, object] + effect_desc: str desc: str duration_years: int @@ -58,7 +59,8 @@ class CelestialPhenomenon: def get_detailed_info(self) -> str: """获取详细信息""" - return f"{self.name}({self.desc})" + effect_part = f" 效果:{self.effect_desc}" if self.effect_desc else "" + return f"{self.name}({self.desc}{effect_part})" def _load_celestial_phenomena() -> dict[int, CelestialPhenomenon]: @@ -76,12 +78,15 @@ def _load_celestial_phenomena() -> dict[int, CelestialPhenomenon]: # 解析effects effects = load_effect_from_str(get_str(row, "effects")) + from src.utils.effect_desc import format_effects_to_text + effect_desc = format_effects_to_text(effects) phenomenon = CelestialPhenomenon( id=get_int(row, "id"), name=get_str(row, "name"), rarity=rarity, effects=effects, + effect_desc=effect_desc, desc=get_str(row, "desc"), duration_years=get_int(row, "duration_years", 5), ) diff --git a/src/classes/kill_and_grab.py b/src/classes/kill_and_grab.py index 03bf9a8..65ae898 100644 --- a/src/classes/kill_and_grab.py +++ b/src/classes/kill_and_grab.py @@ -49,11 +49,15 @@ async def kill_and_grab(winner: Avatar, loser: Avatar) -> str: should_loot = True else: # 2. 否则让 AI 决策 - context = f"战斗胜利,{loser.name} 身死道消,留下了一件{loot_item.grade.value}{'兵器' if loot_type == 'weapon' else '辅助装备'}『{loot_item.name}』({loot_item.desc})。" + # 构建详细描述,包含效果 + item_desc = loot_item.get_detailed_info() + current_desc = winner_current.get_detailed_info() + + context = f"战斗胜利,{loser.name} 身死道消,留下了一件{loot_item.grade.value}{'兵器' if loot_type == 'weapon' else '辅助装备'}『{item_desc}』。" options = [ { "key": "A", - "desc": f"夺取{loot_item.grade.value}『{loot_item.name}』({loot_item.desc}),替换掉身上的『{winner_current.name}』({winner_current.grade.value},{winner_current.desc})。" + "desc": f"夺取『{loot_item.name}』,替换掉身上的『{winner_current.name}』。\n - 新装备:{item_desc}\n - 原装备:{current_desc}" }, { "key": "B", diff --git a/src/classes/persona.py b/src/classes/persona.py index b136d8a..9c1a7e5 100644 --- a/src/classes/persona.py +++ b/src/classes/persona.py @@ -24,6 +24,7 @@ class Persona: rarity: Rarity condition: str effects: dict[str, object] + effect_desc: str = "" @property def weight(self) -> float: @@ -34,7 +35,9 @@ class Persona: return self.name def get_detailed_info(self) -> str: - return f"{self.name}({self.desc})" + desc_part = f"({self.desc})" if self.desc else "" + effect_part = f"\n效果:{self.effect_desc}" if self.effect_desc else "" + return f"{self.name}{desc_part}{effect_part}" def get_colored_info(self) -> str: """获取带颜色标记的信息,供前端渲染使用""" @@ -42,13 +45,12 @@ class Persona: return f"{self.name}" def get_structured_info(self) -> dict: - from src.utils.effect_desc import format_effects_to_text return { "name": self.name, "desc": self.desc, "rarity": self.rarity.level.value, "color": self.rarity.color_rgb, - "effect_desc": format_effects_to_text(self.effects), + "effect_desc": self.effect_desc, } def _load_personas() -> tuple[dict[int, Persona], dict[str, Persona]]: @@ -70,6 +72,8 @@ def _load_personas() -> tuple[dict[int, Persona], dict[str, Persona]]: # 解析effects effects = load_effect_from_str(get_str(row, "effects")) + from src.utils.effect_desc import format_effects_to_text + effect_desc = format_effects_to_text(effects) persona = Persona( id=get_int(row, "id"), @@ -79,6 +83,7 @@ def _load_personas() -> tuple[dict[int, Persona], dict[str, Persona]]: rarity=rarity, condition=condition, effects=effects, + effect_desc=effect_desc, ) personas_by_id[persona.id] = persona personas_by_name[persona.name] = persona diff --git a/src/classes/root.py b/src/classes/root.py index 477d146..e274895 100644 --- a/src/classes/root.py +++ b/src/classes/root.py @@ -93,6 +93,13 @@ class Root(_RootMixin, Enum): """ return dict(_root_effects_by_root.get(self, {})) + @property + def effect_desc(self) -> str: + """ + 获取灵根效果的文本描述。 + """ + return _root_effect_desc_by_root.get(self, "") + # 元素到灵气类型的一一对应 _essence_by_element = { @@ -122,6 +129,12 @@ _root_effects_by_root = build_effects_map_from_df( effects_column="effects", ) +from src.utils.effect_desc import format_effects_to_text +_root_effect_desc_by_root = { + root: format_effects_to_text(effects) + for root, effects in _root_effects_by_root.items() +} + def format_root_cn(root: "Root") -> str: """ 将 Root 显示为中文短名 + 组成,例如: diff --git a/src/classes/sect.py b/src/classes/sect.py index 7d11ef7..f345cba 100644 --- a/src/classes/sect.py +++ b/src/classes/sect.py @@ -43,6 +43,7 @@ class Sect: preferred_weapon: str = "" # 影响角色或系统的效果 effects: dict[str, object] = field(default_factory=dict) + effect_desc: str = "" # 宗门自定义职位名称(可选):SectRank -> 名称 rank_names: dict[str, str] = field(default_factory=dict) @@ -53,7 +54,8 @@ class Sect: def get_detailed_info(self) -> str: # 详细描述:风格、阵营、驻地 hq = self.headquarter - return f"{self.name}(阵营:{self.alignment},风格:{self.member_act_style},驻地:{hq.name})" + effect_part = f" 效果:{self.effect_desc}" if self.effect_desc else "" + return f"{self.name}(阵营:{self.alignment},风格:{self.member_act_style},驻地:{hq.name}){effect_part}" def get_rank_name(self, rank: "SectRank") -> str: """ @@ -70,7 +72,6 @@ class Sect: return self.rank_names.get(rank.value, DEFAULT_RANK_NAMES.get(rank, "弟子")) def get_structured_info(self) -> dict: - from src.utils.effect_desc import format_effects_to_text hq = self.headquarter return { "name": self.name, @@ -79,7 +80,7 @@ class Sect: "style": self.member_act_style, "hq_name": hq.name, "hq_desc": hq.desc, - "effect_desc": format_effects_to_text(self.effects), + "effect_desc": self.effect_desc, } def _split_names(value: object) -> list[str]: @@ -130,6 +131,8 @@ def _load_sects() -> tuple[dict[int, Sect], dict[str, Sect]]: # 读取 effects effects = load_effect_from_str(get_str(row, "effects")) + from src.utils.effect_desc import format_effects_to_text + effect_desc = format_effects_to_text(effects) # 读取倾向兵器类型 preferred_weapon = get_str(row, "preferred_weapon") @@ -158,6 +161,7 @@ def _load_sects() -> tuple[dict[int, Sect], dict[str, Sect]]: weight=weight, preferred_weapon=preferred_weapon, effects=effects, + effect_desc=effect_desc, ) sects_by_id[sect.id] = sect sects_by_name[sect.name] = sect diff --git a/src/classes/technique.py b/src/classes/technique.py index c2c5cac..ef30491 100644 --- a/src/classes/technique.py +++ b/src/classes/technique.py @@ -66,6 +66,7 @@ class Technique: sect: Optional[str] = None # 影响角色或系统的效果 effects: dict[str, object] = field(default_factory=dict) + effect_desc: str = "" def is_allowed_for(self, avatar) -> bool: if not self.condition: @@ -76,7 +77,8 @@ class Technique: return f"{self.name}({self.attribute}){self.grade.value}" def get_detailed_info(self) -> str: - return f"{self.name}({self.attribute}){self.grade.value} {self.desc}" + effect_part = f" 效果:{self.effect_desc}" if self.effect_desc else "" + return f"{self.name}({self.attribute}){self.grade.value} {self.desc}{effect_part}" def get_colored_info(self) -> str: """获取带颜色标记的信息,供前端渲染使用""" @@ -84,14 +86,13 @@ class Technique: return f"{self.name}({self.attribute}·{self.grade.value})" def get_structured_info(self) -> dict: - from src.utils.effect_desc import format_effects_to_text return { "name": self.name, "desc": self.desc, "grade": self.grade.value, "color": self.grade.color_rgb, "attribute": self.attribute.value, - "effect_desc": format_effects_to_text(self.effects), + "effect_desc": self.effect_desc, } # 五行与扩展属性的克制关系 @@ -127,6 +128,8 @@ def loads() -> tuple[dict[int, Technique], dict[str, Technique]]: sect = None effects = load_effect_from_str(get_str(row, "effects")) + from src.utils.effect_desc import format_effects_to_text + effect_desc = format_effects_to_text(effects) t = Technique( id=get_int(row, "id"), @@ -138,6 +141,7 @@ def loads() -> tuple[dict[int, Technique], dict[str, Technique]]: condition=condition, sect=sect, effects=effects, + effect_desc=effect_desc, ) techniques_by_id[t.id] = t techniques_by_name[t.name] = t diff --git a/src/classes/weapon.py b/src/classes/weapon.py index c864fca..ee47308 100644 --- a/src/classes/weapon.py +++ b/src/classes/weapon.py @@ -27,6 +27,7 @@ class Weapon: sect_id: Optional[int] desc: str effects: dict[str, object] = field(default_factory=dict) + effect_desc: str = "" sect: Optional[Sect] = None # 特殊属性(如万魂幡的吞噬魂魄计数) special_data: dict = field(default_factory=dict) @@ -44,7 +45,9 @@ class Weapon: souls = "" if self.name == "万魂幡" and self.special_data.get("devoured_souls", 0) > 0: souls = f" 吞噬魂魄:{self.special_data['devoured_souls']}" - return f"{self.name}({self.weapon_type}·{self.grade},{self.desc}){souls}" + + effect_part = f" 效果:{self.effect_desc}" if self.effect_desc else "" + return f"{self.name}({self.weapon_type}·{self.grade},{self.desc}{souls}){effect_part}" def get_colored_info(self) -> str: """获取带颜色标记的信息,供前端渲染使用""" @@ -52,7 +55,6 @@ class Weapon: return f"{self.get_info()}" def get_structured_info(self) -> dict: - from src.utils.effect_desc import format_effects_to_text # 基础描述 full_desc = self.desc @@ -70,7 +72,7 @@ class Weapon: "grade": self.grade.value, "color": self.grade.color_rgb, "type": self.weapon_type.value, - "effect_desc": format_effects_to_text(self.effects), + "effect_desc": self.effect_desc, } @@ -93,6 +95,8 @@ def _load_weapons() -> tuple[Dict[int, Weapon], Dict[str, Weapon], Dict[int, Wea sect_id = None effects = load_effect_from_str(get_str(row, "effects")) + from src.utils.effect_desc import format_effects_to_text + effect_desc = format_effects_to_text(effects) sect_obj: Optional[Sect] = sects_by_id.get(sect_id) if sect_id is not None else None @@ -125,6 +129,7 @@ def _load_weapons() -> tuple[Dict[int, Weapon], Dict[str, Weapon], Dict[int, Wea sect_id=sect_id, desc=get_str(row, "desc"), effects=effects, + effect_desc=effect_desc, sect=sect_obj, ) diff --git a/static/templates/ai.txt b/static/templates/ai.txt index a3238aa..6790ce4 100644 --- a/static/templates/ai.txt +++ b/static/templates/ai.txt @@ -12,7 +12,7 @@ AvatarName: {{ "avatar_thinking": ... // 从角色角度,以第一人称视角,简单清晰的描述想法 "short_term_objective": ..., // 角色接下来一段时间的短期目标 - "action_name_params_pairs": list[Tuple[action_name, action_params]] // 一次性决定未来的3~8个动作,按顺序执行 + "action_name_params_pairs": list[Tuple[action_name, action_params]] // 一次性决定未来的5~10个动作,按顺序执行 }} }}