diff --git a/src/classes/mutual_action/attack.py b/src/classes/mutual_action/attack.py index 434fa56..2a838da 100644 --- a/src/classes/mutual_action/attack.py +++ b/src/classes/mutual_action/attack.py @@ -25,6 +25,9 @@ class Attack(MutualAction): def _can_start(self, target: "Avatar") -> tuple[bool, str]: """攻击无额外检查条件""" + from src.classes.observe import is_within_observation + if not is_within_observation(self.avatar, target): + return False, "目标不在交互范围内" return True, "" def _settle_feedback(self, target_avatar: "Avatar", feedback_name: str) -> None: diff --git a/src/classes/mutual_action/drive_away.py b/src/classes/mutual_action/drive_away.py index cb3dae0..d055a57 100644 --- a/src/classes/mutual_action/drive_away.py +++ b/src/classes/mutual_action/drive_away.py @@ -23,6 +23,9 @@ class DriveAway(MutualAction): def _can_start(self, target: "Avatar") -> tuple[bool, str]: """驱赶无额外检查条件""" + from src.classes.observe import is_within_observation + if not is_within_observation(self.avatar, target): + return False, "目标不在交互范围内" return True, "" def _settle_feedback(self, target_avatar: "Avatar", feedback_name: str) -> None: diff --git a/src/classes/mutual_action/gift_spirit_stone.py b/src/classes/mutual_action/gift_spirit_stone.py index 34115a1..8dc203b 100644 --- a/src/classes/mutual_action/gift_spirit_stone.py +++ b/src/classes/mutual_action/gift_spirit_stone.py @@ -34,6 +34,10 @@ class GiftSpiritStone(MutualAction): def _can_start(self, target: "Avatar") -> tuple[bool, str]: """检查赠送灵石的启动条件""" + from src.classes.observe import is_within_observation + if not is_within_observation(self.avatar, target): + return False, "目标不在交互范围内" + # 检查发起者的灵石是否足够 if self.avatar.magic_stone < self.GIFT_AMOUNT: return False, f"灵石不足(当前:{self.avatar.magic_stone},需要:{self.GIFT_AMOUNT})" diff --git a/src/classes/mutual_action/impart.py b/src/classes/mutual_action/impart.py index bc4e88a..fedbe34 100644 --- a/src/classes/mutual_action/impart.py +++ b/src/classes/mutual_action/impart.py @@ -37,6 +37,10 @@ class Impart(MutualAction): def _can_start(self, target: "Avatar") -> tuple[bool, str]: """检查传道特有的启动条件""" + from src.classes.observe import is_within_observation + if not is_within_observation(self.avatar, target): + return False, "目标不在交互范围内" + # 检查是否是师徒关系:师傅对徒弟的关系应该是 MASTER relation = self.avatar.get_relation(target) if relation != Relation.MASTER: diff --git a/src/classes/mutual_action/mutual_action.py b/src/classes/mutual_action/mutual_action.py index 3030c9b..0c52ad6 100644 --- a/src/classes/mutual_action/mutual_action.py +++ b/src/classes/mutual_action/mutual_action.py @@ -155,10 +155,6 @@ class MutualAction(DefineAction, LLMAction, TargetingMixin): target = self._get_target_avatar(target_avatar) if target is None: return False, "目标不存在" - from src.classes.observe import is_within_observation - ok = is_within_observation(self.avatar, target) - if not ok: - return False, "目标不在交互范围内" # 调用子类的额外检查 return self._can_start(target) diff --git a/src/classes/mutual_action/talk.py b/src/classes/mutual_action/talk.py index b8b579a..59ee93c 100644 --- a/src/classes/mutual_action/talk.py +++ b/src/classes/mutual_action/talk.py @@ -34,6 +34,9 @@ class Talk(MutualAction): def _can_start(self, target: "Avatar") -> tuple[bool, str]: """攀谈无额外检查条件""" + from src.classes.observe import is_within_observation + if not is_within_observation(self.avatar, target): + return False, "目标不在交互范围内" return True, "" def _handle_feedback_result(self, target: "Avatar", result: dict) -> ActionResult: