Files
cultivation-world-simulator/src/classes/root.py
2026-01-04 22:03:05 +08:00

154 lines
4.4 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.
"""
灵根
五行元素与灵根组合:
- 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}"