From 45f1a6cce56d3b8a7c5aef95d8a292a9d71c0478 Mon Sep 17 00:00:00 2001 From: bridge Date: Thu, 9 Oct 2025 01:28:38 +0800 Subject: [PATCH] fix bug --- src/classes/action/move_to_region.py | 42 +++++++++++++++------------- src/classes/avatar.py | 3 +- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/classes/action/move_to_region.py b/src/classes/action/move_to_region.py index 7e7fea9..2c2f32a 100644 --- a/src/classes/action/move_to_region.py +++ b/src/classes/action/move_to_region.py @@ -16,14 +16,29 @@ class MoveToRegion(DefineAction, ActualActionMixin): DOABLES_REQUIREMENTS = "任何时候都可以执行" PARAMS = {"region": "region_name"} + def _resolve_region(self, region: Region | str) -> Region: + """ + 将字符串或全局Region实例解析为当前world.map中的Region实例: + - 优先使用 world.map.region_names + - 若传入是 Region 实例,按 id 映射到 world.map.regions + - 兜底返回原对象(避免KeyError中断) + """ + try: + if isinstance(region, str): + return self.world.map.region_names.get(region) or region # type: ignore[return-value] + # 非字符串:按 id 在 map 中取对应实例 + rid = getattr(region, "id", None) + if rid is not None and rid in self.world.map.regions: + return self.world.map.regions[rid] + return region + except Exception: + return region + def _execute(self, region: Region | str) -> None: """ 移动到某个region """ - if isinstance(region, str): - from src.classes.region import regions_by_name - - region = regions_by_name[region] + region = self._resolve_region(region) cur_loc = (self.avatar.pos_x, self.avatar.pos_y) region_center_loc = region.center_loc delta_x = region_center_loc[0] - cur_loc[0] @@ -38,26 +53,15 @@ class MoveToRegion(DefineAction, ActualActionMixin): return True def start(self, region: Region | str) -> Event: - if isinstance(region, str): - region_name = region - from src.classes.region import regions_by_name - - if region in regions_by_name: - region_name = regions_by_name[region].name - elif hasattr(region, "name"): - region_name = region.name - else: - region_name = str(region) + r = self._resolve_region(region) + region_name = getattr(r, "name", str(region)) return Event(self.world.month_stamp, f"{self.avatar.name} 开始移动向 {region_name}") def step(self, region: Region | str) -> ActionResult: self.execute(region=region) # 完成条件:到达目标区域 - if isinstance(region, str): - from src.classes.region import regions_by_name - - region = regions_by_name[region] - done = self.avatar.is_in_region(region) + r = self._resolve_region(region) + done = self.avatar.is_in_region(r if isinstance(r, Region) else None) return ActionResult(status=(ActionStatus.COMPLETED if done else ActionStatus.RUNNING), events=[]) def finish(self, region: Region | str) -> list[Event]: diff --git a/src/classes/avatar.py b/src/classes/avatar.py index a1fbbe5..f43c99d 100644 --- a/src/classes/avatar.py +++ b/src/classes/avatar.py @@ -125,7 +125,8 @@ class Avatar: personas_str = ", ".join([persona.name for persona in self.personas]) technique_str = self.technique.name if self.technique is not None else "无" sect_str = self.get_sect_str() - return f"Avatar(id={self.id}, 性别={self.gender}, 年龄={self.age}, name={self.name}, 宗门={sect_str}, 阵营={self.alignment.get_info()}, 区域={self.tile.region.name}, 灵根={str(self.root)}, 功法={technique_str}, 境界={self.cultivation_progress}, HP={self.hp}, MP={self.mp}, 个性={personas_str})" + region_name = self.tile.region.name if self.tile.region is not None else "无" + return f"Avatar(id={self.id}, 性别={self.gender}, 年龄={self.age}, name={self.name}, 宗门={sect_str}, 阵营={self.alignment.get_info()}, 区域={region_name}, 灵根={str(self.root)}, 功法={technique_str}, 境界={self.cultivation_progress}, HP={self.hp}, MP={self.mp}, 个性={personas_str})" def __str__(self) -> str: return self.get_info()