add technique

This commit is contained in:
bridge
2025-10-04 23:06:39 +08:00
parent e17c9e35a9
commit aea1923ba6
7 changed files with 374 additions and 47 deletions

View File

@@ -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,
},
)