Files
NewWPSBot/Plugins/WPSCombatSystem/combat_plugin_status.py

144 lines
5.0 KiB
Python
Raw Normal View History

2025-11-10 14:59:07 +08:00
"""状态查看插件 - 显示玩家属性、装备和技能"""
from __future__ import annotations
2025-11-12 22:58:36 +08:00
from typing import Optional, Sequence
2025-11-10 14:59:07 +08:00
2025-11-10 21:44:28 +08:00
from PWF.Convention.Runtime.Config import *
2025-11-10 14:59:07 +08:00
from PWF.Convention.Runtime.GlobalConfig import ConsoleFrontColor, ProjectConfig
2025-11-12 22:58:36 +08:00
from Plugins.WPSAPI import GuideEntry
from Plugins.WPSCombatSystem.combat_models import EquipmentDefinition, PlayerStats
2025-11-10 14:59:07 +08:00
from .combat_plugin_base import WPSCombatBase
logger: ProjectConfig = ProjectConfig()
class WPSCombatStatus(WPSCombatBase):
"""状态查看插件"""
2025-11-12 22:58:36 +08:00
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 战斗操作参考。",
},
)
2025-11-10 14:59:07 +08:00
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)
2025-11-10 21:44:28 +08:00
def _format_status(self, stats: PlayerStats, equipped: Dict[str, Optional[EquipmentDefinition]]) -> str:
2025-11-10 14:59:07 +08:00
"""格式化状态输出"""
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"]