fix bug
This commit is contained in:
@@ -249,7 +249,7 @@ class MoveToAvatar(DefineAction, ActualActionMixin):
|
||||
for v in self.world.avatar_manager.avatars.values():
|
||||
if v.name == avatar_name:
|
||||
return v
|
||||
raise ValueError(f"未找到名为 {avatar_name} 的角色")
|
||||
return None
|
||||
|
||||
def _execute(self, avatar_name: str) -> None:
|
||||
target = self._get_target(avatar_name)
|
||||
@@ -265,6 +265,9 @@ class MoveToAvatar(DefineAction, ActualActionMixin):
|
||||
Move(self.avatar, self.world).execute(delta_x, delta_y)
|
||||
|
||||
def can_start(self, avatar_name: str|None = None) -> bool:
|
||||
target = self._get_target(avatar_name)
|
||||
if target is None:
|
||||
return False
|
||||
return True
|
||||
|
||||
def start(self, avatar_name: str) -> Event:
|
||||
@@ -837,7 +840,7 @@ class Battle(DefineAction, ActualActionMixin):
|
||||
if isinstance(res, tuple) and len(res) == 2:
|
||||
winner, loser = res
|
||||
return [Event(self.world.month_stamp, f"{winner} 战胜了 {loser}")]
|
||||
raise ValueError(f"Battle finish error: {res}")
|
||||
return []
|
||||
|
||||
|
||||
@long_action(step_month=3)
|
||||
|
||||
@@ -75,6 +75,8 @@ class Avatar:
|
||||
mp: MP = field(default_factory=lambda: MP(0, 0)) # 将在__post_init__中初始化
|
||||
relations: dict["Avatar", Relation] = field(default_factory=dict)
|
||||
alignment: Alignment = field(default_factory=lambda: random.choice(list(Alignment)))
|
||||
# 当月/当步新设动作标记:在 commit_next_plan 设为 True,首次 tick_action 后清为 False
|
||||
_new_action_set_this_step: bool = False
|
||||
|
||||
def __post_init__(self):
|
||||
"""
|
||||
@@ -165,6 +167,8 @@ class Avatar:
|
||||
# 启动
|
||||
start_event = action.start(**plan.params)
|
||||
self.current_action = ActionInstance(action=action, params=plan.params, status="running")
|
||||
# 标记为“本轮新设动作”,用于本月补充执行
|
||||
self._new_action_set_this_step = True
|
||||
return start_event
|
||||
return None
|
||||
|
||||
@@ -205,6 +209,8 @@ class Avatar:
|
||||
for e in mid_events:
|
||||
self._pending_events.append(e)
|
||||
events, self._pending_events = self._pending_events, []
|
||||
# 本轮已执行过,清除“新设动作”标记
|
||||
self._new_action_set_this_step = False
|
||||
return events
|
||||
|
||||
def update_cultivation(self, new_level: int):
|
||||
|
||||
@@ -65,6 +65,17 @@ class MutualAction(DefineAction, LLMAction):
|
||||
"""
|
||||
将反馈决定落地为目标角色的立即动作(清空后加载单步动作链)。
|
||||
"""
|
||||
# 若当前已是同类同参动作,直接跳过,避免重复“发起战斗”等事件刷屏
|
||||
try:
|
||||
cur = target_avatar.current_action
|
||||
if cur is not None:
|
||||
cur_name = getattr(cur.action, "__class__", type(cur.action)).__name__
|
||||
if cur_name == action_name:
|
||||
# 简单判断参数等价(键值相等)
|
||||
if getattr(cur, "params", {}) == dict(action_params):
|
||||
return
|
||||
except Exception:
|
||||
pass
|
||||
# 抢占:清空后续计划并中断其当前动作
|
||||
self._preempt_avatar(target_avatar)
|
||||
# 先加载为计划
|
||||
|
||||
Reference in New Issue
Block a user