fix tile region = none bug
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 []
|
||||
|
||||
@@ -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 逻辑
|
||||
|
||||
|
||||
@@ -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 逻辑
|
||||
|
||||
|
||||
@@ -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未满
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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]:
|
||||
"""完成动作,生成战斗故事并处理死亡"""
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user