From 76e86eebb55885f040885346137095333ff8c385 Mon Sep 17 00:00:00 2001 From: bridge Date: Sat, 8 Nov 2025 02:59:54 +0800 Subject: [PATCH] fix bugs --- src/classes/action/battle.py | 21 ++++----------------- src/classes/fortune.py | 32 +++++++------------------------- src/sim/simulator.py | 7 ++++--- 3 files changed, 15 insertions(+), 45 deletions(-) diff --git a/src/classes/action/battle.py b/src/classes/action/battle.py index 4d9e763..6a8a649 100644 --- a/src/classes/action/battle.py +++ b/src/classes/action/battle.py @@ -4,8 +4,6 @@ from src.classes.action import InstantAction from src.classes.event import Event from src.classes.battle import decide_battle, get_effective_strength_pair from src.classes.story_teller import StoryTeller -from src.classes.action.event_helper import EventHelper -from src.utils.asyncio_utils import schedule_background class Battle(InstantAction): @@ -73,23 +71,12 @@ class Battle(InstantAction): pass result_event = Event(self.world.month_stamp, result_text, related_avatars=rel_ids) - # 异步生成战斗小故事并在完成后推送事件,避免阻塞事件循环 + # 生成战斗小故事(同步调用,与其他动作保持一致) target = self._get_target(avatar_name) start_text = getattr(self, "_start_event_content", "") or result_event.content - month_at_finish = self.world.month_stamp + 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, related_avatars=rel_ids) - async def _gen_and_push_story(): - story = await StoryTeller.tell_from_actors_async(start_text, result_event.content, self.avatar, target, prompt=self.STORY_PROMPT) - story_event = Event(month_at_finish, story, related_avatars=rel_ids) - EventHelper.push_pair(story_event, initiator=self.avatar, target=target, to_sidebar_once=True) - - def _fallback_sync(): - story = StoryTeller.tell_from_actors(start_text, result_event.content, self.avatar, target, prompt=self.STORY_PROMPT) - story_event = Event(month_at_finish, story, related_avatars=rel_ids) - EventHelper.push_pair(story_event, initiator=self.avatar, target=target, to_sidebar_once=True) - - schedule_background(_gen_and_push_story(), fallback=_fallback_sync) - - return [result_event] + return [result_event, story_event] diff --git a/src/classes/fortune.py b/src/classes/fortune.py index 05d4ec6..6c5ad2e 100644 --- a/src/classes/fortune.py +++ b/src/classes/fortune.py @@ -9,8 +9,6 @@ from src.utils.config import CONFIG from src.classes.avatar import Avatar from src.classes.event import Event from src.classes.story_teller import StoryTeller -from src.classes.action.event_helper import EventHelper -from src.utils.asyncio_utils import schedule_background from src.classes.technique import ( TechniqueGrade, get_random_upper_technique_for_avatar, @@ -237,7 +235,7 @@ def _get_fortune_technique_for_avatar(avatar: Avatar) -> Optional[Technique]: return random.choices(candidates, weights=weights, k=1)[0] -def try_trigger_fortune(avatar: Avatar) -> list[Event]: +async def try_trigger_fortune(avatar: Avatar) -> list[Event]: """ 在月度结算阶段尝试触发奇遇。 规则: @@ -300,35 +298,19 @@ def try_trigger_fortune(avatar: Avatar) -> list[Event]: related_avatars.append(master.id) actors_for_story = [avatar, master] # 拜师奇遇需要两个人的信息 - # 生成故事(异步避免阻塞) + # 生成故事(异步,等待完成) event_text = f"遭遇奇遇({theme}),{res_text}" story_prompt = "请据此写100~150字小故事。" month_at_finish = avatar.world.month_stamp base_event = Event(month_at_finish, event_text, related_avatars=related_avatars) - async def _gen_and_push_story(): - # 拜师奇遇传入两个角色,其他奇遇传入一个角色 - story = await StoryTeller.tell_from_actors_async(event_text, res_text, *actors_for_story, prompt=story_prompt) - story_event = Event(month_at_finish, story, related_avatars=related_avatars) - # 根据涉及角色数量推送事件 - if len(actors_for_story) == 1: - EventHelper.push_self(story_event, avatar, to_sidebar=True) - else: - # 拜师奇遇涉及两个角色 - EventHelper.push_pair(story_event, initiator=avatar, target=actors_for_story[1], to_sidebar_once=True) + # 生成故事事件 + story = await StoryTeller.tell_from_actors_async(event_text, res_text, *actors_for_story, prompt=story_prompt) + story_event = Event(month_at_finish, story, related_avatars=related_avatars) - def _fallback_sync(): - story = StoryTeller.tell_from_actors(event_text, res_text, *actors_for_story, prompt=story_prompt) - story_event = Event(month_at_finish, story, related_avatars=related_avatars) - if len(actors_for_story) == 1: - EventHelper.push_self(story_event, avatar, to_sidebar=True) - else: - EventHelper.push_pair(story_event, initiator=avatar, target=actors_for_story[1], to_sidebar_once=True) - - schedule_background(_gen_and_push_story(), fallback=_fallback_sync) - - return [base_event] + # 返回基础事件和故事事件 + return [base_event, story_event] __all__ = [ diff --git a/src/sim/simulator.py b/src/sim/simulator.py index 836626a..8c5a75f 100644 --- a/src/sim/simulator.py +++ b/src/sim/simulator.py @@ -107,7 +107,7 @@ class Simulator: events.append(event) return events - def _phase_passive_effects(self): + async def _phase_passive_effects(self): """ 被动结算阶段: - 更新时间效果(如HP回复) @@ -117,7 +117,8 @@ class Simulator: for avatar in self.world.avatar_manager.avatars.values(): avatar.update_time_effect() for avatar in list(self.world.avatar_manager.avatars.values()): - events.extend(try_trigger_fortune(avatar)) + fortune_events = await try_trigger_fortune(avatar) + events.extend(fortune_events) return events def _phase_log_events(self, events): @@ -155,7 +156,7 @@ class Simulator: events.extend(self._phase_update_age_and_birth()) # 6. 被动结算(时间效果+奇遇) - events.extend(self._phase_passive_effects()) + events.extend(await self._phase_passive_effects()) # 7. 日志 # 统一写入事件管理器