Files
cultivation-world-simulator/src/classes/auxiliary.py
2026-01-11 23:12:48 +08:00

120 lines
3.9 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 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()