88 lines
2.6 KiB
Python
88 lines
2.6 KiB
Python
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}
|
||
|