"""PVP对战插件 - 回合制战斗""" from __future__ import annotations from typing import Optional from PWF.Convention.Runtime.GlobalConfig import ConsoleFrontColor, ProjectConfig from .combat_plugin_base import WPSCombatBase logger: ProjectConfig = ProjectConfig() class WPSCombatBattle(WPSCombatBase): """PVP对战插件""" def is_enable_plugin(self) -> bool: return True def wake_up(self) -> None: super().wake_up() logger.Log( "Info", f"{ConsoleFrontColor.GREEN}WPSCombatBattle 插件已加载{ConsoleFrontColor.RESET}" ) self.register_plugin("挑战") self.register_plugin("接受挑战") self.register_plugin("拒绝挑战") self.register_plugin("战斗") self.register_plugin("battle") self.register_plugin("投降") # 启动超时检查(定期轮询) # TODO: 使用时钟调度器定期检查超时 async def callback(self, message: str, chat_id: int, user_id: int) -> Optional[str]: """ 处理PVP命令 命令格式: - 挑战 <目标用户ID> - 接受挑战 <挑战ID> - 拒绝挑战 <挑战ID> - 战斗 <战斗ID> <技能名> - 投降 <战斗ID> """ message = self.parse_message_after_at(message).strip() tokens = message.split() if not tokens: return await self.send_markdown_message( self._help_message(), chat_id, user_id ) command = tokens[0].lower() if command in ["挑战", "challenge"]: return await self._handle_challenge(chat_id, user_id, tokens[1:]) elif command in ["接受挑战", "accept"]: return await self._handle_accept(chat_id, user_id, tokens[1:]) elif command in ["拒绝挑战", "reject"]: return await self._handle_reject(chat_id, user_id, tokens[1:]) elif command in ["投降", "surrender"]: return await self._handle_surrender(chat_id, user_id, tokens[1:]) else: # 默认视为战斗动作 return await self._handle_battle_action(chat_id, user_id, tokens) async def _handle_challenge( self, chat_id: int, user_id: int, args: list ) -> Optional[str]: """处理挑战命令""" if not args: return await self.send_markdown_message( "❌ 请指定目标用户ID\n用法:`挑战 <目标用户ID>`", chat_id, user_id ) try: target_id = int(args[0]) except ValueError: return await self.send_markdown_message( "❌ 用户ID格式错误", chat_id, user_id ) if target_id == user_id: return await self.send_markdown_message( "❌ 不能挑战自己", chat_id, user_id ) service = self.service() success, msg, challenge_id = service.create_pvp_challenge(user_id, target_id) return await self.send_markdown_message(msg, chat_id, user_id) async def _handle_accept( self, chat_id: int, user_id: int, args: list ) -> Optional[str]: """处理接受挑战""" if not args: return await self.send_markdown_message( "❌ 请指定挑战ID\n用法:`接受挑战 <挑战ID>`", chat_id, user_id ) try: challenge_id = int(args[0]) except ValueError: return await self.send_markdown_message( "❌ 挑战ID格式错误", chat_id, user_id ) service = self.service() success, msg, battle_id = service.accept_challenge(challenge_id, user_id) return await self.send_markdown_message(msg, chat_id, user_id) async def _handle_reject( self, chat_id: int, user_id: int, args: list ) -> Optional[str]: """处理拒绝挑战""" if not args: return await self.send_markdown_message( "❌ 请指定挑战ID\n用法:`拒绝挑战 <挑战ID>`", chat_id, user_id ) try: challenge_id = int(args[0]) except ValueError: return await self.send_markdown_message( "❌ 挑战ID格式错误", chat_id, user_id ) service = self.service() success, msg = service.reject_challenge(challenge_id, user_id) return await self.send_markdown_message(msg, chat_id, user_id) async def _handle_battle_action( self, chat_id: int, user_id: int, tokens: list ) -> Optional[str]: """处理战斗动作""" if len(tokens) < 2: return await self.send_markdown_message( "❌ 命令格式错误\n用法:`战斗 <战斗ID> <技能名>`", chat_id, user_id ) try: battle_id = int(tokens[0]) except ValueError: return await self.send_markdown_message( "❌ 战斗ID格式错误", chat_id, user_id ) skill_name = " ".join(tokens[1:]) service = self.service() success, msg = service.execute_battle_action(battle_id, user_id, skill_name) return await self.send_markdown_message(msg, chat_id, user_id) async def _handle_surrender( self, chat_id: int, user_id: int, args: list ) -> Optional[str]: """处理投降""" if not args: return await self.send_markdown_message( "❌ 请指定战斗ID\n用法:`投降 <战斗ID>`", chat_id, user_id ) try: battle_id = int(args[0]) except ValueError: return await self.send_markdown_message( "❌ 战斗ID格式错误", chat_id, user_id ) service = self.service() success, msg = service.surrender_battle(battle_id, user_id) return await self.send_markdown_message(msg, chat_id, user_id) def _help_message(self) -> str: """帮助信息""" return """# ⚔️ PVP对战系统 **命令格式:** - `挑战 <目标用户ID>`:发起PVP挑战 - `接受挑战 <挑战ID>`:接受挑战 - `拒绝挑战 <挑战ID>`:拒绝挑战 - `战斗 <战斗ID> <技能名>`:执行战斗动作 - `投降 <战斗ID>`:投降 **说明:** - 挑战有效期15分钟,超时自动失效 - 回合制战斗,速度高者先手 - 胜者获得1000积分(或失败者全部积分) - 超时未操作视为失败 - 可随时投降 **示例:** - `挑战 12345`:向用户12345发起挑战 - `接受挑战 1`:接受挑战ID为1的挑战 - `战斗 1 攻击`:在战斗1中使用"攻击"技能 - `投降 1`:在战斗1中投降 """ __all__ = ["WPSCombatBattle"]