fix tile region = none bug

This commit is contained in:
bridge
2025-12-20 19:26:53 +08:00
parent c772edfff0
commit 3d117c2fb2
9 changed files with 19 additions and 11 deletions

View File

@@ -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

View File

@@ -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 []

View File

@@ -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 逻辑

View File

@@ -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 逻辑

View File

@@ -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未满

View File

@@ -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}

View File

@@ -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]:
"""完成动作,生成战斗故事并处理死亡"""

View File

@@ -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