diff --git a/src/classes/action/catch.py b/src/classes/action/catch.py index 109e267..c0b19a9 100644 --- a/src/classes/action/catch.py +++ b/src/classes/action/catch.py @@ -80,7 +80,7 @@ class Catch(TimedAction): # 清理状态 self._caught_result = None region = self.avatar.tile.region - return Event(self.world.month_stamp, f"{self.avatar.name} 在 {region.name} 尝试御兽", related_avatars=[self.avatar.id]) + return Event(self.world.month_stamp, f"{self.avatar.name} 在 {self.avatar.tile.location_name} 尝试御兽", related_avatars=[self.avatar.id]) async def finish(self) -> list[Event]: res = self._caught_result diff --git a/src/classes/action/cultivate.py b/src/classes/action/cultivate.py index df3a65d..10238a8 100644 --- a/src/classes/action/cultivate.py +++ b/src/classes/action/cultivate.py @@ -95,7 +95,7 @@ class Cultivate(TimedAction): else: efficiency = "进境缓慢(灵气稀薄)" - return Event(self.world.month_stamp, f"{self.avatar.name} 在 {region.name} 开始修炼,{efficiency}", related_avatars=[self.avatar.id]) + return Event(self.world.month_stamp, f"{self.avatar.name} 在 {self.avatar.tile.location_name} 开始修炼,{efficiency}", related_avatars=[self.avatar.id]) async def finish(self) -> list[Event]: return [] diff --git a/src/classes/action/harvest.py b/src/classes/action/harvest.py index 579d76d..32cedd8 100644 --- a/src/classes/action/harvest.py +++ b/src/classes/action/harvest.py @@ -62,7 +62,7 @@ class Harvest(TimedAction): def start(self) -> Event: region = self.avatar.tile.region - return Event(self.world.month_stamp, f"{self.avatar.name} 在 {region.name} 开始采集", related_avatars=[self.avatar.id]) + return Event(self.world.month_stamp, f"{self.avatar.name} 在 {self.avatar.tile.location_name} 开始采集", related_avatars=[self.avatar.id]) # TimedAction 已统一 step 逻辑 diff --git a/src/classes/action/hunt.py b/src/classes/action/hunt.py index 556d277..5b84320 100644 --- a/src/classes/action/hunt.py +++ b/src/classes/action/hunt.py @@ -62,7 +62,7 @@ class Hunt(TimedAction): def start(self) -> Event: region = self.avatar.tile.region - return Event(self.world.month_stamp, f"{self.avatar.name} 在 {region.name} 开始狩猎", related_avatars=[self.avatar.id]) + return Event(self.world.month_stamp, f"{self.avatar.name} 在 {self.avatar.tile.location_name} 开始狩猎", related_avatars=[self.avatar.id]) # TimedAction 已统一 step 逻辑 diff --git a/src/classes/action/self_heal.py b/src/classes/action/self_heal.py index 4713132..9897d30 100644 --- a/src/classes/action/self_heal.py +++ b/src/classes/action/self_heal.py @@ -36,7 +36,7 @@ class SelfHeal(TimedAction): if not isinstance(region, SectRegion): return False hq_name = getattr(getattr(sect, "headquarter", None), "name", None) or getattr(sect, "name", None) - return bool(hq_name) and region.name == hq_name + return bool(hq_name) and region and region.name == hq_name def can_start(self) -> tuple[bool, str]: # 必须是宗门弟子且在自身宗门总部,且当前HP未满 diff --git a/src/classes/mutual_action/drive_away.py b/src/classes/mutual_action/drive_away.py index 6b0b7b9..5834d04 100644 --- a/src/classes/mutual_action/drive_away.py +++ b/src/classes/mutual_action/drive_away.py @@ -32,7 +32,7 @@ class DriveAway(MutualAction): fb = str(feedback_name).strip() if fb == "MoveAwayFromRegion": # 驱赶选择离开:必定成功,不涉及概率 - params = {"region": self.avatar.tile.region.name} + params = {"region": self.avatar.tile.location_name} self._set_target_immediate_action(target_avatar, fb, params) elif fb == "Attack": params = {"avatar_name": self.avatar.name} diff --git a/src/classes/mutual_action/occupy.py b/src/classes/mutual_action/occupy.py index a2ff33b..9ebf50e 100644 --- a/src/classes/mutual_action/occupy.py +++ b/src/classes/mutual_action/occupy.py @@ -43,7 +43,7 @@ class Occupy(MutualAction): if region is None: return None, None, f"无法找到区域:{region_name}" if not isinstance(region, CultivateRegion): - return None, None, f"{region.name} 不是修炼区域,无法占据" + return None, None, f"{region.name if region else '荒野'} 不是修炼区域,无法占据" return region, region.host_avatar, "" def can_start(self, region_name: str) -> tuple[bool, str]: @@ -61,7 +61,7 @@ class Occupy(MutualAction): self._start_month_stamp = self.world.month_stamp target_name = host.name if host else "无主之地" - event_text = f"{self.avatar.name} 对 {target_name} 的 {region.name} 发起抢夺" + event_text = f"{self.avatar.name} 对 {target_name} 的 {self.avatar.tile.location_name} 发起抢夺" rel_ids = [self.avatar.id] if host: @@ -93,7 +93,7 @@ class Occupy(MutualAction): region.host_avatar = self.avatar # 共用一个事件 - event_text = f"{self.avatar.name} 逼迫 {target_avatar.name} 让出了 {region.name}。" + event_text = f"{self.avatar.name} 逼迫 {target_avatar.name} 让出了 {self.avatar.tile.location_name}。" event = Event( self.world.month_stamp, event_text, @@ -116,7 +116,7 @@ class Occupy(MutualAction): if attacker_won: region.host_avatar = self.avatar - self._last_result = (winner, loser, loser_dmg, winner_dmg, region.name, attacker_won) + self._last_result = (winner, loser, loser_dmg, winner_dmg, self.avatar.tile.location_name, attacker_won) async def finish(self, region_name: str) -> list[Event]: """完成动作,生成战斗故事并处理死亡""" diff --git a/src/classes/tile.py b/src/classes/tile.py index c12c301..5b8c8eb 100644 --- a/src/classes/tile.py +++ b/src/classes/tile.py @@ -93,6 +93,14 @@ class Tile(): y: int region: 'Region' = None # 可以是一个region的一部分,也可以不属于任何region + @property + def location_name(self) -> str: + """ + 优雅地获取当前地点的名称。 + 如果属于某个区域,返回区域名;否则返回'荒野'。 + """ + return self.region.name if self.region else "荒野" + from src.utils.distance import manhattan_distance diff --git a/src/sim/simulator.py b/src/sim/simulator.py index be9c405..80b4a1c 100644 --- a/src/sim/simulator.py +++ b/src/sim/simulator.py @@ -87,7 +87,7 @@ class Simulator: # 记录事件 event = Event( self.world.month_stamp, - f"{avatar.name} 路过 {region.name},发现无主,将其占据。", + f"{avatar.name} 路过 {avatar.tile.location_name},发现无主,将其占据。", related_avatars=[avatar.id] ) avatar.add_event(event)