120 lines
3.9 KiB
Python
120 lines
3.9 KiB
Python
from __future__ import annotations
|
||
|
||
from dataclasses import dataclass, field
|
||
from typing import Optional, Dict
|
||
|
||
from src.utils.df import game_configs, get_str, get_int
|
||
from src.classes.effect import load_effect_from_str
|
||
from src.classes.cultivation import Realm
|
||
from src.classes.item import Item
|
||
|
||
|
||
@dataclass
|
||
class Auxiliary(Item):
|
||
"""
|
||
辅助装备类:提供各种辅助功能的装备
|
||
字段与 static/game_configs/auxiliary.csv 对应:
|
||
- realm: 装备等级(练气/筑基/金丹/元婴)
|
||
- effects: 解析为 dict,用于与 Avatar.effects 合并
|
||
"""
|
||
id: int
|
||
name: str
|
||
realm: Realm
|
||
desc: str
|
||
effects: dict[str, object] = field(default_factory=dict)
|
||
effect_desc: str = ""
|
||
# 特殊属性(用于存储实例特定数据)
|
||
special_data: dict = field(default_factory=dict)
|
||
|
||
def get_info(self, detailed: bool = False) -> str:
|
||
"""获取信息"""
|
||
if detailed:
|
||
return self.get_detailed_info()
|
||
return f"{self.name}"
|
||
|
||
def get_detailed_info(self) -> str:
|
||
"""获取详细信息"""
|
||
souls = ""
|
||
if self.name == "万魂幡" and self.special_data.get("devoured_souls", 0) > 0:
|
||
souls = f" 吞噬魂魄:{self.special_data['devoured_souls']}"
|
||
|
||
effect_part = f" 效果:{self.effect_desc}" if self.effect_desc else ""
|
||
return f"{self.name}({self.realm.value},{self.desc}{souls}){effect_part}"
|
||
|
||
def get_colored_info(self) -> str:
|
||
"""获取带颜色标记的信息,供前端渲染使用"""
|
||
r, g, b = self.realm.color_rgb
|
||
return f"<color:{r},{g},{b}>{self.get_info()}</color>"
|
||
|
||
def get_structured_info(self) -> dict:
|
||
full_desc = self.desc
|
||
# 特殊数据处理
|
||
souls = 0
|
||
if self.name == "万魂幡":
|
||
souls = self.special_data.get("devoured_souls", 0)
|
||
if souls > 0:
|
||
full_desc = f"{full_desc} (已吞噬魂魄:{souls})"
|
||
|
||
return {
|
||
"id": str(self.id),
|
||
"name": self.name,
|
||
"desc": full_desc,
|
||
"grade": self.realm.value,
|
||
"color": self.realm.color_rgb,
|
||
"effect_desc": self.effect_desc,
|
||
}
|
||
|
||
|
||
def _load_auxiliaries() -> tuple[Dict[int, Auxiliary], Dict[str, Auxiliary]]:
|
||
"""从配表加载 auxiliary 数据。
|
||
返回:(按ID、按名称 的映射)。
|
||
"""
|
||
auxiliaries_by_id: Dict[int, Auxiliary] = {}
|
||
auxiliaries_by_name: Dict[str, Auxiliary] = {}
|
||
|
||
df = game_configs.get("auxiliary")
|
||
if df is None:
|
||
return auxiliaries_by_id, auxiliaries_by_name
|
||
|
||
for row in df:
|
||
effects = load_effect_from_str(get_str(row, "effects"))
|
||
from src.classes.effect import format_effects_to_text
|
||
effect_desc = format_effects_to_text(effects)
|
||
|
||
# 解析grade
|
||
grade_str = get_str(row, "grade", "练气")
|
||
try:
|
||
realm = next(r for r in Realm if r.value == grade_str)
|
||
except StopIteration:
|
||
realm = Realm.Qi_Refinement
|
||
|
||
a = Auxiliary(
|
||
id=get_int(row, "item_id"),
|
||
name=get_str(row, "name"),
|
||
realm=realm,
|
||
desc=get_str(row, "desc"),
|
||
effects=effects,
|
||
effect_desc=effect_desc,
|
||
)
|
||
|
||
auxiliaries_by_id[a.id] = a
|
||
auxiliaries_by_name[a.name] = a
|
||
|
||
# 注册到全局注册表
|
||
from src.classes.item_registry import ItemRegistry
|
||
ItemRegistry.register(a.id, a)
|
||
|
||
return auxiliaries_by_id, auxiliaries_by_name
|
||
|
||
|
||
auxiliaries_by_id, auxiliaries_by_name = _load_auxiliaries()
|
||
|
||
|
||
def get_random_auxiliary_by_realm(realm: Realm) -> Optional[Auxiliary]:
|
||
"""获取指定境界的随机辅助装备"""
|
||
import random
|
||
candidates = [a for a in auxiliaries_by_id.values() if a.realm == realm]
|
||
if not candidates:
|
||
return None
|
||
return random.choice(candidates).instantiate()
|