from dataclasses import dataclass, field from typing import Optional from src.utils.df import game_configs, get_str, get_int, get_list_int from src.classes.item import Item, items_by_id from src.classes.cultivation import Realm @dataclass class Lode: """ 矿脉 """ id: int name: str desc: str realm: Realm item_ids: list[int] = field(default_factory=list) # 该矿脉对应的物品IDs # 这些字段将在__post_init__中设置 items: list[Item] = field(init=False, default_factory=list) # 该矿脉对应的物品实例 def __post_init__(self): """初始化物品实例""" for item_id in self.item_ids: if item_id in items_by_id: self.items.append(items_by_id[item_id]) def __hash__(self) -> int: return hash(self.id) def __str__(self) -> str: return self.name def get_info(self) -> str: """ 获取矿脉的详细信息 """ info_parts = [f"【{self.name}】({self.realm.value})", self.desc] if self.items: item_names = [item.name for item in self.items] info_parts.append(f"可获得矿石:{', '.join(item_names)}") return " - ".join(info_parts) def get_structured_info(self) -> dict: items_info = [item.get_structured_info() for item in self.items] return { "id": str(self.id), "name": self.name, "desc": self.desc, "grade": self.realm.value, "drops": items_info, "type": "lode" } def _load_lodes() -> tuple[dict[int, Lode], dict[str, Lode]]: """从配表加载lode数据""" lodes_by_id: dict[int, Lode] = {} lodes_by_name: dict[str, Lode] = {} # 检查配置是否存在,避免初始化错误 if "lode" not in game_configs: return {}, {} lode_df = game_configs["lode"] for row in lode_df: item_ids_list = get_list_int(row, "item_ids") lode = Lode( id=get_int(row, "id"), name=get_str(row, "name"), desc=get_str(row, "desc"), realm=Realm.from_id(get_int(row, "stage_id")), item_ids=item_ids_list ) lodes_by_id[lode.id] = lode lodes_by_name[lode.name] = lode return lodes_by_id, lodes_by_name # 从配表加载lode数据 lodes_by_id, lodes_by_name = _load_lodes() # 导出所有属于矿石的物品ID,供铸造逻辑判断 ORE_ITEM_IDS = {item_id for lode in lodes_by_id.values() for item_id in lode.item_ids}