154 lines
4.4 KiB
Python
154 lines
4.4 KiB
Python
"""
|
||
灵根
|
||
五行元素与灵根组合:
|
||
- RootElement:金、木、水、火、土(恒定不变)
|
||
- Root:硬编码定义(单/双/天灵根等),每个成员包含(中文名, 元素列表)
|
||
"""
|
||
from enum import Enum
|
||
from typing import List, Tuple, Dict
|
||
from collections import defaultdict
|
||
from src.utils.df import game_configs
|
||
from src.classes.effect import build_effects_map_from_df
|
||
|
||
from src.classes.essence import EssenceType
|
||
|
||
|
||
class RootElement(Enum):
|
||
GOLD = "金"
|
||
WOOD = "木"
|
||
WATER = "水"
|
||
FIRE = "火"
|
||
EARTH = "土"
|
||
|
||
def __str__(self) -> str:
|
||
return self.value
|
||
|
||
|
||
class _RootMixin:
|
||
"""
|
||
Root 的基础实现:成员值为 (中文名, 元素元组)。
|
||
通过功能式 API 动态创建真正的 Root 枚举。
|
||
"""
|
||
|
||
def __new__(cls, cn_name: str, elements: Tuple[RootElement, ...]):
|
||
obj = object.__new__(cls)
|
||
obj._value_ = cn_name
|
||
obj._elements = elements
|
||
return obj
|
||
|
||
@property
|
||
def elements(self) -> Tuple[RootElement, ...]:
|
||
return self._elements
|
||
|
||
def __str__(self) -> str:
|
||
return f"{self.value}({', '.join(str(e) for e in self.elements)})"
|
||
|
||
|
||
class Root(_RootMixin, Enum):
|
||
"""
|
||
灵根(硬编码):成员值为 (中文名, 元素元组)。
|
||
数据来源原为 CSV,现改为内置:
|
||
- GOLD: 金灵根 -> 金
|
||
- WOOD: 木灵根 -> 木
|
||
- WATER: 水灵根 -> 水
|
||
- FIRE: 火灵根 -> 火
|
||
- EARTH: 土灵根 -> 土
|
||
- THUNDER: 雷灵根 -> 水;土
|
||
- ICE: 冰灵根 -> 金;水
|
||
- WIND: 风灵根 -> 木;水
|
||
- DARK: 暗灵根 -> 火;土
|
||
- HEAVEN: 天灵根 -> 金;木;水;火;土(额外突破+0.1)
|
||
"""
|
||
|
||
GOLD = ("金灵根", (RootElement.GOLD,))
|
||
WOOD = ("木灵根", (RootElement.WOOD,))
|
||
WATER = ("水灵根", (RootElement.WATER,))
|
||
FIRE = ("火灵根", (RootElement.FIRE,))
|
||
EARTH = ("土灵根", (RootElement.EARTH,))
|
||
THUNDER = ("雷灵根", (RootElement.WATER, RootElement.EARTH))
|
||
ICE = ("冰灵根", (RootElement.GOLD, RootElement.WATER))
|
||
WIND = ("风灵根", (RootElement.WOOD, RootElement.WATER))
|
||
DARK = ("暗灵根", (RootElement.FIRE, RootElement.EARTH))
|
||
HEAVEN = (
|
||
"天灵根",
|
||
(
|
||
RootElement.GOLD,
|
||
RootElement.WOOD,
|
||
RootElement.WATER,
|
||
RootElement.FIRE,
|
||
RootElement.EARTH,
|
||
),
|
||
)
|
||
|
||
def get_info(self) -> str:
|
||
return format_root_cn(self)
|
||
|
||
def get_detailed_info(self) -> str:
|
||
return self.get_info()
|
||
|
||
@property
|
||
def effects(self) -> dict[str, object]:
|
||
"""
|
||
从 CSV 读取的该灵根效果。
|
||
"""
|
||
return dict(_root_effects_by_root.get(self, {}))
|
||
|
||
@property
|
||
def effect_desc(self) -> str:
|
||
"""
|
||
获取灵根效果的文本描述。
|
||
"""
|
||
return _root_effect_desc_by_root.get(self, "")
|
||
|
||
|
||
# 元素到灵气类型的一一对应
|
||
_essence_by_element = {
|
||
RootElement.GOLD: EssenceType.GOLD,
|
||
RootElement.WOOD: EssenceType.WOOD,
|
||
RootElement.WATER: EssenceType.WATER,
|
||
RootElement.FIRE: EssenceType.FIRE,
|
||
RootElement.EARTH: EssenceType.EARTH,
|
||
}
|
||
|
||
|
||
def get_essence_types_for_root(root: "Root") -> List[EssenceType]:
|
||
"""
|
||
获取与该灵根匹配的灵气类型列表(任一元素匹配即视为可用)。
|
||
"""
|
||
return [_essence_by_element[e] for e in root.elements]
|
||
|
||
|
||
def _parse_root_key(raw: str) -> "Root":
|
||
return Root[raw]
|
||
|
||
|
||
_root_effects_by_root = build_effects_map_from_df(
|
||
game_configs.get("root"),
|
||
key_column="key",
|
||
parse_key=_parse_root_key,
|
||
effects_column="effects",
|
||
)
|
||
|
||
from src.classes.effect import format_effects_to_text
|
||
_root_effect_desc_by_root = {
|
||
root: format_effects_to_text(effects)
|
||
for root, effects in _root_effects_by_root.items()
|
||
}
|
||
|
||
def format_root_cn(root: "Root") -> str:
|
||
"""
|
||
将 Root 显示为中文短名 + 组成,例如:
|
||
- 天(金、木、水、火、土)
|
||
- 风(木、水)
|
||
- 金(金)
|
||
回退:若无法获取组成则仅显示短名。
|
||
"""
|
||
# Root 成员的 value 为中文名(如“风灵根”、“天灵根”)
|
||
name = getattr(root, "value", str(root))
|
||
short_name = name.replace("灵根", "") if isinstance(name, str) else str(root)
|
||
elements = getattr(root, "elements", None)
|
||
if not elements:
|
||
return short_name
|
||
# RootElement.__str__ 返回其中文值,因此直接 str(e)
|
||
elements_cn = "、".join(str(e) for e in elements)
|
||
return f"{short_name}({elements_cn})" |