Files
NewWPSBot/Plugins/WPSCombatSystem/combat_plugin_status.py
2025-11-12 22:58:36 +08:00

144 lines
5.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""状态查看插件 - 显示玩家属性、装备和技能"""
from __future__ import annotations
from typing import Optional, Sequence
from PWF.Convention.Runtime.Config import *
from PWF.Convention.Runtime.GlobalConfig import ConsoleFrontColor, ProjectConfig
from Plugins.WPSAPI import GuideEntry
from Plugins.WPSCombatSystem.combat_models import EquipmentDefinition, PlayerStats
from .combat_plugin_base import WPSCombatBase
logger: ProjectConfig = ProjectConfig()
class WPSCombatStatus(WPSCombatBase):
"""状态查看插件"""
def get_guide_subtitle(self) -> str:
return "查看战斗属性、装备栏与技能列表"
def collect_command_entries(self) -> Sequence[GuideEntry]:
return (
GuideEntry(
title="战斗属性",
identifier="战斗属性",
description="展示基础属性、装备强度与技能概览。",
metadata={"别名": "combat"},
icon="📊",
),
GuideEntry(
title="装备栏",
identifier="装备栏",
description="仅查看当前装备与各槽位详情。",
icon="🎽",
),
GuideEntry(
title="技能列表",
identifier="技能列表",
description="罗列当前可用技能、描述与冷却时间。",
icon="📜",
),
)
def collect_guide_entries(self) -> Sequence[GuideEntry]:
return (
{
"title": "属性来源",
"description": "数值由基础配置、装备加成与技能被动共同组成。",
},
{
"title": "技能冷却",
"description": "输出中会标注技能冷却回合,用于 PVP 战斗操作参考。",
},
)
def is_enable_plugin(self) -> bool:
return True
def wake_up(self) -> None:
super().wake_up()
logger.Log(
"Info",
f"{ConsoleFrontColor.GREEN}WPSCombatStatus 插件已加载{ConsoleFrontColor.RESET}"
)
self.register_plugin("战斗属性")
self.register_plugin("combat")
self.register_plugin("装备栏")
self.register_plugin("技能列表")
async def callback(self, message: str, chat_id: int, user_id: int) -> Optional[str]:
"""
处理状态查看命令
命令格式:
- 战斗属性:显示完整属性和装备
- 装备栏:只显示装备
- 技能列表:只显示技能
"""
message = self.parse_message_after_at(message).strip()
service = self.service()
# 根据具体命令显示不同内容
# 这里简化为都显示完整状态
stats = service.calculate_player_stats(user_id)
equipped = service.get_equipped_items(user_id)
# 格式化输出
output = self._format_status(stats, equipped)
return await self.send_markdown_message(output, chat_id, user_id)
def _format_status(self, stats: PlayerStats, equipped: Dict[str, Optional[EquipmentDefinition]]) -> str:
"""格式化状态输出"""
lines = ["# ⚔️ 战斗属性"]
# 基础属性
lines.append("\n**基础属性:**")
lines.append(f"- HP`{stats.hp}`")
lines.append(f"- ATK`{stats.atk}`")
lines.append(f"- DEF`{stats.def_}`")
lines.append(f"- SPD`{stats.spd}`")
lines.append(f"- CRIT`{stats.crit}%`")
lines.append(f"- CRIT_DMG`{stats.crit_dmg}%`")
lines.append(f"- 装备强度:`{stats.equipment_strength:.1f}`")
# 装备栏
lines.append("\n**装备栏:**")
slot_names = {
"weapon": "武器",
"helmet": "头盔",
"armor": "护甲",
"boots": "鞋子",
"accessory": "饰品",
}
for slot, eq_def in equipped.items():
slot_display = slot_names.get(slot, slot)
if eq_def:
# 显示装备属性
attrs = ", ".join([f"{k}+{v}" for k, v in eq_def.attributes.items()])
tier_label = eq_def.tier.to_markdown_label(eq_def.tier.display_name)
lines.append(f"- {slot_display}{tier_label} {eq_def.name} ({attrs})")
else:
lines.append(f"- {slot_display}`未装备`")
# 可用技能
lines.append("\n**可用技能:**")
if stats.available_skills:
for skill in stats.available_skills:
lines.append(f"- {skill.icon} **{skill.name}**")
lines.append(f" - {skill.description}")
if skill.cooldown > 0:
lines.append(f" - 冷却:{skill.cooldown}回合")
else:
lines.append("- `无可用技能`")
return "\n".join(lines)
__all__ = ["WPSCombatStatus"]