refactor effect system

This commit is contained in:
bridge
2026-01-04 22:03:05 +08:00
parent 806e2c1262
commit 276902bca0
17 changed files with 56 additions and 14 deletions

View File

@@ -76,7 +76,7 @@ def _load_auxiliaries() -> tuple[Dict[int, Auxiliary], Dict[str, Auxiliary]]:
for row in df:
effects = load_effect_from_str(get_str(row, "effects"))
from src.utils.effect_desc import format_effects_to_text
from src.classes.effect import format_effects_to_text
effect_desc = format_effects_to_text(effects)
# 解析grade

View File

@@ -40,7 +40,7 @@ from src.classes.nickname_data import Nickname
from src.utils.config import CONFIG
# Mixin 导入
from src.classes.avatar.effects_mixin import EffectsMixin
from src.classes.effect import EffectsMixin
from src.classes.avatar.inventory_mixin import InventoryMixin
from src.classes.avatar.action_mixin import ActionMixin

View File

@@ -17,7 +17,7 @@ from src.utils.config import CONFIG
def _get_effects_text(avatar: "Avatar") -> str:
"""获取格式化的效果文本"""
from src.utils.effect_desc import format_effects_to_text
from src.classes.effect import format_effects_to_text
breakdown = avatar.get_effect_breakdown()
effect_parts = []
for source_name, effects in breakdown:
@@ -383,7 +383,7 @@ def get_avatar_desc(avatar: "Avatar", detailed: bool = False) -> str:
lines.append("\n--- 当前效果明细 ---")
breakdown = avatar.get_effect_breakdown()
from src.utils.effect_desc import format_effects_to_text
from src.classes.effect import format_effects_to_text
if not breakdown:
lines.append("无额外效果")

View File

@@ -78,7 +78,7 @@ def _load_celestial_phenomena() -> dict[int, CelestialPhenomenon]:
# 解析effects
effects = load_effect_from_str(get_str(row, "effects"))
from src.utils.effect_desc import format_effects_to_text
from src.classes.effect import format_effects_to_text
effect_desc = format_effects_to_text(effects)
phenomenon = CelestialPhenomenon(

View File

@@ -0,0 +1,38 @@
from .consts import (
ALL_EFFECTS,
EXTRA_BATTLE_STRENGTH_POINTS,
EXTRA_MAX_HP,
EXTRA_OBSERVATION_RADIUS,
EXTRA_CULTIVATE_EXP,
CULTIVATE_DURATION_REDUCTION,
EXTRA_BREAKTHROUGH_SUCCESS_RATE,
EXTRA_DUAL_CULTIVATION_EXP,
EXTRA_HARVEST_ITEMS,
EXTRA_HUNT_ITEMS,
EXTRA_MOVE_STEP,
EXTRA_CATCH_SUCCESS_RATE,
EXTRA_ESCAPE_SUCCESS_RATE,
EXTRA_ASSASSINATE_SUCCESS_RATE,
EXTRA_FORTUNE_PROBABILITY,
EXTRA_MISFORTUNE_PROBABILITY,
EXTRA_CAST_SUCCESS_RATE,
EXTRA_WEAPON_PROFICIENCY_GAIN,
EXTRA_WEAPON_UPGRADE_CHANCE,
EXTRA_MAX_LIFESPAN,
EXTRA_HP_RECOVERY_RATE,
DAMAGE_REDUCTION,
REALM_SUPPRESSION_BONUS,
EXTRA_ITEM_SELL_PRICE_MULTIPLIER,
SHOP_BUY_PRICE_REDUCTION,
EXTRA_PLUNDER_MULTIPLIER,
LEGAL_ACTIONS,
)
from .process import (
load_effect_from_str,
build_effects_map_from_df,
_evaluate_conditional_effect,
_merge_effects,
)
from .mixin import EffectsMixin
from .desc import format_effects_to_text, translate_condition, EFFECT_DESC_MAP

View File

@@ -370,7 +370,7 @@ CSV 中 effects 列的写法支持宽松JSON格式:
# =============================================================================
"""
Effects 通过 src/classes/effect.py 中的 _merge_effects() 函数合并
Effects 通过 src/classes/effect/process.py 中的 _merge_effects() 函数合并
合并规则:
1. 列表类型 ( legal_actions): 取并集去重
@@ -447,3 +447,4 @@ ALL_EFFECTS = [
# 特殊权限
"legal_actions", # list[str] - 合法动作列表
]

View File

@@ -188,3 +188,4 @@ def format_effects_to_text(effects: dict[str, Any] | list[dict[str, Any]]) -> st
return f"[{cond}] {text}"
return text

View File

@@ -10,7 +10,7 @@ from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from src.classes.avatar.core import Avatar
from src.classes.effect import _merge_effects, _evaluate_conditional_effect
from .process import _merge_effects, _evaluate_conditional_effect
from src.classes.hp import HP_MAX_BY_REALM
@@ -204,3 +204,4 @@ class EffectsMixin:
def move_step_length(self: "Avatar") -> int:
"""获取角色的移动步长"""
return self.cultivation_progress.get_move_step()

View File

@@ -222,3 +222,4 @@ def build_effects_map_from_df(
if eff:
effects_map[key] = eff
return effects_map

0
src/classes/elixir.py Normal file
View File

View File

@@ -72,7 +72,7 @@ def _load_personas() -> tuple[dict[int, Persona], dict[str, Persona]]:
# 解析effects
effects = load_effect_from_str(get_str(row, "effects"))
from src.utils.effect_desc import format_effects_to_text
from src.classes.effect import format_effects_to_text
effect_desc = format_effects_to_text(effects)
persona = Persona(

View File

@@ -129,7 +129,7 @@ _root_effects_by_root = build_effects_map_from_df(
effects_column="effects",
)
from src.utils.effect_desc import format_effects_to_text
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()

View File

@@ -207,7 +207,7 @@ def _load_sects() -> tuple[dict[int, Sect], dict[str, Sect]]:
# 读取 effects
effects = load_effect_from_str(get_str(row, "effects"))
from src.utils.effect_desc import format_effects_to_text
from src.classes.effect import format_effects_to_text
effect_desc = format_effects_to_text(effects)
# 读取倾向兵器类型

View File

@@ -40,7 +40,7 @@ class SpiritAnimal:
return {"extra_battle_strength_points": pts} if pts else {}
def get_structured_info(self) -> dict:
from src.utils.effect_desc import format_effects_to_text
from src.classes.effect import format_effects_to_text
return {
"name": self.name,
"desc": f"境界:{self.realm.value}",

View File

@@ -130,7 +130,7 @@ def loads() -> tuple[dict[int, Technique], dict[str, Technique]]:
sect = None
effects = load_effect_from_str(get_str(row, "effects"))
from src.utils.effect_desc import format_effects_to_text
from src.classes.effect import format_effects_to_text
effect_desc = format_effects_to_text(effects)
t = Technique(

View File

@@ -70,7 +70,7 @@ def _load_weapons() -> tuple[Dict[int, Weapon], Dict[str, Weapon]]:
for row in df:
effects = load_effect_from_str(get_str(row, "effects"))
from src.utils.effect_desc import format_effects_to_text
from src.classes.effect import format_effects_to_text
effect_desc = format_effects_to_text(effects)
# 解析weapon_type

View File

@@ -213,7 +213,7 @@ def serialize_phenomenon(phenomenon) -> Optional[dict]:
rarity_str = phenomenon.rarity.level.name
# 生成效果描述
from src.utils.effect_desc import format_effects_to_text
from src.classes.effect import format_effects_to_text
effect_desc = format_effects_to_text(phenomenon.effects) if hasattr(phenomenon, "effects") else ""
return {