add more effects

This commit is contained in:
bridge
2025-10-16 02:06:04 +08:00
parent f09f8318b9
commit 14317a7b78
8 changed files with 122 additions and 75 deletions

View File

@@ -25,7 +25,7 @@ CALAMITY_DESCRIPTIONS: dict[str, str] = {
"情劫": "柔情即刃,难舍难分,念头被拉回人间烟火。",
}
from src.classes.hp_and_mp import HP_MAX_BY_REALM, MP_MAX_BY_REALM
from src.classes.root import extra_breakthrough_success_rate
from src.classes.effect import _merge_effects
class Breakthrough(TimedAction):
@@ -45,7 +45,8 @@ class Breakthrough(TimedAction):
计算突破境界的成功率(由修为进度给出)
"""
base = self.avatar.cultivation_progress.get_breakthrough_success_rate()
bonus = extra_breakthrough_success_rate[self.avatar.root]
# 统一从 avatar.effects 读取额外加成root/technique/sect 等已合并)
bonus = float(self.avatar.effects.get("extra_breakthrough_success_rate", 0.0))
# 夹紧到 [0, 1]
return max(0.0, min(1.0, base + bonus))

View File

@@ -29,6 +29,10 @@ class Cultivate(TimedAction):
essence_types = get_essence_types_for_root(root)
essence_density = max((essence.get_density(et) for et in essence_types), default=0)
exp = self.get_exp(essence_density)
# 结算额外修炼经验(来自功法/宗门/灵根等已合并)
extra_exp = int(self.avatar.effects.get("extra_cultivate_exp", 0) or 0)
if extra_exp:
exp += extra_exp
self.avatar.cultivation_progress.add_exp(exp)
def get_exp(self, essence_density: int) -> int:

View File

@@ -20,6 +20,7 @@ from src.classes.event import NULL_EVENT, Event
from src.classes.typings import ACTION_NAME, ACTION_PARAMS, ACTION_NAME_PARAMS_PAIRS, ACTION_NAME_PARAMS_PAIR
from src.classes.action_runtime import ActionPlan, ActionInstance
from src.classes.effect import _merge_effects
from src.classes.alignment import Alignment
from src.classes.persona import Persona, personas_by_id, get_random_compatible_personas
from src.classes.item import Item
from src.classes.magic_stone import MagicStone
@@ -128,10 +129,13 @@ class Avatar:
@property
def effects(self) -> dict[str, object]:
merged: dict[str, object] = defaultdict(str)
# 来自宗门
if self.sect is not None and getattr(self.sect, "effects", None):
merged = _merge_effects(merged, self.sect.effects)
if self.technique is not None and getattr(self.technique, "effects", None):
merged = _merge_effects(merged, self.technique.effects)
# 来自功法
merged = _merge_effects(merged, self.technique.effects)
# 来自灵根
merged = _merge_effects(merged, self.root.effects)
return merged

View File

@@ -2,7 +2,7 @@ from __future__ import annotations
import json
import ast
from typing import Any
from typing import Any, Callable, Optional
def load_effect_from_str(value: object) -> dict[str, Any]:
@@ -62,3 +62,32 @@ def _merge_effects(base: dict[str, object], addition: dict[str, object]) -> dict
else:
merged[key] = val
return merged
def build_effects_map_from_df(
df,
key_column: str,
parse_key: Callable[[str], Any],
effects_column: str = "effects",
) -> dict[Any, dict[str, object]]:
"""
将配表 DataFrame 构造成 {key -> effects} 的映射:
- key_column用于定位键字符串通过 parse_key 解析为目标键(如 Enum
- effects_column字符串列使用 load_effect_from_str 解析
解析失败或空值的行将被忽略。
"""
effects_map: dict[Any, dict[str, object]] = {}
if df is None:
return effects_map
for _, row in df.iterrows():
raw_key = str(row.get(key_column, "")).strip()
if not raw_key or raw_key == "nan":
continue
try:
key = parse_key(raw_key)
except Exception:
continue
eff = load_effect_from_str(row.get(effects_column, ""))
if eff:
effects_map[key] = eff
return effects_map

View File

@@ -7,6 +7,8 @@
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
@@ -84,6 +86,13 @@ class Root(_RootMixin, Enum):
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, {}))
# 元素到灵气类型的一一对应
_essence_by_element = {
@@ -102,15 +111,17 @@ def get_essence_types_for_root(root: "Root") -> List[EssenceType]:
return [_essence_by_element[e] for e in root.elements]
# 额外突破成功率(默认 0.0),根据原 CSV 保留天灵根 0.1
extra_breakthrough_success_rate = defaultdict(
lambda: 0.0,
{
Root.HEAVEN: 0.1,
},
)
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",
)
def format_root_cn(root: "Root") -> str:
"""
将 Root 显示为中文短名 + 组成,例如:

View File

@@ -67,8 +67,6 @@ class Technique:
def get_detailed_info(self) -> str:
return f"{self.name}{self.attribute}{self.grade.value} {self.desc}"
# 五行与扩展属性的克制关系
# - 五行:金克木,木克土,土克水,水克火,火克金
# - 雷克邪;邪、冰、风、暗不克任何人