This commit is contained in:
2026-10-21 15:20:52 +08:00
parent 4b1df8c13b
commit 3937185d0a
80 changed files with 119 additions and 92 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ from typing import Any, Literal
from core.character.refs.base import SkillRef, resolve_skill
from core.abstract.character import CharacterProperty
from core.basic.skill import Skill
from core.basic.skill_effects import SkillEffectEngine, skill_effect_batch
from core.basic.skill.effects import SkillEffectEngine, skill_effect_batch
from core.basic.equipment import EquEffect, OathSuit, OathSuitSkill, Suit
from ..formula import get_base_attributes, 获取唤醒属性
from ..roleinfo import CharacterEmblemInfo, CharacterEquipInfo, get_key_by_value, CharacterOathInfo
+1 -1
View File
@@ -9,7 +9,7 @@ from ..roleinfo import CharacterEmblemInfo, CharacterEquipInfo, CharacterOathInf
from .base import CharacterBase
from .config_view import CalcConfigView
from .effect_apply import apply_uppercase_attrs
from ..skill_effects import skill_effect_batch
from ..skill.effects import skill_effect_batch
from ..skill import Skill
View File
+23
View File
@@ -0,0 +1,23 @@
"""技能基础包。
- base.py:技能基类、主动/被动与辅助技能,以及技能数据读取。
- effects.py:类型化效果收集、依赖解析和批量重算。
- effect_types.py:效果声明、表达式、条件及其属性/运算枚举。
- enums.py:技能伤害类型枚举。
"""
from .base import (
ActiveBufferSkill,
ActiveSkill,
BuffSkill,
PassiveBufferSkill,
PassiveSkill,
Skill,
get_data,
characterLv,
)
__all__ = [
'Skill', 'ActiveSkill', 'PassiveSkill', 'BuffSkill',
'ActiveBufferSkill', 'PassiveBufferSkill', 'get_data', 'characterLv',
]
@@ -5,12 +5,12 @@ import json
import re
from typing import Any, Literal, TYPE_CHECKING
from core.character.refs.base import SkillRef, resolve_skill
from .formula import 武器冷却惩罚
from ..formula import 武器冷却惩罚
from database.connect import get_redis_client
from api.core.Redis import get_redis_info
from api.utils.openapi_data import logical_skill_detail_path
from .skill_effects import INPUT_ATTRIBUTES
from .skill_effect_types import EffectDeclaration
from .effects import INPUT_ATTRIBUTES
from .effect_types import EffectDeclaration
if TYPE_CHECKING:
from core.basic.character import Character
@@ -141,7 +141,7 @@ class Skill:
value 是实际倍率、增量或覆盖值,目标优先使用 Ref 数组。
动态 effect 只构造声明并调用 super().effect,由引擎统一收集和应用。
维护示例见 core/basic/skill_effects.py 文件顶部说明。
维护示例见 core/basic/skill/effects.py 文件顶部说明。
"""
mode: list[str] = ['']
currentMode: str = ''
@@ -1,4 +1,4 @@
"""有类型的技能关联声明;完整维护说明见 skill_effects.py 文件顶部。
"""有类型的技能关联声明;完整维护说明见 effects.py 文件顶部。
表达式不可变、无副作用,并在求值前声明依赖。关联目标使用 Ref 数组,兼容旧技能名称。
公开类型、枚举成员和字段的中文文档用于编辑器补全与悬停提示。
@@ -13,7 +13,7 @@ from math import isfinite
from typing import TYPE_CHECKING, Literal, cast
if TYPE_CHECKING:
from .skill import Skill
from .base import Skill
class Operation(str, Enum):
@@ -1,6 +1,6 @@
"""技能关联计算与维护说明
技能关联由 `core/basic/skill_effects.py` 的 `SkillEffectEngine` 统一处理。
技能关联由 `core/basic/skill/effects.py` 的 `SkillEffectEngine` 统一处理。
`lv`、VP 等输入变化不再通过历史倍率乘除更新目标,而是重新解析最终状态并汇总本次关联贡献。
## 技能身份与引用维护
@@ -29,11 +29,11 @@ SkillRef.name 只影响提示,不参与相等性和哈希;技能名称变更
| 随 VP、等级或自身参数变化的关联 | `associate` 中的 `Read`、`LevelTable`、`Select`、`when` | 动态目标使用 `effect`,数值和条件使用表达式 |
| 技能给其他技能加级 | `SkillEffect(attribute=SkillAttribute.LEVEL, operation=Operation.ADD, ...)` | value 直接填整数增量;只给已学习的目标加级 |
| 生命之树这类共享等级 | 目标技能的 `level_source` | 指向源技能名称,不再写等级 getter/no-op setter |
| 新增会被关联修改、并影响后续关联的参数 | 技能类默认值 + `skill_effect_types.py` 的 `SkillAttribute`、`STATE_ATTRIBUTES` | 新参数同时检查读写范围;状态属性自动属于输入属性 |
| 新增会被关联修改、并影响后续关联的参数 | 技能类默认值 + `effect_types.py` 的 `SkillAttribute`、`STATE_ATTRIBUTES` | 新参数同时检查读写范围;状态属性自动属于输入属性 |
| 新增外部配置输入,改变它需要重新计算关联 | 技能类、配置赋值入口 + `INPUT_ATTRIBUTES` | 例如现有 `vp`;单纯登记不提供跨技能参数读取依赖 |
| 新增职业专用输出属性 | 职业文件内继承 `ProfessionAttribute` 定义枚举,并在目标技能设置数值默认值 | 成员紧跟中文文档字符串,IDE 可显示含义;不可通过 `Read` 读取 |
| 新增角色属性关联 | `skill_effect_types.py` 的 `CharacterAttribute`,并核对 `character/base.py` 的 `SetStatus` | 当前仅支持对应标量字段;特殊运算需单独实现 |
| 新增运算符、目标选择方式、跨技能非等级依赖 | `skill.py` 的公共关联入口 + `skill_effects.py` | 属于公共能力扩展,需配套单元测试 |
| 新增角色属性关联 | `effect_types.py` 的 `CharacterAttribute`,并核对 `character/base.py` 的 `SetStatus` | 当前仅支持对应标量字段;特殊运算需单独实现 |
| 新增运算符、目标选择方式、跨技能非等级依赖 | `base.py` 的公共关联入口 + `effects.py` | 属于公共能力扩展,需配套单元测试 |
| 装备改变技能等级或倍率 | 原装备规则及 `character/base.py` 的公共修改方法 | 使用已有批处理方法;低层直接写入须在 `batch()` 内 |
| 仅影响单次技能展示/输出的模式、VP、UP 变换 | 原技能 `setMode`、`vp_N`、输出计算方法 | `skillInfo()` 使用临时副本,不要误改为持久关联 |
@@ -41,7 +41,7 @@ SkillRef.name 只影响提示,不参与相等性和哈希;技能名称变更
## 声明示例和数值约定
关联统一使用 `skill_effect_types.py` 的不可变声明,`associate` 继续是数组,目标仍然使用技能名称数组:
关联统一使用 `effect_types.py` 的不可变声明,`associate` 继续是数组,目标仍然使用技能名称数组:
```python
associate = [
@@ -171,13 +171,13 @@ from dataclasses import dataclass
from functools import wraps
from graphlib import CycleError, TopologicalSorter
from math import prod
from .skill_effect_types import (
from .effect_types import (
CharacterAttribute, CharacterEffect, EffectDeclaration, MissingTargetPolicy, Operation,
SkillEffect, STATE_ATTRIBUTES,
)
# 状态属性定义在 skill_effect_types;技能类仍须提供相应默认值。
# 状态属性定义在 effect_types;技能类仍须提供相应默认值。
# 外部赋值触发重算的输入;登记在此不等于自动跟踪跨技能的该属性读取。
INPUT_ATTRIBUTES = STATE_ATTRIBUTES | {'vp', 'up', 'comboCol', 'stage', 'currentMode'}
# CharacterBase.SetStatus 实际支持的标量属性。