From 8eca9c0a659c0d4f2a12b8670cc6f83435a81a0b Mon Sep 17 00:00:00 2001 From: bridge Date: Sun, 19 Oct 2025 12:04:17 +0800 Subject: [PATCH] update story teller --- src/classes/action/battle.py | 5 ++-- src/classes/action/breakthrough.py | 6 +---- src/classes/mutual_action/dual_cultivation.py | 5 ++-- src/classes/story_teller.py | 24 ++++++++++++++++--- static/game_configs/sect.csv | 4 ++-- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/classes/action/battle.py b/src/classes/action/battle.py index 3a647db..256efd0 100644 --- a/src/classes/action/battle.py +++ b/src/classes/action/battle.py @@ -57,11 +57,10 @@ class Battle(InstantAction): result_text = f"{winner} 战胜了 {loser},{loser} 受伤{loser_damage}点,{winner} 也受伤{winner_damage}点" result_event = Event(self.world.month_stamp, result_text) - # 生成战斗小故事:直接复用已生成的事件文本 + # 生成战斗小故事:使用便捷方法从参与者直接生成 target = self._get_target(avatar_name) - avatar_infos = StoryTeller.build_avatar_infos(self.avatar, target) start_text = getattr(self, "_start_event_content", "") or result_event.content - story = StoryTeller.tell_story(avatar_infos, start_text, result_event.content, self.STORY_PROMPT) + story = StoryTeller.tell_from_actors(start_text, result_event.content, self.avatar, target, prompt=self.STORY_PROMPT) story_event = Event(self.world.month_stamp, story) return [result_event, story_event] diff --git a/src/classes/action/breakthrough.py b/src/classes/action/breakthrough.py index 39894be..832ede7 100644 --- a/src/classes/action/breakthrough.py +++ b/src/classes/action/breakthrough.py @@ -140,13 +140,9 @@ class Breakthrough(TimedAction): if True: # 故事参与者:本体 +(可选)相关角色 - if getattr(self, "_calamity_other", None) is not None: - avatar_infos = StoryTeller.build_avatar_infos(self.avatar, self._calamity_other) - else: - avatar_infos = StoryTeller.build_avatar_infos(self.avatar) desc = CALAMITY_DESCRIPTIONS.get(str(calamity), "") prompt = (STORY_PROMPT_BASE.format(calamity=str(calamity)) + (" " + desc if desc else "")).strip() - story = StoryTeller.tell_story(avatar_infos, core_text, ("突破成功" if result_ok else "突破失败"), prompt) + story = StoryTeller.tell_from_actors(core_text, ("突破成功" if result_ok else "突破失败"), self.avatar, getattr(self, "_calamity_other", None), prompt=prompt) events.append(Event(self.world.month_stamp, story)) return events diff --git a/src/classes/mutual_action/dual_cultivation.py b/src/classes/mutual_action/dual_cultivation.py index b901788..f1239e0 100644 --- a/src/classes/mutual_action/dual_cultivation.py +++ b/src/classes/mutual_action/dual_cultivation.py @@ -105,10 +105,9 @@ class DualCultivation(MutualAction): result_event = Event(self.world.month_stamp, result_text) events.append(result_event) - # 生成恋爱/双修小故事:使用通用故事模板 - avatar_infos = StoryTeller.build_avatar_infos(self.avatar, target) + # 生成恋爱/双修小故事:使用 StoryTeller 便捷方法 start_text = self._start_event_content or result_event.content - story = StoryTeller.tell_story(avatar_infos, start_text, result_event.content, self.STORY_PROMPT) + story = StoryTeller.tell_from_actors(start_text, result_event.content, self.avatar, target, prompt=self.STORY_PROMPT) story_event = Event(self.world.month_stamp, story) events.append(story_event) else: diff --git a/src/classes/story_teller.py b/src/classes/story_teller.py index 1cb71c7..29d8e76 100644 --- a/src/classes/story_teller.py +++ b/src/classes/story_teller.py @@ -38,6 +38,8 @@ class StoryTeller: """ infos: Dict[str, dict] = {} for av in avatars: + if av is None: + continue infos[av.name] = av.get_info(detailed=True) return infos @@ -56,9 +58,25 @@ class StoryTeller: "style": random.choice(story_styles), "story_prompt": STORY_PROMPT or "", } - data = get_prompt_and_call_llm(template_path, infos, mode="fast") - story = data["story"].strip() - return story + try: + data = get_prompt_and_call_llm(template_path, infos, mode="fast") + story = data.get("story", "").strip() + if story: + return story + except Exception: + # 避免过度 try/catch,仅在外部依赖失败时提供降级 + pass + # 降级文案(不中断主流程) + style = infos.get("style", "") + return f"{event}。{res}。{style}" + + @staticmethod + def tell_from_actors(event: str, res: str, *actors: "Avatar", prompt: str | None = None) -> str: + """ + 便捷方法:直接从参与者对象生成 avatar_infos 并讲述故事。 + """ + avatar_infos = StoryTeller.build_avatar_infos(*actors) + return StoryTeller.tell_story(avatar_infos, event, res, prompt or "") __all__ = ["StoryTeller"] diff --git a/static/game_configs/sect.csv b/static/game_configs/sect.csv index 40110d5..3bc3ea9 100644 --- a/static/game_configs/sect.csv +++ b/static/game_configs/sect.csv @@ -3,9 +3,9 @@ id,name,desc,member_act_style,alignment,sect_surnames,male_sect_given_names,fema 1,明心剑宗,通玄界东方第一宗,以无上剑道称雄于世。云纹禁制为不传心法。,清明克己,行止如一。重剑与心法并重,讲究明心见性。,正,明;心;剑;霄;玄;霁;衡;孤;徽;肃,澄川;宏石;磐岳;霆岱;寂岚;久安;宸秋;烁离;沧岳;砺锋;炎洲;远歌,采微;霏岚;韶华;绮澜;珠影;远岫;若水;凝香;雪瑶;南絮;轻萝;宛竹,1, 2,百兽宗,以驯养灵兽闻名,豢养各种妖兽灵怪为战力。,你言语直接,重视力量与血性,崇尚狩猎与搏斗。,邪,,驼王;飞熊;虎魄;狼行;熊罡;白猿;石坚;山岚;青鬃;玄爪;金瞳;裂爪;破角;狂鬃;赤鬣;苍隼;啸风;裂岩,狐绮;白貂;青翎;雪牙;赤羽;玄狸;灵爪;月狐;银鳞;霜蹄;云貉;绒尾;锦狐;轻蹄,1, 3,水镜宗,正道十宗之一,实则严守中立。拥有仙界异宝"彻天水镜"可预知未来。,你处事冷静圆融,喜以柔克刚,擅借力与反制。,中,水;镜;寒;霜;冰;清;沐;澜;渊;泉,涟光;沧浪;泽远;浩川;泊舟;涓石;溪原;涵舟;泠曜;漪岑;淞岳;涔雨,漫霖;洛漪;潋月;涵烟;沁波;翠波;漫葭;汀兰;潭歌;涓玥;澧宁;潇然,1, -4,冥王宗,行走幽冥之道,术法阴冷狠厉。,你言辞冷厉少情,敬畏因果而不惧杀伐,偏向效率与结果。,邪,冥;王;玄;幽;夜;白;冷;狱;魇;阴,血燎;焚魄;灰灭;殁川;绝尘;厌离;朔寒;邪风;归墟;朽骨;朔月;止戈,寒绫;霜瑶;凄歌;素鸢;祭宁;黛魂;夙梦;绫雪;凛珑;霁月;旷音;凝岚,1000, +4,冥王宗,行走幽冥之道,术法阴冷狠厉。,你言辞冷厉少情,敬畏因果而不惧杀伐,偏向效率与结果。,邪,冥;王;玄;幽;夜;白;冷;狱;魇;阴,血燎;焚魄;灰灭;殁川;绝尘;厌离;朔寒;邪风;归墟;朽骨;朔月;止戈,寒绫;霜瑶;凄歌;素鸢;祭宁;黛魂;夙梦;绫雪;凛珑;霁月;旷音;凝岚,1, 5,朱勾宗,邪宗大派。以炼器、机关、暗杀闻名于世,素来阴毒冷僻。,你直面欲望与代价,不惧黑暗,以攻伐见长。,邪,朱;绯;刃;戮;蚀;渊;钧;鸦;墨;殷,暗阑;机括;鬼匣;夜禁;幻锁;残锋;暗弦;影栅;幽钩;断线;潜匿;迷踪,玄簪;霜绡;纤罗;碎玉;影裳;轻弦;凝黛;凝烟;冷珥;素纱;凛钗;寒袖,1, -6,合欢宗,以情入道,靠双修增进修为,善驭人心,长于权变。,你辞令婉转,善于拿捏人欲与局势,以柔制刚。,中,合;欢;苏;陆;柳;花;月;楚;顾;白,流烟;迟夜;长陌;归舟;暮成;远辞;行止;轻寒;沉香;野鹤;乘风,婉心;轻柔;疏影;如梦;绮念;惜香;慕雪;倾城;绯烟;晚晴;素袖;霁眉;绸缪;静妍,1000,"{""legal_actions"": [""DualCultivation""]}" +6,合欢宗,以情入道,靠双修增进修为,善驭人心,长于权变。,你辞令婉转,善于拿捏人欲与局势,以柔制刚。,中,合;欢;苏;陆;柳;花;月;楚;顾;白,流烟;迟夜;长陌;归舟;暮成;远辞;行止;轻寒;沉香;野鹤;乘风,婉心;轻柔;疏影;如梦;绮念;惜香;慕雪;倾城;绯烟;晚晴;素袖;霁眉;绸缪;静妍,1,"{""legal_actions"": [""DualCultivation""]}" 7,镇魂宗,铁血风格,擅安魂、封邪、渡厄,兼有刚烈镇压之术。,你肃穆沉稳,重安魂镇邪,少言而果决。,正,厉;卢;镇;魂;钟;青;凌;白;楚;顾,安魄;靖川;霁阳;季衡;砺甲;烁锋;昊戈;祁光;漠石;启封;殷策;定魄,清宁;素铃;靖霜;澄心;霁雪;安祈;净月;宁枝;祷绫;明槐;采霁;定寒,1, 8,幽魂噬影宗,镇宗典籍《幽冥录》。幽明气为根基。,你行事隐秘果断,重结果轻虚名,擅潜行与出其不意。,邪,冥;阎;鬼;幽;归;应;阴;碧;夜;魅,噬影;无藏;绝响;断痕;影渊;暗行;潜踪;魄隐;迷雾;空蝉;断念;裂隙,影绫;暗萝;霜绡;素鹭;玄绮;凝灯;绫岚;凛铃;朔华;漠音;宵岑;泠歌,1, 9,千帆城,炼器大宗,巧匠云集。著名法宝有灵灭丝、定魂蓝星、天罗网、万里极光壁、飞翼等。商旅云集,自成体系。,你务实精明,重交易与信誉,崇尚规则与秩序。,中,商;楚;顾;白;苏;林;叶;秦;赵;魏,持衡;清评;问价;立契;通衡;问道;理市;衡准;守约;筑匠;铸衡;估算,素蓝;明衡;巧心;青帆;绫舟;观星;衡绫;星槎;织霓;采绫;芸巧;霁行;砚秋;镶玑;绘蓝;银梭;珩心,1,