add technique
This commit is contained in:
@@ -2,15 +2,13 @@
|
||||
灵根
|
||||
五行元素与灵根组合:
|
||||
- RootElement:金、木、水、火、土(恒定不变)
|
||||
- Root:从 CSV 配置加载(单/双/天灵根等),每个成员包含(中文名, 元素列表)
|
||||
- Root:硬编码定义(单/双/天灵根等),每个成员包含(中文名, 元素列表)
|
||||
"""
|
||||
from enum import Enum
|
||||
from typing import List, Tuple, Dict
|
||||
from collections import defaultdict
|
||||
|
||||
from src.classes.essence import EssenceType
|
||||
from src.utils.df import game_configs
|
||||
from src.utils.config import CONFIG
|
||||
|
||||
|
||||
class RootElement(Enum):
|
||||
@@ -44,30 +42,41 @@ class _RootMixin:
|
||||
return f"{self.value}({', '.join(str(e) for e in self.elements)})"
|
||||
|
||||
|
||||
def _build_root_members_from_csv() -> Dict[str, tuple]:
|
||||
class Root(_RootMixin, Enum):
|
||||
"""
|
||||
从 CSV 读取 Root 定义,返回用于创建枚举的 members 映射。
|
||||
CSV 列:id,key,name,element_list,其中 element_list 用分号分隔中文名(如:金;木)。
|
||||
灵根(硬编码):成员值为 (中文名, 元素元组)。
|
||||
数据来源原为 CSV,现改为内置:
|
||||
- GOLD: 金灵根 -> 金
|
||||
- WOOD: 木灵根 -> 木
|
||||
- WATER: 水灵根 -> 水
|
||||
- FIRE: 火灵根 -> 火
|
||||
- EARTH: 土灵根 -> 土
|
||||
- THUNDER: 雷灵根 -> 水;土
|
||||
- ICE: 冰灵根 -> 金;水
|
||||
- WIND: 风灵根 -> 木;水
|
||||
- DARK: 暗灵根 -> 火;土
|
||||
- HEAVEN: 天灵根 -> 金;木;水;火;土(额外突破+0.1)
|
||||
"""
|
||||
df = game_configs.get("root")
|
||||
sep = CONFIG.df.ids_separator
|
||||
members: Dict[str, tuple] = {}
|
||||
for _, row in df.iterrows():
|
||||
key = str(row["key"]).strip()
|
||||
cn_name = str(row["name"]).strip()
|
||||
elements_field = str(row["element_list"]).strip()
|
||||
element_names = [s.strip() for s in elements_field.split(sep) if str(s).strip()]
|
||||
element_members: List[RootElement] = []
|
||||
for en in element_names:
|
||||
element_members.append(RootElement(en))
|
||||
members[key] = (cn_name, tuple(element_members))
|
||||
return members
|
||||
|
||||
|
||||
# 动态创建 Root 枚举(使用 mixin 作为 type,使 __new__ 生效)
|
||||
Root = Enum("Root", _build_root_members_from_csv(), type=_RootMixin)
|
||||
# 某些环境下函数式创建的 Enum 可能未正确采用 mixin 的 __str__,这里显式绑定确保生效
|
||||
Root.__str__ = _RootMixin.__str__
|
||||
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,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
# 元素到灵气类型的一一对应
|
||||
@@ -87,23 +96,10 @@ def get_essence_types_for_root(root: "Root") -> List[EssenceType]:
|
||||
return [_essence_by_element[e] for e in root.elements]
|
||||
|
||||
|
||||
def _load_extra_breakthrough_success_rate_from_csv() -> Dict["Root", float]:
|
||||
"""
|
||||
从 root.csv 载入各灵根的额外突破成功率,默认0。
|
||||
列名:extra_breakthrough_success_rate
|
||||
"""
|
||||
df = game_configs["root"]
|
||||
bonuses: Dict["Root", float] = {}
|
||||
for _, row in df.iterrows():
|
||||
key = str(row["key"]).strip()
|
||||
root_member = getattr(Root, key)
|
||||
bonus = float(row.get("extra_breakthrough_success_rate", 0) or 0)
|
||||
bonuses[root_member] = bonus
|
||||
return bonuses
|
||||
|
||||
|
||||
# 从配置构造带默认值的加成表
|
||||
# 额外突破成功率(默认 0.0),根据原 CSV 保留天灵根 0.1
|
||||
extra_breakthrough_success_rate = defaultdict(
|
||||
lambda: 0.0,
|
||||
_load_extra_breakthrough_success_rate_from_csv(),
|
||||
{
|
||||
Root.HEAVEN: 0.1,
|
||||
},
|
||||
)
|
||||
Reference in New Issue
Block a user