diff --git a/backend/core/basic/character/base.py b/backend/core/basic/character/base.py index 3ebf3eaf..67403fc0 100644 --- a/backend/core/basic/character/base.py +++ b/backend/core/basic/character/base.py @@ -1,9 +1,10 @@ from collections.abc import Mapping -import sys 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.equipment import EquEffect, OathSuit, OathSuitSkill, Suit from ..formula import get_base_attributes, 获取唤醒属性 from ..roleinfo import CharacterEmblemInfo, CharacterEquipInfo, get_key_by_value, CharacterOathInfo @@ -35,6 +36,12 @@ class CharacterBase(CharacterProperty): BindAwake: int """绑定觉醒等级""" skills: list['Skill'] + skills_ref_dict: dict[SkillRef, 'Skill'] + """当前角色的技能引用索引;不会共享其他角色的技能实例。""" + skills_code_dict: dict[str, 'Skill'] + """当前角色的原始 code 索引。""" + skill_ref_profession: str | None + """技能数据来源职业范围,职业变体可复用来源职业。""" skills_dict: dict[str, 'Skill'] skills_id_dict: dict[str, 'Skill'] skills_uuid_dict: dict[str, 'Skill'] @@ -172,12 +179,16 @@ class CharacterBase(CharacterProperty): self.equ_options = {} self.max_point = 0 self.skills = [] + self.skills_ref_dict = {} + self.skills_code_dict = {} + self.skill_ref_profession = None self.skills_dict = {} self.skills_id_dict = {} self.skills_uuid_dict = {} self.skill_names_cache = {} self.skills_cache = {} self.load_skills() + self.skill_effects = SkillEffectEngine(self) # region 角色属性设置 @@ -188,6 +199,7 @@ class CharacterBase(CharacterProperty): for index, i in enumerate([get_key_by_value(i) for i in ['力量', '体力', '智力', '精神']]): setattr(self, i, getattr(self, i) + temp[index] + 唤醒) + @skill_effect_batch def SetStatus( self, 力量=0, @@ -323,6 +335,7 @@ class CharacterBase(CharacterProperty): value = int(value * (1 + self.jade_effect.ElementIncrease)) self.ElementDB[element] += value + @skill_effect_batch def AddSkillLv(self, min: int, max: int, lv: int, type=-1, exceptSkills: tuple[str, ...] = ()) -> None: """ 增加技能等级 @@ -334,18 +347,21 @@ class CharacterBase(CharacterProperty): if (skillType == 'all' or skill.type == skillType) and skill.lv > 0 and skill.name not in exceptSkills: skill.lv += lv + @skill_effect_batch def SetSkillCD(self, min=1, max=100, cd=0, exclude: tuple[int, ...] = (50, 85, 100)) -> None: """设置技能CD""" for skill in self.skills: if min <= skill.learnLv <= max and (skill.type == 'active' or skill.damage) and skill.learnLv not in exclude: skill.cdReduce *= 1 - cd + @skill_effect_batch def SetSkillCDRecover(self, min=1, max=100, cd=0, exclude: tuple[int, ...] = (50, 85, 100)) -> None: """设置技能CD恢复""" for skill in self.skills: if min <= skill.learnLv <= max and (skill.type == 'active' or skill.damage) and skill.learnLv not in exclude: skill.cdRecover += cd + @skill_effect_batch def SetSkillRation(self, min=1, max=100, ratio=1, type=-1) -> None: """设置技能倍率 0 修改技能面板 1 不修改技能面板 @@ -362,6 +378,20 @@ class CharacterBase(CharacterProperty): # region 技能查询 + def GetSkill(self, reference: SkillRef | str) -> 'Skill | None': + """按类型化引用查询当前角色技能,兼容旧显示名称字符串。""" + return resolve_skill(self, reference) + + def GetSkillByRef(self, reference: SkillRef) -> 'Skill | None': + """按技能身份查询;校验职业范围,缺失返回 None。""" + if not isinstance(reference, SkillRef): + raise TypeError('GetSkillByRef 必须传入 SkillRef') + return resolve_skill(self, reference) + + def GetSkillByCode(self, code: str) -> 'Skill | None': + """在当前角色中按原始 code 查询,不与显示名称隐式混用。""" + return self.skills_code_dict.get(code) + def GetSkillByName(self, name) -> 'Skill': """通过技能名获取技能""" return self.skills_dict.get(name, None) diff --git a/backend/core/basic/character/calc_equip.py b/backend/core/basic/character/calc_equip.py index f5f26da1..bb226c26 100644 --- a/backend/core/basic/character/calc_equip.py +++ b/backend/core/basic/character/calc_equip.py @@ -2,12 +2,15 @@ import sys from functools import cache from uuid import uuid1 +from core.character.refs.base import bind_skill_refs from core.basic.equipment import OathSuit, Suit, get_equipment from ..formula import 增幅计算, 强化技攻, 武器强化计算, 精通计算, 耳环计算, 左右计算, 锻造计算 from ..roleinfo import CharacterEmblemInfo, CharacterEquipInfo, CharacterOathInfo, get_key_by_value 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 import Skill @cache @@ -16,7 +19,10 @@ def get_skill_classes(module_name: str) -> tuple[type, ...]: return tuple( memberClass for name in dir(module) - if isinstance((memberClass := getattr(module, name)), type) and memberClass.__name__.startswith('Skill') + if isinstance((memberClass := getattr(module, name)), type) + and memberClass is not Skill + and issubclass(memberClass, Skill) + and memberClass.__name__.startswith('Skill') ) @@ -60,8 +66,9 @@ class CalcEquipMixin(CharacterBase): self.SetDetail(setInfo) self.SetSkills(setInfo.get('skills', {})) + @skill_effect_batch def SetSkills(self, skills: dict[str, dict]): - """设置技能等级""" + """批量设置基础等级及 VP/UP;等级不含关联加级,共享等级由 level_source 决定。""" for key in skills: skill = self.GetSkillByID(key) if skill is not None: @@ -69,7 +76,7 @@ class CalcEquipMixin(CharacterBase): skill.up = skills[key].get('up', 0) if skill.hasVP: skill.vp = skills[key].get('vp', 0) - skill.lv += skills[key].get('lv', 0) + self.skill_effects.set_input_level(skill, skills[key].get('lv', 0)) def load_skills(self) -> None: """加载技能""" @@ -79,6 +86,9 @@ class CalcEquipMixin(CharacterBase): self.skills_id_dict[str(skill.id)] = skill self.skills_uuid_dict[str(skill.uuid)] = skill self.skills.append(skill) + # 职业变体通过数据 prefix 复用同一身份范围,不依赖显示名称或模块别名。 + prefix = getattr(sys.modules[self.moduleName], 'prefix', '') + bind_skill_refs(self, '.'.join(prefix.split('/')[:2])) # endregion @@ -436,17 +446,20 @@ class CalcEquipMixin(CharacterBase): def calc(self, setInfo: dict[str, dict]): config = CalcConfigView(setInfo).as_legacy_dict() - self.calc_init(config) - self.SetBaseStatus() - self.calc_jade(config.get('jades', [])) - self.calc_avatar(config.get('avatar', {})) - self.calc_basic() - self.calc_sundry(config.get('sundry', {})) - self.calc_emblems() - self.calc_oath_upgrade() - suit = self.calc_suits() - self.calc_equs() - self.calc_oaths() + # 装备等外部加成作为技能关联的基础值;批次结束后按最终技能状态重建关联。 + # 装备之间仍有先后依赖(如先计算套装积分),不能据此任意交换下面的调用。 + with self.skill_effects.batch(): + self.calc_init(config) + self.SetBaseStatus() + self.calc_jade(config.get('jades', [])) + self.calc_avatar(config.get('avatar', {})) + self.calc_basic() + self.calc_sundry(config.get('sundry', {})) + self.calc_emblems() + self.calc_oath_upgrade() + suit = self.calc_suits() + self.calc_equs() + self.calc_oaths() skillInfos = [] if self.buffer: skillInfos = self.calc_buffer_skills() diff --git a/backend/core/basic/skill.py b/backend/core/basic/skill.py index e2a541dc..d44d12d6 100644 --- a/backend/core/basic/skill.py +++ b/backend/core/basic/skill.py @@ -4,10 +4,13 @@ from functools import cache import json import re from typing import Any, Literal, TYPE_CHECKING +from core.character.refs.base import SkillRef, resolve_skill from .formula import 武器冷却惩罚 from database.connect import get_redis_client from api.core.Redis import get_redis_info from api.utils.openapi_data import OPENAPI_CUSTOM_CN_PATH, logical_skill_detail_path +from .skill_effects import CHARACTER_ATTRIBUTES, INPUT_ATTRIBUTES +from .skill_effect_types import CharacterEffect, EffectDeclaration, SkillEffect if TYPE_CHECKING: from core.basic.character import Character @@ -84,9 +87,29 @@ def get_data(prefix: str, key: int | str, func: Callable[[Any], Any] = _identity class Skill: + def __setattr__(self, name, value): + char = self.__dict__.get('char') + engine = getattr(char, 'skill_effects', None) + if name != 'lv' and name in INPUT_ATTRIBUTES and engine is not None and engine.owns(self) and not engine.resolving: + engine.set_attribute(self, name, value) + else: + object.__setattr__(self, name, value) + name: str = '' """技能名称""" _lv: int = 0 + ref: SkillRef | None = None + """技能身份引用;职业类绑定 Ref 成员,code 由此派生。""" + + @property + def code(self) -> str | None: + """技能树原始 code;未迁移的技能返回 None,不单独维护副本。""" + return self.ref.code if self.ref is not None else None + + level_source: SkillRef | str | None = None + """共享等级的源技能;目标不独立加级,也不使用自身 maxLv 截断。""" + association_source: bool | None = None + """共享等级技能默认仅复用等级;需要独立提供关联效果时显式开启。""" id: int = 0 """技能ID""" icon: str = '$char/$uuid' @@ -130,16 +153,18 @@ class Skill: """技能冷却倍率,直接体现在面板上,不被上限影响""" cdRecover: float = 1 """技能冷却恢复""" - associate: list = [] - """关联技能 - type: 关联类型 *乘算 +加算 =直接赋值 $角色属性 默认'*skillDamage' - e.g. - *skillDamage 乘算技能伤害 - *cdReduce 乘算技能冷却缩减 - $*PATK 乘算角色物理攻击 - ~直接走type对应的函数名称 传参为old,new,data,skills,exceptSkills - skills: 关联技能 默认 '*' - exceptSkills: 例外技能 默认[] + associate: list[dict[str, Any] | EffectDeclaration] = [] + """关联声明;维护示例和扩展边界见 core/basic/skill_effects.py 文件顶部说明。 + + 新规则使用 SkillEffect/CharacterEffect 和 Ref 目标数组,兼容旧字典及名称字符串。 + 新声明 value 是实际倍率/增量/覆盖值,以下 type、data、ratio 约定仅适用于旧字典。 + type 默认 '*skillDamage':*乘算、+加算、=覆盖;$*PAtkP 等作用于角色。 + skills 默认 '*',表示所有伤害技能;显式列表使用技能名称,可指定被动技能。 + exceptSkills 默认 [];weapon 默认职业武器选项;precondition() 控制前置条件。 + data 按来源等级取值;ratio 是数据除数,默认 100,与技能的 ratio 属性不同。 + +lv 的整数加级通常设置 ratio=1;=覆盖直接使用 data 值,不除以 ratio。 + 动态 effect 以 (0, 最终等级) 多次收集,只构造声明并调用 super().effect。 + 自定义 type 方法仍有兼容入口,但直接修改目标会绕过贡献收集,新增规则勿照搬。 """ mode: list[str] = [''] currentMode: str = '' @@ -159,6 +184,10 @@ class Skill: def __init__(self, char): self.char = char + # Shared-level display skills override the setter with a no-op. They + # did not apply their own associations in the original calculation. + if self.association_source is None: + self.association_source = self.level_source is None and type(self).lv.fset is Skill.lv.fset self.id = self._extract_id() self.icon = self._generate_icon() if self.line is None: @@ -199,11 +228,22 @@ class Skill: @property def lv(self): """技能等级""" + engine = getattr(self.char, 'skill_effects', None) + if engine is not None and engine.owns(self): + engine.read_level(self) + elif self.level_source is not None: + return resolve_skill(self.char, self.level_source).lv return self._lv @lv.setter def lv(self, value): - value = int(min(self.maxLv, value)) + if self.level_source is not None: + return + engine = getattr(self.char, 'skill_effects', None) + if engine is not None and engine.owns(self) and not engine.resolving: + engine.set_level(self, max(0, int(value))) + return + value = int(max(0, min(self.maxLv, value))) if self._lv != value: self.effect(self._lv, value) self._lv = value @@ -212,6 +252,12 @@ class Skill: weapon_type = self.char.GetWeaponType()[0] weapon_options = self.char.武器选项 for assoc in self.associate: + if isinstance(assoc, (SkillEffect, CharacterEffect)): + engine = getattr(self.char, 'skill_effects', None) + if engine is None: + raise RuntimeError('类型化效果需要 SkillEffectEngine') + engine.collect_effect(self, assoc) + continue type = assoc.get('type', '*skillDamage') skills = assoc.get('skills', '*') data = assoc.get('data', [0] * self.maxLv) @@ -238,10 +284,20 @@ class Skill: value = (1 - self.get_data_value(data, new) / ratio) / (1 - self.get_data_value(data, old) / ratio) else: value = (1 + self.get_data_value(data, new) / ratio) / (1 + self.get_data_value(data, old) / ratio) - self.char.SetStatus(**{type[2:]: value}) + engine = getattr(self.char, 'skill_effects', None) + if engine is not None and engine.collecting is self: + if type[2:] in CHARACTER_ATTRIBUTES: + engine.record(self, self.char, type[2:], '*', value) + else: + self.char.SetStatus(**{type[2:]: value}) elif type.startswith('$+'): value = self.get_data_value(data, new) / ratio - self.get_data_value(data, old) / ratio - self.char.SetStatus(**{type[2:]: value}) + engine = getattr(self.char, 'skill_effects', None) + if engine is not None and engine.collecting is self: + if type[2:] in CHARACTER_ATTRIBUTES: + engine.record(self, self.char, type[2:], '+', value) + else: + self.char.SetStatus(**{type[2:]: value}) else: exceptSkills = set(exceptSkills) if skills == '*': @@ -256,6 +312,10 @@ class Skill: skill = self.char.GetSkillByName(name) if skill is not None: self.update_skill_attribute(skill, type, old, new, data, ratio, weapon, weapon_type, weapon_options) + else: + engine = getattr(self.char, 'skill_effects', None) + if engine is not None and engine.collecting is self: + engine.missing_target(self, name) except Exception as e: # print(f"Error applying association {type} for skill {self.name}: {e}") raise e @@ -265,6 +325,23 @@ class Skill: return old_value = self.get_data_value(data, old) new_value = self.get_data_value(data, new) + engine = getattr(self.char, 'skill_effects', None) + if engine is not None and engine.collecting is self: + if type[1:] == 'lv' and skill.level_source is not None: + return + if type.startswith('*'): + if 'cdReduce' in type or 'cdRatio' in type: + value = (1 - new_value / ratio) / (1 - old_value / ratio) + else: + value = (1 + new_value / ratio) / (1 + old_value / ratio) + elif type.startswith('+'): + if type[1:] == 'lv' and not engine.is_learned(skill): + return + value = (new_value - old_value) / ratio + else: + value = new_value + engine.record(self, skill, type[1:], type[0], value) + return if type.startswith('*'): if 'cdReduce' in type or type == 'cd' or 'cdRatio' in type: setattr(skill, type[1:], getattr(skill, type[1:]) * (1 - new_value / ratio) / (1 - old_value / ratio)) diff --git a/backend/core/basic/skill_effect_types.py b/backend/core/basic/skill_effect_types.py new file mode 100644 index 00000000..83f06b9a --- /dev/null +++ b/backend/core/basic/skill_effect_types.py @@ -0,0 +1,559 @@ +"""有类型的技能关联声明;完整维护说明见 skill_effects.py 文件顶部。 + +表达式不可变、无副作用,并在求值前声明依赖。关联目标使用 Ref 数组,兼容旧技能名称。 +公开类型、枚举成员和字段的中文文档用于编辑器补全与悬停提示。 +""" +from __future__ import annotations + +from core.character.refs.base import SkillRef, resolve_skill +from collections.abc import Sequence +from dataclasses import dataclass, field +from enum import Enum +from math import isfinite +from typing import TYPE_CHECKING, Literal, cast + +if TYPE_CHECKING: + from .skill import Skill + + +class Operation(str, Enum): + """效果汇总运算:先覆盖基础值,再加算,最后乘算。""" + ADD = '+' + """加算:向目标属性增加 value;等级 +1 应传 1。""" + MULTIPLY = '*' + """乘算:目标属性乘以 value;提高 20% 应传 1.2。""" + ASSIGN = '=' + """覆盖:用 value 替换基础值;不同来源的不同覆盖值会报冲突。""" + + +class SkillAttribute(str, Enum): + """技能公共属性。等级、参数先求值;伤害、冷却随后汇总。""" + LEVEL = 'lv' + """技能等级:加级仅作用于已学习技能,共享等级应修改源技能。""" + RATIO = 'ratio' + """关联参数倍率:例如手雷精通的倍率参数,不是百分比除数。""" + MAX_LAYER = 'maxLayer' + """最大层数:可影响后续关联求值的状态参数。""" + VP = 'vp' + """技能进化选项:0 未选择、1/2 对应 VP 分支;只读外部输入。""" + UP = 'up' + """技能强化选项:只读外部输入,不接受关联效果写入。""" + DAMAGE = 'skillDamage' + """技能技攻倍率:影响最终伤害,不改变技能面板数据。""" + PANEL_RATIO = 'skillRation' + """技能面板倍率:改变返回的技能面板数据。""" + CD = 'cd' + """基础冷却时间,单位为秒。""" + CD_CUT = 'cdCut' + """冷却时间直接减少量,单位为秒。""" + CD_REDUCE = 'cdReduce' + """技能冷却缩减倍率:缩减 10% 应乘以 0.9。""" + CD_RATIO = 'cdRatio' + """面板冷却倍率:直接作用于面板冷却,不受冷却缩减上限影响。""" + CD_RECOVER = 'cdRecover' + """冷却恢复倍率:提高恢复速度应按实际倍率或增量声明。""" + + +class ProfessionAttribute(str, Enum): + """职业专用输出属性的枚举基类;在职业文件中继承并为成员补充中文文档。 + + 例如 HunterAttribute.MARK_RATIO = 'markRation'。仅用于效果写入,不可通过 + Read 读取。需要参与依赖求值的状态属性,应在公共状态注册处显式维护。 + 属性名必须对应目标技能已有的数值字段;不接受公共属性或编号分段属性的重定义。 + """ + + +class CharacterAttribute(str, Enum): + """当前支持关联的角色标量属性;特殊属性不能只添加枚举便直接套用。""" + STR = 'STR' + """角色力量。""" + INT = 'INT' + """角色智力。""" + SPIRIT = 'Spirit' + """角色精神。""" + VITALITY = 'Vitality' + """角色体力。""" + ATK_P = 'AtkP' + """物理攻击力数值。""" + ATK_M = 'AtkM' + """魔法攻击力数值。""" + ATK_I = 'AtkI' + """独立攻击力数值。""" + P_ATK_P = 'PAtkP' + """物理攻击力倍率,例如武器精通的物攻加成。""" + P_ATK_M = 'PAtkM' + """魔法攻击力倍率。""" + P_ATK_I = 'PAtkI' + """独立攻击力倍率。""" + P_STR = 'PSTR' + """力量倍率。""" + P_INT = 'PINT' + """智力倍率。""" + + +class ComponentKind(str, Enum): + """技能分段属性类型,结合非负整数索引定位具体分段。""" + POWER = 'power' + """普通伤害分段倍率,对应 powerN。""" + EXTRA_DATA = 'dataplus' + """额外伤害数据,对应 dataplusN。""" + EXTRA_POWER = 'powerplus' + """额外伤害分段倍率,对应 powerplusN。""" + HIT = 'hit' + """分段攻击次数,对应 hitN。""" + + +@dataclass(frozen=True) +class ComponentAttribute: + """有编号的技能分段属性,例如 power13、dataplus0。""" + kind: ComponentKind + """分段属性类型。""" + index: int + """从 0 开始的分段索引。""" + + def __post_init__(self): + if not isinstance(self.kind, ComponentKind) or type(self.index) is not int or self.index < 0: + raise ValueError('技能分段属性需要 ComponentKind 和非负整数索引') + + @property + def value(self) -> str: + """底层技能属性名称,由分段类型与索引组成。""" + return f'{self.kind.value}{self.index}' + + +def Power(index: int) -> ComponentAttribute: + """普通分段倍率。index 为从 0 开始的分段编号;Power(13) 对应 power13。""" + return ComponentAttribute(ComponentKind.POWER, index) + + +def ExtraData(index: int) -> ComponentAttribute: + """额外伤害数据。index 为分段编号;ExtraData(0) 对应 dataplus0。""" + return ComponentAttribute(ComponentKind.EXTRA_DATA, index) + + +def ExtraPower(index: int) -> ComponentAttribute: + """额外分段倍率。index 为分段编号;ExtraPower(0) 对应 powerplus0。""" + return ComponentAttribute(ComponentKind.EXTRA_POWER, index) + + +def Hit(index: int) -> ComponentAttribute: + """分段攻击次数。index 为分段编号;Hit(0) 对应 hit0。""" + return ComponentAttribute(ComponentKind.HIT, index) + + +STATE_ATTRIBUTES = frozenset({SkillAttribute.LEVEL.value, SkillAttribute.RATIO.value, SkillAttribute.MAX_LAYER.value}) +READ_ATTRIBUTES = STATE_ATTRIBUTES | {SkillAttribute.VP.value, SkillAttribute.UP.value} +# VP/UP are configuration inputs, not writable association outputs. +WRITE_ATTRIBUTES = frozenset(attr.value for attr in SkillAttribute) - {'vp', 'up'} + + +def _number(value: float) -> float: + if isinstance(value, bool) or not isinstance(value, (int, float)) or not isfinite(value): + raise TypeError(f'效果表达式需要有限数值,实际为 {value!r}') + return value + + +class Expression: + """数值表达式基类,支持四则运算;新增节点必须同时实现求值和依赖提取。""" + def evaluate(self, source: Skill) -> float: + """使用来源技能的最终状态求值,不得修改技能或角色。""" + raise NotImplementedError + + def dependencies(self) -> frozenset[Read]: + """返回全部潜在读取,包括当前未启用的条件分支。""" + raise NotImplementedError + + def __add__(self, other: Expression | float) -> Expression: + return Binary(self, '+', expression(other)) + + def __radd__(self, other: Expression | float) -> Expression: + return expression(other) + self + + def __sub__(self, other: Expression | float) -> Expression: + return Binary(self, '-', expression(other)) + + def __rsub__(self, other: Expression | float) -> Expression: + return expression(other) - self + + def __mul__(self, other: Expression | float) -> Expression: + return Binary(self, '*', expression(other)) + + def __rmul__(self, other: Expression | float) -> Expression: + return expression(other) * self + + def __truediv__(self, other: Expression | float) -> Expression: + return Binary(self, '/', expression(other)) + + def __rtruediv__(self, other: Expression | float) -> Expression: + return expression(other) / self + + +def expression(value: Expression | float) -> Expression: + """将数值包装为常量表达式,已有表达式原样返回。""" + return value if isinstance(value, Expression) else Constant(value) + + +@dataclass(frozen=True) +class Constant(Expression): + """有限数值常量;声明中直接传入数字时会自动包装。""" + value: float + """常量数值,不接受布尔值、无穷大或 NaN。""" + + def __post_init__(self): + _number(self.value) + + def evaluate(self, source: Skill) -> float: + return self.value + + def dependencies(self) -> frozenset[Read]: + return frozenset() + + +@dataclass(frozen=True) +class Read(Expression): + """读取技能状态或输入;可分析跨技能依赖,不支持读取最终伤害/冷却输出。 + + Args: + attribute: 要读取的等级、ratio、最大层数、VP 或 UP。 + skill: 被读取技能的 Ref,兼容旧名称字符串;省略时读取自身。 + """ + attribute: SkillAttribute + """要读取的等级、ratio、最大层数、VP 或 UP。""" + skill: SkillRef | str | None = None + """源技能 Ref 或旧名称;省略时读取声明所属技能自身。""" + + def __post_init__(self): + if not isinstance(self.attribute, SkillAttribute) or self.attribute.value not in READ_ATTRIBUTES: + raise ValueError('Read 仅支持等级、ratio、maxLayer、VP、UP;不能读取尚未汇总的输出属性') + if self.skill is not None and not isinstance(self.skill, SkillRef) and (not isinstance(self.skill, str) or not self.skill): + raise TypeError('Read 的技能引用必须是 SkillRef 或非空技能名称,省略时读取自身') + + def target(self, source: Skill) -> Skill: + """按名称解析被读取的技能,并检查目标属性是否存在。""" + target = source if self.skill is None else resolve_skill(source.char, self.skill) + if target is None: + raise ValueError(f'效果表达式引用技能不存在: {source.name} -> {self.skill}') + if not hasattr(target, self.attribute.value): + raise ValueError(f'效果表达式引用属性不存在: {source.name} -> {target.name}.{self.attribute.value}') + return target + + def evaluate(self, source: Skill) -> float: + return _number(getattr(self.target(source), self.attribute.value)) + + def dependencies(self) -> frozenset[Read]: + return frozenset({self}) + + +@dataclass(frozen=True) +class Binary(Expression): + """四则运算节点,通常通过表达式之间的 +、-、*、/ 自动构造。""" + left: Expression + """左侧数值表达式。""" + operation: Literal['+', '-', '*', '/'] + """四则运算符;与效果汇总运算 Operation 不同。""" + right: Expression + """右侧数值表达式;除法求值时不能为零。""" + + def __post_init__(self): + if self.operation not in ('+', '-', '*', '/'): + raise ValueError(f'未知表达式运算: {self.operation}') + object.__setattr__(self, 'left', expression(self.left)) + object.__setattr__(self, 'right', expression(self.right)) + + def evaluate(self, source: Skill) -> float: + left, right = self.left.evaluate(source), self.right.evaluate(source) + if self.operation == '+': + return _number(left + right) + if self.operation == '-': + return _number(left - right) + if self.operation == '*': + return _number(left * right) + if right == 0: + raise ValueError(f'效果表达式除数为零: {source.name}') + return _number(left / right) + + def dependencies(self) -> frozenset[Read]: + return self.left.dependencies() | self.right.dependencies() + + +@dataclass(frozen=True) +class LevelTable(Expression): + """按等级查表;默认使用来源技能最终等级,越界返回 0,沿用旧表行为。 + + Args: + values: 等级数据数组,包含索引 0 对应的零级值。 + level: 等级索引表达式,默认读取来源技能最终等级。 + """ + values: Sequence[float] + """等级数据数组,索引 0 表示零级;构造时复制为不可变元组。""" + level: Expression = field(default_factory=lambda: Read(SkillAttribute.LEVEL)) + """等级索引表达式,可传 Read(SkillAttribute.LEVEL, '其他技能名称')。""" + + def __post_init__(self): + object.__setattr__(self, 'values', tuple(_number(value) for value in self.values)) + object.__setattr__(self, 'level', expression(self.level)) + + def evaluate(self, source: Skill) -> float: + level = self.level.evaluate(source) + if int(level) != level: + raise ValueError(f'等级表索引必须为整数: {source.name} -> {level}') + return self.values[int(level)] if 0 <= level < len(self.values) else 0 + + def dependencies(self) -> frozenset[Read]: + return self.level.dependencies() + + +def Percent(value: Expression | float) -> Expression: + """百分数转小数:110 → 1.10。提高 110% 的倍率应写 1 + Percent(110)。""" + return expression(value) / 100 + + +class Condition: + """效果条件基类;条件的状态读取也必须声明为依赖。""" + def evaluate(self, source: Skill) -> bool: + """判断最终状态是否满足条件。""" + raise NotImplementedError + + def dependencies(self) -> frozenset[Read]: + """返回条件判断需要读取的全部技能状态。""" + raise NotImplementedError + + +@dataclass(frozen=True) +class Equals(Condition): + """相等条件,例如 Equals(Read(SkillAttribute.VP), 1) 表示选择 VP1。""" + left: Expression | float + """左侧数值或表达式。""" + right: Expression | float + """右侧数值或表达式。""" + + def __post_init__(self): + object.__setattr__(self, 'left', expression(self.left)) + object.__setattr__(self, 'right', expression(self.right)) + + def evaluate(self, source: Skill) -> bool: + return cast(Expression, self.left).evaluate(source) == cast(Expression, self.right).evaluate(source) + + def dependencies(self) -> frozenset[Read]: + return cast(Expression, self.left).dependencies() | cast(Expression, self.right).dependencies() + + +@dataclass(frozen=True) +class GreaterThan(Equals): + """大于条件,例如 GreaterThan(Read(SkillAttribute.LEVEL, '技能名称'), 0)。""" + + def evaluate(self, source: Skill) -> bool: + return cast(Expression, self.left).evaluate(source) > cast(Expression, self.right).evaluate(source) + + +@dataclass(frozen=True) +class Not(Condition): + """条件取反,仍保留原条件的全部依赖。""" + condition: Condition + """需要取反的条件。""" + + def __post_init__(self): + if not isinstance(self.condition, Condition): + raise TypeError('Not 需要 Condition 声明') + + def evaluate(self, source: Skill) -> bool: + return not self.condition.evaluate(source) + + def dependencies(self) -> frozenset[Read]: + return self.condition.dependencies() + + +@dataclass(frozen=True) +class All(Condition): + """全部条件成立;建图时收集全部条件依赖,不因短路判断遗漏依赖。""" + conditions: Sequence[Condition] + """条件数组,构造时复制为不可变元组。""" + + def __post_init__(self): + if not all(isinstance(condition, Condition) for condition in self.conditions): + raise TypeError('All 需要 Condition 数组') + object.__setattr__(self, 'conditions', tuple(self.conditions)) + + def evaluate(self, source: Skill) -> bool: + return all(condition.evaluate(source) for condition in self.conditions) + + def dependencies(self) -> frozenset[Read]: + return frozenset().union(*(condition.dependencies() for condition in self.conditions)) + + +@dataclass(frozen=True) +class OutputTypeStartsWith(Condition): + """角色输出类型前缀条件,例如物理/魔法;读取计算准备阶段确定的角色输入。""" + prefix: str + """输出类型前缀,例如 '物理'。""" + + def __post_init__(self): + if not isinstance(self.prefix, str) or not self.prefix: + raise ValueError('输出类型条件需要非空前缀') + + def evaluate(self, source: Skill) -> bool: + return source.char.输出类型.startswith(self.prefix) + + def dependencies(self) -> frozenset[Read]: + return frozenset() + + +@dataclass(frozen=True) +class WeaponCategoryContains(Condition): + """武器分类包含指定文本;匹配现有分类字段,如“传世武器”。""" + category: str + """武器分类中的匹配文本,支持“传世武器升级”等包含关系。""" + + def __post_init__(self): + if not isinstance(self.category, str) or not self.category: + raise ValueError('武器分类条件需要非空名称') + + def evaluate(self, source: Skill) -> bool: + return self.category in (source.char.GetWeaponType()[1] or '') + + def dependencies(self) -> frozenset[Read]: + # Weapon facts are prepared by SetDetail before skill state evaluation. + return frozenset() + + +@dataclass(frozen=True) +class Select(Expression): + """条件选值:只求值实际分支,但建图时收集条件及两个分支的全部依赖。""" + condition: Condition + """选择分支的条件。""" + yes: Expression | float + """条件成立时使用的数值表达式。""" + no: Expression | float + """条件不成立时使用的数值表达式。""" + + def __post_init__(self): + if not isinstance(self.condition, Condition): + raise TypeError('Select 需要 Condition 声明') + object.__setattr__(self, 'yes', expression(self.yes)) + object.__setattr__(self, 'no', expression(self.no)) + + def evaluate(self, source: Skill) -> float: + branch = self.yes if self.condition.evaluate(source) else self.no + return cast(Expression, branch).evaluate(source) + + def dependencies(self) -> frozenset[Read]: + return self.condition.dependencies() | cast(Expression, self.yes).dependencies() | cast(Expression, self.no).dependencies() + + +def _names(values: Sequence[str], label: str) -> tuple[str, ...]: + if isinstance(values, str) or not all(isinstance(name, str) and name for name in values): + raise TypeError(f'{label} 必须是非空名称组成的数组') + return tuple(values) + + +def _skill_targets(values: Sequence[SkillRef | str], label: str) -> tuple[SkillRef | str, ...]: + """复制引用数组,兼容非空的旧技能名称;拒绝单个引用或字符串冒充数组。""" + if isinstance(values, (str, SkillRef)) or not isinstance(values, Sequence): + raise TypeError(f'{label} 必须是技能引用数组') + if not all(isinstance(value, SkillRef) or isinstance(value, str) and value for value in values): + raise TypeError(f'{label} 必须由 SkillRef 或非空技能名称组成') + return tuple(values) + + +@dataclass(frozen=True, kw_only=True) +class _Effect: + """效果声明公共字段;职业代码使用 SkillEffect 或 CharacterEffect。""" + value: Expression | float + """实际贡献值:乘算填倍率,加算填增量,覆盖填目标值,不隐式除以 100。""" + operation: Operation = Operation.MULTIPLY + """汇总运算,默认乘算。""" + when: Condition | None = None + """生效条件;省略表示不附加条件,来源技能仍须已学习。""" + weapon: Sequence[str] | None = None + """允许的武器类型数组,例如 ['光剑'];省略表示不限制武器类型。""" + + def __post_init__(self): + object.__setattr__(self, 'value', expression(self.value)) + if not isinstance(self.operation, Operation): + raise TypeError('效果运算必须使用 Operation') + if self.when is not None and not isinstance(self.when, Condition): + raise TypeError('效果条件必须使用 Condition 声明') + if self.weapon is not None: + object.__setattr__(self, 'weapon', _names(self.weapon, 'weapon')) + + def dependencies(self) -> frozenset[Read]: + """贡献值与生效条件的全部状态依赖。""" + return cast(Expression, self.value).dependencies() | (self.when.dependencies() if self.when is not None else frozenset()) + + def evaluate(self, source: Skill) -> float: + """基于来源技能求出实际贡献值,并验证结果为有限数值。""" + return _number(cast(Expression, self.value).evaluate(source)) + + +class MissingTargetPolicy(str, Enum): + """缺失关联目标的处理方式;只对已确认的旧名称失配显式使用 SKIP。""" + ERROR = 'error' + """默认报错,避免新增规则静默失效。""" + SKIP = 'skip' + """跳过并记录 unresolved_targets,兼容旧规则中已存在的无效名称。""" + + +@dataclass(frozen=True, kw_only=True) +class SkillEffect(_Effect): + """作用于技能的效果声明;skills 接收 Ref 数组并兼容旧名称,默认所有伤害技能。 + + Args: + value: 实际贡献值或表达式;乘算使用倍率,加算使用增量。 + operation: 汇总运算,默认乘算。 + attribute: 目标属性,默认技能技攻;也支持编号分段和职业专用输出属性。 + skills: 目标技能 Ref 或旧名称数组,默认 '*' 表示所有伤害技能。 + except_skills: 排除的技能 Ref 或旧名称数组。 + when: 生效条件,默认无额外条件。 + weapon: 允许的武器类型数组,默认不限制。 + missing_target: 缺失目标时默认报错;迁移旧名称失配时可显式跳过并记录。 + """ + attribute: SkillAttribute | ProfessionAttribute | ComponentAttribute = SkillAttribute.DAMAGE + """目标属性,默认技能技攻;分段属性使用 Power/Hit/ExtraData/ExtraPower,职业属性使用 ProfessionAttribute 子类。""" + skills: Sequence[SkillRef | str] | Literal['*'] = '*' + """目标技能 Ref 或旧名称数组;'*' 仅选择伤害技能,指定名称时可关联被动技能。""" + except_skills: Sequence[SkillRef | str] = () + """从目标中排除的技能 Ref 或旧名称数组。""" + missing_target: MissingTargetPolicy = MissingTargetPolicy.ERROR + """缺失目标处理策略;SKIP 仅用于保留已确认的旧名称失配行为。""" + + def __post_init__(self): + super().__post_init__() + if isinstance(self.attribute, ProfessionAttribute): + name = self.attribute.value + if not isinstance(name, str) or not name.isidentifier() or name in {item.value for item in SkillAttribute}: + raise ValueError('职业属性必须使用独立的有效属性名,不能重定义公共属性') + if any(name.startswith(kind.value) and name[len(kind.value):].isdigit() for kind in ComponentKind): + raise ValueError('编号分段属性请使用 Power、Hit、ExtraData 或 ExtraPower') + elif not isinstance(self.attribute, ComponentAttribute) and ( + not isinstance(self.attribute, SkillAttribute) or self.attribute.value not in WRITE_ATTRIBUTES + ): + raise ValueError('效果目标必须是可写的 SkillAttribute;VP/UP 只能作为外部输入') + if self.skills != '*': + object.__setattr__(self, 'skills', _skill_targets(self.skills, 'skills')) + object.__setattr__(self, 'except_skills', _skill_targets(self.except_skills, 'except_skills')) + if not isinstance(self.missing_target, MissingTargetPolicy): + raise TypeError('缺失目标策略必须使用 MissingTargetPolicy') + + +@dataclass(frozen=True, kw_only=True) +class CharacterEffect(_Effect): + """作用于角色标量属性的效果声明,沿用同一来源贡献汇总机制。 + + Args: + value: 实际贡献值或表达式,不隐式按百分比缩放。 + attribute: 角色目标属性,例如 P_ATK_P 表示物理攻击力倍率。 + operation: 汇总运算,默认乘算。 + when: 生效条件,默认无额外条件。 + weapon: 允许的武器类型数组,默认不限制。 + """ + attribute: CharacterAttribute + """角色目标属性,如 P_ATK_P(物理攻击力倍率)、SPIRIT(精神)。""" + + def __post_init__(self): + super().__post_init__() + if not isinstance(self.attribute, CharacterAttribute): + raise TypeError('角色效果属性必须使用 CharacterAttribute') + + +EffectDeclaration = SkillEffect | CharacterEffect +"""类型化关联声明:技能效果或角色效果,均可放入 associate 数组。""" diff --git a/backend/core/basic/skill_effects.py b/backend/core/basic/skill_effects.py new file mode 100644 index 00000000..295d2219 --- /dev/null +++ b/backend/core/basic/skill_effects.py @@ -0,0 +1,532 @@ +"""技能关联计算与维护说明 + +技能关联由 `core/basic/skill_effects.py` 的 `SkillEffectEngine` 统一处理。 +`lv`、VP 等输入变化不再通过历史倍率乘除更新目标,而是重新解析最终状态并汇总本次关联贡献。 + +## 技能身份与引用维护 + +职业模块导入自己的 Ref;技能类声明 `ref = Ref.XXX`,`code` 从 ref 派生,name 只负责显示。 +角色初始化根据技能数据 prefix 校验职业范围,并创建独立的 ref/code 索引;输出圣骑士等职业变体复用数据来源范围。 +SkillEffect.skills、except_skills、Read.skill、level_source 统一接受 Ref,旧名称字符串继续兼容。 +公共技能引用只匹配当前角色实际绑定的技能实例。GetSkill(Ref.XXX) 查询引用,GetSkillByCode 查询原始 code; +字符串不会隐式当作 code。重复绑定、跨职业引用直接报错;新增规则应使用 Ref,旧失配名称继续保留 SKIP 诊断。 +引用生成、公共分组、编辑器中文提示的维护说明见 core/character/refs/base.py。 +SkillRef.name 只影响提示,不参与相等性和哈希;技能名称变更不会改变引用身份。 + +## 计算阶段 + +1. `SetSkills` 批量读取基础等级、VP、UP。传入的等级是基础等级,不含关联技能提供的等级;重复传入同一配置不会重复加级。 +2. 解析等级和参数依赖。`lv`、`ratio`、`maxLayer` 是状态属性;关联到这些属性的规则以及 `level_source` 组成依赖图,按拓扑顺序求值。关联规则读取其他技能等级时,依赖会自动记录。循环、缺失共享等级源、计算过程中改变状态依赖会报出具体技能。 +3. 基于最终状态收集伤害、冷却和角色属性贡献,并在装备提供的基础值之上应用一次。 + +`calc` 在处理配置、装备、时装、徽章等阶段使用同一个批次。需要读取等级时,可以先解析状态;伤害及角色属性关联在准备阶段结束后统一生效。 + +## 后续在哪里维护 + +| 新增或修改的影响 | 维护位置 | 要点 | +| --- | --- | --- | +| 技伤、冷却、攻击段数等普通关联 | 对应 `core/character/GF/职业/角色.py` 的技能类 `associate` | 通常不改引擎;目标属性应有默认值 | +| 随 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` | 新参数同时检查读写范围;状态属性自动属于输入属性 | +| 新增外部配置输入,改变它需要重新计算关联 | 技能类、配置赋值入口 + `INPUT_ATTRIBUTES` | 例如现有 `vp`;单纯登记不提供跨技能参数读取依赖 | +| 新增职业专用输出属性 | 职业文件内继承 `ProfessionAttribute` 定义枚举,并在目标技能设置数值默认值 | 成员紧跟中文文档字符串,IDE 可显示含义;不可通过 `Read` 读取 | +| 新增角色属性关联 | `skill_effect_types.py` 的 `CharacterAttribute`,并核对 `character/base.py` 的 `SetStatus` | 当前仅支持对应标量字段;特殊运算需单独实现 | +| 新增运算符、目标选择方式、跨技能非等级依赖 | `skill.py` 的公共关联入口 + `skill_effects.py` | 属于公共能力扩展,需配套单元测试 | +| 装备改变技能等级或倍率 | 原装备规则及 `character/base.py` 的公共修改方法 | 使用已有批处理方法;低层直接写入须在 `batch()` 内 | +| 仅影响单次技能展示/输出的模式、VP、UP 变换 | 原技能 `setMode`、`vp_N`、输出计算方法 | `skillInfo()` 使用临时副本,不要误改为持久关联 | + +普通职业规则优先放在职业文件。只有新增公共能力时才修改引擎;不要再用属性 setter 手动撤销旧倍率并乘入新倍率。 + +## 声明示例和数值约定 + +新代码优先使用 `skill_effect_types.py` 的不可变声明,`associate` 继续是数组,目标仍然使用技能名称数组: + +```python +associate = [ + SkillEffect(skills=['目标技能名称'], value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.LEVEL, operation=Operation.ADD, + skills=['目标精通名称'], value=Read(SkillAttribute.LEVEL) + 1), + SkillEffect(attribute=Power(13), operation=Operation.ADD, + skills=['破军升龙击'], value=Percent(LevelTable(data2))), +] +``` + +`SkillEffect` 作用于技能,`CharacterEffect` 作用于角色。Operation 明确区分加算、乘算、覆盖; +新声明的 value 是实际贡献值,不再自动按百分比缩放,也不根据属性名称推测冷却公式。 +例如增加 20% 技伤使用 `1 + Percent(20)`,缩减 10% 冷却使用 `1 - Percent(10)`。 +旧 data[0] 不为零的规则迁移时必须保留零级基准的除法/减法,不能直接省略。 + +`Read(SkillAttribute.RATIO, '技能名称')` 可分析跨技能状态依赖;省略名称表示读取自身。 +`LevelTable` 按来源最终等级取表,`Select` 按条件选值,`when=Equals(Read(SkillAttribute.VP), 1)` 控制是否生效。 +条件和未选分支也声明全部依赖,建图阶段不计算实际数值,避免在临时状态下发生除零或遗漏依赖。 +当前 Read 支持等级、ratio、maxLayer、VP、UP,不能读取尚未汇总的伤害/冷却输出。 +武器类型用 `weapon=['光剑']`,武器分类用 `WeaponCategoryContains('传世武器')`;武器信息来自提前完成的 SetDetail。 + +编号属性通过 `Power(n)`、`Hit(n)`、`ExtraData(n)`、`ExtraPower(n)` 构造,分别对应 powerN、hitN、dataplusN、powerplusN。 +名称数组和等级表在构造时复制为元组,外部修改原数组不会影响已注册声明。 +新类型、枚举成员、字段和构造函数的中文文档可供编辑器悬停和补全查看。 + +GF 职业的关联现已使用类型化声明,原 associate、动态 effect 和专用更新函数紧邻新实现注释保留。 +男/女大枪的等级目标、黑暗武士的连招目标仍在 effect 内动态组装技能名称数组;贡献值和条件使用类型化声明。 +模式、VP、UP 对临时技能副本的变换保留原实现,不属于持久关联。 +旧名称失配显式使用 `MissingTargetPolicy.SKIP`,继续记录 unresolved_targets;新规则默认报错,不要为了消除报错批量设置 SKIP。 +原先未生效的错误角色字段及特殊字典键保持原有效计算行为,迁移不同时修正规则。 + +### 职业专用属性 + +公共 `SkillAttribute` 仅维护通用字段。专用输出字段就近放在职业模块中,例如: + +```python +class HunterAttribute(ProfessionAttribute): + '''猎人专用输出属性。''' + MARK_RATIO = 'markRation' + '''每层标记对应的技能伤害增量。''' + +# 目标技能先定义 markRation = 0,然后声明: +associate = [SkillEffect(attribute=HunterAttribute.MARK_RATIO, + operation=Operation.ADD, value=Percent(LevelTable(data0)))] +``` + +不同职业可各自定义同名字段。枚举值必须对应目标技能的实际数值属性;不能重定义公共字段或编号分段字段。 +专用枚举只用于最终输出,不自动加入状态依赖。将来某参数需要被后续关联读取时,应先登记公共状态/读写范围, +再使用 Read 表达式,不能直接读取尚未汇总的输出。条件可组合 `All`、`Not`、`GreaterThan`; +角色输出类型用 `OutputTypeStartsWith` 判断,所有条件均在建图时提供完整依赖。 + +### 旧字典兼容 + +以下片段放在对应技能类内,`data0` 为该来源技能的等级数据表: + +```python +# 默认百分比:data0[lv] = 110 时,倍率为 1 + 110 / 100。 +associate = [{'type': '*skillDamage', 'data': data0, 'skills': ['目标技能名称']}] + +# 加级:data0[lv] = 1 时,给已学习目标增加 1 级。 +associate = [{'type': '+lv', 'data': data0, 'ratio': 1, 'skills': ['目标技能名称']}] +``` + +上面是两种独立示例;需要同时生效时放进同一列表。`skills='*'` 仅选择伤害技能,关联被动技能时使用明确的名称列表。名称必须与目标 `name` 完全一致,当前不是按 UUID 匹配。 + +数据以来源技能等级索引,通常令 `data[0] = 0`。收集仍兼容旧公式:普通乘算为 `(1 + data[lv]/ratio) / (1 + data[0]/ratio)`,`cdReduce`、`cdRatio` 改用减号;加算为 `(data[lv] - data[0])/ratio`;覆盖 `=` 直接取 `data[lv]`。这里字典中的 `ratio` 是除数,区别于手雷精通类上的 `ratio` 参数。 + +女弹药的动态关联是现成参考: + +```python +ratio = 1.0 + +def effect(self, old, new): + self.associate = [{ + 'type': '*skillDamage', + 'data': [value * self.ratio for value in self.data0], + 'skills': ['G-14手雷', 'G-35L感电手雷', 'G-18C冰冻手雷'], + }] + return super().effect(old, new) +``` + +三觉被动通过 `*ratio` 关联手雷精通。引擎先确定最终 `ratio=1.2`,再收集手雷倍率,所以精通 11 级对应 `1 + 110% × 1.2 = 2.32`。 + +## 职业规则 + +`associate` 可以混用新声明和旧字典。现有动态 `effect(old, new)` 作为兼容入口,在收集模式下以 `(0, 最终等级)` 执行;公共入口记录贡献,不修改目标。每次收集都从原始 `associate` 声明开始,取消 VP 时不会保留上一次分支。 + +动态规则只能生成关联声明,不能在收集过程中直接修改角色或目标技能。需要修改关联产生方式时,应改用声明,而不是另写参数 setter 撤销旧倍率。元素师原先的 `ratio` 补偿 setter 已移除,避免与公共引擎重复应用。 + +引擎在创建时保存初始声明和状态默认值。动态分支应新建并赋值 `self.associate`,不要对共享的类级列表执行 `append` 或原地改写;也不要把运行后修改 `associate` 当作注册新规则。一次重算可能多次调用 `effect`,因此不能在其中累计计数、直接调用角色加成方法或依赖随机结果。 + +依赖图目前自动识别三类依赖:共享等级源、收集时跨技能 `.lv` 读取、指向状态属性的关联。 +类型化表达式的 Read 额外提供跨技能状态参数依赖;普通 Python 代码直接读取其他技能的 `.ratio` 仍不会自动建立依赖。 +新规则请使用 Read;单独加入 INPUT_ATTRIBUTES 只会触发重算,不能解决求值先后问题。 +本阶段仍使用技能级拓扑图,因此同一技能的状态回写、相互引用等可能被保守判定为循环;尚未升级为属性级依赖图。 +初次建图后新出现的等级读取或状态目标会报错;不要靠最终状态临时增加依赖边。 + +每条贡献包含来源技能、条目索引、目标、属性、运算及数值,可从 `character.skill_effects.contributions` 检查。角色属性支持原 `SetStatus` 中相应的标量加算/乘算字段。 + +同一属性的汇总顺序为:基础值(或覆盖值)→ 加算贡献 → 乘算贡献。不同来源给出不同覆盖值会报冲突;不会依赖遍历顺序选择最后一个。赋零可以直接从基础值重建,不需要除以旧倍率。 + +## 共享等级 + +例如生命之树: + +```python +level_source = '创世' +``` + +生命之树跟随创世最终等级,包含创世获得的装备及技能等级加成。目标自身的 `maxLv = 1` 不会截断共享等级。目标不接受独立等级或独立加级;需要提升等级时应提升源技能。 + +共享等级技能默认不独立提供关联效果,保留原 getter/no-op setter 的行为。如职业规则确实要求共享等级技能独立提供关联,可显式设置 `association_source = True`。 + +现有 11 个共享等级技能已迁移为 `level_source` 声明。 + +## 装备和外部修改 + +`SetStatus`、`AddSkillLv`、`SetSkillRation`、`SetSkillCD`、`SetSkillCDRecover` 已自动批处理。完整 `calc` 中的装备代码也在批次内,因此原有装备的直接属性写入会保留为关联计算的基础值。 + +新增低层直接修改必须放进批次,不能修改已叠加关联贡献的结果后再要求引擎推断基础值: + +```python +with character.skill_effects.batch(): + skill.skillDamage *= 1.15 +``` + +`resolve()` 在没有变化时不重复应用;批次重建会先恢复原来的基础值。`skillInfo()` 的临时拷贝不属于引擎管理对象,其模式、VP、UP 变换仍在临时拷贝上执行。 + +这不表示装备自身也已经与顺序无关:装备仍按原流程执行,例如先由 `calc_suits()` 生成套装积分,再让装备读取积分。当前批次解决的是装备修改与技能关联贡献之间的基线问题,没有为装备建立逐来源贡献账本和依赖图,也不保证对同一实例反复执行整套装备流程不会累计。 + +定位引擎内部问题时,`_levels` 保存基础及外部等级,`_state_base` 保存状态参数基线,`_output_base` 保存应用技能输出贡献之前的属性值。它们是内部状态,不应由职业或装备规则直接修改;外部输入走公共修改方法或批次入口。 + +## 诊断和验证 + +找不到目标的旧关联仍按原逻辑跳过,同时记录在 `unresolved_targets`,供职业规则审查。例如刺客现存的“终结追击”名称失配;本次未推测其数值意图并修改规则。 +类型化声明的缺失目标/引用、错误属性/运算、非有限数值会报错,避免新规则继续静默失效。 + +测试覆盖女弹药 2.32 场景及后续升降级、旅人条件、大枪加级、VP 切换、装备基线、角色属性、共享等级及链式共享、零覆盖、赋值冲突和循环依赖。全职业测试使用全部学习等级,在无 VP/VP1/VP2 下交换输入顺序,并另测搭配职业武器的情况。 + +重构前后 72 个模块的默认满技能配置对比:伤害/冷却的实质变化集中在女弹药、旅人、男女大枪已确认的问题;元素师统一了 `skillRation`/`skillDamage` 的分配,总伤害保持一致。该验证针对本地计算规则,不等同于游戏实测或线上验证。 + +新增规则时,在 `tests/unit/test_skill_effects.py` 补充对应场景,重点验证正反设置顺序、等级升降或禁用、条件开关、外部加成后再次重建。公共依赖机制变更还需验证循环及冲突报错。 + +从仓库根目录执行: + +```sh +backend/.venv/bin/pytest backend/tests/unit/test_skill_effects.py -q +backend/.venv/bin/pytest backend/tests/unit/test_typed_skill_effects.py -q +backend/.venv/bin/pytest backend/tests/smoke/test_calc_availability.py -k configuration_order -q +``` + +第二项验证技能配置顺序(包括搭配武器的场景),不验证装备执行顺序。修改公共引擎后再运行完整 `backend/tests` 回归。 +""" +from core.character.refs.base import resolve_skill +from collections import defaultdict +from contextlib import contextmanager +from dataclasses import dataclass +from functools import wraps +from graphlib import CycleError, TopologicalSorter +from math import prod +from .skill_effect_types import ( + CharacterAttribute, CharacterEffect, EffectDeclaration, MissingTargetPolicy, Operation, + SkillEffect, STATE_ATTRIBUTES, +) + + +# 状态属性定义在 skill_effect_types;技能类仍须提供相应默认值。 +# 外部赋值触发重算的输入;登记在此不等于自动跟踪跨技能的该属性读取。 +INPUT_ATTRIBUTES = STATE_ATTRIBUTES | {'vp', 'up', 'comboCol', 'stage', 'currentMode'} +# These are the scalar keys actually supported by CharacterBase.SetStatus. +# 扩展前核对 SetStatus 的实际运算语义;特殊字段不能仅加入白名单。 +CHARACTER_ATTRIBUTES = frozenset(attribute.value for attribute in CharacterAttribute) +_MISSING = object() + + +@dataclass(frozen=True) +class SkillContribution: + """统一后的来源贡献;新声明和旧字典最终都编译为此结构。""" + source: object + """提供本条效果的来源技能实例。""" + index: int + """同一来源收集到的贡献序号,用于稳定汇总顺序。""" + target: object + """接受贡献的技能或角色实例。""" + attribute: str + """目标实例的底层属性名称。""" + operation: str + """汇总运算:'+' 加算、'*' 乘算、'=' 覆盖。""" + value: float + """已经完成等级取值、百分比转换和条件求值的实际贡献值。""" + + +def skill_effect_batch(method): + """Keep external skill/stat changes outside the association baseline.""" + @wraps(method) + def wrapped(self, *args, **kwargs): + engine = getattr(self, 'skill_effects', None) + if engine is None: + return method(self, *args, **kwargs) + with engine.batch(): + return method(self, *args, **kwargs) + return wrapped + + +class SkillEffectEngine: + def __init__(self, character): + self.character = character + self.skills = tuple(sorted(character.skills, key=lambda skill: skill.id)) + self._members = {id(skill) for skill in self.skills} + self._levels = {skill: skill._lv for skill in self.skills} + self._state_base = { + (skill, attr): getattr(skill, attr) + for skill in self.skills for attr in STATE_ATTRIBUTES - {'lv'} + if hasattr(skill, attr) + } + self._associations = {skill: skill.associate for skill in self.skills} + self._output_base = {} + self._depth = 0 + self.resolving = False + self.collecting = None + self._discovering = False + self._pending = [] + self._reads = set() + self._dirty = True + self._state_dirty = True + self.contributions = () + self.unresolved_targets = set() + + def owns(self, skill): + # skillInfo uses shallow copies; these are local render contexts. + return id(skill) in self._members + + def changed(self): + self._dirty = self._state_dirty = True + if not self._depth: + self.resolve() + + def set_level(self, skill, value): + if skill.level_source is not None: + return + # += equipment bonuses must change the input, not copy already-derived + # mastery levels back into it. Input configuration uses set_input_level. + self._levels[skill] = min(skill.maxLv, max(0, self._levels[skill] + int(value) - skill.lv)) + self.changed() + + def set_input_level(self, skill, value): + if skill.level_source is not None: + return + self._levels[skill] = min(skill.maxLv, max(0, int(value))) + self._dirty = self._state_dirty = True + + def set_attribute(self, skill, name, value): + if name in STATE_ATTRIBUTES: + self._state_base[skill, name] = value + object.__setattr__(skill, name, value) + self.changed() + + def is_learned(self, skill): + if skill.level_source is not None: + return skill.lv > 0 + return self._levels[skill] > 0 + + def read_level(self, skill): + if self.collecting is not None and self.collecting is not skill: + self._reads.add(skill) + elif self._state_dirty and not self.resolving: + self.resolve_states() + + def record(self, source, target, attribute, operation, value): + self._pending.append(SkillContribution( + source, len(self._pending), target, attribute, operation, value, + )) + + def missing_target(self, source, name): + self.unresolved_targets.add((source.name, name)) + + def collect_effect(self, source, declaration: EffectDeclaration): + """Compile typed declarations into the same contributions as legacy rules. + + Discovery reads structure only: no arithmetic or conditional branch is + evaluated before upstream state is ready. Inactive branches still expose + dependencies and possible state targets. + """ + if self.collecting is not source: + raise RuntimeError('类型化效果只能由技能关联引擎收集') + for dependency in declaration.dependencies(): + target = dependency.target(source) + if target is not source and dependency.attribute.value in STATE_ATTRIBUTES: + self._reads.add(target) + + attribute = declaration.attribute.value + if isinstance(declaration, CharacterEffect): + targets = [self.character] + else: + targets = self.character.GetSkills('all', True) if declaration.skills == '*' else [] + if declaration.skills != '*': + for name in declaration.skills: + if name in declaration.except_skills: + continue + target = resolve_skill(self.character, name) + if target is None: + if declaration.missing_target == MissingTargetPolicy.ERROR: + raise ValueError(f'类型化效果目标不存在: {source.name} -> {name}') + self.missing_target(source, name) + else: + targets.append(target) + excluded = {id(target) for ref in declaration.except_skills + if (target := resolve_skill(self.character, ref)) is not None} + targets = [target for target in targets if id(target) not in excluded] + for target in targets: + if attribute in STATE_ATTRIBUTES - {'lv'} and (target, attribute) not in self._state_base: + raise ValueError(f'类型化效果状态缺少默认值: {source.name} -> {target.name}.{attribute}') + + if self._discovering: + # Retain legacy precondition level reads, but never prune graph edges + # based on its provisional result. New conditions should use `when`. + source.precondition() + value = 0 + else: + if not source.precondition(): + return + if declaration.weapon is not None and self.character.GetWeaponType()[0] not in declaration.weapon: + return + if declaration.when is not None and not declaration.when.evaluate(source): + return + value = declaration.evaluate(source) + + for target in targets: + if target is not self.character and attribute == 'lv': + if target.level_source is not None: + continue + if not self._discovering and declaration.operation == Operation.ADD and not self.is_learned(target): + continue + self.record(source, target, attribute, declaration.operation.value, value) + + def _collect(self, skill, *, discover=False): + # 一个重算周期会多次调用 effect;职业实现只能构造声明并调用公共收集入口。 + self._pending = [] + self._reads = set() + if not skill.association_source: + return (), set() + # VP branches often only assign associate when enabled. Start from the + # declaration every time so disabling VP also removes the old branch. + skill.associate = self._associations[skill] + self.collecting = skill + self._discovering = discover + try: + if skill.lv > 0: + skill.effect(0, skill.lv) + elif discover: + # A typed level assignment can activate an initially unlearned + # source; its static dependencies must already be in the graph. + for declaration in skill.associate: + if isinstance(declaration, (SkillEffect, CharacterEffect)): + self.collect_effect(skill, declaration) + return tuple(self._pending), self._reads.copy() + finally: + self.collecting = None + self._discovering = False + + @staticmethod + def _combine(base, contributions): + contributions = sorted(contributions, key=lambda item: (item.source.id, item.index)) + overrides = {item.value for item in contributions if item.operation == '='} + if len(overrides) > 1: + sources = ', '.join(item.source.name for item in contributions if item.operation == '=') + raise ValueError(f'关联赋值冲突: {sources}') + if overrides: + base = overrides.pop() + return (base + sum(item.value for item in contributions if item.operation == '+')) * prod( + item.value for item in contributions if item.operation == '*' + ) + + def _restore_outputs(self): + for (target, attr), value in self._output_base.items(): + if value is _MISSING: + object.__delattr__(target, attr) + else: + object.__setattr__(target, attr, value) + self._output_base.clear() + + def resolve_states(self): + # 依赖来源:level_source、跨技能 lv 读取、指向 STATE_ATTRIBUTES 的关联。 + # 类型化 Read 可声明跨技能状态参数依赖;普通 Python 属性读取仍不会自动建边。 + if self.resolving or not self._state_dirty: + return + self.resolving = True + try: + self._restore_outputs() + self.unresolved_targets.clear() + for skill, lv in self._levels.items(): + skill._lv = min(skill.maxLv, max(0, lv)) + for (skill, attr), value in self._state_base.items(): + object.__setattr__(skill, attr, value) + + graph = {skill: set() for skill in self.skills} + for skill in self.skills: + if skill.level_source is not None: + source = resolve_skill(self.character, skill.level_source) + if source is None: + raise ValueError(f'共享等级源技能不存在: {skill.name} -> {skill.level_source}') + graph[skill].add(source) + contributions, reads = self._collect(skill, discover=True) + graph[skill].update(reads) + for item in contributions: + if item.target is not self.character and item.attribute in STATE_ATTRIBUTES: + graph[item.target].add(skill) + try: + order = tuple(TopologicalSorter(graph).static_order()) + except CycleError as exc: + names = ' -> '.join(skill.name for skill in exc.args[1]) + raise ValueError(f'技能关联状态存在循环依赖: {names}') from exc + + states = defaultdict(list) + for skill in order: + # All upstream level/parameter contributions are ready now. + if skill.level_source is not None: + skill._lv = resolve_skill(self.character, skill.level_source).lv + contributions, reads = self._collect(skill) + if not reads.issubset(graph[skill]): + raise ValueError(f'技能关联状态依赖随计算改变: {skill.name}') + for item in contributions: + if item.target is self.character or item.attribute not in STATE_ATTRIBUTES: + continue + if skill not in graph[item.target]: + raise ValueError(f'技能关联状态目标随计算改变: {skill.name} -> {item.target.name}') + key = item.target, item.attribute + states[key].append(item) + if item.attribute == 'lv': + base = self._levels[item.target] + value = self._combine(base, states[key]) + item.target._lv = min(item.target.maxLv, max(0, int(value))) + else: + base = self._state_base[key] + object.__setattr__(item.target, item.attribute, self._combine(base, states[key])) + self._state_dirty = False + finally: + self.resolving = False + + def resolve(self): + if self.resolving or not self._dirty: + return + self.resolve_states() + self.resolving = True + try: + self._restore_outputs() + contributions = [] + grouped = defaultdict(list) + for skill in self.skills: + items, _ = self._collect(skill) + contributions.extend(items) + for item in items: + if item.target is not self.character and item.attribute in STATE_ATTRIBUTES: + continue + grouped[item.target, item.attribute].append(item) + for (target, attr), items in grouped.items(): + base = getattr(target, attr, _MISSING) + self._output_base[target, attr] = base + if base is _MISSING and not any(item.operation == '=' for item in items): + raise AttributeError(f'技能关联属性不存在: {items[0].source.name} -> {attr}') + object.__setattr__(target, attr, self._combine(0 if base is _MISSING else base, items)) + self.contributions = tuple(contributions) + self._dirty = False + finally: + self.resolving = False + + @contextmanager + def batch(self): + # 最外层先撤销技能输出贡献,让装备等外部写入落在基础值上,再统一重建。 + # 这里只隔离技能贡献,不解决装备规则彼此之间的执行顺序依赖。 + outermost = not self._depth + if outermost: + self.resolving = True + try: + self._restore_outputs() + finally: + self.resolving = False + self._dirty = self._state_dirty = True + self._depth += 1 + completed = False + try: + yield + completed = True + finally: + self._depth -= 1 + if completed and not self._depth: + self.resolve() diff --git a/backend/core/character/GF/archer/chimera.py b/backend/core/character/GF/archer/chimera.py index b83e8897..4435d679 100644 --- a/backend/core/character/GF/archer/chimera.py +++ b/backend/core/character/GF/archer/chimera.py @@ -1,6 +1,15 @@ #b9cb48777665de22c006fabaf9a560b3 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + Equals, + LevelTable, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.archer.chimera import ChimeraSkillRef as Ref prefix = "archer/chimera/cn/skillDetail" @@ -14,6 +23,7 @@ class Skill0(ActiveSkill): 攻击时,有霸体判定; 转职为缪斯或奇美拉后,技能类型变为独立攻击力。\n """ name = "凌跃一击" + ref = Ref.CRACKARROW cellPos = (6,1) learnLv = 1 masterLv = 10 @@ -56,6 +66,7 @@ class Skill1(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -79,6 +90,7 @@ class Skill2(PassiveSkill): 决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -98,7 +110,11 @@ class Skill2(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{"type":"*skillDamage","data":[i-100 if i>0 else 0 for i in data0],"skills":["华丽回收"]}] + # 迁移前实现(保留对照): + # associate = [{"type":"*skillDamage","data":[i-100 if i>0 else 0 for i in data0],"skills":["华丽回收"]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.SEPARATE]), + ] # 受身蹲伏 # archer/chimera/ce26c6b69d02a440a81b552bec94f03b @@ -108,6 +124,7 @@ class Skill3(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -137,6 +154,7 @@ class Skill4(PassiveSkill): 奇美拉似乎被他人的说教影响了,其技能和部分台词将变得更加乖巧。\n """ name = "肃静!" + ref = Ref.BEQUIET cellPos = (5,1) learnLv = 1 masterLv = 1 @@ -162,6 +180,7 @@ class Skill5(PassiveSkill): 每种类型的“回收利用”武器在地图上最多存在6个,超出数量时,最早出现的“回收利用”武器将消失。\n """ name = "回收利用" + ref = Ref.RECYCLE cellPos = (1,1) learnLv = 1 masterLv = 1 @@ -180,7 +199,11 @@ class Skill5(PassiveSkill): # 回收武器后,移动速度提升持续时间 : {value2}秒 data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [ {"type":"*cdRatio","data":data0,"skills":['投掷匕首', '首足连击', '空翻刃袭', '利剑四重奏', '土星环', '环形毒液', '狂锯旋斧', '刺猬困境', '王冠粉碎者', '巨镰斯诺克', '环阿拉德狂飙']}, ] + # 迁移前实现(保留对照): + # associate = [ {"type":"*cdRatio","data":data0,"skills":['投掷匕首', '首足连击', '空翻刃袭', '利剑四重奏', '土星环', '环形毒液', '狂锯旋斧', '刺猬困境', '王冠粉碎者', '巨镰斯诺克', '环阿拉德狂飙']}, ] + associate = [ + SkillEffect(attribute=SkillAttribute.CD_RATIO, value=1 - Percent(LevelTable(data0)), skills=[Ref.ORTHODOX, Ref.VTOZERO, Ref.LINEARDAGGER, Ref.FOURTHFORCE, Ref.SATURN, Ref.CENTRIFUGALVENOM, Ref.GRINDER, Ref.HEDGEHOGDILEMMA, Ref.CROWNSHREDDER, Ref.BOUNCETABLE, Ref.AIR]), + ] # 技能连招 # archer/chimera/10b31c7e8cd2d60b9bcf3b1d3ada4b0a @@ -202,6 +225,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -224,6 +248,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -248,6 +273,7 @@ class Skill8(ActiveSkill): 转职为缪斯或奇美拉时,技能类型变为独立攻击力。\n """ name = "全力挥击" + ref = Ref.FULLSWING cellPos = (7,2) learnLv = 5 masterLv = 60 @@ -283,6 +309,7 @@ class Skill9(ActiveSkill): 投掷后,匕首会击中敌人身体或插入地面,并可“回收利用”。\n """ name = "投掷匕首" + ref = Ref.ORTHODOX cellPos = (2,2) learnLv = 5 masterLv = 60 @@ -314,6 +341,7 @@ class Skill10(ActiveSkill): 转职为妖护使时,可以在空中施放。\n """ name = "翻月翔击" + ref = Ref.RISINGMOON cellPos = (8,3) learnLv = 10 masterLv = 60 @@ -345,6 +373,7 @@ class Skill11(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -372,6 +401,7 @@ class Skill12(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -401,6 +431,7 @@ class Skill13(ActiveSkill): 学习[败果之慧]技能后,施放技能时会处于无敌状态。\n """ name = "瞬影" + ref = Ref.CEEEE cellPos = (5,3) learnLv = 10 masterLv = 60 @@ -434,6 +465,7 @@ class Skill14(PassiveSkill): 施放[瞬影]技能前,如果先按方向键,则不会向“回收利用”武器所在方向移动,而是向指定方向移动并清除敌人。\n """ name = "瞬影清除" + ref = Ref.CEEEECLEAN learnLv = 10 masterLv = 1 maxLv = 1 @@ -457,6 +489,7 @@ class Skill15(ActiveSkill): 第二次投掷的斧头将用力砸向地面,并可“回收利用”。\n """ name = "首足连击" + ref = Ref.VTOZERO cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -489,6 +522,7 @@ class Skill16(ActiveSkill): 攻击力会受[基础精通]的影响,但无法获得[双重螺旋]技能的异常状态附加伤害效果。\n """ name = "华丽回收" + ref = Ref.SEPARATE cellPos = (1,4) learnLv = 15 masterLv = 1 @@ -515,6 +549,7 @@ class Skill17(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -539,6 +574,7 @@ class Skill18(ActiveSkill): 再次施放技能,可切换异常状态效果; 进入地下城时,最后选择的异常状态效果将自动生效。\n """ name = "双重螺旋" + ref = Ref.DOUBLEHELIX cellPos = (1,5) learnLv = 20 masterLv = 10 @@ -559,9 +595,14 @@ class Skill18(ActiveSkill): # 异常状态持续时间 : {value2}秒 data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {"type":"*skillDamage","data":data0}, + # {"type":"*skillDamage","data":data1,"exceptSkills":["华丽回收"]}, + # ] associate = [ - {"type":"*skillDamage","data":data0}, - {"type":"*skillDamage","data":data1,"exceptSkills":["华丽回收"]}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), except_skills=[Ref.SEPARATE]), ] # 空翻刃袭 @@ -574,6 +615,7 @@ class Skill19(ActiveSkill): 最先投掷的匕首会击中敌人身体或插入地面,并可“回收利用”。\n """ name = "空翻刃袭" + ref = Ref.LINEARDAGGER cellPos = (2,5) learnLv = 20 masterLv = 60 @@ -606,6 +648,7 @@ class Skill20(ActiveSkill): 举起嵌合弓进入防御姿态,降低所受的伤害。 施放技能后短时间内,若防御成功,可格挡敌人的攻击,免除自身所受伤害并进行反击。 反击成功后,进入短暂无敌状态。\n """ name = "喷毒" + ref = Ref.REPULSOR cellPos = (5,6) learnLv = 25 masterLv = 10 @@ -637,6 +680,7 @@ class Skill21(ActiveSkill): #不用 启动神秘的遗物——变形魔方,解锁充满变数的战斗模式,提升基本攻击力、 技能攻击力和物理暴击率。\n """ name = "唯物主义魔方" + ref = Ref.CUBEOFMATERIALISM cellPos = (7,6) learnLv = 25 masterLv = 10 @@ -667,6 +711,7 @@ class Skill22(ActiveSkill): 最先射出的利剑会击中敌人身体或插入地面,并可“回收利用”。\n """ name = "利剑四重奏" + ref = Ref.FOURTHFORCE cellPos = (3,6) learnLv = 25 masterLv = 60 @@ -700,6 +745,7 @@ class Skill23(PassiveSkill): [外形和结构能轻松复刻,但性能却没那么简单! 得指定向量,这可是非常繁琐的工作。 而且,克隆品的维持时间非常短,所以用于印钞是不现实的。]\n """ name = "遗物之力 · 克隆" + ref = Ref.LEGACYOFCOPY cellPos = (6,6) learnLv = 25 masterLv = 10 @@ -718,7 +764,11 @@ class Skill23(PassiveSkill): # 移动速度增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [ {"type":"*skillDamage","data":data0} ] + # 迁移前实现(保留对照): + # associate = [ {"type":"*skillDamage","data":data0} ] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 土星环 # archer/chimera/e862146efac2fce3de3a12f038f4116b @@ -732,6 +782,7 @@ class Skill24(ActiveSkill): 施放[瞬影]过程中,可以预输入[土星环]技能。 预输入成功时,可以配合[瞬影]技能的斩击动作施放[土星环]。\n """ name = "土星环" + ref = Ref.SATURN cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -759,6 +810,7 @@ class Skill25(ActiveSkill): 对于无法抓取的敌人,踩住刺入的剑,借助旋转力将其纵向劈开,造成伤害,同样相当残忍。\n """ name = "碎心连刺" + ref = Ref.HALFLESH cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -832,10 +884,14 @@ class Skill25(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{"data":[0]+[-26]*self.maxLv,"skills":["瞬影"]}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{"data":[0]+[-26]*self.maxLv,"skills":["瞬影"]}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0] + [-26] * maxLv)), skills=[Ref.CEEEE], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 环形毒液 # archer/chimera/854997c3bdfc3a2b498b4c4001f69e06 @@ -847,6 +903,7 @@ class Skill26(ActiveSkill): 在施放技能位置稍前方所投掷的匕首可“回收利用”,若匕首命中敌人,将附着于其身上。\n """ name = "环形毒液" + ref = Ref.CENTRIFUGALVENOM cellPos = (2,8) learnLv = 35 masterLv = 60 @@ -904,6 +961,7 @@ class Skill27(ActiveSkill): 耗尽旋转次数的斧头会落在地面,并可“回收利用”。\n """ name = "狂锯旋斧" + ref = Ref.GRINDER cellPos = (4,9) learnLv = 40 masterLv = 60 @@ -963,6 +1021,7 @@ class Skill28(ActiveSkill): 手中直接发射的剑命中敌人后,可“回收利用”; 若未命中,剑将插进地面。\n """ name = "刺猬困境" + ref = Ref.HEDGEHOGDILEMMA cellPos = (3,10) learnLv = 45 masterLv = 60 @@ -1022,6 +1081,7 @@ class Skill29(PassiveSkill): [巨大化效果可以增加质量和密度,真厉害! 但遗憾的是,结构复杂的生物没办法享受这个能力。]\n """ name = "遗物之力 · 巨大化" + ref = Ref.LEGACYOFGROWTH cellPos = (6,11) learnLv = 48 masterLv = 40 @@ -1038,7 +1098,11 @@ class Skill29(PassiveSkill): # 物理防御力增加 : {value1} data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [ {"type":"*skillDamage","data":data0} ] + # 迁移前实现(保留对照): + # associate = [ {"type":"*skillDamage","data":data0} ] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 重力加速度 # archer/chimera/94c450d6214cafdc673f763badceeaf1 @@ -1048,6 +1112,7 @@ class Skill30(ActiveSkill): 将斧头投掷向墙壁,借助反作用力飞向高空,随后将斧头巨大化,使其砸向地面,粉碎敌人的头颅。\n """ name = "重力加速度" + ref = Ref.NINEPOINTEIGHT cellPos = (4,11) learnLv = 50 masterLv = 40 @@ -1077,6 +1142,7 @@ class Skill31(ActiveSkill): 施放技能后,每隔一定时间填充施放次数。\n """ name = "废物清理" + ref = Ref.SORTING cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1133,6 +1199,7 @@ class Skill32(ActiveSkill): 可在最后坠落的剑所在位置进行“回收利用”。\n """ name = "王冠粉碎者" + ref = Ref.CROWNSHREDDER cellPos = (3,13) learnLv = 70 masterLv = 40 @@ -1182,6 +1249,7 @@ class Skill33(PassiveSkill): [虽然我也不清楚具体原理,但只要是我能理解的结构,通通都能变形,甚至连成分都能改变! 变形魔方为什么会有这种力量? 简直太可怕了!]\n """ name = "遗物奥义 · 变形" + ref = Ref.REALIZATIONANDHANGING cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1198,7 +1266,11 @@ class Skill33(PassiveSkill): # 物理暴击率增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [ {"type":"*skillDamage","data":data0} ] + # 迁移前实现(保留对照): + # associate = [ {"type":"*skillDamage","data":data0} ] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 巨镰斯诺克 # archer/chimera/0dbdeaf846356f8b9380f8fbb8e97377 @@ -1211,6 +1283,7 @@ class Skill34(ActiveSkill): 命中敌人身体的长兵器,可“回收利用”; 若未命中,长兵器则会插在地面。\n """ name = "巨镰斯诺克" + ref = Ref.BOUNCETABLE cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1270,6 +1343,7 @@ class Skill35(ActiveSkill): 最后一击时,根据齿轮经过的路径 (概率决定),附加灼伤、 冰冻、 感电异常状态。\n """ name = "环阿拉德狂飙" + ref = Ref.AIR cellPos = (1,14) learnLv = 80 masterLv = 40 @@ -1383,6 +1457,7 @@ class Skill36(ActiveSkill): 若附近没有可追踪的目标,则无法施放此技能。\n """ name = "幻爆天使之翼" + ref = Ref.ISRAFIL cellPos = (2,14) learnLv = 85 masterLv = 40 @@ -1416,6 +1491,7 @@ class Skill37(PassiveSkill): [土星环] : 在施放[瞬影]过程中,可预输入该技能指令。 预输入成功后,发动[瞬影]的斩击动作,可同时投掷旋转的斧头。\n """ name = "败果之慧" + ref = Ref.FRUITOFFAIL cellPos = (6,15) learnLv = 95 masterLv = 40 @@ -1430,7 +1506,11 @@ class Skill37(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [ {"type":"*skillDamage","data":data0} ] + # 迁移前实现(保留对照): + # associate = [ {"type":"*skillDamage","data":data0} ] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 颠倒之浩劫 # archer/chimera/bbc15561bec24f9c1e79e23d715b1dd2 @@ -1441,6 +1521,7 @@ class Skill38(ActiveSkill): 经常丢三落四的聆风·奇美拉在倒悬时,会掉落自己的随身物品以及“回收利用”的匕首、 剑、 斧头、 长兵器各1个。\n """ name = "颠倒之浩劫" + ref = Ref.HAVOC cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1471,6 +1552,7 @@ class Skill39(ActiveSkill): 最致命的攻击,便是出其不意的突袭。 聆风·奇美拉先用斧头使敌人眩晕 (控制),再用弓穿刺敌人身体。 随后踩住弓身,借助弓的张力施展强力一击。 攻击后,立即借助遗物——变形魔方的力量,发射巨大化的剑,彻底消灭敌人。\n """ name = "熵变 : 非线性跳跃" + ref = Ref.UNLINEARENTROPYSKIP cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/archer/hunter.py b/backend/core/character/GF/archer/hunter.py index 22005b2d..9190b39c 100644 --- a/backend/core/character/GF/archer/hunter.py +++ b/backend/core/character/GF/archer/hunter.py @@ -1,6 +1,28 @@ # b9cb48777665de22c006fabaf9a560b3 from core.basic.skill import PassiveSkill, ActiveSkill, get_data, _get_skill_damage_suffixes, _get_skill_dataplus_suffixes from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Equals, + LevelTable, + Operation, + Percent, + ProfessionAttribute, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.archer.hunter import HunterSkillRef as Ref + + +class HunterAttribute(ProfessionAttribute): + """本职业专用的最终效果属性;字段含义与技能实现保持一致。""" + MARK_RATIO = 'markRation' + """猎人:每层标记对应的技能伤害增量。""" + NORMAL_RATIO = 'normalRation' + """猎人:不消耗标记的技能伤害增量。""" + prefix = "archer/hunter/cn/skillDetail" @@ -43,6 +65,7 @@ class Skill0(HunterActiveSkill): """ name = '凌跃一击' + ref = Ref.CRACKARROW cellPos = (4,1) learnLv = 1 masterLv = 10 @@ -89,6 +112,7 @@ class Skill1(PassiveSkill): """ name = '狩猎之瞳' + ref = Ref.HAWKEYE cellPos = (2,1) learnLv = 1 masterLv = 1 @@ -117,6 +141,7 @@ class Skill2(PassiveSkill): """ name = '强攻弩掌握' + ref = Ref.CROSSSHOOTER cellPos = (3,1) learnLv = 1 masterLv = 1 @@ -131,7 +156,11 @@ class Skill2(PassiveSkill): # 转职技能冷却时间减少 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*cdReduce', 'exceptSkills': ['联合作战 : 围猎', '完美瞄准', '联合作战 : 最终一役']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*cdReduce', 'exceptSkills': ['联合作战 : 围猎', '完美瞄准', '联合作战 : 最终一役']}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data0)), except_skills=[Ref.JOINTROUNDUP, Ref.PERFECTAIMING, Ref.JOINTDEMOLISHER]), + ] # 帕伊卡 : 奇袭 # archer/hunter/38612d8f2561edc2eb68d5057a837bfa @@ -144,6 +173,7 @@ class Skill3(HunterActiveSkill): """ name = '帕伊卡 : 奇袭' + ref = Ref.FALKEQUICKPECKING cellPos = (7,1) learnLv = 1 masterLv = 60 @@ -176,6 +206,7 @@ class Skill4(HunterActiveSkill): """ name = '迅猛速射' + ref = Ref.RAPIDSHOT cellPos = (6,1) learnLv = 1 masterLv = 60 @@ -207,6 +238,7 @@ class Skill5(HunterActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -231,6 +263,7 @@ class Skill6(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -250,7 +283,11 @@ class Skill6(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['急速扳机']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['急速扳机']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.FASTTRIGGER]), + ] # 受身蹲伏 # archer/hunter/ce26c6b69d02a440a81b552bec94f03b @@ -260,6 +297,7 @@ class Skill7(HunterActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -301,6 +339,7 @@ class Skill8(HunterActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -323,6 +362,7 @@ class Skill9(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -348,6 +388,7 @@ class Skill10(HunterActiveSkill): """ name = '全力挥击' + ref = Ref.FULLSWING cellPos = (4,2) learnLv = 5 masterLv = 60 @@ -386,6 +427,7 @@ class Skill11(HunterActiveSkill): """ name = '推进装置' + ref = Ref.BOOSTGEAR cellPos = (3,2) learnLv = 5 masterLv = 1 @@ -411,6 +453,7 @@ class Skill12(HunterActiveSkill): """ name = '引爆发射' + ref = Ref.BOMBSHOOTER cellPos = (5,2) learnLv = 5 masterLv = 60 @@ -450,6 +493,7 @@ class Skill13(HunterActiveSkill): """ name = '翻月翔击' + ref = Ref.RISINGMOON cellPos = (4,3) learnLv = 10 masterLv = 60 @@ -480,6 +524,7 @@ class Skill14(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -507,6 +552,7 @@ class Skill15(HunterActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -539,6 +585,7 @@ class Skill16(PassiveSkill): """ name = '猎物识别' + ref = Ref.DISTINGUISHPREY cellPos = (2,4) learnLv = 15 masterLv = 10 @@ -561,7 +608,12 @@ class Skill16(PassiveSkill): # 单个敌人最大可标记层数 : {value4} data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{'data': data0, 'type': '+normalRation'}, {'data': data1, 'type': '+markRation'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '+normalRation'}, {'data': data1, 'type': '+markRation'}] + associate = [ + SkillEffect(attribute=HunterAttribute.NORMAL_RATIO, operation=Operation.ADD, value=Percent(LevelTable(data0))), + SkillEffect(attribute=HunterAttribute.MARK_RATIO, operation=Operation.ADD, value=Percent(LevelTable(data1))), + ] # 帕伊卡 : 刃羽 # archer/hunter/c77a417c43de80c4ce32c1ed405d174a @@ -573,6 +625,7 @@ class Skill17(HunterActiveSkill): """ name = '帕伊卡 : 刃羽' + ref = Ref.FALKEBLADEFEATHER cellPos = (7,4) learnLv = 15 masterLv = 60 @@ -607,6 +660,7 @@ class Skill18(HunterActiveSkill): """ name = '炽热喷涌' + ref = Ref.SPRINKLER cellPos = (6,4) learnLv = 15 masterLv = 60 @@ -639,6 +693,7 @@ class Skill19(HunterActiveSkill): """ name = '急速扳机' + ref = Ref.FASTTRIGGER cellPos = (4,5) learnLv = 20 masterLv = 1 @@ -680,6 +735,7 @@ class Skill20(HunterActiveSkill): """ name = '高压喷射' + ref = Ref.HIGHPRESSURE cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -715,6 +771,7 @@ class Skill21(PassiveSkill): """ name = '暴击' + ref = Ref.PHYSICALCRITICALHITUP cellPos = (5,0) learnLv = 20 masterLv = 10 @@ -739,6 +796,7 @@ class Skill22(PassiveSkill): """ name = '强攻弩精通' + ref = Ref.CROSSSHOOTERMASTERY cellPos = (2,6) learnLv = 25 masterLv = 10 @@ -758,7 +816,11 @@ class Skill22(PassiveSkill): # 魔法值消耗量减少 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '$*PAtkP', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '$*PAtkP', 'data': data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 重型穿甲箭 # archer/hunter/8572675ec6a1f50b6eff6a867376c2de @@ -771,6 +833,7 @@ class Skill23(HunterActiveSkill): """ name = '重型穿甲箭' + ref = Ref.MASSIVEPIERCER cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -809,6 +872,7 @@ class Skill24(HunterActiveSkill): """ name = '狩猎开始' + ref = Ref.STARTHUNT cellPos = (2,7) learnLv = 30 masterLv = 10 @@ -839,6 +903,7 @@ class Skill25(HunterActiveSkill): """ name = '帕伊卡 : 迷惑之舞' + ref = Ref.FALKECONFUSINGMOVE cellPos = (7,7) learnLv = 30 masterLv = 60 @@ -879,6 +944,7 @@ class Skill26(HunterActiveSkill): """ name = '霰弹之箭' + ref = Ref.WARNINGSHOTGUN cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -914,6 +980,7 @@ class Skill27(PassiveSkill): """ name = '二重助推' + ref = Ref.SECONDBOOST cellPos = (5,8) learnLv = 35 masterLv = 1 @@ -929,8 +996,12 @@ class Skill27(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # [重型穿甲箭]弩箭速度增加量 : 25% + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0, 'skills': ['重型穿甲箭']}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0, 'skills': ['重型穿甲箭']}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.MASSIVEPIERCER]), ] # [重型穿甲箭]弩箭速度增加量 : 25% @@ -945,6 +1016,7 @@ class Skill28(HunterActiveSkill): """ name = '光爆箭' + ref = Ref.FLARE cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -995,10 +1067,14 @@ class Skill28(HunterActiveSkill): self.cd = 24 self.skillRation *= 1.6 - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '*skillRation', 'data': [0] + [-20] * self.maxLv, 'skills': ['霰弹之箭']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-20] * self.maxLv, 'skills': ['霰弹之箭']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-20] * maxLv)), skills=[Ref.WARNINGSHOTGUN], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 帕伊卡 : 困兽之网 # archer/hunter/5152480fdde81362575a488d4cec4af9 @@ -1014,6 +1090,7 @@ class Skill29(HunterActiveSkill): """ name = '帕伊卡 : 困兽之网' + ref = Ref.FALKEWEBDROP cellPos = (7,9) learnLv = 40 masterLv = 60 @@ -1075,6 +1152,7 @@ class Skill30(HunterActiveSkill): """ name = '箭雨' + ref = Ref.BOLTRAIN cellPos = (6,9) learnLv = 40 masterLv = 60 @@ -1134,6 +1212,7 @@ class Skill31(HunterActiveSkill): """ name = '三弓弩箭' + ref = Ref.THREEINABED cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1208,6 +1287,7 @@ class Skill32(PassiveSkill): """ name = '帕伊卡锐眼' + ref = Ref.DONTLOSEFALKE cellPos = (2,11) learnLv = 48 masterLv = 40 @@ -1226,7 +1306,11 @@ class Skill32(PassiveSkill): # 暴击伤害增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data2, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data2, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # 联合作战 : 围猎 # archer/hunter/1812a1ece67bb37b6b44b54766450064 @@ -1240,6 +1324,7 @@ class Skill33(HunterActiveSkill): """ name = '联合作战 : 围猎' + ref = Ref.JOINTROUNDUP cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1280,6 +1365,7 @@ class Skill34(HunterActiveSkill): """ name = '联合作战 : 空中轰炸' + ref = Ref.JOINTCARPETBOMBING cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1358,6 +1444,7 @@ class Skill35(HunterActiveSkill): """ name = '帕伊卡 : 翼之刀锋' + ref = Ref.FALKEWINGCUTTER cellPos = (7,13) learnLv = 70 masterLv = 40 @@ -1418,6 +1505,7 @@ class Skill36(PassiveSkill): """ name = '装置升级' + ref = Ref.GEARUPGRADE cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1432,7 +1520,11 @@ class Skill36(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 终结穿刺 # archer/hunter/b89c9ab317bc0a443f6497b7cca2f6a8 @@ -1446,6 +1538,7 @@ class Skill37(HunterActiveSkill): """ name = '终结穿刺' + ref = Ref.FDPIERCER cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1520,6 +1613,7 @@ class Skill38(HunterActiveSkill): """ name = '帕伊卡 : 索敌集束弹' + ref = Ref.FALKECHASINGKLER cellPos = (7,14) learnLv = 80 masterLv = 40 @@ -1586,6 +1680,7 @@ class Skill39(HunterActiveSkill): """ name = '完美瞄准' + ref = Ref.PERFECTAIMING cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1621,6 +1716,7 @@ class Skill40(PassiveSkill): """ name = '追猎者勋章' + ref = Ref.MEDALOFVETERANHUNTER cellPos = (4,15) learnLv = 95 masterLv = 40 @@ -1635,7 +1731,11 @@ class Skill40(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 联合作战 : 扭转战局 # archer/hunter/e0daa922b19cdc35de879e938361464e @@ -1648,6 +1748,7 @@ class Skill41(HunterActiveSkill): """ name = '联合作战 : 扭转战局' + ref = Ref.JOINTTURNINGPOINT cellPos = (6,15) learnLv = 95 masterLv = 40 @@ -1686,6 +1787,7 @@ class Skill42(HunterActiveSkill): """ name = '联合作战 : 最终一役' + ref = Ref.JOINTDEMOLISHER cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/archer/muse.py b/backend/core/character/GF/archer/muse.py index fbd7050a..8627ca33 100644 --- a/backend/core/character/GF/archer/muse.py +++ b/backend/core/character/GF/archer/muse.py @@ -1,6 +1,13 @@ #944b9aab492c15a8474f96947ceeb9e4 from core.basic.skill import PassiveBufferSkill,ActiveBufferSkill,ActiveSkill,PassiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, +) +from core.character.refs.archer.muse import MuseSkillRef as Ref prefix = "archer/muse/cn/skillDetail" @@ -14,6 +21,7 @@ class Skill0(ActiveSkill): 攻击时,有霸体判定; 转职为缪斯或奇美拉后,技能类型变为独立攻击力。\n """ name = "凌跃一击" + ref = Ref.CRACKARROW learnLv = 1 masterLv = 10 maxLv = 20 @@ -56,6 +64,7 @@ class Skill1(ActiveSkill): 弓弦的震动在地面产生音波,对范围内的敌人造成多段伤害,并逐渐聚拢到中央。\n """ name = "热场调音" + ref = Ref.WARMINGUP learnLv = 1 masterLv = 60 maxLv = 70 @@ -87,6 +96,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -110,6 +120,7 @@ class Skill3(PassiveSkill): 决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -137,6 +148,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -178,6 +190,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -200,6 +213,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -224,6 +238,7 @@ class Skill7(ActiveSkill): 转职为缪斯或奇美拉时,技能类型变为独立攻击力。\n """ name = "全力挥击" + ref = Ref.FULLSWING learnLv = 5 masterLv = 60 maxLv = 70 @@ -256,6 +271,7 @@ class Skill8(ActiveSkill): 用力拉动神弦弓的外弦后松开,向前方发射魔力,魔力以均衡器的形状显现,对前方的敌人造成伤害。\n """ name = "激活均衡器" + ref = Ref.ACTIVEEQUALIZER learnLv = 5 masterLv = 60 maxLv = 70 @@ -291,6 +307,7 @@ class Skill9(ActiveSkill): 转职为妖护使时,可以在空中施放。\n """ name = "翻月翔击" + ref = Ref.RISINGMOON learnLv = 10 masterLv = 60 maxLv = 70 @@ -317,6 +334,7 @@ class Skill10(ActiveBufferSkill): 竖起神弦弓弹奏一小段旋律,向四周扩散开的旋律可以恢复自身和周围队友的生命值。\n """ name = "夜与梦" + ref = Ref.NIGHTANDDREAM learnLv = 10 masterLv = 60 maxLv = 70 @@ -347,6 +365,7 @@ class Skill11(ActiveSkill): 可在空中施放; 未按方向键时,在当前位置直接落地。\n """ name = "闪亮首秀" + ref = Ref.HOTDEBUT learnLv = 10 masterLv = 1 maxLv = 11 @@ -383,6 +402,7 @@ class Skill12(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -410,6 +430,7 @@ class Skill13(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -438,6 +459,7 @@ class Skill14(PassiveSkill): 装备神弦弓以外的武器时,音律的丰富程度受限,无法施放以演奏为基础的技能。\n """ name = "悦耳音律" + ref = Ref.FEASTOFSOUND learnLv = 15 masterLv = 1 maxLv = 11 @@ -471,6 +493,7 @@ class Skill15(PassiveBufferSkill): [当然了! 我的音乐里可是有许多奥秘,要不要听一听?]\n """ name = "多彩感性" + ref = Ref.SENSATION learnLv = 15 masterLv = 60 maxLv = 70 @@ -515,7 +538,11 @@ class Skill15(PassiveBufferSkill): data13 = get_data(f'{prefix}/{uuid}', 13) Spirit = data0 - associate = [{"data":data0,"type":"$+Spirit","ratio":1}] + # 迁移前实现(保留对照): + # associate = [{"data":data0,"type":"$+Spirit","ratio":1}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=LevelTable(data0)), + ] CarryRatio = [0]+ [((1 + i / 100) ** 3) * 100 - 100 for i in data8]# noqa: E501 # 乐力全开 : 力 @@ -534,6 +561,7 @@ class Skill16(ActiveSkill): 该功能可以在缪斯施放乐谱技能期间随时使用。\n """ name = "乐力全开 : 力" + ref = Ref.EFFECTORONPOWER learnLv = 15 masterLv = 1 maxLv = 1 @@ -562,6 +590,7 @@ class Skill17(PassiveSkill): 演奏期间,可以强制中断演奏并施放觉醒技能。\n """ name = "幸福时光" + ref = Ref.FEELHAPPY learnLv = 15 masterLv = 10 maxLv = 20 @@ -597,6 +626,7 @@ class Skill18(ActiveSkill): 施放[乐力全开]技能时,技能图标变为4分音符(♩),可用于演奏乐谱。\n """ name = "音波冲击" + ref = Ref.CULTURESHOCK learnLv = 15 masterLv = 60 maxLv = 70 @@ -642,6 +672,7 @@ class Skill19(ActiveSkill): 该功能可以在缪斯施放乐谱技能期间随时使用。\n """ name = "乐力全开 : 律" + ref = Ref.EFFECTORONGROOVE learnLv = 20 masterLv = 1 maxLv = 1 @@ -670,6 +701,7 @@ class Skill20(PassiveSkill): 演奏期间,可以强制中断演奏并施放觉醒技能。\n """ name = "情绪调动" + ref = Ref.REFRESH learnLv = 20 masterLv = 1 maxLv = 11 @@ -699,6 +731,7 @@ class Skill21(ActiveBufferSkill): 该效果无法和光明骑士 (男) 的[守护徽章],光明骑士 (女) 的[守护祝福],小魔女的[小魔女的偏爱]、 协战师的[装甲强化]重复适用。\n """ name = "主角登场" + ref = Ref.MAINSTAR learnLv = 20 masterLv = 10 maxLv = 20 @@ -745,6 +778,7 @@ class Skill22(ActiveSkill): 施放[乐力全开]系列技能时,技能图标变为8分音符(♪)。\n """ name = "街头演出" + ref = Ref.BUSKING learnLv = 20 masterLv = 60 maxLv = 70 @@ -781,6 +815,7 @@ class Skill23(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -806,6 +841,7 @@ class Skill24(ActiveSkill): 可以强制中断该技能的施放后僵直并立即施放[震感频谱]、 [乐章再现]。\n """ name = "动感音符" + ref = Ref.VIVID learnLv = 25 masterLv = 60 maxLv = 70 @@ -843,6 +879,7 @@ class Skill25(ActiveBufferSkill): 该效果无法和光明骑士 (男) 的[荣誉祝福]、 光明骑士 (女) 的[勇气祝福]、 小魔女的[禁术吟咏]、 协战师的[军械强化]重复适用。\n """ name = "可爱节拍" + ref = Ref.LOVELYTEMPO learnLv = 30 masterLv = 10 maxLv = 50 @@ -894,6 +931,7 @@ class Skill26(ActiveSkill): 施放[乐力全开]技能时,技能图标变为16分音符(♬),可用于演奏乐谱。\n """ name = "震感频谱" + ref = Ref.POPPINGSPECTRUM learnLv = 30 masterLv = 60 maxLv = 70 @@ -932,6 +970,7 @@ class Skill27(PassiveSkill): 演奏期间,可以强制中断演奏并施放觉醒技能。\n """ name = "自由律动" + ref = Ref.FEELRUBATO learnLv = 30 masterLv = 10 maxLv = 20 @@ -966,6 +1005,7 @@ class Skill28(ActiveSkill): 施放[乐力全开]技能时,技能图标变为4分音符(♩)。\n """ name = "乐章再现" + ref = Ref.DACAPO learnLv = 35 masterLv = 60 maxLv = 70 @@ -1028,6 +1068,7 @@ class Skill29(ActiveSkill): 光球凝聚魔力期间,对近处敌人产生吸附效果。\n """ name = "音力增强" + ref = Ref.POWERFORTE learnLv = 40 masterLv = 60 maxLv = 70 @@ -1088,6 +1129,7 @@ class Skill30(PassiveBufferSkill): 演奏期间,可以强制中断演奏并施放觉醒技能。\n """ name = "燃情狂想曲" + ref = Ref.ADRENALINRHAPSODY learnLv = 40 masterLv = 1 maxLv = 1 @@ -1128,6 +1170,7 @@ class Skill31(ActiveSkill): 施放[乐力全开]系列技能时,技能图标变为8分音符(♪)。\n """ name = "缪斯之声" + ref = Ref.SOUNDOFMUSE learnLv = 45 masterLv = 60 maxLv = 70 @@ -1197,6 +1240,7 @@ class Skill32(PassiveSkill): 演奏期间,可以强制中断演奏并施放觉醒技能。\n """ name = "甜蜜柔歌" + ref = Ref.SWEETCANTABILE learnLv = 45 masterLv = 10 maxLv = 20 @@ -1230,6 +1274,7 @@ class Skill33(PassiveBufferSkill): [这个舞台是属于大家的!]\n """ name = "明星气场" + ref = Ref.POPULARITY learnLv = 48 masterLv = 40 maxLv = 50 @@ -1261,7 +1306,11 @@ class Skill33(PassiveBufferSkill): STRINT = data0 Spirit = data1 - associate = [{"data": data1,"type": "$+Spirit","ratio":1}] # type: ignore + # 迁移前实现(保留对照): + # associate = [{"data": data1,"type": "$+Spirit","ratio":1}] # type: ignore + associate = [ + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=LevelTable(data1)), + ] # 梦想的舞台 # archer/muse/c61f5a010370101402b05b21916c2071 @@ -1278,6 +1327,7 @@ class Skill34(ActiveBufferSkill): 该效果无法与光明骑士 (男) 的[天启之光]、 光明骑士 (女) 的[圣光天启]、 小魔女的[开幕!人偶剧场]、 协战师的[强袭策略 : 区域肃清]重复适用。\n """ name = "梦想的舞台" + ref = Ref.ONTHESTAGE learnLv = 50 masterLv = 40 maxLv = 50 @@ -1323,6 +1373,7 @@ class Skill35(ActiveBufferSkill): 向前方发送布置舞台的信号,幕后人员收到信号后,会把音乐会专用的扩音器投放在指定位置,落下的扩音器引发冲击波,并因为无法承受落地冲击而爆炸,对更大范围造成巨大伤害。\n """ name = "调音放送" + ref = Ref.DROPTHEBEAT learnLv = 60 masterLv = 40 maxLv = 50 @@ -1392,6 +1443,7 @@ class Skill36(ActiveBufferSkill): 死亡状态下仍可用复活币复活,但适用中的增益效果消失。\n """ name = "独家演奏" + ref = Ref.FANSERVICE learnLv = 60 masterLv = 1 maxLv = 11 @@ -1425,6 +1477,7 @@ class Skill37(ActiveSkill): 施放[乐力全开]系列技能时,技能图标变为16分音符(♬)。\n """ name = "闪耀旋律" + ref = Ref.DAZZLINGSCENE learnLv = 70 masterLv = 40 maxLv = 50 @@ -1490,6 +1543,7 @@ class Skill38(PassiveBufferSkill): [“曾有人批判她的音乐过于实验性,但现在,她证明了她的音乐和表演名副其实,是神界潮流趋势的代表。” --评论家洛克·夏勒]\n """ name = "崭新曲风" + ref = Ref.BRANDNEW learnLv = 75 masterLv = 40 maxLv = 50 @@ -1511,7 +1565,11 @@ class Skill38(PassiveBufferSkill): data3 = get_data(f'{prefix}/{uuid}', 3) Spirit = data0 - associate = [{"data": data0,"type": "$+Spirit","ratio":1}] # type: ignore + # 迁移前实现(保留对照): + # associate = [{"data": data0,"type": "$+Spirit","ratio":1}] # type: ignore + associate = [ + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=LevelTable(data0)), + ] # 巨星登场 # archer/muse/1721e94897e9961d5c98130a13392f17 @@ -1522,6 +1580,7 @@ class Skill39(ActiveSkill): 施放[街头演出]、 [缪斯之声]技能期间,可以施放该技能,此时扩音器会飞到空中照明。\n """ name = "巨星登场" + ref = Ref.SPECIALOPENING learnLv = 75 masterLv = 40 maxLv = 50 @@ -1591,6 +1650,7 @@ class Skill40(PassiveSkill): 演奏期间,可以强制中断演奏并施放觉醒技能。\n """ name = "音量顶峰" + ref = Ref.LUCKYCRESCENDO learnLv = 75 masterLv = 10 maxLv = 20 @@ -1624,6 +1684,7 @@ class Skill41(ActiveSkill): 爆炸发生后,棱镜中残留的魔力会继续维持霸体护甲效果。 当魔力完全耗尽时,棱镜消失,霸体护甲效果结束。\n """ name = "辉光变奏" + ref = Ref.VARIATIONOFLIGHT learnLv = 80 masterLv = 40 maxLv = 50 @@ -1695,6 +1756,7 @@ class Skill42(ActiveSkill): 聚光灯照亮了今天的主角——时律之音,伴随着宣告演出开始的五彩焰火,周围也变得明亮起来。\n """ name = "开场 : 唯我璀璨" + ref = Ref.INTROSHINEONME learnLv = 85 masterLv = 40 maxLv = 50 @@ -1738,6 +1800,7 @@ class Skill43(PassiveBufferSkill): [愿聆听和享受此曲的大家成为一体!]\n """ name = "和茉霓之歌" + ref = Ref.EPISODEOFHARMONY learnLv = 95 masterLv = 40 maxLv = 50 @@ -1758,7 +1821,11 @@ class Skill43(PassiveBufferSkill): data2 = get_data(f'{prefix}/{uuid}', 2) Spirit = data1 - associate = [{"data": data1,"type": "$+Spirit","ratio":1}] # type: ignore + # 迁移前实现(保留对照): + # associate = [{"data": data1,"type": "$+Spirit","ratio":1}] # type: ignore + associate = [ + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=LevelTable(data1)), + ] # 梦幻三重奏 # archer/muse/51a08fd0c90f0a5276cd552047fac93d @@ -1770,6 +1837,7 @@ class Skill44(ActiveSkill): 舞台持续时间内,增加舞台上队友的物理、 魔法防御力。 缪斯增加神兽力恢复量,并在施放乐力全开系列技能期间,附加霸体效果。\n """ name = "梦幻三重奏" + ref = Ref.DREAMINGTRILOGY learnLv = 95 masterLv = 40 maxLv = 50 @@ -1819,6 +1887,7 @@ class Skill45(ActiveBufferSkill): 若所选的技能还在冷却中,则无法施放三次觉醒技能。\n """ name = "终曲 : 霓虹蝶梦" + ref = Ref.FINALESPECIALSTORY learnLv = 100 masterLv = 40 maxLv = 50 diff --git a/backend/core/character/GF/archer/traveler.py b/backend/core/character/GF/archer/traveler.py index 39984d4c..c43c0515 100644 --- a/backend/core/character/GF/archer/traveler.py +++ b/backend/core/character/GF/archer/traveler.py @@ -1,6 +1,32 @@ # b9cb48777665de22c006fabaf9a560b3 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + All, + CharacterAttribute, + CharacterEffect, + Equals, + GreaterThan, + LevelTable, + MissingTargetPolicy, + Not, + Operation, + Percent, + ProfessionAttribute, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.archer.traveler import TravelerSkillRef as Ref + + +class TravelerAttribute(ProfessionAttribute): + """本职业专用的最终效果属性;字段含义与技能实现保持一致。""" + TRAVELER_CDR = 'travelerCDR' + """旅人:装载模式的冷却缩减参数。""" + TRAVELER_DAMAGE = 'travelerDamage' + """旅人:装载模式的伤害加成参数。""" + prefix = "archer/traveler/cn/skillDetail" @@ -31,6 +57,7 @@ class Skill0(PassiveSkill): """ name = '附件 : 迷雾装置' + ref = Ref.MISTGEAR cellPos = (4,1) learnLv = 1 masterLv = 1 @@ -54,6 +81,7 @@ class Skill1(ActiveSkill): """ name = '凌跃一击' + ref = Ref.CRACKARROW cellPos = (5,1) learnLv = 1 masterLv = 10 @@ -98,6 +126,7 @@ class Skill2(ActiveSkill): """ name = '迷雾爆裂' + ref = Ref.MISTBURST cellPos = (6,1) learnLv = 1 masterLv = 60 @@ -129,6 +158,7 @@ class Skill3(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -153,6 +183,7 @@ class Skill4(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -172,7 +203,11 @@ class Skill4(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['迷雾箭雨']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['迷雾箭雨']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.MISTCROWD]), + ] # 受身蹲伏 # archer/traveler/ce26c6b69d02a440a81b552bec94f03b @@ -182,6 +217,7 @@ class Skill5(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -223,6 +259,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -245,6 +282,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -269,6 +307,7 @@ class Skill8(ActiveSkill): """ name = '绝技袭击' + ref = Ref.ACROBATICRAID cellPos = (3,2) learnLv = 5 masterLv = 60 @@ -300,6 +339,7 @@ class Skill9(ActiveSkill): """ name = '全力挥击' + ref = Ref.FULLSWING cellPos = (1,2) learnLv = 5 masterLv = 60 @@ -335,6 +375,7 @@ class Skill10(ActiveSkill): """ name = '高速机动' + ref = Ref.QUICKMOVE cellPos = (4,2) learnLv = 5 masterLv = 1 @@ -366,6 +407,7 @@ class Skill11(ActiveSkill): """ name = '翻月翔击' + ref = Ref.RISINGMOON cellPos = (4,3) learnLv = 10 masterLv = 60 @@ -396,6 +438,7 @@ class Skill12(ActiveSkill): """ name = '营火' + ref = Ref.CAMPFIRE cellPos = (6,3) learnLv = 10 masterLv = 1 @@ -447,6 +490,7 @@ class Skill13(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -474,6 +518,7 @@ class Skill14(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -502,6 +547,7 @@ class Skill15(ActiveSkill): """ name = '迷雾箭雨' + ref = Ref.MISTCROWD cellPos = (2,4) learnLv = 15 masterLv = 1 @@ -535,6 +581,7 @@ class Skill16(ActiveSkill): """ name = '驱虫烈火' + ref = Ref.INSECTFIRE cellPos = (6,5) learnLv = 20 masterLv = 60 @@ -575,6 +622,7 @@ class Skill17(PassiveSkill): """ name = '玄机弓精通' + ref = Ref.BOWMASTERY cellPos = (5,5) learnLv = 20 masterLv = 10 @@ -592,7 +640,11 @@ class Skill17(PassiveSkill): # 命中率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'type': '$*PAtkP', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '$*PAtkP', 'data': data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 暴击 # archer/traveler/fc1262c19f3d0477ee8eda47b8db8696 @@ -602,6 +654,7 @@ class Skill18(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -626,6 +679,7 @@ class Skill19(ActiveSkill): """ name = '三重加速' + ref = Ref.TRIPLEAXEL cellPos = (3,6) learnLv = 25 masterLv = 60 @@ -665,6 +719,7 @@ class Skill20(ActiveSkill): """ name = '斗志昂扬' + ref = Ref.EXCITING cellPos = (5,6) learnLv = 25 masterLv = 10 @@ -694,6 +749,7 @@ class Skill21(ActiveSkill): """ name = '细雨' + ref = Ref.DRIZZLE cellPos = (7,7) learnLv = 30 masterLv = 60 @@ -727,6 +783,7 @@ class Skill22(ActiveSkill): """ name = '急流' + ref = Ref.JETSTREAM cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -768,6 +825,7 @@ class Skill23(ActiveSkill): """ name = '旅人的直觉' + ref = Ref.INTUITION cellPos = (5,8) learnLv = 35 masterLv = 10 @@ -790,7 +848,11 @@ class Skill23(ActiveSkill): # 暴击伤害增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [ {"data": data3}] + # 迁移前实现(保留对照): + # associate = [ {"data": data3}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3))), + ] # 高原雾花 # archer/traveler/42c82812f86ff6704ae9952a2e6093a4 @@ -802,6 +864,7 @@ class Skill24(ActiveSkill): """ name = '高原雾花' + ref = Ref.GYPSOPHILA cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -858,6 +921,7 @@ class Skill25(ActiveSkill): """ name = '装置驱动' + ref = Ref.GEARDRIVE cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -912,6 +976,7 @@ class Skill26(ActiveSkill): """ name = '装载 : 猛击' + ref = Ref.SETUPATTACK cellPos = (8,9) learnLv = 40 masterLv = 1 @@ -932,7 +997,11 @@ class Skill26(ActiveSkill): # 空中施放技能结束后霸体护甲持续时间 : {value2}秒 data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0, 'type': '=travelerDamage', 'skills': ['装置驱动', '浓雾暴雨', '登跃飞锚', '神雾兵仗·妖旋风', '流雾疾风', '装载 : 烟花漫天', '装置驱动·星云', '神雾兵仗·流星']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '=travelerDamage', 'skills': ['装置驱动', '浓雾暴雨', '登跃飞锚', '神雾兵仗·妖旋风', '流雾疾风', '装载 : 烟花漫天', '装置驱动·星云', '神雾兵仗·流星']}] + associate = [ + SkillEffect(attribute=TravelerAttribute.TRAVELER_DAMAGE, operation=Operation.ASSIGN, value=LevelTable(data0), skills=[Ref.GEARDRIVE, Ref.MISTHEAVYRAIN, Ref.SCRAMBLEANCHOR, Ref.SETUPRAGE, Ref.HAZESTORM, Ref.SETUPFIRE, '装置驱动·星云', Ref.STARARROW], missing_target=MissingTargetPolicy.SKIP), + ] # 浓雾暴雨 # archer/traveler/ade01c1d6afc8a05055225045e89fe49 @@ -944,6 +1013,7 @@ class Skill27(TravelerActiveSkill): """ name = '浓雾暴雨' + ref = Ref.MISTHEAVYRAIN cellPos = (7,9) learnLv = 40 masterLv = 60 @@ -997,6 +1067,7 @@ class Skill28(TravelerActiveSkill): """ name = '神雾兵仗·流星' + ref = Ref.STARARROW cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1090,6 +1161,7 @@ class Skill29(PassiveSkill): """ name = '野外生存' + ref = Ref.SURVIVAL cellPos = (4,11) learnLv = 48 masterLv = 40 @@ -1106,7 +1178,11 @@ class Skill29(PassiveSkill): # 技能和消耗品生命值、 魔法值恢复效果增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 旷野火炎 # archer/traveler/506e7ed77d517419a6e1c437a2cedb17 @@ -1119,6 +1195,7 @@ class Skill30(ActiveSkill): """ name = '旷野火炎' + ref = Ref.WILDFIRE cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1159,6 +1236,7 @@ class Skill31(PassiveSkill): """ name = '装载 : 闪攻' + ref = Ref.SETUPCOOLTIME cellPos = (8,12) learnLv = 60 masterLv = 1 @@ -1175,7 +1253,11 @@ class Skill31(PassiveSkill): # 增益最大持续时间 : {value1}秒 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '=travelerCDR', 'skills': ['装置驱动', '浓雾暴雨', '登跃飞锚', '神雾兵仗·妖旋风', '流雾疾风', '装载 : 烟花漫天', '装置驱动·星云', '神雾兵仗·流星']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '=travelerCDR', 'skills': ['装置驱动', '浓雾暴雨', '登跃飞锚', '神雾兵仗·妖旋风', '流雾疾风', '装载 : 烟花漫天', '装置驱动·星云', '神雾兵仗·流星']}] + associate = [ + SkillEffect(attribute=TravelerAttribute.TRAVELER_CDR, operation=Operation.ASSIGN, value=LevelTable(data0), skills=[Ref.GEARDRIVE, Ref.MISTHEAVYRAIN, Ref.SCRAMBLEANCHOR, Ref.SETUPRAGE, Ref.HAZESTORM, Ref.SETUPFIRE, '装置驱动·星云', Ref.STARARROW], missing_target=MissingTargetPolicy.SKIP), + ] # 登跃飞锚 # archer/traveler/a5fa08f5d509e6ff2ebc68856a470b5a @@ -1189,6 +1271,7 @@ class Skill32(TravelerActiveSkill): """ name = '登跃飞锚' + ref = Ref.SCRAMBLEANCHOR cellPos = (2,12) learnLv = 60 masterLv = 40 @@ -1250,6 +1333,7 @@ class Skill33(TravelerActiveSkill): """ name = '神雾兵仗·妖旋风' + ref = Ref.SETUPRAGE cellPos = (8,13) learnLv = 70 masterLv = 40 @@ -1311,10 +1395,14 @@ class Skill33(TravelerActiveSkill): self.cd = 22.5 self.skillRation *= 0.5 - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '*skillRation', 'data': [0] + [-17] * self.maxLv, 'skills': ['绝技袭击']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-17] * self.maxLv, 'skills': ['绝技袭击']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-17] * maxLv)), skills=[Ref.ACROBATICRAID], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 流浪之星的纹章 # archer/traveler/8ee0099656df08a0b39225f8a21d514b @@ -1327,6 +1415,7 @@ class Skill34(PassiveSkill): """ name = '流浪之星的纹章' + ref = Ref.TRAVELINGSTAR cellPos = (4,13) learnLv = 75 masterLv = 40 @@ -1343,12 +1432,17 @@ class Skill34(PassiveSkill): # [神雾兵仗·流星]冷却时间减少率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - def effect(self, old, new): - if self.char.GetSkillByName('自动操作模式').lv > 0 and self.char.GetSkillByName('神雾兵仗·流星').vp != 2: - self.associate = [{'data': self.data0, 'type': '*skillDamage'}] - else: - self.associate = [{'data': self.data0, 'type': '*skillDamage'}, {'data': self.data1, 'type': '*cdReduce', 'skills': ['神雾兵仗·流星']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.char.GetSkillByName('自动操作模式').lv > 0 and self.char.GetSkillByName('神雾兵仗·流星').vp != 2: + # self.associate = [{'data': self.data0, 'type': '*skillDamage'}] + # else: + # self.associate = [{'data': self.data0, 'type': '*skillDamage'}, {'data': self.data1, 'type': '*cdReduce', 'skills': ['神雾兵仗·流星']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data1)), skills=[Ref.STARARROW], when=Not(All([GreaterThan(Read(SkillAttribute.LEVEL, Ref.AUTOMOVEMENT), 0), Not(Equals(Read(SkillAttribute.VP, Ref.STARARROW), 2))]))), + ] # 流雾疾风 # archer/traveler/da6e37c1e3f0e8867f70007d89c239ff @@ -1360,6 +1454,7 @@ class Skill35(TravelerActiveSkill): """ name = '流雾疾风' + ref = Ref.HAZESTORM cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1411,6 +1506,7 @@ class Skill36(PassiveSkill): """ name = '自动操作模式' + ref = Ref.AUTOMOVEMENT cellPos = (3,13) learnLv = 75 masterLv = 1 @@ -1435,6 +1531,7 @@ class Skill37(TravelerActiveSkill): """ name = '装载 : 烟花漫天' + ref = Ref.SETUPFIRE cellPos = (8,14) learnLv = 80 masterLv = 40 @@ -1486,10 +1583,14 @@ class Skill37(TravelerActiveSkill): - [装置驱动]爆炸时追加小型烟花漫天\n """ - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '*skillRation', 'data': [0] + [-26.6] * self.maxLv, 'skills': ['装置驱动']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-26.6] * self.maxLv, 'skills': ['装置驱动']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-26.6] * maxLv)), skills=[Ref.GEARDRIVE], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 神雾兵仗·北极星 # archer/traveler/a6c8f69107f8c4f5d1a0c7a57d000290 @@ -1504,6 +1605,7 @@ class Skill38(ActiveSkill): """ name = '神雾兵仗·北极星' + ref = Ref.POLARIS cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1549,6 +1651,7 @@ class Skill39(TravelerActiveSkill): """ name = '星辰装置' + ref = Ref.GEAROFSTELLA cellPos = (4,15) learnLv = 95 masterLv = 40 @@ -1567,7 +1670,11 @@ class Skill39(TravelerActiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data2, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data2, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # 装置驱动 : 星云 # archer/traveler/03bb5314ffd41e9458d67ef924fef38f @@ -1581,6 +1688,7 @@ class Skill40(ActiveSkill): """ name = '装置驱动 : 星云' + ref = Ref.NEBULA cellPos = (6,15) learnLv = 95 masterLv = 40 @@ -1621,6 +1729,7 @@ class Skill41(ActiveSkill): """ name = '神雾星仗·人马座星云' + ref = Ref.SAGITTARIUS cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/archer/vigilante.py b/backend/core/character/GF/archer/vigilante.py index ec4974de..63a021b3 100644 --- a/backend/core/character/GF/archer/vigilante.py +++ b/backend/core/character/GF/archer/vigilante.py @@ -1,6 +1,13 @@ # b9cb48777665de22c006fabaf9a560b3 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.archer.vigilante import VigilanteSkillRef as Ref prefix = "archer/vigilante/cn/skillDetail" @@ -16,6 +23,7 @@ class Skill0(ActiveSkill): """ name = '凌跃一击' + ref = Ref.CRACKARROW cellPos = (3,1) learnLv = 1 masterLv = 10 @@ -72,6 +80,7 @@ class Skill1(PassiveSkill): """ name = '超越两界' + ref = Ref.ONBOUNDARYLINE cellPos = (1,1) learnLv = 1 masterLv = 1 @@ -96,6 +105,7 @@ class Skill2(ActiveSkill): """ name = '妖兽化' + ref = Ref.CHANGELING cellPos = (5,1) learnLv = 1 masterLv = 1 @@ -121,6 +131,7 @@ class Skill3(ActiveSkill): """ name = '妖痕抓击' + ref = Ref.CLAWTATTOO cellPos = (4,1) learnLv = 1 masterLv = 60 @@ -150,6 +161,7 @@ class Skill4(ActiveSkill): """ name = '后跳' + ref = Ref.BACKSTEP cellPos = (3,0) learnLv = 1 masterLv = 1 @@ -173,6 +185,7 @@ class Skill5(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -192,7 +205,11 @@ class Skill5(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['妖爪']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['妖爪']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.MONSTERCLAW]), + ] # 受身蹲伏 # archer/vigilante/ce26c6b69d02a440a81b552bec94f03b @@ -203,6 +220,7 @@ class Skill6(ActiveSkill): """ name = '受身蹲伏' + ref = Ref.QUICKSTANDING cellPos = (2,0) learnLv = 1 masterLv = 1 @@ -243,6 +261,7 @@ class Skill7(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -266,6 +285,7 @@ class Skill8(PassiveSkill): """ name = '防具精通' + ref = Ref.ARMORMASTERYETC cellPos = (0,1) learnLv = 1 masterLv = 1 @@ -289,6 +309,7 @@ class Skill9(ActiveSkill): """ name = '全力挥击' + ref = Ref.FULLSWING cellPos = (3,2) learnLv = 5 masterLv = 60 @@ -324,6 +345,7 @@ class Skill10(ActiveSkill): """ name = '切割之影' + ref = Ref.CUTTINGSHADOW cellPos = (7,2) learnLv = 5 masterLv = 60 @@ -363,6 +385,7 @@ class Skill11(ActiveSkill): """ name = '翻月翔击' + ref = Ref.RISINGMOON cellPos = (2,3) learnLv = 10 masterLv = 60 @@ -393,6 +416,7 @@ class Skill12(ActiveSkill): """ name = '见面礼' + ref = Ref.HARSHHELLO cellPos = (3,3) learnLv = 10 masterLv = 60 @@ -427,6 +451,7 @@ class Skill13(ActiveSkill): """ name = '拒绝屏障' + ref = Ref.REJECTION cellPos = (6,3) learnLv = 10 masterLv = 5 @@ -457,6 +482,7 @@ class Skill14(PassiveSkill): """ name = '强化 - 后跳' + ref = Ref.ESCAPEBACKSTEP cellPos = (4,0) learnLv = 10 masterLv = 1 @@ -484,6 +510,7 @@ class Skill15(ActiveSkill): """ name = '跃翔' + ref = Ref.JUMPPOWERUP cellPos = (6,0) learnLv = 10 masterLv = 1 @@ -513,6 +540,7 @@ class Skill16(ActiveSkill): """ name = '妖爪' + ref = Ref.MONSTERCLAW cellPos = (5,4) learnLv = 15 masterLv = 1 @@ -561,6 +589,7 @@ class Skill17(ActiveSkill): """ name = '捕猎箭' + ref = Ref.RELATIVEKILLER cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -599,6 +628,7 @@ class Skill18(ActiveSkill): """ name = '苦痛送行' + ref = Ref.PAINBRINGER cellPos = (7,5) learnLv = 20 masterLv = 60 @@ -635,6 +665,7 @@ class Skill19(PassiveSkill): """ name = '特殊体质' + ref = Ref.UNIQUEBODY cellPos = (1,5) learnLv = 20 masterLv = 10 @@ -653,7 +684,11 @@ class Skill19(PassiveSkill): # 妖兽形物理/魔法防御力增加 : {value2} data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 暴击 # archer/vigilante/fc1262c19f3d0477ee8eda47b8db8696 @@ -664,6 +699,7 @@ class Skill20(PassiveSkill): """ name = '暴击' + ref = Ref.PHYSICALCRITICALHITUP cellPos = (5,0) learnLv = 20 masterLv = 10 @@ -688,6 +724,7 @@ class Skill21(ActiveSkill): """ name = '威慑低吼' + ref = Ref.HISS cellPos = (5,6) learnLv = 25 masterLv = 10 @@ -716,6 +753,7 @@ class Skill22(ActiveSkill): """ name = '破颜击' + ref = Ref.SLASHFACE cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -753,6 +791,7 @@ class Skill23(ActiveSkill): """ name = '妖刺结阵' + ref = Ref.NECKPUNCHER cellPos = (6,6) learnLv = 25 masterLv = 60 @@ -793,6 +832,7 @@ class Skill24(ActiveSkill): """ name = '利爪锋芒' + ref = Ref.TAKEOUTCLAW cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -826,6 +866,7 @@ class Skill25(ActiveSkill): """ name = '巡猎终结' + ref = Ref.CHECKDEATH cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -863,6 +904,7 @@ class Skill26(ActiveSkill): """ name = '御蛇' + ref = Ref.CHASINGSNAKE cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -925,6 +967,7 @@ class Skill27(ActiveSkill): """ name = '幻妖之噬' + ref = Ref.DEVOURER cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -997,6 +1040,7 @@ class Skill28(PassiveSkill): """ name = '野性愈烈' + ref = Ref.GIVENWILD cellPos = (1,8) learnLv = 35 masterLv = 10 @@ -1015,7 +1059,11 @@ class Skill28(PassiveSkill): # 命中率增加 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 狂妖风暴 # archer/vigilante/8e358ecf99ac9df31a6132aeafe378a9 @@ -1029,6 +1077,7 @@ class Skill29(ActiveSkill): """ name = '狂妖风暴' + ref = Ref.MONSTERWIND cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -1098,6 +1147,7 @@ class Skill30(ActiveSkill): """ name = '凶兽噬咬' + ref = Ref.CRUELSLAUGHTER cellPos = (7,10) learnLv = 45 masterLv = 60 @@ -1173,6 +1223,7 @@ class Skill31(PassiveSkill): """ name = '野息狂放' + ref = Ref.DESIREBREATH cellPos = (1,11) learnLv = 48 masterLv = 40 @@ -1191,7 +1242,11 @@ class Skill31(PassiveSkill): # [鲜活宴场]生命值恢复量增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 鲜活宴场 # archer/vigilante/0e409ac3e1c1f3976b3ef2bfe4c13069 @@ -1202,6 +1257,7 @@ class Skill32(ActiveSkill): """ name = '鲜活宴场' + ref = Ref.PARTYOFSACRIFICE cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1237,6 +1293,7 @@ class Skill33(ActiveSkill): """ name = '妖蛇暴雨' + ref = Ref.NOISYMONSTER cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1297,6 +1354,7 @@ class Skill34(ActiveSkill): """ name = '盛怒狂潮' + ref = Ref.RAMPAGE cellPos = (7,13) learnLv = 70 masterLv = 40 @@ -1366,6 +1424,7 @@ class Skill35(PassiveSkill): """ name = '妖人合一' + ref = Ref.SELFAGREEMENT cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1380,7 +1439,11 @@ class Skill35(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 卸骨 # archer/vigilante/527cdc3ecca985e18ef819d456532b26 @@ -1393,6 +1456,7 @@ class Skill36(ActiveSkill): """ name = '卸骨' + ref = Ref.DEBONING cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1457,6 +1521,7 @@ class Skill37(ActiveSkill): """ name = '妖芒之茧' + ref = Ref.PEACEPIERCER cellPos = (6,14) learnLv = 80 masterLv = 40 @@ -1520,6 +1585,7 @@ class Skill38(ActiveSkill): """ name = '妖潮狂袭' + ref = Ref.OUTBUST cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1567,6 +1633,7 @@ class Skill39(PassiveSkill): """ name = '万物巅峰' + ref = Ref.PINNACLEOFALLTHINGS cellPos = (1,15) learnLv = 95 masterLv = 40 @@ -1581,7 +1648,11 @@ class Skill39(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 神妖之爪 # archer/vigilante/dd32a9825ec1af42a91f2223be6658e5 @@ -1598,6 +1669,7 @@ class Skill40(ActiveSkill): """ name = '神妖之爪' + ref = Ref.GODMONSTERCLAW cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1670,6 +1742,7 @@ class Skill41(ActiveSkill): """ name = '极夜·妖刃千散' + ref = Ref.ETERNALNIGHT cellPos = (5,16) learnLv = 100 masterLv = 30 diff --git a/backend/core/character/GF/demonic_lancer/dragoon.py b/backend/core/character/GF/demonic_lancer/dragoon.py index ff1048dd..4dbb445d 100644 --- a/backend/core/character/GF/demonic_lancer/dragoon.py +++ b/backend/core/character/GF/demonic_lancer/dragoon.py @@ -1,6 +1,18 @@ # 3deb7be5f01953ac8b1ecaa1e25e0420 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Equals, + LevelTable, + Operation, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.demonic_lancer.dragoon import DragoonSkillRef as Ref prefix = "demonic_lancer/dragoon/cn/skillDetail" @@ -15,6 +27,7 @@ class Skill0(ActiveSkill): """ name = '刺击' + ref = Ref.QUICKPUNTO cellPos = (2,1) learnLv = 1 masterLv = 60 @@ -54,6 +67,7 @@ class Skill1(ActiveSkill): """ name = '枪挑' + ref = Ref.HELMSHOT cellPos = (8,1) learnLv = 1 masterLv = 10 @@ -80,6 +94,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -104,6 +119,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -123,7 +139,11 @@ class Skill3(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['猎杀枪']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['猎杀枪']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.SERVERNTLANCE]), + ] # 受身蹲伏 # demonic_lancer/dragoon/ce26c6b69d02a440a81b552bec94f03b @@ -133,6 +153,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -174,6 +195,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -196,6 +218,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -221,6 +244,7 @@ class Skill7(ActiveSkill): """ name = '回旋钩' + ref = Ref.HOOKANDTHROW cellPos = (9,2) learnLv = 5 masterLv = 60 @@ -261,6 +285,7 @@ class Skill8(ActiveSkill): """ name = '格挡反击' + ref = Ref.INDURE cellPos = (8,3) learnLv = 10 masterLv = 5 @@ -289,6 +314,7 @@ class Skill9(ActiveSkill): """ name = '落凤枪' + ref = Ref.PARATROOPER cellPos = (3,3) learnLv = 10 masterLv = 60 @@ -321,6 +347,7 @@ class Skill10(ActiveSkill): """ name = '横扫' + ref = Ref.SIDESLASH cellPos = (0,3) learnLv = 10 masterLv = 60 @@ -348,6 +375,7 @@ class Skill11(ActiveSkill): """ name = '魔枪发射' + ref = Ref.PARTISANSHOOT cellPos = (5,3) learnLv = 10 masterLv = 60 @@ -378,6 +406,7 @@ class Skill12(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -405,6 +434,7 @@ class Skill13(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -431,6 +461,7 @@ class Skill14(ActiveSkill): """ name = '连环枪' + ref = Ref.SURROUNDBREAK cellPos = (1,4) learnLv = 15 masterLv = 60 @@ -469,6 +500,7 @@ class Skill15(ActiveSkill): """ name = '扫堂枪' + ref = Ref.DEMONICANKLECUT cellPos = (0,4) learnLv = 15 masterLv = 60 @@ -495,6 +527,7 @@ class Skill16(PassiveSkill): """ name = '狩猎技艺' + ref = Ref.HUNTERSMOVESET cellPos = (5,4) learnLv = 15 masterLv = 1 @@ -516,6 +549,7 @@ class Skill17(PassiveSkill): """ name = '光枪精通' + ref = Ref.PARTISANMASTERY cellPos = (9,4) learnLv = 15 masterLv = 10 @@ -535,8 +569,12 @@ class Skill17(PassiveSkill): # 攻击速度增加 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkM', 'data': data0}, + # ] associate = [ - {'type': '$*PAtkM', 'data': data0}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable(data0))), ] # 猎杀枪 @@ -553,6 +591,7 @@ class Skill18(ActiveSkill): """ name = '猎杀枪' + ref = Ref.SERVERNTLANCE cellPos = (7,4) learnLv = 15 masterLv = 1 @@ -594,6 +633,7 @@ class Skill19(ActiveSkill): """ name = '隐鼠之袭' + ref = Ref.MOLEHUNT cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -625,6 +665,7 @@ class Skill20(ActiveSkill): """ name = '光焰飞枪' + ref = Ref.NEEDLER cellPos = (4,5) learnLv = 20 masterLv = 60 @@ -656,6 +697,7 @@ class Skill21(PassiveSkill): """ name = '狩猎本能' + ref = Ref.ENCHANTPARTISAN cellPos = (8,5) learnLv = 20 masterLv = 10 @@ -672,7 +714,11 @@ class Skill21(PassiveSkill): # 命中率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 暴击 # demonic_lancer/dragoon/fc1262c19f3d0477ee8eda47b8db8696 @@ -682,6 +728,7 @@ class Skill22(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -705,6 +752,7 @@ class Skill23(ActiveSkill): """ name = '能量萃取' + ref = Ref.MANAEXTRACT cellPos = (6,6) learnLv = 25 masterLv = 10 @@ -738,6 +786,7 @@ class Skill24(ActiveSkill): """ name = '猎杀枪 : 掠食' + ref = Ref.SERVERNTLANCEASSULT cellPos = (7,6) learnLv = 25 masterLv = 60 @@ -786,6 +835,7 @@ class Skill25(ActiveSkill): """ name = '蛮横冲撞' + ref = Ref.BUFFALOFALL cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -825,6 +875,7 @@ class Skill26(ActiveSkill): """ name = '光焰枪' + ref = Ref.STRINGWING cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -859,6 +910,7 @@ class Skill27(ActiveSkill): """ name = '猎杀枪 : 穿心' + ref = Ref.DRILLINGNECK cellPos = (7,7) learnLv = 30 masterLv = 60 @@ -893,6 +945,7 @@ class Skill28(ActiveSkill): """ name = '利刃收割' + ref = Ref.BURNLOCUST cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -969,6 +1022,7 @@ class Skill29(ActiveSkill): """ name = '光焰囚杀' + ref = Ref.LAMBFENCE cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -1023,6 +1077,7 @@ class Skill30(ActiveSkill): """ name = '鹰坠' + ref = Ref.PENETRATEHEAD cellPos = (2,9) learnLv = 40 masterLv = 60 @@ -1084,6 +1139,7 @@ class Skill31(ActiveSkill): """ name = '龙鳞碎割' + ref = Ref.SCALEGRINDER cellPos = (4,10) learnLv = 45 masterLv = 60 @@ -1143,6 +1199,7 @@ class Skill32(PassiveSkill): """ name = '枪魂感知' + ref = Ref.AFTERSENSATION cellPos = (3,11) learnLv = 48 masterLv = 40 @@ -1159,7 +1216,12 @@ class Skill32(PassiveSkill): # 技能攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': [-i for i in data0], 'type': '+cd', 'skills': ['猎杀枪'], 'ratio': 1}, {'data': data1, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': [-i for i in data0], 'type': '+cd', 'skills': ['猎杀枪'], 'ratio': 1}, {'data': data1, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD, operation=Operation.ADD, value=LevelTable([-i for i in data0]), skills=[Ref.SERVERNTLANCE]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 逐云灭龙杀 # demonic_lancer/dragoon/4f2e001e9a19eb7bae50ad1840dfb329 @@ -1172,6 +1234,7 @@ class Skill33(ActiveSkill): """ name = '逐云灭龙杀' + ref = Ref.DRAGONSLAYER cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1213,6 +1276,7 @@ class Skill34(ActiveSkill): """ name = '天龙破' + ref = Ref.PARTISANSKEWER cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1258,10 +1322,14 @@ class Skill34(ActiveSkill): - 掠食攻击力 : 基础攻击力的74%\n """ - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '*skillRation', 'data': [0] + [-26] * self.maxLv, 'skills': ['猎杀枪 : 穿心', '猎杀枪 : 掠食']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-26] * self.maxLv, 'skills': ['猎杀枪 : 穿心', '猎杀枪 : 掠食']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-26] * maxLv)), skills=[Ref.DRILLINGNECK, Ref.SERVERNTLANCEASSULT], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 地龙狩 # demonic_lancer/dragoon/8572675ec6a1f50b6eff6a867376c2de @@ -1274,6 +1342,7 @@ class Skill35(ActiveSkill): """ name = '地龙狩' + ref = Ref.EARTHWORMHUNT cellPos = (2,13) learnLv = 70 masterLv = 40 @@ -1316,10 +1385,14 @@ class Skill35(ActiveSkill): 突进过程中所受伤害 -75%\n """ - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '*skillRation', 'data': [0] + [-23] * self.maxLv, 'skills': ['光焰枪']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-23] * self.maxLv, 'skills': ['光焰枪']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-23] * maxLv)), skills=[Ref.STRINGWING], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 狩猎之心 # demonic_lancer/dragoon/2a0a39184de92acf1c1375e00b77404c @@ -1331,6 +1404,7 @@ class Skill36(PassiveSkill): """ name = '狩猎之心' + ref = Ref.FORCEOFSOURCE cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1349,7 +1423,11 @@ class Skill36(PassiveSkill): # 命中率增加 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 凌空之狩 # demonic_lancer/dragoon/9dc8438e4572d39243c97da31c113acc @@ -1363,6 +1441,7 @@ class Skill37(ActiveSkill): """ name = '凌空之狩' + ref = Ref.AVENHUNTING cellPos = (4,13) learnLv = 75 masterLv = 40 @@ -1404,10 +1483,14 @@ class Skill37(ActiveSkill): self.cd = 20 self.skillRation *= 0.5 - def effect(self, old, new): - if self.vp == 1: - self.associate = [{'type': '*skillRation', 'data': [0] + [-27] * self.maxLv, 'skills': ['利刃收割']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 1: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-27] * self.maxLv, 'skills': ['利刃收割']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-27] * maxLv)), skills=[Ref.BURNLOCUST], when=Equals(Read(SkillAttribute.VP), 1)), + ] # 无尽毁灭 # demonic_lancer/dragoon/3fb8395ae3b81bd608e0c4223a8eb534 @@ -1420,6 +1503,7 @@ class Skill38(ActiveSkill): """ name = '无尽毁灭' + ref = Ref.GRINDERJET cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1481,6 +1565,7 @@ class Skill39(ActiveSkill): """ name = '绝命猎杀 : 死亡穿刺' + ref = Ref.DEATHCHARGE cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1519,6 +1604,7 @@ class Skill40(PassiveSkill): """ name = '狩魔之魂' + ref = Ref.KERAVNOS cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1534,7 +1620,11 @@ class Skill40(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # [蛮横冲撞]按向前方向键时前进距离额外增加 : 30% - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # [蛮横冲撞]按向前方向键时前进距离额外增加 : 30% # 瞬光猎杀枪 @@ -1546,6 +1636,7 @@ class Skill41(ActiveSkill): """ name = '瞬光猎杀枪' + ref = Ref.INSIDIOUSPIKE cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1583,6 +1674,7 @@ class Skill42(ActiveSkill): """ name = '红月·狂狩盛宴' + ref = Ref.HUNTINGOFREDMOON cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/demonic_lancer/impaler.py b/backend/core/character/GF/demonic_lancer/impaler.py index 75ad7dde..0eab7559 100644 --- a/backend/core/character/GF/demonic_lancer/impaler.py +++ b/backend/core/character/GF/demonic_lancer/impaler.py @@ -1,6 +1,16 @@ # 3deb7be5f01953ac8b1ecaa1e25e0420 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + Power, + SkillAttribute, + SkillEffect, +) +from core.character.refs.demonic_lancer.impaler import ImpalerSkillRef as Ref prefix = "demonic_lancer/impaler/cn/skillDetail" @@ -14,6 +24,7 @@ class Skill0(ActiveSkill): 近距离攻击和枪头攻击不会同时命中敌人,相应的判定重叠时,优先判定为枪头攻击。\n """ name = "刺击" + ref = Ref.QUICKPUNTO learnLv = 1 masterLv = 60 maxLv = 70 @@ -42,6 +53,7 @@ class Skill1(ActiveSkill): 从下往上挑击,使敌人浮空。\n """ name = "枪挑" + ref = Ref.HELMSHOT learnLv = 1 masterLv = 10 maxLv = 20 @@ -68,6 +80,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -92,6 +105,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -119,6 +133,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -160,6 +175,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -182,6 +198,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -206,6 +223,7 @@ class Skill7(ActiveSkill): 对无法抓取的敌人不适用控制效果。\n """ name = "回旋钩" + ref = Ref.HOOKANDTHROW learnLv = 5 masterLv = 60 maxLv = 70 @@ -237,6 +255,7 @@ class Skill8(ActiveSkill): 被推开一定距离后,按下X键可以进行反击。\n """ name = "格挡反击" + ref = Ref.INDURE learnLv = 10 masterLv = 5 maxLv = 10 @@ -263,6 +282,7 @@ class Skill9(ActiveSkill): 从空中快速地斜向落地,刺向敌人。\n """ name = "落凤枪" + ref = Ref.PARATROOPER learnLv = 10 masterLv = 60 maxLv = 70 @@ -292,6 +312,7 @@ class Skill10(ActiveSkill): 向前方快速横斩,击飞敌人。\n """ name = "横扫" + ref = Ref.SIDESLASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -318,6 +339,7 @@ class Skill11(ActiveSkill): """ name = '魔枪发射' + ref = Ref.PARTISANSHOOT cellPos = (5,3) learnLv = 10 masterLv = 60 @@ -348,6 +370,7 @@ class Skill12(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -375,6 +398,7 @@ class Skill13(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -400,6 +424,7 @@ class Skill14(ActiveSkill): 使用长枪进行连续攻击。 命中敌人时按下技能键,即刻发动下一次攻击。\n """ name = "连环枪" + ref = Ref.SURROUNDBREAK learnLv = 15 masterLv = 60 maxLv = 70 @@ -433,6 +458,7 @@ class Skill15(ActiveSkill): 攻击敌人足部,使之倒地。\n """ name = "扫堂枪" + ref = Ref.DEMONICANKLECUT learnLv = 15 masterLv = 60 maxLv = 70 @@ -464,6 +490,7 @@ class Skill16(PassiveSkill): """ name = '暗蚀' + ref = Ref.ENCROACH cellPos = (7,4) learnLv = 15 masterLv = 10 @@ -491,32 +518,60 @@ class Skill16(PassiveSkill): # 减速状态下敌人攻击速度和移动速度减少率 : {value6}% data6 = get_data(f'{prefix}/{uuid}', 6) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data0, 'type': '*skillDamage'}, + # {'data': data1, 'type': '*power0', 'skills': ['双重投射']}, + # {'data': data1, 'type': '*power0', 'skills': ['暗矛投射']}, + # {'data': data1, 'type': '*power0', 'skills': ['绝望枪']}, + # {'data': data1, 'type': '*power0', 'skills': ['连锁侵蚀']}, + # {'data': data1, 'type': '*power1', 'skills': ['连锁侵蚀']}, + # {'data': data1, 'type': '*power0', 'skills': ['暗蚀螺旋枪']}, + # {'data': data1, 'type': '*power2', 'skills': ['暗蚀螺旋枪']}, + # {'data': data1, 'type': '*power0', 'skills': ['坠蚀之雨']}, + # {'data': data1, 'type': '*power0', 'skills': ['暗蚀爆雷杀']}, + # {'data': data1, 'type': '*power1', 'skills': ['暗蚀爆雷杀']}, + # {'data': data1, 'type': '*power2', 'skills': ['暗蚀爆雷杀']}, + # {'data': data1, 'type': '*power2', 'skills': ['无尽侵蚀 : 缚魂']}, + # {'data': data1, 'type': '*power0', 'skills': ['黑蚀酷刑']}, + # {'data': data1, 'type': '*power1', 'skills': ['黑蚀酷刑']}, + # {'data': data1, 'type': '*power3', 'skills': ['黑蚀酷刑']}, + # {'data': data1, 'type': '*power0', 'skills': ['冥夜裂空']}, + # {'data': data1, 'type': '*power0', 'skills': ['冥蚀脉冲']}, + # {'data': data1, 'type': '*power1', 'skills': ['冥蚀脉冲']}, + # {'data': data1, 'type': '*power3', 'skills': ['冥蚀脉冲']}, + # {'data': data1, 'type': '*power1', 'skills': ['幽影暗蚀 : 寂灭']}, + # {'data': data1, 'type': '*power0', 'skills': ['虚空碎灭']}, + # {'data': data1, 'type': '*power1', 'skills': ['虚空碎灭']}, + # {'data': data1, 'type': '*power3', 'skills': ['虚空碎灭']}, + # {'data': data1, 'type': '*power2', 'skills': ['暗·渊灭禁绝']}, + # ] associate = [ - {'data': data0, 'type': '*skillDamage'}, - {'data': data1, 'type': '*power0', 'skills': ['双重投射']}, - {'data': data1, 'type': '*power0', 'skills': ['暗矛投射']}, - {'data': data1, 'type': '*power0', 'skills': ['绝望枪']}, - {'data': data1, 'type': '*power0', 'skills': ['连锁侵蚀']}, - {'data': data1, 'type': '*power1', 'skills': ['连锁侵蚀']}, - {'data': data1, 'type': '*power0', 'skills': ['暗蚀螺旋枪']}, - {'data': data1, 'type': '*power2', 'skills': ['暗蚀螺旋枪']}, - {'data': data1, 'type': '*power0', 'skills': ['坠蚀之雨']}, - {'data': data1, 'type': '*power0', 'skills': ['暗蚀爆雷杀']}, - {'data': data1, 'type': '*power1', 'skills': ['暗蚀爆雷杀']}, - {'data': data1, 'type': '*power2', 'skills': ['暗蚀爆雷杀']}, - {'data': data1, 'type': '*power2', 'skills': ['无尽侵蚀 : 缚魂']}, - {'data': data1, 'type': '*power0', 'skills': ['黑蚀酷刑']}, - {'data': data1, 'type': '*power1', 'skills': ['黑蚀酷刑']}, - {'data': data1, 'type': '*power3', 'skills': ['黑蚀酷刑']}, - {'data': data1, 'type': '*power0', 'skills': ['冥夜裂空']}, - {'data': data1, 'type': '*power0', 'skills': ['冥蚀脉冲']}, - {'data': data1, 'type': '*power1', 'skills': ['冥蚀脉冲']}, - {'data': data1, 'type': '*power3', 'skills': ['冥蚀脉冲']}, - {'data': data1, 'type': '*power1', 'skills': ['幽影暗蚀 : 寂灭']}, - {'data': data1, 'type': '*power0', 'skills': ['虚空碎灭']}, - {'data': data1, 'type': '*power1', 'skills': ['虚空碎灭']}, - {'data': data1, 'type': '*power3', 'skills': ['虚空碎灭']}, - {'data': data1, 'type': '*power2', 'skills': ['暗·渊灭禁绝']}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data1)), skills=[Ref.DOUBLETHROW]), + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data1)), skills=[Ref.HELIXSPEAR]), + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data1)), skills=[Ref.DEATHSPEAR]), + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data1)), skills=[Ref.DIFFUSION]), + SkillEffect(attribute=Power(1), value=1 + Percent(LevelTable(data1)), skills=[Ref.DIFFUSION]), + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data1)), skills=[Ref.SPIRALRUSH]), + SkillEffect(attribute=Power(2), value=1 + Percent(LevelTable(data1)), skills=[Ref.SPIRALRUSH]), + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data1)), skills=[Ref.DARKSTAR]), + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data1)), skills=[Ref.DARKEXPLOSIONOFMEAT]), + SkillEffect(attribute=Power(1), value=1 + Percent(LevelTable(data1)), skills=[Ref.DARKEXPLOSIONOFMEAT]), + SkillEffect(attribute=Power(2), value=1 + Percent(LevelTable(data1)), skills=[Ref.DARKEXPLOSIONOFMEAT]), + SkillEffect(attribute=Power(2), value=1 + Percent(LevelTable(data1)), skills=[Ref.DARKSPEARSUCCESSIVETHROWING]), + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data1)), skills=[Ref.VIOLENTPIERCE]), + SkillEffect(attribute=Power(1), value=1 + Percent(LevelTable(data1)), skills=[Ref.VIOLENTPIERCE]), + SkillEffect(attribute=Power(3), value=1 + Percent(LevelTable(data1)), skills=[Ref.VIOLENTPIERCE]), + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data1)), skills=[Ref.FALLINGDEATH]), + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data1)), skills=[Ref.DARKIMPULSE]), + SkillEffect(attribute=Power(1), value=1 + Percent(LevelTable(data1)), skills=[Ref.DARKIMPULSE]), + SkillEffect(attribute=Power(3), value=1 + Percent(LevelTable(data1)), skills=[Ref.DARKIMPULSE]), + SkillEffect(attribute=Power(1), value=1 + Percent(LevelTable(data1)), skills=[Ref.DESTROYLIGHT]), + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data1)), skills=[Ref.ABYSSALINVANDER]), + SkillEffect(attribute=Power(1), value=1 + Percent(LevelTable(data1)), skills=[Ref.ABYSSALINVANDER]), + SkillEffect(attribute=Power(3), value=1 + Percent(LevelTable(data1)), skills=[Ref.ABYSSALINVANDER]), + SkillEffect(attribute=Power(2), value=1 + Percent(LevelTable(data1)), skills=[Ref.DARKDESTROYOFSPEAR]), ] # 帝国枪术 @@ -536,6 +591,7 @@ class Skill17(PassiveSkill): """ name = '帝国枪术' + ref = Ref.SPEARMANSHIP cellPos = (8,4) learnLv = 15 masterLv = 1 @@ -563,6 +619,7 @@ class Skill18(ActiveSkill): """ name = '双重投射' + ref = Ref.DOUBLETHROW cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -602,6 +659,7 @@ class Skill19(ActiveSkill): """ name = '侵蚀之矛' + ref = Ref.DARKAMBITION cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -638,6 +696,7 @@ class Skill20(ActiveSkill): """ name = '暗矛投射' + ref = Ref.HELIXSPEAR cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -671,6 +730,7 @@ class Skill21(PassiveSkill): """ name = '暗矛精通' + ref = Ref.DARKJAVELINMASTERY cellPos = (7,5) learnLv = 20 masterLv = 20 @@ -688,8 +748,12 @@ class Skill21(PassiveSkill): # 命中增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkM', 'data': data0}, + # ] associate = [ - {'type': '$*PAtkM', 'data': data0}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable(data0))), ] # 暴击 @@ -701,6 +765,7 @@ class Skill22(PassiveSkill): """ name = '暴击' + ref = Ref.PHYSICALCRITICALHITUP cellPos = (5,0) learnLv = 20 masterLv = 10 @@ -724,6 +789,7 @@ class Skill23(ActiveSkill): """ name = '黑暗化身' + ref = Ref.DARKNESS cellPos = (8,6) learnLv = 25 masterLv = 10 @@ -760,6 +826,7 @@ class Skill24(ActiveSkill): """ name = '暗矛贯穿' + ref = Ref.PIERCINGDRIVE cellPos = (6,6) learnLv = 25 masterLv = 60 @@ -800,6 +867,7 @@ class Skill25(ActiveSkill): """ name = '黑暗枪雨' + ref = Ref.DESPAIR cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -836,6 +904,7 @@ class Skill26(ActiveSkill): """ name = '黑蚀葬礼' + ref = Ref.DARKBURIAL cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -875,6 +944,7 @@ class Skill27(ActiveSkill): """ name = '绝望枪' + ref = Ref.DEATHSPEAR cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -907,6 +977,7 @@ class Skill28(PassiveSkill): """ name = '暗枪突破' + ref = Ref.DEMONICLANCERECKLESS cellPos = (1,7) learnLv = 30 masterLv = 1 @@ -921,7 +992,11 @@ class Skill28(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 连锁侵蚀 # demonic_lancer/impaler/2c9d9a36c8401bddff6cdb80fab8dc24 @@ -942,6 +1017,7 @@ class Skill29(ActiveSkill): """ name = '连锁侵蚀' + ref = Ref.DIFFUSION cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1013,6 +1089,7 @@ class Skill30(ActiveSkill): """ name = '暗蚀螺旋枪' + ref = Ref.SPIRALRUSH cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -1076,6 +1153,7 @@ class Skill31(ActiveSkill): """ name = '坠蚀之雨' + ref = Ref.DARKSTAR cellPos = (4,9) learnLv = 40 masterLv = 60 @@ -1140,6 +1218,7 @@ class Skill32(ActiveSkill): """ name = '暗蚀爆雷杀' + ref = Ref.DARKEXPLOSIONOFMEAT cellPos = (6,10) learnLv = 45 masterLv = 60 @@ -1202,6 +1281,7 @@ class Skill33(PassiveSkill): """ name = '黑暗支配者' + ref = Ref.RULEROFDARKNESS cellPos = (4,11) learnLv = 48 masterLv = 40 @@ -1218,7 +1298,11 @@ class Skill33(PassiveSkill): # 暗蚀持续时间增加 : {value1}秒 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 无尽侵蚀 : 缚魂 # demonic_lancer/impaler/e0daa922b19cdc35de879e938361464e @@ -1232,6 +1316,7 @@ class Skill34(ActiveSkill): """ name = '无尽侵蚀 : 缚魂' + ref = Ref.DARKSPEARSUCCESSIVETHROWING cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1269,6 +1354,7 @@ class Skill35(ActiveSkill): """ name = '暗影蚀魂' + ref = Ref.DARKDIVISION cellPos = (2,12) learnLv = 60 masterLv = 40 @@ -1336,6 +1422,7 @@ class Skill36(ActiveSkill): """ name = '黑蚀酷刑' + ref = Ref.VIOLENTPIERCE cellPos = (7,13) learnLv = 70 masterLv = 40 @@ -1409,6 +1496,7 @@ class Skill37(PassiveSkill): """ name = '黑暗本源' + ref = Ref.DARKNESSONTHEABYSS cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1431,7 +1519,11 @@ class Skill37(PassiveSkill): # 暗蚀领域持续时间 : {value4}秒 data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 冥夜裂空 # demonic_lancer/impaler/7ec521d063d2190e1fcc5bd229af9bcf @@ -1449,6 +1541,7 @@ class Skill38(ActiveSkill): """ name = '冥夜裂空' + ref = Ref.FALLINGDEATH cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1513,6 +1606,7 @@ class Skill39(ActiveSkill): """ name = '冥蚀脉冲' + ref = Ref.DARKIMPULSE cellPos = (4,14) learnLv = 80 masterLv = 40 @@ -1586,6 +1680,7 @@ class Skill40(ActiveSkill): """ name = '幽影暗蚀 : 寂灭' + ref = Ref.DESTROYLIGHT cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -1625,6 +1720,7 @@ class Skill41(PassiveSkill): """ name = '暗源之蚀' + ref = Ref.SKULKINGDARKNESS cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1642,7 +1738,11 @@ class Skill41(PassiveSkill): # 总投掷次数 : 15次 # 绝望枪攻击力 : 原有[绝望枪]投掷魔枪攻击力的60% - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # [绝望枪] # 总投掷次数 : 15次 # 绝望枪攻击力 : 原有[绝望枪]投掷魔枪攻击力的60% @@ -1660,6 +1760,7 @@ class Skill42(ActiveSkill): """ name = '虚空碎灭' + ref = Ref.ABYSSALINVANDER cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1708,6 +1809,7 @@ class Skill43(ActiveSkill): """ name = '暗·渊灭禁绝' + ref = Ref.DARKDESTROYOFSPEAR cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/demonic_lancer/skirmisher.py b/backend/core/character/GF/demonic_lancer/skirmisher.py index 16fafd6e..77eabdba 100644 --- a/backend/core/character/GF/demonic_lancer/skirmisher.py +++ b/backend/core/character/GF/demonic_lancer/skirmisher.py @@ -1,6 +1,15 @@ # 3deb7be5f01953ac8b1ecaa1e25e0420 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.demonic_lancer.skirmisher import SkirmisherSkillRef as Ref prefix = "demonic_lancer/skirmisher/cn/skillDetail" @@ -15,6 +24,7 @@ class Skill0(ActiveSkill): """ name = '刺击' + ref = Ref.QUICKPUNTO cellPos = (3,1) learnLv = 1 masterLv = 60 @@ -54,6 +64,7 @@ class Skill1(ActiveSkill): """ name = '枪挑' + ref = Ref.HELMSHOT cellPos = (5,1) learnLv = 1 masterLv = 10 @@ -80,6 +91,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -104,6 +116,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -131,6 +144,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -172,6 +186,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -194,6 +209,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -219,6 +235,7 @@ class Skill7(ActiveSkill): """ name = '回旋钩' + ref = Ref.HOOKANDTHROW cellPos = (4,2) learnLv = 5 masterLv = 60 @@ -260,6 +277,7 @@ class Skill8(ActiveSkill): """ name = '格挡反击' + ref = Ref.INDURE cellPos = (2,3) learnLv = 10 masterLv = 5 @@ -288,6 +306,7 @@ class Skill9(ActiveSkill): """ name = '落凤枪' + ref = Ref.PARATROOPER cellPos = (7,3) learnLv = 10 masterLv = 60 @@ -320,6 +339,7 @@ class Skill10(ActiveSkill): """ name = '横扫' + ref = Ref.SIDESLASH cellPos = (0,3) learnLv = 10 masterLv = 60 @@ -347,6 +367,7 @@ class Skill11(ActiveSkill): """ name = '魔枪发射' + ref = Ref.PARTISANSHOOT cellPos = (3,3) learnLv = 10 masterLv = 60 @@ -377,6 +398,7 @@ class Skill12(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -404,6 +426,7 @@ class Skill13(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -430,6 +453,7 @@ class Skill14(ActiveSkill): """ name = '连环枪' + ref = Ref.SURROUNDBREAK cellPos = (7,4) learnLv = 15 masterLv = 60 @@ -469,6 +493,7 @@ class Skill15(PassiveSkill): """ name = '长枪精通' + ref = Ref.SPEARMASTERY cellPos = (1,4) learnLv = 15 masterLv = 20 @@ -490,9 +515,14 @@ class Skill15(PassiveSkill): # 命中率增加 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkP', 'data': data0}, + # {'type': '*cdReduce', 'data': data1, 'exceptSkills': ['流云幻灭', '极影无形杀', '问鼎·千军破云']}, + # ] associate = [ - {'type': '$*PAtkP', 'data': data0}, - {'type': '*cdReduce', 'data': data1, 'exceptSkills': ['流云幻灭', '极影无形杀', '问鼎·千军破云']}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data1)), except_skills=[Ref.AURAFORCEJAVELIN, Ref.EXTREMESKILLARTS, Ref.MIRAGEHALLUCINATION]), ] # 行云诀 @@ -510,6 +540,7 @@ class Skill16(ActiveSkill): """ name = '行云诀' + ref = Ref.MIRAGE cellPos = (5,3) learnLv = 15 masterLv = 1 @@ -537,6 +568,7 @@ class Skill17(ActiveSkill): """ name = '行云 : 风' + ref = Ref.SWIRLINGSPEAR cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -573,6 +605,7 @@ class Skill18(ActiveSkill): """ name = '扫堂枪' + ref = Ref.DEMONICANKLECUT cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -600,6 +633,7 @@ class Skill19(ActiveSkill): """ name = '无双枪术' + ref = Ref.AURALANCE cellPos = (7,5) learnLv = 20 masterLv = 10 @@ -627,6 +661,7 @@ class Skill20(ActiveSkill): """ name = '双重刺击' + ref = Ref.TWINPUNTO cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -681,6 +716,7 @@ class Skill21(ActiveSkill): """ name = '行云 : 疾' + ref = Ref.GROUNDSEEKER cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -713,6 +749,7 @@ class Skill22(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -741,6 +778,7 @@ class Skill23(ActiveSkill): """ name = '行云 : 落' + ref = Ref.RISINGLANCER cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -777,6 +815,7 @@ class Skill24(ActiveSkill): """ name = '旋风枪' + ref = Ref.STURM cellPos = (1,6) learnLv = 25 masterLv = 60 @@ -811,6 +850,7 @@ class Skill25(PassiveSkill): """ name = '行云 : 沐' + ref = Ref.MIRAGEBOOST cellPos = (7,6) learnLv = 25 masterLv = 10 @@ -825,7 +865,11 @@ class Skill25(PassiveSkill): # 技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 无畏波动枪 # demonic_lancer/skirmisher/8c2379737c5acc935c1731f67f607655 @@ -837,6 +881,7 @@ class Skill26(ActiveSkill): """ name = '无畏波动枪' + ref = Ref.CHAINLANCE cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -892,6 +937,7 @@ class Skill27(ActiveSkill): """ name = '升龙破空枪' + ref = Ref.SKYTOOTH cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -949,6 +995,7 @@ class Skill28(ActiveSkill): """ name = '螺旋波动枪' + ref = Ref.ROUNDSLASH cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -1008,6 +1055,7 @@ class Skill29(ActiveSkill): """ name = '狂龙怒啸' + ref = Ref.MESOCYCLONE cellPos = (1,9) learnLv = 40 masterLv = 60 @@ -1065,6 +1113,7 @@ class Skill30(ActiveSkill): """ name = '夺命雷霆枪' + ref = Ref.PINPOINTSLASH cellPos = (3,10) learnLv = 45 masterLv = 60 @@ -1145,6 +1194,7 @@ class Skill31(PassiveSkill): """ name = '行云 : 启' + ref = Ref.MIRAGESTREAM cellPos = (4,11) learnLv = 48 masterLv = 40 @@ -1167,12 +1217,20 @@ class Skill31(PassiveSkill): # 基本攻击和其他技能的攻击力增加率 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data0, 'type': '*skillDamage', 'skills': ['行云 : 风']}, + # {'data': data1, 'type': '*skillDamage', 'skills': ['行云 : 疾']}, + # {'data': data2, 'type': '*skillDamage', 'skills': ['行云 : 落']}, + # {'data': data3, 'type': '*skillDamage', 'skills': ['连环枪']}, + # {'data': data4, 'type': '*skillDamage', 'exceptSkills': ['行云 : 风', '行云 : 疾', '行云 : 落']}, + # ] associate = [ - {'data': data0, 'type': '*skillDamage', 'skills': ['行云 : 风']}, - {'data': data1, 'type': '*skillDamage', 'skills': ['行云 : 疾']}, - {'data': data2, 'type': '*skillDamage', 'skills': ['行云 : 落']}, - {'data': data3, 'type': '*skillDamage', 'skills': ['连环枪']}, - {'data': data4, 'type': '*skillDamage', 'exceptSkills': ['行云 : 风', '行云 : 疾', '行云 : 落']}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.SWIRLINGSPEAR]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.GROUNDSEEKER]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2)), skills=[Ref.RISINGLANCER]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3)), skills=[Ref.SURROUNDBREAK]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data4)), except_skills=[Ref.SWIRLINGSPEAR, Ref.GROUNDSEEKER, Ref.RISINGLANCER]), ] # 流云幻灭 @@ -1184,6 +1242,7 @@ class Skill32(ActiveSkill): """ name = '流云幻灭' + ref = Ref.AURAFORCEJAVELIN cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1247,6 +1306,7 @@ class Skill33(ActiveSkill): """ name = '风火燎原' + ref = Ref.ROLLINGVULKAN cellPos = (3,12) learnLv = 60 masterLv = 40 @@ -1305,6 +1365,7 @@ class Skill34(ActiveSkill): """ name = '三一斩月' + ref = Ref.CRESCENT cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1373,6 +1434,7 @@ class Skill35(PassiveSkill): """ name = '行云 : 冥' + ref = Ref.FORMLESSSPEARMAN cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1407,7 +1469,13 @@ class Skill35(PassiveSkill): # 除行云系外的技能攻击力增加率 : {value9}% data9 = get_data(f'{prefix}/{uuid}', 9) - associate = [{'data': data2, 'type': '*skillDamage', 'skills': ['行云 : 风', '行云 : 疾', '行云 : 落']}, {'data': data3, 'type': '*skillDamage', 'skills': ['刺击', '双重刺击']}, {'data': data4, 'type': '*skillDamage', 'exceptSkills': ['行云 : 风', '行云 : 疾', '行云 : 落', '刺击', '双重刺击']}] + # 迁移前实现(保留对照): + # associate = [{'data': data2, 'type': '*skillDamage', 'skills': ['行云 : 风', '行云 : 疾', '行云 : 落']}, {'data': data3, 'type': '*skillDamage', 'skills': ['刺击', '双重刺击']}, {'data': data4, 'type': '*skillDamage', 'exceptSkills': ['行云 : 风', '行云 : 疾', '行云 : 落', '刺击', '双重刺击']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2)), skills=[Ref.SWIRLINGSPEAR, Ref.GROUNDSEEKER, Ref.RISINGLANCER]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3)), skills=[Ref.QUICKPUNTO, Ref.TWINPUNTO]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data4)), except_skills=[Ref.SWIRLINGSPEAR, Ref.GROUNDSEEKER, Ref.RISINGLANCER, Ref.QUICKPUNTO, Ref.TWINPUNTO]), + ] # 无双突刺 # demonic_lancer/skirmisher/bc11d28c04e01923a093d65752c55516 @@ -1420,6 +1488,7 @@ class Skill36(ActiveSkill): """ name = '无双突刺' + ref = Ref.TASERDRIVE cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1488,6 +1557,7 @@ class Skill37(ActiveSkill): """ name = '流光无影闪' + ref = Ref.MYSTFLARE cellPos = (2,14) learnLv = 80 masterLv = 40 @@ -1543,6 +1613,7 @@ class Skill38(ActiveSkill): """ name = '极影无形杀' + ref = Ref.EXTREMESKILLARTS cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1590,6 +1661,7 @@ class Skill39(PassiveSkill): """ name = '一身是胆' + ref = Ref.FEARLESSATTITUDE cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1604,7 +1676,11 @@ class Skill39(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 双龙流云灭 # demonic_lancer/skirmisher/4c5271b0ecce120d7fc113f377fae76f @@ -1615,6 +1691,7 @@ class Skill40(ActiveSkill): """ name = '双龙流云灭' + ref = Ref.LINEARMIRAGEATTACK cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1656,6 +1733,7 @@ class Skill41(ActiveSkill): """ name = '问鼎·千军破云' + ref = Ref.MIRAGEHALLUCINATION cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/demonic_lancer/vanguard.py b/backend/core/character/GF/demonic_lancer/vanguard.py index 2b99063d..2cd89507 100644 --- a/backend/core/character/GF/demonic_lancer/vanguard.py +++ b/backend/core/character/GF/demonic_lancer/vanguard.py @@ -1,6 +1,16 @@ # 3deb7be5f01953ac8b1ecaa1e25e0420 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.demonic_lancer.vanguard import VanguardSkillRef as Ref prefix = "demonic_lancer/vanguard/cn/skillDetail" @@ -15,6 +25,7 @@ class Skill0(ActiveSkill): """ name = '刺击' + ref = Ref.QUICKPUNTO cellPos = (3,1) learnLv = 1 masterLv = 60 @@ -56,6 +67,7 @@ class Skill1(ActiveSkill): """ name = '枪挑' + ref = Ref.HELMSHOT cellPos = (5,1) learnLv = 1 masterLv = 10 @@ -82,6 +94,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -106,6 +119,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -125,7 +139,11 @@ class Skill3(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['霸王戟']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['霸王戟']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.SMASH]), + ] # 受身蹲伏 # demonic_lancer/vanguard/ce26c6b69d02a440a81b552bec94f03b @@ -135,6 +153,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -176,6 +195,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -198,6 +218,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -223,6 +244,7 @@ class Skill7(ActiveSkill): """ name = '回旋钩' + ref = Ref.HOOKANDTHROW cellPos = (4,2) learnLv = 5 masterLv = 60 @@ -264,6 +286,7 @@ class Skill8(ActiveSkill): """ name = '格挡反击' + ref = Ref.INDURE cellPos = (7,3) learnLv = 10 masterLv = 5 @@ -292,6 +315,7 @@ class Skill9(ActiveSkill): """ name = '落凤枪' + ref = Ref.PARATROOPER cellPos = (5,3) learnLv = 10 masterLv = 60 @@ -324,6 +348,7 @@ class Skill10(ActiveSkill): """ name = '横扫' + ref = Ref.SIDESLASH cellPos = (3,3) learnLv = 10 masterLv = 60 @@ -351,6 +376,7 @@ class Skill11(ActiveSkill): """ name = '魔枪发射' + ref = Ref.PARTISANSHOOT cellPos = (1,3) learnLv = 10 masterLv = 60 @@ -381,6 +407,7 @@ class Skill12(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -408,6 +435,7 @@ class Skill13(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -434,6 +462,7 @@ class Skill14(ActiveSkill): """ name = '连环枪' + ref = Ref.SURROUNDBREAK cellPos = (8,4) learnLv = 15 masterLv = 60 @@ -472,6 +501,7 @@ class Skill15(PassiveSkill): """ name = '狂暴战戟' + ref = Ref.CLEAVE cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -494,6 +524,7 @@ class Skill16(ActiveSkill): """ name = '扫堂枪' + ref = Ref.DEMONICANKLECUT cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -521,6 +552,7 @@ class Skill17(ActiveSkill): """ name = '霸王戟' + ref = Ref.SMASH cellPos = (2,4) learnLv = 15 masterLv = 1 @@ -571,6 +603,7 @@ class Skill18(PassiveSkill): """ name = '战戟精通' + ref = Ref.DEMONICLANCECONTROL cellPos = (6,4) learnLv = 15 masterLv = 10 @@ -596,7 +629,11 @@ class Skill18(PassiveSkill): # 被领主怪物攻击时,不会僵直的伤害量上限 : 生命值最大值的{value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'type': '$*PAtkP', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '$*PAtkP', 'data': data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 破军突击 # demonic_lancer/vanguard/c27418ae613c647527200a7ca17d97fd @@ -608,6 +645,7 @@ class Skill19(ActiveSkill): """ name = '破军突击' + ref = Ref.HEADONCHARGE cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -644,6 +682,7 @@ class Skill20(ActiveSkill): """ name = '不灭战戟' + ref = Ref.DEMONICLANCERELEASE cellPos = (6,5) learnLv = 20 masterLv = 10 @@ -671,6 +710,7 @@ class Skill21(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -694,6 +734,7 @@ class Skill22(ActiveSkill): """ name = '追魂斩' + ref = Ref.BRANDISH cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -730,6 +771,7 @@ class Skill23(ActiveSkill): """ name = '战戟猛攻' + ref = Ref.IMPACTSMASH cellPos = (2,6) learnLv = 25 masterLv = 20 @@ -761,7 +803,11 @@ class Skill23(ActiveSkill): # 斩击范围比率 : {value6}% data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{'type': '$*PAtkP', 'data': data3}] + # 迁移前实现(保留对照): + # associate = [{'type': '$*PAtkP', 'data': data3}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data3))), + ] def getSkillCD(self, mode=None): return self.cd @@ -775,6 +821,7 @@ class Skill24(ActiveSkill): """ name = '落月斩' + ref = Ref.CRESCENTSLASH cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -804,6 +851,7 @@ class Skill25(ActiveSkill): """ name = '冷血突刺' + ref = Ref.DREADBORE cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -862,6 +910,7 @@ class Skill26(ActiveSkill): """ name = '破灭斩' + ref = Ref.BEHEAD cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -912,6 +961,7 @@ class Skill27(ActiveSkill): """ name = '灭袭乱舞' + ref = Ref.BLADESTORM cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -969,6 +1019,7 @@ class Skill28(ActiveSkill): """ name = '横扫八荒' + ref = Ref.DEVASTATE cellPos = (4,10) learnLv = 45 masterLv = 60 @@ -1028,6 +1079,7 @@ class Skill29(PassiveSkill): """ name = '战戟之魂' + ref = Ref.VETERAN cellPos = (6,11) learnLv = 48 masterLv = 40 @@ -1055,7 +1107,11 @@ class Skill29(PassiveSkill): # [第2阶段]被击时,不会进入僵直的伤害量上限增加 : 生命值最大值的{value6}% data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 千魂弑 # demonic_lancer/vanguard/d0cdaca82892e54097f22a1f60817048 @@ -1068,6 +1124,7 @@ class Skill30(ActiveSkill): """ name = '千魂弑' + ref = Ref.YOUDIED cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1101,6 +1158,7 @@ class Skill31(ActiveSkill): """ name = '长虹贯日' + ref = Ref.LUNGESTRIKE cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1160,6 +1218,7 @@ class Skill32(ActiveSkill): """ name = '穿云裂地斩' + ref = Ref.DOOMGLAIVE cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1216,6 +1275,7 @@ class Skill33(ActiveSkill): """ name = '破灭轮回刺' + ref = Ref.DEADLYMASSACRE cellPos = (8,13) learnLv = 75 masterLv = 40 @@ -1276,6 +1336,7 @@ class Skill34(PassiveSkill): """ name = '战神之力' + ref = Ref.DEMONICLANCEAWAKENING cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1292,7 +1353,11 @@ class Skill34(PassiveSkill): # [战戟猛攻]能量层数增加量 : {value1} data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 断魂裂岩斩 # demonic_lancer/vanguard/ca75c965f20a150f99f54155a37400df @@ -1303,6 +1368,7 @@ class Skill35(ActiveSkill): """ name = '断魂裂岩斩' + ref = Ref.BURSTSLASH cellPos = (5,14) learnLv = 80 masterLv = 40 @@ -1366,6 +1432,7 @@ class Skill36(ActiveSkill): """ name = '血战天狱' + ref = Ref.DEMONICINFERNO cellPos = (7,14) learnLv = 85 masterLv = 40 @@ -1403,6 +1470,7 @@ class Skill37(PassiveSkill): """ name = '灭天之魂' + ref = Ref.DEADLYSTEP cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1420,7 +1488,12 @@ class Skill37(PassiveSkill): # 命中时能量恢复时间减少量 : {value1}秒 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}, {'data': [-i for i in data1], 'type': '+cd', 'skills': ['战戟猛攻'], 'ratio': 1}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}, {'data': [-i for i in data1], 'type': '+cd', 'skills': ['战戟猛攻'], 'ratio': 1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD, operation=Operation.ADD, value=LevelTable([-i for i in data1]), skills=[Ref.IMPACTSMASH]), + ] # 镇狱裂地枪 # demonic_lancer/vanguard/78b86e64fbb74c1db1b71c50a5ac21cd @@ -1431,6 +1504,7 @@ class Skill38(ActiveSkill): """ name = '镇狱裂地枪' + ref = Ref.BRUTALSPLIT cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1465,6 +1539,7 @@ class Skill39(ActiveSkill): """ name = '天劫·斗灭乾坤' + ref = Ref.NEVERMORE cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/extra/creator.py b/backend/core/character/GF/extra/creator.py index ff238437..2380638c 100644 --- a/backend/core/character/GF/extra/creator.py +++ b/backend/core/character/GF/extra/creator.py @@ -1,6 +1,15 @@ # b522a95d819a5559b775deb9a490e49a from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.extra.creator import CreatorSkillRef as Ref prefix = "extra/creator/cn/skillDetail" @@ -25,6 +34,7 @@ class Skill0(CreatorActiveSkill): """ name = '烈火燎原' + ref = Ref.FIREWALL cellPos = (0,2) learnLv = 1 masterLv = 60 @@ -59,6 +69,7 @@ class Skill1(CreatorActiveSkill): """ name = '炽炎星陨' + ref = Ref.FIREMETEO cellPos = (1,2) learnLv = 1 masterLv = 60 @@ -92,6 +103,7 @@ class Skill2(ActiveSkill): """ name = '后跳' + ref = Ref.BACKSTEP cellPos = (3,0) learnLv = 1 masterLv = 1 @@ -115,6 +127,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -143,6 +156,7 @@ class Skill4(ActiveSkill): """ name = '受身蹲伏' + ref = Ref.QUICKSTANDING cellPos = (2,0) learnLv = 1 masterLv = 1 @@ -174,6 +188,7 @@ class Skill5(ActiveSkill): """ name = '烈炎' + ref = Ref.CREATORFLAME cellPos = (0,1) learnLv = 1 masterLv = 1 @@ -199,6 +214,7 @@ class Skill6(PassiveSkill): """ name = '防具精通' + ref = Ref.ARMORMASTERYETC cellPos = (10,2) learnLv = 1 masterLv = 1 @@ -222,6 +238,7 @@ class Skill7(CreatorActiveSkill): """ name = '冰霜之球' + ref = Ref.ICEROCK cellPos = (2,2) learnLv = 10 masterLv = 60 @@ -258,6 +275,7 @@ class Skill8(CreatorActiveSkill): """ name = '冰天震地' + ref = Ref.ICEPLATE cellPos = (3,2) learnLv = 10 masterLv = 60 @@ -294,6 +312,7 @@ class Skill9(PassiveSkill): """ name = '强化 - 后跳' + ref = Ref.ESCAPEBACKSTEP cellPos = (4,0) learnLv = 10 masterLv = 1 @@ -322,6 +341,7 @@ class Skill10(ActiveSkill): """ name = '跃翔' + ref = Ref.JUMPPOWERUP cellPos = (6,0) learnLv = 10 masterLv = 1 @@ -349,6 +369,7 @@ class Skill11(ActiveSkill): """ name = '寒冰' + ref = Ref.CREATORICE cellPos = (2,1) learnLv = 10 masterLv = 1 @@ -376,6 +397,7 @@ class Skill12(PassiveSkill): """ name = '时空之手' + ref = Ref.MGRAB cellPos = (5,2) learnLv = 20 masterLv = 1 @@ -406,6 +428,7 @@ class Skill13(PassiveSkill): """ name = '树之屏障' + ref = Ref.WOODFENCE cellPos = (4,2) learnLv = 20 masterLv = 1 @@ -442,6 +465,7 @@ class Skill14(PassiveSkill): """ name = '暴击' + ref = Ref.PHYSICALCRITICALHITUP cellPos = (5,0) learnLv = 20 masterLv = 10 @@ -466,6 +490,7 @@ class Skill15(ActiveSkill): """ name = '控制' + ref = Ref.CREATORDISTURB cellPos = (4,1) learnLv = 20 masterLv = 1 @@ -491,6 +516,7 @@ class Skill16(PassiveSkill): """ name = '幻想之境' + ref = Ref.IMAGINATION cellPos = (1,5) learnLv = 20 masterLv = 10 @@ -510,7 +536,11 @@ class Skill16(PassiveSkill): # 施放速度增加 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0, 'type': '$*PAtkI'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '$*PAtkI'}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_I, value=1 + Percent(LevelTable(data0))), + ] # 具象强化 # extra/creator/ef9d26746effee9199b54541f01b8752 @@ -522,6 +552,7 @@ class Skill17(PassiveSkill): """ name = '具象强化' + ref = Ref.CREATORFORCE cellPos = (2,5) learnLv = 25 masterLv = 10 @@ -536,7 +567,11 @@ class Skill17(PassiveSkill): # 各系列攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 烈焰飓风 # extra/creator/e788de1a4498c99fcc790302c4d41fed @@ -548,6 +583,7 @@ class Skill18(CreatorActiveSkill): """ name = '烈焰飓风' + ref = Ref.FIREHURRICANE cellPos = (6,2) learnLv = 30 masterLv = 60 @@ -606,6 +642,7 @@ class Skill19(CreatorActiveSkill): """ name = '极冰护盾' + ref = Ref.ICESHIELD cellPos = (7,2) learnLv = 30 masterLv = 60 @@ -669,6 +706,7 @@ class Skill20(ActiveSkill): """ name = '守护' + ref = Ref.CREATORGUARDIAN cellPos = (6,1) learnLv = 30 masterLv = 1 @@ -694,6 +732,7 @@ class Skill21(ActiveSkill): """ name = '时空增幅' + ref = Ref.AMPLIFICATION cellPos = (0,5) learnLv = 30 masterLv = 10 @@ -721,6 +760,7 @@ class Skill22(CreatorActiveSkill): """ name = '超能旋风波' + ref = Ref.WINDPRESS cellPos = (8,2) learnLv = 40 masterLv = 60 @@ -778,6 +818,7 @@ class Skill23(CreatorActiveSkill): """ name = '风暴漩涡' + ref = Ref.WINDSTORM cellPos = (9,2) learnLv = 40 masterLv = 60 @@ -836,6 +877,7 @@ class Skill24(ActiveSkill): """ name = '风暴' + ref = Ref.CREATORWIND cellPos = (8,1) learnLv = 40 masterLv = 1 @@ -861,6 +903,7 @@ class Skill25(PassiveSkill): """ name = '洞悉' + ref = Ref.UNDERSTANDING cellPos = (3,5) learnLv = 48 masterLv = 40 @@ -877,7 +920,11 @@ class Skill25(PassiveSkill): # 烈炎、 寒冰、 守护、 风暴系列能量增加量 : {value1} data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 自我觉醒 # extra/creator/845e0ce3235e19f60cc82a082d072cba @@ -889,6 +936,7 @@ class Skill26(PassiveSkill): """ name = '自我觉醒' + ref = Ref.CONSCIOUSNESS cellPos = (10,4) learnLv = 50 masterLv = 1 @@ -911,7 +959,11 @@ class Skill26(PassiveSkill): # 独立攻击力增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data3, 'type': '$*PAtkI'}] + # 迁移前实现(保留对照): + # associate = [{'data': data3, 'type': '$*PAtkI'}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_I, value=1 + Percent(LevelTable(data3))), + ] # 终末狂想 # extra/creator/5536486eaf9b13c9a8283447cb5e77ab @@ -923,6 +975,7 @@ class Skill27(ActiveSkill): """ name = '终末狂想' + ref = Ref.EXTINCTION cellPos = (0,3) learnLv = 50 masterLv = 1 @@ -950,6 +1003,7 @@ class Skill28(CreatorActiveSkill): """ name = '末日虫洞' + ref = Ref.WORMHOLE cellPos = (0,4) learnLv = 50 masterLv = 40 @@ -1012,6 +1066,7 @@ class Skill29(ActiveSkill): """ name = '构造' + ref = Ref.CREATORREVIVAL cellPos = (1,3) learnLv = 60 masterLv = 1 @@ -1040,6 +1095,7 @@ class Skill30(CreatorActiveSkill): """ name = '冰雪降临' + ref = Ref.ICEAGE cellPos = (1,4) learnLv = 60 masterLv = 40 @@ -1112,6 +1168,7 @@ class Skill31(ActiveSkill): """ name = '同调' + ref = Ref.TUNING cellPos = (3,3) learnLv = 70 masterLv = 1 @@ -1139,6 +1196,7 @@ class Skill32(CreatorActiveSkill): """ name = '时空链接' + ref = Ref.LINK cellPos = (3,4) learnLv = 70 masterLv = 40 @@ -1204,6 +1262,7 @@ class Skill33(PassiveSkill): """ name = '创世之力' + ref = Ref.THECREATION cellPos = (4,5) learnLv = 75 masterLv = 40 @@ -1220,7 +1279,11 @@ class Skill33(PassiveSkill): # 烈炎、 寒冰、 守护、 风暴系列能量增加量 : {value1} data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 虚空 # extra/creator/dacd5c2848a1eb33489e5471f1a73759 @@ -1232,6 +1295,7 @@ class Skill34(ActiveSkill): """ name = '虚空' + ref = Ref.CREATORDISTORTION cellPos = (4,3) learnLv = 80 masterLv = 1 @@ -1257,6 +1321,7 @@ class Skill35(CreatorActiveSkill): """ name = '时空禁制' + ref = Ref.TIMEFORWARD cellPos = (4,4) learnLv = 80 masterLv = 40 @@ -1324,6 +1389,7 @@ class Skill36(ActiveSkill): """ name = '缔造' + ref = Ref.CREATORCREATE cellPos = (6,3) learnLv = 85 masterLv = 1 @@ -1349,6 +1415,7 @@ class Skill37(PassiveSkill): """ name = '创世' + ref = Ref.CREATESPACE cellPos = (5,4) learnLv = 85 masterLv = 40 @@ -1411,6 +1478,7 @@ class Skill38(CreatorActiveSkill): """ name = '生命之树' + ref = Ref.THETREEOFSEFIROT cellPos = (6,4) learnLv = 85 masterLv = 1 @@ -1439,14 +1507,7 @@ class Skill38(CreatorActiveSkill): mode = ['秒炸', '常规'] - @property - def lv(self): - """技能等级""" - return self.char.GetSkillByName("创世").lv - - @lv.setter - def lv(self, value): - ... + level_source = Ref.CREATESPACE def setMode(self, mode): if mode == '秒炸': @@ -1473,6 +1534,7 @@ class Skill39(PassiveSkill): """ name = '天工开物' + ref = Ref.ARTEFACTOFCREATION cellPos = (6,5) learnLv = 95 masterLv = 40 @@ -1491,7 +1553,11 @@ class Skill39(PassiveSkill): # [冰霜之球]能量恢复率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 创生 # extra/creator/1bf9711f3f15865e38d7dce51c6b5a8c @@ -1503,6 +1569,7 @@ class Skill40(ActiveSkill): """ name = '创生' + ref = Ref.CREATORBIRTH cellPos = (7,3) learnLv = 95 masterLv = 1 @@ -1530,6 +1597,7 @@ class Skill41(CreatorActiveSkill): """ name = '创世之光' + ref = Ref.ORIGINALLIGHT cellPos = (7,5) learnLv = 95 masterLv = 40 @@ -1590,6 +1658,7 @@ class Skill43(ActiveSkill): """ name = '命运' + ref = Ref.CREATORDESTINY cellPos = (8,3) learnLv = 100 masterLv = 1 @@ -1618,6 +1687,7 @@ class Skill44(CreatorActiveSkill): """ name = '时之终末 : 归烬' + ref = Ref.CATASTROPHE cellPos = (8,5) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/extra/dark_knight.py b/backend/core/character/GF/extra/dark_knight.py index d8ed3105..a3e529dd 100644 --- a/backend/core/character/GF/extra/dark_knight.py +++ b/backend/core/character/GF/extra/dark_knight.py @@ -2,21 +2,38 @@ from core.basic.character.calc_carry import _skill_error_context from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Equals, + LevelTable, + Not, + Operation, + OutputTypeStartsWith, + Percent, + Read, + Select, + SkillAttribute, + SkillEffect, + WeaponCategoryContains, +) +from core.character.refs.extra.dark_knight import DarkKnightSkillRef as Ref prefix = "extra/dark_knight/cn/skillDetail" -def apply_weapon_mastery(skill: PassiveSkill, old: int, new: int, weapon_type: str): - weapon = skill.char.GetWeaponType() - if weapon[0] != weapon_type: - return None - - physical = skill.char.输出类型.startswith('物理') - inherited = '传世武器' in weapon[1] - data_index = (3 if physical else 4) if inherited else (0 if physical else 1) - attack_type = '$*PAtkP' if physical else '$*PAtkM' - skill.associate = [{'type': attack_type, 'data': getattr(skill, f'data{data_index}')}] - return PassiveSkill.effect(skill, old, new) +# 迁移前武器精通辅助函数(保留对照): +# def apply_weapon_mastery(skill: PassiveSkill, old: int, new: int, weapon_type: str): +# weapon = skill.char.GetWeaponType() +# if weapon[0] != weapon_type: +# return None +# +# physical = skill.char.输出类型.startswith('物理') +# inherited = '传世武器' in weapon[1] +# data_index = (3 if physical else 4) if inherited else (0 if physical else 1) +# attack_type = '$*PAtkP' if physical else '$*PAtkM' +# skill.associate = [{'type': attack_type, 'data': getattr(skill, f'data{data_index}')}] +# return PassiveSkill.effect(skill, old, new) class DarkKnightSkill(ActiveSkill): # 默认5阶段 @@ -47,6 +64,7 @@ class Skill0(DarkKnightSkill): """ name = '暗影斩' + ref = Ref.DARKSLASH cellPos = (3,1) learnLv = 1 masterLv = 60 @@ -73,6 +91,7 @@ class Skill1(DarkKnightSkill): """ name = '滑斩' + ref = Ref.BRIEFCUT cellPos = (2,2) learnLv = 1 masterLv = 60 @@ -99,6 +118,7 @@ class Skill2(DarkKnightSkill): """ name = '挑击' + ref = Ref.UPPER cellPos = (2,1) learnLv = 1 masterLv = 10 @@ -128,6 +148,7 @@ class Skill3(DarkKnightSkill): """ name = '跃斩' + ref = Ref.BOUNCEBLOW cellPos = (3,2) learnLv = 1 masterLv = 60 @@ -165,6 +186,7 @@ class Skill4(ActiveSkill): """ name = '后跳' + ref = Ref.BACKSTEP cellPos = (3,0) learnLv = 1 masterLv = 1 @@ -189,6 +211,7 @@ class Skill5(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -208,7 +231,11 @@ class Skill5(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['挑击']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['挑击']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.UPPER]), + ] # 受身蹲伏 # extra/dark_knight/ce26c6b69d02a440a81b552bec94f03b @@ -220,6 +247,7 @@ class Skill6(ActiveSkill): """ name = '受身蹲伏' + ref = Ref.QUICKSTANDING cellPos = (2,0) learnLv = 1 masterLv = 1 @@ -252,6 +280,7 @@ class Skill7(PassiveSkill): """ name = '攻击类型转换' + ref = Ref.CONVERSION cellPos = (9,1) learnLv = 1 masterLv = 1 @@ -275,6 +304,7 @@ class Skill8(PassiveSkill): """ name = '防具精通' + ref = Ref.ARMORMASTERYETC cellPos = (8,1) learnLv = 1 masterLv = 1 @@ -298,6 +328,7 @@ class Skill9(DarkKnightSkill): """ name = '暗影 · 波动剑' + ref = Ref.WAVE cellPos = (5,1) learnLv = 5 masterLv = 60 @@ -327,6 +358,7 @@ class Skill10(DarkKnightSkill): """ name = '黑暗十字刃' + ref = Ref.DARKCROSS cellPos = (4,1) learnLv = 5 masterLv = 60 @@ -359,6 +391,7 @@ class Skill11(DarkKnightSkill): """ name = '暗月斩' + ref = Ref.SPINATTACK cellPos = (2,3) learnLv = 5 masterLv = 60 @@ -391,6 +424,7 @@ class Skill12(DarkKnightSkill): """ name = '冥光斩' + ref = Ref.GRANDWAVE cellPos = (5,2) learnLv = 10 masterLv = 60 @@ -424,6 +458,7 @@ class Skill13(DarkKnightSkill): """ name = '旋涡斩' + ref = Ref.VANESLASH cellPos = (6,1) learnLv = 10 masterLv = 60 @@ -470,6 +505,7 @@ class Skill14(DarkKnightSkill): """ name = '跃地斩' + ref = Ref.HOPSMASH cellPos = (4,2) learnLv = 10 masterLv = 60 @@ -502,6 +538,7 @@ class Skill15(DarkKnightSkill): """ name = '突刺' + ref = Ref.PIERCESTRIKE cellPos = (2,4) learnLv = 10 masterLv = 60 @@ -549,6 +586,7 @@ class Skill16(DarkKnightSkill): """ name = '暗影三击剑' + ref = Ref.TRIPLESTAB cellPos = (3,3) learnLv = 10 masterLv = 60 @@ -584,6 +622,7 @@ class Skill17(PassiveSkill): """ name = '强化 - 后跳' + ref = Ref.ESCAPEBACKSTEP cellPos = (4,0) learnLv = 10 masterLv = 1 @@ -613,6 +652,7 @@ class Skill18(ActiveSkill): """ name = '跃翔' + ref = Ref.JUMPPOWERUP cellPos = (6,0) learnLv = 10 masterLv = 1 @@ -641,6 +681,7 @@ class Skill19(PassiveSkill): """ name = '暗 · 光剑精通' + ref = Ref.LIGHTSWORDMASTERY cellPos = (0,5) learnLv = 15 masterLv = 1 @@ -666,8 +707,13 @@ class Skill19(PassiveSkill): # 命中率增加 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - def effect(self, old, new): - return apply_weapon_mastery(self, old, new, '光剑') + # 迁移前实现(保留对照): + # def effect(self, old, new): + # return apply_weapon_mastery(self, old, new, '光剑') + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data3), LevelTable(data0))), weapon=['光剑'], when=OutputTypeStartsWith('物理')), + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data4), LevelTable(data1))), weapon=['光剑'], when=Not(OutputTypeStartsWith('物理'))), + ] # 暗 · 短剑精通 # extra/dark_knight/01c3a2fb793d293a25ed8dc7a0d70c1a @@ -680,6 +726,7 @@ class Skill20(PassiveSkill): """ name = '暗 · 短剑精通' + ref = Ref.SHORTSWORDMASTERY cellPos = (0,1) learnLv = 15 masterLv = 1 @@ -705,8 +752,13 @@ class Skill20(PassiveSkill): # 命中率增加 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - def effect(self, old, new): - return apply_weapon_mastery(self, old, new, '短剑') + # 迁移前实现(保留对照): + # def effect(self, old, new): + # return apply_weapon_mastery(self, old, new, '短剑') + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data3), LevelTable(data0))), weapon=['短剑'], when=OutputTypeStartsWith('物理')), + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data4), LevelTable(data1))), weapon=['短剑'], when=Not(OutputTypeStartsWith('物理'))), + ] # 暗 · 太刀精通 # extra/dark_knight/8f73f243041c2d27739fe7696f02bf9b @@ -719,6 +771,7 @@ class Skill21(PassiveSkill): """ name = '暗 · 太刀精通' + ref = Ref.BLADEMASTERY cellPos = (0,2) learnLv = 15 masterLv = 1 @@ -744,8 +797,13 @@ class Skill21(PassiveSkill): # 命中率增加 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - def effect(self, old, new): - return apply_weapon_mastery(self, old, new, '太刀') + # 迁移前实现(保留对照): + # def effect(self, old, new): + # return apply_weapon_mastery(self, old, new, '太刀') + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data3), LevelTable(data0))), weapon=['太刀'], when=OutputTypeStartsWith('物理')), + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data4), LevelTable(data1))), weapon=['太刀'], when=Not(OutputTypeStartsWith('物理'))), + ] # 暗 · 巨剑精通 # extra/dark_knight/8c2379737c5acc935c1731f67f607655 @@ -758,6 +816,7 @@ class Skill22(PassiveSkill): """ name = '暗 · 巨剑精通' + ref = Ref.HEAVYSWORDMASTERY cellPos = (0,3) learnLv = 15 masterLv = 1 @@ -783,8 +842,13 @@ class Skill22(PassiveSkill): # 命中率增加 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - def effect(self, old, new): - return apply_weapon_mastery(self, old, new, '巨剑') + # 迁移前实现(保留对照): + # def effect(self, old, new): + # return apply_weapon_mastery(self, old, new, '巨剑') + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data3), LevelTable(data0))), weapon=['巨剑'], when=OutputTypeStartsWith('物理')), + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data4), LevelTable(data1))), weapon=['巨剑'], when=Not(OutputTypeStartsWith('物理'))), + ] # 暗 · 钝器精通 # extra/dark_knight/9cb6f9ed646fa87f9b7680a42ce83d1a @@ -797,6 +861,7 @@ class Skill23(PassiveSkill): """ name = '暗 · 钝器精通' + ref = Ref.BLUNTMASTERY cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -822,8 +887,13 @@ class Skill23(PassiveSkill): # 命中率增加 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - def effect(self, old, new): - return apply_weapon_mastery(self, old, new, '钝器') + # 迁移前实现(保留对照): + # def effect(self, old, new): + # return apply_weapon_mastery(self, old, new, '钝器') + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data3), LevelTable(data0))), weapon=['钝器'], when=OutputTypeStartsWith('物理')), + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data4), LevelTable(data1))), weapon=['钝器'], when=Not(OutputTypeStartsWith('物理'))), + ] # 暗劲爆发 # extra/dark_knight/506e7ed77d517419a6e1c437a2cedb17 @@ -835,6 +905,7 @@ class Skill24(DarkKnightSkill): """ name = '暗劲爆发' + ref = Ref.DARKEXPLOSION cellPos = (4,3) learnLv = 15 masterLv = 60 @@ -871,6 +942,7 @@ class Skill25(PassiveSkill): """ name = '暗武奥义' + ref = Ref.WEAPONMASTERYUP cellPos = (1,3) learnLv = 15 masterLv = 20 @@ -882,7 +954,11 @@ class Skill25(PassiveSkill): hasUP = False custom = get_data(f'{prefix}/{uuid}', 'custom') # noqa: E501 - associate = [{'type': '+lv', 'data': [i + 1 if i > 0 else i for i in range(0, maxLv + 3)], 'ratio': 1, 'skills': ['暗 · 光剑精通', '暗 · 钝器精通', '暗 · 太刀精通', '暗 · 巨剑精通', '暗 · 短剑精通']}] + # 迁移前实现(保留对照): + # associate = [{'type': '+lv', 'data': [i + 1 if i > 0 else i for i in range(0, maxLv + 3)], 'ratio': 1, 'skills': ['暗 · 光剑精通', '暗 · 钝器精通', '暗 · 太刀精通', '暗 · 巨剑精通', '暗 · 短剑精通']}] + associate = [ + SkillEffect(attribute=SkillAttribute.LEVEL, operation=Operation.ADD, value=LevelTable([i + 1 if i > 0 else i for i in range(0, maxLv + 3)]), skills=[Ref.LIGHTSWORDMASTERY, Ref.BLUNTMASTERY, Ref.BLADEMASTERY, Ref.HEAVYSWORDMASTERY, Ref.SHORTSWORDMASTERY]), + ] # 暗影鞭 @@ -894,6 +970,7 @@ class Skill26(DarkKnightSkill): """ name = '暗影鞭' + ref = Ref.WHIPATTACK cellPos = (3,4) learnLv = 20 masterLv = 60 @@ -930,6 +1007,7 @@ class Skill27(DarkKnightSkill): """ name = '邪影 · 波动剑' + ref = Ref.DARKWAVE cellPos = (5,3) learnLv = 20 masterLv = 60 @@ -967,6 +1045,7 @@ class Skill28(PassiveSkill): """ name = '暴击' + ref = Ref.PHYSICALCRITICALHITUP cellPos = (5,0) learnLv = 20 masterLv = 10 @@ -990,6 +1069,7 @@ class Skill29(DarkKnightSkill): """ name = '瞬影斩' + ref = Ref.RAPIDMOVE cellPos = (6,2) learnLv = 25 masterLv = 60 @@ -1020,6 +1100,7 @@ class Skill30(DarkKnightSkill): """ name = '灭魂封魔斩' + ref = Ref.DARKRAVE cellPos = (4,4) learnLv = 25 masterLv = 60 @@ -1059,6 +1140,7 @@ class Skill31(DarkKnightSkill): """ name = '冥魂珠' + ref = Ref.DARKBALL cellPos = (5,4) learnLv = 30 masterLv = 60 @@ -1097,6 +1179,7 @@ class Skill32(DarkKnightSkill): """ name = '暗魂之手' + ref = Ref.DARKRUST cellPos = (6,3) learnLv = 30 masterLv = 60 @@ -1131,6 +1214,7 @@ class Skill33(DarkKnightSkill): """ name = '暗影升龙击' + ref = Ref.DARKCRASHER cellPos = (2,5) learnLv = 30 masterLv = 60 @@ -1186,6 +1270,7 @@ class Skill34(DarkKnightSkill): """ name = '黑暗释放' + ref = Ref.OVERFLOW cellPos = (8,7) learnLv = 30 masterLv = 10 @@ -1214,6 +1299,7 @@ class Skill35(DarkKnightSkill): """ name = '冥魂之陨' + ref = Ref.DARKFALL cellPos = (3,5) learnLv = 35 masterLv = 60 @@ -1271,6 +1357,7 @@ class Skill36(DarkKnightSkill): """ name = '凝魂波动阵' + ref = Ref.SHOCKWAVE cellPos = (5,5) learnLv = 35 masterLv = 60 @@ -1315,6 +1402,7 @@ class Skill37(DarkKnightSkill): """ name = '破魂之刃' + ref = Ref.DARKSWORD cellPos = (4,5) learnLv = 35 masterLv = 60 @@ -1367,6 +1455,7 @@ class Skill38(DarkKnightSkill): """ name = '破魂斩' + ref = Ref.DRAWSWORD cellPos = (6,5) learnLv = 40 masterLv = 60 @@ -1398,6 +1487,7 @@ class Skill39(DarkKnightSkill): """ name = '禁魂斩' + ref = Ref.MOMENTARYSLASH cellPos = (3,6) learnLv = 40 masterLv = 60 @@ -1431,6 +1521,7 @@ class Skill40(DarkKnightSkill): """ name = '冥炎破空斩' + ref = Ref.DARKFLAMESWORD cellPos = (2,6) learnLv = 40 masterLv = 60 @@ -1500,6 +1591,7 @@ class Skill41(DarkKnightSkill): """ name = '魔影剑舞' + ref = Ref.ILLUSIONSLASH cellPos = (6,6) learnLv = 45 masterLv = 60 @@ -1559,6 +1651,7 @@ class Skill42(DarkKnightSkill): """ name = '黑暗明王阵' + ref = Ref.WAVESPIN cellPos = (5,6) learnLv = 45 masterLv = 60 @@ -1615,6 +1708,7 @@ class Skill43(DarkKnightSkill): """ name = '魔狱裂魂斩' + ref = Ref.DARKBREAK cellPos = (4,6) learnLv = 45 masterLv = 60 @@ -1671,6 +1765,7 @@ class Skill44(PassiveSkill): """ name = '时间停滞' + ref = Ref.TIMESTOP cellPos = (0,7) learnLv = 48 masterLv = 40 @@ -1692,7 +1787,11 @@ class Skill44(PassiveSkill): # 施放连续技期间所受伤害减少率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 幽魂剑 # extra/dark_knight/ce7cd04a44e32212e80f120f4421996e @@ -1705,6 +1804,7 @@ class Skill45(DarkKnightSkill): """ name = '幽魂剑' + ref = Ref.PHANTOMSWORD cellPos = (2,7) learnLv = 50 masterLv = 40 @@ -1761,6 +1861,7 @@ class Skill46(PassiveSkill): """ name = '自我觉醒' + ref = Ref.CONSCIOUSNESSDARK cellPos = (8,6) learnLv = 50 masterLv = 1 @@ -1783,7 +1884,12 @@ class Skill46(PassiveSkill): # 物理、 魔法攻击力增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'type': '$*PAtkP', 'data': data3}, {'type': '$*PAtkM', 'data': data3}] + # 迁移前实现(保留对照): + # associate = [{'type': '$*PAtkP', 'data': data3}, {'type': '$*PAtkM', 'data': data3}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data3))), + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable(data3))), + ] # 暗炎冥魂波 # extra/dark_knight/5c00ce6d7dbbb5e9a0f6e1071d486832 @@ -1794,6 +1900,7 @@ class Skill47(DarkKnightSkill): """ name = '暗炎冥魂波' + ref = Ref.DARKWAVEFALL cellPos = (3,8) learnLv = 60 masterLv = 40 @@ -1842,6 +1949,7 @@ class Skill48(DarkKnightSkill): """ name = '斩龙破' + ref = Ref.CHARGEEXPLOSION cellPos = (6,9) learnLv = 70 masterLv = 40 @@ -1900,6 +2008,7 @@ class Skill49(PassiveSkill): """ name = '次元融合' + ref = Ref.DIMENSIONAGREEMENT cellPos = (0,9) learnLv = 75 masterLv = 40 @@ -1920,7 +2029,12 @@ class Skill49(PassiveSkill): # 物理、 魔法暴击率增加 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'type': '$*PSTR', 'data': data2}, {'type': '$*PINT', 'data': data2}] + # 迁移前实现(保留对照): + # associate = [{'type': '$*PSTR', 'data': data2}, {'type': '$*PINT', 'data': data2}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_STR, value=1 + Percent(LevelTable(data2))), + CharacterEffect(attribute=CharacterAttribute.P_INT, value=1 + Percent(LevelTable(data2))), + ] # 邪影升龙斩 # extra/dark_knight/b1732acfaf117f8e9ff130f47d3ed0e7 @@ -1931,6 +2045,7 @@ class Skill50(DarkKnightSkill): """ name = '邪影升龙斩' + ref = Ref.DARKBURST cellPos = (5,10) learnLv = 80 masterLv = 40 @@ -1971,6 +2086,19 @@ class Skill50(DarkKnightSkill): """ self.stage = 6 + # 迁移前实现(保留对照): + # def effect(self, old, new): + # # 选择该vp之后,当前列的连招列的其他技能都没有伤害 + # skills = [] + # for index in self.char.combos[self.comboCol]: + # if str(index) != str(self.id): + # skill = self.char.GetSkillByID(index) + # if skill: + # skills.append(skill.name) + # if self.vp == 2: + # self.associate = [{"type":"=skillDamage","data":[0] + [0]*self.maxLv,"skills":skills}] + # return super().effect(old, new) + # 仅动态枚举目标名称,贡献值与 VP 条件交由类型化声明处理。 def effect(self, old, new): # 选择该vp之后,当前列的连招列的其他技能都没有伤害 skills = [] @@ -1979,8 +2107,9 @@ class Skill50(DarkKnightSkill): skill = self.char.GetSkillByID(index) if skill: skills.append(skill.name) - if self.vp == 2: - self.associate = [{"type":"=skillDamage","data":[0] + [0]*self.maxLv,"skills":skills}] + self.associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, operation=Operation.ASSIGN, value=LevelTable([0] + [0] * self.maxLv), skills=skills, when=Equals(Read(SkillAttribute.VP), 2)), + ] return super().effect(old, new) # 超时空碎裂 @@ -1994,6 +2123,7 @@ class Skill51(DarkKnightSkill): """ name = '超时空碎裂' + ref = Ref.TIMEBREAK cellPos = (4,10) learnLv = 85 masterLv = 40 @@ -2033,6 +2163,7 @@ class Skill52(PassiveSkill): """ name = '时空主宰' + ref = Ref.TIMELORD cellPos = (4,11) learnLv = 95 masterLv = 40 @@ -2048,7 +2179,11 @@ class Skill52(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # [时空主宰]效果持续时间 : 5秒 - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # [时空主宰]效果持续时间 : 5秒 # 暗黑溯回斩 @@ -2061,6 +2196,7 @@ class Skill53(DarkKnightSkill): """ name = '暗黑溯回斩' + ref = Ref.DIABOLICSLASH cellPos = (6,11) learnLv = 95 masterLv = 40 @@ -2128,6 +2264,7 @@ class Skill55(DarkKnightSkill): """ name = '时之止境 : 幻灭' + ref = Ref.THEENDOFTIME cellPos = (4,12) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/fighter_female/brawler_female.py b/backend/core/character/GF/fighter_female/brawler_female.py index 2871b2f4..188f1dd3 100644 --- a/backend/core/character/GF/fighter_female/brawler_female.py +++ b/backend/core/character/GF/fighter_female/brawler_female.py @@ -2,6 +2,26 @@ from core.basic.skill import PassiveSkill, ActiveSkill, get_data, _get_skill_damage_suffixes, _get_skill_dataplus_suffixes from core.basic.character import Character from core.basic.enum.skill import EnumDamageType +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Hit, + LevelTable, + Operation, + Percent, + Power, + ProfessionAttribute, + SkillAttribute, + SkillEffect, +) +from core.character.refs.fighter_female.brawler_female import BrawlerFemaleSkillRef as Ref + + +class BrawlerFemaleAttribute(ProfessionAttribute): + """本职业专用的最终效果属性;字段含义与技能实现保持一致。""" + ENCHANT_POISON_RATIO = 'enchantPoisonRatio' + """女街霸:涂毒附加伤害倍率。""" + prefix = "fighter_female/brawler_female/cn/skillDetail" @@ -40,6 +60,7 @@ class Skill0(ActiveSkill): 转职为柔道家后,技能类型变为独立攻击力。\n """ name = "上勾拳" + ref = Ref.LIFTUPPER learnLv = 1 masterLv = 10 maxLv = 20 @@ -68,6 +89,7 @@ class Skill1(PassiveSkill): 通过对毒的修炼,减少自身受到的中毒伤害。\n """ name = "剧毒抵抗" + ref = Ref.POISONTOLERANCEUP learnLv = 1 masterLv = 1 maxLv = 1 @@ -92,6 +114,7 @@ class Skill2(PassiveSkill): 使用念气系列技能 ([念气波]、 [分身]) 时,有一定的几率使自身进入眩晕状态。\n """ name = "毒攻掌握" + ref = Ref.HERESYPOWERTRAINING learnLv = 1 masterLv = 1 maxLv = 1 @@ -118,6 +141,7 @@ class Skill3(ActiveSkill): 向敌人发出强威力的踢腿,可以踢飞敌人。\n """ name = "前踢" + ref = Ref.SINGLEKICK learnLv = 1 masterLv = 60 maxLv = 70 @@ -145,6 +169,7 @@ class Skill4(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -168,6 +193,7 @@ class Skill5(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -195,6 +221,7 @@ class Skill6(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -226,6 +253,7 @@ class Skill7(PassiveSkill): 在决斗场中,无法转换攻击类型,适用技能固有的攻击类型。\n """ name = "攻击类型转换" + ref = Ref.CONVERSION learnLv = 1 masterLv = 1 maxLv = 1 @@ -260,6 +288,7 @@ class Skill8(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -282,6 +311,7 @@ class Skill9(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -305,6 +335,7 @@ class Skill10(ActiveSkill): 命中时引发冲击波,对周围敌人造成伤害。\n """ name = "下段踢" + ref = Ref.DAMAGELOWKICK learnLv = 5 masterLv = 60 maxLv = 70 @@ -339,6 +370,7 @@ class Skill11(ActiveSkill): 在决斗场中,转职为气功师后,增加分身的持续时间。\n """ name = "分身" + ref = Ref.KENSIN learnLv = 5 masterLv = 10 maxLv = 20 @@ -370,6 +402,7 @@ class Skill12(ActiveSkill): 此外,因受抓轰炮效果,可以攻击无法抓取的敌人,这时可以大幅击退敌人进行攻击。\n """ name = "背摔" + ref = Ref.SUPLEX learnLv = 5 masterLv = 60 maxLv = 70 @@ -407,6 +440,7 @@ class Skill13(ActiveSkill): [蹲伏]姿势中按攻击键,可以用肩尖撞击敌人; 经过一定时间或按跳跃键可以中断蹲伏状态。\n """ name = "蹲伏" + ref = Ref.CROUCH learnLv = 10 masterLv = 1 maxLv = 11 @@ -434,6 +468,7 @@ class Skill14(PassiveSkill): 被攻击时,有一定几率进入霸体状态。\n """ name = "钢筋铁骨" + ref = Ref.IRONSKIN learnLv = 10 masterLv = 50 maxLv = 60 @@ -462,6 +497,7 @@ class Skill15(ActiveSkill): 转职为街霸后,可中断基本攻击使用。\n """ name = "抛沙" + ref = Ref.THROWSAND learnLv = 10 masterLv = 60 maxLv = 70 @@ -505,6 +541,7 @@ class Skill16(ActiveSkill): 可以连续对敌人进行一定次数的踩踏,技能的冷却时间从最后一次踩踏结束落地时开始计算。\n """ name = "鹰踏" + ref = Ref.STOMP learnLv = 10 masterLv = 60 maxLv = 70 @@ -536,6 +573,7 @@ class Skill17(ActiveSkill): 学习[疾风连击]后可再追加第3、 第4次攻击。\n """ name = "疾风追击" + ref = Ref.DASHAFTERDASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -569,6 +607,7 @@ class Skill18(ActiveSkill): 转职为柔道家后,可以强制中断基本攻击并立即施放[金刚碎],并且还可以中断[金刚碎]并立即施放[霹雳肘击]。\n """ name = "金刚碎" + ref = Ref.EARTHBREAK learnLv = 10 masterLv = 60 maxLv = 70 @@ -603,6 +642,7 @@ class Skill19(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -630,6 +670,7 @@ class Skill20(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -660,6 +701,7 @@ class Skill21(ActiveSkill): 在决斗场中,攻击无法抓取的敌人时不会爆炸。\n """ name = "擒月炎" + ref = Ref.GRABEXPLOSION learnLv = 15 masterLv = 60 maxLv = 70 @@ -715,6 +757,7 @@ class Skill22(ActiveSkill): 转职为气功师后,可以强制中断基本攻击动作施放,并大幅度减少冷却时间。\n """ name = "念气波" + ref = Ref.ENERGYBALL learnLv = 15 masterLv = 60 maxLv = 70 @@ -756,6 +799,7 @@ class Skill23(ActiveSkill): 技能攻击适用[发动涂毒时附加中毒攻击力]; 基本攻击适用另外的中毒攻击力。\n """ name = "涂毒" + ref = Ref.ENCHANTPOISON learnLv = 15 masterLv = 10 maxLv = 20 @@ -783,10 +827,14 @@ class Skill23(ActiveSkill): # 技能中包含的[涂毒]中毒攻击力变化率 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{ - "type": "*enchantPoisonRatio", - "data": [0] + [enchantPoisonRatio * 100] * maxLv, - }] + # 迁移前实现(保留对照): + # associate = [{ + # "type": "*enchantPoisonRatio", + # "data": [0] + [enchantPoisonRatio * 100] * maxLv, + # }] + associate = [ + SkillEffect(attribute=BrawlerFemaleAttribute.ENCHANT_POISON_RATIO, value=1 + Percent(LevelTable([0] + [enchantPoisonRatio * 100] * maxLv))), + ] # 袭刺 # fighter_female/brawler_female/dde3b443bd5e61d90c34e5ee771e2c28 @@ -799,6 +847,7 @@ class Skill24(ActiveSkill): 可以强制中断并施放转职技能; 移动中,按反方向键施放转职技能时,向反方向攻击。\n """ name = "袭刺" + ref = Ref.POUNCE learnLv = 15 masterLv = 60 maxLv = 70 @@ -849,6 +898,7 @@ class Skill25(ActiveSkill): 增加[擒月炎]、 [天罗地网]、 [毒雷引爆]、 [猛毒擒月炎]、 [爆碎砖袭]的大小比率,同时增加[毒雷引爆]的毒雷投掷距离。\n """ name = "双重投掷" + ref = Ref.DOUBLETHROW learnLv = 20 masterLv = 20 maxLv = 30 @@ -877,11 +927,18 @@ class Skill25(ActiveSkill): # [爆碎砖袭]爆炸范围增加率 : {value6}% data6 = get_data(f'{prefix}/{uuid}', 6) + # 迁移前实现(保留对照): + # associate = [ + # {"skills": ["街头风暴"],"data": [0] + [50] * maxLv , "type": "=hit0", 'ratio': 1}, + # {"skills": ["街头风暴"],"data": [0] + [50] * maxLv , "type": "=hit8", 'ratio': 1}, + # {"skills": ["抛沙"],"data": [0] + [2] * maxLv , "type": "=hit0", 'ratio': 1}, + # {"skills": ["抛沙"],"data": [0] + [2] * maxLv , "type": "=hit5", 'ratio': 1} + # ] associate = [ - {"skills": ["街头风暴"],"data": [0] + [50] * maxLv , "type": "=hit0", 'ratio': 1}, - {"skills": ["街头风暴"],"data": [0] + [50] * maxLv , "type": "=hit8", 'ratio': 1}, - {"skills": ["抛沙"],"data": [0] + [2] * maxLv , "type": "=hit0", 'ratio': 1}, - {"skills": ["抛沙"],"data": [0] + [2] * maxLv , "type": "=hit5", 'ratio': 1} + SkillEffect(attribute=Hit(0), operation=Operation.ASSIGN, value=LevelTable([0] + [50] * maxLv), skills=[Ref.JUNKSPIN]), + SkillEffect(attribute=Hit(8), operation=Operation.ASSIGN, value=LevelTable([0] + [50] * maxLv), skills=[Ref.JUNKSPIN]), + SkillEffect(attribute=Hit(0), operation=Operation.ASSIGN, value=LevelTable([0] + [2] * maxLv), skills=[Ref.THROWSAND]), + SkillEffect(attribute=Hit(5), operation=Operation.ASSIGN, value=LevelTable([0] + [2] * maxLv), skills=[Ref.THROWSAND]), ] # 毒影针 @@ -894,6 +951,7 @@ class Skill26(ActiveSkill): 在决斗场内,不出现减速、 中毒状态。\n """ name = "毒影针" + ref = Ref.HIDDENSTING learnLv = 20 masterLv = 60 maxLv = 70 @@ -954,6 +1012,7 @@ class Skill27(PassiveSkill): 施放[疾风追击]时,可以向敌人发出第3、 4击。\n """ name = "疾风连击" + ref = Ref.DASHAFTERDASHEXTENSION learnLv = 20 masterLv = 1 maxLv = 1 @@ -974,6 +1033,7 @@ class Skill28(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -998,6 +1058,7 @@ class Skill29(PassiveSkill): 使用鼠标右键,可以打开/关闭出血效果。\n """ name = "爪精通" + ref = Ref.CLAWMASTERY learnLv = 25 masterLv = 20 maxLv = 30 @@ -1025,7 +1086,12 @@ class Skill29(PassiveSkill): # 出血持续时间 : {value6}秒 data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{"data":data0,"type":"$*PAtkP"},{"data":data1,"type":"$*PAtkM"}] + # 迁移前实现(保留对照): + # associate = [{"data":data0,"type":"$*PAtkP"},{"data":data1,"type":"$*PAtkM"}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable(data1))), + ] # 砖袭 # fighter_female/brawler_female/bc11d28c04e01923a093d65752c55516 @@ -1038,6 +1104,7 @@ class Skill30(ActiveSkill): 砖块背击敌人时,使敌人眩晕的几率是原来的2倍。\n """ name = "砖袭" + ref = Ref.BLOCKBUSTER learnLv = 25 masterLv = 60 maxLv = 70 @@ -1090,6 +1157,7 @@ class Skill31(ActiveSkill): 对无法抓取的敌人不适用控制效果。\n """ name = "伏虎霸王拳" + ref = Ref.MOUNT learnLv = 30 masterLv = 60 maxLv = 70 @@ -1137,6 +1205,7 @@ class Skill32(ActiveSkill): 转职成为散打时,可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "旋风腿" + ref = Ref.WHIRLWINDKICK learnLv = 30 masterLv = 60 maxLv = 70 @@ -1166,6 +1235,7 @@ class Skill33(ActiveSkill): 在决斗场中,减少降低控制型异常状态抗性光环的范围。\n """ name = "挑衅" + ref = Ref.PROVOCATION learnLv = 35 masterLv = 10 maxLv = 20 @@ -1197,7 +1267,11 @@ class Skill33(ActiveSkill): # 控制型异常状态抗性减少范围 : {value5}px data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{"data":data1}] + # 迁移前实现(保留对照): + # associate = [{"data":data1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 天罗地网 # fighter_female/brawler_female/d0cdaca82892e54097f22a1f60817048 @@ -1211,6 +1285,7 @@ class Skill34(ActiveSkill): 在决斗场中,不适用霸体和强制控制效果。\n """ name = "天罗地网" + ref = Ref.THROWWEB learnLv = 35 masterLv = 1 maxLv = 11 @@ -1281,6 +1356,7 @@ class Skill35(ActiveSkill): 攻击无法抓取的敌人时增加攻击力。\n """ name = "裂地飞沙" + ref = Ref.GROUNDKICK learnLv = 35 masterLv = 60 maxLv = 70 @@ -1355,6 +1431,7 @@ class Skill36(PassiveSkill): 攻击处于异常状态的敌人时,根据敌人的异常状态个数增加攻击力和冲击波范围。 (最多叠加3次)\n """ name = "狂 · 霸王拳" + ref = Ref.CRAZYMOUNT learnLv = 40 masterLv = 1 maxLv = 11 @@ -1394,7 +1471,13 @@ class Skill36(PassiveSkill): data11 = get_data(f'{prefix}/{uuid}', 11) - associate = [{'data':data2, 'type': '*power3', 'skills': ['伏虎霸王拳']},{'data': [i * 3 for i in data3], 'skills': ['伏虎霸王拳']},{'data':data9, 'type': '*power6', 'skills': ['伏虎霸王拳']}] + # 迁移前实现(保留对照): + # associate = [{'data':data2, 'type': '*power3', 'skills': ['伏虎霸王拳']},{'data': [i * 3 for i in data3], 'skills': ['伏虎霸王拳']},{'data':data9, 'type': '*power6', 'skills': ['伏虎霸王拳']}] + associate = [ + SkillEffect(attribute=Power(3), value=1 + Percent(LevelTable(data2)), skills=[Ref.MOUNT]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i * 3 for i in data3])), skills=[Ref.MOUNT]), + SkillEffect(attribute=Power(6), value=1 + Percent(LevelTable(data9)), skills=[Ref.MOUNT]), + ] def vp_1(self): """ @@ -1431,6 +1514,7 @@ class Skill37(ActiveSkill): 在地下城中,可以强制中断基本攻击并施放该技能。\n """ name = "毒雷引爆" + ref = Ref.VENOMMINE learnLv = 40 masterLv = 60 maxLv = 70 @@ -1501,6 +1585,7 @@ class Skill38(ActiveSkill): 在决斗场中,无法按跳跃键立即投掷炸药; 击中敌人时可以使敌人稍微浮空。\n """ name = "街头风暴" + ref = Ref.JUNKSPIN learnLv = 45 masterLv = 60 maxLv = 70 @@ -1580,6 +1665,7 @@ class Skill39(PassiveSkill): 可以通过鼠标右键设置开启/关闭喷射猛毒功能。\n """ name = "猛毒之血" + ref = Ref.POISONMASTERY learnLv = 48 masterLv = 40 maxLv = 50 @@ -1607,7 +1693,11 @@ class Skill39(PassiveSkill): # 中毒生成持续时间 : {value6}秒 data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{'data':data0}] + # 迁移前实现(保留对照): + # associate = [{'data':data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 死亡毒雾 # fighter_female/brawler_female/ca75c965f20a150f99f54155a37400df @@ -1622,6 +1712,7 @@ class Skill40(ActiveSkill): 毒雾中,增加毒王的攻击速度和移动速度; 敌人无法看见在毒雾内移动的毒王。\n """ name = "死亡毒雾" + ref = Ref.POISONMIST learnLv = 50 masterLv = 40 maxLv = 50 @@ -1674,6 +1765,7 @@ class Skill41(ActiveSkill): 攻击处于异常状态的敌人时,造成更大的伤害。 (最多叠加3次)\n """ name = "猛毒擒月炎" + ref = Ref.GRABEXPLOSIONEX learnLv = 60 masterLv = 40 maxLv = 50 @@ -1760,6 +1852,7 @@ class Skill42(ActiveSkill): 前方向键 : 长距离\n """ name = "爆碎砖袭" + ref = Ref.BLOCKBUSTEREX learnLv = 70 masterLv = 40 maxLv = 50 @@ -1845,6 +1938,7 @@ class Skill43(PassiveSkill): 施放时毒气扩散,探索后追击可抓取的最强敌人。\n """ name = "猛毒之伤" + ref = Ref.POISONSTUN learnLv = 75 masterLv = 40 maxLv = 50 @@ -1863,7 +1957,11 @@ class Skill43(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data':data2}] + # 迁移前实现(保留对照): + # associate = [{'data':data2}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # 连环毒爆弹 # fighter_female/brawler_female/faf9cd66281078b51be2ee0b0f6c5530 @@ -1877,6 +1975,7 @@ class Skill44(ActiveSkill): 对无法抓取的敌人不适用控制效果。\n """ name = "连环毒爆弹" + ref = Ref.POISONEXPLOSION learnLv = 75 masterLv = 40 maxLv = 50 @@ -1975,6 +2074,7 @@ class Skill45(ActiveSkill): 按向下键时会在原地施放。\n """ name = "毒龙轰天雷" + ref = Ref.DRAGONMINE learnLv = 80 masterLv = 40 maxLv = 50 @@ -2058,6 +2158,7 @@ class Skill46(PassiveSkill): 踢击只能对1个抓取的敌人造成伤害,爆炸会对范围内的所有敌人造成伤害。\n """ name = "秘制毒爆弹" + ref = Ref.POISONEXPLOSIONCUSTOM learnLv = 80 masterLv = 1 maxLv = 1 @@ -2076,13 +2177,22 @@ class Skill46(PassiveSkill): # 毒爆弹爆炸攻击时中毒攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {'data':data0,'type':'*power0', 'skills':['连环毒爆弹']}, + # {'data':data1,'type':'*power1', 'skills':['连环毒爆弹']}, + # {'data':data1,'type':'*power10', 'skills':['连环毒爆弹']}, + # {'data':data1,'type':'*power13', 'skills':['连环毒爆弹']}, + # {'data':data2,'type':'*power16', 'skills':['连环毒爆弹']}, + # {'data':data2,'type':'*power17', 'skills':['连环毒爆弹']} + # ] associate = [ - {'data':data0,'type':'*power0', 'skills':['连环毒爆弹']}, - {'data':data1,'type':'*power1', 'skills':['连环毒爆弹']}, - {'data':data1,'type':'*power10', 'skills':['连环毒爆弹']}, - {'data':data1,'type':'*power13', 'skills':['连环毒爆弹']}, - {'data':data2,'type':'*power16', 'skills':['连环毒爆弹']}, - {'data':data2,'type':'*power17', 'skills':['连环毒爆弹']} + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data0)), skills=[Ref.POISONEXPLOSION]), + SkillEffect(attribute=Power(1), value=1 + Percent(LevelTable(data1)), skills=[Ref.POISONEXPLOSION]), + SkillEffect(attribute=Power(10), value=1 + Percent(LevelTable(data1)), skills=[Ref.POISONEXPLOSION]), + SkillEffect(attribute=Power(13), value=1 + Percent(LevelTable(data1)), skills=[Ref.POISONEXPLOSION]), + SkillEffect(attribute=Power(16), value=1 + Percent(LevelTable(data2)), skills=[Ref.POISONEXPLOSION]), + SkillEffect(attribute=Power(17), value=1 + Percent(LevelTable(data2)), skills=[Ref.POISONEXPLOSION]), ] # 万毒噬心诀 @@ -2096,6 +2206,7 @@ class Skill47(ActiveSkill): 其他技能施放过程中可以使用[万毒噬心诀]。 使用时,会在没有准备动作及冲击波的情况下立即施放。\n """ name = "万毒噬心诀" + ref = Ref.POISONSNAKE learnLv = 85 masterLv = 40 maxLv = 50 @@ -2166,7 +2277,11 @@ class Skill47(ActiveSkill): mode = ['平x一轮'] - associate = [{"data":data10 }] + # 迁移前实现(保留对照): + # associate = [{"data":data10 }] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data10))), + ] def setMode(self, mode): if mode == '平x一轮': @@ -2186,6 +2301,7 @@ class Skill48(ActiveSkill): 前方向键 : 长距离\n """ name = "禁技 : 万毒蛇窟" + ref = Ref.SNAKECAVE learnLv = 85 masterLv = 1 maxLv = 1 @@ -2210,14 +2326,7 @@ class Skill48(ActiveSkill): hit2 = 8 dataType2 = EnumDamageType.ENCHANTPOISON - @property - def lv(self): - """技能等级""" - return self.char.GetSkillByName("万毒噬心诀").lv - - @lv.setter - def lv(self, value): - ... + level_source = Ref.POISONSNAKE # 身化万毒 # fighter_female/brawler_female/78b86e64fbb74c1db1b71c50a5ac21cd @@ -2232,6 +2341,7 @@ class Skill49(PassiveSkill): 发动[万毒噬心诀]后施放时,向前方投掷蛇形毒气。\n """ name = "身化万毒" + ref = Ref.POISONSPIRIT learnLv = 95 masterLv = 40 maxLv = 50 @@ -2248,7 +2358,11 @@ class Skill49(PassiveSkill): # [擒月炎]攻击可抓取敌人时的控制持续时间 : {value1}秒 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0 }] + # 迁移前实现(保留对照): + # associate = [{"data":data0 }] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 钻心毒爆 # fighter_female/brawler_female/f4a561e272cc434a4905b3aa0c0de090 @@ -2263,6 +2377,7 @@ class Skill50(ActiveSkill): 未命中敌人时,向地面下砸并引爆箱械。\n """ name = "钻心毒爆" + ref = Ref.PAINKILLER learnLv = 95 masterLv = 40 maxLv = 50 @@ -2355,6 +2470,7 @@ class Skill51(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "万毒噬心诀 : 毒龙吞天" + ref = Ref.SNAKECHAOS learnLv = 100 masterLv = 40 maxLv = 50 @@ -2439,4 +2555,4 @@ class classChange(Character): def load_skills(self): super().load_skills() - self.GetSkillByName("涂毒").enchantPoisonRatio = 10.21 - 1 + self.GetSkill(Ref.ENCHANTPOISON).enchantPoisonRatio = 10.21 - 1 diff --git a/backend/core/character/GF/fighter_female/grappler_female.py b/backend/core/character/GF/fighter_female/grappler_female.py index 0ab8d9d6..acd50256 100644 --- a/backend/core/character/GF/fighter_female/grappler_female.py +++ b/backend/core/character/GF/fighter_female/grappler_female.py @@ -1,6 +1,22 @@ #a7a059ebe9e6054c0644b40ef316d6e9 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + LevelTable, + Operation, + Percent, + ProfessionAttribute, + SkillAttribute, + SkillEffect, +) +from core.character.refs.fighter_female.grappler_female import GrapplerFemaleSkillRef as Ref + + +class GrapplerFemaleAttribute(ProfessionAttribute): + """本职业专用的最终效果属性;字段含义与技能实现保持一致。""" + USE_ADAPT = 'useAdapt' + """女柔道:是否启用被动调整后的技能形态。""" + prefix = "fighter_female/grappler_female/cn/skillDetail" @@ -13,6 +29,7 @@ class Skill0(ActiveSkill): 转职为柔道家后,技能类型变为独立攻击力。\n """ name = "上勾拳" + ref = Ref.LIFTUPPER cellPos = (3,1) learnLv = 1 masterLv = 10 @@ -41,6 +58,7 @@ class Skill1(ActiveSkill): 向敌人发出强威力的踢腿,可以踢飞敌人。\n """ name = "前踢" + ref = Ref.SINGLEKICK cellPos = (5,1) learnLv = 1 masterLv = 60 @@ -68,6 +86,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -91,6 +110,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -118,6 +138,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -159,6 +180,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -181,6 +203,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -204,6 +227,7 @@ class Skill7(ActiveSkill): 命中时引发冲击波,对周围敌人造成伤害。\n """ name = "下段踢" + ref = Ref.DAMAGELOWKICK cellPos = (2,2) learnLv = 5 masterLv = 60 @@ -239,6 +263,7 @@ class Skill8(ActiveSkill): 在决斗场中,转职为气功师后,增加分身的持续时间。\n """ name = "分身" + ref = Ref.KENSIN learnLv = 5 masterLv = 10 maxLv = 20 @@ -270,6 +295,7 @@ class Skill9(ActiveSkill): 此外,因受抓轰炮效果,可以攻击无法抓取的敌人,这时可以大幅击退敌人进行攻击。\n """ name = "背摔" + ref = Ref.SUPLEX cellPos = (6,2) learnLv = 5 masterLv = 60 @@ -308,6 +334,7 @@ class Skill10(ActiveSkill): [蹲伏]姿势中按攻击键,可以用肩尖撞击敌人; 经过一定时间或按跳跃键可以中断蹲伏状态。\n """ name = "蹲伏" + ref = Ref.CROUCH cellPos = (8,3) learnLv = 10 masterLv = 1 @@ -335,6 +362,7 @@ class Skill11(PassiveSkill): 被攻击时,有一定几率进入霸体状态。\n """ name = "钢筋铁骨" + ref = Ref.IRONSKIN cellPos = (5,3) learnLv = 10 masterLv = 50 @@ -363,6 +391,7 @@ class Skill12(ActiveSkill): 转职为街霸后,可中断基本攻击使用。\n """ name = "抛沙" + ref = Ref.THROWSAND cellPos = (3,3) learnLv = 10 masterLv = 60 @@ -404,6 +433,7 @@ class Skill13(ActiveSkill): 可以连续对敌人进行一定次数的踩踏,技能的冷却时间从最后一次踩踏结束落地时开始计算。\n """ name = "鹰踏" + ref = Ref.STOMP cellPos = (7,3) learnLv = 10 masterLv = 60 @@ -437,6 +467,7 @@ class Skill14(ActiveSkill): 学习[疾风连击]后可再追加第3、 第4次攻击。\n """ name = "疾风追击" + ref = Ref.DASHAFTERDASH cellPos = (9,3) learnLv = 10 masterLv = 60 @@ -474,6 +505,7 @@ class Skill15(ActiveSkill): 转职为柔道家后,可以强制中断基本攻击并立即施放[金刚碎],并且还可以中断[金刚碎]并立即施放[霹雳肘击]。\n """ name = "金刚碎" + ref = Ref.EARTHBREAK cellPos = (1,3) learnLv = 10 masterLv = 60 @@ -509,6 +541,7 @@ class Skill16(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -536,6 +569,7 @@ class Skill17(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -563,6 +597,7 @@ class Skill18(ActiveSkill): 转职为气功师后,可以强制中断基本攻击动作施放,并大幅度减少冷却时间。\n """ name = "念气波" + ref = Ref.ENERGYBALL learnLv = 15 masterLv = 60 maxLv = 70 @@ -604,6 +639,7 @@ class Skill19(PassiveSkill): 使用[背摔]、 [抛投]、 [霹雳肘击]、 [空绞锤]、 [螺旋彗星落]、 [地狱摇篮]、 [裂石破天]、 [末日风暴]、 [死亡摇篮]、 [末日摇篮]技能时,可以增加冲击波和攻击范围。\n """ name = "摔技强化" + ref = Ref.SUPLEXSUBPOWERUP cellPos = (7,4) learnLv = 15 masterLv = 10 @@ -620,7 +656,11 @@ class Skill19(PassiveSkill): # 周围攻击范围比率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 抛投 # fighter_female/grappler_female/c27418ae613c647527200a7ca17d97fd @@ -634,6 +674,7 @@ class Skill20(ActiveSkill): 在决斗场中,技能等级越高,抓取持续时间越长。\n """ name = "抛投" + ref = Ref.THROWENEMY cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -669,6 +710,7 @@ class Skill21(ActiveSkill): 使[背摔]、 [抛投]、 [霹雳肘击]、 [空绞锤]、 [螺旋彗星落]、 [地狱摇篮]、 [裂石破天]、 [末日风暴]、 [死亡摇篮]、 [末日摇篮]、 [风暴之舞]、 [苍宇彗星落]、 [送葬舞步]的技能抓取动作出现霸体判定,并且抓取命中率变成100%,同时还增加基本攻击和抓取类技能的攻击力,效果持续一定时间。\n """ name = "暴力抓取" + ref = Ref.DEFINITEGRAB cellPos = (4,4) learnLv = 15 masterLv = 10 @@ -695,6 +737,7 @@ class Skill22(PassiveSkill): 滑行抓取敌人时,可以用方向键进行上下滑行; 技能等级越高,滑行速度越快。\n """ name = "滑行抓取" + ref = Ref.SLIDEGRAB cellPos = (2,4) learnLv = 15 masterLv = 1 @@ -720,6 +763,7 @@ class Skill23(PassiveSkill): 抓轰炮的攻击力相当于各技能的抓起攻击力总和。\n """ name = "抓轰炮" + ref = Ref.GRABCANNON cellPos = (1,4) learnLv = 15 masterLv = 1 @@ -741,6 +785,7 @@ class Skill24(PassiveSkill): 攻击力增加的技能 : [背摔]、 [抛投]、 [霹雳肘击]、 [空绞锤]、 [螺旋彗星落]、 [地狱摇篮]、 [裂石破天]、 [末日风暴]、 [死亡摇篮]、 [末日摇篮]、 [风暴之舞]、 [苍宇彗星落]、 [送葬舞步]、 [女皇时代·辉煌舞台]。\n """ name = "强力抱摔" + ref = Ref.BACKSUPLEX cellPos = (6,5) learnLv = 20 masterLv = 1 @@ -757,7 +802,11 @@ class Skill24(PassiveSkill): # 物理暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0,"skills":["背摔","抛投","霹雳肘击","空绞锤","螺旋彗星落","地狱摇篮","裂石破天","末日风暴","死亡摇篮","末日摇篮","风暴之舞","苍宇彗星落","送葬舞步","女皇时代·辉煌舞台"]}]# noqa: E501 + # 迁移前实现(保留对照): + # associate = [{"data":data0,"skills":["背摔","抛投","霹雳肘击","空绞锤","螺旋彗星落","地狱摇篮","裂石破天","末日风暴","死亡摇篮","末日摇篮","风暴之舞","苍宇彗星落","送葬舞步","女皇时代·辉煌舞台"]}]# noqa: E501 + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.SUPLEX, Ref.THROWENEMY, Ref.HOLDUP, Ref.LEGSUPLEX, Ref.SPIRE, Ref.SUPLEXCYCLONE, Ref.WILDCANNONSPIKE, Ref.TYPHOON, Ref.SUPLEXCYCLONEEX, Ref.ELBOWTHROW, Ref.TORBELLINO, Ref.HURRICANESUPERSUPLEX, Ref.SHININGWINGSFLAP, Ref.FINALEOFTHEQUEEN]), + ] # 折颈 # fighter_female/grappler_female/ecc23c980ea71450c0ad0c3fd232f329 @@ -769,6 +818,7 @@ class Skill25(ActiveSkill): 在决斗场中,命中时使敌人浮空并强控敌人,且技能等级越高,强控时间越长\n """ name = "折颈" + ref = Ref.PUNCHAFTERRETURN cellPos = (4,5) learnLv = 20 masterLv = 60 @@ -802,6 +852,7 @@ class Skill26(PassiveSkill): 施放[疾风追击]时,可以向敌人发出第3、 4击。\n """ name = "疾风连击" + ref = Ref.DASHAFTERDASHEXTENSION cellPos = (9,5) learnLv = 20 masterLv = 1 @@ -830,6 +881,7 @@ class Skill27(ActiveSkill): 消耗最大可使用次数后,一段时间后会自动恢复。\n """ name = "无情抓取" + ref = Ref.CHAINCONNECTION cellPos = (1,5) learnLv = 20 masterLv = 1 @@ -858,6 +910,7 @@ class Skill28(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -883,6 +936,7 @@ class Skill29(ActiveSkill): 若前冲时使用,则可以边向前滑行边蓄气。\n """ name = "野蛮冲撞" + ref = Ref.SHOULDERTACKLE cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -912,6 +966,7 @@ class Skill30(ActiveSkill): 转职成为散打时,可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "旋风腿" + ref = Ref.WHIRLWINDKICK cellPos = (9,7) learnLv = 30 masterLv = 60 @@ -942,6 +997,7 @@ class Skill31(ActiveSkill): 决斗场中无法在[后跳]中施放。\n """ name = "空绞锤" + ref = Ref.LEGSUPLEX cellPos = (8,7) learnLv = 30 masterLv = 60 @@ -977,6 +1033,7 @@ class Skill32(ActiveSkill): 施放后僵直时间较长。\n """ name = "霹雳肘击" + ref = Ref.HOLDUP cellPos = (6,7) learnLv = 30 masterLv = 60 @@ -1011,6 +1068,7 @@ class Skill33(ActiveSkill): 抓轰炮发动后,在旋转中强控敌人后强力推开敌人。\n """ name = "螺旋彗星落" + ref = Ref.SPIRE cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1071,6 +1129,7 @@ class Skill34(PassiveSkill): [空绞锤] : 被向下捶击击倒的敌人更久地躺在地上。\n """ name = "格斗专精" + ref = Ref.TECHNICIANGRAPPLING cellPos = (4,8) learnLv = 35 masterLv = 1 @@ -1096,6 +1155,7 @@ class Skill35(ActiveSkill): [旋风腿]、 [野蛮冲撞]、 [空绞锤]、 [裂石破天]、 [旋风轰击]、 [死亡摇篮] (随机应变)、 [风暴之舞]、 [苍宇彗星落] (随机应变)、 [送葬舞步]、 [女皇时代·辉煌舞台]\n """ name = "霹雳冲击" + ref = Ref.JOINTSMASH cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -1155,6 +1215,7 @@ class Skill36(ActiveSkill): [旋风腿]、 [野蛮冲撞]、 [空绞锤]、 [裂石破天]、 [旋风轰击]、 [死亡摇篮] (随机应变)、 [风暴之舞]、 [苍宇彗星落] (随机应变)、 [送葬舞步]、 [女皇时代·辉煌舞台]\n """ name = "地狱摇篮" + ref = Ref.SUPLEXCYCLONE cellPos = (7,9) learnLv = 40 masterLv = 60 @@ -1218,6 +1279,7 @@ class Skill37(ActiveSkill): 学习后,抓取判定消失,用力锤击地面击起岩石,对范围内敌人造成大量伤害。 落地前或落地时,输入向后或下方向键,可以减少下降角度。\n """ name = "裂石破天" + ref = Ref.WILDCANNONSPIKE cellPos = (8,10) learnLv = 45 masterLv = 60 @@ -1303,6 +1365,7 @@ class Skill38(PassiveSkill): 将抓取动作提升到极致,增加暴风眼的基本攻击、 抓取类技能的攻击力、 物理暴击率、 命中率和抓取时的回避率。\n """ name = "抓取奥义" + ref = Ref.GRABMASTERY cellPos = (4,11) learnLv = 48 masterLv = 30 @@ -1323,7 +1386,11 @@ class Skill38(PassiveSkill): # 抓取准备动作时回避率增加 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 末日风暴 # fighter_female/grappler_female/d296043df164385a14cb973c8c7c4d07 @@ -1336,6 +1403,7 @@ class Skill39(ActiveSkill): 旋转中连按键时,增加旋转速度、 减少多段攻击间隔; 按技能键或键时,立即发动最后一击。\n """ name = "末日风暴" + ref = Ref.TYPHOON cellPos = (7,11) learnLv = 50 masterLv = 40 @@ -1377,6 +1445,7 @@ class Skill40(ActiveSkill): 空中也可施放技能,此时立即开始旋转。\n """ name = "旋风轰击" + ref = Ref.SPINNINGSPLASH cellPos = (5,12) learnLv = 60 masterLv = 40 @@ -1434,6 +1503,7 @@ class Skill41(ActiveSkill): 学习后,抓取判定消失,旋转并腾空跳起攻击敌人。 按下方向键可以在原地发动攻击力。 可以在空中使用。\n """ name = "死亡摇篮" + ref = Ref.SUPLEXCYCLONEEX cellPos = (7,13) learnLv = 70 masterLv = 40 @@ -1507,6 +1577,7 @@ class Skill42(PassiveSkill): [背摔]、 [抛投]、 [霹雳肘击]、 [空绞锤]、 [螺旋彗星落]、 [裂石破天]、 [末日风暴]、 [死亡摇篮]、 [末日摇篮]、 [风暴之舞]、 [苍宇彗星落]、 [送葬舞步]、 [女皇时代·辉煌舞台]\n """ name = "极手奥义" + ref = Ref.CHAINGRAB cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1524,7 +1595,11 @@ class Skill42(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 效果叠加次数上限 : {value2}次 data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 末日摇篮 # fighter_female/grappler_female/fc458e449ee00b01dbf88d09aae65462 @@ -1539,6 +1614,7 @@ class Skill43(ActiveSkill): 学习后,抓取判定删除,旋转攻击并吸附周围敌人,然后发动最后一击。\n """ name = "末日摇篮" + ref = Ref.ELBOWTHROW cellPos = (4,13) learnLv = 75 masterLv = 40 @@ -1630,6 +1706,7 @@ class Skill44(PassiveSkill): 变更的技能 : [裂石破天]、 [死亡摇篮]、 [末日摇篮]、 [苍宇彗星落]\n """ name = "随机应变" + ref = Ref.TURNHEEL cellPos = (10,13) learnLv = 75 masterLv = 1 @@ -1647,8 +1724,12 @@ class Skill44(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # [苍宇彗星落]攻击力增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {"type":"+useAdapt","skills":["裂石破天","死亡摇篮","末日摇篮","苍宇彗星落"],"data":[0,100]} + # ] associate = [ - {"type":"+useAdapt","skills":["裂石破天","死亡摇篮","末日摇篮","苍宇彗星落"],"data":[0,100]} + SkillEffect(attribute=GrapplerFemaleAttribute.USE_ADAPT, operation=Operation.ADD, value=Percent(LevelTable([0, 100])), skills=[Ref.WILDCANNONSPIKE, Ref.SUPLEXCYCLONEEX, Ref.ELBOWTHROW, Ref.HURRICANESUPERSUPLEX]), ] # 风暴之舞 @@ -1660,6 +1741,7 @@ class Skill45(ActiveSkill): 可以在空中使用。\n """ name = "风暴之舞" + ref = Ref.TORBELLINO cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1724,6 +1806,7 @@ class Skill46(ActiveSkill): 学习后抓取判定消失,跳起强力下砸攻击敌人。 在空中也可以施放。\n """ name = "苍宇彗星落" + ref = Ref.HURRICANESUPERSUPLEX cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1779,6 +1862,7 @@ class Skill47(ActiveSkill): 柔道家旋转攻击敌人,莱茜突进后使出金臂勾,然后露西对敌人使出飞身压。\n """ name = "送葬舞步" + ref = Ref.SHININGWINGSFLAP cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1823,6 +1907,7 @@ class Skill48(PassiveSkill): 准备动作时按方向键可以调整落下角度。\n """ name = "光芒之翼" + ref = Ref.STABLETHEULTIMATE cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1841,7 +1926,11 @@ class Skill48(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 露西飞身踢攻击力 : [背摔]攻击力的{value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 女皇时代·辉煌舞台 # fighter_female/grappler_female/c91a62dc0a18360acf5031ac0ebf09f5 @@ -1859,6 +1948,7 @@ class Skill49(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "女皇时代·辉煌舞台" + ref = Ref.FINALEOFTHEQUEEN cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/fighter_female/nenmaster_female.py b/backend/core/character/GF/fighter_female/nenmaster_female.py index a54ad494..3ee3b9b8 100644 --- a/backend/core/character/GF/fighter_female/nenmaster_female.py +++ b/backend/core/character/GF/fighter_female/nenmaster_female.py @@ -1,6 +1,17 @@ # a7a059ebe9e6054c0644b40ef316d6e9 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + Equals, + LevelTable, + Operation, + Percent, + Power, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.fighter_female.nenmaster_female import NenmasterFemaleSkillRef as Ref prefix = "fighter_female/nenmaster_female/cn/skillDetail" @@ -14,6 +25,7 @@ class Skill0(ActiveSkill): 转职为柔道家后,技能类型变为独立攻击力。\n """ name = "上勾拳" + ref = Ref.LIFTUPPER learnLv = 1 masterLv = 10 maxLv = 20 @@ -43,6 +55,7 @@ class Skill1(PassiveSkill): """ name = '光之亲和' + ref = Ref.LIGHTFRIENDSHIP cellPos = (9,1) learnLv = 1 masterLv = 1 @@ -68,6 +81,7 @@ class Skill2(PassiveSkill): """ name = '念气感知' + ref = Ref.BLINDTOLERANCEUP cellPos = (8,1) learnLv = 1 masterLv = 1 @@ -91,6 +105,7 @@ class Skill3(ActiveSkill): 向敌人发出强威力的踢腿,可以踢飞敌人。\n """ name = "前踢" + ref = Ref.SINGLEKICK learnLv = 1 masterLv = 60 maxLv = 70 @@ -117,6 +132,7 @@ class Skill4(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -141,6 +157,7 @@ class Skill5(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -159,7 +176,11 @@ class Skill5(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['念兽 : 龙虎啸']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['念兽 : 龙虎啸']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.NENMONSTERWHITETIGER]), + ] # 受身蹲伏 # fighter_female/nenmaster_female/ce26c6b69d02a440a81b552bec94f03b @@ -169,6 +190,7 @@ class Skill6(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -210,6 +232,7 @@ class Skill7(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -232,6 +255,7 @@ class Skill8(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -255,6 +279,7 @@ class Skill9(ActiveSkill): 命中时引发冲击波,对周围敌人造成伤害。\n """ name = "下段踢" + ref = Ref.DAMAGELOWKICK learnLv = 5 masterLv = 60 maxLv = 70 @@ -290,6 +315,7 @@ class Skill10(ActiveSkill): """ name = '分身' + ref = Ref.KENSIN cellPos = (4,2) learnLv = 5 masterLv = 10 @@ -323,6 +349,7 @@ class Skill11(ActiveSkill): 此外,因受抓轰炮效果,可以攻击无法抓取的敌人,这时可以大幅击退敌人进行攻击。\n """ name = "背摔" + ref = Ref.SUPLEX learnLv = 5 masterLv = 60 maxLv = 70 @@ -360,6 +387,7 @@ class Skill12(ActiveSkill): [蹲伏]姿势中按攻击键,可以用肩尖撞击敌人; 经过一定时间或按跳跃键可以中断蹲伏状态。\n """ name = "蹲伏" + ref = Ref.CROUCH learnLv = 10 masterLv = 1 maxLv = 11 @@ -387,6 +415,7 @@ class Skill13(PassiveSkill): 被攻击时,有一定几率进入霸体状态。\n """ name = "钢筋铁骨" + ref = Ref.IRONSKIN learnLv = 10 masterLv = 50 maxLv = 60 @@ -415,6 +444,7 @@ class Skill14(ActiveSkill): 转职为街霸后,可中断基本攻击使用。\n """ name = "抛沙" + ref = Ref.THROWSAND learnLv = 10 masterLv = 60 maxLv = 70 @@ -455,6 +485,7 @@ class Skill15(ActiveSkill): 可以连续对敌人进行一定次数的踩踏,技能的冷却时间从最后一次踩踏结束落地时开始计算。\n """ name = "鹰踏" + ref = Ref.STOMP learnLv = 10 masterLv = 60 maxLv = 70 @@ -486,6 +517,7 @@ class Skill16(ActiveSkill): 学习[疾风连击]后可再追加第3、 第4次攻击。\n """ name = "疾风追击" + ref = Ref.DASHAFTERDASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -519,6 +551,7 @@ class Skill17(ActiveSkill): 转职为柔道家后,可以强制中断基本攻击并立即施放[金刚碎],并且还可以中断[金刚碎]并立即施放[霹雳肘击]。\n """ name = "金刚碎" + ref = Ref.EARTHBREAK learnLv = 10 masterLv = 60 maxLv = 70 @@ -553,6 +586,7 @@ class Skill18(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -580,6 +614,7 @@ class Skill19(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -605,6 +640,7 @@ class Skill20(PassiveSkill): 将[背摔]升级为[雷霆背摔]。用[背摔]攻击敌人后会自动落下闪电追击敌人,并有一定几率使敌人进入感电状态。\n """ name = "雷霆背摔" + ref = Ref.THUNDERSUPLEX learnLv = 15 masterLv = 60 maxLv = 70 @@ -639,6 +675,7 @@ class Skill21(ActiveSkill): """ name = '念气波' + ref = Ref.ENERGYBALL cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -691,6 +728,7 @@ class Skill22(ActiveSkill): """ name = '光之兵刃' + ref = Ref.LIGHTENCHANTWEAPON cellPos = (5,4) learnLv = 15 masterLv = 10 @@ -722,6 +760,7 @@ class Skill23(ActiveSkill): """ name = '气玉弹' + ref = Ref.NENPRISON cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -757,6 +796,7 @@ class Skill24(ActiveSkill): """ name = '烈日气息' + ref = Ref.LIGHTTOLERANCEUP cellPos = (7,5) learnLv = 20 masterLv = 10 @@ -801,6 +841,7 @@ class Skill25(PassiveSkill): """ name = '幻影爆碎' + ref = Ref.ILLUSIONBOMB cellPos = (4,5) learnLv = 20 masterLv = 60 @@ -820,7 +861,12 @@ class Skill25(PassiveSkill): # 学习念气归元后搜寻敌人范围比率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': data0, 'skills': ['分身'], 'ratio': 1}, {'type': '+cd', 'data': [0] + [3] * maxLv, 'skills': ['分身'], 'ratio': 1}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0, 'skills': ['分身'], 'ratio': 1}, {'type': '+cd', 'data': [0] + [3] * maxLv, 'skills': ['分身'], 'ratio': 1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + LevelTable(data0), skills=[Ref.KENSIN]), + SkillEffect(attribute=SkillAttribute.CD, operation=Operation.ADD, value=LevelTable([0] + [3] * maxLv), skills=[Ref.KENSIN]), + ] # 蓄念炮 # fighter_female/nenmaster_female/c7bf7ccab413009640e65ca6f2f0263a @@ -831,6 +877,7 @@ class Skill26(PassiveSkill): """ name = '蓄念炮' + ref = Ref.ENERGYBALLCHARGE cellPos = (1,5) learnLv = 20 masterLv = 1 @@ -852,7 +899,11 @@ class Skill26(PassiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 增加念气波发射速度 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'type': '*power0', 'data': data0, 'skills': ['念气波']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*power0', 'data': data0, 'skills': ['念气波']}] + associate = [ + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data0)), skills=[Ref.ENERGYBALL]), + ] # 疾风连击 # fighter_female/nenmaster_female/8572675ec6a1f50b6eff6a867376c2de @@ -862,6 +913,7 @@ class Skill27(PassiveSkill): 施放[疾风追击]时,可以向敌人发出第3、 4击。\n """ name = "疾风连击" + ref = Ref.DASHAFTERDASHEXTENSION learnLv = 20 masterLv = 1 maxLv = 1 @@ -883,6 +935,7 @@ class Skill28(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -908,6 +961,7 @@ class Skill29(ActiveSkill): """ name = '念气罩' + ref = Ref.NENGUARD cellPos = (2,6) learnLv = 25 masterLv = 1 @@ -939,6 +993,7 @@ class Skill30(ActiveSkill): """ name = '念雷破' + ref = Ref.THUNDERRUSH cellPos = (6,6) learnLv = 25 masterLv = 60 @@ -974,6 +1029,7 @@ class Skill31(ActiveSkill): """ name = '念气环绕' + ref = Ref.SPIRALNEN cellPos = (3,7) learnLv = 30 masterLv = 10 @@ -1002,9 +1058,13 @@ class Skill31(ActiveSkill): # 学习念气归元后,念气珠爆炸大小比率 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) + # 迁移前实现(保留对照): + # associate = [ + # # 总共两个珠子 + # {'type': '*skillDamage', 'data': data3, 'ratio': 100 / 2} + # ] associate = [ - # 总共两个珠子 - {'type': '*skillDamage', 'data': data3, 'ratio': 100 / 2} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + (LevelTable(data3) / (100 / 2))), ] def getSkillCD(self, mode=None): @@ -1022,6 +1082,7 @@ class Skill32(ActiveSkill): """ name = '旋风腿' + ref = Ref.WHIRLWINDKICK cellPos = (7,7) learnLv = 30 masterLv = 60 @@ -1050,6 +1111,7 @@ class Skill33(ActiveSkill): """ name = '念兽螺旋波' + ref = Ref.SPIRALDRAGONWAVE cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -1095,6 +1157,7 @@ class Skill34(ActiveSkill): """ name = '狮子吼' + ref = Ref.SAJAHU cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -1154,6 +1217,7 @@ class Skill35(ActiveSkill): """ name = '螺旋念气场' + ref = Ref.KIKOUKEN cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -1218,6 +1282,7 @@ class Skill36(ActiveSkill): """ name = '念兽 : 龙虎啸' + ref = Ref.NENMONSTERWHITETIGER cellPos = (5,9) learnLv = 40 masterLv = 10 @@ -1279,7 +1344,11 @@ class Skill36(ActiveSkill): # 队员魔法防御力增加 : {value16} data16 = get_data(f'{prefix}/{uuid}', 16) - associate = [{'type': '*skillDamage', 'data': data12}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data12}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data12))), + ] # 狂龙升天破 # fighter_female/nenmaster_female/dbf8b30c7057032af0d68fcfa289fdae @@ -1291,6 +1360,7 @@ class Skill37(ActiveSkill): """ name = '狂龙升天破' + ref = Ref.SOARINGLIGHTDRAGON cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1344,6 +1414,7 @@ class Skill38(PassiveSkill): """ name = '乱舞 · 千叶花' + ref = Ref.NENSHIELD cellPos = (4,11) learnLv = 48 masterLv = 40 @@ -1368,7 +1439,11 @@ class Skill38(PassiveSkill): # 重新盛开所需时间 : {value5}秒 data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'type': '*skillDamage', 'data': data1}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 千莲怒放 # fighter_female/nenmaster_female/51a08fd0c90f0a5276cd552047fac93d @@ -1384,6 +1459,7 @@ class Skill39(ActiveSkill): """ name = '千莲怒放' + ref = Ref.NENFLOWER cellPos = (3,11) learnLv = 50 masterLv = 40 @@ -1434,6 +1510,7 @@ class Skill40(PassiveSkill): """ name = '究极念气罩' + ref = Ref.NENGUARDEX cellPos = (2,12) learnLv = 60 masterLv = 1 @@ -1466,6 +1543,7 @@ class Skill41(ActiveSkill): """ name = '奔雷掌' + ref = Ref.LIGHTDRAGONTHIRTEEN cellPos = (5,12) learnLv = 60 masterLv = 40 @@ -1529,6 +1607,7 @@ class Skill42(ActiveSkill): """ name = '狂狮怒吼' + ref = Ref.SAJAHUEX cellPos = (6,13) learnLv = 70 masterLv = 40 @@ -1580,10 +1659,14 @@ class Skill42(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '*skillRation', 'data': [0] + [-33] * self.maxLv, 'skills': ['狮子吼']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-33] * self.maxLv, 'skills': ['狮子吼']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-33] * maxLv)), skills=[Ref.SAJAHU], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 念花守心 # fighter_female/nenmaster_female/547ab2b2bd860d3e37355a9cfbc1077c @@ -1601,6 +1684,7 @@ class Skill43(PassiveSkill): """ name = '念花守心' + ref = Ref.FALLINGFLOWER cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1624,7 +1708,11 @@ class Skill43(PassiveSkill): data4 = get_data(f'{prefix}/{uuid}', 4) # 分身生成距离减少率 : 50% - associate = [{'type': '*skillDamage', 'data': data1}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 分身生成距离减少率 : 50% # 击电奔星 @@ -1638,6 +1726,7 @@ class Skill44(ActiveSkill): """ name = '击电奔星' + ref = Ref.SAINTILLUSION cellPos = (4,13) learnLv = 75 masterLv = 40 @@ -1694,6 +1783,7 @@ class Skill45(ActiveSkill): """ name = '聚能念气炮' + ref = Ref.ABSORBENERGYBALL cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1748,6 +1838,7 @@ class Skill46(ActiveSkill): """ name = '念帝旋天破' + ref = Ref.NENOFBRILLIANCE cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1791,6 +1882,7 @@ class Skill47(PassiveSkill): """ name = '念气归元' + ref = Ref.INSTILWILLTONEN cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1811,7 +1903,11 @@ class Skill47(PassiveSkill): # [念气环绕]爆炸攻击力 : 每个念气珠攻击力的400% # 念气珠发射后再次生成间隔 : {value3}秒 data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 天雷分身步 # fighter_female/nenmaster_female/85f7c810ad503790e8626439fe936d56 @@ -1823,6 +1919,7 @@ class Skill48(ActiveSkill): """ name = '天雷分身步' + ref = Ref.SKYTHUNDERSTEP cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1863,6 +1960,7 @@ class Skill49(ActiveSkill): """ name = '念印幻流破' + ref = Ref.DOUBLELIGHTNINGDRAGON cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/fighter_female/striker_female.py b/backend/core/character/GF/fighter_female/striker_female.py index 91d08f83..f658136f 100644 --- a/backend/core/character/GF/fighter_female/striker_female.py +++ b/backend/core/character/GF/fighter_female/striker_female.py @@ -1,6 +1,15 @@ #a7a059ebe9e6054c0644b40ef316d6e9 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + Equals, + LevelTable, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.fighter_female.striker_female import StrikerFemaleSkillRef as Ref prefix = "fighter_female/striker_female/cn/skillDetail" @@ -13,6 +22,7 @@ class Skill0(ActiveSkill): 转职为柔道家后,技能类型变为独立攻击力。\n """ name = "上勾拳" + ref = Ref.LIFTUPPER learnLv = 1 masterLv = 10 maxLv = 20 @@ -41,6 +51,7 @@ class Skill1(ActiveSkill): 向敌人发出强威力的踢腿,可以踢飞敌人。\n """ name = "前踢" + ref = Ref.SINGLEKICK learnLv = 1 masterLv = 60 maxLv = 70 @@ -67,6 +78,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -90,6 +102,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -117,6 +130,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -158,6 +172,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -180,6 +195,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -203,6 +219,7 @@ class Skill7(ActiveSkill): 命中时引发冲击波,对周围敌人造成伤害。\n """ name = "下段踢" + ref = Ref.DAMAGELOWKICK cellPos = (2,2) learnLv = 5 masterLv = 60 @@ -238,6 +255,7 @@ class Skill8(ActiveSkill): 在决斗场中,转职为气功师后,增加分身的持续时间。\n """ name = "分身" + ref = Ref.KENSIN learnLv = 5 masterLv = 10 maxLv = 20 @@ -269,6 +287,7 @@ class Skill9(ActiveSkill): 此外,因受抓轰炮效果,可以攻击无法抓取的敌人,这时可以大幅击退敌人进行攻击。\n """ name = "背摔" + ref = Ref.SUPLEX cellPos = (6,2) learnLv = 5 masterLv = 60 @@ -307,6 +326,7 @@ class Skill10(ActiveSkill): [蹲伏]姿势中按攻击键,可以用肩尖撞击敌人; 经过一定时间或按跳跃键可以中断蹲伏状态。\n """ name = "蹲伏" + ref = Ref.CROUCH cellPos = (6,3) learnLv = 10 masterLv = 1 @@ -333,6 +353,7 @@ class Skill11(PassiveSkill): 被攻击时,有一定几率进入霸体状态。\n """ name = "钢筋铁骨" + ref = Ref.IRONSKIN cellPos = (5,3) learnLv = 10 masterLv = 50 @@ -361,6 +382,7 @@ class Skill12(ActiveSkill): 转职为街霸后,可中断基本攻击使用。\n """ name = "抛沙" + ref = Ref.THROWSAND cellPos = (3,3) learnLv = 10 masterLv = 60 @@ -402,6 +424,7 @@ class Skill13(ActiveSkill): 可以连续对敌人进行一定次数的踩踏,技能的冷却时间从最后一次踩踏结束落地时开始计算。\n """ name = "鹰踏" + ref = Ref.STOMP cellPos = (7,3) learnLv = 10 masterLv = 60 @@ -434,6 +457,7 @@ class Skill14(ActiveSkill): 学习[疾风连击]后可再追加第3、 第4次攻击。\n """ name = "疾风追击" + ref = Ref.DASHAFTERDASH cellPos = (9,3) learnLv = 10 masterLv = 60 @@ -471,6 +495,7 @@ class Skill15(ActiveSkill): 转职为柔道家后,可以强制中断基本攻击并立即施放[金刚碎],并且还可以中断[金刚碎]并立即施放[霹雳肘击]。\n """ name = "金刚碎" + ref = Ref.EARTHBREAK cellPos = (1,3) learnLv = 10 masterLv = 60 @@ -506,6 +531,7 @@ class Skill16(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -533,6 +559,7 @@ class Skill17(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -560,6 +587,7 @@ class Skill18(ActiveSkill): 转职为气功师后,可以强制中断基本攻击动作施放,并大幅度减少冷却时间。\n """ name = "念气波" + ref = Ref.ENERGYBALL learnLv = 15 masterLv = 60 maxLv = 70 @@ -601,6 +629,7 @@ class Skill19(PassiveSkill): 减少除[武神强踢]、 [极尽 : 霸皇断空拳]、 [陨星灭天击]之外的散打技能的冷却时间。\n """ name = "拳套掌握" + ref = Ref.EQUIPBOXINGGLOVE cellPos = (1,4) learnLv = 15 masterLv = 10 @@ -614,7 +643,11 @@ class Skill19(PassiveSkill): # 冷却时间减少率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0,"type":"*cdReduce","exceptSkills":["武神强踢","极尽 : 霸皇断空拳","陨星灭天击"]}] + # 迁移前实现(保留对照): + # associate = [{"data":data0,"type":"*cdReduce","exceptSkills":["武神强踢","极尽 : 霸皇断空拳","陨星灭天击"]}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data0)), except_skills=[Ref.STRONGESTLOWKICK, Ref.FINALHEAVEN, Ref.BLOWTODESTRUCTION]), + ] # 强拳 # fighter_female/striker_female/dcd536f1674630f01fc9667bb202b851 @@ -625,6 +658,7 @@ class Skill20(ActiveSkill): 在决斗场中施放时,减少攻击速度。\n """ name = "强拳" + ref = Ref.SLOWDOWNPOWERUP cellPos = (5,4) learnLv = 15 masterLv = 20 @@ -656,6 +690,7 @@ class Skill21(ActiveSkill): 三觉后,攻击命中时引发冲击波,对周围的敌人造成相同的伤害。\n """ name = "崩拳" + ref = Ref.DASHPUNCH cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -691,6 +726,7 @@ class Skill22(ActiveSkill): 可以使自身增加物理/魔法防御力和体力,而且被攻击后不会倒地,但仍会受到伤害,效果持续一定时间。\n """ name = "霸体护甲" + ref = Ref.SUPERARMOR cellPos = (3,5) learnLv = 20 masterLv = 20 @@ -721,6 +757,7 @@ class Skill23(PassiveSkill): 施放[疾风追击]时,可以向敌人发出第3、 4击。\n """ name = "疾风连击" + ref = Ref.DASHAFTERDASHEXTENSION cellPos = (9,5) learnLv = 20 masterLv = 1 @@ -741,6 +778,7 @@ class Skill24(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -764,6 +802,7 @@ class Skill25(ActiveSkill): 按前方向键,可以滑行得更远进行攻击。\n """ name = "铁山靠" + ref = Ref.SHOULDERCHARGE cellPos = (3,6) learnLv = 25 masterLv = 60 @@ -797,6 +836,7 @@ class Skill26(ActiveSkill): 攻击成功时产生冲击波,对周围敌人造成伤害。\n """ name = "碎骨" + ref = Ref.CRASHLOWKICK cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -842,6 +882,7 @@ class Skill27(PassiveSkill): 在决斗场中,不会增加基本攻击力和技能攻击力。\n """ name = "弱点感知" + ref = Ref.AIMVITALPOINT cellPos = (5,7) learnLv = 30 masterLv = 10 @@ -859,7 +900,11 @@ class Skill27(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 基本攻击力和转职技能攻击力增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{"data":data2}] + # 迁移前实现(保留对照): + # associate = [{"data":data2}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # 旋风腿 # fighter_female/striker_female/202edb928046f4fa6dedf6337377efd5 @@ -871,6 +916,7 @@ class Skill28(ActiveSkill): 转职成为散打时,可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "旋风腿" + ref = Ref.WHIRLWINDKICK cellPos = (7,7) learnLv = 30 masterLv = 60 @@ -904,6 +950,7 @@ class Skill29(PassiveSkill): 在决斗场中有起始冷却时间,经过一定时间后自动激活。 技能攻击力增加率效果仅适用于柔化后使用的技能。\n """ name = "柔化肌肉" + ref = Ref.MUSCLESHIFT cellPos = (3,7) learnLv = 30 masterLv = 5 @@ -927,7 +974,11 @@ class Skill29(PassiveSkill): data4 = get_data(f'{prefix}/{uuid}', 4) # [决斗场] # 起始冷却时间 : 10秒 - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # [决斗场] # 起始冷却时间 : 10秒 @@ -940,6 +991,7 @@ class Skill30(ActiveSkill): 决斗场增加攻击后僵直。\n """ name = "寸拳" + ref = Ref.CLOSEPUNCH cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -1004,6 +1056,7 @@ class Skill31(ActiveSkill): 在决斗场中,不会吸附敌人,施放动作时进入霸体状态。\n """ name = "升龙拳" + ref = Ref.RISINGUPPER cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -1065,6 +1118,7 @@ class Skill32(ActiveSkill): 无法攻击处于透明、 无敌、 伪装状态或一定高度以上的敌人。\n """ name = "闪电之舞" + ref = Ref.LIGHTNINGDANCE cellPos = (2,9) learnLv = 40 masterLv = 60 @@ -1127,6 +1181,7 @@ class Skill33(ActiveSkill): 抽打命中时引发冲击波,对周围敌人造成相同的伤害。\n """ name = "纷影连环踢" + ref = Ref.RANDOMKICK cellPos = (2,10) learnLv = 45 masterLv = 60 @@ -1193,6 +1248,7 @@ class Skill34(PassiveSkill): 增加武神的基本攻击力和技能攻击力、 移动速度。\n """ name = "武神步" + ref = Ref.POWERUPONDASH cellPos = (6,11) learnLv = 48 masterLv = 40 @@ -1208,7 +1264,11 @@ class Skill34(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 移动速度增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 武神强踢 # fighter_female/striker_female/47bd4871f29defc2a0021ee9261d7a5b @@ -1221,6 +1281,7 @@ class Skill35(ActiveSkill): 可以大幅度降低武神周围敌人的攻击速度。\n """ name = "武神强踢" + ref = Ref.STRONGESTLOWKICK cellPos = (2,11) learnLv = 50 masterLv = 40 @@ -1257,6 +1318,7 @@ class Skill36(ActiveSkill): 蓄力时,可以按前/后/下方向键移动后攻击,或者在原地攻击。\n """ name = "破碎拳" + ref = Ref.DASHPUNCHEX cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1313,10 +1375,14 @@ class Skill36(ActiveSkill): self.skillRation *= 0.5 ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{"type":"*skillRation","data":[0] + [-25]*self.maxLv,"skills":["崩拳"]}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{"type":"*skillRation","data":[0] + [-25]*self.maxLv,"skills":["崩拳"]}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-25] * maxLv)), skills=[Ref.DASHPUNCH], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 回天连环击 # fighter_female/striker_female/e0daa922b19cdc35de879e938361464e @@ -1329,6 +1395,7 @@ class Skill37(ActiveSkill): 若施放时按前方向键,则前进后发动攻击。\n """ name = "回天连环击" + ref = Ref.ONEELBOWCHAINHIT cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1408,6 +1475,7 @@ class Skill38(PassiveSkill): 增加移动速度。\n """ name = "神武之力" + ref = Ref.LIMITBREAK cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1429,7 +1497,11 @@ class Skill38(PassiveSkill): data3 = get_data(f'{prefix}/{uuid}', 3) # [霸体护甲]移动速度增加 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 虎啸神拳 # fighter_female/striker_female/128b9ddef2262f40723deae4407bdb42 @@ -1442,6 +1514,7 @@ class Skill39(ActiveSkill): 攻击时,可利用前/后方向键前进,或在原地进行攻击。\n """ name = "虎啸神拳" + ref = Ref.TIGERSTRIKE cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1508,6 +1581,7 @@ class Skill40(ActiveSkill): 可利用前/后方向键前进,或在原地进行攻击。\n """ name = "无影脚" + ref = Ref.CHAINDESTRUCTION cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1572,6 +1646,7 @@ class Skill41(ActiveSkill): 断空拳击中敌人时产生强力冲击波,对范围内的敌人造成巨大伤害。 若断空拳未击中敌人,则产生强大风压对敌人造成伤害。\n """ name = "极尽 : 霸皇断空拳" + ref = Ref.FINALHEAVEN cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1608,6 +1683,7 @@ class Skill42(PassiveSkill): 冲击波的大小增加,对周围敌人造成与直接攻击相同的伤害。\n """ name = "疾风劲" + ref = Ref.NOPAINNOGAIN cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1621,7 +1697,11 @@ class Skill42(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 雷霆之舞 # fighter_female/striker_female/dac8d8207618150c162e4c6f9e168527 @@ -1633,6 +1713,7 @@ class Skill43(ActiveSkill): 每次攻击成功时产生冲击波,对周围敌人造成伤害。\n """ name = "雷霆之舞" + ref = Ref.LIGHTNINGSHIFT cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1671,6 +1752,7 @@ class Skill44(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "陨星灭天击" + ref = Ref.BLOWTODESTRUCTION cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/fighter_male/brawler_male.py b/backend/core/character/GF/fighter_male/brawler_male.py index 44b7a5b8..2c6aab09 100644 --- a/backend/core/character/GF/fighter_male/brawler_male.py +++ b/backend/core/character/GF/fighter_male/brawler_male.py @@ -1,6 +1,20 @@ # ca0f0e0e9e1d55b5f9955b03d9dd213c from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Equals, + Hit, + LevelTable, + Operation, + Percent, + Power, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.fighter_male.brawler_male import BrawlerMaleSkillRef as Ref prefix = "fighter_male/brawler_male/cn/skillDetail" @@ -13,6 +27,7 @@ class Skill0(ActiveSkill): 向敌人发出强威力的后踢使其浮空,施放的瞬间有霸体判定。\n """ name = "后踢" + ref = Ref.LIFTUPPER learnLv = 1 masterLv = 10 maxLv = 20 @@ -42,6 +57,7 @@ class Skill1(PassiveSkill): """ name = '剧毒抵抗' + ref = Ref.POISONTOLERANCEUP cellPos = (7,1) learnLv = 1 masterLv = 1 @@ -67,6 +83,7 @@ class Skill2(PassiveSkill): """ name = '毒攻掌握' + ref = Ref.HERESYPOWERTRAINING cellPos = (6,1) learnLv = 1 masterLv = 1 @@ -93,6 +110,7 @@ class Skill3(ActiveSkill): 像锤击一样挥舞双腿踢飞敌人。\n """ name = "前踢" + ref = Ref.SINGLEKICK learnLv = 1 masterLv = 60 maxLv = 70 @@ -119,6 +137,7 @@ class Skill4(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -143,6 +162,7 @@ class Skill5(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -161,7 +181,11 @@ class Skill5(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['罗网投掷']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['罗网投掷']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.THROWWEB]), + ] # 受身蹲伏 # fighter_male/brawler_male/ce26c6b69d02a440a81b552bec94f03b @@ -171,6 +195,7 @@ class Skill6(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -202,6 +227,7 @@ class Skill7(PassiveSkill): 在决斗场中,无法转换攻击类型,适用技能固有的攻击类型。\n """ name = "攻击类型转换" + ref = Ref.CONVERSION learnLv = 1 masterLv = 1 maxLv = 1 @@ -236,6 +262,7 @@ class Skill8(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -258,6 +285,7 @@ class Skill9(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -283,6 +311,7 @@ class Skill10(ActiveSkill): """ name = '下段踢' + ref = Ref.DAMAGELOWKICK cellPos = (2,2) learnLv = 5 masterLv = 60 @@ -318,6 +347,7 @@ class Skill11(ActiveSkill): """ name = '分身' + ref = Ref.KENSIN cellPos = (4,2) learnLv = 5 masterLv = 10 @@ -350,6 +380,7 @@ class Skill12(ActiveSkill): """ name = '膝击' + ref = Ref.SUPLEX cellPos = (6,2) learnLv = 5 masterLv = 60 @@ -389,6 +420,7 @@ class Skill13(ActiveSkill): [蹲伏]姿势中按攻击键,可以用肩尖撞击敌人; 经过一定时间或按跳跃键可以中断蹲伏状态。\n """ name = "蹲伏" + ref = Ref.CROUCH learnLv = 10 masterLv = 1 maxLv = 11 @@ -416,6 +448,7 @@ class Skill14(PassiveSkill): """ name = '钢筋铁骨' + ref = Ref.PHYSICALDEFENSEUP cellPos = (8,3) learnLv = 10 masterLv = 50 @@ -444,6 +477,7 @@ class Skill15(ActiveSkill): """ name = '鹰踏' + ref = Ref.STOMP cellPos = (3,3) learnLv = 10 masterLv = 60 @@ -476,6 +510,7 @@ class Skill16(ActiveSkill): """ name = '疾风追击' + ref = Ref.DASHAFTERDASH cellPos = (9,3) learnLv = 10 masterLv = 60 @@ -510,6 +545,7 @@ class Skill17(ActiveSkill): """ name = '金刚碎' + ref = Ref.EARTHBREAK cellPos = (1,3) learnLv = 10 masterLv = 60 @@ -549,6 +585,7 @@ class Skill18(ActiveSkill): """ name = '瞬步' + ref = Ref.FASTDASH cellPos = (6,3) learnLv = 10 masterLv = 1 @@ -576,6 +613,7 @@ class Skill19(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -603,6 +641,7 @@ class Skill20(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -630,6 +669,7 @@ class Skill21(ActiveSkill): 转职为气功师后,可以强制中断基本攻击和前冲攻击动作,并立即施放该技能,同时可以学习[蓄念炮]。\n """ name = "念气波" + ref = Ref.ENERGYBALL learnLv = 15 masterLv = 60 maxLv = 70 @@ -668,6 +708,7 @@ class Skill22(ActiveSkill): """ name = '抛沙' + ref = Ref.THROWSAND cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -716,6 +757,7 @@ class Skill23(ActiveSkill): """ name = '毒瓶投掷' + ref = Ref.ENCHANTPOISON cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -775,7 +817,7 @@ class Skill23(ActiveSkill): def getSkillCD(self, mode=None): if mode == '爆破污桶': - return self.char.GetSkillByName('爆破污桶').getSkillCD(mode) + return self.char.GetSkill(Ref.GLUEYFRUITEX).getSkillCD(mode) return super().getSkillCD(mode) # 投掷强化 @@ -798,6 +840,7 @@ class Skill24(ActiveSkill): """ name = '投掷强化' + ref = Ref.SMARTTHROW cellPos = (4,4) learnLv = 15 masterLv = 1 @@ -827,6 +870,7 @@ class Skill25(PassiveSkill): """ name = '自动填充' + ref = Ref.AUTOLOAD cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -852,6 +896,7 @@ class Skill26(ActiveSkill): """ name = '擒月炎' + ref = Ref.GRABEXPLOSION cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -902,6 +947,7 @@ class Skill27(ActiveSkill): """ name = '后街战术' + ref = Ref.DOUBLETHROW cellPos = (3,5) learnLv = 20 masterLv = 10 @@ -931,6 +977,7 @@ class Skill28(PassiveSkill): 施放[疾风追击]时,可以向敌人发出第2、 3击。\n """ name = "疾风连击" + ref = Ref.DASHAFTERDASHEXTENSION learnLv = 20 masterLv = 1 maxLv = 1 @@ -952,6 +999,7 @@ class Skill29(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -975,6 +1023,7 @@ class Skill30(PassiveSkill): """ name = '爪精通' + ref = Ref.CLAWMASTERY cellPos = (2,6) learnLv = 25 masterLv = 20 @@ -996,9 +1045,14 @@ class Skill30(PassiveSkill): # 命中率增加 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkP', 'data': data0}, + # {'type': '$*MAtkP', 'data': data1}, + # ] associate = [ - {'type': '$*PAtkP', 'data': data0}, - {'type': '$*MAtkP', 'data': data1}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + # 原角色字段 MAtkP 未被旧引擎支持,原先不生效;本次迁移保留此行为。 ] # 毒针投掷 @@ -1017,6 +1071,7 @@ class Skill31(ActiveSkill): """ name = '毒针投掷' + ref = Ref.HIDDENSTING cellPos = (3,6) learnLv = 25 masterLv = 60 @@ -1072,7 +1127,7 @@ class Skill31(ActiveSkill): self.hit3 = 3 self.hit7 = self.hit8 = self.hit9 = self.hit10 = 0 elif mode == '强化': - if self.char.GetSkillByName('罗网投掷').vp == 2: + if self.char.GetSkill(Ref.THROWWEB).vp == 2: self.skillRation = 0 self.hit7 = self.hit8 = 4 self.hit2 = self.hit3 = self.hit9 = self.hit10 = 0 @@ -1098,6 +1153,7 @@ class Skill32(PassiveSkill): """ name = '后备口袋' + ref = Ref.BACKPOCKET cellPos = (4,6) learnLv = 25 masterLv = 1 @@ -1121,6 +1177,7 @@ class Skill33(ActiveSkill): """ name = '伏虎霸王拳' + ref = Ref.MOUNT cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -1154,6 +1211,7 @@ class Skill34(ActiveSkill): """ name = '旋风腿' + ref = Ref.WHIRLWINDKICK cellPos = (8,7) learnLv = 30 masterLv = 60 @@ -1190,6 +1248,7 @@ class Skill35(ActiveSkill): """ name = '砖块投掷' + ref = Ref.BLOCKBUSTER cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -1269,6 +1328,7 @@ class Skill36(ActiveSkill): """ name = '挑衅' + ref = Ref.PROVOCATION cellPos = (2,8) learnLv = 35 masterLv = 10 @@ -1298,7 +1358,11 @@ class Skill36(ActiveSkill): # 前方挑衅射程 : {value5}px data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'type': '*skillDamage', 'data': data1}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 罗网投掷 # fighter_male/brawler_male/d0cdaca82892e54097f22a1f60817048 @@ -1315,6 +1379,7 @@ class Skill37(ActiveSkill): """ name = '罗网投掷' + ref = Ref.THROWWEB cellPos = (4,8) learnLv = 35 masterLv = 1 @@ -1381,10 +1446,14 @@ class Skill37(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '+power2', 'data': [0] + [31.3] * self.maxLv, 'skills': ['毒针投掷']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '+power2', 'data': [0] + [31.3] * self.maxLv, 'skills': ['毒针投掷']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=Power(2), operation=Operation.ADD, value=Percent(LevelTable([0] + [31.3] * maxLv)), skills=[Ref.HIDDENSTING], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 螺旋滑铲 # fighter_male/brawler_male/e0a072e8cef2d77893aad5f68aeed56a @@ -1398,6 +1467,7 @@ class Skill38(ActiveSkill): """ name = '螺旋滑铲' + ref = Ref.GROUNDKICK cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -1467,7 +1537,11 @@ class Skill39(PassiveSkill): 攻击异常状态的敌人时,伤害会更加强大,冲击波范围也会增加 (最多叠加3次)。\n """ + # 条件声明在未学习时也参与依赖检查,显式提供 VP 输入默认值。 + vp = 0 + name = '狂 · 霸王拳' + ref = Ref.CRAZYMOUNT cellPos = (5,9) learnLv = 40 masterLv = 1 @@ -1510,12 +1584,20 @@ class Skill39(PassiveSkill): """ ... - def effect(self, old, new): - self.associate = [{'data': [i - 100 if i > 0 else i for i in self.data0], 'skills': ['伏虎霸王拳']}, {'type': '+hit0', 'data': [0] + [-200] * self.maxLv, 'skills': ['伏虎霸王拳']}, {'data': [i * 3 for i in self.data3], 'skills': ['伏虎霸王拳']}] - if self.vp == 2: - self.associate.append({'data': [0] + [-200] * self.maxLv, 'skills': ['伏虎霸王拳'], 'type': '*cdRatio'}) - self.associate.append({'type': '*skillRation', 'data': [0] + [200] * self.maxLv, 'skills': ['伏虎霸王拳']}) - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # self.associate = [{'data': [i - 100 if i > 0 else i for i in self.data0], 'skills': ['伏虎霸王拳']}, {'type': '+hit0', 'data': [0] + [-200] * self.maxLv, 'skills': ['伏虎霸王拳']}, {'data': [i * 3 for i in self.data3], 'skills': ['伏虎霸王拳']}] + # if self.vp == 2: + # self.associate.append({'data': [0] + [-200] * self.maxLv, 'skills': ['伏虎霸王拳'], 'type': '*cdRatio'}) + # self.associate.append({'type': '*skillRation', 'data': [0] + [200] * self.maxLv, 'skills': ['伏虎霸王拳']}) + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else i for i in data0])), skills=[Ref.MOUNT]), + SkillEffect(attribute=Hit(0), operation=Operation.ADD, value=Percent(LevelTable([0] + [-200] * maxLv)), skills=[Ref.MOUNT]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i * 3 for i in data3])), skills=[Ref.MOUNT]), + SkillEffect(attribute=SkillAttribute.CD_RATIO, value=1 - Percent(LevelTable([0] + [-200] * maxLv)), skills=[Ref.MOUNT], when=Equals(Read(SkillAttribute.VP), 2)), + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [200] * maxLv)), skills=[Ref.MOUNT], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 毒雷引爆 # fighter_male/brawler_male/6a1d1f08a6572be420bb3a256c44c015 @@ -1527,6 +1609,7 @@ class Skill40(ActiveSkill): """ name = '毒雷引爆' + ref = Ref.VENOMMINE cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -1591,6 +1674,7 @@ class Skill41(ActiveSkill): """ name = '极恶飞锁' + ref = Ref.VICIOUSLARIAT cellPos = (8,10) learnLv = 45 masterLv = 60 @@ -1654,6 +1738,7 @@ class Skill42(PassiveSkill): """ name = '千手奥义' + ref = Ref.SKILL_1000HANDS1000EYES cellPos = (2,11) learnLv = 48 masterLv = 40 @@ -1680,9 +1765,14 @@ class Skill42(PassiveSkill): # 物理、 魔法暴击率增加量 : {value6}% data6 = get_data(f'{prefix}/{uuid}', 6) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data5, 'type': '*skillDamage'}, + # {'data': data4, 'type': '*cdReduce', 'skills': ['抛沙', '毒瓶投掷', '毒针投掷', '砖块投掷', '罗网投掷']}, + # ] associate = [ - {'data': data5, 'type': '*skillDamage'}, - {'data': data4, 'type': '*cdReduce', 'skills': ['抛沙', '毒瓶投掷', '毒针投掷', '砖块投掷', '罗网投掷']}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data5))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data4)), skills=[Ref.THROWSAND, Ref.ENCHANTPOISON, Ref.HIDDENSTING, Ref.BLOCKBUSTER, Ref.THROWWEB]), ] # 天崩地裂 @@ -1694,6 +1784,7 @@ class Skill43(ActiveSkill): """ name = '天崩地裂' + ref = Ref.DESTROYEARTHSKYDROP cellPos = (4,11) learnLv = 50 masterLv = 40 @@ -1738,6 +1829,7 @@ class Skill44(ActiveSkill): """ name = '爆破污桶' + ref = Ref.GLUEYFRUITEX cellPos = (5,12) learnLv = 60 masterLv = 40 @@ -1797,10 +1889,14 @@ class Skill44(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '*skillRation', 'data': [0] + [-50] * self.maxLv}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-50] * self.maxLv}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-50] * maxLv)), when=Equals(Read(SkillAttribute.VP), 2)), + ] # 千锁乱舞 # fighter_male/brawler_male/dac8d8207618150c162e4c6f9e168527 @@ -1812,6 +1908,7 @@ class Skill45(ActiveSkill): """ name = '千锁乱舞' + ref = Ref.CRASHCHAIN cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1876,6 +1973,7 @@ class Skill46(PassiveSkill): """ name = '诡诈之道' + ref = Ref.RULEBREAK cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1892,7 +1990,11 @@ class Skill46(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data1, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data1, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 暗街夺命锁 # fighter_male/brawler_male/2b39a776471c142f581ad3cc8bb89e55 @@ -1906,6 +2008,7 @@ class Skill47(ActiveSkill): """ name = '暗街夺命锁' + ref = Ref.CHAINDRIVE cellPos = (8,13) learnLv = 75 masterLv = 40 @@ -1975,10 +2078,14 @@ class Skill47(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '*skillRation', 'data': [0] + [-30] * self.maxLv, 'skills': ['砖块投掷']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-30] * self.maxLv, 'skills': ['砖块投掷']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-30] * maxLv)), skills=[Ref.BLOCKBUSTER], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 飞沙走石 # fighter_male/brawler_male/b306cc4c67c775ab7ddff9785a3fe6a4 @@ -1991,6 +2098,7 @@ class Skill48(ActiveSkill): """ name = '飞沙走石' + ref = Ref.RUINRAIN cellPos = (6,14) learnLv = 80 masterLv = 40 @@ -2054,10 +2162,14 @@ class Skill48(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '*skillRation', 'data': [0] + [-40] * self.maxLv, 'skills': ['毒针投掷']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-40] * self.maxLv, 'skills': ['毒针投掷']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-40] * maxLv)), skills=[Ref.HIDDENSTING], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 燃火轰天炮 # fighter_male/brawler_male/949849d5791944973d60af7e2a7eefb0 @@ -2070,6 +2182,7 @@ class Skill49(ActiveSkill): """ name = '燃火轰天炮' + ref = Ref.FIREWORKS cellPos = (8,14) learnLv = 85 masterLv = 40 @@ -2099,7 +2212,11 @@ class Skill49(ActiveSkill): data4 = get_data(f'{prefix}/{uuid}', 4) data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'type': '*skillDamage', 'data': [i * 3 if i > 0 else i for i in data3], 'skills': ['燃火轰天炮']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i * 3 if i > 0 else i for i in data3], 'skills': ['燃火轰天炮']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i * 3 if i > 0 else i for i in data3])), skills=[Ref.FIREWORKS]), + ] # 逆道·爆狱 # fighter_male/brawler_male/dec8961c485edb02036ba00c789010f0 @@ -2114,6 +2231,7 @@ class Skill50(ActiveSkill): """ name = '逆道·爆狱' + ref = Ref.ROADTOHELL cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2184,6 +2302,7 @@ class Skill51(PassiveSkill): """ name = '逆道·皆允' + ref = Ref.OUTLAW cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -2200,7 +2319,11 @@ class Skill51(PassiveSkill): # 强化毒瓶投掷毒雾持续时间 : {value1}秒 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 逆道·幽链之界 # fighter_male/brawler_male/f1fdc6c2482ecc510a2a9f04201ba125 @@ -2217,6 +2340,7 @@ class Skill52(ActiveSkill): """ name = '逆道·幽链之界' + ref = Ref.BADENDING cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/fighter_male/grappler_male.py b/backend/core/character/GF/fighter_male/grappler_male.py index 2ee1f7df..8480645f 100644 --- a/backend/core/character/GF/fighter_male/grappler_male.py +++ b/backend/core/character/GF/fighter_male/grappler_male.py @@ -1,6 +1,15 @@ #ca0f0e0e9e1d55b5f9955b03d9dd213c from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.fighter_male.grappler_male import GrapplerMaleSkillRef as Ref prefix = "fighter_male/grappler_male/cn/skillDetail" @@ -12,6 +21,7 @@ class Skill0(ActiveSkill): 向敌人发出强威力的后踢使其浮空,施放的瞬间有霸体判定。\n """ name = "后踢" + ref = Ref.LIFTUPPER cellPos = (3,1) learnLv = 1 masterLv = 10 @@ -37,6 +47,7 @@ class Skill1(ActiveSkill): 像锤击一样挥舞双腿踢飞敌人。\n """ name = "前踢" + ref = Ref.SINGLEKICK cellPos = (5,1) learnLv = 1 masterLv = 60 @@ -62,6 +73,7 @@ class Skill2(PassiveSkill): 装备臂铠时,减少魔法值消耗量。\n """ name = "臂铠精通" + ref = Ref.GAUNTLETMASTERY cellPos = (2,1) learnLv = 1 masterLv = 1 @@ -76,8 +88,12 @@ class Skill2(PassiveSkill): # 魔法值消耗量减少率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0,"type":"*cdReduce", 'exceptSkills': ['死亡旋律', '一字传承 : 极义震天破', '黑震流·山岳崩颓']} + # ] associate = [ - {"data":data0,"type":"*cdReduce", 'exceptSkills': ['死亡旋律', '一字传承 : 极义震天破', '黑震流·山岳崩颓']} + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data0)), except_skills=[Ref.TYPHOON, Ref.FINALEXTREMESTRIKE, Ref.DEATHDOORDESTROY]), ] # 后跳 @@ -88,6 +104,7 @@ class Skill3(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -111,6 +128,7 @@ class Skill4(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -138,6 +156,7 @@ class Skill5(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -179,6 +198,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -201,6 +221,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -225,6 +246,7 @@ class Skill8(ActiveSkill): 被直接命中的敌人不受冲击波伤害。\n """ name = "下段踢" + ref = Ref.DAMAGELOWKICK learnLv = 5 masterLv = 60 maxLv = 70 @@ -258,6 +280,7 @@ class Skill9(ActiveSkill): 转职成气功师后,可以学习[幻影爆碎]技能。\n """ name = "分身" + ref = Ref.KENSIN learnLv = 5 masterLv = 10 maxLv = 20 @@ -289,6 +312,7 @@ class Skill10(ActiveSkill): 下方向键 : 把敌人扔向地面,并产生冲击波攻击周围敌人\n """ name = "膝击" + ref = Ref.SUPLEX cellPos = (6,2) learnLv = 5 masterLv = 60 @@ -327,6 +351,7 @@ class Skill11(ActiveSkill): [蹲伏]姿势中按攻击键,可以用肩尖撞击敌人; 经过一定时间或按跳跃键可以中断蹲伏状态。\n """ name = "蹲伏" + ref = Ref.CROUCH cellPos = (7,3) learnLv = 10 masterLv = 1 @@ -351,6 +376,7 @@ class Skill12(PassiveSkill): 使自身的身体强悍如钢铁,并增加一定的物防和体力。 被击时,有一定几率使自身进入霸体状态。\n """ name = "钢筋铁骨" + ref = Ref.PHYSICALDEFENSEUP cellPos = (4,3) learnLv = 10 masterLv = 50 @@ -376,6 +402,7 @@ class Skill13(ActiveSkill): 可以连续对敌人进行一定次数的踩踏。 技能的冷却时间从最后一次踩踏结束落地时开始计算。\n """ name = "鹰踏" + ref = Ref.STOMP cellPos = (3,3) learnLv = 10 masterLv = 60 @@ -404,6 +431,7 @@ class Skill14(ActiveSkill): 该技能的基本攻击只有1次,但学习[疾风连击]后可再追加1次。\n """ name = "疾风追击" + ref = Ref.DASHAFTERDASH cellPos = (8,3) learnLv = 10 masterLv = 60 @@ -434,6 +462,7 @@ class Skill15(ActiveSkill): 可以强制中断基本攻击动作,并立即施放该技能; 攻击方式变更为肘击,且对敌人造成更多伤害; 可以强制中断施放后的僵直动作,并立即施放[霹雳旋踢]。\n """ name = "金刚碎" + ref = Ref.EARTHBREAK cellPos = (1,3) learnLv = 10 masterLv = 60 @@ -469,6 +498,7 @@ class Skill16(ActiveSkill): 撞到敌人时停止移动。\n """ name = "瞬步" + ref = Ref.FASTDASH cellPos = (5,3) learnLv = 10 masterLv = 1 @@ -494,6 +524,7 @@ class Skill17(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -521,6 +552,7 @@ class Skill18(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -548,6 +580,7 @@ class Skill19(ActiveSkill): 转职为气功师后,可以强制中断基本攻击和前冲攻击动作,并立即施放该技能,同时可以学习[蓄念炮]。\n """ name = "念气波" + ref = Ref.ENERGYBALL learnLv = 15 masterLv = 60 maxLv = 70 @@ -585,6 +618,7 @@ class Skill20(ActiveSkill): 转职为街霸后,可以强制中断基本攻击并施放。\n """ name = "抛沙" + ref = Ref.THROWSAND learnLv = 15 masterLv = 60 maxLv = 70 @@ -622,6 +656,7 @@ class Skill21(PassiveSkill): 发动[膝击]的最后一击、 [抛投]的下劈攻击、 [无情摔击]、 [霹雳旋踢]、 [空绞锤]、 [浮空凌云踢]、 [疾波猛坠]、 [地狱风火轮]、 [裂石破天]、 [死亡旋律]、 [武莲华]、 [黑震旋风]、 [疾风闪电]、 [黑震流·殒灭]。\n """ name = "摔技强化" + ref = Ref.SUPLEXSUBPOWERUP cellPos = (5,4) learnLv = 15 masterLv = 10 @@ -635,7 +670,11 @@ class Skill21(PassiveSkill): # 附近攻击范围比率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 抛投 # fighter_male/grappler_male/c27418ae613c647527200a7ca17d97fd @@ -650,6 +689,7 @@ class Skill22(ActiveSkill): 下方向键 : 把敌人往下踢。\n """ name = "抛投" + ref = Ref.THROWENEMY cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -694,6 +734,7 @@ class Skill23(ActiveSkill): [膝击]、 [抛投]、 [无情摔击]、 [霹雳旋踢]、 [空绞锤]、 [浮空凌云踢]、 [地狱风火轮]、 [裂石破天]、 [死亡旋律]、 [黑震旋风]、 [疾风闪电]、 [一字传承 : 极义震天破]\n """ name = "暴力抓取" + ref = Ref.DEFINITEGRAB cellPos = (3,4) learnLv = 15 masterLv = 10 @@ -719,6 +760,7 @@ class Skill24(PassiveSkill): 在前冲状态下使用[膝击]、 [抛投]、 [浮空凌云踢]、 [地狱风火轮]、 [死亡旋律]、 [武莲华]、 [黑震旋风]技能时,可以向移动方向滑行抓取敌人\n """ name = "滑行抓取" + ref = Ref.SLIDEGRAB cellPos = (7,4) learnLv = 15 masterLv = 1 @@ -740,6 +782,7 @@ class Skill25(PassiveSkill): 在攻击的敌人周围生成冲击波,对周围敌人也造成伤害。\n """ name = "抓轰炮" + ref = Ref.GRABCANNON cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -760,6 +803,7 @@ class Skill26(PassiveSkill): 同时,增加自身暴击伤害,[野蛮冲撞]、 [彗星冲击]命中敌人后,若强制中断当前攻击动作并立即施放转职技能,或预输入[一字传承 : 极义震天破]技能键、 施放[黑震流·山岳崩颓]时,额外增加暴击伤害增加量,效果持续一定时间。\n """ name = "连环抓取" + ref = Ref.BACKSUPLEX cellPos = (7,5) learnLv = 20 masterLv = 1 @@ -775,9 +819,13 @@ class Skill26(PassiveSkill): # 暴击伤害额外增加效果持续 : {value2}秒 data2 = get_data(f'{prefix}/{uuid}', 2) - def effect(self, old, new): - self.associate = [{"data":[(self.data0[i] + self.data1[i]) for i in range(0,self.maxLv + 1)]}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # self.associate = [{"data":[(self.data0[i] + self.data1[i]) for i in range(0,self.maxLv + 1)]}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0) + LevelTable(data1))), + ] # 折颈 # fighter_male/grappler_male/ecc23c980ea71450c0ad0c3fd232f329 @@ -789,6 +837,7 @@ class Skill27(ActiveSkill): 在决斗场中,命中时使敌人浮空并进入僵直状态; 减少对领主、 稀有、 人形护甲怪物的强制控制效果。\n """ name = "折颈" + ref = Ref.PUNCHAFTERRETURN cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -816,6 +865,7 @@ class Skill28(PassiveSkill): 施放[疾风追击]时,可以向敌人发出第2、 3击。\n """ name = "疾风连击" + ref = Ref.DASHAFTERDASHEXTENSION cellPos = (8,5) learnLv = 20 masterLv = 1 @@ -833,6 +883,7 @@ class Skill29(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -860,6 +911,7 @@ class Skill30(ActiveSkill): 攻击建筑型怪物时,直接伤害和间接伤害会合并计算。\n """ name = "野蛮冲撞" + ref = Ref.SHOULDERTACKLE cellPos = (7,6) learnLv = 25 masterLv = 60 @@ -897,6 +949,7 @@ class Skill31(ActiveSkill): 在决斗场中,空中抓取失败时进入冷却时间,而且不能强制使无法抓取的敌人进入僵直状态。\n """ name = "无情摔击" + ref = Ref.BREAKDOWN cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -931,6 +984,7 @@ class Skill32(ActiveSkill): 转职成为散打时,才可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "旋风腿" + ref = Ref.WHIRLWINDKICK cellPos = (8,7) learnLv = 30 masterLv = 60 @@ -960,6 +1014,7 @@ class Skill33(ActiveSkill): 在决斗场中,无法在[后跳]过程中施放。\n """ name = "空绞锤" + ref = Ref.LEGSUPLEX cellPos = (1,7) learnLv = 30 masterLv = 60 @@ -993,6 +1048,7 @@ class Skill34(ActiveSkill): 在决斗场中增加施放后僵直时间。\n """ name = "霹雳旋踢" + ref = Ref.HOLDUP cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -1029,6 +1085,7 @@ class Skill35(ActiveSkill): 空中施放时,发动无强制控制效果的攻击,将敌人踹落并产生冲击波。\n """ name = "浮空凌云踢" + ref = Ref.SPIRE cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -1090,6 +1147,7 @@ class Skill36(ActiveSkill): 按前方向键时,可以前进更远的距离。 在空中施放时,快速急坠并攻击敌人。\n """ name = "疾波猛坠" + ref = Ref.MAGNUMSAULT cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1156,6 +1214,7 @@ class Skill37(ActiveSkill): 可以使用方向键调整敌人的落地位置。\n """ name = "地狱风火轮" + ref = Ref.SUPLEXCYCLONE cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -1227,6 +1286,7 @@ class Skill38(ActiveSkill): 在决斗场中,只有在一定高度以上才能使用该技能。\n """ name = "裂石破天" + ref = Ref.WILDCANNONSPIKE cellPos = (3,10) learnLv = 45 masterLv = 60 @@ -1303,6 +1363,7 @@ class Skill39(PassiveSkill): 增加基本攻击和抓取技能攻击力。 破招抓取敌人时,适用破招时伤害增加率。\n """ name = "力之奥义" + ref = Ref.TYPHOONCOUNTERSTRIKE cellPos = (5,11) learnLv = 48 masterLv = 40 @@ -1314,7 +1375,11 @@ class Skill39(PassiveSkill): # 基本攻击和抓取攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"type":"$*PAtkP","data":data0}] + # 迁移前实现(保留对照): + # associate = [{"type":"$*PAtkP","data":data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 死亡旋律 # fighter_male/grappler_male/d296043df164385a14cb973c8c7c4d07 @@ -1326,6 +1391,7 @@ class Skill40(ActiveSkill): 在空中施放时,跃起后将敌人踢向地面,但无法强控敌人。\n """ name = "死亡旋律" + ref = Ref.TYPHOON cellPos = (3,11) learnLv = 50 masterLv = 40 @@ -1384,6 +1450,7 @@ class Skill41(ActiveSkill): 命中或未命中敌人时,都可以强制中断彗星冲击并立即施放[旋风腿]。\n """ name = "彗星冲击" + ref = Ref.CHARGESPEAREX cellPos = (3,12) learnLv = 60 masterLv = 40 @@ -1433,6 +1500,7 @@ class Skill42(ActiveSkill): 可用方向键指定摔敌人的方向。\n """ name = "武莲华" + ref = Ref.SKILL_108STAIRSEX cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1507,6 +1575,7 @@ class Skill43(PassiveSkill): 额外增加技能攻击力的效果不会叠加,并且增加的攻击力以最强的怪物为准。\n """ name = "傲天之怒" + ref = Ref.WHOISNEXT cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1525,9 +1594,13 @@ class Skill43(PassiveSkill): data3 = get_data(f'{prefix}/{uuid}', 3) - def effect(self, old, new): - self.associate = [{"data":[(self.data0[i] + self.data2[i]) for i in range(0,self.maxLv + 1)]}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # self.associate = [{"data":[(self.data0[i] + self.data2[i]) for i in range(0,self.maxLv + 1)]}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0) + LevelTable(data2))), + ] # 黑震旋风 # fighter_male/grappler_male/e6cb8eaa955de77107f746a4e6c731ab @@ -1539,6 +1612,7 @@ class Skill44(ActiveSkill): 过一段时间后,地面将会爆炸并对周围的敌人造成伤害。\n """ name = "黑震旋风" + ref = Ref.CYCLONECRASH cellPos = (7,13) learnLv = 75 masterLv = 40 @@ -1608,6 +1682,7 @@ class Skill45(ActiveSkill): 对无法抓取的敌人不适用控制效果。\n """ name = "疾风闪电" + ref = Ref.CHAINBRAKE cellPos = (5,14) learnLv = 80 masterLv = 40 @@ -1692,6 +1767,7 @@ class Skill46(ActiveSkill): 连续按攻击键可以加快进行速度。 连接使用此技能时,先使用的技能拥有反击破招效果时,[一字传承 : 极义震天破]也拥有该效果。\n """ name = "一字传承 : 极义震天破" + ref = Ref.FINALEXTREMESTRIKE cellPos = (7,14) learnLv = 85 masterLv = 40 @@ -1732,6 +1808,7 @@ class Skill47(PassiveSkill): 在[暴力抓取]状态下施放[霹雳旋踢]时,抓取动作变更为范围抓取形态,并适用[滑行抓取]。\n """ name = "神怡气静" + ref = Ref.IMPERTURBABLE cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1743,7 +1820,11 @@ class Skill47(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"type":"$*PAtkP","data":data0}] + # 迁移前实现(保留对照): + # associate = [{"type":"$*PAtkP","data":data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 黑震流·殒灭 # fighter_male/grappler_male/68062215e75d92575958873ac8ede31a @@ -1755,6 +1836,7 @@ class Skill48(ActiveSkill): 在再次按键的时机内,按[一字传承 : 极义震天破]技能键,可以在身体冲撞的同时发动[一字传承 : 极义震天破]。\n """ name = "黑震流·殒灭" + ref = Ref.STONESHOWER cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1793,6 +1875,7 @@ class Skill49(ActiveSkill): 选择[一字传承 : 极义震天破]时,可以像[一字传承 : 极义震天破]一样在其他技能的过程中预约施放。\n """ name = "黑震流·山岳崩颓" + ref = Ref.DEATHDOORDESTROY cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/fighter_male/nenmaster_male.py b/backend/core/character/GF/fighter_male/nenmaster_male.py index 639a9bfe..525ab1cf 100644 --- a/backend/core/character/GF/fighter_male/nenmaster_male.py +++ b/backend/core/character/GF/fighter_male/nenmaster_male.py @@ -1,6 +1,17 @@ # ca0f0e0e9e1d55b5f9955b03d9dd213c from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, + Percent, + Power, + SkillAttribute, + SkillEffect, +) +from core.character.refs.fighter_male.nenmaster_male import NenmasterMaleSkillRef as Ref prefix = "fighter_male/nenmaster_male/cn/skillDetail" @@ -13,6 +24,7 @@ class Skill0(ActiveSkill): 向敌人发出强威力的后踢使其浮空,施放的瞬间有霸体判定。\n """ name = "后踢" + ref = Ref.LIFTUPPER learnLv = 1 masterLv = 10 maxLv = 20 @@ -42,6 +54,7 @@ class Skill1(PassiveSkill): """ name = '光之亲和' + ref = Ref.LIGHTFRIENDSHIP cellPos = (9,1) learnLv = 1 masterLv = 1 @@ -67,6 +80,7 @@ class Skill2(PassiveSkill): """ name = '念气感知' + ref = Ref.BLINDTOLERANCEUP cellPos = (8,1) learnLv = 1 masterLv = 1 @@ -90,6 +104,7 @@ class Skill3(ActiveSkill): 像锤击一样挥舞双腿踢飞敌人。\n """ name = "前踢" + ref = Ref.SINGLEKICK learnLv = 1 masterLv = 60 maxLv = 70 @@ -116,6 +131,7 @@ class Skill4(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -140,6 +156,7 @@ class Skill5(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -159,7 +176,11 @@ class Skill5(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['念兽 : 龙虎啸']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['念兽 : 龙虎啸']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.NENMONSTERWHITETIGER]), + ] # 受身蹲伏 # fighter_male/nenmaster_male/ce26c6b69d02a440a81b552bec94f03b @@ -169,6 +190,7 @@ class Skill6(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -210,6 +232,7 @@ class Skill7(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -232,6 +255,7 @@ class Skill8(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -256,6 +280,7 @@ class Skill9(ActiveSkill): 被直接命中的敌人不受冲击波伤害。\n """ name = "下段踢" + ref = Ref.DAMAGELOWKICK learnLv = 5 masterLv = 60 maxLv = 70 @@ -290,6 +315,7 @@ class Skill10(ActiveSkill): """ name = '分身' + ref = Ref.KENSIN cellPos = (4,2) learnLv = 5 masterLv = 10 @@ -326,6 +352,7 @@ class Skill11(ActiveSkill): 下方向键 : 把敌人扔向地面,并产生冲击波攻击周围敌人\n """ name = "膝击" + ref = Ref.SUPLEX learnLv = 5 masterLv = 60 maxLv = 70 @@ -366,6 +393,7 @@ class Skill12(ActiveSkill): """ name = '蹲伏' + ref = Ref.CROUCH cellPos = (7,3) learnLv = 10 masterLv = 1 @@ -393,6 +421,7 @@ class Skill13(PassiveSkill): """ name = '钢筋铁骨' + ref = Ref.PHYSICALDEFENSEUP cellPos = (5,3) learnLv = 10 masterLv = 50 @@ -420,6 +449,7 @@ class Skill14(ActiveSkill): 可以连续对敌人进行一定次数的踩踏。 技能的冷却时间从最后一次踩踏结束落地时开始计算。\n """ name = "鹰踏" + ref = Ref.STOMP learnLv = 10 masterLv = 60 maxLv = 70 @@ -449,6 +479,7 @@ class Skill15(ActiveSkill): 该技能的基本攻击只有1次,但学习[疾风连击]后可再追加1次。\n """ name = "疾风追击" + ref = Ref.DASHAFTERDASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -480,6 +511,7 @@ class Skill16(ActiveSkill): 可以强制中断基本攻击动作,并立即施放该技能; 攻击方式变更为肘击,且对敌人造成更多伤害; 可以强制中断施放后的僵直动作,并立即施放[霹雳旋踢]。\n """ name = "金刚碎" + ref = Ref.EARTHBREAK learnLv = 10 masterLv = 60 maxLv = 70 @@ -516,6 +548,7 @@ class Skill17(ActiveSkill): 撞到敌人时停止移动。\n """ name = "瞬步" + ref = Ref.FASTDASH learnLv = 10 masterLv = 1 maxLv = 1 @@ -543,6 +576,7 @@ class Skill18(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -570,6 +604,7 @@ class Skill19(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -597,6 +632,7 @@ class Skill20(ActiveSkill): """ name = '雷霆踏' + ref = Ref.THUNDERSUPLEX cellPos = (8,4) learnLv = 15 masterLv = 60 @@ -639,6 +675,7 @@ class Skill21(ActiveSkill): """ name = '念气波' + ref = Ref.ENERGYBALL cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -673,7 +710,7 @@ class Skill21(ActiveSkill): def setMode(self, mode): if mode == '蓄力': - if self.char.GetSkillByName('蓄念炮').lv == 0: + if self.char.GetSkill(Ref.ENERGYBALLCHARGE).lv == 0: self.skillRation *= 0 return self.cd = 6.5 @@ -690,6 +727,7 @@ class Skill22(ActiveSkill): 转职为街霸后,可以强制中断基本攻击并施放。\n """ name = "抛沙" + ref = Ref.THROWSAND learnLv = 15 masterLv = 60 maxLv = 70 @@ -727,6 +765,7 @@ class Skill23(ActiveSkill): """ name = '念气流转' + ref = Ref.LIGHTTOLERANCEUP cellPos = (6,5) learnLv = 20 masterLv = 10 @@ -752,9 +791,14 @@ class Skill23(ActiveSkill): # 施放速度增加 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkM', 'data': [0] + [48.7] * maxLv}, + # {'data': [0] + [21] * maxLv}, + # ] associate = [ - {'type': '$*PAtkM', 'data': [0] + [48.7] * maxLv}, - {'data': [0] + [21] * maxLv}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable([0] + [48.7] * maxLv))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0] + [21] * maxLv))), ] # 念气环绕 @@ -769,6 +813,7 @@ class Skill24(ActiveSkill): """ name = '念气环绕' + ref = Ref.SPIRALNEN cellPos = (2,5) learnLv = 20 masterLv = 25 @@ -796,7 +841,11 @@ class Skill24(ActiveSkill): data5 = data2 hit5 = 0 - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] mode = ['常规', '御'] @@ -817,6 +866,7 @@ class Skill25(PassiveSkill): """ name = '蓄念炮' + ref = Ref.ENERGYBALLCHARGE cellPos = (3,5) learnLv = 20 masterLv = 1 @@ -837,7 +887,11 @@ class Skill25(PassiveSkill): # 发射速度增加 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*power0', 'data': data0, 'skills': ['念气波']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*power0', 'data': data0, 'skills': ['念气波']}] + associate = [ + SkillEffect(attribute=Power(0), value=1 + Percent(LevelTable(data0)), skills=[Ref.ENERGYBALL]), + ] # 疾风连击 # fighter_male/nenmaster_male/8572675ec6a1f50b6eff6a867376c2de @@ -847,6 +901,7 @@ class Skill26(PassiveSkill): 施放[疾风追击]时,可以向敌人发出第2、 3击。\n """ name = "疾风连击" + ref = Ref.DASHAFTERDASHEXTENSION learnLv = 20 masterLv = 1 maxLv = 1 @@ -868,6 +923,7 @@ class Skill27(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -893,6 +949,7 @@ class Skill28(ActiveSkill): """ name = '念气罩' + ref = Ref.NENGUARD cellPos = (5,6) learnLv = 25 masterLv = 1 @@ -927,6 +984,7 @@ class Skill29(ActiveSkill): """ name = '念气环绕 : 袭' + ref = Ref.SPIRALNENSHOOT cellPos = (2,6) learnLv = 25 masterLv = 1 @@ -968,6 +1026,7 @@ class Skill30(ActiveSkill): """ name = '念雷轰' + ref = Ref.THUNDERCANNON cellPos = (7,6) learnLv = 25 masterLv = 60 @@ -1012,6 +1071,7 @@ class Skill31(ActiveSkill): """ name = '旋风腿' + ref = Ref.WHIRLWINDKICK cellPos = (9,7) learnLv = 30 masterLv = 60 @@ -1043,6 +1103,7 @@ class Skill32(PassiveSkill): """ name = '幻影爆碎' + ref = Ref.ILLUSIONBOMB cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -1061,7 +1122,12 @@ class Skill32(PassiveSkill): # 分身爆炸大小比率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'type': '*skillDamage', 'data': data0, 'skills': ['分身'], 'ratio': 1}, {'type': '+cd', 'data': [0] + [5] * maxLv, 'skills': ['分身'], 'ratio': 1}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0, 'skills': ['分身'], 'ratio': 1}, {'type': '+cd', 'data': [0] + [5] * maxLv, 'skills': ['分身'], 'ratio': 1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + LevelTable(data0), skills=[Ref.KENSIN]), + SkillEffect(attribute=SkillAttribute.CD, operation=Operation.ADD, value=LevelTable([0] + [5] * maxLv), skills=[Ref.KENSIN]), + ] # 念兽 : 龙虎啸 # fighter_male/nenmaster_male/1b1cfab062e0768bcc889e33e1f30dbf @@ -1079,6 +1145,7 @@ class Skill33(ActiveSkill): """ name = '念兽 : 龙虎啸' + ref = Ref.NENMONSTERWHITETIGER cellPos = (6,7) learnLv = 30 masterLv = 10 @@ -1133,7 +1200,11 @@ class Skill33(ActiveSkill): # 范围比率 : {value15}% data15 = get_data(f'{prefix}/{uuid}', 15) - associate = [{'type': '*skillDamage', 'data': data12}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data12}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data12))), + ] mode = ['一轮平x', '前冲', '跳跃'] @@ -1157,6 +1228,7 @@ class Skill34(ActiveSkill): """ name = '念气环绕 : 御' + ref = Ref.SPIRALNENSPIN cellPos = (2,7) learnLv = 30 masterLv = 1 @@ -1178,7 +1250,11 @@ class Skill34(ActiveSkill): # 范围比率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*power5', 'data': [i - 100 if i > 0 else i for i in data0], 'skills': ['念气环绕']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*power5', 'data': [i - 100 if i > 0 else i for i in data0], 'skills': ['念气环绕']}] + associate = [ + SkillEffect(attribute=Power(5), value=1 + Percent(LevelTable([i - 100 if i > 0 else i for i in data0])), skills=[Ref.SPIRALNEN]), + ] # 狮子吼 # fighter_male/nenmaster_male/9cb6f9ed646fa87f9b7680a42ce83d1a @@ -1190,6 +1266,7 @@ class Skill35(ActiveSkill): """ name = '狮子吼' + ref = Ref.SAJAHU cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1254,6 +1331,7 @@ class Skill36(ActiveSkill): """ name = '天雷虎踢' + ref = Ref.THUNDERTIGER cellPos = (8,8) learnLv = 35 masterLv = 60 @@ -1329,6 +1407,7 @@ class Skill37(ActiveSkill): """ name = '螺旋念气场' + ref = Ref.KIKOUKEN cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -1387,6 +1466,7 @@ class Skill38(ActiveSkill): """ name = '念兽 : 猛虎震地' + ref = Ref.LIGHTNINGDRAGON cellPos = (6,10) learnLv = 45 masterLv = 60 @@ -1451,6 +1531,7 @@ class Skill39(PassiveSkill): """ name = '念之奥义' + ref = Ref.NENPOLE cellPos = (4,11) learnLv = 48 masterLv = 40 @@ -1467,7 +1548,11 @@ class Skill39(PassiveSkill): # 魔法暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 念兽 : 审判之金雷虎 # fighter_male/nenmaster_male/51a08fd0c90f0a5276cd552047fac93d @@ -1480,6 +1565,7 @@ class Skill40(ActiveSkill): """ name = '念兽 : 审判之金雷虎' + ref = Ref.NENFLOWER cellPos = (6,11) learnLv = 50 masterLv = 40 @@ -1517,6 +1603,7 @@ class Skill41(ActiveSkill): """ name = '念之战矛' + ref = Ref.NENSPEAREX cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1586,6 +1673,7 @@ class Skill42(ActiveSkill): """ name = '冲云念气场' + ref = Ref.SPIRALCOLUMNEX cellPos = (5,13) learnLv = 70 masterLv = 40 @@ -1655,6 +1743,7 @@ class Skill43(ActiveSkill): """ name = '奔雷螺旋击' + ref = Ref.SPIRALEMPERORSLAP cellPos = (7,13) learnLv = 75 masterLv = 40 @@ -1721,6 +1810,7 @@ class Skill44(ActiveSkill): """ name = '风雷啸' + ref = Ref.SPIRALGALEFORCE cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1741,7 +1831,12 @@ class Skill44(ActiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # [念气环绕 : 袭]、 [念气环绕 : 御]的念气球范围增加 : 50% - associate = [{'data': data0}, {'data': data1, 'skills': ['狮子吼', '天雷虎踢', '螺旋念气场', '念兽 : 猛虎震地', '念兽 : 审判之金雷虎', '念之战矛', '冲云念气场', '奔雷螺旋击', '禅语·形灭']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}, {'data': data1, 'skills': ['狮子吼', '天雷虎踢', '螺旋念气场', '念兽 : 猛虎震地', '念兽 : 审判之金雷虎', '念之战矛', '冲云念气场', '奔雷螺旋击', '禅语·形灭']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.SAJAHU, Ref.THUNDERTIGER, Ref.KIKOUKEN, Ref.LIGHTNINGDRAGON, Ref.NENFLOWER, Ref.NENSPEAREX, Ref.SPIRALCOLUMNEX, Ref.SPIRALEMPERORSLAP, Ref.GLOWINGTIGER]), + ] # [念气环绕 : 袭]、 [念气环绕 : 御]的念气球范围增加 : 50% # 风雷引 @@ -1755,6 +1850,7 @@ class Skill45(PassiveSkill): """ name = '风雷引' + ref = Ref.SPIRALINHALE cellPos = (8,13) learnLv = 75 masterLv = 1 @@ -1823,6 +1919,7 @@ class Skill46(ActiveSkill): """ name = '月辉念气破' + ref = Ref.MOONLIGHTTHEEARTH cellPos = (6,14) learnLv = 80 masterLv = 40 @@ -1887,6 +1984,7 @@ class Skill47(ActiveSkill): """ name = '月华万象' + ref = Ref.GLANCETHEHOST cellPos = (7,14) learnLv = 85 masterLv = 40 @@ -1928,6 +2026,7 @@ class Skill48(PassiveSkill): """ name = '禅意·万象' + ref = Ref.ATTAINTHENATURE cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1946,7 +2045,11 @@ class Skill48(PassiveSkill): # 风雷能量自然恢复周期 : {value2}秒 data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 禅语·形灭 # fighter_male/nenmaster_male/33ad4930f4724a7d025c3046c6f6074b @@ -1958,6 +2061,7 @@ class Skill49(ActiveSkill): """ name = '禅语·形灭' + ref = Ref.GLOWINGTIGER cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1995,6 +2099,7 @@ class Skill50(ActiveSkill): """ name = '禅念·归一' + ref = Ref.HEAVENANDEARTH cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/fighter_male/striker_male.py b/backend/core/character/GF/fighter_male/striker_male.py index 40b6b716..a716783b 100644 --- a/backend/core/character/GF/fighter_male/striker_male.py +++ b/backend/core/character/GF/fighter_male/striker_male.py @@ -1,6 +1,15 @@ #ca0f0e0e9e1d55b5f9955b03d9dd213c from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.fighter_male.striker_male import StrikerMaleSkillRef as Ref prefix = "fighter_male/striker_male/cn/skillDetail" @@ -12,6 +21,7 @@ class Skill0(ActiveSkill): 向敌人发出强威力的后踢使其浮空,施放的瞬间有霸体判定。\n """ name = "后踢" + ref = Ref.LIFTUPPER learnLv = 1 masterLv = 10 maxLv = 20 @@ -40,6 +50,7 @@ class Skill1(ActiveSkill): 像锤击一样挥舞双腿踢飞敌人。\n """ name = "前踢" + ref = Ref.SINGLEKICK learnLv = 1 masterLv = 60 maxLv = 70 @@ -66,6 +77,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -89,6 +101,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -116,6 +129,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -157,6 +171,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -179,6 +194,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -203,6 +219,7 @@ class Skill7(ActiveSkill): 被直接命中的敌人不受冲击波伤害。\n """ name = "下段踢" + ref = Ref.DAMAGELOWKICK cellPos = (2,2) learnLv = 5 masterLv = 60 @@ -237,6 +254,7 @@ class Skill8(ActiveSkill): 转职成气功师后,可以学习[幻影爆碎]技能。\n """ name = "分身" + ref = Ref.KENSIN learnLv = 5 masterLv = 10 maxLv = 20 @@ -268,6 +286,7 @@ class Skill9(ActiveSkill): 下方向键 : 把敌人扔向地面,并产生冲击波攻击周围敌人\n """ name = "膝击" + ref = Ref.SUPLEX learnLv = 5 masterLv = 60 maxLv = 70 @@ -307,6 +326,7 @@ class Skill10(ActiveSkill): [蹲伏]姿势中按攻击键,可以用肩尖撞击敌人; 经过一定时间或按跳跃键可以中断蹲伏状态。\n """ name = "蹲伏" + ref = Ref.CROUCH cellPos = (7,3) learnLv = 10 masterLv = 1 @@ -333,6 +353,7 @@ class Skill11(PassiveSkill): 使自身的身体强悍如钢铁,并增加一定的物防和体力。 被击时,有一定几率使自身进入霸体状态。\n """ name = "钢筋铁骨" + ref = Ref.PHYSICALDEFENSEUP cellPos = (4,3) learnLv = 10 masterLv = 50 @@ -360,6 +381,7 @@ class Skill12(ActiveSkill): 可以连续对敌人进行一定次数的踩踏。 技能的冷却时间从最后一次踩踏结束落地时开始计算。\n """ name = "鹰踏" + ref = Ref.STOMP cellPos = (3,3) learnLv = 10 masterLv = 60 @@ -391,6 +413,7 @@ class Skill13(ActiveSkill): 该技能的基本攻击只有1次,但学习[疾风连击]后可再追加1次。\n """ name = "疾风追击" + ref = Ref.DASHAFTERDASH cellPos = (8,3) learnLv = 10 masterLv = 60 @@ -424,6 +447,7 @@ class Skill14(ActiveSkill): 可以强制中断基本攻击动作,并立即施放该技能; 攻击方式变更为肘击,且对敌人造成更多伤害; 可以强制中断施放后的僵直动作,并立即施放[霹雳旋踢]。\n """ name = "金刚碎" + ref = Ref.EARTHBREAK learnLv = 10 masterLv = 60 maxLv = 70 @@ -460,6 +484,7 @@ class Skill15(ActiveSkill): 撞到敌人时停止移动。\n """ name = "瞬步" + ref = Ref.FASTDASH cellPos = (6,3) learnLv = 10 masterLv = 1 @@ -487,6 +512,7 @@ class Skill16(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -514,6 +540,7 @@ class Skill17(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -541,6 +568,7 @@ class Skill18(ActiveSkill): 转职为气功师后,可以强制中断基本攻击和前冲攻击动作,并立即施放该技能,同时可以学习[蓄念炮]。\n """ name = "念气波" + ref = Ref.ENERGYBALL learnLv = 15 masterLv = 60 maxLv = 70 @@ -578,6 +606,7 @@ class Skill19(ActiveSkill): 转职为街霸后,可以强制中断基本攻击并施放。\n """ name = "抛沙" + ref = Ref.THROWSAND learnLv = 15 masterLv = 60 maxLv = 70 @@ -613,6 +642,7 @@ class Skill20(PassiveSkill): <12::equip_boxing_glove_explain>\n """ name = "拳套掌握" + ref = Ref.EQUIPBOXINGGLOVE cellPos = (1,4) learnLv = 15 masterLv = 10 @@ -626,8 +656,12 @@ class Skill20(PassiveSkill): # 冷却时间减少率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0,"type":"*cdReduce", 'exceptSkills': ['双重释放', '烈焰焚步', '极武霸皇踢', '焚火逐日拳']} + # ] associate = [ - {"data":data0,"type":"*cdReduce", 'exceptSkills': ['双重释放', '烈焰焚步', '极武霸皇踢', '焚火逐日拳']} + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data0)), except_skills=[Ref.DOUBLEOPEN, Ref.FLAMELEGS, Ref.EMPERORCOMBINATION, Ref.MORTALFIST]), ] # 强拳 @@ -638,6 +672,7 @@ class Skill21(ActiveSkill): 集中体内的能量,增加命中敌人的僵直比率和自身暴击伤害,效果持续一定时间。\n """ name = "强拳" + ref = Ref.SLOWDOWNPOWERUP cellPos = (5,4) learnLv = 15 masterLv = 20 @@ -668,6 +703,7 @@ class Skill22(ActiveSkill): 可以通过按方向键,调整方向移动施放。\n """ name = "肘击" + ref = Ref.DASHPUNCH cellPos = (7,4) learnLv = 15 masterLv = 60 @@ -700,6 +736,7 @@ class Skill23(ActiveSkill): 可以使自身增加物理/魔法防御力和体力,而且被攻击后不会倒地,但仍会受到伤害,效果持续一定时间。\n """ name = "霸体护甲" + ref = Ref.SUPERARMOR cellPos = (4,5) learnLv = 20 masterLv = 20 @@ -730,6 +767,7 @@ class Skill24(PassiveSkill): 施放[疾风追击]时,可以向敌人发出第2、 3击。\n """ name = "疾风连击" + ref = Ref.DASHAFTERDASHEXTENSION cellPos = (8,5) learnLv = 20 masterLv = 1 @@ -750,6 +788,7 @@ class Skill25(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -773,6 +812,7 @@ class Skill26(ActiveSkill): 按前方向键,可以滑行得更远进行攻击。\n """ name = "铁山靠" + ref = Ref.SHOULDERCHARGE cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -807,6 +847,7 @@ class Skill27(ActiveSkill): 被直接击中的敌人不受冲击波伤害。\n """ name = "碎骨" + ref = Ref.CRASHLOWKICK cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -853,6 +894,7 @@ class Skill28(PassiveSkill): 在空中可以使用[柔化肌肉]强制中断。\n """ name = "强袭重击" + ref = Ref.STRENGTHFIREHANDSTRIKE cellPos = (3,5) learnLv = 25 masterLv = 1 @@ -867,8 +909,12 @@ class Skill28(PassiveSkill): # [鹰踏]攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) + # 迁移前实现(保留对照): + # associate = [ + # {"type":"*skillDamage","data":data0,"skills":["鹰踏"]}, + # ] associate = [ - {"type":"*skillDamage","data":data0,"skills":["鹰踏"]}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.STOMP]), ] # 弱点感知 @@ -879,6 +925,7 @@ class Skill29(PassiveSkill): 感知敌人的弱点,并增加自身的物理暴击率和物理命中率。\n """ name = "弱点感知" + ref = Ref.AIMVITALPOINT cellPos = (5,7) learnLv = 30 masterLv = 10 @@ -905,6 +952,7 @@ class Skill30(ActiveSkill): 转职成为散打时,才可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "旋风腿" + ref = Ref.WHIRLWINDKICK cellPos = (7,7) learnLv = 30 masterLv = 60 @@ -936,6 +984,7 @@ class Skill31(PassiveSkill): 在决斗场中有起始冷却时间,起始冷却时间结束后自动激活。 技能攻击力增加率效果仅适用于柔化后使用的技能。\n """ name = "柔化肌肉" + ref = Ref.MUSCLESHIFT cellPos = (4,7) learnLv = 30 masterLv = 5 @@ -960,7 +1009,11 @@ class Skill31(PassiveSkill): # - [决斗场] - # 起始冷却时间 : 10秒 - associate = [{"type":"*skillDamage","data":data2}] + # 迁移前实现(保留对照): + # associate = [{"type":"*skillDamage","data":data2}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # - [决斗场] - # 起始冷却时间 : 10秒 @@ -975,6 +1028,7 @@ class Skill32(PassiveSkill): 学习[闪步]后,身手变得更加灵活,[瞬步]移动过程中即使撞到敌人也不会停下。\n """ name = "闪步" + ref = Ref.SHINESTEP cellPos = (6,7) learnLv = 30 masterLv = 1 @@ -998,6 +1052,7 @@ class Skill33(ActiveSkill): 使用[柔化肌肉]强制中断后施放时,也可以转换方向。\n """ name = "闪击快打" + ref = Ref.MOMENTATTACK cellPos = (8,7) learnLv = 30 masterLv = 60 @@ -1030,6 +1085,7 @@ class Skill34(ActiveSkill): 虽然此技能破坏力极大,但是未命中敌人时会出现极大的空隙。\n """ name = "冲膝" + ref = Ref.CLOSEPUNCH cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -1088,6 +1144,7 @@ class Skill35(ActiveSkill): 在决斗场中,无法用跳跃键取消技能。\n """ name = "炽焰旋风腿" + ref = Ref.RISINGUPPER cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1147,6 +1204,7 @@ class Skill36(ActiveSkill): 在决斗场中,被[闪电之舞]击中的敌人会微微浮空并被束缚。\n """ name = "闪电之舞" + ref = Ref.LIGHTNINGDANCE cellPos = (4,9) learnLv = 40 masterLv = 60 @@ -1209,6 +1267,7 @@ class Skill37(ActiveSkill): 但是,在决斗场中无法在落地时使用[柔化肌肉]强制施放其他技能。\n """ name = "瞬影连环踢" + ref = Ref.RANDOMKICK cellPos = (3,10) learnLv = 45 masterLv = 60 @@ -1262,6 +1321,7 @@ class Skill38(PassiveSkill): 可以在已学习的技能栏中,打开/关闭[烈焰焚步]的地面伤害。\n """ name = "烈焰燃烧" + ref = Ref.EFFICIENTBURN cellPos = (6,11) learnLv = 48 masterLv = 40 @@ -1280,7 +1340,11 @@ class Skill38(PassiveSkill): # 魔法值消耗量减少率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{"type":"$*PAtkP","data":data0}] + # 迁移前实现(保留对照): + # associate = [{"type":"$*PAtkP","data":data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 烈焰焚步 # fighter_male/striker_male/01384bbfc346775d1267fa0bc4ca605f @@ -1290,6 +1354,7 @@ class Skill39(ActiveSkill): 召唤地狱烈焰缠绕在双脚上; 可以减少除[烈焰焚步]、 [双重释放]、 [极武霸皇踢]、 [焚火逐日拳]以外的散打系列技能的冷却时间、 技能施放后的僵直时间,同时还可以增加敌人的僵直时间以及技能和基本攻击的攻击力。\n """ name = "烈焰焚步" + ref = Ref.FLAMELEGS cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1327,9 +1392,14 @@ class Skill39(ActiveSkill): # [柔化肌肉]蓄气时间减少 : {value9}秒 data9 = get_data(f'{prefix}/{uuid}', 9) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data1,"type":"*cdReduce", 'exceptSkills': ['双重释放', '烈焰焚步', '极武霸皇踢', '焚火逐日拳']}, + # {"type":"*skillDamage","data":data5}, + # ] associate = [ - {"data":data1,"type":"*cdReduce", 'exceptSkills': ['双重释放', '烈焰焚步', '极武霸皇踢', '焚火逐日拳']}, - {"type":"*skillDamage","data":data5}, + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data1)), except_skills=[Ref.DOUBLEOPEN, Ref.FLAMELEGS, Ref.EMPERORCOMBINATION, Ref.MORTALFIST]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data5))), ] # 双重释放 @@ -1342,6 +1412,7 @@ class Skill40(ActiveSkill): 学习后,技能等级与[烈焰焚步]同步。\n """ name = "双重释放" + ref = Ref.DOUBLEOPEN cellPos = (5,12) learnLv = 50 masterLv = 1 @@ -1361,14 +1432,7 @@ class Skill40(ActiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) hit0 = 1 - @property - def lv(self): - """技能等级""" - return self.char.GetSkillByName("烈焰焚步").lv - - @lv.setter - def lv(self, value): - ... + level_source = Ref.FLAMELEGS # 飞燕旋风 # fighter_male/striker_male/8e358ecf99ac9df31a6132aeafe378a9 @@ -1379,6 +1443,7 @@ class Skill41(ActiveSkill): 施放技能时,按前方向键可以向前方跳跃。\n """ name = "飞燕旋风" + ref = Ref.FLYINGCHAINKICK cellPos = (7,12) learnLv = 60 masterLv = 40 @@ -1438,6 +1503,7 @@ class Skill42(ActiveSkill): 被击中的敌人会向后飞出并倒地。\n """ name = "旋风碎心踢" + ref = Ref.HURRICANESPEAR cellPos = (7,13) learnLv = 70 masterLv = 40 @@ -1500,6 +1566,7 @@ class Skill43(ActiveSkill): 在空中可以强制中断该技能并使用[柔化肌肉]。\n """ name = "烈火强踢" + ref = Ref.DROPFIRE cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1554,6 +1621,7 @@ class Skill44(PassiveSkill): 学习后,会根据[烈火支配]的效果增加技能攻击力和基本攻击力,增加[柔化肌肉]的强制中断次数、 减少恢复时间。\n """ name = "烈火支配" + ref = Ref.ATFIREPOWERRELEASE cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1572,7 +1640,11 @@ class Skill44(PassiveSkill): # [柔化肌肉]强制中断次数增加 : {value2} data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [ {"type":"*skillDamage","data":data0} ] + # 迁移前实现(保留对照): + # associate = [ {"type":"*skillDamage","data":data0} ] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 烈火强拳 # fighter_male/striker_male/e1daab884dd07fc9e70d08b83d1790eb @@ -1584,6 +1656,7 @@ class Skill45(ActiveSkill): 输入向前方向键时,突进距离会调整到前方。 输入向后方向键时,突进距离会调整到原地。\n """ name = "烈火强拳" + ref = Ref.ATOMICCANNON cellPos = (5,14) learnLv = 80 masterLv = 40 @@ -1636,6 +1709,7 @@ class Skill46(ActiveSkill): 以电光火石般的拳击把前方的敌人聚集到击打地点,左右轮番攻击一次,并且把全身的力量聚于腿的末端,使用穿刺前方的强力飞踢对敌人造成大量伤害。\n """ name = "极武霸皇踢" + ref = Ref.EMPERORCOMBINATION cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -1674,6 +1748,7 @@ class Skill47(PassiveSkill): [烈焰焚步] : 可以在施放其他技能的过程中双重施放,利用双重施放强化后的技能在命中敌人之前,双重施放功能处于未激活状态。\n """ name = "千锤百炼" + ref = Ref.LIMITBREAK cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1688,7 +1763,11 @@ class Skill47(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [ {"type":"*skillDamage","data":data0} ] + # 迁移前实现(保留对照): + # associate = [ {"type":"*skillDamage","data":data0} ] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 炼狱坠星腿 # fighter_male/striker_male/5536486eaf9b13c9a8283447cb5e77ab @@ -1699,6 +1778,7 @@ class Skill48(ActiveSkill): 双重释放激活的状态下,产生更强力的冲击波,冲击波适用双重释放攻击力。\n """ name = "炼狱坠星腿" + ref = Ref.MORTALASSAULT cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1731,6 +1811,7 @@ class Skill49(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "焚火逐日拳" + ref = Ref.MORTALFIST cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/gunblader/agent.py b/backend/core/character/GF/gunblader/agent.py index 50bd98b5..895e73c1 100644 --- a/backend/core/character/GF/gunblader/agent.py +++ b/backend/core/character/GF/gunblader/agent.py @@ -1,6 +1,16 @@ # 986c2b3d72ee0e4a0b7fcfbe786d4e02 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunblader.agent import AgentSkillRef as Ref prefix = "gunblader/agent/cn/skillDetail" @@ -15,6 +25,7 @@ class Skill0(ActiveSkill): """ name = '弦月斩' + ref = Ref.CRESCENTMOONSLASH cellPos = (6,1) learnLv = 1 masterLv = 10 @@ -44,6 +55,7 @@ class Skill1(ActiveSkill): """ name = '穿透射击' + ref = Ref.ANGLESHOT cellPos = (2,1) learnLv = 1 masterLv = 60 @@ -77,6 +89,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -101,6 +114,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -120,7 +134,11 @@ class Skill3(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['斩射']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['斩射']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.CUTANDSHOT]), + ] # 受身蹲伏 # gunblader/agent/ce26c6b69d02a440a81b552bec94f03b @@ -130,6 +148,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -171,6 +190,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -193,6 +213,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -218,6 +239,7 @@ class Skill7(ActiveSkill): """ name = '重劈' + ref = Ref.HOPSLASH cellPos = (2,2) learnLv = 5 masterLv = 60 @@ -249,6 +271,7 @@ class Skill8(ActiveSkill): 转职为战线佣兵后,增加攻击力与爆炸范围。\n """ name = "G型手榴弹" + ref = Ref.GBOMB learnLv = 10 masterLv = 60 maxLv = 70 @@ -283,6 +306,7 @@ class Skill9(ActiveSkill): """ name = '瞬击' + ref = Ref.NECKBREAKING cellPos = (4,3) learnLv = 10 masterLv = 60 @@ -314,6 +338,7 @@ class Skill10(ActiveSkill): """ name = '浮空连击' + ref = Ref.DEADLIFT cellPos = (2,3) learnLv = 10 masterLv = 60 @@ -344,6 +369,7 @@ class Skill11(ActiveSkill): 装备源力剑时,无需注入源能直接发动斩击。\n """ name = "源光斩" + ref = Ref.BEAMSLASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -378,6 +404,7 @@ class Skill12(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -405,6 +432,7 @@ class Skill13(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -432,6 +460,7 @@ class Skill14(ActiveSkill): """ name = '迅步突袭' + ref = Ref.ROMANDASH cellPos = (8,4) learnLv = 15 masterLv = 60 @@ -459,6 +488,7 @@ class Skill15(ActiveSkill): """ name = '连续射击' + ref = Ref.CONTINUOUSFIRE cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -493,6 +523,7 @@ class Skill16(PassiveSkill): """ name = '特工秘技' + ref = Ref.TACTICALAGENT cellPos = (1,4) learnLv = 15 masterLv = 10 @@ -511,7 +542,11 @@ class Skill16(PassiveSkill): # 暴击伤害增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': data2}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data2}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # 源能护盾 # gunblader/agent/0232c151ef3731c2dede51931a374723 @@ -529,6 +564,7 @@ class Skill17(ActiveSkill): """ name = '源能护盾' + ref = Ref.CORESHIELD cellPos = (0,4) learnLv = 15 masterLv = 60 @@ -577,6 +613,7 @@ class Skill18(ActiveSkill): """ name = '斩射' + ref = Ref.CUTANDSHOT cellPos = (6,4) learnLv = 15 masterLv = 1 @@ -611,6 +648,7 @@ class Skill19(PassiveSkill): """ name = '迅步闪避' + ref = Ref.EVASION cellPos = (8,5) learnLv = 20 masterLv = 1 @@ -637,6 +675,7 @@ class Skill20(ActiveSkill): """ name = '双弦斩' + ref = Ref.DOUBLEHALFMOONSLASH cellPos = (6,5) learnLv = 20 masterLv = 60 @@ -672,6 +711,7 @@ class Skill21(PassiveSkill): """ name = '小太刀精通' + ref = Ref.SHORTBLADEMASTERY cellPos = (1,5) learnLv = 20 masterLv = 10 @@ -689,7 +729,11 @@ class Skill21(PassiveSkill): # 命中率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'type': '$*PAtkP', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '$*PAtkP', 'data': data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 暴击 # gunblader/agent/fc1262c19f3d0477ee8eda47b8db8696 @@ -699,6 +743,7 @@ class Skill22(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -723,6 +768,7 @@ class Skill23(ActiveSkill): """ name = '月光挥斩' + ref = Ref.MOONLIGHTSLASH cellPos = (6,6) learnLv = 25 masterLv = 60 @@ -760,6 +806,7 @@ class Skill24(ActiveSkill): """ name = '精准射击' + ref = Ref.SIGHTINGSHOT cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -799,6 +846,7 @@ class Skill25(ActiveSkill): """ name = '追踪目标' + ref = Ref.TARGETING cellPos = (3,7) learnLv = 30 masterLv = 1 @@ -822,6 +870,7 @@ class Skill26(ActiveSkill): """ name = '特工使命' + ref = Ref.MISSIONSTART cellPos = (1,7) learnLv = 30 masterLv = 10 @@ -855,6 +904,7 @@ class Skill27(ActiveSkill): """ name = '月影秘步' + ref = Ref.DARKMOONSTEP cellPos = (8,8) learnLv = 35 masterLv = 60 @@ -912,6 +962,7 @@ class Skill28(ActiveSkill): """ name = '满月斩' + ref = Ref.FULLMOONLIGHTSLASH cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -970,6 +1021,7 @@ class Skill29(ActiveSkill): """ name = '锁定射击' + ref = Ref.TARGETINGFIRE cellPos = (4,9) learnLv = 40 masterLv = 60 @@ -1030,6 +1082,7 @@ class Skill30(ActiveSkill): """ name = '枪刃旋杀' + ref = Ref.BLADEFALCON cellPos = (7,10) learnLv = 45 masterLv = 60 @@ -1092,6 +1145,7 @@ class Skill31(PassiveSkill): """ name = '使命觉悟' + ref = Ref.PINPOINT cellPos = (4,11) learnLv = 48 masterLv = 40 @@ -1108,7 +1162,11 @@ class Skill31(PassiveSkill): # 寻敌范围增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 毁灭绝击 # gunblader/agent/01c3a2fb793d293a25ed8dc7a0d70c1a @@ -1121,6 +1179,7 @@ class Skill32(ActiveSkill): """ name = '毁灭绝击' + ref = Ref.KEYFIGUREASSASSINATION cellPos = (6,11) learnLv = 50 masterLv = 40 @@ -1154,6 +1213,7 @@ class Skill33(ActiveSkill): """ name = '终极锁定' + ref = Ref.CATCHTARGET cellPos = (8,12) learnLv = 60 masterLv = 40 @@ -1205,6 +1265,7 @@ class Skill34(ActiveSkill): """ name = '月相轮舞' + ref = Ref.MOONPHASE cellPos = (8,13) learnLv = 70 masterLv = 40 @@ -1269,6 +1330,7 @@ class Skill35(PassiveSkill): """ name = '冷酷敌意' + ref = Ref.COLDBLOOD cellPos = (4,13) learnLv = 75 masterLv = 40 @@ -1287,9 +1349,14 @@ class Skill35(PassiveSkill): # 迅步突袭冷却时间缩短 : {value2}秒 data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data1}, + # {'type': '+cd', 'data': [0] + [-1] * maxLv, 'skills': ['迅步突袭'], 'ratio': 1}, + # ] associate = [ - {'type': '*skillDamage', 'data': data1}, - {'type': '+cd', 'data': [0] + [-1] * maxLv, 'skills': ['迅步突袭'], 'ratio': 1}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + SkillEffect(attribute=SkillAttribute.CD, operation=Operation.ADD, value=LevelTable([0] + [-1] * maxLv), skills=[Ref.ROMANDASH]), ] # 月光镇魂曲 @@ -1303,6 +1370,7 @@ class Skill36(ActiveSkill): """ name = '月光镇魂曲' + ref = Ref.MOONLIGHTREQUIEM cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1365,6 +1433,7 @@ class Skill37(ActiveSkill): """ name = '毁灭狂欢' + ref = Ref.FUSILLADE cellPos = (4,14) learnLv = 80 masterLv = 40 @@ -1427,6 +1496,7 @@ class Skill38(ActiveSkill): """ name = '月相天陨' + ref = Ref.MOONECLIPSE cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -1467,6 +1537,7 @@ class Skill39(PassiveSkill): """ name = '无瑕' + ref = Ref.PERFECTION cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1481,7 +1552,11 @@ class Skill39(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 夜影迷踪 # gunblader/agent/c5a2956d8ed3af1746ed2f76ca971a09 @@ -1494,6 +1569,7 @@ class Skill40(ActiveSkill): """ name = '夜影迷踪' + ref = Ref.DOWNUPMOON cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1530,6 +1606,7 @@ class Skill41(ActiveSkill): """ name = '月夜 : 终极行动' + ref = Ref.LASTMISSION cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/gunblader/hitman.py b/backend/core/character/GF/gunblader/hitman.py index 99c7a485..394d4118 100644 --- a/backend/core/character/GF/gunblader/hitman.py +++ b/backend/core/character/GF/gunblader/hitman.py @@ -1,6 +1,20 @@ # 986c2b3d72ee0e4a0b7fcfbe786d4e02 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Equals, + Hit, + LevelTable, + Operation, + Percent, + Power, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunblader.hitman import HitmanSkillRef as Ref prefix = "gunblader/hitman/cn/skillDetail" @@ -14,6 +28,7 @@ class Skill0(ActiveSkill): 浮空力随技能等级的增加而增加。\n """ name = "弦月斩" + ref = Ref.CRESCENTMOONSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -43,6 +58,7 @@ class Skill1(ActiveSkill): """ name = '穿透射击' + ref = Ref.ANGLESHOT cellPos = (2,1) learnLv = 1 masterLv = 60 @@ -78,6 +94,7 @@ class Skill2(PassiveSkill): """ name = '幽灵近战术' + ref = Ref.SPECTER5 cellPos = (6,1) learnLv = 1 masterLv = 1 @@ -98,6 +115,7 @@ class Skill3(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -122,6 +140,7 @@ class Skill4(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -149,6 +168,7 @@ class Skill5(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -190,6 +210,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -212,6 +233,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -237,6 +259,7 @@ class Skill8(ActiveSkill): """ name = '重劈' + ref = Ref.HOPSLASH cellPos = (1,2) learnLv = 5 masterLv = 60 @@ -269,6 +292,7 @@ class Skill9(ActiveSkill): """ name = 'G型手榴弹' + ref = Ref.GBOMB cellPos = (6,3) learnLv = 10 masterLv = 60 @@ -304,6 +328,7 @@ class Skill10(ActiveSkill): """ name = '瞬击' + ref = Ref.NECKBREAKING cellPos = (4,3) learnLv = 10 masterLv = 60 @@ -335,6 +360,7 @@ class Skill11(ActiveSkill): """ name = '浮空连击' + ref = Ref.DEADLIFT cellPos = (1,3) learnLv = 10 masterLv = 60 @@ -365,6 +391,7 @@ class Skill12(ActiveSkill): 装备源力剑时,无需注入源能直接发动斩击。\n """ name = "源光斩" + ref = Ref.BEAMSLASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -399,6 +426,7 @@ class Skill13(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -426,6 +454,7 @@ class Skill14(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -458,6 +487,7 @@ class Skill15(ActiveSkill): 在决斗场中,被攻击和使用[受身蹲伏]时无法手动引爆。\n """ name = "源能护盾" + ref = Ref.CORESHIELD learnLv = 15 masterLv = 60 maxLv = 70 @@ -505,6 +535,7 @@ class Skill16(PassiveSkill): """ name = '长刀精通' + ref = Ref.LONGBLADEMASTERY cellPos = (1,4) learnLv = 15 masterLv = 10 @@ -524,9 +555,14 @@ class Skill16(PassiveSkill): # 命中率增加 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkP', 'data': data0}, + # {'type': '*cdReduce', 'data': data2, 'exceptSkills': ['电光飞掠', '集结·暮光之翼', '暮光密令 : 黎明决战']}, + # ] associate = [ - {'type': '$*PAtkP', 'data': data0}, - {'type': '*cdReduce', 'data': data2, 'exceptSkills': ['电光飞掠', '集结·暮光之翼', '暮光密令 : 黎明决战']}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data2)), except_skills=[Ref.BLITZKRIEG, Ref.WINGSOFTWILIGHT, Ref.DAWNOFFLIGHT]), ] # 捷影步 @@ -540,6 +576,7 @@ class Skill17(ActiveSkill): """ name = '捷影步' + ref = Ref.RAPIDMOVE cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -573,6 +610,7 @@ class Skill18(ActiveSkill): """ name = '掩护射击' + ref = Ref.CUVERINGFIRE cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -611,6 +649,7 @@ class Skill19(ActiveSkill): """ name = '剑刃突刺' + ref = Ref.SUPRISECUT cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -652,6 +691,7 @@ class Skill20(ActiveSkill): """ name = '轮盘连射' + ref = Ref.DEAD6 cellPos = (4,5) learnLv = 20 masterLv = 60 @@ -695,6 +735,7 @@ class Skill21(PassiveSkill): """ name = '暴击' + ref = Ref.PHYSICALCRITICALHITUP cellPos = (5,0) learnLv = 20 masterLv = 10 @@ -719,6 +760,7 @@ class Skill22(ActiveSkill): """ name = '利刃旋斩' + ref = Ref.BILLDRILL cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -762,6 +804,7 @@ class Skill23(PassiveSkill): """ name = '暗刃战略' + ref = Ref.VETERANSEXPERT cellPos = (1,6) learnLv = 25 masterLv = 10 @@ -778,7 +821,11 @@ class Skill23(PassiveSkill): # 物理暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 潜行射击 # gunblader/hitman/6e33d47e6622ce03b6defdd912140270 @@ -791,6 +838,7 @@ class Skill24(ActiveSkill): """ name = '潜行射击' + ref = Ref.SUDDENSTRIKE cellPos = (3,6) learnLv = 25 masterLv = 60 @@ -826,6 +874,7 @@ class Skill25(ActiveSkill): """ name = '战术指示' + ref = Ref.TACTICSCOMMAND cellPos = (7,7) learnLv = 30 masterLv = 10 @@ -866,6 +915,7 @@ class Skill26(ActiveSkill): """ name = '游弹枪袭' + ref = Ref.MASSEDFIRE cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -904,6 +954,7 @@ class Skill27(ActiveSkill): """ name = '全方位射击' + ref = Ref.ALPHASTRIKE cellPos = (2,8) learnLv = 35 masterLv = 60 @@ -963,6 +1014,7 @@ class Skill28(ActiveSkill): """ name = '回旋飞剑' + ref = Ref.CARACOLE cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -1030,6 +1082,7 @@ class Skill29(ActiveSkill): """ name = '枪刃乱舞' + ref = Ref.RAMPAGE cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -1095,6 +1148,7 @@ class Skill30(ActiveSkill): """ name = '疾光斩' + ref = Ref.THELASTATTACK cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1143,6 +1197,7 @@ class Skill31(PassiveSkill): """ name = 'B.G枪刃改造' + ref = Ref.BGFIRETOOL cellPos = (1,11) learnLv = 48 masterLv = 40 @@ -1157,7 +1212,11 @@ class Skill31(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 电光飞掠 # gunblader/hitman/669f1428193f61f9d92c743b72438c4d @@ -1170,6 +1229,7 @@ class Skill32(ActiveSkill): """ name = '电光飞掠' + ref = Ref.BLITZKRIEG cellPos = (6,11) learnLv = 50 masterLv = 40 @@ -1214,6 +1274,7 @@ class Skill33(ActiveSkill): """ name = '近敌灭杀' + ref = Ref.POINTBLANK cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1275,6 +1336,7 @@ class Skill34(ActiveSkill): """ name = '大回旋坠斩' + ref = Ref.HELIXDIVE cellPos = (3,13) learnLv = 70 masterLv = 40 @@ -1335,10 +1397,14 @@ class Skill34(ActiveSkill): self.cd = 25 self.skillRation *= 0.5 - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '*skillRation', 'data': [0] + [-50] * self.maxLv, 'skills': ['潜行射击']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-50] * self.maxLv, 'skills': ['潜行射击']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-50] * maxLv)), skills=[Ref.SUDDENSTRIKE], when=Equals(Read(SkillAttribute.VP), 2)), + ] # B.C精锐特训 # gunblader/hitman/38612d8f2561edc2eb68d5057a837bfa @@ -1352,6 +1418,7 @@ class Skill35(PassiveSkill): """ name = 'B.C精锐特训' + ref = Ref.BATTLECOMMANDTRAINING cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1366,7 +1433,11 @@ class Skill35(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 致命焰火 # gunblader/hitman/6a1d1f08a6572be420bb3a256c44c015 @@ -1381,6 +1452,7 @@ class Skill36(ActiveSkill): """ name = '致命焰火' + ref = Ref.TACTICALOFFENSIVE cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1453,10 +1525,14 @@ class Skill36(ActiveSkill): self.cd = 20 self.skillRation *= 0.5 - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '*skillRation', 'data': [0] + [-50] * self.maxLv, 'skills': ['潜行射击']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-50] * self.maxLv, 'skills': ['潜行射击']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-50] * maxLv)), skills=[Ref.SUDDENSTRIKE], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 碧波瞬斩 # gunblader/hitman/a2d943797daca862a6f321aca6ac9bfa @@ -1471,6 +1547,7 @@ class Skill37(ActiveSkill): """ name = '碧波瞬斩' + ref = Ref.BLUEWAVESLASH cellPos = (5,14) learnLv = 80 masterLv = 40 @@ -1526,6 +1603,7 @@ class Skill38(ActiveSkill): """ name = '集结·暮光之翼' + ref = Ref.WINGSOFTWILIGHT cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -1572,6 +1650,7 @@ class Skill39(PassiveSkill): """ name = '暮光战略' + ref = Ref.DUSKTACTICS cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1592,7 +1671,13 @@ class Skill39(PassiveSkill): # [轮盘连射]罗朗斩击攻击力 : [轮盘连射]攻击力总和的{value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data0, 'type': '*skillDamage'}, {'data': data1, 'type': '=hit2', 'skills': ['轮盘连射'], 'ratio': 1}, {'data': [i - 100 if i > 0 else 0 for i in data2], 'type': '*power2', 'skills': ['轮盘连射']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}, {'data': data1, 'type': '=hit2', 'skills': ['轮盘连射'], 'ratio': 1}, {'data': [i - 100 if i > 0 else 0 for i in data2], 'type': '*power2', 'skills': ['轮盘连射']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=Hit(2), operation=Operation.ASSIGN, value=LevelTable(data1), skills=[Ref.DEAD6]), + SkillEffect(attribute=Power(2), value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data2])), skills=[Ref.DEAD6]), + ] # 燃情协战 # gunblader/hitman/e5c09f9132a48dc1d695968592cc5878 @@ -1606,6 +1691,7 @@ class Skill40(ActiveSkill): """ name = '燃情协战' + ref = Ref.CALLSIGNALCOVERING cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1673,6 +1759,7 @@ class Skill41(ActiveSkill): """ name = '暮光密令 : 黎明决战' + ref = Ref.DAWNOFFLIGHT cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/gunblader/specialist.py b/backend/core/character/GF/gunblader/specialist.py index 7db1d59f..d3f0096b 100644 --- a/backend/core/character/GF/gunblader/specialist.py +++ b/backend/core/character/GF/gunblader/specialist.py @@ -1,6 +1,15 @@ # 986c2b3d72ee0e4a0b7fcfbe786d4e02 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunblader.specialist import SpecialistSkillRef as Ref prefix = "gunblader/specialist/cn/skillDetail" @@ -14,6 +23,7 @@ class Skill0(ActiveSkill): 浮空力随技能等级的增加而增加。\n """ name = "弦月斩" + ref = Ref.CRESCENTMOONSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -42,6 +52,7 @@ class Skill1(ActiveSkill): 子弹100%穿透目标。 转职为暗刃后,增加发射次数并应用单独的攻击力。\n """ name = "穿透射击" + ref = Ref.ANGLESHOT learnLv = 1 masterLv = 60 maxLv = 70 @@ -81,6 +92,7 @@ class Skill2(PassiveSkill): """ name = '源能提炼' + ref = Ref.INTENSION cellPos = (2,1) learnLv = 1 masterLv = 1 @@ -144,6 +156,7 @@ class Skill3(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -168,6 +181,7 @@ class Skill4(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -195,6 +209,7 @@ class Skill5(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -236,6 +251,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -258,6 +274,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -282,6 +299,7 @@ class Skill8(ActiveSkill): 向下劈砍敌人,用击打地面的剑和剑产生的冲击波的力量使敌人浮空。\n """ name = "重劈" + ref = Ref.HOPSLASH learnLv = 5 masterLv = 60 maxLv = 70 @@ -311,6 +329,7 @@ class Skill9(ActiveSkill): 转职为战线佣兵后,增加攻击力与爆炸范围。\n """ name = "G型手榴弹" + ref = Ref.GBOMB learnLv = 10 masterLv = 60 maxLv = 70 @@ -345,6 +364,7 @@ class Skill10(ActiveSkill): """ name = '瞬击' + ref = Ref.NECKBREAKING cellPos = (6,3) learnLv = 10 masterLv = 60 @@ -375,6 +395,7 @@ class Skill11(ActiveSkill): 第二次上挑攻击命中时使敌人浮空,有利于连接下一次攻击。\n """ name = "浮空连击" + ref = Ref.DEADLIFT learnLv = 10 masterLv = 60 maxLv = 70 @@ -404,6 +425,7 @@ class Skill12(ActiveSkill): """ name = '源光斩' + ref = Ref.BEAMSLASH cellPos = (2,3) learnLv = 10 masterLv = 60 @@ -440,6 +462,7 @@ class Skill13(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -467,6 +490,7 @@ class Skill14(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -494,6 +518,7 @@ class Skill15(ActiveSkill): """ name = '迅步突袭' + ref = Ref.ROMANDASH cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -527,6 +552,7 @@ class Skill16(ActiveSkill): """ name = '源能护盾' + ref = Ref.CORESHIELD cellPos = (7,4) learnLv = 15 masterLv = 60 @@ -573,6 +599,7 @@ class Skill17(ActiveSkill): """ name = '旋转源能波' + ref = Ref.ROTATIONWAVE cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -610,6 +637,7 @@ class Skill18(PassiveSkill): """ name = '源力剑精通' + ref = Ref.COREBLADEMASTERY cellPos = (0,5) learnLv = 20 masterLv = 20 @@ -629,8 +657,12 @@ class Skill18(PassiveSkill): # 攻击速度增加 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkM', 'data': data0}, + # ] associate = [ - {'type': '$*PAtkM', 'data': data0}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable(data0))), ] # 镭射源能枪 @@ -647,6 +679,7 @@ class Skill19(ActiveSkill): """ name = '镭射源能枪' + ref = Ref.TASER cellPos = (8,5) learnLv = 20 masterLv = 60 @@ -694,6 +727,7 @@ class Skill20(ActiveSkill): """ name = '源能屏障' + ref = Ref.COREBARRIER cellPos = (7,5) learnLv = 20 masterLv = 1 @@ -718,6 +752,7 @@ class Skill21(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -742,6 +777,7 @@ class Skill22(PassiveSkill): """ name = '细胞弱化' + ref = Ref.INJECTION cellPos = (0,6) learnLv = 25 masterLv = 1 @@ -756,7 +792,11 @@ class Skill22(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 源能波刃 # gunblader/specialist/8572675ec6a1f50b6eff6a867376c2de @@ -771,6 +811,7 @@ class Skill23(ActiveSkill): """ name = '源能波刃' + ref = Ref.SQUARELY cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -812,6 +853,7 @@ class Skill24(ActiveSkill): """ name = '能量飞鱼弹' + ref = Ref.EXOCET cellPos = (8,6) learnLv = 25 masterLv = 60 @@ -841,6 +883,7 @@ class Skill25(ActiveSkill): """ name = '脉冲斩' + ref = Ref.ELECTRICPILLAR cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -874,6 +917,7 @@ class Skill26(ActiveSkill): """ name = '源能应用' + ref = Ref.COREPRAXIS cellPos = (1,7) learnLv = 30 masterLv = 10 @@ -911,6 +955,7 @@ class Skill27(ActiveSkill): """ name = '引力源光弹' + ref = Ref.ATTRACTAMMUNITION cellPos = (8,8) learnLv = 35 masterLv = 60 @@ -981,6 +1026,7 @@ class Skill28(ActiveSkill): """ name = '电磁领域' + ref = Ref.EMISSION cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -1057,6 +1103,7 @@ class Skill29(ActiveSkill): """ name = '光裂斩' + ref = Ref.LIGHTNINGSLASH cellPos = (2,9) learnLv = 40 masterLv = 60 @@ -1120,6 +1167,7 @@ class Skill30(ActiveSkill): """ name = '光导裂地斩' + ref = Ref.DIVIDEEARTH cellPos = (2,10) learnLv = 45 masterLv = 60 @@ -1174,6 +1222,7 @@ class Skill31(PassiveSkill): """ name = '源能增幅' + ref = Ref.AMPLIFY cellPos = (3,11) learnLv = 48 masterLv = 40 @@ -1190,7 +1239,11 @@ class Skill31(PassiveSkill): # [源能提炼]累积数上限增加 : {value1}个 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 超能场域 # gunblader/specialist/fc458e449ee00b01dbf88d09aae65462 @@ -1205,6 +1258,7 @@ class Skill32(ActiveSkill): """ name = '超能场域' + ref = Ref.BURSTFIELD cellPos = (4,11) learnLv = 50 masterLv = 40 @@ -1259,6 +1313,7 @@ class Skill33(ActiveSkill): """ name = '能量禁锢' + ref = Ref.ENERGYBOUNCE cellPos = (7,12) learnLv = 60 masterLv = 40 @@ -1328,6 +1383,7 @@ class Skill34(ActiveSkill): """ name = '离散能量波' + ref = Ref.DISPERSION cellPos = (5,13) learnLv = 70 masterLv = 40 @@ -1386,6 +1442,7 @@ class Skill35(PassiveSkill): """ name = '源力汇聚' + ref = Ref.COREPARADIGM cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1406,7 +1463,11 @@ class Skill35(PassiveSkill): # [源能应用]物理/魔法防御力额外增加 : {value3} data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 绝望圆舞 # gunblader/specialist/2c9d9a36c8401bddff6cdb80fab8dc24 @@ -1419,6 +1480,7 @@ class Skill36(ActiveSkill): """ name = '绝望圆舞' + ref = Ref.LIGHTBRANDISH cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1476,6 +1538,7 @@ class Skill37(ActiveSkill): """ name = '聚能光幕' + ref = Ref.CEAB2 cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1547,6 +1610,7 @@ class Skill38(ActiveSkill): """ name = '终焉 : 超世界崩坏' + ref = Ref.EXCEED cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1590,6 +1654,7 @@ class Skill39(PassiveSkill): """ name = '奇点源核' + ref = Ref.SINGULARITYCORE cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1606,7 +1671,11 @@ class Skill39(PassiveSkill): # [源能提炼]能量获得额外增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 临界源能弹 # gunblader/specialist/d429147c372b549c3dadcabcba50787f @@ -1623,6 +1692,7 @@ class Skill40(ActiveSkill): """ name = '临界源能弹' + ref = Ref.BLACKSEED cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1676,6 +1746,7 @@ class Skill41(ActiveSkill): """ name = '源能场域 : 黑暗边缘' + ref = Ref.BLACKHORIZON cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/gunblader/trouble_shooter.py b/backend/core/character/GF/gunblader/trouble_shooter.py index 422d1479..571495f2 100644 --- a/backend/core/character/GF/gunblader/trouble_shooter.py +++ b/backend/core/character/GF/gunblader/trouble_shooter.py @@ -1,6 +1,17 @@ # 986c2b3d72ee0e4a0b7fcfbe786d4e02 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, + Percent, + Power, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunblader.trouble_shooter import TroubleShooterSkillRef as Ref prefix = "gunblader/trouble_shooter/cn/skillDetail" @@ -15,6 +26,7 @@ class Skill0(ActiveSkill): """ name = '弦月斩' + ref = Ref.CRESCENTMOONSLASH cellPos = (3,1) learnLv = 1 masterLv = 10 @@ -44,6 +56,7 @@ class Skill1(ActiveSkill): """ name = '穿透射击' + ref = Ref.ANGLESHOT cellPos = (2,1) learnLv = 1 masterLv = 60 @@ -77,6 +90,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -101,6 +115,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -128,6 +143,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -169,6 +185,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -191,6 +208,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -216,6 +234,7 @@ class Skill7(ActiveSkill): """ name = '重劈' + ref = Ref.HOPSLASH cellPos = (2,2) learnLv = 5 masterLv = 60 @@ -248,6 +267,7 @@ class Skill8(ActiveSkill): """ name = 'G型手榴弹' + ref = Ref.GBOMB cellPos = (8,3) learnLv = 10 masterLv = 60 @@ -273,8 +293,12 @@ class Skill8(ActiveSkill): # 爆炸范围比率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data1, 'type': '+power0', 'skills': ['G型手榴弹']}, + # ] associate = [ - {'data': data1, 'type': '+power0', 'skills': ['G型手榴弹']}, + SkillEffect(attribute=Power(0), operation=Operation.ADD, value=Percent(LevelTable(data1)), skills=[Ref.GBOMB]), ] # 瞬击 @@ -287,6 +311,7 @@ class Skill9(ActiveSkill): """ name = '瞬击' + ref = Ref.NECKBREAKING cellPos = (5,3) learnLv = 10 masterLv = 60 @@ -318,6 +343,7 @@ class Skill10(ActiveSkill): """ name = '浮空连击' + ref = Ref.DEADLIFT cellPos = (2,3) learnLv = 10 masterLv = 60 @@ -349,6 +375,7 @@ class Skill11(ActiveSkill): """ name = '源光斩' + ref = Ref.BEAMSLASH cellPos = (9,3) learnLv = 10 masterLv = 60 @@ -385,6 +412,7 @@ class Skill12(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -412,6 +440,7 @@ class Skill13(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -439,6 +468,7 @@ class Skill14(PassiveSkill): """ name = '纯熟战技' + ref = Ref.VETERANGSBATTLE cellPos = (2,4) learnLv = 15 masterLv = 1 @@ -468,6 +498,7 @@ class Skill15(ActiveSkill): """ name = '矫捷翻滚' + ref = Ref.ROLLINGMOVE cellPos = (6,4) learnLv = 15 masterLv = 1 @@ -495,6 +526,7 @@ class Skill16(ActiveSkill): """ name = '双重散射' + ref = Ref.DOUBLEBARREL cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -534,6 +566,7 @@ class Skill17(ActiveSkill): """ name = '源能护盾' + ref = Ref.CORESHIELD cellPos = (9,4) learnLv = 15 masterLv = 60 @@ -581,6 +614,7 @@ class Skill18(PassiveSkill): """ name = '重剑精通' + ref = Ref.HEAVYSWORDMASTERY cellPos = (2,5) learnLv = 20 masterLv = 20 @@ -602,7 +636,11 @@ class Skill18(PassiveSkill): # 僵直度增加 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'type': '$*PAtkP', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '$*PAtkP', 'data': data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 爆烈斩击 # gunblader/trouble_shooter/547ab2b2bd860d3e37355a9cfbc1077c @@ -616,6 +654,7 @@ class Skill19(ActiveSkill): """ name = '爆烈斩击' + ref = Ref.BREAKSHOT cellPos = (4,5) learnLv = 20 masterLv = 60 @@ -647,6 +686,7 @@ class Skill20(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -672,6 +712,7 @@ class Skill21(ActiveSkill): """ name = '充能特饮' + ref = Ref.THEVETERAN cellPos = (7,6) learnLv = 25 masterLv = 10 @@ -701,6 +742,7 @@ class Skill22(ActiveSkill): """ name = '剑刃爆弹' + ref = Ref.SWORDBOMB cellPos = (6,6) learnLv = 25 masterLv = 60 @@ -743,6 +785,7 @@ class Skill23(ActiveSkill): """ name = '广域散射' + ref = Ref.DIFFUSIONBUST cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -777,6 +820,7 @@ class Skill24(PassiveSkill): """ name = '火药改良' + ref = Ref.GUNPOWDERMASTERY cellPos = (2,7) learnLv = 30 masterLv = 10 @@ -793,7 +837,11 @@ class Skill24(PassiveSkill): # 目标技能攻击范围增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # G型火焰爆弹 # gunblader/trouble_shooter/9bff7f2559e003766fee2853dca00631 @@ -809,6 +857,7 @@ class Skill25(ActiveSkill): """ name = 'G型火焰爆弹' + ref = Ref.GRENADEFLAME cellPos = (8,7) learnLv = 30 masterLv = 60 @@ -850,6 +899,7 @@ class Skill26(ActiveSkill): """ name = '爆裂斩' + ref = Ref.BURNTOSLASH cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -909,6 +959,7 @@ class Skill27(ActiveSkill): """ name = '爆弹罗网' + ref = Ref.OPRESSION cellPos = (8,8) learnLv = 35 masterLv = 60 @@ -977,6 +1028,7 @@ class Skill28(ActiveSkill): """ name = '裂地爆刃' + ref = Ref.DISTROUBLEQUAKE cellPos = (6,9) learnLv = 40 masterLv = 60 @@ -1031,6 +1083,7 @@ class Skill29(ActiveSkill): """ name = '惊喜大礼' + ref = Ref.SUPRISEPRESENT cellPos = (4,10) learnLv = 45 masterLv = 60 @@ -1091,6 +1144,7 @@ class Skill30(PassiveSkill): """ name = '终极火力' + ref = Ref.REINFORCEFIRE cellPos = (7,11) learnLv = 48 masterLv = 40 @@ -1107,7 +1161,11 @@ class Skill30(PassiveSkill): # 物理暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # G型烬灭榴弹 # gunblader/trouble_shooter/1dad88963abdc96b091fcab185a8820d @@ -1122,6 +1180,7 @@ class Skill31(ActiveSkill): """ name = 'G型烬灭榴弹' + ref = Ref.GWIDOW cellPos = (8,11) learnLv = 50 masterLv = 40 @@ -1163,6 +1222,7 @@ class Skill32(ActiveSkill): """ name = '完美击球' + ref = Ref.PERFECTBATTING cellPos = (6,12) learnLv = 60 masterLv = 40 @@ -1227,6 +1287,7 @@ class Skill33(ActiveSkill): """ name = '夺命焰火' + ref = Ref.GETONFIRE cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1304,6 +1365,7 @@ class Skill34(PassiveSkill): """ name = '无法者之歌' + ref = Ref.OUTLAW cellPos = (7,13) learnLv = 75 masterLv = 40 @@ -1318,7 +1380,11 @@ class Skill34(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 爆弹华尔兹 # gunblader/trouble_shooter/762c4e6d030eaf0abbfe1fec2b298574 @@ -1331,6 +1397,7 @@ class Skill35(ActiveSkill): """ name = '爆弹华尔兹' + ref = Ref.VIOLENTSMASH cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1393,6 +1460,7 @@ class Skill36(ActiveSkill): """ name = '覆灭之枪' + ref = Ref.THENINEBARREL cellPos = (4,14) learnLv = 80 masterLv = 40 @@ -1451,6 +1519,7 @@ class Skill37(ActiveSkill): """ name = '终焉 : 硝烟狂欢' + ref = Ref.INCREDIBLE cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1496,6 +1565,7 @@ class Skill38(PassiveSkill): """ name = '铁血豪情' + ref = Ref.HARDBOILED cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1512,9 +1582,14 @@ class Skill38(PassiveSkill): # [广域散射]射击范围增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data0, 'type': '*skillDamage'}, + # {'type': '+cd', 'data': [0] + [-1] * maxLv, 'skills': ['矫捷翻滚'], 'ratio': 1}, + # ] associate = [ - {'data': data0, 'type': '*skillDamage'}, - {'type': '+cd', 'data': [0] + [-1] * maxLv, 'skills': ['矫捷翻滚'], 'ratio': 1}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD, operation=Operation.ADD, value=LevelTable([0] + [-1] * maxLv), skills=[Ref.ROLLINGMOVE]), ] # 铁腕爆弹 @@ -1527,6 +1602,7 @@ class Skill39(ActiveSkill): """ name = '铁腕爆弹' + ref = Ref.TERMINATESLUGGER cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1562,6 +1638,7 @@ class Skill40(ActiveSkill): """ name = '烽火硝烟·终末之征' + ref = Ref.CLIMAX cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/gunner_female/launcher_female.py b/backend/core/character/GF/gunner_female/launcher_female.py index b57646e5..c971797e 100644 --- a/backend/core/character/GF/gunner_female/launcher_female.py +++ b/backend/core/character/GF/gunner_female/launcher_female.py @@ -1,6 +1,18 @@ #944b9aab492c15a8474f96947ceeb9e4 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Equals, + LevelTable, + Operation, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunner_female.launcher_female import LauncherFemaleSkillRef as Ref prefix = "gunner_female/launcher_female/cn/skillDetail" @@ -14,6 +26,7 @@ class Skill0(ActiveSkill): 转职为弹药专家或协战师后,技能类型变为独立攻击力。\n """ name = "后撩踢" + ref = Ref.AERIALKNEE learnLv = 1 masterLv = 10 maxLv = 20 @@ -43,6 +56,7 @@ class Skill1(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "浮空弹" + ref = Ref.LIFTSHOT learnLv = 1 masterLv = 60 maxLv = 70 @@ -69,6 +83,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -92,6 +107,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -119,6 +135,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -160,6 +177,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -182,6 +200,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -205,6 +224,7 @@ class Skill7(ActiveSkill): 若发射中按住向上方向键,则可以向上发射。\n """ name = "M-137格林机枪" + ref = Ref.GATLING cellPos = (4,2) learnLv = 5 masterLv = 60 @@ -241,6 +261,7 @@ class Skill8(ActiveSkill): 在地下城中不会被敌人击中,在决斗场中适用独立的生命值和防御力。\n """ name = "RX-78追击者" + ref = Ref.ROBOTRX78 learnLv = 5 masterLv = 60 maxLv = 70 @@ -271,6 +292,7 @@ class Skill9(ActiveSkill): 攻击不死族、 恶魔、 精灵类怪物时,可以大幅度增加伤害值。\n """ name = "银弹" + ref = Ref.SILVERBULLET learnLv = 5 masterLv = 20 maxLv = 30 @@ -299,6 +321,7 @@ class Skill10(ActiveSkill): 使重火器的拔出动作出现攻击判定,命中敌人后可以将敌人击退。\n """ name = "重火器拔击" + ref = Ref.HITONSUBWEAPON cellPos = (3,2) learnLv = 5 masterLv = 1 @@ -328,6 +351,7 @@ class Skill11(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "上旋踢" + ref = Ref.WINDMILL learnLv = 10 masterLv = 60 maxLv = 70 @@ -362,6 +386,7 @@ class Skill12(ActiveSkill): 转职为协战师时,技能类型变为独立攻击力; 仅射击2次。\n """ name = "钉刺射" + ref = Ref.PUNISHER learnLv = 10 masterLv = 60 maxLv = 70 @@ -392,6 +417,7 @@ class Skill13(ActiveSkill): 对无法抓取的敌人不适用控制效果,只能造成后撩踢的攻击伤害。\n """ name = "炙烤" + ref = Ref.AERIALGATLING cellPos = (4,3) learnLv = 10 masterLv = 60 @@ -421,6 +447,7 @@ class Skill14(ActiveSkill): 在决斗场中无法强制中断。\n """ name = "浮空铲" + ref = Ref.HIGHANGLESLIDING cellPos = (8,3) learnLv = 10 masterLv = 1 @@ -448,6 +475,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -475,6 +503,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -500,6 +529,7 @@ class Skill17(ActiveSkill): 向敌人脚下的地面快速连续射击,溅起尘土,对敌人造成伤害。\n """ name = "烟尘弹" + ref = Ref.ATDUSTSHOOT learnLv = 10 masterLv = 60 maxLv = 70 @@ -530,6 +560,7 @@ class Skill18(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "刺踢" + ref = Ref.FASTKNEE learnLv = 15 masterLv = 60 maxLv = 70 @@ -567,6 +598,7 @@ class Skill19(ActiveSkill): 技能等级越高,被攻击对象的僵直时间就越长。\n """ name = "M-3喷火器" + ref = Ref.FLAMETHROWER cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -601,6 +633,7 @@ class Skill20(PassiveSkill): 并减少除[远古粒子炮]、 [火力全开]、 [制胜 · 最终兵器]外的其他技能的冷却时间。\n """ name = "重火器精通" + ref = Ref.SUBWEAPONMASTERY cellPos = (1,4) learnLv = 15 masterLv = 10 @@ -622,10 +655,16 @@ class Skill20(PassiveSkill): data3 = get_data(f'{prefix}/{uuid}', 3) # 技能冷却时间减少率 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) + # 迁移前实现(保留对照): + # associate = [ + # {"type":"$*PAtkP","data":data2}, + # {"data":data3}, + # {"type":"*cdReduce","data":data4,"exceptSkills":['远古粒子炮', '火力全开', '制胜·最终兵器']}, + # ] associate = [ - {"type":"$*PAtkP","data":data2}, - {"data":data3}, - {"type":"*cdReduce","data":data4,"exceptSkills":['远古粒子炮', '火力全开', '制胜·最终兵器']}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data2))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data4)), except_skills=[Ref.ANCIENTTRIGGER, Ref.OPERATIONRAZE, Ref.DECISIVEBATTLE]), ] # 空中射击 @@ -636,6 +675,7 @@ class Skill21(ActiveSkill): 增加跳跃攻击的空中停留时间以及跳跃射击的攻击力和射击次数上限,效果持续一定时间。\n """ name = "空中射击" + ref = Ref.STAYONJUMPSHOOT learnLv = 15 masterLv = 10 maxLv = 20 @@ -668,6 +708,7 @@ class Skill22(PassiveSkill): 领悟重火器奥义,使除了1、 2、 3次觉醒技能之外的所有重火器技能各增加1级。\n """ name = "重火器奥义" + ref = Ref.SUBWEAPONPOWERUP cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -679,12 +720,23 @@ class Skill22(PassiveSkill): hasUP = False custom = get_data(f'{prefix}/{uuid}', "custom") # noqa: E501 + # 迁移前实现(保留对照): + # def effect(self, old, new): + # skills = [] + # for i in self.char.skills: + # if i.type == "active" and i.learnLv not in [50,85,100] and i.damage and self.char.skill_effects.is_learned(i): + # skills.append(i.name) + # self.associate = [{"type":"+lv","data":[0] + [1]*self.maxLv,"ratio":1,"skills":skills}] + # super().effect(old, new) + # 仅动态枚举目标名称,贡献值与 VP 条件交由类型化声明处理。 def effect(self, old, new): skills = [] for i in self.char.skills: - if i.type == "active" and i.learnLv not in [50,85,100] and i.damage and i.lv > 0: + if i.type == "active" and i.learnLv not in [50,85,100] and i.damage and self.char.skill_effects.is_learned(i): skills.append(i.name) - self.associate = [{"type":"+lv","data":[0] + [1]*self.maxLv,"ratio":1,"skills":skills}] + self.associate = [ + SkillEffect(attribute=SkillAttribute.LEVEL, operation=Operation.ADD, value=LevelTable([0] + [1] * self.maxLv), skills=skills), + ] super().effect(old, new) @@ -697,6 +749,7 @@ class Skill23(ActiveSkill): G-14手雷有最大填装数和填装冷却时间,按上、 下方向键后施放技能时,可以调整投掷位置。 转职成为弹药专家时,可以强制中断基本攻击动作,投掷G-14手雷。\n """ name = "G-14手雷" + ref = Ref.GRENADENONE cellPos = (10,4) learnLv = 15 masterLv = 60 @@ -732,6 +785,7 @@ class Skill24(ActiveSkill): 炮弹的速度极快,被炮弹命中的敌人会受到一定伤害; 命中敌人的炮弹会引发多次爆炸并推开敌人,最后还会使周围的敌人受到火属性物理伤害。\n """ name = "反坦克炮" + ref = Ref.STEYRHEAVYRIFLE cellPos = (6,5) learnLv = 20 masterLv = 60 @@ -774,6 +828,7 @@ class Skill25(ActiveSkill): 增加能量球飞行距离,且命中敌人时立即爆炸。 同时,冲撞伤害与爆炸伤害合并。\n """ name = "加农炮" + ref = Ref.CANNONBALL cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -806,6 +861,7 @@ class Skill26(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -829,6 +885,7 @@ class Skill27(PassiveSkill): 转职为漫游枪手后,增加精通等级。\n """ name = "快速拔枪" + ref = Ref.FASTSHOOT cellPos = (0,6) learnLv = 25 masterLv = 5 @@ -855,6 +912,7 @@ class Skill28(ActiveSkill): 向敌人发射激光,使敌人受到光属性伤害; 激光的攻击范围比较狭小,但是射程极远。\n """ name = "激光炮" + ref = Ref.LASERRIFLE cellPos = (8,6) learnLv = 25 masterLv = 60 @@ -889,6 +947,7 @@ class Skill29(PassiveSkill): 激光的攻击力随充电时间增加,达到最大充电值时,可以增加攻击范围和射程,但会有很大的后坐力。\n """ name = "蓄电激光炮" + ref = Ref.LASERRIFLECHARGE cellPos = (8,7) learnLv = 25 masterLv = 1 @@ -904,7 +963,11 @@ class Skill29(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data1,"skills":["激光炮"]}] + # 迁移前实现(保留对照): + # associate = [{"data":data1,"skills":["激光炮"]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.LASERRIFLE]), + ] # 脉冲雷达-63 # gunner_female/launcher_female/9376d04c476cd41d60ed1974ca69ab95 @@ -914,6 +977,7 @@ class Skill30(PassiveSkill): 装备重火器雷达部件,增加物理暴击率和物理攻击力。\n """ name = "脉冲雷达-63" + ref = Ref.APG_63 cellPos = (1,6) learnLv = 25 masterLv = 10 @@ -929,7 +993,11 @@ class Skill30(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 物理攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data1,"type":"$*PAtkP"}] + # 迁移前实现(保留对照): + # associate = [{"data":data1,"type":"$*PAtkP"}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data1))), + ] # 聚焦喷火器 # gunner_female/launcher_female/04883563896fe1adac7505c6146b5f59 @@ -940,6 +1008,7 @@ class Skill31(ActiveSkill): 喷射中可以移动。\n """ name = "聚焦喷火器" + ref = Ref.FLAMETHROWERBOOST cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -975,6 +1044,7 @@ class Skill32(ActiveSkill): 增加基本攻击力以及所有重火器技能的命中率和攻击力,并使远距离的敌人无法判定枪炮师的位置,效果持续一定时间。\n """ name = "潜能爆发" + ref = Ref.SUBWEAPONSTUCKDOWN cellPos = (5,7) learnLv = 30 masterLv = 10 @@ -1004,6 +1074,7 @@ class Skill33(ActiveSkill): 榴弹命中敌人时,会引起爆炸并使周围敌人受到伤害。\n """ name = "FM-31榴弹发射器" + ref = Ref.FM31 cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -1065,6 +1136,7 @@ class Skill34(ActiveSkill): 在地面施放重火器系列技能时可以同时使用该技能。 减少40%的攻击力和冷却时间,变更为最多可施放2次再进行冷却的技能。\n """ name = "FM-92榴弹" + ref = Ref.LANCER cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1095,7 +1167,7 @@ class Skill34(ActiveSkill): def setMode(self, mode): - pre = self.char.GetSkillByName('重武装改造') + pre = self.char.GetSkill(Ref.ALPHASUPPORT) if pre.lv > 0 and self.vp == 0: self.cd = 20 * 0.6 self.skillDamage *= 0.6 @@ -1135,6 +1207,7 @@ class Skill35(PassiveSkill): 将光、 火属性值中较低的属性值补正为较高的属性值。\n """ name = "光热反应" + ref = Ref.DUALTRIGGER cellPos = (4,8) learnLv = 35 masterLv = 1 @@ -1155,6 +1228,7 @@ class Skill36(ActiveSkill): 向敌人投放光属性量子爆弹,使周围敌人受到光属性伤害并有一定几率使敌人进入感电状态,可以通过方向键控制投放位置。\n """ name = "量子爆弹" + ref = Ref.URANIUMBOMB cellPos = (9,9) learnLv = 40 masterLv = 60 @@ -1231,6 +1305,7 @@ class Skill37(ActiveSkill): 技能施放中可以追加施放[激光炮]技能,[激光炮]的攻击力相当于最大充电时的攻击力。\n """ name = "X-2太阳神光炮" + ref = Ref.SOLARSYSTEM cellPos = (8,10) learnLv = 45 masterLv = 60 @@ -1297,10 +1372,14 @@ class Skill37(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 1: - self.associate = [{"type":"*skillRation","data":[0] + [-12.5]*self.maxLv,"skills":["激光炮"]}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 1: + # self.associate = [{"type":"*skillRation","data":[0] + [-12.5]*self.maxLv,"skills":["激光炮"]}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-12.5] * maxLv)), skills=[Ref.LASERRIFLE], when=Equals(Read(SkillAttribute.VP), 1)), + ] # 超温重火器 # gunner_female/launcher_female/5892d1fa4462e561ac8f8d2c74892b0a @@ -1310,6 +1389,7 @@ class Skill38(PassiveSkill): 增加基本攻击和重火器技能的攻击力。\n """ name = "超温重火器" + ref = Ref.OVERHEAT cellPos = (6,11) learnLv = 48 masterLv = 40 @@ -1323,7 +1403,11 @@ class Skill38(PassiveSkill): # 基本攻击和重火器攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 远古粒子炮 # gunner_female/launcher_female/2ba299855fc22192cba4f73db75e9d0e @@ -1335,6 +1419,7 @@ class Skill39(ActiveSkill): 可以对龙族敌人造成更大的伤害。\n """ name = "远古粒子炮" + ref = Ref.ANCIENTTRIGGER cellPos = (8,11) learnLv = 50 masterLv = 40 @@ -1371,6 +1456,7 @@ class Skill40(ActiveSkill): 发射过程中,可以用方向键移动。\n """ name = "等离子放射器" + ref = Ref.PLASMABOOST cellPos = (3,12) learnLv = 60 masterLv = 40 @@ -1432,6 +1518,7 @@ class Skill41(ActiveSkill): 按住技能键,可以调整双重点火时机。\n """ name = "FM-92特殊榴弹" + ref = Ref.LANCERSW cellPos = (7,13) learnLv = 70 masterLv = 40 @@ -1507,6 +1594,7 @@ class Skill42(PassiveSkill): 施放时可以同时使用[激光炮]。\n """ name = "重武装改造" + ref = Ref.ALPHASUPPORT cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1524,7 +1612,11 @@ class Skill42(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 发射后僵直时间减少率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 集束炸弹 # gunner_female/launcher_female/68062215e75d92575958873ac8ede31a @@ -1534,6 +1626,7 @@ class Skill43(ActiveSkill): 发射具有子母弹功能的炸弹。 炸弹命中敌人时发生爆炸,炸弹中的小型炸弹向四方扩散,引起连锁爆炸。\n """ name = "集束炸弹" + ref = Ref.FSC_7 cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1605,6 +1698,7 @@ class Skill44(ActiveSkill): (最多射击1次)\n """ name = "PT-15原始型压缩炮" + ref = Ref.PT_15 cellPos = (2,14) learnLv = 80 masterLv = 40 @@ -1661,6 +1755,7 @@ class Skill45(ActiveSkill): 召唤强袭装甲时,会产生冲击波,将周围敌人向前推开。\n """ name = "火力全开" + ref = Ref.OPERATIONRAZE cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1703,6 +1798,7 @@ class Skill46(PassiveSkill): 施放[M-3喷火器]和[聚焦喷火器]时,获得霸体护甲。\n """ name = "潘多拉1号" + ref = Ref.PANDORA_01 cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1718,7 +1814,11 @@ class Skill46(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # [M-3喷火器]、 [聚焦喷火器]、 [等离子放射器]、 [UHT-03爆炎喷火器]移动速度比率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # UHT-03爆炎喷火器 # gunner_female/launcher_female/3a691a432c58abebc08211df45c4f4bd @@ -1731,6 +1831,7 @@ class Skill47(ActiveSkill): 喷火器发射过程中,可以用方向键移动。\n """ name = "UHT-03爆炎喷火器" + ref = Ref.PHLEGETHON cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1766,6 +1867,7 @@ class Skill48(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "制胜·最终兵器" + ref = Ref.DECISIVEBATTLE cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/gunner_female/mechanic_female.py b/backend/core/character/GF/gunner_female/mechanic_female.py index b4b41ee0..4b279802 100644 --- a/backend/core/character/GF/gunner_female/mechanic_female.py +++ b/backend/core/character/GF/gunner_female/mechanic_female.py @@ -1,6 +1,24 @@ # 944b9aab492c15a8474f96947ceeb9e4 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + LevelTable, + Operation, + Percent, + ProfessionAttribute, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunner_female.mechanic_female import MechanicFemaleSkillRef as Ref + + +class MechanicFemaleAttribute(ProfessionAttribute): + """本职业专用的最终效果属性;字段含义与技能实现保持一致。""" + BLOW_POWER = 'blow_power' + """女机械:空战机械爆炸分段倍率。""" + G_RATIO = 'ratio_g' + """女机械:G 系列技能的相互强化倍率。""" + prefix = "gunner_female/mechanic_female/cn/skillDetail" @@ -15,6 +33,7 @@ class Skill0(ActiveSkill): 转职为弹药专家或协战师后,技能类型变为独立攻击力。\n """ name = "后撩踢" + ref = Ref.AERIALKNEE learnLv = 1 masterLv = 10 maxLv = 20 @@ -44,6 +63,7 @@ class Skill1(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "浮空弹" + ref = Ref.LIFTSHOT learnLv = 1 masterLv = 60 maxLv = 70 @@ -70,6 +90,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -93,6 +114,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -120,6 +142,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -161,6 +184,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -183,6 +207,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -206,6 +231,7 @@ class Skill7(ActiveSkill): 若发射中按住向上方向键,则可以向上发射。\n """ name = "M-137格林机枪" + ref = Ref.GATLING learnLv = 5 masterLv = 60 maxLv = 70 @@ -242,6 +268,7 @@ class Skill8(ActiveSkill): """ name = 'RX-78追击者' + ref = Ref.ROBOTRX78 cellPos = (1,2) learnLv = 5 masterLv = 60 @@ -273,6 +300,7 @@ class Skill9(ActiveSkill): 攻击不死族、 恶魔、 精灵类怪物时,可以大幅度增加伤害值。\n """ name = "银弹" + ref = Ref.SILVERBULLET learnLv = 5 masterLv = 20 maxLv = 30 @@ -301,6 +329,7 @@ class Skill10(PassiveSkill): 使重火器的拔出动作出现攻击判定,命中敌人后可以将敌人击退。\n """ name = "重火器拔击" + ref = Ref.HITONSUBWEAPON learnLv = 5 masterLv = 1 maxLv = 11 @@ -328,6 +357,7 @@ class Skill11(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "上旋踢" + ref = Ref.WINDMILL learnLv = 10 masterLv = 60 maxLv = 70 @@ -362,6 +392,7 @@ class Skill12(ActiveSkill): 转职为协战师时,技能类型变为独立攻击力; 仅射击2次。\n """ name = "钉刺射" + ref = Ref.PUNISHER learnLv = 10 masterLv = 60 maxLv = 70 @@ -392,6 +423,7 @@ class Skill13(ActiveSkill): 对无法抓取的敌人不适用控制效果,只能造成后撩踢的攻击伤害。\n """ name = "炙烤" + ref = Ref.AERIALGATLING learnLv = 10 masterLv = 60 maxLv = 70 @@ -420,6 +452,7 @@ class Skill14(ActiveSkill): 在决斗场中无法强制中断。\n """ name = "浮空铲" + ref = Ref.HIGHANGLESLIDING learnLv = 10 masterLv = 1 maxLv = 1 @@ -447,6 +480,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -474,6 +508,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -499,6 +534,7 @@ class Skill17(ActiveSkill): 向敌人脚下的地面快速连续射击,溅起尘土,对敌人造成伤害。\n """ name = "烟尘弹" + ref = Ref.ATDUSTSHOOT learnLv = 10 masterLv = 60 maxLv = 70 @@ -529,6 +565,7 @@ class Skill18(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "刺踢" + ref = Ref.FASTKNEE learnLv = 15 masterLv = 60 maxLv = 70 @@ -566,6 +603,7 @@ class Skill19(ActiveSkill): 技能等级越高,被攻击对象的僵直时间就越长。\n """ name = "M-3喷火器" + ref = Ref.FLAMETHROWER learnLv = 15 masterLv = 60 maxLv = 70 @@ -603,6 +641,7 @@ class Skill20(ActiveSkill): """ name = 'EZ-8爆破者' + ref = Ref.ROBOTEZ8 cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -635,6 +674,7 @@ class Skill21(ActiveSkill): 增加跳跃攻击的空中停留时间以及跳跃射击的攻击力和射击次数上限,效果持续一定时间。\n """ name = "空中射击" + ref = Ref.STAYONJUMPSHOOT learnLv = 15 masterLv = 10 maxLv = 20 @@ -669,6 +709,7 @@ class Skill22(ActiveSkill): """ name = '机械改良' + ref = Ref.ROBOTICS cellPos = (5,4) learnLv = 15 masterLv = 10 @@ -702,6 +743,7 @@ class Skill23(ActiveSkill): """ name = '机械引爆' + ref = Ref.ROBOTSEXPLOSION cellPos = (3,4) learnLv = 15 masterLv = 5 @@ -720,9 +762,14 @@ class Skill23(ActiveSkill): # 爆炸攻击力变化率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {'data': [i - 100 if i > 100 else i for i in data1], 'skills': ['RX-78追击者', 'EZ-8爆破者']}, + # {'type':'*blow_power' ,'data': [i - 100 if i > 100 else i for i in data1], 'skills': ['空战机械 : 狂风']} + # ] associate = [ - {'data': [i - 100 if i > 100 else i for i in data1], 'skills': ['RX-78追击者', 'EZ-8爆破者']}, - {'type':'*blow_power' ,'data': [i - 100 if i > 100 else i for i in data1], 'skills': ['空战机械 : 狂风']} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 100 else i for i in data1])), skills=[Ref.ROBOTRX78, Ref.ROBOTEZ8]), + SkillEffect(attribute=MechanicFemaleAttribute.BLOW_POWER, value=1 + Percent(LevelTable([i - 100 if i > 100 else i for i in data1])), skills=[Ref.ROBOTTEMPESTER]), ] # G-14手雷 @@ -735,6 +782,7 @@ class Skill24(ActiveSkill): """ name = 'G-14手雷' + ref = Ref.GRENADENONE cellPos = (10,4) learnLv = 15 masterLv = 60 @@ -770,6 +818,7 @@ class Skill25(PassiveSkill): """ name = '机械原理' + ref = Ref.HIGHTECHNOLOGY cellPos = (2,4) learnLv = 15 masterLv = 1 @@ -784,7 +833,11 @@ class Skill25(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 危机追击者 # gunner_female/mechanic_female/dc1ffbe7bfcc6dc2be737951960da9ad @@ -796,6 +849,7 @@ class Skill26(PassiveSkill): """ name = '危机追击者' + ref = Ref.RX78OFCRISIS cellPos = (1,5) learnLv = 20 masterLv = 10 @@ -815,7 +869,11 @@ class Skill26(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 按期望计算 - associate = [{'data': data0, 'type': '*skillDamage', 'skills': ['RX-78追击者']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage', 'skills': ['RX-78追击者']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.ROBOTRX78]), + ] # G-1科罗纳 # gunner_female/mechanic_female/1b1cfab062e0768bcc889e33e1f30dbf @@ -829,6 +887,7 @@ class Skill27(ActiveSkill): """ name = 'G-1科罗纳' + ref = Ref.G1 cellPos = (7,5) learnLv = 20 masterLv = 60 @@ -865,9 +924,14 @@ class Skill27(ActiveSkill): ratio_g = 1.0 + # 迁移前实现(保留对照): + # associate = [ + # {'data': data6, 'type': '+ratio_g', 'skills': ['改装 : G-2旋雷者']}, + # {'data': data7, 'type': '+ratio_g', 'skills': ['改装 : G-3捕食者']} + # ] associate = [ - {'data': data6, 'type': '+ratio_g', 'skills': ['改装 : G-2旋雷者']}, - {'data': data7, 'type': '+ratio_g', 'skills': ['改装 : G-3捕食者']} + SkillEffect(attribute=MechanicFemaleAttribute.G_RATIO, operation=Operation.ADD, value=Percent(LevelTable(data6)), skills=[Ref.G2]), + SkillEffect(attribute=MechanicFemaleAttribute.G_RATIO, operation=Operation.ADD, value=Percent(LevelTable(data7)), skills=[Ref.G3]), ] def getSkillCD(self, mode=None): @@ -885,6 +949,7 @@ class Skill28(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -908,6 +973,7 @@ class Skill29(PassiveSkill): 转职为漫游枪手后,增加精通等级。\n """ name = "快速拔枪" + ref = Ref.FASTSHOOT learnLv = 25 masterLv = 5 maxLv = 20 @@ -936,6 +1002,7 @@ class Skill30(ActiveSkill): """ name = 'EX-S毒蛇炮' + ref = Ref.ROBOTEXS cellPos = (8,6) learnLv = 25 masterLv = 60 @@ -977,6 +1044,7 @@ class Skill31(ActiveSkill): """ name = '改装 : G-2旋雷者' + ref = Ref.G2 cellPos = (6,6) learnLv = 25 masterLv = 60 @@ -1009,9 +1077,14 @@ class Skill31(ActiveSkill): # 电波前方攻击范围比率 : {value7}% data7 = get_data(f'{prefix}/{uuid}', 7) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data5, 'type': '+ratio_g', 'skills': ['G-1科罗纳']}, + # {'data': data6, 'type': '+ratio_g', 'skills': ['改装 : G-3捕食者']} + # ] associate = [ - {'data': data5, 'type': '+ratio_g', 'skills': ['G-1科罗纳']}, - {'data': data6, 'type': '+ratio_g', 'skills': ['改装 : G-3捕食者']} + SkillEffect(attribute=MechanicFemaleAttribute.G_RATIO, operation=Operation.ADD, value=Percent(LevelTable(data5)), skills=[Ref.G1]), + SkillEffect(attribute=MechanicFemaleAttribute.G_RATIO, operation=Operation.ADD, value=Percent(LevelTable(data6)), skills=[Ref.G3]), ] def getSkillCD(self, mode=None): @@ -1044,6 +1117,7 @@ class Skill32(PassiveSkill): """ name = '电能转换' + ref = Ref.TRANSFORMATION cellPos = (2,6) learnLv = 25 masterLv = 10 @@ -1060,7 +1134,11 @@ class Skill32(PassiveSkill): # 魔法暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage', 'exceptSkills': ['G-1科罗纳', '改装 : G-2旋雷者', '改装 : G-3捕食者', 'G-磁力弹']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage', 'exceptSkills': ['G-1科罗纳', '改装 : G-2旋雷者', '改装 : G-3捕食者', 'G-磁力弹']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), except_skills=[Ref.G1, Ref.G2, Ref.G3, Ref.GMAGNETIC]), + ] # 伪装 # gunner_female/mechanic_female/4b2c90ec226fd40e967875aa5eabefb2 @@ -1073,6 +1151,7 @@ class Skill33(ActiveSkill): """ name = '伪装' + ref = Ref.CAMOUFLAGE cellPos = (2,7) learnLv = 30 masterLv = 10 @@ -1114,6 +1193,7 @@ class Skill34(ActiveSkill): """ name = '改装 : G-3捕食者' + ref = Ref.G3 cellPos = (6,7) learnLv = 30 masterLv = 60 @@ -1145,9 +1225,14 @@ class Skill34(ActiveSkill): # 捕食者移动范围 : {value7}px data7 = get_data(f'{prefix}/{uuid}', 7) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data5, 'type': '+ratio_g', 'skills': ['G-1科罗纳']}, + # {'data': data6, 'type': '+ratio_g', 'skills': ['改装 : G-2旋雷者']}] associate = [ - {'data': data5, 'type': '+ratio_g', 'skills': ['G-1科罗纳']}, - {'data': data6, 'type': '+ratio_g', 'skills': ['改装 : G-2旋雷者']}] + SkillEffect(attribute=MechanicFemaleAttribute.G_RATIO, operation=Operation.ADD, value=Percent(LevelTable(data5)), skills=[Ref.G1]), + SkillEffect(attribute=MechanicFemaleAttribute.G_RATIO, operation=Operation.ADD, value=Percent(LevelTable(data6)), skills=[Ref.G2]), + ] ratio_g = 1.0 @@ -1167,6 +1252,7 @@ class Skill35(ActiveSkill): """ name = '机械指令' + ref = Ref.ATHOLDANDGO cellPos = (3,7) learnLv = 30 masterLv = 1 @@ -1194,6 +1280,7 @@ class Skill36(ActiveSkill): """ name = '空战机械 : 狂风' + ref = Ref.ROBOTTEMPESTER cellPos = (2,8) learnLv = 35 masterLv = 60 @@ -1290,6 +1377,7 @@ class Skill37(ActiveSkill): """ name = 'G-磁力弹' + ref = Ref.GMAGNETIC cellPos = (7,8) learnLv = 35 masterLv = 1 @@ -1314,7 +1402,7 @@ class Skill37(ActiveSkill): data3 = get_data(f'{prefix}/{uuid}', 3) def skillInfo(self, mode: str | None = None): - pre = self.char.GetSkillByName('G-1科罗纳').skillInfo() + pre = self.char.GetSkill(Ref.G1).skillInfo() cd = self.getSkillCD(mode) return pre[0] * 1.89, self.skillDamage, cd @@ -1346,6 +1434,7 @@ class Skill38(ActiveSkill): """ name = '空投支援' + ref = Ref.MECHADROP cellPos = (2,9) learnLv = 40 masterLv = 60 @@ -1405,6 +1494,7 @@ class Skill39(ActiveSkill): """ name = '拦截机工厂' + ref = Ref.SPARROWFACTORY cellPos = (3,10) learnLv = 45 masterLv = 60 @@ -1441,7 +1531,7 @@ class Skill39(ActiveSkill): data6 = get_data(f'{prefix}/{uuid}', 6) def setMode(self, mode): - pre = self.char.GetSkillByName('光反应能量模块') + pre = self.char.GetSkill(Ref.SOLARMODULESYSTEM) if pre is not None and pre.lv > 0: self.hit0 = 111 self.hit1 = 6 @@ -1485,6 +1575,7 @@ class Skill40(PassiveSkill): """ name = '光反应能量模块' + ref = Ref.SOLARMODULESYSTEM cellPos = (2,11) learnLv = 45 masterLv = 1 @@ -1509,6 +1600,7 @@ class Skill41(PassiveSkill): """ name = 'G系扩张' + ref = Ref.GEXTENSION cellPos = (3,11) learnLv = 48 masterLv = 40 @@ -1529,7 +1621,11 @@ class Skill41(PassiveSkill): # 改装延长持续时间增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 改装 : G-0战争领主 # gunner_female/mechanic_female/d89f26862e348a801b30bb9fd7125db5 @@ -1542,6 +1638,7 @@ class Skill42(ActiveSkill): """ name = '改装 : G-0战争领主' + ref = Ref.G0 cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1579,6 +1676,7 @@ class Skill43(ActiveSkill): """ name = 'HS-12等离子体发生器' + ref = Ref.HS12 cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1637,6 +1735,7 @@ class Skill44(ActiveSkill): """ name = '雷行者' + ref = Ref.G4 cellPos = (6,13) learnLv = 70 masterLv = 40 @@ -1710,6 +1809,7 @@ class Skill45(PassiveSkill): """ name = 'G-X主宰者' + ref = Ref.GOPERATOR cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1742,9 +1842,14 @@ class Skill45(PassiveSkill): # G-4雷行者多段攻击间隔减少 : {value9}秒 data9 = get_data(f'{prefix}/{uuid}', 9) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data0, 'type': '*cdReduce', 'exceptSkills': ['改装 : G-0战争领主', '终结者 : 博尔特MX', 'G-X星尘天穹']}, + # {'data': data2}, + # ] associate = [ - {'data': data0, 'type': '*cdReduce', 'exceptSkills': ['改装 : G-0战争领主', '终结者 : 博尔特MX', 'G-X星尘天穹']}, - {'data': data2}, + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data0)), except_skills=[Ref.G0, Ref.MECABOLT, Ref.GXSTARDUST]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), ] # G-超级猎鹰 @@ -1761,6 +1866,7 @@ class Skill46(ActiveSkill): """ name = 'G-超级猎鹰' + ref = Ref.GSPFALCON cellPos = (8,13) learnLv = 75 masterLv = 40 @@ -1852,6 +1958,7 @@ class Skill47(ActiveSkill): """ name = '高压电磁场' + ref = Ref.MAGNETICFIELD cellPos = (2,14) learnLv = 80 masterLv = 40 @@ -1907,6 +2014,7 @@ class Skill48(ActiveSkill): """ name = '终结者 : 博尔特MX' + ref = Ref.MECABOLT cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1962,6 +2070,7 @@ class Skill49(PassiveSkill): """ name = '微型制导' + ref = Ref.MICROCONTROL cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1977,7 +2086,11 @@ class Skill49(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 每蓄满1个旋雷者Y轴范围增加率 : 12.5% - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 每蓄满1个旋雷者Y轴范围增加率 : 12.5% # 超时空光耀加农炮 @@ -1991,6 +2104,7 @@ class Skill50(ActiveSkill): """ name = '超时空光耀加农炮' + ref = Ref.HYPERFLARE cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2028,6 +2142,7 @@ class Skill51(ActiveSkill): """ name = 'G-X星尘天穹' + ref = Ref.GXSTARDUST cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/gunner_female/paramedic.py b/backend/core/character/GF/gunner_female/paramedic.py index 28b8b0a1..85eb1593 100644 --- a/backend/core/character/GF/gunner_female/paramedic.py +++ b/backend/core/character/GF/gunner_female/paramedic.py @@ -1,6 +1,16 @@ #944b9aab492c15a8474f96947ceeb9e4 from core.basic.skill import PassiveBufferSkill,ActiveBufferSkill,ActiveSkill,PassiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunner_female.paramedic import ParamedicSkillRef as Ref prefix = "gunner_female/paramedic/cn/skillDetail" @@ -14,6 +24,7 @@ class Skill0(ActiveSkill): 转职为弹药专家或协战师后,技能类型变为独立攻击力。\n """ name = "后撩踢" + ref = Ref.AERIALKNEE learnLv = 1 masterLv = 10 maxLv = 20 @@ -43,6 +54,7 @@ class Skill1(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "浮空弹" + ref = Ref.LIFTSHOT learnLv = 1 masterLv = 60 maxLv = 70 @@ -69,6 +81,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -92,6 +105,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -119,6 +133,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -149,6 +164,7 @@ class Skill5(PassiveSkill):     协战师动作均切换至战斗服[近战]模式,适用物理独立攻击力。\n """ name = "系统常量 · 战斗服" + ref = Ref.BATTLESUIT cellPos = (1,1) learnLv = 1 masterLv = 1 @@ -183,6 +199,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -205,6 +222,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -227,6 +245,7 @@ class Skill8(ActiveSkill): 向前方最近的敌人射击2次。\n """ name = "近战 · 锁定连射" + ref = Ref.KILLCONFIRM cellPos = (9,2) learnLv = 5 masterLv = 60 @@ -259,6 +278,7 @@ class Skill9(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "上旋踢" + ref = Ref.WINDMILL learnLv = 10 masterLv = 60 maxLv = 70 @@ -293,6 +313,7 @@ class Skill10(ActiveSkill): 转职为协战师时,技能类型变为独立攻击力; 仅射击2次。\n """ name = "钉刺射" + ref = Ref.PUNISHER learnLv = 10 masterLv = 60 maxLv = 70 @@ -324,6 +345,7 @@ class Skill11(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -351,6 +373,7 @@ class Skill12(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -378,6 +401,7 @@ class Skill13(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "刺踢" + ref = Ref.FASTKNEE learnLv = 15 masterLv = 60 maxLv = 70 @@ -426,6 +450,7 @@ class Skill14(PassiveSkill): [空袭策略 : 神兵天降]\n """ name = "系统常量 · 同步" + ref = Ref.SYNCHRONIZATION cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -439,7 +464,11 @@ class Skill14(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] # 协战师技能关联 + # 迁移前实现(保留对照): + # associate = [{"data":data0}] # 协战师技能关联 + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 系统 · 战场信息 # gunner_female/paramedic/6235960237fdb1b77f2c82b33614dcf4 @@ -453,6 +482,7 @@ class Skill15(PassiveBufferSkill): 执行独立作战时,不适用属性伤害增加效果,仅适用独立作战专属效果。 施放部分技能时,向范围内敌人进行激光轰炸,造成多段伤害。 该激光轰炸受[基础精通]的影响,在使用[军械强化 (进阶)]技能时,会追加轰炸。\n """ name = "系统 · 战场信息" + ref = Ref.INSTALLBATTLEFIELDINFO cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -491,7 +521,11 @@ class Skill15(PassiveBufferSkill): # [军械强化 (进阶)] # [保护模件 (黄金复苏)] Spirit = data1 - associate = [{"data":data1,"type":"$+Spirit","ratio":1}] + # 迁移前实现(保留对照): + # associate = [{"data":data1,"type":"$+Spirit","ratio":1}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=LevelTable(data1)), + ] CarryRatio = [0]+ [((1 + i / 100) ** 3) * 100 - 100 for i in data1]# noqa: E501 # [激光炮击目标技能] # [保护模件 (缓冲)] @@ -511,6 +545,7 @@ class Skill16(ActiveBufferSkill):     降低所受伤害、 进入霸体状态。\n """ name = "战服 · 强袭目标" + ref = Ref.POINTSHOOTREV cellPos = (7,4) learnLv = 15 masterLv = 60 @@ -548,6 +583,7 @@ class Skill17(ActiveBufferSkill):     需要先完成该模件的战场信息分析,之后可利用医神设备在其他动作中施放。\n """ name = "机动强化" + ref = Ref.OVERCLOCK cellPos = (1,4) learnLv = 15 masterLv = 10 @@ -580,6 +616,7 @@ class Skill18(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -603,6 +640,7 @@ class Skill19(ActiveBufferSkill):     需要先完成该模件的战场信息分析,之后可利用医神设备在其他动作中施放。\n """ name = "保护模件 (净化)" + ref = Ref.TREATED cellPos = (1,5) learnLv = 20 masterLv = 1 @@ -628,6 +666,7 @@ class Skill20(ActiveSkill): 快速突进至前方,施展上踢攻击。 成功命中敌人后追加攻击。\n """ name = "战服 · 机动打击" + ref = Ref.CLOSEENEMY cellPos = (6,5) learnLv = 20 masterLv = 60 @@ -654,6 +693,7 @@ class Skill21(ActiveSkill): 挥舞战斗服上装备的刀刃,再短距离地后撤,进行2次牵制射击。\n """ name = "近战 · 闪退射击" + ref = Ref.RETREATSHOOT cellPos = (8,6) learnLv = 25 masterLv = 60 @@ -698,6 +738,7 @@ class Skill22(ActiveBufferSkill): 该技能效果不与光明骑士 (男) 的[守护徽章]、 光明骑士 (女) 的[守护祝福]、 小魔女的[小魔女的偏爱]、 缪斯的[主角登场]技能效果叠加。\n """ name = "装甲强化" + ref = Ref.ENCHANTARMOR cellPos = (0,6) learnLv = 25 masterLv = 10 @@ -728,7 +769,11 @@ class Skill22(ActiveBufferSkill): data6 = get_data(f'{prefix}/{uuid}', 6) Spirit = data6 - associate = [{"data": data6,"type": "$+Spirit","ratio":1}] # type: ignore + # 迁移前实现(保留对照): + # associate = [{"data": data6,"type": "$+Spirit","ratio":1}] # type: ignore + associate = [ + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=LevelTable(data6)), + ] # 军械强化 # gunner_female/paramedic/e73e980e87591bc98940afb1ac0fe522 @@ -743,6 +788,7 @@ class Skill23(ActiveBufferSkill):     该技能效果不与光明骑士 (男) 的[荣誉祝福]、 光明骑士 (女) 的[勇气祝福]、 小魔女的[禁术吟咏]、 缪斯的[可爱节拍]技能效果叠加。\n """ name = "军械强化" + ref = Ref.ENCHANTWEAPON cellPos = (0,7) learnLv = 30 masterLv = 10 @@ -790,6 +836,7 @@ class Skill24(ActiveSkill): 若在射击过程中敌人死亡,则锁定其他敌人; 若范围内不存在敌人或敌人处于无敌状态,则终止射击。\n """ name = "近战 · 指定射击" + ref = Ref.POINTSHOOT cellPos = (9,7) learnLv = 30 masterLv = 60 @@ -822,6 +869,7 @@ class Skill25(ActiveBufferSkill):     需要先完成该模件的战场信息分析,之后可利用医神设备在其他动作中施放。\n """ name = "保护模件 (缓冲)" + ref = Ref.PARAMSHIELD cellPos = (1,8) learnLv = 35 masterLv = 60 @@ -851,6 +899,7 @@ class Skill26(ActiveSkill): 挥舞战斗服上装备的刀刃,将敌人拉至身前。 发起连续攻击后,沿直线方向返回原位。\n """ name = "近战 · 爆刃突袭" + ref = Ref.ZERODISTANCE cellPos = (8,8) learnLv = 35 masterLv = 60 @@ -919,6 +968,7 @@ class Skill27(ActiveBufferSkill): 协战师为小队提供的强化模件。 基于已收集的信息,重新定义[军械强化]效果,提供更加优化的增益。\n """ name = "军械强化 (进阶)" + ref = Ref.ENCHANTWEAPONOVERRIDE cellPos = (1,9) learnLv = 40 masterLv = 1 @@ -955,6 +1005,7 @@ class Skill28(ActiveBufferSkill):     降低所受伤害、 进入霸体状态。\n """ name = "战服 · 护盾冲击" + ref = Ref.BREAKTHROUGH cellPos = (6,9) learnLv = 40 masterLv = 60 @@ -1018,6 +1069,7 @@ class Skill29(ActiveSkill):     激光对敌人造成多段伤害,且激光所掠过的地面会即刻引爆,造成额外伤害。\n """ name = "战服 · 开拓射线" + ref = Ref.LASERBREACHING cellPos = (7,10) learnLv = 45 masterLv = 60 @@ -1095,6 +1147,7 @@ class Skill30(PassiveBufferSkill): 施放小队强化技能时,延长当前生效中的[军械强化]、 [装甲强化]的持续时间。\n """ name = "系统 · 作战应对" + ref = Ref.DEFENSESYSTEM cellPos = (3,11) learnLv = 48 masterLv = 40 @@ -1120,7 +1173,11 @@ class Skill30(PassiveBufferSkill): STRINT = data0 Spirit = data1 - associate = [{"data": data1,"type": "$+Spirit","ratio":1}] # type: ignore + # 迁移前实现(保留对照): + # associate = [{"data": data1,"type": "$+Spirit","ratio":1}] # type: ignore + associate = [ + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=LevelTable(data1)), + ] # 强袭策略 : 区域肃清 # gunner_female/paramedic/ca0cc360e00e5f13e33027bf5fc53d5d @@ -1131,6 +1188,7 @@ class Skill31(ActiveBufferSkill): 该技能效果不与光明骑士 (男) 的[天启之光]、 光明骑士 (女) 的[圣光天启]、 小魔女的[开幕! 人偶剧场]、 缪斯的[梦想的舞台]技能效果叠加。\n """ name = "强袭策略 : 区域肃清" + ref = Ref.MOAS cellPos = (4,11) learnLv = 50 masterLv = 40 @@ -1178,6 +1236,7 @@ class Skill32(ActiveSkill):     黄金时间内,可用复活币进行复活。\n """ name = "保护模件 (黄金复苏)" + ref = Ref.C_AED cellPos = (1,12) learnLv = 60 masterLv = 1 @@ -1208,6 +1267,7 @@ class Skill33(ActiveSkill): 无人机启动强大的力场,对敌人造成伤害。 力场存续期间,协战师免疫所有伤害。 力场被无人机回收时,将再次对敌人造成伤害。\n """ name = "系统 · 区域防御" + ref = Ref.DEFCON cellPos = (2,12) learnLv = 60 masterLv = 40 @@ -1262,6 +1322,7 @@ class Skill34(ActiveSkill): 立即从战斗服召唤6架小无人机,向前方发射直线激光。 随后协战师空翻撤至后方,回收无人机并挥舞,造成二次伤害。\n """ name = "战服 · 歼灭行动" + ref = Ref.EXTERMINATION cellPos = (8,13) learnLv = 70 masterLv = 40 @@ -1318,6 +1379,7 @@ class Skill35(PassiveBufferSkill):     提升战勤统帅的精神、 基本攻击力和技能攻击力、 物理暴击率,并增加[保护模件 (缓冲)]的单次生成数量和最大累积上限。\n """ name = "系统 · 限制解除" + ref = Ref.RELEASEDEVICE cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1346,7 +1408,11 @@ class Skill35(PassiveBufferSkill): data6 = get_data(f'{prefix}/{uuid}', 6) Spirit = data0 - associate = [{"data": data0,"type": "$+Spirit","ratio":1}] # type: ignore + # 迁移前实现(保留对照): + # associate = [{"data": data0,"type": "$+Spirit","ratio":1}] # type: ignore + associate = [ + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=LevelTable(data0)), + ] # 战服 · 超限压制 # gunner_female/paramedic/9559c99a9596b20d031de1ce2649b326 @@ -1356,6 +1422,7 @@ class Skill36(ActiveSkill): 启动战斗服的超负荷极限输出程序,突进追踪前方射程范围内的所有敌人,造成高额伤害,随后回归原位。\n """ name = "战服 · 超限压制" + ref = Ref.SUPPRESSION cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1410,6 +1477,7 @@ class Skill37(ActiveSkill):     降低所受伤害、 进入霸体状态。\n """ name = "战服 · 超负荷炮" + ref = Ref.OVERPOWERLASER cellPos = (7,14) learnLv = 80 masterLv = 40 @@ -1470,6 +1538,7 @@ class Skill38(ActiveSkill): 战勤统帅在判断小队即将全灭时,可启用的机密战术程序。 该程序需通过战勤统帅的权限启用,执行时激活自律神经系统约3秒,随后调用战斗服内置的所有兵器,发动毁天灭地的攻势。\n """ name = "绝境策略 : 极限歼灭" + ref = Ref.NOENEMY cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -1507,6 +1576,7 @@ class Skill39(PassiveSkill):     进入地下城时,重霄·协战师的战斗服外形将会改变。\n """ name = "系统常量 · 战斗服 (改良型)" + ref = Ref.CHOICESUIT cellPos = (1,15) learnLv = 95 masterLv = 1 @@ -1530,6 +1600,7 @@ class Skill40(PassiveBufferSkill):     [近战 · 闪退射击] : 施放后立即为队员提供强化后的[保护模件 (缓冲)]效果。\n """ name = "系统 · 临战编程" + ref = Ref.HARDCODING cellPos = (3,15) learnLv = 95 masterLv = 40 @@ -1547,7 +1618,11 @@ class Skill40(PassiveBufferSkill): data1 = get_data(f'{prefix}/{uuid}', 1) Spirit = data1 - associate = [{"data": data1,"type": "$+Spirit","ratio":1}] # type: ignore + # 迁移前实现(保留对照): + # associate = [{"data": data1,"type": "$+Spirit","ratio":1}] # type: ignore + associate = [ + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=LevelTable(data1)), + ] # 系统 · 孤军突破 # gunner_female/paramedic/56ef36c1980e67dd2bb50b180a925b89 @@ -1559,6 +1634,7 @@ class Skill41(ActiveSkill):     待司令部审批期间,可格挡或闪避所有伤害。\n """ name = "系统 · 孤军突破" + ref = Ref.BREAKPOCKET cellPos = (2,15) learnLv = 95 masterLv = 40 @@ -1603,6 +1679,7 @@ class Skill42(ActiveBufferSkill):     若关联技能还在冷却中,则无法施放三次觉醒技能。\n """ name = "空袭策略 : 神兵天降" + ref = Ref.HALO cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/gunner_female/ranger_female.py b/backend/core/character/GF/gunner_female/ranger_female.py index 5456aa1c..8a8afe04 100644 --- a/backend/core/character/GF/gunner_female/ranger_female.py +++ b/backend/core/character/GF/gunner_female/ranger_female.py @@ -1,6 +1,18 @@ #944b9aab492c15a8474f96947ceeb9e4 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + ExtraData, + LevelTable, + Operation, + Percent, + Power, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunner_female.ranger_female import RangerFemaleSkillRef as Ref prefix = "gunner_female/ranger_female/cn/skillDetail" @@ -14,6 +26,7 @@ class Skill0(ActiveSkill): 转职为弹药专家或协战师后,技能类型变为独立攻击力。\n """ name = "后撩踢" + ref = Ref.AERIALKNEE cellPos = (5,1) learnLv = 1 masterLv = 10 @@ -43,6 +56,7 @@ class Skill1(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "浮空弹" + ref = Ref.LIFTSHOT cellPos = (3,1) learnLv = 1 masterLv = 60 @@ -85,6 +99,7 @@ class Skill2(PassiveSkill): 在决斗场中特有技能的攻击力和效果均有下调。\n """ name = "双枪极舞刃" + ref = Ref.TWINGUNBLADE cellPos = (8,1) learnLv = 1 masterLv = 1 @@ -121,6 +136,7 @@ class Skill3(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -144,6 +160,7 @@ class Skill4(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -171,6 +188,7 @@ class Skill5(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -212,6 +230,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -234,6 +253,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -257,6 +277,7 @@ class Skill8(ActiveSkill): 若发射中按住向上方向键,则可以向上发射。\n """ name = "M-137格林机枪" + ref = Ref.GATLING learnLv = 5 masterLv = 60 maxLv = 70 @@ -292,6 +313,7 @@ class Skill9(ActiveSkill): 在地下城中不会被敌人击中,在决斗场中适用独立的生命值和防御力。\n """ name = "RX-78追击者" + ref = Ref.ROBOTRX78 learnLv = 5 masterLv = 60 maxLv = 70 @@ -322,6 +344,7 @@ class Skill10(ActiveSkill): 攻击不死族、 恶魔、 精灵类怪物时,可以大幅度增加伤害值。\n """ name = "银弹" + ref = Ref.SILVERBULLET cellPos = (7,2) learnLv = 5 masterLv = 20 @@ -351,6 +374,7 @@ class Skill11(PassiveSkill): 使重火器的拔出动作出现攻击判定,命中敌人后可以将敌人击退。\n """ name = "重火器拔击" + ref = Ref.HITONSUBWEAPON learnLv = 5 masterLv = 1 maxLv = 11 @@ -378,6 +402,7 @@ class Skill12(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "上旋踢" + ref = Ref.WINDMILL cellPos = (2,3) learnLv = 10 masterLv = 60 @@ -413,6 +438,7 @@ class Skill13(ActiveSkill): 转职为协战师时,技能类型变为独立攻击力; 仅射击2次。\n """ name = "钉刺射" + ref = Ref.PUNISHER cellPos = (0,3) learnLv = 10 masterLv = 60 @@ -445,6 +471,7 @@ class Skill14(ActiveSkill): 对无法抓取的敌人不适用控制效果,只能造成后撩踢的攻击伤害。\n """ name = "炙烤" + ref = Ref.AERIALGATLING cellPos = (4,3) learnLv = 10 masterLv = 60 @@ -474,6 +501,7 @@ class Skill15(ActiveSkill): 在决斗场中无法强制中断。\n """ name = "浮空铲" + ref = Ref.HIGHANGLESLIDING cellPos = (6,3) learnLv = 10 masterLv = 1 @@ -503,6 +531,7 @@ class Skill16(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -530,6 +559,7 @@ class Skill17(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -555,6 +585,7 @@ class Skill18(ActiveSkill): 向敌人脚下的地面快速连续射击,溅起尘土,对敌人造成伤害。\n """ name = "烟尘弹" + ref = Ref.ATDUSTSHOOT cellPos = (1,3) learnLv = 10 masterLv = 60 @@ -585,6 +616,7 @@ class Skill19(ActiveSkill): 且有极高的暴击率和穿刺力。\n """ name = "溃灭射击" + ref = Ref.HEADSHOT cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -608,7 +640,11 @@ class Skill19(ActiveSkill): # [范围信息] # 子弹速度比率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"type":"+dataplus0","data":data0,"skills":["心灵反击","溃灭回射"],"ratio":1}]# noqa: E501 + # 迁移前实现(保留对照): + # associate = [{"type":"+dataplus0","data":data0,"skills":["心灵反击","溃灭回射"],"ratio":1}]# noqa: E501 + associate = [ + SkillEffect(attribute=ExtraData(0), operation=Operation.ADD, value=LevelTable(data0), skills=[Ref.COUNTERSHOOT, Ref.TURNINGSHOOT]), + ] # 刺踢 # gunner_female/ranger_female/c9664191611af31142e052dfaef84530 @@ -620,6 +656,7 @@ class Skill20(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "刺踢" + ref = Ref.FASTKNEE cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -658,6 +695,7 @@ class Skill21(ActiveSkill): 技能等级越高,被攻击对象的僵直时间就越长。\n """ name = "M-3喷火器" + ref = Ref.FLAMETHROWER cellPos = (9,4) learnLv = 15 masterLv = 60 @@ -691,6 +729,7 @@ class Skill22(PassiveSkill): 增加物理攻击力和暴击率,改装升级左轮枪的膛线、 弹仓和弹夹,增加左轮枪的装弹数、 连射速度、 贯穿力、 攻击速度和移动速度,并减少填装时间。\n """ name = "左轮奥义" + ref = Ref.POWERUPREVOLVER cellPos = (1,4) learnLv = 15 masterLv = 10 @@ -720,7 +759,11 @@ class Skill22(PassiveSkill): # 填装速度增加 : {value7}% data7 = get_data(f'{prefix}/{uuid}', 7) - associate = [{"type":"$*PAtkP","data":data0}] + # 迁移前实现(保留对照): + # associate = [{"type":"$*PAtkP","data":data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 空中射击 # gunner_female/ranger_female/bb34e8854a93fd250347a1c64119f7ab @@ -730,6 +773,7 @@ class Skill23(ActiveSkill): 增加跳跃攻击的空中停留时间以及跳跃射击的攻击力和射击次数上限,效果持续一定时间。\n """ name = "空中射击" + ref = Ref.STAYONJUMPSHOOT cellPos = (8,4) learnLv = 15 masterLv = 10 @@ -764,6 +808,7 @@ class Skill24(ActiveSkill): G-14手雷有最大填装数和填装冷却时间,按上、 下方向键后施放技能时,可以调整投掷位置。 转职成为弹药专家时,可以强制中断基本攻击动作,投掷G-14手雷。\n """ name = "G-14手雷" + ref = Ref.GRENADENONE cellPos = (7,4) learnLv = 15 masterLv = 60 @@ -798,6 +843,7 @@ class Skill25(ActiveSkill): 利用枪械进行格挡,可以减少所受敌人远程攻击的伤害。 有一定几率可以抵挡全部伤害。\n """ name = "远程格挡" + ref = Ref.BULLETGUARD cellPos = (6,5) learnLv = 20 masterLv = 10 @@ -835,6 +881,7 @@ class Skill26(PassiveSkill): 在决斗场中,技能可强制中断次数为0。\n """ name = "花式枪术" + ref = Ref.STYLISH cellPos = (1,5) learnLv = 20 masterLv = 10 @@ -860,7 +907,11 @@ class Skill26(PassiveSkill): data5 = get_data(f'{prefix}/{uuid}', 5) # Y轴每秒移动距离 : {value6}px data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{"data":data2}] + # 迁移前实现(保留对照): + # associate = [{"data":data2}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # 暴击 # gunner_female/ranger_female/fc1262c19f3d0477ee8eda47b8db8696 @@ -870,6 +921,7 @@ class Skill27(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -893,6 +945,7 @@ class Skill28(PassiveSkill): 转职为漫游枪手后,增加精通等级。\n """ name = "快速拔枪" + ref = Ref.FASTSHOOT cellPos = (7,6) learnLv = 25 masterLv = 10 @@ -924,6 +977,7 @@ class Skill29(ActiveSkill): 在决斗场中无法眩晕敌人,但是可以解除敌人的霸体状态,且远距离击退敌人。 决斗场中也无法维持准备动作,且无法中断[心灵反击]的施放。\n """ name = "心灵反击" + ref = Ref.COUNTERSHOOT cellPos = (5,6) learnLv = 25 masterLv = 1 @@ -964,6 +1018,7 @@ class Skill30(ActiveSkill): 施放技能时,若再次输入技能快捷键,则可以将敌人推开; 若此时第二次输入技能键,则可以将推开的敌人吸附到身边。\n """ name = "锁链截击" + ref = Ref.CHAINSNATCH cellPos = (1,6) learnLv = 25 masterLv = 60 @@ -1004,6 +1059,7 @@ class Skill31(ActiveSkill): 并增加该技能的伤害; 魔法值与当前的[溃灭射击]相同。\n """ name = "溃灭回射" + ref = Ref.TURNINGSHOOT cellPos = (4,7) learnLv = 30 masterLv = 1 @@ -1033,6 +1089,7 @@ class Skill32(ActiveSkill): 被[音速劫击]命中的敌人,会受到多段攻击伤害并向前飞出。\n """ name = "音速劫击" + ref = Ref.AIRRAID cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -1067,6 +1124,7 @@ class Skill33(ActiveSkill): 命中率增加效果需在施放技能后持续装备左轮枪,才能维持生效。\n """ name = "死亡左轮" + ref = Ref.REVOLVERCRITICALDAMAGEUP cellPos = (6,7) learnLv = 30 masterLv = 10 @@ -1099,6 +1157,7 @@ class Skill34(ActiveSkill): 若施放后连续按攻击键或技能快捷键,则可以更快地发射子弹; 若按跳跃键,则可以中断该技能。\n """ name = "枪舞" + ref = Ref.RANDOMSHOOT cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -1166,6 +1225,7 @@ class Skill35(ActiveSkill): 在决斗场中,移动射击时不会进入霸体状态。\n """ name = "移动射击" + ref = Ref.WALKSHOOT cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1226,6 +1286,7 @@ class Skill36(ActiveSkill): 每次发射可以用方向键控制发射方向,并给该方向的多个敌人造成伤害。\n """ name = "多重射击" + ref = Ref.MULTIHEADSHOT cellPos = (4,9) learnLv = 40 masterLv = 60 @@ -1287,6 +1348,7 @@ class Skill37(ActiveSkill): 在决斗场中抓取手枪后,不会进入霸体状态。\n """ name = "双鹰回旋" + ref = Ref.DOUBLEGUNHAWK cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1361,6 +1423,7 @@ class Skill38(PassiveSkill): - [后撩踢]、 [浮空铲]、 [上旋踢]、 [刺踢]、 [锁链截击] (体术)、 [音速劫击] (体术)、 [绯红盛宴]、 [回闪劫击]、 [死亡锁链]、 [锁链切割]、 [毁灭风暴] (射击)、 [盛放·绯红花园] (射击)\n """ name = "隐匿切割" + ref = Ref.VEILEDCUT cellPos = (2,11) learnLv = 48 masterLv = 40 @@ -1382,7 +1445,11 @@ class Skill38(PassiveSkill): data3 = get_data(f'{prefix}/{uuid}', 3) # 出血攻击力 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 绯红盛宴 # gunner_female/ranger_female/374f53e8989ef04a8506c8ec99d9ecdc @@ -1393,6 +1460,7 @@ class Skill39(ActiveSkill): 按向前方向键,可以增加最后一击前近距离。\n """ name = "绯红盛宴" + ref = Ref.BLOODYCARNIVAL cellPos = (6,11) learnLv = 50 masterLv = 40 @@ -1426,6 +1494,7 @@ class Skill40(ActiveSkill): 在空中和[上旋踢]施放过程中也可以发动该技能。\n """ name = "回闪劫击" + ref = Ref.AIRRAIDEX cellPos = (3,12) learnLv = 60 masterLv = 40 @@ -1486,6 +1555,7 @@ class Skill41(ActiveSkill): 射击时,按跳跃键可以强制中断技能。\n """ name = "压制射击" + ref = Ref.SUPPRESSINGFIRE cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1546,6 +1616,7 @@ class Skill42(PassiveSkill): 学习该技能后,增加出血状态的持续时间,并增加基本攻击力和技能攻击力。\n """ name = "枪刃改良" + ref = Ref.SAWBLADE cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1561,7 +1632,11 @@ class Skill42(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 出血持续时间增加 : {value1}秒 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 死亡锁链 # gunner_female/ranger_female/8ec9da6f808889b63adf2680fbf1f331 @@ -1573,6 +1648,7 @@ class Skill43(ActiveSkill): 若持续时间内没有再次按技能键,则不发动射击。\n """ name = "死亡锁链" + ref = Ref.KILLPOINT cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1644,6 +1720,7 @@ class Skill44(ActiveSkill): 向前方大范围挥舞2次枪刃,将敌人拉过来之后再次强力挥割敌人。\n """ name = "锁链切割" + ref = Ref.CHAINDEVIDER cellPos = (1,14) learnLv = 80 masterLv = 40 @@ -1707,6 +1784,7 @@ class Skill45(ActiveSkill): 向周围投掷多把枪刃向前突进,同时将大范围的敌人聚集到一起给予毁灭性的强力射击。\n """ name = "血舞祭" + ref = Ref.BLOODNCHAIN cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1743,6 +1821,7 @@ class Skill46(PassiveSkill): 射击攻击力以[音速劫击]物理攻击力的一定比率适用。\n """ name = "锁链意志" + ref = Ref.CHAINENLIGHTEN cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1765,7 +1844,12 @@ class Skill46(PassiveSkill): # [花式枪术] # 可强制中断次数上限增加量 : {value3} data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"data":data0},{"data":data1,"type":"=power0","skills":["锁链截击"]}] + # 迁移前实现(保留对照): + # associate = [{"data":data0},{"data":data1,"type":"=power0","skills":["锁链截击"]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=Power(0), operation=Operation.ASSIGN, value=LevelTable(data1), skills=[Ref.CHAINSNATCH]), + ] # 毁灭风暴 # gunner_female/ranger_female/d59c9840f65381bde8487757f1753c71 @@ -1778,6 +1862,7 @@ class Skill47(ActiveSkill): 斩击过程中,按跳跃键可以中断攻击。\n """ name = "毁灭风暴" + ref = Ref.RUINATIONAREA cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1834,6 +1919,7 @@ class Skill48(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "盛放·绯红花园" + ref = Ref.CRIMSONGARDEN cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/gunner_female/spitfire_female.py b/backend/core/character/GF/gunner_female/spitfire_female.py index b34a4f9e..066e1859 100644 --- a/backend/core/character/GF/gunner_female/spitfire_female.py +++ b/backend/core/character/GF/gunner_female/spitfire_female.py @@ -1,6 +1,16 @@ # 944b9aab492c15a8474f96947ceeb9e4 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunner_female.spitfire_female import SpitfireFemaleSkillRef as Ref prefix = "gunner_female/spitfire_female/cn/skillDetail" @@ -15,6 +25,7 @@ class Skill0(ActiveSkill): 转职为弹药专家或协战师后,技能类型变为独立攻击力。\n """ name = "后撩踢" + ref = Ref.AERIALKNEE learnLv = 1 masterLv = 10 maxLv = 20 @@ -44,6 +55,7 @@ class Skill1(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "浮空弹" + ref = Ref.LIFTSHOT learnLv = 1 masterLv = 60 maxLv = 70 @@ -70,6 +82,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -93,6 +106,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -120,6 +134,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -151,6 +166,7 @@ class Skill5(PassiveSkill): 在决斗场中,无法转换攻击类型,适用技能固有的攻击类型。\n """ name = "攻击类型转换" + ref = Ref.CONVERSION learnLv = 1 masterLv = 1 maxLv = 1 @@ -185,6 +201,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -207,6 +224,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -230,6 +248,7 @@ class Skill8(ActiveSkill): 若发射中按住向上方向键,则可以向上发射。\n """ name = "M-137格林机枪" + ref = Ref.GATLING learnLv = 5 masterLv = 60 maxLv = 70 @@ -265,6 +284,7 @@ class Skill9(ActiveSkill): 在地下城中不会被敌人击中,在决斗场中适用独立的生命值和防御力。\n """ name = "RX-78追击者" + ref = Ref.ROBOTRX78 learnLv = 5 masterLv = 60 maxLv = 70 @@ -295,6 +315,7 @@ class Skill10(ActiveSkill): 攻击不死族、 恶魔、 精灵类怪物时,可以大幅度增加伤害值。\n """ name = "银弹" + ref = Ref.SILVERBULLET learnLv = 5 masterLv = 20 maxLv = 30 @@ -323,6 +344,7 @@ class Skill11(PassiveSkill): 使重火器的拔出动作出现攻击判定,命中敌人后可以将敌人击退。\n """ name = "重火器拔击" + ref = Ref.HITONSUBWEAPON learnLv = 5 masterLv = 1 maxLv = 11 @@ -350,6 +372,7 @@ class Skill12(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "上旋踢" + ref = Ref.WINDMILL learnLv = 10 masterLv = 60 maxLv = 70 @@ -384,6 +407,7 @@ class Skill13(ActiveSkill): 转职为协战师时,技能类型变为独立攻击力; 仅射击2次。\n """ name = "钉刺射" + ref = Ref.PUNISHER learnLv = 10 masterLv = 60 maxLv = 70 @@ -414,6 +438,7 @@ class Skill14(ActiveSkill): 对无法抓取的敌人不适用控制效果,只能造成后撩踢的攻击伤害。\n """ name = "炙烤" + ref = Ref.AERIALGATLING learnLv = 10 masterLv = 60 maxLv = 70 @@ -442,6 +467,7 @@ class Skill15(ActiveSkill): 在决斗场中无法强制中断。\n """ name = "浮空铲" + ref = Ref.HIGHANGLESLIDING learnLv = 10 masterLv = 1 maxLv = 1 @@ -469,6 +495,7 @@ class Skill16(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -497,6 +524,7 @@ class Skill17(ActiveSkill): """ name = '跃翔' + ref = Ref.JUMPPOWERUP cellPos = (6,0) learnLv = 10 masterLv = 1 @@ -522,6 +550,7 @@ class Skill18(ActiveSkill): 向敌人脚下的地面快速连续射击,溅起尘土,对敌人造成伤害。\n """ name = "烟尘弹" + ref = Ref.ATDUSTSHOOT learnLv = 10 masterLv = 60 maxLv = 70 @@ -558,6 +587,7 @@ class Skill19(ActiveSkill): """ name = '特性弹' + ref = Ref.BULLETSPECIFIC cellPos = (4,4) learnLv = 15 masterLv = 10 @@ -600,6 +630,7 @@ class Skill20(ActiveSkill): 转职为协战师后,技能类型变为独立攻击力。\n """ name = "刺踢" + ref = Ref.FASTKNEE learnLv = 15 masterLv = 60 maxLv = 70 @@ -637,6 +668,7 @@ class Skill21(ActiveSkill): 技能等级越高,被攻击对象的僵直时间就越长。\n """ name = "M-3喷火器" + ref = Ref.FLAMETHROWER learnLv = 15 masterLv = 60 maxLv = 70 @@ -684,6 +716,7 @@ class Skill22(PassiveSkill): """ name = '单兵推进器' + ref = Ref.NITROMOTOR cellPos = (8,4) learnLv = 15 masterLv = 10 @@ -710,7 +743,12 @@ class Skill22(PassiveSkill): # 后跳使用时,消耗使用次数 : {value6} data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{'data': data0, 'skills': ['交叉射击', '聚合弹', '凝固汽油弹', '超真空弹 : 切利']}, {'data': data1, 'skills': ['爆裂弹']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'skills': ['交叉射击', '聚合弹', '凝固汽油弹', '超真空弹 : 切利']}, {'data': data1, 'skills': ['爆裂弹']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.CROSSSHOOT, Ref.CHARGEBUSTER, Ref.NAPALMBOMB, Ref.CHELLI]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.BULLETEXPLOSIVE]), + ] # 空中射击 # gunner_female/spitfire_female/bb34e8854a93fd250347a1c64119f7ab @@ -721,6 +759,7 @@ class Skill23(ActiveSkill): """ name = '空中射击' + ref = Ref.STAYONJUMPSHOOT cellPos = (7,4) learnLv = 15 masterLv = 1 @@ -755,6 +794,7 @@ class Skill24(ActiveSkill): """ name = 'G-14手雷' + ref = Ref.GRENADENONE cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -799,6 +839,7 @@ class Skill25(ActiveSkill): """ name = '超负荷装填' + ref = Ref.OVERCHARGE cellPos = (3,4) learnLv = 15 masterLv = 10 @@ -824,6 +865,7 @@ class Skill26(PassiveSkill): """ name = '弹药改良' + ref = Ref.BULLETREINFORCE cellPos = (1,5) learnLv = 20 masterLv = 10 @@ -848,7 +890,12 @@ class Skill26(PassiveSkill): # 暴击率增加 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'data': data3, 'type': '*skillDamage'}, {'data': data4, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data3, 'type': '*skillDamage'}, {'data': data4, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data4))), + ] # 手雷精通 # gunner_female/spitfire_female/0113c8b1306ca76d208f83f2d093dd62 @@ -859,6 +906,7 @@ class Skill27(PassiveSkill): """ name = '手雷精通' + ref = Ref.STRAYBULLETMASTERY cellPos = (6,5) learnLv = 20 masterLv = 10 @@ -875,11 +923,15 @@ class Skill27(PassiveSkill): ratio = 1.0 - def effect(self, old, new): - self.associate = [ - {'type': '*skillDamage', 'data': [i*self.ratio for i in self.data0], 'skills': ['G-14手雷', 'G-35L感电手雷', 'G-18C冰冻手雷']}, - ] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # self.associate = [ + # {'type': '*skillDamage', 'data': [i*self.ratio for i in self.data0], 'skills': ['G-14手雷', 'G-35L感电手雷', 'G-18C冰冻手雷']}, + # ] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0) * Read(SkillAttribute.RATIO)), skills=[Ref.GRENADENONE, Ref.GRENADELIGHT, Ref.GRENADEWATER]), + ] # 暴击 @@ -890,6 +942,7 @@ class Skill28(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -913,6 +966,7 @@ class Skill29(PassiveSkill): """ name = '兵器研究' + ref = Ref.WEAPONEXPERT cellPos = (0,5) learnLv = 20 masterLv = 10 @@ -939,7 +993,12 @@ class Skill29(PassiveSkill): # 填装速度增加 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'data': data0, 'type': '$*PAtkI'}, {'data': data2, 'type': '*cdReduce', 'exceptSkills': ['EMP磁暴', '决战之日', '终解·制空霸权']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '$*PAtkI'}, {'data': data2, 'type': '*cdReduce', 'exceptSkills': ['EMP磁暴', '决战之日', '终解·制空霸权']}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_I, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data2)), except_skills=[Ref.EMPSTORM, Ref.DDAY, Ref.DEFINITESOLUTION]), + ] # M18阔剑地雷 # gunner_female/spitfire_female/2ff50c35efcf0f287c4c418c8454da48 @@ -953,6 +1012,7 @@ class Skill30(ActiveSkill): """ name = 'M18阔剑地雷' + ref = Ref.M18CLAYMORE cellPos = (8,5) learnLv = 20 masterLv = 60 @@ -994,6 +1054,7 @@ class Skill31(PassiveSkill): """ name = '快速拔枪' + ref = Ref.FASTSHOOT cellPos = (9,6) learnLv = 25 masterLv = 5 @@ -1022,6 +1083,7 @@ class Skill32(ActiveSkill): """ name = '交叉射击' + ref = Ref.CROSSSHOOT cellPos = (3,6) learnLv = 25 masterLv = 60 @@ -1060,6 +1122,7 @@ class Skill33(ActiveSkill): """ name = 'G-35L感电手雷' + ref = Ref.GRENADELIGHT cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -1112,6 +1175,7 @@ class Skill34(ActiveSkill): """ name = '爆裂弹' + ref = Ref.BULLETEXPLOSIVE cellPos = (4,7) learnLv = 30 masterLv = 10 @@ -1154,6 +1218,7 @@ class Skill35(ActiveSkill): """ name = '贯穿弹' + ref = Ref.BULLETPENETRATE cellPos = (2,7) learnLv = 30 masterLv = 10 @@ -1196,6 +1261,7 @@ class Skill36(ActiveSkill): """ name = 'G-18C冰冻手雷' + ref = Ref.GRENADEWATER cellPos = (6,7) learnLv = 30 masterLv = 60 @@ -1247,6 +1313,7 @@ class Skill37(ActiveSkill): """ name = 'C4飞弹' + ref = Ref.C4 cellPos = (8,8) learnLv = 35 masterLv = 60 @@ -1303,6 +1370,7 @@ class Skill38(ActiveSkill): """ name = '聚合弹' + ref = Ref.CHARGEBUSTER cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -1351,6 +1419,7 @@ class Skill39(ActiveSkill): """ name = '凝固汽油弹' + ref = Ref.NAPALMBOMB cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -1413,6 +1482,7 @@ class Skill40(ActiveSkill): """ name = '镭射狙击' + ref = Ref.LOCKONSUPPORT cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1472,6 +1542,7 @@ class Skill41(PassiveSkill): """ name = '弹药强化' + ref = Ref.WEAPONREINFORCE cellPos = (4,11) learnLv = 48 masterLv = 40 @@ -1487,7 +1558,11 @@ class Skill41(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 过电流持续时间 : {value1}秒 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # EMP磁暴 # gunner_female/spitfire_female/2c9d9a36c8401bddff6cdb80fab8dc24 @@ -1498,6 +1573,7 @@ class Skill42(ActiveSkill): """ name = 'EMP磁暴' + ref = Ref.EMPSTORM cellPos = (7,11) learnLv = 50 masterLv = 40 @@ -1538,6 +1614,7 @@ class Skill43(ActiveSkill): """ name = 'G-61重力手雷' + ref = Ref.GRAVITYGRENADE cellPos = (5,12) learnLv = 60 masterLv = 40 @@ -1602,6 +1679,7 @@ class Skill44(ActiveSkill): """ name = '超真空弹 : 切利' + ref = Ref.CHELLI cellPos = (3,13) learnLv = 70 masterLv = 40 @@ -1664,6 +1742,7 @@ class Skill45(PassiveSkill): """ name = '制空掌握' + ref = Ref.KEYOFPROOF cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1678,7 +1757,11 @@ class Skill45(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 开火 # gunner_female/spitfire_female/9ceb0c55f40f1fc0fe0fcc65c8fee3a0 @@ -1690,6 +1773,7 @@ class Skill46(ActiveSkill): """ name = '开火' + ref = Ref.OPENFIRE cellPos = (7,13) learnLv = 75 masterLv = 40 @@ -1744,6 +1828,7 @@ class Skill47(ActiveSkill): """ name = '光子霰雷发射器' + ref = Ref.PHOTOBILIZER cellPos = (4,14) learnLv = 80 masterLv = 40 @@ -1803,6 +1888,7 @@ class Skill48(ActiveSkill): """ name = '决战之日' + ref = Ref.DDAY cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -1833,6 +1919,7 @@ class Skill49(PassiveSkill): """ name = '单兵推进器-02X' + ref = Ref.N_02X cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1851,10 +1938,15 @@ class Skill49(PassiveSkill): # 强化手雷攻击力 : 手雷攻击力的{value2}% data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0}, + # {'type': '*ratio', 'data': data1, 'skills': ['手雷精通']}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0}, - {'type': '*ratio', 'data': data1, 'skills': ['手雷精通']}, - ] + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.RATIO, value=1 + Percent(LevelTable(data1)), skills=[Ref.STRAYBULLETMASTERY]), + ] # 空袭战略 # gunner_female/spitfire_female/c591d1827cfbe224031c704e21d07932 @@ -1870,6 +1962,7 @@ class Skill50(ActiveSkill): """ name = '空袭战略' + ref = Ref.STANDBYREADY cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1904,6 +1997,7 @@ class Skill51(ActiveSkill): """ name = '终解·制空霸权' + ref = Ref.DEFINITESOLUTION cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/gunner_male/assault.py b/backend/core/character/GF/gunner_male/assault.py index 64add208..8132ab39 100644 --- a/backend/core/character/GF/gunner_male/assault.py +++ b/backend/core/character/GF/gunner_male/assault.py @@ -1,6 +1,16 @@ #afdf3b989339de478e85b614d274d1ef from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunner_male.assault import AssaultSkillRef as Ref prefix = "gunner_male/assault/cn/skillDetail" @@ -12,6 +22,7 @@ class Skill0(ActiveSkill): 向敌人发出强威力的膝撞并使其浮空,发动的瞬间存在霸体判定。\n """ name = "膝撞" + ref = Ref.AERIALKNEE learnLv = 1 masterLv = 10 maxLv = 20 @@ -40,6 +51,7 @@ class Skill1(ActiveSkill): 向敌人发射1发子弹并使其浮空。\n """ name = "浮空弹" + ref = Ref.LIFTSHOT learnLv = 1 masterLv = 60 maxLv = 70 @@ -66,6 +78,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -89,6 +102,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -108,7 +122,11 @@ class Skill3(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['瞄准射击']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['瞄准射击']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.AIMSHOOT]), + ] # 受身蹲伏 # gunner_male/assault/ce26c6b69d02a440a81b552bec94f03b @@ -118,6 +136,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -158,6 +177,7 @@ class Skill5(PassiveSkill): 决斗场中,适用[心脏驱动]增益后,才能使用超频系列技能和强制中断施放后僵直。\n """ name = "合金改装" + ref = Ref.ALTERATION learnLv = 1 masterLv = 1 maxLv = 1 @@ -194,6 +214,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -216,6 +237,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -242,6 +264,7 @@ class Skill8(ActiveSkill): 卫星射击对击范围内的所有敌人造成伤害,相比[M-137格林机枪]攻击次数减少,但破坏力更强。\n """ name = "M-137格林机枪" + ref = Ref.GATLING learnLv = 5 masterLv = 60 maxLv = 70 @@ -278,6 +301,7 @@ class Skill9(ActiveSkill): 对建筑型护甲的敌人可以造成125%的伤害。\n """ name = "RX-78追击者" + ref = Ref.ROBOTRX78 learnLv = 5 masterLv = 60 maxLv = 70 @@ -308,6 +332,7 @@ class Skill10(ActiveSkill): 移动中途按相反方向键并发动基本攻击或转职技能时,转向后方发动攻击。\n """ name = "超频 : 压制" + ref = Ref.SUPPRESS learnLv = 5 masterLv = 60 maxLv = 70 @@ -334,6 +359,7 @@ class Skill11(ActiveSkill): 前冲攻击或者倒地时按攻击键,可以发动回旋踢的同时站立。\n """ name = "回旋踢" + ref = Ref.WINDMILL learnLv = 10 masterLv = 60 maxLv = 70 @@ -368,6 +394,7 @@ class Skill12(ActiveSkill): 在决斗场中,[花式枪术]附加效果不生效。\n """ name = "踏射" + ref = Ref.PUNISHER learnLv = 10 masterLv = 60 maxLv = 70 @@ -397,6 +424,7 @@ class Skill13(ActiveSkill): 攻击型抓取判断 : 对霸体状态、 防御状态、 无法抓取的敌人不适用控制效果,只能造成膝撞攻击伤害。\n """ name = "炙烤" + ref = Ref.AERIALGATLING learnLv = 10 masterLv = 60 maxLv = 70 @@ -425,6 +453,7 @@ class Skill14(ActiveSkill): 在决斗场中无法强制中断。\n """ name = "浮空铲" + ref = Ref.HIGHANGLESLIDING learnLv = 10 masterLv = 1 maxLv = 1 @@ -452,6 +481,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -479,6 +509,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -506,6 +537,7 @@ class Skill17(ActiveSkill): 拔枪动作命中敌人时,可将敌人击退。\n """ name = "烟尘弹" + ref = Ref.DUSTSHOOT learnLv = 10 masterLv = 60 maxLv = 70 @@ -540,6 +572,7 @@ class Skill18(ActiveSkill): 向前方敌人发出肉眼无法看清的快踢攻击,可以击退敌人并有一定几率使其进入眩晕状态。\n """ name = "瞬踢" + ref = Ref.FASTKNEE learnLv = 15 masterLv = 60 maxLv = 70 @@ -575,6 +608,7 @@ class Skill19(ActiveSkill): 增加跳跃攻击的空中停留时间以及跳跃射击的攻击力和射击次数上限,效果持续一定时间。\n """ name = "空中射击" + ref = Ref.STAYONJUMPSHOOT learnLv = 15 masterLv = 10 maxLv = 20 @@ -607,6 +641,7 @@ class Skill20(PassiveSkill): 增加物理攻击力。 装备自动手枪时,增加命中率。\n """ name = "合金战士自动手枪精通" + ref = Ref.AUTOMATICPISTOLMASTERY_ASSAULT learnLv = 15 masterLv = 10 maxLv = 20 @@ -624,7 +659,11 @@ class Skill20(PassiveSkill): # 命中率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'type': '$*PAtkP', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '$*PAtkP', 'data': data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 瞄准射击 # gunner_male/assault/b3ba5c678595305d31dcb11a8350971b @@ -636,6 +675,7 @@ class Skill21(ActiveSkill): 步枪射击攻击力受[基础精通]影响。\n """ name = "瞄准射击" + ref = Ref.AIMSHOOT learnLv = 15 masterLv = 1 maxLv = 1 @@ -662,7 +702,7 @@ class Skill21(ActiveSkill): self.cdReduce *= 1 - 0.3 def getSkillCD(self,mode): - pre = self.char.GetSkillByName("雷达扫射") + pre = self.char.GetSkill(Ref.DIRECTFEEDBACK) if pre.vp == 2: return pre.getSkillCD(mode) else: @@ -676,6 +716,7 @@ class Skill22(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -699,6 +740,7 @@ class Skill23(PassiveSkill): 增加基本攻击力、 转职技能攻击力和物理暴击率。\n """ name = "弱点扫描" + ref = Ref.SENSIBILITY learnLv = 20 masterLv = 10 maxLv = 20 @@ -715,7 +757,11 @@ class Skill23(PassiveSkill): # 物理暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 改装榴弹 # gunner_male/assault/67f4b84ed61ee86f505a852b202762a0 @@ -727,6 +773,7 @@ class Skill24(ActiveSkill): 拔枪动作命中敌人时,可将敌人击退。\n """ name = "改装榴弹" + ref = Ref.BURSTBOMB learnLv = 20 masterLv = 60 maxLv = 70 @@ -764,6 +811,7 @@ class Skill25(ActiveSkill): 挥动改造型自动手枪的枪托攻击敌人,命中时将敌人击退并强制控制一定时间。\n """ name = "枪托强击" + ref = Ref.BASHSTOCK learnLv = 20 masterLv = 60 maxLv = 70 @@ -794,6 +842,7 @@ class Skill26(PassiveSkill): 快速拔枪攻击敌人,发动后可以增加攻击速度和普通射击的攻击力。 转职为漫游枪手后增加精通等级。\n """ name = "快速拔枪" + ref = Ref.FASTSHOOT learnLv = 25 masterLv = 5 maxLv = 20 @@ -822,6 +871,7 @@ class Skill27(ActiveSkill): 合金战士发动多个所受伤害减少效果时,仅适用效果最高的1种。\n """ name = "超频 : 重盾保卫" + ref = Ref.BODYBUNKER learnLv = 25 masterLv = 60 maxLv = 70 @@ -858,6 +908,7 @@ class Skill28(ActiveSkill): 增加基本攻击力和转职技能的攻击力、 攻击速度和移动速度。\n """ name = "心脏驱动" + ref = Ref.ACTIVATION learnLv = 25 masterLv = 10 maxLv = 20 @@ -890,6 +941,7 @@ class Skill29(PassiveSkill): 增加[烟尘弹]的攻击力和攻击范围。\n """ name = "改造烟尘弹" + ref = Ref.ALTERATIONDUSTSHOOT learnLv = 25 masterLv = 1 maxLv = 1 @@ -907,7 +959,11 @@ class Skill29(PassiveSkill): # 攻击范围比率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'skills': ['烟尘弹']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'skills': ['烟尘弹']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.DUSTSHOOT]), + ] # 三连霰弹 # gunner_male/assault/e7e39aa9fcf182c8db543235c8af7dac @@ -918,6 +974,7 @@ class Skill30(ActiveSkill): 拔枪动作命中敌人时,可将敌人击退。\n """ name = "三连霰弹" + ref = Ref.TRIPLEGUNSHOT learnLv = 30 masterLv = 60 maxLv = 70 @@ -957,6 +1014,7 @@ class Skill31(ActiveSkill): 手雷滚动到尽头时组件全部展开后引发爆炸。\n """ name = "磁力手雷" + ref = Ref.NEODYMIUMFUSEE learnLv = 30 masterLv = 60 maxLv = 70 @@ -994,6 +1052,7 @@ class Skill32(ActiveSkill): 在一定范围内击中过的敌人中,追踪并用肩部撞击其中最强大的敌人。 然后,利用后坐力向后退,并发射机械臂上装备的炮筒。\n """ name = "超频 : 机械冲撞" + ref = Ref.BREACHINGDOWN learnLv = 35 masterLv = 60 maxLv = 70 @@ -1053,6 +1112,7 @@ class Skill33(ActiveSkill): 炸弹飞出后嵌入地面,引发冲击波; 然后炸弹内的弹药四溅,引发连锁爆炸。\n """ name = "爆裂飞踢" + ref = Ref.MCPICE learnLv = 35 masterLv = 60 maxLv = 70 @@ -1121,6 +1181,7 @@ class Skill34(ActiveSkill): 按前方向键,可向前方跳跃。\n """ name = "战略轰炸" + ref = Ref.SCORCHTACTICS learnLv = 40 masterLv = 60 maxLv = 70 @@ -1187,6 +1248,7 @@ class Skill35(ActiveSkill): 若识别敌人失败,则剩余冷却时间减少为5秒。\n """ name = "雷达扫射" + ref = Ref.DIRECTFEEDBACK learnLv = 45 masterLv = 60 maxLv = 70 @@ -1255,6 +1317,7 @@ class Skill36(PassiveSkill): 增加基本攻击力、 转职技能的攻击力和物理暴击率。\n """ name = "机体复原" + ref = Ref.RETROFIT learnLv = 48 masterLv = 40 maxLv = 50 @@ -1270,7 +1333,11 @@ class Skill36(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 物理暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data':data0}] + # 迁移前实现(保留对照): + # associate = [{'data':data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 电弧能量释放 # gunner_male/assault/fa7f1a3dc90600456cbe010e5714bef3 @@ -1295,6 +1362,7 @@ class Skill37(ActiveSkill): [超频 : 末世终结之战] : 充满\n """ name = "电弧能量释放" + ref = Ref.ARCDISCHARGE learnLv = 48 masterLv = 1 maxLv = 1 @@ -1322,6 +1390,7 @@ class Skill38(ActiveSkill): 觉醒技能是强力超频技能,需消耗大量能量,因此无法中断施放后僵直。\n """ name = "超频 : 全领域攻击" + ref = Ref.DEATHFIELD learnLv = 50 masterLv = 40 maxLv = 50 @@ -1361,6 +1430,7 @@ class Skill39(ActiveSkill): 解除强化型改造机械腿的限制,瞬间集中力量后用力踢击,引发电流冲击波。\n """ name = "超频 : 电流闪踢" + ref = Ref.DYNAMITEKICK learnLv = 60 masterLv = 40 maxLv = 50 @@ -1414,6 +1484,7 @@ class Skill40(ActiveSkill): 盾牌的生命值和防御力为角色数值的一定比例。\n """ name = "堡垒轰击" + ref = Ref.FORTRESSBLITZ learnLv = 70 masterLv = 40 maxLv = 50 @@ -1480,6 +1551,7 @@ class Skill41(PassiveSkill): [焕然新生的感觉不错吧? --梅尔文]\n """ name = "躯体重塑" + ref = Ref.RECONSTRUCTIONBODY learnLv = 75 masterLv = 40 maxLv = 50 @@ -1501,7 +1573,11 @@ class Skill41(PassiveSkill): # 盾牌保护区域伤害减少效果增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data':data0}] + # 迁移前实现(保留对照): + # associate = [{'data':data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # AT-SO步行者 # gunner_male/assault/50a859dea1a48a2f60916afbfc91434f @@ -1533,6 +1609,7 @@ class Skill42(ActiveSkill): [快搭乘试试,体验感是不是好极了? --梅尔文]\n """ name = "AT-SO步行者" + ref = Ref.AT_SOWALKER learnLv = 75 masterLv = 40 maxLv = 50 @@ -1636,6 +1713,7 @@ class Skill43(ActiveSkill): 停止自动射击状态下再次按技能键,解除自动射击中止指令。\n """ name = "步行者中止指令" + ref = Ref.WALKERATTACKSTOP learnLv = 75 masterLv = 1 maxLv = 1 @@ -1662,6 +1740,7 @@ class Skill44(ActiveSkill): [为可折叠的便携式,内部填入炸药附加爆炸功能,将天界的魔刹石附着在铁桩上增强破坏力,不仅可用于攻城,也可以在一般战斗中使用。 --炎神攻城炮说明书]\n """ name = "炎神攻城炮" + ref = Ref.RAYTHEONCIRT learnLv = 80 masterLv = 40 maxLv = 50 @@ -1715,6 +1794,7 @@ class Skill45(ActiveSkill): [装备上刻着梅尔文名字的首字母,可见他对这项发明引以为傲。]\n """ name = "超频 : 伊奎利斯-MR" + ref = Ref.EQUALISMR learnLv = 85 masterLv = 40 maxLv = 50 @@ -1749,6 +1829,7 @@ class Skill46(PassiveSkill): [以梅丽·法伊奥妮尔的设计为基础,由梅尔文·里克特亲自改造躯体,并利用奈恩·希格和琳赛·罗森开发的能源技术强化人工心脏,即使输出超过极限也很安全。 --摘自诺维尔组件部分记录]\n """ name = "诺维尔计划 : 涅槃" + ref = Ref.PROJECTNOVELPARTS learnLv = 95 masterLv = 40 maxLv = 50 @@ -1765,9 +1846,14 @@ class Skill46(PassiveSkill): # [超频 : 压制]冷却时间减少 : {value1}秒 data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0}, + # {'type': '+cd', 'data': [0] + [-1] * maxLv, 'skills': ['超频 : 压制'], 'ratio': 1}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0}, - {'type': '+cd', 'data': [0] + [-1] * maxLv, 'skills': ['超频 : 压制'], 'ratio': 1}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD, operation=Operation.ADD, value=LevelTable([0] + [-1] * maxLv), skills=[Ref.SUPPRESS]), ] # 超频 : 音速瞬杀 @@ -1783,6 +1869,7 @@ class Skill47(ActiveSkill): [机械右臂 - 由梅尔文·里克特和佩拉·维恩合作制造,结合了机器人工学技术。]\n """ name = "超频 : 音速瞬杀" + ref = Ref.SONICCOLLIDE learnLv = 95 masterLv = 40 maxLv = 50 @@ -1827,6 +1914,7 @@ class Skill48(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "超频 : 末世终结之战" + ref = Ref.FINALDESPERATION learnLv = 100 masterLv = 40 maxLv = 50 diff --git a/backend/core/character/GF/gunner_male/launcher_male.py b/backend/core/character/GF/gunner_male/launcher_male.py index 0d93faa3..fb5c2c1d 100644 --- a/backend/core/character/GF/gunner_male/launcher_male.py +++ b/backend/core/character/GF/gunner_male/launcher_male.py @@ -1,6 +1,18 @@ #afdf3b989339de478e85b614d274d1ef from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Equals, + LevelTable, + Operation, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunner_male.launcher_male import LauncherMaleSkillRef as Ref prefix = "gunner_male/launcher_male/cn/skillDetail" @@ -12,6 +24,7 @@ class Skill0(ActiveSkill): 向敌人发出强威力的膝撞并使其浮空,发动的瞬间存在霸体判定。\n """ name = "膝撞" + ref = Ref.AERIALKNEE learnLv = 1 masterLv = 10 maxLv = 20 @@ -40,6 +53,7 @@ class Skill1(ActiveSkill): 向敌人发射1发子弹并使其浮空。\n """ name = "浮空弹" + ref = Ref.LIFTSHOT learnLv = 1 masterLv = 60 maxLv = 70 @@ -66,6 +80,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -89,6 +104,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -116,6 +132,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -157,6 +174,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -179,6 +197,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -205,6 +224,7 @@ class Skill7(ActiveSkill): 卫星射击对击范围内的所有敌人造成伤害,相比[M-137格林机枪]攻击次数减少,但破坏力更强。\n """ name = "M-137格林机枪" + ref = Ref.GATLING cellPos = (4,2) learnLv = 5 masterLv = 60 @@ -239,6 +259,7 @@ class Skill8(ActiveSkill): 对建筑型护甲的敌人可以造成125%的伤害。\n """ name = "RX-78追击者" + ref = Ref.ROBOTRX78 learnLv = 5 masterLv = 60 maxLv = 70 @@ -269,6 +290,7 @@ class Skill9(ActiveSkill): 攻击不死族、 恶魔、 精灵类怪物时,可以大幅度增加伤害值。\n """ name = "银弹" + ref = Ref.SILVERBULLET learnLv = 5 masterLv = 20 maxLv = 30 @@ -297,6 +319,7 @@ class Skill10(PassiveSkill): 使重火器的拔出动作出现攻击判定,命中敌人后可以将敌人击退。\n """ name = "重火器拔击" + ref = Ref.HITONSUBWEAPON cellPos = (3,2) learnLv = 5 masterLv = 1 @@ -320,6 +343,7 @@ class Skill11(ActiveSkill): 前冲攻击或者倒地时按攻击键,可以发动回旋踢的同时站立。\n """ name = "回旋踢" + ref = Ref.WINDMILL learnLv = 10 masterLv = 60 maxLv = 70 @@ -354,6 +378,7 @@ class Skill12(ActiveSkill): 在决斗场中,[花式枪术]附加效果不生效。\n """ name = "踏射" + ref = Ref.PUNISHER learnLv = 10 masterLv = 60 maxLv = 70 @@ -383,6 +408,7 @@ class Skill13(ActiveSkill): 攻击型抓取判断 : 对霸体状态、 防御状态、 无法抓取的敌人不适用控制效果,只能造成膝撞攻击伤害。\n """ name = "炙烤" + ref = Ref.AERIALGATLING learnLv = 10 masterLv = 60 maxLv = 70 @@ -412,6 +438,7 @@ class Skill14(ActiveSkill): 在决斗场中无法强制中断。\n """ name = "浮空铲" + ref = Ref.HIGHANGLESLIDING cellPos = (7,3) learnLv = 10 masterLv = 1 @@ -437,6 +464,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -464,6 +492,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -491,6 +520,7 @@ class Skill17(ActiveSkill): 拔枪动作命中敌人时,可将敌人击退。\n """ name = "烟尘弹" + ref = Ref.DUSTSHOOT learnLv = 10 masterLv = 60 maxLv = 70 @@ -524,6 +554,7 @@ class Skill18(ActiveSkill): 向前方敌人发出肉眼无法看清的快踢攻击,可以击退敌人并有一定几率使其进入眩晕状态。\n """ name = "瞬踢" + ref = Ref.FASTKNEE learnLv = 15 masterLv = 60 maxLv = 70 @@ -562,6 +593,7 @@ class Skill19(ActiveSkill): 转职成为枪炮师时,才可以强制中断基本攻击动作,并立即施放该技能,并且在发射过程中可以用方向键移动。\n """ name = "M-3喷火器" + ref = Ref.FLAMETHROWER cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -596,6 +628,7 @@ class Skill20(PassiveSkill): 减少除[卫星射线]、 [毁灭射线]、 [裂核轨道炮]外的其他技能的冷却时间。\n """ name = "重火器精通" + ref = Ref.SUBWEAPONMASTERY cellPos = (1,4) learnLv = 15 masterLv = 10 @@ -615,10 +648,16 @@ class Skill20(PassiveSkill): # 技能冷却时间减少率 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) + # 迁移前实现(保留对照): + # associate = [ + # {"type":"$*PAtkP","data":data2}, + # {"data":data3}, + # {"type":"*cdReduce","data":data4,"exceptSkills":['卫星射线', '毁灭射线', '裂核轨道炮']}, + # ] associate = [ - {"type":"$*PAtkP","data":data2}, - {"data":data3}, - {"type":"*cdReduce","data":data4,"exceptSkills":['卫星射线', '毁灭射线', '裂核轨道炮']}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data2))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data4)), except_skills=[Ref.SATELLITELASER, Ref.BURSTERBEAMNEW, Ref.ORBITALDISASTER]), ] # 空中射击 @@ -629,6 +668,7 @@ class Skill21(ActiveSkill): 增加跳跃攻击的空中停留时间以及跳跃射击的攻击力和射击次数上限,效果持续一定时间。\n """ name = "空中射击" + ref = Ref.STAYONJUMPSHOOT learnLv = 15 masterLv = 10 maxLv = 20 @@ -661,6 +701,7 @@ class Skill22(PassiveSkill): 领悟重火器奥义,使除了1、 2、 3次觉醒技能之外的所有重火器技能各增加1级。\n """ name = "重火器奥义" + ref = Ref.SUBWEAPONPOWERUP cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -669,12 +710,23 @@ class Skill22(PassiveSkill): rangeLv = 1 uuid = "e49e57b2e8fbeceb0a2c56a0c63fe6c5" + # 迁移前实现(保留对照): + # def effect(self, old, new): + # skills = [] + # for i in self.char.skills: + # if i.type == "active" and i.learnLv not in [50,85,100] and i.damage and self.char.skill_effects.is_learned(i): + # skills.append(i.name) + # self.associate = [{"type":"+lv","data":[0] + [1]*self.maxLv,"ratio":1,"skills":skills}] + # super().effect(old, new) + # 仅动态枚举目标名称,贡献值与 VP 条件交由类型化声明处理。 def effect(self, old, new): skills = [] for i in self.char.skills: - if i.type == "active" and i.learnLv not in [50,85,100] and i.damage and i.lv > 0: + if i.type == "active" and i.learnLv not in [50,85,100] and i.damage and self.char.skill_effects.is_learned(i): skills.append(i.name) - self.associate = [{"type":"+lv","data":[0] + [1]*self.maxLv,"ratio":1,"skills":skills}] + self.associate = [ + SkillEffect(attribute=SkillAttribute.LEVEL, operation=Operation.ADD, value=LevelTable([0] + [1] * self.maxLv), skills=skills), + ] super().effect(old, new) @@ -687,6 +739,7 @@ class Skill23(ActiveSkill): G-14手雷有最大填装数和填装冷却时间,按上、 下方向键后施放技能时,可以调整投掷位置。 转职成为弹药专家时,可以强制中断基本攻击动作,投掷G-14手雷。\n """ name = "G-14手雷" + ref = Ref.GRENADENONE cellPos = (10,4) learnLv = 15 masterLv = 60 @@ -722,6 +775,7 @@ class Skill24(ActiveSkill): 穿刺弹不会爆炸,会穿透并越过路径上的所有敌人,新增向Y轴小幅度聚集周围的敌人的效果,删除诱导功能。\n """ name = "反坦克炮" + ref = Ref.STEYRHEAVYRIFLE cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -766,6 +820,7 @@ class Skill25(ActiveSkill): 增加能量球飞行距离,且命中敌人时立即爆炸。 同时,冲撞攻击力与爆炸攻击力合并。\n """ name = "加农炮" + ref = Ref.CANNONBALL cellPos = (1,5) learnLv = 20 masterLv = 60 @@ -795,6 +850,7 @@ class Skill26(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -817,6 +873,7 @@ class Skill27(PassiveSkill): 快速拔枪攻击敌人,发动后可以增加攻击速度和普通射击的攻击力。 转职为漫游枪手后增加精通等级。\n """ name = "快速拔枪" + ref = Ref.FASTSHOOT cellPos = (8,6) learnLv = 25 masterLv = 5 @@ -840,6 +897,7 @@ class Skill28(ActiveSkill): 向敌人发射激光,使敌人受到光属性伤害; 激光的攻击范围比较狭小,但是射程极远。\n """ name = "激光炮" + ref = Ref.LASERRIFLE cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -871,6 +929,7 @@ class Skill29(PassiveSkill): 激光的攻击力随充电时间增加,达到最大充电值时,可以增加攻击范围和射程,但会有很大的后坐力。\n """ name = "蓄电激光炮" + ref = Ref.LASERRIFLECHARGE cellPos = (5,7) learnLv = 25 masterLv = 1 @@ -885,7 +944,11 @@ class Skill29(PassiveSkill): # 攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data1,"skills":["激光炮"]}] + # 迁移前实现(保留对照): + # associate = [{"data":data1,"skills":["激光炮"]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.LASERRIFLE]), + ] # 超动力补给包 # gunner_male/launcher_male/04c7b4361ca81f041e868169ff044252 @@ -895,6 +958,7 @@ class Skill30(PassiveSkill): 包含高功率电池及钢化弹头的补给包,增加基本攻击力和转职技能攻击力。\n """ name = "超动力补给包" + ref = Ref.OVERPACK cellPos = (2,6) learnLv = 25 masterLv = 1 @@ -906,7 +970,11 @@ class Skill30(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 聚焦喷火器 # gunner_male/launcher_male/04883563896fe1adac7505c6146b5f59 @@ -917,6 +985,7 @@ class Skill31(ActiveSkill): 喷射中可以移动。\n """ name = "聚焦喷火器" + ref = Ref.FLAMETHROWERBOOST cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -949,6 +1018,7 @@ class Skill32(ActiveSkill): 在一定时间内,增加基本攻击力以及所有重火器技能的攻击力和命中率。\n """ name = "潜能爆发" + ref = Ref.SUBWEAPONSTUCKDOWN cellPos = (2,7) learnLv = 30 masterLv = 10 @@ -975,6 +1045,7 @@ class Skill33(ActiveSkill): 使用榴弹发射器快速发射榴弹。榴弹速度很快,命中敌人时,会引起爆炸并使周围敌人受到伤害。\n """ name = "FM-31榴弹发射器" + ref = Ref.FM31 cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -1025,6 +1096,7 @@ class Skill34(ActiveSkill): 经过一定时间或松开技能键,刺弹炮弹会自动分离成刺状爆弹。 即使快速松开技能键,也需要经过一定时间后才能分离。\n """ name = "FM-92刺弹炮" + ref = Ref.STINGER cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -1081,6 +1153,7 @@ class Skill35(PassiveSkill): 将光、 火属性值中较低的属性值补正为较高的属性值。\n """ name = "光热反应" + ref = Ref.DUALTRIGGER cellPos = (2,8) learnLv = 35 masterLv = 1 @@ -1098,6 +1171,7 @@ class Skill36(ActiveSkill): 向敌人投放光属性量子爆弹,使周围敌人受到光属性伤害并有一定几率使敌人进入感电状态,可以通过方向键控制投放位置。\n """ name = "量子爆弹" + ref = Ref.URANIUMBOMB cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -1162,6 +1236,7 @@ class Skill37(ActiveSkill): 若达最大蓄气后未及时发射,则经过一定时间后将自动发射能量球。\n """ name = "X-1压缩量子炮" + ref = Ref.EXTRUDER cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1215,6 +1290,7 @@ class Skill38(PassiveSkill): 通过卫星监视系统对前方画面外的敌人进行定位,增加枪炮师的暴击率,并使前方直线上的敌人降低回避率、 增加自身暴击伤害。\n """ name = "卫星定位" + ref = Ref.RADARSTUCKDOWN cellPos = (6,11) learnLv = 48 masterLv = 40 @@ -1235,7 +1311,11 @@ class Skill38(PassiveSkill): # 暴击伤害增加率 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{"data":data5}] + # 迁移前实现(保留对照): + # associate = [{"data":data5}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data5))), + ] # 卫星射线 # gunner_male/launcher_male/0232c151ef3731c2dede51931a374723 @@ -1245,6 +1325,7 @@ class Skill39(ActiveSkill): 通过卫星发动强力的激光攻击,随后多数激光边旋转边攻击敌人,激光会自动瞄准附近的敌人。\n """ name = "卫星射线" + ref = Ref.SATELLITELASER cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1282,6 +1363,7 @@ class Skill40(ActiveSkill): 发射过程中,可以用方向键移动。\n """ name = "等离子放射器" + ref = Ref.PLASMABOOST cellPos = (3,12) learnLv = 60 masterLv = 40 @@ -1336,6 +1418,7 @@ class Skill41(ActiveSkill): 经过一段时间或松开技能键,刺弹炮弹会自动分离成刺状爆弹打击敌人。\n """ name = "FM-92特殊刺弹炮" + ref = Ref.STINGEREX learnLv = 70 masterLv = 40 maxLv = 50 @@ -1391,10 +1474,14 @@ class Skill41(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{"data":[0]+[-29]*self.maxLv,"skills":["FM-92刺弹炮"]}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{"data":[0]+[-29]*self.maxLv,"skills":["FM-92刺弹炮"]}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0] + [-29] * maxLv)), skills=[Ref.STINGER], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 地脉震荡器 # gunner_male/launcher_male/dac8d8207618150c162e4c6f9e168527 @@ -1404,6 +1491,7 @@ class Skill42(ActiveSkill): 空投地脉震荡器攻击敌人,被震荡波攻击到的敌人会被牵引至装置附近。 可通过方向键控制投放位置。\n """ name = "地脉震荡器" + ref = Ref.SEISMICWAVE cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1474,6 +1562,7 @@ class Skill43(PassiveSkill): 增加能量球飞行距离,且命中敌人时立即爆炸。 同时,冲撞伤害与爆炸伤害合并。\n """ name = "重火器改良" + ref = Ref.HEAVYWEAPONALTERATION cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1493,7 +1582,11 @@ class Skill43(PassiveSkill): # 施放后僵直时间减少率 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 中子爆弹 # gunner_male/launcher_male/ef9d26746effee9199b54541f01b8752 @@ -1503,6 +1596,7 @@ class Skill44(ActiveSkill): 发射中子炸弹,引起剧烈爆炸。 位于发射轨迹上的敌人将被击退,未被击退的敌人会在当前位置爆炸。\n """ name = "中子爆弹" + ref = Ref.MSC7 cellPos = (2,14) learnLv = 80 masterLv = 40 @@ -1557,6 +1651,7 @@ class Skill45(ActiveSkill): 跃向空中后,挥舞镭射手炮进行疯狂扫射攻击并聚集敌人,随后将2个镭射手炮融合到一起发射终极毁灭射线并在地面引发巨大的爆炸。\n """ name = "毁灭射线" + ref = Ref.BURSTERBEAMNEW cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1587,6 +1682,7 @@ class Skill46(PassiveSkill): [反坦克炮] : 变更为采用电磁轨道炮技术的穿刺弹。 穿刺弹不会爆炸,会穿透并越过路径上的所有敌人,新增向Y轴小幅度聚集周围的敌人的效果,删除诱导功能。\n """ name = "连锁卫星" + ref = Ref.INTERLOCKSATELLITE cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1598,7 +1694,11 @@ class Skill46(PassiveSkill): # 基本攻击和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # ML-95火炮发射器 # gunner_male/launcher_male/854997c3bdfc3a2b498b4c4001f69e06 @@ -1610,6 +1710,7 @@ class Skill47(ActiveSkill): 飞行的火箭炮向后方击退敌人,火箭炮飞行至一定距离后爆炸。\n """ name = "ML-95火炮发射器" + ref = Ref.MLDRS95 learnLv = 95 masterLv = 40 maxLv = 50 @@ -1645,6 +1746,7 @@ class Skill48(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "裂核轨道炮" + ref = Ref.ORBITALDISASTER cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/gunner_male/mechanic_male.py b/backend/core/character/GF/gunner_male/mechanic_male.py index b81f7dba..d679703f 100644 --- a/backend/core/character/GF/gunner_male/mechanic_male.py +++ b/backend/core/character/GF/gunner_male/mechanic_male.py @@ -1,6 +1,17 @@ #afdf3b989339de478e85b614d274d1ef from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + Hit, + LevelTable, + MissingTargetPolicy, + Operation, + Percent, + Power, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunner_male.mechanic_male import MechanicMaleSkillRef as Ref prefix = "gunner_male/mechanic_male/cn/skillDetail" @@ -12,6 +23,7 @@ class Skill0(ActiveSkill): 向敌人发出强威力的膝撞并使其浮空,发动的瞬间存在霸体判定。\n """ name = "膝撞" + ref = Ref.AERIALKNEE learnLv = 1 masterLv = 10 maxLv = 20 @@ -40,6 +52,7 @@ class Skill1(ActiveSkill): 向敌人发射1发子弹并使其浮空。\n """ name = "浮空弹" + ref = Ref.LIFTSHOT learnLv = 1 masterLv = 60 maxLv = 70 @@ -66,6 +79,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -89,6 +103,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -116,6 +131,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -157,6 +173,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -179,6 +196,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -205,6 +223,7 @@ class Skill7(ActiveSkill): 卫星射击对击范围内的所有敌人造成伤害,相比[M-137格林机枪]攻击次数减少,但破坏力更强。\n """ name = "M-137格林机枪" + ref = Ref.GATLING learnLv = 5 masterLv = 60 maxLv = 70 @@ -241,6 +260,7 @@ class Skill8(ActiveSkill): 对建筑型护甲的敌人可以造成125%的伤害。\n """ name = "RX-78追击者" + ref = Ref.ROBOTRX78 cellPos = (2,2) learnLv = 5 masterLv = 60 @@ -272,6 +292,7 @@ class Skill9(ActiveSkill): 攻击不死族、 恶魔、 精灵类怪物时,可以大幅度增加伤害值。\n """ name = "银弹" + ref = Ref.SILVERBULLET learnLv = 5 masterLv = 20 maxLv = 30 @@ -300,6 +321,7 @@ class Skill10(PassiveSkill): 使重火器的拔出动作出现攻击判定,命中敌人后可以将敌人击退。\n """ name = "重火器拔击" + ref = Ref.HITONSUBWEAPON learnLv = 5 masterLv = 1 maxLv = 11 @@ -325,6 +347,7 @@ class Skill11(ActiveSkill): 前冲攻击或者倒地时按攻击键,可以发动回旋踢的同时站立。\n """ name = "回旋踢" + ref = Ref.WINDMILL learnLv = 10 masterLv = 60 maxLv = 70 @@ -359,6 +382,7 @@ class Skill12(ActiveSkill): 在决斗场中,[花式枪术]附加效果不生效。\n """ name = "踏射" + ref = Ref.PUNISHER learnLv = 10 masterLv = 60 maxLv = 70 @@ -388,6 +412,7 @@ class Skill13(ActiveSkill): 攻击型抓取判断 : 对霸体状态、 防御状态、 无法抓取的敌人不适用控制效果,只能造成膝撞攻击伤害。\n """ name = "炙烤" + ref = Ref.AERIALGATLING learnLv = 10 masterLv = 60 maxLv = 70 @@ -416,6 +441,7 @@ class Skill14(ActiveSkill): 在决斗场中无法强制中断。\n """ name = "浮空铲" + ref = Ref.HIGHANGLESLIDING learnLv = 10 masterLv = 1 maxLv = 1 @@ -443,6 +469,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -470,6 +497,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -497,6 +525,7 @@ class Skill17(ActiveSkill): 拔枪动作命中敌人时,可将敌人击退。\n """ name = "烟尘弹" + ref = Ref.DUSTSHOOT learnLv = 10 masterLv = 60 maxLv = 70 @@ -530,6 +559,7 @@ class Skill18(ActiveSkill): 向前方敌人发出肉眼无法看清的快踢攻击,可以击退敌人并有一定几率使其进入眩晕状态。\n """ name = "瞬踢" + ref = Ref.FASTKNEE learnLv = 15 masterLv = 60 maxLv = 70 @@ -568,6 +598,7 @@ class Skill19(ActiveSkill): 转职成为枪炮师时,才可以强制中断基本攻击动作,并立即施放该技能,并且在发射过程中可以用方向键移动。\n """ name = "M-3喷火器" + ref = Ref.FLAMETHROWER learnLv = 15 masterLv = 60 maxLv = 70 @@ -604,6 +635,7 @@ class Skill20(ActiveSkill): 设置机器人时,按住技能键就可以蓄气,蓄气越多机器人的爆破延迟时间就会越长。\n """ name = "EZ-8爆破者" + ref = Ref.ROBOTEZ8 cellPos = (6,4) learnLv = 15 masterLv = 60 @@ -638,6 +670,7 @@ class Skill21(ActiveSkill): 增加跳跃攻击的空中停留时间以及跳跃射击的攻击力和射击次数上限,效果持续一定时间。\n """ name = "空中射击" + ref = Ref.STAYONJUMPSHOOT learnLv = 15 masterLv = 10 maxLv = 20 @@ -671,6 +704,7 @@ class Skill22(ActiveSkill): 在决斗场中,同时增加机器人生命值上限。\n """ name = "机械改良" + ref = Ref.ROBOTICS cellPos = (5,4) learnLv = 15 masterLv = 10 @@ -703,6 +737,7 @@ class Skill23(ActiveSkill): 瞄准引爆时,所有机器人立即瞬移到指定位置并爆炸。 各技能分别发生爆炸,合并技能伤害造成1次打击。\n """ name = "机械引爆" + ref = Ref.ROBOTSEXPLOSION cellPos = (3,4) learnLv = 15 masterLv = 5 @@ -721,11 +756,17 @@ class Skill23(ActiveSkill): # 爆炸伤害变化率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {"data":[i-100 if i > 100 else i for i in data1],"skills":["RX-78追击者","Ez-8自爆者","RX-60陷阱追击者","空投支援", "EZ-10反击者", "TX-45特攻队"]}, + # # 光能不享受引爆 + # {"type":"*power1","data":[i-100 if i > 100 else i for i in data1],"skills":["拦截机工厂"]}, + # {"type":"+power2","data":[i-100 if i > 100 else i for i in data1],"skills":["空战机械 : 风暴"]} + # ] associate = [ - {"data":[i-100 if i > 100 else i for i in data1],"skills":["RX-78追击者","Ez-8自爆者","RX-60陷阱追击者","空投支援", "EZ-10反击者", "TX-45特攻队"]}, - # 光能不享受引爆 - {"type":"*power1","data":[i-100 if i > 100 else i for i in data1],"skills":["拦截机工厂"]}, - {"type":"+power2","data":[i-100 if i > 100 else i for i in data1],"skills":["空战机械 : 风暴"]} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 100 else i for i in data1])), skills=[Ref.ROBOTRX78, 'Ez-8自爆者', Ref.ROBOTRX60, Ref.MECHADROP, Ref.ROBOTEZ8EX, Ref.ATEAM], missing_target=MissingTargetPolicy.SKIP), + SkillEffect(attribute=Power(1), value=1 + Percent(LevelTable([i - 100 if i > 100 else i for i in data1])), skills=[Ref.SPARROWFACTORY]), + SkillEffect(attribute=Power(2), operation=Operation.ADD, value=Percent(LevelTable([i - 100 if i > 100 else i for i in data1])), skills=[Ref.ROBOTTEMPESTER]), ] # G-14手雷 @@ -737,6 +778,7 @@ class Skill24(ActiveSkill): G-14手雷有最大填装数和填装冷却时间,按上、 下方向键后施放技能时,可以调整投掷位置。 转职成为弹药专家时,可以强制中断基本攻击动作,投掷G-14手雷。\n """ name = "G-14手雷" + ref = Ref.GRENADENONE cellPos = (10,4) learnLv = 15 masterLv = 60 @@ -771,6 +813,7 @@ class Skill25(PassiveSkill): 利用对机器人的深刻理解,强化其性能,增加基本攻击力和转职技能攻击力 ([G-1科罗纳]、 [G-2旋雷者]、 [G-3捕食者]除外)。\n """ name = "机械概论" + ref = Ref.ROBOTENGINEERING cellPos = (1,4) learnLv = 15 masterLv = 1 @@ -784,7 +827,11 @@ class Skill25(PassiveSkill): # 基本攻击和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 嗜战追击者 # gunner_male/mechanic_male/dc1ffbe7bfcc6dc2be737951960da9ad @@ -796,6 +843,7 @@ class Skill26(PassiveSkill): 出现的追击者与冷却时间无关。\n """ name = "嗜战追击者" + ref = Ref.RX78OFCRISIS cellPos = (2,5) learnLv = 20 masterLv = 10 @@ -812,7 +860,11 @@ class Skill26(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 被击时出现几率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0,"skills":["RX-78追击者"]}] + # 迁移前实现(保留对照): + # associate = [{"data":data0,"skills":["RX-78追击者"]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.ROBOTRX78]), + ] # G-1科罗纳 # gunner_male/mechanic_male/1b1cfab062e0768bcc889e33e1f30dbf @@ -825,6 +877,7 @@ class Skill27(ActiveSkill): 改装为其他G系列机器人后持续时间会延长,但不会超过G系列基础持续时间。\n """ name = "G-1科罗纳" + ref = Ref.G1 cellPos = (4,5) learnLv = 20 masterLv = 60 @@ -859,7 +912,11 @@ class Skill27(ActiveSkill): # 炸弹爆炸大小比率 : {value8}% data8 = get_data(f'{prefix}/{uuid}', 8) - associate = [{"data":data7,"type":"+power0","skills":["改装 : G-2旋雷者","改装 : G-3捕食者"]}] + # 迁移前实现(保留对照): + # associate = [{"data":data7,"type":"+power0","skills":["改装 : G-2旋雷者","改装 : G-3捕食者"]}] + associate = [ + SkillEffect(attribute=Power(0), operation=Operation.ADD, value=Percent(LevelTable(data7)), skills=[Ref.G2, Ref.G3]), + ] def getSkillCD(self,mode=None): return 1.0 @@ -872,6 +929,7 @@ class Skill28(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -894,6 +952,7 @@ class Skill29(PassiveSkill): 快速拔枪攻击敌人,发动后可以增加攻击速度和普通射击的攻击力。 转职为漫游枪手后增加精通等级。\n """ name = "快速拔枪" + ref = Ref.FASTSHOOT cellPos = (0,6) learnLv = 25 masterLv = 5 @@ -921,6 +980,7 @@ class Skill30(ActiveSkill): 召唤的机器人会在一段时间内持续向前方发射火属性子弹。\n """ name = "EX-S毒蛇炮" + ref = Ref.ROBOTEXS cellPos = (8,6) learnLv = 25 masterLv = 60 @@ -961,6 +1021,7 @@ class Skill31(ActiveSkill): G-2旋雷者的持续时间和改装冷却时间与G-1科罗纳一致,改装后持续时间会延长,但不会超过G系列基础持续时间。\n """ name = "改装 : G-2旋雷者" + ref = Ref.G2 cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -995,7 +1056,11 @@ class Skill31(ActiveSkill): def getSkillCD(self,mode=None): return 1.0 - associate = [{"data":data4,"type":"+power0","skills":["G-1科罗纳","改装 : G-3捕食者"]}] + # 迁移前实现(保留对照): + # associate = [{"data":data4,"type":"+power0","skills":["G-1科罗纳","改装 : G-3捕食者"]}] + associate = [ + SkillEffect(attribute=Power(0), operation=Operation.ADD, value=Percent(LevelTable(data4)), skills=[Ref.G1, Ref.G3]), + ] # 方舟反应堆 # gunner_male/mechanic_male/b1ccbd90d0b40f543ece3b18fcef827f @@ -1005,6 +1070,7 @@ class Skill32(PassiveSkill): 利用能量反应技术,增加基本攻击力、 技能攻击力和魔法暴击率。\n """ name = "方舟反应堆" + ref = Ref.ARKREACTOR cellPos = (5,6) learnLv = 25 masterLv = 10 @@ -1020,7 +1086,11 @@ class Skill32(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 魔法暴击率增加量 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 伪装 # gunner_male/mechanic_male/4b2c90ec226fd40e967875aa5eabefb2 @@ -1032,6 +1102,7 @@ class Skill33(ActiveSkill): 持续时间内若作出移动以外的动作,则会暂时解除伪装状态; 再次移动则又会进入伪装状态。\n """ name = "伪装" + ref = Ref.CAMOUFLAGE cellPos = (3,7) learnLv = 30 masterLv = 10 @@ -1071,6 +1142,7 @@ class Skill34(ActiveSkill): 在决斗场中,捕食者可以被攻击,生命值耗尽后,一段时间内无法进行攻击。\n """ name = "改装 : G-3捕食者" + ref = Ref.G3 cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -1102,7 +1174,11 @@ class Skill34(ActiveSkill): # 捕食者可移动范围 : {value7}px data7 = get_data(f'{prefix}/{uuid}', 7) - associate = [{"data":data5,"type":"+power0","skills":["G-1科罗纳","改装 : G-2旋雷者"]}] + # 迁移前实现(保留对照): + # associate = [{"data":data5,"type":"+power0","skills":["G-1科罗纳","改装 : G-2旋雷者"]}] + associate = [ + SkillEffect(attribute=Power(0), operation=Operation.ADD, value=Percent(LevelTable(data5)), skills=[Ref.G1, Ref.G2]), + ] def getSkillCD(self,mode=None): return 1.0 @@ -1115,6 +1191,7 @@ class Skill35(PassiveSkill): 可以使[G-1科罗纳]、 [改装 : G-2旋雷者]、 [改装 : G-3捕食者]、 [光反应能量模块]、 [盖波加之拳]、 [EX-S零式毒蛇炮]转换为火属性。\n """ name = "火焰电压" + ref = Ref.FIREVOLT cellPos = (2,7) learnLv = 30 masterLv = 1 @@ -1139,6 +1216,7 @@ class Skill36(ActiveSkill): [改装 : G-2旋雷者]、 [光反应能量模块]、 [盖波加之拳]、 [TN-80终结者]、 [超时空行军]\n """ name = "机械指令" + ref = Ref.HOLDANDGO cellPos = (7,7) learnLv = 30 masterLv = 1 @@ -1162,6 +1240,7 @@ class Skill37(ActiveSkill): 若蓄气后施放,则在一定时间内不受[机械引爆]的影响。\n """ name = "RX-60陷阱追击者" + ref = Ref.ROBOTRX60 cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -1201,6 +1280,7 @@ class Skill38(ActiveSkill): 可以通过On/Off功能设置是否使用[机械引爆]。\n """ name = "空战机械 : 风暴" + ref = Ref.ROBOTTEMPESTER cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1296,6 +1376,7 @@ class Skill39(ActiveSkill): 在地下城中,不会被敌人击中。\n """ name = "空投支援" + ref = Ref.MECHADROP cellPos = (4,9) learnLv = 40 masterLv = 60 @@ -1357,6 +1438,7 @@ class Skill40(ActiveSkill): 使用[机械引爆]时,拦截机飞向一定范围内等级最高的怪物并爆炸。\n """ name = "拦截机工厂" + ref = Ref.SPARROWFACTORY cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1421,6 +1503,7 @@ class Skill41(PassiveSkill): 能量散热板蓄积能量并向前方发射,然后消失。\n """ name = "光反应能量模块" + ref = Ref.SOLARMODULESYSTEM cellPos = (4,11) learnLv = 45 masterLv = 1 @@ -1432,7 +1515,12 @@ class Skill41(PassiveSkill): hasUP = False custom = get_data(f'{prefix}/{uuid}', "custom") # noqa: E501 - associate = [{"type":"+hit1","data":[0,-8],"ratio":1,"skills":["拦截机工厂"]},{"type":"+hit5","data":[0,1],"ratio":1,"skills":["拦截机工厂"]}] + # 迁移前实现(保留对照): + # associate = [{"type":"+hit1","data":[0,-8],"ratio":1,"skills":["拦截机工厂"]},{"type":"+hit5","data":[0,1],"ratio":1,"skills":["拦截机工厂"]}] + associate = [ + SkillEffect(attribute=Hit(1), operation=Operation.ADD, value=LevelTable([0, -8]), skills=[Ref.SPARROWFACTORY]), + SkillEffect(attribute=Hit(5), operation=Operation.ADD, value=LevelTable([0, 1]), skills=[Ref.SPARROWFACTORY]), + ] # 斗志之歌 @@ -1444,6 +1532,7 @@ class Skill42(PassiveSkill): 斗志机器人不会受到伤害。\n """ name = "斗志之歌" + ref = Ref.LASTFIGHTINGSPIRIT cellPos = (5,11) learnLv = 48 masterLv = 40 @@ -1458,7 +1547,11 @@ class Skill42(PassiveSkill): # 基本攻击和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 盖波加之拳 # gunner_male/mechanic_male/51a08fd0c90f0a5276cd552047fac93d @@ -1468,6 +1561,7 @@ class Skill43(ActiveSkill): 设置异界空间移动裂口,并从中召唤出盖波加之拳给予周围敌人强威力攻击。\n """ name = "盖波加之拳" + ref = Ref.GAEBOLGPUNCH cellPos = (7,11) learnLv = 50 masterLv = 40 @@ -1497,6 +1591,7 @@ class Skill44(ActiveSkill): 对建筑型护甲的敌人可以造成125%伤害。\n """ name = "EZ-10反击者" + ref = Ref.ROBOTEZ8EX cellPos = (6,12) learnLv = 60 masterLv = 40 @@ -1562,6 +1657,7 @@ class Skill45(ActiveSkill): 经过一段时间后,EX-S零式毒蛇炮会爆炸。\n """ name = "EX-S零式毒蛇炮" + ref = Ref.ROBOTEXSEX cellPos = (8,13) learnLv = 70 masterLv = 40 @@ -1628,6 +1724,7 @@ class Skill46(PassiveSkill): 减少除[盖波加之拳]、 [超时空行军]、 [GW-16瓦尔德斯坦]之外技能的冷却时间。\n """ name = "HS-1机械助手" + ref = Ref.HS1 cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1648,7 +1745,12 @@ class Skill46(PassiveSkill): # 爆炸范围增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"type":"*cdReduce","data": data1,"exceptSkills":['盖波加之拳', '超时空行军', 'GW-16 瓦尔·德斯坦']}, {"data": data2}] + # 迁移前实现(保留对照): + # associate = [{"type":"*cdReduce","data": data1,"exceptSkills":['盖波加之拳', '超时空行军', 'GW-16 瓦尔·德斯坦']}, {"data": data2}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data1)), except_skills=[Ref.GAEBOLGPUNCH, Ref.HELLMARCH, 'GW-16 瓦尔·德斯坦']), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # TN-80终结者 # gunner_male/mechanic_male/002cbdd9bfd0f0b970451ae8d48d029e @@ -1661,6 +1763,7 @@ class Skill47(ActiveSkill): 不受[机械引爆]的影响。\n """ name = "TN-80终结者" + ref = Ref.DIMENSIONRUNNER cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1731,6 +1834,7 @@ class Skill48(ActiveSkill): 机械助手全部处于使用状态下,无法使用该技能。\n """ name = "TX-45特攻队" + ref = Ref.ATEAM cellPos = (2,14) learnLv = 80 masterLv = 40 @@ -1801,6 +1905,7 @@ class Skill49(ActiveSkill): 该技能不受[机械引爆]的影响。\n """ name = "超时空行军" + ref = Ref.HELLMARCH cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1836,6 +1941,7 @@ class Skill50(ActiveSkill): 根据能量消耗量增加追加爆炸伤害,若未消耗能量就结束模式,则不会发动追加爆炸。\n """ name = "HS-1全息机械猎手" + ref = Ref.VIRTUALRUSH cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1874,6 +1980,7 @@ class Skill51(PassiveSkill): [机械引爆] : 瞄准引爆时,所有机器人立即瞬移到指定位置并爆炸。 各技能分别发生爆炸,合并技能伤害造成1次打击。\n """ name = "索菲亚" + ref = Ref.SOPHIA cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1887,7 +1994,11 @@ class Skill51(PassiveSkill): # 基本攻击和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # GW-16瓦尔德斯坦 # gunner_male/mechanic_male/515b442ffbf61a82371abb645c149a31 @@ -1902,6 +2013,7 @@ class Skill52(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "GW-16瓦尔德斯坦" + ref = Ref.GW16 cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/gunner_male/ranger_male.py b/backend/core/character/GF/gunner_male/ranger_male.py index 2135c007..70bb529d 100644 --- a/backend/core/character/GF/gunner_male/ranger_male.py +++ b/backend/core/character/GF/gunner_male/ranger_male.py @@ -1,6 +1,15 @@ # afdf3b989339de478e85b614d274d1ef from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunner_male.ranger_male import RangerMaleSkillRef as Ref prefix = "gunner_male/ranger_male/cn/skillDetail" @@ -12,6 +21,7 @@ class Skill0(ActiveSkill): 向敌人发出强威力的膝撞并使其浮空,发动的瞬间存在霸体判定。\n """ name = "膝撞" + ref = Ref.AERIALKNEE learnLv = 1 masterLv = 10 maxLv = 20 @@ -40,6 +50,7 @@ class Skill1(ActiveSkill): 向敌人发射1发子弹并使其浮空。\n """ name = "浮空弹" + ref = Ref.LIFTSHOT learnLv = 1 masterLv = 60 maxLv = 70 @@ -66,6 +77,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -89,6 +101,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -116,6 +129,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -157,6 +171,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -179,6 +194,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -205,6 +221,7 @@ class Skill7(ActiveSkill): 卫星射击对击范围内的所有敌人造成伤害,相比[M-137格林机枪]攻击次数减少,但破坏力更强。\n """ name = "M-137格林机枪" + ref = Ref.GATLING learnLv = 5 masterLv = 60 maxLv = 70 @@ -241,6 +258,7 @@ class Skill8(ActiveSkill): 对建筑型护甲的敌人可以造成125%的伤害。\n """ name = "RX-78追击者" + ref = Ref.ROBOTRX78 learnLv = 5 masterLv = 60 maxLv = 70 @@ -271,6 +289,7 @@ class Skill9(ActiveSkill): 攻击不死族、 恶魔、 精灵类怪物时,可以大幅度增加伤害值。\n """ name = "银弹" + ref = Ref.SILVERBULLET learnLv = 5 masterLv = 20 maxLv = 30 @@ -299,6 +318,7 @@ class Skill10(PassiveSkill): 使重火器的拔出动作出现攻击判定,命中敌人后可以将敌人击退。\n """ name = "重火器拔击" + ref = Ref.HITONSUBWEAPON learnLv = 5 masterLv = 1 maxLv = 11 @@ -324,6 +344,7 @@ class Skill11(ActiveSkill): 前冲攻击或者倒地时按攻击键,可以发动回旋踢的同时站立。\n """ name = '回旋踢' + ref = Ref.WINDMILL cellPos = (2,3) learnLv = 10 masterLv = 60 @@ -356,6 +377,7 @@ class Skill12(ActiveSkill): 在决斗场中,[花式枪术]附加效果不生效。\n """ name = '踏射' + ref = Ref.PUNISHER cellPos = (0,3) learnLv = 10 masterLv = 60 @@ -384,6 +406,7 @@ class Skill13(ActiveSkill): 攻击型抓取判断 : 对霸体状态、 防御状态、 无法抓取的敌人不适用控制效果,只能造成膝撞攻击伤害。\n """ name = "炙烤" + ref = Ref.AERIALGATLING learnLv = 10 masterLv = 60 maxLv = 70 @@ -412,6 +435,7 @@ class Skill14(ActiveSkill): 在决斗场中无法强制中断。\n """ name = "浮空铲" + ref = Ref.HIGHANGLESLIDING learnLv = 10 masterLv = 1 maxLv = 1 @@ -439,6 +463,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -466,6 +491,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -493,6 +519,7 @@ class Skill17(ActiveSkill): 拔枪动作命中敌人时,可将敌人击退。\n """ name = '烟尘弹' + ref = Ref.DUSTSHOOT cellPos = (1,3) learnLv = 10 masterLv = 60 @@ -526,6 +553,7 @@ class Skill18(ActiveSkill): 在决斗场中,没有学习[花式枪术]也可以在[后跳]时施放。\n """ name = '溃灭射击' + ref = Ref.HEADSHOT cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -552,6 +580,7 @@ class Skill19(ActiveSkill): 向前方敌人发出肉眼无法看清的快踢攻击,可以击退敌人并有一定几率使其进入眩晕状态。\n """ name = '瞬踢' + ref = Ref.FASTKNEE cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -588,6 +617,7 @@ class Skill20(ActiveSkill): 转职成为枪炮师时,才可以强制中断基本攻击动作,并立即施放该技能,并且在发射过程中可以用方向键移动。\n """ name = 'M-3喷火器' + ref = Ref.FLAMETHROWER cellPos = (9,4) learnLv = 15 masterLv = 60 @@ -622,6 +652,7 @@ class Skill21(PassiveSkill): 增加物理攻击力和暴击率,改装升级左轮枪的膛线、 弹仓和弹夹,增加左轮枪的装弹数、 连射速度、 贯穿力、 攻击速度和移动速度,并减少填装时间。\n """ name = '左轮奥义' + ref = Ref.POWERUPREVOLVER cellPos = (1,4) learnLv = 15 masterLv = 10 @@ -648,7 +679,11 @@ class Skill21(PassiveSkill): # 填装速度增加 : {value7}% data7 = get_data(f'{prefix}/{uuid}', 7) - associate = [{'type': '$*PAtkP', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '$*PAtkP', 'data': data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 空中射击 # gunner_male/ranger_male/bb34e8854a93fd250347a1c64119f7ab @@ -658,6 +693,7 @@ class Skill22(ActiveSkill): 增加跳跃攻击的空中停留时间以及跳跃射击的攻击力和射击次数上限,效果持续一定时间。\n """ name = '空中射击' + ref = Ref.STAYONJUMPSHOOT cellPos = (8,4) learnLv = 15 masterLv = 10 @@ -690,6 +726,7 @@ class Skill23(ActiveSkill): G-14手雷有最大填装数和填装冷却时间,按上、 下方向键后施放技能时,可以调整投掷位置。 转职成为弹药专家时,可以强制中断基本攻击动作,投掷G-14手雷。\n """ name = 'G-14手雷' + ref = Ref.GRENADENONE cellPos = (7,4) learnLv = 15 masterLv = 60 @@ -724,6 +761,7 @@ class Skill24(ActiveSkill): 在决斗场中,[花式枪术]学习效果不生效。\n """ name = '远程格挡' + ref = Ref.BULLETGUARD cellPos = (6,5) learnLv = 20 masterLv = 10 @@ -768,6 +806,7 @@ class Skill25(PassiveSkill): 增加可强制中断次数。\n """ name = '花式枪术' + ref = Ref.STYLISH cellPos = (1,5) learnLv = 20 masterLv = 10 @@ -791,7 +830,11 @@ class Skill25(PassiveSkill): # [回旋踢]Y轴每秒移动距离 : {value6}px data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{'data': data2}] + # 迁移前实现(保留对照): + # associate = [{'data': data2}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # [学习卓尔不群后] # 可强制中断次数上限增加 : 1次 @@ -803,6 +846,7 @@ class Skill26(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -825,6 +869,7 @@ class Skill27(PassiveSkill): 快速拔枪攻击敌人,发动后可以增加攻击速度和普通射击的攻击力。 转职为漫游枪手后增加精通等级。\n """ name = '快速拔枪' + ref = Ref.FASTSHOOT cellPos = (7,6) learnLv = 25 masterLv = 10 @@ -853,6 +898,7 @@ class Skill28(ActiveSkill): 无法维持准备动作,且[花式枪术]附加效果不生效。\n """ name = '心灵反击' + ref = Ref.COUNTERSHOOT cellPos = (5,6) learnLv = 25 masterLv = 1 @@ -883,7 +929,7 @@ class Skill28(ActiveSkill): # 解除敌人霸体状态的几率 : {value7}% data7 = get_data(f'{prefix}/{uuid}', 7) def skillInfo(self, mode=None): - pre = self.char.GetSkillByName('溃灭射击').skillInfo() + pre = self.char.GetSkill(Ref.HEADSHOT).skillInfo() return pre[0] * 1.7, pre[1], self.getSkillCD() # 浮空劫击 @@ -897,6 +943,7 @@ class Skill29(ActiveSkill): 若学习了[花式枪术],在落地前会增加空中攻击的物理暴击率和射击次数。\n """ name = '浮空劫击' + ref = Ref.AIRRAID cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -931,6 +978,7 @@ class Skill30(ActiveSkill): 转身向地面进行射击,然后连续射击使弹射的子弹破裂,攻击周围的敌人。\n """ name = '溃灭回射' + ref = Ref.TURNINGSHOOT cellPos = (4,7) learnLv = 30 masterLv = 1 @@ -950,7 +998,7 @@ class Skill30(ActiveSkill): # 学习[卓尔不群]后,子弹破裂大小比率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) def skillInfo(self, mode=None): - pre = self.char.GetSkillByName('溃灭射击').skillInfo() + pre = self.char.GetSkill(Ref.HEADSHOT).skillInfo() return pre[0] * 1.5, pre[1], self.getSkillCD() # 死亡左轮 @@ -962,6 +1010,7 @@ class Skill31(ActiveSkill): 命中率增加效果需在施放技能后持续装备左轮枪,才能维持生效。\n """ name = '死亡左轮' + ref = Ref.REVOLVERCRITICALDAMAGEUP cellPos = (6,7) learnLv = 30 masterLv = 10 @@ -995,6 +1044,7 @@ class Skill32(ActiveSkill): 抽打攻击命中时短暂控制敌人,然后快速对敌人进行2次射击。\n """ name = '三连发' + ref = Ref.TRIPLETAP cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -1035,6 +1085,7 @@ class Skill33(ActiveSkill): 施放后快速连按攻击键或技能快捷键,可以更快地发射子弹; 按跳跃键,则可以中断技能。\n """ name = '乱射' + ref = Ref.RANDOMSHOOT cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -1090,6 +1141,7 @@ class Skill34(ActiveSkill): 在决斗场中,移动射击模式下无霸体效果。\n """ name = '移动射击' + ref = Ref.WALKSHOOT cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1141,6 +1193,7 @@ class Skill35(ActiveSkill): 每次发射可以用方向键控制发射方向,并给该方向的多个敌人造成伤害。\n """ name = '多重射击' + ref = Ref.MULTIHEADSHOT cellPos = (4,9) learnLv = 40 masterLv = 60 @@ -1197,6 +1250,7 @@ class Skill36(ActiveSkill): 在决斗场中抓取手枪后,不会进入霸体状态。\n """ name = '双鹰回旋' + ref = Ref.DOUBLEGUNHAWK cellPos = (4,10) learnLv = 45 masterLv = 60 @@ -1262,6 +1316,7 @@ class Skill37(PassiveSkill): 带印记的敌人死亡或消失时,增加物理暴击率的增益效果持续一定时间。\n """ name = '死亡印记' + ref = Ref.MARKOFDEATH cellPos = (2,11) learnLv = 48 masterLv = 40 @@ -1276,7 +1331,11 @@ class Skill37(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 效果持续时间 : {value2}秒 data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 疯狂射击 # gunner_male/ranger_male/ca75c965f20a150f99f54155a37400df @@ -1287,6 +1346,7 @@ class Skill38(ActiveSkill): 连续按攻击键或技能快捷键,可以增加乱射速度; 按Z键可以转换方向。\n """ name = "疯狂射击" + ref = Ref.DESPERADO learnLv = 50 masterLv = 40 maxLv = 50 @@ -1328,6 +1388,7 @@ class Skill39(ActiveSkill): 发动技能时,可以操作与行进方向一致的方向键调整跳跃距离。\n """ name = '死亡突袭' + ref = Ref.DEADLYAPPROACH cellPos = (3,12) learnLv = 60 masterLv = 40 @@ -1376,6 +1437,7 @@ class Skill40(ActiveSkill): 射击过程中,可以按下跳跃键中断技能的施放。\n """ name = '压制射击' + ref = Ref.SUPPRESSINGFIRE cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1430,6 +1492,7 @@ class Skill41(ActiveSkill): 快速切换数把左轮枪并以惊人的速度对前方敌人进行射击。 若施放后连续按攻击键或技能快捷键,将会以更快的速度发射更多的子弹。\n """ name = '疾风骤雨' + ref = Ref.FASTDRAW cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1489,6 +1552,7 @@ class Skill42(PassiveSkill): 增加基本攻击力和转职技能攻击力,基本攻击的最后一击变更为[溃灭射击]。 增加[溃灭射击]的攻击力、 暴击率、 穿刺力,减少[溃灭回射]的冷却时间。\n """ name = '射击掌握' + ref = Ref.HEADSHOTMASTERY cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1508,7 +1572,13 @@ class Skill42(PassiveSkill): # [溃灭回射]冷却时间减少率 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{'data': data0, 'exceptSkills': ['溃灭射击']}, {'data': data1, 'skills': ['溃灭射击']}, {'data': data4, 'type': '*cdReduce', 'skills': ['溃灭回射']}] # noqa: E501 + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'exceptSkills': ['溃灭射击']}, {'data': data1, 'skills': ['溃灭射击']}, {'data': data4, 'type': '*cdReduce', 'skills': ['溃灭回射']}] # noqa: E501 + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), except_skills=[Ref.HEADSHOT]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.HEADSHOT]), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data4)), skills=[Ref.TURNINGSHOOT]), + ] # 抹杀 # gunner_male/ranger_male/aa6dd52e1c925d87cdc0ca340056c543 @@ -1519,6 +1589,7 @@ class Skill43(ActiveSkill): 发射的子弹在岩石之间弹射,对范围内的敌人造成多次伤害。\n """ name = '抹杀' + ref = Ref.WIPEOUT cellPos = (1,14) learnLv = 80 masterLv = 40 @@ -1569,6 +1640,7 @@ class Skill44(ActiveSkill): 可以使用左右方向键控制行进方向,若施放后连续按攻击键或技能快捷键,则可以更快地移动。\n """ name = '第七翼动' + ref = Ref.SEVENTHFLOW cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1601,6 +1673,7 @@ class Skill45(PassiveSkill): 抽打攻击命中时短暂控制敌人,然后快速对敌人进行2次射击。\n """ name = '卓尔不群' + ref = Ref.OUTSTANDING cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1612,7 +1685,11 @@ class Skill45(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] # noqa: E501 + # 迁移前实现(保留对照): + # associate = [{'data': data0}] # noqa: E501 + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 爆燃突击 # gunner_male/ranger_male/7a3fc9d473e8ffe21dd900ddf228a437 @@ -1623,6 +1700,7 @@ class Skill46(ActiveSkill): 藏身在烟雾中移动时,无法使用[花式枪术]强制中断技能,但可以按跳跃键中断攻击。\n """ name = '爆燃突击' + ref = Ref.ACCELATIONTRIGGER cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1654,6 +1732,7 @@ class Skill47(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = '鹰眸·致命危机' + ref = Ref.DEATHCRISIS cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/gunner_male/spitfire_male.py b/backend/core/character/GF/gunner_male/spitfire_male.py index 618f8029..a91f8b0a 100644 --- a/backend/core/character/GF/gunner_male/spitfire_male.py +++ b/backend/core/character/GF/gunner_male/spitfire_male.py @@ -1,6 +1,15 @@ #afdf3b989339de478e85b614d274d1ef from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.gunner_male.spitfire_male import SpitfireMaleSkillRef as Ref prefix = "gunner_male/spitfire_male/cn/skillDetail" @@ -17,6 +26,7 @@ class Skill0(ActiveSkill): 向敌人发出强威力的膝撞并使其浮空,发动的瞬间存在霸体判定。\n """ name = "膝撞" + ref = Ref.AERIALKNEE learnLv = 1 masterLv = 10 maxLv = 20 @@ -45,6 +55,7 @@ class Skill1(ActiveSkill): 向敌人发射1发子弹并使其浮空。\n """ name = "浮空弹" + ref = Ref.LIFTSHOT learnLv = 1 masterLv = 60 maxLv = 70 @@ -71,6 +82,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -94,6 +106,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -121,6 +134,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -152,6 +166,7 @@ class Skill5(PassiveSkill): 在决斗场中,无法转换攻击类型,适用技能固有的攻击类型。\n """ name = "攻击类型转换" + ref = Ref.CONVERSION learnLv = 1 masterLv = 1 maxLv = 1 @@ -186,6 +201,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -208,6 +224,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -234,6 +251,7 @@ class Skill8(ActiveSkill): 卫星射击对击范围内的所有敌人造成伤害,相比[M-137格林机枪]攻击次数减少,但破坏力更强。\n """ name = "M-137格林机枪" + ref = Ref.GATLING learnLv = 5 masterLv = 60 maxLv = 70 @@ -270,6 +288,7 @@ class Skill9(ActiveSkill): 对建筑型护甲的敌人可以造成125%的伤害。\n """ name = "RX-78追击者" + ref = Ref.ROBOTRX78 learnLv = 5 masterLv = 60 maxLv = 70 @@ -300,6 +319,7 @@ class Skill10(ActiveSkill): 攻击不死族、 恶魔、 精灵类怪物时,可以大幅度增加伤害值。\n """ name = "银弹" + ref = Ref.SILVERBULLET learnLv = 5 masterLv = 20 maxLv = 30 @@ -328,6 +348,7 @@ class Skill11(PassiveSkill): 使重火器的拔出动作出现攻击判定,命中敌人后可以将敌人击退。\n """ name = "重火器拔击" + ref = Ref.HITONSUBWEAPON learnLv = 5 masterLv = 1 maxLv = 11 @@ -353,6 +374,7 @@ class Skill12(ActiveSkill): 前冲攻击或者倒地时按攻击键,可以发动回旋踢的同时站立。\n """ name = "回旋踢" + ref = Ref.WINDMILL learnLv = 10 masterLv = 60 maxLv = 70 @@ -387,6 +409,7 @@ class Skill13(ActiveSkill): 在决斗场中,[花式枪术]附加效果不生效。\n """ name = "踏射" + ref = Ref.PUNISHER learnLv = 10 masterLv = 60 maxLv = 70 @@ -416,6 +439,7 @@ class Skill14(ActiveSkill): 攻击型抓取判断 : 对霸体状态、 防御状态、 无法抓取的敌人不适用控制效果,只能造成膝撞攻击伤害。\n """ name = "炙烤" + ref = Ref.AERIALGATLING learnLv = 10 masterLv = 60 maxLv = 70 @@ -444,6 +468,7 @@ class Skill15(ActiveSkill): 在决斗场中无法强制中断。\n """ name = "浮空铲" + ref = Ref.HIGHANGLESLIDING learnLv = 10 masterLv = 1 maxLv = 1 @@ -471,6 +496,7 @@ class Skill16(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -498,6 +524,7 @@ class Skill17(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -525,6 +552,7 @@ class Skill18(ActiveSkill): 拔枪动作命中敌人时,可将敌人击退。\n """ name = "烟尘弹" + ref = Ref.DUSTSHOOT learnLv = 10 masterLv = 60 maxLv = 70 @@ -565,6 +593,7 @@ class Skill19(ActiveSkill): 在决斗场中,适用单独的持续时间; 灼伤异常状态触发几率变更为100%。\n """ name = "特性弹" + ref = Ref.BULLETSPECIFIC cellPos = (4,4) learnLv = 15 masterLv = 10 @@ -606,6 +635,7 @@ class Skill20(ActiveSkill): 向前方敌人发出肉眼无法看清的快踢攻击,可以击退敌人并有一定几率使其进入眩晕状态。\n """ name = "瞬踢" + ref = Ref.FASTKNEE learnLv = 15 masterLv = 60 maxLv = 70 @@ -644,6 +674,7 @@ class Skill21(ActiveSkill): 转职成为枪炮师时,才可以强制中断基本攻击动作,并立即施放该技能,并且在发射过程中可以用方向键移动。\n """ name = "M-3喷火器" + ref = Ref.FLAMETHROWER learnLv = 15 masterLv = 60 maxLv = 70 @@ -679,6 +710,7 @@ class Skill22(ActiveSkill): 增加跳跃攻击的空中停留时间以及跳跃射击的攻击力和射击次数上限,效果持续一定时间。\n """ name = "空中射击" + ref = Ref.STAYONJUMPSHOOT cellPos = (8,4) learnLv = 15 masterLv = 10 @@ -713,6 +745,7 @@ class Skill23(ActiveSkill): G-14手雷有最大填装数和填装冷却时间,按上、 下方向键后施放技能时,可以调整投掷位置。 转职成为弹药专家时,可以强制中断基本攻击动作,投掷G-14手雷。\n """ name = "G-14手雷" + ref = Ref.GRENADENONE cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -746,6 +779,7 @@ class Skill24(PassiveSkill): [交叉射击]、 [聚合弹]、 [凝固汽油弹]、 [狙击手增援]、 [电磁弹 : 麦克斯韦]\n """ name = "弹夹改装" + ref = Ref.MAGAZINEDRUM cellPos = (7,4) learnLv = 15 masterLv = 10 @@ -765,9 +799,14 @@ class Skill24(PassiveSkill): data5 = get_data(f'{prefix}/{uuid}', 5) data6 = get_data(f'{prefix}/{uuid}', 6) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data0, 'skills': ['交叉射击', '聚合弹', '凝固汽油弹', '电磁弹 : 麦克斯韦']}, + # {'data': data1, 'skills': ['爆裂弹', '贯穿弹', '狙击手增援']} + # ] associate = [ - {'data': data0, 'skills': ['交叉射击', '聚合弹', '凝固汽油弹', '电磁弹 : 麦克斯韦']}, - {'data': data1, 'skills': ['爆裂弹', '贯穿弹', '狙击手增援']} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.CROSSSHOOT, Ref.CHARGEBUSTER, Ref.NAPALMBOMB, Ref.MAXWELL]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.BULLETEXPLOSIVE, Ref.BULLETPENETRATE, Ref.RETURNEDSNIPER]), ] # 超负荷装填 @@ -778,6 +817,7 @@ class Skill25(ActiveSkill): 在子弹中填装特殊弹药,增加基本攻击力和技能攻击力。\n """ name = "超负荷装填" + ref = Ref.OVERCHARGE cellPos = (3,4) learnLv = 15 masterLv = 10 @@ -802,6 +842,7 @@ class Skill26(PassiveSkill): 如在[超负荷装填]中选择无属性,增加基本攻击的弹速。\n """ name = "弹药改良" + ref = Ref.BULLETMASTERY cellPos = (1,5) learnLv = 20 masterLv = 10 @@ -823,7 +864,12 @@ class Skill26(PassiveSkill): # 暴击率增加 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'data': data3},{'data': data4}] + # 迁移前实现(保留对照): + # associate = [{'data': data3},{'data': data4}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data4))), + ] # 手雷精通 # gunner_male/spitfire_male/0113c8b1306ca76d208f83f2d093dd62 @@ -833,6 +879,7 @@ class Skill27(PassiveSkill): 增加[G-14手雷]、 [G-35L感电手雷]、 [G-18C冰冻手雷]的攻击力。\n """ name = "手雷精通" + ref = Ref.STRAYBULLETMASTERY cellPos = (6,5) learnLv = 20 masterLv = 10 @@ -843,8 +890,12 @@ class Skill27(PassiveSkill): # 攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0, 'skills': ['G-14手雷','G-35L感电手雷','G-18C冰冻手雷']}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0, 'skills': ['G-14手雷','G-35L感电手雷','G-18C冰冻手雷']}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.GRENADENONE, Ref.GRENADELIGHT, Ref.GRENADEWATER]), ] # 暴击 @@ -855,6 +906,7 @@ class Skill28(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -877,6 +929,7 @@ class Skill29(PassiveSkill): 增加物理/魔法/独立攻击力。 不受武器带来的技能冷却时间增减效果影响,减少转职后技能的冷却时间。 装备步枪、 手弩时,增加攻击速度和填装速度; 增加步枪、 手弩的集弹率和空中射击的后坐力。\n """ name = "兵器研究" + ref = Ref.WEAPONEXPERT cellPos = (0,5) learnLv = 20 masterLv = 10 @@ -898,10 +951,16 @@ class Skill29(PassiveSkill): # 填装速度增加 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data0, 'type': '$*PAtkP'}, + # {'data': data0, 'type': '$*PAtkM'}, + # {'data': data1, 'type': '*cdReduce', 'exceptSkills': ['EMP磁暴','决战之日','终解·制空霸权']} + # ] associate = [ - {'data': data0, 'type': '$*PAtkP'}, - {'data': data0, 'type': '$*PAtkM'}, - {'data': data1, 'type': '*cdReduce', 'exceptSkills': ['EMP磁暴','决战之日','终解·制空霸权']} + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data1)), except_skills=['EMP磁暴', '决战之日', '终解·制空霸权']), ] # M18阔剑地雷 @@ -917,6 +976,7 @@ class Skill30(ActiveSkill): 在前方一定距离内最强的敌人脚下设置特殊地雷,然后引爆地雷。 删除手动引爆功能,减少击退距离。 攻击次数为1次,攻击力与[M18阔剑地雷]的攻击力总和一致。\n """ name = "M18阔剑地雷" + ref = Ref.M18CLAYMORE cellPos = (8,5) learnLv = 20 masterLv = 60 @@ -957,6 +1017,7 @@ class Skill31(PassiveSkill): 快速拔枪攻击敌人,发动后可以增加攻击速度和普通射击的攻击力。 转职为漫游枪手后增加精通等级。\n """ name = "快速拔枪" + ref = Ref.FASTSHOOT cellPos = (9,6) learnLv = 25 masterLv = 5 @@ -984,6 +1045,7 @@ class Skill32(ActiveSkill): 冷却时间增加,但多段攻击增加至5次、 攻击范围变大,并且可以获得[赤诚之心]的额外攻击力增加效果。\n """ name = "交叉射击" + ref = Ref.CROSSSHOOT cellPos = (3,6) learnLv = 25 masterLv = 60 @@ -1022,6 +1084,7 @@ class Skill33(ActiveSkill): 在决斗场中,不适用感电效果。\n """ name = "G-35L感电手雷" + ref = Ref.GRENADELIGHT cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -1062,6 +1125,7 @@ class Skill34(ActiveSkill): 在决斗场中适用单独的持续时间。\n """ name = "爆裂弹" + ref = Ref.BULLETEXPLOSIVE cellPos = (4,7) learnLv = 30 masterLv = 10 @@ -1095,6 +1159,7 @@ class Skill35(ActiveSkill): 在决斗场中适用单独的持续时间。\n """ name = "贯穿弹" + ref = Ref.BULLETPENETRATE cellPos = (2,7) learnLv = 30 masterLv = 10 @@ -1132,6 +1197,7 @@ class Skill36(ActiveSkill): G-18C冰冻手雷有最大填装数和填装冷却时间,按上、 下方向键后施放技能时,可以调整投掷位置。\n """ name = "G-18C冰冻手雷" + ref = Ref.GRENADEWATER cellPos = (6,7) learnLv = 30 masterLv = 60 @@ -1173,6 +1239,7 @@ class Skill37(ActiveSkill): 在决斗场中,即使经过一定时间C4也不会自动爆炸。\n """ name = "C4飞弹" + ref = Ref.C4 cellPos = (8,8) learnLv = 35 masterLv = 60 @@ -1227,6 +1294,7 @@ class Skill38(ActiveSkill): 可以在[超负荷装填]状态下使用,射击属性为[超负荷装填]中选择的属性。\n """ name = "聚合弹" + ref = Ref.CHARGEBUSTER cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -1281,6 +1349,7 @@ class Skill39(ActiveSkill): 在决斗场中,不发动霸体护甲。\n """ name = "凝固汽油弹" + ref = Ref.NAPALMBOMB cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -1339,6 +1408,7 @@ class Skill40(ActiveSkill): 决斗场中,无法强制中断技能,进入普通霸体,而非建筑霸体。\n """ name = "狙击手增援" + ref = Ref.RETURNEDSNIPER cellPos = (4,10) learnLv = 45 masterLv = 60 @@ -1398,6 +1468,7 @@ class Skill41(PassiveSkill): 装备手弩时,最后一击额外发射2发。(在决斗场中无效)\n """ name = "弹药主宰" + ref = Ref.ADVANCEDBULLET cellPos = (4,11) learnLv = 48 masterLv = 40 @@ -1411,8 +1482,13 @@ class Skill41(PassiveSkill): # 同时发射时第二发子弹攻击力比率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data0},{'data': data1,'skills':["爆裂弹","贯穿弹"]}, + # ] associate = [ - {'data': data0},{'data': data1,'skills':["爆裂弹","贯穿弹"]}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.BULLETEXPLOSIVE, Ref.BULLETPENETRATE]), ] # 黑玫瑰特种战队 @@ -1423,6 +1499,7 @@ class Skill42(ActiveSkill): 召唤出由四名女神枪手组成的黑玫瑰特种战队,集中火力对指定位置发动攻击。\n """ name = "黑玫瑰特种战队" + ref = Ref.BLACKROSE cellPos = (7,11) learnLv = 50 masterLv = 40 @@ -1472,6 +1549,7 @@ class Skill43(ActiveSkill): 向前方投掷重力手雷,将范围内的敌人聚集到一处后爆炸,对敌人造成伤害。\n """ name = "G-61重力手雷" + ref = Ref.GRAVITYGRENADE cellPos = (5,12) learnLv = 60 masterLv = 40 @@ -1530,6 +1608,7 @@ class Skill44(ActiveSkill): (3) 受到磁场影响的[G-14手雷]、 [G-35L感电手雷]、 [G-18C冰冻手雷]得到强化,对磁场领域内的所有敌人造成伤害。\n """ name = "电磁弹 : 麦克斯韦" + ref = Ref.MAXWELL cellPos = (3,13) learnLv = 70 masterLv = 40 @@ -1583,6 +1662,7 @@ class Skill45(ActiveSkill): 可以在[超负荷装填]状态下使用,炮弹属性为[超负荷装填]中选择的属性。\n """ name = "重火力支援" + ref = Ref.DANGERCLOSE cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1631,6 +1711,7 @@ class Skill46(PassiveSkill): 凭借纵横战场的经验,强化自身的基本攻击力和技能攻击力。\n """ name = "战地功勋" + ref = Ref.WARHERO cellPos = (7,13) learnLv = 75 masterLv = 40 @@ -1642,7 +1723,11 @@ class Skill46(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # G-38智能手雷 # gunner_male/spitfire_male/0c3a468aee1f7ce06bf91eb3319518c1 @@ -1654,6 +1739,7 @@ class Skill47(ActiveSkill): G-38ARG系统会根据攻击属性进行响应,发动特定攻击; 造成一定次数相同属性的伤害后,G-38智能手雷会自动爆炸。\n """ name = "G-38智能手雷" + ref = Ref.G38ARG learnLv = 80 masterLv = 40 maxLv = 50 @@ -1712,6 +1798,7 @@ class Skill48(ActiveSkill): 施放技能后,可以通过前后方向键控制投放位置。\n """ name = "超新星核爆" + ref = Ref.SUPERNOVA cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -1751,6 +1838,7 @@ class Skill49(PassiveSkill): [个人要服从集体或更大的整体,服从部队,服从一个团队。]\n """ name = "赤诚之心" + ref = Ref.ALLEGIANT cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1764,8 +1852,13 @@ class Skill49(PassiveSkill): # [交叉射击]技能攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {"data": data0},{'data': data1,'skills':["交叉射击"]}, + # ] associate = [ - {"data": data0},{'data': data1,'skills':["交叉射击"]}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.CROSSSHOOT]), ] # [交叉射击]冷却时间 : 10秒 # [M18阔剑地雷]特殊地雷设置范围 : 前方350px @@ -1779,6 +1872,7 @@ class Skill50(ActiveSkill): 操作事先设置的地雷,将其引爆,在后方待命的皇鹰特战队队员们脱下隐蔽斗篷,使用冲锋枪向前方进行射击。 紧接着分队长登场发射火箭,对敌人发动终结攻击。\n """ name = "皇鹰特战队" + ref = Ref.ETERNALBUSTER cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1815,6 +1909,7 @@ class Skill51(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "赤魂·风暴狙击" + ref = Ref.WILDRNESSSTORM cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/imperialknight/breaker.py b/backend/core/character/GF/imperialknight/breaker.py index c3799480..8b8b6516 100644 --- a/backend/core/character/GF/imperialknight/breaker.py +++ b/backend/core/character/GF/imperialknight/breaker.py @@ -1,6 +1,15 @@ #8d4d2001cdb357e41633c234eb7501b5 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + Equals, + LevelTable, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.imperialknight.breaker import BreakerSkillRef as Ref prefix = "imperialknight/breaker/cn/skillDetail" @@ -13,6 +22,7 @@ class Skill0(ActiveSkill): 攻击时存在霸体判定。\n """ name = "上撩斩" + ref = Ref.RAISEUPPERCUT cellPos = (5,1) learnLv = 1 masterLv = 10 @@ -38,6 +48,7 @@ class Skill1(PassiveSkill): 减少除觉醒技能以外的转职技能的冷却时间,减少施放技能时的魔法值消耗量。\n """ name = "帝国威严" + ref = Ref.DECKBREAKER cellPos = (1,1) learnLv = 1 masterLv = 1 @@ -54,7 +65,11 @@ class Skill1(PassiveSkill): # 技能魔法值消耗量减少率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [ {"type":"*cdReduce","data":data0,"exceptSkills":['鸣镝破阵']}, ] + # 迁移前实现(保留对照): + # associate = [ {"type":"*cdReduce","data":data0,"exceptSkills":['鸣镝破阵']}, ] + associate = [ + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data0)), except_skills=[Ref.OPENWARFANFARE]), + ] # 狂野横扫 # imperialknight/breaker/eb71e1d82d92c7e1d40500a0dcd77aa6 @@ -64,6 +79,7 @@ class Skill2(ActiveSkill): 大幅挥动枪锚横扫,攻击前方敌人。\n """ name = "狂野横扫" + ref = Ref.WIDECLEAVE cellPos = (3,1) learnLv = 1 masterLv = 60 @@ -89,6 +105,7 @@ class Skill3(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -112,6 +129,7 @@ class Skill4(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -131,7 +149,11 @@ class Skill4(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['钩爪突袭']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['钩爪突袭']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.HOOKSHOT]), + ] # 受身蹲伏 # imperialknight/breaker/ce26c6b69d02a440a81b552bec94f03b @@ -141,6 +163,7 @@ class Skill5(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -182,6 +205,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -204,6 +228,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -227,6 +252,7 @@ class Skill8(ActiveSkill): 攻击可抓取的敌人时,使敌人进入强制控制状态。\n """ name = "穿心刺" + ref = Ref.POINTTHRUST cellPos = (5,2) learnLv = 5 masterLv = 60 @@ -257,6 +283,7 @@ class Skill9(ActiveSkill): 施放过程中所受伤害减少。\n """ name = "舰炮飞踢" + ref = Ref.CANNONKICK cellPos = (6,2) learnLv = 5 masterLv = 60 @@ -284,6 +311,7 @@ class Skill10(ActiveSkill): 用迅捷的动作对前方敌人发动下劈。\n """ name = "破浪斩" + ref = Ref.QUICKBISECTION cellPos = (5,3) learnLv = 10 masterLv = 60 @@ -312,6 +340,7 @@ class Skill11(ActiveSkill): 突进过程中减少所受伤害。\n """ name = "无畏登舰" + ref = Ref.ROUGHBOARDING cellPos = (6,3) learnLv = 10 masterLv = 60 @@ -344,6 +373,7 @@ class Skill12(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -371,6 +401,7 @@ class Skill13(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -396,6 +427,7 @@ class Skill14(PassiveSkill): 对帝国的敌人绝不姑息。 增加破浪者的基本攻击力、 转职技能攻击力和物理暴击率。\n """ name = "无情铁律" + ref = Ref.NOQUARTER cellPos = (1,4) learnLv = 15 masterLv = 10 @@ -412,7 +444,11 @@ class Skill14(PassiveSkill): # 物理暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 枪锚踢击 # imperialknight/breaker/cfacda0647b9a0f595df2c2aad30c18d @@ -424,6 +460,7 @@ class Skill15(ActiveSkill): 施放过程中减少所受伤害。\n """ name = "枪锚踢击" + ref = Ref.ANCHORKICK cellPos = (6,4) learnLv = 15 masterLv = 60 @@ -454,6 +491,7 @@ class Skill16(ActiveSkill): 受[基础精通]的影响。\n """ name = "钩爪突袭" + ref = Ref.HOOKSHOT cellPos = (4,4) learnLv = 15 masterLv = 1 @@ -487,6 +525,7 @@ class Skill17(ActiveSkill): 增加基本攻击力和转职技能攻击力。\n """ name = "停航戒令" + ref = Ref.AVAST cellPos = (2,5) learnLv = 20 masterLv = 10 @@ -513,6 +552,7 @@ class Skill18(ActiveSkill): 可以在空中施放。\n """ name = "船体碎击" + ref = Ref.HULLBREACH cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -541,6 +581,7 @@ class Skill19(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -563,6 +604,7 @@ class Skill20(ActiveSkill): 用枪锚向前方大幅横扫,将被击中的敌人聚集到一处。 枪锚扫过的地方会刮起旋风,对范围内的敌人造成伤害。\n """ name = "旋风扫荡" + ref = Ref.SWEEPINGSTRIKE cellPos = (3,6) learnLv = 25 masterLv = 60 @@ -600,6 +642,7 @@ class Skill21(PassiveSkill): 增加基本攻击力和转职技能攻击力,同时提高命中率。\n """ name = "海战体术" + ref = Ref.BOARDINGACTIONPRO cellPos = (1,7) learnLv = 30 masterLv = 10 @@ -616,7 +659,11 @@ class Skill21(PassiveSkill): # 命中率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 激流勇进 # imperialknight/breaker/9cb6f9ed646fa87f9b7680a42ce83d1a @@ -628,6 +675,7 @@ class Skill22(ActiveSkill): 可以取消[激流勇进]施放后的僵直并施放转职技能。\n """ name = "激流勇进" + ref = Ref.TIDEPIERCER cellPos = (6,7) learnLv = 30 masterLv = 60 @@ -657,6 +705,7 @@ class Skill23(ActiveSkill): 在其他动作中施放时,可以无施放动作直接发动技能。 (觉醒技能除外)\n """ name = "深海召唤" + ref = Ref.DEEPWATERCALL cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -696,6 +745,7 @@ class Skill24(ActiveSkill): 以十字形交替挥动枪锚。 第一次斩击后,在一定时间内再次按技能键可发动第二次斩击。 连续施放时,可以取消第一次斩击施放后的僵直并立即施放第二次斩击。\n """ name = "狂风斩" + ref = Ref.GALESLASH cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -750,6 +800,7 @@ class Skill25(ActiveSkill): 可以在地面和空中施放。\n """ name = "潮汐之缚" + ref = Ref.TIDEBOUND cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -803,10 +854,14 @@ class Skill25(ActiveSkill): # self.cd = 7 # self.skillRation *= 1 - 0.5 - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '*skillRation', 'data': [0] + [-17.6] * self.maxLv, 'skills': ['钩爪突袭']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-17.6] * self.maxLv, 'skills': ['钩爪突袭']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-17.6] * maxLv)), skills=[Ref.HOOKSHOT], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 逆浪断空 # imperialknight/breaker/d085127b0edd719782bd618d5688f4a1 @@ -816,6 +871,7 @@ class Skill26(ActiveSkill): 连续攻击两次后,施放强力上挑斩击。\n """ name = "逆浪断空" + ref = Ref.RIPTIDEUPRISING cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -869,6 +925,7 @@ class Skill27(ActiveSkill): 可以取消转职技能的施放后僵直并施放[乘风破浪],也可以取消[乘风破浪]的施放后僵直并施放转职技能。\n """ name = "乘风破浪" + ref = Ref.WAVEBREAKER cellPos = (3,10) learnLv = 45 masterLv = 60 @@ -923,6 +980,7 @@ class Skill28(PassiveSkill): [舰炮飞踢]、 [无畏登舰]、 [枪锚踢击]、 [怒海冲击]、 [战栗轰击]\n """ name = "桀骜不驯" + ref = Ref.TROUBLEMAKER cellPos = (1,11) learnLv = 48 masterLv = 40 @@ -939,7 +997,11 @@ class Skill28(PassiveSkill): # 部分技能所受伤害额外减少率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [ {"data":data0} ] + # 迁移前实现(保留对照): + # associate = [ {"data":data0} ] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 鸣镝破阵 # imperialknight/breaker/ade01c1d6afc8a05055225045e89fe49 @@ -949,6 +1011,7 @@ class Skill29(ActiveSkill): 以锁链缠绕船首并全力砸下,在剧烈的爆炸声中吹响开战的号角。\n """ name = "鸣镝破阵" + ref = Ref.OPENWARFANFARE cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -987,6 +1050,7 @@ class Skill30(ActiveSkill): 施放过程中所受伤害减少。\n """ name = "怒海冲击" + ref = Ref.PIERCEIMPACT cellPos = (6,12) learnLv = 60 masterLv = 40 @@ -1036,6 +1100,7 @@ class Skill31(ActiveSkill): 以漩涡状挥动枪锚,吸附敌人后发动强力终结斩击。\n """ name = "气卷万涛" + ref = Ref.MAELSTROM cellPos = (3,13) learnLv = 70 masterLv = 40 @@ -1094,6 +1159,7 @@ class Skill32(PassiveSkill): 增加破浪者的基本攻击力和转职技能攻击力。\n """ name = "海妖之歌" + ref = Ref.IRONSONG cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1108,7 +1174,11 @@ class Skill32(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [ {"data":data0} ] + # 迁移前实现(保留对照): + # associate = [ {"data":data0} ] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 战栗轰击 # imperialknight/breaker/a5fa08f5d509e6ff2ebc68856a470b5a @@ -1119,6 +1189,7 @@ class Skill33(ActiveSkill): 可通过方向键指定强袭位置。 施放过程中所受伤害减少。\n """ name = "战栗轰击" + ref = Ref.DREADFALLBARRAGE cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1178,6 +1249,7 @@ class Skill34(ActiveSkill): 按前方向键可以增加移动距离。\n """ name = "蛟龙惊涛" + ref = Ref.SEADRAGONTOOTH cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1239,6 +1311,7 @@ class Skill35(ActiveSkill): 潜水状态下施放[海神降临]时,可以将两个技能合并施放,此时两者攻击力也会合并计算。\n """ name = "四海游龙" + ref = Ref.SEABANE cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1279,6 +1352,7 @@ class Skill36(PassiveSkill): 技能施放特效变更,施放过程中所受伤害减少。\n """ name = "逆流而上" + ref = Ref.RIPTIDE cellPos = (1,15) learnLv = 95 masterLv = 40 @@ -1294,7 +1368,11 @@ class Skill36(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # [激流勇进]所受伤害减少率 : 30% - associate = [ {"data":data0} ] + # 迁移前实现(保留对照): + # associate = [ {"data":data0} ] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # [激流勇进]所受伤害减少率 : 30% # 狂澜风暴舞 @@ -1307,6 +1385,7 @@ class Skill37(ActiveSkill): 可以取消转职技能的施放后僵直来连接[狂澜风暴舞],也可以取消[狂澜风暴舞]的施放后僵直来连接转职技能。\n """ name = "狂澜风暴舞" + ref = Ref.UNBOUNDTEMPEST cellPos = (3,15) learnLv = 95 masterLv = 40 @@ -1343,6 +1422,7 @@ class Skill38(ActiveSkill): 可以强制中断[四海游龙]的潜水状态,并合并施放[海神降临]技能。\n """ name = "海神降临" + ref = Ref.SEAGODFALLDOWN cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/knight/chaos.py b/backend/core/character/GF/knight/chaos.py index eec606cf..5073612f 100644 --- a/backend/core/character/GF/knight/chaos.py +++ b/backend/core/character/GF/knight/chaos.py @@ -1,6 +1,15 @@ # 0ee8fa5dc525c1a1f23fc6911e921e4a from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + LevelTable, + Operation, + Percent, + Power, + SkillAttribute, + SkillEffect, +) +from core.character.refs.knight.chaos import ChaosSkillRef as Ref prefix = "knight/chaos/cn/skillDetail" @@ -17,6 +26,7 @@ class Skill0(ActiveSkill): 只有完全掌握盾挑的人才有资格当上骑士团团长,千万不要小看这个技能。]\n """ name = "盾挑" + ref = Ref.UPPERSHIELD learnLv = 1 masterLv = 10 maxLv = 20 @@ -46,6 +56,7 @@ class Skill1(ActiveSkill): 只有为了国家和君主愿意牺牲小我的人才是真正的骑士。]\n """ name = "强踢" + ref = Ref.LIONKICK learnLv = 1 masterLv = 60 maxLv = 70 @@ -81,6 +92,7 @@ class Skill2(ActiveSkill): """ name = '盾牌转换' + ref = Ref.SHIELDCHANGE cellPos = (9,1) learnLv = 1 masterLv = 1 @@ -105,6 +117,7 @@ class Skill3(ActiveSkill): """ name = '统御 : 魔灵战士' + ref = Ref.SUMMONCHAOSSOLDIER cellPos = (2,1) learnLv = 1 masterLv = 1 @@ -129,6 +142,7 @@ class Skill4(ActiveSkill): """ name = '统御 : 魔灵法师' + ref = Ref.SUMMONDEMONMAGICIAN cellPos = (8,1) learnLv = 1 masterLv = 1 @@ -155,6 +169,7 @@ class Skill5(PassiveSkill): """ name = '亚丁的庇佑' + ref = Ref.SUMMONDEVAATEN cellPos = (7,1) learnLv = 1 masterLv = 1 @@ -199,6 +214,7 @@ class Skill6(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -222,6 +238,7 @@ class Skill7(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -249,6 +266,7 @@ class Skill8(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -290,6 +308,7 @@ class Skill9(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -312,6 +331,7 @@ class Skill10(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -337,6 +357,7 @@ class Skill11(ActiveSkill): """ name = '盾击' + ref = Ref.SHIELDSTARK cellPos = (4,2) learnLv = 5 masterLv = 60 @@ -372,6 +393,7 @@ class Skill12(ActiveSkill): [命运之轮开始旋转了。]\n """ name = "命运之轮" + ref = Ref.WHEELOFFORTUNE learnLv = 5 masterLv = 60 maxLv = 70 @@ -402,6 +424,7 @@ class Skill13(PassiveSkill): """ name = '自动防御' + ref = Ref.PERFECTGUARD cellPos = (9,2) learnLv = 5 masterLv = 5 @@ -433,6 +456,7 @@ class Skill14(ActiveSkill): """ name = '盾牌格挡' + ref = Ref.SHIELDGUARD cellPos = (4,3) learnLv = 10 masterLv = 5 @@ -481,6 +505,7 @@ class Skill15(ActiveSkill): """ name = '致命突刺' + ref = Ref.LETHALPUNTO cellPos = (6,3) learnLv = 10 masterLv = 60 @@ -527,6 +552,7 @@ class Skill16(ActiveSkill): """ name = '跳斩' + ref = Ref.FINISH cellPos = (9,3) learnLv = 10 masterLv = 60 @@ -556,6 +582,7 @@ class Skill17(ActiveSkill): """ name = '飞跃截击' + ref = Ref.INTERCEPT cellPos = (1,3) learnLv = 10 masterLv = 60 @@ -588,6 +615,7 @@ class Skill18(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -615,6 +643,7 @@ class Skill19(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -644,6 +673,7 @@ class Skill20(PassiveSkill): """ name = '防御姿态' + ref = Ref.DEFENSIVEPOSTURE cellPos = (4,4) learnLv = 15 masterLv = 1 @@ -677,6 +707,7 @@ class Skill21(ActiveSkill): """ name = '破武之轮' + ref = Ref.DISARMING cellPos = (9,4) learnLv = 15 masterLv = 60 @@ -731,6 +762,7 @@ class Skill22(ActiveSkill): """ name = '魔灵召唤 : 波拉斯' + ref = Ref.SUMMONBORASS cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -762,6 +794,7 @@ class Skill23(ActiveSkill): """ name = '魔灵召唤 : 瓦尔琪' + ref = Ref.SUMMONLUCKYWACKY cellPos = (8,4) learnLv = 15 masterLv = 60 @@ -792,6 +825,7 @@ class Skill24(ActiveSkill): """ name = '军团遣散' + ref = Ref.CLEARDEMON cellPos = (3,4) learnLv = 15 masterLv = 1 @@ -815,6 +849,7 @@ class Skill25(ActiveSkill): """ name = '军团列队' + ref = Ref.CORPSARRAY cellPos = (6,4) learnLv = 15 masterLv = 60 @@ -845,6 +880,7 @@ class Skill26(PassiveSkill): """ name = '魔灵血统' + ref = Ref.MIXEDBLOOD cellPos = (1,4) learnLv = 15 masterLv = 1 @@ -864,7 +900,11 @@ class Skill26(PassiveSkill): # 命中率增加 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 魔灵随行 # knight/chaos/dbf8b30c7057032af0d68fcfa289fdae @@ -875,6 +915,7 @@ class Skill27(ActiveSkill): """ name = '魔灵随行' + ref = Ref.STOPATTACK cellPos = (5,4) learnLv = 15 masterLv = 1 @@ -901,6 +942,7 @@ class Skill28(PassiveSkill): """ name = '力量法则' + ref = Ref.RULEOFPOWER cellPos = (1,5) learnLv = 20 masterLv = 1 @@ -915,7 +957,11 @@ class Skill28(PassiveSkill): # 特定技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*skillDamage', 'skills': ['军团列队', '魔幻旋风', '毁灭突进', '翔空剑', '聚灵升空剑', '魔神百裂拳', '黑暗冲击', '午夜嘉年华', '绚丽耀光', '魔灵乱舞', '黑曜之眸 : 亚丁降临', '绽放·终章', '盛宴·恶之祭典']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage', 'skills': ['军团列队', '魔幻旋风', '毁灭突进', '翔空剑', '聚灵升空剑', '魔神百裂拳', '黑暗冲击', '午夜嘉年华', '绚丽耀光', '魔灵乱舞', '黑曜之眸 : 亚丁降临', '绽放·终章', '盛宴·恶之祭典']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.CORPSARRAY, Ref.FANCYTWIST, Ref.BATTERINGRAM, Ref.VSLASH, Ref.FINALATTACK, Ref.WONDERFULRUSH, Ref.DARKSHOCKWAVE, Ref.MIDNIGHTCARNIVAL, Ref.MASSIVEFIRE, Ref.BRAWL, Ref.ATENADVENT, Ref.GRANDFINALE, Ref.EVILFESTIVAL]), + ] # 魔灵召唤 : 狂暴布洛克 # knight/chaos/6e33d47e6622ce03b6defdd912140270 @@ -930,6 +976,7 @@ class Skill29(ActiveSkill): """ name = '魔灵召唤 : 狂暴布洛克' + ref = Ref.SUMMONHYSTERICWORRIER cellPos = (2,5) learnLv = 20 masterLv = 60 @@ -974,6 +1021,7 @@ class Skill30(ActiveSkill): """ name = '魔灵炸弹' + ref = Ref.SACRIFICEBOMB cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -1037,6 +1085,7 @@ class Skill31(ActiveSkill): """ name = '连锁共振' + ref = Ref.RESONANCE cellPos = (4,5) learnLv = 20 masterLv = 1 @@ -1079,7 +1128,11 @@ class Skill31(ActiveSkill): self.cd = self.cdList[self.lv] return super().getSkillCD(mode) - associate = [{'type': '*skillDamage', 'data': data7, 'skills': ['魔灵召唤 : 波拉斯', '魔灵召唤 : 狂暴布洛克', '魔灵召唤 : 假面杰森', '魔灵召唤 : 旋转小冯', '魔灵召唤 : 迪克老爹']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data7, 'skills': ['魔灵召唤 : 波拉斯', '魔灵召唤 : 狂暴布洛克', '魔灵召唤 : 假面杰森', '魔灵召唤 : 旋转小冯', '魔灵召唤 : 迪克老爹']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data7)), skills=[Ref.SUMMONBORASS, Ref.SUMMONHYSTERICWORRIER, Ref.SUMMONGELATINMASK, Ref.SUMMONCRAZYSPIN, Ref.SUMMONBIGDADDY]), + ] # 暴击 # knight/chaos/fc1262c19f3d0477ee8eda47b8db8696 @@ -1089,6 +1142,7 @@ class Skill32(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -1116,6 +1170,7 @@ class Skill33(ActiveSkill): """ name = '魔灵召唤 : 假面杰森' + ref = Ref.SUMMONGELATINMASK cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -1156,6 +1211,7 @@ class Skill34(ActiveSkill): """ name = '魔灵召唤 : 大画家芭芘' + ref = Ref.SUMMONTWINKLEARTIST cellPos = (8,6) learnLv = 25 masterLv = 60 @@ -1189,6 +1245,7 @@ class Skill35(ActiveSkill): """ name = '绝对魅力' + ref = Ref.REIGNOFTERROR cellPos = (4,6) learnLv = 25 masterLv = 10 @@ -1209,17 +1266,30 @@ class Skill35(ActiveSkill): # [魔灵炸弹]、 [毁灭突进]、 [碎灵之击]魔灵攻击力增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data1, 'skills': ['魔灵召唤 : 波拉斯', '魔灵召唤 : 瓦尔琪', '魔灵召唤 : 狂暴布洛克', '魔灵召唤 : 假面杰森', '魔灵召唤 : 大画家芭芘', '魔灵召唤 : 旋转小冯', '魔灵召唤 : 小吸血鬼夏伊', '魔灵召唤 : 大富翁鲁邦', '魔灵召唤 : 迪克老爹', '魔灵召唤 : 红心女皇艾莉莎']}, + # {'type': '+power2', 'data': data2, 'skills': ['魔灵炸弹']}, + # {'type': '+power3', 'data': data2, 'skills': ['魔灵炸弹']}, + # {'type': '+power5', 'data': data2, 'skills': ['魔灵炸弹']}, + # {'type': '+power7', 'data': data2, 'skills': ['魔灵炸弹']}, + # {'type': '+power12', 'data': data2, 'skills': ['魔灵炸弹']}, + # {'type': '+power13', 'data': data2, 'skills': ['魔灵炸弹']}, + # {'type': '+power2', 'data': data2, 'skills': ['毁灭突进']}, + # {'type': '+power3', 'data': data2, 'skills': ['毁灭突进']}, + # {'type': '*ratio', 'data': data2, 'skills': ['碎灵之击']}, + # ] associate = [ - {'type': '*skillDamage', 'data': data1, 'skills': ['魔灵召唤 : 波拉斯', '魔灵召唤 : 瓦尔琪', '魔灵召唤 : 狂暴布洛克', '魔灵召唤 : 假面杰森', '魔灵召唤 : 大画家芭芘', '魔灵召唤 : 旋转小冯', '魔灵召唤 : 小吸血鬼夏伊', '魔灵召唤 : 大富翁鲁邦', '魔灵召唤 : 迪克老爹', '魔灵召唤 : 红心女皇艾莉莎']}, - {'type': '+power2', 'data': data2, 'skills': ['魔灵炸弹']}, - {'type': '+power3', 'data': data2, 'skills': ['魔灵炸弹']}, - {'type': '+power5', 'data': data2, 'skills': ['魔灵炸弹']}, - {'type': '+power7', 'data': data2, 'skills': ['魔灵炸弹']}, - {'type': '+power12', 'data': data2, 'skills': ['魔灵炸弹']}, - {'type': '+power13', 'data': data2, 'skills': ['魔灵炸弹']}, - {'type': '+power2', 'data': data2, 'skills': ['毁灭突进']}, - {'type': '+power3', 'data': data2, 'skills': ['毁灭突进']}, - {'type': '*ratio', 'data': data2, 'skills': ['碎灵之击']}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.SUMMONBORASS, Ref.SUMMONLUCKYWACKY, Ref.SUMMONHYSTERICWORRIER, Ref.SUMMONGELATINMASK, Ref.SUMMONTWINKLEARTIST, Ref.SUMMONCRAZYSPIN, Ref.SUMMONVAMPIRECHILDREN, Ref.SUMMONRAGEHAT, Ref.SUMMONBIGDADDY, Ref.SUMMONHEARTQUEEN]), + SkillEffect(attribute=Power(2), operation=Operation.ADD, value=Percent(LevelTable(data2)), skills=[Ref.SACRIFICEBOMB]), + SkillEffect(attribute=Power(3), operation=Operation.ADD, value=Percent(LevelTable(data2)), skills=[Ref.SACRIFICEBOMB]), + SkillEffect(attribute=Power(5), operation=Operation.ADD, value=Percent(LevelTable(data2)), skills=[Ref.SACRIFICEBOMB]), + SkillEffect(attribute=Power(7), operation=Operation.ADD, value=Percent(LevelTable(data2)), skills=[Ref.SACRIFICEBOMB]), + SkillEffect(attribute=Power(12), operation=Operation.ADD, value=Percent(LevelTable(data2)), skills=[Ref.SACRIFICEBOMB]), + SkillEffect(attribute=Power(13), operation=Operation.ADD, value=Percent(LevelTable(data2)), skills=[Ref.SACRIFICEBOMB]), + SkillEffect(attribute=Power(2), operation=Operation.ADD, value=Percent(LevelTable(data2)), skills=[Ref.BATTERINGRAM]), + SkillEffect(attribute=Power(3), operation=Operation.ADD, value=Percent(LevelTable(data2)), skills=[Ref.BATTERINGRAM]), + SkillEffect(attribute=SkillAttribute.RATIO, value=1 + Percent(LevelTable(data2)), skills=[Ref.GENOCIDECRUSH]), ] # 魔幻旋风 @@ -1232,6 +1302,7 @@ class Skill36(ActiveSkill): """ name = '魔幻旋风' + ref = Ref.FANCYTWIST cellPos = (6,6) learnLv = 25 masterLv = 60 @@ -1273,6 +1344,7 @@ class Skill37(ActiveSkill): """ name = '魔灵召唤 : 旋转小冯' + ref = Ref.SUMMONCRAZYSPIN cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -1310,6 +1382,7 @@ class Skill38(ActiveSkill): """ name = '魔灵召唤 : 小吸血鬼夏伊' + ref = Ref.SUMMONVAMPIRECHILDREN cellPos = (8,7) learnLv = 30 masterLv = 60 @@ -1346,6 +1419,7 @@ class Skill39(ActiveSkill): """ name = '思维风暴' + ref = Ref.BRAINSTORM cellPos = (4,7) learnLv = 30 masterLv = 10 @@ -1376,6 +1450,7 @@ class Skill40(ActiveSkill): """ name = '毁灭突进' + ref = Ref.BATTERINGRAM cellPos = (6,7) learnLv = 30 masterLv = 60 @@ -1421,6 +1496,7 @@ class Skill41(ActiveSkill): """ name = '魔灵召唤 : 大富翁鲁邦' + ref = Ref.SUMMONRAGEHAT cellPos = (8,8) learnLv = 35 masterLv = 60 @@ -1474,6 +1550,7 @@ class Skill42(ActiveSkill): """ name = '灵性转换' + ref = Ref.ELEMENTALCIRCLE cellPos = (9,8) learnLv = 35 masterLv = 1 @@ -1503,6 +1580,7 @@ class Skill43(ActiveSkill): """ name = '翔空剑' + ref = Ref.VSLASH cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -1577,6 +1655,7 @@ class Skill44(ActiveSkill): """ name = '魔灵召唤 : 迪克老爹' + ref = Ref.SUMMONBIGDADDY cellPos = (2,9) learnLv = 40 masterLv = 60 @@ -1638,6 +1717,7 @@ class Skill45(ActiveSkill): """ name = '碎灵之击' + ref = Ref.GENOCIDECRUSH cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -1757,6 +1837,7 @@ class Skill46(ActiveSkill): """ name = '魔灵召唤 : 红心女皇艾莉莎' + ref = Ref.SUMMONHEARTQUEEN cellPos = (8,10) learnLv = 45 masterLv = 60 @@ -1809,6 +1890,7 @@ class Skill47(ActiveSkill): """ name = '聚灵升空剑' + ref = Ref.FINALATTACK cellPos = (6,10) learnLv = 45 masterLv = 60 @@ -1874,6 +1956,7 @@ class Skill48(PassiveSkill): """ name = '魔能榨取' + ref = Ref.EXPLOITATION cellPos = (5,11) learnLv = 48 masterLv = 40 @@ -1890,7 +1973,11 @@ class Skill48(PassiveSkill): # 魔灵召唤解除后效果持续时间 : {value1}秒 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 魔神百裂拳 # knight/chaos/6a1d1f08a6572be420bb3a256c44c015 @@ -1902,6 +1989,7 @@ class Skill49(ActiveSkill): """ name = '魔神百裂拳' + ref = Ref.WONDERFULRUSH cellPos = (3,11) learnLv = 50 masterLv = 40 @@ -1946,6 +2034,7 @@ class Skill50(ActiveSkill): """ name = '黑暗冲击' + ref = Ref.DARKSHOCKWAVE cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -2009,6 +2098,7 @@ class Skill51(ActiveSkill): """ name = '午夜嘉年华' + ref = Ref.MIDNIGHTCARNIVAL cellPos = (8,13) learnLv = 70 masterLv = 40 @@ -2065,6 +2155,7 @@ class Skill52(PassiveSkill): """ name = '亚丁之力' + ref = Ref.SUMMONATENSAVATAR cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -2087,9 +2178,14 @@ class Skill52(PassiveSkill): # 魔法暴击几率增加 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data0, 'type': '*skillDamage', 'skills': ['魔幻旋风', '毁灭突进', '翔空剑', '聚灵升空剑', '魔神百裂拳', '黑暗冲击', '午夜嘉年华', '绚丽耀光', '魔灵乱舞', '黑曜之眸 : 亚丁降临', '绽放·终章', '盛宴·恶之祭典']}, + # {'data': data1, 'type': '*skillDamage', 'skills': ['魔灵召唤 : 波拉斯', '魔灵召唤 : 瓦尔琪', '魔灵召唤 : 狂暴布洛克', '魔灵召唤 : 假面杰森', '魔灵召唤 : 大画家芭芘', '魔灵召唤 : 旋转小冯', '魔灵召唤 : 小吸血鬼夏伊', '魔灵召唤 : 大富翁鲁邦', '魔灵召唤 : 迪克老爹', '魔灵召唤 : 红心女皇艾莉莎']}, + # ] associate = [ - {'data': data0, 'type': '*skillDamage', 'skills': ['魔幻旋风', '毁灭突进', '翔空剑', '聚灵升空剑', '魔神百裂拳', '黑暗冲击', '午夜嘉年华', '绚丽耀光', '魔灵乱舞', '黑曜之眸 : 亚丁降临', '绽放·终章', '盛宴·恶之祭典']}, - {'data': data1, 'type': '*skillDamage', 'skills': ['魔灵召唤 : 波拉斯', '魔灵召唤 : 瓦尔琪', '魔灵召唤 : 狂暴布洛克', '魔灵召唤 : 假面杰森', '魔灵召唤 : 大画家芭芘', '魔灵召唤 : 旋转小冯', '魔灵召唤 : 小吸血鬼夏伊', '魔灵召唤 : 大富翁鲁邦', '魔灵召唤 : 迪克老爹', '魔灵召唤 : 红心女皇艾莉莎']}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.FANCYTWIST, Ref.BATTERINGRAM, Ref.VSLASH, Ref.FINALATTACK, Ref.WONDERFULRUSH, Ref.DARKSHOCKWAVE, Ref.MIDNIGHTCARNIVAL, Ref.MASSIVEFIRE, Ref.BRAWL, Ref.ATENADVENT, Ref.GRANDFINALE, Ref.EVILFESTIVAL]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.SUMMONBORASS, Ref.SUMMONLUCKYWACKY, Ref.SUMMONHYSTERICWORRIER, Ref.SUMMONGELATINMASK, Ref.SUMMONTWINKLEARTIST, Ref.SUMMONCRAZYSPIN, Ref.SUMMONVAMPIRECHILDREN, Ref.SUMMONRAGEHAT, Ref.SUMMONBIGDADDY, Ref.SUMMONHEARTQUEEN]), ] # 绚丽耀光 @@ -2102,6 +2198,7 @@ class Skill53(ActiveSkill): """ name = '绚丽耀光' + ref = Ref.MASSIVEFIRE cellPos = (7,13) learnLv = 75 masterLv = 40 @@ -2159,6 +2256,7 @@ class Skill54(ActiveSkill): """ name = '魔灵乱舞' + ref = Ref.BRAWL cellPos = (2,14) learnLv = 80 masterLv = 40 @@ -2217,6 +2315,7 @@ class Skill55(ActiveSkill): """ name = '黑曜之眸 : 亚丁降临' + ref = Ref.ATENADVENT cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -2254,6 +2353,7 @@ class Skill56(PassiveSkill): """ name = '黑色曜日' + ref = Ref.BLACKSUN cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -2270,7 +2370,11 @@ class Skill56(PassiveSkill): # [魔幻旋风]盾牌挥击攻击力 : [魔幻旋风]攻击力总和的{value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 绽放·终章 # knight/chaos/ca2536eb56df0e812c88c59cabd38be0 @@ -2283,6 +2387,7 @@ class Skill57(ActiveSkill): """ name = '绽放·终章' + ref = Ref.GRANDFINALE cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2324,6 +2429,7 @@ class Skill58(ActiveSkill): """ name = '盛宴·恶之祭典' + ref = Ref.EVILFESTIVAL cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/knight/dragon_knight.py b/backend/core/character/GF/knight/dragon_knight.py index ac4f4efb..f4a76b00 100644 --- a/backend/core/character/GF/knight/dragon_knight.py +++ b/backend/core/character/GF/knight/dragon_knight.py @@ -1,6 +1,16 @@ # 0ee8fa5dc525c1a1f23fc6911e921e4a from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.knight.dragon_knight import DragonKnightSkillRef as Ref prefix = "knight/dragon_knight/cn/skillDetail" @@ -16,6 +26,7 @@ class Skill0(ActiveSkill): 只有完全掌握盾挑的人才有资格当上骑士团团长,千万不要小看这个技能。]\n """ name = "盾挑" + ref = Ref.UPPERSHIELD learnLv = 1 masterLv = 10 maxLv = 20 @@ -45,6 +56,7 @@ class Skill1(ActiveSkill): 只有为了国家和君主愿意牺牲小我的人才是真正的骑士。]\n """ name = "强踢" + ref = Ref.LIONKICK learnLv = 1 masterLv = 60 maxLv = 70 @@ -79,6 +91,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -102,6 +115,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -119,7 +133,11 @@ class Skill3(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['龙人剑术']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['龙人剑术']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.DRAGONTOOTH]), + ] # 受身蹲伏 # knight/dragon_knight/ce26c6b69d02a440a81b552bec94f03b @@ -129,6 +147,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -170,6 +189,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -192,6 +212,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -216,6 +237,7 @@ class Skill7(ActiveSkill): [厚重的盾牌本身就是一件强大的武器。 但如果你没有足够的力量的话还是放弃这个想法吧。]\n """ name = "盾击" + ref = Ref.SHIELDSTARK learnLv = 5 masterLv = 60 maxLv = 70 @@ -249,6 +271,7 @@ class Skill8(ActiveSkill): [命运之轮开始旋转了。]\n """ name = "命运之轮" + ref = Ref.WHEELOFFORTUNE learnLv = 5 masterLv = 60 maxLv = 70 @@ -278,6 +301,7 @@ class Skill9(PassiveSkill): [利剑和盾牌从来都不是骑士们杀伐的理由,因为他们知道在利剑和盾牌的后面有着他们要保护的人。]\n """ name = "自动防御" + ref = Ref.PERFECTGUARD learnLv = 5 masterLv = 5 maxLv = 20 @@ -308,6 +332,7 @@ class Skill10(ActiveSkill): 如何抉择就看你自己了。]\n """ name = "盾牌格挡" + ref = Ref.SHIELDGUARD learnLv = 10 masterLv = 5 maxLv = 7 @@ -344,6 +369,7 @@ class Skill11(ActiveSkill): [原本为帝国贵族剑士所掌握的剑术。 帝国皇帝为了提升骑士团的战斗力,“奉劝”贵族们将秘传剑术传授给骑士们。 迫于压力,贵族剑士只好将一些初级剑术传授给了骑士团。]\n """ name = "致命突刺" + ref = Ref.LETHALPUNTO learnLv = 10 masterLv = 60 maxLv = 70 @@ -379,6 +405,7 @@ class Skill12(ActiveSkill): [这是骑士们在战场上寻找装死敌人时的常用技能,可以让那些丧失抵抗能力的人毫无痛苦地死去。 怜悯,也是骑士的美德之一。]\n """ name = '跳斩' + ref = Ref.FINISH cellPos = (7,3) learnLv = 10 masterLv = 60 @@ -404,6 +431,7 @@ class Skill13(ActiveSkill): [拿着厚重的盾牌,怎么会跳得这样轻盈?]\n """ name = '飞跃截击' + ref = Ref.INTERCEPT cellPos = (1,3) learnLv = 10 masterLv = 60 @@ -434,6 +462,7 @@ class Skill14(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -461,6 +490,7 @@ class Skill15(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -489,6 +519,7 @@ class Skill16(PassiveSkill): [进击吧! 骑士!]\n """ name = '防御姿态' + ref = Ref.DEFENSIVEPOSTURE cellPos = (4,4) learnLv = 15 masterLv = 1 @@ -516,6 +547,7 @@ class Skill17(PassiveSkill): 根据自身剩余生命值量,增加物理、 魔法防御力。\n """ name = '龙人血统' + ref = Ref.DRAGONIANWEAPON cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -555,6 +587,7 @@ class Skill18(ActiveSkill): 只有达到一定高度或者在[龙翼]状态下,才能在空中施放。\n """ name = '龙人剑术' + ref = Ref.DRAGONTOOTH cellPos = (3,4) learnLv = 15 masterLv = 1 @@ -588,6 +621,7 @@ class Skill19(ActiveSkill): 按跳跃键或攻击时,停止飞行并降落。\n """ name = '龙翼' + ref = Ref.DRAGONWING cellPos = (1,4) learnLv = 15 masterLv = 1 @@ -616,6 +650,7 @@ class Skill20(ActiveSkill): 从龙盾中喷射龙形火焰,对前方敌人造成多段攻击伤害并将其击倒。\n """ name = '火焰吐息' + ref = Ref.FIREBREATH cellPos = (6,4) learnLv = 15 masterLv = 60 @@ -648,6 +683,7 @@ class Skill21(ActiveSkill): 在决斗场中,施放技能时高度不影响降落速度。\n """ name = '龙翼突袭' + ref = Ref.BLITZSTRIKE cellPos = (1,5) learnLv = 20 masterLv = 60 @@ -683,6 +719,7 @@ class Skill22(ActiveSkill): 在决斗场中,龙骑士不进入霸体状态,冲击波可以使敌人僵直。 使用[受身蹲伏]时,无法施放该技能。\n """ name = '龙语召唤 : 阿斯特拉' + ref = Ref.SUMMONASTR cellPos = (7,5) learnLv = 20 masterLv = 20 @@ -708,7 +745,11 @@ class Skill22(ActiveSkill): # 冲击波大小比率 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'type': '$*PAtkI', 'data': data1}] + # 迁移前实现(保留对照): + # associate = [{'type': '$*PAtkI', 'data': data1}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_I, value=1 + Percent(LevelTable(data1))), + ] # 暴击 # knight/dragon_knight/fc1262c19f3d0477ee8eda47b8db8696 @@ -718,6 +759,7 @@ class Skill23(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -742,6 +784,7 @@ class Skill24(PassiveSkill): 在决斗场中施放[龙翼突袭]时,无霸体效果。\n """ name = '龙人之太刀精通' + ref = Ref.SLAYER cellPos = (0,6) learnLv = 25 masterLv = 1 @@ -767,6 +810,7 @@ class Skill25(ActiveSkill): 空中施放时,将斗气集中到龙角上发射,贯穿路径上所有敌人并造成伤害。 决斗场中无法在跳跃时使用。\n """ name = '爆破龙角' + ref = Ref.BURSTHORN cellPos = (3,6) learnLv = 25 masterLv = 60 @@ -808,6 +852,7 @@ class Skill26(PassiveSkill): 龙骑士被攻击时,无法施放该技能。\n """ name = '龙之吐息' + ref = Ref.DRAGONBREATH cellPos = (6,6) learnLv = 25 masterLv = 1 @@ -833,6 +878,7 @@ class Skill27(ActiveSkill): 在决斗场中,在地面施放时无法攻击倒地的敌人。\n """ name = '龙拳' + ref = Ref.KNUCKLEBLASTER cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -887,6 +933,7 @@ class Skill28(ActiveSkill): 龙骑士被攻击时,无法施放该技能。\n """ name = '龙之撕咬' + ref = Ref.DRAGONFANG cellPos = (7,7) learnLv = 30 masterLv = 60 @@ -914,6 +961,7 @@ class Skill29(ActiveSkill): 增加[跳斩]、 基本攻击和转职后技能的攻击力,并通过进餐小幅增加生命值恢复量。\n """ name = '肉食主义' + ref = Ref.FOODFIGHTING cellPos = (4,7) learnLv = 30 masterLv = 10 @@ -947,6 +995,7 @@ class Skill30(ActiveSkill): [爆破龙角]、 [龙翼穿刺]、 [龙刃无双]地面施放时、 [龙皇制裁]\n """ name = '飞龙斩' + ref = Ref.DRAGONSMASH cellPos = (2,8) learnLv = 35 masterLv = 60 @@ -1007,6 +1056,7 @@ class Skill31(ActiveSkill): 在决斗场中,攻击前无法蓄气,无法向受到龙之撕咬攻击的敌人突进,并且无法聚拢霸体状态的敌人。\n """ name = '龙翼穿刺' + ref = Ref.SPINNINGRAID cellPos = (1,8) learnLv = 35 masterLv = 60 @@ -1090,6 +1140,7 @@ class Skill32(PassiveSkill): 提高进餐效果,施放[肉食主义]时可以进一步增加暴击伤害。\n """ name = '大胃王' + ref = Ref.SPICE cellPos = (4,8) learnLv = 35 masterLv = 10 @@ -1101,7 +1152,11 @@ class Skill32(PassiveSkill): # 暴击伤害增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 龙刃无双 # knight/dragon_knight/5c45f69c9ebc7a784e994369d2cc3c66 @@ -1112,6 +1167,7 @@ class Skill33(ActiveSkill): 斩击之前按上方向键,可以发动有最下段判定的上挑攻击。\n """ name = '龙刃无双' + ref = Ref.DRAGONKAISERSWORD cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -1184,6 +1240,7 @@ class Skill34(ActiveSkill): 在决斗场中,空中施放该技能时,大幅减少移动速度,并且无法吸附敌人或转换方向。\n """ name = '魔龙之息' + ref = Ref.STORMBREATH cellPos = (7,10) learnLv = 45 masterLv = 60 @@ -1270,6 +1327,7 @@ class Skill35(ActiveSkill): 在决斗场中,火焰弹无僵直效果。\n """ name = '魔龙之力' + ref = Ref.DRAGONFORCE cellPos = (4,11) learnLv = 48 masterLv = 40 @@ -1292,7 +1350,11 @@ class Skill35(ActiveSkill): # 空中施放技能所需最低高度的减少 : {value3}px data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] def getSkillCD(self, mode=None): return 3.0 @@ -1309,6 +1371,7 @@ class Skill36(ActiveSkill): 只有达到一定高度或者在[龙翼]状态下,才能在空中施放该技能。\n """ name = '雷光嘶吼' + ref = Ref.DISASTER cellPos = (3,11) learnLv = 50 masterLv = 40 @@ -1344,6 +1407,7 @@ class Skill37(ActiveSkill): 只有达到一定高度或者在[龙翼]状态下,才能在空中施放该技能。\n """ name = '龙皇制裁' + ref = Ref.EXTERMINATE cellPos = (2,12) learnLv = 60 masterLv = 40 @@ -1440,6 +1504,7 @@ class Skill38(ActiveSkill): 只有达到一定高度或者在[龙翼]状态下,才能在空中施放该技能。\n """ name = '魔龙天翔' + ref = Ref.SKYRUSH cellPos = (7,13) learnLv = 70 masterLv = 40 @@ -1532,6 +1597,7 @@ class Skill39(PassiveSkill): 减少冷却时间和下降加速度,跳跃瞬间变为霸体状态。 另外,部分体术技能击中敌人时,可以强制中断技能并施放[龙翼]的变形——[超级跳跃]。 [超级跳跃]状态下可以发动空中技能。 可以强制中断的技能目录与[飞龙斩]相同。\n """ name = '龙神血脉' + ref = Ref.HEIR cellPos = (4,13) learnLv = 75 masterLv = 40 @@ -1548,9 +1614,14 @@ class Skill39(PassiveSkill): # [超级跳跃]后霸体持续时间 : {value2}秒 data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data1}, + # {'type': '+cd', 'data': [0] + [-1] * maxLv, 'skills': ['龙翼', '龙翼突袭'], 'ratio': 1}, + # ] associate = [ - {'data': data1}, - {'type': '+cd', 'data': [0] + [-1] * maxLv, 'skills': ['龙翼', '龙翼突袭'], 'ratio': 1}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + SkillEffect(attribute=SkillAttribute.CD, operation=Operation.ADD, value=LevelTable([0] + [-1] * maxLv), skills=[Ref.DRAGONWING, Ref.BLITZSTRIKE]), ] # 魔龙星落 @@ -1564,6 +1635,7 @@ class Skill40(ActiveSkill): [龙翼突袭]、 [爆破龙角]、 [龙翼穿刺]、 [龙刃无双]地面施放时、 [龙皇制裁]、 [征战无双]击中敌人时,可以取消施放后僵直立即发动该技能。\n """ name = '魔龙星落' + ref = Ref.DRAGONBURST cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1656,6 +1728,7 @@ class Skill41(ActiveSkill): 施放[魔龙之息]过程中可以发动该技能,反过来施放该技能过程中也可以发动[魔龙之息]。 连接技能时,飞行时间更新并保留终结一击,但不会更新转换方向的冷却时间。 终结一击只能发动一次。\n """ name = '征战无双' + ref = Ref.PARTICIPATION cellPos = (6,14) learnLv = 80 masterLv = 40 @@ -1741,6 +1814,7 @@ class Skill42(ActiveSkill): 龙骑士与阿斯特拉融合,发射阿斯特拉最强攻击技——终末之光。\n """ name = '龙神裁决 : 终末之光' + ref = Ref.LASTLIGHT cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1771,6 +1845,7 @@ class Skill43(PassiveSkill): 在空中施放时,龙拳不攻击敌人,但会产生冲击波,并使命中的敌人移动到冲击波中心位置。\n """ name = '龙血誓约' + ref = Ref.DRAGONOATH cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1781,7 +1856,11 @@ class Skill43(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 龙哮雷鸣 # knight/dragon_knight/573723c8c0614f5b1218ca9ff992115b @@ -1794,6 +1873,7 @@ class Skill44(ActiveSkill): 骑坐状态下施放时,阿斯特拉聚集雷电之力并发射雷光球。 此时,增加攻击范围; [征战无双]骑坐状态下施放时,[征战无双]的下斩攻击力并入雷光球爆炸攻击力中。\n """ name = '龙哮雷鸣' + ref = Ref.LIGHTNINGROAR cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1831,6 +1911,7 @@ class Skill45(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = '龙神君临·虚空烬灭' + ref = Ref.INFINITYNOVA cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/knight/elven_knight.py b/backend/core/character/GF/knight/elven_knight.py index 4e45fea5..a216cce7 100644 --- a/backend/core/character/GF/knight/elven_knight.py +++ b/backend/core/character/GF/knight/elven_knight.py @@ -1,6 +1,26 @@ # 0ee8fa5dc525c1a1f23fc6911e921e4a from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Equals, + LevelTable, + Operation, + Percent, + ProfessionAttribute, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.knight.elven_knight import ElvenKnightSkillRef as Ref + + +class ElvenKnightAttribute(ProfessionAttribute): + """本职业专用的最终效果属性;字段含义与技能实现保持一致。""" + CHAIN_POWER = 'chain_power' + """精灵骑士:每层剑盾猛攻对应的伤害加成。""" + prefix = "knight/elven_knight/cn/skillDetail" @@ -52,6 +72,7 @@ class Skill0(ActiveSkill): """ name = '盾挑' + ref = Ref.UPPERSHIELD cellPos = (3,1) learnLv = 1 masterLv = 10 @@ -84,6 +105,7 @@ class Skill1(ActiveSkill): """ name = '强踢' + ref = Ref.LIONKICK cellPos = (5,1) learnLv = 1 masterLv = 60 @@ -122,6 +144,7 @@ class Skill2(ActiveSkill): """ name = '盾牌转换' + ref = Ref.SHIELDCHANGE cellPos = (2,1) learnLv = 1 masterLv = 1 @@ -144,6 +167,7 @@ class Skill3(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -168,6 +192,7 @@ class Skill4(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -187,7 +212,11 @@ class Skill4(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['骑乘召唤']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['骑乘召唤']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.RIDING]), + ] # 受身蹲伏 # knight/elven_knight/ce26c6b69d02a440a81b552bec94f03b @@ -197,6 +226,7 @@ class Skill5(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -238,6 +268,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -260,6 +291,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -285,6 +317,7 @@ class Skill8(ActiveSkill): """ name = '盾击' + ref = Ref.SHIELDSTARK cellPos = (4,2) learnLv = 5 masterLv = 60 @@ -323,6 +356,7 @@ class Skill9(ActiveSkill): """ name = '命运之轮' + ref = Ref.WHEELOFFORTUNE cellPos = (2,2) learnLv = 5 masterLv = 60 @@ -367,6 +401,7 @@ class Skill10(PassiveSkill): """ name = '自动防御' + ref = Ref.PERFECTGUARD cellPos = (9,2) learnLv = 5 masterLv = 10 @@ -400,6 +435,7 @@ class Skill11(ActiveSkill): """ name = '盾牌格挡' + ref = Ref.SHIELDGUARD cellPos = (4,3) learnLv = 10 masterLv = 5 @@ -451,6 +487,7 @@ class Skill12(ActiveSkill): """ name = '致命突刺' + ref = Ref.LETHALPUNTO cellPos = (6,3) learnLv = 10 masterLv = 60 @@ -501,6 +538,7 @@ class Skill13(ActiveSkill): """ name = '跳斩' + ref = Ref.FINISH cellPos = (8,3) learnLv = 10 masterLv = 60 @@ -532,6 +570,7 @@ class Skill14(ActiveSkill): """ name = '飞跃截击' + ref = Ref.INTERCEPT cellPos = (1,3) learnLv = 10 masterLv = 60 @@ -566,6 +605,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -593,6 +633,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -622,6 +663,7 @@ class Skill17(PassiveSkill): """ name = '防御姿态' + ref = Ref.DEFENSIVEPOSTURE cellPos = (4,4) learnLv = 15 masterLv = 1 @@ -655,6 +697,7 @@ class Skill18(ActiveSkill): """ name = '破武之轮' + ref = Ref.DISARMING cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -713,6 +756,7 @@ class Skill19(ActiveSkill): """ name = '骑乘召唤' + ref = Ref.RIDING cellPos = (2,4) learnLv = 15 masterLv = 1 @@ -859,6 +903,7 @@ class Skill20(ActiveSkill): """ name = '愤怒冲撞' + ref = Ref.ANCIENTBOAR cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -900,6 +945,7 @@ class Skill21(PassiveSkill): """ name = '骑士守护' + ref = Ref.DEMENTIONMOLT cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -932,6 +978,7 @@ class Skill22(ActiveSkill): """ name = '蔷薇护甲' + ref = Ref.ROSEARMOR cellPos = (9,4) learnLv = 15 masterLv = 20 @@ -975,6 +1022,7 @@ class Skill23(ActiveSkill): """ name = '战吼' + ref = Ref.WARCRY cellPos = (7,4) learnLv = 15 masterLv = 20 @@ -1004,6 +1052,7 @@ class Skill24(PassiveSkill): """ name = '骑士信念' + ref = Ref.STRONGBELIEF cellPos = (1,4) learnLv = 15 masterLv = 10 @@ -1024,7 +1073,12 @@ class Skill24(PassiveSkill): # 装备巨剑时魔法值消耗量减少 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data0, 'type': '*cdReduce', 'exceptSkills': ['天马流星落', '暮光之灵 : 黄昏独角兽', '生命之律·神木擎天']}, {'data': data1, 'type': '$*PAtkP'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*cdReduce', 'exceptSkills': ['天马流星落', '暮光之灵 : 黄昏独角兽', '生命之律·神木擎天']}, {'data': data1, 'type': '$*PAtkP'}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data0)), except_skills=[Ref.CHARGE, Ref.TWILIGHTUNICORN, Ref.FANTASYOFNATURE]), + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data1))), + ] # 伟大的意志 # knight/elven_knight/506e7ed77d517419a6e1c437a2cedb17 @@ -1038,6 +1092,7 @@ class Skill25(ActiveSkill): """ name = '伟大的意志' + ref = Ref.GREATVOLITION cellPos = (8,5) learnLv = 20 masterLv = 1 @@ -1065,6 +1120,7 @@ class Skill26(ActiveSkill): """ name = '审判之盾' + ref = Ref.SENTENCE cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -1104,6 +1160,7 @@ class Skill27(ActiveSkill): """ name = '守护神鹿' + ref = Ref.ANCIENTDEER cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -1139,6 +1196,7 @@ class Skill28(PassiveSkill): """ name = '暴击' + ref = Ref.PHYSICALCRITICALHITUP cellPos = (5,0) learnLv = 20 masterLv = 10 @@ -1164,6 +1222,7 @@ class Skill29(ActiveSkill): """ name = '破甲冲击' + ref = Ref.OVERPOWER cellPos = (7,6) learnLv = 25 masterLv = 60 @@ -1200,6 +1259,7 @@ class Skill30(ActiveSkill): """ name = '自然守护' + ref = Ref.NATUREGUARDIAN cellPos = (9,6) learnLv = 25 masterLv = 20 @@ -1240,6 +1300,7 @@ class Skill31(ActiveSkill): """ name = '剑盾猛攻' + ref = Ref.SHIELDRUSH cellPos = (3,7) learnLv = 30 masterLv = 6 @@ -1273,7 +1334,11 @@ class Skill31(ActiveSkill): mode = ['挥盾', '推进'] - associate = [{'type': '+chain_power', 'data': data3}] + # 迁移前实现(保留对照): + # associate = [{'type': '+chain_power', 'data': data3}] + associate = [ + SkillEffect(attribute=ElvenKnightAttribute.CHAIN_POWER, operation=Operation.ADD, value=Percent(LevelTable(data3))), + ] def setMode(self, mode): if mode == '挥盾': @@ -1292,6 +1357,7 @@ class Skill32(ActiveSkill): """ name = '神木刺击' + ref = Ref.SWORDOFFOREST cellPos = (6,7) learnLv = 30 masterLv = 60 @@ -1326,6 +1392,7 @@ class Skill33(ActiveSkill): """ name = '精灵之跃' + ref = Ref.ELVISHJUMP cellPos = (7,7) learnLv = 30 masterLv = 60 @@ -1363,6 +1430,7 @@ class Skill34(ActiveSkill): """ name = '一刀两断' + ref = Ref.VANGUARDSTRATSH cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1424,6 +1492,7 @@ class Skill35(ActiveSkill): """ name = '铁壁推进' + ref = Ref.PENETRATION cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -1504,6 +1573,7 @@ class Skill36(ActiveSkill): """ name = '自然束缚' + ref = Ref.SHACKLESOFNATURE cellPos = (9,8) learnLv = 35 masterLv = 60 @@ -1558,6 +1628,7 @@ class Skill37(ActiveSkill): """ name = '飓风旋枪' + ref = Ref.LUNGEREVOLUTION cellPos = (6,9) learnLv = 40 masterLv = 60 @@ -1616,6 +1687,7 @@ class Skill38(ActiveSkill): """ name = '天陨断空斩' + ref = Ref.SMASH cellPos = (3,10) learnLv = 45 masterLv = 60 @@ -1673,10 +1745,14 @@ class Skill38(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{"type":"*skillRation","data":[0] + [40]*self.maxLv,"skills":["生命审判"]}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{"type":"*skillRation","data":[0] + [40]*self.maxLv,"skills":["生命审判"]}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [40] * maxLv)), skills=[Ref.SIGNOFLIFE], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 自然恩泽 # knight/elven_knight/4b2c90ec226fd40e967875aa5eabefb2 @@ -1689,6 +1765,7 @@ class Skill39(PassiveSkill): """ name = '自然恩泽' + ref = Ref.NATUREBLESSING cellPos = (6,11) learnLv = 48 masterLv = 40 @@ -1715,7 +1792,14 @@ class Skill39(PassiveSkill): # [生命之律·神木擎天]攻击力增加率 : {value6}% data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{'data': data0, 'type': '*skillDamage'}, {'data': data4, 'type': '*skillDamage', 'skills': ['天马流星落']}, {'data': data5, 'type': '*skillDamage', 'skills': ['暮光之灵 : 黄昏独角兽']}, {'data': data6, 'type': '*skillDamage', 'skills': ['生命之律·神木擎天']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}, {'data': data4, 'type': '*skillDamage', 'skills': ['天马流星落']}, {'data': data5, 'type': '*skillDamage', 'skills': ['暮光之灵 : 黄昏独角兽']}, {'data': data6, 'type': '*skillDamage', 'skills': ['生命之律·神木擎天']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data4)), skills=[Ref.CHARGE]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data5)), skills=[Ref.TWILIGHTUNICORN]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data6)), skills=[Ref.FANTASYOFNATURE]), + ] # 天马流星落 # knight/elven_knight/1fadde0eece18649caddbca7bd58cc2f @@ -1728,6 +1812,7 @@ class Skill40(ActiveSkill): """ name = '天马流星落' + ref = Ref.CHARGE cellPos = (3,11) learnLv = 50 masterLv = 40 @@ -1770,6 +1855,7 @@ class Skill41(ActiveSkill): """ name = '生命审判' + ref = Ref.SIGNOFLIFE cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1825,6 +1911,7 @@ class Skill42(ActiveSkill): """ name = '壁垒突袭' + ref = Ref.SHIELDCHARGE cellPos = (5,13) learnLv = 70 masterLv = 40 @@ -1886,10 +1973,14 @@ class Skill42(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 1: - self.associate = [{'type': '*skillRation', 'data': [0] + [-14.3] * self.maxLv, 'skills': ['愤怒冲撞']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 1: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-14.3] * self.maxLv, 'skills': ['愤怒冲撞']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-14.3] * maxLv)), skills=[Ref.ANCIENTBOAR], when=Equals(Read(SkillAttribute.VP), 1)), + ] # 信仰鼓舞 # knight/elven_knight/2c9d9a36c8401bddff6cdb80fab8dc24 @@ -1901,6 +1992,7 @@ class Skill43(PassiveSkill): """ name = '信仰鼓舞' + ref = Ref.SHIELDOFCOURAGE cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1919,7 +2011,11 @@ class Skill43(PassiveSkill): # 连锁数上限增加 : {value2} data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data1, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data1, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 剑盾强袭 # knight/elven_knight/b89c9ab317bc0a443f6497b7cca2f6a8 @@ -1931,6 +2027,7 @@ class Skill44(ActiveSkill): """ name = '剑盾强袭' + ref = Ref.CHAINSTRIKE cellPos = (4,13) learnLv = 75 masterLv = 40 @@ -1988,6 +2085,7 @@ class Skill45(ActiveSkill): """ name = '自然之怒' + ref = Ref.ANGEROFNATURE cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -2059,6 +2157,7 @@ class Skill46(ActiveSkill): """ name = '暮光之灵 : 黄昏独角兽' + ref = Ref.TWILIGHTUNICORN cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -2107,6 +2206,7 @@ class Skill47(PassiveSkill): """ name = '生命的恩宠' + ref = Ref.GRACEOFLIFE cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -2122,7 +2222,11 @@ class Skill47(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # [剑盾猛攻]能量持续时间 : +5秒 - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # [剑盾猛攻]能量持续时间 : +5秒 # 荆棘之城 @@ -2135,6 +2239,7 @@ class Skill48(ActiveSkill): """ name = '荆棘之城' + ref = Ref.FORTRESSOFEUDIA cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2170,6 +2275,7 @@ class Skill49(ActiveSkill): """ name = '生命之律·神木擎天' + ref = Ref.FANTASYOFNATURE cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/knight/paladin.py b/backend/core/character/GF/knight/paladin.py index b2781053..67ead1ac 100644 --- a/backend/core/character/GF/knight/paladin.py +++ b/backend/core/character/GF/knight/paladin.py @@ -1,6 +1,24 @@ #0ee8fa5dc525c1a1f23fc6911e921e4a from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, + Percent, + ProfessionAttribute, + SkillAttribute, + SkillEffect, +) +from core.character.refs.knight.paladin import PaladinSkillRef as Ref + + +class PaladinAttribute(ProfessionAttribute): + """本职业专用的最终效果属性;字段含义与技能实现保持一致。""" + LITTLE_POWER = 'powerLittle' + """帕拉丁:神光喷涌特殊形态倍率。""" + prefix = "knight/paladin/cn/skillDetail" @@ -16,6 +34,7 @@ class Skill0(ActiveSkill): 只有完全掌握盾挑的人才有资格当上骑士团团长,千万不要小看这个技能。]\n """ name = "盾挑" + ref = Ref.UPPERSHIELD learnLv = 1 masterLv = 10 maxLv = 20 @@ -45,6 +64,7 @@ class Skill1(ActiveSkill): 只有为了国家和君主愿意牺牲小我的人才是真正的骑士。]\n """ name = "强踢" + ref = Ref.LIONKICK learnLv = 1 masterLv = 60 maxLv = 70 @@ -79,6 +99,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -102,6 +123,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -129,6 +151,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -170,6 +193,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -192,6 +216,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -216,6 +241,7 @@ class Skill7(ActiveSkill): [厚重的盾牌本身就是一件强大的武器。 但如果你没有足够的力量的话还是放弃这个想法吧。]\n """ name = "盾击" + ref = Ref.SHIELDSTARK cellPos = (2,2) learnLv = 5 masterLv = 60 @@ -251,6 +277,7 @@ class Skill8(ActiveSkill): [命运之轮开始旋转了。]\n """ name = "命运之轮" + ref = Ref.WHEELOFFORTUNE learnLv = 5 masterLv = 60 maxLv = 70 @@ -280,6 +307,7 @@ class Skill9(PassiveSkill): [利剑和盾牌从来都不是骑士们杀伐的理由,因为他们知道在利剑和盾牌的后面有着他们要保护的人。]\n """ name = "自动防御" + ref = Ref.PERFECTGUARD learnLv = 5 masterLv = 5 maxLv = 20 @@ -309,6 +337,7 @@ class Skill10(ActiveSkill): [原本为帝国贵族剑士所掌握的剑术。 帝国皇帝为了提升骑士团的战斗力,“奉劝”贵族们将秘传剑术传授给骑士们。 迫于压力,贵族剑士只好将一些初级剑术传授给了骑士团。]\n """ name = "致命突刺" + ref = Ref.LETHALPUNTO learnLv = 10 masterLv = 60 maxLv = 70 @@ -344,6 +373,7 @@ class Skill11(ActiveSkill): [这是骑士们在战场上寻找装死敌人时的常用技能,可以让那些丧失抵抗能力的人毫无痛苦地死去。 怜悯,也是骑士的美德之一。]\n """ name = "跳斩" + ref = Ref.FINISH learnLv = 10 masterLv = 60 maxLv = 70 @@ -371,6 +401,7 @@ class Skill12(ActiveSkill): [拿着厚重的盾牌,怎么会跳得这样轻盈?]\n """ name = "飞跃截击" + ref = Ref.INTERCEPT learnLv = 10 masterLv = 60 maxLv = 70 @@ -402,6 +433,7 @@ class Skill13(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -429,6 +461,7 @@ class Skill14(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -460,6 +493,7 @@ class Skill15(ActiveSkill): 而温暖的阳光照耀下来,行人很快就把围巾拿掉了。]\n """ name = "破武之轮" + ref = Ref.DISARMING learnLv = 15 masterLv = 60 maxLv = 70 @@ -502,6 +536,7 @@ class Skill16(PassiveSkill): 在决斗场中,不适用前方防御和光属性赋予功能。\n """ name = "天使降临" + ref = Ref.SERAPHICFALL cellPos = (0,4) learnLv = 15 masterLv = 10 @@ -519,7 +554,11 @@ class Skill16(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 霸体持续时间 : {value2}秒 data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{"data":data1,"type":"$*PAtkP"}] + # 迁移前实现(保留对照): + # associate = [{"data":data1,"type":"$*PAtkP"}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data1))), + ] # 天使光翼 # knight/paladin/9dc8438e4572d39243c97da31c113acc @@ -545,6 +584,7 @@ class Skill17(PassiveSkill): (所受伤害减少效果不与[圣盾]、 [神光庇护]的伤害减少效果叠加)\n """ name = "天使光翼" + ref = Ref.SERAPHICFEATHER cellPos = (1,4) learnLv = 15 masterLv = 10 @@ -632,7 +672,12 @@ class Skill17(PassiveSkill): # 拥有7个天使光翼时 : 5% # 拥有8个天使光翼时 : 10% - associate = [{"data":data0,"type":"$*PAtkP"},{"data":data1,"type":"*cdReduce"}] + # 迁移前实现(保留对照): + # associate = [{"data":data0,"type":"$*PAtkP"},{"data":data1,"type":"*cdReduce"}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data1))), + ] # 神光冲击 # knight/paladin/3fb8395ae3b81bd608e0c4223a8eb534 @@ -643,6 +688,7 @@ class Skill18(ActiveSkill): [神光冲击]攻击成功时,可以获得少量天使光翼,同时被击中的敌人会进入被挑衅状态,集中攻击施放者。\n """ name = "神光冲击" + ref = Ref.WEEPINGWAVE cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -676,6 +722,7 @@ class Skill19(ActiveSkill): 按向前方向键,可以向前移动并进行攻击。\n """ name = "神光连击" + ref = Ref.PURIFYING cellPos = (6,4) learnLv = 15 masterLv = 60 @@ -710,6 +757,7 @@ class Skill20(ActiveSkill): 在决斗场中,防御成功时不进入霸体状态、 不适用伤害无效功能,且圣盾持续时间上限为3秒。\n """ name = "圣盾" + ref = Ref.DIVINESHIELD cellPos = (2,5) learnLv = 20 masterLv = 10 @@ -741,6 +789,7 @@ class Skill21(ActiveSkill): 在决斗场中,突进攻击无法击退霸体状态的敌人。\n """ name = "圣盾突击" + ref = Ref.SHIELDBREAK cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -768,6 +817,7 @@ class Skill22(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -796,6 +846,7 @@ class Skill23(ActiveSkill): 小型神光喷涌的攻击力以[神光喷涌]攻击力的一定比率适用。\n """ name = "神光喷涌" + ref = Ref.WRATH cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -840,6 +891,7 @@ class Skill24(ActiveSkill): 爆发光之力,强化自身的基本攻击力和技能攻击力。\n """ name = "信仰之念" + ref = Ref.FAITHFUL cellPos = (7,7) learnLv = 30 masterLv = 10 @@ -866,6 +918,7 @@ class Skill25(ActiveSkill): 被击中的敌人会旋转飞出。\n """ name = "神光盾击" + ref = Ref.RETRIBUTION cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -905,6 +958,7 @@ class Skill26(ActiveSkill): 被盾牌击中的敌人会砸到地面后再弹起。\n """ name = "烈光" + ref = Ref.DISRUPTION cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -941,6 +995,7 @@ class Skill27(ActiveSkill): 按向前方向键,可以向前移动并进行攻击。\n """ name = "神光闪耀" + ref = Ref.CONFESION cellPos = (1,8) learnLv = 35 masterLv = 60 @@ -993,6 +1048,7 @@ class Skill28(ActiveSkill): 按向前方向键,可以短距离向前移动并进行攻击。 最后一击前按向后方向键,可以在原地发动最后一击。\n """ name = "神光闪影击" + ref = Ref.FORGIVENESS cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -1049,6 +1105,7 @@ class Skill29(ActiveSkill): 垂直掉落由光凝聚而成的惩罚之锤,引发爆炸,对范围内的敌人造成伤害。\n """ name = "惩罚之锤" + ref = Ref.ESTRANGEMENT cellPos = (4,9) learnLv = 40 masterLv = 60 @@ -1100,6 +1157,7 @@ class Skill30(ActiveSkill): 按前方向键,可以跳得更远。\n """ name = "神光之跃" + ref = Ref.CONCILIATION cellPos = (6,10) learnLv = 45 masterLv = 60 @@ -1152,6 +1210,7 @@ class Skill31(PassiveSkill): 天界之力进一步集中到帕拉丁身上,增加光盾大小和物理攻击力,并且进入地下城时可以获得一定数量的天使光翼。\n """ name = "荣耀之光" + ref = Ref.GLORYOFTHELIGHT cellPos = (7,11) learnLv = 48 masterLv = 40 @@ -1166,7 +1225,11 @@ class Skill31(PassiveSkill): # 物理攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) # 天使光翼获得量 : 2个 - associate = [{"data":data0,"type":"$*PAtkP"}] + # 迁移前实现(保留对照): + # associate = [{"data":data0,"type":"$*PAtkP"}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 天使光翼获得量 : 2个 # 信仰聚合 : 神光惩戒 @@ -1179,6 +1242,7 @@ class Skill32(ActiveSkill): 神光爆炸时,会消耗所有天使光翼,使范围内的敌人受到伤害。 技能结束时,天使光翼吸收到最大值。\n """ name = "信仰聚合 : 神光惩戒" + ref = Ref.PRICEOFMISTRUST cellPos = (4,11) learnLv = 50 masterLv = 40 @@ -1210,6 +1274,7 @@ class Skill33(ActiveSkill): 在持续时间内按跳跃键可以解除神光庇护状态。\n """ name = "神光庇护" + ref = Ref.DIVINESANCTUARY cellPos = (2,12) learnLv = 60 masterLv = 1 @@ -1261,6 +1326,7 @@ class Skill34(ActiveSkill): 释放的光束对范围内的敌人造成伤害,并使敌人进入眩晕状态。\n """ name = "圣盾裁决" + ref = Ref.INTEGRATION cellPos = (5,12) learnLv = 60 masterLv = 40 @@ -1321,6 +1387,7 @@ class Skill35(ActiveSkill): 可以利用方向键调整降落地点。\n """ name = "破晓之光" + ref = Ref.MANDATEOFHEAVEN cellPos = (1,13) learnLv = 70 masterLv = 40 @@ -1370,6 +1437,7 @@ class Skill36(PassiveSkill): 奉行伟大意志、 执行天命的破晓女神进入地下城时,获得更多天使光翼,并增加基本攻击力和技能攻击力。\n """ name = "戒律" + ref = Ref.COMMANDMENT cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1386,7 +1454,11 @@ class Skill36(PassiveSkill): # 天使光翼获得量 : {value1}个 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 神光回旋斩 # knight/paladin/0e3da11226dd30c2aaef52e36eff7f3f @@ -1396,6 +1468,7 @@ class Skill37(ActiveSkill): 将盾牌中凝聚的光之力挥洒到周围,吸附范围内的敌人,然后挥动武器上挑攻击敌人。\n """ name = "神光回旋斩" + ref = Ref.OBSTRUCTION cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1446,6 +1519,7 @@ class Skill38(ActiveSkill): 将武器中凝聚的光之力注入地面并向四周喷涌,对敌人造成多段攻击伤害。\n """ name = "神圣信约" + ref = Ref.ENGAGEMENT cellPos = (2,14) learnLv = 80 masterLv = 40 @@ -1497,6 +1571,7 @@ class Skill39(ActiveSkill): 技能结束时,天使光翼汲取到最大值。\n """ name = "神圣意志 : 大天使降临" + ref = Ref.JUDGEMENTCALL cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1530,6 +1605,7 @@ class Skill40(PassiveSkill): 小型神光喷涌的攻击力以[神光喷涌]攻击力的一定比率适用。\n """ name = "超越之翼" + ref = Ref.WINGOFMETATRON cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1554,7 +1630,12 @@ class Skill40(PassiveSkill): # 天使光翼获得量 : {value4}个 data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{"data":data0},{"data":data1,"type":"+powerLittle","skills":["神光喷涌"]}] + # 迁移前实现(保留对照): + # associate = [{"data":data0},{"data":data1,"type":"+powerLittle","skills":["神光喷涌"]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=PaladinAttribute.LITTLE_POWER, operation=Operation.ADD, value=Percent(LevelTable(data1)), skills=[Ref.WRATH]), + ] # 神光耀世 # knight/paladin/481348575c1e141925c836b59c5db3ca @@ -1566,6 +1647,7 @@ class Skill41(ActiveSkill): 施放技能时,在装备梅丹佐的盾牌之前,天使光翼汲取到最大值。\n """ name = "神光耀世" + ref = Ref.TRANSCENDENCE cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1608,6 +1690,7 @@ class Skill42(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "启示录 : 末日救赎" + ref = Ref.THELASTREVELATION cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/mage_female/battle_mage.py b/backend/core/character/GF/mage_female/battle_mage.py index 59fa53b1..a6378029 100644 --- a/backend/core/character/GF/mage_female/battle_mage.py +++ b/backend/core/character/GF/mage_female/battle_mage.py @@ -3,6 +3,24 @@ from core.basic.roleinfo import CharacterEquipInfo from core.basic.formula import 武器强化计算 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, + Percent, + ProfessionAttribute, + SkillAttribute, + SkillEffect, +) +from core.character.refs.mage_female.battle_mage import BattleMageSkillRef as Ref + + +class BattleMageAttribute(ProfessionAttribute): + """本职业专用的最终效果属性;字段含义与技能实现保持一致。""" + USE_CHANGE = 'useChange' + """战斗法师:是否启用煌龙偃月的替代形态。""" + prefix = "mage_female/battle_mage/cn/skillDetail" @@ -14,6 +32,7 @@ class Skill0(ActiveSkill): 向前方敌人发射魔法星弹,可以用方向键调整魔法星弹的飞行方向。\n """ name = "魔法星弹" + ref = Ref.MAGICMISSILE learnLv = 1 masterLv = 60 maxLv = 70 @@ -46,6 +65,7 @@ class Skill1(ActiveSkill): 转职为魔道学者后,技能类型变为独立攻击力。\n """ name = '天击' + ref = Ref.UPPERSWING cellPos = (4,1) learnLv = 1 masterLv = 10 @@ -71,6 +91,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -94,6 +115,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -111,7 +133,11 @@ class Skill3(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['炫纹']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['炫纹']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.CHASER]), + ] # 受身蹲伏 # mage_female/battle_mage/ce26c6b69d02a440a81b552bec94f03b @@ -121,6 +147,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -152,6 +179,7 @@ class Skill5(PassiveSkill): 在决斗场中,无法转换攻击类型,适用技能固有的攻击类型。\n """ name = "攻击类型转换" + ref = Ref.CONVERSION learnLv = 1 masterLv = 1 maxLv = 1 @@ -186,6 +214,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -208,6 +237,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -230,6 +260,7 @@ class Skill8(ActiveSkill): 用武器用力击刺敌人使其进入较长时间的僵直状态。\n """ name = '龙牙' + ref = Ref.THRUST cellPos = (4,2) learnLv = 5 masterLv = 60 @@ -256,6 +287,7 @@ class Skill9(ActiveSkill): 转职为战斗法师后,可学习[魔法护盾强化],加强能力。\n """ name = "魔法护盾" + ref = Ref.AURASHIELD learnLv = 5 masterLv = 10 maxLv = 20 @@ -288,6 +320,7 @@ class Skill10(ActiveSkill): 在普通决斗场根据转职而产生不同的冷却时间。\n """ name = '替身草人' + ref = Ref.WARPONDAMAGE cellPos = (8,3) learnLv = 10 masterLv = 10 @@ -335,6 +368,7 @@ class Skill11(PassiveSkill): [魔法护盾]自动施放功能,不适用于决斗场。\n """ name = '魔法护盾强化' + ref = Ref.AURASHIELDMASTERY cellPos = (6,3) learnLv = 10 masterLv = 1 @@ -362,6 +396,7 @@ class Skill12(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -389,6 +424,7 @@ class Skill13(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -422,6 +458,7 @@ class Skill14(PassiveSkill): - 除[炫纹]、 [超级炫纹]、 [炫纹强压]、 [炫纹簇]、 [炫纹之源 : 太古神光]外的所有转职系列技能\n """ name = '尼巫的战术' + ref = Ref.ENABLEFINISHATTACK cellPos = (1,4) learnLv = 15 masterLv = 1 @@ -435,8 +472,12 @@ class Skill14(PassiveSkill): # 物理、 魔法暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), ] # 落花掌 @@ -450,6 +491,7 @@ class Skill15(ActiveSkill): 转职为战斗法师后,才可以强制中断当前动作,并立即施放该技能。\n """ name = '落花掌' + ref = Ref.HANDSTRIKE cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -482,6 +524,7 @@ class Skill16(ActiveSkill): 驱散敌人的增益效果时,提升自身的力量和智力,每驱散1个,可以额外提升。\n """ name = '驱散魔法' + ref = Ref.DISENCHANT cellPos = (9,4) learnLv = 15 masterLv = 10 @@ -527,6 +570,7 @@ class Skill17(ActiveSkill): 对无法抓取的敌人不适用控制效果,只适用直刺攻击。\n """ name = '圆舞棍' + ref = Ref.POKETHROW cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -559,6 +603,7 @@ class Skill18(PassiveSkill): 延长连击技能的时间间隔,从而提高连击成功率。\n """ name = '连击精通' + ref = Ref.COMBOINSTINCT cellPos = (2,1) learnLv = 15 masterLv = 1 @@ -584,6 +629,7 @@ class Skill19(ActiveSkill): 在决斗中,无法向没有被武器直接击中的敌人发射炫纹。\n """ name = '炫纹' + ref = Ref.CHASER cellPos = (5,4) learnLv = 15 masterLv = 1 @@ -617,7 +663,11 @@ class Skill19(ActiveSkill): # 暴击率增加 : {value9}% data9 = get_data(f'{prefix}/{uuid}', 9) - associate = [{'type': '*skillDamage', 'data': data6}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data6}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data6))), + ] # 实战型替身草人 # mage_female/battle_mage/fc30c667a58e1dd54b5d214e04f4f23c @@ -629,6 +679,7 @@ class Skill20(PassiveSkill): 同时不再在战场上生成替身草人,而是直接生效增加移动速度和攻击速度的增益效果。\n """ name = '实战型替身草人' + ref = Ref.WARPONDAMAGEBM cellPos = (8,4) learnLv = 15 masterLv = 1 @@ -645,7 +696,11 @@ class Skill20(PassiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 替身草人冷却时间减少 : {value3}秒 data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'type': '+cdCut', 'skills': ['替身草人'], 'data': data3, 'ratio': 1}] + # 迁移前实现(保留对照): + # associate = [{'type': '+cdCut', 'skills': ['替身草人'], 'data': data3, 'ratio': 1}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD_CUT, operation=Operation.ADD, value=LevelTable(data3), skills=[Ref.WARPONDAMAGE]), + ] # 战斗法师武器精通 # mage_female/battle_mage/27bade584bb42fef68148d3a0b72bace @@ -662,6 +717,7 @@ class Skill21(PassiveSkill): 决斗场不适用攻击力修正功能和技能功能强化效果。\n """ name = '战斗法师武器精通' + ref = Ref.BATTLEMAGEWEAPONMASTERY cellPos = (1,5) learnLv = 20 masterLv = 20 @@ -685,10 +741,16 @@ class Skill21(PassiveSkill): data5 = get_data(f'{prefix}/{uuid}', 5) # 装备矛时,技能攻击范围增加率 : {value6}% data6 = get_data(f'{prefix}/{uuid}', 6) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkP', 'data': data0}, + # {'type': '$*PAtkM', 'data': data0}, + # {'type': '*cdReduce', 'data': data2, 'exceptSkills': ['星纹陨爆', '一骑当千碎霸', '太古星河·殒灭']}, + # ] associate = [ - {'type': '$*PAtkP', 'data': data0}, - {'type': '$*PAtkM', 'data': data0}, - {'type': '*cdReduce', 'data': data2, 'exceptSkills': ['星纹陨爆', '一骑当千碎霸', '太古星河·殒灭']}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data2)), except_skills=[Ref.QUASAREXPLOSION, Ref.AVATARFINISH, Ref.EXTICION]), ] # 双重锤击 @@ -700,6 +762,7 @@ class Skill22(ActiveSkill): 2次攻击都会产生冲击波,并使周围的敌人受到伤害。\n """ name = '双重锤击' + ref = Ref.DOUBLESWING cellPos = (4,5) learnLv = 20 masterLv = 60 @@ -734,6 +797,7 @@ class Skill23(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -757,6 +821,7 @@ class Skill24(ActiveSkill): 在增益效果持续时间内,增加战斗法师的基本攻击力和技能攻击力。\n """ name = '战斗本能' + ref = Ref.GODDESSOFWAR cellPos = (6,5) learnLv = 20 masterLv = 1 @@ -783,6 +848,7 @@ class Skill25(ActiveSkill): 在决斗场施放时,不适用霸体效果及多段间隔时间减少效果。\n """ name = '炫纹爆弹' + ref = Ref.TIMERBOMB cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -821,6 +887,7 @@ class Skill26(ActiveSkill): 大幅度挥动武器,使大范围内的所有敌人受到伤害。\n """ name = '碎霸' + ref = Ref.SWING cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -853,6 +920,7 @@ class Skill27(ActiveSkill): 在决斗场中,拥有2个以上的炫纹时才能施放,打击后技能激活时间变短,被击中的对象会浮空。\n """ name = '超级炫纹' + ref = Ref.SUPERCHASER cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -886,6 +954,7 @@ class Skill28(ActiveSkill): 融合的炫纹数量越多,攻击范围越大。\n """ name = '炫纹强压' + ref = Ref.CHASERSEXPLOSION cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -940,6 +1009,7 @@ class Skill29(ActiveSkill): 决斗场中,如果没有造成连击,则连续直刺的速度将降低,炫纹发射的冷却时间也不会减少。\n """ name = '流星闪影击' + ref = Ref.RANDOMPIERCESTRIKE cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -1003,6 +1073,7 @@ class Skill30(ActiveSkill): 在决斗场中,普通施放和蓄气中,无法进入霸体状态。只有蓄气达最大值后发动时,突进攻击才会进入霸体状态。\n """ name = '强袭流星打' + ref = Ref.STRENGTHHANDSTRIKE cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -1057,6 +1128,7 @@ class Skill31(ActiveSkill): 学习[煌龙乱舞]后,删除将敌人推到刀尖部的功能,变更为用煌龙偃月刀快速连续攻击敌人的技能。\n """ name = '煌龙偃月' + ref = Ref.DRAGONSPEAR cellPos = (6,10) learnLv = 45 masterLv = 60 @@ -1145,6 +1217,7 @@ class Skill32(PassiveSkill): 施放时,连续按键将以更快的速度施放乱舞,按前方向键,将向前移动并攻击。\n """ name = '煌龙乱舞' + ref = Ref.DRAGONDANCE cellPos = (7,10) learnLv = 45 masterLv = 1 @@ -1153,7 +1226,11 @@ class Skill32(PassiveSkill): rangeLv = 2 uuid = '573723c8c0614f5b1218ca9ff992115b' - associate = [{'type': '+useChange', 'data': [0, 100], 'skills': ['煌龙偃月']}] + # 迁移前实现(保留对照): + # associate = [{'type': '+useChange', 'data': [0, 100], 'skills': ['煌龙偃月']}] + associate = [ + SkillEffect(attribute=BattleMageAttribute.USE_CHANGE, operation=Operation.ADD, value=Percent(LevelTable([0, 100])), skills=[Ref.DRAGONSPEAR]), + ] # 斗神意志 @@ -1165,6 +1242,7 @@ class Skill33(PassiveSkill): 增加基本攻击力和技能攻击力。 连击数越高,攻击速度、 移动速度和回避率越大。(最多可提升三个阶段)\n """ name = '斗神意志' + ref = Ref.COMBOMASTERY cellPos = (1,11) learnLv = 48 masterLv = 40 @@ -1203,8 +1281,12 @@ class Skill33(PassiveSkill): # 回避率增加 : {value12}% data12 = get_data(f'{prefix}/{uuid}', 12) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), ] # 星纹陨爆 @@ -1216,6 +1298,7 @@ class Skill34(ActiveSkill): 在[使徒化身]、 [太古化身]状态下施放技能时,有单独的施放动作。\n """ name = '星纹陨爆' + ref = Ref.QUASAREXPLOSION cellPos = (4,11) learnLv = 50 masterLv = 40 @@ -1240,6 +1323,7 @@ class Skill35(ActiveSkill): 大幅挥动武器,对大范围内敌人造成巨大伤害。\n """ name = '闪击碎霸' + ref = Ref.SWINGEX cellPos = (2,12) learnLv = 60 masterLv = 40 @@ -1297,6 +1381,7 @@ class Skill36(ActiveSkill): 技能施放时按前方向键,会向前移动进行下劈。\n """ name = '煌龙天临' + ref = Ref.DRAGONSPEARADVENT cellPos = (6,13) learnLv = 70 masterLv = 40 @@ -1348,6 +1433,7 @@ class Skill37(PassiveSkill): 学习战灵潜能时,生成的炫纹形态发生变化。\n """ name = '战灵潜能' + ref = Ref.MULTIROLE cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1363,8 +1449,12 @@ class Skill37(PassiveSkill): # 物理暴击率和魔法暴击率补正比率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), ] # 炫纹簇 @@ -1378,6 +1468,7 @@ class Skill38(ActiveSkill): 经过一定时间后,炫纹簇自动爆炸。\n """ name = '炫纹簇' + ref = Ref.CHASERCLUSTER cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1434,6 +1525,7 @@ class Skill39(ActiveSkill): 在[太古化身]、 [使徒化身]状态下,会大幅减少攻击前僵直。\n """ name = '使徒之舞' + ref = Ref.AVATARDANCE cellPos = (7,14) learnLv = 80 masterLv = 40 @@ -1516,6 +1608,7 @@ class Skill40(ActiveSkill): [使徒化身]的技能等级和[一骑当千碎霸]的技能等级同步提升。\n """ name = "使徒化身" + ref = Ref.AVATAR learnLv = 85 masterLv = 1 maxLv = 40 @@ -1556,6 +1649,7 @@ class Skill41(PassiveSkill): 变身过程中控制型异常状态的抗性增加量不变。\n """ name = '使徒封印' + ref = Ref.AVATARPASSIVE cellPos = (1,14) learnLv = 85 masterLv = 1 @@ -1575,6 +1669,7 @@ class Skill42(ActiveSkill): 解除[使徒化身]、 [太古化身]的变身状态,变回战斗法师。\n """ name = '解除变身' + ref = Ref.RETURNTOBM cellPos = (2,14) learnLv = 85 masterLv = 1 @@ -1595,6 +1690,7 @@ class Skill43(ActiveSkill): 若在[使徒化身]、 [太古化身]变身状态下施放技能,则维持变身状态。\n """ name = '一骑当千碎霸' + ref = Ref.AVATARFINISH cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1621,6 +1717,7 @@ class Skill44(PassiveSkill): 即使没有击中敌人,施放时会搜索周围最强的敌人并攻击。\n """ name = '太古之力' + ref = Ref.ARMONIA cellPos = (3,15) learnLv = 95 masterLv = 40 @@ -1632,8 +1729,12 @@ class Skill44(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), ] # 炫纹之源 : 太古神光 @@ -1647,6 +1748,7 @@ class Skill45(ActiveSkill): 若在普希娅变身状态下施放技能,则攻击后也维持变身状态。\n """ name = '炫纹之源 : 太古神光' + ref = Ref.LAYOFPRIMITIVE cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1664,7 +1766,7 @@ class Skill45(ActiveSkill): def skillInfo(self, lv=0): data = super().skillInfo(lv) - sub = self.char.GetSkillByName('炫纹') + sub = self.char.GetSkill(Ref.CHASER) subData = sub.getSkillData(sub.lv) return data[0] + subData * 10 * sub.skillRation, data[1], data[2] @@ -1689,6 +1791,7 @@ class Skill46(ActiveSkill): [太古化身]的技能等级和[太古星河·殒灭]技能等级同步提升。\n """ name = '太古化身' + ref = Ref.PRECENCIA cellPos = (2,16) learnLv = 100 masterLv = 1 @@ -1732,6 +1835,7 @@ class Skill47(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = '太古星河·殒灭' + ref = Ref.EXTICION cellPos = (5,16) learnLv = 100 masterLv = 40 @@ -1779,7 +1883,7 @@ class classChange(Character): super().__init__(equVersion, __name__) def calc_weapon(self, cur: CharacterEquipInfo): - if cur.equInfo.itemDetailType in ['矛', '棍棒'] and self.GetSkillByName('战斗法师武器精通').lv > 0: + if cur.equInfo.itemDetailType in ['矛', '棍棒'] and self.GetSkill(Ref.BATTLEMAGEWEAPONMASTERY).lv > 0: cur.equInfo.AtkM = cur.equInfo.AtkP # 传世武器强化系数取所有武器的最高的1.12 if '传世武器' in cur.equInfo.categorize: diff --git a/backend/core/character/GF/mage_female/elementalist.py b/backend/core/character/GF/mage_female/elementalist.py index efca5963..d575a74a 100644 --- a/backend/core/character/GF/mage_female/elementalist.py +++ b/backend/core/character/GF/mage_female/elementalist.py @@ -1,6 +1,17 @@ #3909d0b188e9c95311399f776e331da5 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.mage_female.elementalist import ElementalistSkillRef as Ref prefix = "mage_female/elementalist/cn/skillDetail" @@ -12,6 +23,7 @@ class Skill0(ActiveSkill): 向前方敌人发射魔法星弹,可以用方向键调整魔法星弹的飞行方向。\n """ name = "魔法星弹" + ref = Ref.MAGICMISSILE learnLv = 1 masterLv = 60 maxLv = 70 @@ -45,6 +57,7 @@ class Skill1(ActiveSkill): 转职为魔道学者后,技能类型变为独立攻击力。\n """ name = "天击" + ref = Ref.UPPERSWING learnLv = 1 masterLv = 10 maxLv = 20 @@ -73,6 +86,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -96,6 +110,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -123,6 +138,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -164,6 +180,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -186,6 +203,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -208,6 +226,7 @@ class Skill7(ActiveSkill): 用武器用力击刺敌人使其进入较长时间的僵直状态。\n """ name = "龙牙" + ref = Ref.THRUST learnLv = 5 masterLv = 60 maxLv = 70 @@ -236,6 +255,7 @@ class Skill8(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "杰克爆弹" + ref = Ref.LAUNCHJOL learnLv = 5 masterLv = 60 maxLv = 70 @@ -276,6 +296,7 @@ class Skill9(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "光电鳗" + ref = Ref.LAUNCHFLUORESCENT learnLv = 5 masterLv = 60 maxLv = 70 @@ -315,6 +336,7 @@ class Skill10(ActiveSkill): 若掌握[心灵感应],则附加 : 棒暴击\n """ name = "契约召唤 : 赫德尔" + ref = Ref.SUMMONHODOR learnLv = 5 masterLv = 60 maxLv = 70 @@ -380,6 +402,7 @@ class Skill11(ActiveSkill): 转职为战斗法师后,可学习[魔法护盾强化],加强能力。\n """ name = "魔法护盾" + ref = Ref.AURASHIELD learnLv = 5 masterLv = 10 maxLv = 20 @@ -409,6 +432,7 @@ class Skill12(ActiveSkill): 对无法抓取的敌人不适用控制效果,箴言人偶不附着在敌人身上,直接爆炸; 即使附着成功也不会进入无敌状态。\n """ name = "别过来!" + ref = Ref.KEEPOUT learnLv = 5 masterLv = 60 maxLv = 70 @@ -439,6 +463,7 @@ class Skill13(ActiveSkill): 在普通决斗场根据转职而产生不同的冷却时间。\n """ name = "替身草人" + ref = Ref.WARPONDAMAGE learnLv = 10 masterLv = 10 maxLv = 20 @@ -488,6 +513,7 @@ class Skill14(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "冰霜雪人" + ref = Ref.LAUNCHFROSTHEAD learnLv = 10 masterLv = 60 maxLv = 70 @@ -539,6 +565,7 @@ class Skill15(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "暗影夜猫" + ref = Ref.LAUNCHBLACKCAT learnLv = 10 masterLv = 60 maxLv = 70 @@ -579,6 +606,7 @@ class Skill16(ActiveSkill): 蚀附着在鞭挞范围内的召唤兽身上时,额外增加攻击、 移动速度; 蚀附着在敌人身上时,蚕食敌人的身体,造成伤害。\n """ name = "鞭挞" + ref = Ref.WHIP learnLv = 10 masterLv = 60 maxLv = 70 @@ -638,6 +666,7 @@ class Skill17(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -665,6 +694,7 @@ class Skill18(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -693,6 +723,7 @@ class Skill19(ActiveSkill): 转职为战斗法师后,才可以强制中断当前动作,并立即施放该技能。\n """ name = "落花掌" + ref = Ref.HANDSTRIKE learnLv = 15 masterLv = 60 maxLv = 70 @@ -727,6 +758,7 @@ class Skill20(PassiveSkill): 在决斗场,技能的施放时间减少效果和下级元素技能的蓄气时间上限额外减少效果不生效。\n """ name = "魔法记忆" + ref = Ref.CASTSPEEDUP learnLv = 15 masterLv = 1 maxLv = 11 @@ -758,6 +790,7 @@ class Skill21(ActiveSkill): 驱散敌人的增益效果时,提升自身的力量和智力,每驱散1个,可以额外提升。\n """ name = "驱散魔法" + ref = Ref.DISENCHANT learnLv = 15 masterLv = 10 maxLv = 20 @@ -808,6 +841,7 @@ class Skill22(PassiveSkill): 在决斗场,移动过程中被攻击时,所受伤害增加。\n """ name = "移动施法" + ref = Ref.MOVEONCAST learnLv = 15 masterLv = 1 maxLv = 11 @@ -834,6 +868,7 @@ class Skill23(PassiveSkill): 空中使用时无法进行蓄气。\n """ name = "空中施放 : 杰克爆弹" + ref = Ref.LAUNCHJOLONJUMP learnLv = 15 masterLv = 1 maxLv = 1 @@ -855,6 +890,7 @@ class Skill24(ActiveSkill): 施放过程中,可以用方向键指定火柱喷出位置。\n """ name = "烈焰冲击" + ref = Ref.FLAMESTRIKE learnLv = 15 masterLv = 60 maxLv = 70 @@ -890,6 +926,7 @@ class Skill25(ActiveSkill): 觉醒技能、 无施放时间的技能、 物理技能、 增益技能不适用冷却时间减少效果。\n """ name = "魔法秀" + ref = Ref.MAGICALTEMPOUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -912,28 +949,18 @@ class Skill25(ActiveSkill): # 蓄气时间上限减少率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - _ratio = 1 + ratio = 1.0 - associate = [{"type":"*cdRatio","data":data1,"skills":['冰墙', '元素之门', '元素之幕', '元素震荡', '圣灵水晶', '烈焰冲击','天雷', '雷旋', '杰克降临', '湮灭黑洞', '极冰盛宴', '虚无之球', '光与暗的交响']}] - - @property - def ratio(self): - return self._ratio - - @ratio.setter - def ratio(self, value): - if self._ratio != value: - data = self.associate[0] - ratio = (1 - data['data'][self.lv] / 100 * value) / (1 - data['data'][self.lv] / 100 * self._ratio) - for item in data['skills']: - skill = self.char.GetSkillByName(item) - if skill is not None: - skill.cdRatio *= ratio - self._ratio = value + # 迁移前实现(保留对照): + # associate = [{"type":"*cdRatio","data":data1,"skills":['冰墙', '元素之门', '元素之幕', '元素震荡', '圣灵水晶', '烈焰冲击','天雷', '雷旋', '杰克降临', '湮灭黑洞', '极冰盛宴', '虚无之球', '光与暗的交响']}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD_RATIO, value=1 - (Percent(LevelTable(data1)) * Read(SkillAttribute.RATIO)), skills=[Ref.WALLOFICE, Ref.THEGATE, Ref.ELEMENTALCURTAIN, Ref.ELEMENTALQUAKE, Ref.CRYSTALOFOVERMIND, Ref.FLAMESTRIKE, Ref.THUNDERCALLING, Ref.SUNBURST, Ref.HALLOWEENBUSTER, Ref.NIGHTHOLLOW, Ref.ARCTICPISTE, Ref.VOID, Ref.THUNDERRAGE]), + ] # 技能等级变化的时候,系数对应的数值变化 - def update_skill_attribute(self, skill, type, old, new, data, ratio=100, weapon=(), weapon_type=None, weapon_options=()): - super().update_skill_attribute(skill, type, old, new, data, ratio / self.ratio, weapon, weapon_type, weapon_options) + # 迁移前实现(保留对照): + # def update_skill_attribute(self, skill, type, old, new, data, ratio=100, weapon=(), weapon_type=None, weapon_options=()): + # super().update_skill_attribute(skill, type, old, new, data, ratio / self.ratio, weapon, weapon_type, weapon_options) # 虚无之球 # mage_female/elementalist/5dc7008b12a459325b548b0715c6b73c @@ -946,6 +973,7 @@ class Skill26(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "虚无之球" + ref = Ref.VOID learnLv = 20 masterLv = 60 maxLv = 70 @@ -987,6 +1015,7 @@ class Skill27(ActiveSkill): 被点燃的属性标志越多,增加基本攻击力和技能攻击力就越多。\n """ name = "元素点燃" + ref = Ref.ELEMENTALCHAIN learnLv = 20 masterLv = 15 maxLv = 25 @@ -1022,6 +1051,7 @@ class Skill28(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -1046,6 +1076,7 @@ class Skill29(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "雷旋" + ref = Ref.SUNBURST learnLv = 25 masterLv = 60 maxLv = 70 @@ -1082,6 +1113,7 @@ class Skill30(ActiveSkill): 在决斗场中,冰墙攻击不附加减速状态。\n """ name = "冰墙" + ref = Ref.WALLOFICE learnLv = 25 masterLv = 60 maxLv = 70 @@ -1123,6 +1155,7 @@ class Skill31(PassiveSkill): 并减少施放技能时的魔法值消耗量。\n """ name = "属性精通" + ref = Ref.ELEMENTMASTERY learnLv = 30 masterLv = 5 maxLv = 15 @@ -1139,28 +1172,18 @@ class Skill31(PassiveSkill): # 所有属性抗性增加值 : {value1} data1 = get_data(f'{prefix}/{uuid}', 1) - _ratio = 1 + ratio = 1.0 - associate = [{"type":"*skillDamage","data":data0}] - - @property - def ratio(self): - return self._ratio - - @ratio.setter - def ratio(self, value): - if self._ratio != value: - data = self.associate[0] - ratio = (1 + data['data'][self.lv] / 100 * value) / (1 + data['data'][self.lv] / 100 * self._ratio) - for item in self.char.GetSkillNames('all', True): - skill = self.char.GetSkillByName(item) - if skill is not None: - skill.skillRation *= ratio - self._ratio = value + # 迁移前实现(保留对照): + # associate = [{"type":"*skillDamage","data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + (Percent(LevelTable(data0)) * Read(SkillAttribute.RATIO))), + ] # 技能等级变化的时候,系数对应的数值变化 - def update_skill_attribute(self, skill, type, old, new, data, ratio=100, weapon=(), weapon_type=None, weapon_options=()): - super().update_skill_attribute(skill, type, old, new, data, ratio / self.ratio, weapon, weapon_type, weapon_options) + # 迁移前实现(保留对照): + # def update_skill_attribute(self, skill, type, old, new, data, ratio=100, weapon=(), weapon_type=None, weapon_options=()): + # super().update_skill_attribute(skill, type, old, new, data, ratio / self.ratio, weapon, weapon_type, weapon_options) # 天雷 # mage_female/elementalist/d2c6df5105577fb59fb92529a36165a0 @@ -1175,6 +1198,7 @@ class Skill32(ActiveSkill): 在决斗场,蓄气时间越长攻击力越高,但不会增加闪电大小,发射所有闪电后,进入冷却时间。\n """ name = "天雷" + ref = Ref.THUNDERCALLING learnLv = 35 masterLv = 60 maxLv = 70 @@ -1243,6 +1267,7 @@ class Skill33(PassiveSkill): 在决斗场内,技能冷却时间变更为30秒,变更为发射相当于[天雷]发射数量攻击力增加率总和的1次闪电攻击。\n """ name = "天雷冲击" + ref = Ref.THUNDERSTRIKEEX learnLv = 35 masterLv = 1 maxLv = 1 @@ -1258,9 +1283,14 @@ class Skill33(PassiveSkill): # [天雷]攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) # [天雷]发射间隔减少率 : 50% + # 迁移前实现(保留对照): + # associate = [ + # {"type":"+cd","data":[0,5],"skills":["天雷"],"ratio":1}, + # {"type":"*skillDamage","data":data0,"skills":["天雷"]} + # ] associate = [ - {"type":"+cd","data":[0,5],"skills":["天雷"],"ratio":1}, - {"type":"*skillDamage","data":data0,"skills":["天雷"]} + SkillEffect(attribute=SkillAttribute.CD, operation=Operation.ADD, value=LevelTable([0, 5]), skills=[Ref.THUNDERCALLING]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.THUNDERCALLING]), ] # [天雷]发射间隔减少率 : 50% @@ -1275,6 +1305,7 @@ class Skill34(ActiveSkill): 在决斗场中蓄气后施放时,增加攻击力; 再次按技能键,无法立即爆炸。\n """ name = "湮灭黑洞" + ref = Ref.NIGHTHOLLOW learnLv = 40 masterLv = 60 maxLv = 70 @@ -1346,6 +1377,7 @@ class Skill35(ActiveSkill): 在决斗场,增加寒冰柱的攻击间隔; 蓄气时间越长,攻击力越大,蓄满时减少魔法阵内敌人的移动速度; 魔法阵大小随技能等级提升而增加。\n """ name = "极冰盛宴" + ref = Ref.ARCTICPISTE learnLv = 40 masterLv = 60 maxLv = 70 @@ -1419,6 +1451,7 @@ class Skill36(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "杰克降临" + ref = Ref.HALLOWEENBUSTER learnLv = 45 masterLv = 60 maxLv = 70 @@ -1479,6 +1512,7 @@ class Skill37(PassiveSkill): 魔法使用娴熟的大魔导师的魔力进一步变强,可以使用更高级的魔法,增加自身魔法攻击力和魔法暴击率。\n """ name = "魔力增幅" + ref = Ref.ELEMENTALWEAK learnLv = 48 masterLv = 40 maxLv = 50 @@ -1495,7 +1529,11 @@ class Skill37(PassiveSkill): # 魔法暴击率增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"type":"$*PAtkM","data":data0}] + # 迁移前实现(保留对照): + # associate = [{"type":"$*PAtkM","data":data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable(data0))), + ] # 陨星幻灭 # mage_female/elementalist/b3659936a9a74c4ed6f7faf07cca1f9e @@ -1509,6 +1547,7 @@ class Skill38(ActiveSkill): [陨星幻灭]施放过程中按技能键或跳跃键,可以立即砸落最终结晶体、 使其爆炸,结束技能。\n """ name = "陨星幻灭" + ref = Ref.ELEMENTALSHOWER learnLv = 50 masterLv = 40 maxLv = 50 @@ -1550,6 +1589,7 @@ class Skill39(ActiveSkill): 长按技能键蓄气后发动时,增加魔法阵的大小。\n """ name = "元素之幕" + ref = Ref.ELEMENTALCURTAIN learnLv = 60 masterLv = 40 maxLv = 50 @@ -1611,6 +1651,7 @@ class Skill40(ActiveSkill): 长按技能键蓄气后发动时,增加元素震荡的魔法阵范围。\n """ name = "元素震荡" + ref = Ref.ELEMENTALQUAKE learnLv = 70 masterLv = 40 maxLv = 50 @@ -1681,6 +1722,7 @@ class Skill41(PassiveSkill): 可以通过右键点击,设置On/Off上级元素技能附加的特殊功能。\n """ name = "元素奥义" + ref = Ref.ELEMENTALPOTENTIAL learnLv = 75 masterLv = 40 maxLv = 50 @@ -1702,7 +1744,11 @@ class Skill41(PassiveSkill): # [杰克降临]大小增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"type":"*skillDamage","data":data0}] + # 迁移前实现(保留对照): + # associate = [{"type":"*skillDamage","data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 圣灵符文 # mage_female/elementalist/bb34e8854a93fd250347a1c64119f7ab @@ -1714,6 +1760,7 @@ class Skill42(ActiveSkill): 学习技能后,[元素点燃]和[魔法秀]会处于非激活状态,只能通过[圣灵符文]发动。\n """ name = "圣灵符文" + ref = Ref.MIGHTYRUNE learnLv = 75 masterLv = 1 maxLv = 11 @@ -1739,9 +1786,14 @@ class Skill42(ActiveSkill): # 魔法暴击率增加量 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) + # 迁移前实现(保留对照): + # associate = [ + # {"type":"+ratio","data":data0,"skills":["魔法秀"]}, + # {"type":"+ratio","data":data2,"skills":["属性精通"]} + # ] associate = [ - {"type":"+ratio","data":data0,"skills":["魔法秀"]}, - {"type":"+ratio","data":data2,"skills":["属性精通"]} + SkillEffect(attribute=SkillAttribute.RATIO, operation=Operation.ADD, value=Percent(LevelTable(data0)), skills=[Ref.MAGICALTEMPOUP]), + SkillEffect(attribute=SkillAttribute.RATIO, operation=Operation.ADD, value=Percent(LevelTable(data2)), skills=[Ref.ELEMENTMASTERY]), ] # 圣灵水晶 @@ -1754,6 +1806,7 @@ class Skill43(ActiveSkill): 长按技能键蓄气后发动时,增加魔法阵和圣灵水晶的体积。\n """ name = "圣灵水晶" + ref = Ref.CRYSTALOFOVERMIND learnLv = 75 masterLv = 40 maxLv = 50 @@ -1812,6 +1865,7 @@ class Skill44(ActiveSkill): 外门的数量越少则攻击越高。\n """ name = "元素之门" + ref = Ref.THEGATE learnLv = 80 masterLv = 40 maxLv = 50 @@ -1880,6 +1934,7 @@ class Skill45(ActiveSkill): [第六元素]的攻击属性为全属性。\n """ name = "第六元素" + ref = Ref.SESTOELEMENTO learnLv = 85 masterLv = 40 maxLv = 50 @@ -1915,6 +1970,7 @@ class Skill46(PassiveSkill): 在前方生成由光和暗元素强制融合形成的球体。 球体因强制融合的排斥作用而振动,造成多段伤害后爆炸。\n """ name = "元素之源" + ref = Ref.ASSIMILATE learnLv = 95 masterLv = 40 maxLv = 50 @@ -1937,7 +1993,11 @@ class Skill46(PassiveSkill): # 融合虚无之球多段攻击力 : 虚无之球多段攻击力的40% # 融合虚无之球爆炸攻击力 : 虚无之球多段攻击力的240% - associate = [{"type":"*skillDamage","data":data0}] + # 迁移前实现(保留对照): + # associate = [{"type":"*skillDamage","data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 融合虚无之球多段攻击力 : 虚无之球多段攻击力的40% # 融合虚无之球爆炸攻击力 : 虚无之球多段攻击力的240% @@ -1951,6 +2011,7 @@ class Skill47(ActiveSkill): 适用所有属性攻击。\n """ name = "光与暗的交响" + ref = Ref.THUNDERRAGE learnLv = 95 masterLv = 40 maxLv = 50 @@ -1987,6 +2048,7 @@ class Skill48(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "宇宙寂灭 : 冰火之歌" + ref = Ref.COSMICCALAMITY learnLv = 100 masterLv = 40 maxLv = 50 diff --git a/backend/core/character/GF/mage_female/enchantress.py b/backend/core/character/GF/mage_female/enchantress.py index 37b5b51e..864c9d20 100644 --- a/backend/core/character/GF/mage_female/enchantress.py +++ b/backend/core/character/GF/mage_female/enchantress.py @@ -1,6 +1,13 @@ #3909d0b188e9c95311399f776e331da5 from core.basic.skill import PassiveBufferSkill,ActiveBufferSkill,ActiveSkill,PassiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, +) +from core.character.refs.mage_female.enchantress import EnchantressSkillRef as Ref prefix = "mage_female/enchantress/cn/skillDetail" @@ -12,6 +19,7 @@ class Skill0(ActiveSkill): 向前方敌人发射魔法星弹,可以用方向键调整魔法星弹的飞行方向。\n """ name = "魔法星弹" + ref = Ref.MAGICMISSILE learnLv = 1 masterLv = 60 maxLv = 70 @@ -44,6 +52,7 @@ class Skill1(ActiveSkill): 转职为魔道学者后,技能类型变为独立攻击力。\n """ name = "天击" + ref = Ref.UPPERSWING learnLv = 1 masterLv = 10 maxLv = 20 @@ -72,6 +81,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -95,6 +105,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -122,6 +133,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -163,6 +175,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -185,6 +198,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -207,6 +221,7 @@ class Skill7(ActiveSkill): 用武器用力击刺敌人使其进入较长时间的僵直状态。\n """ name = "龙牙" + ref = Ref.THRUST learnLv = 5 masterLv = 60 maxLv = 70 @@ -235,6 +250,7 @@ class Skill8(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "杰克爆弹" + ref = Ref.LAUNCHJOL learnLv = 5 masterLv = 60 maxLv = 70 @@ -274,6 +290,7 @@ class Skill9(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "光电鳗" + ref = Ref.LAUNCHFLUORESCENT learnLv = 5 masterLv = 60 maxLv = 70 @@ -312,6 +329,7 @@ class Skill10(ActiveSkill): 若掌握[心灵感应],则附加 : 棒暴击\n """ name = "契约召唤 : 赫德尔" + ref = Ref.SUMMONHODOR learnLv = 5 masterLv = 60 maxLv = 70 @@ -377,6 +395,7 @@ class Skill11(ActiveSkill): 转职为战斗法师后,可学习[魔法护盾强化],加强能力。\n """ name = "魔法护盾" + ref = Ref.AURASHIELD cellPos = (3,2) learnLv = 5 masterLv = 10 @@ -405,6 +424,7 @@ class Skill12(ActiveSkill): 对无法抓取的敌人不适用控制效果,箴言人偶不附着在敌人身上,直接爆炸; 即使附着成功也不会进入无敌状态。\n """ name = "别过来!" + ref = Ref.KEEPOUT cellPos = (8,2) learnLv = 5 masterLv = 60 @@ -435,6 +455,7 @@ class Skill13(ActiveSkill): 在普通决斗场根据转职而产生不同的冷却时间。\n """ name = "替身草人" + ref = Ref.WARPONDAMAGE cellPos = (3,3) learnLv = 10 masterLv = 10 @@ -480,6 +501,7 @@ class Skill14(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "冰霜雪人" + ref = Ref.LAUNCHFROSTHEAD learnLv = 10 masterLv = 60 maxLv = 70 @@ -530,6 +552,7 @@ class Skill15(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "暗影夜猫" + ref = Ref.LAUNCHBLACKCAT learnLv = 10 masterLv = 60 maxLv = 70 @@ -569,6 +592,7 @@ class Skill16(ActiveSkill): 蚀附着在鞭挞范围内的召唤兽身上时,额外增加攻击、 移动速度; 蚀附着在敌人身上时,蚕食敌人的身体,造成伤害。\n """ name = "鞭挞" + ref = Ref.WHIP learnLv = 10 masterLv = 60 maxLv = 70 @@ -628,6 +652,7 @@ class Skill17(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -655,6 +680,7 @@ class Skill18(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -680,6 +706,7 @@ class Skill19(ActiveSkill): 往地面注入黑魔法,生成玫瑰藤蔓向前方延伸。\n """ name = "玫瑰藤蔓" + ref = Ref.ROSEVINE cellPos = (9,3) learnLv = 10 masterLv = 60 @@ -714,6 +741,7 @@ class Skill20(ActiveSkill): 转职为战斗法师后,才可以强制中断当前动作,并立即施放该技能。\n """ name = "落花掌" + ref = Ref.HANDSTRIKE learnLv = 15 masterLv = 60 maxLv = 70 @@ -747,6 +775,7 @@ class Skill21(ActiveSkill): 驱散敌人的增益效果时,提升自身的力量和智力,每驱散1个,可以额外提升。\n """ name = "驱散魔法" + ref = Ref.DISENCHANT cellPos = (2,4) learnLv = 15 masterLv = 10 @@ -792,6 +821,7 @@ class Skill22(PassiveSkill): 空中使用时无法进行蓄气。\n """ name = "空中施放 : 杰克爆弹" + ref = Ref.LAUNCHJOLONJUMP learnLv = 15 masterLv = 1 maxLv = 1 @@ -815,6 +845,7 @@ class Skill23(ActiveBufferSkill): [细心缝补]施放过程中,小魔女所受伤害减少10%,按跳跃键可以立即结束技能。\n """ name = "细心缝补" + ref = Ref.SEWING cellPos = (6,4) learnLv = 15 masterLv = 60 @@ -848,6 +879,7 @@ class Skill24(PassiveSkill): [给我最好的。 太重? 没关系! 疯疯熊会替我拿着。]\n """ name = "黑魔法扫把" + ref = Ref.DARKMAGICBROOM cellPos = (7,4) learnLv = 15 masterLv = 1 @@ -876,6 +908,7 @@ class Skill25(PassiveBufferSkill): [来,跟我可爱的孩子们打个招呼吧! 这是‘坏坏兔’和‘疯疯熊’。]\n """ name = "人偶操纵者" + ref = Ref.PUPPETEER cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -891,7 +924,11 @@ class Skill25(PassiveBufferSkill): data0 = get_data(f'{prefix}/{uuid}', 0) INT = data0 - associate = [{"data":INT,"type":"$+INT","ratio":1}] + # 迁移前实现(保留对照): + # associate = [{"data":INT,"type":"$+INT","ratio":1}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.INT, operation=Operation.ADD, value=LevelTable(INT)), + ] # 疯狂乱抓 # mage_female/enchantress/6bbf76bcd2ed3ca25f21b760db4342ad @@ -902,6 +939,7 @@ class Skill26(ActiveSkill): 不论小魔女处于什么状态,都可以施放该技能。\n """ name = "疯狂乱抓" + ref = Ref.MADMADSLASH cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -931,6 +969,7 @@ class Skill27(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -962,6 +1001,7 @@ class Skill28(ActiveBufferSkill): 爱之急救 : 生命值恢复量 +20%\n """ name = "小魔女的偏爱" + ref = Ref.FAVORITISM cellPos = (6,5) learnLv = 20 masterLv = 10 @@ -1021,6 +1061,7 @@ class Skill29(PassiveSkill): [小魔女的好奇心对某些人来说是个悲剧。 当然她自己并不在意这个事实……]\n """ name = "邪恶的好奇心" + ref = Ref.WICKEDCURIOSITY cellPos = (7,5) learnLv = 20 masterLv = 10 @@ -1046,6 +1087,7 @@ class Skill30(ActiveSkill): 不论小魔女处于什么状态,都可以施放该技能。\n """ name = "疯熊火箭拳" + ref = Ref.MADSTRAIGHT cellPos = (4,5) learnLv = 20 masterLv = 60 @@ -1080,6 +1122,7 @@ class Skill31(PassiveSkill): 箴言人偶系列技能的“适用于敌人的效果”可以在[人偶篮子]技能中通过ON/OFF开启或关闭。\n """ name = "人偶篮子" + ref = Ref.DOLLBASKET cellPos = (0,6) learnLv = 25 masterLv = 1 @@ -1113,6 +1156,7 @@ class Skill32(ActiveSkill): 决斗场中无法叠加为2个。\n """ name = "火热的爱意" + ref = Ref.HOTLOVE cellPos = (1,6) learnLv = 25 masterLv = 40 @@ -1149,6 +1193,7 @@ class Skill33(ActiveSkill): 召唤魔力凝聚而成的荆棘藤攻击敌人,然后把敌人拉到身前。\n """ name = "蔷薇藤鞭" + ref = Ref.HARVESTING cellPos = (8,6) learnLv = 25 masterLv = 60 @@ -1182,6 +1227,7 @@ class Skill34(ActiveSkill): 只要施放范围内存在敌人,不论小魔女处于什么状态,都可以施放该技能。\n """ name = "疯熊守护" + ref = Ref.MADDYGUARD cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -1219,6 +1265,7 @@ class Skill35(ActiveBufferSkill): 厄运结束或者再次施放技能更新持续时间时,副作用会解除。 小魔女自身和偏爱的对象不受副作用影响。\n """ name = "禁术吟咏" + ref = Ref.FORBIDDENCURSE cellPos = (6,7) learnLv = 30 masterLv = 10 @@ -1268,6 +1315,7 @@ class Skill36(ActiveSkill): 从地面召唤多棵荆棘,刺穿范围内的敌人,将其聚集到前方。 荆棘每次攻击都会将命中的敌人移动到小魔女前方,并使刺伤的敌人进入出血状态。\n """ name = "御敌之刺" + ref = Ref.REJECTTHORN cellPos = (9,7) learnLv = 30 masterLv = 60 @@ -1301,6 +1349,7 @@ class Skill37(ActiveSkill): 决斗场中无法吸附敌人。\n """ name = "疯疯熊坠击" + ref = Ref.JUMPINGBEARPRESS cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -1361,6 +1410,7 @@ class Skill38(ActiveSkill): 决斗场中无法叠加为2个。\n """ name = "疯狂召唤" + ref = Ref.DESTINYPUPPET cellPos = (1,9) learnLv = 40 masterLv = 60 @@ -1436,6 +1486,7 @@ class Skill39(ActiveSkill): 技能持续期间再次按技能键,可以立即发动爆炸。\n """ name = "蔷薇囚狱" + ref = Ref.THORNVINEHOLD cellPos = (8,9) learnLv = 40 masterLv = 60 @@ -1503,6 +1554,7 @@ class Skill40(ActiveBufferSkill): 施放过程中,按跳跃键可以结束技能。\n """ name = "爱之急救" + ref = Ref.FIRSTAIDOFLOVE cellPos = (6,9) learnLv = 40 masterLv = 1 @@ -1539,6 +1591,7 @@ class Skill41(ActiveSkill): 施放过程中按跳跃键可以结束技能,同时使用的其他技能也会立即结束。\n """ name = "变大吧! 疯疯熊" + ref = Ref.MADTHEBIG cellPos = (4,10) learnLv = 45 masterLv = 60 @@ -1601,6 +1654,7 @@ class Skill42(ActiveSkill): 敌人靠近荆棘屋时会被小屋外的尖刺刺伤,并被击退。\n """ name = "林中小屋" + ref = Ref.BLACKTHORNTREE cellPos = (1,10) learnLv = 45 masterLv = 1 @@ -1635,6 +1689,7 @@ class Skill43(PassiveBufferSkill): [她的微笑后面藏着什么小把戏呢?]\n """ name = "少女的爱" + ref = Ref.SMALLDEVIL cellPos = (7,11) learnLv = 48 masterLv = 40 @@ -1662,7 +1717,11 @@ class Skill43(PassiveBufferSkill): INT = data3 STRINT = data3 - associate = [{"data":INT,"type":"$+INT","ratio":1}] + # 迁移前实现(保留对照): + # associate = [{"data":INT,"type":"$+INT","ratio":1}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.INT, operation=Operation.ADD, value=LevelTable(INT)), + ] # 开幕! 人偶剧场 # mage_female/enchantress/56fca6cff74d828e92301a40cd2148b9 @@ -1679,6 +1738,7 @@ class Skill44(ActiveBufferSkill): 增益效果不与光明骑士 (男/女) 的[圣光天启]、 [天启之光]、 缪斯的[梦想的舞台]、 协战师的[强袭策略 : 区域肃清]效果叠加。\n """ name = "开幕! 人偶剧场" + ref = Ref.MARIONETTE cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1721,6 +1781,7 @@ class Skill45(ActiveSkill): 连续按键可以加快钉钉子的速度。\n """ name = "人偶戏法" + ref = Ref.HEX cellPos = (1,12) learnLv = 60 masterLv = 40 @@ -1781,6 +1842,7 @@ class Skill46(ActiveSkill): 施放期间,可以按跳跃键结束技能。\n """ name = "爱之刺痛" + ref = Ref.AFFECTIONSTING cellPos = (9,12) learnLv = 60 masterLv = 40 @@ -1841,6 +1903,7 @@ class Skill47(ActiveSkill): 队友在死亡状态下可以用复活币复活,但身上的效果会消失。\n """ name = "永恒的占据" + ref = Ref.ETERNALPOSSESSION cellPos = (1,13) learnLv = 70 masterLv = 1 @@ -1872,6 +1935,7 @@ class Skill48(ActiveSkill): 疯疯熊将附近的敌人吸附到身边,然后瞬间变大发出蕴含强大魔力的咆哮。\n """ name = "哇咔咔!" + ref = Ref.TERRIBLEROAR cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1938,6 +2002,7 @@ class Skill49(PassiveBufferSkill): [你永远都是属于我的。]\n """ name = "冥月绽放" + ref = Ref.ROSEINDARK cellPos = (7,13) learnLv = 75 masterLv = 40 @@ -1968,7 +2033,11 @@ class Skill49(PassiveBufferSkill): data7 = get_data(f'{prefix}/{uuid}', 7) INT = data0 - associate = [{"data":INT ,"type":"$+INT","ratio":1}] + # 迁移前实现(保留对照): + # associate = [{"data":INT ,"type":"$+INT","ratio":1}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.INT, operation=Operation.ADD, value=LevelTable(INT)), + ] CarryRatio = [0]+ [(1.05 ** 3) * 100 - 100]*maxLv# noqa: E501 # 苦痛庭院 @@ -1979,6 +2048,7 @@ class Skill50(ActiveSkill): 召唤长满魔力荆棘藤的苦痛庭院,攻击范围内的敌人,并捆住敌人的脚,使其进入束缚状态。\n """ name = "苦痛庭院" + ref = Ref.PAINFULGARDEN cellPos = (8,13) learnLv = 75 masterLv = 40 @@ -2044,6 +2114,7 @@ class Skill51(ActiveSkill): 吐息经过的地面会变成浮动诅咒气息的诅咒地带。 队友进入诅咒地带时可以增加[禁术吟咏]和[小魔女的偏爱]的持续时间。\n """ name = "咆哮吧! 疯疯熊" + ref = Ref.CURSEOFTERRORBEAR cellPos = (4,14) learnLv = 80 masterLv = 40 @@ -2101,6 +2172,7 @@ class Skill52(ActiveSkill): 小魔女使用终极黑魔法将自身所处空间变成人偶之森的最深处的模样。 短时间后超巨大的疯疯熊登场,毁灭眼前所有的敌人。\n """ name = "欢迎光临人偶之森" + ref = Ref.WOODSOFPUPPET cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -2139,6 +2211,7 @@ class Skill53(PassiveBufferSkill): [疯熊守护]技能可通过On/Off设置是否激活防御功能。\n """ name = "不祥的微笑" + ref = Ref.SINISTERSMILINGEYES cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2157,7 +2230,11 @@ class Skill53(PassiveBufferSkill): # [疯熊守护]防御冷却时间 : 30秒 INT = data1 - associate = [{"data": data1,"type": "$+INT","ratio":1}] + # 迁移前实现(保留对照): + # associate = [{"data": data1,"type": "$+INT","ratio":1}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.INT, operation=Operation.ADD, value=LevelTable(data1)), + ] # [疯熊守护]防御冷却时间 : 30秒 # 挚爱囚笼 @@ -2170,6 +2247,7 @@ class Skill54(ActiveSkill): 再次按技能键,鸟笼立即收缩后消失。\n """ name = "挚爱囚笼" + ref = Ref.DISPLAYLOVE cellPos = (8,15) learnLv = 95 masterLv = 40 @@ -2222,6 +2300,7 @@ class Skill55(ActiveBufferSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "终幕! 人偶剧场" + ref = Ref.LASTONEACT cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/mage_female/summoner.py b/backend/core/character/GF/mage_female/summoner.py index a5556088..8aecf4ef 100644 --- a/backend/core/character/GF/mage_female/summoner.py +++ b/backend/core/character/GF/mage_female/summoner.py @@ -2,9 +2,18 @@ from core.basic.skill import PassiveSkill, ActiveSkill, get_data, _get_skill_damage_suffixes from core.basic.character import Character -prefix = "mage_female/summoner/cn/skillDetail" from enum import Enum +from core.basic.skill_effect_types import ( + LevelTable, + Operation, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.mage_female.summoner import SummonerSkillRef as Ref + +prefix = "mage_female/summoner/cn/skillDetail" class EnumDataType(Enum): A = '附灵' @@ -41,6 +50,7 @@ class Skill0(ActiveSkill): 向前方敌人发射魔法星弹,可以用方向键调整魔法星弹的飞行方向。\n """ name = "魔法星弹" + ref = Ref.MAGICMISSILE learnLv = 1 masterLv = 60 maxLv = 70 @@ -73,6 +83,7 @@ class Skill1(ActiveSkill): 转职为魔道学者后,技能类型变为独立攻击力。\n """ name = "天击" + ref = Ref.UPPERSWING learnLv = 1 masterLv = 10 maxLv = 20 @@ -101,6 +112,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -124,6 +136,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -151,6 +164,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -192,6 +206,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -214,6 +229,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -236,6 +252,7 @@ class Skill7(ActiveSkill): 用武器用力击刺敌人使其进入较长时间的僵直状态。\n """ name = "龙牙" + ref = Ref.THRUST learnLv = 5 masterLv = 60 maxLv = 70 @@ -264,6 +281,7 @@ class Skill8(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "杰克爆弹" + ref = Ref.LAUNCHJOL learnLv = 5 masterLv = 60 maxLv = 70 @@ -303,6 +321,7 @@ class Skill9(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "光电鳗" + ref = Ref.LAUNCHFLUORESCENT learnLv = 5 masterLv = 60 maxLv = 70 @@ -342,6 +361,7 @@ class Skill10(SummonSkill): """ name = '契约召唤 : 赫德尔' + ref = Ref.SUMMONHODOR cellPos = (8,2) learnLv = 5 masterLv = 60 @@ -426,6 +446,7 @@ class Skill11(ActiveSkill): """ name = '魔法护盾' + ref = Ref.AURASHIELD cellPos = (10,2) learnLv = 5 masterLv = 10 @@ -455,6 +476,7 @@ class Skill12(ActiveSkill): """ name = '别过来!' + ref = Ref.KEEPOUT cellPos = (3,2) learnLv = 5 masterLv = 60 @@ -487,6 +509,7 @@ class Skill13(ActiveSkill): """ name = '替身草人' + ref = Ref.WARPONDAMAGE cellPos = (7,3) learnLv = 10 masterLv = 10 @@ -534,6 +557,7 @@ class Skill14(ActiveSkill): """ name = '冰霜雪人' + ref = Ref.LAUNCHFROSTHEAD cellPos = (9,3) learnLv = 10 masterLv = 60 @@ -586,6 +610,7 @@ class Skill15(ActiveSkill): """ name = '暗影夜猫' + ref = Ref.LAUNCHBLACKCAT cellPos = (10,3) learnLv = 10 masterLv = 60 @@ -627,6 +652,7 @@ class Skill16(ActiveSkill): """ name = '鞭挞' + ref = Ref.WHIP cellPos = (4,3) learnLv = 10 masterLv = 60 @@ -690,6 +716,7 @@ class Skill17(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -717,6 +744,7 @@ class Skill18(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -745,6 +773,7 @@ class Skill19(ActiveSkill): 转职为战斗法师后,才可以强制中断当前动作,并立即施放该技能。\n """ name = "落花掌" + ref = Ref.HANDSTRIKE learnLv = 15 masterLv = 60 maxLv = 70 @@ -778,6 +807,7 @@ class Skill20(ActiveSkill): 若召唤者死亡,则召唤出的精灵会消失。\n """ name = "精灵召唤 : 亚德炎" + ref = Ref.SUMMONSPIRITFIRE learnLv = 15 masterLv = 1 maxLv = 70 @@ -812,6 +842,7 @@ class Skill21(ActiveSkill): 若召唤者死亡,则召唤出的精灵会消失。\n """ name = "精灵召唤 : 冰奈斯" + ref = Ref.SUMMONSPIRITWATER learnLv = 15 masterLv = 1 maxLv = 70 @@ -853,6 +884,7 @@ class Skill22(ActiveSkill): 若召唤者死亡,则召唤出的精灵会消失。\n """ name = "精灵召唤 : 瑟冥特克" + ref = Ref.SUMMONSPIRITDARK learnLv = 15 masterLv = 1 maxLv = 70 @@ -886,6 +918,7 @@ class Skill23(ActiveSkill): 若召唤者死亡,则召唤出的精灵会消失。\n """ name = "精灵召唤 : 雷沃斯" + ref = Ref.SUMMONSPIRITLIGHT learnLv = 15 masterLv = 1 maxLv = 70 @@ -922,6 +955,7 @@ class Skill24(ActiveSkill): """ name = '驱散魔法' + ref = Ref.DISENCHANT cellPos = (8,3) learnLv = 15 masterLv = 10 @@ -967,6 +1001,7 @@ class Skill25(ActiveSkill): """ name = '召唤兽跟随' + ref = Ref.FOLLOWME cellPos = (6,4) learnLv = 15 masterLv = 1 @@ -1010,6 +1045,7 @@ class Skill26(PassiveSkill): """ name = '空中施放 : 杰克爆弹' + ref = Ref.LAUNCHJOLONJUMP cellPos = (6,3) learnLv = 15 masterLv = 1 @@ -1033,6 +1069,7 @@ class Skill27(PassiveSkill): """ name = '召唤兽强化' + ref = Ref.SUMMONMONSTERAURA cellPos = (5,4) learnLv = 15 masterLv = 20 @@ -1056,35 +1093,39 @@ class Skill27(PassiveSkill): # 物防和魔防的增加 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) + # 迁移前实现(保留对照): + # associate = [ + # { + # 'data': data3, + # 'type': '*skillDamage', + # 'skills': [ + # '契约召唤 : 赫德尔', + # '精灵召唤 : 亚德炎', + # '精灵召唤 : 冰奈斯', + # '精灵召唤 : 瑟冥特克', + # '精灵召唤 : 雷沃斯', + # '契约召唤 : 弗利特', + # '契约召唤 : 桑德尔', + # '精灵召唤 : 亡魂默克尔', + # '精灵召唤 : 极光格雷林', + # '精灵召唤 : 冰影阿奎利斯', + # '精灵召唤 : 火焰赫瑞克', + # '契约召唤 : 路易丝', + # '精灵召唤 : 伊伽贝拉', + # '契约召唤 : 牛头王库鲁塔', + # '契约召唤 : 征服者卡西利亚斯', + # '必杀剑·千鬼杀', + # '狂化黑月', + # '传说召唤 : 月蚀之影', + # '传说召唤 : 逆月者拉莫斯', + # '咒令 : 逆月之蚀', + # '至高精灵王', + # '魔月·德拉里昂', + # ], + # } + # ] associate = [ - { - 'data': data3, - 'type': '*skillDamage', - 'skills': [ - '契约召唤 : 赫德尔', - '精灵召唤 : 亚德炎', - '精灵召唤 : 冰奈斯', - '精灵召唤 : 瑟冥特克', - '精灵召唤 : 雷沃斯', - '契约召唤 : 弗利特', - '契约召唤 : 桑德尔', - '精灵召唤 : 亡魂默克尔', - '精灵召唤 : 极光格雷林', - '精灵召唤 : 冰影阿奎利斯', - '精灵召唤 : 火焰赫瑞克', - '契约召唤 : 路易丝', - '精灵召唤 : 伊伽贝拉', - '契约召唤 : 牛头王库鲁塔', - '契约召唤 : 征服者卡西利亚斯', - '必杀剑·千鬼杀', - '狂化黑月', - '传说召唤 : 月蚀之影', - '传说召唤 : 逆月者拉莫斯', - '咒令 : 逆月之蚀', - '至高精灵王', - '魔月·德拉里昂', - ], - } + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3)), skills=[Ref.SUMMONHODOR, Ref.SUMMONSPIRITFIRE, Ref.SUMMONSPIRITWATER, Ref.SUMMONSPIRITDARK, Ref.SUMMONSPIRITLIGHT, Ref.SUMMONBABYDRAGON, Ref.SUMMONSANDOR, Ref.SUMMONSPIRITDARKHIGHER, Ref.SUMMONSPIRITLIGHTHIGHER, Ref.SUMMONSPIRITWATERHIGHER, Ref.SUMMONSPIRITFIREHIGHER, Ref.SUMMONLUIS, Ref.SUMMONECHEVERRA, Ref.SUMMONKRUTA, Ref.SUMMONCASILLAS, Ref.CASILLASFINISHATTACK, Ref.BLACKLUNATIC, Ref.MOONSHADOW, Ref.SUMMONRAMOS, Ref.BUGFALL, Ref.HIGHESTECHEVERRA, Ref.DELLALIONOFPREDATION]), ] # 伺机而动 @@ -1096,6 +1137,7 @@ class Skill28(ActiveSkill): """ name = '伺机而动' + ref = Ref.SUMMONMONSTERWAIT cellPos = (8,4) learnLv = 15 masterLv = 1 @@ -1126,6 +1168,7 @@ class Skill29(PassiveSkill): """ name = '心灵感应' + ref = Ref.COMMUNION cellPos = (7,4) learnLv = 15 masterLv = 6 @@ -1140,7 +1183,11 @@ class Skill29(PassiveSkill): # 基本攻击和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 召唤下级精灵 # mage_female/summoner/f8226512ea3dbcb1fe1374baa0c6bbee @@ -1153,6 +1200,7 @@ class Skill30(ActiveSkill): """ name = '召唤下级精灵' + ref = Ref.SUMMONSPIRIT cellPos = (1,3) learnLv = 15 masterLv = 60 @@ -1177,6 +1225,7 @@ class Skill31(ActiveSkill): """ name = '魔法秀' + ref = Ref.MAGICALTEMPOUP cellPos = (9,5) learnLv = 20 masterLv = 10 @@ -1199,7 +1248,11 @@ class Skill31(ActiveSkill): # 蓄气时间上限减少率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'type': '*cdRatio', 'data': data1, 'skills': ['精灵献祭', '咒令 : 愤怒咆哮']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*cdRatio', 'data': data1, 'skills': ['精灵献祭', '咒令 : 愤怒咆哮']}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD_RATIO, value=1 - Percent(LevelTable(data1)), skills=[Ref.SACRIFICESPIRIT, Ref.REPEATEDSMASHOFRAGE]), + ] # 精灵献祭 # mage_female/summoner/c27418ae613c647527200a7ca17d97fd @@ -1212,6 +1265,7 @@ class Skill32(ActiveSkill): """ name = '精灵献祭' + ref = Ref.SACRIFICESPIRIT cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -1297,6 +1351,7 @@ class Skill33(SummonSkill): """ name = '契约召唤 : 弗利特' + ref = Ref.SUMMONBABYDRAGON cellPos = (8,5) learnLv = 20 masterLv = 60 @@ -1363,6 +1418,7 @@ class Skill34(ActiveSkill): """ name = '召唤解除' + ref = Ref.UNSUMMON cellPos = (7,5) learnLv = 20 masterLv = 1 @@ -1385,6 +1441,7 @@ class Skill35(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -1411,6 +1468,7 @@ class Skill36(SummonSkill): """ name = '契约召唤 : 桑德尔' + ref = Ref.SUMMONSANDOR cellPos = (8,6) learnLv = 25 masterLv = 60 @@ -1466,6 +1524,7 @@ class Skill37(ActiveSkill): """ name = '魔力印记' + ref = Ref.TARGETIT cellPos = (9,6) learnLv = 25 masterLv = 1 @@ -1503,6 +1562,7 @@ class Skill38(PassiveSkill): """ name = '绝对支配' + ref = Ref.DOMINIONPOWERUP cellPos = (4,6) learnLv = 25 masterLv = 1 @@ -1518,7 +1578,11 @@ class Skill38(PassiveSkill): # [鞭挞]增益效果持续时间增加 : {value0}秒 data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': [0] + [2] * maxLv, 'type': '+cd', 'skills': ['鞭挞'], 'ratio': 1}] + # 迁移前实现(保留对照): + # associate = [{'data': [0] + [2] * maxLv, 'type': '+cd', 'skills': ['鞭挞'], 'ratio': 1}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD, operation=Operation.ADD, value=LevelTable([0] + [2] * maxLv), skills=[Ref.WHIP]), + ] # 契约召唤 : 袄索 # mage_female/summoner/e4c354a89c337310aeb7041d5e742828 @@ -1536,6 +1600,7 @@ class Skill39(SummonSkill): """ name = '契约召唤 : 袄索' + ref = Ref.SUMMONAUXO cellPos = (8,7) learnLv = 30 masterLv = 60 @@ -1621,6 +1686,7 @@ class Skill40(SummonSkill): """ name = '精灵召唤 : 亡魂默克尔' + ref = Ref.SUMMONSPIRITDARKHIGHER cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -1691,6 +1757,7 @@ class Skill41(SummonSkill): """ name = '精灵召唤 : 极光格雷林' + ref = Ref.SUMMONSPIRITLIGHTHIGHER cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -1762,6 +1829,7 @@ class Skill42(SummonSkill): """ name = '精灵召唤 : 冰影阿奎利斯' + ref = Ref.SUMMONSPIRITWATERHIGHER cellPos = (0,7) learnLv = 30 masterLv = 60 @@ -1840,6 +1908,7 @@ class Skill43(SummonSkill): """ name = '精灵召唤 : 火焰赫瑞克' + ref = Ref.SUMMONSPIRITFIREHIGHER cellPos = (1,7) learnLv = 30 masterLv = 60 @@ -1912,6 +1981,7 @@ class Skill44(ActiveSkill): """ name = '召唤兽狂化' + ref = Ref.SUMMONMONSTERRECKLESS cellPos = (7,7) learnLv = 30 masterLv = 10 @@ -1947,6 +2017,7 @@ class Skill45(SummonSkill): """ name = '契约召唤 : 路易丝' + ref = Ref.SUMMONLUIS cellPos = (8,8) learnLv = 35 masterLv = 60 @@ -2053,6 +2124,7 @@ class Skill46(SummonSkill): """ name = '精灵召唤 : 伊伽贝拉' + ref = Ref.SUMMONECHEVERRA cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -2131,7 +2203,11 @@ class Skill46(SummonSkill): # 自身强化 skillDamage = 1.3 - associate = [{'type': '*skillDamage', 'data': data13, 'skills': ['精灵召唤 : 亡魂默克尔', '精灵召唤 : 极光格雷林', '精灵召唤 : 冰影阿奎利斯', '精灵召唤 : 火焰赫瑞克']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data13, 'skills': ['精灵召唤 : 亡魂默克尔', '精灵召唤 : 极光格雷林', '精灵召唤 : 冰影阿奎利斯', '精灵召唤 : 火焰赫瑞克']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data13)), skills=[Ref.SUMMONSPIRITDARKHIGHER, Ref.SUMMONSPIRITLIGHTHIGHER, Ref.SUMMONSPIRITWATERHIGHER, Ref.SUMMONSPIRITFIREHIGHER]), + ] def vp_1(self): """ @@ -2163,6 +2239,7 @@ class Skill47(ActiveSkill): """ name = '召唤兽传送' + ref = Ref.MASSTELEPORT cellPos = (6,9) learnLv = 40 masterLv = 1 @@ -2187,6 +2264,7 @@ class Skill48(ActiveSkill): """ name = '束缚印记' + ref = Ref.THROWSTICKYTRAP cellPos = (1,10) learnLv = 45 masterLv = 1 @@ -2249,6 +2327,7 @@ class Skill49(SummonSkill): """ name = '契约召唤 : 牛头王库鲁塔' + ref = Ref.SUMMONKRUTA cellPos = (9,10) learnLv = 45 masterLv = 60 @@ -2343,6 +2422,7 @@ class Skill50(PassiveSkill): """ name = '灵魂支配' + ref = Ref.UPGRADESUMMONSKILL cellPos = (5,11) learnLv = 48 masterLv = 40 @@ -2359,7 +2439,11 @@ class Skill50(PassiveSkill): # 施放速度增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 契约召唤 : 征服者卡西利亚斯 # mage_female/summoner/0b8db1e10b3abbd24d38564e708675d5 @@ -2372,6 +2456,7 @@ class Skill51(SummonSkill): """ name = '契约召唤 : 征服者卡西利亚斯' + ref = Ref.SUMMONCASILLAS cellPos = (6,11) learnLv = 50 masterLv = 40 @@ -2437,6 +2522,7 @@ class Skill52(ActiveSkill): """ name = '必杀剑·千鬼杀' + ref = Ref.CASILLASFINISHATTACK cellPos = (7,11) learnLv = 50 masterLv = 1 @@ -2453,7 +2539,7 @@ class Skill52(ActiveSkill): hit1 = 5 def getSkillData(self, lv: int = 0): - source = self.char.GetSkillByName('契约召唤 : 征服者卡西利亚斯') + source = self.char.GetSkill(Ref.SUMMONCASILLAS) self.data0 = source.data9 self.data1 = source.data10 return super().getSkillData(source.lv) @@ -2471,6 +2557,7 @@ class Skill53(ActiveSkill): """ name = '支配之环' + ref = Ref.RINGOFDOMINATION cellPos = (5,12) learnLv = 60 masterLv = 1 @@ -2498,6 +2585,7 @@ class Skill54(ActiveSkill): """ name = '精灵召唤 : 融合精灵海伊伦' + ref = Ref.SUMMONHEILROM cellPos = (2,12) learnLv = 60 masterLv = 1 @@ -2530,7 +2618,11 @@ class Skill54(ActiveSkill): # 速度增加光环范围 : {value6}px data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{'data': data2, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data2, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] def vp_1(self): """ @@ -2564,6 +2656,7 @@ class Skill55(ActiveSkill): """ name = '咒令 : 愤怒咆哮' + ref = Ref.REPEATEDSMASHOFRAGE cellPos = (9,13) learnLv = 70 masterLv = 40 @@ -2631,6 +2724,7 @@ class Skill56(PassiveSkill): """ name = '蚀月附灵' + ref = Ref.ECLIPSEHIVE cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -2647,7 +2741,11 @@ class Skill56(PassiveSkill): # 召唤技能冷却时间减少率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 狂化黑月 # mage_female/summoner/8572675ec6a1f50b6eff6a867376c2de @@ -2660,6 +2758,7 @@ class Skill57(ActiveSkill): """ name = '狂化黑月' + ref = Ref.BLACKLUNATIC cellPos = (8,13) learnLv = 75 masterLv = 40 @@ -2734,6 +2833,7 @@ class Skill58(ActiveSkill): """ name = '传说召唤 : 月蚀之影' + ref = Ref.MOONSHADOW cellPos = (2,14) learnLv = 80 masterLv = 40 @@ -2795,6 +2895,7 @@ class Skill59(SummonSkill): """ name = '传说召唤 : 逆月者拉莫斯' + ref = Ref.SUMMONRAMOS cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -2887,6 +2988,7 @@ class Skill60(ActiveSkill): """ name = '咒令 : 逆月之蚀' + ref = Ref.BUGFALL cellPos = (5,14) learnLv = 85 masterLv = 1 @@ -2924,14 +3026,7 @@ class Skill60(ActiveSkill): # 自身强化 skillDamage = 1.15 - @property - def lv(self): - """技能等级""" - return self.char.GetSkillByName("传说召唤 : 逆月者拉莫斯").lv - - @lv.setter - def lv(self, value): - ... + level_source = Ref.SUMMONRAMOS # 逆月 # mage_female/summoner/10834437b54f67c4c27f92eaabd59bb1 @@ -2950,6 +3045,7 @@ class Skill61(PassiveSkill): """ name = '逆月' + ref = Ref.POSTICUSLUNA cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -2968,7 +3064,11 @@ class Skill61(PassiveSkill): # [鞭挞]召唤兽攻击、 移动速度额外增加 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 至高精灵王 # mage_female/summoner/13e8c4ad93473b5fcea11e81ce9456f5 @@ -2981,6 +3081,7 @@ class Skill62(ActiveSkill): """ name = '至高精灵王' + ref = Ref.HIGHESTECHEVERRA cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -3021,6 +3122,7 @@ class Skill63(ActiveSkill): """ name = '魔月·德拉里昂' + ref = Ref.DELLALIONOFPREDATION cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/mage_female/witch.py b/backend/core/character/GF/mage_female/witch.py index a5fd470d..ee9ffd92 100644 --- a/backend/core/character/GF/mage_female/witch.py +++ b/backend/core/character/GF/mage_female/witch.py @@ -1,6 +1,27 @@ # 3909d0b188e9c95311399f776e331da5 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + Equals, + LevelTable, + MissingTargetPolicy, + Operation, + Percent, + ProfessionAttribute, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.mage_female.witch import WitchSkillRef as Ref + + +class WitchAttribute(ProfessionAttribute): + """本职业专用的最终效果属性;字段含义与技能实现保持一致。""" + FAIL_POWER = 'powerFail' + """魔道学者:失败形态伤害倍率。""" + SUCCESS_POWER = 'powerSuccess' + """魔道学者:成功形态伤害倍率。""" + prefix = "mage_female/witch/cn/skillDetail" @@ -14,6 +35,7 @@ class Skill0(ActiveSkill): """ name = '魔法星弹' + ref = Ref.MAGICMISSILE cellPos = (3,1) learnLv = 1 masterLv = 60 @@ -47,6 +69,7 @@ class Skill1(ActiveSkill): 转职为魔道学者后,技能类型变为独立攻击力。\n """ name = "天击" + ref = Ref.UPPERSWING learnLv = 1 masterLv = 10 maxLv = 20 @@ -75,6 +98,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -99,6 +123,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -126,6 +151,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -167,6 +193,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -189,6 +216,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -211,6 +239,7 @@ class Skill7(ActiveSkill): 用武器用力击刺敌人使其进入较长时间的僵直状态。\n """ name = "龙牙" + ref = Ref.THRUST learnLv = 5 masterLv = 60 maxLv = 70 @@ -239,6 +268,7 @@ class Skill8(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "杰克爆弹" + ref = Ref.LAUNCHJOL learnLv = 5 masterLv = 60 maxLv = 70 @@ -278,6 +308,7 @@ class Skill9(ActiveSkill): 在决斗场中,蓄气时间越长,攻击力越高。\n """ name = "光电鳗" + ref = Ref.LAUNCHFLUORESCENT learnLv = 5 masterLv = 60 maxLv = 70 @@ -316,6 +347,7 @@ class Skill10(ActiveSkill): 若掌握[心灵感应],则附加 : 棒暴击\n """ name = "契约召唤 : 赫德尔" + ref = Ref.SUMMONHODOR learnLv = 5 masterLv = 60 maxLv = 70 @@ -382,6 +414,7 @@ class Skill11(ActiveSkill): """ name = '魔法护盾' + ref = Ref.AURASHIELD cellPos = (9,2) learnLv = 5 masterLv = 10 @@ -411,6 +444,7 @@ class Skill12(ActiveSkill): 对无法抓取的敌人不适用控制效果,箴言人偶不附着在敌人身上,直接爆炸; 即使附着成功也不会进入无敌状态。\n """ name = "别过来!" + ref = Ref.KEEPOUT learnLv = 5 masterLv = 60 maxLv = 70 @@ -442,6 +476,7 @@ class Skill13(ActiveSkill): """ name = '替身草人' + ref = Ref.WARPONDAMAGE cellPos = (8,3) learnLv = 10 masterLv = 10 @@ -492,6 +527,7 @@ class Skill14(ActiveSkill): """ name = '冰霜雪人' + ref = Ref.LAUNCHFROSTHEAD cellPos = (6,3) learnLv = 10 masterLv = 60 @@ -544,6 +580,7 @@ class Skill15(ActiveSkill): """ name = '暗影夜猫' + ref = Ref.LAUNCHBLACKCAT cellPos = (7,3) learnLv = 10 masterLv = 60 @@ -584,6 +621,7 @@ class Skill16(ActiveSkill): 蚀附着在鞭挞范围内的召唤兽身上时,额外增加攻击、 移动速度; 蚀附着在敌人身上时,蚕食敌人的身体,造成伤害。\n """ name = "鞭挞" + ref = Ref.WHIP learnLv = 10 masterLv = 60 maxLv = 70 @@ -643,6 +681,7 @@ class Skill17(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -670,6 +709,7 @@ class Skill18(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -698,6 +738,7 @@ class Skill19(ActiveSkill): 转职为战斗法师后,才可以强制中断当前动作,并立即施放该技能。\n """ name = "落花掌" + ref = Ref.HANDSTRIKE learnLv = 15 masterLv = 60 maxLv = 70 @@ -732,6 +773,7 @@ class Skill20(ActiveSkill): """ name = '驱散魔法' + ref = Ref.DISENCHANT cellPos = (1,4) learnLv = 15 masterLv = 10 @@ -780,6 +822,7 @@ class Skill21(ActiveSkill): """ name = '远古魔法书' + ref = Ref.MPREGENRATEUP cellPos = (8,4) learnLv = 15 masterLv = 10 @@ -808,6 +851,7 @@ class Skill22(PassiveSkill): """ name = '空中施放 : 杰克爆弹' + ref = Ref.LAUNCHJOLONJUMP cellPos = (5,4) learnLv = 15 masterLv = 1 @@ -833,6 +877,7 @@ class Skill23(ActiveSkill): """ name = '挑衅人偶 : 舒露露' + ref = Ref.PROVOCATIONDOLL cellPos = (9,4) learnLv = 15 masterLv = 60 @@ -863,6 +908,7 @@ class Skill24(PassiveSkill): """ name = '亲和法米利尔' + ref = Ref.FRIENDLYFAMILIAR cellPos = (4,4) learnLv = 15 masterLv = 5 @@ -897,7 +943,11 @@ class Skill24(PassiveSkill): # [改良魔法星弹]探索范围增加率 : {value10}% data10 = get_data(f'{prefix}/{uuid}', 10) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 扫把掌握 # mage_female/witch/5152480fdde81362575a488d4cec4af9 @@ -917,6 +967,7 @@ class Skill25(PassiveSkill): """ name = '扫把掌握' + ref = Ref.EQUIPBROOM cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -948,6 +999,7 @@ class Skill26(PassiveSkill): """ name = '改良舒露露' + ref = Ref.IMPROVEDSHURURU cellPos = (9,6) learnLv = 15 masterLv = 1 @@ -1004,6 +1056,7 @@ class Skill27(ActiveSkill): """ name = '改良魔法星弹' + ref = Ref.ENHANCEDMAGICMISSILE cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -1058,6 +1111,7 @@ class Skill28(ActiveSkill): """ name = '魔法秀' + ref = Ref.MAGICALTEMPOUP cellPos = (0,5) learnLv = 20 masterLv = 10 @@ -1080,7 +1134,11 @@ class Skill28(ActiveSkill): # 蓄气时间上限减少率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'type': '*cdRatio', 'data': data1, 'skills': ['改良魔法星弹', '改良舒露露', '熔岩药瓶', '魔道酸雨云', '旋转扫把', '电鳗碰撞机', '暴炎加热炉', '冰霜钻孔车', '反重力装置', '光电兔', '雪人刨冰', '糖果大作战 : 捣蛋杰克']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*cdRatio', 'data': data1, 'skills': ['改良魔法星弹', '改良舒露露', '熔岩药瓶', '魔道酸雨云', '旋转扫把', '电鳗碰撞机', '暴炎加热炉', '冰霜钻孔车', '反重力装置', '光电兔', '雪人刨冰', '糖果大作战 : 捣蛋杰克']}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD_RATIO, value=1 - Percent(LevelTable(data1)), skills=[Ref.ENHANCEDMAGICMISSILE, Ref.IMPROVEDSHURURU, Ref.LAVAPOTION, Ref.ACIDCLOUD, Ref.BROOMSPIN, Ref.FLUORECOLLIDER, Ref.HEATINGFURNACE, Ref.MEGADRILL, Ref.ANTIGRAVITYSTARTER, Ref.ELECTRICRABBIT, Ref.JACKFROSTICEWATER, Ref.JACKOHALLOWEEN]), + ] # 魔幻粉末 # mage_female/witch/7e904ea3d2a9faa054604e55120a9268 @@ -1094,6 +1152,7 @@ class Skill29(ActiveSkill): """ name = '魔幻粉末' + ref = Ref.BROOMPOWDER cellPos = (7,5) learnLv = 20 masterLv = 1 @@ -1133,6 +1192,7 @@ class Skill30(ActiveSkill): """ name = '暗影斗篷' + ref = Ref.BLACKMANTLE cellPos = (1,5) learnLv = 20 masterLv = 60 @@ -1172,6 +1232,7 @@ class Skill31(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -1199,6 +1260,7 @@ class Skill32(ActiveSkill): """ name = '变异苍蝇拍' + ref = Ref.TRANSFORMFLAPPER cellPos = (1,6) learnLv = 25 masterLv = 60 @@ -1250,6 +1312,7 @@ class Skill33(PassiveSkill): """ name = '幸运棒棒糖' + ref = Ref.SWEETCANDYBAR cellPos = (0,6) learnLv = 25 masterLv = 5 @@ -1268,7 +1331,11 @@ class Skill33(PassiveSkill): # 基本攻击力、 技能攻击力增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data2}] + # 迁移前实现(保留对照): + # associate = [{'data': data2}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # 魔道酸雨云 # mage_female/witch/b89c9ab317bc0a443f6497b7cca2f6a8 @@ -1284,6 +1351,7 @@ class Skill34(ActiveSkill): """ name = '魔道酸雨云' + ref = Ref.ACIDCLOUD cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -1361,6 +1429,7 @@ class Skill35(ActiveSkill): """ name = '熔岩药瓶' + ref = Ref.LAVAPOTION cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -1444,6 +1513,7 @@ class Skill36(PassiveSkill): """ name = '苍蝇拍 : 魔法禁锢' + ref = Ref.CLEARFLAPPER cellPos = (1,7) learnLv = 30 masterLv = 1 @@ -1469,6 +1539,7 @@ class Skill37(PassiveSkill): """ name = '苦涩棒棒糖' + ref = Ref.BITTERSCANDYBAR cellPos = (0,7) learnLv = 35 masterLv = 1 @@ -1489,10 +1560,16 @@ class Skill37(PassiveSkill): # [冰霜钻孔车]失败攻击力增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data1, 'type': '+powerFail', 'skills': ['熔岩药瓶']}, + # {'data': data2, 'type': '+powerFail', 'skills': ['暴炎加热炉']}, + # {'data': data3, 'type': '+powerFail', 'skills': ['冰霜钻孔车']}, + # ] associate = [ - {'data': data1, 'type': '+powerFail', 'skills': ['熔岩药瓶']}, - {'data': data2, 'type': '+powerFail', 'skills': ['暴炎加热炉']}, - {'data': data3, 'type': '+powerFail', 'skills': ['冰霜钻孔车']}, + SkillEffect(attribute=WitchAttribute.FAIL_POWER, operation=Operation.ADD, value=Percent(LevelTable(data1)), skills=[Ref.LAVAPOTION]), + SkillEffect(attribute=WitchAttribute.FAIL_POWER, operation=Operation.ADD, value=Percent(LevelTable(data2)), skills=[Ref.HEATINGFURNACE]), + SkillEffect(attribute=WitchAttribute.FAIL_POWER, operation=Operation.ADD, value=Percent(LevelTable(data3)), skills=[Ref.MEGADRILL]), ] # 旋转扫把 @@ -1514,6 +1591,7 @@ class Skill38(ActiveSkill): """ name = '旋转扫把' + ref = Ref.BROOMSPIN cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -1608,6 +1686,7 @@ class Skill39(ActiveSkill): """ name = '电鳗碰撞机' + ref = Ref.FLUORECOLLIDER cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -1726,6 +1805,7 @@ class Skill40(ActiveSkill): """ name = '反重力装置' + ref = Ref.ANTIGRAVITYSTARTER cellPos = (8,9) learnLv = 40 masterLv = 60 @@ -1812,6 +1892,7 @@ class Skill41(ActiveSkill): """ name = '暴炎加热炉' + ref = Ref.HEATINGFURNACE cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -1931,6 +2012,7 @@ class Skill42(ActiveSkill): """ name = '引爆试验' + ref = Ref.EMERGENCYESCAPE cellPos = (0,9) learnLv = 40 masterLv = 1 @@ -1958,6 +2040,7 @@ class Skill43(ActiveSkill): """ name = '冰霜钻孔车' + ref = Ref.MEGADRILL cellPos = (2,10) learnLv = 45 masterLv = 60 @@ -2077,6 +2160,7 @@ class Skill44(PassiveSkill): """ name = '成功预感' + ref = Ref.SUCCESSPREMONITION cellPos = (5,11) learnLv = 48 masterLv = 40 @@ -2101,7 +2185,11 @@ class Skill44(PassiveSkill): # 魔法暴击率增加量 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'data': data4}] + # 迁移前实现(保留对照): + # associate = [{'data': data4}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data4))), + ] # 技艺融合 # mage_female/witch/3fb8395ae3b81bd608e0c4223a8eb534 @@ -2115,6 +2203,7 @@ class Skill45(ActiveSkill): """ name = '技艺融合' + ref = Ref.FUSIONCRAFT cellPos = (4,11) learnLv = 50 masterLv = 40 @@ -2153,6 +2242,7 @@ class Skill46(ActiveSkill): """ name = '超级苍蝇拍' + ref = Ref.TRANSFORMFLAPPEREX cellPos = (1,12) learnLv = 60 masterLv = 40 @@ -2185,10 +2275,14 @@ class Skill46(ActiveSkill): # 苍蝇拍大小比率 : {value6}% data6 = get_data(f'{prefix}/{uuid}', 6) - def effect(self, old, new): - if self.vp == 1: - self.associate = [{'data': [0] + [-17.6] * self.maxLv, 'skills': ['变异苍蝇拍']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 1: + # self.associate = [{'data': [0] + [-17.6] * self.maxLv, 'skills': ['变异苍蝇拍']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0] + [-17.6] * maxLv)), skills=[Ref.TRANSFORMFLAPPER], when=Equals(Read(SkillAttribute.VP), 1)), + ] def vp_1(self): """ @@ -2240,6 +2334,7 @@ class Skill47(ActiveSkill): """ name = '光电兔' + ref = Ref.ELECTRICRABBIT cellPos = (3,13) learnLv = 70 masterLv = 40 @@ -2337,6 +2432,7 @@ class Skill48(ActiveSkill): """ name = '雪人刨冰' + ref = Ref.JACKFROSTICEWATER cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -2428,6 +2524,7 @@ class Skill49(ActiveSkill): # 接口缺少该技能数据 name = '魔道学助手' + ref = Ref.HOMUNCULUS cellPos = (0,13) learnLv = 75 masterLv = 1 @@ -2503,18 +2600,17 @@ class Skill49(ActiveSkill): # 重力加速装置束缚时间 : {value28}秒 data28 = get_data(f'{prefix}/{uuid}', 28) - associate = [{'data': data3, 'skills': ['变异苍蝇拍', '超级苍蝇拍', '改良舒露露', '改良魔法星弹', '暗影斗篷', '技艺融合', '超级棒棒糖', '光电兔', '雪人刨冰', '乌洛波洛斯之环', '糖果大作战精怪乐园', '糖果大作战捣蛋杰克']}, {'data': data4, 'type': '+powerFail', 'skills': ['熔岩药瓶', '暴炎加热炉', '冰霜钻孔车']}] + # 迁移前实现(保留对照): + # associate = [{'data': data3, 'skills': ['变异苍蝇拍', '超级苍蝇拍', '改良舒露露', '改良魔法星弹', '暗影斗篷', '技艺融合', '超级棒棒糖', '光电兔', '雪人刨冰', '乌洛波洛斯之环', '糖果大作战精怪乐园', '糖果大作战捣蛋杰克']}, {'data': data4, 'type': '+powerFail', 'skills': ['熔岩药瓶', '暴炎加热炉', '冰霜钻孔车']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3)), skills=[Ref.TRANSFORMFLAPPER, Ref.TRANSFORMFLAPPEREX, Ref.IMPROVEDSHURURU, Ref.ENHANCEDMAGICMISSILE, Ref.BLACKMANTLE, Ref.FUSIONCRAFT, Ref.LOLLIPOPCRUSH, Ref.ELECTRICRABBIT, Ref.JACKFROSTICEWATER, Ref.UROBOROS, '糖果大作战精怪乐园', '糖果大作战捣蛋杰克'], missing_target=MissingTargetPolicy.SKIP), + SkillEffect(attribute=WitchAttribute.FAIL_POWER, operation=Operation.ADD, value=Percent(LevelTable(data4)), skills=[Ref.LAVAPOTION, Ref.HEATINGFURNACE, Ref.MEGADRILL]), + ] - @property - def lv(self): - """技能等级""" - return self.char.GetSkillByName('贤者之石').lv - - @lv.setter - def lv(self, value): ... + level_source = Ref.LAPISPHILOSOPHORUM def getSkillData(self, lv = 0): - pre = self.char.GetSkillByName('超级苍蝇拍') + pre = self.char.GetSkill(Ref.TRANSFORMFLAPPEREX) if pre and pre.vp == 2: # 杰克爆弹 self.hit7 = 1 * 13 / 20 @@ -2549,6 +2645,7 @@ class Skill50(PassiveSkill): """ name = '贤者之石' + ref = Ref.LAPISPHILOSOPHORUM cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -2588,7 +2685,12 @@ class Skill50(PassiveSkill): # [冰霜钻孔车]攻击力增加率 : {value8}% data8 = get_data(f'{prefix}/{uuid}', 8) - associate = [{'data': data0, 'type': '+powerSuccess', 'skills': ['改良舒露露', '改良魔法星弹', '魔道酸雨云', '电鳗碰撞机', '反重力装置', '熔岩药瓶', '暴炎加热炉']}, {'data': data8, 'skills': ['冰霜钻孔车']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '+powerSuccess', 'skills': ['改良舒露露', '改良魔法星弹', '魔道酸雨云', '电鳗碰撞机', '反重力装置', '熔岩药瓶', '暴炎加热炉']}, {'data': data8, 'skills': ['冰霜钻孔车']}] + associate = [ + SkillEffect(attribute=WitchAttribute.SUCCESS_POWER, operation=Operation.ADD, value=Percent(LevelTable(data0)), skills=[Ref.IMPROVEDSHURURU, Ref.ENHANCEDMAGICMISSILE, Ref.ACIDCLOUD, Ref.FLUORECOLLIDER, Ref.ANTIGRAVITYSTARTER, Ref.LAVAPOTION, Ref.HEATINGFURNACE]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data8)), skills=[Ref.MEGADRILL]), + ] # 超级棒棒糖 # mage_female/witch/9bc30e0f6e22b0333762d04acae7d252 @@ -2606,6 +2708,7 @@ class Skill51(ActiveSkill): """ name = '超级棒棒糖' + ref = Ref.LOLLIPOPCRUSH cellPos = (2,14) learnLv = 80 masterLv = 40 @@ -2691,6 +2794,7 @@ class Skill52(ActiveSkill): """ name = '乌洛波洛斯之环' + ref = Ref.UROBOROS cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -2739,6 +2843,7 @@ class Skill53(PassiveSkill): """ name = '粉红糖果' + ref = Ref.REDCANDY cellPos = (1,15) learnLv = 95 masterLv = 40 @@ -2756,7 +2861,11 @@ class Skill53(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 冰霜云冰冻持续时间 : {value2}秒 data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 糖果大作战 : 捣蛋杰克 # mage_female/witch/fa7f1a3dc90600456cbe010e5714bef3 @@ -2770,6 +2879,7 @@ class Skill54(ActiveSkill): """ name = '糖果大作战 : 捣蛋杰克' + ref = Ref.JACKOHALLOWEEN cellPos = (3,15) learnLv = 95 masterLv = 40 @@ -2804,6 +2914,7 @@ class Skill55(ActiveSkill): """ name = '糖果大作战 : 精怪乐园' + ref = Ref.ARSMAGNA cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/mage_male/blood_mage.py b/backend/core/character/GF/mage_male/blood_mage.py index f5291707..82368ade 100644 --- a/backend/core/character/GF/mage_male/blood_mage.py +++ b/backend/core/character/GF/mage_male/blood_mage.py @@ -1,6 +1,15 @@ # a5ccbaf5538981c6ef99b236c0a60b73 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.mage_male.blood_mage import BloodMageSkillRef as Ref prefix = "mage_male/blood_mage/cn/skillDetail" @@ -19,6 +28,7 @@ class Skill0(ActiveSkill): """ name = '魔法旋风' + ref = Ref.WINDSTRIKE cellPos = (4,1) learnLv = 1 masterLv = 10 @@ -53,6 +63,7 @@ class Skill1(ActiveSkill): """ name = '魔法冰球' + ref = Ref.WATERCANNON cellPos = (7,1) learnLv = 1 masterLv = 60 @@ -83,6 +94,7 @@ class Skill2(PassiveSkill): """ name = '不死之身' + ref = Ref.DIEHARD cellPos = (0,1) learnLv = 1 masterLv = 1 @@ -112,6 +124,7 @@ class Skill3(PassiveSkill): """ name = '黑暗之眼' + ref = Ref.ABYSS cellPos = (0,2) learnLv = 1 masterLv = 1 @@ -141,6 +154,7 @@ class Skill4(ActiveSkill): """ name = '赤影步' + ref = Ref.CREEPING cellPos = (6,4) learnLv = 1 masterLv = 1 @@ -167,6 +181,7 @@ class Skill5(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -191,6 +206,7 @@ class Skill6(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -218,6 +234,7 @@ class Skill7(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -259,6 +276,7 @@ class Skill8(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -281,6 +299,7 @@ class Skill9(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -305,6 +324,7 @@ class Skill10(ActiveSkill): 转职为次元行者时,技能类型变为独立攻击力。\n """ name = "擒拿掌" + ref = Ref.PUSHOUT learnLv = 5 masterLv = 60 maxLv = 70 @@ -332,6 +352,7 @@ class Skill11(ActiveSkill): 转职为元素爆破师后,减少技能冷却时间,发射[属性变换]中所选属性的魔法球。\n """ name = "魔球连射" + ref = Ref.MULTISHOT learnLv = 5 masterLv = 1 maxLv = 11 @@ -364,6 +385,7 @@ class Skill12(ActiveSkill): """ name = '幽冥火' + ref = Ref.HOLONGLIGHT cellPos = (9,3) learnLv = 10 masterLv = 10 @@ -400,6 +422,7 @@ class Skill13(ActiveSkill): 持续输入按键可维持持盾状态,减少敌人远程攻击的伤害。\n """ name = "旋火盾" + ref = Ref.FIREPILLAR learnLv = 10 masterLv = 60 maxLv = 70 @@ -431,6 +454,7 @@ class Skill14(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -458,6 +482,7 @@ class Skill15(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -484,6 +509,7 @@ class Skill16(ActiveSkill): 转职成为冰结师时,才可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "冰魄剑" + ref = Ref.ICESWORD learnLv = 15 masterLv = 60 maxLv = 70 @@ -519,6 +545,7 @@ class Skill17(ActiveSkill): """ name = '血蝠之袭' + ref = Ref.LILIAC cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -555,6 +582,7 @@ class Skill18(PassiveSkill): """ name = '鲜血融合' + ref = Ref.BLOOD cellPos = (0,4) learnLv = 15 masterLv = 10 @@ -584,7 +612,12 @@ class Skill18(PassiveSkill): # [猩红气息不足时] # 消耗生命值比率 : 猩红气息消耗量的{value6}% data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{'data': data2, 'type': '$*PAtkP'}, {'data': data3, 'type': '*cdReduce', 'skills': ['血翼突击', '鲜血长枪', '猩红狩猎', '狱血之牙', '绯红之狱', '隐行之噬', '血翼绽放', '死亡之握', '血翼蔽空']}] + # 迁移前实现(保留对照): + # associate = [{'data': data2, 'type': '$*PAtkP'}, {'data': data3, 'type': '*cdReduce', 'skills': ['血翼突击', '鲜血长枪', '猩红狩猎', '狱血之牙', '绯红之狱', '隐行之噬', '血翼绽放', '死亡之握', '血翼蔽空']}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data2))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data3)), skills=[Ref.BLOODWING, Ref.OFFERING, Ref.SHIKAREE, Ref.FANG, Ref.TORMENT, Ref.CORRUPTION, Ref.MARAUDER, Ref.FATALITY, Ref.BLOODSTINGER]), + ] # 鲜血之誓 # mage_male/blood_mage/8b08f9504167a9c0f3a1d29d71b7943e @@ -596,6 +629,7 @@ class Skill19(PassiveSkill): """ name = '鲜血之誓' + ref = Ref.DEADHANDS cellPos = (8,4) learnLv = 15 masterLv = 1 @@ -631,6 +665,7 @@ class Skill20(ActiveSkill): """ name = '血翼突击' + ref = Ref.BLOODWING cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -663,6 +698,7 @@ class Skill21(ActiveSkill): """ name = '鲜血长枪' + ref = Ref.OFFERING cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -702,6 +738,7 @@ class Skill22(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -725,6 +762,7 @@ class Skill23(PassiveSkill): """ name = '血之共鸣' + ref = Ref.BLOODHONE cellPos = (0,5) learnLv = 20 masterLv = 1 @@ -738,7 +776,11 @@ class Skill23(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 血蝠之舞 # mage_male/blood_mage/c91a62dc0a18360acf5031ac0ebf09f5 @@ -749,6 +791,7 @@ class Skill24(ActiveSkill): """ name = '血蝠之舞' + ref = Ref.LILROI cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -785,6 +828,7 @@ class Skill25(ActiveSkill): """ name = '猩红狩猎' + ref = Ref.SHIKAREE cellPos = (6,6) learnLv = 25 masterLv = 60 @@ -817,6 +861,7 @@ class Skill26(ActiveSkill): """ name = '赤红燃烧' + ref = Ref.BLOODBURN cellPos = (8,6) learnLv = 25 masterLv = 10 @@ -844,6 +889,7 @@ class Skill27(ActiveSkill): """ name = '狱血之犬' + ref = Ref.HELLBERUS cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -886,6 +932,7 @@ class Skill28(ActiveSkill): """ name = '狱血之牙' + ref = Ref.FANG cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -916,6 +963,7 @@ class Skill29(ActiveSkill): """ name = '绯红之狱' + ref = Ref.TORMENT cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -977,6 +1025,7 @@ class Skill30(ActiveSkill): """ name = '噬魂囚笼' + ref = Ref.SOULSTEEL cellPos = (2,9) learnLv = 40 masterLv = 60 @@ -1047,6 +1096,7 @@ class Skill31(ActiveSkill): """ name = '隐行之噬' + ref = Ref.CORRUPTION cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1115,6 +1165,7 @@ class Skill32(PassiveSkill): """ name = '赤狱之力' + ref = Ref.ABANDON cellPos = (3,11) learnLv = 48 masterLv = 40 @@ -1128,7 +1179,11 @@ class Skill32(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 伯爵之歌 # mage_male/blood_mage/0e409ac3e1c1f3976b3ef2bfe4c13069 @@ -1140,6 +1195,7 @@ class Skill33(ActiveSkill): """ name = '伯爵之歌' + ref = Ref.TEPES cellPos = (6,11) learnLv = 50 masterLv = 40 @@ -1180,6 +1236,7 @@ class Skill34(ActiveSkill): """ name = '魔仆召唤 : 狱犬' + ref = Ref.RUMBLEDOG cellPos = (2,12) learnLv = 60 masterLv = 40 @@ -1241,6 +1298,7 @@ class Skill35(ActiveSkill): """ name = '血翼绽放' + ref = Ref.MARAUDER cellPos = (5,13) learnLv = 70 masterLv = 40 @@ -1296,6 +1354,7 @@ class Skill36(ActiveSkill): """ name = '地狱冥犬' + ref = Ref.PHANTOMBALE cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1359,6 +1418,7 @@ class Skill37(PassiveSkill): """ name = '鲜血之殇' + ref = Ref.TRUEBLOOD cellPos = (8,13) learnLv = 75 masterLv = 40 @@ -1376,7 +1436,11 @@ class Skill37(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 猩红气息吸收量与生命值恢复量比率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 死亡之握 # mage_male/blood_mage/dd32a9825ec1af42a91f2223be6658e5 @@ -1387,6 +1451,7 @@ class Skill38(ActiveSkill): """ name = '死亡之握' + ref = Ref.FATALITY cellPos = (4,14) learnLv = 80 masterLv = 40 @@ -1444,6 +1509,7 @@ class Skill39(ActiveSkill): """ name = '血界彼岸' + ref = Ref.BLOODSTREAM cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -1487,6 +1553,7 @@ class Skill40(PassiveSkill): """ name = '猩红之眼' + ref = Ref.BLOODBYSS cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1506,7 +1573,11 @@ class Skill40(PassiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # [狱血之牙]探索范围 : {value3}px data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 血翼蔽空 # mage_male/blood_mage/6d7c9a15c08cc41d70125083e869e1a1 @@ -1518,6 +1589,7 @@ class Skill41(ActiveSkill): """ name = '血翼蔽空' + ref = Ref.BLOODSTINGER cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1550,6 +1622,7 @@ class Skill42(ActiveSkill): """ name = '血域帷幕·陨灭' + ref = Ref.EXTREMITYPERISH cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/mage_male/dimension_walker.py b/backend/core/character/GF/mage_male/dimension_walker.py index 85cc87e0..f97df350 100644 --- a/backend/core/character/GF/mage_male/dimension_walker.py +++ b/backend/core/character/GF/mage_male/dimension_walker.py @@ -1,6 +1,17 @@ # a5ccbaf5538981c6ef99b236c0a60b73 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Equals, + LevelTable, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.mage_male.dimension_walker import DimensionWalkerSkillRef as Ref prefix = "mage_male/dimension_walker/cn/skillDetail" @@ -18,6 +29,7 @@ class Skill0(ActiveSkill): 增加攻击力,可以按键进行追加操作。\n """ name = "魔法旋风" + ref = Ref.WINDSTRIKE learnLv = 1 masterLv = 10 maxLv = 20 @@ -51,6 +63,7 @@ class Skill1(ActiveSkill): 在决斗场内,冰球大小随技能等级增加而增大。\n """ name = "魔法冰球" + ref = Ref.WATERCANNON learnLv = 1 masterLv = 60 maxLv = 70 @@ -80,6 +93,7 @@ class Skill2(PassiveSkill): """ name = '不死之身' + ref = Ref.DIEHARD cellPos = (1,1) learnLv = 1 masterLv = 1 @@ -109,6 +123,7 @@ class Skill3(PassiveSkill): """ name = '黑暗之眼' + ref = Ref.ABYSS cellPos = (2,1) learnLv = 1 masterLv = 1 @@ -143,6 +158,7 @@ class Skill4(PassiveSkill): """ name = '超然感知' + ref = Ref.OVERSENSE cellPos = (3,1) learnLv = 1 masterLv = 1 @@ -173,6 +189,7 @@ class Skill5(ActiveSkill): """ name = '次元边界' + ref = Ref.EVENTHORIZEN cellPos = (5,1) learnLv = 1 masterLv = 1 @@ -199,6 +216,7 @@ class Skill6(PassiveSkill): """ name = '次元之乖离扫把精通' + ref = Ref.MYSOPHOBIA cellPos = (7,1) learnLv = 1 masterLv = 1 @@ -223,6 +241,7 @@ class Skill7(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -247,6 +266,7 @@ class Skill8(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -266,7 +286,11 @@ class Skill8(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['乖离 : 禁忌之奈雅丽']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['乖离 : 禁忌之奈雅丽']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.SUMMONNYARLY]), + ] # 受身蹲伏 # mage_male/dimension_walker/ce26c6b69d02a440a81b552bec94f03b @@ -276,6 +300,7 @@ class Skill9(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -317,6 +342,7 @@ class Skill10(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -339,6 +365,7 @@ class Skill11(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -363,6 +390,7 @@ class Skill12(ActiveSkill): 转职为次元行者时,技能类型变为独立攻击力。\n """ name = "擒拿掌" + ref = Ref.PUSHOUT learnLv = 5 masterLv = 60 maxLv = 70 @@ -390,6 +418,7 @@ class Skill13(ActiveSkill): 转职为元素爆破师后,减少技能冷却时间,发射[属性变换]中所选属性的魔法球。\n """ name = "魔球连射" + ref = Ref.MULTISHOT learnLv = 5 masterLv = 1 maxLv = 11 @@ -422,6 +451,7 @@ class Skill14(ActiveSkill): """ name = '幽冥火' + ref = Ref.HOLONGLIGHT cellPos = (1,3) learnLv = 10 masterLv = 10 @@ -458,6 +488,7 @@ class Skill15(ActiveSkill): """ name = '瞬移' + ref = Ref.TELEPORT cellPos = (5,3) learnLv = 10 masterLv = 1 @@ -485,6 +516,7 @@ class Skill16(ActiveSkill): 持续输入按键可维持持盾状态,减少敌人远程攻击的伤害。\n """ name = "旋火盾" + ref = Ref.FIREPILLAR learnLv = 10 masterLv = 60 maxLv = 70 @@ -516,6 +548,7 @@ class Skill17(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -543,6 +576,7 @@ class Skill18(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -569,6 +603,7 @@ class Skill19(ActiveSkill): 转职成为冰结师时,才可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "冰魄剑" + ref = Ref.ICESWORD learnLv = 15 masterLv = 60 maxLv = 70 @@ -608,6 +643,7 @@ class Skill20(ActiveSkill): """ name = '次元 : 坠落' + ref = Ref.ACCIDENT cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -667,6 +703,7 @@ class Skill21(PassiveSkill): """ name = '乖离 : 虚无' + ref = Ref.DIMENSIONHOLLOW cellPos = (7,4) learnLv = 15 masterLv = 10 @@ -682,8 +719,12 @@ class Skill21(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 迷雾附着敌人时,基本攻击和次元系列技能攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data1, 'skills': ['次元 : 坠落', '次元 : 虚影', '次元 : 跃迁', '次元 : 离子束', '次元 : 万花镜', '次元 : 粒子风暴', '次元 : 时空磁场', '次元 : 粒子波', '次元 : 思维聚爆', '次元 : 奇点', '禁断之盛宴', '未明·次元崩坏', '乖离 : 禁忌之奈雅丽']}, + # ] associate = [ - {'data': data1, 'skills': ['次元 : 坠落', '次元 : 虚影', '次元 : 跃迁', '次元 : 离子束', '次元 : 万花镜', '次元 : 粒子风暴', '次元 : 时空磁场', '次元 : 粒子波', '次元 : 思维聚爆', '次元 : 奇点', '禁断之盛宴', '未明·次元崩坏', '乖离 : 禁忌之奈雅丽']}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.ACCIDENT, Ref.SILHOUETTE, Ref.DIMENSIONLEAP, Ref.DIMENSIONLAY, Ref.KALEDOSCOPE, Ref.DIMENSIONBOMB, Ref.CORRIDO, Ref.POSITRON, Ref.PARADIGMDITO, Ref.DFORCE, Ref.FORBIDDENPARTY, Ref.OUTERGOD, Ref.SUMMONNYARLY]), ] # 次元扭曲装置 @@ -697,6 +738,7 @@ class Skill22(PassiveSkill): """ name = '次元扭曲装置' + ref = Ref.DISTORTIONACT cellPos = (0,5) learnLv = 20 masterLv = 10 @@ -716,7 +758,11 @@ class Skill22(PassiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 施放速度增加 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 次元 : 虚影 # mage_male/dimension_walker/1812a1ece67bb37b6b44b54766450064 @@ -731,6 +777,7 @@ class Skill23(ActiveSkill): """ name = '次元 : 虚影' + ref = Ref.SILHOUETTE cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -770,6 +817,7 @@ class Skill24(ActiveSkill): """ name = '次元 : 跃迁' + ref = Ref.DIMENSIONLEAP cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -816,6 +864,7 @@ class Skill25(ActiveSkill): """ name = '乖离 : 禁忌之奈雅丽' + ref = Ref.SUMMONNYARLY cellPos = (7,5) learnLv = 20 masterLv = 1 @@ -852,7 +901,11 @@ class Skill25(ActiveSkill): # 重叠次数上限 : {value8}次 data8 = get_data(f'{prefix}/{uuid}', 8) - associate = [{'data': data4, 'type': '$*PAtkI'}] + # 迁移前实现(保留对照): + # associate = [{'data': data4, 'type': '$*PAtkI'}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_I, value=1 + Percent(LevelTable(data4))), + ] def getSkillCD(self, mode=None): return 0.75 @@ -869,6 +922,7 @@ class Skill26(ActiveSkill): """ name = '奈雅丽的茶歇时间' + ref = Ref.TEATIME cellPos = (8,5) learnLv = 20 masterLv = 1 @@ -891,6 +945,7 @@ class Skill27(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -917,6 +972,7 @@ class Skill28(ActiveSkill): """ name = '次元 : 离子束' + ref = Ref.DIMENSIONLAY cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -965,6 +1021,7 @@ class Skill29(ActiveSkill): """ name = '时空壁障' + ref = Ref.DELUSION cellPos = (4,6) learnLv = 25 masterLv = 10 @@ -994,6 +1051,7 @@ class Skill30(PassiveSkill): """ name = '虚妄之火' + ref = Ref.FLAMEOFDELUSION cellPos = (1,6) learnLv = 25 masterLv = 1 @@ -1022,6 +1080,7 @@ class Skill31(ActiveSkill): """ name = '乖离 : 迷雾' + ref = Ref.CROWLINGMYST cellPos = (7,7) learnLv = 30 masterLv = 1 @@ -1066,6 +1125,7 @@ class Skill32(ActiveSkill): """ name = '次元 : 万花镜' + ref = Ref.KALEDOSCOPE cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -1119,6 +1179,7 @@ class Skill33(ActiveSkill): """ name = '乖离 : 魅魔之舞' + ref = Ref.HARLEQUIN cellPos = (8,7) learnLv = 30 masterLv = 60 @@ -1154,6 +1215,7 @@ class Skill34(ActiveSkill): """ name = '次元 : 粒子风暴' + ref = Ref.DIMENSIONBOMB cellPos = (2,8) learnLv = 35 masterLv = 60 @@ -1238,6 +1300,7 @@ class Skill35(ActiveSkill): """ name = '次元 : 时空磁场' + ref = Ref.CORRIDO cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -1308,6 +1371,7 @@ class Skill36(ActiveSkill): """ name = '乖离 : 异界蜂群' + ref = Ref.SWARM cellPos = (7,9) learnLv = 40 masterLv = 60 @@ -1379,6 +1443,7 @@ class Skill37(ActiveSkill): """ name = '次元 : 粒子波' + ref = Ref.POSITRON cellPos = (2,10) learnLv = 45 masterLv = 60 @@ -1460,6 +1525,7 @@ class Skill38(PassiveSkill): """ name = '虚空之力' + ref = Ref.FATE cellPos = (1,11) learnLv = 48 masterLv = 40 @@ -1489,7 +1555,11 @@ class Skill38(PassiveSkill): # 暴击伤害增加率 : {value6}% data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{'data': data6}] + # 迁移前实现(保留对照): + # associate = [{'data': data6}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data6))), + ] # 乖离 : 扭曲之恐惧 # mage_male/dimension_walker/9dc8438e4572d39243c97da31c113acc @@ -1503,6 +1573,7 @@ class Skill39(ActiveSkill): """ name = '乖离 : 扭曲之恐惧' + ref = Ref.HORROR cellPos = (7,11) learnLv = 50 masterLv = 40 @@ -1541,6 +1612,7 @@ class Skill40(ActiveSkill): """ name = '次元 : 思维聚爆' + ref = Ref.PARADIGMDITO cellPos = (6,12) learnLv = 60 masterLv = 40 @@ -1615,6 +1687,7 @@ class Skill41(ActiveSkill): """ name = '乖离 : 禁锢' + ref = Ref.CHEEKIT cellPos = (8,13) learnLv = 70 masterLv = 40 @@ -1642,10 +1715,14 @@ class Skill41(ActiveSkill): # 刺击距离比率 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) - def effect(self, old, new): - if self.vp == 1: - self.associate = [{'type': '*skillDamage', 'data': [0] + [-14] * self.maxLv, 'skills': ['乖离 : 魅魔之舞']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 1: + # self.associate = [{'type': '*skillDamage', 'data': [0] + [-14] * self.maxLv, 'skills': ['乖离 : 魅魔之舞']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0] + [-14] * maxLv)), skills=[Ref.HARLEQUIN], when=Equals(Read(SkillAttribute.VP), 1)), + ] def vp_1(self): """ @@ -1690,6 +1767,7 @@ class Skill42(PassiveSkill): """ name = '混沌源能石' + ref = Ref.STH cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1713,7 +1791,11 @@ class Skill42(PassiveSkill): data4 = get_data(f'{prefix}/{uuid}', 4) # 转职技能命中敌人时,奈雅丽攻击速度增加量 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'data': data4}] + # 迁移前实现(保留对照): + # associate = [{'data': data4}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data4))), + ] # 次元 : 奇点 # mage_male/dimension_walker/4402c6977bf5c9b0d2febe14dc81de6c @@ -1730,6 +1812,7 @@ class Skill43(ActiveSkill): """ name = '次元 : 奇点' + ref = Ref.DFORCE cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1820,6 +1903,7 @@ class Skill44(ActiveSkill): """ name = '乖离 : 沉沦' + ref = Ref.ATG cellPos = (8,14) learnLv = 80 masterLv = 40 @@ -1893,6 +1977,7 @@ class Skill45(ActiveSkill): """ name = '禁断之盛宴' + ref = Ref.FORBIDDENPARTY cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -1978,6 +2063,7 @@ class Skill46(PassiveSkill): """ name = '古史记忆' + ref = Ref.AKASHIC cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1993,7 +2079,11 @@ class Skill46(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 首次施放[时空壁障]时,波动数增加量 : {value1} data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 乖离 : 边缘之兽 # mage_male/dimension_walker/626cfc24770b72b5d7a24c24cda3768b @@ -2009,6 +2099,7 @@ class Skill47(ActiveSkill): """ name = '乖离 : 边缘之兽' + ref = Ref.HOUNDS cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2050,6 +2141,7 @@ class Skill48(ActiveSkill): """ name = '未明·次元崩坏' + ref = Ref.OUTERGOD cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/mage_male/elemental_bomber.py b/backend/core/character/GF/mage_male/elemental_bomber.py index 2da17352..5b95763a 100644 --- a/backend/core/character/GF/mage_male/elemental_bomber.py +++ b/backend/core/character/GF/mage_male/elemental_bomber.py @@ -1,6 +1,15 @@ # a5ccbaf5538981c6ef99b236c0a60b73 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + LevelTable, + Operation, + Percent, + Power, + SkillAttribute, + SkillEffect, +) +from core.character.refs.mage_male.elemental_bomber import ElementalBomberSkillRef as Ref prefix = "mage_male/elemental_bomber/cn/skillDetail" @@ -18,6 +27,7 @@ class Skill0(ActiveSkill): 增加攻击力,可以按键进行追加操作。\n """ name = "魔法旋风" + ref = Ref.WINDSTRIKE learnLv = 1 masterLv = 10 maxLv = 20 @@ -52,6 +62,7 @@ class Skill1(ActiveSkill): """ name = '魔法冰球' + ref = Ref.WATERCANNON cellPos = (4,1) learnLv = 1 masterLv = 60 @@ -82,6 +93,7 @@ class Skill2(PassiveSkill): """ name = '不死之身' + ref = Ref.DIEHARD cellPos = (1,1) learnLv = 1 masterLv = 1 @@ -111,6 +123,7 @@ class Skill3(PassiveSkill): """ name = '黑暗之眼' + ref = Ref.ABYSS cellPos = (2,1) learnLv = 1 masterLv = 1 @@ -137,6 +150,7 @@ class Skill4(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -161,6 +175,7 @@ class Skill5(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -188,6 +203,7 @@ class Skill6(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -229,6 +245,7 @@ class Skill7(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -251,6 +268,7 @@ class Skill8(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -275,6 +293,7 @@ class Skill9(ActiveSkill): 转职为次元行者时,技能类型变为独立攻击力。\n """ name = "擒拿掌" + ref = Ref.PUSHOUT learnLv = 5 masterLv = 60 maxLv = 70 @@ -303,6 +322,7 @@ class Skill10(ActiveSkill): """ name = '魔球连射' + ref = Ref.MULTISHOT cellPos = (6,2) learnLv = 5 masterLv = 1 @@ -337,6 +357,7 @@ class Skill11(ActiveSkill): """ name = '幽冥火' + ref = Ref.HOLONGLIGHT cellPos = (2,3) learnLv = 10 masterLv = 10 @@ -372,6 +393,7 @@ class Skill12(ActiveSkill): 向指定方向快速移动一定距离。\n """ name = "瞬移" + ref = Ref.TELEPORT learnLv = 10 masterLv = 1 maxLv = 1 @@ -400,6 +422,7 @@ class Skill13(ActiveSkill): """ name = '旋火盾' + ref = Ref.FIREPILLAR cellPos = (8,3) learnLv = 10 masterLv = 60 @@ -432,6 +455,7 @@ class Skill14(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -459,6 +483,7 @@ class Skill15(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -485,6 +510,7 @@ class Skill16(ActiveSkill): """ name = '属性变换' + ref = Ref.ELEMENTALCHANGE cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -509,9 +535,14 @@ class Skill16(ActiveSkill): # 光属性攻击力 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data1, 'type': '+power1', 'skills': ['魔球连射']}, + # {'data': data1, 'type': '+power0', 'skills': ['元素炮']}, + # ] associate = [ - {'data': data1, 'type': '+power1', 'skills': ['魔球连射']}, - {'data': data1, 'type': '+power0', 'skills': ['元素炮']}, + SkillEffect(attribute=Power(1), operation=Operation.ADD, value=Percent(LevelTable(data1)), skills=[Ref.MULTISHOT]), + SkillEffect(attribute=Power(0), operation=Operation.ADD, value=Percent(LevelTable(data1)), skills=[Ref.MAGICCANNON]), ] # 冰魄剑 @@ -524,6 +555,7 @@ class Skill17(ActiveSkill): """ name = '冰魄剑' + ref = Ref.ICESWORD cellPos = (10,4) learnLv = 15 masterLv = 60 @@ -562,6 +594,7 @@ class Skill18(ActiveSkill): """ name = '元素炮' + ref = Ref.MAGICCANNON cellPos = (9,4) learnLv = 15 masterLv = 1 @@ -593,6 +626,7 @@ class Skill19(PassiveSkill): """ name = '元素融合' + ref = Ref.ELEMENTALFUSION cellPos = (2,4) learnLv = 15 masterLv = 1 @@ -608,7 +642,11 @@ class Skill19(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 属性攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data1}] + # 迁移前实现(保留对照): + # associate = [{'data': data1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 冰晶坠 # mage_male/elemental_bomber/0969cd4054d93da07708108c0cc1c4b5 @@ -620,6 +658,7 @@ class Skill20(ActiveSkill): """ name = '冰晶坠' + ref = Ref.CRYSTALATTACK cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -656,6 +695,7 @@ class Skill21(PassiveSkill): """ name = '元素之力' + ref = Ref.ELEMENTALFORCE cellPos = (9,5) learnLv = 20 masterLv = 1 @@ -673,8 +713,12 @@ class Skill21(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 每个[元素之力]增加的[元素炮]大小增加 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {'data': [i * 5 for i in data1], 'skills': ['元素炮']}, + # ] associate = [ - {'data': [i * 5 for i in data1], 'skills': ['元素炮']}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i * 5 for i in data1])), skills=[Ref.MAGICCANNON]), ] # 暴击 @@ -685,6 +729,7 @@ class Skill22(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -708,6 +753,7 @@ class Skill23(ActiveSkill): """ name = '地炎' + ref = Ref.FIREROAD cellPos = (6,6) learnLv = 25 masterLv = 60 @@ -741,6 +787,7 @@ class Skill24(ActiveSkill): """ name = '元素环绕' + ref = Ref.MAGICSHIELD cellPos = (8,6) learnLv = 25 masterLv = 10 @@ -762,7 +809,11 @@ class Skill24(ActiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 属性攻击力增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data3}] + # 迁移前实现(保留对照): + # associate = [{'data': data3}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3))), + ] # 魔力燃烧 # mage_male/elemental_bomber/9bff7f2559e003766fee2853dca00631 @@ -773,6 +824,7 @@ class Skill25(ActiveSkill): """ name = '魔力燃烧' + ref = Ref.MANABURST cellPos = (2,6) learnLv = 25 masterLv = 20 @@ -805,6 +857,7 @@ class Skill26(PassiveSkill): """ name = '元素禁断' + ref = Ref.ELEMENTALBOMBING cellPos = (7,6) learnLv = 25 masterLv = 5 @@ -820,7 +873,11 @@ class Skill26(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 转职技能冷却时间减少率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data1, 'type': '*cdReduce', 'exceptSkills': ['幻魔四重奏', '末日湮灭', '启源·微观宇宙']}] + # 迁移前实现(保留对照): + # associate = [{'data': data1, 'type': '*cdReduce', 'exceptSkills': ['幻魔四重奏', '末日湮灭', '启源·微观宇宙']}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data1)), except_skills=[Ref.ELEMENTALBUSTER, Ref.ARMAGEDDONSTRIKE, Ref.MICROUNIVERSE]), + ] # [可强制中断的技能列表] # 掌握技能等级1时 : [元素炮]、 [冰晶坠]、 [地炎] # 掌握技能等级2时 : [暗域扩张]、 [雷光链] @@ -837,6 +894,7 @@ class Skill27(ActiveSkill): """ name = '雷光链' + ref = Ref.CHAINLIGHTNING cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -871,6 +929,7 @@ class Skill28(ActiveSkill): """ name = '暗域扩张' + ref = Ref.DARKCHANGE cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -904,6 +963,7 @@ class Skill29(PassiveSkill): """ name = '元素循环' + ref = Ref.ELEMENTUNDERSTAND cellPos = (8,7) learnLv = 30 masterLv = 10 @@ -919,7 +979,11 @@ class Skill29(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 命中率增加量 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 旋炎破 # mage_male/elemental_bomber/45442bbbe33540b4deeec29437dae70c @@ -933,6 +997,7 @@ class Skill30(ActiveSkill): """ name = '旋炎破' + ref = Ref.FLAMECIRCLE cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -993,6 +1058,7 @@ class Skill31(ActiveSkill): """ name = '冰晶之浴' + ref = Ref.ICEAREA cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -1059,6 +1125,7 @@ class Skill32(ActiveSkill): """ name = '黑暗禁域' + ref = Ref.DARKNESSMANTLE cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -1117,6 +1184,7 @@ class Skill33(ActiveSkill): """ name = '雷光屏障' + ref = Ref.LIGHTNINGWALL cellPos = (4,9) learnLv = 40 masterLv = 60 @@ -1170,6 +1238,7 @@ class Skill34(ActiveSkill): """ name = '元素轰炸' + ref = Ref.ELEMENTALRAIN cellPos = (6,10) learnLv = 45 masterLv = 60 @@ -1231,6 +1300,7 @@ class Skill35(PassiveSkill): """ name = '元素爆发' + ref = Ref.ELEMENTALCHAIN cellPos = (6,11) learnLv = 48 masterLv = 40 @@ -1246,7 +1316,11 @@ class Skill35(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 魔法暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 幻魔四重奏 # mage_male/elemental_bomber/c27418ae613c647527200a7ca17d97fd @@ -1260,6 +1334,7 @@ class Skill36(ActiveSkill): """ name = '幻魔四重奏' + ref = Ref.ELEMENTALBUSTER cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1290,6 +1365,7 @@ class Skill37(ActiveSkill): """ name = '元素浓缩球' + ref = Ref.CONCENTRATE cellPos = (5,12) learnLv = 60 masterLv = 40 @@ -1346,6 +1422,7 @@ class Skill38(ActiveSkill): """ name = '元素幻灭' + ref = Ref.ELEMENTALSTRIKEEX cellPos = (6,13) learnLv = 70 masterLv = 40 @@ -1410,6 +1487,7 @@ class Skill39(PassiveSkill): """ name = '黑瞳' + ref = Ref.DARKEYE cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1436,7 +1514,11 @@ class Skill39(PassiveSkill): data5 = get_data(f'{prefix}/{uuid}', 5) # [旋炎破]范围增加 : {value6}% data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 元素禁域 # mage_male/elemental_bomber/f0cc2c950f3bdf4103c75fa496bcac34 @@ -1452,6 +1534,7 @@ class Skill40(ActiveSkill): """ name = '元素禁域' + ref = Ref.ELEMENTALFIELD cellPos = (4,13) learnLv = 75 masterLv = 40 @@ -1515,6 +1598,7 @@ class Skill41(ActiveSkill): """ name = '聚能魔炮' + ref = Ref.CONVERGENCECANNON cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1569,6 +1653,7 @@ class Skill42(ActiveSkill): """ name = '末日湮灭' + ref = Ref.ARMAGEDDONSTRIKE cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1615,6 +1700,7 @@ class Skill43(PassiveSkill): """ name = '异瞳' + ref = Ref.WICKEDODDEYE cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1630,7 +1716,11 @@ class Skill43(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # [雷光链]雷光球爆炸攻击力 : 总攻击力的{value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 聚魔轰击 # mage_male/elemental_bomber/9767a375672d9519f6c1c5dff19b7c15 @@ -1643,6 +1733,7 @@ class Skill44(ActiveSkill): """ name = '聚魔轰击' + ref = Ref.CONVERGENCEREACT cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1675,6 +1766,7 @@ class Skill45(ActiveSkill): """ name = '启源·微观宇宙' + ref = Ref.MICROUNIVERSE cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/mage_male/glacial_master.py b/backend/core/character/GF/mage_male/glacial_master.py index f136ce01..2169752a 100644 --- a/backend/core/character/GF/mage_male/glacial_master.py +++ b/backend/core/character/GF/mage_male/glacial_master.py @@ -1,6 +1,18 @@ # a5ccbaf5538981c6ef99b236c0a60b73 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Hit, + LevelTable, + Operation, + Percent, + Power, + SkillAttribute, + SkillEffect, +) +from core.character.refs.mage_male.glacial_master import GlacialMasterSkillRef as Ref prefix = "mage_male/glacial_master/cn/skillDetail" @@ -18,6 +30,7 @@ class Skill0(ActiveSkill): 增加攻击力,可以按键进行追加操作。\n """ name = "魔法旋风" + ref = Ref.WINDSTRIKE learnLv = 1 masterLv = 10 maxLv = 20 @@ -51,6 +64,7 @@ class Skill1(ActiveSkill): 在决斗场内,冰球大小随技能等级增加而增大。\n """ name = "魔法冰球" + ref = Ref.WATERCANNON learnLv = 1 masterLv = 60 maxLv = 70 @@ -80,6 +94,7 @@ class Skill2(PassiveSkill): """ name = '不死之身' + ref = Ref.DIEHARD cellPos = (1,1) learnLv = 1 masterLv = 1 @@ -109,6 +124,7 @@ class Skill3(PassiveSkill): """ name = '黑暗之眼' + ref = Ref.ABYSS cellPos = (2,1) learnLv = 1 masterLv = 1 @@ -135,6 +151,7 @@ class Skill4(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -159,6 +176,7 @@ class Skill5(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -186,6 +204,7 @@ class Skill6(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -227,6 +246,7 @@ class Skill7(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -249,6 +269,7 @@ class Skill8(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -273,6 +294,7 @@ class Skill9(ActiveSkill): 转职为次元行者时,技能类型变为独立攻击力。\n """ name = "擒拿掌" + ref = Ref.PUSHOUT learnLv = 5 masterLv = 60 maxLv = 70 @@ -300,6 +322,7 @@ class Skill10(ActiveSkill): 转职为元素爆破师后,减少技能冷却时间,发射[属性变换]中所选属性的魔法球。\n """ name = "魔球连射" + ref = Ref.MULTISHOT learnLv = 5 masterLv = 1 maxLv = 11 @@ -331,6 +354,7 @@ class Skill11(ActiveSkill): 学习[虚妄之火]后,持续时间变更为无限,且无法发动攻击。\n """ name = "幽冥火" + ref = Ref.HOLONGLIGHT learnLv = 10 masterLv = 10 maxLv = 20 @@ -367,6 +391,7 @@ class Skill12(ActiveSkill): """ name = '瞬移' + ref = Ref.TELEPORT cellPos = (5,3) learnLv = 10 masterLv = 1 @@ -394,6 +419,7 @@ class Skill13(ActiveSkill): 持续输入按键可维持持盾状态,减少敌人远程攻击的伤害。\n """ name = "旋火盾" + ref = Ref.FIREPILLAR learnLv = 10 masterLv = 60 maxLv = 70 @@ -425,6 +451,7 @@ class Skill14(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -452,6 +479,7 @@ class Skill15(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -479,6 +507,7 @@ class Skill16(ActiveSkill): """ name = '冰魄剑' + ref = Ref.ICESWORD cellPos = (8,4) learnLv = 15 masterLv = 60 @@ -518,6 +547,7 @@ class Skill17(ActiveSkill): """ name = '冰之印' + ref = Ref.ICEELEMENTALATTACK cellPos = (3,4) learnLv = 15 masterLv = 1 @@ -540,6 +570,7 @@ class Skill18(PassiveSkill): """ name = '冰武精通' + ref = Ref.FROZENWEAPONMASTERY cellPos = (6,4) learnLv = 15 masterLv = 10 @@ -553,7 +584,11 @@ class Skill18(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 寒冰连枪 # mage_male/glacial_master/ade01c1d6afc8a05055225045e89fe49 @@ -567,6 +602,7 @@ class Skill19(ActiveSkill): """ name = '寒冰连枪' + ref = Ref.FALLENBLOSSOMS cellPos = (4,5) learnLv = 20 masterLv = 60 @@ -606,6 +642,7 @@ class Skill20(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -631,6 +668,7 @@ class Skill21(ActiveSkill): """ name = '冰霜之径' + ref = Ref.ICEROAD cellPos = (5,6) learnLv = 25 masterLv = 10 @@ -663,7 +701,11 @@ class Skill21(ActiveSkill): data6 = get_data(f'{prefix}/{uuid}', 6) # 减速移动速度减少 : {value7}% data7 = get_data(f'{prefix}/{uuid}', 7) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 冰之领悟 # mage_male/glacial_master/ff171dc487807bb9aa28900ca9a46b41 @@ -675,6 +717,7 @@ class Skill22(PassiveSkill): """ name = '冰之领悟' + ref = Ref.EXPRESSION cellPos = (7,6) learnLv = 25 masterLv = 10 @@ -694,7 +737,11 @@ class Skill22(PassiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 命中率增加 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'type': '$*PAtkM', 'data': data1}] + # 迁移前实现(保留对照): + # associate = [{'type': '$*PAtkM', 'data': data1}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable(data1))), + ] # 冰魄旋枪 # mage_male/glacial_master/547ab2b2bd860d3e37355a9cfbc1077c @@ -707,6 +754,7 @@ class Skill23(ActiveSkill): """ name = '冰魄旋枪' + ref = Ref.TURNWINDMILL cellPos = (3,6) learnLv = 25 masterLv = 60 @@ -752,6 +800,7 @@ class Skill24(ActiveSkill): """ name = '破冰飞刃' + ref = Ref.PIECEOFICE cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -789,6 +838,7 @@ class Skill25(ActiveSkill): """ name = '冰魄之弓' + ref = Ref.BROKENARROW cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -830,6 +880,7 @@ class Skill26(ActiveSkill): """ name = '寒冰之境' + ref = Ref.RESONANCE cellPos = (7,7) learnLv = 30 masterLv = 10 @@ -858,6 +909,7 @@ class Skill27(PassiveSkill): """ name = '水晶剑' + ref = Ref.CRYSTALBLADE cellPos = (8,7) learnLv = 30 masterLv = 1 @@ -872,9 +924,14 @@ class Skill27(PassiveSkill): # [冰魄剑]第1和第2击攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0, 'skills': ['冰魄剑']}, + # {'type': '+hit1', 'data': [0] + [-1] * maxLv, 'skills': ['冰魄剑'], 'ratio': 1}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0, 'skills': ['冰魄剑']}, - {'type': '+hit1', 'data': [0] + [-1] * maxLv, 'skills': ['冰魄剑'], 'ratio': 1}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.ICESWORD]), + SkillEffect(attribute=Hit(1), operation=Operation.ADD, value=LevelTable([0] + [-1] * maxLv), skills=[Ref.ICESWORD]), ] # 冰魄锤击 @@ -891,6 +948,7 @@ class Skill28(ActiveSkill): """ name = '冰魄锤击' + ref = Ref.ICEBIGHAMMER cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -946,6 +1004,7 @@ class Skill29(ActiveSkill): """ name = '旋冰穿刺' + ref = Ref.ICECRASH cellPos = (2,8) learnLv = 35 masterLv = 60 @@ -1010,6 +1069,7 @@ class Skill30(ActiveSkill): """ name = '极冰绽放' + ref = Ref.ICEMAN cellPos = (4,9) learnLv = 40 masterLv = 60 @@ -1092,6 +1152,7 @@ class Skill31(ActiveSkill): """ name = '冰雪风暴' + ref = Ref.BLIZZARDSTORM cellPos = (3,10) learnLv = 45 masterLv = 60 @@ -1156,6 +1217,7 @@ class Skill32(PassiveSkill): """ name = '冰舞乱击' + ref = Ref.PINPOINTRUSH cellPos = (5,10) learnLv = 45 masterLv = 1 @@ -1174,11 +1236,18 @@ class Skill32(PassiveSkill): # 冲击波攻击力 : [极冰绽放]倒下的冰柱攻击力的{value2}% data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*power1', 'data': [i - 100 if i > 0 else i for i in data0], 'skills': ['极冰绽放']}, + # {'type': '+hit1', 'data': [0, -1], 'skills': ['极冰绽放'], 'ratio': 1}, + # {'type': '*power3', 'data': [i - 100 if i > 0 else i for i in data1], 'skills': ['极冰绽放']}, + # {'type': '+hit4', 'data': [0, -1], 'skills': ['极冰绽放'], 'ratio': 1}, + # ] associate = [ - {'type': '*power1', 'data': [i - 100 if i > 0 else i for i in data0], 'skills': ['极冰绽放']}, - {'type': '+hit1', 'data': [0, -1], 'skills': ['极冰绽放'], 'ratio': 1}, - {'type': '*power3', 'data': [i - 100 if i > 0 else i for i in data1], 'skills': ['极冰绽放']}, - {'type': '+hit4', 'data': [0, -1], 'skills': ['极冰绽放'], 'ratio': 1}, + SkillEffect(attribute=Power(1), value=1 + Percent(LevelTable([i - 100 if i > 0 else i for i in data0])), skills=[Ref.ICEMAN]), + SkillEffect(attribute=Hit(1), operation=Operation.ADD, value=LevelTable([0, -1]), skills=[Ref.ICEMAN]), + SkillEffect(attribute=Power(3), value=1 + Percent(LevelTable([i - 100 if i > 0 else i for i in data1])), skills=[Ref.ICEMAN]), + SkillEffect(attribute=Hit(4), operation=Operation.ADD, value=LevelTable([0, -1]), skills=[Ref.ICEMAN]), ] # 冰封奥义 @@ -1191,6 +1260,7 @@ class Skill33(PassiveSkill): """ name = '冰封奥义' + ref = Ref.TUNDRASOUL cellPos = (6,11) learnLv = 48 masterLv = 40 @@ -1214,7 +1284,11 @@ class Skill33(PassiveSkill): # [范围信息] # 冰冻效果范围 : {value4}px data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 千旋冰轮破 # mage_male/glacial_master/78be08a3f8c834d3b06fa20c6a08c5a5 @@ -1227,6 +1301,7 @@ class Skill34(ActiveSkill): """ name = '千旋冰轮破' + ref = Ref.ICECHAKRAM cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1264,6 +1339,7 @@ class Skill35(ActiveSkill): """ name = '冰凌破' + ref = Ref.ICEORBEX cellPos = (5,12) learnLv = 60 masterLv = 40 @@ -1327,6 +1403,7 @@ class Skill36(ActiveSkill): """ name = '千里冰封' + ref = Ref.ICEFIELD cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1395,6 +1472,7 @@ class Skill37(PassiveSkill): """ name = '冰之技艺' + ref = Ref.ICECRAFT cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1412,7 +1490,12 @@ class Skill37(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 冰枪爆炸攻击力占原技能攻击力百分比 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': data0}, {'type': '*skillDamage', 'data': data1, 'skills': ['冰魄剑', '寒冰连枪', '冰魄旋枪', '旋冰穿刺', '冰魄锤击', '极冰绽放', '碎冰破', '极冰猎魔斩']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}, {'type': '*skillDamage', 'data': data1, 'skills': ['冰魄剑', '寒冰连枪', '冰魄旋枪', '旋冰穿刺', '冰魄锤击', '极冰绽放', '碎冰破', '极冰猎魔斩']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.ICESWORD, Ref.FALLENBLOSSOMS, Ref.TURNWINDMILL, Ref.ICECRASH, Ref.ICEBIGHAMMER, Ref.ICEMAN, Ref.SHARDMAGNUM, Ref.GLACIESEDGE]), + ] # 碎冰破 # mage_male/glacial_master/de3fea2d65c597f4d55c70a02b97fc79 @@ -1425,6 +1508,7 @@ class Skill38(ActiveSkill): """ name = '碎冰破' + ref = Ref.SHARDMAGNUM cellPos = (8,13) learnLv = 75 masterLv = 40 @@ -1487,6 +1571,7 @@ class Skill39(ActiveSkill): """ name = '极冰领域' + ref = Ref.OVERFREEZEEXTENSION cellPos = (6,14) learnLv = 80 masterLv = 40 @@ -1547,6 +1632,7 @@ class Skill40(ActiveSkill): """ name = '永罪冰狱' + ref = Ref.JUDEKATHEETERNAL cellPos = (8,14) learnLv = 85 masterLv = 40 @@ -1590,6 +1676,7 @@ class Skill41(PassiveSkill): """ name = '冰凝之魂' + ref = Ref.FROSTHUNT cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1605,7 +1692,11 @@ class Skill41(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # [冰魄之弓]对弓箭未命中敌人的最后一击伤害增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 极冰猎魔斩 # mage_male/glacial_master/9f57da5cb3651d81ca7dc9f78be33d01 @@ -1616,6 +1707,7 @@ class Skill42(ActiveSkill): """ name = '极冰猎魔斩' + ref = Ref.GLACIESEDGE cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1646,6 +1738,7 @@ class Skill43(ActiveSkill): """ name = '永劫 : 纳斯特隆德' + ref = Ref.NASTROND cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/mage_male/swift_master.py b/backend/core/character/GF/mage_male/swift_master.py index b7f159ee..84d03266 100644 --- a/backend/core/character/GF/mage_male/swift_master.py +++ b/backend/core/character/GF/mage_male/swift_master.py @@ -1,6 +1,15 @@ # a5ccbaf5538981c6ef99b236c0a60b73 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.mage_male.swift_master import SwiftMasterSkillRef as Ref prefix = "mage_male/swift_master/cn/skillDetail" @@ -19,6 +28,7 @@ class Skill0(ActiveSkill): """ name = '魔法旋风' + ref = Ref.WINDSTRIKE cellPos = (4,1) learnLv = 1 masterLv = 10 @@ -53,6 +63,7 @@ class Skill1(ActiveSkill): 在决斗场内,冰球大小随技能等级增加而增大。\n """ name = "魔法冰球" + ref = Ref.WATERCANNON learnLv = 1 masterLv = 60 maxLv = 70 @@ -82,6 +93,7 @@ class Skill2(PassiveSkill): """ name = '不死之身' + ref = Ref.DIEHARD cellPos = (8,1) learnLv = 1 masterLv = 1 @@ -111,6 +123,7 @@ class Skill3(PassiveSkill): """ name = '黑暗之眼' + ref = Ref.ABYSS cellPos = (6,1) learnLv = 1 masterLv = 1 @@ -137,6 +150,7 @@ class Skill4(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -161,6 +175,7 @@ class Skill5(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -188,6 +203,7 @@ class Skill6(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -229,6 +245,7 @@ class Skill7(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -251,6 +268,7 @@ class Skill8(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -275,6 +293,7 @@ class Skill9(ActiveSkill): 转职为次元行者时,技能类型变为独立攻击力。\n """ name = "擒拿掌" + ref = Ref.PUSHOUT learnLv = 5 masterLv = 60 maxLv = 70 @@ -302,6 +321,7 @@ class Skill10(ActiveSkill): 转职为元素爆破师后,减少技能冷却时间,发射[属性变换]中所选属性的魔法球。\n """ name = "魔球连射" + ref = Ref.MULTISHOT learnLv = 5 masterLv = 1 maxLv = 11 @@ -333,6 +353,7 @@ class Skill11(ActiveSkill): 学习[虚妄之火]后,持续时间变更为无限,且无法发动攻击。\n """ name = "幽冥火" + ref = Ref.HOLONGLIGHT learnLv = 10 masterLv = 10 maxLv = 20 @@ -369,6 +390,7 @@ class Skill12(ActiveSkill): """ name = '瞬移' + ref = Ref.TELEPORT cellPos = (9,3) learnLv = 10 masterLv = 1 @@ -396,6 +418,7 @@ class Skill13(ActiveSkill): 持续输入按键可维持持盾状态,减少敌人远程攻击的伤害。\n """ name = "旋火盾" + ref = Ref.FIREPILLAR learnLv = 10 masterLv = 60 maxLv = 70 @@ -427,6 +450,7 @@ class Skill14(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -454,6 +478,7 @@ class Skill15(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -480,6 +505,7 @@ class Skill16(ActiveSkill): 转职成为冰结师时,才可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "冰魄剑" + ref = Ref.ICESWORD learnLv = 15 masterLv = 60 maxLv = 70 @@ -518,6 +544,7 @@ class Skill17(PassiveSkill): """ name = '疾风掌控' + ref = Ref.WINDMASTER cellPos = (2,4) learnLv = 15 masterLv = 1 @@ -546,6 +573,7 @@ class Skill18(ActiveSkill): """ name = '狂风冲刺' + ref = Ref.SONICMOVE cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -580,6 +608,7 @@ class Skill19(ActiveSkill): """ name = '回风斩' + ref = Ref.WINDCUT cellPos = (6,4) learnLv = 15 masterLv = 60 @@ -614,6 +643,7 @@ class Skill20(PassiveSkill): """ name = '疾风之棍棒精通' + ref = Ref.STICKMASTERY cellPos = (8,4) learnLv = 15 masterLv = 20 @@ -636,9 +666,14 @@ class Skill20(PassiveSkill): data3 = get_data(f'{prefix}/{uuid}', 3) # 攻击速度增加 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data0, 'type': '$*PAtkP'}, + # {'data': data3, 'type': '*cdReduce', 'exceptSkills': ['万象风龙阵', '无限风域', '风之极·永坠']}, + # ] associate = [ - {'data': data0, 'type': '$*PAtkP'}, - {'data': data3, 'type': '*cdReduce', 'exceptSkills': ['万象风龙阵', '无限风域', '风之极·永坠']}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data3)), except_skills=[Ref.GODWIND, Ref.FINALTEMPEST, Ref.ARACAN]), ] # 流风诀 @@ -650,6 +685,7 @@ class Skill21(ActiveSkill): """ name = '流风诀' + ref = Ref.WINDINESS cellPos = (5,5) learnLv = 20 masterLv = 20 @@ -685,6 +721,7 @@ class Skill22(ActiveSkill): """ name = '朔风牵引' + ref = Ref.VACUUM cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -718,6 +755,7 @@ class Skill23(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -741,6 +779,7 @@ class Skill24(ActiveSkill): """ name = '游离之风' + ref = Ref.TORNADO cellPos = (6,6) learnLv = 25 masterLv = 60 @@ -776,6 +815,7 @@ class Skill25(ActiveSkill): """ name = '风鸣冲击' + ref = Ref.WINDBLASTER cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -808,6 +848,7 @@ class Skill26(ActiveSkill): """ name = '双翼风刃' + ref = Ref.HURRICANE cellPos = (6,7) learnLv = 30 masterLv = 60 @@ -839,6 +880,7 @@ class Skill27(PassiveSkill): """ name = '风之意志' + ref = Ref.HARBINGER cellPos = (4,7) learnLv = 30 masterLv = 5 @@ -852,7 +894,11 @@ class Skill27(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 刃风 # mage_male/swift_master/128b9ddef2262f40723deae4407bdb42 @@ -868,6 +914,7 @@ class Skill28(ActiveSkill): """ name = '刃风' + ref = Ref.WINDBLADES cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -933,6 +980,7 @@ class Skill29(ActiveSkill): """ name = '风暴之眼' + ref = Ref.EYEOFSTORM cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -982,6 +1030,7 @@ class Skill30(ActiveSkill): """ name = '真空旋风破' + ref = Ref.RAGINGWIND cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -1039,6 +1088,7 @@ class Skill31(ActiveSkill): """ name = '风暴之拳' + ref = Ref.STORMSTRIKES cellPos = (3,10) learnLv = 45 masterLv = 60 @@ -1098,6 +1148,7 @@ class Skill32(PassiveSkill): """ name = '御风之力' + ref = Ref.POWEROFWINDGOD cellPos = (6,11) learnLv = 48 masterLv = 40 @@ -1113,7 +1164,11 @@ class Skill32(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 移动速度增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 万象风龙阵 # mage_male/swift_master/0b8db1e10b3abbd24d38564e708675d5 @@ -1124,6 +1179,7 @@ class Skill33(ActiveSkill): """ name = '万象风龙阵' + ref = Ref.GODWIND cellPos = (4,11) learnLv = 50 masterLv = 40 @@ -1158,6 +1214,7 @@ class Skill34(ActiveSkill): """ name = '疾风瞬影闪' + ref = Ref.GALEHIGHWAY cellPos = (3,12) learnLv = 60 masterLv = 40 @@ -1210,6 +1267,7 @@ class Skill35(ActiveSkill): """ name = '风卷残云' + ref = Ref.STORMQUAKE cellPos = (5,13) learnLv = 70 masterLv = 40 @@ -1264,6 +1322,7 @@ class Skill36(PassiveSkill): """ name = '风神诀' + ref = Ref.SECENDWIND cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1277,7 +1336,11 @@ class Skill36(PassiveSkill): # 追加伤害比率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 游龙惊风破 # mage_male/swift_master/d110449993fb973f1a62c62c695003db @@ -1288,6 +1351,7 @@ class Skill37(ActiveSkill): """ name = '游龙惊风破' + ref = Ref.SPIRALPRESS cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1343,6 +1407,7 @@ class Skill38(ActiveSkill): """ name = '九霄风雷' + ref = Ref.VIOLENTSTORM cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1395,6 +1460,7 @@ class Skill39(ActiveSkill): """ name = '无限风域' + ref = Ref.FINALTEMPEST cellPos = (7,14) learnLv = 85 masterLv = 40 @@ -1442,6 +1508,7 @@ class Skill40(PassiveSkill): """ name = '初始之风' + ref = Ref.GENESISVENTUS cellPos = (6,15) learnLv = 95 masterLv = 40 @@ -1455,7 +1522,11 @@ class Skill40(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 怒风狂涌 # mage_male/swift_master/29c0b8b3eed7252b3bdcddc2b4e9e3a0 @@ -1468,6 +1539,7 @@ class Skill41(ActiveSkill): """ name = '怒风狂涌' + ref = Ref.TURBULENTRUMBLE cellPos = (4,15) learnLv = 95 masterLv = 40 @@ -1508,6 +1580,7 @@ class Skill42(ActiveSkill): """ name = '风之极·永坠' + ref = Ref.ARACAN cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/priest_female/crusader_female.py b/backend/core/character/GF/priest_female/crusader_female.py index f63d45b4..f6f18c95 100644 --- a/backend/core/character/GF/priest_female/crusader_female.py +++ b/backend/core/character/GF/priest_female/crusader_female.py @@ -1,6 +1,13 @@ #0c1b401bb09241570d364420b3ba3fd7 from core.basic.skill import PassiveBufferSkill,ActiveBufferSkill,ActiveSkill,PassiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, +) +from core.character.refs.priest_female.crusader_female import CrusaderFemaleSkillRef as Ref prefix = "priest_female/crusader_female/cn/skillDetail" @@ -14,6 +21,7 @@ class Skill0(ActiveSkill): 转职为光明骑士时,技能类型变为独立攻击力。\n """ name = "升空斩" + ref = Ref.RISINGSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -41,6 +49,7 @@ class Skill1(ActiveSkill): 被命中的敌人会浮空。\n """ name = "审判锤击" + ref = Ref.HOLYSMASH learnLv = 1 masterLv = 60 maxLv = 70 @@ -67,6 +76,7 @@ class Skill2(PassiveBufferSkill): 单人挑战时,不适用增加属性伤害的减益效果,而是增加自身独立攻击力,减少技能冷却时间。\n """ name = "圣光灌注" + ref = Ref.GRACEOFDEVINE cellPos = (3,1) learnLv = 1 masterLv = 1 @@ -105,6 +115,7 @@ class Skill3(PassiveSkill): 增加基本攻击力、 技能攻击力、 攻击速度。\n """ name = "启示 : 惩戒" + ref = Ref.CRUSADE cellPos = (4,1) learnLv = 1 masterLv = 1 @@ -129,6 +140,7 @@ class Skill4(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -152,6 +164,7 @@ class Skill5(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -179,6 +192,7 @@ class Skill6(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -210,6 +224,7 @@ class Skill7(PassiveSkill): 在决斗场中,无法转换攻击类型,适用技能固有的攻击类型。\n """ name = "攻击类型转换" + ref = Ref.CONVERSION learnLv = 1 masterLv = 1 maxLv = 1 @@ -244,6 +259,7 @@ class Skill8(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -266,6 +282,7 @@ class Skill9(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -288,6 +305,7 @@ class Skill10(ActiveSkill): 只能在一定高度以上时才能使用。\n """ name = "空中锤击" + ref = Ref.VIOLENTASSAULT learnLv = 5 masterLv = 60 maxLv = 70 @@ -321,6 +339,7 @@ class Skill11(ActiveBufferSkill): 学习[大天使的庇护]后,施放[勇气颂歌]、 [新生颂歌]过程中可以使用该技能。\n """ name = "治愈祈祷" + ref = Ref.PRAYEROFHEAL cellPos = (4,2) learnLv = 5 masterLv = 60 @@ -355,6 +374,7 @@ class Skill12(ActiveSkill): 转职为光明骑士后,技能类型变为独立攻击力。\n """ name = "钩颈斩" + ref = Ref.NECKUPSCYTHE learnLv = 5 masterLv = 60 maxLv = 70 @@ -382,6 +402,7 @@ class Skill13(ActiveSkill): 按住技能键可以维持防御姿态。 抵挡前方的攻击后,可以强制使用其他技能。\n """ name = "武器格挡" + ref = Ref.WEAPONGUARD learnLv = 10 masterLv = 5 maxLv = 15 @@ -408,6 +429,7 @@ class Skill14(ActiveBufferSkill): 使范围内的所有队员消除异常状态。\n """ name = "净化" + ref = Ref.CURE cellPos = (4,3) learnLv = 10 masterLv = 1 @@ -437,6 +459,7 @@ class Skill15(ActiveSkill): [我甘愿承担这些罪业。]\n """ name = "罪业加身" + ref = Ref.HEAVYSIN learnLv = 10 masterLv = 60 maxLv = 70 @@ -470,6 +493,7 @@ class Skill16(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -497,6 +521,7 @@ class Skill17(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -531,6 +556,7 @@ class Skill18(ActiveSkill): - 对每名敌人攻击1次。\n """ name = "唤雷符" + ref = Ref.TALISMANOFLIGHTNING learnLv = 15 masterLv = 60 maxLv = 70 @@ -564,6 +590,7 @@ class Skill19(ActiveSkill): 按住向后方向键并再次按技能键,可以向后转身发动前冲斩; 前冲斩击攻击力和[冲刺斩]的上斩攻击力相同。\n """ name = "冲刺斩" + ref = Ref.CUTINDASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -593,6 +620,7 @@ class Skill20(ActiveSkill): 光芒与敌人碰撞时会爆炸,并给敌人造成光属性伤害。\n """ name = "圣洁之光" + ref = Ref.HOLYFLASH cellPos = (8,4) learnLv = 15 masterLv = 60 @@ -621,6 +649,7 @@ class Skill21(PassiveBufferSkill): [勇气颂歌]的攻击功能可以在已学习的技能窗口上用鼠标右键设置开启/关闭。\n """ name = "启示 : 颂歌" + ref = Ref.ARIA cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -636,7 +665,11 @@ class Skill21(PassiveBufferSkill): data0 = get_data(f'{prefix}/{uuid}', 0) INT = data0 - associate = [{"data":data0,"type":"$+INT","ratio":1}] + # 迁移前实现(保留对照): + # associate = [{"data":data0,"type":"$+INT","ratio":1}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.INT, operation=Operation.ADD, value=LevelTable(data0)), + ] # 光杖精通 # priest_female/crusader_female/9cb6f9ed646fa87f9b7680a42ce83d1a @@ -646,6 +679,7 @@ class Skill22(PassiveSkill): 增加独立攻击力和魔法暴击率,使用光杖系列武器攻击时,增加施放速度。\n """ name = "光杖精通" + ref = Ref.CROSSMASTERY cellPos = (0,5) learnLv = 20 masterLv = 10 @@ -664,7 +698,11 @@ class Skill22(PassiveSkill): # [装备光杖时] # 施放速度增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{"data": data0, "type": "$*PATKI"}] + # 迁移前实现(保留对照): + # associate = [{"data": data0, "type": "$*PATKI"}] + associate = [ + # 原角色字段 PATKI 未被旧引擎支持,原先不生效;本次迁移保留此行为。 + ] # 胜利之矛 # priest_female/crusader_female/3d8f3d438405d79f8d3ed68072674d1e @@ -678,6 +716,7 @@ class Skill23(ActiveSkill): 学习[圣天使之光]后,默认以最大蓄气状态施放。\n """ name = "胜利之矛" + ref = Ref.SPEAROFVICTORY cellPos = (6,5) learnLv = 20 masterLv = 60 @@ -719,6 +758,7 @@ class Skill24(ActiveSkill): 该技能效果不与光明骑士 (男) 的[守护徽章]以及小魔女的[小魔女的偏爱]、 缪斯的[主角登场]、 协战师的[装甲强化]技能效果叠加。\n """ name = "守护祝福" + ref = Ref.BLESSOFPROTECTION cellPos = (4,5) learnLv = 20 masterLv = 10 @@ -752,6 +792,7 @@ class Skill25(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -776,6 +817,7 @@ class Skill26(ActiveSkill): 学习[圣天使之光]后,施放[勇气颂歌]、 [新生颂歌]过程中可以使用该技能,此时攻击周围的敌人。\n """ name = "洗礼之光" + ref = Ref.LIGHTOFHAPTISM cellPos = (8,6) learnLv = 25 masterLv = 60 @@ -808,6 +850,7 @@ class Skill27(ActiveSkill): 在决斗场中,在持续时间内减少移动速度,同时增加[守护祝福]的增益效果。\n """ name = "圣光守护" + ref = Ref.HOLYLIGHT cellPos = (5,6) learnLv = 25 masterLv = 50 @@ -851,6 +894,7 @@ class Skill28(ActiveBufferSkill): 效果不与光明骑士 (男) 的[荣誉祝福]、 小魔女的[禁术吟咏]、 缪斯的[可爱节拍]、 协战师的[军械强化]的技能效果叠加。\n """ name = "勇气祝福" + ref = Ref.BLESSOFCOURAGE cellPos = (4,7) learnLv = 30 masterLv = 10 @@ -898,6 +942,7 @@ class Skill29(ActiveSkill): 光芒墙壁会推进撞到的敌人并造成持续伤害,到达最远距离后墙壁会爆炸。\n """ name = "圣光烬盾" + ref = Ref.SAINTFLASH cellPos = (8,7) learnLv = 30 masterLv = 60 @@ -937,6 +982,7 @@ class Skill30(ActiveSkill): 决斗场中无法强制中断并立即施放其他技能。\n """ name = "神光惩戒" + ref = Ref.SHINECROSS cellPos = (6,7) learnLv = 30 masterLv = 60 @@ -979,6 +1025,7 @@ class Skill31(ActiveBufferSkill): 学习[大天使的庇护]后,增加[勇气颂歌]范围。\n """ name = "勇气颂歌" + ref = Ref.ARIAOFCOURAGE cellPos = (2,8) learnLv = 35 masterLv = 60 @@ -1060,6 +1107,7 @@ class Skill32(ActiveSkill): 在决斗场中再次按技能键时,光环不会爆炸。\n """ name = "神圣锁环" + ref = Ref.HOLYCIRCLET cellPos = (8,8) learnLv = 35 masterLv = 60 @@ -1139,6 +1187,7 @@ class Skill33(ActiveBufferSkill): 施放[勇气颂歌]、 [新生颂歌]时,可以使用[神之教诲]。\n """ name = "神之教诲" + ref = Ref.EDIFICATION cellPos = (5,8) learnLv = 35 masterLv = 1 @@ -1173,6 +1222,7 @@ class Skill34(ActiveSkill): 在决斗场中,解除对敌人赋予的效果,不适用忏悔状态。\n """ name = "忏悔之雷" + ref = Ref.THUNDEROFCLEANS cellPos = (8,9) learnLv = 40 masterLv = 60 @@ -1253,6 +1303,7 @@ class Skill35(ActiveSkill): 学习[大天使的庇护]后,增加复活范围。\n """ name = "复苏之光" + ref = Ref.REVIVE cellPos = (5,9) learnLv = 40 masterLv = 1 @@ -1291,6 +1342,7 @@ class Skill36(ActiveBufferSkill): 在决斗场中无法强制中断并施放其他技能。\n """ name = "神光十字" + ref = Ref.GRANDCROSSCRASH cellPos = (6,10) learnLv = 45 masterLv = 60 @@ -1356,6 +1408,7 @@ class Skill37(ActiveBufferSkill): 学习[大天使的庇护]后,增加[新生颂歌]范围。\n """ name = "新生颂歌" + ref = Ref.ARIAOFREGENERATION cellPos = (2,10) learnLv = 45 masterLv = 1 @@ -1394,6 +1447,7 @@ class Skill38(PassiveBufferSkill): 光明歌颂者的技能命中敌人时,可以延长队友携带的增益效果持续时间。\n """ name = "虔诚信念" + ref = Ref.ZEALOFFAITH cellPos = (7,11) learnLv = 48 masterLv = 40 @@ -1422,8 +1476,12 @@ class Skill38(PassiveBufferSkill): STRINT = data0 INT = data0 + # 迁移前实现(保留对照): + # associate = [ + # {"data":INT,"type":"$+INT","ratio":1} + # ] associate = [ - {"data":INT,"type":"$+INT","ratio":1} + CharacterEffect(attribute=CharacterAttribute.INT, operation=Operation.ADD, value=LevelTable(INT)), ] # 圣光天启 @@ -1438,6 +1496,7 @@ class Skill39(ActiveBufferSkill): 效果不与光明骑士 (男) 的[天启之光]和小魔女的[开幕! 人偶剧场]、 缪斯的[梦想的舞台]、 协战师的[强袭策略 : 区域肃清]的效果叠加。\n """ name = "圣光天启" + ref = Ref.CRUXOFVICTORIA cellPos = (6,11) learnLv = 50 masterLv = 40 @@ -1478,6 +1537,7 @@ class Skill40(PassiveSkill): [苦修后获得的这股力量,只为守护你而使用。]\n """ name = "苦修" + ref = Ref.FLAGELLANTS cellPos = (8,11) learnLv = 50 masterLv = 1 @@ -1501,6 +1561,7 @@ class Skill41(ActiveSkill): 命中敌人时,可强制中断并施放[神光惩戒]、 [神光十字];[神光惩戒]、 [神光十字]命中敌人时,可强制中断并施放[忏悔重击]。\n """ name = "忏悔重击" + ref = Ref.REPENTENCESMASH cellPos = (6,12) learnLv = 60 masterLv = 40 @@ -1573,6 +1634,7 @@ class Skill42(ActiveBufferSkill): 力量和智力增加效果仅适用于队友,并不适用于自身。\n """ name = "圣洁之翼" + ref = Ref.BLESSOFANGEL cellPos = (5,13) learnLv = 70 masterLv = 40 @@ -1653,6 +1715,7 @@ class Skill43(PassiveBufferSkill): 复活有冷却时间,复活自身的功能可以在已学的技能栏中通过鼠标右击进行开启/关闭切换。\n """ name = "大天使的庇护" + ref = Ref.BLESSOFRAPHAEL cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1679,8 +1742,12 @@ class Skill43(PassiveBufferSkill): INT = data0 + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0 ,"type":"$+INT","ratio":1} + # ] associate = [ - {"data":data0 ,"type":"$+INT","ratio":1} + CharacterEffect(attribute=CharacterAttribute.INT, operation=Operation.ADD, value=LevelTable(data0)), ] # 圣佑之阵 @@ -1694,6 +1761,7 @@ class Skill44(ActiveBufferSkill): 施放[勇气颂歌]、 [新生颂歌]过程中,可以使用[圣佑之阵]。\n """ name = "圣佑之阵" + ref = Ref.PROTECTIONOFURIEL cellPos = (4,13) learnLv = 75 masterLv = 40 @@ -1755,6 +1823,7 @@ class Skill45(ActiveBufferSkill): 首次目标范围内没有队友或敌人时,不会施放圣光普照; 没有队友,只存在一名敌人时,圣光普照的攻击力得到强化。\n """ name = "圣光普照" + ref = Ref.MIRACLECHINE cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1828,6 +1897,7 @@ class Skill46(ActiveSkill): 施放技能时,进入无敌状态,被圣光长矛穿透敌人进入强制控制状态。\n """ name = "救赎彼岸 : 惩戒圣枪" + ref = Ref.BRIONAC cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1865,6 +1935,7 @@ class Skill47(PassiveBufferSkill): <大天使萨菲尔,这是我的权能。>\n """ name = "圣天使之光" + ref = Ref.LUCULENTUISANGEL cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1883,8 +1954,12 @@ class Skill47(PassiveBufferSkill): INT = data1 + # 迁移前实现(保留对照): + # associate = [ + # {"data":data1,"type":"$+INT","ratio":1} + # ] associate = [ - {"data":data1,"type":"$+INT","ratio":1} + CharacterEffect(attribute=CharacterAttribute.INT, operation=Operation.ADD, value=LevelTable(data1)), ] # 圣言十字 @@ -1900,6 +1975,7 @@ class Skill48(ActiveSkill): <施惠于众生,铲除邪恶>\n """ name = "圣言十字" + ref = Ref.CRUXOFSHAPIEL cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1951,6 +2027,7 @@ class Skill49(ActiveBufferSkill): <全能的雷米迪奥斯啊,请聆听我们的赞歌>\n """ name = "祈愿·天使赞歌" + ref = Ref.LAUSDEANGELUS cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/priest_female/infighter_female.py b/backend/core/character/GF/priest_female/infighter_female.py index 3956794e..bd28fbc5 100644 --- a/backend/core/character/GF/priest_female/infighter_female.py +++ b/backend/core/character/GF/priest_female/infighter_female.py @@ -1,6 +1,18 @@ #0c1b401bb09241570d364420b3ba3fd7 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Equals, + LevelTable, + Operation, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.priest_female.infighter_female import InfighterFemaleSkillRef as Ref prefix = "priest_female/infighter_female/cn/skillDetail" @@ -12,6 +24,7 @@ class Skill0(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -35,6 +48,7 @@ class Skill1(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -54,7 +68,11 @@ class Skill1(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['上勾拳','圣拳连击']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['上勾拳','圣拳连击']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.UPPERCUT, Ref.ATGORGEOUSCOMBINATION]), + ] # 受身蹲伏 # priest_female/infighter_female/ce26c6b69d02a440a81b552bec94f03b @@ -64,6 +82,7 @@ class Skill2(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -94,6 +113,7 @@ class Skill3(ActiveSkill): 该技能可取消施放后的僵直并发动其他技能,而[摆步]可随时强制中断该技能后立即发动。\n """ name = "双刺拳" + ref = Ref.ONETWO cellPos = (5,1) learnLv = 1 masterLv = 60 @@ -127,6 +147,7 @@ class Skill4(ActiveSkill): 该技能可取消施放后的僵直并发动其他技能,而[摆步]可随时强制中断该技能后立即发动。\n """ name = "上勾拳" + ref = Ref.UPPERCUT cellPos = (4,1) learnLv = 1 masterLv = 10 @@ -156,6 +177,7 @@ class Skill5(ActiveSkill): 可以强制中断除觉醒技能、 [抓取重击]和[嗜战技能]以外的所有技能并施放[摆步],且在施放[摆步]过程中可以强制中断并发动其他技能。\n """ name = "摆步" + ref = Ref.WEAVING cellPos = (7,1) learnLv = 1 masterLv = 1 @@ -187,6 +209,7 @@ class Skill6(PassiveSkill): 攻击力与[上勾拳]技能攻击力相同。\n """ name = "勾拳追击" + ref = Ref.ATSECONDUPPER cellPos = (4,2) learnLv = 1 masterLv = 1 @@ -221,6 +244,7 @@ class Skill7(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -243,6 +267,7 @@ class Skill8(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -266,6 +291,7 @@ class Skill9(ActiveSkill): 学习[大天使的庇护]后,施放[勇气颂歌]、 [新生颂歌]过程中可以使用该技能。\n """ name = "治愈祈祷" + ref = Ref.PRAYEROFHEAL learnLv = 5 masterLv = 60 maxLv = 70 @@ -297,6 +323,7 @@ class Skill10(ActiveSkill): 该技能可取消施放后的僵直并发动其他技能,而[摆步]可随时强制中断该技能后立即发动。\n """ name = "螺旋直拳" + ref = Ref.SCREWSTRAIGHT cellPos = (2,2) learnLv = 5 masterLv = 60 @@ -326,6 +353,7 @@ class Skill11(ActiveSkill): 使范围内的所有队员消除异常状态。\n """ name = "净化" + ref = Ref.CURE learnLv = 10 masterLv = 1 maxLv = 11 @@ -356,6 +384,7 @@ class Skill12(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -383,6 +412,7 @@ class Skill13(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -410,6 +440,7 @@ class Skill14(ActiveSkill): 抽打后可以取消施放后的僵直并发动其他技能。\n """ name = "抓取重击" + ref = Ref.GRABBLOW cellPos = (5,3) learnLv = 10 masterLv = 60 @@ -443,6 +474,7 @@ class Skill15(PassiveSkill): 可以通过开启/关闭功能设置在地下城内是否显示所穿戴的武器。\n """ name = "意志之拳" + ref = Ref.WILLOFFIST cellPos = (0,4) learnLv = 15 masterLv = 10 @@ -457,7 +489,11 @@ class Skill15(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 圣拳连击 # priest_female/infighter_female/87a918bb22cfc959a16e0bf939bb6c24 @@ -469,6 +505,7 @@ class Skill16(ActiveSkill): 该技能可取消施放后的僵直并发动其他技能,而[摆步]可随时强制中断该技能后立即发动。\n """ name = "圣拳连击" + ref = Ref.ATGORGEOUSCOMBINATION cellPos = (3,4) learnLv = 15 masterLv = 1 @@ -507,6 +544,7 @@ class Skill17(ActiveSkill): 该技能可取消刺拳后僵直并发动其他技能,而[摆步]可随时强制中断该技能后立即发动。\n """ name = "闪避步" + ref = Ref.DUCKINGSTEP cellPos = (7,4) learnLv = 15 masterLv = 60 @@ -532,6 +570,7 @@ class Skill18(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP cellPos = (5,0) learnLv = 20 masterLv = 10 @@ -557,6 +596,7 @@ class Skill19(ActiveSkill): 施放时,接近周围最强的敌人并对其发动腹部重击,若范围内没有敌人则无法施放。\n """ name = "腹部重击" + ref = Ref.BODYBLOW cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -593,6 +633,7 @@ class Skill20(ActiveSkill): 该技能可取消拉拽及上勾拳施放后的僵直,并发动其他技能,而[摆步]可随时强制中断该技能后立即发动。\n """ name = "侧击拳" + ref = Ref.SIDEKNUCKLE cellPos = (6,5) learnLv = 20 masterLv = 60 @@ -632,6 +673,7 @@ class Skill21(PassiveSkill): 可以设置是否显示画面边框特效。\n """ name = "战意" + ref = Ref.TENSION cellPos = (0,6) learnLv = 25 masterLv = 1 @@ -658,7 +700,11 @@ class Skill21(PassiveSkill): # 战意释放结束缓冲时间 : {value5}秒 data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [ {"type":"*cdReduce","data":data0,"exceptSkills":['圣拳锤击','蓄劲轰拳','巨力炮拳','泯灭之怒','拳震八方','怒气贯地击','致命冲拳','炽拳 : 以暴制暴','意志之拳 : 与神同行']}] + # 迁移前实现(保留对照): + # associate = [ {"type":"*cdReduce","data":data0,"exceptSkills":['圣拳锤击','蓄劲轰拳','巨力炮拳','泯灭之怒','拳震八方','怒气贯地击','致命冲拳','炽拳 : 以暴制暴','意志之拳 : 与神同行']}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data0)), except_skills=[Ref.ATDIVINECRUSH, Ref.MASSPISTOL, Ref.GIGANTICCANNON, Ref.IMPERIUMRAGE, Ref.VIOLENTCRUSH, Ref.BRUTALCOMBINATION, Ref.FATALIMPACT, Ref.ARDEREVEHEMENS, Ref.PUGNUSVOLUNTATIS]), + ] # 圣拳锤击 # priest_female/infighter_female/ca2536eb56df0e812c88c59cabd38be0 @@ -674,6 +720,7 @@ class Skill22(ActiveSkill): 在战意释放状态下,作为第一个嗜战技能施放时,不会适用缓冲时间。\n """ name = "圣拳锤击" + ref = Ref.ATDIVINECRUSH cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -709,6 +756,7 @@ class Skill23(ActiveSkill): 该技能可取消施放后的僵直并发动其他技能,而[摆步]可随时强制中断该技能后立即发动。\n """ name = "幻影直拳" + ref = Ref.FAKETWIST cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -738,6 +786,7 @@ class Skill24(PassiveSkill): 通过神拳修炼,增加物理攻击力、 命中率和回避率。\n """ name = "圣拳修炼" + ref = Ref.HOLYFISTTRAINING cellPos = (0,7) learnLv = 30 masterLv = 10 @@ -756,7 +805,11 @@ class Skill24(PassiveSkill): # 回避率增加 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [ {'type': '$*PAtkP', 'data': data0}, ] + # 迁移前实现(保留对照): + # associate = [ {'type': '$*PAtkP', 'data': data0}, ] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 神体合一 # priest_female/infighter_female/c1dd8b776fb1dd24c6373c678ef1dd2e @@ -767,6 +820,7 @@ class Skill25(ActiveSkill): 一定时间内,增加基本攻击力、 转职技能攻击力和攻击速度。\n """ name = "神体合一" + ref = Ref.BODYSPIRITBECOMEONE cellPos = (7,7) learnLv = 30 masterLv = 10 @@ -799,6 +853,7 @@ class Skill26(ActiveSkill): 可以取消冲击波生成后的僵直并发动其他技能。\n """ name = "蓄劲轰拳" + ref = Ref.MASSPISTOL cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -837,6 +892,7 @@ class Skill27(ActiveSkill): 该技能可取消施放后的僵直并发动其他技能,而[摆步]可随时强制中断该技能后立即发动。\n """ name = "旋风冲拳" + ref = Ref.BLOWSHOT cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -874,6 +930,7 @@ class Skill28(ActiveSkill): 该技能可取消施放后的僵直并发动其他技能,而[摆步]可随时强制中断该技能后立即发动。\n """ name = "极速飓风拳" + ref = Ref.ATHURRICANEROLL cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -934,6 +991,7 @@ class Skill29(ActiveSkill): 该技能可取消施放后的僵直并发动其他技能,而[摆步]可随时强制中断该技能后立即发动。\n """ name = "瞬闪袭拳" + ref = Ref.HOLLOWBACK cellPos = (2,9) learnLv = 40 masterLv = 60 @@ -991,6 +1049,7 @@ class Skill30(ActiveSkill): 该技能可取消施放后的僵直并发动其他技能,而[摆步]可随时强制中断该技能后立即发动。\n """ name = "神圣组合拳" + ref = Ref.ATHEAVENLYCOMBINATION cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -1042,10 +1101,14 @@ class Skill30(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{'type': '*skillRation', 'data': [0] + [-16.7] * self.maxLv, 'skills': ['腹部重击']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-16.7] * self.maxLv, 'skills': ['腹部重击']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-16.7] * maxLv)), skills=[Ref.BODYBLOW], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 巨力炮拳 # priest_female/infighter_female/b860cbf5979b4bcc6beea725636b915e @@ -1059,6 +1122,7 @@ class Skill31(ActiveSkill): 全力一击后可以取消施放后的僵直并发动其他技能。\n """ name = "巨力炮拳" + ref = Ref.GIGANTICCANNON cellPos = (3,10) learnLv = 45 masterLv = 60 @@ -1102,13 +1166,18 @@ class Skill31(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [ - {'data': [0] + [100] * self.maxLv, 'skills': ['蓄劲轰拳']}, - {'type': '=cd','data': [25] + [50] * self.maxLv,'ratio': 1, 'skills': ['蓄劲轰拳']} - ] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [ + # {'data': [0] + [100] * self.maxLv, 'skills': ['蓄劲轰拳']}, + # {'type': '=cd','data': [25] + [50] * self.maxLv,'ratio': 1, 'skills': ['蓄劲轰拳']} + # ] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0] + [100] * maxLv)), skills=[Ref.MASSPISTOL], when=Equals(Read(SkillAttribute.VP), 2)), + SkillEffect(attribute=SkillAttribute.CD, operation=Operation.ASSIGN, value=LevelTable([25] + [50] * maxLv), skills=[Ref.MASSPISTOL], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 潜藏暴戾 # priest_female/infighter_female/37cf7b7a269058dc02bef5b5bc9de282 @@ -1119,6 +1188,7 @@ class Skill32(PassiveSkill): 增加基本攻击力、 转职技能攻击力和物理暴击率。\n """ name = "潜藏暴戾" + ref = Ref.VEILEDINSTINCT cellPos = (1,11) learnLv = 48 masterLv = 40 @@ -1135,7 +1205,11 @@ class Skill32(PassiveSkill): # 物理暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 泯灭之怒 # priest_female/infighter_female/97972dba4694d6c0fcd2f7e8efb3a499 @@ -1147,6 +1221,7 @@ class Skill33(ActiveSkill): 最后一击后可以取消施放后的僵直并发动其他技能。\n """ name = "泯灭之怒" + ref = Ref.IMPERIUMRAGE cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1187,6 +1262,7 @@ class Skill34(ActiveSkill): 该技能可取消施放后的僵直并发动其他技能,而[摆步]可随时强制中断该技能后立即发动。\n """ name = "风暴猛击" + ref = Ref.STORMFIST cellPos = (2,12) learnLv = 60 masterLv = 40 @@ -1246,6 +1322,7 @@ class Skill35(ActiveSkill): 砸地后可以取消施放后的僵直并发动其他技能。\n """ name = "拳震八方" + ref = Ref.VIOLENTCRUSH cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1302,10 +1379,14 @@ class Skill35(ActiveSkill): self.cd = 20 self.skillRation *= 0.5 - def effect(self, old, new): - if self.vp == 1: - self.associate = [{'type': '*skillRation', 'data': [0] + [-28.6] * self.maxLv, 'skills': ['圣拳锤击']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 1: + # self.associate = [{'type': '*skillRation', 'data': [0] + [-28.6] * self.maxLv, 'skills': ['圣拳锤击']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-28.6] * maxLv)), skills=[Ref.ATDIVINECRUSH], when=Equals(Read(SkillAttribute.VP), 1)), + ] # 斗志沸腾 # priest_female/infighter_female/4e9e8942841b9767f683fb23c1ef1435 @@ -1316,6 +1397,7 @@ class Skill36(PassiveSkill): 增加基本攻击力和转职技能攻击力。 战意值不会低于特定数值,且即使不攻击敌人,战意也会随着时间自动增加。\n """ name = "斗志沸腾" + ref = Ref.INCOMPLETECOMBUSTION cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1330,7 +1412,11 @@ class Skill36(PassiveSkill): # 基本攻击力及转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 怒气贯地击 # priest_female/infighter_female/ef896bbdc68660c22b6e60502044d690 @@ -1344,6 +1430,7 @@ class Skill37(ActiveSkill): 产生冲击波后,可以取消施放后的僵直并发动其他技能。\n """ name = "怒气贯地击" + ref = Ref.BRUTALCOMBINATION cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1406,6 +1493,7 @@ class Skill38(ActiveSkill): 可以取消上勾拳后的僵直并发动其他技能。\n """ name = "致命冲拳" + ref = Ref.FATALIMPACT cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1467,6 +1555,7 @@ class Skill39(ActiveSkill): 最后一击后,可以取消施放后的僵直并发动其他技能。\n """ name = "炽拳 : 以暴制暴" + ref = Ref.ARDEREVEHEMENS cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1524,6 +1613,7 @@ class Skill40(PassiveSkill): 在战意释放状态下,作为第一个嗜战技能施放时,不会适用缓冲时间。\n """ name = "破妄归真" + ref = Ref.MYWAY cellPos = (1,15) learnLv = 95 masterLv = 40 @@ -1544,7 +1634,11 @@ class Skill40(PassiveSkill): # 敌人强制控制时间 : {value2}秒 data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 圣光三重破 # priest_female/infighter_female/f8226512ea3dbcb1fe1374baa0c6bbee @@ -1557,6 +1651,7 @@ class Skill41(ActiveSkill): 该技能可取消拳击后的僵直并发动其他技能,而[摆步]可随时强制中断该技能后立即发动。\n """ name = "圣光三重破" + ref = Ref.ACCELDRIVE cellPos = (6,15) learnLv = 95 masterLv = 40 @@ -1587,6 +1682,7 @@ class Skill42(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "意志之拳 : 与神同行" + ref = Ref.PUGNUSVOLUNTATIS cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/priest_female/inquistor.py b/backend/core/character/GF/priest_female/inquistor.py index 37d5d6e5..72b6f456 100644 --- a/backend/core/character/GF/priest_female/inquistor.py +++ b/backend/core/character/GF/priest_female/inquistor.py @@ -1,6 +1,15 @@ # 0c1b401bb09241570d364420b3ba3fd7 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.priest_female.inquistor import InquistorSkillRef as Ref prefix = "priest_female/inquistor/cn/skillDetail" @@ -16,6 +25,7 @@ class Skill0(ActiveSkill): """ name = '升空斩' + ref = Ref.RISINGSLASH cellPos = (2,1) learnLv = 1 masterLv = 10 @@ -44,6 +54,7 @@ class Skill1(ActiveSkill): """ name = '审判锤击' + ref = Ref.HOLYSMASH cellPos = (4,1) learnLv = 1 masterLv = 60 @@ -69,6 +80,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -93,6 +105,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -111,7 +124,11 @@ class Skill3(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['神焰']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['神焰']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.HOLYFLAME]), + ] # 受身蹲伏 # priest_female/inquistor/ce26c6b69d02a440a81b552bec94f03b @@ -121,6 +138,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -162,6 +180,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -184,6 +203,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -207,6 +227,7 @@ class Skill7(ActiveSkill): """ name = '空中锤击' + ref = Ref.VIOLENTASSAULT cellPos = (2,2) learnLv = 5 masterLv = 60 @@ -242,6 +263,7 @@ class Skill8(ActiveSkill): 学习[大天使的庇护]后,施放[勇气颂歌]、 [新生颂歌]过程中可以使用该技能。\n """ name = "治愈祈祷" + ref = Ref.PRAYEROFHEAL learnLv = 5 masterLv = 60 maxLv = 70 @@ -275,6 +297,7 @@ class Skill9(ActiveSkill): 转职为光明骑士后,技能类型变为独立攻击力。\n """ name = "钩颈斩" + ref = Ref.NECKUPSCYTHE learnLv = 5 masterLv = 60 maxLv = 70 @@ -303,6 +326,7 @@ class Skill10(ActiveSkill): """ name = '武器格挡' + ref = Ref.WEAPONGUARD cellPos = (2,3) learnLv = 10 masterLv = 5 @@ -329,6 +353,7 @@ class Skill11(ActiveSkill): 使范围内的所有队员消除异常状态。\n """ name = "净化" + ref = Ref.CURE learnLv = 10 masterLv = 1 maxLv = 11 @@ -359,6 +384,7 @@ class Skill12(ActiveSkill): """ name = '罪业加身' + ref = Ref.HEAVYSIN cellPos = (8,3) learnLv = 10 masterLv = 60 @@ -393,6 +419,7 @@ class Skill13(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -420,6 +447,7 @@ class Skill14(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -454,6 +482,7 @@ class Skill15(ActiveSkill): - 对每名敌人攻击1次。\n """ name = "唤雷符" + ref = Ref.TALISMANOFLIGHTNING learnLv = 15 masterLv = 60 maxLv = 70 @@ -488,6 +517,7 @@ class Skill16(ActiveSkill): """ name = '冲刺斩' + ref = Ref.CUTINDASH cellPos = (8,4) learnLv = 15 masterLv = 60 @@ -519,6 +549,7 @@ class Skill17(PassiveSkill): """ name = '审判者的裁决' + ref = Ref.WILLOFINQUISITOR cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -547,6 +578,7 @@ class Skill18(ActiveSkill): """ name = '净化火焰瓶' + ref = Ref.PATROLBOMB cellPos = (6,4) learnLv = 15 masterLv = 60 @@ -580,6 +612,7 @@ class Skill19(ActiveSkill): """ name = '惩戒十字' + ref = Ref.CROSSOFPUNISHMENT cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -610,6 +643,7 @@ class Skill20(PassiveSkill): """ name = '战斧精通' + ref = Ref.BATTLEAXEMASTERY cellPos = (0,5) learnLv = 20 masterLv = 10 @@ -629,7 +663,11 @@ class Skill20(PassiveSkill): # 命中率增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '$*PAtkP', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '$*PAtkP', 'data': data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 裁决之击 # priest_female/inquistor/01384bbfc346775d1267fa0bc4ca605f @@ -643,6 +681,7 @@ class Skill21(ActiveSkill): """ name = '裁决之击' + ref = Ref.PUNISHMENTBLOW cellPos = (2,5) learnLv = 20 masterLv = 60 @@ -678,6 +717,7 @@ class Skill22(ActiveSkill): """ name = '火焰精华' + ref = Ref.ESSENCEOFPHLEGE cellPos = (6,5) learnLv = 20 masterLv = 60 @@ -717,6 +757,7 @@ class Skill23(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -745,6 +786,7 @@ class Skill24(ActiveSkill): """ name = '神焰' + ref = Ref.HOLYFLAME cellPos = (6,6) learnLv = 25 masterLv = 10 @@ -780,7 +822,12 @@ class Skill24(ActiveSkill): # 攻击范围比率 : {value8}% data8 = get_data(f'{prefix}/{uuid}', 8) - associate = [{'data': data1}, {'data': data4, 'exceptSkills': ['火焰精华']}] + # 迁移前实现(保留对照): + # associate = [{'data': data1}, {'data': data4, 'exceptSkills': ['火焰精华']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data4)), except_skills=[Ref.ESSENCEOFPHLEGE]), + ] # 狂热信仰 # priest_female/inquistor/e49e57b2e8fbeceb0a2c56a0c63fe6c5 @@ -792,6 +839,7 @@ class Skill25(ActiveSkill): """ name = '狂热信仰' + ref = Ref.FANATICISM cellPos = (4,6) learnLv = 25 masterLv = 10 @@ -822,6 +870,7 @@ class Skill26(ActiveSkill): """ name = '审判重击' + ref = Ref.JUDGMENTBLOW cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -855,6 +904,7 @@ class Skill27(PassiveSkill): """ name = '神焰恩泽' + ref = Ref.POURESSENCE cellPos = (6,7) learnLv = 30 masterLv = 1 @@ -877,6 +927,7 @@ class Skill28(ActiveSkill): """ name = '神焰疾降' + ref = Ref.BLOOMINGFLAME cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -910,6 +961,7 @@ class Skill29(ActiveSkill): """ name = '神焰洗礼' + ref = Ref.FLAMEOFBAPTISM cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -972,6 +1024,7 @@ class Skill30(ActiveSkill): """ name = '神焰斩' + ref = Ref.SUMMARYTIRAL cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -1054,6 +1107,7 @@ class Skill31(ActiveSkill): """ name = '神焰怒火' + ref = Ref.VIRTUOUSFURY cellPos = (4,9) learnLv = 40 masterLv = 60 @@ -1113,6 +1167,7 @@ class Skill32(ActiveSkill): """ name = '净化之焰' + ref = Ref.PURIFICATION cellPos = (6,9) learnLv = 40 masterLv = 1 @@ -1138,7 +1193,7 @@ class Skill32(ActiveSkill): data3 = get_data(f'{prefix}/{uuid}', 3) def skillInfo(self, mode: str | None = None): - pre = self.char.GetSkillByName('神焰洗礼').skillInfo() + pre = self.char.GetSkill(Ref.FLAMEOFBAPTISM).skillInfo() cd = self.getSkillCD(mode) return pre[0] * 0.3 * self.skillRation, self.skillDamage, cd @@ -1172,6 +1227,7 @@ class Skill33(ActiveSkill): """ name = '行刑' + ref = Ref.DECOLLATION cellPos = (2,10) learnLv = 45 masterLv = 60 @@ -1228,6 +1284,7 @@ class Skill34(PassiveSkill): """ name = '异徒烙印' + ref = Ref.BRANDOFHERESY cellPos = (4,11) learnLv = 48 masterLv = 40 @@ -1244,7 +1301,11 @@ class Skill34(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data1, 'type': '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{'data': data1, 'type': '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 火之净化 # priest_female/inquistor/1fadde0eece18649caddbca7bd58cc2f @@ -1258,6 +1319,7 @@ class Skill35(ActiveSkill): """ name = '火之净化' + ref = Ref.BURNATTHESTAKE cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1296,6 +1358,7 @@ class Skill36(ActiveSkill): """ name = '神焰漩涡' + ref = Ref.VORTEXOFHELLFIRE cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1360,6 +1423,7 @@ class Skill37(ActiveSkill): """ name = '逆炎灭罪' + ref = Ref.REMOVALTREASON cellPos = (3,13) learnLv = 70 masterLv = 40 @@ -1421,6 +1485,7 @@ class Skill38(PassiveSkill): """ name = '定罪法则' + ref = Ref.MALLEUSMALEFICARUM cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1439,7 +1504,13 @@ class Skill38(PassiveSkill): # [神焰]、 [火焰精华]技能冷却时间减少率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0, 'type': '*skillDamage', 'skills': ['火焰精华']}, {'data': data1, 'type': '*skillDamage', 'exceptSkills': ['火焰精华']}, {'data': data2, 'type': '*cdReduce', 'skills': ['神焰', '火焰精华']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage', 'skills': ['火焰精华']}, {'data': data1, 'type': '*skillDamage', 'exceptSkills': ['火焰精华']}, {'data': data2, 'type': '*cdReduce', 'skills': ['神焰', '火焰精华']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.ESSENCEOFPHLEGE]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), except_skills=[Ref.ESSENCEOFPHLEGE]), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data2)), skills=[Ref.HOLYFLAME, Ref.ESSENCEOFPHLEGE]), + ] # 裁决轮回斩 # priest_female/inquistor/1812a1ece67bb37b6b44b54766450064 @@ -1452,6 +1523,7 @@ class Skill39(ActiveSkill): """ name = '裁决轮回斩' + ref = Ref.DISMEMBER cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1515,6 +1587,7 @@ class Skill40(ActiveSkill): """ name = '车轮刑' + ref = Ref.WHEELOFPUNISHMENT cellPos = (2,14) learnLv = 80 masterLv = 40 @@ -1575,6 +1648,7 @@ class Skill41(ActiveSkill): """ name = '炎狱祭坛 : 炮烙' + ref = Ref.INFERNO cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1617,6 +1691,7 @@ class Skill42(PassiveSkill): """ name = '狂炎告解' + ref = Ref.FIRECONFESSION cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1642,7 +1717,12 @@ class Skill42(PassiveSkill): data4 = get_data(f'{prefix}/{uuid}', 4) # [审判重击]火焰地带持续时间 : 2秒 - associate = [{'data': data0, 'type': '*skillDamage'}, {'data': [(i * j) for i, j in zip(data3, data4)], 'type': '*skillDamage', 'skills': ['审判重击']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '*skillDamage'}, {'data': [(i * j) for i, j in zip(data3, data4)], 'type': '*skillDamage', 'skills': ['审判重击']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i * j for i, j in zip(data3, data4)])), skills=[Ref.JUDGMENTBLOW]), + ] # [审判重击]火焰地带持续时间 : 2秒 # 补赎逆十字 @@ -1658,6 +1738,7 @@ class Skill43(ActiveSkill): """ name = '补赎逆十字' + ref = Ref.ERADICATECROSS cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1700,6 +1781,7 @@ class Skill44(ActiveSkill): """ name = '无间业火 : 罪灭神威' + ref = Ref.DREADFULFLAME cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/priest_female/mistress.py b/backend/core/character/GF/priest_female/mistress.py index df975789..4d25202f 100644 --- a/backend/core/character/GF/priest_female/mistress.py +++ b/backend/core/character/GF/priest_female/mistress.py @@ -1,6 +1,15 @@ #0c1b401bb09241570d364420b3ba3fd7 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.priest_female.mistress import MistressSkillRef as Ref prefix = "priest_female/mistress/cn/skillDetail" @@ -14,6 +23,7 @@ class Skill0(ActiveSkill): 转职为光明骑士时,技能类型变为独立攻击力。\n """ name = "升空斩" + ref = Ref.RISINGSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -41,6 +51,7 @@ class Skill1(ActiveSkill): 被命中的敌人会浮空。\n """ name = "审判锤击" + ref = Ref.HOLYSMASH learnLv = 1 masterLv = 60 maxLv = 70 @@ -65,6 +76,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -88,6 +100,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -115,6 +128,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -156,6 +170,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -178,6 +193,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -200,6 +216,7 @@ class Skill7(ActiveSkill): 只能在一定高度以上时才能使用。\n """ name = "空中锤击" + ref = Ref.VIOLENTASSAULT learnLv = 5 masterLv = 60 maxLv = 70 @@ -233,6 +250,7 @@ class Skill8(ActiveSkill): 学习[大天使的庇护]后,施放[勇气颂歌]、 [新生颂歌]过程中可以使用该技能。\n """ name = "治愈祈祷" + ref = Ref.PRAYEROFHEAL learnLv = 5 masterLv = 60 maxLv = 70 @@ -266,6 +284,7 @@ class Skill9(ActiveSkill): 转职为光明骑士后,技能类型变为独立攻击力。\n """ name = "钩颈斩" + ref = Ref.NECKUPSCYTHE cellPos = (3,2) learnLv = 5 masterLv = 60 @@ -295,6 +314,7 @@ class Skill10(ActiveSkill): 按住技能键可以维持防御姿态。 抵挡前方的攻击后,可以强制使用其他技能。\n """ name = "武器格挡" + ref = Ref.WEAPONGUARD cellPos = (5,3) learnLv = 10 masterLv = 5 @@ -321,6 +341,7 @@ class Skill11(ActiveSkill): 使范围内的所有队员消除异常状态。\n """ name = "净化" + ref = Ref.CURE learnLv = 10 masterLv = 1 maxLv = 11 @@ -350,6 +371,7 @@ class Skill12(ActiveSkill): [我甘愿承担这些罪业。]\n """ name = "罪业加身" + ref = Ref.HEAVYSIN cellPos = (4,3) learnLv = 10 masterLv = 60 @@ -384,6 +406,7 @@ class Skill13(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -411,6 +434,7 @@ class Skill14(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -445,6 +469,7 @@ class Skill15(ActiveSkill): - 对每名敌人攻击1次。\n """ name = "唤雷符" + ref = Ref.TALISMANOFLIGHTNING learnLv = 15 masterLv = 60 maxLv = 70 @@ -478,6 +503,7 @@ class Skill16(ActiveSkill): 按住向后方向键并再次按技能键,可以向后转身发动前冲斩; 前冲斩击攻击力和[冲刺斩]的上斩攻击力相同。\n """ name = "冲刺斩" + ref = Ref.CUTINDASH cellPos = (3,3) learnLv = 15 masterLv = 60 @@ -509,6 +535,7 @@ class Skill17(ActiveSkill): [原罪释放·净化]状态下施放时,一次性造成2次攻击。\n """ name = "双重切割" + ref = Ref.DUALSLASH cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -542,6 +569,7 @@ class Skill18(PassiveSkill): 利用诱惑来聚拢敌人的效果可以在已学技能栏中用鼠标右键设置开启/关闭\n """ name = "罪业诱惑" + ref = Ref.BODYPRESSEDSIN cellPos = (2,4) learnLv = 15 masterLv = 10 @@ -557,7 +585,11 @@ class Skill18(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 回避率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 负罪者镰刀精通 # priest_female/mistress/ecc23c980ea71450c0ad0c3fd232f329 @@ -570,6 +602,7 @@ class Skill19(PassiveSkill): [钩颈斩]、 [罪业加身]、 [双重切割]、 [冲刺斩]、 [镰勾旋击]、 [粉碎回旋击]、 [终结战镰]\n """ name = "负罪者镰刀精通" + ref = Ref.SCYTHEMASTERY cellPos = (1,4) learnLv = 15 masterLv = 20 @@ -590,7 +623,11 @@ class Skill19(PassiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 命中率增加 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"type":"$*PAtkM","data":data0}] + # 迁移前实现(保留对照): + # associate = [{"type":"$*PAtkM","data":data0}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable(data0))), + ] # 镰勾旋击 # priest_female/mistress/f0cc2c950f3bdf4103c75fa496bcac34 @@ -601,6 +638,7 @@ class Skill20(ActiveSkill): 向前斩击命中时进入无敌状态,被镰刀勾住的敌人会被强制控制。\n """ name = "镰勾旋击" + ref = Ref.GUILLOTINE cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -639,6 +677,7 @@ class Skill21(ActiveSkill): [人类的欲望本身并不是一种罪,但沉醉于无节制的享乐,便构成淫乐之罪。]\n """ name = "欲望之手" + ref = Ref.LUSTHAND cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -684,6 +723,7 @@ class Skill22(ActiveSkill): - [暴食之噬] : 增加生命值恢复量\n """ name = "七宗罪" + ref = Ref.THESEVENDEADLYSINS cellPos = (4,5) learnLv = 20 masterLv = 10 @@ -764,8 +804,12 @@ class Skill22(ActiveSkill): # [暴食之噬] - 生命值恢复量增加率 : {value31}% data31 = get_data(f'{prefix}/{uuid}', 31) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data12,"skills":['欲望之手', '傲慢之堕', '怠惰之息', '贪婪之刺', '愤怒之袭', '嫉妒之吻', '暴食之噬']} + # ] associate = [ - {"data":data12,"skills":['欲望之手', '傲慢之堕', '怠惰之息', '贪婪之刺', '愤怒之袭', '嫉妒之吻', '暴食之噬']} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data12)), skills=[Ref.LUSTHAND, Ref.PRIDEACCEL, Ref.SLOTHBODY, Ref.GREEDTHELURKER, Ref.SCUDTHEWRATH, Ref.ENVIOUSKISS, Ref.GLUTTONYVOMIT]), ] # 暴击 @@ -776,6 +820,7 @@ class Skill23(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -802,6 +847,7 @@ class Skill24(ActiveSkill): [傲慢滋生出原罪,原罪又助长其他罪业,所以,傲慢才是万恶之源。]\n """ name = "傲慢之堕" + ref = Ref.PRIDEACCEL cellPos = (8,6) learnLv = 25 masterLv = 60 @@ -832,6 +878,7 @@ class Skill25(ActiveSkill): 在决斗场中,无法在空中施放。\n """ name = "粉碎回旋击" + ref = Ref.ROLLINGRUSH cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -872,6 +919,7 @@ class Skill26(ActiveSkill): [检讨自己的人生并学会尊重自己时,方能从怠惰的沼泽中挣脱出来……]\n """ name = "怠惰之息" + ref = Ref.SLOTHBODY cellPos = (8,7) learnLv = 30 masterLv = 60 @@ -916,6 +964,7 @@ class Skill27(ActiveSkill): [贪欲也就是‘过分的欲望’。 试图得到本不该属于自己的,均属于贪欲……]\n """ name = "贪婪之刺" + ref = Ref.GREEDTHELURKER cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -976,6 +1025,7 @@ class Skill28(ActiveSkill): 爆炸攻击时,可吸收敌人的罪业,增加罪业层数。\n """ name = "诱魔之手" + ref = Ref.HANDAWAKENTOSIN cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -1037,6 +1087,7 @@ class Skill29(ActiveSkill): 在决斗场中,无法用跳跃键强制中断攻击。\n """ name = "终结战镰" + ref = Ref.SCYTHEMSSACRE cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -1100,6 +1151,7 @@ class Skill30(ActiveSkill): [和平的另一面并不是战争。 也许,压抑住愤怒,人类才会迎来真正的和平。]\n """ name = "愤怒之袭" + ref = Ref.SCUDTHEWRATH cellPos = (6,10) learnLv = 45 masterLv = 60 @@ -1163,6 +1215,7 @@ class Skill31(PassiveSkill): [恬不知耻的恶魔啊! 神会将你们的罪业宣之于众!]\n """ name = "罪业宣告" + ref = Ref.SINSAYER cellPos = (2,11) learnLv = 48 masterLv = 40 @@ -1181,7 +1234,11 @@ class Skill31(PassiveSkill): # 魔法暴击率增加 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{"data":data1}] + # 迁移前实现(保留对照): + # associate = [{"data":data1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 原罪释放·净化 # priest_female/mistress/a2d943797daca862a6f321aca6ac9bfa @@ -1195,6 +1252,7 @@ class Skill32(ActiveSkill): 无法使用的技能] : [空中锤击]、 [治愈祈祷]、 [审判锤击]、 [武器格挡]、 [净化]、 [唤雷符]\n """ name = "原罪释放·净化" + ref = Ref.DEPRAVITYSEVENSINS cellPos = (4,11) learnLv = 50 masterLv = 40 @@ -1230,6 +1288,7 @@ class Skill33(ActiveSkill): 学习后,技能等级补正为与[原罪释放·净化]相同。\n """ name = "净化之花" + ref = Ref.FLOWEROFPURIFICATION cellPos = (4,12) learnLv = 50 masterLv = 1 @@ -1254,7 +1313,7 @@ class Skill33(ActiveSkill): data3 = get_data(f'{prefix}/{uuid}', 3) def skillInfo(self, mode: str | None = None): - self.lv = self.char.GetSkillByName("原罪释放·净化").lv + self.lv = self.char.GetSkill(Ref.DEPRAVITYSEVENSINS).lv return super().skillInfo(mode) # 嫉妒之吻 @@ -1269,6 +1328,7 @@ class Skill34(ActiveSkill): [妒忌是未拥有者对拥有者的羡慕,嫉妒是拥有者对失去的恐惧。]\n """ name = "嫉妒之吻" + ref = Ref.ENVIOUSKISS cellPos = (5,12) learnLv = 60 masterLv = 40 @@ -1336,6 +1396,7 @@ class Skill35(ActiveSkill): [减少自己的粮食,进而禁食,将那些粮食分给穷苦的人们,此为积德之行为。]\n """ name = "暴食之噬" + ref = Ref.GLUTTONYVOMIT cellPos = (7,13) learnLv = 70 masterLv = 40 @@ -1400,6 +1461,7 @@ class Skill36(ActiveSkill): [传说中诞下所有人类罪业的禁断结晶……原罪、 苹果、 禁断之果、 普拉那,无数词语在描述这个东西。]\n """ name = "智慧起源 : 原罪结晶" + ref = Ref.FIRSTPRANA cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1428,7 +1490,11 @@ class Skill36(ActiveSkill): # [原罪释放·净化]冷却时间最大减少 : {value5}秒 data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] def getSkillCD(self, mode=None): return 2.0 @@ -1443,6 +1509,7 @@ class Skill37(ActiveSkill): [人类无法隔断原罪? 是因为人类从原罪诞生? 还是因为人因原罪才能称为人。]\n """ name = "灵魂烙印 : 原罪冲击" + ref = Ref.SECONDSOUL cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1501,6 +1568,7 @@ class Skill38(ActiveSkill): [今天仍没有领悟到自己罪孽的人们……唯有与神相连的证据才能拯救他们。]\n """ name = "肋骨重塑 : 原罪战矛" + ref = Ref.THIRDRIB cellPos = (4,14) learnLv = 80 masterLv = 40 @@ -1559,6 +1627,7 @@ class Skill39(ActiveSkill): [湮灭,之后将有乐园降临。 神啊,求您把悔改的灵魂们带到乐园……]\n """ name = "失乐园" + ref = Ref.LASTGENESIS cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -1599,6 +1668,7 @@ class Skill40(PassiveSkill): [我们只能背负原罪而生吗? 所有原罪之初,如果我们能领悟其本质……]\n """ name = "原罪之初" + ref = Ref.ORIGINALSIN cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1614,7 +1684,11 @@ class Skill40(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # [怠惰之息] - 聚拢敌人速度和范围比率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 至高之刑 # priest_female/mistress/8b08f9504167a9c0f3a1d29d71b7943e @@ -1626,6 +1700,7 @@ class Skill41(ActiveSkill): [愚蠢之人,珍惜赐予你救赎的机会,虔诚地忏悔吧。]\n """ name = "至高之刑" + ref = Ref.CARDINALEXECUTION cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1662,6 +1737,7 @@ class Skill42(ActiveSkill): [神啊……所有的罪业都由我来背负。 请赦免他们的罪业,允许他们永恒地安息吧……]\n """ name = "原罪之翼·永息" + ref = Ref.WINGSOFREST cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/priest_female/sorceress.py b/backend/core/character/GF/priest_female/sorceress.py index 5faa3a14..4d734c81 100644 --- a/backend/core/character/GF/priest_female/sorceress.py +++ b/backend/core/character/GF/priest_female/sorceress.py @@ -1,6 +1,21 @@ # 0c1b401bb09241570d364420b3ba3fd7 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + LevelTable, + Percent, + ProfessionAttribute, + SkillAttribute, + SkillEffect, +) +from core.character.refs.priest_female.sorceress import SorceressSkillRef as Ref + + +class SorceressAttribute(ProfessionAttribute): + """本职业专用的最终效果属性;字段含义与技能实现保持一致。""" + PEARL_CD_REDUCE = 'cdReduceP' + """巫女:神龙如意珠的专用冷却参数。""" + prefix = "priest_female/sorceress/cn/skillDetail" @@ -15,6 +30,7 @@ class Skill0(ActiveSkill): 转职为光明骑士时,技能类型变为独立攻击力。\n """ name = "升空斩" + ref = Ref.RISINGSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -42,6 +58,7 @@ class Skill1(ActiveSkill): 被命中的敌人会浮空。\n """ name = "审判锤击" + ref = Ref.HOLYSMASH learnLv = 1 masterLv = 60 maxLv = 70 @@ -66,6 +83,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -90,6 +108,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -108,7 +127,11 @@ class Skill3(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['念珠连射']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['念珠连射']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.ROSARYSHOOTING]), + ] # 受身蹲伏 # priest_female/sorceress/ce26c6b69d02a440a81b552bec94f03b @@ -118,6 +141,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -159,6 +183,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -181,6 +206,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -203,6 +229,7 @@ class Skill7(ActiveSkill): 只能在一定高度以上时才能使用。\n """ name = "空中锤击" + ref = Ref.VIOLENTASSAULT learnLv = 5 masterLv = 60 maxLv = 70 @@ -236,6 +263,7 @@ class Skill8(ActiveSkill): 学习[大天使的庇护]后,施放[勇气颂歌]、 [新生颂歌]过程中可以使用该技能。\n """ name = "治愈祈祷" + ref = Ref.PRAYEROFHEAL learnLv = 5 masterLv = 60 maxLv = 70 @@ -269,6 +297,7 @@ class Skill9(ActiveSkill): 转职为光明骑士后,技能类型变为独立攻击力。\n """ name = "钩颈斩" + ref = Ref.NECKUPSCYTHE learnLv = 5 masterLv = 60 maxLv = 70 @@ -297,6 +326,7 @@ class Skill10(ActiveSkill): """ name = '武器格挡' + ref = Ref.WEAPONGUARD cellPos = (3,3) learnLv = 10 masterLv = 5 @@ -323,6 +353,7 @@ class Skill11(ActiveSkill): 使范围内的所有队员消除异常状态。\n """ name = "净化" + ref = Ref.CURE learnLv = 10 masterLv = 1 maxLv = 11 @@ -352,6 +383,7 @@ class Skill12(ActiveSkill): [我甘愿承担这些罪业。]\n """ name = "罪业加身" + ref = Ref.HEAVYSIN learnLv = 10 masterLv = 60 maxLv = 70 @@ -385,6 +417,7 @@ class Skill13(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -412,6 +445,7 @@ class Skill14(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -447,6 +481,7 @@ class Skill15(ActiveSkill): """ name = '唤雷符' + ref = Ref.TALISMANOFLIGHTNING cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -481,6 +516,7 @@ class Skill16(ActiveSkill): """ name = '念珠连射' + ref = Ref.ROSARYSHOOTING cellPos = (4,4) learnLv = 15 masterLv = 1 @@ -508,6 +544,7 @@ class Skill17(ActiveSkill): """ name = '木槵子经' + ref = Ref.ROSARYSTRIKE cellPos = (6,4) learnLv = 15 masterLv = 60 @@ -545,6 +582,7 @@ class Skill18(ActiveSkill): """ name = '缩地成寸' + ref = Ref.CONTRACTSPACEBYMAGIC cellPos = (8,4) learnLv = 15 masterLv = 1 @@ -574,6 +612,7 @@ class Skill19(ActiveSkill): """ name = '束灵符' + ref = Ref.TALISMANOFOPPRESSION cellPos = (7,5) learnLv = 20 masterLv = 60 @@ -610,6 +649,7 @@ class Skill20(ActiveSkill): """ name = '神谕之祈愿' + ref = Ref.PRAYFORORACLE cellPos = (2,5) learnLv = 20 masterLv = 20 @@ -639,6 +679,7 @@ class Skill21(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -667,6 +708,7 @@ class Skill22(ActiveSkill): """ name = '驱邪咒' + ref = Ref.EXORCISMUS cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -701,6 +743,7 @@ class Skill23(PassiveSkill): """ name = '祈雨祭' + ref = Ref.RITUALFORRAIN cellPos = (6,6) learnLv = 25 masterLv = 10 @@ -714,7 +757,11 @@ class Skill23(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 和合之玉 # priest_female/sorceress/2a3c96b88d02372505692da0a8b54743 @@ -726,6 +773,7 @@ class Skill24(ActiveSkill): """ name = '和合之玉' + ref = Ref.EFFORTSPHERE cellPos = (6,7) learnLv = 30 masterLv = 60 @@ -762,6 +810,7 @@ class Skill25(PassiveSkill): """ name = '神术强化' + ref = Ref.MIKOMASTERY cellPos = (5,7) learnLv = 30 masterLv = 10 @@ -781,7 +830,11 @@ class Skill25(PassiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 施放速度增加 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 聚魂吸星符 # priest_female/sorceress/b163d099c8cc27fdb6fd3639c2ee6df9 @@ -793,6 +846,7 @@ class Skill26(ActiveSkill): """ name = '聚魂吸星符' + ref = Ref.TALISMANOFSOULSTEAL cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -850,6 +904,7 @@ class Skill27(ActiveSkill): """ name = '龙魂之怒' + ref = Ref.DRAGONWRATH cellPos = (2,9) learnLv = 40 masterLv = 60 @@ -909,6 +964,7 @@ class Skill28(ActiveSkill): """ name = '百八念珠' + ref = Ref.ROSARYOF108BEADS cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -978,6 +1034,7 @@ class Skill29(ActiveSkill): """ name = '不动珠箔阵' + ref = Ref.IMMOBILITYMAGICLINE cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1034,6 +1091,7 @@ class Skill30(ActiveSkill): """ name = '神龙如意珠' + ref = Ref.CINTAMANI cellPos = (7,11) learnLv = 48 masterLv = 40 @@ -1058,7 +1116,11 @@ class Skill30(ActiveSkill): # [范围信息] # 追加打击大小比率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] def getSkillCD(self, mode=None): return self.cd * (1 - self.cdReduceP) @@ -1074,6 +1136,7 @@ class Skill31(ActiveSkill): """ name = '神谕 : 神龙雷雨祭' + ref = Ref.RITUALFORDRAGON cellPos = (3,11) learnLv = 50 masterLv = 40 @@ -1112,6 +1175,7 @@ class Skill32(ActiveSkill): """ name = '因果业火符' + ref = Ref.TALISMANOFTIMEBOMB cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1177,6 +1241,7 @@ class Skill33(ActiveSkill): """ name = '夺命大念阵' + ref = Ref.LIFEDEPRIVEDISPOSITION cellPos = (5,13) learnLv = 70 masterLv = 40 @@ -1234,6 +1299,7 @@ class Skill34(PassiveSkill): """ name = '龙神之力' + ref = Ref.POWEROFTHEDRAGON cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1258,10 +1324,16 @@ class Skill34(PassiveSkill): # 所受伤害减少效果冷却时间 : {value5}秒 data5 = get_data(f'{prefix}/{uuid}', 5) + # 迁移前实现(保留对照): + # associate = [ + # {'data': data0}, + # {'data': data1, 'skills': ['念珠连射']}, + # {'data': data2, 'skills': ['神龙如意珠'], 'type': '*cdReduceP'}, + # ] associate = [ - {'data': data0}, - {'data': data1, 'skills': ['念珠连射']}, - {'data': data2, 'skills': ['神龙如意珠'], 'type': '*cdReduceP'}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.ROSARYSHOOTING]), + SkillEffect(attribute=SorceressAttribute.PEARL_CD_REDUCE, value=1 - Percent(LevelTable(data2)), skills=[Ref.CINTAMANI]), ] # 退魔阴阳符 @@ -1274,6 +1346,7 @@ class Skill35(ActiveSkill): """ name = '退魔阴阳符' + ref = Ref.ROSARYWILDSHOT cellPos = (7,13) learnLv = 75 masterLv = 40 @@ -1337,6 +1410,7 @@ class Skill36(ActiveSkill): """ name = '天坠阴阳玉' + ref = Ref.BIGROSARY cellPos = (4,14) learnLv = 80 masterLv = 40 @@ -1399,6 +1473,7 @@ class Skill37(ActiveSkill): """ name = '龙威如狱·龙恩如海' + ref = Ref.WRATHOFGODDRAGON cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -1441,6 +1516,7 @@ class Skill38(PassiveSkill): """ name = '乾坤之境' + ref = Ref.POWEROFAGENT cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1454,7 +1530,11 @@ class Skill38(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 天泽神龙阵 # priest_female/sorceress/d429147c372b549c3dadcabcba50787f @@ -1465,6 +1545,7 @@ class Skill39(ActiveSkill): """ name = '天泽神龙阵' + ref = Ref.SWALLOWSKYDRGON cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1500,6 +1581,7 @@ class Skill40(ActiveSkill): """ name = '神龙之舞·天一' + ref = Ref.SKYSORCERESSUNITE cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/priest_male/avenger.py b/backend/core/character/GF/priest_male/avenger.py index d4cc23bb..31d55347 100644 --- a/backend/core/character/GF/priest_male/avenger.py +++ b/backend/core/character/GF/priest_male/avenger.py @@ -1,6 +1,17 @@ #f6a4ad30555b99b499c07835f87ce522 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, + Percent, + Power, + SkillAttribute, + SkillEffect, +) +from core.character.refs.priest_male.avenger import AvengerSkillRef as Ref prefix = "priest_male/avenger/cn/skillDetail" @@ -15,6 +26,7 @@ class Skill0(ActiveSkill): 转职为驱魔师后,可以蓄气攻击。\n """ name = "空斩打" + ref = Ref.ANTIAIRUPPER learnLv = 1 masterLv = 10 maxLv = 20 @@ -45,6 +57,7 @@ class Skill1(ActiveSkill): 转职为光明骑士时,技能类型变为独立攻击力。\n """ name = "虎袭" + ref = Ref.SMASHER learnLv = 1 masterLv = 60 maxLv = 70 @@ -77,6 +90,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -100,6 +114,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -127,6 +142,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -168,6 +184,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -190,6 +207,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -212,6 +230,7 @@ class Skill7(ActiveSkill): 选择一定范围内的队员恢复生命值。\n """ name = "缓慢愈合" + ref = Ref.SLOWHEAL learnLv = 5 masterLv = 60 maxLv = 70 @@ -242,6 +261,7 @@ class Skill8(ActiveSkill): 转职成为蓝拳使者时,才可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "直拳冲击" + ref = Ref.LUCKYSTRAIGHT learnLv = 5 masterLv = 60 maxLv = 70 @@ -272,6 +292,7 @@ class Skill9(ActiveSkill): 使一定范围内的队员消除异常状态。\n """ name = "净化" + ref = Ref.CURE learnLv = 10 masterLv = 1 maxLv = 11 @@ -299,6 +320,7 @@ class Skill10(ActiveSkill): 向前方敌人发动前冲攻击后,可以用上勾拳进行追击。\n """ name = "勾拳追击" + ref = Ref.SECONDUPPER learnLv = 10 masterLv = 60 maxLv = 70 @@ -328,6 +350,7 @@ class Skill11(ActiveSkill): 若在[魔化 : 末日守卫者]状态下施放该技能,则增加攻击力和冷却时间。\n """ name = "恶魔之手" + ref = Ref.GRASPHANDOFANGER cellPos = (7,3) learnLv = 10 masterLv = 60 @@ -357,7 +380,12 @@ class Skill11(ActiveSkill): # [范围信息] # 手大小比率 : {value6}% data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{"data":data4,"skills":[name]},{"data":data5,"skills":[name],"type":"*cd"}] + # 迁移前实现(保留对照): + # associate = [{"data":data4,"skills":[name]},{"data":data5,"skills":[name],"type":"*cd"}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data4)), skills=[Ref.GRASPHANDOFANGER]), + SkillEffect(attribute=SkillAttribute.CD, value=1 + Percent(LevelTable(data5)), skills=[Ref.GRASPHANDOFANGER]), + ] # 强化 - 后跳 # priest_male/avenger/2b340542e776818b78f3212af184bd6b @@ -370,6 +398,7 @@ class Skill12(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -397,6 +426,7 @@ class Skill13(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -428,6 +458,7 @@ class Skill14(ActiveSkill): 在决斗场中,施放其他技能过程中无法使用该技能。\n """ name = "化魔" + ref = Ref.CHANGEHPTOMP cellPos = (1,4) learnLv = 15 masterLv = 1 @@ -477,6 +508,7 @@ class Skill15(ActiveSkill): [逆龙七杀]\n """ name = "落凤锤" + ref = Ref.QUAKEAREA learnLv = 15 masterLv = 60 maxLv = 70 @@ -513,6 +545,7 @@ class Skill16(PassiveSkill): 在决斗场中,决斗开始时恶魔能量初始值为0。\n """ name = "恶魔之力" + ref = Ref.DEVILSTRIKE cellPos = (3,4) learnLv = 15 masterLv = 20 @@ -548,6 +581,7 @@ class Skill17(ActiveSkill): 若在[魔化 : 末日守卫者]状态下施放该技能,则增加攻击力和冷却时间。\n """ name = "魔镰之舞" + ref = Ref.HIGHSPEEDSLASH cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -572,7 +606,12 @@ class Skill17(ActiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 冷却时间增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"data":data2,"skills":[name]},{"data":data3,"skills":[name],"type":"*cd"}] + # 迁移前实现(保留对照): + # associate = [{"data":data2,"skills":[name]},{"data":data3,"skills":[name],"type":"*cd"}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2)), skills=[Ref.HIGHSPEEDSLASH]), + SkillEffect(attribute=SkillAttribute.CD, value=1 + Percent(LevelTable(data3)), skills=[Ref.HIGHSPEEDSLASH]), + ] # 半魔化 # priest_male/avenger/5c00ce6d7dbbb5e9a0f6e1071d486832 @@ -586,6 +625,7 @@ class Skill18(ActiveSkill): [恶魔之手]、 [魔镰之舞]、 [裂地锤]、 [回旋飞镰]、 [黑暗之刺]、 [厄运之轮]、 [黑暗之触]、 [恶魔之拳]、 [黑暗权能]、 [地狱之门]、 [末日浩劫]、 [不朽战吼]、 [毁灭强击]、 [永堕 : 混沌弑神]、 [极恶洪流]、 [末日福音 : 毁灭之翼]\n """ name = "半魔化" + ref = Ref.METAMORPHOSIS cellPos = (6,4) learnLv = 15 masterLv = 1 @@ -630,6 +670,7 @@ class Skill19(ActiveSkill): [升天阵]可以把浮空的敌人聚集到阵的中心。\n """ name = "升天阵" + ref = Ref.RISINGAREA learnLv = 20 masterLv = 60 maxLv = 70 @@ -661,6 +702,7 @@ class Skill20(PassiveSkill): 增加魔法攻击力和暴击率。 装备镰刀时,增加攻击速度和暗属性抗性,减少光属性抗性。\n """ name = "镰刀精通" + ref = Ref.SCYTHEMASTERY cellPos = (6,5) learnLv = 20 masterLv = 10 @@ -683,7 +725,11 @@ class Skill20(PassiveSkill): data3 = get_data(f'{prefix}/{uuid}', 3) # 光属性抗性减少 : {value4} data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{"data":data0,"type":"$*PAtkM"}] + # 迁移前实现(保留对照): + # associate = [{"data":data0,"type":"$*PAtkM"}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable(data0))), + ] # 裂地锤 # priest_male/avenger/0c3a468aee1f7ce06bf91eb3319518c1 @@ -695,6 +741,7 @@ class Skill21(ActiveSkill): 黑暗石柱会追加爆炸,对敌人造成伤害。\n """ name = "裂地锤" + ref = Ref.EARTHQUAKE cellPos = (8,5) learnLv = 20 masterLv = 60 @@ -719,7 +766,11 @@ class Skill21(ActiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 冷却时间增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"data":data3,"skills":[name],"type":"*cd"}] + # 迁移前实现(保留对照): + # associate = [{"data":data3,"skills":[name],"type":"*cd"}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD, value=1 + Percent(LevelTable(data3)), skills=[Ref.EARTHQUAKE]), + ] # 暴击 # priest_male/avenger/fc1262c19f3d0477ee8eda47b8db8696 @@ -729,6 +780,7 @@ class Skill22(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -752,6 +804,7 @@ class Skill23(ActiveSkill): 若在[魔化 : 末日守卫者]状态下施放该技能,则增加攻击力和冷却时间。\n """ name = "回旋飞镰" + ref = Ref.SPINCUTTER cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -791,7 +844,12 @@ class Skill23(ActiveSkill): # [范围信息] # [魔化 : 末日守卫者]状态下,攻击范围比率 : {value10}% data10 = get_data(f'{prefix}/{uuid}', 10) - associate = [{"data":data8,"skills":[name]},{"data":data9,"skills":[name],"type":"*cd"}] + # 迁移前实现(保留对照): + # associate = [{"data":data8,"skills":[name]},{"data":data9,"skills":[name],"type":"*cd"}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data8)), skills=[Ref.SPINCUTTER]), + SkillEffect(attribute=SkillAttribute.CD, value=1 + Percent(LevelTable(data9)), skills=[Ref.SPINCUTTER]), + ] # 堕落之魂 # priest_male/avenger/527cdc3ecca985e18ef819d456532b26 @@ -802,6 +860,7 @@ class Skill24(ActiveSkill): [堕落之魂]的技能等级会随着[恶魔之力]的技能等级增加而增加。\n """ name = "堕落之魂" + ref = Ref.FALLINGSOUL cellPos = (1,6) learnLv = 25 masterLv = 1 @@ -831,6 +890,7 @@ class Skill25(ActiveSkill): 被击状态下也能施放技能,被击状态下施放技能时,攻击力会增加。\n """ name = "黑暗之刺" + ref = Ref.HEDGEHOG cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -863,7 +923,11 @@ class Skill25(ActiveSkill): # [范围信息] # 大小比率 : {value6}% data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{"data":data3,"skills":[name],"type":"*cd"}] + # 迁移前实现(保留对照): + # associate = [{"data":data3,"skills":[name],"type":"*cd"}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD, value=1 + Percent(LevelTable(data3)), skills=[Ref.HEDGEHOG]), + ] # 恶魔诅咒 # priest_male/avenger/002cbdd9bfd0f0b970451ae8d48d029e @@ -874,6 +938,7 @@ class Skill26(PassiveSkill): 使用除[魔化 : 末日守卫者]技能之外的惩戒者转职技能时,发动[恶魔诅咒]效果,并增加移动速度。\n """ name = "恶魔诅咒" + ref = Ref.HEARTHINGS cellPos = (1,7) learnLv = 30 masterLv = 10 @@ -894,7 +959,11 @@ class Skill26(PassiveSkill): # [恶魔诅咒]持续时间 : {value3}秒 data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"data":data0,"exceptSkills":["魔化 : 末日守卫者"]}] + # 迁移前实现(保留对照): + # associate = [{"data":data0,"exceptSkills":["魔化 : 末日守卫者"]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), except_skills=[Ref.AWAKENING]), + ] # 厄运之轮 # priest_male/avenger/ac21c02567f04a92b54dd85c091d1e5a @@ -907,6 +976,7 @@ class Skill27(ActiveSkill): 死亡打击会瞬间斩过敌人,并造成伤害。\n """ name = "厄运之轮" + ref = Ref.SPINNINGDEFORMATION cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -944,7 +1014,12 @@ class Skill27(ActiveSkill): # [魔化 : 末日守卫者]状态下攻击范围比率 : {value8}% data8 = get_data(f'{prefix}/{uuid}', 8) - associate = [{"data":data3,"skills":[name]},{"data":data4,"skills":[name],"type":"*cd"}] + # 迁移前实现(保留对照): + # associate = [{"data":data3,"skills":[name]},{"data":data4,"skills":[name],"type":"*cd"}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3)), skills=[Ref.SPINNINGDEFORMATION]), + SkillEffect(attribute=SkillAttribute.CD, value=1 + Percent(LevelTable(data4)), skills=[Ref.SPINNINGDEFORMATION]), + ] def vp_1(self): """ @@ -976,6 +1051,7 @@ class Skill28(ActiveSkill): 在决斗场中,只有攻击之前的动作为霸体状态,爆炸范围内的敌人会被拉到惩戒者的位置。\n """ name = "恶魔之拳" + ref = Ref.DEVILFIST cellPos = (7,9) learnLv = 40 masterLv = 60 @@ -1044,6 +1120,7 @@ class Skill29(ActiveSkill): [魔化 : 末日守卫者]状态下施放时,增加判定大小和攻击力。\n """ name = "黑暗之触" + ref = Ref.REAPER cellPos = (1,9) learnLv = 40 masterLv = 50 @@ -1127,6 +1204,7 @@ class Skill30(ActiveSkill): 若在[魔化 : 末日守卫者]状态下施放该技能,会用缠绕着恶魔气息的手臂对敌人进行抓挠攻击。\n """ name = "黑暗权能" + ref = Ref.POWEROFDARKNESS cellPos = (3,10) learnLv = 45 masterLv = 60 @@ -1201,6 +1279,7 @@ class Skill31(PassiveSkill): 在噩梦的作用下,增加技能攻击力。\n """ name = "恶魔唤醒" + ref = Ref.NIGHTMARE cellPos = (9,11) learnLv = 48 masterLv = 40 @@ -1221,11 +1300,17 @@ class Skill31(PassiveSkill): # 技能攻击力增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data1,"skills":["魔化 : 末日守卫者"]}, + # {"data":data2,"skills":["审判"]}, + # {"data":data3,"exceptSkills":["审判","魔化 : 末日守卫者"]}, + # ] associate = [ - {"data":data1,"skills":["魔化 : 末日守卫者"]}, - {"data":data2,"skills":["审判"]}, - {"data":data3,"exceptSkills":["审判","魔化 : 末日守卫者"]}, - ] + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.AWAKENING]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2)), skills=[Ref.EXECUTION]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3)), except_skills=[Ref.EXECUTION, Ref.AWAKENING]), + ] # 魔化 : 末日守卫者 # priest_male/avenger/5cac3411ccef1af333953e0ded5e942d @@ -1242,6 +1327,7 @@ class Skill32(ActiveSkill): [他的内心里还留有披上神圣的礼官服时的纯粹、 正直、 慈爱与怜悯。]\n """ name = "魔化 : 末日守卫者" + ref = Ref.AWAKENING cellPos = (1,11) learnLv = 50 masterLv = 40 @@ -1303,7 +1389,11 @@ class Skill32(ActiveSkill): mode = ["x","z","z蓄力"] - associate = [{"data":data4,"type":"$*PAtkM"}] + # 迁移前实现(保留对照): + # associate = [{"data":data4,"type":"$*PAtkM"}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable(data4))), + ] def setMode(self, mode): if mode == "x": @@ -1340,6 +1430,7 @@ class Skill33(ActiveSkill): 只有在半魔化及魔化状态下才能聚集恶魔之力施放[审判]。 若在[魔化 : 末日守卫者]状态下施放该技能,则可以增加攻击力。\n """ name = "审判" + ref = Ref.EXECUTION cellPos = (2,12) learnLv = 50 masterLv = 1 @@ -1381,19 +1472,16 @@ class Skill33(ActiveSkill): data11 = get_data(f'{prefix}/{uuid}', 11) data12 = get_data(f'{prefix}/{uuid}', 12) - associate = [{"data": [0] + [10]*maxLv,"skills":[name]}] + # 迁移前实现(保留对照): + # associate = [{"data": [0] + [10]*maxLv,"skills":[name]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0] + [10] * maxLv)), skills=[Ref.EXECUTION]), + ] - @property - def lv(self): - """技能等级""" - return self.char.GetSkillByName("魔化 : 末日守卫者").lv - - @lv.setter - def lv(self, value): - ... + level_source = Ref.AWAKENING def skillInfo(self, mode = None): - pre = self.char.GetSkillByName("魔化 : 末日守卫者") + pre = self.char.GetSkill(Ref.AWAKENING) for data in [self.data1, self.data2, self.data3, self.data4, self.data5, self.data6, self.data7, self.data8, self.data9]: data[:] = [0] + [data[1] * (1+(lv-1)*16/69) for lv in range(1,pre.maxLv+1)] return super().skillInfo(mode) @@ -1408,6 +1496,7 @@ class Skill34(ActiveSkill): [神的惩罚者从不畏惧痛苦……和死亡!]\n """ name = "恶魔屏障" + ref = Ref.AVENGERGUARD cellPos = (1,12) learnLv = 50 masterLv = 1 @@ -1432,6 +1521,7 @@ class Skill35(PassiveSkill): 该效果具有单独的冷却时间,在冷却时间内生命值降为0则不会发动技能。\n """ name = "邪魔再临" + ref = Ref.EVILRETURN cellPos = (2,11) learnLv = 50 masterLv = 1 @@ -1456,6 +1546,7 @@ class Skill36(ActiveSkill): 利用恶魔的力量打开地狱之门,从中释放出大量的恶魔气息攻击敌人。 在[魔化 : 末日守卫者]状态下,技能攻击力会大幅提升。\n """ name = "地狱之门" + ref = Ref.PANDEMONIUMEX cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1482,7 +1573,11 @@ class Skill36(ActiveSkill): # [范围信息] # 发射距离比率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"data":data2,"skills":[name]}] + # 迁移前实现(保留对照): + # associate = [{"data":data2,"skills":[name]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2)), skills=[Ref.PANDEMONIUMEX]), + ] def vp_1(self): """ @@ -1511,6 +1606,7 @@ class Skill37(ActiveSkill): 在[魔化 : 末日守卫者]状态下,惩戒者会造成更大的灾难。\n """ name = "末日浩劫" + ref = Ref.DISASTEREX cellPos = (8,13) learnLv = 70 masterLv = 40 @@ -1538,7 +1634,11 @@ class Skill37(ActiveSkill): # 冲击波范围比率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"data":data1,"skills":[name]}] + # 迁移前实现(保留对照): + # associate = [{"data":data1,"skills":[name]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.DISASTEREX]), + ] def vp_1(self): """ @@ -1571,6 +1671,7 @@ class Skill38(ActiveSkill): [啊,没有归宿的可怜的野兽……]\n """ name = "不朽战吼" + ref = Ref.DARKHOWLING cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1659,6 +1760,7 @@ class Skill39(PassiveSkill): 恶魔的力量进一步得到进化。增加[恶魔之力]的攻击力,并且大幅增加基本攻击和[恶魔之力]之外的所有技能攻击力。而且,施放[毁灭强击]、 [不朽战吼]、 [永堕 : 混沌弑神]、 [极恶洪流]、 [末日福音 : 毁灭之翼]过程中可以立即魔化。\n """ name = "原罪之力" + ref = Ref.EVILSTRIKE cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1674,10 +1776,15 @@ class Skill39(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 基本攻击和除[恶魔之力]外所有技能攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data1,"exceptSkills":["恶魔之力"]}, + # {"data":data0,"skills":["恶魔之力"]} + # ] associate = [ - {"data":data1,"exceptSkills":["恶魔之力"]}, - {"data":data0,"skills":["恶魔之力"]} - ] + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), except_skills=[Ref.DEVILSTRIKE]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), skills=[Ref.DEVILSTRIKE]), + ] # 毁灭强击 # priest_male/avenger/b1732acfaf117f8e9ff130f47d3ed0e7 @@ -1691,6 +1798,7 @@ class Skill40(ActiveSkill): [你以为世人会歌颂你们的功绩吗? 他们只会在被救赎后,用轻蔑的眼神指责你们,用苛责的方式打压你们,让你们终生悔过和赎罪。 --致不朽战士]\n """ name = "毁灭强击" + ref = Ref.DOOMCRUSH cellPos = (2,14) learnLv = 80 masterLv = 40 @@ -1731,7 +1839,11 @@ class Skill40(ActiveSkill): # 爆炸大小比率 : {value7}% data7 = get_data(f'{prefix}/{uuid}', 7) - associate = [{"data":data6,"skills":[name]}] + # 迁移前实现(保留对照): + # associate = [{"data":data6,"skills":[name]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data6)), skills=[Ref.DOOMCRUSH]), + ] def vp_1(self): """ @@ -1763,6 +1875,7 @@ class Skill41(ActiveSkill): 若技能结束之前按键或键,则可以通过消耗额外的恶魔能量,进行更强力的终结一击。 半魔化状态下减少恶魔能量消耗量。\n """ name = "永堕 : 混沌弑神" + ref = Ref.UNHOLYFURY cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1806,7 +1919,12 @@ class Skill41(ActiveSkill): # - [半魔化状态下] - # 恶魔能量消耗量减少 : 100% - associate = [{"data":data9,"skills":[name]},{"data":data7,"skills":[name],"type":"+power5"}] + # 迁移前实现(保留对照): + # associate = [{"data":data9,"skills":[name]},{"data":data7,"skills":[name],"type":"+power5"}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data9)), skills=[Ref.UNHOLYFURY]), + SkillEffect(attribute=Power(5), operation=Operation.ADD, value=Percent(LevelTable(data7)), skills=[Ref.UNHOLYFURY]), + ] # - [半魔化状态下] - # 恶魔能量消耗量减少 : 100% @@ -1821,6 +1939,7 @@ class Skill42(PassiveSkill): [啊……这是您对我的试练吗]\n """ name = "光之影" + ref = Ref.RIGHTEOUSDEVILIZE cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1845,7 +1964,11 @@ class Skill42(PassiveSkill): # [回旋飞镰]镰刀回收最大攻击数 : {value5}次 data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 极恶洪流 # priest_male/avenger/7f9ffcd296361f1367b8b74e773d5e99 @@ -1856,6 +1979,7 @@ class Skill43(ActiveSkill): [魔化 : 末日守卫者]状态下使用时,造成额外伤害。 [半魔化]状态下使用时,减少恶魔能量消耗量。\n """ name = "极恶洪流" + ref = Ref.DIRESTREAM cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1888,7 +2012,12 @@ class Skill43(ActiveSkill): data5 = get_data(f'{prefix}/{uuid}', 5) # [半魔化]状态下施放时 # 恶魔能量消耗量减少 : 100% - associate = [{"data":data5,"skills":[name]},{"data":data4,"skills":[name]}] + # 迁移前实现(保留对照): + # associate = [{"data":data5,"skills":[name]},{"data":data4,"skills":[name]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data5)), skills=[Ref.DIRESTREAM]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data4)), skills=[Ref.DIRESTREAM]), + ] # [半魔化]状态下施放时 # 恶魔能量消耗量减少 : 100% @@ -1905,6 +2034,7 @@ class Skill44(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "末日福音 : 毁灭之翼" + ref = Ref.MORTALGOSPEL cellPos = (5,16) learnLv = 100 masterLv = 40 @@ -1937,7 +2067,11 @@ class Skill44(ActiveSkill): # 压制力 (4人队伍) : {value5}秒 ({value6}秒) data5 = get_data(f'{prefix}/{uuid}', 5) data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{"data":data4,"skills":[name]}] + # 迁移前实现(保留对照): + # associate = [{"data":data4,"skills":[name]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data4)), skills=[Ref.MORTALGOSPEL]), + ] class classChange(Character): def __init__(self, equVersion): diff --git a/backend/core/character/GF/priest_male/crusader_male.py b/backend/core/character/GF/priest_male/crusader_male.py index fe3dd7d4..ba840dc2 100644 --- a/backend/core/character/GF/priest_male/crusader_male.py +++ b/backend/core/character/GF/priest_male/crusader_male.py @@ -1,6 +1,15 @@ #f6a4ad30555b99b499c07835f87ce522 from core.basic.skill import PassiveSkill, ActiveSkill, get_data, ActiveBufferSkill, PassiveBufferSkill from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Constant, + LevelTable, + Operation, + Percent, +) +from core.character.refs.priest_male.crusader_male import CrusaderMaleSkillRef as Ref prefix = "priest_male/crusader_male/cn/skillDetail" @@ -15,6 +24,7 @@ class Skill0(ActiveSkill): 转职为驱魔师后,可以蓄气攻击。\n """ name = "空斩打" + ref = Ref.ANTIAIRUPPER cellPos = (6,1) learnLv = 1 masterLv = 10 @@ -44,6 +54,7 @@ class Skill1(ActiveSkill): 转职为光明骑士时,技能类型变为独立攻击力。\n """ name = "虎袭" + ref = Ref.SMASHER learnLv = 1 masterLv = 60 maxLv = 70 @@ -76,6 +87,7 @@ class Skill2(PassiveBufferSkill): 获得神的恩泽,增加所有异常状态的抗性。\n """ name = "神的恩赐" + ref = Ref.GRACEOFGOD cellPos = (1,1) learnLv = 1 masterLv = 1 @@ -98,6 +110,7 @@ class Skill3(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -121,6 +134,7 @@ class Skill4(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -148,6 +162,7 @@ class Skill5(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -189,6 +204,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -211,6 +227,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -233,6 +250,7 @@ class Skill8(ActiveBufferSkill): 选择一定范围内的队员恢复生命值。\n """ name = "缓慢愈合" + ref = Ref.SLOWHEAL cellPos = (3,2) learnLv = 5 masterLv = 60 @@ -263,6 +281,7 @@ class Skill9(ActiveSkill): 转职成为蓝拳使者时,才可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "直拳冲击" + ref = Ref.LUCKYSTRAIGHT learnLv = 5 masterLv = 60 maxLv = 70 @@ -293,6 +312,7 @@ class Skill10(ActiveBufferSkill): 使一定范围内的队员消除异常状态。\n """ name = "净化" + ref = Ref.CURE cellPos = (4,3) learnLv = 10 masterLv = 1 @@ -320,6 +340,7 @@ class Skill11(ActiveSkill): 向前方敌人发动前冲攻击后,可以用上勾拳进行追击。\n """ name = "勾拳追击" + ref = Ref.SECONDUPPER learnLv = 10 masterLv = 60 maxLv = 70 @@ -349,6 +370,7 @@ class Skill12(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -376,6 +398,7 @@ class Skill13(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -412,6 +435,7 @@ class Skill14(ActiveSkill): [逆龙七杀]\n """ name = "落凤锤" + ref = Ref.QUAKEAREA cellPos = (6,4) learnLv = 15 masterLv = 60 @@ -442,6 +466,7 @@ class Skill15(ActiveSkill): 凝聚力量用双臂划出十字形刀刃攻击前方敌人。\n """ name = "纯白之刃" + ref = Ref.BLADEOFPUREWHITE cellPos = (7,4) learnLv = 15 masterLv = 60 @@ -482,6 +507,7 @@ class Skill16(PassiveSkill): 仅发动[信仰之翼 : 裁决],不适用增益效果。\n """ name = "勇气恩赐" + ref = Ref.GRACEOFCOURAGE cellPos = (9,4) learnLv = 15 masterLv = 15 @@ -508,6 +534,7 @@ class Skill17(PassiveBufferSkill): 单人挑战时,不适用属性伤害增加效果,且如果体力或精神高于智力,则智力提升至与体力或精神一致,并适用单人挑战专属效果。\n """ name = "守护恩赐" + ref = Ref.GRACEOFPROTECTION cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -538,9 +565,14 @@ class Skill17(PassiveBufferSkill): Vitality = data0 Spirit = data1 + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0,"type":"$+Vitality","ratio":1}, + # {"data":data1,"type":"$+Spirit","ratio":1} + # ] associate = [ - {"data":data0,"type":"$+Vitality","ratio":1}, - {"data":data1,"type":"$+Spirit","ratio":1} + CharacterEffect(attribute=CharacterAttribute.VITALITY, operation=Operation.ADD, value=LevelTable(data0)), + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=LevelTable(data1)), ] CarryRatio = [0]+[(1.055 ** 3) * 100 - 100]*maxLv# noqa: E501 @@ -553,6 +585,7 @@ class Skill18(ActiveSkill): 闪电攻击受[基础精通]影响。\n """ name = "光之正义" + ref = Ref.REVENGEOFLIGHT cellPos = (4,5) learnLv = 20 masterLv = 1 @@ -602,6 +635,7 @@ class Skill19(PassiveSkill): 光明骑士死亡时,恢复一定范围内队员的生命值和魔法值。\n """ name = "灵魂牺牲" + ref = Ref.SACRIFICEOFSOUL cellPos = (0,5) learnLv = 20 masterLv = 1 @@ -636,6 +670,7 @@ class Skill20(ActiveSkill): 蓄气时,增加穿刺攻击力和穿刺敌人数量。\n """ name = "胜利之矛" + ref = Ref.SPEAROFVICTORY cellPos = (6,5) learnLv = 20 masterLv = 60 @@ -675,6 +710,7 @@ class Skill21(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -699,6 +735,7 @@ class Skill22(ActiveSkill): 增加基本攻击力、 技能攻击力、 所有速度和命中率。\n """ name = "圣灵之槌" + ref = Ref.HOLYMACE cellPos = (9,5) learnLv = 20 masterLv = 20 @@ -747,6 +784,7 @@ class Skill23(ActiveBufferSkill): 该技能效果不与光明骑士 (女) 的[守护祝福]、 小魔女的[小魔女的偏爱]技能、 缪斯的[主角登场]、 协战师的[装甲强化]效果叠加。\n """ name = "守护徽章" + ref = Ref.EMBLEMOFSAFEGUARD cellPos = (2,6) learnLv = 25 masterLv = 10 @@ -781,7 +819,12 @@ class Skill23(ActiveBufferSkill): Vitality = data3 Spirit = data4 - associate = [{"type":"$+Vitality","value":data3,"ratio":1},{"type":"$+Spirit","value":data4,"ratio":1}] + # 迁移前实现(保留对照): + # associate = [{"type":"$+Vitality","value":data3,"ratio":1},{"type":"$+Spirit","value":data4,"ratio":1}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.VITALITY, operation=Operation.ADD, value=Constant(0)), + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=Constant(0)), + ] # 圣光守护 # priest_male/crusader_male/ff171dc487807bb9aa28900ca9a46b41 @@ -794,6 +837,7 @@ class Skill24(ActiveSkill): 在决斗场中,只能吸收物理伤害。\n """ name = "圣光守护" + ref = Ref.DIVINELIGHT cellPos = (1,6) learnLv = 25 masterLv = 10 @@ -823,6 +867,7 @@ class Skill25(PassiveSkill): 缩短[缓慢愈合]的生命值恢复时间,提高生命值恢复比率。\n """ name = "快速愈合" + ref = Ref.FASTHEAL cellPos = (3,6) learnLv = 25 masterLv = 1 @@ -849,6 +894,7 @@ class Skill26(ActiveBufferSkill): 学习[守护恩赐]后,对魔法阵内的自身和队友额外发动所有速度增加增益效果。\n """ name = "圣光十字" + ref = Ref.CROSSCRASH cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -892,6 +938,7 @@ class Skill27(ActiveSkill): 队员可以通过盾壁,但敌方无法通过。\n """ name = "圣光沁盾" + ref = Ref.DEFLECTWALL cellPos = (7,7) learnLv = 30 masterLv = 60 @@ -929,6 +976,7 @@ class Skill28(ActiveBufferSkill): 效果不与光明骑士 (女) 的[勇气祝福]、 小魔女的[禁术吟咏]、 缪斯的[可爱节拍]、 协战师的[军械强化]效果叠加。\n """ name = "荣誉祝福" + ref = Ref.GLORIOUSBLESS cellPos = (2,7) learnLv = 30 masterLv = 10 @@ -977,6 +1025,7 @@ class Skill29(PassiveSkill): 盾壁生命值以[圣光沁盾]生命值的一定比例适用。\n """ name = "双子沁盾" + ref = Ref.DEFLECTWALLEX cellPos = (8,7) learnLv = 30 masterLv = 1 @@ -1009,6 +1058,7 @@ class Skill30(PassiveSkill): 学习技能后,增加基本攻击力、 转职技能攻击力和魔法暴击率。\n """ name = "坚定信念" + ref = Ref.HARDENEDWILL cellPos = (5,7) learnLv = 30 masterLv = 10 @@ -1036,6 +1086,7 @@ class Skill31(ActiveSkill): 在决斗场中,面向光球的敌人进入眩晕状态。\n """ name = "圣光球" + ref = Ref.FLASHGLOBE cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1113,6 +1164,7 @@ class Skill32(PassiveSkill): 按前方向键,可以在远处生成光球。\n """ name = "圣光琉璃碎" + ref = Ref.FLASHSCRAP cellPos = (8,8) learnLv = 35 masterLv = 1 @@ -1145,6 +1197,7 @@ class Skill33(ActiveSkill): 发生爆炸时,吸附周围的敌人。\n """ name = "圣光聚合" + ref = Ref.HAPTISM cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -1213,6 +1266,7 @@ class Skill34(ActiveBufferSkill): 仅在存在队员时可以使用,决斗场中无法使用。\n """ name = "生命源泉" + ref = Ref.FOUNTAINOFLIFE cellPos = (0,9) learnLv = 40 masterLv = 1 @@ -1247,6 +1301,7 @@ class Skill35(ActiveSkill): 决斗场中不适用忏悔效果。\n """ name = "忏悔之锤" + ref = Ref.HAMMEROFCONTRITION cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -1308,6 +1363,7 @@ class Skill36(ActiveBufferSkill): 施放过程中按跳跃键时,可以中断技能。\n """ name = "圣愈之风" + ref = Ref.HEALWIND cellPos = (3,10) learnLv = 45 masterLv = 1 @@ -1347,6 +1403,7 @@ class Skill37(ActiveSkill): 光刃飞下过程中按跳跃键,可以立即出现正义天使。\n """ name = "正义审判" + ref = Ref.JUDGEMENT cellPos = (6,10) learnLv = 45 masterLv = 60 @@ -1411,6 +1468,7 @@ class Skill38(PassiveBufferSkill): 学习[勇气恩赐]后,不会发动光环效果。\n """ name = "信念光环" + ref = Ref.AURAOFFAITH cellPos = (5,11) learnLv = 48 masterLv = 40 @@ -1455,6 +1513,7 @@ class Skill39(ActiveBufferSkill): 学习[勇气恩赐]后,天空中将不会降下充满神圣之力的光芒。\n """ name = "天启之光" + ref = Ref.APOCALYPSE cellPos = (6,11) learnLv = 50 masterLv = 40 @@ -1501,6 +1560,7 @@ class Skill40(PassiveSkill): 天启者的体力和精神补正为两者中数值较高的一方、 物理暴击率和魔法暴击率补正为两者中数值较高的一方。\n """ name = "圣念" + ref = Ref.MEDITATION cellPos = (0,11) learnLv = 50 masterLv = 1 @@ -1521,6 +1581,7 @@ class Skill41(ActiveSkill): 携神圣之力向前突进,然后挥舞巨兵。\n """ name = "圣光突袭" + ref = Ref.MIRACLESPLITER cellPos = (7,12) learnLv = 60 masterLv = 40 @@ -1586,6 +1647,7 @@ class Skill42(ActiveSkill): 投掷时击退近距离的敌人,然后神圣之矛垂直下落,引发爆炸。\n """ name = "神圣之矛" + ref = Ref.SPEAROFDESTINY cellPos = (6,13) learnLv = 70 masterLv = 40 @@ -1654,6 +1716,7 @@ class Skill43(ActiveBufferSkill): 可以利用方向键调整魔法阵生成位置。\n """ name = "圣佑结界" + ref = Ref.HOLLYSANCTUARY cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1723,6 +1786,7 @@ class Skill44(ActiveBufferSkill): [守护徽章]、 [荣誉祝福]。\n """ name = "神圣之光" + ref = Ref.DIVINEFLASH cellPos = (4,13) learnLv = 75 masterLv = 40 @@ -1758,7 +1822,12 @@ class Skill44(ActiveBufferSkill): Vitality = data0 Spirit = data0 - associate = [{"data": Vitality, "type": "$+Vitality"}, {"data": Spirit, "type": "$+Spirit"}] + # 迁移前实现(保留对照): + # associate = [{"data": Vitality, "type": "$+Vitality"}, {"data": Spirit, "type": "$+Spirit"}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.VITALITY, operation=Operation.ADD, value=Percent(LevelTable(Vitality))), + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=Percent(LevelTable(Spirit))), + ] def vp_1(self): """ @@ -1805,6 +1874,7 @@ class Skill45(ActiveSkill): - 施放[惩罚之锤]时自动施放\n """ name = "惩罚之锤" + ref = Ref.JUPITER cellPos = (4,14) learnLv = 80 masterLv = 40 @@ -1864,6 +1934,7 @@ class Skill46(ActiveBufferSkill): 每名队员最多生成1层信仰效果,对自身使用时不生成。\n """ name = "神圣洗礼 : 信仰之翼" + ref = Ref.DIVINEPUNISHMENT cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1911,6 +1982,7 @@ class Skill47(ActiveSkill): 在[神圣洗礼 : 信仰之翼]已激活的状态下使用技能,则[神圣洗礼 : 信仰之翼]与[信仰之翼 : 裁决]技能一起结束。\n """ name = "信仰之翼 : 裁决" + ref = Ref.PENALTY cellPos = (6,14) learnLv = 85 masterLv = 1 @@ -1944,6 +2016,7 @@ class Skill48(ActiveSkill): 按向前方向键,可以增加跳跃距离。\n """ name = "惩罚之锤 : 天怒" + ref = Ref.ASTRAFE cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1983,6 +2056,7 @@ class Skill49(PassiveBufferSkill): 攻击失败时,会在自身位置生成魔法阵。\n """ name = "神之代行者" + ref = Ref.DIVINEAGENT cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -2004,7 +2078,12 @@ class Skill49(PassiveBufferSkill): Vitality = Spirit = data1 - associate = [{"data": Vitality, "type": "$+Vitality"}, {"data": Spirit, "type": "$+Spirit"}] + # 迁移前实现(保留对照): + # associate = [{"data": Vitality, "type": "$+Vitality"}, {"data": Spirit, "type": "$+Spirit"}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.VITALITY, operation=Operation.ADD, value=Percent(LevelTable(Vitality))), + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=Percent(LevelTable(Spirit))), + ] # 生命礼赞 : 神威 # priest_male/crusader_male/a81e5b7defa1819263ed8e86f69fd06f @@ -2026,6 +2105,7 @@ class Skill50(ActiveBufferSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "生命礼赞 : 神威" + ref = Ref.LASTJUDGMENT cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/priest_male/crusader_male_carry.py b/backend/core/character/GF/priest_male/crusader_male_carry.py index e36b62a1..9be5f8fa 100644 --- a/backend/core/character/GF/priest_male/crusader_male_carry.py +++ b/backend/core/character/GF/priest_male/crusader_male_carry.py @@ -1,6 +1,14 @@ #f6a4ad30555b99b499c07835f87ce522 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + LevelTable, + Percent, + Power, + SkillAttribute, + SkillEffect, +) +from core.character.refs.priest_male.crusader_male import CrusaderMaleSkillRef as Ref prefix = "priest_male/crusader_male/cn/skillDetail" # 空斩打 @@ -17,6 +25,7 @@ class Skill0(ActiveSkill): 转职为驱魔师后, 可以蓄气攻击。 """ name = "空斩打" + ref = Ref.ANTIAIRUPPER learnLv = 1 masterLv = 10 maxLv = 20 @@ -51,6 +60,7 @@ class Skill1(ActiveSkill): 转职为光明骑士时, 技能类型变为独立攻击力。 """ name = "虎袭" + ref = Ref.SMASHER learnLv = 1 masterLv = 60 maxLv = 70 @@ -83,6 +93,7 @@ class Skill2(PassiveSkill): 获得神的恩泽, 增加所有异常状态的抗性。 """ name = "神的恩赐" + ref = Ref.GRACEOFGOD learnLv = 15 masterLv = 1 maxLv = 1 @@ -109,6 +120,7 @@ class Skill4(PassiveSkill): 在决斗场中, 增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。 """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -128,13 +140,22 @@ class Skill4(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['空斩打', '光之正义']}, + # {'type': '*power2', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['惩罚之锤']}, + # {'type': '*power3', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['惩罚之锤']}, + # {'type': '*power4', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['惩罚之锤']}, + # {'type': '*power6', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['惩罚之锤']}, + # {'type': '*power7', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['惩罚之锤']} + # ] associate = [ - {'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['空斩打', '光之正义']}, - {'type': '*power2', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['惩罚之锤']}, - {'type': '*power3', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['惩罚之锤']}, - {'type': '*power4', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['惩罚之锤']}, - {'type': '*power6', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['惩罚之锤']}, - {'type': '*power7', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['惩罚之锤']} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.ANTIAIRUPPER, Ref.REVENGEOFLIGHT]), + SkillEffect(attribute=Power(2), value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.JUPITER]), + SkillEffect(attribute=Power(3), value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.JUPITER]), + SkillEffect(attribute=Power(4), value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.JUPITER]), + SkillEffect(attribute=Power(6), value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.JUPITER]), + SkillEffect(attribute=Power(7), value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.JUPITER]), ] @@ -168,6 +189,7 @@ class Skill14(ActiveSkill): [逆龙七杀] """ name = "落凤锤" + ref = Ref.QUAKEAREA learnLv = 15 masterLv = 60 maxLv = 70 @@ -198,6 +220,7 @@ class Skill15(ActiveSkill): 凝聚力量用双臂划出十字形刀刃攻击前方敌人。 """ name = "纯白之刃" + ref = Ref.BLADEOFPUREWHITE learnLv = 15 masterLv = 60 maxLv = 70 @@ -251,6 +274,7 @@ class Skill16(PassiveSkill): 仅发动[信仰之翼 : 裁决], 不适用增益效果。 """ name = "勇气恩赐" + ref = Ref.GRACEOFCOURAGE learnLv = 15 masterLv = 15 maxLv = 25 @@ -265,7 +289,11 @@ class Skill16(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] @@ -279,6 +307,7 @@ class Skill18(ActiveSkill): 闪电攻击受[基础精通]影响。 """ name = "光之正义" + ref = Ref.REVENGEOFLIGHT learnLv = 20 masterLv = 1 maxLv = 11 @@ -334,6 +363,7 @@ class Skill19(PassiveSkill): 光明骑士死亡时, 恢复一定范围内队员的生命值和魔法值。 """ name = "灵魂牺牲" + ref = Ref.SACRIFICEOFSOUL learnLv = 20 masterLv = 1 maxLv = 6 @@ -359,7 +389,11 @@ class Skill19(PassiveSkill): # 队员魔法值恢复量 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'data': data2}] + # 迁移前实现(保留对照): + # associate = [{'data': data2}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # 胜利之矛 # priest_male/crusader_male/8510294202d0e042dd29a2422fc6770d @@ -371,6 +405,7 @@ class Skill20(ActiveSkill): 蓄气时, 增加穿刺攻击力和穿刺敌人数量。 """ name = "胜利之矛" + ref = Ref.SPEAROFVICTORY learnLv = 20 masterLv = 60 maxLv = 70 @@ -415,6 +450,7 @@ class Skill22(ActiveSkill): 增加基本攻击力、 技能攻击力、 所有速度和命中率。 """ name = "圣灵之槌" + ref = Ref.HOLYMACE learnLv = 20 masterLv = 20 maxLv = 30 @@ -467,6 +503,7 @@ class Skill26(ActiveSkill): 学习[守护恩赐]后, 对魔法阵内的自身和队友额外发动所有速度增加增益效果。 """ name = "圣光十字" + ref = Ref.CROSSCRASH learnLv = 25 masterLv = 60 maxLv = 70 @@ -513,6 +550,7 @@ class Skill27(ActiveSkill): 队员可以通过盾壁, 但敌方无法通过。 """ name = "圣光沁盾" + ref = Ref.DEFLECTWALL learnLv = 30 masterLv = 60 maxLv = 70 @@ -552,6 +590,7 @@ class Skill29(PassiveSkill): 盾壁生命值以[圣光沁盾]生命值的一定比例适用。 """ name = "双子沁盾" + ref = Ref.DEFLECTWALLEX learnLv = 30 masterLv = 1 maxLv = 1 @@ -585,6 +624,7 @@ class Skill30(PassiveSkill): 学习技能后, 增加基本攻击力、 转职技能攻击力和魔法暴击率。 """ name = "坚定信念" + ref = Ref.HARDENEDWILL learnLv = 30 masterLv = 10 maxLv = 20 @@ -601,7 +641,11 @@ class Skill30(PassiveSkill): # 魔法暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 圣光球 # priest_male/crusader_male/9bff7f2559e003766fee2853dca00631 @@ -617,6 +661,7 @@ class Skill31(ActiveSkill): 在决斗场中, 面向光球的敌人进入眩晕状态。 """ name = "圣光球" + ref = Ref.FLASHGLOBE learnLv = 35 masterLv = 60 maxLv = 70 @@ -725,6 +770,7 @@ class Skill32(PassiveSkill): 按前方向键, 可以在远处生成光球。 """ name = "圣光琉璃碎" + ref = Ref.FLASHSCRAP learnLv = 35 masterLv = 1 maxLv = 1 @@ -748,7 +794,11 @@ class Skill32(PassiveSkill): # 眩晕范围 : {value4}px data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{'data': [0, 92.5 - 100], 'skills': ['圣光球']}] + # 迁移前实现(保留对照): + # associate = [{'data': [0, 92.5 - 100], 'skills': ['圣光球']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0, 92.5 - 100])), skills=[Ref.FLASHGLOBE]), + ] # 圣光聚合 # priest_male/crusader_male/dacd5c2848a1eb33489e5471f1a73759 @@ -760,6 +810,7 @@ class Skill33(ActiveSkill): 发生爆炸时, 吸附周围的敌人。 """ name = "圣光聚合" + ref = Ref.HAPTISM learnLv = 35 masterLv = 60 maxLv = 70 @@ -852,6 +903,7 @@ class Skill34(ActiveSkill): 仅在存在队员时可以使用, 决斗场中无法使用。 """ name = "生命源泉" + ref = Ref.FOUNTAINOFLIFE learnLv = 40 masterLv = 1 maxLv = 11 @@ -888,6 +940,7 @@ class Skill35(ActiveSkill): 决斗场中不适用忏悔效果。 """ name = "忏悔之锤" + ref = Ref.HAMMEROFCONTRITION learnLv = 40 masterLv = 60 maxLv = 70 @@ -965,6 +1018,7 @@ class Skill36(ActiveSkill): 施放过程中按跳跃键时, 可以中断技能。 """ name = "圣愈之风" + ref = Ref.HEALWIND learnLv = 45 masterLv = 1 maxLv = 11 @@ -1005,6 +1059,7 @@ class Skill37(ActiveSkill): 光刃飞下过程中按跳跃键, 可以立即出现正义天使。 """ name = "正义审判" + ref = Ref.JUDGEMENT learnLv = 45 masterLv = 60 maxLv = 70 @@ -1090,6 +1145,7 @@ class Skill38(PassiveSkill): 学习[勇气恩赐]后, 不会发动光环效果。 """ name = "信念光环" + ref = Ref.AURAOFFAITH learnLv = 48 masterLv = 40 maxLv = 50 @@ -1116,7 +1172,11 @@ class Skill38(PassiveSkill): # 光环范围 : {value5}px data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 天启之光 # priest_male/crusader_male/dcb31a63ef58954f44ff2070c42a9a98 @@ -1136,6 +1196,7 @@ class Skill39(ActiveSkill): 学习[勇气恩赐]后, 天空中将不会降下充满神圣之力的光芒。 """ name = "天启之光" + ref = Ref.APOCALYPSE learnLv = 50 masterLv = 40 maxLv = 50 @@ -1180,6 +1241,7 @@ class Skill40(PassiveSkill): 天启者的体力和精神补正为两者中数值较高的一方、 物理暴击率和魔法暴击率补正为两者中数值较高的一方。 """ name = "圣念" + ref = Ref.MEDITATION learnLv = 50 masterLv = 1 maxLv = 1 @@ -1200,6 +1262,7 @@ class Skill41(ActiveSkill): 携神圣之力向前突进, 然后挥舞巨兵。 """ name = "圣光突袭" + ref = Ref.MIRACLESPLITER learnLv = 60 masterLv = 40 maxLv = 50 @@ -1286,6 +1349,7 @@ class Skill42(ActiveSkill): 投掷时击退近距离的敌人, 然后神圣之矛垂直下落, 引发爆炸。 """ name = "神圣之矛" + ref = Ref.SPEAROFDESTINY learnLv = 70 masterLv = 40 maxLv = 50 @@ -1380,6 +1444,7 @@ class Skill43(ActiveSkill): 可以利用方向键调整魔法阵生成位置。 """ name = "圣佑结界" + ref = Ref.HOLLYSANCTUARY learnLv = 75 masterLv = 40 maxLv = 50 @@ -1475,6 +1540,7 @@ class Skill44(ActiveSkill): [守护徽章]、 [荣誉祝福]。 """ name = "神圣之光" + ref = Ref.DIVINEFLASH learnLv = 75 masterLv = 40 maxLv = 50 @@ -1578,6 +1644,7 @@ class Skill45(ActiveSkill): - 施放[惩罚之锤]时自动施放 """ name = "惩罚之锤" + ref = Ref.JUPITER learnLv = 80 masterLv = 40 maxLv = 50 @@ -1622,7 +1689,11 @@ class Skill45(ActiveSkill): # [雷霆粉碎]冲击波攻击力 : {value9} data9 = get_data(f'{prefix}/{uuid}', 9) - associate = [{'data': data1}] + # 迁移前实现(保留对照): + # associate = [{'data': data1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] mode = ["平X一轮","空斩打","落凤锤"] @@ -1643,9 +1714,9 @@ class Skill45(ActiveSkill): if mode == "平X一轮": return 0.5 elif mode == "空斩打": - return self.char.GetSkillByName("空斩打").getSkillCD() + return self.char.GetSkill(Ref.ANTIAIRUPPER).getSkillCD() elif mode == "落凤锤": - return self.char.GetSkillByName("落凤锤").getSkillCD() + return self.char.GetSkill(Ref.QUAKEAREA).getSkillCD() # 神圣洗礼 : 信仰之翼 # priest_male/crusader_male/c524c4f378d1cd0ff99e4580750a4567 @@ -1671,6 +1742,7 @@ class Skill46(ActiveSkill): 每名队员最多生成1层信仰效果, 对自身使用时不生成。 """ name = "神圣洗礼 : 信仰之翼" + ref = Ref.DIVINEPUNISHMENT learnLv = 85 masterLv = 40 maxLv = 50 @@ -1711,6 +1783,7 @@ class Skill47(ActiveSkill): 在[神圣洗礼 : 信仰之翼]已激活的状态下使用技能, 则[神圣洗礼 : 信仰之翼]与[信仰之翼 : 裁决]技能一起结束。 """ name = "信仰之翼 : 裁决" + ref = Ref.PENALTY learnLv = 85 masterLv = 1 maxLv = 1 @@ -1725,13 +1798,7 @@ class Skill47(ActiveSkill): hasVP = False hasUP = False - @property - def lv(self): - """技能等级""" - return self.char.GetSkillByName('神圣洗礼 : 信仰之翼').lv - - @lv.setter - def lv(self, value): ... + level_source = Ref.DIVINEPUNISHMENT # 爆炸攻击力 : {value0} data0 = get_data(f'{prefix}/{uuid}', 0) @@ -1760,6 +1827,7 @@ class Skill48(ActiveSkill): 按向前方向键, 可以增加跳跃距离。 """ name = "惩罚之锤 : 天怒" + ref = Ref.ASTRAFE learnLv = 95 masterLv = 40 maxLv = 50 @@ -1809,6 +1877,7 @@ class Skill49(PassiveSkill): 攻击失败时, 会在自身位置生成魔法阵。 """ name = "神之代行者" + ref = Ref.DIVINEAGENT learnLv = 95 masterLv = 40 maxLv = 50 @@ -1828,7 +1897,11 @@ class Skill49(PassiveSkill): # 矛的大小额外增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 生命礼赞 : 神威 # priest_male/crusader_male/a81e5b7defa1819263ed8e86f69fd06f @@ -1862,6 +1935,7 @@ class Skill50(ActiveSkill): 若关联的技能还在冷却中, 则无法使用三次觉醒技能。 """ name = "生命礼赞 : 神威" + ref = Ref.LASTJUDGMENT learnLv = 100 masterLv = 40 maxLv = 50 diff --git a/backend/core/character/GF/priest_male/exorcist.py b/backend/core/character/GF/priest_male/exorcist.py index ff5f2963..de8b86d3 100644 --- a/backend/core/character/GF/priest_male/exorcist.py +++ b/backend/core/character/GF/priest_male/exorcist.py @@ -2,6 +2,17 @@ from core.basic.formula import 武器冷却惩罚 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Equals, + LevelTable, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.priest_male.exorcist import ExorcistSkillRef as Ref prefix = "priest_male/exorcist/cn/skillDetail" @@ -29,6 +40,7 @@ class Skill0(ActiveSkill): """ name = '空斩打' + ref = Ref.ANTIAIRUPPER cellPos = (7,1) learnLv = 1 masterLv = 10 @@ -59,6 +71,7 @@ class Skill1(ActiveSkill): 转职为光明骑士时,技能类型变为独立攻击力。\n """ name = "虎袭" + ref = Ref.SMASHER learnLv = 1 masterLv = 60 maxLv = 70 @@ -91,6 +104,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -115,6 +129,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -134,7 +149,11 @@ class Skill3(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['空斩打', '疾风打']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['空斩打', '疾风打']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.ANTIAIRUPPER, Ref.GALESMASH]), + ] # 受身蹲伏 # priest_male/exorcist/ce26c6b69d02a440a81b552bec94f03b @@ -144,6 +163,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -175,6 +195,7 @@ class Skill5(PassiveSkill): 在决斗场中,无法转换攻击类型,适用技能固有的攻击类型。\n """ name = "攻击类型转换" + ref = Ref.CONVERSION learnLv = 1 masterLv = 1 maxLv = 1 @@ -199,6 +220,7 @@ class Skill6(PassiveSkill): """ name = '法阵 : 万悟' + ref = Ref.ADAPTATION cellPos = (2,1) learnLv = 1 masterLv = 1 @@ -235,6 +257,7 @@ class Skill7(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -257,6 +280,7 @@ class Skill8(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -279,6 +303,7 @@ class Skill9(ActiveSkill): 选择一定范围内的队员恢复生命值。\n """ name = "缓慢愈合" + ref = Ref.SLOWHEAL learnLv = 5 masterLv = 60 maxLv = 70 @@ -309,6 +334,7 @@ class Skill10(ActiveSkill): 转职成为蓝拳使者时,才可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "直拳冲击" + ref = Ref.LUCKYSTRAIGHT learnLv = 5 masterLv = 60 maxLv = 70 @@ -339,6 +365,7 @@ class Skill11(ActiveSkill): 使一定范围内的队员消除异常状态。\n """ name = "净化" + ref = Ref.CURE learnLv = 10 masterLv = 1 maxLv = 11 @@ -366,6 +393,7 @@ class Skill12(ActiveSkill): 向前方敌人发动前冲攻击后,可以用上勾拳进行追击。\n """ name = "勾拳追击" + ref = Ref.SECONDUPPER learnLv = 10 masterLv = 60 maxLv = 70 @@ -395,6 +423,7 @@ class Skill13(ActiveSkill): 若在[魔化 : 末日守卫者]状态下施放该技能,则增加攻击力和冷却时间。\n """ name = "恶魔之手" + ref = Ref.GRASPHANDOFANGER learnLv = 10 masterLv = 60 maxLv = 70 @@ -436,6 +465,7 @@ class Skill14(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -463,6 +493,7 @@ class Skill15(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -494,6 +525,7 @@ class Skill16(ActiveSkill): 在决斗场中,施放其他技能过程中无法使用该技能。\n """ name = "化魔" + ref = Ref.CHANGEHPTOMP learnLv = 15 masterLv = 1 maxLv = 11 @@ -545,6 +577,7 @@ class Skill17(ActiveSkill): """ name = '落凤锤' + ref = Ref.QUAKEAREA cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -581,6 +614,7 @@ class Skill18(PassiveSkill): """ name = '潜龙' + ref = Ref.CHARGEWEAPON cellPos = (8,4) learnLv = 15 masterLv = 1 @@ -605,6 +639,7 @@ class Skill19(PassiveSkill): """ name = '驱魔震慑' + ref = Ref.FORCEOFEXORCISM cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -630,6 +665,7 @@ class Skill20(ActiveSkill): """ name = '疾风打' + ref = Ref.GALESMASH cellPos = (6,4) learnLv = 15 masterLv = 1 @@ -665,6 +701,7 @@ class Skill21(ActiveSkill): """ name = '封魔莲华' + ref = Ref.CHAKRAOFPASSION cellPos = (6,5) learnLv = 20 masterLv = 10 @@ -696,6 +733,7 @@ class Skill22(PassiveSkill): """ name = '巨兵精通' + ref = Ref.BIGWEAPONMASTERY cellPos = (8,5) learnLv = 20 masterLv = 20 @@ -712,7 +750,11 @@ class Skill22(PassiveSkill): # 物理、 魔法攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data1, 'type': '$*PAtkP'}] + # 迁移前实现(保留对照): + # associate = [{'data': data1, 'type': '$*PAtkP'}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data1))), + ] # 升天阵 # priest_male/exorcist/b89c9ab317bc0a443f6497b7cca2f6a8 @@ -725,6 +767,7 @@ class Skill23(ActiveSkill): """ name = '升天阵' + ref = Ref.RISINGAREA cellPos = (2,5) learnLv = 20 masterLv = 60 @@ -758,6 +801,7 @@ class Skill24(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -786,6 +830,7 @@ class Skill25(ActiveSkill): """ name = '星落打' + ref = Ref.HOMERUN cellPos = (7,6) learnLv = 25 masterLv = 60 @@ -818,6 +863,7 @@ class Skill26(ActiveSkill): """ name = '式神 : 热炎朱雀' + ref = Ref.SUZAKU cellPos = (3,6) learnLv = 25 masterLv = 60 @@ -857,6 +903,7 @@ class Skill27(ActiveSkill): """ name = '式神 : 地之玄武' + ref = Ref.HYUNMOONEW cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -893,6 +940,7 @@ class Skill28(PassiveSkill): """ name = '驱魔之书' + ref = Ref.BOOKOFEXOCISM cellPos = (8,7) learnLv = 30 masterLv = 10 @@ -908,7 +956,12 @@ class Skill28(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 冷却时间减少率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0}, {'data': data1, 'type': '*cdReduce', 'exceptSkills': ['四座千泰门', '真龙焚天', '雷鸣怒海·火啸山崩']}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}, {'data': data1, 'type': '*cdReduce', 'exceptSkills': ['四座千泰门', '真龙焚天', '雷鸣怒海·火啸山崩']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data1)), except_skills=[Ref.FOURGODDOOR, Ref.ADVANCEDDRAGON, Ref.SKYEARTHSTRIKE]), + ] # 式神 : 空之白虎 # priest_male/exorcist/0ed3148658fe37b3336ccb718dc0fdb0 @@ -922,6 +975,7 @@ class Skill29(ActiveSkill): """ name = '式神 : 空之白虎' + ref = Ref.BEAKHONEW cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -984,6 +1038,7 @@ class Skill30(ActiveSkill): """ name = '狂乱锤击' + ref = Ref.REPEATEDSMASH cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -1050,6 +1105,7 @@ class Skill31(ActiveSkill): """ name = '疾空旋风破' + ref = Ref.GIANTSWING cellPos = (7,9) learnLv = 40 masterLv = 60 @@ -1096,13 +1152,18 @@ class Skill31(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [ - {'type': '*skillRation', 'data': [0] + [150] * self.maxLv, 'skills': ['式神 : 热炎朱雀']}, - {'type': '*cdReduce', 'data': [0] + [-150] * self.maxLv, 'skills': ['式神 : 热炎朱雀']}, - ] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [ + # {'type': '*skillRation', 'data': [0] + [150] * self.maxLv, 'skills': ['式神 : 热炎朱雀']}, + # {'type': '*cdReduce', 'data': [0] + [-150] * self.maxLv, 'skills': ['式神 : 热炎朱雀']}, + # ] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [150] * maxLv)), skills=[Ref.SUZAKU], when=Equals(Read(SkillAttribute.VP), 2)), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable([0] + [-150] * maxLv)), skills=[Ref.SUZAKU], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 无双击 # priest_male/exorcist/d53301bb328baf12a3ae482cc6a565dd @@ -1114,6 +1175,7 @@ class Skill32(ActiveSkill): """ name = '无双击' + ref = Ref.ATOMICSMASH cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1167,6 +1229,7 @@ class Skill33(PassiveSkill): """ name = '斗志散发' + ref = Ref.RADIATEFIGHTINGAURA cellPos = (8,11) learnLv = 48 masterLv = 40 @@ -1180,7 +1243,11 @@ class Skill33(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 四座千泰门 # priest_male/exorcist/5892d1fa4462e561ac8f8d2c74892b0a @@ -1191,6 +1258,7 @@ class Skill34(ActiveSkill): """ name = '四座千泰门' + ref = Ref.FOURGODDOOR cellPos = (4,11) learnLv = 50 masterLv = 40 @@ -1225,6 +1293,7 @@ class Skill35(ActiveSkill): """ name = '式神 : 幻海青龙' + ref = Ref.OCEANDRAGON cellPos = (3,12) learnLv = 60 masterLv = 40 @@ -1287,6 +1356,7 @@ class Skill36(ActiveSkill): """ name = '逆鳞震' + ref = Ref.DANGEROUSSCALE cellPos = (5,13) learnLv = 70 masterLv = 40 @@ -1342,6 +1412,7 @@ class Skill37(PassiveSkill): """ name = '式神契结 : 真龙' + ref = Ref.YELLOWDRAGON cellPos = (3,13) learnLv = 75 masterLv = 1 @@ -1362,7 +1433,11 @@ class Skill37(PassiveSkill): # 驱魔师和队友所有速度增加 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 式神之力 # priest_male/exorcist/328867949b763ce73e243da84fd59157 @@ -1373,6 +1448,7 @@ class Skill38(PassiveSkill): """ name = '式神之力' + ref = Ref.STAGEOFHERMIT cellPos = (8,13) learnLv = 75 masterLv = 40 @@ -1389,7 +1465,11 @@ class Skill38(PassiveSkill): # 暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 逆龙七杀 # priest_male/exorcist/5197b141332a65a89d452adf227c2f30 @@ -1403,6 +1483,7 @@ class Skill39(ActiveSkill): """ name = '逆龙七杀' + ref = Ref.THEBEST7HIT cellPos = (7,13) learnLv = 75 masterLv = 40 @@ -1477,6 +1558,7 @@ class Skill40(ActiveSkill): """ name = '升龙·开阵' + ref = Ref.DRAGONCIRCLE cellPos = (2,14) learnLv = 80 masterLv = 40 @@ -1536,6 +1618,7 @@ class Skill41(ActiveSkill): """ name = '真龙焚天' + ref = Ref.ADVANCEDDRAGON cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1569,6 +1652,7 @@ class Skill42(PassiveSkill): """ name = '式神之悟' + ref = Ref.GODOFEXORCISM cellPos = (8,15) learnLv = 95 masterLv = 40 @@ -1585,7 +1669,11 @@ class Skill42(PassiveSkill): # 共鸣填充冷却时间 : {value1}秒 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 式神灭却·合 # priest_male/exorcist/3153ca0e6752a6283412c59c5ec8e002 @@ -1596,6 +1684,7 @@ class Skill43(ActiveSkill): """ name = '式神灭却·合' + ref = Ref.FOURGODPOWER cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1639,6 +1728,7 @@ class Skill44(ActiveSkill): """ name = '雷鸣怒海·火啸山崩' + ref = Ref.SKYEARTHSTRIKE cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/priest_male/infighter.py b/backend/core/character/GF/priest_male/infighter.py index caef877f..f79e1f78 100644 --- a/backend/core/character/GF/priest_male/infighter.py +++ b/backend/core/character/GF/priest_male/infighter.py @@ -1,6 +1,15 @@ #f6a4ad30555b99b499c07835f87ce522 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + Equals, + LevelTable, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.priest_male.infighter import InfighterSkillRef as Ref prefix = "priest_male/infighter/cn/skillDetail" @@ -15,6 +24,7 @@ class Skill0(ActiveSkill): 转职为驱魔师后,可以蓄气攻击。\n """ name = "空斩打" + ref = Ref.ANTIAIRUPPER learnLv = 1 masterLv = 10 maxLv = 20 @@ -45,6 +55,7 @@ class Skill1(ActiveSkill): 转职为光明骑士时,技能类型变为独立攻击力。\n """ name = "虎袭" + ref = Ref.SMASHER cellPos = (3,1) learnLv = 1 masterLv = 60 @@ -77,6 +88,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -100,6 +112,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -127,6 +140,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -168,6 +182,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -190,6 +205,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -212,6 +228,7 @@ class Skill7(ActiveSkill): 选择一定范围内的队员恢复生命值。\n """ name = "缓慢愈合" + ref = Ref.SLOWHEAL learnLv = 5 masterLv = 60 maxLv = 70 @@ -242,6 +259,7 @@ class Skill8(ActiveSkill): 转职成为蓝拳使者时,才可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "直拳冲击" + ref = Ref.LUCKYSTRAIGHT cellPos = (6,2) learnLv = 5 masterLv = 60 @@ -274,6 +292,7 @@ class Skill9(ActiveSkill): 使一定范围内的队员消除异常状态。\n """ name = "净化" + ref = Ref.CURE learnLv = 10 masterLv = 1 maxLv = 11 @@ -301,6 +320,7 @@ class Skill10(ActiveSkill): 向前方敌人发动前冲攻击后,可以用上勾拳进行追击。\n """ name = "勾拳追击" + ref = Ref.SECONDUPPER cellPos = (5,3) learnLv = 10 masterLv = 60 @@ -331,6 +351,7 @@ class Skill11(ActiveSkill): 若在[魔化 : 末日守卫者]状态下施放该技能,则增加攻击力和冷却时间。\n """ name = "恶魔之手" + ref = Ref.GRASPHANDOFANGER learnLv = 10 masterLv = 60 maxLv = 70 @@ -372,6 +393,7 @@ class Skill12(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -399,6 +421,7 @@ class Skill13(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -427,6 +450,7 @@ class Skill14(ActiveSkill): 只能在[意念驱动]已施放的状态下使用。\n """ name = "俯冲" + ref = Ref.DUCKING cellPos = (6,4) learnLv = 15 masterLv = 1 @@ -458,6 +482,7 @@ class Skill15(ActiveSkill): 只能在[意念驱动]已施放的状态下使用。\n """ name = "摆动" + ref = Ref.SWAY cellPos = (3,4) learnLv = 15 masterLv = 1 @@ -488,6 +513,7 @@ class Skill16(ActiveSkill): 在决斗场中,施放其他技能过程中无法使用该技能。\n """ name = "化魔" + ref = Ref.CHANGEHPTOMP learnLv = 15 masterLv = 1 maxLv = 11 @@ -538,6 +564,7 @@ class Skill17(ActiveSkill): [逆龙七杀]\n """ name = "落凤锤" + ref = Ref.QUAKEAREA learnLv = 15 masterLv = 60 maxLv = 70 @@ -572,6 +599,7 @@ class Skill18(ActiveSkill): 进入地下城时,巨兵初始状态为插入地面; 在决斗场中,巨兵初始状态为握在手中。\n """ name = "意念驱动" + ref = Ref.WILLDRIVER cellPos = (2,4) learnLv = 15 masterLv = 10 @@ -599,7 +627,12 @@ class Skill18(ActiveSkill): # 离开[意念驱动]范围后增益效果持续时间 : {value6}秒 data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{"data":data2},{"data":data5,"type":"*cdReduce","exceptSkills":["泯灭神击","制裁 : 怒火疾风","正义执行 : 雷米迪奥斯的圣座"]}] + # 迁移前实现(保留对照): + # associate = [{"data":data2},{"data":data5,"type":"*cdReduce","exceptSkills":["泯灭神击","制裁 : 怒火疾风","正义执行 : 雷米迪奥斯的圣座"]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data5)), except_skills=[Ref.BIGBANGPUNCH, Ref.WRATHOFGOD, Ref.CONSTELLATIONOFLEMIEDIOS]), + ] # 百炼成刚 # priest_male/infighter/da6e37c1e3f0e8867f70007d89c239ff @@ -609,6 +642,7 @@ class Skill19(PassiveSkill): 强化身体,提升移动速度、 攻击速度和跳跃力。 并向外散放拳气,使[基本攻击的上钩拳]、 [勾拳追击]、 [前冲攻击]可以向更低位置的敌人发动。\n """ name = "百炼成刚" + ref = Ref.EXTENDEDPUNCH cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -636,6 +670,7 @@ class Skill20(ActiveSkill): 学习一定等级的[技巧精通]后,[摆动]中也可以发出攻击。\n """ name = "俯冲直拳" + ref = Ref.DUCKINGSTRAIGHT cellPos = (7,5) learnLv = 15 masterLv = 60 @@ -662,6 +697,7 @@ class Skill21(ActiveSkill): 学习一定等级的[技巧精通]后,[摆动]中也可以发出攻击。\n """ name = "俯冲翔拳" + ref = Ref.DUCKINGUPPER cellPos = (6,5) learnLv = 15 masterLv = 60 @@ -701,6 +737,7 @@ class Skill22(PassiveSkill): - [俯冲直拳]、 [俯冲腹拳]、 [俯冲翔拳]、 [圣拳连击]\n """ name = "技巧精通" + ref = Ref.TECHNICALMASTERY cellPos = (1,5) learnLv = 20 masterLv = 10 @@ -744,14 +781,23 @@ class Skill22(PassiveSkill): data15 = get_data(f'{prefix}/{uuid}', 15) data16 = get_data(f'{prefix}/{uuid}', 16) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0}, + # {"data":[i*j for i,j in zip(data9,data10)],"skills":["俯冲直拳"]}, + # {"data":[i*j for i,j in zip(data11,data12)],"skills":["俯冲腹拳"]}, + # {"data":[i*j for i,j in zip(data13,data14)],"skills":["俯冲翔拳"]}, + # {"data":[i*j for i,j in zip(data15,data16)],"skills":["圣拳连击"]}, + # {"data":data6,type:"=preRatio", "skills":["神圣反击"]}, + # ] associate = [ - {"data":data0}, - {"data":[i*j for i,j in zip(data9,data10)],"skills":["俯冲直拳"]}, - {"data":[i*j for i,j in zip(data11,data12)],"skills":["俯冲腹拳"]}, - {"data":[i*j for i,j in zip(data13,data14)],"skills":["俯冲翔拳"]}, - {"data":[i*j for i,j in zip(data15,data16)],"skills":["圣拳连击"]}, - {"data":data6,type:"=preRatio", "skills":["神圣反击"]}, - ] + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i * j for i, j in zip(data9, data10)])), skills=[Ref.DUCKINGSTRAIGHT]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i * j for i, j in zip(data11, data12)])), skills=[Ref.DUCKINGBODYBLOW]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i * j for i, j in zip(data13, data14)])), skills=[Ref.DUCKINGUPPER]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i * j for i, j in zip(data15, data16)])), skills=[Ref.GORGEOUSCOMBINATION]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data6)), skills=[Ref.HOLYCOUNTER]), + ] # 俯冲腹拳 # priest_male/infighter/c61f5a010370101402b05b21916c2071 @@ -762,6 +808,7 @@ class Skill23(ActiveSkill): 学习一定等级的[技巧精通]后,[摆动]中也可以发出攻击。\n """ name = "俯冲腹拳" + ref = Ref.DUCKINGBODYBLOW cellPos = (8,5) learnLv = 20 masterLv = 60 @@ -795,6 +842,7 @@ class Skill24(ActiveSkill): 只能在已施放[意念驱动]的状态下使用。\n """ name = "圣拳锤击" + ref = Ref.DIVINECRUSH cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -828,6 +876,7 @@ class Skill25(ActiveSkill): [升天阵]可以把浮空的敌人聚集到阵的中心。\n """ name = "升天阵" + ref = Ref.RISINGAREA learnLv = 20 masterLv = 60 maxLv = 70 @@ -859,6 +908,7 @@ class Skill26(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -883,6 +933,7 @@ class Skill27(ActiveSkill): 技能等级越高,敌人被摆拳击中后的僵直时间越长,但只能在[意念驱动]已施放状态下使用。\n """ name = "圣拳连击" + ref = Ref.GORGEOUSCOMBINATION cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -920,6 +971,7 @@ class Skill28(PassiveSkill): 使用[急速闪避]、 [俯冲]、 [摆动]成功回避敌人的攻击时,增加自身的暴击率和命中率。\n """ name = "急速闪避" + ref = Ref.QUICKPARRY cellPos = (9,6) learnLv = 25 masterLv = 5 @@ -989,6 +1041,7 @@ class Skill29(ActiveSkill): 只能在已施放[意念驱动]的状态下使用。\n """ name = "瞬拳" + ref = Ref.SIDEWIND cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -1024,6 +1077,7 @@ class Skill30(ActiveSkill): 攻击力为自身掌握的[俯冲腹拳]与[神圣反击]原攻击力的总和。 被敌人攻击时,自身伤害会有所减少,且给予不死族、 恶魔、 精灵系列怪物125%的反击伤害。\n """ name = "神圣反击" + ref = Ref.HOLYCOUNTER cellPos = (2,7) learnLv = 30 masterLv = 1 @@ -1053,7 +1107,7 @@ class Skill30(ActiveSkill): self.power2 *= self.preRatio def skillInfo(self, mode = None): - pre = self.char.GetSkillByName("俯冲腹拳") + pre = self.char.GetSkill(Ref.DUCKINGBODYBLOW) data = pre.skillInfo()[0] self.data2 = [0]+[data]*self.maxLv self.hit2 = 1 @@ -1068,6 +1122,7 @@ class Skill31(ActiveSkill): 学习一定等级的[技巧精通]后,[俯冲]中也可以发出攻击。\n """ name = "破碎之锤" + ref = Ref.CHOPPINGHAMMER cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -1110,6 +1165,7 @@ class Skill32(ActiveSkill): 使用该技能时,无法强制中断当前进行的普通攻击动作。\n """ name = "幻影化身" + ref = Ref.SHADOWBOXER cellPos = (7,8) learnLv = 35 masterLv = 10 @@ -1138,6 +1194,7 @@ class Skill33(ActiveSkill): 只能在[意念驱动]已施放的状态下使用。\n """ name = "刺拳猛击" + ref = Ref.MACHINEGUNJAB cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -1194,6 +1251,7 @@ class Skill34(ActiveSkill): 在决斗场中不发动霸体护甲,减少吸附敌人的力量和范围。\n """ name = "旋涡重拳" + ref = Ref.CORKSCREWBLOW cellPos = (2,8) learnLv = 35 masterLv = 60 @@ -1257,6 +1315,7 @@ class Skill35(ActiveSkill): 只能在已施放[意念驱动]的状态下使用。\n """ name = "神圣组合拳" + ref = Ref.HEAVENLYCOMBINATION cellPos = (6,9) learnLv = 40 masterLv = 60 @@ -1315,6 +1374,7 @@ class Skill36(ActiveSkill): 决斗场中无法使用[干涸之泉]强制中断,且按跳跃键无法立即发动最后一击。\n """ name = "极速飓风拳" + ref = Ref.HURRICANEROLL cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1374,6 +1434,7 @@ class Skill37(PassiveSkill): 增加[幻影化身]的分身数量,但分身的攻击力将会低于该技能原有分身的攻击力。\n """ name = "双重幻影" + ref = Ref.DOUBLESHADOWBOXER cellPos = (7,10) learnLv = 45 masterLv = 1 @@ -1398,6 +1459,7 @@ class Skill38(PassiveSkill): 学习此技能后,对敌人的攻击力增加,且可强制中断当前技能并施放神击系技能。\n """ name = "干涸之泉" + ref = Ref.DRYOUT cellPos = (5,11) learnLv = 48 masterLv = 40 @@ -1413,7 +1475,11 @@ class Skill38(PassiveSkill): # 攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 泯灭神击 # priest_male/infighter/dbf8b30c7057032af0d68fcfa289fdae @@ -1424,6 +1490,7 @@ class Skill39(ActiveSkill): 只能在[意念驱动]已施放的状态下使用。\n """ name = "泯灭神击" + ref = Ref.BIGBANGPUNCH cellPos = (2,11) learnLv = 50 masterLv = 40 @@ -1465,6 +1532,7 @@ class Skill40(ActiveSkill): 只能在[意念驱动]已施放状态下使用。\n """ name = "破碎之拳" + ref = Ref.GATLINGPUNCH cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1516,10 +1584,14 @@ class Skill40(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{"data":[0]+[-28.5]*self.maxLv,"skills":["刺拳猛击"]}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{"data":[0]+[-28.5]*self.maxLv,"skills":["刺拳猛击"]}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0] + [-28.5] * maxLv)), skills=[Ref.MACHINEGUNJAB], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 破坏之拳 # priest_male/infighter/0fbb8de70002ad34f046c94c2cb3e863 @@ -1531,6 +1603,7 @@ class Skill41(ActiveSkill): 只能在[意念驱动]已施放状态下使用。\n """ name = "破坏之拳" + ref = Ref.DEMOLITIONPUNCH cellPos = (8,13) learnLv = 70 masterLv = 40 @@ -1584,6 +1657,7 @@ class Skill42(ActiveSkill): 仅能在[意念驱动]已施放状态下使用。\n """ name = "仲裁怒击" + ref = Ref.NUCLEARPUNCH cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1641,6 +1715,7 @@ class Skill43(PassiveSkill): 为了实现正义,将身体锻炼到极致,可以增加命中率、 基本攻击力和技能攻击力。\n """ name = "正义惩戒" + ref = Ref.DEATHBLOW cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1657,7 +1732,11 @@ class Skill43(PassiveSkill): # 命中率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 超重拳 # priest_male/infighter/d204ec03a0aed2f20211fb6ccc48d46d @@ -1669,6 +1748,7 @@ class Skill44(ActiveSkill): 只有在施放[意念驱动]的状态下才能使用。\n """ name = "超重拳" + ref = Ref.ATOMICCHOPPER cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1731,6 +1811,7 @@ class Skill45(ActiveSkill): 只能在已施放[意念驱动]的状态下使用。\n """ name = "制裁 : 怒火疾风" + ref = Ref.WRATHOFGOD cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -1772,6 +1853,7 @@ class Skill46(PassiveSkill): - 删除攻击敌人时产生的冲击波,即使未攻击敌人,捶地时也会插入巨兵,发生神圣力爆炸\n """ name = "绝对正义" + ref = Ref.JUSTICEOFONE cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1785,7 +1867,11 @@ class Skill46(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 正义铁拳 # priest_male/infighter/87a918bb22cfc959a16e0bf939bb6c24 @@ -1797,6 +1883,7 @@ class Skill47(ActiveSkill): 只能在[意念驱动]已施放状态下使用。\n """ name = "正义铁拳" + ref = Ref.AGGRESSIVEJUDGEMENT cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1838,6 +1925,7 @@ class Skill48(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "正义执行 : 雷米迪奥斯的圣座" + ref = Ref.CONSTELLATIONOFLEMIEDIOS cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/swordman_female/dark_templar.py b/backend/core/character/GF/swordman_female/dark_templar.py index 4923cea6..7f3f15bb 100644 --- a/backend/core/character/GF/swordman_female/dark_templar.py +++ b/backend/core/character/GF/swordman_female/dark_templar.py @@ -1,6 +1,14 @@ # 1645c45aabb008c98406b3a16447040d from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + LevelTable, + MissingTargetPolicy, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.swordman_female.dark_templar import DarkTemplarSkillRef as Ref prefix = "swordman_female/dark_templar/cn/skillDetail" @@ -14,6 +22,7 @@ class Skill0(ActiveSkill): """ name = '暗黑斩' + ref = Ref.DARKSLASH cellPos = (3,1) learnLv = 1 masterLv = 60 @@ -40,6 +49,7 @@ class Skill1(ActiveSkill): 攻击时有霸体判定。 转职为刃影时,技能类型变为独立攻击力。\n """ name = "浮空击" + ref = Ref.LIFTSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -67,6 +77,7 @@ class Skill2(PassiveSkill): """ name = '冥思' + ref = Ref.COLDHEART cellPos = (5,1) learnLv = 1 masterLv = 1 @@ -95,6 +106,7 @@ class Skill3(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -119,6 +131,7 @@ class Skill4(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -138,7 +151,11 @@ class Skill4(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['影刃']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['影刃']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=['影刃'], missing_target=MissingTargetPolicy.SKIP), + ] # 受身蹲伏 # swordman_female/dark_templar/ce26c6b69d02a440a81b552bec94f03b @@ -148,6 +165,7 @@ class Skill5(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -189,6 +207,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -211,6 +230,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -234,6 +254,7 @@ class Skill8(ActiveSkill): """ name = '波动斩' + ref = Ref.SIRYUN cellPos = (4,2) learnLv = 5 masterLv = 60 @@ -262,6 +283,7 @@ class Skill9(ActiveSkill): 吸收来自前方的攻击伤害,[招架]状态下被攻击,会被击退一定距离,并持续一定时间。\n """ name = "招架" + ref = Ref.GUARD learnLv = 5 masterLv = 5 maxLv = 15 @@ -293,6 +315,7 @@ class Skill10(ActiveSkill): 在决斗场中,需要跳跃到一定高度时才可以施放该技能。\n """ name = "跃空斩" + ref = Ref.MOUNTAINCRASH learnLv = 5 masterLv = 60 maxLv = 70 @@ -324,6 +347,7 @@ class Skill11(ActiveSkill): 再次按技能键,可连接下劈追加攻击。\n """ name = "十字剑" + ref = Ref.GORECROSS learnLv = 5 masterLv = 60 maxLv = 70 @@ -357,6 +381,7 @@ class Skill12(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力。\n """ name = "回旋反击" + ref = Ref.SPINSLASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -389,6 +414,7 @@ class Skill13(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力; 攻击形态变为刃影专属的3次连续攻击。\n """ name = "疾风斩" + ref = Ref.SNAKESHADOW learnLv = 10 masterLv = 60 maxLv = 70 @@ -421,6 +447,7 @@ class Skill14(ActiveSkill): 若抓住敌人,则会向目标施放强力刺击。\n """ name = "索敌刺" + ref = Ref.EXECUTION learnLv = 10 masterLv = 60 maxLv = 70 @@ -448,6 +475,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -475,6 +503,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -502,6 +531,7 @@ class Skill17(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力。\n """ name = "连环斩" + ref = Ref.CHAINSLASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -530,6 +560,7 @@ class Skill18(PassiveSkill): 可以强制中断部分技能之间的施放后僵直。\n """ name = "暗影剑术" + ref = Ref.SPATANOCTIS learnLv = 15 masterLv = 1 maxLv = 1 @@ -559,6 +590,7 @@ class Skill19(ActiveSkill): 将黑暗具象化为剑的形态,向前方刺击。\n """ name = "暗影穿刺" + ref = Ref.SHADOWSTABBING learnLv = 15 masterLv = 60 maxLv = 70 @@ -586,6 +618,7 @@ class Skill20(PassiveSkill): 如果暗殿骑士所在区域存在被赋予烙印的目标,则暗殿骑士的移动速度增加,并且部分技能忽略追踪范围直接命中。\n """ name = "黑暗烙印" + ref = Ref.STIGMA learnLv = 15 masterLv = 1 maxLv = 11 @@ -604,7 +637,11 @@ class Skill20(PassiveSkill): # 转职技能攻击力增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{"data":data2}] + # 迁移前实现(保留对照): + # associate = [{"data":data2}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # - [赋予烙印技能] - # [暗影穿刺] # [暗影劫戮] @@ -633,6 +670,7 @@ class Skill21(ActiveSkill): """ name = '暗影遁行' + ref = Ref.SHADOWHIDING cellPos = (4,5) learnLv = 20 masterLv = 1 @@ -659,6 +697,7 @@ class Skill22(ActiveSkill): 延展自己的影子束缚触碰到的目标,然后从敌人的背后出场,造成伤害。\n """ name = "暗影劫戮" + ref = Ref.SHADOWSNATCHER learnLv = 20 masterLv = 60 maxLv = 70 @@ -690,6 +729,7 @@ class Skill23(ActiveSkill): """ name = '暗影漩涡' + ref = Ref.SHADOWHARVEST cellPos = (8,5) learnLv = 20 masterLv = 60 @@ -722,6 +762,7 @@ class Skill24(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -747,6 +788,7 @@ class Skill25(ActiveSkill): 伴随禁制之咒语,乌希尔骑士团索敌时,从敌人背后出场并造成伤害。\n """ name = "令行禁止" + ref = Ref.RESTRAINT learnLv = 25 masterLv = 60 maxLv = 70 @@ -781,6 +823,7 @@ class Skill26(PassiveSkill): 暗殿骑士的转职技能攻击力增加,攻击时赋予暗属性,并将暗属性强化值调整为与最高属性相同值。\n """ name = "行动纲领" + ref = Ref.GUIDANCE learnLv = 25 masterLv = 10 maxLv = 30 @@ -794,7 +837,11 @@ class Skill26(PassiveSkill): # 转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 暗影禁锢 # swordman_female/dark_templar/51a08fd0c90f0a5276cd552047fac93d @@ -806,6 +853,7 @@ class Skill27(ActiveSkill): """ name = '暗影禁锢' + ref = Ref.SCAFFOLD cellPos = (0,6) learnLv = 25 masterLv = 60 @@ -848,6 +896,7 @@ class Skill28(ActiveSkill): 对于未赋予烙印的敌人,索敌范围增加。\n """ name = "黑暗追袭" + ref = Ref.DARKTRACER learnLv = 30 masterLv = 60 maxLv = 70 @@ -884,6 +933,7 @@ class Skill29(ActiveSkill): 乌希尔骑士团在裁决女神背后出现并辅佐斩击,增加攻击范围和攻击次数。\n """ name = "暗影横扫" + ref = Ref.SHADOWSWEEP learnLv = 30 masterLv = 60 maxLv = 70 @@ -914,6 +964,7 @@ class Skill30(ActiveSkill): 召唤的暗影球跟随暗殿骑士的手势,吸附周围的敌人,随后爆炸并造成伤害。\n """ name = "黑暗凝爆" + ref = Ref.DARKCOHESION learnLv = 35 masterLv = 60 maxLv = 70 @@ -969,6 +1020,7 @@ class Skill31(ActiveSkill): """ name = '魔镜幻影阵' + ref = Ref.BLACKMIRROR cellPos = (0,8) learnLv = 35 masterLv = 60 @@ -1027,6 +1079,7 @@ class Skill32(ActiveSkill): """ name = '暗影蓄能' + ref = Ref.CONGEST cellPos = (9,8) learnLv = 35 masterLv = 1 @@ -1052,6 +1105,7 @@ class Skill33(ActiveSkill): 将黑暗之力汇聚到剑上,向前方斩击,攻击成功时潜入对方的影子造成额外伤害后再次出现。\n """ name = "黑暗纷影斩" + ref = Ref.DARKSPLIT learnLv = 40 masterLv = 60 maxLv = 70 @@ -1111,6 +1165,7 @@ class Skill34(ActiveSkill): 被上斩攻击命中的敌人进入短暂的强控状态。\n """ name = "黑暗极刑" + ref = Ref.DARKCRUEL learnLv = 45 masterLv = 60 maxLv = 70 @@ -1166,6 +1221,7 @@ class Skill35(PassiveSkill): 暗帝的魔法暴击率和暴击伤害增加,[黑暗烙印]技能的移动速度增加率增加。\n """ name = "乌希尔启示" + ref = Ref.HERALDOFDARKNESS learnLv = 48 masterLv = 40 maxLv = 50 @@ -1184,7 +1240,11 @@ class Skill35(PassiveSkill): # [黑暗烙印]移动速度额外增加率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{"data":data1}] + # 迁移前实现(保留对照): + # associate = [{"data":data1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 末日狂战 # swordman_female/dark_templar/b3659936a9a74c4ed6f7faf07cca1f9e @@ -1195,6 +1255,7 @@ class Skill36(ActiveSkill): """ name = '末日狂战' + ref = Ref.DOOMSDAY cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1234,6 +1295,7 @@ class Skill37(ActiveSkill): 搜索前方最近的敌人,从空中召唤剑后落下。\n """ name = "无瑕归冥" + ref = Ref.IMMACULATEDEATH learnLv = 60 masterLv = 40 maxLv = 50 @@ -1290,6 +1352,7 @@ class Skill38(ActiveSkill): """ name = '黑暗献祭' + ref = Ref.IMMOLATION cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1348,6 +1411,7 @@ class Skill39(ActiveSkill): """ name = '罚罪之光' + ref = Ref.DEUSEXRAY cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1399,6 +1463,7 @@ class Skill40(PassiveSkill): """ name = '薄暮' + ref = Ref.VESPERS cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1414,7 +1479,11 @@ class Skill40(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # - [乌希尔骑士团辅佐技能] - # [令行禁止] # [暗影横扫] @@ -1429,6 +1498,7 @@ class Skill41(ActiveSkill): """ name = '天罚之剑' + ref = Ref.JIHAD cellPos = (6,14) learnLv = 80 masterLv = 40 @@ -1481,6 +1551,7 @@ class Skill42(ActiveSkill): """ name = '神罚 · 灭世裁决' + ref = Ref.PUNISHMENT cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1524,6 +1595,7 @@ class Skill43(ActiveSkill): 乌希尔的化身将自己的力量汇聚到剑上后挥剑。\n """ name = "灭罪 · 慈悲执刑" + ref = Ref.APOSTATAE learnLv = 95 masterLv = 40 maxLv = 50 @@ -1557,6 +1629,7 @@ class Skill44(PassiveSkill): """ name = '以身载灵' + ref = Ref.INCARNATION cellPos = (3,15) learnLv = 95 masterLv = 40 @@ -1577,7 +1650,11 @@ class Skill44(PassiveSkill): # [魅影暗魂斩]幻影的剑气攻击力 : 剑气攻击力的{value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 审判日 : 净土救赎 # swordman_female/dark_templar/0e3da11226dd30c2aaef52e36eff7f3f @@ -1590,6 +1667,7 @@ class Skill45(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "审判日 : 净土救赎" + ref = Ref.DIESIRAE learnLv = 100 masterLv = 40 maxLv = 50 diff --git a/backend/core/character/GF/swordman_female/demon_slayer.py b/backend/core/character/GF/swordman_female/demon_slayer.py index 5ad6c1d6..990ea2f4 100644 --- a/backend/core/character/GF/swordman_female/demon_slayer.py +++ b/backend/core/character/GF/swordman_female/demon_slayer.py @@ -1,6 +1,18 @@ #1645c45aabb008c98406b3a16447040d from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + Equals, + Hit, + LevelTable, + Operation, + Percent, + Power, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.swordman_female.demon_slayer import DemonSlayerSkillRef as Ref prefix = "swordman_female/demon_slayer/cn/skillDetail" @@ -12,6 +24,7 @@ class Skill0(ActiveSkill): 将黑暗之力汇聚到剑上,发出两次斩击。\n """ name = "暗黑斩" + ref = Ref.DARKSLASH learnLv = 1 masterLv = 60 maxLv = 70 @@ -37,6 +50,7 @@ class Skill1(ActiveSkill): 攻击时有霸体判定。 转职为刃影时,技能类型变为独立攻击力。\n """ name = "浮空击" + ref = Ref.LIFTSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -63,6 +77,7 @@ class Skill2(PassiveSkill): 无论遇到任何情况,都能保持绝对的专注。 增加物理和魔法暴击率。\n """ name = "冥思" + ref = Ref.COLDHEART learnLv = 1 masterLv = 1 maxLv = 1 @@ -85,6 +100,7 @@ class Skill3(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -108,6 +124,7 @@ class Skill4(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -135,6 +152,7 @@ class Skill5(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -176,6 +194,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -198,6 +217,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -220,6 +240,7 @@ class Skill8(ActiveSkill): 向前方发射一定次数的剑气波动。\n """ name = "波动斩" + ref = Ref.SIRYUN learnLv = 5 masterLv = 60 maxLv = 70 @@ -247,6 +268,7 @@ class Skill9(ActiveSkill): 吸收来自前方的攻击伤害,[招架]状态下被攻击,会被击退一定距离,并持续一定时间。\n """ name = "招架" + ref = Ref.GUARD learnLv = 5 masterLv = 5 maxLv = 15 @@ -278,6 +300,7 @@ class Skill10(ActiveSkill): 在决斗场中,需要跳跃到一定高度时才可以施放该技能。\n """ name = "跃空斩" + ref = Ref.MOUNTAINCRASH learnLv = 5 masterLv = 60 maxLv = 70 @@ -309,6 +332,7 @@ class Skill11(ActiveSkill): 再次按技能键,可连接下劈追加攻击。\n """ name = "十字剑" + ref = Ref.GORECROSS learnLv = 5 masterLv = 60 maxLv = 70 @@ -342,6 +366,7 @@ class Skill12(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力。\n """ name = "回旋反击" + ref = Ref.SPINSLASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -374,6 +399,7 @@ class Skill13(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力; 攻击形态变为刃影专属的3次连续攻击。\n """ name = "疾风斩" + ref = Ref.SNAKESHADOW learnLv = 10 masterLv = 60 maxLv = 70 @@ -406,6 +432,7 @@ class Skill14(ActiveSkill): 若抓住敌人,则会向目标施放强力刺击。\n """ name = "索敌刺" + ref = Ref.EXECUTION learnLv = 10 masterLv = 60 maxLv = 70 @@ -433,6 +460,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -460,6 +488,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -487,6 +516,7 @@ class Skill17(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力。\n """ name = "连环斩" + ref = Ref.CHAINSLASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -515,6 +545,7 @@ class Skill18(PassiveSkill): 增加基本攻击力和转职系技能攻击力; 攻击时,使敌人进入出血异常状态。\n """ name = "唤魔 : 蛇腹剑" + ref = Ref.CALLDAIMUS cellPos = (6,4) learnLv = 15 masterLv = 1 @@ -540,8 +571,12 @@ class Skill18(PassiveSkill): # 出血持续时间 : {value5}秒 data5 = get_data(f'{prefix}/{uuid}', 5) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data2,"type":"*skillDamage"} + # ] associate = [ - {"data":data2,"type":"*skillDamage"} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), ] # 蛇腹剑 : 破 @@ -552,6 +587,7 @@ class Skill19(ActiveSkill): 将剑刺向地面后,剑刃破地而出。\n """ name = "蛇腹剑 : 破" + ref = Ref.WHIPSWORDBAL cellPos = (1,5) learnLv = 15 masterLv = 60 @@ -583,6 +619,7 @@ class Skill20(ActiveSkill): 增加攻击速度、 移动速度、 基本攻击力和技能攻击力。\n """ name = "唤魔 : 狂暴" + ref = Ref.FRENZY cellPos = (8,5) learnLv = 20 masterLv = 10 @@ -614,6 +651,7 @@ class Skill21(ActiveSkill): 第1、 2击可以击退敌人,第3击缠住敌人的腿,将其拉向契魔者并击倒。\n """ name = "蛇腹剑 : 舞" + ref = Ref.SNAKEDANCE cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -651,6 +689,7 @@ class Skill22(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -674,6 +713,7 @@ class Skill23(ActiveSkill): 对无法抓取的敌人不适用控制效果。\n """ name = "蛇腹剑 : 缠" + ref = Ref.CLAWBLADE cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -723,6 +763,7 @@ class Skill24(ActiveSkill): 向前挥剑后收回,命中时将敌人拉向契魔者。\n """ name = "蛇腹剑 : 刺" + ref = Ref.PIKESWORD cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -758,6 +799,7 @@ class Skill25(PassiveSkill): 增加物理、 魔法攻击力和物理暴击率。\n """ name = "魔剑控制" + ref = Ref.CONTROLDEMONSWORD cellPos = (8,7) learnLv = 30 masterLv = 20 @@ -774,8 +816,12 @@ class Skill25(PassiveSkill): # 物理暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0,"type":"*skillDamage"} + # ] associate = [ - {"data":data0,"type":"*skillDamage"} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), ] # 蛇腹剑 : 灭 @@ -788,6 +834,7 @@ class Skill26(ActiveSkill): 攻击中按跳跃键可以强制中断技能。\n """ name = "蛇腹剑 : 灭" + ref = Ref.WILDWHIP cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -820,6 +867,7 @@ class Skill27(ActiveSkill): 在决斗场中,减少攻击范围,吸附攻击中霸体不生效,挥剑攻击无法攻击倒地的敌人。\n """ name = "碎魔剑" + ref = Ref.SPLITDEMONSWORD cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -876,10 +924,14 @@ class Skill27(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 1: - self.associate = [{"type":"*skillRation","data":[0] + [-11]*self.maxLv,"skills":["蛇腹剑 : 破"]}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 1: + # self.associate = [{"type":"*skillRation","data":[0] + [-11]*self.maxLv,"skills":["蛇腹剑 : 破"]}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-11] * maxLv)), skills=[Ref.WHIPSWORDBAL], when=Equals(Read(SkillAttribute.VP), 1)), + ] # 魔刃狂舞 # swordman_female/demon_slayer/1fadde0eece18649caddbca7bd58cc2f @@ -890,6 +942,7 @@ class Skill28(ActiveSkill): 多段攻击中按跳跃键可以强制中断技能。\n """ name = "魔刃狂舞" + ref = Ref.BLOODDANCE cellPos = (2,8) learnLv = 35 masterLv = 60 @@ -957,6 +1010,7 @@ class Skill29(ActiveSkill): 幻影会使用[蛇腹剑 : 破]、 [蛇腹剑 : 舞]、 [蛇腹剑 : 刺]、 [蛇腹剑 : 灭]、 [魔刃狂舞]等技能。\n """ name = "群魔乱舞" + ref = Ref.GROUPDANCE cellPos = (2,9) learnLv = 40 masterLv = 60 @@ -1037,6 +1091,7 @@ class Skill30(ActiveSkill): 快速向前飞一段距离,在移动途中按技能键可以挥剑。\n """ name = "唤魔 : 塔莫斯之袭" + ref = Ref.DARKSTRIKE cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1097,6 +1152,7 @@ class Skill31(PassiveSkill): 该效果有重叠次数限制。\n """ name = "贪欲之燔祭" + ref = Ref.GREED cellPos = (7,11) learnLv = 48 masterLv = 40 @@ -1119,8 +1175,12 @@ class Skill31(PassiveSkill): # 效果叠加上限 : {value4}次 data4 = get_data(f'{prefix}/{uuid}', 4) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data2,"type":"*skillDamage"} + # ] associate = [ - {"data":data2,"type":"*skillDamage"} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), ] # 空绝斩 : 千刃 @@ -1132,6 +1192,7 @@ class Skill32(ActiveSkill): 完成变身后向前滑铲,进行强力的下斩攻击并引发爆炸。\n """ name = "空绝斩 : 千刃" + ref = Ref.GIGABLADE cellPos = (6,11) learnLv = 50 masterLv = 40 @@ -1175,6 +1236,7 @@ class Skill33(ActiveSkill): 塔莫斯每次攻击时,飞散的普诺碎片会对周围的敌人造成伤害,普诺最终被消灭时引发爆炸。\n """ name = "唤魔 : 逆天之普诺" + ref = Ref.PHNOM cellPos = (5,12) learnLv = 60 masterLv = 40 @@ -1239,6 +1301,7 @@ class Skill34(ActiveSkill): 召唤塔莫斯,塔莫斯和剑魔一起发动十字形斩击。\n """ name = "汲血魔剑" + ref = Ref.BLOODDEMONSWORD cellPos = (5,13) learnLv = 70 masterLv = 40 @@ -1295,6 +1358,7 @@ class Skill35(ActiveSkill): 方向键(向上) : 长距离\n """ name = "空绝斩 : 地裂" + ref = Ref.GIGASLASH cellPos = (9,13) learnLv = 75 masterLv = 40 @@ -1343,10 +1407,14 @@ class Skill35(ActiveSkill): self.skillRation *= 0.5 ... - def effect(self, old, new): - if self.vp == 1: - self.associate = [{"type":"*skillDamage","data":[0] + [-11]*self.maxLv,"skills":["蛇腹剑 : 舞"]}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 1: + # self.associate = [{"type":"*skillDamage","data":[0] + [-11]*self.maxLv,"skills":["蛇腹剑 : 舞"]}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0] + [-11] * maxLv)), skills=[Ref.SNAKEDANCE], when=Equals(Read(SkillAttribute.VP), 1)), + ] # 唤魔 : 弑神剑 # swordman_female/demon_slayer/d429147c372b549c3dadcabcba50787f @@ -1374,6 +1442,7 @@ class Skill36(PassiveSkill): 增加塔莫斯的攻击次数和最终一击的攻击力,减少多段攻击间隔。\n """ name = "唤魔 : 弑神剑" + ref = Ref.DEVILSWORDTECH cellPos = (7,13) learnLv = 75 masterLv = 40 @@ -1399,14 +1468,24 @@ class Skill36(PassiveSkill): # 塔莫斯最终一击攻击力增加率 : {value5}% data5 = get_data(f'{prefix}/{uuid}', 5) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0,"type":"*skillDamage","exceptSkills":["魔刃狂舞","蛇腹剑 : 缠","唤魔 : 塔莫斯之袭"]}, + # {"data":data1,"type":"+power8","skills":["蛇腹剑 : 缠"]}, + # {"data":data1,"type":"+power9","skills":["蛇腹剑 : 缠"]}, + # {"data":data3,"type":"+power4","skills":["魔刃狂舞"]}, + # {"data":data3,"type":"+power5","skills":["魔刃狂舞"]}, + # {"data":data4,"type":"+hit1","skills":["唤魔 : 塔莫斯之袭"],"ratio": 1}, + # {"data":data5,"type":"*power3","skills":["唤魔 : 塔莫斯之袭"]} + # ] associate = [ - {"data":data0,"type":"*skillDamage","exceptSkills":["魔刃狂舞","蛇腹剑 : 缠","唤魔 : 塔莫斯之袭"]}, - {"data":data1,"type":"+power8","skills":["蛇腹剑 : 缠"]}, - {"data":data1,"type":"+power9","skills":["蛇腹剑 : 缠"]}, - {"data":data3,"type":"+power4","skills":["魔刃狂舞"]}, - {"data":data3,"type":"+power5","skills":["魔刃狂舞"]}, - {"data":data4,"type":"+hit1","skills":["唤魔 : 塔莫斯之袭"],"ratio": 1}, - {"data":data5,"type":"*power3","skills":["唤魔 : 塔莫斯之袭"]} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), except_skills=[Ref.BLOODDANCE, Ref.CLAWBLADE, Ref.DARKSTRIKE]), + SkillEffect(attribute=Power(8), operation=Operation.ADD, value=Percent(LevelTable(data1)), skills=[Ref.CLAWBLADE]), + SkillEffect(attribute=Power(9), operation=Operation.ADD, value=Percent(LevelTable(data1)), skills=[Ref.CLAWBLADE]), + SkillEffect(attribute=Power(4), operation=Operation.ADD, value=Percent(LevelTable(data3)), skills=[Ref.BLOODDANCE]), + SkillEffect(attribute=Power(5), operation=Operation.ADD, value=Percent(LevelTable(data3)), skills=[Ref.BLOODDANCE]), + SkillEffect(attribute=Hit(1), operation=Operation.ADD, value=LevelTable(data4), skills=[Ref.DARKSTRIKE]), + SkillEffect(attribute=Power(3), value=1 + Percent(LevelTable(data5)), skills=[Ref.DARKSTRIKE]), ] # 弑神剑 : 极 @@ -1418,6 +1497,7 @@ class Skill37(ActiveSkill): 对无法抓取的敌人不适用控制效果。\n """ name = "弑神剑 : 极" + ref = Ref.ULTIMATEBLADE cellPos = (7,14) learnLv = 80 masterLv = 40 @@ -1480,6 +1560,7 @@ class Skill38(ActiveSkill): 跃向空中,与塔莫斯合体。 利用合体后的强大力量,将普诺变形为最佳攻击形态向地面进行乱舞攻击,之后再将普诺变形为巨剑形态刺向地面引发冲击波并使敌人进入僵直状态,最后使用巨大的剑刃进行最终一击。\n """ name = "弑神剑 : 诸神献祭" + ref = Ref.RAGNAROK cellPos = (9,14) learnLv = 85 masterLv = 40 @@ -1519,6 +1600,7 @@ class Skill39(ActiveSkill): 将与塔莫斯合体的蛇腹剑插入地面,击穿前方的敌人。\n """ name = "蛇舞血轮剑" + ref = Ref.BLOODOCTOPUSSWORD cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1555,6 +1637,7 @@ class Skill40(PassiveSkill): 抓取并鞭笞敌人后,额外进行下劈攻击。\n """ name = "魔源觉醒" + ref = Ref.QUEENOFMINE cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1571,10 +1654,16 @@ class Skill40(PassiveSkill): # [蛇腹剑 : 缠]下劈攻击力 : 总攻击力的{value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0,"type":"*skillDamage","exceptSkills":["蛇腹剑 : 缠"]}, + # {"data":data1,"type":"+power8","skills":["蛇腹剑 : 缠"]}, + # {"data":data1,"type":"+power9","skills":["蛇腹剑 : 缠"]}, + # ] associate = [ - {"data":data0,"type":"*skillDamage","exceptSkills":["蛇腹剑 : 缠"]}, - {"data":data1,"type":"+power8","skills":["蛇腹剑 : 缠"]}, - {"data":data1,"type":"+power9","skills":["蛇腹剑 : 缠"]}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), except_skills=[Ref.CLAWBLADE]), + SkillEffect(attribute=Power(8), operation=Operation.ADD, value=Percent(LevelTable(data1)), skills=[Ref.CLAWBLADE]), + SkillEffect(attribute=Power(9), operation=Operation.ADD, value=Percent(LevelTable(data1)), skills=[Ref.CLAWBLADE]), ] # 弑神剑 : 恶魔孤岛 @@ -1589,6 +1678,7 @@ class Skill41(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "弑神剑 : 恶魔孤岛" + ref = Ref.ALCATRAZ cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/swordman_female/spectre.py b/backend/core/character/GF/swordman_female/spectre.py index c5fb78e6..0df230a9 100644 --- a/backend/core/character/GF/swordman_female/spectre.py +++ b/backend/core/character/GF/swordman_female/spectre.py @@ -1,6 +1,17 @@ # 1645c45aabb008c98406b3a16447040d from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Equals, + LevelTable, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.swordman_female.spectre import SpectreSkillRef as Ref prefix = "swordman_female/spectre/cn/skillDetail" @@ -14,6 +25,7 @@ class Skill0(ActiveSkill): 攻击时有霸体判定。 转职为刃影时,技能类型变为独立攻击力。\n """ name = "浮空击" + ref = Ref.LIFTSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -41,6 +53,7 @@ class Skill1(PassiveSkill): """ name = '冥思' + ref = Ref.COLDHEART cellPos = (8,1) learnLv = 1 masterLv = 1 @@ -63,6 +76,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -87,6 +101,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -106,7 +121,11 @@ class Skill3(PassiveSkill): # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['鬼缚钉']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['鬼缚钉']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.RUSTYNAIL]), + ] # 受身蹲伏 # swordman_female/spectre/ce26c6b69d02a440a81b552bec94f03b @@ -116,6 +135,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -147,6 +167,7 @@ class Skill5(PassiveSkill): """ name = '刃之心' + ref = Ref.PROFESSIONAL cellPos = (6,1) learnLv = 1 masterLv = 1 @@ -168,6 +189,7 @@ class Skill6(ActiveSkill): """ name = '双重斩' + ref = Ref.DOUBLESHOT cellPos = (2,1) learnLv = 1 masterLv = 60 @@ -194,6 +216,7 @@ class Skill7(PassiveSkill): 学习后,隐藏黑曜、 白牙、 金刚的外形,仅在必要时显现。\n """ name = "敛锋" + ref = Ref.MUDDLE learnLv = 1 masterLv = 1 maxLv = 1 @@ -227,6 +250,7 @@ class Skill8(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -249,6 +273,7 @@ class Skill9(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -271,6 +296,7 @@ class Skill10(ActiveSkill): 吸收来自前方的攻击伤害,[招架]状态下被攻击,会被击退一定距离,并持续一定时间。\n """ name = "招架" + ref = Ref.GUARD learnLv = 5 masterLv = 5 maxLv = 15 @@ -302,6 +328,7 @@ class Skill11(ActiveSkill): 在决斗场中,需要跳跃到一定高度时才可以施放该技能。\n """ name = "跃空斩" + ref = Ref.MOUNTAINCRASH learnLv = 5 masterLv = 60 maxLv = 70 @@ -336,6 +363,7 @@ class Skill12(ActiveSkill): """ name = '鬼缚钉' + ref = Ref.RUSTYNAIL cellPos = (4,2) learnLv = 5 masterLv = 1 @@ -378,6 +406,7 @@ class Skill13(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力。\n """ name = "回旋反击" + ref = Ref.SPINSLASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -410,6 +439,7 @@ class Skill14(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力; 攻击形态变为刃影专属的3次连续攻击。\n """ name = "疾风斩" + ref = Ref.SNAKESHADOW learnLv = 10 masterLv = 60 maxLv = 70 @@ -446,6 +476,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -473,6 +504,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -501,6 +533,7 @@ class Skill17(ActiveSkill): 在决斗场中,攻击结束后,无法强制中断。\n """ name = "冲击斩" + ref = Ref.SLICEIMPACT learnLv = 10 masterLv = 60 maxLv = 70 @@ -530,6 +563,7 @@ class Skill18(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力。\n """ name = "连环斩" + ref = Ref.CHAINSLASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -557,6 +591,7 @@ class Skill19(ActiveSkill): """ name = '回旋勾斩' + ref = Ref.DANGEROUSHOOK cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -588,6 +623,7 @@ class Skill20(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -612,6 +648,7 @@ class Skill21(PassiveSkill): """ name = '孤勇之志' + ref = Ref.OLDFASHIONED cellPos = (6,5) learnLv = 20 masterLv = 10 @@ -628,8 +665,12 @@ class Skill21(PassiveSkill): # 装备太刀时命中率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkI', 'data': data0}, + # ] associate = [ - {'type': '$*PAtkI', 'data': data0}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_I, value=1 + Percent(LevelTable(data0))), ] # 封喉丝 @@ -646,6 +687,7 @@ class Skill22(ActiveSkill): """ name = '封喉丝' + ref = Ref.BLACKOUT cellPos = (2,5) learnLv = 20 masterLv = 60 @@ -687,6 +729,7 @@ class Skill23(ActiveSkill): """ name = '利刃旋风' + ref = Ref.BLENDINGPAIN cellPos = (1,6) learnLv = 25 masterLv = 60 @@ -725,6 +768,7 @@ class Skill24(ActiveSkill): """ name = '追踪术' + ref = Ref.TRACE cellPos = (6,6) learnLv = 25 masterLv = 10 @@ -759,6 +803,7 @@ class Skill25(ActiveSkill): """ name = '白牙落斩' + ref = Ref.HANGOVER cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -792,6 +837,7 @@ class Skill26(ActiveSkill): """ name = '疾刃之影' + ref = Ref.SHATTEREDGLASS cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -823,6 +869,7 @@ class Skill27(ActiveSkill): """ name = '薄暮利刃' + ref = Ref.DEEPDUSK cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -855,6 +902,7 @@ class Skill28(PassiveSkill): """ name = '刃之决意' + ref = Ref.VINTAGE cellPos = (6,8) learnLv = 35 masterLv = 10 @@ -870,8 +918,12 @@ class Skill28(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), ] # 黑夜之花 @@ -884,6 +936,7 @@ class Skill29(ActiveSkill): """ name = '黑夜之花' + ref = Ref.WILDFLOWER cellPos = (1,8) learnLv = 35 masterLv = 60 @@ -946,6 +999,7 @@ class Skill30(ActiveSkill): """ name = '回旋十字刃' + ref = Ref.SHAKERBLAST cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -1015,6 +1069,7 @@ class Skill31(ActiveSkill): """ name = '夜之风' + ref = Ref.NIGHTFALL cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -1075,6 +1130,7 @@ class Skill32(ActiveSkill): """ name = '秘术·心斩' + ref = Ref.LASTORDER cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1133,6 +1189,7 @@ class Skill33(PassiveSkill): """ name = '收刀秘术' + ref = Ref.LICENSE cellPos = (2,11) learnLv = 48 masterLv = 40 @@ -1149,8 +1206,12 @@ class Skill33(PassiveSkill): # 装备太刀时攻击速度增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), ] # 沉寂之狱 @@ -1163,6 +1224,7 @@ class Skill34(ActiveSkill): """ name = '沉寂之狱' + ref = Ref.SHOWDOWN cellPos = (3,11) learnLv = 50 masterLv = 40 @@ -1198,6 +1260,7 @@ class Skill35(ActiveSkill): """ name = '瞬影碎魂击' + ref = Ref.OVERPACE cellPos = (3,12) learnLv = 60 masterLv = 40 @@ -1265,6 +1328,7 @@ class Skill36(ActiveSkill): """ name = '追袭逐影丝' + ref = Ref.BULLSEYE cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1313,10 +1377,14 @@ class Skill36(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 1: - self.associate = [{'type': '*skillDamage', 'data': [0] + [-12.3] * self.maxLv, 'skills': ['鬼缚钉']}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 1: + # self.associate = [{'type': '*skillDamage', 'data': [0] + [-12.3] * self.maxLv, 'skills': ['鬼缚钉']}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0] + [-12.3] * maxLv)), skills=[Ref.RUSTYNAIL], when=Equals(Read(SkillAttribute.VP), 1)), + ] # 无情夜行 # swordman_female/spectre/863295a0fc634cf5fcc01e82a735fd6b @@ -1328,6 +1396,7 @@ class Skill37(PassiveSkill): """ name = '无情夜行' + ref = Ref.INFAMOUS cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1344,9 +1413,14 @@ class Skill37(PassiveSkill): # 技能冷却时间减少率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0}, + # {'type': '*cdReduce', 'data': data1, 'exceptSkills': ['沉寂之狱', '黑曜真刃·破晓', '秘术·雨夜终曲']}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0}, - {'type': '*cdReduce', 'data': data1, 'exceptSkills': ['沉寂之狱', '黑曜真刃·破晓', '秘术·雨夜终曲']}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data1)), except_skills=[Ref.SHOWDOWN, Ref.DAYBREAK, Ref.TESTAMENT]), ] # 秘术·曜夜斩 @@ -1360,6 +1434,7 @@ class Skill38(ActiveSkill): """ name = '秘术·曜夜斩' + ref = Ref.STRAIGHTSHOT cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1419,6 +1494,7 @@ class Skill39(ActiveSkill): """ name = '悬丝风暴' + ref = Ref.CATHARSIS cellPos = (4,14) learnLv = 80 masterLv = 40 @@ -1490,6 +1566,7 @@ class Skill40(ActiveSkill): """ name = '黑曜真刃·破晓' + ref = Ref.DAYBREAK cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1527,6 +1604,7 @@ class Skill41(PassiveSkill): """ name = '夜色敌意' + ref = Ref.DAREDEVIL cellPos = (4,15) learnLv = 95 masterLv = 40 @@ -1543,8 +1621,12 @@ class Skill41(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data1}, + # ] associate = [ - {'type': '*skillDamage', 'data': data1}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), ] # 绚烂之舞 @@ -1558,6 +1640,7 @@ class Skill42(ActiveSkill): """ name = '绚烂之舞' + ref = Ref.FULLBODY cellPos = (6,15) learnLv = 95 masterLv = 40 @@ -1602,6 +1685,7 @@ class Skill43(ActiveSkill): """ name = '秘术·雨夜终曲' + ref = Ref.TESTAMENT cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/swordman_female/sword_master.py b/backend/core/character/GF/swordman_female/sword_master.py index 3dc67966..f5db0f08 100644 --- a/backend/core/character/GF/swordman_female/sword_master.py +++ b/backend/core/character/GF/swordman_female/sword_master.py @@ -1,6 +1,27 @@ # 1645c45aabb008c98406b3a16447040d from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + ExtraData, + Hit, + LevelTable, + Operation, + Percent, + Power, + ProfessionAttribute, + SkillAttribute, + SkillEffect, +) +from core.character.refs.swordman_female.sword_master import SwordMasterSkillRef as Ref + + +class SwordMasterAttribute(ProfessionAttribute): + """本职业专用的最终效果属性;字段含义与技能实现保持一致。""" + SUB_POWER = 'power_sub' + """驭剑士:魔剑奥义附加分段倍率。""" + prefix = "swordman_female/sword_master/cn/skillDetail" @@ -13,6 +34,7 @@ class Skill0(ActiveSkill): 将黑暗之力汇聚到剑上,发出两次斩击。\n """ name = "暗黑斩" + ref = Ref.DARKSLASH learnLv = 1 masterLv = 60 maxLv = 70 @@ -38,6 +60,7 @@ class Skill1(ActiveSkill): 攻击时有霸体判定。 转职为刃影时,技能类型变为独立攻击力。\n """ name = "浮空击" + ref = Ref.LIFTSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -65,6 +88,7 @@ class Skill2(PassiveSkill): """ name = '冥思' + ref = Ref.COLDHEART cellPos = (5,1) learnLv = 1 masterLv = 1 @@ -96,6 +120,7 @@ class Skill3(ActiveSkill): """ name = '帝国剑术' + ref = Ref.WEAPONCOMBO cellPos = (4,1) learnLv = 1 masterLv = 1 @@ -141,6 +166,7 @@ class Skill4(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -165,6 +191,7 @@ class Skill5(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -182,7 +209,11 @@ class Skill5(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['帝国剑术']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['帝国剑术']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.WEAPONCOMBO]), + ] # 受身蹲伏 # swordman_female/sword_master/ce26c6b69d02a440a81b552bec94f03b @@ -192,6 +223,7 @@ class Skill6(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -233,6 +265,7 @@ class Skill7(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -255,6 +288,7 @@ class Skill8(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -277,6 +311,7 @@ class Skill9(ActiveSkill): 向前方发射一定次数的剑气波动。\n """ name = "波动斩" + ref = Ref.SIRYUN learnLv = 5 masterLv = 60 maxLv = 70 @@ -304,6 +339,7 @@ class Skill10(ActiveSkill): 吸收来自前方的攻击伤害,[招架]状态下被攻击,会被击退一定距离,并持续一定时间。\n """ name = "招架" + ref = Ref.GUARD learnLv = 5 masterLv = 5 maxLv = 15 @@ -335,6 +371,7 @@ class Skill11(ActiveSkill): 在决斗场中,需要跳跃到一定高度时才可以施放该技能。\n """ name = "跃空斩" + ref = Ref.MOUNTAINCRASH learnLv = 5 masterLv = 60 maxLv = 70 @@ -366,6 +403,7 @@ class Skill12(ActiveSkill): 再次按技能键,可连接下劈追加攻击。\n """ name = "十字剑" + ref = Ref.GORECROSS learnLv = 5 masterLv = 60 maxLv = 70 @@ -399,6 +437,7 @@ class Skill13(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力。\n """ name = "回旋反击" + ref = Ref.SPINSLASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -431,6 +470,7 @@ class Skill14(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力; 攻击形态变为刃影专属的3次连续攻击。\n """ name = "疾风斩" + ref = Ref.SNAKESHADOW learnLv = 10 masterLv = 60 maxLv = 70 @@ -463,6 +503,7 @@ class Skill15(ActiveSkill): 若抓住敌人,则会向目标施放强力刺击。\n """ name = "索敌刺" + ref = Ref.EXECUTION learnLv = 10 masterLv = 60 maxLv = 70 @@ -490,6 +531,7 @@ class Skill16(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -517,6 +559,7 @@ class Skill17(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -544,6 +587,7 @@ class Skill18(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力。\n """ name = "连环斩" + ref = Ref.CHAINSLASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -571,6 +615,7 @@ class Skill19(ActiveSkill): """ name = '招架反击' + ref = Ref.COUNTERSLASH cellPos = (8,4) learnLv = 15 masterLv = 60 @@ -606,6 +651,7 @@ class Skill20(PassiveSkill): """ name = '兵刃奥义' + ref = Ref.INNERBLADE cellPos = (0,4) learnLv = 15 masterLv = 20 @@ -617,7 +663,11 @@ class Skill20(PassiveSkill): hasUP = False custom = get_data(f'{prefix}/{uuid}', 'custom') # noqa: E501 - associate = [{'type': '+lv', 'data': [i + 1 if i > 0 else i for i in range(0, maxLv + 2)], 'ratio': 1, 'skills': ['波动之钝器精通', '血影之太刀精通', '毁灭之巨剑精通', '魔性之短剑精通']}] + # 迁移前实现(保留对照): + # associate = [{'type': '+lv', 'data': [i + 1 if i > 0 else i for i in range(0, maxLv + 2)], 'ratio': 1, 'skills': ['波动之钝器精通', '血影之太刀精通', '毁灭之巨剑精通', '魔性之短剑精通']}] + associate = [ + SkillEffect(attribute=SkillAttribute.LEVEL, operation=Operation.ADD, value=LevelTable([i + 1 if i > 0 else i for i in range(0, maxLv + 2)]), skills=[Ref.BLUNTMASTERY, Ref.BLADEMASTERY, Ref.HEAVYSWORDMASTERY, Ref.SHORTSWORDMASTERY]), + ] # 驭剑术 @@ -631,6 +681,7 @@ class Skill21(PassiveSkill): 增加可以强制中断的次数。\n """ name = '驭剑术' + ref = Ref.DRAWSWORD cellPos = (6,4) learnLv = 15 masterLv = 10 @@ -660,6 +711,7 @@ class Skill22(ActiveSkill): """ name = '魔剑降临' + ref = Ref.CHANGESWORD cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -726,6 +778,7 @@ class Skill23(PassiveSkill): """ name = '魔性之短剑精通' + ref = Ref.SHORTSWORDMASTERY cellPos = (1,4) learnLv = 15 masterLv = 1 @@ -750,13 +803,22 @@ class Skill23(PassiveSkill): # [瞬影三绝斩]异常状态几率增加 : {value6}% data6 = get_data(f'{prefix}/{uuid}', 6) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkP', 'data': data0, 'weapon': ['短剑']}, + # {'type': '*skillDamage', 'data': data1, 'weapon': ['短剑']}, + # {'type': '+power_sub', 'data': data2, 'skills': ['魔剑奥义'], 'weapon': ['短剑']}, + # {'type': '+power_sub', 'data': data2, 'skills': ['魔剑奥义'], 'weapon': ['短剑']}, + # {'type': '*skillDamage', 'data': data3, 'skills': ['魔剑奥义'], 'weapon': ['短剑']}, + # {'type': '*cdReduce', 'data': data4, 'skills': ['魔剑奥义'], 'weapon': ['短剑']}, + # ] associate = [ - {'type': '$*PAtkP', 'data': data0, 'weapon': ['短剑']}, - {'type': '*skillDamage', 'data': data1, 'weapon': ['短剑']}, - {'type': '+power_sub', 'data': data2, 'skills': ['魔剑奥义'], 'weapon': ['短剑']}, - {'type': '+power_sub', 'data': data2, 'skills': ['魔剑奥义'], 'weapon': ['短剑']}, - {'type': '*skillDamage', 'data': data3, 'skills': ['魔剑奥义'], 'weapon': ['短剑']}, - {'type': '*cdReduce', 'data': data4, 'skills': ['魔剑奥义'], 'weapon': ['短剑']}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0)), weapon=['短剑']), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), weapon=['短剑']), + SkillEffect(attribute=SwordMasterAttribute.SUB_POWER, operation=Operation.ADD, value=Percent(LevelTable(data2)), skills=[Ref.MAGICSWORDUP], weapon=['短剑']), + SkillEffect(attribute=SwordMasterAttribute.SUB_POWER, operation=Operation.ADD, value=Percent(LevelTable(data2)), skills=[Ref.MAGICSWORDUP], weapon=['短剑']), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3)), skills=[Ref.MAGICSWORDUP], weapon=['短剑']), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data4)), skills=[Ref.MAGICSWORDUP], weapon=['短剑']), ] # 血影之太刀精通 @@ -775,6 +837,7 @@ class Skill24(PassiveSkill): """ name = '血影之太刀精通' + ref = Ref.BLADEMASTERY cellPos = (2,4) learnLv = 15 masterLv = 1 @@ -806,14 +869,24 @@ class Skill24(PassiveSkill): # [瞬影三绝斩]剑气追加次数 : 1次 data8 = [0] + [1] * maxLv + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkP', 'data': data0, 'weapon': ['太刀']}, + # {'type': '*skillDamage', 'data': data1, 'skills': ['帝国剑术'], 'weapon': ['太刀']}, + # {'type': '*skillDamage', 'data': data2, 'skills': ['魔剑降临'], 'weapon': ['太刀']}, + # {'type': '*skillDamage', 'data': [0] + [29 + 0.5 * i for i in range(maxLv)], 'weapon': ['太刀']}, + # {'type': '*cdRatio', 'data': data7, 'weapon': ['太刀']}, + # {'type': '+hit0', 'data': data8, 'skills': ['瞬影三绝斩'], 'weapon': ['太刀'], 'ratio': 1}, + # {'type': '+hit3', 'data': data8, 'skills': ['瞬影三绝斩'], 'weapon': ['太刀'], 'ratio': 1}, + # ] associate = [ - {'type': '$*PAtkP', 'data': data0, 'weapon': ['太刀']}, - {'type': '*skillDamage', 'data': data1, 'skills': ['帝国剑术'], 'weapon': ['太刀']}, - {'type': '*skillDamage', 'data': data2, 'skills': ['魔剑降临'], 'weapon': ['太刀']}, - {'type': '*skillDamage', 'data': [0] + [29 + 0.5 * i for i in range(maxLv)], 'weapon': ['太刀']}, - {'type': '*cdRatio', 'data': data7, 'weapon': ['太刀']}, - {'type': '+hit0', 'data': data8, 'skills': ['瞬影三绝斩'], 'weapon': ['太刀'], 'ratio': 1}, - {'type': '+hit3', 'data': data8, 'skills': ['瞬影三绝斩'], 'weapon': ['太刀'], 'ratio': 1}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0)), weapon=['太刀']), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.WEAPONCOMBO], weapon=['太刀']), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2)), skills=[Ref.CHANGESWORD], weapon=['太刀']), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0] + [29 + 0.5 * i for i in range(maxLv)])), weapon=['太刀']), + SkillEffect(attribute=SkillAttribute.CD_RATIO, value=1 - Percent(LevelTable(data7)), weapon=['太刀']), + SkillEffect(attribute=Hit(0), operation=Operation.ADD, value=LevelTable(data8), skills=[Ref.FLASH], weapon=['太刀']), + SkillEffect(attribute=Hit(3), operation=Operation.ADD, value=LevelTable(data8), skills=[Ref.FLASH], weapon=['太刀']), ] # [瞬影三绝斩]剑气追加次数 : 1次 @@ -832,6 +905,7 @@ class Skill25(PassiveSkill): """ name = '毁灭之巨剑精通' + ref = Ref.HEAVYSWORDMASTERY cellPos = (4,4) learnLv = 15 masterLv = 1 @@ -860,12 +934,20 @@ class Skill25(PassiveSkill): # [恶即斩]蓄气后最终一击攻击力增加率 : {value8}% data8 = get_data(f'{prefix}/{uuid}', 8) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkP', 'data': data0, 'weapon': ['巨剑']}, + # {'type': '*skillDamage', 'data': data1, 'skills': ['帝国剑术'], 'weapon': ['巨剑']}, + # {'type': '*skillDamage', 'data': data5, 'weapon': ['巨剑']}, + # {'type': '*skillDamage', 'data': data6, 'skills': ['破军旋舞斩'], 'weapon': ['巨剑']}, + # {'type': '*power1', 'data': data8, 'skills': ['恶即斩'], 'weapon': ['巨剑']}, + # ] associate = [ - {'type': '$*PAtkP', 'data': data0, 'weapon': ['巨剑']}, - {'type': '*skillDamage', 'data': data1, 'skills': ['帝国剑术'], 'weapon': ['巨剑']}, - {'type': '*skillDamage', 'data': data5, 'weapon': ['巨剑']}, - {'type': '*skillDamage', 'data': data6, 'skills': ['破军旋舞斩'], 'weapon': ['巨剑']}, - {'type': '*power1', 'data': data8, 'skills': ['恶即斩'], 'weapon': ['巨剑']}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0)), weapon=['巨剑']), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.WEAPONCOMBO], weapon=['巨剑']), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data5)), weapon=['巨剑']), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data6)), skills=[Ref.HALFMOON], weapon=['巨剑']), + SkillEffect(attribute=Power(1), value=1 + Percent(LevelTable(data8)), skills=[Ref.DEVILSLASH], weapon=['巨剑']), ] # 波动之钝器精通 @@ -883,6 +965,7 @@ class Skill26(PassiveSkill): """ name = '波动之钝器精通' + ref = Ref.BLUNTMASTERY cellPos = (5,4) learnLv = 15 masterLv = 1 @@ -911,12 +994,20 @@ class Skill26(PassiveSkill): data8 = get_data(f'{prefix}/{uuid}', 8) # 技能攻击力增加增益效果持续时间 : {value9}秒 data9 = get_data(f'{prefix}/{uuid}', 9) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkP', 'data': data0, 'weapon': ['钝器']}, + # {'type': '*power3', 'data': data3, 'skills': ['穿云破空剑'], 'weapon': ['钝器']}, + # {'type': '*power2', 'data': data5, 'skills': ['幻剑术'], 'weapon': ['钝器']}, + # {'type': '*skillDamage', 'data': data8, 'weapon': ['钝器']}, + # {'type': '*skillDamage', 'data': data7, 'skills': ['雷鸣千军破'], 'weapon': ['钝器']}, + # ] associate = [ - {'type': '$*PAtkP', 'data': data0, 'weapon': ['钝器']}, - {'type': '*power3', 'data': data3, 'skills': ['穿云破空剑'], 'weapon': ['钝器']}, - {'type': '*power2', 'data': data5, 'skills': ['幻剑术'], 'weapon': ['钝器']}, - {'type': '*skillDamage', 'data': data8, 'weapon': ['钝器']}, - {'type': '*skillDamage', 'data': data7, 'skills': ['雷鸣千军破'], 'weapon': ['钝器']}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0)), weapon=['钝器']), + SkillEffect(attribute=Power(3), value=1 + Percent(LevelTable(data3)), skills=[Ref.THUNDERSLASH], weapon=['钝器']), + SkillEffect(attribute=Power(2), value=1 + Percent(LevelTable(data5)), skills=[Ref.ILLUSIONBLADE], weapon=['钝器']), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data8)), weapon=['钝器']), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data7)), skills=[Ref.EXCALIBUR], weapon=['钝器']), ] # 自动招架 @@ -928,6 +1019,7 @@ class Skill27(ActiveSkill): """ name = '自动招架' + ref = Ref.AUTOGUARD cellPos = (8,5) learnLv = 20 masterLv = 10 @@ -957,6 +1049,7 @@ class Skill28(ActiveSkill): """ name = '疾影斩' + ref = Ref.SPEEDSLASH cellPos = (1,5) learnLv = 20 masterLv = 60 @@ -987,6 +1080,7 @@ class Skill29(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -1010,6 +1104,7 @@ class Skill30(ActiveSkill): """ name = '升龙剑' + ref = Ref.UPPERSLASH cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -1048,6 +1143,7 @@ class Skill31(ActiveSkill): 掌握[波动之钝器精通]后,攻击时会产生冲击波。\n """ name = '幻剑术' + ref = Ref.ILLUSIONBLADE cellPos = (8,6) learnLv = 25 masterLv = 60 @@ -1090,6 +1186,7 @@ class Skill32(ActiveSkill): """ name = '人剑合一' + ref = Ref.OVERDRIVE cellPos = (6,6) learnLv = 25 masterLv = 10 @@ -1119,6 +1216,7 @@ class Skill33(ActiveSkill): """ name = '穿云破空剑' + ref = Ref.THUNDERSLASH cellPos = (2,7) learnLv = 30 masterLv = 60 @@ -1164,6 +1262,7 @@ class Skill34(ActiveSkill): """ name = '魔剑奥义' + ref = Ref.MAGICSWORDUP cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -1213,8 +1312,12 @@ class Skill34(ActiveSkill): mode = ['火/暗', '暗火', '冰/光', '冰光', '冰火', '暗冰'] + # 迁移前实现(保留对照): + # associate = [ + # {'type': '+dataplus0', 'data': data7, 'skills': ['飓风魔剑'], 'ratio': 1}, + # ] associate = [ - {'type': '+dataplus0', 'data': data7, 'skills': ['飓风魔剑'], 'ratio': 1}, + SkillEffect(attribute=ExtraData(0), operation=Operation.ADD, value=LevelTable(data7), skills=[Ref.MAGICSWORDSHOOT]), ] def setMode(self, mode): @@ -1241,6 +1344,7 @@ class Skill35(PassiveSkill): """ name = '魔剑觉醒' + ref = Ref.SWORDMAGIC cellPos = (6,7) learnLv = 30 masterLv = 5 @@ -1252,8 +1356,12 @@ class Skill35(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), ] # 瞬影三绝斩 @@ -1267,6 +1375,7 @@ class Skill36(ActiveSkill): """ name = '瞬影三绝斩' + ref = Ref.FLASH cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -1365,6 +1474,7 @@ class Skill37(ActiveSkill): """ name = '破军旋舞斩' + ref = Ref.HALFMOON cellPos = (1,8) learnLv = 35 masterLv = 60 @@ -1438,6 +1548,7 @@ class Skill38(ActiveSkill): """ name = '雷鸣千军破' + ref = Ref.EXCALIBUR cellPos = (4,9) learnLv = 40 masterLv = 60 @@ -1512,6 +1623,7 @@ class Skill39(ActiveSkill): """ name = '恶即斩' + ref = Ref.DEVILSLASH cellPos = (4,10) learnLv = 45 masterLv = 60 @@ -1591,6 +1703,7 @@ class Skill40(PassiveSkill): """ name = '斩魂术' + ref = Ref.BLADESOUL cellPos = (6,11) learnLv = 48 masterLv = 40 @@ -1614,7 +1727,11 @@ class Skill40(PassiveSkill): data5 = get_data(f'{prefix}/{uuid}', 5) # 国服特色被动+3% - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 极 · 驭剑术 (时空斩) # swordman_female/sword_master/0232c151ef3731c2dede51931a374723 @@ -1625,6 +1742,7 @@ class Skill41(ActiveSkill): """ name = '极 · 驭剑术 (时空斩)' + ref = Ref.TIMESLASH cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1659,6 +1777,7 @@ class Skill42(ActiveSkill): """ name = '裂刃天冲' + ref = Ref.DRAGONUPEX cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1728,6 +1847,7 @@ class Skill43(ActiveSkill): """ name = '极 · 驭剑术 (幻剑阵)' + ref = Ref.JACKCATCH cellPos = (5,13) learnLv = 70 masterLv = 40 @@ -1791,6 +1911,7 @@ class Skill44(ActiveSkill): """ name = '飓风魔剑' + ref = Ref.MAGICSWORDSHOOT cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1849,9 +1970,9 @@ class Skill44(ActiveSkill): # 魔剑奥义单独计算 不享受飓风魔剑特化部分 weapon = self.char.GetWeaponType() if weapon[0] == '短剑': - magic = self.char.GetSkillByName('魔剑奥义').skillInfo('暗火') + magic = self.char.GetSkill(Ref.MAGICSWORDUP).skillInfo('暗火') else: - magic = self.char.GetSkillByName('魔剑奥义').skillInfo('火/暗') + magic = self.char.GetSkill(Ref.MAGICSWORDUP).skillInfo('火/暗') return basic[0] + magic[0] * magic[1] * self.magicHit / basic[1], basic[1], basic[2] def vp_1(self): @@ -1901,6 +2022,7 @@ class Skill45(PassiveSkill): """ name = '帝皇盟约' + ref = Ref.PROMISEOFANTIQUITY cellPos = (4,13) name = '帝皇盟约' learnLv = 75 @@ -1919,8 +2041,12 @@ class Skill45(PassiveSkill): # 使用巨剑时物理攻击力增加量 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkP', 'data': data0}, + # ] associate = [ - {'type': '$*PAtkP', 'data': data0}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), ] # 极 · 驭剑术 (破剑阵) @@ -1933,6 +2059,7 @@ class Skill46(ActiveSkill): """ name = '极 · 驭剑术 (破剑阵)' + ref = Ref.BREAKSWORDDANCE cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -2005,6 +2132,7 @@ class Skill47(ActiveSkill): """ name = '誓约之剑 : 雷沃汀' + ref = Ref.LAEVATEINN cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -2036,6 +2164,7 @@ class Skill48(ActiveSkill): """ name = '极诣 · 驭剑术 : 聚魔剑' + ref = Ref.FUSIONBLADE cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2080,6 +2209,7 @@ class Skill49(PassiveSkill): """ name = '剑心 : 魔剑唤醒' + ref = Ref.ACCEDENCE cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -2099,8 +2229,12 @@ class Skill49(PassiveSkill): # 可以强制中断的次数增加 : {value2}次 data2 = get_data(f'{prefix}/{uuid}', 2) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), ] # 誓约之引 : 万剑之巅 @@ -2115,6 +2249,7 @@ class Skill50(ActiveSkill): """ name = '誓约之引 : 万剑之巅' + ref = Ref.REGIONOFSUPREME cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/swordman_female/vegabond.py b/backend/core/character/GF/swordman_female/vegabond.py index 551ac01d..8c0a3398 100644 --- a/backend/core/character/GF/swordman_female/vegabond.py +++ b/backend/core/character/GF/swordman_female/vegabond.py @@ -3,6 +3,14 @@ from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character from core.basic.roleinfo import CharacterEquipInfo from core.basic.formula import 武器强化计算, 增幅计算 +from core.basic.skill_effect_types import ( + LevelTable, + Operation, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.swordman_female.vegabond import VegabondSkillRef as Ref prefix = "swordman_female/vegabond/cn/skillDetail" @@ -14,6 +22,7 @@ class Skill0(ActiveSkill): 将黑暗之力汇聚到剑上,发出两次斩击。\n """ name = "暗黑斩" + ref = Ref.DARKSLASH learnLv = 1 masterLv = 60 maxLv = 70 @@ -39,6 +48,7 @@ class Skill1(ActiveSkill): 攻击时有霸体判定。 转职为刃影时,技能类型变为独立攻击力。\n """ name = "浮空击" + ref = Ref.LIFTSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -66,6 +76,7 @@ class Skill2(PassiveSkill): 可以减少觉醒技能之外所有技能的冷却时间。\n """ name = "光剑掌握" + ref = Ref.EQUIPLIGHTSWORD cellPos = (7,1) learnLv = 1 masterLv = 1 @@ -80,8 +91,12 @@ class Skill2(PassiveSkill): # 技能冷却时间减少率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0,"type":"*cdReduce", 'exceptSkills': ['花开寒影', '飞花逐月', '轻云出月风静夜']} + # ] associate = [ - {"data":data0,"type":"*cdReduce", 'exceptSkills': ['花开寒影', '飞花逐月', '轻云出月风静夜']} + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data0)), except_skills=[Ref.FATALFLOWER, Ref.MOONLIGHTSLASH, Ref.MOONLIGHTDANCE]), ] # 冥思 @@ -92,6 +107,7 @@ class Skill3(PassiveSkill): 无论遇到任何情况,都能保持绝对的专注。 增加物理和魔法暴击率。\n """ name = "冥思" + ref = Ref.COLDHEART learnLv = 1 masterLv = 1 maxLv = 1 @@ -114,6 +130,7 @@ class Skill4(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -137,6 +154,7 @@ class Skill5(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -164,6 +182,7 @@ class Skill6(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -195,6 +214,7 @@ class Skill7(PassiveSkill): 物理攻击力、 力量\n """ name = "副武器可装备" + ref = Ref.TWOHANDWEAPON cellPos = (8,1) learnLv = 1 masterLv = 1 @@ -229,6 +249,7 @@ class Skill8(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -251,6 +272,7 @@ class Skill9(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -273,6 +295,7 @@ class Skill10(ActiveSkill): 向前方发射一定次数的剑气波动。\n """ name = "波动斩" + ref = Ref.SIRYUN learnLv = 5 masterLv = 60 maxLv = 70 @@ -300,6 +323,7 @@ class Skill11(ActiveSkill): 吸收来自前方的攻击伤害,[招架]状态下被攻击,会被击退一定距离,并持续一定时间。\n """ name = "招架" + ref = Ref.GUARD learnLv = 5 masterLv = 5 maxLv = 15 @@ -331,6 +355,7 @@ class Skill12(ActiveSkill): 在决斗场中,需要跳跃到一定高度时才可以施放该技能。\n """ name = "跃空斩" + ref = Ref.MOUNTAINCRASH learnLv = 5 masterLv = 60 maxLv = 70 @@ -362,6 +387,7 @@ class Skill13(ActiveSkill): 再次按技能键,可连接下劈追加攻击。\n """ name = "十字剑" + ref = Ref.GORECROSS cellPos = (2,2) learnLv = 5 masterLv = 60 @@ -398,6 +424,7 @@ class Skill14(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力。\n """ name = "回旋反击" + ref = Ref.SPINSLASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -430,6 +457,7 @@ class Skill15(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力; 攻击形态变为刃影专属的3次连续攻击。\n """ name = "疾风斩" + ref = Ref.SNAKESHADOW learnLv = 10 masterLv = 60 maxLv = 70 @@ -462,6 +490,7 @@ class Skill16(ActiveSkill): 若抓住敌人,则会向目标施放强力刺击。\n """ name = "索敌刺" + ref = Ref.EXECUTION learnLv = 10 masterLv = 60 maxLv = 70 @@ -489,6 +518,7 @@ class Skill17(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -516,6 +546,7 @@ class Skill18(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -543,6 +574,7 @@ class Skill19(ActiveSkill): 转职为刃影后,技能类型变为独立攻击力。\n """ name = "连环斩" + ref = Ref.CHAINSLASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -572,6 +604,7 @@ class Skill20(ActiveSkill): 进入地下城时自动发动。\n """ name = "两仪功" + ref = Ref.DUALWEAPON cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -628,6 +661,7 @@ class Skill21(ActiveSkill): [三才剑]的技能等级与[三才轮回剑]的技能等级同步提升。\n """ name = "三才剑" + ref = Ref.THREESIDE cellPos = (3,4) learnLv = 15 masterLv = 1 @@ -652,13 +686,7 @@ class Skill21(ActiveSkill): # 范围比率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - @property - def lv(self): - """技能等级""" - return self.char.GetSkillByName("三才回轮剑").lv - - @lv.setter - def lv(self, value): ... + level_source = Ref.VAGABONDSWORDMANSHIP # 轮回剑 # swordman_female/vegabond/852f8ad797db4dca1405cb3e77198401 @@ -670,6 +698,7 @@ class Skill22(ActiveSkill): [轮回剑]的技能等级与[三才轮回剑]的技能等级同步提升。\n """ name = "轮回剑" + ref = Ref.REVOLVINGSWORD cellPos = (4,4) learnLv = 15 masterLv = 1 @@ -695,13 +724,7 @@ class Skill22(ActiveSkill): # 范围比率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - @property - def lv(self): - """技能等级""" - return self.char.GetSkillByName("三才回轮剑").lv - - @lv.setter - def lv(self, value): ... + level_source = Ref.VAGABONDSWORDMANSHIP # 三才回轮剑 # swordman_female/vegabond/ab6fc3303df03b58911967dfca2b5d07 @@ -712,6 +735,7 @@ class Skill23(PassiveSkill): 学习后,可以增加三才剑和轮回剑的技能等级。\n """ name = "三才回轮剑" + ref = Ref.VAGABONDSWORDMANSHIP cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -732,6 +756,7 @@ class Skill24(PassiveSkill): 流浪武士达到返本归元境界,基本攻击、 剑术与掌法变得更强,并增加物理暴击率。\n """ name = "返本归元" + ref = Ref.THREEFLOWER cellPos = (2,5) learnLv = 20 masterLv = 1 @@ -748,8 +773,12 @@ class Skill24(PassiveSkill): # 物理暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0,"type":"*skillDamage"} + # ] associate = [ - {"data":data0,"type":"*skillDamage"} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), ] # 四象引 @@ -761,6 +790,7 @@ class Skill25(ActiveSkill): 对于无法抓取的敌人,可使其进入短暂强制控制状态并受到伤害。\n """ name = "四象引" + ref = Ref.INHALATION cellPos = (0,5) learnLv = 20 masterLv = 60 @@ -796,6 +826,7 @@ class Skill26(ActiveSkill): 通过蓄气激发自身的潜力,增加暴击伤害、 攻击速度和移动速度,效果持续一段时间。\n """ name = "五气朝元" + ref = Ref.FIVECIRCLE cellPos = (5,5) learnLv = 20 masterLv = 10 @@ -823,6 +854,7 @@ class Skill27(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -846,6 +878,7 @@ class Skill28(ActiveSkill): 向前方移动时,对周围发动爆炸攻击。\n """ name = "一花渡江" + ref = Ref.RAPIDSTEP cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -878,6 +911,7 @@ class Skill29(ActiveSkill): 抓取敌人使其浮空,然后向上跃起在空中对敌人进行连续斩击,并将敌人劈落地面\n """ name = "樱落斩" + ref = Ref.SOARCUT cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -922,6 +956,7 @@ class Skill30(ActiveSkill): 用巨大的剑砸向前方产生冲击波,并对周围的敌人造成伤害。\n """ name = "圆舞斩" + ref = Ref.NEARBLOW cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -956,6 +991,7 @@ class Skill31(ActiveSkill): 倒地的敌人暂时无法起身。\n """ name = "碎岩裂地掌" + ref = Ref.EARTHPRESSURE cellPos = (1,7) learnLv = 30 masterLv = 60 @@ -986,6 +1022,7 @@ class Skill32(ActiveSkill): 若在完成念气之花前按下跳跃键,则可以中断技能。\n """ name = "乱花葬" + ref = Ref.OVERBLOWSLASH cellPos = (0,8) learnLv = 35 masterLv = 60 @@ -1049,6 +1086,7 @@ class Skill33(ActiveSkill): 可以在空中使用,但存在最低跳跃高度限制。\n """ name = "游龙掌" + ref = Ref.COALBAN cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -1103,6 +1141,7 @@ class Skill34(ActiveSkill): 在决斗场中,通过输入方向键增加前进距离的功能不生效。\n """ name = "回天璇鸣剑" + ref = Ref.BLASTSWORD cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -1164,6 +1203,7 @@ class Skill35(ActiveSkill): 将内劲凝聚于双手,攻击前方敌人。 被湮烈掌击中的敌人会吸收一部分的内劲,经过一定时间后再次受到内劲爆炸伤害。\n """ name = "湮烈掌" + ref = Ref.FISTOFEXPLOSION cellPos = (1,9) learnLv = 40 masterLv = 60 @@ -1222,6 +1262,7 @@ class Skill36(ActiveSkill): 一闪攻击结束前,输入技能键或攻击键可连接后续攻击; 没有输入技能键时,中断技能\n """ name = "花舞千魂" + ref = Ref.COMETBLADE cellPos = (0,10) learnLv = 45 masterLv = 60 @@ -1283,6 +1324,7 @@ class Skill37(PassiveSkill): 技能冷却时间过后,可以再次解除异常状态。\n """ name = "三花聚顶" + ref = Ref.ECSTASY cellPos = (4,11) learnLv = 48 masterLv = 40 @@ -1306,8 +1348,12 @@ class Skill37(PassiveSkill): # 增益效果持续时间 : {value4}秒 data4 = get_data(f'{prefix}/{uuid}', 4) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0,"type":"*skillDamage"} + # ] associate = [ - {"data":data0,"type":"*skillDamage"} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), ] # 花开寒影 @@ -1319,6 +1365,7 @@ class Skill38(ActiveSkill): 生成气花和树枝的过程中会造成多段伤害,花盛开时会回到原来的位置,使花和树枝爆炸,造成巨大伤害。\n """ name = "花开寒影" + ref = Ref.FATALFLOWER cellPos = (6,11) learnLv = 50 masterLv = 40 @@ -1354,6 +1401,7 @@ class Skill39(ActiveSkill): 垂直斩击是以最靠近水平斩中心部分的敌人头部为落地点。\n """ name = "啸空十字刃" + ref = Ref.ZWEIVOLTAGEEX cellPos = (3,12) learnLv = 60 masterLv = 40 @@ -1416,6 +1464,7 @@ class Skill40(ActiveSkill): 被空中如来神掌击中的敌人将被拍入地面一定时间,无法起身。\n """ name = "如来神掌" + ref = Ref.BIGJANG cellPos = (5,13) learnLv = 70 masterLv = 40 @@ -1480,6 +1529,7 @@ class Skill41(ActiveSkill): 在跳跃状态下也可以施放技能,此时取消第1招的前斩攻击并增加最后回旋斩的攻击力。\n """ name = "莲花剑舞" + ref = Ref.FLOWERBLADEDANCE cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1549,6 +1599,7 @@ class Skill42(PassiveSkill): 突破五气朝元的极限,进入七星耀华的境界。剑术变得比之前更加锋利,内劲大幅提升,增加基本攻击、 剑术和掌法的攻击力。\n """ name = "七星耀华" + ref = Ref.BUDCLIMB cellPos = (1,13) learnLv = 75 masterLv = 40 @@ -1563,8 +1614,12 @@ class Skill42(PassiveSkill): # 基本攻击、 剑术、 掌法技能攻击力增加量 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0,"type":"*skillDamage"} + # ] associate = [ - {"data":data0,"type":"*skillDamage"} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), ] # 樱花劫 @@ -1580,6 +1635,7 @@ class Skill43(ActiveSkill): 可以取消部分转职技能的施放后僵直并立即施放该技能; 收剑入鞘的瞬间可以连接除增益技能之外的所有主动技能。\n """ name = "樱花劫" + ref = Ref.HERMITTRIPLESTEP cellPos = (2,14) learnLv = 80 masterLv = 40 @@ -1635,6 +1691,7 @@ class Skill44(ActiveSkill): 施放技能时,可以利用前/后方向键控制斩击的方向。\n """ name = "飞花逐月" + ref = Ref.MOONLIGHTSLASH cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1685,6 +1742,7 @@ class Skill45(ActiveSkill): 可以在地面或者空中使用。\n """ name = "落英惊鸿掌" + ref = Ref.GONEWITHTHEPETAL cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1722,6 +1780,7 @@ class Skill46(PassiveSkill): 增加剑气大小及发射速度,施放时进入霸体状态。\n """ name = "剑仙之境" + ref = Ref.GODDESSOFSWORD cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1742,9 +1801,14 @@ class Skill46(PassiveSkill): # [游龙掌]发射速度比率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0,"type":"*skillDamage"}, + # {'type': '+cd', 'data': [0] + [-1] * maxLv, 'skills': ['一花渡江'], 'ratio': 1}, + # ] associate = [ - {"data":data0,"type":"*skillDamage"}, - {'type': '+cd', 'data': [0] + [-1] * maxLv, 'skills': ['一花渡江'], 'ratio': 1}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD, operation=Operation.ADD, value=LevelTable([0] + [-1] * maxLv), skills=[Ref.RAPIDSTEP]), ] # 轻云出月风静夜 @@ -1758,6 +1822,7 @@ class Skill47(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "轻云出月风静夜" + ref = Ref.MOONLIGHTDANCE cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/swordman_male/asura.py b/backend/core/character/GF/swordman_male/asura.py index 0caf74c1..ca8e70d4 100644 --- a/backend/core/character/GF/swordman_male/asura.py +++ b/backend/core/character/GF/swordman_male/asura.py @@ -1,6 +1,13 @@ # 41f1cdc2ff58bb5fdc287be0db2a8df3 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.swordman_male.asura import AsuraSkillRef as Ref prefix = "swordman_male/asura/cn/skillDetail" @@ -17,6 +24,7 @@ class Skill0(ActiveSkill): 无需蓄气,攻击时在原地发动斩击。 利用黄泉之力,生成幽魂之布雷德的气息。\n """ name = "鬼斩" + ref = Ref.HARDATTACK learnLv = 1 masterLv = 60 maxLv = 70 @@ -66,6 +74,7 @@ class Skill1(ActiveSkill): 转职为狂战士或阿修罗后,技能类型变为独立攻击力。\n """ name = "上挑" + ref = Ref.UPPERSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -92,6 +101,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -116,6 +126,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -134,7 +145,11 @@ class Skill3(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['波动刻印']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['波动刻印']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.WAVEMARK]), + ] # 受身蹲伏 # swordman_male/asura/ce26c6b69d02a440a81b552bec94f03b @@ -144,6 +159,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -185,6 +201,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -207,6 +224,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -230,6 +248,7 @@ class Skill7(ActiveSkill): 按住技能键可以持续[格挡]动作,且魔法值只在[格挡]开始时消耗一次。\n """ name = "格挡" + ref = Ref.GUARD learnLv = 5 masterLv = 5 maxLv = 15 @@ -261,6 +280,7 @@ class Skill8(ActiveSkill): 突刺攻击会根据[基础精通]增加伤害。\n """ name = "连突刺" + ref = Ref.DASHATTACKMULTIHIT learnLv = 5 masterLv = 1 maxLv = 6 @@ -291,6 +311,7 @@ class Skill9(ActiveSkill): 若剑魂职业已学7级以上的[钝器精通],则可以增加冲击波大小。\n """ name = "银光落刃" + ref = Ref.ASHENFORK learnLv = 5 masterLv = 60 maxLv = 70 @@ -333,6 +354,7 @@ class Skill10(ActiveSkill): 会根据[基础精通]增加伤害。\n """ name = "空之连刃" + ref = Ref.JUMPATTACKMULTI learnLv = 5 masterLv = 1 maxLv = 11 @@ -359,6 +381,7 @@ class Skill11(ActiveSkill): 召唤功能消失,增加自身技能攻击力。 (可以添加到快捷栏,但无法使用)\n """ name = "刀魂之卡赞" + ref = Ref.KHAZAN learnLv = 5 masterLv = 10 maxLv = 20 @@ -396,6 +419,7 @@ class Skill12(ActiveSkill): 转职为狂战士或阿修罗后,技能适用为独立攻击力。\n """ name = "裂波斩" + ref = Ref.VANESLASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -431,6 +455,7 @@ class Skill13(ActiveSkill): 转职为狂战士后,可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "崩山击" + ref = Ref.HOPSMASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -466,6 +491,7 @@ class Skill14(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -493,6 +519,7 @@ class Skill15(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -523,6 +550,7 @@ class Skill16(ActiveSkill): """ name = '鬼印珠' + ref = Ref.REFLECTGUARD cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -571,6 +599,7 @@ class Skill17(ActiveSkill): 若剑魂职业已学5级以上的[太刀精通]或[光剑精通],则可以发动7次连续攻击。\n """ name = "三段刃" + ref = Ref.TRIPLESLASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -613,6 +642,7 @@ class Skill18(PassiveSkill): 适用独立的攻击力/命中率增加数值。\n """ name = "短剑精通" + ref = Ref.SHORTSWORDMASTERY learnLv = 15 masterLv = 30 maxLv = 40 @@ -674,6 +704,7 @@ class Skill19(PassiveSkill): 适用独立的攻击力/命中率增加数值。\n """ name = "太刀精通" + ref = Ref.BLADEMASTERY learnLv = 15 masterLv = 30 maxLv = 40 @@ -727,6 +758,7 @@ class Skill20(PassiveSkill): 适用独立的攻击力/命中率增加数值。\n """ name = "巨剑精通" + ref = Ref.HEAVYSWORDMASTERY learnLv = 15 masterLv = 30 maxLv = 40 @@ -779,6 +811,7 @@ class Skill21(PassiveSkill): 适用独立的攻击力/命中率增加数值。\n """ name = "钝器精通" + ref = Ref.BLUNTMASTERY learnLv = 15 masterLv = 30 maxLv = 40 @@ -827,6 +860,7 @@ class Skill22(ActiveSkill): """ name = '地裂 · 波动剑' + ref = Ref.NORMALWAVE cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -861,6 +895,7 @@ class Skill23(ActiveSkill): """ name = '波动刻印' + ref = Ref.WAVEMARK cellPos = (3,4) learnLv = 15 masterLv = 20 @@ -897,9 +932,14 @@ class Skill23(ActiveSkill): data7 = get_data(f'{prefix}/{uuid}', 7) hit7 = 1 + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0}, + # {'type': '*skillDamage', 'data': [0] + [20] * maxLv, 'skills': ['鬼印珠', '不动明王阵']}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0}, - {'type': '*skillDamage', 'data': [0] + [20] * maxLv, 'skills': ['鬼印珠', '不动明王阵']}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0] + [20] * maxLv)), skills=[Ref.REFLECTGUARD, Ref.WAVESPINAREA]), ] # 十字刃 @@ -914,6 +954,7 @@ class Skill24(ActiveSkill): 删除斩击和追加按键功能; 发动交叉斩击,向前方发射十字。\n """ name = "十字刃" + ref = Ref.GORECROSS learnLv = 15 masterLv = 60 maxLv = 70 @@ -959,6 +1000,7 @@ class Skill25(ActiveSkill): 制造月亮并用斩击将鬼气注入到月亮之中,然后破坏黑月攻击敌人。 破坏黑月时使敌人进入失明状态。 删除追加按键功能。\n """ name = "月光斩" + ref = Ref.MOONLIGHTSLASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -1006,6 +1048,7 @@ class Skill26(PassiveSkill): 减少被击时防具耐久度减少率。\n """ name = "绝对感知" + ref = Ref.SENSEVIOLENTTEMPER learnLv = 18 masterLv = 1 maxLv = 1 @@ -1033,6 +1076,7 @@ class Skill27(ActiveSkill): """ name = '邪光斩' + ref = Ref.GRANDWAVE cellPos = (5,5) name = '邪光斩' learnLv = 20 @@ -1066,6 +1110,7 @@ class Skill28(PassiveSkill): """ name = '修罗邪光斩' + ref = Ref.GRANDWAVECHARGE cellPos = (6,5) learnLv = 20 masterLv = 1 @@ -1087,7 +1132,11 @@ class Skill28(PassiveSkill): data3 = get_data(f'{prefix}/{uuid}', 3) # 邪光剑气多段攻击次数 : 3次 - associate = [{'type': '*skillDamage', 'data': data1, 'skills': ['邪光斩']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data1, 'skills': ['邪光斩']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.GRANDWAVE]), + ] # 邪光剑气多段攻击次数 : 3次 # 暴击 @@ -1098,6 +1147,7 @@ class Skill29(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -1122,6 +1172,7 @@ class Skill30(PassiveSkill): """ name = '慧思' + ref = Ref.CONTEMPLATE cellPos = (3,5) learnLv = 20 masterLv = 5 @@ -1150,6 +1201,7 @@ class Skill31(ActiveSkill): 学习[血气界限]后,血气喷发范围变更为全方位; 即使未抓住敌人,也可以生成血块后使其爆炸。\n """ name = "嗜魂之手" + ref = Ref.BLOODLUST learnLv = 25 masterLv = 60 maxLv = 70 @@ -1199,6 +1251,7 @@ class Skill32(ActiveSkill): """ name = '波动爆发' + ref = Ref.RELEASEWAVE cellPos = (4,6) learnLv = 25 masterLv = 60 @@ -1232,6 +1285,7 @@ class Skill33(PassiveSkill): """ name = '挫折意志' + ref = Ref.MINDFLASH cellPos = (6,6) learnLv = 25 masterLv = 10 @@ -1248,7 +1302,11 @@ class Skill33(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 每分钟魔法值恢复增加 : {value2} data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': data1}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 冰刃 · 波动剑 # swordman_male/asura/ade01c1d6afc8a05055225045e89fe49 @@ -1262,6 +1320,7 @@ class Skill34(ActiveSkill): """ name = '冰刃 · 波动剑' + ref = Ref.ICEWAVE cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -1305,6 +1364,7 @@ class Skill35(ActiveSkill): """ name = '无尽波动' + ref = Ref.DOTAREA cellPos = (6,7) learnLv = 30 masterLv = 10 @@ -1349,6 +1409,7 @@ class Skill36(ActiveSkill): """ name = '爆炎 · 波动剑' + ref = Ref.FIREWAVE cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -1416,6 +1477,7 @@ class Skill37(ActiveSkill): """ name = '无双波' + ref = Ref.STANDALONEWAVE cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1469,6 +1531,7 @@ class Skill38(ActiveSkill): """ name = '邪光波动阵' + ref = Ref.SHOCKWAVEAREA cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -1539,6 +1602,7 @@ class Skill39(ActiveSkill): """ name = '不动明王阵' + ref = Ref.WAVESPINAREA cellPos = (2,10) learnLv = 45 masterLv = 60 @@ -1606,6 +1670,7 @@ class Skill40(PassiveSkill): """ name = '心眼' + ref = Ref.STUCKUPONCOUNTER cellPos = (7,11) learnLv = 48 masterLv = 40 @@ -1628,9 +1693,14 @@ class Skill40(PassiveSkill): # 命中率增加 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data2, 'exceptSkills': ['地裂 · 波动剑']}, + # {'type': '*skillDamage', 'data': data3, 'skills': ['地裂 · 波动剑']}, + # ] associate = [ - {'type': '*skillDamage', 'data': data2, 'exceptSkills': ['地裂 · 波动剑']}, - {'type': '*skillDamage', 'data': data3, 'skills': ['地裂 · 波动剑']}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2)), except_skills=[Ref.NORMALWAVE]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3)), skills=[Ref.NORMALWAVE]), ] # 暗天波动眼 @@ -1657,6 +1727,7 @@ class Skill41(ActiveSkill): """ name = '暗天波动眼' + ref = Ref.WAVEEYE cellPos = (6,11) learnLv = 50 masterLv = 40 @@ -1737,13 +1808,13 @@ class Skill41(ActiveSkill): def getSkillCD(self, mode=None): if mode == '光翼': - pre = self.char.GetSkillByName('地裂 · 波动剑') + pre = self.char.GetSkill(Ref.NORMALWAVE) return 1.2 * pre.getSkillCD(mode) / pre.cd elif mode == '天照': - pre = self.char.GetSkillByName('冰刃 · 波动剑') + pre = self.char.GetSkill(Ref.ICEWAVE) return 2 * pre.getSkillCD(mode) / pre.cd elif mode == '闪枪': - pre = self.char.GetSkillByName('爆炎 · 波动剑') + pre = self.char.GetSkill(Ref.FIREWAVE) return 4.9 * pre.getSkillCD(mode) / pre.cd elif mode == '平X': return 1.0 @@ -1760,6 +1831,7 @@ class Skill42(ActiveSkill): """ name = '极冰 · 裂波剑' + ref = Ref.ICEWAVEEX cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1833,6 +1905,7 @@ class Skill43(ActiveSkill): """ name = '极炎 · 裂波剑' + ref = Ref.FIREWAVEEX cellPos = (3,13) learnLv = 70 masterLv = 40 @@ -1923,6 +1996,7 @@ class Skill44(ActiveSkill): """ name = '雷神之息' + ref = Ref.FORCEOFTHUNDERER cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1955,7 +2029,11 @@ class Skill44(ActiveSkill): # 感电持续时间 : {value5}秒 data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'type': '*skillDamage', 'data': data2}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data2}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] def getSkillCD(self, mode=None): return 2.5 @@ -1973,6 +2051,7 @@ class Skill45(ActiveSkill): """ name = '天雷 · 波动剑' + ref = Ref.INDARAMANG cellPos = (4,13) learnLv = 75 masterLv = 40 @@ -2049,6 +2128,7 @@ class Skill46(ActiveSkill): """ name = '天雷 · 降魔杵' + ref = Ref.VAJRA cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -2149,6 +2229,7 @@ class Skill47(ActiveSkill): """ name = '雷神降世 : 裁决' + ref = Ref.LIGHTNINGGOD cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -2195,6 +2276,7 @@ class Skill48(PassiveSkill): """ name = '波动视界 : 慧眼' + ref = Ref.INSIGHT cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -2207,7 +2289,11 @@ class Skill48(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # [修罗邪光斩]施放时波动刻印额外生成数量 : {value1}个 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 波动慧眼 : 无为法 # swordman_male/asura/61c8cb33dd20b4ff335e8deed70d3d9c @@ -2219,6 +2305,7 @@ class Skill49(ActiveSkill): """ name = '波动慧眼 : 无为法' + ref = Ref.EXPLOSIONOFPATH cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2255,6 +2342,7 @@ class Skill50(ActiveSkill): """ name = '波动神诀 : 万空' + ref = Ref.WAVEOFLIGHTNING cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/swordman_male/berserker.py b/backend/core/character/GF/swordman_male/berserker.py index bbab8fb9..0b1c0a7f 100644 --- a/backend/core/character/GF/swordman_male/berserker.py +++ b/backend/core/character/GF/swordman_male/berserker.py @@ -1,6 +1,15 @@ #41f1cdc2ff58bb5fdc287be0db2a8df3 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.swordman_male.berserker import BerserkerSkillRef as Ref prefix = "swordman_male/berserker/cn/skillDetail" @@ -16,6 +25,7 @@ class Skill0(ActiveSkill): 无需蓄气,攻击时在原地发动斩击。 利用黄泉之力,生成幽魂之布雷德的气息。\n """ name = "鬼斩" + ref = Ref.HARDATTACK learnLv = 1 masterLv = 60 maxLv = 70 @@ -65,6 +75,7 @@ class Skill1(ActiveSkill): 转职为狂战士或阿修罗后,技能类型变为独立攻击力。\n """ name = "上挑" + ref = Ref.UPPERSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -92,6 +103,7 @@ class Skill2(PassiveSkill): 包括[十字刃]与[崩山击]在内的转职后技能新增出血效果。\n """ name = "血气旺盛" + ref = Ref.BLOODYVIGOROUS cellPos = (2,1) learnLv = 1 masterLv = 1 @@ -120,6 +132,7 @@ class Skill3(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -143,6 +156,7 @@ class Skill4(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -170,6 +184,7 @@ class Skill5(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -211,6 +226,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -233,6 +249,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -256,6 +273,7 @@ class Skill8(ActiveSkill): 按住技能键可以持续[格挡]动作,且魔法值只在[格挡]开始时消耗一次。\n """ name = "格挡" + ref = Ref.GUARD learnLv = 5 masterLv = 5 maxLv = 15 @@ -287,6 +305,7 @@ class Skill9(ActiveSkill): 突刺攻击会根据[基础精通]增加伤害。\n """ name = "连突刺" + ref = Ref.DASHATTACKMULTIHIT learnLv = 5 masterLv = 1 maxLv = 6 @@ -317,6 +336,7 @@ class Skill10(ActiveSkill): 若剑魂职业已学7级以上的[钝器精通],则可以增加冲击波大小。\n """ name = "银光落刃" + ref = Ref.ASHENFORK learnLv = 5 masterLv = 60 maxLv = 70 @@ -359,6 +379,7 @@ class Skill11(ActiveSkill): 会根据[基础精通]增加伤害。\n """ name = "空之连刃" + ref = Ref.JUMPATTACKMULTI learnLv = 5 masterLv = 1 maxLv = 11 @@ -385,6 +406,7 @@ class Skill12(ActiveSkill): 召唤功能消失,增加自身技能攻击力。 (可以添加到快捷栏,但无法使用)\n """ name = "刀魂之卡赞" + ref = Ref.KHAZAN learnLv = 5 masterLv = 10 maxLv = 20 @@ -422,6 +444,7 @@ class Skill13(ActiveSkill): 转职为狂战士或阿修罗后,技能适用为独立攻击力。\n """ name = "裂波斩" + ref = Ref.VANESLASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -457,6 +480,7 @@ class Skill14(ActiveSkill): 转职为狂战士后,可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "崩山击" + ref = Ref.HOPSMASH cellPos = (3,3) learnLv = 10 masterLv = 60 @@ -494,6 +518,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -521,6 +546,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -548,6 +574,7 @@ class Skill17(ActiveSkill): 若剑魂职业已学5级以上的[太刀精通]或[光剑精通],则可以发动7次连续攻击。\n """ name = "三段刃" + ref = Ref.TRIPLESLASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -584,6 +611,7 @@ class Skill18(PassiveSkill): 可使用右键点击技能On/Off技能特效。\n """ name = "狂暴血气" + ref = Ref.MADNESS cellPos = (5,4) learnLv = 15 masterLv = 1 @@ -612,6 +640,7 @@ class Skill19(PassiveSkill): 适用独立的攻击力/命中率增加数值。\n """ name = "短剑精通" + ref = Ref.SHORTSWORDMASTERY learnLv = 15 masterLv = 30 maxLv = 40 @@ -673,6 +702,7 @@ class Skill20(PassiveSkill): 适用独立的攻击力/命中率增加数值。\n """ name = "太刀精通" + ref = Ref.BLADEMASTERY learnLv = 15 masterLv = 30 maxLv = 40 @@ -726,6 +756,7 @@ class Skill21(PassiveSkill): 适用独立的攻击力/命中率增加数值。\n """ name = "巨剑精通" + ref = Ref.HEAVYSWORDMASTERY learnLv = 15 masterLv = 30 maxLv = 40 @@ -778,6 +809,7 @@ class Skill22(PassiveSkill): 适用独立的攻击力/命中率增加数值。\n """ name = "钝器精通" + ref = Ref.BLUNTMASTERY learnLv = 15 masterLv = 30 maxLv = 40 @@ -825,6 +857,7 @@ class Skill23(PassiveSkill): 生命值越低增加的值越大,且根据剩余生命值的比例阶段性增加。\n """ name = "力量唤醒" + ref = Ref.PINCHPOWERUP cellPos = (7,4) learnLv = 15 masterLv = 10 @@ -870,7 +903,11 @@ class Skill23(PassiveSkill): # 回避率增加率 : {value14}% data14 = get_data(f'{prefix}/{uuid}', 14) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 地裂 · 波动剑 # swordman_male/berserker/3d8f3d438405d79f8d3ed68072674d1e @@ -881,6 +918,7 @@ class Skill24(ActiveSkill): 转职为阿修罗后,可中断基本攻击使用\n """ name = "地裂 · 波动剑" + ref = Ref.NORMALWAVE learnLv = 15 masterLv = 60 maxLv = 70 @@ -912,6 +950,7 @@ class Skill25(ActiveSkill): 删除斩击和追加按键功能; 发动交叉斩击,向前方发射十字。\n """ name = "十字刃" + ref = Ref.GORECROSS cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -959,6 +998,7 @@ class Skill26(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "狂暴之力" + ref = Ref.FRENZY cellPos = (4,4) learnLv = 15 masterLv = 20 @@ -987,9 +1027,14 @@ class Skill26(ActiveSkill): # 生命值吸收量上限 : {value6} data6 = get_data(f'{prefix}/{uuid}', 6) + # 迁移前实现(保留对照): + # associate = [ + # {"data": data4, "type": '*skillDamage'}, + # {'data': data5, 'type': '*cdReduce', 'exceptSkills': ['魔狱血刹', '血魔 · 弑天', '血魔极道 : 灭世']} + # ] associate = [ - {"data": data4, "type": '*skillDamage'}, - {'data': data5, 'type': '*cdReduce', 'exceptSkills': ['魔狱血刹', '血魔 · 弑天', '血魔极道 : 灭世']} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data4))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data5)), except_skills=[Ref.HELLBENTER, Ref.BLOODRIVEN, Ref.EXTREAMBLOOD]), ] # 月光斩 @@ -1007,6 +1052,7 @@ class Skill27(ActiveSkill): 制造月亮并用斩击将鬼气注入到月亮之中,然后破坏黑月攻击敌人。 破坏黑月时使敌人进入失明状态。 删除追加按键功能。\n """ name = "月光斩" + ref = Ref.MOONLIGHTSLASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -1053,6 +1099,7 @@ class Skill28(ActiveSkill): 恢复自身一定量的生命值并增加物理/魔法防御力和硬直,效果持续一定时间,但只能在自身生命值较低时施放。\n """ name = "死亡抗拒" + ref = Ref.DIEHARD cellPos = (6,5) learnLv = 20 masterLv = 1 @@ -1089,6 +1136,7 @@ class Skill29(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -1114,6 +1162,7 @@ class Skill30(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "狂气斩" + ref = Ref.BLOODSCRATCH cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -1155,6 +1204,7 @@ class Skill31(ActiveSkill): 学习[血气界限]后,血气喷发范围变更为全方位; 即使未抓住敌人,也可以生成血块后使其爆炸。\n """ name = "嗜魂之手" + ref = Ref.BLOODLUST cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -1215,6 +1265,7 @@ class Skill32(ActiveSkill): 暴走状态下,增加[狂暴之力]基本攻击和[崩山击]、 [十字刃]技能的僵直度,减少动作延迟。\n """ name = "暴走" + ref = Ref.RECKLESS cellPos = (6,6) learnLv = 25 masterLv = 10 @@ -1259,6 +1310,7 @@ class Skill33(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "怒气爆发" + ref = Ref.RAGINGFURY cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -1296,6 +1348,7 @@ class Skill34(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "狂热回旋" + ref = Ref.CRUELENGAGE cellPos = (6,7) learnLv = 30 masterLv = 60 @@ -1335,6 +1388,7 @@ class Skill35(ActiveSkill): 在[饥渴]状态下,大幅度提升基本攻击力和[崩山击]、 [十字刃]等狂战士转职技能的攻击力。\n """ name = "饥渴" + ref = Ref.SACRIFICE cellPos = (3,8) learnLv = 35 masterLv = 10 @@ -1362,7 +1416,11 @@ class Skill35(ActiveSkill): data5 = get_data(f'{prefix}/{uuid}', 5) # 出血诱发范围 : {value6}px data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{"data":data3}] + # 迁移前实现(保留对照): + # associate = [{"data":data3}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3))), + ] # 嗜魂封魔斩 # swordman_male/berserker/1b1cfab062e0768bcc889e33e1f30dbf @@ -1375,6 +1433,7 @@ class Skill36(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "嗜魂封魔斩" + ref = Ref.BLOODYRAVE cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -1434,6 +1493,7 @@ class Skill37(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "暴怒狂斩" + ref = Ref.RAGE cellPos = (1,8) learnLv = 35 masterLv = 60 @@ -1499,6 +1559,7 @@ class Skill38(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "爆发之刃" + ref = Ref.BLOODSWORD cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -1551,6 +1612,7 @@ class Skill39(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "崩山裂地斩" + ref = Ref.OUTRAGEBREAK cellPos = (3,10) learnLv = 45 masterLv = 60 @@ -1611,6 +1673,7 @@ class Skill40(PassiveSkill): 若周围一定范围内存在处于出血状态的敌人或友军,则可以增加自身的独立攻击力、 命中率和物理暴击率。\n """ name = "鲜血之忆" + ref = Ref.BLEEDINGMASTERY cellPos = (6,11) learnLv = 48 masterLv = 40 @@ -1630,7 +1693,11 @@ class Skill40(PassiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 物理暴击率增加 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"data": data1,"type": '$*PAtkI'}] + # 迁移前实现(保留对照): + # associate = [{"data": data1,"type": '$*PAtkI'}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_I, value=1 + Percent(LevelTable(data1))), + ] # 魔狱血刹 # swordman_male/berserker/8572675ec6a1f50b6eff6a867376c2de @@ -1643,6 +1710,7 @@ class Skill41(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "魔狱血刹" + ref = Ref.HELLBENTER cellPos = (3,11) learnLv = 50 masterLv = 40 @@ -1686,6 +1754,7 @@ class Skill42(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "狂怒暴掠" + ref = Ref.BLOODSNATCH cellPos = (5,12) learnLv = 60 masterLv = 40 @@ -1740,6 +1809,7 @@ class Skill43(ActiveSkill): 冷却时间减少效果不适用于该技能。\n """ name = "狂气涌动" + ref = Ref.BERSERKER cellPos = (3,12) learnLv = 65 masterLv = 1 @@ -1770,6 +1840,7 @@ class Skill44(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "强悍碾压" + ref = Ref.BRUTALCRUSHER cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1824,6 +1895,7 @@ class Skill45(PassiveSkill): 增加基本攻击力和[崩山击]、 [十字刃]等狂战士转职技能的攻击力。 施放[嗜魂之手]时进入霸体状态。\n """ name = "汲血之力" + ref = Ref.BLOODINKANET cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1837,7 +1909,11 @@ class Skill45(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data": data0,"type": '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{"data": data0,"type": '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 浴血之怒 # swordman_male/berserker/8ec9da6f808889b63adf2680fbf1f331 @@ -1849,6 +1925,7 @@ class Skill46(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "浴血之怒" + ref = Ref.BLOODBOOM cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1905,6 +1982,7 @@ class Skill47(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "致命血陨" + ref = Ref.FATALBLOOD cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1962,6 +2040,7 @@ class Skill48(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "血魔 · 弑天" + ref = Ref.BLOODRIVEN cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1994,6 +2073,7 @@ class Skill49(ActiveSkill): 学习[血气旺盛]后,可以使被击中的敌人进入出血状态。\n """ name = "疯魔血魂斩" + ref = Ref.RAMPANTMADNESS cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2030,6 +2110,7 @@ class Skill50(PassiveSkill): 血气喷发范围变更为全方位; 即使未抓住敌人,也可以生成血块后使其爆炸。\n """ name = "血气界限" + ref = Ref.MERCILESSNESS cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -2043,7 +2124,11 @@ class Skill50(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data": data0,"type": '*skillDamage'}] + # 迁移前实现(保留对照): + # associate = [{"data": data0,"type": '*skillDamage'}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 血魔极道 : 灭世 # swordman_male/berserker/d59c9840f65381bde8487757f1753c71 @@ -2058,6 +2143,7 @@ class Skill51(ActiveSkill): 选择[血魔 · 弑天]使用三次觉醒技能时,与[血魔 · 弑天]共享冷却时间。 [血魔 · 弑天]在冷却中时,无法使用三次觉醒技能。\n """ name = "血魔极道 : 灭世" + ref = Ref.EXTREAMBLOOD cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/swordman_male/ghostblade.py b/backend/core/character/GF/swordman_male/ghostblade.py index a94fe779..872a41d5 100644 --- a/backend/core/character/GF/swordman_male/ghostblade.py +++ b/backend/core/character/GF/swordman_male/ghostblade.py @@ -3,6 +3,18 @@ from core.basic.roleinfo import CharacterEquipInfo from core.basic.formula import 武器强化计算 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Equals, + LevelTable, + Operation, + Percent, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.swordman_male.ghostblade import GhostbladeSkillRef as Ref prefix = "swordman_male/ghostblade/cn/skillDetail" @@ -18,6 +30,7 @@ class Skill0(ActiveSkill): 无需蓄气,攻击时在原地发动斩击。 利用黄泉之力,生成幽魂之布雷德的气息。\n """ name = "鬼斩" + ref = Ref.HARDATTACK learnLv = 1 masterLv = 60 maxLv = 70 @@ -67,6 +80,7 @@ class Skill1(ActiveSkill): 转职为狂战士或阿修罗后,技能类型变为独立攻击力。\n """ name = "上挑" + ref = Ref.UPPERSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -93,6 +107,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -116,6 +131,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -143,6 +159,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -174,6 +191,7 @@ class Skill5(PassiveSkill): [鬼斩]、 [三段刃]变更为剑影特殊形态,[后跳]中可以发动空中斩击。\n """ name = "鬼人化" + ref = Ref.BLADESPIRIT cellPos = (2,1) learnLv = 1 masterLv = 1 @@ -208,6 +226,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -230,6 +249,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -253,6 +273,7 @@ class Skill8(ActiveSkill): 按住技能键可以持续[格挡]动作,且魔法值只在[格挡]开始时消耗一次。\n """ name = "格挡" + ref = Ref.GUARD learnLv = 5 masterLv = 5 maxLv = 15 @@ -285,6 +306,7 @@ class Skill9(ActiveSkill): 若剑魂职业已学7级以上的[钝器精通],则可以增加冲击波大小。\n """ name = "银光落刃" + ref = Ref.ASHENFORK learnLv = 5 masterLv = 60 maxLv = 70 @@ -327,6 +349,7 @@ class Skill10(ActiveSkill): 会根据[基础精通]增加伤害。\n """ name = "空之连刃" + ref = Ref.JUMPATTACKMULTI learnLv = 5 masterLv = 1 maxLv = 11 @@ -353,6 +376,7 @@ class Skill11(ActiveSkill): 转职为狂战士或阿修罗后,技能适用为独立攻击力。\n """ name = "裂波斩" + ref = Ref.VANESLASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -388,6 +412,7 @@ class Skill12(ActiveSkill): 转职为狂战士后,可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "崩山击" + ref = Ref.HOPSMASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -423,6 +448,7 @@ class Skill13(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -450,6 +476,7 @@ class Skill14(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -477,6 +504,7 @@ class Skill15(ActiveSkill): 若剑魂职业已学5级以上的[太刀精通]或[光剑精通],则可以发动7次连续攻击。\n """ name = "三段刃" + ref = Ref.TRIPLESLASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -512,6 +540,7 @@ class Skill16(ActiveSkill): 转职为阿修罗后,可中断基本攻击使用\n """ name = "地裂 · 波动剑" + ref = Ref.NORMALWAVE learnLv = 15 masterLv = 60 maxLv = 70 @@ -543,6 +572,7 @@ class Skill17(ActiveSkill): 删除斩击和追加按键功能; 发动交叉斩击,向前方发射十字。\n """ name = "十字刃" + ref = Ref.GORECROSS learnLv = 15 masterLv = 60 maxLv = 70 @@ -588,6 +618,7 @@ class Skill18(ActiveSkill): 制造月亮并用斩击将鬼气注入到月亮之中,然后破坏黑月攻击敌人。 破坏黑月时使敌人进入失明状态。 删除追加按键功能。\n """ name = "月光斩" + ref = Ref.MOONLIGHTSLASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -637,6 +668,7 @@ class Skill19(ActiveSkill): [鬼步]的终结动作变更为[鬼连击]终结动作,并对命中的所有敌人额外适用[鬼连击]的攻击力。\n """ name = "鬼连击" + ref = Ref.SPEEDSLASH cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -683,6 +715,7 @@ class Skill20(ActiveSkill): 在决斗场中,连接施放剑术技能时,减少技能攻击力。\n """ name = "鬼步" + ref = Ref.SPIRITMOVE cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -712,6 +745,7 @@ class Skill21(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -736,6 +770,7 @@ class Skill22(ActiveSkill): 在决斗场中,无法在[格挡]过程中使用。\n """ name = "幻鬼 : 一闪" + ref = Ref.ONESLASHVS cellPos = (6,5) learnLv = 20 masterLv = 60 @@ -770,6 +805,7 @@ class Skill23(ActiveSkill): 在决斗场中存在冷却时间,且移动后不适用无敌判定。\n """ name = "幻鬼步" + ref = Ref.RETURNSPIRITMOVE cellPos = (2,5) learnLv = 20 masterLv = 1 @@ -794,6 +830,7 @@ class Skill24(PassiveSkill): 同时,太刀武器的物理攻击力 (包含强化、 增幅所增加的数值) 提升至与魔法攻击力相同。\n """ name = "剑影太刀精通" + ref = Ref.BLADEMASTERYBS cellPos = (1,5) learnLv = 20 masterLv = 10 @@ -811,7 +848,11 @@ class Skill24(PassiveSkill): # 命中率增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [ {"type":"$*PAtkP","data":data0}, ] + # 迁移前实现(保留对照): + # associate = [ {"type":"$*PAtkP","data":data0}, ] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 嗜魂之手 # swordman_male/ghostblade/3829c15bf5f520c13998a3479ba0ce7b @@ -827,6 +868,7 @@ class Skill25(ActiveSkill): 学习[血气界限]后,血气喷发范围变更为全方位; 即使未抓住敌人,也可以生成血块后使其爆炸。\n """ name = "嗜魂之手" + ref = Ref.BLOODLUST learnLv = 25 masterLv = 60 maxLv = 70 @@ -874,6 +916,7 @@ class Skill26(ActiveSkill): 在决斗场中,无法在[格挡]过程中使用。\n """ name = "幻鬼 : 连击" + ref = Ref.SPEEDSLASHVS cellPos = (6,6) learnLv = 25 masterLv = 60 @@ -917,6 +960,7 @@ class Skill27(ActiveSkill): 在决斗场中,无法拉起浮空或倒地的敌人。\n """ name = "鬼连牙" + ref = Ref.GHOSTPIERCE cellPos = (3,6) learnLv = 25 masterLv = 60 @@ -946,6 +990,7 @@ class Skill28(PassiveSkill): [青蓝色的血肉上,似乎已经浸染幻鬼的气息。]\n """ name = "幻鬼之力" + ref = Ref.BLUEFIGHTINGSPIRIT cellPos = (0,6) learnLv = 25 masterLv = 10 @@ -965,7 +1010,11 @@ class Skill28(PassiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 暴击伤害增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"data":data3}] + # 迁移前实现(保留对照): + # associate = [{"data":data3}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3))), + ] # 双魂共鸣 # swordman_male/ghostblade/89a4529234904fcbb3abe289e281f2fd @@ -977,6 +1026,7 @@ class Skill29(ActiveSkill): [别忘了,你与我是一体……]\n """ name = "双魂共鸣" + ref = Ref.SPIRITCONVERSION cellPos = (1,7) learnLv = 30 masterLv = 10 @@ -1004,6 +1054,7 @@ class Skill30(ActiveSkill): 在决斗场中,施放时不适用霸体,在分离状态下使用时攻击力减少。\n """ name = "共鸣 : 离魂一闪" + ref = Ref.SPIRITCROSSSLASH cellPos = (8,7) learnLv = 30 masterLv = 60 @@ -1036,6 +1087,7 @@ class Skill31(ActiveSkill): [鬼连击 : 极]的技能等级与[鬼连击]的技能等级同时提升,攻击范围同时受[鬼连击]范围的影响。\n """ name = "鬼连击 : 极" + ref = Ref.SPEEDSLASHUPPER cellPos = (4,7) learnLv = 30 masterLv = 1 @@ -1052,17 +1104,10 @@ class Skill31(ActiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) hit0 = 3 - @property - def lv(self): - """技能等级""" - return self.char.GetSkillByName("鬼连击").lv - - @lv.setter - def lv(self, value): - ... + level_source = Ref.SPEEDSLASH def getSkillCD(self,mode=None): - return self.char.GetSkillByName("鬼连击").getSkillCD(mode) + return self.char.GetSkill(Ref.SPEEDSLASH).getSkillCD(mode) # 魂破斩 # swordman_male/ghostblade/87a918bb22cfc959a16e0bf939bb6c24 @@ -1075,6 +1120,7 @@ class Skill32(ActiveSkill): [鬼步]的终结动作变更为[魂破斩]终结动作,并对命中的所有敌人额外适用[魂破斩]的攻击力。\n """ name = "魂破斩" + ref = Ref.WHITEGHOSTSLASH cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -1115,10 +1161,14 @@ class Skill32(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{"type":"*skillRation","data":[0] + [-25]*self.maxLv,"skills":["鬼步"]}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{"type":"*skillRation","data":[0] + [-25]*self.maxLv,"skills":["鬼步"]}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-25] * maxLv)), skills=[Ref.SPIRITMOVE], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 共鸣 : 鬼灵斩 # swordman_male/ghostblade/aa51c4ddf1659092fa9ed612b9837061 @@ -1130,6 +1180,7 @@ class Skill33(ActiveSkill): 在决斗场中,施放时不适用霸体,在分离状态下使用时攻击力减少,且无法攻击倒地的敌人。\n """ name = "共鸣 : 鬼灵斩" + ref = Ref.MOONSPIRITSLASH cellPos = (8,8) learnLv = 35 masterLv = 60 @@ -1181,6 +1232,7 @@ class Skill34(ActiveSkill): 在决斗场中,无法在[格挡]过程中使用。\n """ name = "幻鬼 : 回天" + ref = Ref.SPINNINGSLASHVS cellPos = (6,9) learnLv = 40 masterLv = 60 @@ -1241,6 +1293,7 @@ class Skill35(ActiveSkill): [鬼步]的终结动作变更为[冥灵断魂斩]终结动作,并对命中的所有敌人额外适用[冥灵断魂斩]的攻击力。\n """ name = "冥灵断魂斩" + ref = Ref.GHOSTDECOLLATION cellPos = (3,10) learnLv = 45 masterLv = 60 @@ -1281,10 +1334,14 @@ class Skill35(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{"type":"*skillRation","data":[0] + [-11]*self.maxLv,"skills":["鬼步"]}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{"type":"*skillRation","data":[0] + [-11]*self.maxLv,"skills":["鬼步"]}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.PANEL_RATIO, value=1 + Percent(LevelTable([0] + [-11] * maxLv)), skills=[Ref.SPIRITMOVE], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 鬼夜 # swordman_male/ghostblade/02ac8e048f7bbcfa616e74ac68988872 @@ -1295,6 +1352,7 @@ class Skill36(PassiveSkill): 学习后,增加夜刀神的基本攻击力、 [鬼斩]、 [三段刃]和转职后技能的攻击力、 物理暴击率。\n """ name = "鬼夜" + ref = Ref.NAMEOFYACHA cellPos = (5,11) learnLv = 48 masterLv = 40 @@ -1310,7 +1368,11 @@ class Skill36(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 物理暴击率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 冥夜鬼天杀 # swordman_male/ghostblade/ca2536eb56df0e812c88c59cabd38be0 @@ -1321,6 +1383,7 @@ class Skill37(ActiveSkill): 然后,夜刀神和幻鬼交叉斩击敌人,造成巨大物理伤害。\n """ name = "冥夜鬼天杀" + ref = Ref.ULTIMATECROSSSLASH cellPos = (4,11) learnLv = 50 masterLv = 40 @@ -1348,6 +1411,7 @@ class Skill38(ActiveSkill): 施放剑术技能过程中使用该技能时,可以无施放动作立即出现幻鬼攻击敌人。\n """ name = "幻鬼 : 奈落" + ref = Ref.SUDDENSTRIKEVS cellPos = (6,12) learnLv = 60 masterLv = 40 @@ -1406,6 +1470,7 @@ class Skill39(ActiveSkill): 在夜刀神与幻鬼分离的状态下施放[共鸣 : 聚渊]时,幻鬼中断当前动作并向夜刀神方向移动并攻击敌人。\n """ name = "共鸣 : 聚渊" + ref = Ref.HELLSLASH cellPos = (8,13) learnLv = 70 masterLv = 40 @@ -1473,6 +1538,7 @@ class Skill40(PassiveSkill): [戴上面具,化身罗刹。]\n """ name = "鬼咲" + ref = Ref.NACHAL cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1490,9 +1556,14 @@ class Skill40(PassiveSkill): # [鬼步]Y轴攻击范围增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {"type":"*skillDamage","data":data0}, + # {"type":"+cd","data":[0] + [-1]*maxLv,"skills":["鬼步","三段刃"],"ratio":1}, + # ] associate = [ - {"type":"*skillDamage","data":data0}, - {"type":"+cd","data":[0] + [-1]*maxLv,"skills":["鬼步","三段刃"],"ratio":1}, + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD, operation=Operation.ADD, value=LevelTable([0] + [-1] * maxLv), skills=[Ref.SPIRITMOVE, Ref.TRIPLESLASH]), ] # 幻鬼 : 大回天 @@ -1504,6 +1575,7 @@ class Skill41(ActiveSkill): 施放剑术技能过程中使用该技能时,可以无施放动作立即出现幻鬼攻击敌人。\n """ name = "幻鬼 : 大回天" + ref = Ref.WINDSPIRITVS cellPos = (6,13) learnLv = 75 masterLv = 40 @@ -1563,6 +1635,7 @@ class Skill42(ActiveSkill): [鬼步]的终结动作变更为[裂魂乱舞]终结动作,并对命中的所有敌人额外适用[裂魂乱舞]的攻击力。\n """ name = "裂魂乱舞" + ref = Ref.SWORDDANCEBS cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1635,6 +1708,7 @@ class Skill43(ActiveSkill): [永堕黑暗吧!]\n """ name = "鬼隐 · 夜奈落" + ref = Ref.TERRIBLEKILLING cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -1679,6 +1753,7 @@ class Skill44(PassiveSkill): [我们即是万物的梦魇。]\n """ name = "睥睨万物" + ref = Ref.INVINCIBLESPIRIT cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1703,7 +1778,11 @@ class Skill44(PassiveSkill): # 空中、 倒地状态下被攻击时施放冷却时间 : {value4}秒 data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 无式·极影剑 # swordman_male/ghostblade/7a3fc9d473e8ffe21dd900ddf228a437 @@ -1724,6 +1803,7 @@ class Skill45(ActiveSkill): [牵绊是一种无用的情感。]\n """ name = "无式·极影剑" + ref = Ref.UNLIMITEDSPEEDSLASHBVS cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1785,6 +1865,7 @@ class Skill46(ActiveSkill): 关联的技能在冷却中时,无法使用三次觉醒技能。\n """ name = "灭魂极影剑·止煞" + ref = Ref.INFINITYKILLING cellPos = (5,16) learnLv = 100 masterLv = 40 @@ -1842,7 +1923,7 @@ class classChange(Character): super().__init__(equVersion, __name__) def calc_weapon(self,cur:CharacterEquipInfo): - if cur.equInfo.itemDetailType in ['太刀'] and self.GetSkillByName("剑影太刀精通").lv > 0: + if cur.equInfo.itemDetailType in ['太刀'] and self.GetSkill(Ref.BLADEMASTERYBS).lv > 0: cur.equInfo.AtkP = cur.equInfo.AtkM # 传世武器强化系数取所有武器的最高的1.12 if '传世武器' in cur.equInfo.categorize: diff --git a/backend/core/character/GF/swordman_male/soul_bender.py b/backend/core/character/GF/swordman_male/soul_bender.py index 5545a95c..e4c48611 100644 --- a/backend/core/character/GF/swordman_male/soul_bender.py +++ b/backend/core/character/GF/swordman_male/soul_bender.py @@ -1,6 +1,18 @@ # 41f1cdc2ff58bb5fdc287be0db2a8df3 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, + Percent, + Select, + SkillAttribute, + SkillEffect, + WeaponCategoryContains, +) +from core.character.refs.swordman_male.soul_bender import SoulBenderSkillRef as Ref prefix = "swordman_male/soul_bender/cn/skillDetail" @@ -18,6 +30,7 @@ class Skill0(ActiveSkill): """ name = '鬼斩' + ref = Ref.HARDATTACK cellPos = (3,1) learnLv = 1 masterLv = 60 @@ -58,7 +71,11 @@ class Skill0(ActiveSkill): # [范围信息] # 斩击范围比率 : {value9}% data9 = get_data(f'{prefix}/{uuid}', 9) - associate = [{'data': data2, 'skills': ['鬼斩']}] + # 迁移前实现(保留对照): + # associate = [{'data': data2, 'skills': ['鬼斩']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2)), skills=[Ref.HARDATTACK]), + ] # 上挑 # swordman_male/soul_bender/fc7a3f4c2852c832a2f20af63d5d212f @@ -70,6 +87,7 @@ class Skill1(ActiveSkill): 转职为狂战士或阿修罗后,技能类型变为独立攻击力。\n """ name = "上挑" + ref = Ref.UPPERSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -96,6 +114,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -120,6 +139,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -138,7 +158,11 @@ class Skill3(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['残影之凯贾']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['残影之凯贾']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.GHOSTSTEP]), + ] # 受身蹲伏 # swordman_male/soul_bender/ce26c6b69d02a440a81b552bec94f03b @@ -148,6 +172,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -189,6 +214,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -211,6 +237,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -234,6 +261,7 @@ class Skill7(ActiveSkill): 按住技能键可以持续[格挡]动作,且魔法值只在[格挡]开始时消耗一次。\n """ name = "格挡" + ref = Ref.GUARD learnLv = 5 masterLv = 5 maxLv = 15 @@ -265,6 +293,7 @@ class Skill8(ActiveSkill): 突刺攻击会根据[基础精通]增加伤害。\n """ name = "连突刺" + ref = Ref.DASHATTACKMULTIHIT learnLv = 5 masterLv = 1 maxLv = 6 @@ -295,6 +324,7 @@ class Skill9(ActiveSkill): 若剑魂职业已学7级以上的[钝器精通],则可以增加冲击波大小。\n """ name = "银光落刃" + ref = Ref.ASHENFORK learnLv = 5 masterLv = 60 maxLv = 70 @@ -337,6 +367,7 @@ class Skill10(ActiveSkill): 会根据[基础精通]增加伤害。\n """ name = "空之连刃" + ref = Ref.JUMPATTACKMULTI learnLv = 5 masterLv = 1 maxLv = 11 @@ -364,6 +395,7 @@ class Skill11(ActiveSkill): """ name = '刀魂之卡赞' + ref = Ref.KHAZAN cellPos = (6,2) learnLv = 5 masterLv = 10 @@ -389,7 +421,11 @@ class Skill11(ActiveSkill): # [范围信息] # 领域范围 : {value4}px data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{'data': data3}] + # 迁移前实现(保留对照): + # associate = [{'data': data3}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data3))), + ] # 裂波斩 # swordman_male/soul_bender/202edb928046f4fa6dedf6337377efd5 @@ -402,6 +438,7 @@ class Skill12(ActiveSkill): 转职为狂战士或阿修罗后,技能适用为独立攻击力。\n """ name = "裂波斩" + ref = Ref.VANESLASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -437,6 +474,7 @@ class Skill13(ActiveSkill): 转职为狂战士后,可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "崩山击" + ref = Ref.HOPSMASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -472,6 +510,7 @@ class Skill14(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -499,6 +538,7 @@ class Skill15(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -526,6 +566,7 @@ class Skill16(ActiveSkill): 若剑魂职业已学5级以上的[太刀精通]或[光剑精通],则可以发动7次连续攻击。\n """ name = "三段刃" + ref = Ref.TRIPLESLASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -569,6 +610,7 @@ class Skill17(PassiveSkill): """ name = '短剑精通' + ref = Ref.SHORTSWORDMASTERY cellPos = (0,3) learnLv = 15 masterLv = 30 @@ -616,15 +658,19 @@ class Skill17(PassiveSkill): # 命中率增加 : {value15}% data15 = get_data(f'{prefix}/{uuid}', 15) - def effect(self, old, new): - weapon = self.char.charEquipInfo['武器'].equInfo - if weapon is None or weapon.itemDetailType != '短剑': - return - data = self.data1 - if '传世武器' in weapon.categorize: - data = self.data14 - self.associate = [{'type': '$*PAtkM', 'data': data}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # weapon = self.char.charEquipInfo['武器'].equInfo + # if weapon is None or weapon.itemDetailType != '短剑': + # return + # data = self.data1 + # if '传世武器' in weapon.categorize: + # data = self.data14 + # self.associate = [{'type': '$*PAtkM', 'data': data}] + # return super().effect(old, new) + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data14), LevelTable(data1))), weapon=['短剑']), + ] # 太刀精通 # swordman_male/soul_bender/8f73f243041c2d27739fe7696f02bf9b @@ -642,6 +688,7 @@ class Skill18(PassiveSkill): """ name = '太刀精通' + ref = Ref.BLADEMASTERY cellPos = (1,3) learnLv = 15 masterLv = 30 @@ -682,15 +729,19 @@ class Skill18(PassiveSkill): # 命中率增加 : {value12}% data12 = get_data(f'{prefix}/{uuid}', 12) - def effect(self, old, new): - weapon = self.char.charEquipInfo['武器'].equInfo - if weapon is None or weapon.itemDetailType != '太刀': - return - data = self.data1 - if '传世武器' in weapon.categorize: - data = self.data11 - self.associate = [{'type': '$*PAtkM', 'data': data}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # weapon = self.char.charEquipInfo['武器'].equInfo + # if weapon is None or weapon.itemDetailType != '太刀': + # return + # data = self.data1 + # if '传世武器' in weapon.categorize: + # data = self.data11 + # self.associate = [{'type': '$*PAtkM', 'data': data}] + # return super().effect(old, new) + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data11), LevelTable(data1))), weapon=['太刀']), + ] # 巨剑精通 # swordman_male/soul_bender/8c2379737c5acc935c1731f67f607655 @@ -707,6 +758,7 @@ class Skill19(PassiveSkill): """ name = '巨剑精通' + ref = Ref.HEAVYSWORDMASTERY cellPos = (0,4) learnLv = 15 masterLv = 30 @@ -746,15 +798,19 @@ class Skill19(PassiveSkill): # 命中率增加 : {value11}% data11 = get_data(f'{prefix}/{uuid}', 11) - def effect(self, old, new): - weapon = self.char.charEquipInfo['武器'].equInfo - if weapon is None or weapon.itemDetailType != '巨剑': - return - data = self.data1 - if '传世武器' in weapon.categorize: - data = self.data10 - self.associate = [{'type': '$*PAtkM', 'data': data}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # weapon = self.char.charEquipInfo['武器'].equInfo + # if weapon is None or weapon.itemDetailType != '巨剑': + # return + # data = self.data1 + # if '传世武器' in weapon.categorize: + # data = self.data10 + # self.associate = [{'type': '$*PAtkM', 'data': data}] + # return super().effect(old, new) + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data10), LevelTable(data1))), weapon=['巨剑']), + ] # 钝器精通 # swordman_male/soul_bender/9cb6f9ed646fa87f9b7680a42ce83d1a @@ -771,6 +827,7 @@ class Skill20(PassiveSkill): """ name = '钝器精通' + ref = Ref.BLUNTMASTERY cellPos = (1,4) learnLv = 15 masterLv = 30 @@ -810,15 +867,19 @@ class Skill20(PassiveSkill): # 命中率增加 : {value11}% data11 = get_data(f'{prefix}/{uuid}', 11) - def effect(self, old, new): - weapon = self.char.charEquipInfo['武器'].equInfo - if weapon is None or weapon.itemDetailType != '钝器': - return - data = self.data1 - if '传世武器' in weapon.categorize: - data = self.data10 - self.associate = [{'type': '$*PAtkM', 'data': data}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # weapon = self.char.charEquipInfo['武器'].equInfo + # if weapon is None or weapon.itemDetailType != '钝器': + # return + # data = self.data1 + # if '传世武器' in weapon.categorize: + # data = self.data10 + # self.associate = [{'type': '$*PAtkM', 'data': data}] + # return super().effect(old, new) + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data10), LevelTable(data1))), weapon=['钝器']), + ] # 地裂 · 波动剑 # swordman_male/soul_bender/3d8f3d438405d79f8d3ed68072674d1e @@ -829,6 +890,7 @@ class Skill21(ActiveSkill): 转职为阿修罗后,可中断基本攻击使用\n """ name = "地裂 · 波动剑" + ref = Ref.NORMALWAVE learnLv = 15 masterLv = 60 maxLv = 70 @@ -857,6 +919,7 @@ class Skill22(PassiveSkill): """ name = '暗月降临' + ref = Ref.DARKTOLERANCEUP cellPos = (5,4) learnLv = 15 masterLv = 10 @@ -873,7 +936,11 @@ class Skill22(PassiveSkill): # 自身属性攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data1}] + # 迁移前实现(保留对照): + # associate = [{'data': data1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 封印解除 # swordman_male/soul_bender/27bade584bb42fef68148d3a0b72bace @@ -885,6 +952,7 @@ class Skill23(PassiveSkill): """ name = '封印解除' + ref = Ref.GHOSTPOWERUP cellPos = (2,4) learnLv = 15 masterLv = 10 @@ -903,7 +971,11 @@ class Skill23(PassiveSkill): # 施放速度增加 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '+lv', 'data': [0] + [1] * maxLv, 'skills': ['刀魂之卡赞', '冰霜之萨亚', '侵蚀之普戾蒙', '鬼斩', '瘟疫之罗刹', '冥炎之卡洛'], 'ratio': 1}] # noqa: E501 + # 迁移前实现(保留对照): + # associate = [{'type': '+lv', 'data': [0] + [1] * maxLv, 'skills': ['刀魂之卡赞', '冰霜之萨亚', '侵蚀之普戾蒙', '鬼斩', '瘟疫之罗刹', '冥炎之卡洛'], 'ratio': 1}] # noqa: E501 + associate = [ + SkillEffect(attribute=SkillAttribute.LEVEL, operation=Operation.ADD, value=LevelTable([0] + [1] * maxLv), skills=[Ref.KHAZAN, Ref.SAYA, Ref.BREMEN, Ref.HARDATTACK, Ref.EPIDEMICRASA, Ref.KALLA]), + ] # 侵蚀之普戾蒙 # swordman_male/soul_bender/01384bbfc346775d1267fa0bc4ca605f @@ -918,6 +990,7 @@ class Skill24(ActiveSkill): """ name = '侵蚀之普戾蒙' + ref = Ref.BREMEN cellPos = (6,4) learnLv = 15 masterLv = 1 @@ -945,7 +1018,11 @@ class Skill24(ActiveSkill): # [范围信息] # 效果范围 : {value5}px data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'data': data2}] + # 迁移前实现(保留对照): + # associate = [{'data': data2}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # 十字刃 # swordman_male/soul_bender/ca75c965f20a150f99f54155a37400df @@ -959,6 +1036,7 @@ class Skill25(ActiveSkill): 删除斩击和追加按键功能; 发动交叉斩击,向前方发射十字。\n """ name = "十字刃" + ref = Ref.GORECROSS learnLv = 15 masterLv = 60 maxLv = 70 @@ -1005,6 +1083,7 @@ class Skill26(ActiveSkill): """ name = '月光斩' + ref = Ref.MOONLIGHTSLASH cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -1055,6 +1134,7 @@ class Skill27(PassiveSkill): """ name = '暗之亲和' + ref = Ref.DARKFRIENDSHIP cellPos = (7,4) learnLv = 18 masterLv = 1 @@ -1082,6 +1162,7 @@ class Skill28(ActiveSkill): """ name = '残影之凯贾' + ref = Ref.GHOSTSTEP cellPos = (5,5) learnLv = 20 masterLv = 10 @@ -1142,6 +1223,7 @@ class Skill29(PassiveSkill): """ name = '满月斩' + ref = Ref.MOONLIGHTSLASHFULL cellPos = (4,5) learnLv = 20 masterLv = 1 @@ -1162,6 +1244,7 @@ class Skill30(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -1185,6 +1268,7 @@ class Skill31(ActiveSkill): """ name = '湮灭仪式' + ref = Ref.NECROMANTIC cellPos = (7,5) learnLv = 20 masterLv = 1 @@ -1211,6 +1295,7 @@ class Skill32(PassiveSkill): """ name = '鬼神解放' + ref = Ref.GHOSTSOULRELEASE cellPos = (2,5) learnLv = 20 masterLv = 1 @@ -1240,6 +1325,7 @@ class Skill33(PassiveSkill): """ name = '噬灵鬼斩' + ref = Ref.HARDATTACKCHARGE cellPos = (3,6) learnLv = 25 masterLv = 1 @@ -1260,7 +1346,11 @@ class Skill33(PassiveSkill): # [范围信息] # 噬灵鬼斩大小比率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data1, 'skills': ['鬼斩']}] # noqa: E501 + # 迁移前实现(保留对照): + # associate = [{'data': data1, 'skills': ['鬼斩']}] # noqa: E501 + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.HARDATTACK]), + ] # 嗜魂之手 # swordman_male/soul_bender/3829c15bf5f520c13998a3479ba0ce7b @@ -1276,6 +1366,7 @@ class Skill34(ActiveSkill): 学习[血气界限]后,血气喷发范围变更为全方位; 即使未抓住敌人,也可以生成血块后使其爆炸。\n """ name = "嗜魂之手" + ref = Ref.BLOODLUST learnLv = 25 masterLv = 60 maxLv = 70 @@ -1324,6 +1415,7 @@ class Skill35(ActiveSkill): """ name = '冰霜之萨亚' + ref = Ref.SAYA cellPos = (6,7) learnLv = 30 masterLv = 60 @@ -1365,6 +1457,7 @@ class Skill36(ActiveSkill): """ name = '鬼影鞭' + ref = Ref.GHOSTSIDEWIND cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -1405,6 +1498,7 @@ class Skill37(ActiveSkill): """ name = '死亡墓碑' + ref = Ref.TOMBSTONERAIN cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -1469,6 +1563,7 @@ class Skill38(ActiveSkill): """ name = '瘟疫之罗刹' + ref = Ref.EPIDEMICRASA cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1556,6 +1651,7 @@ class Skill39(ActiveSkill): """ name = '鬼影闪' + ref = Ref.GHOSTSTEPSLASH cellPos = (5,9) learnLv = 40 masterLv = 60 @@ -1610,6 +1706,7 @@ class Skill40(ActiveSkill): """ name = '鬼斩 : 狂怒' + ref = Ref.SLASHOFBOOM cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -1669,6 +1766,7 @@ class Skill41(ActiveSkill): """ name = '冥炎之卡洛' + ref = Ref.KALLA cellPos = (7,10) learnLv = 45 masterLv = 60 @@ -1715,6 +1813,7 @@ class Skill42(ActiveSkill): """ name = '冥炎剑' + ref = Ref.DARKFLAMESLASH cellPos = (7,11) learnLv = 45 masterLv = 1 @@ -1746,13 +1845,7 @@ class Skill42(ActiveSkill): # [冥炎剑]最后一击范围比率 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) - @property - def lv(self): - """技能等级""" - return self.char.GetSkillByName('冥炎之卡洛').lv - - @lv.setter - def lv(self, value): ... + level_source = Ref.KALLA def vp_1(self): """ @@ -1785,6 +1878,7 @@ class Skill43(PassiveSkill): """ name = '恐惧光环' + ref = Ref.DARKAURA cellPos = (2,11) learnLv = 48 masterLv = 40 @@ -1810,7 +1904,11 @@ class Skill43(PassiveSkill): data5 = get_data(f'{prefix}/{uuid}', 5) # 技能攻击力增加率 : {value6}% data6 = get_data(f'{prefix}/{uuid}', 6) - associate = [{'data': data6}] + # 迁移前实现(保留对照): + # associate = [{'data': data6}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data6))), + ] # 第7鬼神 : 怖拉修 # swordman_male/soul_bender/b8f4966608e4ebb3cc80ba4eac3649bb @@ -1826,6 +1924,7 @@ class Skill44(ActiveSkill): """ name = '第7鬼神 : 怖拉修' + ref = Ref.BLACHE cellPos = (8,11) learnLv = 50 masterLv = 40 @@ -1881,6 +1980,7 @@ class Skill45(ActiveSkill): """ name = '鬼斩 : 炼狱' + ref = Ref.SLASHOFHELL cellPos = (3,12) learnLv = 60 masterLv = 40 @@ -1945,6 +2045,7 @@ class Skill46(ActiveSkill): """ name = '冥祭之沼' + ref = Ref.TOMBSTONESWAMP cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -2009,6 +2110,7 @@ class Skill47(ActiveSkill): """ name = '幽魂之布雷德' + ref = Ref.BLADEPHANTOM cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -2080,6 +2182,7 @@ class Skill48(PassiveSkill): """ name = '御鬼之极' + ref = Ref.PHANTOMMASTERY cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -2093,7 +2196,11 @@ class Skill48(PassiveSkill): # 技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 幽魂降临 : 式 # swordman_male/soul_bender/96e72ec364dada85600c907ecd95a140 @@ -2106,6 +2213,7 @@ class Skill49(ActiveSkill): """ name = '幽魂降临 : 式' + ref = Ref.BLADEPHANTOMEX cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -2167,6 +2275,7 @@ class Skill50(ActiveSkill): """ name = '王者号令 : 吉格降临' + ref = Ref.ZIGADVENT cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -2224,6 +2333,7 @@ class Skill51(PassiveSkill): """ name = '鬼神冠冕' + ref = Ref.DEMONICCROWN cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -2237,7 +2347,11 @@ class Skill51(PassiveSkill): # 基本攻击力和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 鬼神剑·黄泉摆渡 # swordman_male/soul_bender/0dbdeaf846356f8b9380f8fbb8e97377 @@ -2248,6 +2362,7 @@ class Skill52(ActiveSkill): """ name = '鬼神剑·黄泉摆渡' + ref = Ref.GLUTTONYCREVASSE cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2291,6 +2406,7 @@ class Skill53(ActiveSkill): """ name = '黄泉之门 : 万鬼度灵' + ref = Ref.GHOSTGATE cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/swordman_male/weapon_master.py b/backend/core/character/GF/swordman_male/weapon_master.py index 17a82212..cfc39686 100644 --- a/backend/core/character/GF/swordman_male/weapon_master.py +++ b/backend/core/character/GF/swordman_male/weapon_master.py @@ -1,6 +1,11 @@ # 41f1cdc2ff58bb5fdc287be0db2a8df3 from core.basic.skill import PassiveSkill, ActiveSkill, get_data, characterLv from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, CharacterEffect, ExtraData, ExtraPower, LevelTable, Operation, + Percent, Power, Read, Select, SkillAttribute, SkillEffect, WeaponCategoryContains, +) +from core.character.refs.swordman_male.weapon_master import WeaponMasterSkillRef as Ref prefix = "swordman_male/weapon_master/cn/skillDetail" @@ -34,6 +39,7 @@ class Skill0(ActiveSkill): 无需蓄气,攻击时在原地发动斩击。 利用黄泉之力,生成幽魂之布雷德的气息。\n """ name = "鬼斩" + ref = Ref.HARDATTACK learnLv = 1 masterLv = 60 maxLv = 70 @@ -82,6 +88,7 @@ class Skill1(PassiveSkill): """ name = '疾影手' + ref = Ref.FASTEQUIP cellPos = (9,1) learnLv = 1 masterLv = 1 @@ -110,6 +117,7 @@ class Skill2(ActiveSkill): 转职为狂战士或阿修罗后,技能类型变为独立攻击力。\n """ name = "上挑" + ref = Ref.UPPERSLASH learnLv = 1 masterLv = 10 maxLv = 20 @@ -136,6 +144,7 @@ class Skill3(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -160,6 +169,7 @@ class Skill4(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) icon = '$common/$name' learnLv = 1 @@ -178,7 +188,11 @@ class Skill4(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 跳跃攻击力变化率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['里 · 鬼剑术', '空之连刃']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['里 · 鬼剑术', '空之连刃']}] + associate = [ + SkillEffect(value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0])), skills=[Ref.WEAPONCOMBO, Ref.JUMPATTACKMULTI]), + ] # 受身蹲伏 # swordman_male/weapon_master/ce26c6b69d02a440a81b552bec94f03b @@ -188,6 +202,7 @@ class Skill5(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -229,6 +244,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -251,6 +267,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -274,6 +291,7 @@ class Skill8(ActiveSkill): 按住技能键可以持续[格挡]动作,且魔法值只在[格挡]开始时消耗一次。\n """ name = "格挡" + ref = Ref.GUARD learnLv = 5 masterLv = 5 maxLv = 15 @@ -305,6 +323,7 @@ class Skill9(ActiveSkill): 突刺攻击会根据[基础精通]增加伤害。\n """ name = "连突刺" + ref = Ref.DASHATTACKMULTIHIT learnLv = 5 masterLv = 1 maxLv = 6 @@ -335,6 +354,7 @@ class Skill10(ActiveSkill): 若剑魂职业已学7级以上的[钝器精通],则可以增加冲击波大小。\n """ name = "银光落刃" + ref = Ref.ASHENFORK learnLv = 5 masterLv = 60 maxLv = 70 @@ -378,6 +398,7 @@ class Skill11(ActiveSkill): """ name = '空之连刃' + ref = Ref.JUMPATTACKMULTI cellPos = (10,2) learnLv = 5 masterLv = 1 @@ -419,6 +440,7 @@ class Skill12(ActiveSkill): 召唤功能消失,增加自身技能攻击力。 (可以添加到快捷栏,但无法使用)\n """ name = "刀魂之卡赞" + ref = Ref.KHAZAN learnLv = 5 masterLv = 10 maxLv = 20 @@ -456,6 +478,7 @@ class Skill13(ActiveSkill): 转职为狂战士或阿修罗后,技能适用为独立攻击力。\n """ name = "裂波斩" + ref = Ref.VANESLASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -491,6 +514,7 @@ class Skill14(ActiveSkill): 转职为狂战士后,可以强制中断基本攻击动作,并立即施放该技能。\n """ name = "崩山击" + ref = Ref.HOPSMASH learnLv = 10 masterLv = 60 maxLv = 70 @@ -526,6 +550,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -553,6 +578,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -586,6 +612,7 @@ class Skill17(PassiveSkill): """ name = '光剑精通' + ref = Ref.LIGHTSWORDMASTERY cellPos = (2,3) learnLv = 15 masterLv = 1 @@ -635,15 +662,19 @@ class Skill17(PassiveSkill): # 命中率增加 : {value18}% data18 = get_data(f'{prefix}/{uuid}', 18) - def effect(self, old, new): - weapon = self.char.GetWeaponType() - if weapon[0] != '光剑': - return None - data = self.data0 - if '传世武器' in weapon[1]: - data = self.data16 - self.associate = [{'type': '$*PAtkP', 'data': data}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # weapon = self.char.GetWeaponType() + # if weapon[0] != '光剑': + # return None + # data = self.data0 + # if '传世武器' in weapon[1]: + # data = self.data16 + # self.associate = [{'type': '$*PAtkP', 'data': data}] + # return super().effect(old, new) + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data16), LevelTable(data0))), weapon=['光剑']), + ] # 三段刃 # swordman_male/weapon_master/f2fb27162beb0b87a7cb9af7900e95f2 @@ -655,6 +686,7 @@ class Skill18(ActiveSkill): 若剑魂职业已学5级以上的[太刀精通]或[光剑精通],则可以发动7次连续攻击。\n """ name = '三段刃' + ref = Ref.TRIPLESLASH cellPos = (3,4) learnLv = 15 masterLv = 60 @@ -696,6 +728,7 @@ class Skill19(PassiveSkill): """ name = '短剑精通' + ref = Ref.SHORTSWORDMASTERY cellPos = (0,3) learnLv = 15 masterLv = 1 @@ -742,20 +775,27 @@ class Skill19(PassiveSkill): # 命中率增加 : {value15}% data15 = get_data(f'{prefix}/{uuid}', 15) - def effect(self, old, new): - weapon = self.char.GetWeaponType() - if weapon[0] != '短剑': - return None - data = self.data0 - if '传世武器' in weapon[1]: - data = self.data13 - self.associate = [ - {'type': '$*PAtkP', 'data': data}, - {'type': '+dataplus0', 'data': self.data3, 'skills': ['里 · 鬼剑术'], 'ratio': 1}, - {'type': '*skillDamage', 'data': self.data11, 'skills': ['破军升龙击']}, - {'type': '*skillDamage', 'data': self.data12, 'skills': ['猛龙断空斩']}, - ] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # weapon = self.char.GetWeaponType() + # if weapon[0] != '短剑': + # return None + # data = self.data0 + # if '传世武器' in weapon[1]: + # data = self.data13 + # self.associate = [ + # {'type': '$*PAtkP', 'data': data}, + # {'type': '+dataplus0', 'data': self.data3, 'skills': ['里 · 鬼剑术'], 'ratio': 1}, + # {'type': '*skillDamage', 'data': self.data11, 'skills': ['破军升龙击']}, + # {'type': '*skillDamage', 'data': self.data12, 'skills': ['猛龙断空斩']}, + # ] + # return super().effect(old, new) + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data13), LevelTable(data0))), weapon=['短剑']), + SkillEffect(attribute=ExtraData(0), operation=Operation.ADD, value=LevelTable(data3), skills=[Ref.WEAPONCOMBO], weapon=['短剑']), + SkillEffect(value=1 + Percent(LevelTable(data11)), skills=[Ref.CHARGECRASH], weapon=['短剑']), + SkillEffect(value=1 + Percent(LevelTable(data12)), skills=[Ref.RAPIDMOVESLASH], weapon=['短剑']), + ] # 太刀精通 # swordman_male/weapon_master/8f73f243041c2d27739fe7696f02bf9b @@ -773,6 +813,7 @@ class Skill20(ActiveSkill): """ name = '太刀精通' + ref = Ref.BLADEMASTERY cellPos = (1,3) learnLv = 15 masterLv = 1 @@ -813,18 +854,23 @@ class Skill20(ActiveSkill): # 命中率增加 : {value12}% data12 = get_data(f'{prefix}/{uuid}', 12) - def effect(self, old, new): - weapon = self.char.GetWeaponType() - if weapon[0] != '太刀': - return None - data = self.data0 - if '传世武器' in weapon[1]: - data = self.data10 - self.associate = [ - {'type': '$*PAtkP', 'data': data}, - {'type': '*power1', 'data': [i - 100 if i > 100 else 0 for i in self.data9], 'skills': ['空中连斩']}, - ] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # weapon = self.char.GetWeaponType() + # if weapon[0] != '太刀': + # return None + # data = self.data0 + # if '传世武器' in weapon[1]: + # data = self.data10 + # self.associate = [ + # {'type': '$*PAtkP', 'data': data}, + # {'type': '*power1', 'data': [i - 100 if i > 100 else 0 for i in self.data9], 'skills': ['空中连斩']}, + # ] + # return super().effect(old, new) + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data10), LevelTable(data0))), weapon=['太刀']), + SkillEffect(attribute=Power(1), value=1 + Percent(LevelTable([i - 100 if i > 100 else 0 for i in data9])), skills=[Ref.JUMPATTACKMULTI], weapon=['太刀']), + ] def getSkillData(self, lv=0): weapon = self.char.GetWeaponType() @@ -851,6 +897,7 @@ class Skill21(PassiveSkill): """ name = '巨剑精通' + ref = Ref.HEAVYSWORDMASTERY cellPos = (0,4) learnLv = 15 masterLv = 1 @@ -887,19 +934,25 @@ class Skill21(PassiveSkill): # 命中率增加 : {value11}% data11 = get_data(f'{prefix}/{uuid}', 11) - def effect(self, old, new): - weapon = self.char.GetWeaponType() - if weapon[0] != '巨剑': - return None - data = self.data0 - if '传世武器' in weapon[1]: - data = self.data9 - self.associate = [ - {'type': '$*PAtkP', 'data': data}, - {'type': '+dataplus0', 'data': self.data3, 'skills': ['里 · 鬼剑术'], 'ratio': 1}, - {'type': '+power12', 'data': [i - 100 if i > 100 else i for i in self.data8], 'skills': ['拔刀斩']}, - ] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # weapon = self.char.GetWeaponType() + # if weapon[0] != '巨剑': + # return None + # data = self.data0 + # if '传世武器' in weapon[1]: + # data = self.data9 + # self.associate = [ + # {'type': '$*PAtkP', 'data': data}, + # {'type': '+dataplus0', 'data': self.data3, 'skills': ['里 · 鬼剑术'], 'ratio': 1}, + # {'type': '+power12', 'data': [i - 100 if i > 100 else i for i in self.data8], 'skills': ['拔刀斩']}, + # ] + # return super().effect(old, new) + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data9), LevelTable(data0))), weapon=['巨剑']), + SkillEffect(attribute=ExtraData(0), operation=Operation.ADD, value=LevelTable(data3), skills=[Ref.WEAPONCOMBO], weapon=['巨剑']), + SkillEffect(attribute=Power(12), operation=Operation.ADD, value=Percent(LevelTable([i - 100 if i > 100 else i for i in data8])), skills=[Ref.MOMENTARYSLASH], weapon=['巨剑']), + ] # 钝器精通 # swordman_male/weapon_master/9cb6f9ed646fa87f9b7680a42ce83d1a @@ -916,6 +969,7 @@ class Skill22(PassiveSkill): """ name = '钝器精通' + ref = Ref.BLUNTMASTERY cellPos = (1,4) learnLv = 15 masterLv = 1 @@ -952,17 +1006,21 @@ class Skill22(PassiveSkill): # 命中率增加 : {value11}% data11 = get_data(f'{prefix}/{uuid}', 11) - def effect(self, old, new): - weapon = self.char.GetWeaponType() - if weapon[0] != '钝器': - return None - data = self.data0 - if '传世武器' in weapon[1]: - data = self.data9 - self.associate = [ - {'type': '$*PAtkP', 'data': data}, - ] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # weapon = self.char.GetWeaponType() + # if weapon[0] != '钝器': + # return None + # data = self.data0 + # if '传世武器' in weapon[1]: + # data = self.data9 + # self.associate = [ + # {'type': '$*PAtkP', 'data': data}, + # ] + # return super().effect(old, new) + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable(data9), LevelTable(data0))), weapon=['钝器']), + ] # 地裂 · 波动剑 # swordman_male/weapon_master/3d8f3d438405d79f8d3ed68072674d1e @@ -973,6 +1031,7 @@ class Skill23(ActiveSkill): 转职为阿修罗后,可中断基本攻击使用\n """ name = "地裂 · 波动剑" + ref = Ref.NORMALWAVE learnLv = 15 masterLv = 60 maxLv = 70 @@ -1002,6 +1061,7 @@ class Skill24(PassiveSkill): """ name = '武器奥义' + ref = Ref.WEAPONMASTERYUP cellPos = (2,4) learnLv = 15 masterLv = 20 @@ -1010,7 +1070,14 @@ class Skill24(PassiveSkill): rangeLv = 3 uuid = '8ee0099656df08a0b39225f8a21d514b' - associate = [{'type': '+lv', 'data': [i + 1 if i > 0 else i for i in range(0, maxLv + 2)], 'ratio': 1, 'skills': ['光剑精通', '钝器精通', '太刀精通', '巨剑精通', '短剑精通']}] + # 迁移前实现(保留对照): + # associate = [{'type': '+lv', 'data': [i + 1 if i > 0 else i for i in range(0, maxLv + 2)], 'ratio': 1, 'skills': ['光剑精通', '钝器精通', '太刀精通', '巨剑精通', '短剑精通']}] + associate = [ + SkillEffect( + attribute=SkillAttribute.LEVEL, operation=Operation.ADD, value=Read(SkillAttribute.LEVEL) + 1, + skills=[Ref.LIGHTSWORDMASTERY, Ref.BLUNTMASTERY, Ref.BLADEMASTERY, Ref.HEAVYSWORDMASTERY, Ref.SHORTSWORDMASTERY], + ), + ] # 光剑掌握 @@ -1023,6 +1090,7 @@ class Skill25(PassiveSkill): """ name = '光剑掌握' + ref = Ref.EQUIPLIGHTSWORD cellPos = (9,3) learnLv = 15 masterLv = 10 @@ -1036,8 +1104,12 @@ class Skill25(PassiveSkill): # 装备光剑时,攻击速度增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*cdReduce', 'data': data0, 'exceptSkills': ['极 · 鬼剑术 (暴风式)', '万剑归宗', '万剑极诣·开天斩']}, + # ] associate = [ - {'type': '*cdReduce', 'data': data0, 'exceptSkills': ['极 · 鬼剑术 (暴风式)', '万剑归宗', '万剑极诣·开天斩']}, + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data0)), except_skills=[Ref.HUNDREDSWORD, Ref.HANDLINGSWORD, Ref.CERTAINEXTERMINATION]), ] # 后跳斩 @@ -1049,6 +1121,7 @@ class Skill26(ActiveSkill): 学习[极·神剑术]后,发动剑气。\n """ name = "后跳斩" + ref = Ref.BACKSTEPCUTTER learnLv = 15 masterLv = 1 maxLv = 1 @@ -1075,6 +1148,7 @@ class Skill27(ActiveSkill): 删除斩击和追加按键功能; 发动交叉斩击,向前方发射十字。\n """ name = "十字刃" + ref = Ref.GORECROSS learnLv = 15 masterLv = 60 maxLv = 70 @@ -1116,6 +1190,7 @@ class Skill28(ActiveSkill): """ name = '里 · 鬼剑术' + ref = Ref.WEAPONCOMBO cellPos = (4,4) learnLv = 15 masterLv = 1 @@ -1171,6 +1246,7 @@ class Skill29(ActiveSkill): 制造月亮并用斩击将鬼气注入到月亮之中,然后破坏黑月攻击敌人。 破坏黑月时使敌人进入失明状态。 删除追加按键功能。\n """ name = "月光斩" + ref = Ref.MOONLIGHTSLASH learnLv = 15 masterLv = 60 maxLv = 70 @@ -1222,6 +1298,7 @@ class Skill30(ActiveSkill): """ name = '流心' + ref = Ref.FLOWMIND cellPos = (6,5) learnLv = 20 masterLv = 1 @@ -1252,6 +1329,7 @@ class Skill31(ActiveSkill): """ name = '流心 : 刺' + ref = Ref.FLOWMINDONE cellPos = (4,6) learnLv = 20 masterLv = 60 @@ -1317,6 +1395,7 @@ class Skill32(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -1340,6 +1419,7 @@ class Skill33(PassiveSkill): """ name = '无我剑气' + ref = Ref.FARTHERHIT cellPos = (9,5) learnLv = 20 masterLv = 5 @@ -1350,7 +1430,11 @@ class Skill33(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(value=1 + Percent(LevelTable(data0))), + ] # 自动格挡 # swordman_male/weapon_master/0969cd4054d93da07708108c0cc1c4b5 @@ -1362,6 +1446,7 @@ class Skill34(ActiveSkill): 自动格挡时,在地下城进入霸体状态,效果持续一定时间。\n """ name = "自动格挡" + ref = Ref.AUTOGUARD learnLv = 25 masterLv = 10 maxLv = 20 @@ -1398,6 +1483,7 @@ class Skill35(ActiveSkill): 学习[血气界限]后,血气喷发范围变更为全方位; 即使未抓住敌人,也可以生成血块后使其爆炸。\n """ name = "嗜魂之手" + ref = Ref.BLOODLUST learnLv = 25 masterLv = 60 maxLv = 70 @@ -1444,6 +1530,7 @@ class Skill36(ActiveSkill): """ name = '破极兵刃' + ref = Ref.OVERDRIVE cellPos = (2,6) learnLv = 25 masterLv = 10 @@ -1480,6 +1567,7 @@ class Skill37(ActiveSkill): """ name = '流心 : 跃' + ref = Ref.FLOWMINDTWO cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -1543,6 +1631,7 @@ class Skill38(ActiveSkill): """ name = '逆转反击' + ref = Ref.HITBACK cellPos = (2,7) learnLv = 30 masterLv = 20 @@ -1577,6 +1666,7 @@ class Skill39(ActiveSkill): """ name = '破军升龙击' + ref = Ref.CHARGECRASH cellPos = (4,7) learnLv = 30 masterLv = 60 @@ -1650,6 +1740,7 @@ class Skill40(ActiveSkill): """ name = '流心 : 升' + ref = Ref.FLOWMINDTHREE cellPos = (7,7) learnLv = 30 masterLv = 60 @@ -1707,6 +1798,7 @@ class Skill41(ActiveSkill): """ name = '流心 : 狂' + ref = Ref.FLOWMINDPOWERUP cellPos = (6,7) learnLv = 30 masterLv = 10 @@ -1727,7 +1819,11 @@ class Skill41(ActiveSkill): # 物理暴击率增加 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'type': '*skillDamage', 'data': data2, 'skills': ['流心 : 升', '流心 : 刺', '流心 : 跃']}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data2, 'skills': ['流心 : 升', '流心 : 刺', '流心 : 跃']}] + associate = [ + SkillEffect(value=1 + Percent(LevelTable(data2)), skills=[Ref.FLOWMINDTHREE, Ref.FLOWMINDONE, Ref.FLOWMINDTWO]), + ] def getWeaponCDRatio(self): return 1.0 @@ -1748,6 +1844,7 @@ class Skill42(ActiveSkill): """ name = '拔刀斩' + ref = Ref.MOMENTARYSLASH cellPos = (5,8) learnLv = 35 masterLv = 60 @@ -1837,6 +1934,7 @@ class Skill43(ActiveSkill): """ name = '猛龙断空斩' + ref = Ref.RAPIDMOVESLASH cellPos = (3,9) learnLv = 40 masterLv = 60 @@ -1905,6 +2003,7 @@ class Skill44(ActiveSkill): """ name = '破军斩龙击' + ref = Ref.CHARGEBURST cellPos = (4,9) learnLv = 40 masterLv = 60 @@ -1992,6 +2091,7 @@ class Skill45(ActiveSkill): """ name = '幻影剑舞' + ref = Ref.ILLUSIONSLASH cellPos = (6,10) learnLv = 45 masterLv = 60 @@ -2118,6 +2218,7 @@ class Skill46(PassiveSkill): """ name = '极 · 鬼剑术 (斩铁式)' + ref = Ref.DEFENSEDOWNONCRITICAL cellPos = (4,11) learnLv = 48 masterLv = 40 @@ -2132,7 +2233,11 @@ class Skill46(PassiveSkill): # 基本攻击力和技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(value=1 + Percent(LevelTable(data0))), + ] # 极 · 鬼剑术 (暴风式) # swordman_male/weapon_master/4f2e001e9a19eb7bae50ad1840dfb329 @@ -2146,6 +2251,7 @@ class Skill47(ActiveSkill): """ name = '极 · 鬼剑术 (暴风式)' + ref = Ref.HUNDREDSWORD cellPos = (6,11) learnLv = 50 masterLv = 40 @@ -2174,7 +2280,11 @@ class Skill47(ActiveSkill): # 压制力 (4人队伍) : {value4}秒 ({value5}秒) data4 = get_data(f'{prefix}/{uuid}', 4) data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'type': '*skillDamage', 'data': data3, 'skills': [name]}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data3, 'skills': [name]}] + associate = [ + SkillEffect(value=1 + Percent(LevelTable(data3)), skills=[Ref.HUNDREDSWORD]), + ] # 极 · 神剑术 (流星落) # swordman_male/weapon_master/0c262dac3ec41ff79e359ada9c7a7faf @@ -2193,6 +2303,7 @@ class Skill48(ActiveSkill): """ name = '极 · 神剑术 (流星落)' + ref = Ref.METEORSWORD cellPos = (3,12) learnLv = 60 masterLv = 40 @@ -2285,6 +2396,7 @@ class Skill49(ActiveSkill): """ name = '破空拔刀斩' + ref = Ref.MOMENTARYSLASHEX cellPos = (5,13) learnLv = 70 masterLv = 40 @@ -2366,6 +2478,7 @@ class Skill50(PassiveSkill): """ name = '神影手' + ref = Ref.MYSTICEQUIP cellPos = (10,13) learnLv = 70 masterLv = 1 @@ -2404,6 +2517,7 @@ class Skill51(ActiveSkill): """ name = '极 · 神剑术 (破空斩)' + ref = Ref.SWORDOFMIND cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -2511,6 +2625,7 @@ class Skill52(PassiveSkill): """ name = '极 · 神剑术' + ref = Ref.STATEOFLIMIT cellPos = (4,13) learnLv = 75 masterLv = 40 @@ -2577,18 +2692,32 @@ class Skill52(PassiveSkill): # 攻击力 : [极 · 神剑术 (破空斩)]爆炸攻击力的{value23}% data23 = get_data(f'{prefix}/{uuid}', 23) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '*skillDamage', 'data': data0, 'skills': ['拔刀斩', '破军斩龙击', '极 · 鬼剑术 (暴风式)', '破空拔刀斩', '极 · 神剑术 (瞬斩)', '万剑归宗', '极 · 神剑术 (无形斩)', '万剑极诣·开天斩']}, + # {'type': '+power13', 'data': data2, 'skills': ['破军升龙击']}, + # {'type': '+power4', 'data': data3, 'skills': ['猛龙断空斩']}, + # {'type': '+power18', 'data': data4, 'skills': ['幻影剑舞']}, + # {'type': '+power19', 'data': data5, 'skills': ['幻影剑舞']}, + # {'type': '+power20', 'data': data6, 'skills': ['幻影剑舞'], 'weapon': ['钝器']}, + # {'type': '+dataplus0', 'data': data7, 'skills': ['极 · 神剑术 (流星落)'], 'ratio': 1}, + # {'type': '+dataplus1', 'data': data15, 'skills': ['极 · 神剑术 (流星落)'], 'weapon': ['光剑'], 'ratio': 1}, + # {'type': '*powerplus0', 'data': data19, 'skills': ['极 · 神剑术 (流星落)'], 'weapon': ['巨剑']}, + # {'type': '+dataplus1', 'data': data20, 'skills': ['极 · 神剑术 (流星落)'], 'weapon': ['钝器'], 'ratio': 1}, + # {'type': '*power2', 'data': data23, 'skills': ['极 · 神剑术 (破空斩)']}, + # ] associate = [ - {'type': '*skillDamage', 'data': data0, 'skills': ['拔刀斩', '破军斩龙击', '极 · 鬼剑术 (暴风式)', '破空拔刀斩', '极 · 神剑术 (瞬斩)', '万剑归宗', '极 · 神剑术 (无形斩)', '万剑极诣·开天斩']}, - {'type': '+power13', 'data': data2, 'skills': ['破军升龙击']}, - {'type': '+power4', 'data': data3, 'skills': ['猛龙断空斩']}, - {'type': '+power18', 'data': data4, 'skills': ['幻影剑舞']}, - {'type': '+power19', 'data': data5, 'skills': ['幻影剑舞']}, - {'type': '+power20', 'data': data6, 'skills': ['幻影剑舞'], 'weapon': ['钝器']}, - {'type': '+dataplus0', 'data': data7, 'skills': ['极 · 神剑术 (流星落)'], 'ratio': 1}, - {'type': '+dataplus1', 'data': data15, 'skills': ['极 · 神剑术 (流星落)'], 'weapon': ['光剑'], 'ratio': 1}, - {'type': '*powerplus0', 'data': data19, 'skills': ['极 · 神剑术 (流星落)'], 'weapon': ['巨剑']}, - {'type': '+dataplus1', 'data': data20, 'skills': ['极 · 神剑术 (流星落)'], 'weapon': ['钝器'], 'ratio': 1}, - {'type': '*power2', 'data': data23, 'skills': ['极 · 神剑术 (破空斩)']}, + SkillEffect(value=1 + Percent(LevelTable(data0)), skills=[Ref.MOMENTARYSLASH, Ref.CHARGEBURST, Ref.HUNDREDSWORD, Ref.MOMENTARYSLASHEX, Ref.FLASHCUT, Ref.HANDLINGSWORD, Ref.INVISIBLESWORDCUT, Ref.CERTAINEXTERMINATION]), + SkillEffect(attribute=Power(13), operation=Operation.ADD, value=Percent(LevelTable(data2)), skills=[Ref.CHARGECRASH]), + SkillEffect(attribute=Power(4), operation=Operation.ADD, value=Percent(LevelTable(data3)), skills=[Ref.RAPIDMOVESLASH]), + SkillEffect(attribute=Power(18), operation=Operation.ADD, value=Percent(LevelTable(data4)), skills=[Ref.ILLUSIONSLASH]), + SkillEffect(attribute=Power(19), operation=Operation.ADD, value=Percent(LevelTable(data5)), skills=[Ref.ILLUSIONSLASH]), + SkillEffect(attribute=Power(20), operation=Operation.ADD, value=Percent(LevelTable(data6)), skills=[Ref.ILLUSIONSLASH], weapon=['钝器']), + SkillEffect(attribute=ExtraData(0), operation=Operation.ADD, value=LevelTable(data7), skills=[Ref.METEORSWORD]), + SkillEffect(attribute=ExtraData(1), operation=Operation.ADD, value=LevelTable(data15), skills=[Ref.METEORSWORD], weapon=['光剑']), + SkillEffect(attribute=ExtraPower(0), value=1 + Percent(LevelTable(data19)), skills=[Ref.METEORSWORD], weapon=['巨剑']), + SkillEffect(attribute=ExtraData(1), operation=Operation.ADD, value=LevelTable(data20), skills=[Ref.METEORSWORD], weapon=['钝器']), + SkillEffect(attribute=Power(2), value=1 + Percent(LevelTable(data23)), skills=[Ref.SWORDOFMIND]), ] # 极 · 神剑术 (瞬斩) @@ -2601,6 +2730,7 @@ class Skill53(ActiveSkill): """ name = '极 · 神剑术 (瞬斩)' + ref = Ref.FLASHCUT cellPos = (5,14) learnLv = 80 masterLv = 40 @@ -2662,6 +2792,7 @@ class Skill54(ActiveSkill): """ name = '万剑归宗' + ref = Ref.HANDLINGSWORD cellPos = (4,14) learnLv = 85 masterLv = 40 @@ -2735,6 +2866,7 @@ class Skill55(PassiveSkill): """ name = '无形剑意' + ref = Ref.STATEOFINVISIBLESWORD cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -2784,7 +2916,11 @@ class Skill55(PassiveSkill): data18 = get_data(f'{prefix}/{uuid}', 18) # 对流系技能存在技能形态变动,但是实际加成和其他技能一致,这里简单化处理 - associate = [{'type': '*skillDamage', 'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'type': '*skillDamage', 'data': data0}] + associate = [ + SkillEffect(value=1 + Percent(LevelTable(data0))), + ] # 极 · 神剑术 (无形斩) # swordman_male/weapon_master/0113c8b1306ca76d208f83f2d093dd62 @@ -2796,6 +2932,7 @@ class Skill56(ActiveSkill): """ name = '极 · 神剑术 (无形斩)' + ref = Ref.INVISIBLESWORDCUT cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2834,6 +2971,7 @@ class Skill57(ActiveSkill): """ name = '万剑极诣·开天斩' + ref = Ref.CERTAINEXTERMINATION cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/thief/kunoichi.py b/backend/core/character/GF/thief/kunoichi.py index 8d41f322..b2394ed7 100644 --- a/backend/core/character/GF/thief/kunoichi.py +++ b/backend/core/character/GF/thief/kunoichi.py @@ -1,6 +1,24 @@ # ddc49e9ad1ff72a00b53c6cff5b1e920 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Operation, + Percent, + ProfessionAttribute, + SkillAttribute, + SkillEffect, +) +from core.character.refs.thief.kunoichi import KunoichiSkillRef as Ref + + +class KunoichiAttribute(ProfessionAttribute): + """本职业专用的最终效果属性;字段含义与技能实现保持一致。""" + NINPOU = 'ninpou' + """忍者:六道轮回记录技能的伤害倍率。""" + prefix = "thief/kunoichi/cn/skillDetail" @@ -20,6 +38,7 @@ class Skill0(ActiveSkill): 可消耗连击点数发动[终结之击]。\n """ name = "翔击" + ref = Ref.RISINGCUT learnLv = 1 masterLv = 10 maxLv = 20 @@ -54,6 +73,7 @@ class Skill1(ActiveSkill): """ name = '投掷苦无' + ref = Ref.SHURIKEN cellPos = (3,1) learnLv = 1 masterLv = 60 @@ -91,6 +111,7 @@ class Skill2(PassiveSkill): """ name = '苦无掌握' + ref = Ref.EQUIPCHAKRAWEAPON cellPos = (5,1) learnLv = 1 masterLv = 1 @@ -113,6 +134,7 @@ class Skill3(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -137,6 +159,7 @@ class Skill4(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -164,6 +187,7 @@ class Skill5(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -205,6 +229,7 @@ class Skill6(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -227,6 +252,7 @@ class Skill7(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -250,6 +276,7 @@ class Skill8(ActiveSkill): 攻击力、 攻击范围、 前进速度和前进距离随技能等级增加而增大。\n """ name = "切割" + ref = Ref.SLICER learnLv = 5 masterLv = 1 maxLv = 6 @@ -281,6 +308,7 @@ class Skill9(ActiveSkill): """ name = '焰刃' + ref = Ref.FLAMECUT cellPos = (6,2) learnLv = 5 masterLv = 60 @@ -315,6 +343,7 @@ class Skill10(ActiveSkill): 在决斗场中,无法强制控制敌人,但是相比其他暗夜使者,可以使敌人进入更长时间的僵直状态。\n """ name = "影袭" + ref = Ref.SHADOWCUT learnLv = 5 masterLv = 60 maxLv = 70 @@ -352,6 +381,7 @@ class Skill11(ActiveSkill): 在决斗场中,地图内球体的存在时间减少。\n """ name = "暗魂波" + ref = Ref.DARKSOUL learnLv = 5 masterLv = 60 maxLv = 70 @@ -394,6 +424,7 @@ class Skill12(ActiveSkill): 可以利用方向键调整移动方向。\n """ name = "弧光闪" + ref = Ref.SHININGCUT learnLv = 10 masterLv = 60 maxLv = 70 @@ -431,6 +462,7 @@ class Skill13(ActiveSkill): 在决斗场中,不适用持续时间减少和霸体护甲效果,施放技能时减少所受伤害。\n """ name = "骨盾" + ref = Ref.BONESHIELD learnLv = 10 masterLv = 5 maxLv = 7 @@ -474,6 +506,7 @@ class Skill14(ActiveSkill): """ name = '忍法 : 影分身' + ref = Ref.SKINTAKEOFF cellPos = (4,3) learnLv = 10 masterLv = 40 @@ -510,6 +543,7 @@ class Skill15(ActiveSkill): 被扫腿踢命中的敌人将受到无属性物理伤害,且有一定几率进入减速状态。\n """ name = "碎踝" + ref = Ref.ANKLECUT learnLv = 10 masterLv = 60 maxLv = 70 @@ -545,6 +579,7 @@ class Skill16(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -572,6 +607,7 @@ class Skill17(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -601,6 +637,7 @@ class Skill18(ActiveSkill): 连续踢击过程中连续按下攻击键时,会增加连续踢击的速度和命中次数。\n """ name = "疾空踏" + ref = Ref.DIVINGARROW learnLv = 15 masterLv = 60 maxLv = 70 @@ -640,6 +677,7 @@ class Skill19(ActiveSkill): """ name = '忍法 : 飞鼠' + ref = Ref.FLYINGSQUIRREL cellPos = (8,4) learnLv = 15 masterLv = 60 @@ -680,6 +718,7 @@ class Skill20(ActiveSkill): 若[天诛]背击敌人时,则会追加一次刺击,且最后还会追加一次高伤害的切割攻击。\n """ name = "天诛" + ref = Ref.ERASER learnLv = 15 masterLv = 60 maxLv = 70 @@ -711,6 +750,7 @@ class Skill21(ActiveSkill): 召唤暗属性的诅咒之箭后,向前方敌人发射; 被诅咒之箭命中的敌人会受到暗属性多段魔法伤害,并有一定几率进入诅咒状态。\n """ name = "诅咒之箭" + ref = Ref.CURSESPEAR learnLv = 15 masterLv = 60 maxLv = 70 @@ -748,6 +788,7 @@ class Skill22(PassiveSkill): """ name = '忍术精通' + ref = Ref.NINJUTSU cellPos = (4,4) learnLv = 15 masterLv = 1 @@ -763,7 +804,11 @@ class Skill22(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 忍术技能冷却时间减少率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data1, 'type': '*cdReduce', 'skills': ['火遁·豪火球之术', '忍法 : 幻影手里剑', '火遁·飓风煞', '火遁·螺旋手里剑', '火遁·炎天道', '火遁·蟾蜍油炎弹', '火遁·炎舞天璇', '火遁·风魔手里剑', '八岐大蛇', '天照']}] # noqa: E501 + # 迁移前实现(保留对照): + # associate = [{'data': data1, 'type': '*cdReduce', 'skills': ['火遁·豪火球之术', '忍法 : 幻影手里剑', '火遁·飓风煞', '火遁·螺旋手里剑', '火遁·炎天道', '火遁·蟾蜍油炎弹', '火遁·炎舞天璇', '火遁·风魔手里剑', '八岐大蛇', '天照']}] # noqa: E501 + associate = [ + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data1)), skills=[Ref.FLAMEBALL, Ref.ILUSIONSHURIKEN, Ref.FLAMETORNADO, Ref.BIGKUNAI, Ref.SKYROADS, Ref.GASOLINEFIRE, Ref.FLAMEFLOWER, Ref.FUUMASHURIKEN, Ref.YAMATAOROCHI, Ref.AMATERAS]), + ] # 火遁·豪火球之术 # thief/kunoichi/dcb31a63ef58954f44ff2070c42a9a98 @@ -777,6 +822,7 @@ class Skill23(ActiveSkill): """ name = '火遁·豪火球之术' + ref = Ref.FLAMEBALL cellPos = (6,4) learnLv = 15 masterLv = 60 @@ -832,6 +878,7 @@ class Skill24(ActiveSkill): """ name = '空跃' + ref = Ref.AERIALJUMP cellPos = (1,5) learnLv = 20 masterLv = 1 @@ -856,6 +903,7 @@ class Skill25(ActiveSkill): """ name = '火遁·红莲' + ref = Ref.FIREHIDE cellPos = (6,5) learnLv = 20 masterLv = 10 @@ -889,6 +937,7 @@ class Skill26(ActiveSkill): """ name = '忍法 : 幻影手里剑' + ref = Ref.ILUSIONSHURIKEN cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -939,6 +988,7 @@ class Skill27(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -966,6 +1016,7 @@ class Skill28(ActiveSkill): """ name = '忍法 : 原木分身术' + ref = Ref.WOODMOVE cellPos = (7,5) learnLv = 20 masterLv = 1 @@ -996,6 +1047,7 @@ class Skill29(ActiveSkill): """ name = '火遁·飓风煞' + ref = Ref.FLAMETORNADO cellPos = (6,6) learnLv = 25 masterLv = 60 @@ -1048,6 +1100,7 @@ class Skill30(PassiveSkill): """ name = '苦无精通' + ref = Ref.SHURIKENIMPROVE cellPos = (3,6) learnLv = 25 masterLv = 10 @@ -1066,7 +1119,11 @@ class Skill30(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # 基本攻击投掷出苦无的几率 : {value2}% data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0, 'type': '$*PAtkM'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '$*PAtkM'}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_M, value=1 + Percent(LevelTable(data0))), + ] # 烈焰印记 # thief/kunoichi/374f53e8989ef04a8506c8ec99d9ecdc @@ -1082,6 +1139,7 @@ class Skill31(PassiveSkill): """ name = '烈焰印记' + ref = Ref.MARKOFFLAME cellPos = (5,6) learnLv = 25 masterLv = 10 @@ -1101,7 +1159,11 @@ class Skill31(PassiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 灼伤持续时间 : {value3}秒 data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 火遁·螺旋手里剑 # thief/kunoichi/7e904ea3d2a9faa054604e55120a9268 @@ -1116,6 +1178,7 @@ class Skill32(ActiveSkill): """ name = '火遁·螺旋手里剑' + ref = Ref.BIGKUNAI cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -1168,6 +1231,7 @@ class Skill33(ActiveSkill): """ name = '忍法 : 残影术' + ref = Ref.LEAVETRACE cellPos = (5,8) learnLv = 35 masterLv = 1 @@ -1190,7 +1254,11 @@ class Skill33(ActiveSkill): # 决斗场前置冷却时间 : {value3}秒 data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': [i - 100 if i > 0 else 0 for i in data0]}] + # 迁移前实现(保留对照): + # associate = [{'data': [i - 100 if i > 0 else 0 for i in data0]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([i - 100 if i > 0 else 0 for i in data0]))), + ] # 火遁·炎天道 # thief/kunoichi/5152480fdde81362575a488d4cec4af9 @@ -1201,6 +1269,7 @@ class Skill34(ActiveSkill): """ name = '火遁·炎天道' + ref = Ref.SKYROADS cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -1300,6 +1369,7 @@ class Skill35(ActiveSkill): """ name = '忍法 : 替身术' + ref = Ref.MIGAWARI cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -1364,6 +1434,7 @@ class Skill36(ActiveSkill): """ name = '忍法 : 六道轮回' + ref = Ref.DEITIESREBIRTH cellPos = (5,9) learnLv = 40 masterLv = 1 @@ -1390,7 +1461,11 @@ class Skill36(ActiveSkill): # 范围 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{'data': data1, 'type': '+ninpou'}] # noqa: E501 + # 迁移前实现(保留对照): + # associate = [{'data': data1, 'type': '+ninpou'}] # noqa: E501 + associate = [ + SkillEffect(attribute=KunoichiAttribute.NINPOU, operation=Operation.ADD, value=Percent(LevelTable(data1))), + ] # 火遁·蟾蜍油炎弹 # thief/kunoichi/fc458e449ee00b01dbf88d09aae65462 @@ -1406,6 +1481,7 @@ class Skill37(ActiveSkill): """ name = '火遁·蟾蜍油炎弹' + ref = Ref.GASOLINEFIRE cellPos = (7,9) learnLv = 40 masterLv = 60 @@ -1495,6 +1571,7 @@ class Skill38(ActiveSkill): """ name = '火遁·炎舞天璇' + ref = Ref.FLAMEFLOWER cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1566,6 +1643,7 @@ class Skill39(PassiveSkill): """ name = '暗炎残星' + ref = Ref.KUROKAGENOJUTSU cellPos = (3,10) learnLv = 45 masterLv = 1 @@ -1581,7 +1659,11 @@ class Skill39(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 追踪标记持续时间 : {value1}秒 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 毕方之印 # thief/kunoichi/2c9d9a36c8401bddff6cdb80fab8dc24 @@ -1596,6 +1678,7 @@ class Skill40(ActiveSkill): """ name = '毕方之印' + ref = Ref.FIREMARK cellPos = (7,11) learnLv = 48 masterLv = 40 @@ -1637,7 +1720,11 @@ class Skill40(ActiveSkill): data11 = get_data(f'{prefix}/{uuid}', 11) hit11 = 1 - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] def getSkillCD(self, mode=None): return 1.0 @@ -1652,6 +1739,7 @@ class Skill41(ActiveSkill): """ name = '火遁·冥炎业火阵' + ref = Ref.DOOMFIELD cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1700,6 +1788,7 @@ class Skill42(ActiveSkill): """ name = '忍法 : 飞燕手里剑' + ref = Ref.FLYINGSWALLOW cellPos = (3,12) learnLv = 60 masterLv = 40 @@ -1807,6 +1896,7 @@ class Skill43(ActiveSkill): """ name = '火遁·风魔手里剑' + ref = Ref.FUUMASHURIKEN cellPos = (7,13) learnLv = 70 masterLv = 40 @@ -1889,6 +1979,7 @@ class Skill44(PassiveSkill): """ name = '八咫镜' + ref = Ref.MIRROROFYATA cellPos = (8,13) learnLv = 75 masterLv = 40 @@ -1909,7 +2000,11 @@ class Skill44(PassiveSkill): # [忍法 : 六道轮回]强化残影攻击速度增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"data": data0}] + # 迁移前实现(保留对照): + # associate = [{"data": data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 八岐大蛇 # thief/kunoichi/147d005ac868e0de52b1f255eea35d62 @@ -1922,6 +2017,7 @@ class Skill45(ActiveSkill): """ name = '八岐大蛇' + ref = Ref.YAMATAOROCHI cellPos = (4,13) learnLv = 75 masterLv = 40 @@ -2002,6 +2098,7 @@ class Skill46(PassiveSkill): """ name = '八尺琼勾玉' + ref = Ref.KURVEJADE cellPos = (5,13) learnLv = 75 masterLv = 1 @@ -2033,6 +2130,7 @@ class Skill47(ActiveSkill): """ name = '天照' + ref = Ref.AMATERAS cellPos = (4,14) learnLv = 80 masterLv = 40 @@ -2064,7 +2162,11 @@ class Skill47(ActiveSkill): # 锁定敌人范围 : {value5}px data5 = get_data(f'{prefix}/{uuid}', 5) - associate = [{'data': data4, 'skills': ['天照']}] + # 迁移前实现(保留对照): + # associate = [{'data': data4, 'skills': ['天照']}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data4)), skills=[Ref.AMATERAS]), + ] mode = ['普通', '六道'] @@ -2112,6 +2214,7 @@ class Skill48(ActiveSkill): """ name = '火炎灼空 : 草雉剑' + ref = Ref.SWORDOFKUSANAGI cellPos = (7,14) learnLv = 85 masterLv = 40 @@ -2191,6 +2294,7 @@ class Skill49(PassiveSkill): """ name = '三元刹' + ref = Ref.CHAKRATRINITY cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -2206,7 +2310,11 @@ class Skill49(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 基本攻击力和技能攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data1}] + # 迁移前实现(保留对照): + # associate = [{'data': data1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 勾玉之火 : 镰鼬 # thief/kunoichi/845e0ce3235e19f60cc82a082d072cba @@ -2221,6 +2329,7 @@ class Skill50(ActiveSkill): """ name = '勾玉之火 : 镰鼬' + ref = Ref.JADEKAMAITACHI cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2266,6 +2375,7 @@ class Skill51(ActiveSkill): """ name = '火源限界·八咫乌' + ref = Ref.YATAGARASU cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/thief/necro.py b/backend/core/character/GF/thief/necro.py index f8b1d078..0692d5d6 100644 --- a/backend/core/character/GF/thief/necro.py +++ b/backend/core/character/GF/thief/necro.py @@ -1,6 +1,17 @@ #ddc49e9ad1ff72a00b53c6cff5b1e920 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + Equals, + LevelTable, + Operation, + Percent, + Power, + Read, + SkillAttribute, + SkillEffect, +) +from core.character.refs.thief.necro import NecroSkillRef as Ref prefix = "thief/necro/cn/skillDetail" @@ -14,6 +25,7 @@ class Skill0(ActiveSkill): 可消耗连击点数发动[终结之击]。\n """ name = "翔击" + ref = Ref.RISINGCUT learnLv = 1 masterLv = 10 maxLv = 20 @@ -47,6 +59,7 @@ class Skill1(ActiveSkill): 技能等级越高,被苦无命中的敌人的僵直时间越长。\n """ name = "投掷苦无" + ref = Ref.SHURIKEN learnLv = 1 masterLv = 60 maxLv = 70 @@ -80,6 +93,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -103,6 +117,7 @@ class Skill3(PassiveSkill): 在决斗场中,增益/减益技能、 被动技能的技能攻击力增加效果对[基础精通]无影响。\n """ name = "基础精通" + ref = Ref.BASICATTACKUP learnLv = 1 masterLv = 115 maxLv = 200 @@ -130,6 +145,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -171,6 +187,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -193,6 +210,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -216,6 +234,7 @@ class Skill7(ActiveSkill): 攻击力、 攻击范围、 前进速度和前进距离随技能等级增加而增大。\n """ name = "切割" + ref = Ref.SLICER cellPos = (0,2) learnLv = 5 masterLv = 1 @@ -247,6 +266,7 @@ class Skill8(ActiveSkill): 攻击力、 击飞力、 发动速度和攻击范围随技能等级增加而增大。\n """ name = "焰刃" + ref = Ref.FLAMECUT learnLv = 5 masterLv = 60 maxLv = 70 @@ -280,6 +300,7 @@ class Skill9(ActiveSkill): 在决斗场中,无法强制控制敌人,但是相比其他暗夜使者,可以使敌人进入更长时间的僵直状态。\n """ name = "影袭" + ref = Ref.SHADOWCUT learnLv = 5 masterLv = 60 maxLv = 70 @@ -317,6 +338,7 @@ class Skill10(ActiveSkill): 在决斗场中,地图内球体的存在时间减少。\n """ name = "暗魂波" + ref = Ref.DARKSOUL cellPos = (4,2) learnLv = 5 masterLv = 60 @@ -364,6 +386,7 @@ class Skill11(ActiveSkill): 可以利用方向键调整移动方向。\n """ name = "弧光闪" + ref = Ref.SHININGCUT learnLv = 10 masterLv = 60 maxLv = 70 @@ -401,6 +424,7 @@ class Skill12(ActiveSkill): 在决斗场中,不适用持续时间减少和霸体护甲效果,施放技能时减少所受伤害。\n """ name = "骨盾" + ref = Ref.BONESHIELD cellPos = (5,3) learnLv = 10 masterLv = 5 @@ -443,6 +467,7 @@ class Skill13(ActiveSkill): 留在地上的影分身会挑衅一定领域内的敌人; 影分身经过一段时间或受到一定伤害后,会爆炸并使敌人受到无属性魔法伤害。\n """ name = "忍法 : 影分身" + ref = Ref.SKINTAKEOFF learnLv = 10 masterLv = 40 maxLv = 50 @@ -474,6 +499,7 @@ class Skill14(ActiveSkill): 被扫腿踢命中的敌人将受到无属性物理伤害,且有一定几率进入减速状态。\n """ name = "碎踝" + ref = Ref.ANKLECUT learnLv = 10 masterLv = 60 maxLv = 70 @@ -509,6 +535,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -536,6 +563,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -565,6 +593,7 @@ class Skill17(ActiveSkill): 连续踢击过程中连续按下攻击键时,会增加连续踢击的速度和命中次数。\n """ name = "疾空踏" + ref = Ref.DIVINGARROW learnLv = 15 masterLv = 60 maxLv = 70 @@ -603,6 +632,7 @@ class Skill18(ActiveSkill): 攻击力和爆炸范围随攻击次数递增,最后一击时增幅更大。\n """ name = "忍法 : 飞鼠" + ref = Ref.FLYINGSQUIRREL learnLv = 15 masterLv = 60 maxLv = 70 @@ -643,6 +673,7 @@ class Skill19(ActiveSkill): 若[天诛]背击敌人时,则会追加一次刺击,且最后还会追加一次高伤害的切割攻击。\n """ name = "天诛" + ref = Ref.ERASER learnLv = 15 masterLv = 60 maxLv = 70 @@ -674,6 +705,7 @@ class Skill20(ActiveSkill): 召唤暗属性的诅咒之箭后,向前方敌人发射; 被诅咒之箭命中的敌人会受到暗属性多段魔法伤害,并有一定几率进入诅咒状态。\n """ name = "诅咒之箭" + ref = Ref.CURSESPEAR cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -714,6 +746,7 @@ class Skill21(ActiveSkill): 艾克尼亚 : 释放出艾克尼亚的灵体,造成大量伤害。\n """ name = "降临 : 尼古拉斯" + ref = Ref.SUMMONNICOLAS cellPos = (2,4) learnLv = 15 masterLv = 60 @@ -764,6 +797,7 @@ class Skill22(PassiveSkill): 除[千魂祭]、 [亡者君临 : 巴拉克之戮]、 [命运殇痕·摩罗斯之咒]的其他技能的冷却时间减少。 装备手杖时,施放速度增加。\n """ name = "手杖精通" + ref = Ref.WANDMASTERY cellPos = (4,4) learnLv = 15 masterLv = 1 @@ -780,7 +814,11 @@ class Skill22(PassiveSkill): # [装备手杖时] # 施放速度增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"type":"*cdReduce","data":data0,"exceptSkills":["千魂祭","亡者君临 : 巴拉克之戮","命运殇痕·摩罗斯之咒"]}] + # 迁移前实现(保留对照): + # associate = [{"type":"*cdReduce","data":data0,"exceptSkills":["千魂祭","亡者君临 : 巴拉克之戮","命运殇痕·摩罗斯之咒"]}] + associate = [ + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data0)), except_skills=[Ref.PHANTOMSTROM, Ref.BALLACREADVENT, Ref.HORROROFMOROS]), + ] # 驱使枯灵 # thief/necro/d0cdaca82892e54097f22a1f60817048 @@ -797,6 +835,7 @@ class Skill23(ActiveSkill): 在决斗场中,适用单独的生命值和防御力。\n """ name = "驱使枯灵" + ref = Ref.NICOLASSUMMONZOMBIE cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -868,6 +907,7 @@ class Skill24(ActiveSkill): 在决斗场中,守护模式下的尼古拉斯适用霸体状态。\n """ name = "服从" + ref = Ref.NICOLASBEHAVIOR cellPos = (1,5) learnLv = 20 masterLv = 10 @@ -895,7 +935,11 @@ class Skill24(ActiveSkill): # 黑夜术士魔法防御力增加 : {value4} data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{"data":data1,"skills":["降临 : 尼古拉斯"]}] + # 迁移前实现(保留对照): + # associate = [{"data":data1,"skills":["降临 : 尼古拉斯"]}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.SUMMONNICOLAS]), + ] # 暴击 # thief/necro/fc1262c19f3d0477ee8eda47b8db8696 @@ -905,6 +949,7 @@ class Skill25(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -927,6 +972,7 @@ class Skill26(ActiveSkill): 用毁灭之爪攻击敌人。\n """ name = "毁灭之爪" + ref = Ref.DARKNAIL cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -958,6 +1004,7 @@ class Skill27(ActiveSkill): 增加黑夜术士的技能攻击力。\n """ name = "暗黑仪式" + ref = Ref.DARKRITUAL cellPos = (6,6) learnLv = 25 masterLv = 10 @@ -986,6 +1033,7 @@ class Skill28(ActiveSkill): 若施放技能时按住技能键,尼古拉斯会瞬移到死灵术士前方展开蛛丝阵。\n """ name = "暗影蛛丝阵" + ref = Ref.NICOLASBLACKAREA cellPos = (2,6) learnLv = 25 masterLv = 60 @@ -1019,6 +1067,7 @@ class Skill29(PassiveSkill): 学习后,增加属性攻击力。\n """ name = "黑暗之环" + ref = Ref.RINGOFDARKNESS cellPos = (4,6) learnLv = 25 masterLv = 10 @@ -1032,7 +1081,11 @@ class Skill29(PassiveSkill): # 属性攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 百鬼夜行 # thief/necro/04883563896fe1adac7505c6146b5f59 @@ -1045,6 +1098,7 @@ class Skill30(ActiveSkill): 在决斗场中,夜游魂落地瞬间就会出现百鬼之灵。\n """ name = "百鬼夜行" + ref = Ref.DARKLURE cellPos = (5,7) learnLv = 30 masterLv = 60 @@ -1088,6 +1142,7 @@ class Skill31(ActiveSkill): 敌人受到伤害时,有一定的几率进入减速和减少跳跃力的减益状态。\n """ name = "复苏者之怨" + ref = Ref.BLAMEOFDEAD cellPos = (3,7) learnLv = 30 masterLv = 60 @@ -1133,6 +1188,7 @@ class Skill32(PassiveSkill): 记载黑魔法知识的书,增加除[降临 : 尼古拉斯]外的技能攻击力,并增加[复苏者之缚]的复苏者区域范围。\n """ name = "黑魔法书 : 亡者之魂" + ref = Ref.GRIMGRIMOIRE cellPos = (4,8) learnLv = 30 masterLv = 1 @@ -1148,7 +1204,11 @@ class Skill32(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # [复苏者之缚]范围增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{"data":data0,"exceptSkills":["降临 : 尼古拉斯"]},] + # 迁移前实现(保留对照): + # associate = [{"data":data0,"exceptSkills":["降临 : 尼古拉斯"]},] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), except_skills=[Ref.SUMMONNICOLAS]), + ] # 降临 : 暴君巴拉克 # thief/necro/dcd536f1674630f01fc9667bb202b851 @@ -1164,6 +1224,7 @@ class Skill33(ActiveSkill): - 增加物理防御力、 魔法防御力和暗属性抗性,但会降低光属性抗性。\n """ name = "降临 : 暴君巴拉克" + ref = Ref.APPORTBALLACRE cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1247,12 +1308,19 @@ class Skill33(ActiveSkill): self.setMode("x3") ... + # 迁移前实现(保留对照): + # associate = [ + # {"type":"+power0","data":data6,"skills":["暗击拳"],"ratio":1}, + # {"type":"+power1","data":data7,"skills":["暗击拳"],"ratio":1}, + # {"type":"+power0","data":data8,"skills":["狂野乱舞"],"ratio":1}, + # {"type":"+power0","data":data9,"skills":["巴拉克强击"],"ratio":1} + # ] associate = [ - {"type":"+power0","data":data6,"skills":["暗击拳"],"ratio":1}, - {"type":"+power1","data":data7,"skills":["暗击拳"],"ratio":1}, - {"type":"+power0","data":data8,"skills":["狂野乱舞"],"ratio":1}, - {"type":"+power0","data":data9,"skills":["巴拉克强击"],"ratio":1} - ] + SkillEffect(attribute=Power(0), operation=Operation.ADD, value=LevelTable(data6), skills=[Ref.GRABCOLLAR]), + SkillEffect(attribute=Power(1), operation=Operation.ADD, value=LevelTable(data7), skills=[Ref.GRABCOLLAR]), + SkillEffect(attribute=Power(0), operation=Operation.ADD, value=LevelTable(data8), skills=[Ref.MADNESSBALLACRE]), + SkillEffect(attribute=Power(0), operation=Operation.ADD, value=LevelTable(data9), skills=[Ref.BALLACRESTRONGATTACK]), + ] # 暗击拳 # thief/necro/1c1a9606eb702ebe5a7bb4397f3aeae0 @@ -1263,6 +1331,7 @@ class Skill34(ActiveSkill): 只能在前冲时施放。\n """ name = "暗击拳" + ref = Ref.GRABCOLLAR cellPos = (8,9) learnLv = 35 masterLv = 1 @@ -1294,6 +1363,7 @@ class Skill35(ActiveSkill): 巴拉克向前方移动,挥剑攻击。 命中时将敌人向后击退。\n """ name = "狂野乱舞" + ref = Ref.MADNESSBALLACRE cellPos = (9,9) learnLv = 35 masterLv = 1 @@ -1321,6 +1391,7 @@ class Skill36(ActiveSkill): 巴拉克连接特定的行动,用剑碾压敌人。\n """ name = "巴拉克强击" + ref = Ref.BALLACRESTRONGATTACK cellPos = (10,9) learnLv = 35 masterLv = 1 @@ -1350,6 +1421,7 @@ class Skill37(ActiveSkill): 只有在召唤巴拉克的状态下,才能使用该技能。\n """ name = "巴拉克的野心" + ref = Ref.AMBITIONOFBALLACRE cellPos = (7,9) learnLv = 40 masterLv = 60 @@ -1409,6 +1481,7 @@ class Skill38(ActiveSkill): 施放吸影暗劲波时,若按住技能指令,则尼古拉斯将瞬移到黑夜术士的前方施放吸影暗劲波。 (在决斗场中,恢复尼古拉斯的生命值,不发动瞬移效果,且无法攻击倒地状态的敌人)\n """ name = "吸影暗劲波" + ref = Ref.NICOLASBLACKWAVE cellPos = (2,9) learnLv = 40 masterLv = 60 @@ -1465,6 +1538,7 @@ class Skill39(PassiveSkill): 学习[巴拉克的盟约]后,施放[巴拉克的野心]和[巴拉克的愤怒]时,立即发动追加攻击。\n """ name = "巴拉克的盟约" + ref = Ref.SACRIFICIALPACT cellPos = (6,9) learnLv = 40 masterLv = 1 @@ -1478,7 +1552,11 @@ class Skill39(PassiveSkill): # 技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 巴拉克的愤怒 # thief/necro/0ed3148658fe37b3336ccb718dc0fdb0 @@ -1490,6 +1568,7 @@ class Skill40(ActiveSkill): 使用该技能时,无法强制中断当前进行的普通攻击动作。\n """ name = "巴拉克的愤怒" + ref = Ref.GUILLOTINE cellPos = (7,10) learnLv = 45 masterLv = 60 @@ -1553,6 +1632,7 @@ class Skill41(ActiveSkill): 无法在决斗场使用。\n """ name = "降临 : 莱迪娅" + ref = Ref.LIVINGDEAD cellPos = (4,10) learnLv = 45 masterLv = 60 @@ -1623,6 +1703,7 @@ class Skill42(PassiveSkill): 巴拉克降临时,使灵魂收割者周围的敌人进入恐惧状态,恐惧状态下的敌人受到的暴击伤害大幅增加。 掌握技能后,由于暴君之力的影响,增加灵魂收割者的暴击率。\n """ name = "无形之惧" + ref = Ref.FEAROFBALLACRE cellPos = (7,11) learnLv = 48 masterLv = 40 @@ -1642,7 +1723,11 @@ class Skill42(PassiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 暴击伤害增加率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{"data":data2}] + # 迁移前实现(保留对照): + # associate = [{"data":data2}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data2))), + ] # 千魂祭 # thief/necro/2a3c96b88d02372505692da0a8b54743 @@ -1654,6 +1739,7 @@ class Skill43(ActiveSkill): 只有在召唤巴拉克的状态下,才能使用该技能。\n """ name = "千魂祭" + ref = Ref.PHANTOMSTROM cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1705,6 +1791,7 @@ class Skill44(ActiveSkill): 只有在召唤范围内,敌人才会进入束缚状态; 脱离范围或召唤结束时,束缚状态将解除。\n """ name = "复苏者之缚" + ref = Ref.BLAMEOFDEADEX cellPos = (4,12) learnLv = 60 masterLv = 40 @@ -1763,6 +1850,7 @@ class Skill45(ActiveSkill): 再次按技能键,怨噬之沼再次向前方发动攻击,最多可以发动3次。\n """ name = "怨噬之沼" + ref = Ref.HATEFULGHOST cellPos = (4,13) learnLv = 70 masterLv = 40 @@ -1825,6 +1913,7 @@ class Skill46(ActiveSkill): 施放暗黑蛛丝引时,若按住技能键,则尼古拉斯将瞬移到黑夜术士的前方施放暗黑蛛丝引。\n """ name = "暗黑蛛丝引" + ref = Ref.NICOLASBLACKARACHNIA cellPos = (2,13) learnLv = 75 masterLv = 40 @@ -1878,10 +1967,14 @@ class Skill46(ActiveSkill): """ ... - def effect(self, old, new): - if self.vp == 2: - self.associate = [{"data":[0]+[-50]*self.maxLv,"skills":["降临 : 莱迪娅"]}] - return super().effect(old, new) + # 迁移前实现(保留对照): + # def effect(self, old, new): + # if self.vp == 2: + # self.associate = [{"data":[0]+[-50]*self.maxLv,"skills":["降临 : 莱迪娅"]}] + # return super().effect(old, new) + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable([0] + [-50] * maxLv)), skills=[Ref.LIVINGDEAD], when=Equals(Read(SkillAttribute.VP), 2)), + ] # 亡魂之息 # thief/necro/78b86e64fbb74c1db1b71c50a5ac21cd @@ -1892,6 +1985,7 @@ class Skill47(PassiveSkill): [暗魂波]、 [诅咒之箭]适用单独的攻击力增加量。\n """ name = "亡魂之息" + ref = Ref.UNHOLYAURA cellPos = (7,13) learnLv = 75 masterLv = 40 @@ -1907,9 +2001,14 @@ class Skill47(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # [暗魂波]、 [诅咒之箭]攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) + # 迁移前实现(保留对照): + # associate = [ + # {"data":data0,"exceptSkills":["暗魂波","诅咒之箭"]}, + # {"data":data1,"skills":["暗魂波","诅咒之箭"]} + # ] associate = [ - {"data":data0,"exceptSkills":["暗魂波","诅咒之箭"]}, - {"data":data1,"skills":["暗魂波","诅咒之箭"]} + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0)), except_skills=[Ref.DARKSOUL, Ref.CURSESPEAR]), + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1)), skills=[Ref.DARKSOUL, Ref.CURSESPEAR]), ] # 暴君湮灭斩 @@ -1921,6 +2020,7 @@ class Skill48(ActiveSkill): 只能在巴拉克降临的状态下施放,并且被[暴君湮灭斩]命中的敌人有一定几率陷入[无形之惧]。\n """ name = "暴君湮灭斩" + ref = Ref.EXECUTIONERSLASH cellPos = (4,14) learnLv = 80 masterLv = 40 @@ -1974,6 +2074,7 @@ class Skill49(ActiveSkill): 巴拉克登场后,敌人会感受到[无形之惧]。\n """ name = "亡者君临 : 巴拉克之戮" + ref = Ref.BALLACREADVENT cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -2008,6 +2109,7 @@ class Skill50(PassiveSkill): [驱使枯灵] : 由黑夜术士直接召唤。\n """ name = "冥河之钥" + ref = Ref.KEYOFACERON cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -2021,7 +2123,11 @@ class Skill50(PassiveSkill): # 基本攻击和转职技能攻击力增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{"data":data0}] + # 迁移前实现(保留对照): + # associate = [{"data":data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 亡者之茧 # thief/necro/b1ccbd90d0b40f543ece3b18fcef827f @@ -2036,6 +2142,7 @@ class Skill51(ActiveSkill): 对无法抓取的敌人不适用控制效果。\n """ name = "亡者之茧" + ref = Ref.COCONOFUNDEAD cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2073,6 +2180,7 @@ class Skill52(ActiveSkill): 若关联的技能还在冷却中,则无法使用三次觉醒技能。\n """ name = "命运殇痕·摩罗斯之咒" + ref = Ref.HORROROFMOROS cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/thief/rogue.py b/backend/core/character/GF/thief/rogue.py index 81248609..d0810b35 100644 --- a/backend/core/character/GF/thief/rogue.py +++ b/backend/core/character/GF/thief/rogue.py @@ -1,6 +1,26 @@ # ddc49e9ad1ff72a00b53c6cff5b1e920 from core.basic.skill import PassiveSkill, ActiveSkill, get_data, _get_skill_damage_suffixes, _get_skill_dataplus_suffixes from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + Constant, + Hit, + LevelTable, + Operation, + Percent, + ProfessionAttribute, + SkillAttribute, + SkillEffect, +) +from core.character.refs.thief.rogue import RogueSkillRef as Ref + + +class RogueAttribute(ProfessionAttribute): + """本职业专用的最终效果属性;字段含义与技能实现保持一致。""" + END_POWER = 'endpower' + """刺客:终结追击分组的伤害倍率。""" + prefix = "thief/rogue/cn/skillDetail" @@ -45,6 +65,7 @@ class Skill0(ActiveSkill): """ name = '翔击' + ref = Ref.RISINGCUT cellPos = (5,1) learnLv = 1 masterLv = 10 @@ -79,6 +100,7 @@ class Skill1(ActiveSkill): 技能等级越高,被苦无命中的敌人的僵直时间越长。\n """ name = "投掷苦无" + ref = Ref.SHURIKEN learnLv = 1 masterLv = 60 maxLv = 70 @@ -112,6 +134,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -136,6 +159,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -163,6 +187,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -204,6 +229,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -226,6 +252,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -249,6 +276,7 @@ class Skill7(ActiveSkill): 攻击力、 攻击范围、 前进速度和前进距离随技能等级增加而增大。\n """ name = "切割" + ref = Ref.SLICER learnLv = 5 masterLv = 1 maxLv = 6 @@ -279,6 +307,7 @@ class Skill8(ActiveSkill): 攻击力、 击飞力、 发动速度和攻击范围随技能等级增加而增大。\n """ name = "焰刃" + ref = Ref.FLAMECUT learnLv = 5 masterLv = 60 maxLv = 70 @@ -312,6 +341,7 @@ class Skill9(ActiveSkill): 在决斗场中,无法强制控制敌人,但是相比其他暗夜使者,可以使敌人进入更长时间的僵直状态。\n """ name = "影袭" + ref = Ref.SHADOWCUT learnLv = 5 masterLv = 60 maxLv = 70 @@ -349,6 +379,7 @@ class Skill10(ActiveSkill): 在决斗场中,地图内球体的存在时间减少。\n """ name = "暗魂波" + ref = Ref.DARKSOUL learnLv = 5 masterLv = 60 maxLv = 70 @@ -392,6 +423,7 @@ class Skill11(ActiveSkill): """ name = '弧光闪' + ref = Ref.SHININGCUT cellPos = (5,3) learnLv = 10 masterLv = 60 @@ -431,6 +463,7 @@ class Skill12(ActiveSkill): 在决斗场中,不适用持续时间减少和霸体护甲效果,施放技能时减少所受伤害。\n """ name = "骨盾" + ref = Ref.BONESHIELD learnLv = 10 masterLv = 5 maxLv = 7 @@ -473,6 +506,7 @@ class Skill13(ActiveSkill): 留在地上的影分身会挑衅一定领域内的敌人; 影分身经过一段时间或受到一定伤害后,会爆炸并使敌人受到无属性魔法伤害。\n """ name = "忍法 : 影分身" + ref = Ref.SKINTAKEOFF learnLv = 10 masterLv = 40 maxLv = 50 @@ -505,6 +539,7 @@ class Skill14(ActiveSkill): """ name = '碎踝' + ref = Ref.ANKLECUT cellPos = (7,3) learnLv = 10 masterLv = 60 @@ -541,6 +576,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -568,6 +604,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -598,6 +635,7 @@ class Skill17(ActiveSkill): """ name = '疾空踏' + ref = Ref.DIVINGARROW cellPos = (4,4) learnLv = 15 masterLv = 60 @@ -639,6 +677,7 @@ class Skill18(ActiveSkill): 攻击力和爆炸范围随攻击次数递增,最后一击时增幅更大。\n """ name = "忍法 : 飞鼠" + ref = Ref.FLYINGSQUIRREL learnLv = 15 masterLv = 60 maxLv = 70 @@ -679,6 +718,7 @@ class Skill19(ActiveSkill): 若[天诛]背击敌人时,则会追加一次刺击,且最后还会追加一次高伤害的切割攻击。\n """ name = "天诛" + ref = Ref.ERASER learnLv = 15 masterLv = 60 maxLv = 70 @@ -712,6 +752,7 @@ class Skill20(ActiveSkill): """ name = '终结之击' + ref = Ref.HITEND cellPos = (6,4) learnLv = 15 masterLv = 20 @@ -742,31 +783,22 @@ class Skill20(ActiveSkill): # 7点 : {value7}% data7 = get_data(f'{prefix}/{uuid}', 7) - _maxLayer = 6 + maxLayer = 6 - associate = [{'type': '*endpower', 'data': data0}, {'type': '*endpower'}] + # 迁移前实现(保留对照): + # associate = [{'type': '*endpower', 'data': data0}, {'type': '*endpower'}] + associate = [ + SkillEffect(attribute=RogueAttribute.END_POWER, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=RogueAttribute.END_POWER, value=1 + Percent(Constant(0))), + ] - @property - def maxLayer(self): - return self._maxLayer - - @maxLayer.setter - def maxLayer(self, value): - if self._maxLayer != value: - skills = self.char.GetSkillNames('all', True) - if self.lv > 0: - raito = (getattr(self, f'data{int(value)}')[self.lv] - 100) / (getattr(self, f'data{int(self.maxLayer)}')[self.lv] - 100) - for name in skills: - skill = self.char.GetSkillByName(name) - if skill.type == 'active' and skill.damage: - skill.endpower *= raito - self._maxLayer = value - - def update_skill_attribute(self, skill, type, old, new, data, ratio=100, weapon=(), weapon_type=None, weapon_options=()): - if len(data) == 0: - data = getattr(self, f'data{int(self.maxLayer)}') - data = [i - 100 if i > 100 else 0 for i in data] - super().update_skill_attribute(skill, type, old, new, data, ratio, weapon, weapon_type, weapon_options) + # 迁移前实现(保留对照): + # def update_skill_attribute(self, skill, type, old, new, data, ratio=100, weapon=(), weapon_type=None, weapon_options=()): + # if len(data) == 0: + # data = getattr(self, f'data{int(self.maxLayer)}') + # data = [i - 100 if i > 100 else 0 for i in data] + # super().update_skill_attribute(skill, type, old, new, data, ratio, weapon, weapon_type, weapon_options) + # 原第二条关联未提供 data,旧引擎默认零表,不进入空表分支;保留原有效倍率。 # 诅咒之箭 # thief/rogue/547ab2b2bd860d3e37355a9cfbc1077c @@ -776,6 +808,7 @@ class Skill21(ActiveSkill): 召唤暗属性的诅咒之箭后,向前方敌人发射; 被诅咒之箭命中的敌人会受到暗属性多段魔法伤害,并有一定几率进入诅咒状态。\n """ name = "诅咒之箭" + ref = Ref.CURSESPEAR learnLv = 15 masterLv = 60 maxLv = 70 @@ -809,6 +842,7 @@ class Skill22(PassiveSkill): """ name = '弧光连闪' + ref = Ref.SHININGCUTAERIAL cellPos = (4,6) learnLv = 15 masterLv = 1 @@ -822,7 +856,11 @@ class Skill22(PassiveSkill): # [弧光闪]追加攻击发动次数增加 : {value0} data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'type': '+hit0', 'data': data0, 'ratio': 1, 'skills': ['弧光闪']}] + # 迁移前实现(保留对照): + # associate = [{'type': '+hit0', 'data': data0, 'ratio': 1, 'skills': ['弧光闪']}] + associate = [ + SkillEffect(attribute=Hit(0), operation=Operation.ADD, value=LevelTable(data0), skills=[Ref.SHININGCUT]), + ] # 迅影 # thief/rogue/1b1cfab062e0768bcc889e33e1f30dbf @@ -836,6 +874,7 @@ class Skill23(PassiveSkill): """ name = '迅影' + ref = Ref.SWIFT cellPos = (0,4) learnLv = 15 masterLv = 10 @@ -927,6 +966,7 @@ class Skill24(ActiveSkill): """ name = '绝心击' + ref = Ref.VANDITCUT cellPos = (6,5) learnLv = 20 masterLv = 60 @@ -972,6 +1012,7 @@ class Skill25(ActiveSkill): """ name = '空跃' + ref = Ref.AERIALJUMP cellPos = (10,5) learnLv = 20 masterLv = 1 @@ -996,6 +1037,7 @@ class Skill26(ActiveSkill): """ name = '双刃穿刺' + ref = Ref.DOUBLEPIERCE cellPos = (3,5) learnLv = 20 masterLv = 60 @@ -1041,6 +1083,7 @@ class Skill27(PassiveSkill): """ name = '暗星武器精通' + ref = Ref.ROGUEWEAPONRMASTERY cellPos = (0,5) learnLv = 20 masterLv = 20 @@ -1077,10 +1120,16 @@ class Skill27(PassiveSkill): # 命中率增加 : {value10}% data10 = get_data(f'{prefix}/{uuid}', 10) + # 迁移前实现(保留对照): + # associate = [ + # {'type': '$*PAtkP', 'data': data0}, + # {'type': '*cdReduce', 'data': data1, 'exceptSkills': []}, + # {'type': '+maxLayer', 'data': data2, 'ratio': 1, 'skills': ['终结之击']}, + # ] associate = [ - {'type': '$*PAtkP', 'data': data0}, - {'type': '*cdReduce', 'data': data1, 'exceptSkills': []}, - {'type': '+maxLayer', 'data': data2, 'ratio': 1, 'skills': ['终结追击']}, + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + SkillEffect(attribute=SkillAttribute.CD_REDUCE, value=1 - Percent(LevelTable(data1)), except_skills=[]), + SkillEffect(attribute=SkillAttribute.MAX_LAYER, operation=Operation.ADD, value=LevelTable(data2), skills=[Ref.HITEND]), ] # 旋舞斩 @@ -1094,6 +1143,7 @@ class Skill28(ActiveSkill): """ name = '旋舞斩' + ref = Ref.SWORDDANCE cellPos = (8,5) learnLv = 20 masterLv = 60 @@ -1126,6 +1176,7 @@ class Skill29(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -1151,6 +1202,7 @@ class Skill30(ActiveSkill): """ name = '旋刃' + ref = Ref.CHAINSAW cellPos = (7,6) learnLv = 25 masterLv = 60 @@ -1196,6 +1248,7 @@ class Skill31(ActiveSkill): """ name = '疾驰' + ref = Ref.BREAKINGRUSH cellPos = (4,7) learnLv = 30 masterLv = 1 @@ -1222,6 +1275,7 @@ class Skill32(ActiveSkill): """ name = '剑刃风暴' + ref = Ref.HURRICANE cellPos = (8,7) learnLv = 30 masterLv = 60 @@ -1263,6 +1317,7 @@ class Skill33(ActiveSkill): """ name = '侧步' + ref = Ref.SIDESTEP cellPos = (3,7) learnLv = 30 masterLv = 1 @@ -1286,6 +1341,7 @@ class Skill34(ActiveSkill): """ name = '暗掠' + ref = Ref.SHAKEDOWN cellPos = (1,7) learnLv = 30 masterLv = 10 @@ -1314,6 +1370,7 @@ class Skill35(ActiveSkill): """ name = '螺旋穿刺' + ref = Ref.VERTICALSPIRAL cellPos = (3,8) learnLv = 35 masterLv = 60 @@ -1390,6 +1447,7 @@ class Skill36(ActiveSkill): """ name = '雷光刃影' + ref = Ref.LIGHTNINGARROW cellPos = (4,8) learnLv = 35 masterLv = 60 @@ -1460,6 +1518,7 @@ class Skill37(ActiveSkill): """ name = '疾风乱舞' + ref = Ref.SONICASSAULT cellPos = (6,9) learnLv = 40 masterLv = 60 @@ -1527,6 +1586,7 @@ class Skill38(ActiveSkill): """ name = '死亡风暴' + ref = Ref.DEATHHURRICANE cellPos = (8,9) learnLv = 40 masterLv = 60 @@ -1547,7 +1607,7 @@ class Skill38(ActiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) def getSkillCD(self, mode=None) -> float: - return self.char.GetSkillByName('剑刃风暴').getSkillCD(mode) + return self.char.GetSkill(Ref.HURRICANE).getSkillCD(mode) def vp_1(self): """ @@ -1588,6 +1648,7 @@ class Skill39(ActiveSkill): """ name = '绝境瞬狱袭' + ref = Ref.EXCELSTRIKE cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1658,6 +1719,7 @@ class Skill40(PassiveSkill): """ name = '月弧' + ref = Ref.MOONARC cellPos = (6,11) learnLv = 48 masterLv = 40 @@ -1680,7 +1742,11 @@ class Skill40(PassiveSkill): # 命中率增加 : {value4}% data4 = get_data(f'{prefix}/{uuid}', 4) - associate = [{'data': data1}] + # 迁移前实现(保留对照): + # associate = [{'data': data1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 月轮舞 # thief/rogue/c61f5a010370101402b05b21916c2071 @@ -1693,6 +1759,7 @@ class Skill41(ActiveSkill): """ name = '月轮舞' + ref = Ref.SILVERSTREAM cellPos = (5,11) learnLv = 50 masterLv = 40 @@ -1732,6 +1799,7 @@ class Skill42(ActiveSkill): """ name = '月舞终结' + ref = Ref.STREAMCLOSER cellPos = (5,12) learnLv = 50 masterLv = 1 @@ -1777,6 +1845,7 @@ class Skill43(ActiveSkill): """ name = '旋刃冲击' + ref = Ref.CHAINSAWEX cellPos = (7,12) learnLv = 60 masterLv = 40 @@ -1850,6 +1919,7 @@ class Skill44(ActiveSkill): """ name = '陨落螺旋刺' + ref = Ref.VERTICALSPIRALEX cellPos = (3,13) learnLv = 70 masterLv = 40 @@ -1915,6 +1985,7 @@ class Skill45(PassiveSkill): """ name = '极限追击' + ref = Ref.HITBLEED cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1930,7 +2001,11 @@ class Skill45(PassiveSkill): data0 = get_data(f'{prefix}/{uuid}', 0) # 连击点数上限增加量 : {value1}个 data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '$*PAtkP'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '$*PAtkP'}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 乱空杀 # thief/rogue/5cac3411ccef1af333953e0ded5e942d @@ -1942,6 +2017,7 @@ class Skill46(ActiveSkill): """ name = '乱空杀' + ref = Ref.EXOTICRAMPANT cellPos = (7,13) learnLv = 75 masterLv = 40 @@ -2006,6 +2082,7 @@ class Skill47(ActiveSkill): """ name = '月影突袭' + ref = Ref.DISTRIBUTION cellPos = (4,14) learnLv = 80 masterLv = 40 @@ -2071,6 +2148,7 @@ class Skill48(ActiveSkill): """ name = '天渊星狱' + ref = Ref.NOVAREMNANT cellPos = (6,14) learnLv = 85 masterLv = 40 @@ -2107,6 +2185,7 @@ class Skill49(ActiveSkill): """ name = '幻灭瞬杀' + ref = Ref.VANISHINGILLUSION cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -2144,6 +2223,7 @@ class Skill50(PassiveSkill): """ name = '绝命时刻' + ref = Ref.MOMENTPANIC cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -2164,7 +2244,11 @@ class Skill50(PassiveSkill): data2 = get_data(f'{prefix}/{uuid}', 2) # 多段攻击间隔减少率 : {value3}% data3 = get_data(f'{prefix}/{uuid}', 3) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 影·万古星辰 # thief/rogue/ef9d26746effee9199b54541f01b8752 @@ -2181,6 +2265,7 @@ class Skill51(ActiveSkill): """ name = '影·万古星辰' + ref = Ref.ADESPHANTOM cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/GF/thief/shadow_dancer.py b/backend/core/character/GF/thief/shadow_dancer.py index 8cfd268f..30eb8963 100644 --- a/backend/core/character/GF/thief/shadow_dancer.py +++ b/backend/core/character/GF/thief/shadow_dancer.py @@ -1,6 +1,15 @@ # ddc49e9ad1ff72a00b53c6cff5b1e920 from core.basic.skill import PassiveSkill, ActiveSkill, get_data from core.basic.character import Character +from core.basic.skill_effect_types import ( + CharacterAttribute, + CharacterEffect, + LevelTable, + Percent, + SkillAttribute, + SkillEffect, +) +from core.character.refs.thief.shadow_dancer import ShadowDancerSkillRef as Ref prefix = "thief/shadow_dancer/cn/skillDetail" @@ -15,6 +24,7 @@ class Skill0(ActiveSkill): 可消耗连击点数发动[终结之击]。\n """ name = "翔击" + ref = Ref.RISINGCUT learnLv = 1 masterLv = 10 maxLv = 20 @@ -48,6 +58,7 @@ class Skill1(ActiveSkill): 技能等级越高,被苦无命中的敌人的僵直时间越长。\n """ name = "投掷苦无" + ref = Ref.SHURIKEN learnLv = 1 masterLv = 60 maxLv = 70 @@ -81,6 +92,7 @@ class Skill2(ActiveSkill): 使自身向后方小跳并避开敌人的攻击。\n """ name = "后跳" + ref = Ref.BACKSTEP learnLv = 1 masterLv = 1 maxLv = 1 @@ -105,6 +117,7 @@ class Skill3(PassiveSkill): """ name = '基础精通' + ref = Ref.BASICATTACKUP cellPos = (1,0) learnLv = 1 masterLv = 115 @@ -132,6 +145,7 @@ class Skill4(ActiveSkill): 使自身在倒地状态下迅速起身并采取蹲伏姿势; 蹲伏状态下,自身会进入无敌状态,效果持续一定时间。\n """ name = "受身蹲伏" + ref = Ref.QUICKSTANDING learnLv = 1 masterLv = 1 maxLv = 20 @@ -173,6 +187,7 @@ class Skill5(ActiveSkill): 决斗场中无法使用技能连招。\n """ name = "技能连招" + ref = Ref.SKILLPRESETTYPE1 learnLv = 1 masterLv = 1 maxLv = 1 @@ -195,6 +210,7 @@ class Skill6(PassiveSkill): 穿戴的防具越多,效果越强; 可根据转职,增加不同的属性种类及数值。\n """ name = "防具精通" + ref = Ref.ARMORMASTERYETC learnLv = 1 masterLv = 1 maxLv = 1 @@ -219,6 +235,7 @@ class Skill7(ActiveSkill): """ name = '切割' + ref = Ref.SLICER cellPos = (3,2) learnLv = 5 masterLv = 1 @@ -250,6 +267,7 @@ class Skill8(ActiveSkill): 攻击力、 击飞力、 发动速度和攻击范围随技能等级增加而增大。\n """ name = "焰刃" + ref = Ref.FLAMECUT learnLv = 5 masterLv = 60 maxLv = 70 @@ -284,6 +302,7 @@ class Skill9(ActiveSkill): """ name = '影袭' + ref = Ref.SHADOWCUT cellPos = (5,2) learnLv = 5 masterLv = 60 @@ -322,6 +341,7 @@ class Skill10(ActiveSkill): 在决斗场中,地图内球体的存在时间减少。\n """ name = "暗魂波" + ref = Ref.DARKSOUL learnLv = 5 masterLv = 60 maxLv = 70 @@ -364,6 +384,7 @@ class Skill11(ActiveSkill): 可以利用方向键调整移动方向。\n """ name = "弧光闪" + ref = Ref.SHININGCUT learnLv = 10 masterLv = 60 maxLv = 70 @@ -402,6 +423,7 @@ class Skill12(ActiveSkill): """ name = '骨盾' + ref = Ref.BONESHIELD cellPos = (1,3) learnLv = 10 masterLv = 5 @@ -445,6 +467,7 @@ class Skill13(ActiveSkill): 留在地上的影分身会挑衅一定领域内的敌人; 影分身经过一段时间或受到一定伤害后,会爆炸并使敌人受到无属性魔法伤害。\n """ name = "忍法 : 影分身" + ref = Ref.SKINTAKEOFF learnLv = 10 masterLv = 40 maxLv = 50 @@ -476,6 +499,7 @@ class Skill14(ActiveSkill): 被扫腿踢命中的敌人将受到无属性物理伤害,且有一定几率进入减速状态。\n """ name = "碎踝" + ref = Ref.ANKLECUT learnLv = 10 masterLv = 60 maxLv = 70 @@ -511,6 +535,7 @@ class Skill15(PassiveSkill): 无法强制中断觉醒技能和跳跃超过一定高度的技能。\n """ name = "强化 - 后跳" + ref = Ref.ESCAPEBACKSTEP learnLv = 10 masterLv = 1 maxLv = 1 @@ -538,6 +563,7 @@ class Skill16(ActiveSkill): 效果持续期间内,再次按技能键可以结束。\n """ name = "跃翔" + ref = Ref.JUMPPOWERUP learnLv = 10 masterLv = 1 maxLv = 1 @@ -567,6 +593,7 @@ class Skill17(ActiveSkill): 连续踢击过程中连续按下攻击键时,会增加连续踢击的速度和命中次数。\n """ name = "疾空踏" + ref = Ref.DIVINGARROW learnLv = 15 masterLv = 60 maxLv = 70 @@ -605,6 +632,7 @@ class Skill18(ActiveSkill): 攻击力和爆炸范围随攻击次数递增,最后一击时增幅更大。\n """ name = "忍法 : 飞鼠" + ref = Ref.FLYINGSQUIRREL learnLv = 15 masterLv = 60 maxLv = 70 @@ -646,6 +674,7 @@ class Skill19(ActiveSkill): """ name = '天诛' + ref = Ref.ERASER cellPos = (5,3) learnLv = 15 masterLv = 60 @@ -680,6 +709,7 @@ class Skill20(ActiveSkill): 召唤暗属性的诅咒之箭后,向前方敌人发射; 被诅咒之箭命中的敌人会受到暗属性多段魔法伤害,并有一定几率进入诅咒状态。\n """ name = "诅咒之箭" + ref = Ref.CURSESPEAR learnLv = 15 masterLv = 60 maxLv = 70 @@ -717,6 +747,7 @@ class Skill21(PassiveSkill): """ name = '潜行教义' + ref = Ref.ASSASSINATIONSKILL cellPos = (3,4) learnLv = 15 masterLv = 1 @@ -730,7 +761,11 @@ class Skill21(PassiveSkill): # 暴击伤害增加率 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 追影步 # thief/shadow_dancer/0fbb8de70002ad34f046c94c2cb3e863 @@ -741,6 +776,7 @@ class Skill22(ActiveSkill): """ name = '追影步' + ref = Ref.SHADOWMOVE cellPos = (7,4) learnLv = 15 masterLv = 1 @@ -764,6 +800,7 @@ class Skill23(ActiveSkill): """ name = '撕裂' + ref = Ref.CUTTINGNECK cellPos = (5,4) learnLv = 15 masterLv = 60 @@ -794,6 +831,7 @@ class Skill24(PassiveSkill): """ name = '潜行之匕首精通' + ref = Ref.POINTEDKNIFE cellPos = (3,5) learnLv = 20 masterLv = 20 @@ -811,7 +849,11 @@ class Skill24(PassiveSkill): # 命中率增加 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data0, 'type': '$*PAtkP'}] + # 迁移前实现(保留对照): + # associate = [{'data': data0, 'type': '$*PAtkP'}] + associate = [ + CharacterEffect(attribute=CharacterAttribute.P_ATK_P, value=1 + Percent(LevelTable(data0))), + ] # 挑空 # thief/shadow_dancer/e0a072e8cef2d77893aad5f68aeed56a @@ -823,6 +865,7 @@ class Skill25(ActiveSkill): """ name = '挑空' + ref = Ref.HOLDUP cellPos = (5,5) learnLv = 20 masterLv = 60 @@ -865,6 +908,7 @@ class Skill26(ActiveSkill): """ name = '潜行领域' + ref = Ref.SHADOWDANCING cellPos = (7,5) learnLv = 20 masterLv = 10 @@ -909,6 +953,7 @@ class Skill27(PassiveSkill): 集中精神,提升物理/魔法暴击率。\n """ name = "暴击" + ref = Ref.PHYSICALCRITICALHITUP learnLv = 20 masterLv = 10 maxLv = 20 @@ -934,6 +979,7 @@ class Skill28(ActiveSkill): """ name = '穿心' + ref = Ref.CARDIOCLASIS cellPos = (5,6) learnLv = 25 masterLv = 60 @@ -967,6 +1013,7 @@ class Skill29(ActiveSkill): """ name = '影遁' + ref = Ref.SHADOWFAKE cellPos = (3,6) learnLv = 25 masterLv = 1 @@ -1002,6 +1049,7 @@ class Skill30(ActiveSkill): """ name = '潜行信条' + ref = Ref.ASSASINSATTITUDE cellPos = (3,7) learnLv = 30 masterLv = 10 @@ -1032,6 +1080,7 @@ class Skill31(ActiveSkill): """ name = '追袭' + ref = Ref.GOTOHELL cellPos = (7,7) learnLv = 30 masterLv = 60 @@ -1067,6 +1116,7 @@ class Skill32(ActiveSkill): """ name = '刃舞' + ref = Ref.BLADEGUST cellPos = (7,8) learnLv = 35 masterLv = 60 @@ -1123,6 +1173,7 @@ class Skill33(ActiveSkill): """ name = '潜影刺击' + ref = Ref.COVERTACTION cellPos = (6,8) learnLv = 35 masterLv = 60 @@ -1177,6 +1228,7 @@ class Skill34(ActiveSkill): """ name = '影戮' + ref = Ref.FINALDESTRUCTION cellPos = (7,9) learnLv = 40 masterLv = 60 @@ -1245,6 +1297,7 @@ class Skill35(ActiveSkill): """ name = '瞬袭' + ref = Ref.ASSASSINATION cellPos = (5,10) learnLv = 45 masterLv = 60 @@ -1306,6 +1359,7 @@ class Skill36(PassiveSkill): """ name = '潜行之心' + ref = Ref.BEHINDATTACK cellPos = (3,11) learnLv = 48 masterLv = 40 @@ -1322,7 +1376,11 @@ class Skill36(PassiveSkill): # 背击时攻击力增加率 : {value1}% data1 = get_data(f'{prefix}/{uuid}', 1) - associate = [{'data': data1}] + # 迁移前实现(保留对照): + # associate = [{'data': data1}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data1))), + ] # 影斩·乱舞 # thief/shadow_dancer/8b08f9504167a9c0f3a1d29d71b7943e @@ -1333,6 +1391,7 @@ class Skill37(ActiveSkill): """ name = '影斩·乱舞' + ref = Ref.ZETSUEI cellPos = (7,11) learnLv = 50 masterLv = 40 @@ -1364,6 +1423,7 @@ class Skill38(ActiveSkill): """ name = '绝境飞刃' + ref = Ref.SHADOWPIERCE cellPos = (7,12) learnLv = 60 masterLv = 40 @@ -1422,6 +1482,7 @@ class Skill39(ActiveSkill): """ name = '八荒影杀' + ref = Ref.SHADOWSTING cellPos = (7,13) learnLv = 70 masterLv = 40 @@ -1488,6 +1549,7 @@ class Skill40(ActiveSkill): """ name = '死亡连舞' + ref = Ref.DANCEOFGRIMREAPER cellPos = (5,13) learnLv = 75 masterLv = 40 @@ -1561,6 +1623,7 @@ class Skill41(PassiveSkill): """ name = '潜行之袭' + ref = Ref.VEILEDATTACK cellPos = (3,13) learnLv = 75 masterLv = 40 @@ -1574,7 +1637,11 @@ class Skill41(PassiveSkill): # 基本攻击力和技能攻击力增加量 : {value0}% data0 = get_data(f'{prefix}/{uuid}', 0) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 摧心 # thief/shadow_dancer/b163d099c8cc27fdb6fd3639c2ee6df9 @@ -1585,6 +1652,7 @@ class Skill42(ActiveSkill): """ name = '摧心' + ref = Ref.EXTRACTHEART cellPos = (3,14) learnLv = 80 masterLv = 40 @@ -1643,6 +1711,7 @@ class Skill43(ActiveSkill): """ name = '幽冥链狱 : 瞬逝' + ref = Ref.CHAINREACTION cellPos = (5,14) learnLv = 85 masterLv = 40 @@ -1735,6 +1804,7 @@ class Skill44(PassiveSkill): """ name = '暗影禁忌' + ref = Ref.RULEOFSHADOW cellPos = (5,15) learnLv = 95 masterLv = 40 @@ -1752,7 +1822,11 @@ class Skill44(PassiveSkill): data1 = get_data(f'{prefix}/{uuid}', 1) # [潜行领域]暗袭分身召唤数增加 : {value2} data2 = get_data(f'{prefix}/{uuid}', 2) - associate = [{'data': data0}] + # 迁移前实现(保留对照): + # associate = [{'data': data0}] + associate = [ + SkillEffect(attribute=SkillAttribute.DAMAGE, value=1 + Percent(LevelTable(data0))), + ] # 影缚追魂锁 # thief/shadow_dancer/9ceb0c55f40f1fc0fe0fcc65c8fee3a0 @@ -1765,6 +1839,7 @@ class Skill45(ActiveSkill): """ name = '影缚追魂锁' + ref = Ref.MENACINGSEIZE cellPos = (7,15) learnLv = 95 masterLv = 40 @@ -1803,6 +1878,7 @@ class Skill46(ActiveSkill): """ name = '无间影狱·噬灭' + ref = Ref.SHADOWLESS cellPos = (5,16) learnLv = 100 masterLv = 40 diff --git a/backend/core/character/refs/__init__.py b/backend/core/character/refs/__init__.py new file mode 100644 index 00000000..bc4816f9 --- /dev/null +++ b/backend/core/character/refs/__init__.py @@ -0,0 +1 @@ +"""职业技能引用;按需导入具体职业模块,不在此处加载全部职业。""" diff --git a/backend/core/character/refs/archer/__init__.py b/backend/core/character/refs/archer/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/archer/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/archer/chimera.py b/backend/core/character/refs/archer/chimera.py new file mode 100644 index 00000000..f3732702 --- /dev/null +++ b/backend/core/character/refs/archer/chimera.py @@ -0,0 +1,108 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:archer/chimera/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs + + +class ChimeraSkillRef(CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs): + """archer.chimera 的技能引用;包含继承的公共技能。""" + __profession__ = 'archer.chimera' + + AIR = SkillRef(name='环阿拉德狂飙', code='air', profession=__profession__) + "环阿拉德狂飙" + + BEQUIET = SkillRef(name='肃静!', code='bequiet', profession=__profession__) + "肃静!" + + BOUNCETABLE = SkillRef(name='巨镰斯诺克', code='bouncetable', profession=__profession__) + "巨镰斯诺克" + + CEEEE = SkillRef(name='瞬影', code='ceeee', profession=__profession__) + "瞬影" + + CEEEECLEAN = SkillRef(name='瞬影清除', code='ceeeeclean', profession=__profession__) + "瞬影清除" + + CENTRIFUGALVENOM = SkillRef(name='环形毒液', code='centrifugalvenom', profession=__profession__) + "环形毒液" + + CRACKARROW = SkillRef(name='凌跃一击', code='crackarrow', profession=__profession__) + "凌跃一击" + + CROWNSHREDDER = SkillRef(name='王冠粉碎者', code='crownshredder', profession=__profession__) + "王冠粉碎者" + + CUBEOFMATERIALISM = SkillRef(name='唯物主义魔方', code='cubeofmaterialism', profession=__profession__) + "唯物主义魔方" + + DOUBLEHELIX = SkillRef(name='双重螺旋', code='doublehelix', profession=__profession__) + "双重螺旋" + + FOURTHFORCE = SkillRef(name='利剑四重奏', code='fourthforce', profession=__profession__) + "利剑四重奏" + + FRUITOFFAIL = SkillRef(name='败果之慧', code='fruitoffail', profession=__profession__) + "败果之慧" + + FULLSWING = SkillRef(name='全力挥击', code='fullswing', profession=__profession__) + "全力挥击" + + GRINDER = SkillRef(name='狂锯旋斧', code='grinder', profession=__profession__) + "狂锯旋斧" + + HALFLESH = SkillRef(name='碎心连刺', code='halflesh', profession=__profession__) + "碎心连刺" + + HAVOC = SkillRef(name='颠倒之浩劫', code='havoc', profession=__profession__) + "颠倒之浩劫" + + HEDGEHOGDILEMMA = SkillRef(name='刺猬困境', code='hedgehogdilemma', profession=__profession__) + "刺猬困境" + + ISRAFIL = SkillRef(name='幻爆天使之翼', code='israfil', profession=__profession__) + "幻爆天使之翼" + + LEGACYOFCOPY = SkillRef(name='遗物之力 · 克隆', code='legacyofcopy', profession=__profession__) + "遗物之力 · 克隆" + + LEGACYOFGROWTH = SkillRef(name='遗物之力 · 巨大化', code='legacyofgrowth', profession=__profession__) + "遗物之力 · 巨大化" + + LINEARDAGGER = SkillRef(name='空翻刃袭', code='lineardagger', profession=__profession__) + "空翻刃袭" + + NINEPOINTEIGHT = SkillRef(name='重力加速度', code='ninepointeight', profession=__profession__) + "重力加速度" + + ORTHODOX = SkillRef(name='投掷匕首', code='orthodox', profession=__profession__) + "投掷匕首" + + REALIZATIONANDHANGING = SkillRef(name='遗物奥义 · 变形', code='realizationandhanging', profession=__profession__) + "遗物奥义 · 变形" + + RECYCLE = SkillRef(name='回收利用', code='recycle', profession=__profession__) + "回收利用" + + REPULSOR = SkillRef(name='喷毒', code='repulsor', profession=__profession__) + "喷毒" + + RISINGMOON = SkillRef(name='翻月翔击', code='risingmoon', profession=__profession__) + "翻月翔击" + + SATURN = SkillRef(name='土星环', code='saturn', profession=__profession__) + "土星环" + + SEPARATE = SkillRef(name='华丽回收', code='separate', profession=__profession__) + "华丽回收" + + SORTING = SkillRef(name='废物清理', code='sorting', profession=__profession__) + "废物清理" + + TEMPORARYREALIZATION5 = SkillRef(name='超卓之心', code='temporaryrealization5', profession=__profession__) + "超卓之心" + + UNLINEARENTROPYSKIP = SkillRef(name='熵变 : 非线性跳跃', code='unlinearentropyskip', profession=__profession__) + "熵变 : 非线性跳跃" + + VTOZERO = SkillRef(name='首足连击', code='vtozero', profession=__profession__) + "首足连击" diff --git a/backend/core/character/refs/archer/hunter.py b/backend/core/character/refs/archer/hunter.py new file mode 100644 index 00000000..f339b694 --- /dev/null +++ b/backend/core/character/refs/archer/hunter.py @@ -0,0 +1,117 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:archer/hunter/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class HunterSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """archer.hunter 的技能引用;包含继承的公共技能。""" + __profession__ = 'archer.hunter' + + BOLTRAIN = SkillRef(name='箭雨', code='boltrain', profession=__profession__) + "箭雨" + + BOMBSHOOTER = SkillRef(name='引爆发射', code='bombshooter', profession=__profession__) + "引爆发射" + + BOOSTGEAR = SkillRef(name='推进装置', code='boostgear', profession=__profession__) + "推进装置" + + CRACKARROW = SkillRef(name='凌跃一击', code='crackarrow', profession=__profession__) + "凌跃一击" + + CROSSSHOOTER = SkillRef(name='强攻弩掌握', code='crossshooter', profession=__profession__) + "强攻弩掌握" + + CROSSSHOOTERMASTERY = SkillRef(name='强攻弩精通', code='crossshootermastery', profession=__profession__) + "强攻弩精通" + + DISTINGUISHPREY = SkillRef(name='猎物识别', code='distinguishprey', profession=__profession__) + "猎物识别" + + DONTLOSEFALKE = SkillRef(name='帕伊卡锐眼', code='dontlosefalke', profession=__profession__) + "帕伊卡锐眼" + + FALKEBLADEFEATHER = SkillRef(name='帕伊卡 : 刃羽', code='falkebladefeather', profession=__profession__) + "帕伊卡 : 刃羽" + + FALKECHASINGKLER = SkillRef(name='帕伊卡 : 索敌集束弹', code='falkechasingkler', profession=__profession__) + "帕伊卡 : 索敌集束弹" + + FALKECONFUSINGMOVE = SkillRef(name='帕伊卡 : 迷惑之舞', code='falkeconfusingmove', profession=__profession__) + "帕伊卡 : 迷惑之舞" + + FALKEQUICKPECKING = SkillRef(name='帕伊卡 : 奇袭', code='falkequickpecking', profession=__profession__) + "帕伊卡 : 奇袭" + + FALKEWEBDROP = SkillRef(name='帕伊卡 : 困兽之网', code='falkewebdrop', profession=__profession__) + "帕伊卡 : 困兽之网" + + FALKEWINGCUTTER = SkillRef(name='帕伊卡 : 翼之刀锋', code='falkewingcutter', profession=__profession__) + "帕伊卡 : 翼之刀锋" + + FASTTRIGGER = SkillRef(name='急速扳机', code='fasttrigger', profession=__profession__) + "急速扳机" + + FDPIERCER = SkillRef(name='终结穿刺', code='fdpiercer', profession=__profession__) + "终结穿刺" + + FLARE = SkillRef(name='光爆箭', code='flare', profession=__profession__) + "光爆箭" + + FULLSWING = SkillRef(name='全力挥击', code='fullswing', profession=__profession__) + "全力挥击" + + GEARUPGRADE = SkillRef(name='装置升级', code='gearupgrade', profession=__profession__) + "装置升级" + + HAWKEYE = SkillRef(name='狩猎之瞳', code='hawkeye', profession=__profession__) + "狩猎之瞳" + + HIGHPRESSURE = SkillRef(name='高压喷射', code='highpressure', profession=__profession__) + "高压喷射" + + JOINTCARPETBOMBING = SkillRef(name='联合作战 : 空中轰炸', code='jointcarpetbombing', profession=__profession__) + "联合作战 : 空中轰炸" + + JOINTDEMOLISHER = SkillRef(name='联合作战 : 最终一役', code='jointdemolisher', profession=__profession__) + "联合作战 : 最终一役" + + JOINTROUNDUP = SkillRef(name='联合作战 : 围猎', code='jointroundup', profession=__profession__) + "联合作战 : 围猎" + + JOINTTURNINGPOINT = SkillRef(name='联合作战 : 扭转战局', code='jointturningpoint', profession=__profession__) + "联合作战 : 扭转战局" + + MASSIVEPIERCER = SkillRef(name='重型穿甲箭', code='massivepiercer', profession=__profession__) + "重型穿甲箭" + + MEDALOFVETERANHUNTER = SkillRef(name='追猎者勋章', code='medalofveteranhunter', profession=__profession__) + "追猎者勋章" + + PERFECTAIMING = SkillRef(name='完美瞄准', code='perfectaiming', profession=__profession__) + "完美瞄准" + + RAPIDSHOT = SkillRef(name='迅猛速射', code='rapidshot', profession=__profession__) + "迅猛速射" + + RISINGMOON = SkillRef(name='翻月翔击', code='risingmoon', profession=__profession__) + "翻月翔击" + + SECONDBOOST = SkillRef(name='二重助推', code='secondboost', profession=__profession__) + "二重助推" + + SPRINKLER = SkillRef(name='炽热喷涌', code='sprinkler', profession=__profession__) + "炽热喷涌" + + STARTHUNT = SkillRef(name='狩猎开始', code='starthunt', profession=__profession__) + "狩猎开始" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + THREEINABED = SkillRef(name='三弓弩箭', code='threeinabed', profession=__profession__) + "三弓弩箭" + + WARNINGSHOTGUN = SkillRef(name='霰弹之箭', code='warningshotgun', profession=__profession__) + "霰弹之箭" diff --git a/backend/core/character/refs/archer/muse.py b/backend/core/character/refs/archer/muse.py new file mode 100644 index 00000000..5afaaae8 --- /dev/null +++ b/backend/core/character/refs/archer/muse.py @@ -0,0 +1,126 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:archer/muse/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class MuseSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """archer.muse 的技能引用;包含继承的公共技能。""" + __profession__ = 'archer.muse' + + ACTIVEEQUALIZER = SkillRef(name='激活均衡器', code='activeequalizer', profession=__profession__) + "激活均衡器" + + ADRENALINRHAPSODY = SkillRef(name='燃情狂想曲', code='adrenalinrhapsody', profession=__profession__) + "燃情狂想曲" + + BRANDNEW = SkillRef(name='崭新曲风', code='brandnew', profession=__profession__) + "崭新曲风" + + BUSKING = SkillRef(name='街头演出', code='busking', profession=__profession__) + "街头演出" + + CRACKARROW = SkillRef(name='凌跃一击', code='crackarrow', profession=__profession__) + "凌跃一击" + + CULTURESHOCK = SkillRef(name='音波冲击', code='cultureshock', profession=__profession__) + "音波冲击" + + DACAPO = SkillRef(name='乐章再现', code='dacapo', profession=__profession__) + "乐章再现" + + DAZZLINGSCENE = SkillRef(name='闪耀旋律', code='dazzlingscene', profession=__profession__) + "闪耀旋律" + + DREAMINGTRILOGY = SkillRef(name='梦幻三重奏', code='dreamingtrilogy', profession=__profession__) + "梦幻三重奏" + + DROPTHEBEAT = SkillRef(name='调音放送', code='dropthebeat', profession=__profession__) + "调音放送" + + EFFECTORONGROOVE = SkillRef(name='乐力全开 : 律', code='effectorongroove', profession=__profession__) + "乐力全开 : 律" + + EFFECTORONPOWER = SkillRef(name='乐力全开 : 力', code='effectoronpower', profession=__profession__) + "乐力全开 : 力" + + EPISODEOFHARMONY = SkillRef(name='和茉霓之歌', code='episodeofharmony', profession=__profession__) + "和茉霓之歌" + + FANSERVICE = SkillRef(name='独家演奏', code='fanservice', profession=__profession__) + "独家演奏" + + FEASTOFSOUND = SkillRef(name='悦耳音律', code='feastofsound', profession=__profession__) + "悦耳音律" + + FEELHAPPY = SkillRef(name='幸福时光', code='feelhappy', profession=__profession__) + "幸福时光" + + FEELRUBATO = SkillRef(name='自由律动', code='feelrubato', profession=__profession__) + "自由律动" + + FINALESPECIALSTORY = SkillRef(name='终曲 : 霓虹蝶梦', code='finalespecialstory', profession=__profession__) + "终曲 : 霓虹蝶梦" + + FULLSWING = SkillRef(name='全力挥击', code='fullswing', profession=__profession__) + "全力挥击" + + HOTDEBUT = SkillRef(name='闪亮首秀', code='hotdebut', profession=__profession__) + "闪亮首秀" + + INTROSHINEONME = SkillRef(name='开场 : 唯我璀璨', code='introshineonme', profession=__profession__) + "开场 : 唯我璀璨" + + LOVELYTEMPO = SkillRef(name='可爱节拍', code='lovelytempo', profession=__profession__) + "可爱节拍" + + LUCKYCRESCENDO = SkillRef(name='音量顶峰', code='luckycrescendo', profession=__profession__) + "音量顶峰" + + MAINSTAR = SkillRef(name='主角登场', code='mainstar', profession=__profession__) + "主角登场" + + NIGHTANDDREAM = SkillRef(name='夜与梦', code='nightanddream', profession=__profession__) + "夜与梦" + + ONTHESTAGE = SkillRef(name='梦想的舞台', code='onthestage', profession=__profession__) + "梦想的舞台" + + POPPINGSPECTRUM = SkillRef(name='震感频谱', code='poppingspectrum', profession=__profession__) + "震感频谱" + + POPULARITY = SkillRef(name='明星气场', code='popularity', profession=__profession__) + "明星气场" + + POWERFORTE = SkillRef(name='音力增强', code='powerforte', profession=__profession__) + "音力增强" + + REFRESH = SkillRef(name='情绪调动', code='refresh', profession=__profession__) + "情绪调动" + + RISINGMOON = SkillRef(name='翻月翔击', code='risingmoon', profession=__profession__) + "翻月翔击" + + SENSATION = SkillRef(name='多彩感性', code='sensation', profession=__profession__) + "多彩感性" + + SOUNDOFMUSE = SkillRef(name='缪斯之声', code='soundofmuse', profession=__profession__) + "缪斯之声" + + SPECIALOPENING = SkillRef(name='巨星登场', code='specialopening', profession=__profession__) + "巨星登场" + + SWEETCANTABILE = SkillRef(name='甜蜜柔歌', code='sweetcantabile', profession=__profession__) + "甜蜜柔歌" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + VARIATIONOFLIGHT = SkillRef(name='辉光变奏', code='variationoflight', profession=__profession__) + "辉光变奏" + + VIVID = SkillRef(name='动感音符', code='vivid', profession=__profession__) + "动感音符" + + WARMINGUP = SkillRef(name='热场调音', code='warmingup', profession=__profession__) + "热场调音" diff --git a/backend/core/character/refs/archer/traveler.py b/backend/core/character/refs/archer/traveler.py new file mode 100644 index 00000000..131d6af5 --- /dev/null +++ b/backend/core/character/refs/archer/traveler.py @@ -0,0 +1,114 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:archer/traveler/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class TravelerSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """archer.traveler 的技能引用;包含继承的公共技能。""" + __profession__ = 'archer.traveler' + + ACROBATICRAID = SkillRef(name='绝技袭击', code='acrobaticraid', profession=__profession__) + "绝技袭击" + + AUTOMOVEMENT = SkillRef(name='自动操作模式', code='automovement', profession=__profession__) + "自动操作模式" + + BOWMASTERY = SkillRef(name='玄机弓精通', code='bowmastery', profession=__profession__) + "玄机弓精通" + + CAMPFIRE = SkillRef(name='营火', code='campfire', profession=__profession__) + "营火" + + CRACKARROW = SkillRef(name='凌跃一击', code='crackarrow', profession=__profession__) + "凌跃一击" + + DRIZZLE = SkillRef(name='细雨', code='drizzle', profession=__profession__) + "细雨" + + EXCITING = SkillRef(name='斗志昂扬', code='exciting', profession=__profession__) + "斗志昂扬" + + FULLSWING = SkillRef(name='全力挥击', code='fullswing', profession=__profession__) + "全力挥击" + + GEARDRIVE = SkillRef(name='装置驱动', code='geardrive', profession=__profession__) + "装置驱动" + + GEAROFSTELLA = SkillRef(name='星辰装置', code='gearofstella', profession=__profession__) + "星辰装置" + + GYPSOPHILA = SkillRef(name='高原雾花', code='gypsophila', profession=__profession__) + "高原雾花" + + HAZESTORM = SkillRef(name='流雾疾风', code='hazestorm', profession=__profession__) + "流雾疾风" + + INSECTFIRE = SkillRef(name='驱虫烈火', code='insectfire', profession=__profession__) + "驱虫烈火" + + INTUITION = SkillRef(name='旅人的直觉', code='intuition', profession=__profession__) + "旅人的直觉" + + JETSTREAM = SkillRef(name='急流', code='jetstream', profession=__profession__) + "急流" + + MISTBURST = SkillRef(name='迷雾爆裂', code='mistburst', profession=__profession__) + "迷雾爆裂" + + MISTCROWD = SkillRef(name='迷雾箭雨', code='mistcrowd', profession=__profession__) + "迷雾箭雨" + + MISTGEAR = SkillRef(name='附件 : 迷雾装置', code='mistgear', profession=__profession__) + "附件 : 迷雾装置" + + MISTHEAVYRAIN = SkillRef(name='浓雾暴雨', code='mistheavyrain', profession=__profession__) + "浓雾暴雨" + + NEBULA = SkillRef(name='装置驱动 : 星云', code='nebula', profession=__profession__) + "装置驱动 : 星云" + + POLARIS = SkillRef(name='神雾兵仗·北极星', code='polaris', profession=__profession__) + "神雾兵仗·北极星" + + QUICKMOVE = SkillRef(name='高速机动', code='quickmove', profession=__profession__) + "高速机动" + + RISINGMOON = SkillRef(name='翻月翔击', code='risingmoon', profession=__profession__) + "翻月翔击" + + SAGITTARIUS = SkillRef(name='神雾星仗·人马座星云', code='sagittarius', profession=__profession__) + "神雾星仗·人马座星云" + + SCRAMBLEANCHOR = SkillRef(name='登跃飞锚', code='scrambleanchor', profession=__profession__) + "登跃飞锚" + + SETUPATTACK = SkillRef(name='装载 : 猛击', code='setupattack', profession=__profession__) + "装载 : 猛击" + + SETUPCOOLTIME = SkillRef(name='装载 : 闪攻', code='setupcooltime', profession=__profession__) + "装载 : 闪攻" + + SETUPFIRE = SkillRef(name='装载 : 烟花漫天', code='setupfire', profession=__profession__) + "装载 : 烟花漫天" + + SETUPRAGE = SkillRef(name='神雾兵仗·妖旋风', code='setuprage', profession=__profession__) + "神雾兵仗·妖旋风" + + STARARROW = SkillRef(name='神雾兵仗·流星', code='stararrow', profession=__profession__) + "神雾兵仗·流星" + + SURVIVAL = SkillRef(name='野外生存', code='survival', profession=__profession__) + "野外生存" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + TRAVELINGSTAR = SkillRef(name='流浪之星的纹章', code='travelingstar', profession=__profession__) + "流浪之星的纹章" + + TRIPLEAXEL = SkillRef(name='三重加速', code='tripleaxel', profession=__profession__) + "三重加速" + + WILDFIRE = SkillRef(name='旷野火炎', code='wildfire', profession=__profession__) + "旷野火炎" diff --git a/backend/core/character/refs/archer/vigilante.py b/backend/core/character/refs/archer/vigilante.py new file mode 100644 index 00000000..8104faf7 --- /dev/null +++ b/backend/core/character/refs/archer/vigilante.py @@ -0,0 +1,114 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:archer/vigilante/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class VigilanteSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """archer.vigilante 的技能引用;包含继承的公共技能。""" + __profession__ = 'archer.vigilante' + + CHANGELING = SkillRef(name='妖兽化', code='changeling', profession=__profession__) + "妖兽化" + + CHASINGSNAKE = SkillRef(name='御蛇', code='chasingsnake', profession=__profession__) + "御蛇" + + CHECKDEATH = SkillRef(name='巡猎终结', code='checkdeath', profession=__profession__) + "巡猎终结" + + CLAWTATTOO = SkillRef(name='妖痕抓击', code='clawtattoo', profession=__profession__) + "妖痕抓击" + + CRACKARROW = SkillRef(name='凌跃一击', code='crackarrow', profession=__profession__) + "凌跃一击" + + CRUELSLAUGHTER = SkillRef(name='凶兽噬咬', code='cruelslaughter', profession=__profession__) + "凶兽噬咬" + + CUTTINGSHADOW = SkillRef(name='切割之影', code='cuttingshadow', profession=__profession__) + "切割之影" + + DEBONING = SkillRef(name='卸骨', code='deboning', profession=__profession__) + "卸骨" + + DESIREBREATH = SkillRef(name='野息狂放', code='desirebreath', profession=__profession__) + "野息狂放" + + DEVOURER = SkillRef(name='幻妖之噬', code='devourer', profession=__profession__) + "幻妖之噬" + + ETERNALNIGHT = SkillRef(name='极夜·妖刃千散', code='eternalnight', profession=__profession__) + "极夜·妖刃千散" + + FULLSWING = SkillRef(name='全力挥击', code='fullswing', profession=__profession__) + "全力挥击" + + GIVENWILD = SkillRef(name='野性愈烈', code='givenwild', profession=__profession__) + "野性愈烈" + + GODMONSTERCLAW = SkillRef(name='神妖之爪', code='godmonsterclaw', profession=__profession__) + "神妖之爪" + + HARSHHELLO = SkillRef(name='见面礼', code='harshhello', profession=__profession__) + "见面礼" + + HISS = SkillRef(name='威慑低吼', code='hiss', profession=__profession__) + "威慑低吼" + + MONSTERCLAW = SkillRef(name='妖爪', code='monsterclaw', profession=__profession__) + "妖爪" + + MONSTERWIND = SkillRef(name='狂妖风暴', code='monsterwind', profession=__profession__) + "狂妖风暴" + + NECKPUNCHER = SkillRef(name='妖刺结阵', code='neckpuncher', profession=__profession__) + "妖刺结阵" + + NOISYMONSTER = SkillRef(name='妖蛇暴雨', code='noisymonster', profession=__profession__) + "妖蛇暴雨" + + ONBOUNDARYLINE = SkillRef(name='超越两界', code='onboundaryline', profession=__profession__) + "超越两界" + + OUTBUST = SkillRef(name='妖潮狂袭', code='outbust', profession=__profession__) + "妖潮狂袭" + + PAINBRINGER = SkillRef(name='苦痛送行', code='painbringer', profession=__profession__) + "苦痛送行" + + PARTYOFSACRIFICE = SkillRef(name='鲜活宴场', code='partyofsacrifice', profession=__profession__) + "鲜活宴场" + + PEACEPIERCER = SkillRef(name='妖芒之茧', code='peacepiercer', profession=__profession__) + "妖芒之茧" + + PINNACLEOFALLTHINGS = SkillRef(name='万物巅峰', code='pinnacleofallthings', profession=__profession__) + "万物巅峰" + + RAMPAGE = SkillRef(name='盛怒狂潮', code='rampage', profession=__profession__) + "盛怒狂潮" + + REJECTION = SkillRef(name='拒绝屏障', code='rejection', profession=__profession__) + "拒绝屏障" + + RELATIVEKILLER = SkillRef(name='捕猎箭', code='relativekiller', profession=__profession__) + "捕猎箭" + + RISINGMOON = SkillRef(name='翻月翔击', code='risingmoon', profession=__profession__) + "翻月翔击" + + SELFAGREEMENT = SkillRef(name='妖人合一', code='selfagreement', profession=__profession__) + "妖人合一" + + SLASHFACE = SkillRef(name='破颜击', code='slashface', profession=__profession__) + "破颜击" + + TAKEOUTCLAW = SkillRef(name='利爪锋芒', code='takeoutclaw', profession=__profession__) + "利爪锋芒" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + UNIQUEBODY = SkillRef(name='特殊体质', code='uniquebody', profession=__profession__) + "特殊体质" diff --git a/backend/core/character/refs/base.py b/backend/core/character/refs/base.py new file mode 100644 index 00000000..c57b24dc --- /dev/null +++ b/backend/core/character/refs/base.py @@ -0,0 +1,167 @@ +"""职业技能引用公共类型。 + +运行 scripts/generate_skill_refs.py 生成引用,追加 --check 只检查产物一致性。 +公共技能在生成器的 COMMON_SKILLS、AWAKENING_SKILLS、COMBO_SKILLS 中维护, +统一生成到 common.py。职业类按实际技能树继承基础组、觉醒变体组、可选连招组, +只声明职业专属引用。基础组要求全部职业覆盖;觉醒组保留原始 code 的 1~5 后缀, +觉醒之心保留其名称差异;连招组排除创造者、黑暗武士,不暴露不存在的引用。 +清单变动需校验所有职业的 code、名称及分组覆盖。 + +使用:from core.character.refs.extra.creator import CreatorSkillRef as Ref +Ref.BACKSTEP 为当前角色的公共技能;Ref.CREATESPACE 为创造者专属技能。 +Ref.members() 包含继承成员;Ref.from_code(code) 按原始 code 查找,缺失抛 KeyError。 + +SkillRef 与引用命名空间均只读;公共引用的 profession 为 None,职业引用带职业范围。 +技能类通过 ref = Ref.XXX 绑定身份,Skill.code 从 ref 派生。角色初始化建立当前角色的 +引用/code 索引;SkillEffect、Read、level_source 及 GetSkill 已统一解析引用。 +字符串兼容旧显示名称,按 code 查询必须显式调用 GetSkillByCode,避免含义混淆。 +公共引用绑定当前角色实例,职业引用额外校验范围;名称只用于提示,不参与身份比较。 +计算器独有技能的扩展声明应单独维护,不手改自动生成的职业文件。 +""" +from __future__ import annotations + +from collections.abc import Mapping +from dataclasses import dataclass, field +import re +from types import MappingProxyType +from typing import ClassVar + + +@dataclass(frozen=True, slots=True) +class SkillRef: + """不可变技能身份,由职业范围和原始 code 共同确定。 + + Args: + code: 技能树原始 code,保留连字符等原始字符。 + name: 中文提示名称,仅展示,不参与身份绑定。 + profession: 职业标识,例如 extra.creator;None 表示当前角色的公共技能。 + """ + code: str + """技能树原始 code,不受 Python 成员名规范化影响。""" + profession: str | None = None + """所属职业;None 表示公共引用,须在解析时绑定当前角色。""" + + name: str = field(default='', compare=False) + """中文提示名称,仅用于编辑器及诊断展示,不参与身份比较和哈希。""" + + def __post_init__(self): + if not isinstance(self.name, str): + raise TypeError('技能提示名称必须是字符串') + if not isinstance(self.code, str) or not re.fullmatch(r'[A-Za-z0-9_\-]+', self.code): + raise ValueError(f'无效技能 code: {self.code!r}') + if self.profession is not None and ( + not isinstance(self.profession, str) + or not re.fullmatch(r'[a-z][a-z0-9_]*\.[a-z][a-z0-9_]*', self.profession) + ): + raise ValueError(f'无效职业标识: {self.profession!r}') + + @property + def qualified_key(self) -> str: + """完整引用标识,例如 extra.creator:createspace 或 common:backstep。""" + return f'{self.profession or "common"}:{self.code}' + + +class _ReferenceMeta(type): + """构建时检查继承、作用域和重复项,构建后冻结命名空间。""" + + def __new__(mcls, name, bases, namespace): + inherited = {} + for base in bases: + for member, ref in getattr(base, '__members__', {}).items(): + if member in inherited and inherited[member] != ref: + raise ValueError(f'{name}: 继承成员冲突: {member}') + inherited[member] = ref + reserved = {'members', 'from_code', '__members__', '_by_code'} + if any(isinstance(base, _ReferenceMeta) for base in bases): + if reserved.intersection(namespace): + raise ValueError(f'{name}: 不能覆盖公共查询接口') + if inherited.keys() & namespace.keys(): + raise ValueError(f'{name}: 不能覆盖继承的技能引用') + members = dict(inherited) + profession = namespace.get('__profession__', next((getattr(b, '__profession__', None) for b in bases), None)) + for member, ref in namespace.items(): + if isinstance(ref, SkillRef): + if member.startswith('_') or member != member.upper(): + raise ValueError(f'{name}: 技能引用成员必须使用大写名称: {member}') + if ref.profession != profession: + raise ValueError(f'{name}: 技能引用职业范围不一致: {member}') + members[member] = ref + if any(ref.profession not in (None, profession) for ref in inherited.values()): + raise ValueError(f'{name}: 不能继承其他职业的专属引用') + by_code = {} + for member, ref in sorted(members.items()): + if ref.code in by_code: + raise ValueError(f'{name}: 重复技能 code: {ref.code} ({member})') + by_code[ref.code] = ref + namespace['__members__'] = MappingProxyType(dict(sorted(members.items()))) + namespace['_by_code'] = MappingProxyType(by_code) + return super().__new__(mcls, name, bases, namespace) + + def __setattr__(cls, name, value): + raise AttributeError('技能引用命名空间只读,不能重新赋值') + + def __delattr__(cls, name): + raise AttributeError('技能引用命名空间只读,不能删除成员') + + +class SkillReferences(metaclass=_ReferenceMeta): + """可继承的技能引用命名空间;通过类访问,无须创建实例。""" + __profession__: ClassVar[str | None] = None + """职业范围,由职业类声明;公共类为 None。""" + __members__: ClassVar[Mapping[str, SkillRef]] + """包含继承成员的只读名称映射,由公共构建过程生成。""" + _by_code: ClassVar[Mapping[str, SkillRef]] + + def __new__(cls): + raise TypeError('技能引用通过类访问,无须实例化') + + @classmethod + def members(cls) -> tuple[SkillRef, ...]: + """返回包含公共技能的全部引用,按成员名排序。""" + return tuple(cls.__members__.values()) + + @classmethod + def from_code(cls, code: str) -> SkillRef: + """按原始 code 查找包含公共技能的引用;不存在时抛出 KeyError。""" + return cls._by_code[code] + + +def bind_skill_refs(character, profession: str) -> None: + """为当前角色建立引用及 code 索引;拒绝重复绑定、跨职业引用和无效类型。 + + 旧技能可暂不声明 ref;引用索引只保存当前角色实例,公共引用不会跨角色共享实例。 + profession 使用技能数据来源职业,输出圣骑士等变体复用其来源职业标识。 + """ + by_ref = {} + by_code = {} + for skill in character.skills: + ref = skill.ref + if ref is None: + continue + if not isinstance(ref, SkillRef): + raise TypeError(f'技能 ref 必须是 SkillRef: {skill.name}') + if ref.profession not in (None, profession): + raise ValueError(f'技能引用职业不匹配: {skill.name}: {ref.qualified_key} -> {profession}') + if ref in by_ref or ref.code in by_code: + raise ValueError(f'重复技能引用绑定: {skill.name}: {ref.qualified_key}') + by_ref[ref] = skill + by_code[ref.code] = skill + character.skill_ref_profession = profession + character.skills_ref_dict = by_ref + character.skills_code_dict = by_code + + +def resolve_skill(character, reference: SkillRef | str): + """统一解析技能引用;字符串沿用显示名称查询,绝不隐式当作 code。 + + 错误职业范围直接报错;有效范围内缺失技能返回 None,由调用入口决定缺失策略。 + 公共引用同样必须存在于当前角色引用索引中,不按名称或 code 猜测回退。 + """ + if isinstance(reference, str): + return character.GetSkillByName(reference) + if not isinstance(reference, SkillRef): + raise TypeError('技能引用必须是 SkillRef 或旧技能名称字符串') + profession = getattr(character, 'skill_ref_profession', None) + if reference.profession not in (None, profession): + raise ValueError(f'技能引用职业不匹配: {reference.qualified_key} -> {profession}') + return character.skills_ref_dict.get(reference) diff --git a/backend/core/character/refs/common.py b/backend/core/character/refs/common.py new file mode 100644 index 00000000..c528caab --- /dev/null +++ b/backend/core/character/refs/common.py @@ -0,0 +1,85 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""公共技能引用;保留觉醒 code 变体,按职业技能树选择继承分组。""" +from core.character.refs.base import SkillRef, SkillReferences + + +class CommonSkillRefs(SkillReferences): + """全部职业共享的七项基础引用,仅共享身份,不合并技能计算实现。""" + + ARMORMASTERYETC = SkillRef(name='防具精通', code='armormasteryetc') + "防具精通" + + BACKSTEP = SkillRef(name='后跳', code='backstep') + "后跳" + + BASICATTACKUP = SkillRef(name='基础精通', code='basicattackup') + "基础精通" + + ESCAPEBACKSTEP = SkillRef(name='强化 - 后跳', code='escapebackstep') + "强化 - 后跳" + + JUMPPOWERUP = SkillRef(name='跃翔', code='jumppowerup') + "跃翔" + + PHYSICALCRITICALHITUP = SkillRef(name='暴击', code='physicalcriticalhitup') + "暴击" + + QUICKSTANDING = SkillRef(name='受身蹲伏', code='quickstanding') + "受身蹲伏" + + +class Awakening1SkillRefs(SkillReferences): + """觉醒公共技能第 1 组;后缀沿用职业技能树原始 code。""" + + CLUEOFAWAKENING1 = SkillRef(name='觉醒之抉择 / 觉醒之心', code='clueofawakening1') + "觉醒之抉择 / 觉醒之心" + + INSTANTREALIZATION1 = SkillRef(name='卓越之力', code='instantrealization1') + "卓越之力" + + +class Awakening2SkillRefs(SkillReferences): + """觉醒公共技能第 2 组;后缀沿用职业技能树原始 code。""" + + CLUEOFAWAKENING2 = SkillRef(name='觉醒之抉择', code='clueofawakening2') + "觉醒之抉择" + + INSTANTREALIZATION2 = SkillRef(name='卓越之力', code='instantrealization2') + "卓越之力" + + +class Awakening3SkillRefs(SkillReferences): + """觉醒公共技能第 3 组;后缀沿用职业技能树原始 code。""" + + CLUEOFAWAKENING3 = SkillRef(name='觉醒之抉择', code='clueofawakening3') + "觉醒之抉择" + + INSTANTREALIZATION3 = SkillRef(name='卓越之力', code='instantrealization3') + "卓越之力" + + +class Awakening4SkillRefs(SkillReferences): + """觉醒公共技能第 4 组;后缀沿用职业技能树原始 code。""" + + CLUEOFAWAKENING4 = SkillRef(name='觉醒之抉择', code='clueofawakening4') + "觉醒之抉择" + + INSTANTREALIZATION4 = SkillRef(name='卓越之力', code='instantrealization4') + "卓越之力" + + +class Awakening5SkillRefs(SkillReferences): + """觉醒公共技能第 5 组;后缀沿用职业技能树原始 code。""" + + CLUEOFAWAKENING5 = SkillRef(name='觉醒之抉择', code='clueofawakening5') + "觉醒之抉择" + + INSTANTREALIZATION5 = SkillRef(name='卓越之力', code='instantrealization5') + "卓越之力" + + +class ComboSkillRefs(SkillReferences): + """拥有技能连招的职业共享的引用;创造者、黑暗武士不继承。""" + + SKILLPRESETTYPE1 = SkillRef(name='技能连招', code='skillpresettype1') + "技能连招" diff --git a/backend/core/character/refs/demonic_lancer/__init__.py b/backend/core/character/refs/demonic_lancer/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/demonic_lancer/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/demonic_lancer/dragoon.py b/backend/core/character/refs/demonic_lancer/dragoon.py new file mode 100644 index 00000000..7445b34a --- /dev/null +++ b/backend/core/character/refs/demonic_lancer/dragoon.py @@ -0,0 +1,117 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:demonic_lancer/dragoon/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class DragoonSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """demonic_lancer.dragoon 的技能引用;包含继承的公共技能。""" + __profession__ = 'demonic_lancer.dragoon' + + AFTERSENSATION = SkillRef(name='枪魂感知', code='aftersensation', profession=__profession__) + "枪魂感知" + + AVENHUNTING = SkillRef(name='凌空之狩', code='avenhunting', profession=__profession__) + "凌空之狩" + + BUFFALOFALL = SkillRef(name='蛮横冲撞', code='buffalofall', profession=__profession__) + "蛮横冲撞" + + BURNLOCUST = SkillRef(name='利刃收割', code='burnlocust', profession=__profession__) + "利刃收割" + + DEATHCHARGE = SkillRef(name='绝命猎杀 : 死亡穿刺', code='deathcharge', profession=__profession__) + "绝命猎杀 : 死亡穿刺" + + DEMONICANKLECUT = SkillRef(name='扫堂枪', code='demonicanklecut', profession=__profession__) + "扫堂枪" + + DRAGONSLAYER = SkillRef(name='逐云灭龙杀', code='dragonslayer', profession=__profession__) + "逐云灭龙杀" + + DRILLINGNECK = SkillRef(name='猎杀枪 : 穿心', code='drillingneck', profession=__profession__) + "猎杀枪 : 穿心" + + EARTHWORMHUNT = SkillRef(name='地龙狩', code='earthwormhunt', profession=__profession__) + "地龙狩" + + ENCHANTPARTISAN = SkillRef(name='狩猎本能', code='enchantpartisan', profession=__profession__) + "狩猎本能" + + FORCEOFSOURCE = SkillRef(name='狩猎之心', code='forceofsource', profession=__profession__) + "狩猎之心" + + GRINDERJET = SkillRef(name='无尽毁灭', code='grinderjet', profession=__profession__) + "无尽毁灭" + + HELMSHOT = SkillRef(name='枪挑', code='helmshot', profession=__profession__) + "枪挑" + + HOOKANDTHROW = SkillRef(name='回旋钩', code='hookandthrow', profession=__profession__) + "回旋钩" + + HUNTERSMOVESET = SkillRef(name='狩猎技艺', code='huntersmoveset', profession=__profession__) + "狩猎技艺" + + HUNTINGOFREDMOON = SkillRef(name='红月·狂狩盛宴', code='huntingofredmoon', profession=__profession__) + "红月·狂狩盛宴" + + INDURE = SkillRef(name='格挡反击', code='indure', profession=__profession__) + "格挡反击" + + INSIDIOUSPIKE = SkillRef(name='瞬光猎杀枪', code='insidiouspike', profession=__profession__) + "瞬光猎杀枪" + + KERAVNOS = SkillRef(name='狩魔之魂', code='keravnos', profession=__profession__) + "狩魔之魂" + + LAMBFENCE = SkillRef(name='光焰囚杀', code='lambfence', profession=__profession__) + "光焰囚杀" + + MANAEXTRACT = SkillRef(name='能量萃取', code='manaextract', profession=__profession__) + "能量萃取" + + MOLEHUNT = SkillRef(name='隐鼠之袭', code='molehunt', profession=__profession__) + "隐鼠之袭" + + NEEDLER = SkillRef(name='光焰飞枪', code='needler', profession=__profession__) + "光焰飞枪" + + PARATROOPER = SkillRef(name='落凤枪', code='paratrooper', profession=__profession__) + "落凤枪" + + PARTISANMASTERY = SkillRef(name='光枪精通', code='partisanmastery', profession=__profession__) + "光枪精通" + + PARTISANSHOOT = SkillRef(name='魔枪发射', code='partisanshoot', profession=__profession__) + "魔枪发射" + + PARTISANSKEWER = SkillRef(name='天龙破', code='partisanskewer', profession=__profession__) + "天龙破" + + PENETRATEHEAD = SkillRef(name='鹰坠', code='penetratehead', profession=__profession__) + "鹰坠" + + QUICKPUNTO = SkillRef(name='刺击', code='quickpunto', profession=__profession__) + "刺击" + + SCALEGRINDER = SkillRef(name='龙鳞碎割', code='scalegrinder', profession=__profession__) + "龙鳞碎割" + + SERVERNTLANCE = SkillRef(name='猎杀枪', code='serverntlance', profession=__profession__) + "猎杀枪" + + SERVERNTLANCEASSULT = SkillRef(name='猎杀枪 : 掠食', code='serverntlanceassult', profession=__profession__) + "猎杀枪 : 掠食" + + SIDESLASH = SkillRef(name='横扫', code='sideslash', profession=__profession__) + "横扫" + + STRINGWING = SkillRef(name='光焰枪', code='stringwing', profession=__profession__) + "光焰枪" + + SURROUNDBREAK = SkillRef(name='连环枪', code='surroundbreak', profession=__profession__) + "连环枪" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" diff --git a/backend/core/character/refs/demonic_lancer/impaler.py b/backend/core/character/refs/demonic_lancer/impaler.py new file mode 100644 index 00000000..d32dfc4a --- /dev/null +++ b/backend/core/character/refs/demonic_lancer/impaler.py @@ -0,0 +1,120 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:demonic_lancer/impaler/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class ImpalerSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """demonic_lancer.impaler 的技能引用;包含继承的公共技能。""" + __profession__ = 'demonic_lancer.impaler' + + ABYSSALINVANDER = SkillRef(name='虚空碎灭', code='abyssalinvander', profession=__profession__) + "虚空碎灭" + + DARKAMBITION = SkillRef(name='侵蚀之矛', code='darkambition', profession=__profession__) + "侵蚀之矛" + + DARKBURIAL = SkillRef(name='黑蚀葬礼', code='darkburial', profession=__profession__) + "黑蚀葬礼" + + DARKDESTROYOFSPEAR = SkillRef(name='暗·渊灭禁绝', code='darkdestroyofspear', profession=__profession__) + "暗·渊灭禁绝" + + DARKDIVISION = SkillRef(name='暗影蚀魂', code='darkdivision', profession=__profession__) + "暗影蚀魂" + + DARKEXPLOSIONOFMEAT = SkillRef(name='暗蚀爆雷杀', code='darkexplosionofmeat', profession=__profession__) + "暗蚀爆雷杀" + + DARKIMPULSE = SkillRef(name='冥蚀脉冲', code='darkimpulse', profession=__profession__) + "冥蚀脉冲" + + DARKJAVELINMASTERY = SkillRef(name='暗矛精通', code='darkjavelinmastery', profession=__profession__) + "暗矛精通" + + DARKNESS = SkillRef(name='黑暗化身', code='darkness', profession=__profession__) + "黑暗化身" + + DARKNESSONTHEABYSS = SkillRef(name='黑暗本源', code='darknessontheabyss', profession=__profession__) + "黑暗本源" + + DARKSPEARSUCCESSIVETHROWING = SkillRef(name='无尽侵蚀 : 缚魂', code='darkspearsuccessivethrowing', profession=__profession__) + "无尽侵蚀 : 缚魂" + + DARKSTAR = SkillRef(name='坠蚀之雨', code='darkstar', profession=__profession__) + "坠蚀之雨" + + DEATHSPEAR = SkillRef(name='绝望枪', code='deathspear', profession=__profession__) + "绝望枪" + + DEMONICANKLECUT = SkillRef(name='扫堂枪', code='demonicanklecut', profession=__profession__) + "扫堂枪" + + DEMONICLANCERECKLESS = SkillRef(name='暗枪突破', code='demoniclancereckless', profession=__profession__) + "暗枪突破" + + DESPAIR = SkillRef(name='黑暗枪雨', code='despair', profession=__profession__) + "黑暗枪雨" + + DESTROYLIGHT = SkillRef(name='幽影暗蚀 : 寂灭', code='destroylight', profession=__profession__) + "幽影暗蚀 : 寂灭" + + DIFFUSION = SkillRef(name='连锁侵蚀', code='diffusion', profession=__profession__) + "连锁侵蚀" + + DOUBLETHROW = SkillRef(name='双重投射', code='doublethrow', profession=__profession__) + "双重投射" + + ENCROACH = SkillRef(name='暗蚀', code='encroach', profession=__profession__) + "暗蚀" + + FALLINGDEATH = SkillRef(name='冥夜裂空', code='fallingdeath', profession=__profession__) + "冥夜裂空" + + HELIXSPEAR = SkillRef(name='暗矛投射', code='helixspear', profession=__profession__) + "暗矛投射" + + HELMSHOT = SkillRef(name='枪挑', code='helmshot', profession=__profession__) + "枪挑" + + HOOKANDTHROW = SkillRef(name='回旋钩', code='hookandthrow', profession=__profession__) + "回旋钩" + + INDURE = SkillRef(name='格挡反击', code='indure', profession=__profession__) + "格挡反击" + + PARATROOPER = SkillRef(name='落凤枪', code='paratrooper', profession=__profession__) + "落凤枪" + + PARTISANSHOOT = SkillRef(name='魔枪发射', code='partisanshoot', profession=__profession__) + "魔枪发射" + + PIERCINGDRIVE = SkillRef(name='暗矛贯穿', code='piercingdrive', profession=__profession__) + "暗矛贯穿" + + QUICKPUNTO = SkillRef(name='刺击', code='quickpunto', profession=__profession__) + "刺击" + + RULEROFDARKNESS = SkillRef(name='黑暗支配者', code='rulerofdarkness', profession=__profession__) + "黑暗支配者" + + SIDESLASH = SkillRef(name='横扫', code='sideslash', profession=__profession__) + "横扫" + + SKULKINGDARKNESS = SkillRef(name='暗源之蚀', code='skulkingdarkness', profession=__profession__) + "暗源之蚀" + + SPEARMANSHIP = SkillRef(name='帝国枪术', code='spearmanship', profession=__profession__) + "帝国枪术" + + SPIRALRUSH = SkillRef(name='暗蚀螺旋枪', code='spiralrush', profession=__profession__) + "暗蚀螺旋枪" + + SURROUNDBREAK = SkillRef(name='连环枪', code='surroundbreak', profession=__profession__) + "连环枪" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + VIOLENTPIERCE = SkillRef(name='黑蚀酷刑', code='violentpierce', profession=__profession__) + "黑蚀酷刑" diff --git a/backend/core/character/refs/demonic_lancer/skirmisher.py b/backend/core/character/refs/demonic_lancer/skirmisher.py new file mode 100644 index 00000000..7914af20 --- /dev/null +++ b/backend/core/character/refs/demonic_lancer/skirmisher.py @@ -0,0 +1,114 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:demonic_lancer/skirmisher/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class SkirmisherSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """demonic_lancer.skirmisher 的技能引用;包含继承的公共技能。""" + __profession__ = 'demonic_lancer.skirmisher' + + AURAFORCEJAVELIN = SkillRef(name='流云幻灭', code='auraforcejavelin', profession=__profession__) + "流云幻灭" + + AURALANCE = SkillRef(name='无双枪术', code='auralance', profession=__profession__) + "无双枪术" + + CHAINLANCE = SkillRef(name='无畏波动枪', code='chainlance', profession=__profession__) + "无畏波动枪" + + CRESCENT = SkillRef(name='三一斩月', code='crescent', profession=__profession__) + "三一斩月" + + DEMONICANKLECUT = SkillRef(name='扫堂枪', code='demonicanklecut', profession=__profession__) + "扫堂枪" + + EXTREMESKILLARTS = SkillRef(name='极影无形杀', code='extremeskillarts', profession=__profession__) + "极影无形杀" + + FEARLESSATTITUDE = SkillRef(name='一身是胆', code='fearlessattitude', profession=__profession__) + "一身是胆" + + FORMLESSSPEARMAN = SkillRef(name='行云 : 冥', code='formlessspearman', profession=__profession__) + "行云 : 冥" + + GROUNDSEEKER = SkillRef(name='行云 : 疾', code='groundseeker', profession=__profession__) + "行云 : 疾" + + HELMSHOT = SkillRef(name='枪挑', code='helmshot', profession=__profession__) + "枪挑" + + HOOKANDTHROW = SkillRef(name='回旋钩', code='hookandthrow', profession=__profession__) + "回旋钩" + + INDURE = SkillRef(name='格挡反击', code='indure', profession=__profession__) + "格挡反击" + + LINEARMIRAGEATTACK = SkillRef(name='双龙流云灭', code='linearmirageattack', profession=__profession__) + "双龙流云灭" + + MESOCYCLONE = SkillRef(name='狂龙怒啸', code='mesocyclone', profession=__profession__) + "狂龙怒啸" + + MIRAGE = SkillRef(name='行云诀', code='mirage', profession=__profession__) + "行云诀" + + MIRAGEBOOST = SkillRef(name='行云 : 沐', code='mirageboost', profession=__profession__) + "行云 : 沐" + + MIRAGEHALLUCINATION = SkillRef(name='问鼎·千军破云', code='miragehallucination', profession=__profession__) + "问鼎·千军破云" + + MIRAGESTREAM = SkillRef(name='行云 : 启', code='miragestream', profession=__profession__) + "行云 : 启" + + MYSTFLARE = SkillRef(name='流光无影闪', code='mystflare', profession=__profession__) + "流光无影闪" + + PARATROOPER = SkillRef(name='落凤枪', code='paratrooper', profession=__profession__) + "落凤枪" + + PARTISANSHOOT = SkillRef(name='魔枪发射', code='partisanshoot', profession=__profession__) + "魔枪发射" + + PINPOINTSLASH = SkillRef(name='夺命雷霆枪', code='pinpointslash', profession=__profession__) + "夺命雷霆枪" + + QUICKPUNTO = SkillRef(name='刺击', code='quickpunto', profession=__profession__) + "刺击" + + RISINGLANCER = SkillRef(name='行云 : 落', code='risinglancer', profession=__profession__) + "行云 : 落" + + ROLLINGVULKAN = SkillRef(name='风火燎原', code='rollingvulkan', profession=__profession__) + "风火燎原" + + ROUNDSLASH = SkillRef(name='螺旋波动枪', code='roundslash', profession=__profession__) + "螺旋波动枪" + + SIDESLASH = SkillRef(name='横扫', code='sideslash', profession=__profession__) + "横扫" + + SKYTOOTH = SkillRef(name='升龙破空枪', code='skytooth', profession=__profession__) + "升龙破空枪" + + SPEARMASTERY = SkillRef(name='长枪精通', code='spearmastery', profession=__profession__) + "长枪精通" + + STURM = SkillRef(name='旋风枪', code='sturm', profession=__profession__) + "旋风枪" + + SURROUNDBREAK = SkillRef(name='连环枪', code='surroundbreak', profession=__profession__) + "连环枪" + + SWIRLINGSPEAR = SkillRef(name='行云 : 风', code='swirlingspear', profession=__profession__) + "行云 : 风" + + TASERDRIVE = SkillRef(name='无双突刺', code='taserdrive', profession=__profession__) + "无双突刺" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + TWINPUNTO = SkillRef(name='双重刺击', code='twinpunto', profession=__profession__) + "双重刺击" diff --git a/backend/core/character/refs/demonic_lancer/vanguard.py b/backend/core/character/refs/demonic_lancer/vanguard.py new file mode 100644 index 00000000..19e2ebed --- /dev/null +++ b/backend/core/character/refs/demonic_lancer/vanguard.py @@ -0,0 +1,108 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:demonic_lancer/vanguard/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class VanguardSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """demonic_lancer.vanguard 的技能引用;包含继承的公共技能。""" + __profession__ = 'demonic_lancer.vanguard' + + BEHEAD = SkillRef(name='破灭斩', code='behead', profession=__profession__) + "破灭斩" + + BLADESTORM = SkillRef(name='灭袭乱舞', code='bladestorm', profession=__profession__) + "灭袭乱舞" + + BRANDISH = SkillRef(name='追魂斩', code='brandish', profession=__profession__) + "追魂斩" + + BRUTALSPLIT = SkillRef(name='镇狱裂地枪', code='brutalsplit', profession=__profession__) + "镇狱裂地枪" + + BURSTSLASH = SkillRef(name='断魂裂岩斩', code='burstslash', profession=__profession__) + "断魂裂岩斩" + + CLEAVE = SkillRef(name='狂暴战戟', code='cleave', profession=__profession__) + "狂暴战戟" + + CRESCENTSLASH = SkillRef(name='落月斩', code='crescentslash', profession=__profession__) + "落月斩" + + DEADLYMASSACRE = SkillRef(name='破灭轮回刺', code='deadlymassacre', profession=__profession__) + "破灭轮回刺" + + DEADLYSTEP = SkillRef(name='灭天之魂', code='deadlystep', profession=__profession__) + "灭天之魂" + + DEMONICANKLECUT = SkillRef(name='扫堂枪', code='demonicanklecut', profession=__profession__) + "扫堂枪" + + DEMONICINFERNO = SkillRef(name='血战天狱', code='demonicinferno', profession=__profession__) + "血战天狱" + + DEMONICLANCEAWAKENING = SkillRef(name='战神之力', code='demoniclanceawakening', profession=__profession__) + "战神之力" + + DEMONICLANCECONTROL = SkillRef(name='战戟精通', code='demoniclancecontrol', profession=__profession__) + "战戟精通" + + DEMONICLANCERELEASE = SkillRef(name='不灭战戟', code='demoniclancerelease', profession=__profession__) + "不灭战戟" + + DEVASTATE = SkillRef(name='横扫八荒', code='devastate', profession=__profession__) + "横扫八荒" + + DOOMGLAIVE = SkillRef(name='穿云裂地斩', code='doomglaive', profession=__profession__) + "穿云裂地斩" + + DREADBORE = SkillRef(name='冷血突刺', code='dreadbore', profession=__profession__) + "冷血突刺" + + HEADONCHARGE = SkillRef(name='破军突击', code='headoncharge', profession=__profession__) + "破军突击" + + HELMSHOT = SkillRef(name='枪挑', code='helmshot', profession=__profession__) + "枪挑" + + HOOKANDTHROW = SkillRef(name='回旋钩', code='hookandthrow', profession=__profession__) + "回旋钩" + + IMPACTSMASH = SkillRef(name='战戟猛攻', code='impactsmash', profession=__profession__) + "战戟猛攻" + + INDURE = SkillRef(name='格挡反击', code='indure', profession=__profession__) + "格挡反击" + + LUNGESTRIKE = SkillRef(name='长虹贯日', code='lungestrike', profession=__profession__) + "长虹贯日" + + NEVERMORE = SkillRef(name='天劫·斗灭乾坤', code='nevermore', profession=__profession__) + "天劫·斗灭乾坤" + + PARATROOPER = SkillRef(name='落凤枪', code='paratrooper', profession=__profession__) + "落凤枪" + + PARTISANSHOOT = SkillRef(name='魔枪发射', code='partisanshoot', profession=__profession__) + "魔枪发射" + + QUICKPUNTO = SkillRef(name='刺击', code='quickpunto', profession=__profession__) + "刺击" + + SIDESLASH = SkillRef(name='横扫', code='sideslash', profession=__profession__) + "横扫" + + SMASH = SkillRef(name='霸王戟', code='smash', profession=__profession__) + "霸王戟" + + SURROUNDBREAK = SkillRef(name='连环枪', code='surroundbreak', profession=__profession__) + "连环枪" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + VETERAN = SkillRef(name='战戟之魂', code='veteran', profession=__profession__) + "战戟之魂" + + YOUDIED = SkillRef(name='千魂弑', code='youdied', profession=__profession__) + "千魂弑" diff --git a/backend/core/character/refs/extra/__init__.py b/backend/core/character/refs/extra/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/extra/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/extra/creator.py b/backend/core/character/refs/extra/creator.py new file mode 100644 index 00000000..ee80687f --- /dev/null +++ b/backend/core/character/refs/extra/creator.py @@ -0,0 +1,123 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:extra/creator/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs + + +class CreatorSkillRef(CommonSkillRefs, Awakening1SkillRefs): + """extra.creator 的技能引用;包含继承的公共技能。""" + __profession__ = 'extra.creator' + + AMPLIFICATION = SkillRef(name='时空增幅', code='amplification', profession=__profession__) + "时空增幅" + + ARTEFACTOFCREATION = SkillRef(name='天工开物', code='artefactofcreation', profession=__profession__) + "天工开物" + + CATASTROPHE = SkillRef(name='时之终末 : 归烬', code='catastrophe', profession=__profession__) + "时之终末 : 归烬" + + CONSCIOUSNESS = SkillRef(name='自我觉醒', code='consciousness', profession=__profession__) + "自我觉醒" + + CREATESPACE = SkillRef(name='创世', code='createspace', profession=__profession__) + "创世" + + CREATORBIRTH = SkillRef(name='创生', code='creatorbirth', profession=__profession__) + "创生" + + CREATORCREATE = SkillRef(name='缔造', code='creatorcreate', profession=__profession__) + "缔造" + + CREATORDESTINY = SkillRef(name='命运', code='creatordestiny', profession=__profession__) + "命运" + + CREATORDISTORTION = SkillRef(name='虚空', code='creatordistortion', profession=__profession__) + "虚空" + + CREATORDISTURB = SkillRef(name='控制', code='creatordisturb', profession=__profession__) + "控制" + + CREATORFLAME = SkillRef(name='烈炎', code='creatorflame', profession=__profession__) + "烈炎" + + CREATORFORCE = SkillRef(name='具象强化', code='creatorforce', profession=__profession__) + "具象强化" + + CREATORGUARDIAN = SkillRef(name='守护', code='creatorguardian', profession=__profession__) + "守护" + + CREATORICE = SkillRef(name='寒冰', code='creatorice', profession=__profession__) + "寒冰" + + CREATORREVIVAL = SkillRef(name='构造', code='creatorrevival', profession=__profession__) + "构造" + + CREATORWIND = SkillRef(name='风暴', code='creatorwind', profession=__profession__) + "风暴" + + EXTINCTION = SkillRef(name='终末狂想', code='extinction', profession=__profession__) + "终末狂想" + + FIREHURRICANE = SkillRef(name='烈焰飓风', code='firehurricane', profession=__profession__) + "烈焰飓风" + + FIREMETEO = SkillRef(name='炽炎星陨', code='firemeteo', profession=__profession__) + "炽炎星陨" + + FIREWALL = SkillRef(name='烈火燎原', code='firewall', profession=__profession__) + "烈火燎原" + + ICEAGE = SkillRef(name='冰雪降临', code='iceage', profession=__profession__) + "冰雪降临" + + ICEPLATE = SkillRef(name='冰天震地', code='iceplate', profession=__profession__) + "冰天震地" + + ICEROCK = SkillRef(name='冰霜之球', code='icerock', profession=__profession__) + "冰霜之球" + + ICESHIELD = SkillRef(name='极冰护盾', code='iceshield', profession=__profession__) + "极冰护盾" + + IMAGINATION = SkillRef(name='幻想之境', code='imagination', profession=__profession__) + "幻想之境" + + LINK = SkillRef(name='时空链接', code='link', profession=__profession__) + "时空链接" + + MGRAB = SkillRef(name='时空之手', code='mgrab', profession=__profession__) + "时空之手" + + ORIGINALLIGHT = SkillRef(name='创世之光', code='originallight', profession=__profession__) + "创世之光" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + THECREATION = SkillRef(name='创世之力', code='thecreation', profession=__profession__) + "创世之力" + + THETREEOFSEFIROT = SkillRef(name='生命之树', code='thetreeofsefirot', profession=__profession__) + "生命之树" + + TIMEFORWARD = SkillRef(name='时空禁制', code='timeforward', profession=__profession__) + "时空禁制" + + TUNING = SkillRef(name='同调', code='tuning', profession=__profession__) + "同调" + + UNDERSTANDING = SkillRef(name='洞悉', code='understanding', profession=__profession__) + "洞悉" + + WINDPRESS = SkillRef(name='超能旋风波', code='windpress', profession=__profession__) + "超能旋风波" + + WINDSTORM = SkillRef(name='风暴漩涡', code='windstorm', profession=__profession__) + "风暴漩涡" + + WOODFENCE = SkillRef(name='树之屏障', code='woodfence', profession=__profession__) + "树之屏障" + + WORMHOLE = SkillRef(name='末日虫洞', code='wormhole', profession=__profession__) + "末日虫洞" diff --git a/backend/core/character/refs/extra/dark_knight.py b/backend/core/character/refs/extra/dark_knight.py new file mode 100644 index 00000000..c15ebab1 --- /dev/null +++ b/backend/core/character/refs/extra/dark_knight.py @@ -0,0 +1,156 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:extra/dark_knight/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs + + +class DarkKnightSkillRef(CommonSkillRefs, Awakening1SkillRefs): + """extra.dark_knight 的技能引用;包含继承的公共技能。""" + __profession__ = 'extra.dark_knight' + + BLADEMASTERY = SkillRef(name='暗 · 太刀精通', code='blademastery', profession=__profession__) + "暗 · 太刀精通" + + BLUNTMASTERY = SkillRef(name='暗 · 钝器精通', code='bluntmastery', profession=__profession__) + "暗 · 钝器精通" + + BOUNCEBLOW = SkillRef(name='跃斩', code='bounceblow', profession=__profession__) + "跃斩" + + BRIEFCUT = SkillRef(name='滑斩', code='briefcut', profession=__profession__) + "滑斩" + + CHARGEEXPLOSION = SkillRef(name='斩龙破', code='chargeexplosion', profession=__profession__) + "斩龙破" + + CONSCIOUSNESSDARK = SkillRef(name='自我觉醒', code='consciousnessdark', profession=__profession__) + "自我觉醒" + + CONVERSION = SkillRef(name='攻击类型转换', code='conversion', profession=__profession__) + "攻击类型转换" + + DARKBALL = SkillRef(name='冥魂珠', code='darkball', profession=__profession__) + "冥魂珠" + + DARKBREAK = SkillRef(name='魔狱裂魂斩', code='darkbreak', profession=__profession__) + "魔狱裂魂斩" + + DARKBURST = SkillRef(name='邪影升龙斩', code='darkburst', profession=__profession__) + "邪影升龙斩" + + DARKCRASHER = SkillRef(name='暗影升龙击', code='darkcrasher', profession=__profession__) + "暗影升龙击" + + DARKCROSS = SkillRef(name='黑暗十字刃', code='darkcross', profession=__profession__) + "黑暗十字刃" + + DARKEXPLOSION = SkillRef(name='暗劲爆发', code='darkexplosion', profession=__profession__) + "暗劲爆发" + + DARKFALL = SkillRef(name='冥魂之陨', code='darkfall', profession=__profession__) + "冥魂之陨" + + DARKFLAMESWORD = SkillRef(name='冥炎破空斩', code='darkflamesword', profession=__profession__) + "冥炎破空斩" + + DARKRAVE = SkillRef(name='灭魂封魔斩', code='darkrave', profession=__profession__) + "灭魂封魔斩" + + DARKRUST = SkillRef(name='暗魂之手', code='darkrust', profession=__profession__) + "暗魂之手" + + DARKSLASH = SkillRef(name='暗影斩', code='darkslash', profession=__profession__) + "暗影斩" + + DARKSWORD = SkillRef(name='破魂之刃', code='darksword', profession=__profession__) + "破魂之刃" + + DARKWAVE = SkillRef(name='邪影 · 波动剑', code='darkwave', profession=__profession__) + "邪影 · 波动剑" + + DARKWAVEFALL = SkillRef(name='暗炎冥魂波', code='darkwavefall', profession=__profession__) + "暗炎冥魂波" + + DIABOLICSLASH = SkillRef(name='暗黑溯回斩', code='diabolicslash', profession=__profession__) + "暗黑溯回斩" + + DIMENSIONAGREEMENT = SkillRef(name='次元融合', code='dimensionagreement', profession=__profession__) + "次元融合" + + DRAWSWORD = SkillRef(name='破魂斩', code='drawsword', profession=__profession__) + "破魂斩" + + GRANDWAVE = SkillRef(name='冥光斩', code='grandwave', profession=__profession__) + "冥光斩" + + HEAVYSWORDMASTERY = SkillRef(name='暗 · 巨剑精通', code='heavyswordmastery', profession=__profession__) + "暗 · 巨剑精通" + + HOPSMASH = SkillRef(name='跃地斩', code='hopsmash', profession=__profession__) + "跃地斩" + + ILLUSIONSLASH = SkillRef(name='魔影剑舞', code='illusionslash', profession=__profession__) + "魔影剑舞" + + LIGHTSWORDMASTERY = SkillRef(name='暗 · 光剑精通', code='lightswordmastery', profession=__profession__) + "暗 · 光剑精通" + + MOMENTARYSLASH = SkillRef(name='禁魂斩', code='momentaryslash', profession=__profession__) + "禁魂斩" + + OVERFLOW = SkillRef(name='黑暗释放', code='overflow', profession=__profession__) + "黑暗释放" + + PHANTOMSWORD = SkillRef(name='幽魂剑', code='phantomsword', profession=__profession__) + "幽魂剑" + + PIERCESTRIKE = SkillRef(name='突刺', code='piercestrike', profession=__profession__) + "突刺" + + RAPIDMOVE = SkillRef(name='瞬影斩', code='rapidmove', profession=__profession__) + "瞬影斩" + + SHOCKWAVE = SkillRef(name='凝魂波动阵', code='shockwave', profession=__profession__) + "凝魂波动阵" + + SHORTSWORDMASTERY = SkillRef(name='暗 · 短剑精通', code='shortswordmastery', profession=__profession__) + "暗 · 短剑精通" + + SPINATTACK = SkillRef(name='暗月斩', code='spinattack', profession=__profession__) + "暗月斩" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + THEENDOFTIME = SkillRef(name='时之止境 : 幻灭', code='theendoftime', profession=__profession__) + "时之止境 : 幻灭" + + TIMEBREAK = SkillRef(name='超时空碎裂', code='timebreak', profession=__profession__) + "超时空碎裂" + + TIMELORD = SkillRef(name='时空主宰', code='timelord', profession=__profession__) + "时空主宰" + + TIMESTOP = SkillRef(name='时间停滞', code='timestop', profession=__profession__) + "时间停滞" + + TRIPLESTAB = SkillRef(name='暗影三击剑', code='triplestab', profession=__profession__) + "暗影三击剑" + + UPPER = SkillRef(name='挑击', code='upper', profession=__profession__) + "挑击" + + VANESLASH = SkillRef(name='旋涡斩', code='vaneslash', profession=__profession__) + "旋涡斩" + + WAVE = SkillRef(name='暗影 · 波动剑', code='wave', profession=__profession__) + "暗影 · 波动剑" + + WAVESPIN = SkillRef(name='黑暗明王阵', code='wavespin', profession=__profession__) + "黑暗明王阵" + + WEAPONMASTERYUP = SkillRef(name='暗武奥义', code='weaponmasteryup', profession=__profession__) + "暗武奥义" + + WHIPATTACK = SkillRef(name='暗影鞭', code='whipattack', profession=__profession__) + "暗影鞭" diff --git a/backend/core/character/refs/fighter_female/__init__.py b/backend/core/character/refs/fighter_female/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/fighter_female/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/fighter_female/brawler_female.py b/backend/core/character/refs/fighter_female/brawler_female.py new file mode 100644 index 00000000..8da21461 --- /dev/null +++ b/backend/core/character/refs/fighter_female/brawler_female.py @@ -0,0 +1,144 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:fighter_female/brawler_female/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class BrawlerFemaleSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """fighter_female.brawler_female 的技能引用;包含继承的公共技能。""" + __profession__ = 'fighter_female.brawler_female' + + BLOCKBUSTER = SkillRef(name='砖袭', code='blockbuster', profession=__profession__) + "砖袭" + + BLOCKBUSTEREX = SkillRef(name='爆碎砖袭', code='blockbusterex', profession=__profession__) + "爆碎砖袭" + + CLAWMASTERY = SkillRef(name='爪精通', code='clawmastery', profession=__profession__) + "爪精通" + + CONVERSION = SkillRef(name='攻击类型转换', code='conversion', profession=__profession__) + "攻击类型转换" + + CRAZYMOUNT = SkillRef(name='狂 · 霸王拳', code='crazymount', profession=__profession__) + "狂 · 霸王拳" + + CROUCH = SkillRef(name='蹲伏', code='crouch', profession=__profession__) + "蹲伏" + + DAMAGELOWKICK = SkillRef(name='下段踢', code='damagelowkick', profession=__profession__) + "下段踢" + + DASHAFTERDASH = SkillRef(name='疾风追击', code='dashafterdash', profession=__profession__) + "疾风追击" + + DASHAFTERDASHEXTENSION = SkillRef(name='疾风连击', code='dashafterdashextension', profession=__profession__) + "疾风连击" + + DOUBLETHROW = SkillRef(name='双重投掷', code='doublethrow', profession=__profession__) + "双重投掷" + + DRAGONMINE = SkillRef(name='毒龙轰天雷', code='dragonmine', profession=__profession__) + "毒龙轰天雷" + + EARTHBREAK = SkillRef(name='金刚碎', code='earthbreak', profession=__profession__) + "金刚碎" + + ENCHANTPOISON = SkillRef(name='涂毒', code='enchantpoison', profession=__profession__) + "涂毒" + + ENERGYBALL = SkillRef(name='念气波', code='energyball', profession=__profession__) + "念气波" + + GRABEXPLOSION = SkillRef(name='擒月炎', code='grabexplosion', profession=__profession__) + "擒月炎" + + GRABEXPLOSIONEX = SkillRef(name='猛毒擒月炎', code='grabexplosionex', profession=__profession__) + "猛毒擒月炎" + + GROUNDKICK = SkillRef(name='裂地飞沙', code='groundkick', profession=__profession__) + "裂地飞沙" + + HERESYPOWERTRAINING = SkillRef(name='毒攻掌握', code='heresypowertraining', profession=__profession__) + "毒攻掌握" + + HIDDENSTING = SkillRef(name='毒影针', code='hiddensting', profession=__profession__) + "毒影针" + + IRONSKIN = SkillRef(name='钢筋铁骨', code='ironskin', profession=__profession__) + "钢筋铁骨" + + JUNKSPIN = SkillRef(name='街头风暴', code='junkspin', profession=__profession__) + "街头风暴" + + KENSIN = SkillRef(name='分身', code='kensin', profession=__profession__) + "分身" + + LIFTUPPER = SkillRef(name='上勾拳', code='liftupper', profession=__profession__) + "上勾拳" + + MOUNT = SkillRef(name='伏虎霸王拳', code='mount', profession=__profession__) + "伏虎霸王拳" + + PAINKILLER = SkillRef(name='钻心毒爆', code='painkiller', profession=__profession__) + "钻心毒爆" + + POISONEXPLOSION = SkillRef(name='连环毒爆弹', code='poisonexplosion', profession=__profession__) + "连环毒爆弹" + + POISONEXPLOSIONCUSTOM = SkillRef(name='秘制毒爆弹', code='poisonexplosioncustom', profession=__profession__) + "秘制毒爆弹" + + POISONMASTERY = SkillRef(name='猛毒之血', code='poisonmastery', profession=__profession__) + "猛毒之血" + + POISONMIST = SkillRef(name='死亡毒雾', code='poisonmist', profession=__profession__) + "死亡毒雾" + + POISONSNAKE = SkillRef(name='万毒噬心诀', code='poisonsnake', profession=__profession__) + "万毒噬心诀" + + POISONSPIRIT = SkillRef(name='身化万毒', code='poisonspirit', profession=__profession__) + "身化万毒" + + POISONSTUN = SkillRef(name='猛毒之伤', code='poisonstun', profession=__profession__) + "猛毒之伤" + + POISONTOLERANCEUP = SkillRef(name='剧毒抵抗', code='poisontoleranceup', profession=__profession__) + "剧毒抵抗" + + POUNCE = SkillRef(name='袭刺', code='pounce', profession=__profession__) + "袭刺" + + PROVOCATION = SkillRef(name='挑衅', code='provocation', profession=__profession__) + "挑衅" + + SINGLEKICK = SkillRef(name='前踢', code='singlekick', profession=__profession__) + "前踢" + + SNAKECAVE = SkillRef(name='禁技 : 万毒蛇窟', code='snakecave', profession=__profession__) + "禁技 : 万毒蛇窟" + + SNAKECHAOS = SkillRef(name='万毒噬心诀 : 毒龙吞天', code='snakechaos', profession=__profession__) + "万毒噬心诀 : 毒龙吞天" + + STOMP = SkillRef(name='鹰踏', code='stomp', profession=__profession__) + "鹰踏" + + SUPLEX = SkillRef(name='背摔', code='suplex', profession=__profession__) + "背摔" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + THROWSAND = SkillRef(name='抛沙', code='throwsand', profession=__profession__) + "抛沙" + + THROWWEB = SkillRef(name='天罗地网', code='throwweb', profession=__profession__) + "天罗地网" + + VENOMMINE = SkillRef(name='毒雷引爆', code='venommine', profession=__profession__) + "毒雷引爆" + + WHIRLWINDKICK = SkillRef(name='旋风腿', code='whirlwindkick', profession=__profession__) + "旋风腿" diff --git a/backend/core/character/refs/fighter_female/grappler_female.py b/backend/core/character/refs/fighter_female/grappler_female.py new file mode 100644 index 00000000..30e2ee08 --- /dev/null +++ b/backend/core/character/refs/fighter_female/grappler_female.py @@ -0,0 +1,138 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:fighter_female/grappler_female/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class GrapplerFemaleSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """fighter_female.grappler_female 的技能引用;包含继承的公共技能。""" + __profession__ = 'fighter_female.grappler_female' + + BACKSUPLEX = SkillRef(name='强力抱摔', code='backsuplex', profession=__profession__) + "强力抱摔" + + CHAINCONNECTION = SkillRef(name='无情抓取', code='chainconnection', profession=__profession__) + "无情抓取" + + CHAINGRAB = SkillRef(name='极手奥义', code='chaingrab', profession=__profession__) + "极手奥义" + + CROUCH = SkillRef(name='蹲伏', code='crouch', profession=__profession__) + "蹲伏" + + DAMAGELOWKICK = SkillRef(name='下段踢', code='damagelowkick', profession=__profession__) + "下段踢" + + DASHAFTERDASH = SkillRef(name='疾风追击', code='dashafterdash', profession=__profession__) + "疾风追击" + + DASHAFTERDASHEXTENSION = SkillRef(name='疾风连击', code='dashafterdashextension', profession=__profession__) + "疾风连击" + + DEFINITEGRAB = SkillRef(name='暴力抓取', code='definitegrab', profession=__profession__) + "暴力抓取" + + EARTHBREAK = SkillRef(name='金刚碎', code='earthbreak', profession=__profession__) + "金刚碎" + + ELBOWTHROW = SkillRef(name='末日摇篮', code='elbowthrow', profession=__profession__) + "末日摇篮" + + ENERGYBALL = SkillRef(name='念气波', code='energyball', profession=__profession__) + "念气波" + + FINALEOFTHEQUEEN = SkillRef(name='女皇时代·辉煌舞台', code='finaleofthequeen', profession=__profession__) + "女皇时代·辉煌舞台" + + GRABCANNON = SkillRef(name='抓轰炮', code='grabcannon', profession=__profession__) + "抓轰炮" + + GRABMASTERY = SkillRef(name='抓取奥义', code='grabmastery', profession=__profession__) + "抓取奥义" + + HOLDUP = SkillRef(name='霹雳肘击', code='holdup', profession=__profession__) + "霹雳肘击" + + HURRICANESUPERSUPLEX = SkillRef(name='苍宇彗星落', code='hurricanesupersuplex', profession=__profession__) + "苍宇彗星落" + + IRONSKIN = SkillRef(name='钢筋铁骨', code='ironskin', profession=__profession__) + "钢筋铁骨" + + JOINTSMASH = SkillRef(name='霹雳冲击', code='jointsmash', profession=__profession__) + "霹雳冲击" + + KENSIN = SkillRef(name='分身', code='kensin', profession=__profession__) + "分身" + + LEGSUPLEX = SkillRef(name='空绞锤', code='legsuplex', profession=__profession__) + "空绞锤" + + LIFTUPPER = SkillRef(name='上勾拳', code='liftupper', profession=__profession__) + "上勾拳" + + PUNCHAFTERRETURN = SkillRef(name='折颈', code='punchafterreturn', profession=__profession__) + "折颈" + + SHININGWINGSFLAP = SkillRef(name='送葬舞步', code='shiningwingsflap', profession=__profession__) + "送葬舞步" + + SHOULDERTACKLE = SkillRef(name='野蛮冲撞', code='shouldertackle', profession=__profession__) + "野蛮冲撞" + + SINGLEKICK = SkillRef(name='前踢', code='singlekick', profession=__profession__) + "前踢" + + SLIDEGRAB = SkillRef(name='滑行抓取', code='slidegrab', profession=__profession__) + "滑行抓取" + + SPINNINGSPLASH = SkillRef(name='旋风轰击', code='spinningsplash', profession=__profession__) + "旋风轰击" + + SPIRE = SkillRef(name='螺旋彗星落', code='spire', profession=__profession__) + "螺旋彗星落" + + STABLETHEULTIMATE = SkillRef(name='光芒之翼', code='stabletheultimate', profession=__profession__) + "光芒之翼" + + STOMP = SkillRef(name='鹰踏', code='stomp', profession=__profession__) + "鹰踏" + + SUPLEX = SkillRef(name='背摔', code='suplex', profession=__profession__) + "背摔" + + SUPLEXCYCLONE = SkillRef(name='地狱摇篮', code='suplexcyclone', profession=__profession__) + "地狱摇篮" + + SUPLEXCYCLONEEX = SkillRef(name='死亡摇篮', code='suplexcycloneex', profession=__profession__) + "死亡摇篮" + + SUPLEXSUBPOWERUP = SkillRef(name='摔技强化', code='suplexsubpowerup', profession=__profession__) + "摔技强化" + + TECHNICIANGRAPPLING = SkillRef(name='格斗专精', code='techniciangrappling', profession=__profession__) + "格斗专精" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + THROWENEMY = SkillRef(name='抛投', code='throwenemy', profession=__profession__) + "抛投" + + THROWSAND = SkillRef(name='抛沙', code='throwsand', profession=__profession__) + "抛沙" + + TORBELLINO = SkillRef(name='风暴之舞', code='torbellino', profession=__profession__) + "风暴之舞" + + TURNHEEL = SkillRef(name='随机应变', code='turnheel', profession=__profession__) + "随机应变" + + TYPHOON = SkillRef(name='末日风暴', code='typhoon', profession=__profession__) + "末日风暴" + + WHIRLWINDKICK = SkillRef(name='旋风腿', code='whirlwindkick', profession=__profession__) + "旋风腿" + + WILDCANNONSPIKE = SkillRef(name='裂石破天', code='wildcannonspike', profession=__profession__) + "裂石破天" diff --git a/backend/core/character/refs/fighter_female/nenmaster_female.py b/backend/core/character/refs/fighter_female/nenmaster_female.py new file mode 100644 index 00000000..5ac831f6 --- /dev/null +++ b/backend/core/character/refs/fighter_female/nenmaster_female.py @@ -0,0 +1,138 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:fighter_female/nenmaster_female/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class NenmasterFemaleSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """fighter_female.nenmaster_female 的技能引用;包含继承的公共技能。""" + __profession__ = 'fighter_female.nenmaster_female' + + ABSORBENERGYBALL = SkillRef(name='聚能念气炮', code='absorbenergyball', profession=__profession__) + "聚能念气炮" + + BLINDTOLERANCEUP = SkillRef(name='念气感知', code='blindtoleranceup', profession=__profession__) + "念气感知" + + CROUCH = SkillRef(name='蹲伏', code='crouch', profession=__profession__) + "蹲伏" + + DAMAGELOWKICK = SkillRef(name='下段踢', code='damagelowkick', profession=__profession__) + "下段踢" + + DASHAFTERDASH = SkillRef(name='疾风追击', code='dashafterdash', profession=__profession__) + "疾风追击" + + DASHAFTERDASHEXTENSION = SkillRef(name='疾风连击', code='dashafterdashextension', profession=__profession__) + "疾风连击" + + DOUBLELIGHTNINGDRAGON = SkillRef(name='念印幻流破', code='doublelightningdragon', profession=__profession__) + "念印幻流破" + + EARTHBREAK = SkillRef(name='金刚碎', code='earthbreak', profession=__profession__) + "金刚碎" + + ENERGYBALL = SkillRef(name='念气波', code='energyball', profession=__profession__) + "念气波" + + ENERGYBALLCHARGE = SkillRef(name='蓄念炮', code='energyballcharge', profession=__profession__) + "蓄念炮" + + FALLINGFLOWER = SkillRef(name='念花守心', code='fallingflower', profession=__profession__) + "念花守心" + + ILLUSIONBOMB = SkillRef(name='幻影爆碎', code='illusionbomb', profession=__profession__) + "幻影爆碎" + + INSTILWILLTONEN = SkillRef(name='念气归元', code='instilwilltonen', profession=__profession__) + "念气归元" + + IRONSKIN = SkillRef(name='钢筋铁骨', code='ironskin', profession=__profession__) + "钢筋铁骨" + + KENSIN = SkillRef(name='分身', code='kensin', profession=__profession__) + "分身" + + KIKOUKEN = SkillRef(name='螺旋念气场', code='kikouken', profession=__profession__) + "螺旋念气场" + + LIFTUPPER = SkillRef(name='上勾拳', code='liftupper', profession=__profession__) + "上勾拳" + + LIGHTDRAGONTHIRTEEN = SkillRef(name='奔雷掌', code='lightdragonthirteen', profession=__profession__) + "奔雷掌" + + LIGHTENCHANTWEAPON = SkillRef(name='光之兵刃', code='lightenchantweapon', profession=__profession__) + "光之兵刃" + + LIGHTFRIENDSHIP = SkillRef(name='光之亲和', code='lightfriendship', profession=__profession__) + "光之亲和" + + LIGHTTOLERANCEUP = SkillRef(name='烈日气息', code='lighttoleranceup', profession=__profession__) + "烈日气息" + + NENFLOWER = SkillRef(name='千莲怒放', code='nenflower', profession=__profession__) + "千莲怒放" + + NENGUARD = SkillRef(name='念气罩', code='nenguard', profession=__profession__) + "念气罩" + + NENGUARDEX = SkillRef(name='究极念气罩', code='nenguardex', profession=__profession__) + "究极念气罩" + + NENMONSTERWHITETIGER = SkillRef(name='念兽 : 龙虎啸', code='nenmonsterwhitetiger', profession=__profession__) + "念兽 : 龙虎啸" + + NENOFBRILLIANCE = SkillRef(name='念帝旋天破', code='nenofbrilliance', profession=__profession__) + "念帝旋天破" + + NENPRISON = SkillRef(name='气玉弹', code='nenprison', profession=__profession__) + "气玉弹" + + NENSHIELD = SkillRef(name='乱舞 · 千叶花', code='nenshield', profession=__profession__) + "乱舞 · 千叶花" + + SAINTILLUSION = SkillRef(name='击电奔星', code='saintillusion', profession=__profession__) + "击电奔星" + + SAJAHU = SkillRef(name='狮子吼', code='sajahu', profession=__profession__) + "狮子吼" + + SAJAHUEX = SkillRef(name='狂狮怒吼', code='sajahuex', profession=__profession__) + "狂狮怒吼" + + SINGLEKICK = SkillRef(name='前踢', code='singlekick', profession=__profession__) + "前踢" + + SKYTHUNDERSTEP = SkillRef(name='天雷分身步', code='skythunderstep', profession=__profession__) + "天雷分身步" + + SOARINGLIGHTDRAGON = SkillRef(name='狂龙升天破', code='soaringlightdragon', profession=__profession__) + "狂龙升天破" + + SPIRALDRAGONWAVE = SkillRef(name='念兽螺旋波', code='spiraldragonwave', profession=__profession__) + "念兽螺旋波" + + SPIRALNEN = SkillRef(name='念气环绕', code='spiralnen', profession=__profession__) + "念气环绕" + + STOMP = SkillRef(name='鹰踏', code='stomp', profession=__profession__) + "鹰踏" + + SUPLEX = SkillRef(name='背摔', code='suplex', profession=__profession__) + "背摔" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + THROWSAND = SkillRef(name='抛沙', code='throwsand', profession=__profession__) + "抛沙" + + THUNDERRUSH = SkillRef(name='念雷破', code='thunderrush', profession=__profession__) + "念雷破" + + THUNDERSUPLEX = SkillRef(name='雷霆背摔', code='thundersuplex', profession=__profession__) + "雷霆背摔" + + WHIRLWINDKICK = SkillRef(name='旋风腿', code='whirlwindkick', profession=__profession__) + "旋风腿" diff --git a/backend/core/character/refs/fighter_female/striker_female.py b/backend/core/character/refs/fighter_female/striker_female.py new file mode 100644 index 00000000..21de61ee --- /dev/null +++ b/backend/core/character/refs/fighter_female/striker_female.py @@ -0,0 +1,123 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:fighter_female/striker_female/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class StrikerFemaleSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """fighter_female.striker_female 的技能引用;包含继承的公共技能。""" + __profession__ = 'fighter_female.striker_female' + + AIMVITALPOINT = SkillRef(name='弱点感知', code='aimvitalpoint', profession=__profession__) + "弱点感知" + + BLOWTODESTRUCTION = SkillRef(name='陨星灭天击', code='blowtodestruction', profession=__profession__) + "陨星灭天击" + + CHAINDESTRUCTION = SkillRef(name='无影脚', code='chaindestruction', profession=__profession__) + "无影脚" + + CLOSEPUNCH = SkillRef(name='寸拳', code='closepunch', profession=__profession__) + "寸拳" + + CRASHLOWKICK = SkillRef(name='碎骨', code='crashlowkick', profession=__profession__) + "碎骨" + + CROUCH = SkillRef(name='蹲伏', code='crouch', profession=__profession__) + "蹲伏" + + DAMAGELOWKICK = SkillRef(name='下段踢', code='damagelowkick', profession=__profession__) + "下段踢" + + DASHAFTERDASH = SkillRef(name='疾风追击', code='dashafterdash', profession=__profession__) + "疾风追击" + + DASHAFTERDASHEXTENSION = SkillRef(name='疾风连击', code='dashafterdashextension', profession=__profession__) + "疾风连击" + + DASHPUNCH = SkillRef(name='崩拳', code='dashpunch', profession=__profession__) + "崩拳" + + DASHPUNCHEX = SkillRef(name='破碎拳', code='dashpunchex', profession=__profession__) + "破碎拳" + + EARTHBREAK = SkillRef(name='金刚碎', code='earthbreak', profession=__profession__) + "金刚碎" + + ENERGYBALL = SkillRef(name='念气波', code='energyball', profession=__profession__) + "念气波" + + EQUIPBOXINGGLOVE = SkillRef(name='拳套掌握', code='equipboxingglove', profession=__profession__) + "拳套掌握" + + FINALHEAVEN = SkillRef(name='极尽 : 霸皇断空拳', code='finalheaven', profession=__profession__) + "极尽 : 霸皇断空拳" + + IRONSKIN = SkillRef(name='钢筋铁骨', code='ironskin', profession=__profession__) + "钢筋铁骨" + + KENSIN = SkillRef(name='分身', code='kensin', profession=__profession__) + "分身" + + LIFTUPPER = SkillRef(name='上勾拳', code='liftupper', profession=__profession__) + "上勾拳" + + LIGHTNINGDANCE = SkillRef(name='闪电之舞', code='lightningdance', profession=__profession__) + "闪电之舞" + + LIGHTNINGSHIFT = SkillRef(name='雷霆之舞', code='lightningshift', profession=__profession__) + "雷霆之舞" + + LIMITBREAK = SkillRef(name='神武之力', code='limitbreak', profession=__profession__) + "神武之力" + + MUSCLESHIFT = SkillRef(name='柔化肌肉', code='muscleshift', profession=__profession__) + "柔化肌肉" + + NOPAINNOGAIN = SkillRef(name='疾风劲', code='nopainnogain', profession=__profession__) + "疾风劲" + + ONEELBOWCHAINHIT = SkillRef(name='回天连环击', code='oneelbowchainhit', profession=__profession__) + "回天连环击" + + POWERUPONDASH = SkillRef(name='武神步', code='powerupondash', profession=__profession__) + "武神步" + + RANDOMKICK = SkillRef(name='纷影连环踢', code='randomkick', profession=__profession__) + "纷影连环踢" + + RISINGUPPER = SkillRef(name='升龙拳', code='risingupper', profession=__profession__) + "升龙拳" + + SHOULDERCHARGE = SkillRef(name='铁山靠', code='shouldercharge', profession=__profession__) + "铁山靠" + + SINGLEKICK = SkillRef(name='前踢', code='singlekick', profession=__profession__) + "前踢" + + SLOWDOWNPOWERUP = SkillRef(name='强拳', code='slowdownpowerup', profession=__profession__) + "强拳" + + STOMP = SkillRef(name='鹰踏', code='stomp', profession=__profession__) + "鹰踏" + + STRONGESTLOWKICK = SkillRef(name='武神强踢', code='strongestlowkick', profession=__profession__) + "武神强踢" + + SUPERARMOR = SkillRef(name='霸体护甲', code='superarmor', profession=__profession__) + "霸体护甲" + + SUPLEX = SkillRef(name='背摔', code='suplex', profession=__profession__) + "背摔" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + THROWSAND = SkillRef(name='抛沙', code='throwsand', profession=__profession__) + "抛沙" + + TIGERSTRIKE = SkillRef(name='虎啸神拳', code='tigerstrike', profession=__profession__) + "虎啸神拳" + + WHIRLWINDKICK = SkillRef(name='旋风腿', code='whirlwindkick', profession=__profession__) + "旋风腿" diff --git a/backend/core/character/refs/fighter_male/__init__.py b/backend/core/character/refs/fighter_male/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/fighter_male/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/fighter_male/brawler_male.py b/backend/core/character/refs/fighter_male/brawler_male.py new file mode 100644 index 00000000..4d62cb82 --- /dev/null +++ b/backend/core/character/refs/fighter_male/brawler_male.py @@ -0,0 +1,147 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:fighter_male/brawler_male/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class BrawlerMaleSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """fighter_male.brawler_male 的技能引用;包含继承的公共技能。""" + __profession__ = 'fighter_male.brawler_male' + + AUTOLOAD = SkillRef(name='自动填充', code='autoload', profession=__profession__) + "自动填充" + + BACKPOCKET = SkillRef(name='后备口袋', code='backpocket', profession=__profession__) + "后备口袋" + + BADENDING = SkillRef(name='逆道·幽链之界', code='badending', profession=__profession__) + "逆道·幽链之界" + + BLOCKBUSTER = SkillRef(name='砖块投掷', code='blockbuster', profession=__profession__) + "砖块投掷" + + CHAINDRIVE = SkillRef(name='暗街夺命锁', code='chaindrive', profession=__profession__) + "暗街夺命锁" + + CLAWMASTERY = SkillRef(name='爪精通', code='clawmastery', profession=__profession__) + "爪精通" + + CONVERSION = SkillRef(name='攻击类型转换', code='conversion', profession=__profession__) + "攻击类型转换" + + CRASHCHAIN = SkillRef(name='千锁乱舞', code='crashchain', profession=__profession__) + "千锁乱舞" + + CRAZYMOUNT = SkillRef(name='狂 · 霸王拳', code='crazymount', profession=__profession__) + "狂 · 霸王拳" + + CROUCH = SkillRef(name='蹲伏', code='crouch', profession=__profession__) + "蹲伏" + + DAMAGELOWKICK = SkillRef(name='下段踢', code='damagelowkick', profession=__profession__) + "下段踢" + + DASHAFTERDASH = SkillRef(name='疾风追击', code='dashafterdash', profession=__profession__) + "疾风追击" + + DASHAFTERDASHEXTENSION = SkillRef(name='疾风连击', code='dashafterdashextension', profession=__profession__) + "疾风连击" + + DESTROYEARTHSKYDROP = SkillRef(name='天崩地裂', code='destroyearthskydrop', profession=__profession__) + "天崩地裂" + + DOUBLETHROW = SkillRef(name='后街战术', code='doublethrow', profession=__profession__) + "后街战术" + + EARTHBREAK = SkillRef(name='金刚碎', code='earthbreak', profession=__profession__) + "金刚碎" + + ENCHANTPOISON = SkillRef(name='毒瓶投掷', code='enchantpoison', profession=__profession__) + "毒瓶投掷" + + ENERGYBALL = SkillRef(name='念气波', code='energyball', profession=__profession__) + "念气波" + + FASTDASH = SkillRef(name='瞬步', code='fastdash', profession=__profession__) + "瞬步" + + FIREWORKS = SkillRef(name='燃火轰天炮', code='fireworks', profession=__profession__) + "燃火轰天炮" + + GLUEYFRUITEX = SkillRef(name='爆破污桶', code='glueyfruitex', profession=__profession__) + "爆破污桶" + + GRABEXPLOSION = SkillRef(name='擒月炎', code='grabexplosion', profession=__profession__) + "擒月炎" + + GROUNDKICK = SkillRef(name='螺旋滑铲', code='groundkick', profession=__profession__) + "螺旋滑铲" + + HERESYPOWERTRAINING = SkillRef(name='毒攻掌握', code='heresypowertraining', profession=__profession__) + "毒攻掌握" + + HIDDENSTING = SkillRef(name='毒针投掷', code='hiddensting', profession=__profession__) + "毒针投掷" + + KENSIN = SkillRef(name='分身', code='kensin', profession=__profession__) + "分身" + + LIFTUPPER = SkillRef(name='后踢', code='liftupper', profession=__profession__) + "后踢" + + MOUNT = SkillRef(name='伏虎霸王拳', code='mount', profession=__profession__) + "伏虎霸王拳" + + OUTLAW = SkillRef(name='逆道·皆允', code='outlaw', profession=__profession__) + "逆道·皆允" + + PHYSICALDEFENSEUP = SkillRef(name='钢筋铁骨', code='physicaldefenseup', profession=__profession__) + "钢筋铁骨" + + POISONTOLERANCEUP = SkillRef(name='剧毒抵抗', code='poisontoleranceup', profession=__profession__) + "剧毒抵抗" + + PROVOCATION = SkillRef(name='挑衅', code='provocation', profession=__profession__) + "挑衅" + + ROADTOHELL = SkillRef(name='逆道·爆狱', code='roadtohell', profession=__profession__) + "逆道·爆狱" + + RUINRAIN = SkillRef(name='飞沙走石', code='ruinrain', profession=__profession__) + "飞沙走石" + + RULEBREAK = SkillRef(name='诡诈之道', code='rulebreak', profession=__profession__) + "诡诈之道" + + SINGLEKICK = SkillRef(name='前踢', code='singlekick', profession=__profession__) + "前踢" + + SKILL_1000HANDS1000EYES = SkillRef(name='千手奥义', code='1000hands1000eyes', profession=__profession__) + "千手奥义" + + SMARTTHROW = SkillRef(name='投掷强化', code='smartthrow', profession=__profession__) + "投掷强化" + + STOMP = SkillRef(name='鹰踏', code='stomp', profession=__profession__) + "鹰踏" + + SUPLEX = SkillRef(name='膝击', code='suplex', profession=__profession__) + "膝击" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + THROWSAND = SkillRef(name='抛沙', code='throwsand', profession=__profession__) + "抛沙" + + THROWWEB = SkillRef(name='罗网投掷', code='throwweb', profession=__profession__) + "罗网投掷" + + VENOMMINE = SkillRef(name='毒雷引爆', code='venommine', profession=__profession__) + "毒雷引爆" + + VICIOUSLARIAT = SkillRef(name='极恶飞锁', code='viciouslariat', profession=__profession__) + "极恶飞锁" + + WHIRLWINDKICK = SkillRef(name='旋风腿', code='whirlwindkick', profession=__profession__) + "旋风腿" diff --git a/backend/core/character/refs/fighter_male/grappler_male.py b/backend/core/character/refs/fighter_male/grappler_male.py new file mode 100644 index 00000000..1817ad13 --- /dev/null +++ b/backend/core/character/refs/fighter_male/grappler_male.py @@ -0,0 +1,138 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:fighter_male/grappler_male/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class GrapplerMaleSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """fighter_male.grappler_male 的技能引用;包含继承的公共技能。""" + __profession__ = 'fighter_male.grappler_male' + + BACKSUPLEX = SkillRef(name='连环抓取', code='backsuplex', profession=__profession__) + "连环抓取" + + BREAKDOWN = SkillRef(name='无情摔击', code='breakdown', profession=__profession__) + "无情摔击" + + CHAINBRAKE = SkillRef(name='疾风闪电', code='chainbrake', profession=__profession__) + "疾风闪电" + + CHARGESPEAREX = SkillRef(name='彗星冲击', code='chargespearex', profession=__profession__) + "彗星冲击" + + CROUCH = SkillRef(name='蹲伏', code='crouch', profession=__profession__) + "蹲伏" + + CYCLONECRASH = SkillRef(name='黑震旋风', code='cyclonecrash', profession=__profession__) + "黑震旋风" + + DAMAGELOWKICK = SkillRef(name='下段踢', code='damagelowkick', profession=__profession__) + "下段踢" + + DASHAFTERDASH = SkillRef(name='疾风追击', code='dashafterdash', profession=__profession__) + "疾风追击" + + DASHAFTERDASHEXTENSION = SkillRef(name='疾风连击', code='dashafterdashextension', profession=__profession__) + "疾风连击" + + DEATHDOORDESTROY = SkillRef(name='黑震流·山岳崩颓', code='deathdoordestroy', profession=__profession__) + "黑震流·山岳崩颓" + + DEFINITEGRAB = SkillRef(name='暴力抓取', code='definitegrab', profession=__profession__) + "暴力抓取" + + EARTHBREAK = SkillRef(name='金刚碎', code='earthbreak', profession=__profession__) + "金刚碎" + + ENERGYBALL = SkillRef(name='念气波', code='energyball', profession=__profession__) + "念气波" + + FASTDASH = SkillRef(name='瞬步', code='fastdash', profession=__profession__) + "瞬步" + + FINALEXTREMESTRIKE = SkillRef(name='一字传承 : 极义震天破', code='finalextremestrike', profession=__profession__) + "一字传承 : 极义震天破" + + GAUNTLETMASTERY = SkillRef(name='臂铠精通', code='gauntletmastery', profession=__profession__) + "臂铠精通" + + GRABCANNON = SkillRef(name='抓轰炮', code='grabcannon', profession=__profession__) + "抓轰炮" + + HOLDUP = SkillRef(name='霹雳旋踢', code='holdup', profession=__profession__) + "霹雳旋踢" + + IMPERTURBABLE = SkillRef(name='神怡气静', code='imperturbable', profession=__profession__) + "神怡气静" + + KENSIN = SkillRef(name='分身', code='kensin', profession=__profession__) + "分身" + + LEGSUPLEX = SkillRef(name='空绞锤', code='legsuplex', profession=__profession__) + "空绞锤" + + LIFTUPPER = SkillRef(name='后踢', code='liftupper', profession=__profession__) + "后踢" + + MAGNUMSAULT = SkillRef(name='疾波猛坠', code='magnumsault', profession=__profession__) + "疾波猛坠" + + PHYSICALDEFENSEUP = SkillRef(name='钢筋铁骨', code='physicaldefenseup', profession=__profession__) + "钢筋铁骨" + + PUNCHAFTERRETURN = SkillRef(name='折颈', code='punchafterreturn', profession=__profession__) + "折颈" + + SHOULDERTACKLE = SkillRef(name='野蛮冲撞', code='shouldertackle', profession=__profession__) + "野蛮冲撞" + + SINGLEKICK = SkillRef(name='前踢', code='singlekick', profession=__profession__) + "前踢" + + SKILL_108STAIRSEX = SkillRef(name='武莲华', code='108stairsex', profession=__profession__) + "武莲华" + + SLIDEGRAB = SkillRef(name='滑行抓取', code='slidegrab', profession=__profession__) + "滑行抓取" + + SPIRE = SkillRef(name='浮空凌云踢', code='spire', profession=__profession__) + "浮空凌云踢" + + STOMP = SkillRef(name='鹰踏', code='stomp', profession=__profession__) + "鹰踏" + + STONESHOWER = SkillRef(name='黑震流·殒灭', code='stoneshower', profession=__profession__) + "黑震流·殒灭" + + SUPLEX = SkillRef(name='膝击', code='suplex', profession=__profession__) + "膝击" + + SUPLEXCYCLONE = SkillRef(name='地狱风火轮', code='suplexcyclone', profession=__profession__) + "地狱风火轮" + + SUPLEXSUBPOWERUP = SkillRef(name='摔技强化', code='suplexsubpowerup', profession=__profession__) + "摔技强化" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + THROWENEMY = SkillRef(name='抛投', code='throwenemy', profession=__profession__) + "抛投" + + THROWSAND = SkillRef(name='抛沙', code='throwsand', profession=__profession__) + "抛沙" + + TYPHOON = SkillRef(name='死亡旋律', code='typhoon', profession=__profession__) + "死亡旋律" + + TYPHOONCOUNTERSTRIKE = SkillRef(name='力之奥义', code='typhooncounterstrike', profession=__profession__) + "力之奥义" + + WHIRLWINDKICK = SkillRef(name='旋风腿', code='whirlwindkick', profession=__profession__) + "旋风腿" + + WHOISNEXT = SkillRef(name='傲天之怒', code='whoisnext', profession=__profession__) + "傲天之怒" + + WILDCANNONSPIKE = SkillRef(name='裂石破天', code='wildcannonspike', profession=__profession__) + "裂石破天" diff --git a/backend/core/character/refs/fighter_male/nenmaster_male.py b/backend/core/character/refs/fighter_male/nenmaster_male.py new file mode 100644 index 00000000..c3c0607a --- /dev/null +++ b/backend/core/character/refs/fighter_male/nenmaster_male.py @@ -0,0 +1,141 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:fighter_male/nenmaster_male/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class NenmasterMaleSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """fighter_male.nenmaster_male 的技能引用;包含继承的公共技能。""" + __profession__ = 'fighter_male.nenmaster_male' + + ATTAINTHENATURE = SkillRef(name='禅意·万象', code='attainthenature', profession=__profession__) + "禅意·万象" + + BLINDTOLERANCEUP = SkillRef(name='念气感知', code='blindtoleranceup', profession=__profession__) + "念气感知" + + CROUCH = SkillRef(name='蹲伏', code='crouch', profession=__profession__) + "蹲伏" + + DAMAGELOWKICK = SkillRef(name='下段踢', code='damagelowkick', profession=__profession__) + "下段踢" + + DASHAFTERDASH = SkillRef(name='疾风追击', code='dashafterdash', profession=__profession__) + "疾风追击" + + DASHAFTERDASHEXTENSION = SkillRef(name='疾风连击', code='dashafterdashextension', profession=__profession__) + "疾风连击" + + EARTHBREAK = SkillRef(name='金刚碎', code='earthbreak', profession=__profession__) + "金刚碎" + + ENERGYBALL = SkillRef(name='念气波', code='energyball', profession=__profession__) + "念气波" + + ENERGYBALLCHARGE = SkillRef(name='蓄念炮', code='energyballcharge', profession=__profession__) + "蓄念炮" + + FASTDASH = SkillRef(name='瞬步', code='fastdash', profession=__profession__) + "瞬步" + + GLANCETHEHOST = SkillRef(name='月华万象', code='glancethehost', profession=__profession__) + "月华万象" + + GLOWINGTIGER = SkillRef(name='禅语·形灭', code='glowingtiger', profession=__profession__) + "禅语·形灭" + + HEAVENANDEARTH = SkillRef(name='禅念·归一', code='heavenandearth', profession=__profession__) + "禅念·归一" + + ILLUSIONBOMB = SkillRef(name='幻影爆碎', code='illusionbomb', profession=__profession__) + "幻影爆碎" + + KENSIN = SkillRef(name='分身', code='kensin', profession=__profession__) + "分身" + + KIKOUKEN = SkillRef(name='螺旋念气场', code='kikouken', profession=__profession__) + "螺旋念气场" + + LIFTUPPER = SkillRef(name='后踢', code='liftupper', profession=__profession__) + "后踢" + + LIGHTFRIENDSHIP = SkillRef(name='光之亲和', code='lightfriendship', profession=__profession__) + "光之亲和" + + LIGHTNINGDRAGON = SkillRef(name='念兽 : 猛虎震地', code='lightningdragon', profession=__profession__) + "念兽 : 猛虎震地" + + LIGHTTOLERANCEUP = SkillRef(name='念气流转', code='lighttoleranceup', profession=__profession__) + "念气流转" + + MOONLIGHTTHEEARTH = SkillRef(name='月辉念气破', code='moonlighttheearth', profession=__profession__) + "月辉念气破" + + NENFLOWER = SkillRef(name='念兽 : 审判之金雷虎', code='nenflower', profession=__profession__) + "念兽 : 审判之金雷虎" + + NENGUARD = SkillRef(name='念气罩', code='nenguard', profession=__profession__) + "念气罩" + + NENMONSTERWHITETIGER = SkillRef(name='念兽 : 龙虎啸', code='nenmonsterwhitetiger', profession=__profession__) + "念兽 : 龙虎啸" + + NENPOLE = SkillRef(name='念之奥义', code='nenpole', profession=__profession__) + "念之奥义" + + NENSPEAREX = SkillRef(name='念之战矛', code='nenspearex', profession=__profession__) + "念之战矛" + + PHYSICALDEFENSEUP = SkillRef(name='钢筋铁骨', code='physicaldefenseup', profession=__profession__) + "钢筋铁骨" + + SAJAHU = SkillRef(name='狮子吼', code='sajahu', profession=__profession__) + "狮子吼" + + SINGLEKICK = SkillRef(name='前踢', code='singlekick', profession=__profession__) + "前踢" + + SPIRALCOLUMNEX = SkillRef(name='冲云念气场', code='spiralcolumnex', profession=__profession__) + "冲云念气场" + + SPIRALEMPERORSLAP = SkillRef(name='奔雷螺旋击', code='spiralemperorslap', profession=__profession__) + "奔雷螺旋击" + + SPIRALGALEFORCE = SkillRef(name='风雷啸', code='spiralgaleforce', profession=__profession__) + "风雷啸" + + SPIRALINHALE = SkillRef(name='风雷引', code='spiralinhale', profession=__profession__) + "风雷引" + + SPIRALNEN = SkillRef(name='念气环绕', code='spiralnen', profession=__profession__) + "念气环绕" + + SPIRALNENSHOOT = SkillRef(name='念气环绕 : 袭', code='spiralnenshoot', profession=__profession__) + "念气环绕 : 袭" + + SPIRALNENSPIN = SkillRef(name='念气环绕 : 御', code='spiralnenspin', profession=__profession__) + "念气环绕 : 御" + + STOMP = SkillRef(name='鹰踏', code='stomp', profession=__profession__) + "鹰踏" + + SUPLEX = SkillRef(name='膝击', code='suplex', profession=__profession__) + "膝击" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + THROWSAND = SkillRef(name='抛沙', code='throwsand', profession=__profession__) + "抛沙" + + THUNDERCANNON = SkillRef(name='念雷轰', code='thundercannon', profession=__profession__) + "念雷轰" + + THUNDERSUPLEX = SkillRef(name='雷霆踏', code='thundersuplex', profession=__profession__) + "雷霆踏" + + THUNDERTIGER = SkillRef(name='天雷虎踢', code='thundertiger', profession=__profession__) + "天雷虎踢" + + WHIRLWINDKICK = SkillRef(name='旋风腿', code='whirlwindkick', profession=__profession__) + "旋风腿" diff --git a/backend/core/character/refs/fighter_male/striker_male.py b/backend/core/character/refs/fighter_male/striker_male.py new file mode 100644 index 00000000..cc8382d8 --- /dev/null +++ b/backend/core/character/refs/fighter_male/striker_male.py @@ -0,0 +1,138 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:fighter_male/striker_male/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class StrikerMaleSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """fighter_male.striker_male 的技能引用;包含继承的公共技能。""" + __profession__ = 'fighter_male.striker_male' + + AIMVITALPOINT = SkillRef(name='弱点感知', code='aimvitalpoint', profession=__profession__) + "弱点感知" + + ATFIREPOWERRELEASE = SkillRef(name='烈火支配', code='atfirepowerrelease', profession=__profession__) + "烈火支配" + + ATOMICCANNON = SkillRef(name='烈火强拳', code='atomiccannon', profession=__profession__) + "烈火强拳" + + CLOSEPUNCH = SkillRef(name='冲膝', code='closepunch', profession=__profession__) + "冲膝" + + CRASHLOWKICK = SkillRef(name='碎骨', code='crashlowkick', profession=__profession__) + "碎骨" + + CROUCH = SkillRef(name='蹲伏', code='crouch', profession=__profession__) + "蹲伏" + + DAMAGELOWKICK = SkillRef(name='下段踢', code='damagelowkick', profession=__profession__) + "下段踢" + + DASHAFTERDASH = SkillRef(name='疾风追击', code='dashafterdash', profession=__profession__) + "疾风追击" + + DASHAFTERDASHEXTENSION = SkillRef(name='疾风连击', code='dashafterdashextension', profession=__profession__) + "疾风连击" + + DASHPUNCH = SkillRef(name='肘击', code='dashpunch', profession=__profession__) + "肘击" + + DOUBLEOPEN = SkillRef(name='双重释放', code='doubleopen', profession=__profession__) + "双重释放" + + DROPFIRE = SkillRef(name='烈火强踢', code='dropfire', profession=__profession__) + "烈火强踢" + + EARTHBREAK = SkillRef(name='金刚碎', code='earthbreak', profession=__profession__) + "金刚碎" + + EFFICIENTBURN = SkillRef(name='烈焰燃烧', code='efficientburn', profession=__profession__) + "烈焰燃烧" + + EMPERORCOMBINATION = SkillRef(name='极武霸皇踢', code='emperorcombination', profession=__profession__) + "极武霸皇踢" + + ENERGYBALL = SkillRef(name='念气波', code='energyball', profession=__profession__) + "念气波" + + EQUIPBOXINGGLOVE = SkillRef(name='拳套掌握', code='equipboxingglove', profession=__profession__) + "拳套掌握" + + FASTDASH = SkillRef(name='瞬步', code='fastdash', profession=__profession__) + "瞬步" + + FLAMELEGS = SkillRef(name='烈焰焚步', code='flamelegs', profession=__profession__) + "烈焰焚步" + + FLYINGCHAINKICK = SkillRef(name='飞燕旋风', code='flyingchainkick', profession=__profession__) + "飞燕旋风" + + HURRICANESPEAR = SkillRef(name='旋风碎心踢', code='hurricanespear', profession=__profession__) + "旋风碎心踢" + + KENSIN = SkillRef(name='分身', code='kensin', profession=__profession__) + "分身" + + LIFTUPPER = SkillRef(name='后踢', code='liftupper', profession=__profession__) + "后踢" + + LIGHTNINGDANCE = SkillRef(name='闪电之舞', code='lightningdance', profession=__profession__) + "闪电之舞" + + LIMITBREAK = SkillRef(name='千锤百炼', code='limitbreak', profession=__profession__) + "千锤百炼" + + MOMENTATTACK = SkillRef(name='闪击快打', code='momentattack', profession=__profession__) + "闪击快打" + + MORTALASSAULT = SkillRef(name='炼狱坠星腿', code='mortalassault', profession=__profession__) + "炼狱坠星腿" + + MORTALFIST = SkillRef(name='焚火逐日拳', code='mortalfist', profession=__profession__) + "焚火逐日拳" + + MUSCLESHIFT = SkillRef(name='柔化肌肉', code='muscleshift', profession=__profession__) + "柔化肌肉" + + PHYSICALDEFENSEUP = SkillRef(name='钢筋铁骨', code='physicaldefenseup', profession=__profession__) + "钢筋铁骨" + + RANDOMKICK = SkillRef(name='瞬影连环踢', code='randomkick', profession=__profession__) + "瞬影连环踢" + + RISINGUPPER = SkillRef(name='炽焰旋风腿', code='risingupper', profession=__profession__) + "炽焰旋风腿" + + SHINESTEP = SkillRef(name='闪步', code='shinestep', profession=__profession__) + "闪步" + + SHOULDERCHARGE = SkillRef(name='铁山靠', code='shouldercharge', profession=__profession__) + "铁山靠" + + SINGLEKICK = SkillRef(name='前踢', code='singlekick', profession=__profession__) + "前踢" + + SLOWDOWNPOWERUP = SkillRef(name='强拳', code='slowdownpowerup', profession=__profession__) + "强拳" + + STOMP = SkillRef(name='鹰踏', code='stomp', profession=__profession__) + "鹰踏" + + STRENGTHFIREHANDSTRIKE = SkillRef(name='强袭重击', code='strengthfirehandstrike', profession=__profession__) + "强袭重击" + + SUPERARMOR = SkillRef(name='霸体护甲', code='superarmor', profession=__profession__) + "霸体护甲" + + SUPLEX = SkillRef(name='膝击', code='suplex', profession=__profession__) + "膝击" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + THROWSAND = SkillRef(name='抛沙', code='throwsand', profession=__profession__) + "抛沙" + + WHIRLWINDKICK = SkillRef(name='旋风腿', code='whirlwindkick', profession=__profession__) + "旋风腿" diff --git a/backend/core/character/refs/gunblader/__init__.py b/backend/core/character/refs/gunblader/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/gunblader/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/gunblader/agent.py b/backend/core/character/refs/gunblader/agent.py new file mode 100644 index 00000000..b1949019 --- /dev/null +++ b/backend/core/character/refs/gunblader/agent.py @@ -0,0 +1,114 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunblader/agent/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class AgentSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """gunblader.agent 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunblader.agent' + + ANGLESHOT = SkillRef(name='穿透射击', code='angleshot', profession=__profession__) + "穿透射击" + + BEAMSLASH = SkillRef(name='源光斩', code='beamslash', profession=__profession__) + "源光斩" + + BLADEFALCON = SkillRef(name='枪刃旋杀', code='bladefalcon', profession=__profession__) + "枪刃旋杀" + + CATCHTARGET = SkillRef(name='终极锁定', code='catchtarget', profession=__profession__) + "终极锁定" + + COLDBLOOD = SkillRef(name='冷酷敌意', code='coldblood', profession=__profession__) + "冷酷敌意" + + CONTINUOUSFIRE = SkillRef(name='连续射击', code='continuousfire', profession=__profession__) + "连续射击" + + CORESHIELD = SkillRef(name='源能护盾', code='coreshield', profession=__profession__) + "源能护盾" + + CRESCENTMOONSLASH = SkillRef(name='弦月斩', code='crescentmoonslash', profession=__profession__) + "弦月斩" + + CUTANDSHOT = SkillRef(name='斩射', code='cutandshot', profession=__profession__) + "斩射" + + DARKMOONSTEP = SkillRef(name='月影秘步', code='darkmoonstep', profession=__profession__) + "月影秘步" + + DEADLIFT = SkillRef(name='浮空连击', code='deadlift', profession=__profession__) + "浮空连击" + + DOUBLEHALFMOONSLASH = SkillRef(name='双弦斩', code='doublehalfmoonslash', profession=__profession__) + "双弦斩" + + DOWNUPMOON = SkillRef(name='夜影迷踪', code='downupmoon', profession=__profession__) + "夜影迷踪" + + EVASION = SkillRef(name='迅步闪避', code='evasion', profession=__profession__) + "迅步闪避" + + FULLMOONLIGHTSLASH = SkillRef(name='满月斩', code='fullmoonlightslash', profession=__profession__) + "满月斩" + + FUSILLADE = SkillRef(name='毁灭狂欢', code='fusillade', profession=__profession__) + "毁灭狂欢" + + GBOMB = SkillRef(name='G型手榴弹', code='gbomb', profession=__profession__) + "G型手榴弹" + + HOPSLASH = SkillRef(name='重劈', code='hopslash', profession=__profession__) + "重劈" + + KEYFIGUREASSASSINATION = SkillRef(name='毁灭绝击', code='keyfigureassassination', profession=__profession__) + "毁灭绝击" + + LASTMISSION = SkillRef(name='月夜 : 终极行动', code='lastmission', profession=__profession__) + "月夜 : 终极行动" + + MISSIONSTART = SkillRef(name='特工使命', code='missionstart', profession=__profession__) + "特工使命" + + MOONECLIPSE = SkillRef(name='月相天陨', code='mooneclipse', profession=__profession__) + "月相天陨" + + MOONLIGHTREQUIEM = SkillRef(name='月光镇魂曲', code='moonlightrequiem', profession=__profession__) + "月光镇魂曲" + + MOONLIGHTSLASH = SkillRef(name='月光挥斩', code='moonlightslash', profession=__profession__) + "月光挥斩" + + MOONPHASE = SkillRef(name='月相轮舞', code='moonphase', profession=__profession__) + "月相轮舞" + + NECKBREAKING = SkillRef(name='瞬击', code='neckbreaking', profession=__profession__) + "瞬击" + + PERFECTION = SkillRef(name='无瑕', code='perfection', profession=__profession__) + "无瑕" + + PINPOINT = SkillRef(name='使命觉悟', code='pinpoint', profession=__profession__) + "使命觉悟" + + ROMANDASH = SkillRef(name='迅步突袭', code='romandash', profession=__profession__) + "迅步突袭" + + SHORTBLADEMASTERY = SkillRef(name='小太刀精通', code='shortblademastery', profession=__profession__) + "小太刀精通" + + SIGHTINGSHOT = SkillRef(name='精准射击', code='sightingshot', profession=__profession__) + "精准射击" + + TACTICALAGENT = SkillRef(name='特工秘技', code='tacticalagent', profession=__profession__) + "特工秘技" + + TARGETING = SkillRef(name='追踪目标', code='targeting', profession=__profession__) + "追踪目标" + + TARGETINGFIRE = SkillRef(name='锁定射击', code='targetingfire', profession=__profession__) + "锁定射击" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" diff --git a/backend/core/character/refs/gunblader/hitman.py b/backend/core/character/refs/gunblader/hitman.py new file mode 100644 index 00000000..127f7a13 --- /dev/null +++ b/backend/core/character/refs/gunblader/hitman.py @@ -0,0 +1,114 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunblader/hitman/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class HitmanSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """gunblader.hitman 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunblader.hitman' + + ALPHASTRIKE = SkillRef(name='全方位射击', code='alphastrike', profession=__profession__) + "全方位射击" + + ANGLESHOT = SkillRef(name='穿透射击', code='angleshot', profession=__profession__) + "穿透射击" + + BATTLECOMMANDTRAINING = SkillRef(name='B.C精锐特训', code='battlecommandtraining', profession=__profession__) + "B.C精锐特训" + + BEAMSLASH = SkillRef(name='源光斩', code='beamslash', profession=__profession__) + "源光斩" + + BGFIRETOOL = SkillRef(name='B.G枪刃改造', code='bgfiretool', profession=__profession__) + "B.G枪刃改造" + + BILLDRILL = SkillRef(name='利刃旋斩', code='billdrill', profession=__profession__) + "利刃旋斩" + + BLITZKRIEG = SkillRef(name='电光飞掠', code='blitzkrieg', profession=__profession__) + "电光飞掠" + + BLUEWAVESLASH = SkillRef(name='碧波瞬斩', code='bluewaveslash', profession=__profession__) + "碧波瞬斩" + + CALLSIGNALCOVERING = SkillRef(name='燃情协战', code='callsignalcovering', profession=__profession__) + "燃情协战" + + CARACOLE = SkillRef(name='回旋飞剑', code='caracole', profession=__profession__) + "回旋飞剑" + + CORESHIELD = SkillRef(name='源能护盾', code='coreshield', profession=__profession__) + "源能护盾" + + CRESCENTMOONSLASH = SkillRef(name='弦月斩', code='crescentmoonslash', profession=__profession__) + "弦月斩" + + CUVERINGFIRE = SkillRef(name='掩护射击', code='cuveringfire', profession=__profession__) + "掩护射击" + + DAWNOFFLIGHT = SkillRef(name='暮光密令 : 黎明决战', code='dawnofflight', profession=__profession__) + "暮光密令 : 黎明决战" + + DEAD6 = SkillRef(name='轮盘连射', code='dead6', profession=__profession__) + "轮盘连射" + + DEADLIFT = SkillRef(name='浮空连击', code='deadlift', profession=__profession__) + "浮空连击" + + DUSKTACTICS = SkillRef(name='暮光战略', code='dusktactics', profession=__profession__) + "暮光战略" + + GBOMB = SkillRef(name='G型手榴弹', code='gbomb', profession=__profession__) + "G型手榴弹" + + HELIXDIVE = SkillRef(name='大回旋坠斩', code='helixdive', profession=__profession__) + "大回旋坠斩" + + HOPSLASH = SkillRef(name='重劈', code='hopslash', profession=__profession__) + "重劈" + + LONGBLADEMASTERY = SkillRef(name='长刀精通', code='longblademastery', profession=__profession__) + "长刀精通" + + MASSEDFIRE = SkillRef(name='游弹枪袭', code='massedfire', profession=__profession__) + "游弹枪袭" + + NECKBREAKING = SkillRef(name='瞬击', code='neckbreaking', profession=__profession__) + "瞬击" + + POINTBLANK = SkillRef(name='近敌灭杀', code='pointblank', profession=__profession__) + "近敌灭杀" + + RAMPAGE = SkillRef(name='枪刃乱舞', code='rampage', profession=__profession__) + "枪刃乱舞" + + RAPIDMOVE = SkillRef(name='捷影步', code='rapidmove', profession=__profession__) + "捷影步" + + SPECTER5 = SkillRef(name='幽灵近战术', code='specter5', profession=__profession__) + "幽灵近战术" + + SUDDENSTRIKE = SkillRef(name='潜行射击', code='suddenstrike', profession=__profession__) + "潜行射击" + + SUPRISECUT = SkillRef(name='剑刃突刺', code='suprisecut', profession=__profession__) + "剑刃突刺" + + TACTICALOFFENSIVE = SkillRef(name='致命焰火', code='tacticaloffensive', profession=__profession__) + "致命焰火" + + TACTICSCOMMAND = SkillRef(name='战术指示', code='tacticscommand', profession=__profession__) + "战术指示" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + THELASTATTACK = SkillRef(name='疾光斩', code='thelastattack', profession=__profession__) + "疾光斩" + + VETERANSEXPERT = SkillRef(name='暗刃战略', code='veteransexpert', profession=__profession__) + "暗刃战略" + + WINGSOFTWILIGHT = SkillRef(name='集结·暮光之翼', code='wingsoftwilight', profession=__profession__) + "集结·暮光之翼" diff --git a/backend/core/character/refs/gunblader/specialist.py b/backend/core/character/refs/gunblader/specialist.py new file mode 100644 index 00000000..a63015fb --- /dev/null +++ b/backend/core/character/refs/gunblader/specialist.py @@ -0,0 +1,114 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunblader/specialist/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class SpecialistSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """gunblader.specialist 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunblader.specialist' + + AMPLIFY = SkillRef(name='源能增幅', code='amplify', profession=__profession__) + "源能增幅" + + ANGLESHOT = SkillRef(name='穿透射击', code='angleshot', profession=__profession__) + "穿透射击" + + ATTRACTAMMUNITION = SkillRef(name='引力源光弹', code='attractammunition', profession=__profession__) + "引力源光弹" + + BEAMSLASH = SkillRef(name='源光斩', code='beamslash', profession=__profession__) + "源光斩" + + BLACKHORIZON = SkillRef(name='源能场域 : 黑暗边缘', code='blackhorizon', profession=__profession__) + "源能场域 : 黑暗边缘" + + BLACKSEED = SkillRef(name='临界源能弹', code='blackseed', profession=__profession__) + "临界源能弹" + + BURSTFIELD = SkillRef(name='超能场域', code='burstfield', profession=__profession__) + "超能场域" + + CEAB2 = SkillRef(name='聚能光幕', code='ceab2', profession=__profession__) + "聚能光幕" + + COREBARRIER = SkillRef(name='源能屏障', code='corebarrier', profession=__profession__) + "源能屏障" + + COREBLADEMASTERY = SkillRef(name='源力剑精通', code='coreblademastery', profession=__profession__) + "源力剑精通" + + COREPARADIGM = SkillRef(name='源力汇聚', code='coreparadigm', profession=__profession__) + "源力汇聚" + + COREPRAXIS = SkillRef(name='源能应用', code='corepraxis', profession=__profession__) + "源能应用" + + CORESHIELD = SkillRef(name='源能护盾', code='coreshield', profession=__profession__) + "源能护盾" + + CRESCENTMOONSLASH = SkillRef(name='弦月斩', code='crescentmoonslash', profession=__profession__) + "弦月斩" + + DEADLIFT = SkillRef(name='浮空连击', code='deadlift', profession=__profession__) + "浮空连击" + + DISPERSION = SkillRef(name='离散能量波', code='dispersion', profession=__profession__) + "离散能量波" + + DIVIDEEARTH = SkillRef(name='光导裂地斩', code='divideearth', profession=__profession__) + "光导裂地斩" + + ELECTRICPILLAR = SkillRef(name='脉冲斩', code='electricpillar', profession=__profession__) + "脉冲斩" + + EMISSION = SkillRef(name='电磁领域', code='emission', profession=__profession__) + "电磁领域" + + ENERGYBOUNCE = SkillRef(name='能量禁锢', code='energybounce', profession=__profession__) + "能量禁锢" + + EXCEED = SkillRef(name='终焉 : 超世界崩坏', code='exceed', profession=__profession__) + "终焉 : 超世界崩坏" + + EXOCET = SkillRef(name='能量飞鱼弹', code='exocet', profession=__profession__) + "能量飞鱼弹" + + GBOMB = SkillRef(name='G型手榴弹', code='gbomb', profession=__profession__) + "G型手榴弹" + + HOPSLASH = SkillRef(name='重劈', code='hopslash', profession=__profession__) + "重劈" + + INJECTION = SkillRef(name='细胞弱化', code='injection', profession=__profession__) + "细胞弱化" + + INTENSION = SkillRef(name='源能提炼', code='intension', profession=__profession__) + "源能提炼" + + LIGHTBRANDISH = SkillRef(name='绝望圆舞', code='lightbrandish', profession=__profession__) + "绝望圆舞" + + LIGHTNINGSLASH = SkillRef(name='光裂斩', code='lightningslash', profession=__profession__) + "光裂斩" + + NECKBREAKING = SkillRef(name='瞬击', code='neckbreaking', profession=__profession__) + "瞬击" + + ROMANDASH = SkillRef(name='迅步突袭', code='romandash', profession=__profession__) + "迅步突袭" + + ROTATIONWAVE = SkillRef(name='旋转源能波', code='rotationwave', profession=__profession__) + "旋转源能波" + + SINGULARITYCORE = SkillRef(name='奇点源核', code='singularitycore', profession=__profession__) + "奇点源核" + + SQUARELY = SkillRef(name='源能波刃', code='squarely', profession=__profession__) + "源能波刃" + + TASER = SkillRef(name='镭射源能枪', code='taser', profession=__profession__) + "镭射源能枪" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" diff --git a/backend/core/character/refs/gunblader/trouble_shooter.py b/backend/core/character/refs/gunblader/trouble_shooter.py new file mode 100644 index 00000000..edf2fc52 --- /dev/null +++ b/backend/core/character/refs/gunblader/trouble_shooter.py @@ -0,0 +1,111 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunblader/trouble_shooter/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class TroubleShooterSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """gunblader.trouble_shooter 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunblader.trouble_shooter' + + ANGLESHOT = SkillRef(name='穿透射击', code='angleshot', profession=__profession__) + "穿透射击" + + BEAMSLASH = SkillRef(name='源光斩', code='beamslash', profession=__profession__) + "源光斩" + + BREAKSHOT = SkillRef(name='爆烈斩击', code='breakshot', profession=__profession__) + "爆烈斩击" + + BURNTOSLASH = SkillRef(name='爆裂斩', code='burntoslash', profession=__profession__) + "爆裂斩" + + CLIMAX = SkillRef(name='烽火硝烟·终末之征', code='climax', profession=__profession__) + "烽火硝烟·终末之征" + + CORESHIELD = SkillRef(name='源能护盾', code='coreshield', profession=__profession__) + "源能护盾" + + CRESCENTMOONSLASH = SkillRef(name='弦月斩', code='crescentmoonslash', profession=__profession__) + "弦月斩" + + DEADLIFT = SkillRef(name='浮空连击', code='deadlift', profession=__profession__) + "浮空连击" + + DIFFUSIONBUST = SkillRef(name='广域散射', code='diffusionbust', profession=__profession__) + "广域散射" + + DISTROUBLEQUAKE = SkillRef(name='裂地爆刃', code='distroublequake', profession=__profession__) + "裂地爆刃" + + DOUBLEBARREL = SkillRef(name='双重散射', code='doublebarrel', profession=__profession__) + "双重散射" + + GBOMB = SkillRef(name='G型手榴弹', code='gbomb', profession=__profession__) + "G型手榴弹" + + GETONFIRE = SkillRef(name='夺命焰火', code='getonfire', profession=__profession__) + "夺命焰火" + + GRENADEFLAME = SkillRef(name='G型火焰爆弹', code='grenadeflame', profession=__profession__) + "G型火焰爆弹" + + GUNPOWDERMASTERY = SkillRef(name='火药改良', code='gunpowdermastery', profession=__profession__) + "火药改良" + + GWIDOW = SkillRef(name='G型烬灭榴弹', code='gwidow', profession=__profession__) + "G型烬灭榴弹" + + HARDBOILED = SkillRef(name='铁血豪情', code='hardboiled', profession=__profession__) + "铁血豪情" + + HEAVYSWORDMASTERY = SkillRef(name='重剑精通', code='heavyswordmastery', profession=__profession__) + "重剑精通" + + HOPSLASH = SkillRef(name='重劈', code='hopslash', profession=__profession__) + "重劈" + + INCREDIBLE = SkillRef(name='终焉 : 硝烟狂欢', code='incredible', profession=__profession__) + "终焉 : 硝烟狂欢" + + NECKBREAKING = SkillRef(name='瞬击', code='neckbreaking', profession=__profession__) + "瞬击" + + OPRESSION = SkillRef(name='爆弹罗网', code='opression', profession=__profession__) + "爆弹罗网" + + OUTLAW = SkillRef(name='无法者之歌', code='outlaw', profession=__profession__) + "无法者之歌" + + PERFECTBATTING = SkillRef(name='完美击球', code='perfectbatting', profession=__profession__) + "完美击球" + + REINFORCEFIRE = SkillRef(name='终极火力', code='reinforcefire', profession=__profession__) + "终极火力" + + ROLLINGMOVE = SkillRef(name='矫捷翻滚', code='rollingmove', profession=__profession__) + "矫捷翻滚" + + SUPRISEPRESENT = SkillRef(name='惊喜大礼', code='suprisepresent', profession=__profession__) + "惊喜大礼" + + SWORDBOMB = SkillRef(name='剑刃爆弹', code='swordbomb', profession=__profession__) + "剑刃爆弹" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + TERMINATESLUGGER = SkillRef(name='铁腕爆弹', code='terminateslugger', profession=__profession__) + "铁腕爆弹" + + THENINEBARREL = SkillRef(name='覆灭之枪', code='theninebarrel', profession=__profession__) + "覆灭之枪" + + THEVETERAN = SkillRef(name='充能特饮', code='theveteran', profession=__profession__) + "充能特饮" + + VETERANGSBATTLE = SkillRef(name='纯熟战技', code='veterangsbattle', profession=__profession__) + "纯熟战技" + + VIOLENTSMASH = SkillRef(name='爆弹华尔兹', code='violentsmash', profession=__profession__) + "爆弹华尔兹" diff --git a/backend/core/character/refs/gunner_female/__init__.py b/backend/core/character/refs/gunner_female/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/gunner_female/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/gunner_female/launcher_female.py b/backend/core/character/refs/gunner_female/launcher_female.py new file mode 100644 index 00000000..7860ff79 --- /dev/null +++ b/backend/core/character/refs/gunner_female/launcher_female.py @@ -0,0 +1,135 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunner_female/launcher_female/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class LauncherFemaleSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """gunner_female.launcher_female 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunner_female.launcher_female' + + AERIALGATLING = SkillRef(name='炙烤', code='aerialgatling', profession=__profession__) + "炙烤" + + AERIALKNEE = SkillRef(name='后撩踢', code='aerialknee', profession=__profession__) + "后撩踢" + + ALPHASUPPORT = SkillRef(name='重武装改造', code='alphasupport', profession=__profession__) + "重武装改造" + + ANCIENTTRIGGER = SkillRef(name='远古粒子炮', code='ancienttrigger', profession=__profession__) + "远古粒子炮" + + APG_63 = SkillRef(name='脉冲雷达-63', code='apg-63', profession=__profession__) + "脉冲雷达-63" + + ATDUSTSHOOT = SkillRef(name='烟尘弹', code='atdustshoot', profession=__profession__) + "烟尘弹" + + CANNONBALL = SkillRef(name='加农炮', code='cannonball', profession=__profession__) + "加农炮" + + DECISIVEBATTLE = SkillRef(name='制胜·最终兵器', code='decisivebattle', profession=__profession__) + "制胜·最终兵器" + + DUALTRIGGER = SkillRef(name='光热反应', code='dualtrigger', profession=__profession__) + "光热反应" + + FASTKNEE = SkillRef(name='刺踢', code='fastknee', profession=__profession__) + "刺踢" + + FASTSHOOT = SkillRef(name='快速拔枪', code='fastshoot', profession=__profession__) + "快速拔枪" + + FLAMETHROWER = SkillRef(name='M-3喷火器', code='flamethrower', profession=__profession__) + "M-3喷火器" + + FLAMETHROWERBOOST = SkillRef(name='聚焦喷火器', code='flamethrowerboost', profession=__profession__) + "聚焦喷火器" + + FM31 = SkillRef(name='FM-31榴弹发射器', code='fm31', profession=__profession__) + "FM-31榴弹发射器" + + FSC_7 = SkillRef(name='集束炸弹', code='fsc_7', profession=__profession__) + "集束炸弹" + + GATLING = SkillRef(name='M-137格林机枪', code='gatling', profession=__profession__) + "M-137格林机枪" + + GRENADENONE = SkillRef(name='G-14手雷', code='grenadenone', profession=__profession__) + "G-14手雷" + + HIGHANGLESLIDING = SkillRef(name='浮空铲', code='highanglesliding', profession=__profession__) + "浮空铲" + + HITONSUBWEAPON = SkillRef(name='重火器拔击', code='hitonsubweapon', profession=__profession__) + "重火器拔击" + + LANCER = SkillRef(name='FM-92榴弹', code='lancer', profession=__profession__) + "FM-92榴弹" + + LANCERSW = SkillRef(name='FM-92特殊榴弹', code='lancersw', profession=__profession__) + "FM-92特殊榴弹" + + LASERRIFLE = SkillRef(name='激光炮', code='laserrifle', profession=__profession__) + "激光炮" + + LASERRIFLECHARGE = SkillRef(name='蓄电激光炮', code='laserriflecharge', profession=__profession__) + "蓄电激光炮" + + LIFTSHOT = SkillRef(name='浮空弹', code='liftshot', profession=__profession__) + "浮空弹" + + OPERATIONRAZE = SkillRef(name='火力全开', code='operationraze', profession=__profession__) + "火力全开" + + OVERHEAT = SkillRef(name='超温重火器', code='overheat', profession=__profession__) + "超温重火器" + + PANDORA_01 = SkillRef(name='潘多拉1号', code='pandora_01', profession=__profession__) + "潘多拉1号" + + PHLEGETHON = SkillRef(name='UHT-03爆炎喷火器', code='phlegethon', profession=__profession__) + "UHT-03爆炎喷火器" + + PLASMABOOST = SkillRef(name='等离子放射器', code='plasmaboost', profession=__profession__) + "等离子放射器" + + PT_15 = SkillRef(name='PT-15原始型压缩炮', code='pt-15', profession=__profession__) + "PT-15原始型压缩炮" + + PUNISHER = SkillRef(name='钉刺射', code='punisher', profession=__profession__) + "钉刺射" + + ROBOTRX78 = SkillRef(name='RX-78追击者', code='robotrx78', profession=__profession__) + "RX-78追击者" + + SILVERBULLET = SkillRef(name='银弹', code='silverbullet', profession=__profession__) + "银弹" + + SOLARSYSTEM = SkillRef(name='X-2太阳神光炮', code='solarsystem', profession=__profession__) + "X-2太阳神光炮" + + STAYONJUMPSHOOT = SkillRef(name='空中射击', code='stayonjumpshoot', profession=__profession__) + "空中射击" + + STEYRHEAVYRIFLE = SkillRef(name='反坦克炮', code='steyrheavyrifle', profession=__profession__) + "反坦克炮" + + SUBWEAPONMASTERY = SkillRef(name='重火器精通', code='subweaponmastery', profession=__profession__) + "重火器精通" + + SUBWEAPONPOWERUP = SkillRef(name='重火器奥义', code='subweaponpowerup', profession=__profession__) + "重火器奥义" + + SUBWEAPONSTUCKDOWN = SkillRef(name='潜能爆发', code='subweaponstuckdown', profession=__profession__) + "潜能爆发" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + URANIUMBOMB = SkillRef(name='量子爆弹', code='uraniumbomb', profession=__profession__) + "量子爆弹" + + WINDMILL = SkillRef(name='上旋踢', code='windmill', profession=__profession__) + "上旋踢" diff --git a/backend/core/character/refs/gunner_female/mechanic_female.py b/backend/core/character/refs/gunner_female/mechanic_female.py new file mode 100644 index 00000000..f720d654 --- /dev/null +++ b/backend/core/character/refs/gunner_female/mechanic_female.py @@ -0,0 +1,144 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunner_female/mechanic_female/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class MechanicFemaleSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """gunner_female.mechanic_female 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunner_female.mechanic_female' + + AERIALGATLING = SkillRef(name='炙烤', code='aerialgatling', profession=__profession__) + "炙烤" + + AERIALKNEE = SkillRef(name='后撩踢', code='aerialknee', profession=__profession__) + "后撩踢" + + ATDUSTSHOOT = SkillRef(name='烟尘弹', code='atdustshoot', profession=__profession__) + "烟尘弹" + + ATHOLDANDGO = SkillRef(name='机械指令', code='atholdandgo', profession=__profession__) + "机械指令" + + CAMOUFLAGE = SkillRef(name='伪装', code='camouflage', profession=__profession__) + "伪装" + + FASTKNEE = SkillRef(name='刺踢', code='fastknee', profession=__profession__) + "刺踢" + + FASTSHOOT = SkillRef(name='快速拔枪', code='fastshoot', profession=__profession__) + "快速拔枪" + + FLAMETHROWER = SkillRef(name='M-3喷火器', code='flamethrower', profession=__profession__) + "M-3喷火器" + + G0 = SkillRef(name='改装 : G-0战争领主', code='g0', profession=__profession__) + "改装 : G-0战争领主" + + G1 = SkillRef(name='G-1科罗纳', code='g1', profession=__profession__) + "G-1科罗纳" + + G2 = SkillRef(name='改装 : G-2旋雷者', code='g2', profession=__profession__) + "改装 : G-2旋雷者" + + G3 = SkillRef(name='改装 : G-3捕食者', code='g3', profession=__profession__) + "改装 : G-3捕食者" + + G4 = SkillRef(name='雷行者', code='g4', profession=__profession__) + "雷行者" + + GATLING = SkillRef(name='M-137格林机枪', code='gatling', profession=__profession__) + "M-137格林机枪" + + GEXTENSION = SkillRef(name='G系扩张', code='gextension', profession=__profession__) + "G系扩张" + + GMAGNETIC = SkillRef(name='G-磁力弹', code='gmagnetic', profession=__profession__) + "G-磁力弹" + + GOPERATOR = SkillRef(name='G-X主宰者', code='goperator', profession=__profession__) + "G-X主宰者" + + GRENADENONE = SkillRef(name='G-14手雷', code='grenadenone', profession=__profession__) + "G-14手雷" + + GSPFALCON = SkillRef(name='G-超级猎鹰', code='gspfalcon', profession=__profession__) + "G-超级猎鹰" + + GXSTARDUST = SkillRef(name='G-X星尘天穹', code='gxstardust', profession=__profession__) + "G-X星尘天穹" + + HIGHANGLESLIDING = SkillRef(name='浮空铲', code='highanglesliding', profession=__profession__) + "浮空铲" + + HIGHTECHNOLOGY = SkillRef(name='机械原理', code='hightechnology', profession=__profession__) + "机械原理" + + HITONSUBWEAPON = SkillRef(name='重火器拔击', code='hitonsubweapon', profession=__profession__) + "重火器拔击" + + HS12 = SkillRef(name='HS-12等离子体发生器', code='hs12', profession=__profession__) + "HS-12等离子体发生器" + + HYPERFLARE = SkillRef(name='超时空光耀加农炮', code='hyperflare', profession=__profession__) + "超时空光耀加农炮" + + LIFTSHOT = SkillRef(name='浮空弹', code='liftshot', profession=__profession__) + "浮空弹" + + MAGNETICFIELD = SkillRef(name='高压电磁场', code='magneticfield', profession=__profession__) + "高压电磁场" + + MECABOLT = SkillRef(name='终结者 : 博尔特MX', code='mecabolt', profession=__profession__) + "终结者 : 博尔特MX" + + MECHADROP = SkillRef(name='空投支援', code='mechadrop', profession=__profession__) + "空投支援" + + MICROCONTROL = SkillRef(name='微型制导', code='microcontrol', profession=__profession__) + "微型制导" + + PUNISHER = SkillRef(name='钉刺射', code='punisher', profession=__profession__) + "钉刺射" + + ROBOTEXS = SkillRef(name='EX-S毒蛇炮', code='robotexs', profession=__profession__) + "EX-S毒蛇炮" + + ROBOTEZ8 = SkillRef(name='EZ-8爆破者', code='robotez8', profession=__profession__) + "EZ-8爆破者" + + ROBOTICS = SkillRef(name='机械改良', code='robotics', profession=__profession__) + "机械改良" + + ROBOTRX78 = SkillRef(name='RX-78追击者', code='robotrx78', profession=__profession__) + "RX-78追击者" + + ROBOTSEXPLOSION = SkillRef(name='机械引爆', code='robotsexplosion', profession=__profession__) + "机械引爆" + + ROBOTTEMPESTER = SkillRef(name='空战机械 : 狂风', code='robottempester', profession=__profession__) + "空战机械 : 狂风" + + RX78OFCRISIS = SkillRef(name='危机追击者', code='rx78ofcrisis', profession=__profession__) + "危机追击者" + + SILVERBULLET = SkillRef(name='银弹', code='silverbullet', profession=__profession__) + "银弹" + + SOLARMODULESYSTEM = SkillRef(name='光反应能量模块', code='solarmodulesystem', profession=__profession__) + "光反应能量模块" + + SPARROWFACTORY = SkillRef(name='拦截机工厂', code='sparrowfactory', profession=__profession__) + "拦截机工厂" + + STAYONJUMPSHOOT = SkillRef(name='空中射击', code='stayonjumpshoot', profession=__profession__) + "空中射击" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + TRANSFORMATION = SkillRef(name='电能转换', code='transformation', profession=__profession__) + "电能转换" + + WINDMILL = SkillRef(name='上旋踢', code='windmill', profession=__profession__) + "上旋踢" diff --git a/backend/core/character/refs/gunner_female/paramedic.py b/backend/core/character/refs/gunner_female/paramedic.py new file mode 100644 index 00000000..37e97044 --- /dev/null +++ b/backend/core/character/refs/gunner_female/paramedic.py @@ -0,0 +1,117 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunner_female/paramedic/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs + + +class ParamedicSkillRef(CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs): + """gunner_female.paramedic 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunner_female.paramedic' + + AERIALKNEE = SkillRef(name='后撩踢', code='aerialknee', profession=__profession__) + "后撩踢" + + BATTLESUIT = SkillRef(name='系统常量 · 战斗服', code='battlesuit', profession=__profession__) + "系统常量 · 战斗服" + + BREAKPOCKET = SkillRef(name='系统 · 孤军突破', code='breakpocket', profession=__profession__) + "系统 · 孤军突破" + + BREAKTHROUGH = SkillRef(name='战服 · 护盾冲击', code='breakthrough', profession=__profession__) + "战服 · 护盾冲击" + + CHOICESUIT = SkillRef(name='系统常量 · 战斗服 (改良型)', code='choicesuit', profession=__profession__) + "系统常量 · 战斗服 (改良型)" + + CLOSEENEMY = SkillRef(name='战服 · 机动打击', code='closeenemy', profession=__profession__) + "战服 · 机动打击" + + C_AED = SkillRef(name='保护模件 (黄金复苏)', code='c_aed', profession=__profession__) + "保护模件 (黄金复苏)" + + DEFCON = SkillRef(name='系统 · 区域防御', code='defcon', profession=__profession__) + "系统 · 区域防御" + + DEFENSESYSTEM = SkillRef(name='系统 · 作战应对', code='defensesystem', profession=__profession__) + "系统 · 作战应对" + + ENCHANTARMOR = SkillRef(name='装甲强化', code='enchantarmor', profession=__profession__) + "装甲强化" + + ENCHANTWEAPON = SkillRef(name='军械强化', code='enchantweapon', profession=__profession__) + "军械强化" + + ENCHANTWEAPONOVERRIDE = SkillRef(name='军械强化 (进阶)', code='enchantweaponoverride', profession=__profession__) + "军械强化 (进阶)" + + EXTERMINATION = SkillRef(name='战服 · 歼灭行动', code='extermination', profession=__profession__) + "战服 · 歼灭行动" + + FASTKNEE = SkillRef(name='刺踢', code='fastknee', profession=__profession__) + "刺踢" + + HALO = SkillRef(name='空袭策略 : 神兵天降', code='halo', profession=__profession__) + "空袭策略 : 神兵天降" + + HARDCODING = SkillRef(name='系统 · 临战编程', code='hardcoding', profession=__profession__) + "系统 · 临战编程" + + INSTALLBATTLEFIELDINFO = SkillRef(name='系统 · 战场信息', code='installbattlefieldinfo', profession=__profession__) + "系统 · 战场信息" + + KILLCONFIRM = SkillRef(name='近战 · 锁定连射', code='killconfirm', profession=__profession__) + "近战 · 锁定连射" + + LASERBREACHING = SkillRef(name='战服 · 开拓射线', code='laserbreaching', profession=__profession__) + "战服 · 开拓射线" + + LIFTSHOT = SkillRef(name='浮空弹', code='liftshot', profession=__profession__) + "浮空弹" + + MOAS = SkillRef(name='强袭策略 : 区域肃清', code='moas', profession=__profession__) + "强袭策略 : 区域肃清" + + NOENEMY = SkillRef(name='绝境策略 : 极限歼灭', code='noenemy', profession=__profession__) + "绝境策略 : 极限歼灭" + + OVERCLOCK = SkillRef(name='机动强化', code='overclock', profession=__profession__) + "机动强化" + + OVERPOWERLASER = SkillRef(name='战服 · 超负荷炮', code='overpowerlaser', profession=__profession__) + "战服 · 超负荷炮" + + PARAMSHIELD = SkillRef(name='保护模件 (缓冲)', code='paramshield', profession=__profession__) + "保护模件 (缓冲)" + + POINTSHOOT = SkillRef(name='近战 · 指定射击', code='pointshoot', profession=__profession__) + "近战 · 指定射击" + + POINTSHOOTREV = SkillRef(name='战服 · 强袭目标', code='pointshootrev', profession=__profession__) + "战服 · 强袭目标" + + PUNISHER = SkillRef(name='钉刺射', code='punisher', profession=__profession__) + "钉刺射" + + RELEASEDEVICE = SkillRef(name='系统 · 限制解除', code='releasedevice', profession=__profession__) + "系统 · 限制解除" + + RETREATSHOOT = SkillRef(name='近战 · 闪退射击', code='retreatshoot', profession=__profession__) + "近战 · 闪退射击" + + SUPPRESSION = SkillRef(name='战服 · 超限压制', code='suppression', profession=__profession__) + "战服 · 超限压制" + + SYNCHRONIZATION = SkillRef(name='系统常量 · 同步', code='synchronization', profession=__profession__) + "系统常量 · 同步" + + TEMPORARYREALIZATION5 = SkillRef(name='超卓之心', code='temporaryrealization5', profession=__profession__) + "超卓之心" + + TREATED = SkillRef(name='保护模件 (净化)', code='treated', profession=__profession__) + "保护模件 (净化)" + + WINDMILL = SkillRef(name='上旋踢', code='windmill', profession=__profession__) + "上旋踢" + + ZERODISTANCE = SkillRef(name='近战 · 爆刃突袭', code='zerodistance', profession=__profession__) + "近战 · 爆刃突袭" diff --git a/backend/core/character/refs/gunner_female/ranger_female.py b/backend/core/character/refs/gunner_female/ranger_female.py new file mode 100644 index 00000000..6aef3a4f --- /dev/null +++ b/backend/core/character/refs/gunner_female/ranger_female.py @@ -0,0 +1,135 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunner_female/ranger_female/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class RangerFemaleSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """gunner_female.ranger_female 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunner_female.ranger_female' + + AERIALGATLING = SkillRef(name='炙烤', code='aerialgatling', profession=__profession__) + "炙烤" + + AERIALKNEE = SkillRef(name='后撩踢', code='aerialknee', profession=__profession__) + "后撩踢" + + AIRRAID = SkillRef(name='音速劫击', code='airraid', profession=__profession__) + "音速劫击" + + AIRRAIDEX = SkillRef(name='回闪劫击', code='airraidex', profession=__profession__) + "回闪劫击" + + ATDUSTSHOOT = SkillRef(name='烟尘弹', code='atdustshoot', profession=__profession__) + "烟尘弹" + + BLOODNCHAIN = SkillRef(name='血舞祭', code='bloodnchain', profession=__profession__) + "血舞祭" + + BLOODYCARNIVAL = SkillRef(name='绯红盛宴', code='bloodycarnival', profession=__profession__) + "绯红盛宴" + + BULLETGUARD = SkillRef(name='远程格挡', code='bulletguard', profession=__profession__) + "远程格挡" + + CHAINDEVIDER = SkillRef(name='锁链切割', code='chaindevider', profession=__profession__) + "锁链切割" + + CHAINENLIGHTEN = SkillRef(name='锁链意志', code='chainenlighten', profession=__profession__) + "锁链意志" + + CHAINSNATCH = SkillRef(name='锁链截击', code='chainsnatch', profession=__profession__) + "锁链截击" + + COUNTERSHOOT = SkillRef(name='心灵反击', code='countershoot', profession=__profession__) + "心灵反击" + + CRIMSONGARDEN = SkillRef(name='盛放·绯红花园', code='crimsongarden', profession=__profession__) + "盛放·绯红花园" + + DOUBLEGUNHAWK = SkillRef(name='双鹰回旋', code='doublegunhawk', profession=__profession__) + "双鹰回旋" + + FASTKNEE = SkillRef(name='刺踢', code='fastknee', profession=__profession__) + "刺踢" + + FASTSHOOT = SkillRef(name='快速拔枪', code='fastshoot', profession=__profession__) + "快速拔枪" + + FLAMETHROWER = SkillRef(name='M-3喷火器', code='flamethrower', profession=__profession__) + "M-3喷火器" + + GATLING = SkillRef(name='M-137格林机枪', code='gatling', profession=__profession__) + "M-137格林机枪" + + GRENADENONE = SkillRef(name='G-14手雷', code='grenadenone', profession=__profession__) + "G-14手雷" + + HEADSHOT = SkillRef(name='溃灭射击', code='headshot', profession=__profession__) + "溃灭射击" + + HIGHANGLESLIDING = SkillRef(name='浮空铲', code='highanglesliding', profession=__profession__) + "浮空铲" + + HITONSUBWEAPON = SkillRef(name='重火器拔击', code='hitonsubweapon', profession=__profession__) + "重火器拔击" + + KILLPOINT = SkillRef(name='死亡锁链', code='killpoint', profession=__profession__) + "死亡锁链" + + LIFTSHOT = SkillRef(name='浮空弹', code='liftshot', profession=__profession__) + "浮空弹" + + MULTIHEADSHOT = SkillRef(name='多重射击', code='multiheadshot', profession=__profession__) + "多重射击" + + POWERUPREVOLVER = SkillRef(name='左轮奥义', code='poweruprevolver', profession=__profession__) + "左轮奥义" + + PUNISHER = SkillRef(name='钉刺射', code='punisher', profession=__profession__) + "钉刺射" + + RANDOMSHOOT = SkillRef(name='枪舞', code='randomshoot', profession=__profession__) + "枪舞" + + REVOLVERCRITICALDAMAGEUP = SkillRef(name='死亡左轮', code='revolvercriticaldamageup', profession=__profession__) + "死亡左轮" + + ROBOTRX78 = SkillRef(name='RX-78追击者', code='robotrx78', profession=__profession__) + "RX-78追击者" + + RUINATIONAREA = SkillRef(name='毁灭风暴', code='ruinationarea', profession=__profession__) + "毁灭风暴" + + SAWBLADE = SkillRef(name='枪刃改良', code='sawblade', profession=__profession__) + "枪刃改良" + + SILVERBULLET = SkillRef(name='银弹', code='silverbullet', profession=__profession__) + "银弹" + + STAYONJUMPSHOOT = SkillRef(name='空中射击', code='stayonjumpshoot', profession=__profession__) + "空中射击" + + STYLISH = SkillRef(name='花式枪术', code='stylish', profession=__profession__) + "花式枪术" + + SUPPRESSINGFIRE = SkillRef(name='压制射击', code='suppressingfire', profession=__profession__) + "压制射击" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + TURNINGSHOOT = SkillRef(name='溃灭回射', code='turningshoot', profession=__profession__) + "溃灭回射" + + TWINGUNBLADE = SkillRef(name='双枪极舞刃', code='twingunblade', profession=__profession__) + "双枪极舞刃" + + VEILEDCUT = SkillRef(name='隐匿切割', code='veiledcut', profession=__profession__) + "隐匿切割" + + WALKSHOOT = SkillRef(name='移动射击', code='walkshoot', profession=__profession__) + "移动射击" + + WINDMILL = SkillRef(name='上旋踢', code='windmill', profession=__profession__) + "上旋踢" diff --git a/backend/core/character/refs/gunner_female/spitfire_female.py b/backend/core/character/refs/gunner_female/spitfire_female.py new file mode 100644 index 00000000..a73ab9ba --- /dev/null +++ b/backend/core/character/refs/gunner_female/spitfire_female.py @@ -0,0 +1,144 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunner_female/spitfire_female/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class SpitfireFemaleSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """gunner_female.spitfire_female 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunner_female.spitfire_female' + + AERIALGATLING = SkillRef(name='炙烤', code='aerialgatling', profession=__profession__) + "炙烤" + + AERIALKNEE = SkillRef(name='后撩踢', code='aerialknee', profession=__profession__) + "后撩踢" + + ATDUSTSHOOT = SkillRef(name='烟尘弹', code='atdustshoot', profession=__profession__) + "烟尘弹" + + BULLETEXPLOSIVE = SkillRef(name='爆裂弹', code='bulletexplosive', profession=__profession__) + "爆裂弹" + + BULLETPENETRATE = SkillRef(name='贯穿弹', code='bulletpenetrate', profession=__profession__) + "贯穿弹" + + BULLETREINFORCE = SkillRef(name='弹药改良', code='bulletreinforce', profession=__profession__) + "弹药改良" + + BULLETSPECIFIC = SkillRef(name='特性弹', code='bulletspecific', profession=__profession__) + "特性弹" + + C4 = SkillRef(name='C4飞弹', code='c4', profession=__profession__) + "C4飞弹" + + CHARGEBUSTER = SkillRef(name='聚合弹', code='chargebuster', profession=__profession__) + "聚合弹" + + CHELLI = SkillRef(name='超真空弹 : 切利', code='chelli', profession=__profession__) + "超真空弹 : 切利" + + CONVERSION = SkillRef(name='攻击类型转换', code='conversion', profession=__profession__) + "攻击类型转换" + + CROSSSHOOT = SkillRef(name='交叉射击', code='crossshoot', profession=__profession__) + "交叉射击" + + DDAY = SkillRef(name='决战之日', code='dday', profession=__profession__) + "决战之日" + + DEFINITESOLUTION = SkillRef(name='终解·制空霸权', code='definitesolution', profession=__profession__) + "终解·制空霸权" + + EMPSTORM = SkillRef(name='EMP磁暴', code='empstorm', profession=__profession__) + "EMP磁暴" + + FASTKNEE = SkillRef(name='刺踢', code='fastknee', profession=__profession__) + "刺踢" + + FASTSHOOT = SkillRef(name='快速拔枪', code='fastshoot', profession=__profession__) + "快速拔枪" + + FLAMETHROWER = SkillRef(name='M-3喷火器', code='flamethrower', profession=__profession__) + "M-3喷火器" + + GATLING = SkillRef(name='M-137格林机枪', code='gatling', profession=__profession__) + "M-137格林机枪" + + GRAVITYGRENADE = SkillRef(name='G-61重力手雷', code='gravitygrenade', profession=__profession__) + "G-61重力手雷" + + GRENADELIGHT = SkillRef(name='G-35L感电手雷', code='grenadelight', profession=__profession__) + "G-35L感电手雷" + + GRENADENONE = SkillRef(name='G-14手雷', code='grenadenone', profession=__profession__) + "G-14手雷" + + GRENADEWATER = SkillRef(name='G-18C冰冻手雷', code='grenadewater', profession=__profession__) + "G-18C冰冻手雷" + + HIGHANGLESLIDING = SkillRef(name='浮空铲', code='highanglesliding', profession=__profession__) + "浮空铲" + + HITONSUBWEAPON = SkillRef(name='重火器拔击', code='hitonsubweapon', profession=__profession__) + "重火器拔击" + + KEYOFPROOF = SkillRef(name='制空掌握', code='keyofproof', profession=__profession__) + "制空掌握" + + LIFTSHOT = SkillRef(name='浮空弹', code='liftshot', profession=__profession__) + "浮空弹" + + LOCKONSUPPORT = SkillRef(name='镭射狙击', code='lockonsupport', profession=__profession__) + "镭射狙击" + + M18CLAYMORE = SkillRef(name='M18阔剑地雷', code='m18claymore', profession=__profession__) + "M18阔剑地雷" + + NAPALMBOMB = SkillRef(name='凝固汽油弹', code='napalmbomb', profession=__profession__) + "凝固汽油弹" + + NITROMOTOR = SkillRef(name='单兵推进器', code='nitromotor', profession=__profession__) + "单兵推进器" + + N_02X = SkillRef(name='单兵推进器-02X', code='n-02x', profession=__profession__) + "单兵推进器-02X" + + OPENFIRE = SkillRef(name='开火', code='openfire', profession=__profession__) + "开火" + + OVERCHARGE = SkillRef(name='超负荷装填', code='overcharge', profession=__profession__) + "超负荷装填" + + PHOTOBILIZER = SkillRef(name='光子霰雷发射器', code='photobilizer', profession=__profession__) + "光子霰雷发射器" + + PUNISHER = SkillRef(name='钉刺射', code='punisher', profession=__profession__) + "钉刺射" + + ROBOTRX78 = SkillRef(name='RX-78追击者', code='robotrx78', profession=__profession__) + "RX-78追击者" + + SILVERBULLET = SkillRef(name='银弹', code='silverbullet', profession=__profession__) + "银弹" + + STANDBYREADY = SkillRef(name='空袭战略', code='standbyready', profession=__profession__) + "空袭战略" + + STAYONJUMPSHOOT = SkillRef(name='空中射击', code='stayonjumpshoot', profession=__profession__) + "空中射击" + + STRAYBULLETMASTERY = SkillRef(name='手雷精通', code='straybulletmastery', profession=__profession__) + "手雷精通" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + WEAPONEXPERT = SkillRef(name='兵器研究', code='weaponexpert', profession=__profession__) + "兵器研究" + + WEAPONREINFORCE = SkillRef(name='弹药强化', code='weaponreinforce', profession=__profession__) + "弹药强化" + + WINDMILL = SkillRef(name='上旋踢', code='windmill', profession=__profession__) + "上旋踢" diff --git a/backend/core/character/refs/gunner_male/__init__.py b/backend/core/character/refs/gunner_male/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/gunner_male/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/gunner_male/assault.py b/backend/core/character/refs/gunner_male/assault.py new file mode 100644 index 00000000..5f7ae8a3 --- /dev/null +++ b/backend/core/character/refs/gunner_male/assault.py @@ -0,0 +1,135 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunner_male/assault/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs + + +class AssaultSkillRef(CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs): + """gunner_male.assault 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunner_male.assault' + + ACTIVATION = SkillRef(name='心脏驱动', code='activation', profession=__profession__) + "心脏驱动" + + AERIALGATLING = SkillRef(name='炙烤', code='aerialgatling', profession=__profession__) + "炙烤" + + AERIALKNEE = SkillRef(name='膝撞', code='aerialknee', profession=__profession__) + "膝撞" + + AIMSHOOT = SkillRef(name='瞄准射击', code='aimshoot', profession=__profession__) + "瞄准射击" + + ALTERATION = SkillRef(name='合金改装', code='alteration', profession=__profession__) + "合金改装" + + ALTERATIONDUSTSHOOT = SkillRef(name='改造烟尘弹', code='alterationdustshoot', profession=__profession__) + "改造烟尘弹" + + ARCDISCHARGE = SkillRef(name='电弧能量释放', code='arcdischarge', profession=__profession__) + "电弧能量释放" + + AT_SOWALKER = SkillRef(name='AT-SO步行者', code='at-sowalker', profession=__profession__) + "AT-SO步行者" + + AUTOMATICPISTOLMASTERY_ASSAULT = SkillRef(name='合金战士自动手枪精通', code='automaticpistolmastery_assault', profession=__profession__) + "合金战士自动手枪精通" + + BASHSTOCK = SkillRef(name='枪托强击', code='bashstock', profession=__profession__) + "枪托强击" + + BODYBUNKER = SkillRef(name='超频 : 重盾保卫', code='bodybunker', profession=__profession__) + "超频 : 重盾保卫" + + BREACHINGDOWN = SkillRef(name='超频 : 机械冲撞', code='breachingdown', profession=__profession__) + "超频 : 机械冲撞" + + BURSTBOMB = SkillRef(name='改装榴弹', code='burstbomb', profession=__profession__) + "改装榴弹" + + DEATHFIELD = SkillRef(name='超频 : 全领域攻击', code='deathfield', profession=__profession__) + "超频 : 全领域攻击" + + DIRECTFEEDBACK = SkillRef(name='雷达扫射', code='directfeedback', profession=__profession__) + "雷达扫射" + + DUSTSHOOT = SkillRef(name='烟尘弹', code='dustshoot', profession=__profession__) + "烟尘弹" + + DYNAMITEKICK = SkillRef(name='超频 : 电流闪踢', code='dynamitekick', profession=__profession__) + "超频 : 电流闪踢" + + EQUALISMR = SkillRef(name='超频 : 伊奎利斯-MR', code='equalismr', profession=__profession__) + "超频 : 伊奎利斯-MR" + + FASTKNEE = SkillRef(name='瞬踢', code='fastknee', profession=__profession__) + "瞬踢" + + FASTSHOOT = SkillRef(name='快速拔枪', code='fastshoot', profession=__profession__) + "快速拔枪" + + FINALDESPERATION = SkillRef(name='超频 : 末世终结之战', code='finaldesperation', profession=__profession__) + "超频 : 末世终结之战" + + FORTRESSBLITZ = SkillRef(name='堡垒轰击', code='fortressblitz', profession=__profession__) + "堡垒轰击" + + GATLING = SkillRef(name='M-137格林机枪', code='gatling', profession=__profession__) + "M-137格林机枪" + + HIGHANGLESLIDING = SkillRef(name='浮空铲', code='highanglesliding', profession=__profession__) + "浮空铲" + + LIFTSHOT = SkillRef(name='浮空弹', code='liftshot', profession=__profession__) + "浮空弹" + + MCPICE = SkillRef(name='爆裂飞踢', code='mcpice', profession=__profession__) + "爆裂飞踢" + + NEODYMIUMFUSEE = SkillRef(name='磁力手雷', code='neodymiumfusee', profession=__profession__) + "磁力手雷" + + PROJECTNOVELPARTS = SkillRef(name='诺维尔计划 : 涅槃', code='projectnovelparts', profession=__profession__) + "诺维尔计划 : 涅槃" + + PUNISHER = SkillRef(name='踏射', code='punisher', profession=__profession__) + "踏射" + + RAYTHEONCIRT = SkillRef(name='炎神攻城炮', code='raytheoncirt', profession=__profession__) + "炎神攻城炮" + + RECONSTRUCTIONBODY = SkillRef(name='躯体重塑', code='reconstructionbody', profession=__profession__) + "躯体重塑" + + RETROFIT = SkillRef(name='机体复原', code='retrofit', profession=__profession__) + "机体复原" + + ROBOTRX78 = SkillRef(name='RX-78追击者', code='robotrx78', profession=__profession__) + "RX-78追击者" + + SCORCHTACTICS = SkillRef(name='战略轰炸', code='scorchtactics', profession=__profession__) + "战略轰炸" + + SENSIBILITY = SkillRef(name='弱点扫描', code='sensibility', profession=__profession__) + "弱点扫描" + + SONICCOLLIDE = SkillRef(name='超频 : 音速瞬杀', code='soniccollide', profession=__profession__) + "超频 : 音速瞬杀" + + STAYONJUMPSHOOT = SkillRef(name='空中射击', code='stayonjumpshoot', profession=__profession__) + "空中射击" + + SUPPRESS = SkillRef(name='超频 : 压制', code='suppress', profession=__profession__) + "超频 : 压制" + + TEMPORARYREALIZATION5 = SkillRef(name='超卓之心', code='temporaryrealization5', profession=__profession__) + "超卓之心" + + TRIPLEGUNSHOT = SkillRef(name='三连霰弹', code='triplegunshot', profession=__profession__) + "三连霰弹" + + WALKERATTACKSTOP = SkillRef(name='步行者中止指令', code='walkerattackstop', profession=__profession__) + "步行者中止指令" + + WINDMILL = SkillRef(name='回旋踢', code='windmill', profession=__profession__) + "回旋踢" diff --git a/backend/core/character/refs/gunner_male/launcher_male.py b/backend/core/character/refs/gunner_male/launcher_male.py new file mode 100644 index 00000000..f1795855 --- /dev/null +++ b/backend/core/character/refs/gunner_male/launcher_male.py @@ -0,0 +1,135 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunner_male/launcher_male/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class LauncherMaleSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """gunner_male.launcher_male 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunner_male.launcher_male' + + AERIALGATLING = SkillRef(name='炙烤', code='aerialgatling', profession=__profession__) + "炙烤" + + AERIALKNEE = SkillRef(name='膝撞', code='aerialknee', profession=__profession__) + "膝撞" + + BURSTERBEAMNEW = SkillRef(name='毁灭射线', code='bursterbeamnew', profession=__profession__) + "毁灭射线" + + CANNONBALL = SkillRef(name='加农炮', code='cannonball', profession=__profession__) + "加农炮" + + DUALTRIGGER = SkillRef(name='光热反应', code='dualtrigger', profession=__profession__) + "光热反应" + + DUSTSHOOT = SkillRef(name='烟尘弹', code='dustshoot', profession=__profession__) + "烟尘弹" + + EXTRUDER = SkillRef(name='X-1压缩量子炮', code='extruder', profession=__profession__) + "X-1压缩量子炮" + + FASTKNEE = SkillRef(name='瞬踢', code='fastknee', profession=__profession__) + "瞬踢" + + FASTSHOOT = SkillRef(name='快速拔枪', code='fastshoot', profession=__profession__) + "快速拔枪" + + FLAMETHROWER = SkillRef(name='M-3喷火器', code='flamethrower', profession=__profession__) + "M-3喷火器" + + FLAMETHROWERBOOST = SkillRef(name='聚焦喷火器', code='flamethrowerboost', profession=__profession__) + "聚焦喷火器" + + FM31 = SkillRef(name='FM-31榴弹发射器', code='fm31', profession=__profession__) + "FM-31榴弹发射器" + + GATLING = SkillRef(name='M-137格林机枪', code='gatling', profession=__profession__) + "M-137格林机枪" + + GRENADENONE = SkillRef(name='G-14手雷', code='grenadenone', profession=__profession__) + "G-14手雷" + + HEAVYWEAPONALTERATION = SkillRef(name='重火器改良', code='heavyweaponalteration', profession=__profession__) + "重火器改良" + + HIGHANGLESLIDING = SkillRef(name='浮空铲', code='highanglesliding', profession=__profession__) + "浮空铲" + + HITONSUBWEAPON = SkillRef(name='重火器拔击', code='hitonsubweapon', profession=__profession__) + "重火器拔击" + + INTERLOCKSATELLITE = SkillRef(name='连锁卫星', code='interlocksatellite', profession=__profession__) + "连锁卫星" + + LASERRIFLE = SkillRef(name='激光炮', code='laserrifle', profession=__profession__) + "激光炮" + + LASERRIFLECHARGE = SkillRef(name='蓄电激光炮', code='laserriflecharge', profession=__profession__) + "蓄电激光炮" + + LIFTSHOT = SkillRef(name='浮空弹', code='liftshot', profession=__profession__) + "浮空弹" + + MLDRS95 = SkillRef(name='ML-95火炮发射器', code='mldrs95', profession=__profession__) + "ML-95火炮发射器" + + MSC7 = SkillRef(name='中子爆弹', code='msc7', profession=__profession__) + "中子爆弹" + + ORBITALDISASTER = SkillRef(name='裂核轨道炮', code='orbitaldisaster', profession=__profession__) + "裂核轨道炮" + + OVERPACK = SkillRef(name='超动力补给包', code='overpack', profession=__profession__) + "超动力补给包" + + PLASMABOOST = SkillRef(name='等离子放射器', code='plasmaboost', profession=__profession__) + "等离子放射器" + + PUNISHER = SkillRef(name='踏射', code='punisher', profession=__profession__) + "踏射" + + RADARSTUCKDOWN = SkillRef(name='卫星定位', code='radarstuckdown', profession=__profession__) + "卫星定位" + + ROBOTRX78 = SkillRef(name='RX-78追击者', code='robotrx78', profession=__profession__) + "RX-78追击者" + + SATELLITELASER = SkillRef(name='卫星射线', code='satellitelaser', profession=__profession__) + "卫星射线" + + SEISMICWAVE = SkillRef(name='地脉震荡器', code='seismicwave', profession=__profession__) + "地脉震荡器" + + SILVERBULLET = SkillRef(name='银弹', code='silverbullet', profession=__profession__) + "银弹" + + STAYONJUMPSHOOT = SkillRef(name='空中射击', code='stayonjumpshoot', profession=__profession__) + "空中射击" + + STEYRHEAVYRIFLE = SkillRef(name='反坦克炮', code='steyrheavyrifle', profession=__profession__) + "反坦克炮" + + STINGER = SkillRef(name='FM-92刺弹炮', code='stinger', profession=__profession__) + "FM-92刺弹炮" + + STINGEREX = SkillRef(name='FM-92特殊刺弹炮', code='stingerex', profession=__profession__) + "FM-92特殊刺弹炮" + + SUBWEAPONMASTERY = SkillRef(name='重火器精通', code='subweaponmastery', profession=__profession__) + "重火器精通" + + SUBWEAPONPOWERUP = SkillRef(name='重火器奥义', code='subweaponpowerup', profession=__profession__) + "重火器奥义" + + SUBWEAPONSTUCKDOWN = SkillRef(name='潜能爆发', code='subweaponstuckdown', profession=__profession__) + "潜能爆发" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + URANIUMBOMB = SkillRef(name='量子爆弹', code='uraniumbomb', profession=__profession__) + "量子爆弹" + + WINDMILL = SkillRef(name='回旋踢', code='windmill', profession=__profession__) + "回旋踢" diff --git a/backend/core/character/refs/gunner_male/mechanic_male.py b/backend/core/character/refs/gunner_male/mechanic_male.py new file mode 100644 index 00000000..779439e3 --- /dev/null +++ b/backend/core/character/refs/gunner_male/mechanic_male.py @@ -0,0 +1,147 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunner_male/mechanic_male/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class MechanicMaleSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """gunner_male.mechanic_male 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunner_male.mechanic_male' + + AERIALGATLING = SkillRef(name='炙烤', code='aerialgatling', profession=__profession__) + "炙烤" + + AERIALKNEE = SkillRef(name='膝撞', code='aerialknee', profession=__profession__) + "膝撞" + + ARKREACTOR = SkillRef(name='方舟反应堆', code='arkreactor', profession=__profession__) + "方舟反应堆" + + ATEAM = SkillRef(name='TX-45特攻队', code='ateam', profession=__profession__) + "TX-45特攻队" + + CAMOUFLAGE = SkillRef(name='伪装', code='camouflage', profession=__profession__) + "伪装" + + DIMENSIONRUNNER = SkillRef(name='TN-80终结者', code='dimensionrunner', profession=__profession__) + "TN-80终结者" + + DUSTSHOOT = SkillRef(name='烟尘弹', code='dustshoot', profession=__profession__) + "烟尘弹" + + FASTKNEE = SkillRef(name='瞬踢', code='fastknee', profession=__profession__) + "瞬踢" + + FASTSHOOT = SkillRef(name='快速拔枪', code='fastshoot', profession=__profession__) + "快速拔枪" + + FIREVOLT = SkillRef(name='火焰电压', code='firevolt', profession=__profession__) + "火焰电压" + + FLAMETHROWER = SkillRef(name='M-3喷火器', code='flamethrower', profession=__profession__) + "M-3喷火器" + + G1 = SkillRef(name='G-1科罗纳', code='g1', profession=__profession__) + "G-1科罗纳" + + G2 = SkillRef(name='改装 : G-2旋雷者', code='g2', profession=__profession__) + "改装 : G-2旋雷者" + + G3 = SkillRef(name='改装 : G-3捕食者', code='g3', profession=__profession__) + "改装 : G-3捕食者" + + GAEBOLGPUNCH = SkillRef(name='盖波加之拳', code='gaebolgpunch', profession=__profession__) + "盖波加之拳" + + GATLING = SkillRef(name='M-137格林机枪', code='gatling', profession=__profession__) + "M-137格林机枪" + + GRENADENONE = SkillRef(name='G-14手雷', code='grenadenone', profession=__profession__) + "G-14手雷" + + GW16 = SkillRef(name='GW-16瓦尔德斯坦', code='gw16', profession=__profession__) + "GW-16瓦尔德斯坦" + + HELLMARCH = SkillRef(name='超时空行军', code='hellmarch', profession=__profession__) + "超时空行军" + + HIGHANGLESLIDING = SkillRef(name='浮空铲', code='highanglesliding', profession=__profession__) + "浮空铲" + + HITONSUBWEAPON = SkillRef(name='重火器拔击', code='hitonsubweapon', profession=__profession__) + "重火器拔击" + + HOLDANDGO = SkillRef(name='机械指令', code='holdandgo', profession=__profession__) + "机械指令" + + HS1 = SkillRef(name='HS-1机械助手', code='hs1', profession=__profession__) + "HS-1机械助手" + + LASTFIGHTINGSPIRIT = SkillRef(name='斗志之歌', code='lastfightingspirit', profession=__profession__) + "斗志之歌" + + LIFTSHOT = SkillRef(name='浮空弹', code='liftshot', profession=__profession__) + "浮空弹" + + MECHADROP = SkillRef(name='空投支援', code='mechadrop', profession=__profession__) + "空投支援" + + PUNISHER = SkillRef(name='踏射', code='punisher', profession=__profession__) + "踏射" + + ROBOTENGINEERING = SkillRef(name='机械概论', code='robotengineering', profession=__profession__) + "机械概论" + + ROBOTEXS = SkillRef(name='EX-S毒蛇炮', code='robotexs', profession=__profession__) + "EX-S毒蛇炮" + + ROBOTEXSEX = SkillRef(name='EX-S零式毒蛇炮', code='robotexsex', profession=__profession__) + "EX-S零式毒蛇炮" + + ROBOTEZ8 = SkillRef(name='EZ-8爆破者', code='robotez8', profession=__profession__) + "EZ-8爆破者" + + ROBOTEZ8EX = SkillRef(name='EZ-10反击者', code='robotez8ex', profession=__profession__) + "EZ-10反击者" + + ROBOTICS = SkillRef(name='机械改良', code='robotics', profession=__profession__) + "机械改良" + + ROBOTRX60 = SkillRef(name='RX-60陷阱追击者', code='robotrx60', profession=__profession__) + "RX-60陷阱追击者" + + ROBOTRX78 = SkillRef(name='RX-78追击者', code='robotrx78', profession=__profession__) + "RX-78追击者" + + ROBOTSEXPLOSION = SkillRef(name='机械引爆', code='robotsexplosion', profession=__profession__) + "机械引爆" + + ROBOTTEMPESTER = SkillRef(name='空战机械 : 风暴', code='robottempester', profession=__profession__) + "空战机械 : 风暴" + + RX78OFCRISIS = SkillRef(name='嗜战追击者', code='rx78ofcrisis', profession=__profession__) + "嗜战追击者" + + SILVERBULLET = SkillRef(name='银弹', code='silverbullet', profession=__profession__) + "银弹" + + SOLARMODULESYSTEM = SkillRef(name='光反应能量模块', code='solarmodulesystem', profession=__profession__) + "光反应能量模块" + + SOPHIA = SkillRef(name='索菲亚', code='sophia', profession=__profession__) + "索菲亚" + + SPARROWFACTORY = SkillRef(name='拦截机工厂', code='sparrowfactory', profession=__profession__) + "拦截机工厂" + + STAYONJUMPSHOOT = SkillRef(name='空中射击', code='stayonjumpshoot', profession=__profession__) + "空中射击" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + VIRTUALRUSH = SkillRef(name='HS-1全息机械猎手', code='virtualrush', profession=__profession__) + "HS-1全息机械猎手" + + WINDMILL = SkillRef(name='回旋踢', code='windmill', profession=__profession__) + "回旋踢" diff --git a/backend/core/character/refs/gunner_male/ranger_male.py b/backend/core/character/refs/gunner_male/ranger_male.py new file mode 100644 index 00000000..0d8dba56 --- /dev/null +++ b/backend/core/character/refs/gunner_male/ranger_male.py @@ -0,0 +1,132 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunner_male/ranger_male/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class RangerMaleSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """gunner_male.ranger_male 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunner_male.ranger_male' + + ACCELATIONTRIGGER = SkillRef(name='爆燃突击', code='accelationtrigger', profession=__profession__) + "爆燃突击" + + AERIALGATLING = SkillRef(name='炙烤', code='aerialgatling', profession=__profession__) + "炙烤" + + AERIALKNEE = SkillRef(name='膝撞', code='aerialknee', profession=__profession__) + "膝撞" + + AIRRAID = SkillRef(name='浮空劫击', code='airraid', profession=__profession__) + "浮空劫击" + + BULLETGUARD = SkillRef(name='远程格挡', code='bulletguard', profession=__profession__) + "远程格挡" + + COUNTERSHOOT = SkillRef(name='心灵反击', code='countershoot', profession=__profession__) + "心灵反击" + + DEADLYAPPROACH = SkillRef(name='死亡突袭', code='deadlyapproach', profession=__profession__) + "死亡突袭" + + DEATHCRISIS = SkillRef(name='鹰眸·致命危机', code='deathcrisis', profession=__profession__) + "鹰眸·致命危机" + + DESPERADO = SkillRef(name='疯狂射击', code='desperado', profession=__profession__) + "疯狂射击" + + DOUBLEGUNHAWK = SkillRef(name='双鹰回旋', code='doublegunhawk', profession=__profession__) + "双鹰回旋" + + DUSTSHOOT = SkillRef(name='烟尘弹', code='dustshoot', profession=__profession__) + "烟尘弹" + + FASTDRAW = SkillRef(name='疾风骤雨', code='fastdraw', profession=__profession__) + "疾风骤雨" + + FASTKNEE = SkillRef(name='瞬踢', code='fastknee', profession=__profession__) + "瞬踢" + + FASTSHOOT = SkillRef(name='快速拔枪', code='fastshoot', profession=__profession__) + "快速拔枪" + + FLAMETHROWER = SkillRef(name='M-3喷火器', code='flamethrower', profession=__profession__) + "M-3喷火器" + + GATLING = SkillRef(name='M-137格林机枪', code='gatling', profession=__profession__) + "M-137格林机枪" + + GRENADENONE = SkillRef(name='G-14手雷', code='grenadenone', profession=__profession__) + "G-14手雷" + + HEADSHOT = SkillRef(name='溃灭射击', code='headshot', profession=__profession__) + "溃灭射击" + + HEADSHOTMASTERY = SkillRef(name='射击掌握', code='headshotmastery', profession=__profession__) + "射击掌握" + + HIGHANGLESLIDING = SkillRef(name='浮空铲', code='highanglesliding', profession=__profession__) + "浮空铲" + + HITONSUBWEAPON = SkillRef(name='重火器拔击', code='hitonsubweapon', profession=__profession__) + "重火器拔击" + + LIFTSHOT = SkillRef(name='浮空弹', code='liftshot', profession=__profession__) + "浮空弹" + + MARKOFDEATH = SkillRef(name='死亡印记', code='markofdeath', profession=__profession__) + "死亡印记" + + MULTIHEADSHOT = SkillRef(name='多重射击', code='multiheadshot', profession=__profession__) + "多重射击" + + OUTSTANDING = SkillRef(name='卓尔不群', code='outstanding', profession=__profession__) + "卓尔不群" + + POWERUPREVOLVER = SkillRef(name='左轮奥义', code='poweruprevolver', profession=__profession__) + "左轮奥义" + + PUNISHER = SkillRef(name='踏射', code='punisher', profession=__profession__) + "踏射" + + RANDOMSHOOT = SkillRef(name='乱射', code='randomshoot', profession=__profession__) + "乱射" + + REVOLVERCRITICALDAMAGEUP = SkillRef(name='死亡左轮', code='revolvercriticaldamageup', profession=__profession__) + "死亡左轮" + + ROBOTRX78 = SkillRef(name='RX-78追击者', code='robotrx78', profession=__profession__) + "RX-78追击者" + + SEVENTHFLOW = SkillRef(name='第七翼动', code='seventhflow', profession=__profession__) + "第七翼动" + + SILVERBULLET = SkillRef(name='银弹', code='silverbullet', profession=__profession__) + "银弹" + + STAYONJUMPSHOOT = SkillRef(name='空中射击', code='stayonjumpshoot', profession=__profession__) + "空中射击" + + STYLISH = SkillRef(name='花式枪术', code='stylish', profession=__profession__) + "花式枪术" + + SUPPRESSINGFIRE = SkillRef(name='压制射击', code='suppressingfire', profession=__profession__) + "压制射击" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + TRIPLETAP = SkillRef(name='三连发', code='tripletap', profession=__profession__) + "三连发" + + TURNINGSHOOT = SkillRef(name='溃灭回射', code='turningshoot', profession=__profession__) + "溃灭回射" + + WALKSHOOT = SkillRef(name='移动射击', code='walkshoot', profession=__profession__) + "移动射击" + + WINDMILL = SkillRef(name='回旋踢', code='windmill', profession=__profession__) + "回旋踢" + + WIPEOUT = SkillRef(name='抹杀', code='wipeout', profession=__profession__) + "抹杀" diff --git a/backend/core/character/refs/gunner_male/spitfire_male.py b/backend/core/character/refs/gunner_male/spitfire_male.py new file mode 100644 index 00000000..99b45c58 --- /dev/null +++ b/backend/core/character/refs/gunner_male/spitfire_male.py @@ -0,0 +1,144 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:gunner_male/spitfire_male/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class SpitfireMaleSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """gunner_male.spitfire_male 的技能引用;包含继承的公共技能。""" + __profession__ = 'gunner_male.spitfire_male' + + ADVANCEDBULLET = SkillRef(name='弹药主宰', code='advancedbullet', profession=__profession__) + "弹药主宰" + + AERIALGATLING = SkillRef(name='炙烤', code='aerialgatling', profession=__profession__) + "炙烤" + + AERIALKNEE = SkillRef(name='膝撞', code='aerialknee', profession=__profession__) + "膝撞" + + ALLEGIANT = SkillRef(name='赤诚之心', code='allegiant', profession=__profession__) + "赤诚之心" + + BLACKROSE = SkillRef(name='黑玫瑰特种战队', code='blackrose', profession=__profession__) + "黑玫瑰特种战队" + + BULLETEXPLOSIVE = SkillRef(name='爆裂弹', code='bulletexplosive', profession=__profession__) + "爆裂弹" + + BULLETMASTERY = SkillRef(name='弹药改良', code='bulletmastery', profession=__profession__) + "弹药改良" + + BULLETPENETRATE = SkillRef(name='贯穿弹', code='bulletpenetrate', profession=__profession__) + "贯穿弹" + + BULLETSPECIFIC = SkillRef(name='特性弹', code='bulletspecific', profession=__profession__) + "特性弹" + + C4 = SkillRef(name='C4飞弹', code='c4', profession=__profession__) + "C4飞弹" + + CHARGEBUSTER = SkillRef(name='聚合弹', code='chargebuster', profession=__profession__) + "聚合弹" + + CONVERSION = SkillRef(name='攻击类型转换', code='conversion', profession=__profession__) + "攻击类型转换" + + CROSSSHOOT = SkillRef(name='交叉射击', code='crossshoot', profession=__profession__) + "交叉射击" + + DANGERCLOSE = SkillRef(name='重火力支援', code='dangerclose', profession=__profession__) + "重火力支援" + + DUSTSHOOT = SkillRef(name='烟尘弹', code='dustshoot', profession=__profession__) + "烟尘弹" + + ETERNALBUSTER = SkillRef(name='皇鹰特战队', code='eternalbuster', profession=__profession__) + "皇鹰特战队" + + FASTKNEE = SkillRef(name='瞬踢', code='fastknee', profession=__profession__) + "瞬踢" + + FASTSHOOT = SkillRef(name='快速拔枪', code='fastshoot', profession=__profession__) + "快速拔枪" + + FLAMETHROWER = SkillRef(name='M-3喷火器', code='flamethrower', profession=__profession__) + "M-3喷火器" + + G38ARG = SkillRef(name='G-38智能手雷', code='g38arg', profession=__profession__) + "G-38智能手雷" + + GATLING = SkillRef(name='M-137格林机枪', code='gatling', profession=__profession__) + "M-137格林机枪" + + GRAVITYGRENADE = SkillRef(name='G-61重力手雷', code='gravitygrenade', profession=__profession__) + "G-61重力手雷" + + GRENADELIGHT = SkillRef(name='G-35L感电手雷', code='grenadelight', profession=__profession__) + "G-35L感电手雷" + + GRENADENONE = SkillRef(name='G-14手雷', code='grenadenone', profession=__profession__) + "G-14手雷" + + GRENADEWATER = SkillRef(name='G-18C冰冻手雷', code='grenadewater', profession=__profession__) + "G-18C冰冻手雷" + + HIGHANGLESLIDING = SkillRef(name='浮空铲', code='highanglesliding', profession=__profession__) + "浮空铲" + + HITONSUBWEAPON = SkillRef(name='重火器拔击', code='hitonsubweapon', profession=__profession__) + "重火器拔击" + + LIFTSHOT = SkillRef(name='浮空弹', code='liftshot', profession=__profession__) + "浮空弹" + + M18CLAYMORE = SkillRef(name='M18阔剑地雷', code='m18claymore', profession=__profession__) + "M18阔剑地雷" + + MAGAZINEDRUM = SkillRef(name='弹夹改装', code='magazinedrum', profession=__profession__) + "弹夹改装" + + MAXWELL = SkillRef(name='电磁弹 : 麦克斯韦', code='maxwell', profession=__profession__) + "电磁弹 : 麦克斯韦" + + NAPALMBOMB = SkillRef(name='凝固汽油弹', code='napalmbomb', profession=__profession__) + "凝固汽油弹" + + OVERCHARGE = SkillRef(name='超负荷装填', code='overcharge', profession=__profession__) + "超负荷装填" + + PUNISHER = SkillRef(name='踏射', code='punisher', profession=__profession__) + "踏射" + + RETURNEDSNIPER = SkillRef(name='狙击手增援', code='returnedsniper', profession=__profession__) + "狙击手增援" + + ROBOTRX78 = SkillRef(name='RX-78追击者', code='robotrx78', profession=__profession__) + "RX-78追击者" + + SILVERBULLET = SkillRef(name='银弹', code='silverbullet', profession=__profession__) + "银弹" + + STAYONJUMPSHOOT = SkillRef(name='空中射击', code='stayonjumpshoot', profession=__profession__) + "空中射击" + + STRAYBULLETMASTERY = SkillRef(name='手雷精通', code='straybulletmastery', profession=__profession__) + "手雷精通" + + SUPERNOVA = SkillRef(name='超新星核爆', code='supernova', profession=__profession__) + "超新星核爆" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + WARHERO = SkillRef(name='战地功勋', code='warhero', profession=__profession__) + "战地功勋" + + WEAPONEXPERT = SkillRef(name='兵器研究', code='weaponexpert', profession=__profession__) + "兵器研究" + + WILDRNESSSTORM = SkillRef(name='赤魂·风暴狙击', code='wildrnessstorm', profession=__profession__) + "赤魂·风暴狙击" + + WINDMILL = SkillRef(name='回旋踢', code='windmill', profession=__profession__) + "回旋踢" diff --git a/backend/core/character/refs/imperialknight/__init__.py b/backend/core/character/refs/imperialknight/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/imperialknight/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/imperialknight/breaker.py b/backend/core/character/refs/imperialknight/breaker.py new file mode 100644 index 00000000..180cce89 --- /dev/null +++ b/backend/core/character/refs/imperialknight/breaker.py @@ -0,0 +1,105 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:imperialknight/breaker/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class BreakerSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """imperialknight.breaker 的技能引用;包含继承的公共技能。""" + __profession__ = 'imperialknight.breaker' + + ANCHORKICK = SkillRef(name='枪锚踢击', code='anchorkick', profession=__profession__) + "枪锚踢击" + + AVAST = SkillRef(name='停航戒令', code='avast', profession=__profession__) + "停航戒令" + + BOARDINGACTIONPRO = SkillRef(name='海战体术', code='boardingactionpro', profession=__profession__) + "海战体术" + + CANNONKICK = SkillRef(name='舰炮飞踢', code='cannonkick', profession=__profession__) + "舰炮飞踢" + + DECKBREAKER = SkillRef(name='帝国威严', code='deckbreaker', profession=__profession__) + "帝国威严" + + DEEPWATERCALL = SkillRef(name='深海召唤', code='deepwatercall', profession=__profession__) + "深海召唤" + + DREADFALLBARRAGE = SkillRef(name='战栗轰击', code='dreadfallbarrage', profession=__profession__) + "战栗轰击" + + GALESLASH = SkillRef(name='狂风斩', code='galeslash', profession=__profession__) + "狂风斩" + + HOOKSHOT = SkillRef(name='钩爪突袭', code='hookshot', profession=__profession__) + "钩爪突袭" + + HULLBREACH = SkillRef(name='船体碎击', code='hullbreach', profession=__profession__) + "船体碎击" + + IRONSONG = SkillRef(name='海妖之歌', code='ironsong', profession=__profession__) + "海妖之歌" + + MAELSTROM = SkillRef(name='气卷万涛', code='maelstrom', profession=__profession__) + "气卷万涛" + + NOQUARTER = SkillRef(name='无情铁律', code='noquarter', profession=__profession__) + "无情铁律" + + OPENWARFANFARE = SkillRef(name='鸣镝破阵', code='openwarfanfare', profession=__profession__) + "鸣镝破阵" + + PIERCEIMPACT = SkillRef(name='怒海冲击', code='pierceimpact', profession=__profession__) + "怒海冲击" + + POINTTHRUST = SkillRef(name='穿心刺', code='pointthrust', profession=__profession__) + "穿心刺" + + QUICKBISECTION = SkillRef(name='破浪斩', code='quickbisection', profession=__profession__) + "破浪斩" + + RAISEUPPERCUT = SkillRef(name='上撩斩', code='raiseuppercut', profession=__profession__) + "上撩斩" + + RIPTIDE = SkillRef(name='逆流而上', code='riptide', profession=__profession__) + "逆流而上" + + RIPTIDEUPRISING = SkillRef(name='逆浪断空', code='riptideuprising', profession=__profession__) + "逆浪断空" + + ROUGHBOARDING = SkillRef(name='无畏登舰', code='roughboarding', profession=__profession__) + "无畏登舰" + + SEABANE = SkillRef(name='四海游龙', code='seabane', profession=__profession__) + "四海游龙" + + SEADRAGONTOOTH = SkillRef(name='蛟龙惊涛', code='seadragontooth', profession=__profession__) + "蛟龙惊涛" + + SEAGODFALLDOWN = SkillRef(name='海神降临', code='seagodfalldown', profession=__profession__) + "海神降临" + + SWEEPINGSTRIKE = SkillRef(name='旋风扫荡', code='sweepingstrike', profession=__profession__) + "旋风扫荡" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + TIDEBOUND = SkillRef(name='潮汐之缚', code='tidebound', profession=__profession__) + "潮汐之缚" + + TIDEPIERCER = SkillRef(name='激流勇进', code='tidepiercer', profession=__profession__) + "激流勇进" + + TROUBLEMAKER = SkillRef(name='桀骜不驯', code='troublemaker', profession=__profession__) + "桀骜不驯" + + UNBOUNDTEMPEST = SkillRef(name='狂澜风暴舞', code='unboundtempest', profession=__profession__) + "狂澜风暴舞" + + WAVEBREAKER = SkillRef(name='乘风破浪', code='wavebreaker', profession=__profession__) + "乘风破浪" + + WIDECLEAVE = SkillRef(name='狂野横扫', code='widecleave', profession=__profession__) + "狂野横扫" diff --git a/backend/core/character/refs/knight/__init__.py b/backend/core/character/refs/knight/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/knight/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/knight/chaos.py b/backend/core/character/refs/knight/chaos.py new file mode 100644 index 00000000..d64839ff --- /dev/null +++ b/backend/core/character/refs/knight/chaos.py @@ -0,0 +1,165 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:knight/chaos/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class ChaosSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """knight.chaos 的技能引用;包含继承的公共技能。""" + __profession__ = 'knight.chaos' + + ATENADVENT = SkillRef(name='黑曜之眸 : 亚丁降临', code='atenadvent', profession=__profession__) + "黑曜之眸 : 亚丁降临" + + BATTERINGRAM = SkillRef(name='毁灭突进', code='batteringram', profession=__profession__) + "毁灭突进" + + BLACKSUN = SkillRef(name='黑色曜日', code='blacksun', profession=__profession__) + "黑色曜日" + + BRAINSTORM = SkillRef(name='思维风暴', code='brainstorm', profession=__profession__) + "思维风暴" + + BRAWL = SkillRef(name='魔灵乱舞', code='brawl', profession=__profession__) + "魔灵乱舞" + + CLEARDEMON = SkillRef(name='军团遣散', code='cleardemon', profession=__profession__) + "军团遣散" + + CORPSARRAY = SkillRef(name='军团列队', code='corpsarray', profession=__profession__) + "军团列队" + + DARKSHOCKWAVE = SkillRef(name='黑暗冲击', code='darkshockwave', profession=__profession__) + "黑暗冲击" + + DEFENSIVEPOSTURE = SkillRef(name='防御姿态', code='defensiveposture', profession=__profession__) + "防御姿态" + + DISARMING = SkillRef(name='破武之轮', code='disarming', profession=__profession__) + "破武之轮" + + ELEMENTALCIRCLE = SkillRef(name='灵性转换', code='elementalcircle', profession=__profession__) + "灵性转换" + + EVILFESTIVAL = SkillRef(name='盛宴·恶之祭典', code='evilfestival', profession=__profession__) + "盛宴·恶之祭典" + + EXPLOITATION = SkillRef(name='魔能榨取', code='exploitation', profession=__profession__) + "魔能榨取" + + FANCYTWIST = SkillRef(name='魔幻旋风', code='fancytwist', profession=__profession__) + "魔幻旋风" + + FINALATTACK = SkillRef(name='聚灵升空剑', code='finalattack', profession=__profession__) + "聚灵升空剑" + + FINISH = SkillRef(name='跳斩', code='finish', profession=__profession__) + "跳斩" + + GENOCIDECRUSH = SkillRef(name='碎灵之击', code='genocidecrush', profession=__profession__) + "碎灵之击" + + GRANDFINALE = SkillRef(name='绽放·终章', code='grandfinale', profession=__profession__) + "绽放·终章" + + INTERCEPT = SkillRef(name='飞跃截击', code='intercept', profession=__profession__) + "飞跃截击" + + LETHALPUNTO = SkillRef(name='致命突刺', code='lethalpunto', profession=__profession__) + "致命突刺" + + LIONKICK = SkillRef(name='强踢', code='lionkick', profession=__profession__) + "强踢" + + MASSIVEFIRE = SkillRef(name='绚丽耀光', code='massivefire', profession=__profession__) + "绚丽耀光" + + MIDNIGHTCARNIVAL = SkillRef(name='午夜嘉年华', code='midnightcarnival', profession=__profession__) + "午夜嘉年华" + + MIXEDBLOOD = SkillRef(name='魔灵血统', code='mixedblood', profession=__profession__) + "魔灵血统" + + PERFECTGUARD = SkillRef(name='自动防御', code='perfectguard', profession=__profession__) + "自动防御" + + REIGNOFTERROR = SkillRef(name='绝对魅力', code='reignofterror', profession=__profession__) + "绝对魅力" + + RESONANCE = SkillRef(name='连锁共振', code='resonance', profession=__profession__) + "连锁共振" + + RULEOFPOWER = SkillRef(name='力量法则', code='ruleofpower', profession=__profession__) + "力量法则" + + SACRIFICEBOMB = SkillRef(name='魔灵炸弹', code='sacrificebomb', profession=__profession__) + "魔灵炸弹" + + SHIELDCHANGE = SkillRef(name='盾牌转换', code='shieldchange', profession=__profession__) + "盾牌转换" + + SHIELDGUARD = SkillRef(name='盾牌格挡', code='shieldguard', profession=__profession__) + "盾牌格挡" + + SHIELDSTARK = SkillRef(name='盾击', code='shieldstark', profession=__profession__) + "盾击" + + STOPATTACK = SkillRef(name='魔灵随行', code='stopattack', profession=__profession__) + "魔灵随行" + + SUMMONATENSAVATAR = SkillRef(name='亚丁之力', code='summonatensavatar', profession=__profession__) + "亚丁之力" + + SUMMONBIGDADDY = SkillRef(name='魔灵召唤 : 迪克老爹', code='summonbigdaddy', profession=__profession__) + "魔灵召唤 : 迪克老爹" + + SUMMONBORASS = SkillRef(name='魔灵召唤 : 波拉斯', code='summonborass', profession=__profession__) + "魔灵召唤 : 波拉斯" + + SUMMONCHAOSSOLDIER = SkillRef(name='统御 : 魔灵战士', code='summonchaossoldier', profession=__profession__) + "统御 : 魔灵战士" + + SUMMONCRAZYSPIN = SkillRef(name='魔灵召唤 : 旋转小冯', code='summoncrazyspin', profession=__profession__) + "魔灵召唤 : 旋转小冯" + + SUMMONDEMONMAGICIAN = SkillRef(name='统御 : 魔灵法师', code='summondemonmagician', profession=__profession__) + "统御 : 魔灵法师" + + SUMMONDEVAATEN = SkillRef(name='亚丁的庇佑', code='summondevaaten', profession=__profession__) + "亚丁的庇佑" + + SUMMONGELATINMASK = SkillRef(name='魔灵召唤 : 假面杰森', code='summongelatinmask', profession=__profession__) + "魔灵召唤 : 假面杰森" + + SUMMONHEARTQUEEN = SkillRef(name='魔灵召唤 : 红心女皇艾莉莎', code='summonheartqueen', profession=__profession__) + "魔灵召唤 : 红心女皇艾莉莎" + + SUMMONHYSTERICWORRIER = SkillRef(name='魔灵召唤 : 狂暴布洛克', code='summonhystericworrier', profession=__profession__) + "魔灵召唤 : 狂暴布洛克" + + SUMMONLUCKYWACKY = SkillRef(name='魔灵召唤 : 瓦尔琪', code='summonluckywacky', profession=__profession__) + "魔灵召唤 : 瓦尔琪" + + SUMMONRAGEHAT = SkillRef(name='魔灵召唤 : 大富翁鲁邦', code='summonragehat', profession=__profession__) + "魔灵召唤 : 大富翁鲁邦" + + SUMMONTWINKLEARTIST = SkillRef(name='魔灵召唤 : 大画家芭芘', code='summontwinkleartist', profession=__profession__) + "魔灵召唤 : 大画家芭芘" + + SUMMONVAMPIRECHILDREN = SkillRef(name='魔灵召唤 : 小吸血鬼夏伊', code='summonvampirechildren', profession=__profession__) + "魔灵召唤 : 小吸血鬼夏伊" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + UPPERSHIELD = SkillRef(name='盾挑', code='uppershield', profession=__profession__) + "盾挑" + + VSLASH = SkillRef(name='翔空剑', code='vslash', profession=__profession__) + "翔空剑" + + WHEELOFFORTUNE = SkillRef(name='命运之轮', code='wheeloffortune', profession=__profession__) + "命运之轮" + + WONDERFULRUSH = SkillRef(name='魔神百裂拳', code='wonderfulrush', profession=__profession__) + "魔神百裂拳" diff --git a/backend/core/character/refs/knight/dragon_knight.py b/backend/core/character/refs/knight/dragon_knight.py new file mode 100644 index 00000000..e6cab8e1 --- /dev/null +++ b/backend/core/character/refs/knight/dragon_knight.py @@ -0,0 +1,126 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:knight/dragon_knight/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class DragonKnightSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """knight.dragon_knight 的技能引用;包含继承的公共技能。""" + __profession__ = 'knight.dragon_knight' + + BLITZSTRIKE = SkillRef(name='龙翼突袭', code='blitzstrike', profession=__profession__) + "龙翼突袭" + + BURSTHORN = SkillRef(name='爆破龙角', code='bursthorn', profession=__profession__) + "爆破龙角" + + DEFENSIVEPOSTURE = SkillRef(name='防御姿态', code='defensiveposture', profession=__profession__) + "防御姿态" + + DISASTER = SkillRef(name='雷光嘶吼', code='disaster', profession=__profession__) + "雷光嘶吼" + + DRAGONBREATH = SkillRef(name='龙之吐息', code='dragonbreath', profession=__profession__) + "龙之吐息" + + DRAGONBURST = SkillRef(name='魔龙星落', code='dragonburst', profession=__profession__) + "魔龙星落" + + DRAGONFANG = SkillRef(name='龙之撕咬', code='dragonfang', profession=__profession__) + "龙之撕咬" + + DRAGONFORCE = SkillRef(name='魔龙之力', code='dragonforce', profession=__profession__) + "魔龙之力" + + DRAGONIANWEAPON = SkillRef(name='龙人血统', code='dragonianweapon', profession=__profession__) + "龙人血统" + + DRAGONKAISERSWORD = SkillRef(name='龙刃无双', code='dragonkaisersword', profession=__profession__) + "龙刃无双" + + DRAGONOATH = SkillRef(name='龙血誓约', code='dragonoath', profession=__profession__) + "龙血誓约" + + DRAGONSMASH = SkillRef(name='飞龙斩', code='dragonsmash', profession=__profession__) + "飞龙斩" + + DRAGONTOOTH = SkillRef(name='龙人剑术', code='dragontooth', profession=__profession__) + "龙人剑术" + + DRAGONWING = SkillRef(name='龙翼', code='dragonwing', profession=__profession__) + "龙翼" + + EXTERMINATE = SkillRef(name='龙皇制裁', code='exterminate', profession=__profession__) + "龙皇制裁" + + FINISH = SkillRef(name='跳斩', code='finish', profession=__profession__) + "跳斩" + + FIREBREATH = SkillRef(name='火焰吐息', code='firebreath', profession=__profession__) + "火焰吐息" + + FOODFIGHTING = SkillRef(name='肉食主义', code='foodfighting', profession=__profession__) + "肉食主义" + + HEIR = SkillRef(name='龙神血脉', code='heir', profession=__profession__) + "龙神血脉" + + INFINITYNOVA = SkillRef(name='龙神君临·虚空烬灭', code='infinitynova', profession=__profession__) + "龙神君临·虚空烬灭" + + INTERCEPT = SkillRef(name='飞跃截击', code='intercept', profession=__profession__) + "飞跃截击" + + KNUCKLEBLASTER = SkillRef(name='龙拳', code='knuckleblaster', profession=__profession__) + "龙拳" + + LASTLIGHT = SkillRef(name='龙神裁决 : 终末之光', code='lastlight', profession=__profession__) + "龙神裁决 : 终末之光" + + LETHALPUNTO = SkillRef(name='致命突刺', code='lethalpunto', profession=__profession__) + "致命突刺" + + LIGHTNINGROAR = SkillRef(name='龙哮雷鸣', code='lightningroar', profession=__profession__) + "龙哮雷鸣" + + LIONKICK = SkillRef(name='强踢', code='lionkick', profession=__profession__) + "强踢" + + PARTICIPATION = SkillRef(name='征战无双', code='participation', profession=__profession__) + "征战无双" + + PERFECTGUARD = SkillRef(name='自动防御', code='perfectguard', profession=__profession__) + "自动防御" + + SHIELDGUARD = SkillRef(name='盾牌格挡', code='shieldguard', profession=__profession__) + "盾牌格挡" + + SHIELDSTARK = SkillRef(name='盾击', code='shieldstark', profession=__profession__) + "盾击" + + SKYRUSH = SkillRef(name='魔龙天翔', code='skyrush', profession=__profession__) + "魔龙天翔" + + SLAYER = SkillRef(name='龙人之太刀精通', code='slayer', profession=__profession__) + "龙人之太刀精通" + + SPICE = SkillRef(name='大胃王', code='spice', profession=__profession__) + "大胃王" + + SPINNINGRAID = SkillRef(name='龙翼穿刺', code='spinningraid', profession=__profession__) + "龙翼穿刺" + + STORMBREATH = SkillRef(name='魔龙之息', code='stormbreath', profession=__profession__) + "魔龙之息" + + SUMMONASTR = SkillRef(name='龙语召唤 : 阿斯特拉', code='summonastr', profession=__profession__) + "龙语召唤 : 阿斯特拉" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + UPPERSHIELD = SkillRef(name='盾挑', code='uppershield', profession=__profession__) + "盾挑" + + WHEELOFFORTUNE = SkillRef(name='命运之轮', code='wheeloffortune', profession=__profession__) + "命运之轮" diff --git a/backend/core/character/refs/knight/elven_knight.py b/backend/core/character/refs/knight/elven_knight.py new file mode 100644 index 00000000..563e70fd --- /dev/null +++ b/backend/core/character/refs/knight/elven_knight.py @@ -0,0 +1,138 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:knight/elven_knight/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class ElvenKnightSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """knight.elven_knight 的技能引用;包含继承的公共技能。""" + __profession__ = 'knight.elven_knight' + + ANCIENTBOAR = SkillRef(name='愤怒冲撞', code='ancientboar', profession=__profession__) + "愤怒冲撞" + + ANCIENTDEER = SkillRef(name='守护神鹿', code='ancientdeer', profession=__profession__) + "守护神鹿" + + ANGEROFNATURE = SkillRef(name='自然之怒', code='angerofnature', profession=__profession__) + "自然之怒" + + CHAINSTRIKE = SkillRef(name='剑盾强袭', code='chainstrike', profession=__profession__) + "剑盾强袭" + + CHARGE = SkillRef(name='天马流星落', code='charge', profession=__profession__) + "天马流星落" + + DEFENSIVEPOSTURE = SkillRef(name='防御姿态', code='defensiveposture', profession=__profession__) + "防御姿态" + + DEMENTIONMOLT = SkillRef(name='骑士守护', code='dementionmolt', profession=__profession__) + "骑士守护" + + DISARMING = SkillRef(name='破武之轮', code='disarming', profession=__profession__) + "破武之轮" + + ELVISHJUMP = SkillRef(name='精灵之跃', code='elvishjump', profession=__profession__) + "精灵之跃" + + FANTASYOFNATURE = SkillRef(name='生命之律·神木擎天', code='fantasyofnature', profession=__profession__) + "生命之律·神木擎天" + + FINISH = SkillRef(name='跳斩', code='finish', profession=__profession__) + "跳斩" + + FORTRESSOFEUDIA = SkillRef(name='荆棘之城', code='fortressofeudia', profession=__profession__) + "荆棘之城" + + GRACEOFLIFE = SkillRef(name='生命的恩宠', code='graceoflife', profession=__profession__) + "生命的恩宠" + + GREATVOLITION = SkillRef(name='伟大的意志', code='greatvolition', profession=__profession__) + "伟大的意志" + + INTERCEPT = SkillRef(name='飞跃截击', code='intercept', profession=__profession__) + "飞跃截击" + + LETHALPUNTO = SkillRef(name='致命突刺', code='lethalpunto', profession=__profession__) + "致命突刺" + + LIONKICK = SkillRef(name='强踢', code='lionkick', profession=__profession__) + "强踢" + + LUNGEREVOLUTION = SkillRef(name='飓风旋枪', code='lungerevolution', profession=__profession__) + "飓风旋枪" + + NATUREBLESSING = SkillRef(name='自然恩泽', code='natureblessing', profession=__profession__) + "自然恩泽" + + NATUREGUARDIAN = SkillRef(name='自然守护', code='natureguardian', profession=__profession__) + "自然守护" + + OVERPOWER = SkillRef(name='破甲冲击', code='overpower', profession=__profession__) + "破甲冲击" + + PENETRATION = SkillRef(name='铁壁推进', code='penetration', profession=__profession__) + "铁壁推进" + + PERFECTGUARD = SkillRef(name='自动防御', code='perfectguard', profession=__profession__) + "自动防御" + + RIDING = SkillRef(name='骑乘召唤', code='riding', profession=__profession__) + "骑乘召唤" + + ROSEARMOR = SkillRef(name='蔷薇护甲', code='rosearmor', profession=__profession__) + "蔷薇护甲" + + SENTENCE = SkillRef(name='审判之盾', code='sentence', profession=__profession__) + "审判之盾" + + SHACKLESOFNATURE = SkillRef(name='自然束缚', code='shacklesofnature', profession=__profession__) + "自然束缚" + + SHIELDCHANGE = SkillRef(name='盾牌转换', code='shieldchange', profession=__profession__) + "盾牌转换" + + SHIELDCHARGE = SkillRef(name='壁垒突袭', code='shieldcharge', profession=__profession__) + "壁垒突袭" + + SHIELDGUARD = SkillRef(name='盾牌格挡', code='shieldguard', profession=__profession__) + "盾牌格挡" + + SHIELDOFCOURAGE = SkillRef(name='信仰鼓舞', code='shieldofcourage', profession=__profession__) + "信仰鼓舞" + + SHIELDRUSH = SkillRef(name='剑盾猛攻', code='shieldrush', profession=__profession__) + "剑盾猛攻" + + SHIELDSTARK = SkillRef(name='盾击', code='shieldstark', profession=__profession__) + "盾击" + + SIGNOFLIFE = SkillRef(name='生命审判', code='signoflife', profession=__profession__) + "生命审判" + + SMASH = SkillRef(name='天陨断空斩', code='smash', profession=__profession__) + "天陨断空斩" + + STRONGBELIEF = SkillRef(name='骑士信念', code='strongbelief', profession=__profession__) + "骑士信念" + + SWORDOFFOREST = SkillRef(name='神木刺击', code='swordofforest', profession=__profession__) + "神木刺击" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + TWILIGHTUNICORN = SkillRef(name='暮光之灵 : 黄昏独角兽', code='twilightunicorn', profession=__profession__) + "暮光之灵 : 黄昏独角兽" + + UPPERSHIELD = SkillRef(name='盾挑', code='uppershield', profession=__profession__) + "盾挑" + + VANGUARDSTRATSH = SkillRef(name='一刀两断', code='vanguardstratsh', profession=__profession__) + "一刀两断" + + WARCRY = SkillRef(name='战吼', code='warcry', profession=__profession__) + "战吼" + + WHEELOFFORTUNE = SkillRef(name='命运之轮', code='wheeloffortune', profession=__profession__) + "命运之轮" diff --git a/backend/core/character/refs/knight/paladin.py b/backend/core/character/refs/knight/paladin.py new file mode 100644 index 00000000..8e25e9c8 --- /dev/null +++ b/backend/core/character/refs/knight/paladin.py @@ -0,0 +1,117 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:knight/paladin/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class PaladinSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """knight.paladin 的技能引用;包含继承的公共技能。""" + __profession__ = 'knight.paladin' + + COMMANDMENT = SkillRef(name='戒律', code='commandment', profession=__profession__) + "戒律" + + CONCILIATION = SkillRef(name='神光之跃', code='conciliation', profession=__profession__) + "神光之跃" + + CONFESION = SkillRef(name='神光闪耀', code='confesion', profession=__profession__) + "神光闪耀" + + DISARMING = SkillRef(name='破武之轮', code='disarming', profession=__profession__) + "破武之轮" + + DISRUPTION = SkillRef(name='烈光', code='disruption', profession=__profession__) + "烈光" + + DIVINESANCTUARY = SkillRef(name='神光庇护', code='divinesanctuary', profession=__profession__) + "神光庇护" + + DIVINESHIELD = SkillRef(name='圣盾', code='divineshield', profession=__profession__) + "圣盾" + + ENGAGEMENT = SkillRef(name='神圣信约', code='engagement', profession=__profession__) + "神圣信约" + + ESTRANGEMENT = SkillRef(name='惩罚之锤', code='estrangement', profession=__profession__) + "惩罚之锤" + + FAITHFUL = SkillRef(name='信仰之念', code='faithful', profession=__profession__) + "信仰之念" + + FINISH = SkillRef(name='跳斩', code='finish', profession=__profession__) + "跳斩" + + FORGIVENESS = SkillRef(name='神光闪影击', code='forgiveness', profession=__profession__) + "神光闪影击" + + GLORYOFTHELIGHT = SkillRef(name='荣耀之光', code='gloryofthelight', profession=__profession__) + "荣耀之光" + + INTEGRATION = SkillRef(name='圣盾裁决', code='integration', profession=__profession__) + "圣盾裁决" + + INTERCEPT = SkillRef(name='飞跃截击', code='intercept', profession=__profession__) + "飞跃截击" + + JUDGEMENTCALL = SkillRef(name='神圣意志 : 大天使降临', code='judgementcall', profession=__profession__) + "神圣意志 : 大天使降临" + + LETHALPUNTO = SkillRef(name='致命突刺', code='lethalpunto', profession=__profession__) + "致命突刺" + + LIONKICK = SkillRef(name='强踢', code='lionkick', profession=__profession__) + "强踢" + + MANDATEOFHEAVEN = SkillRef(name='破晓之光', code='mandateofheaven', profession=__profession__) + "破晓之光" + + OBSTRUCTION = SkillRef(name='神光回旋斩', code='obstruction', profession=__profession__) + "神光回旋斩" + + PERFECTGUARD = SkillRef(name='自动防御', code='perfectguard', profession=__profession__) + "自动防御" + + PRICEOFMISTRUST = SkillRef(name='信仰聚合 : 神光惩戒', code='priceofmistrust', profession=__profession__) + "信仰聚合 : 神光惩戒" + + PURIFYING = SkillRef(name='神光连击', code='purifying', profession=__profession__) + "神光连击" + + RETRIBUTION = SkillRef(name='神光盾击', code='retribution', profession=__profession__) + "神光盾击" + + SERAPHICFALL = SkillRef(name='天使降临', code='seraphicfall', profession=__profession__) + "天使降临" + + SERAPHICFEATHER = SkillRef(name='天使光翼', code='seraphicfeather', profession=__profession__) + "天使光翼" + + SHIELDBREAK = SkillRef(name='圣盾突击', code='shieldbreak', profession=__profession__) + "圣盾突击" + + SHIELDSTARK = SkillRef(name='盾击', code='shieldstark', profession=__profession__) + "盾击" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + THELASTREVELATION = SkillRef(name='启示录 : 末日救赎', code='thelastrevelation', profession=__profession__) + "启示录 : 末日救赎" + + TRANSCENDENCE = SkillRef(name='神光耀世', code='transcendence', profession=__profession__) + "神光耀世" + + UPPERSHIELD = SkillRef(name='盾挑', code='uppershield', profession=__profession__) + "盾挑" + + WEEPINGWAVE = SkillRef(name='神光冲击', code='weepingwave', profession=__profession__) + "神光冲击" + + WHEELOFFORTUNE = SkillRef(name='命运之轮', code='wheeloffortune', profession=__profession__) + "命运之轮" + + WINGOFMETATRON = SkillRef(name='超越之翼', code='wingofmetatron', profession=__profession__) + "超越之翼" + + WRATH = SkillRef(name='神光喷涌', code='wrath', profession=__profession__) + "神光喷涌" diff --git a/backend/core/character/refs/mage_female/__init__.py b/backend/core/character/refs/mage_female/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/mage_female/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/mage_female/battle_mage.py b/backend/core/character/refs/mage_female/battle_mage.py new file mode 100644 index 00000000..ea615cd9 --- /dev/null +++ b/backend/core/character/refs/mage_female/battle_mage.py @@ -0,0 +1,132 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:mage_female/battle_mage/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class BattleMageSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """mage_female.battle_mage 的技能引用;包含继承的公共技能。""" + __profession__ = 'mage_female.battle_mage' + + ARMONIA = SkillRef(name='太古之力', code='armonia', profession=__profession__) + "太古之力" + + AURASHIELD = SkillRef(name='魔法护盾', code='aurashield', profession=__profession__) + "魔法护盾" + + AURASHIELDMASTERY = SkillRef(name='魔法护盾强化', code='aurashieldmastery', profession=__profession__) + "魔法护盾强化" + + AVATAR = SkillRef(name='使徒化身', code='avatar', profession=__profession__) + "使徒化身" + + AVATARDANCE = SkillRef(name='使徒之舞', code='avatardance', profession=__profession__) + "使徒之舞" + + AVATARFINISH = SkillRef(name='一骑当千碎霸', code='avatarfinish', profession=__profession__) + "一骑当千碎霸" + + AVATARPASSIVE = SkillRef(name='使徒封印', code='avatarpassive', profession=__profession__) + "使徒封印" + + BATTLEMAGEWEAPONMASTERY = SkillRef(name='战斗法师武器精通', code='battlemageweaponmastery', profession=__profession__) + "战斗法师武器精通" + + CHASER = SkillRef(name='炫纹', code='chaser', profession=__profession__) + "炫纹" + + CHASERCLUSTER = SkillRef(name='炫纹簇', code='chasercluster', profession=__profession__) + "炫纹簇" + + CHASERSEXPLOSION = SkillRef(name='炫纹强压', code='chasersexplosion', profession=__profession__) + "炫纹强压" + + COMBOINSTINCT = SkillRef(name='连击精通', code='comboinstinct', profession=__profession__) + "连击精通" + + COMBOMASTERY = SkillRef(name='斗神意志', code='combomastery', profession=__profession__) + "斗神意志" + + CONVERSION = SkillRef(name='攻击类型转换', code='conversion', profession=__profession__) + "攻击类型转换" + + DISENCHANT = SkillRef(name='驱散魔法', code='disenchant', profession=__profession__) + "驱散魔法" + + DOUBLESWING = SkillRef(name='双重锤击', code='doubleswing', profession=__profession__) + "双重锤击" + + DRAGONDANCE = SkillRef(name='煌龙乱舞', code='dragondance', profession=__profession__) + "煌龙乱舞" + + DRAGONSPEAR = SkillRef(name='煌龙偃月', code='dragonspear', profession=__profession__) + "煌龙偃月" + + DRAGONSPEARADVENT = SkillRef(name='煌龙天临', code='dragonspearadvent', profession=__profession__) + "煌龙天临" + + ENABLEFINISHATTACK = SkillRef(name='尼巫的战术', code='enablefinishattack', profession=__profession__) + "尼巫的战术" + + EXTICION = SkillRef(name='太古星河·殒灭', code='exticion', profession=__profession__) + "太古星河·殒灭" + + GODDESSOFWAR = SkillRef(name='战斗本能', code='goddessofwar', profession=__profession__) + "战斗本能" + + HANDSTRIKE = SkillRef(name='落花掌', code='handstrike', profession=__profession__) + "落花掌" + + LAYOFPRIMITIVE = SkillRef(name='炫纹之源 : 太古神光', code='layofprimitive', profession=__profession__) + "炫纹之源 : 太古神光" + + MAGICMISSILE = SkillRef(name='魔法星弹', code='magicmissile', profession=__profession__) + "魔法星弹" + + MULTIROLE = SkillRef(name='战灵潜能', code='multirole', profession=__profession__) + "战灵潜能" + + POKETHROW = SkillRef(name='圆舞棍', code='pokethrow', profession=__profession__) + "圆舞棍" + + PRECENCIA = SkillRef(name='太古化身', code='precencia', profession=__profession__) + "太古化身" + + QUASAREXPLOSION = SkillRef(name='星纹陨爆', code='quasarexplosion', profession=__profession__) + "星纹陨爆" + + RANDOMPIERCESTRIKE = SkillRef(name='流星闪影击', code='randompiercestrike', profession=__profession__) + "流星闪影击" + + RETURNTOBM = SkillRef(name='解除变身', code='returntobm', profession=__profession__) + "解除变身" + + STRENGTHHANDSTRIKE = SkillRef(name='强袭流星打', code='strengthhandstrike', profession=__profession__) + "强袭流星打" + + SUPERCHASER = SkillRef(name='超级炫纹', code='superchaser', profession=__profession__) + "超级炫纹" + + SWING = SkillRef(name='碎霸', code='swing', profession=__profession__) + "碎霸" + + SWINGEX = SkillRef(name='闪击碎霸', code='swingex', profession=__profession__) + "闪击碎霸" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + THRUST = SkillRef(name='龙牙', code='thrust', profession=__profession__) + "龙牙" + + TIMERBOMB = SkillRef(name='炫纹爆弹', code='timerbomb', profession=__profession__) + "炫纹爆弹" + + UPPERSWING = SkillRef(name='天击', code='upperswing', profession=__profession__) + "天击" + + WARPONDAMAGE = SkillRef(name='替身草人', code='warpondamage', profession=__profession__) + "替身草人" + + WARPONDAMAGEBM = SkillRef(name='实战型替身草人', code='warpondamagebm', profession=__profession__) + "实战型替身草人" diff --git a/backend/core/character/refs/mage_female/elementalist.py b/backend/core/character/refs/mage_female/elementalist.py new file mode 100644 index 00000000..7b2740c2 --- /dev/null +++ b/backend/core/character/refs/mage_female/elementalist.py @@ -0,0 +1,135 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:mage_female/elementalist/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class ElementalistSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """mage_female.elementalist 的技能引用;包含继承的公共技能。""" + __profession__ = 'mage_female.elementalist' + + ARCTICPISTE = SkillRef(name='极冰盛宴', code='arcticpiste', profession=__profession__) + "极冰盛宴" + + ASSIMILATE = SkillRef(name='元素之源', code='assimilate', profession=__profession__) + "元素之源" + + AURASHIELD = SkillRef(name='魔法护盾', code='aurashield', profession=__profession__) + "魔法护盾" + + CASTSPEEDUP = SkillRef(name='魔法记忆', code='castspeedup', profession=__profession__) + "魔法记忆" + + COSMICCALAMITY = SkillRef(name='宇宙寂灭 : 冰火之歌', code='cosmiccalamity', profession=__profession__) + "宇宙寂灭 : 冰火之歌" + + CRYSTALOFOVERMIND = SkillRef(name='圣灵水晶', code='crystalofovermind', profession=__profession__) + "圣灵水晶" + + DISENCHANT = SkillRef(name='驱散魔法', code='disenchant', profession=__profession__) + "驱散魔法" + + ELEMENTALCHAIN = SkillRef(name='元素点燃', code='elementalchain', profession=__profession__) + "元素点燃" + + ELEMENTALCURTAIN = SkillRef(name='元素之幕', code='elementalcurtain', profession=__profession__) + "元素之幕" + + ELEMENTALPOTENTIAL = SkillRef(name='元素奥义', code='elementalpotential', profession=__profession__) + "元素奥义" + + ELEMENTALQUAKE = SkillRef(name='元素震荡', code='elementalquake', profession=__profession__) + "元素震荡" + + ELEMENTALSHOWER = SkillRef(name='陨星幻灭', code='elementalshower', profession=__profession__) + "陨星幻灭" + + ELEMENTALWEAK = SkillRef(name='魔力增幅', code='elementalweak', profession=__profession__) + "魔力增幅" + + ELEMENTMASTERY = SkillRef(name='属性精通', code='elementmastery', profession=__profession__) + "属性精通" + + FLAMESTRIKE = SkillRef(name='烈焰冲击', code='flamestrike', profession=__profession__) + "烈焰冲击" + + HALLOWEENBUSTER = SkillRef(name='杰克降临', code='halloweenbuster', profession=__profession__) + "杰克降临" + + HANDSTRIKE = SkillRef(name='落花掌', code='handstrike', profession=__profession__) + "落花掌" + + KEEPOUT = SkillRef(name='别过来!', code='keepout', profession=__profession__) + "别过来!" + + LAUNCHBLACKCAT = SkillRef(name='暗影夜猫', code='launchblackcat', profession=__profession__) + "暗影夜猫" + + LAUNCHFLUORESCENT = SkillRef(name='光电鳗', code='launchfluorescent', profession=__profession__) + "光电鳗" + + LAUNCHFROSTHEAD = SkillRef(name='冰霜雪人', code='launchfrosthead', profession=__profession__) + "冰霜雪人" + + LAUNCHJOL = SkillRef(name='杰克爆弹', code='launchjol', profession=__profession__) + "杰克爆弹" + + LAUNCHJOLONJUMP = SkillRef(name='空中施放 : 杰克爆弹', code='launchjolonjump', profession=__profession__) + "空中施放 : 杰克爆弹" + + MAGICALTEMPOUP = SkillRef(name='魔法秀', code='magicaltempoup', profession=__profession__) + "魔法秀" + + MAGICMISSILE = SkillRef(name='魔法星弹', code='magicmissile', profession=__profession__) + "魔法星弹" + + MIGHTYRUNE = SkillRef(name='圣灵符文', code='mightyrune', profession=__profession__) + "圣灵符文" + + MOVEONCAST = SkillRef(name='移动施法', code='moveoncast', profession=__profession__) + "移动施法" + + NIGHTHOLLOW = SkillRef(name='湮灭黑洞', code='nighthollow', profession=__profession__) + "湮灭黑洞" + + SESTOELEMENTO = SkillRef(name='第六元素', code='sestoelemento', profession=__profession__) + "第六元素" + + SUMMONHODOR = SkillRef(name='契约召唤 : 赫德尔', code='summonhodor', profession=__profession__) + "契约召唤 : 赫德尔" + + SUNBURST = SkillRef(name='雷旋', code='sunburst', profession=__profession__) + "雷旋" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + THEGATE = SkillRef(name='元素之门', code='thegate', profession=__profession__) + "元素之门" + + THRUST = SkillRef(name='龙牙', code='thrust', profession=__profession__) + "龙牙" + + THUNDERCALLING = SkillRef(name='天雷', code='thundercalling', profession=__profession__) + "天雷" + + THUNDERRAGE = SkillRef(name='光与暗的交响', code='thunderrage', profession=__profession__) + "光与暗的交响" + + THUNDERSTRIKEEX = SkillRef(name='天雷冲击', code='thunderstrikeex', profession=__profession__) + "天雷冲击" + + UPPERSWING = SkillRef(name='天击', code='upperswing', profession=__profession__) + "天击" + + VOID = SkillRef(name='虚无之球', code='void', profession=__profession__) + "虚无之球" + + WALLOFICE = SkillRef(name='冰墙', code='wallofice', profession=__profession__) + "冰墙" + + WARPONDAMAGE = SkillRef(name='替身草人', code='warpondamage', profession=__profession__) + "替身草人" + + WHIP = SkillRef(name='鞭挞', code='whip', profession=__profession__) + "鞭挞" diff --git a/backend/core/character/refs/mage_female/enchantress.py b/backend/core/character/refs/mage_female/enchantress.py new file mode 100644 index 00000000..1e2ce7c0 --- /dev/null +++ b/backend/core/character/refs/mage_female/enchantress.py @@ -0,0 +1,156 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:mage_female/enchantress/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs + + +class EnchantressSkillRef(CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs): + """mage_female.enchantress 的技能引用;包含继承的公共技能。""" + __profession__ = 'mage_female.enchantress' + + AFFECTIONSTING = SkillRef(name='爱之刺痛', code='affectionsting', profession=__profession__) + "爱之刺痛" + + AURASHIELD = SkillRef(name='魔法护盾', code='aurashield', profession=__profession__) + "魔法护盾" + + BLACKTHORNTREE = SkillRef(name='林中小屋', code='blackthorntree', profession=__profession__) + "林中小屋" + + CURSEOFTERRORBEAR = SkillRef(name='咆哮吧! 疯疯熊', code='curseofterrorbear', profession=__profession__) + "咆哮吧! 疯疯熊" + + DARKMAGICBROOM = SkillRef(name='黑魔法扫把', code='darkmagicbroom', profession=__profession__) + "黑魔法扫把" + + DESTINYPUPPET = SkillRef(name='疯狂召唤', code='destinypuppet', profession=__profession__) + "疯狂召唤" + + DISENCHANT = SkillRef(name='驱散魔法', code='disenchant', profession=__profession__) + "驱散魔法" + + DISPLAYLOVE = SkillRef(name='挚爱囚笼', code='displaylove', profession=__profession__) + "挚爱囚笼" + + DOLLBASKET = SkillRef(name='人偶篮子', code='dollbasket', profession=__profession__) + "人偶篮子" + + ETERNALPOSSESSION = SkillRef(name='永恒的占据', code='eternalpossession', profession=__profession__) + "永恒的占据" + + FAVORITISM = SkillRef(name='小魔女的偏爱', code='favoritism', profession=__profession__) + "小魔女的偏爱" + + FIRSTAIDOFLOVE = SkillRef(name='爱之急救', code='firstaidoflove', profession=__profession__) + "爱之急救" + + FORBIDDENCURSE = SkillRef(name='禁术吟咏', code='forbiddencurse', profession=__profession__) + "禁术吟咏" + + HANDSTRIKE = SkillRef(name='落花掌', code='handstrike', profession=__profession__) + "落花掌" + + HARVESTING = SkillRef(name='蔷薇藤鞭', code='harvesting', profession=__profession__) + "蔷薇藤鞭" + + HEX = SkillRef(name='人偶戏法', code='hex', profession=__profession__) + "人偶戏法" + + HOTLOVE = SkillRef(name='火热的爱意', code='hotlove', profession=__profession__) + "火热的爱意" + + JUMPINGBEARPRESS = SkillRef(name='疯疯熊坠击', code='jumpingbearpress', profession=__profession__) + "疯疯熊坠击" + + KEEPOUT = SkillRef(name='别过来!', code='keepout', profession=__profession__) + "别过来!" + + LASTONEACT = SkillRef(name='终幕! 人偶剧场', code='lastoneact', profession=__profession__) + "终幕! 人偶剧场" + + LAUNCHBLACKCAT = SkillRef(name='暗影夜猫', code='launchblackcat', profession=__profession__) + "暗影夜猫" + + LAUNCHFLUORESCENT = SkillRef(name='光电鳗', code='launchfluorescent', profession=__profession__) + "光电鳗" + + LAUNCHFROSTHEAD = SkillRef(name='冰霜雪人', code='launchfrosthead', profession=__profession__) + "冰霜雪人" + + LAUNCHJOL = SkillRef(name='杰克爆弹', code='launchjol', profession=__profession__) + "杰克爆弹" + + LAUNCHJOLONJUMP = SkillRef(name='空中施放 : 杰克爆弹', code='launchjolonjump', profession=__profession__) + "空中施放 : 杰克爆弹" + + MADDYGUARD = SkillRef(name='疯熊守护', code='maddyguard', profession=__profession__) + "疯熊守护" + + MADMADSLASH = SkillRef(name='疯狂乱抓', code='madmadslash', profession=__profession__) + "疯狂乱抓" + + MADSTRAIGHT = SkillRef(name='疯熊火箭拳', code='madstraight', profession=__profession__) + "疯熊火箭拳" + + MADTHEBIG = SkillRef(name='变大吧! 疯疯熊', code='madthebig', profession=__profession__) + "变大吧! 疯疯熊" + + MAGICMISSILE = SkillRef(name='魔法星弹', code='magicmissile', profession=__profession__) + "魔法星弹" + + MARIONETTE = SkillRef(name='开幕! 人偶剧场', code='marionette', profession=__profession__) + "开幕! 人偶剧场" + + PAINFULGARDEN = SkillRef(name='苦痛庭院', code='painfulgarden', profession=__profession__) + "苦痛庭院" + + PUPPETEER = SkillRef(name='人偶操纵者', code='puppeteer', profession=__profession__) + "人偶操纵者" + + REJECTTHORN = SkillRef(name='御敌之刺', code='rejectthorn', profession=__profession__) + "御敌之刺" + + ROSEINDARK = SkillRef(name='冥月绽放', code='roseindark', profession=__profession__) + "冥月绽放" + + ROSEVINE = SkillRef(name='玫瑰藤蔓', code='rosevine', profession=__profession__) + "玫瑰藤蔓" + + SEWING = SkillRef(name='细心缝补', code='sewing', profession=__profession__) + "细心缝补" + + SINISTERSMILINGEYES = SkillRef(name='不祥的微笑', code='sinistersmilingeyes', profession=__profession__) + "不祥的微笑" + + SMALLDEVIL = SkillRef(name='少女的爱', code='smalldevil', profession=__profession__) + "少女的爱" + + SUMMONHODOR = SkillRef(name='契约召唤 : 赫德尔', code='summonhodor', profession=__profession__) + "契约召唤 : 赫德尔" + + TEMPORARYREALIZATION5 = SkillRef(name='超卓之心', code='temporaryrealization5', profession=__profession__) + "超卓之心" + + TERRIBLEROAR = SkillRef(name='哇咔咔!', code='terribleroar', profession=__profession__) + "哇咔咔!" + + THORNVINEHOLD = SkillRef(name='蔷薇囚狱', code='thornvinehold', profession=__profession__) + "蔷薇囚狱" + + THRUST = SkillRef(name='龙牙', code='thrust', profession=__profession__) + "龙牙" + + UPPERSWING = SkillRef(name='天击', code='upperswing', profession=__profession__) + "天击" + + WARPONDAMAGE = SkillRef(name='替身草人', code='warpondamage', profession=__profession__) + "替身草人" + + WHIP = SkillRef(name='鞭挞', code='whip', profession=__profession__) + "鞭挞" + + WICKEDCURIOSITY = SkillRef(name='邪恶的好奇心', code='wickedcuriosity', profession=__profession__) + "邪恶的好奇心" + + WOODSOFPUPPET = SkillRef(name='欢迎光临人偶之森', code='woodsofpuppet', profession=__profession__) + "欢迎光临人偶之森" diff --git a/backend/core/character/refs/mage_female/summoner.py b/backend/core/character/refs/mage_female/summoner.py new file mode 100644 index 00000000..4b57821d --- /dev/null +++ b/backend/core/character/refs/mage_female/summoner.py @@ -0,0 +1,180 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:mage_female/summoner/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class SummonerSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """mage_female.summoner 的技能引用;包含继承的公共技能。""" + __profession__ = 'mage_female.summoner' + + AURASHIELD = SkillRef(name='魔法护盾', code='aurashield', profession=__profession__) + "魔法护盾" + + BLACKLUNATIC = SkillRef(name='狂化黑月', code='blacklunatic', profession=__profession__) + "狂化黑月" + + BUGFALL = SkillRef(name='咒令 : 逆月之蚀', code='bugfall', profession=__profession__) + "咒令 : 逆月之蚀" + + CASILLASFINISHATTACK = SkillRef(name='必杀剑·千鬼杀', code='casillasfinishattack', profession=__profession__) + "必杀剑·千鬼杀" + + COMMUNION = SkillRef(name='心灵感应', code='communion', profession=__profession__) + "心灵感应" + + DELLALIONOFPREDATION = SkillRef(name='魔月·德拉里昂', code='dellalionofpredation', profession=__profession__) + "魔月·德拉里昂" + + DISENCHANT = SkillRef(name='驱散魔法', code='disenchant', profession=__profession__) + "驱散魔法" + + DOMINIONPOWERUP = SkillRef(name='绝对支配', code='dominionpowerup', profession=__profession__) + "绝对支配" + + ECLIPSEHIVE = SkillRef(name='蚀月附灵', code='eclipsehive', profession=__profession__) + "蚀月附灵" + + FOLLOWME = SkillRef(name='召唤兽跟随', code='followme', profession=__profession__) + "召唤兽跟随" + + HANDSTRIKE = SkillRef(name='落花掌', code='handstrike', profession=__profession__) + "落花掌" + + HIGHESTECHEVERRA = SkillRef(name='至高精灵王', code='highestecheverra', profession=__profession__) + "至高精灵王" + + KEEPOUT = SkillRef(name='别过来!', code='keepout', profession=__profession__) + "别过来!" + + LAUNCHBLACKCAT = SkillRef(name='暗影夜猫', code='launchblackcat', profession=__profession__) + "暗影夜猫" + + LAUNCHFLUORESCENT = SkillRef(name='光电鳗', code='launchfluorescent', profession=__profession__) + "光电鳗" + + LAUNCHFROSTHEAD = SkillRef(name='冰霜雪人', code='launchfrosthead', profession=__profession__) + "冰霜雪人" + + LAUNCHJOL = SkillRef(name='杰克爆弹', code='launchjol', profession=__profession__) + "杰克爆弹" + + LAUNCHJOLONJUMP = SkillRef(name='空中施放 : 杰克爆弹', code='launchjolonjump', profession=__profession__) + "空中施放 : 杰克爆弹" + + MAGICALTEMPOUP = SkillRef(name='魔法秀', code='magicaltempoup', profession=__profession__) + "魔法秀" + + MAGICMISSILE = SkillRef(name='魔法星弹', code='magicmissile', profession=__profession__) + "魔法星弹" + + MASSTELEPORT = SkillRef(name='召唤兽传送', code='massteleport', profession=__profession__) + "召唤兽传送" + + MOONSHADOW = SkillRef(name='传说召唤 : 月蚀之影', code='moonshadow', profession=__profession__) + "传说召唤 : 月蚀之影" + + POSTICUSLUNA = SkillRef(name='逆月', code='posticusluna', profession=__profession__) + "逆月" + + REPEATEDSMASHOFRAGE = SkillRef(name='咒令 : 愤怒咆哮', code='repeatedsmashofrage', profession=__profession__) + "咒令 : 愤怒咆哮" + + RINGOFDOMINATION = SkillRef(name='支配之环', code='ringofdomination', profession=__profession__) + "支配之环" + + SACRIFICESPIRIT = SkillRef(name='精灵献祭', code='sacrificespirit', profession=__profession__) + "精灵献祭" + + SUMMONAUXO = SkillRef(name='契约召唤 : 袄索', code='summonauxo', profession=__profession__) + "契约召唤 : 袄索" + + SUMMONBABYDRAGON = SkillRef(name='契约召唤 : 弗利特', code='summonbabydragon', profession=__profession__) + "契约召唤 : 弗利特" + + SUMMONCASILLAS = SkillRef(name='契约召唤 : 征服者卡西利亚斯', code='summoncasillas', profession=__profession__) + "契约召唤 : 征服者卡西利亚斯" + + SUMMONECHEVERRA = SkillRef(name='精灵召唤 : 伊伽贝拉', code='summonecheverra', profession=__profession__) + "精灵召唤 : 伊伽贝拉" + + SUMMONHEILROM = SkillRef(name='精灵召唤 : 融合精灵海伊伦', code='summonheilrom', profession=__profession__) + "精灵召唤 : 融合精灵海伊伦" + + SUMMONHODOR = SkillRef(name='契约召唤 : 赫德尔', code='summonhodor', profession=__profession__) + "契约召唤 : 赫德尔" + + SUMMONKRUTA = SkillRef(name='契约召唤 : 牛头王库鲁塔', code='summonkruta', profession=__profession__) + "契约召唤 : 牛头王库鲁塔" + + SUMMONLUIS = SkillRef(name='契约召唤 : 路易丝', code='summonluis', profession=__profession__) + "契约召唤 : 路易丝" + + SUMMONMONSTERAURA = SkillRef(name='召唤兽强化', code='summonmonsteraura', profession=__profession__) + "召唤兽强化" + + SUMMONMONSTERRECKLESS = SkillRef(name='召唤兽狂化', code='summonmonsterreckless', profession=__profession__) + "召唤兽狂化" + + SUMMONMONSTERWAIT = SkillRef(name='伺机而动', code='summonmonsterwait', profession=__profession__) + "伺机而动" + + SUMMONRAMOS = SkillRef(name='传说召唤 : 逆月者拉莫斯', code='summonramos', profession=__profession__) + "传说召唤 : 逆月者拉莫斯" + + SUMMONSANDOR = SkillRef(name='契约召唤 : 桑德尔', code='summonsandor', profession=__profession__) + "契约召唤 : 桑德尔" + + SUMMONSPIRIT = SkillRef(name='召唤下级精灵', code='summonspirit', profession=__profession__) + "召唤下级精灵" + + SUMMONSPIRITDARK = SkillRef(name='精灵召唤 : 瑟冥特克', code='summonspiritdark', profession=__profession__) + "精灵召唤 : 瑟冥特克" + + SUMMONSPIRITDARKHIGHER = SkillRef(name='精灵召唤 : 亡魂默克尔', code='summonspiritdarkhigher', profession=__profession__) + "精灵召唤 : 亡魂默克尔" + + SUMMONSPIRITFIRE = SkillRef(name='精灵召唤 : 亚德炎', code='summonspiritfire', profession=__profession__) + "精灵召唤 : 亚德炎" + + SUMMONSPIRITFIREHIGHER = SkillRef(name='精灵召唤 : 火焰赫瑞克', code='summonspiritfirehigher', profession=__profession__) + "精灵召唤 : 火焰赫瑞克" + + SUMMONSPIRITLIGHT = SkillRef(name='精灵召唤 : 雷沃斯', code='summonspiritlight', profession=__profession__) + "精灵召唤 : 雷沃斯" + + SUMMONSPIRITLIGHTHIGHER = SkillRef(name='精灵召唤 : 极光格雷林', code='summonspiritlighthigher', profession=__profession__) + "精灵召唤 : 极光格雷林" + + SUMMONSPIRITWATER = SkillRef(name='精灵召唤 : 冰奈斯', code='summonspiritwater', profession=__profession__) + "精灵召唤 : 冰奈斯" + + SUMMONSPIRITWATERHIGHER = SkillRef(name='精灵召唤 : 冰影阿奎利斯', code='summonspiritwaterhigher', profession=__profession__) + "精灵召唤 : 冰影阿奎利斯" + + TARGETIT = SkillRef(name='魔力印记', code='targetit', profession=__profession__) + "魔力印记" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + THROWSTICKYTRAP = SkillRef(name='束缚印记', code='throwstickytrap', profession=__profession__) + "束缚印记" + + THRUST = SkillRef(name='龙牙', code='thrust', profession=__profession__) + "龙牙" + + UNSUMMON = SkillRef(name='召唤解除', code='unsummon', profession=__profession__) + "召唤解除" + + UPGRADESUMMONSKILL = SkillRef(name='灵魂支配', code='upgradesummonskill', profession=__profession__) + "灵魂支配" + + UPPERSWING = SkillRef(name='天击', code='upperswing', profession=__profession__) + "天击" + + WARPONDAMAGE = SkillRef(name='替身草人', code='warpondamage', profession=__profession__) + "替身草人" + + WHIP = SkillRef(name='鞭挞', code='whip', profession=__profession__) + "鞭挞" diff --git a/backend/core/character/refs/mage_female/witch.py b/backend/core/character/refs/mage_female/witch.py new file mode 100644 index 00000000..0e73ca60 --- /dev/null +++ b/backend/core/character/refs/mage_female/witch.py @@ -0,0 +1,156 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:mage_female/witch/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class WitchSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """mage_female.witch 的技能引用;包含继承的公共技能。""" + __profession__ = 'mage_female.witch' + + ACIDCLOUD = SkillRef(name='魔道酸雨云', code='acidcloud', profession=__profession__) + "魔道酸雨云" + + ANTIGRAVITYSTARTER = SkillRef(name='反重力装置', code='antigravitystarter', profession=__profession__) + "反重力装置" + + ARSMAGNA = SkillRef(name='糖果大作战 : 精怪乐园', code='arsmagna', profession=__profession__) + "糖果大作战 : 精怪乐园" + + AURASHIELD = SkillRef(name='魔法护盾', code='aurashield', profession=__profession__) + "魔法护盾" + + BITTERSCANDYBAR = SkillRef(name='苦涩棒棒糖', code='bitterscandybar', profession=__profession__) + "苦涩棒棒糖" + + BLACKMANTLE = SkillRef(name='暗影斗篷', code='blackmantle', profession=__profession__) + "暗影斗篷" + + BROOMPOWDER = SkillRef(name='魔幻粉末', code='broompowder', profession=__profession__) + "魔幻粉末" + + BROOMSPIN = SkillRef(name='旋转扫把', code='broomspin', profession=__profession__) + "旋转扫把" + + CLEARFLAPPER = SkillRef(name='苍蝇拍 : 魔法禁锢', code='clearflapper', profession=__profession__) + "苍蝇拍 : 魔法禁锢" + + DISENCHANT = SkillRef(name='驱散魔法', code='disenchant', profession=__profession__) + "驱散魔法" + + ELECTRICRABBIT = SkillRef(name='光电兔', code='electricrabbit', profession=__profession__) + "光电兔" + + EMERGENCYESCAPE = SkillRef(name='引爆试验', code='emergencyescape', profession=__profession__) + "引爆试验" + + ENHANCEDMAGICMISSILE = SkillRef(name='改良魔法星弹', code='enhancedmagicmissile', profession=__profession__) + "改良魔法星弹" + + EQUIPBROOM = SkillRef(name='扫把掌握', code='equipbroom', profession=__profession__) + "扫把掌握" + + FLUORECOLLIDER = SkillRef(name='电鳗碰撞机', code='fluorecollider', profession=__profession__) + "电鳗碰撞机" + + FRIENDLYFAMILIAR = SkillRef(name='亲和法米利尔', code='friendlyfamiliar', profession=__profession__) + "亲和法米利尔" + + FUSIONCRAFT = SkillRef(name='技艺融合', code='fusioncraft', profession=__profession__) + "技艺融合" + + HANDSTRIKE = SkillRef(name='落花掌', code='handstrike', profession=__profession__) + "落花掌" + + HEATINGFURNACE = SkillRef(name='暴炎加热炉', code='heatingfurnace', profession=__profession__) + "暴炎加热炉" + + HOMUNCULUS = SkillRef(name='魔道学助手', code='homunculus', profession=__profession__) + "魔道学助手" + + IMPROVEDSHURURU = SkillRef(name='改良舒露露', code='improvedshururu', profession=__profession__) + "改良舒露露" + + JACKFROSTICEWATER = SkillRef(name='雪人刨冰', code='jackfrosticewater', profession=__profession__) + "雪人刨冰" + + JACKOHALLOWEEN = SkillRef(name='糖果大作战 : 捣蛋杰克', code='jackohalloween', profession=__profession__) + "糖果大作战 : 捣蛋杰克" + + KEEPOUT = SkillRef(name='别过来!', code='keepout', profession=__profession__) + "别过来!" + + LAPISPHILOSOPHORUM = SkillRef(name='贤者之石', code='lapisphilosophorum', profession=__profession__) + "贤者之石" + + LAUNCHBLACKCAT = SkillRef(name='暗影夜猫', code='launchblackcat', profession=__profession__) + "暗影夜猫" + + LAUNCHFLUORESCENT = SkillRef(name='光电鳗', code='launchfluorescent', profession=__profession__) + "光电鳗" + + LAUNCHFROSTHEAD = SkillRef(name='冰霜雪人', code='launchfrosthead', profession=__profession__) + "冰霜雪人" + + LAUNCHJOL = SkillRef(name='杰克爆弹', code='launchjol', profession=__profession__) + "杰克爆弹" + + LAUNCHJOLONJUMP = SkillRef(name='空中施放 : 杰克爆弹', code='launchjolonjump', profession=__profession__) + "空中施放 : 杰克爆弹" + + LAVAPOTION = SkillRef(name='熔岩药瓶', code='lavapotion', profession=__profession__) + "熔岩药瓶" + + LOLLIPOPCRUSH = SkillRef(name='超级棒棒糖', code='lollipopcrush', profession=__profession__) + "超级棒棒糖" + + MAGICALTEMPOUP = SkillRef(name='魔法秀', code='magicaltempoup', profession=__profession__) + "魔法秀" + + MAGICMISSILE = SkillRef(name='魔法星弹', code='magicmissile', profession=__profession__) + "魔法星弹" + + MEGADRILL = SkillRef(name='冰霜钻孔车', code='megadrill', profession=__profession__) + "冰霜钻孔车" + + MPREGENRATEUP = SkillRef(name='远古魔法书', code='mpregenrateup', profession=__profession__) + "远古魔法书" + + PROVOCATIONDOLL = SkillRef(name='挑衅人偶 : 舒露露', code='provocationdoll', profession=__profession__) + "挑衅人偶 : 舒露露" + + REDCANDY = SkillRef(name='粉红糖果', code='redcandy', profession=__profession__) + "粉红糖果" + + SUCCESSPREMONITION = SkillRef(name='成功预感', code='successpremonition', profession=__profession__) + "成功预感" + + SUMMONHODOR = SkillRef(name='契约召唤 : 赫德尔', code='summonhodor', profession=__profession__) + "契约召唤 : 赫德尔" + + SWEETCANDYBAR = SkillRef(name='幸运棒棒糖', code='sweetcandybar', profession=__profession__) + "幸运棒棒糖" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + THRUST = SkillRef(name='龙牙', code='thrust', profession=__profession__) + "龙牙" + + TRANSFORMFLAPPER = SkillRef(name='变异苍蝇拍', code='transformflapper', profession=__profession__) + "变异苍蝇拍" + + TRANSFORMFLAPPEREX = SkillRef(name='超级苍蝇拍', code='transformflapperex', profession=__profession__) + "超级苍蝇拍" + + UPPERSWING = SkillRef(name='天击', code='upperswing', profession=__profession__) + "天击" + + UROBOROS = SkillRef(name='乌洛波洛斯之环', code='uroboros', profession=__profession__) + "乌洛波洛斯之环" + + WARPONDAMAGE = SkillRef(name='替身草人', code='warpondamage', profession=__profession__) + "替身草人" + + WHIP = SkillRef(name='鞭挞', code='whip', profession=__profession__) + "鞭挞" diff --git a/backend/core/character/refs/mage_male/__init__.py b/backend/core/character/refs/mage_male/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/mage_male/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/mage_male/blood_mage.py b/backend/core/character/refs/mage_male/blood_mage.py new file mode 100644 index 00000000..4b2d032d --- /dev/null +++ b/backend/core/character/refs/mage_male/blood_mage.py @@ -0,0 +1,117 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:mage_male/blood_mage/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class BloodMageSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """mage_male.blood_mage 的技能引用;包含继承的公共技能。""" + __profession__ = 'mage_male.blood_mage' + + ABANDON = SkillRef(name='赤狱之力', code='abandon', profession=__profession__) + "赤狱之力" + + ABYSS = SkillRef(name='黑暗之眼', code='abyss', profession=__profession__) + "黑暗之眼" + + BLOOD = SkillRef(name='鲜血融合', code='blood', profession=__profession__) + "鲜血融合" + + BLOODBURN = SkillRef(name='赤红燃烧', code='bloodburn', profession=__profession__) + "赤红燃烧" + + BLOODBYSS = SkillRef(name='猩红之眼', code='bloodbyss', profession=__profession__) + "猩红之眼" + + BLOODHONE = SkillRef(name='血之共鸣', code='bloodhone', profession=__profession__) + "血之共鸣" + + BLOODSTINGER = SkillRef(name='血翼蔽空', code='bloodstinger', profession=__profession__) + "血翼蔽空" + + BLOODSTREAM = SkillRef(name='血界彼岸', code='bloodstream', profession=__profession__) + "血界彼岸" + + BLOODWING = SkillRef(name='血翼突击', code='bloodwing', profession=__profession__) + "血翼突击" + + CORRUPTION = SkillRef(name='隐行之噬', code='corruption', profession=__profession__) + "隐行之噬" + + CREEPING = SkillRef(name='赤影步', code='creeping', profession=__profession__) + "赤影步" + + DEADHANDS = SkillRef(name='鲜血之誓', code='deadhands', profession=__profession__) + "鲜血之誓" + + DIEHARD = SkillRef(name='不死之身', code='diehard', profession=__profession__) + "不死之身" + + EXTREMITYPERISH = SkillRef(name='血域帷幕·陨灭', code='extremityperish', profession=__profession__) + "血域帷幕·陨灭" + + FANG = SkillRef(name='狱血之牙', code='fang', profession=__profession__) + "狱血之牙" + + FATALITY = SkillRef(name='死亡之握', code='fatality', profession=__profession__) + "死亡之握" + + FIREPILLAR = SkillRef(name='旋火盾', code='firepillar', profession=__profession__) + "旋火盾" + + HELLBERUS = SkillRef(name='狱血之犬', code='hellberus', profession=__profession__) + "狱血之犬" + + HOLONGLIGHT = SkillRef(name='幽冥火', code='holonglight', profession=__profession__) + "幽冥火" + + ICESWORD = SkillRef(name='冰魄剑', code='icesword', profession=__profession__) + "冰魄剑" + + LILIAC = SkillRef(name='血蝠之袭', code='liliac', profession=__profession__) + "血蝠之袭" + + LILROI = SkillRef(name='血蝠之舞', code='lilroi', profession=__profession__) + "血蝠之舞" + + MARAUDER = SkillRef(name='血翼绽放', code='marauder', profession=__profession__) + "血翼绽放" + + MULTISHOT = SkillRef(name='魔球连射', code='multishot', profession=__profession__) + "魔球连射" + + OFFERING = SkillRef(name='鲜血长枪', code='offering', profession=__profession__) + "鲜血长枪" + + PHANTOMBALE = SkillRef(name='地狱冥犬', code='phantombale', profession=__profession__) + "地狱冥犬" + + PUSHOUT = SkillRef(name='擒拿掌', code='pushout', profession=__profession__) + "擒拿掌" + + RUMBLEDOG = SkillRef(name='魔仆召唤 : 狱犬', code='rumbledog', profession=__profession__) + "魔仆召唤 : 狱犬" + + SHIKAREE = SkillRef(name='猩红狩猎', code='shikaree', profession=__profession__) + "猩红狩猎" + + SOULSTEEL = SkillRef(name='噬魂囚笼', code='soulsteel', profession=__profession__) + "噬魂囚笼" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + TEPES = SkillRef(name='伯爵之歌', code='tepes', profession=__profession__) + "伯爵之歌" + + TORMENT = SkillRef(name='绯红之狱', code='torment', profession=__profession__) + "绯红之狱" + + TRUEBLOOD = SkillRef(name='鲜血之殇', code='trueblood', profession=__profession__) + "鲜血之殇" + + WATERCANNON = SkillRef(name='魔法冰球', code='watercannon', profession=__profession__) + "魔法冰球" + + WINDSTRIKE = SkillRef(name='魔法旋风', code='windstrike', profession=__profession__) + "魔法旋风" diff --git a/backend/core/character/refs/mage_male/dimension_walker.py b/backend/core/character/refs/mage_male/dimension_walker.py new file mode 100644 index 00000000..a4dcdd2f --- /dev/null +++ b/backend/core/character/refs/mage_male/dimension_walker.py @@ -0,0 +1,135 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:mage_male/dimension_walker/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs + + +class DimensionWalkerSkillRef(CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs): + """mage_male.dimension_walker 的技能引用;包含继承的公共技能。""" + __profession__ = 'mage_male.dimension_walker' + + ABYSS = SkillRef(name='黑暗之眼', code='abyss', profession=__profession__) + "黑暗之眼" + + ACCIDENT = SkillRef(name='次元 : 坠落', code='accident', profession=__profession__) + "次元 : 坠落" + + AKASHIC = SkillRef(name='古史记忆', code='akashic', profession=__profession__) + "古史记忆" + + ATG = SkillRef(name='乖离 : 沉沦', code='atg', profession=__profession__) + "乖离 : 沉沦" + + CHEEKIT = SkillRef(name='乖离 : 禁锢', code='cheekit', profession=__profession__) + "乖离 : 禁锢" + + CORRIDO = SkillRef(name='次元 : 时空磁场', code='corrido', profession=__profession__) + "次元 : 时空磁场" + + CROWLINGMYST = SkillRef(name='乖离 : 迷雾', code='crowlingmyst', profession=__profession__) + "乖离 : 迷雾" + + DELUSION = SkillRef(name='时空壁障', code='delusion', profession=__profession__) + "时空壁障" + + DFORCE = SkillRef(name='次元 : 奇点', code='dforce', profession=__profession__) + "次元 : 奇点" + + DIEHARD = SkillRef(name='不死之身', code='diehard', profession=__profession__) + "不死之身" + + DIMENSIONBOMB = SkillRef(name='次元 : 粒子风暴', code='dimensionbomb', profession=__profession__) + "次元 : 粒子风暴" + + DIMENSIONHOLLOW = SkillRef(name='乖离 : 虚无', code='dimensionhollow', profession=__profession__) + "乖离 : 虚无" + + DIMENSIONLAY = SkillRef(name='次元 : 离子束', code='dimensionlay', profession=__profession__) + "次元 : 离子束" + + DIMENSIONLEAP = SkillRef(name='次元 : 跃迁', code='dimensionleap', profession=__profession__) + "次元 : 跃迁" + + DISTORTIONACT = SkillRef(name='次元扭曲装置', code='distortionact', profession=__profession__) + "次元扭曲装置" + + EVENTHORIZEN = SkillRef(name='次元边界', code='eventhorizen', profession=__profession__) + "次元边界" + + FATE = SkillRef(name='虚空之力', code='fate', profession=__profession__) + "虚空之力" + + FIREPILLAR = SkillRef(name='旋火盾', code='firepillar', profession=__profession__) + "旋火盾" + + FLAMEOFDELUSION = SkillRef(name='虚妄之火', code='flameofdelusion', profession=__profession__) + "虚妄之火" + + FORBIDDENPARTY = SkillRef(name='禁断之盛宴', code='forbiddenparty', profession=__profession__) + "禁断之盛宴" + + HARLEQUIN = SkillRef(name='乖离 : 魅魔之舞', code='harlequin', profession=__profession__) + "乖离 : 魅魔之舞" + + HOLONGLIGHT = SkillRef(name='幽冥火', code='holonglight', profession=__profession__) + "幽冥火" + + HORROR = SkillRef(name='乖离 : 扭曲之恐惧', code='horror', profession=__profession__) + "乖离 : 扭曲之恐惧" + + HOUNDS = SkillRef(name='乖离 : 边缘之兽', code='hounds', profession=__profession__) + "乖离 : 边缘之兽" + + ICESWORD = SkillRef(name='冰魄剑', code='icesword', profession=__profession__) + "冰魄剑" + + KALEDOSCOPE = SkillRef(name='次元 : 万花镜', code='kaledoscope', profession=__profession__) + "次元 : 万花镜" + + MULTISHOT = SkillRef(name='魔球连射', code='multishot', profession=__profession__) + "魔球连射" + + MYSOPHOBIA = SkillRef(name='次元之乖离扫把精通', code='mysophobia', profession=__profession__) + "次元之乖离扫把精通" + + OUTERGOD = SkillRef(name='未明·次元崩坏', code='outergod', profession=__profession__) + "未明·次元崩坏" + + OVERSENSE = SkillRef(name='超然感知', code='oversense', profession=__profession__) + "超然感知" + + PARADIGMDITO = SkillRef(name='次元 : 思维聚爆', code='paradigmdito', profession=__profession__) + "次元 : 思维聚爆" + + POSITRON = SkillRef(name='次元 : 粒子波', code='positron', profession=__profession__) + "次元 : 粒子波" + + PUSHOUT = SkillRef(name='擒拿掌', code='pushout', profession=__profession__) + "擒拿掌" + + SILHOUETTE = SkillRef(name='次元 : 虚影', code='silhouette', profession=__profession__) + "次元 : 虚影" + + STH = SkillRef(name='混沌源能石', code='sth', profession=__profession__) + "混沌源能石" + + SUMMONNYARLY = SkillRef(name='乖离 : 禁忌之奈雅丽', code='summonnyarly', profession=__profession__) + "乖离 : 禁忌之奈雅丽" + + SWARM = SkillRef(name='乖离 : 异界蜂群', code='swarm', profession=__profession__) + "乖离 : 异界蜂群" + + TEATIME = SkillRef(name='奈雅丽的茶歇时间', code='teatime', profession=__profession__) + "奈雅丽的茶歇时间" + + TELEPORT = SkillRef(name='瞬移', code='teleport', profession=__profession__) + "瞬移" + + TEMPORARYREALIZATION5 = SkillRef(name='超卓之心', code='temporaryrealization5', profession=__profession__) + "超卓之心" + + WATERCANNON = SkillRef(name='魔法冰球', code='watercannon', profession=__profession__) + "魔法冰球" + + WINDSTRIKE = SkillRef(name='魔法旋风', code='windstrike', profession=__profession__) + "魔法旋风" diff --git a/backend/core/character/refs/mage_male/elemental_bomber.py b/backend/core/character/refs/mage_male/elemental_bomber.py new file mode 100644 index 00000000..650397d2 --- /dev/null +++ b/backend/core/character/refs/mage_male/elemental_bomber.py @@ -0,0 +1,126 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:mage_male/elemental_bomber/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class ElementalBomberSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """mage_male.elemental_bomber 的技能引用;包含继承的公共技能。""" + __profession__ = 'mage_male.elemental_bomber' + + ABYSS = SkillRef(name='黑暗之眼', code='abyss', profession=__profession__) + "黑暗之眼" + + ARMAGEDDONSTRIKE = SkillRef(name='末日湮灭', code='armageddonstrike', profession=__profession__) + "末日湮灭" + + CHAINLIGHTNING = SkillRef(name='雷光链', code='chainlightning', profession=__profession__) + "雷光链" + + CONCENTRATE = SkillRef(name='元素浓缩球', code='concentrate', profession=__profession__) + "元素浓缩球" + + CONVERGENCECANNON = SkillRef(name='聚能魔炮', code='convergencecannon', profession=__profession__) + "聚能魔炮" + + CONVERGENCEREACT = SkillRef(name='聚魔轰击', code='convergencereact', profession=__profession__) + "聚魔轰击" + + CRYSTALATTACK = SkillRef(name='冰晶坠', code='crystalattack', profession=__profession__) + "冰晶坠" + + DARKCHANGE = SkillRef(name='暗域扩张', code='darkchange', profession=__profession__) + "暗域扩张" + + DARKEYE = SkillRef(name='黑瞳', code='darkeye', profession=__profession__) + "黑瞳" + + DARKNESSMANTLE = SkillRef(name='黑暗禁域', code='darknessmantle', profession=__profession__) + "黑暗禁域" + + DIEHARD = SkillRef(name='不死之身', code='diehard', profession=__profession__) + "不死之身" + + ELEMENTALBOMBING = SkillRef(name='元素禁断', code='elementalbombing', profession=__profession__) + "元素禁断" + + ELEMENTALBUSTER = SkillRef(name='幻魔四重奏', code='elementalbuster', profession=__profession__) + "幻魔四重奏" + + ELEMENTALCHAIN = SkillRef(name='元素爆发', code='elementalchain', profession=__profession__) + "元素爆发" + + ELEMENTALCHANGE = SkillRef(name='属性变换', code='elementalchange', profession=__profession__) + "属性变换" + + ELEMENTALFIELD = SkillRef(name='元素禁域', code='elementalfield', profession=__profession__) + "元素禁域" + + ELEMENTALFORCE = SkillRef(name='元素之力', code='elementalforce', profession=__profession__) + "元素之力" + + ELEMENTALFUSION = SkillRef(name='元素融合', code='elementalfusion', profession=__profession__) + "元素融合" + + ELEMENTALRAIN = SkillRef(name='元素轰炸', code='elementalrain', profession=__profession__) + "元素轰炸" + + ELEMENTALSTRIKEEX = SkillRef(name='元素幻灭', code='elementalstrikeex', profession=__profession__) + "元素幻灭" + + ELEMENTUNDERSTAND = SkillRef(name='元素循环', code='elementunderstand', profession=__profession__) + "元素循环" + + FIREPILLAR = SkillRef(name='旋火盾', code='firepillar', profession=__profession__) + "旋火盾" + + FIREROAD = SkillRef(name='地炎', code='fireroad', profession=__profession__) + "地炎" + + FLAMECIRCLE = SkillRef(name='旋炎破', code='flamecircle', profession=__profession__) + "旋炎破" + + HOLONGLIGHT = SkillRef(name='幽冥火', code='holonglight', profession=__profession__) + "幽冥火" + + ICEAREA = SkillRef(name='冰晶之浴', code='icearea', profession=__profession__) + "冰晶之浴" + + ICESWORD = SkillRef(name='冰魄剑', code='icesword', profession=__profession__) + "冰魄剑" + + LIGHTNINGWALL = SkillRef(name='雷光屏障', code='lightningwall', profession=__profession__) + "雷光屏障" + + MAGICCANNON = SkillRef(name='元素炮', code='magiccannon', profession=__profession__) + "元素炮" + + MAGICSHIELD = SkillRef(name='元素环绕', code='magicshield', profession=__profession__) + "元素环绕" + + MANABURST = SkillRef(name='魔力燃烧', code='manaburst', profession=__profession__) + "魔力燃烧" + + MICROUNIVERSE = SkillRef(name='启源·微观宇宙', code='microuniverse', profession=__profession__) + "启源·微观宇宙" + + MULTISHOT = SkillRef(name='魔球连射', code='multishot', profession=__profession__) + "魔球连射" + + PUSHOUT = SkillRef(name='擒拿掌', code='pushout', profession=__profession__) + "擒拿掌" + + TELEPORT = SkillRef(name='瞬移', code='teleport', profession=__profession__) + "瞬移" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + WATERCANNON = SkillRef(name='魔法冰球', code='watercannon', profession=__profession__) + "魔法冰球" + + WICKEDODDEYE = SkillRef(name='异瞳', code='wickedoddeye', profession=__profession__) + "异瞳" + + WINDSTRIKE = SkillRef(name='魔法旋风', code='windstrike', profession=__profession__) + "魔法旋风" diff --git a/backend/core/character/refs/mage_male/glacial_master.py b/backend/core/character/refs/mage_male/glacial_master.py new file mode 100644 index 00000000..8a95afa0 --- /dev/null +++ b/backend/core/character/refs/mage_male/glacial_master.py @@ -0,0 +1,120 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:mage_male/glacial_master/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class GlacialMasterSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """mage_male.glacial_master 的技能引用;包含继承的公共技能。""" + __profession__ = 'mage_male.glacial_master' + + ABYSS = SkillRef(name='黑暗之眼', code='abyss', profession=__profession__) + "黑暗之眼" + + BLIZZARDSTORM = SkillRef(name='冰雪风暴', code='blizzardstorm', profession=__profession__) + "冰雪风暴" + + BROKENARROW = SkillRef(name='冰魄之弓', code='brokenarrow', profession=__profession__) + "冰魄之弓" + + CRYSTALBLADE = SkillRef(name='水晶剑', code='crystalblade', profession=__profession__) + "水晶剑" + + DIEHARD = SkillRef(name='不死之身', code='diehard', profession=__profession__) + "不死之身" + + EXPRESSION = SkillRef(name='冰之领悟', code='expression', profession=__profession__) + "冰之领悟" + + FALLENBLOSSOMS = SkillRef(name='寒冰连枪', code='fallenblossoms', profession=__profession__) + "寒冰连枪" + + FIREPILLAR = SkillRef(name='旋火盾', code='firepillar', profession=__profession__) + "旋火盾" + + FROSTHUNT = SkillRef(name='冰凝之魂', code='frosthunt', profession=__profession__) + "冰凝之魂" + + FROZENWEAPONMASTERY = SkillRef(name='冰武精通', code='frozenweaponmastery', profession=__profession__) + "冰武精通" + + GLACIESEDGE = SkillRef(name='极冰猎魔斩', code='glaciesedge', profession=__profession__) + "极冰猎魔斩" + + HOLONGLIGHT = SkillRef(name='幽冥火', code='holonglight', profession=__profession__) + "幽冥火" + + ICEBIGHAMMER = SkillRef(name='冰魄锤击', code='icebighammer', profession=__profession__) + "冰魄锤击" + + ICECHAKRAM = SkillRef(name='千旋冰轮破', code='icechakram', profession=__profession__) + "千旋冰轮破" + + ICECRAFT = SkillRef(name='冰之技艺', code='icecraft', profession=__profession__) + "冰之技艺" + + ICECRASH = SkillRef(name='旋冰穿刺', code='icecrash', profession=__profession__) + "旋冰穿刺" + + ICEELEMENTALATTACK = SkillRef(name='冰之印', code='iceelementalattack', profession=__profession__) + "冰之印" + + ICEFIELD = SkillRef(name='千里冰封', code='icefield', profession=__profession__) + "千里冰封" + + ICEMAN = SkillRef(name='极冰绽放', code='iceman', profession=__profession__) + "极冰绽放" + + ICEORBEX = SkillRef(name='冰凌破', code='iceorbex', profession=__profession__) + "冰凌破" + + ICEROAD = SkillRef(name='冰霜之径', code='iceroad', profession=__profession__) + "冰霜之径" + + ICESWORD = SkillRef(name='冰魄剑', code='icesword', profession=__profession__) + "冰魄剑" + + JUDEKATHEETERNAL = SkillRef(name='永罪冰狱', code='judekatheeternal', profession=__profession__) + "永罪冰狱" + + MULTISHOT = SkillRef(name='魔球连射', code='multishot', profession=__profession__) + "魔球连射" + + NASTROND = SkillRef(name='永劫 : 纳斯特隆德', code='nastrond', profession=__profession__) + "永劫 : 纳斯特隆德" + + OVERFREEZEEXTENSION = SkillRef(name='极冰领域', code='overfreezeextension', profession=__profession__) + "极冰领域" + + PIECEOFICE = SkillRef(name='破冰飞刃', code='pieceofice', profession=__profession__) + "破冰飞刃" + + PINPOINTRUSH = SkillRef(name='冰舞乱击', code='pinpointrush', profession=__profession__) + "冰舞乱击" + + PUSHOUT = SkillRef(name='擒拿掌', code='pushout', profession=__profession__) + "擒拿掌" + + RESONANCE = SkillRef(name='寒冰之境', code='resonance', profession=__profession__) + "寒冰之境" + + SHARDMAGNUM = SkillRef(name='碎冰破', code='shardmagnum', profession=__profession__) + "碎冰破" + + TELEPORT = SkillRef(name='瞬移', code='teleport', profession=__profession__) + "瞬移" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + TUNDRASOUL = SkillRef(name='冰封奥义', code='tundrasoul', profession=__profession__) + "冰封奥义" + + TURNWINDMILL = SkillRef(name='冰魄旋枪', code='turnwindmill', profession=__profession__) + "冰魄旋枪" + + WATERCANNON = SkillRef(name='魔法冰球', code='watercannon', profession=__profession__) + "魔法冰球" + + WINDSTRIKE = SkillRef(name='魔法旋风', code='windstrike', profession=__profession__) + "魔法旋风" diff --git a/backend/core/character/refs/mage_male/swift_master.py b/backend/core/character/refs/mage_male/swift_master.py new file mode 100644 index 00000000..541cbbcd --- /dev/null +++ b/backend/core/character/refs/mage_male/swift_master.py @@ -0,0 +1,117 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:mage_male/swift_master/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class SwiftMasterSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """mage_male.swift_master 的技能引用;包含继承的公共技能。""" + __profession__ = 'mage_male.swift_master' + + ABYSS = SkillRef(name='黑暗之眼', code='abyss', profession=__profession__) + "黑暗之眼" + + ARACAN = SkillRef(name='风之极·永坠', code='aracan', profession=__profession__) + "风之极·永坠" + + DIEHARD = SkillRef(name='不死之身', code='diehard', profession=__profession__) + "不死之身" + + EYEOFSTORM = SkillRef(name='风暴之眼', code='eyeofstorm', profession=__profession__) + "风暴之眼" + + FINALTEMPEST = SkillRef(name='无限风域', code='finaltempest', profession=__profession__) + "无限风域" + + FIREPILLAR = SkillRef(name='旋火盾', code='firepillar', profession=__profession__) + "旋火盾" + + GALEHIGHWAY = SkillRef(name='疾风瞬影闪', code='galehighway', profession=__profession__) + "疾风瞬影闪" + + GENESISVENTUS = SkillRef(name='初始之风', code='genesisventus', profession=__profession__) + "初始之风" + + GODWIND = SkillRef(name='万象风龙阵', code='godwind', profession=__profession__) + "万象风龙阵" + + HARBINGER = SkillRef(name='风之意志', code='harbinger', profession=__profession__) + "风之意志" + + HOLONGLIGHT = SkillRef(name='幽冥火', code='holonglight', profession=__profession__) + "幽冥火" + + HURRICANE = SkillRef(name='双翼风刃', code='hurricane', profession=__profession__) + "双翼风刃" + + ICESWORD = SkillRef(name='冰魄剑', code='icesword', profession=__profession__) + "冰魄剑" + + MULTISHOT = SkillRef(name='魔球连射', code='multishot', profession=__profession__) + "魔球连射" + + POWEROFWINDGOD = SkillRef(name='御风之力', code='powerofwindgod', profession=__profession__) + "御风之力" + + PUSHOUT = SkillRef(name='擒拿掌', code='pushout', profession=__profession__) + "擒拿掌" + + RAGINGWIND = SkillRef(name='真空旋风破', code='ragingwind', profession=__profession__) + "真空旋风破" + + SECENDWIND = SkillRef(name='风神诀', code='secendwind', profession=__profession__) + "风神诀" + + SONICMOVE = SkillRef(name='狂风冲刺', code='sonicmove', profession=__profession__) + "狂风冲刺" + + SPIRALPRESS = SkillRef(name='游龙惊风破', code='spiralpress', profession=__profession__) + "游龙惊风破" + + STICKMASTERY = SkillRef(name='疾风之棍棒精通', code='stickmastery', profession=__profession__) + "疾风之棍棒精通" + + STORMQUAKE = SkillRef(name='风卷残云', code='stormquake', profession=__profession__) + "风卷残云" + + STORMSTRIKES = SkillRef(name='风暴之拳', code='stormstrikes', profession=__profession__) + "风暴之拳" + + TELEPORT = SkillRef(name='瞬移', code='teleport', profession=__profession__) + "瞬移" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + TORNADO = SkillRef(name='游离之风', code='tornado', profession=__profession__) + "游离之风" + + TURBULENTRUMBLE = SkillRef(name='怒风狂涌', code='turbulentrumble', profession=__profession__) + "怒风狂涌" + + VACUUM = SkillRef(name='朔风牵引', code='vacuum', profession=__profession__) + "朔风牵引" + + VIOLENTSTORM = SkillRef(name='九霄风雷', code='violentstorm', profession=__profession__) + "九霄风雷" + + WATERCANNON = SkillRef(name='魔法冰球', code='watercannon', profession=__profession__) + "魔法冰球" + + WINDBLADES = SkillRef(name='刃风', code='windblades', profession=__profession__) + "刃风" + + WINDBLASTER = SkillRef(name='风鸣冲击', code='windblaster', profession=__profession__) + "风鸣冲击" + + WINDCUT = SkillRef(name='回风斩', code='windcut', profession=__profession__) + "回风斩" + + WINDINESS = SkillRef(name='流风诀', code='windiness', profession=__profession__) + "流风诀" + + WINDMASTER = SkillRef(name='疾风掌控', code='windmaster', profession=__profession__) + "疾风掌控" + + WINDSTRIKE = SkillRef(name='魔法旋风', code='windstrike', profession=__profession__) + "魔法旋风" diff --git a/backend/core/character/refs/priest_female/__init__.py b/backend/core/character/refs/priest_female/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/priest_female/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/priest_female/crusader_female.py b/backend/core/character/refs/priest_female/crusader_female.py new file mode 100644 index 00000000..13ddd01c --- /dev/null +++ b/backend/core/character/refs/priest_female/crusader_female.py @@ -0,0 +1,138 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:priest_female/crusader_female/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class CrusaderFemaleSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """priest_female.crusader_female 的技能引用;包含继承的公共技能。""" + __profession__ = 'priest_female.crusader_female' + + ARIA = SkillRef(name='启示 : 颂歌', code='aria', profession=__profession__) + "启示 : 颂歌" + + ARIAOFCOURAGE = SkillRef(name='勇气颂歌', code='ariaofcourage', profession=__profession__) + "勇气颂歌" + + ARIAOFREGENERATION = SkillRef(name='新生颂歌', code='ariaofregeneration', profession=__profession__) + "新生颂歌" + + BLESSOFANGEL = SkillRef(name='圣洁之翼', code='blessofangel', profession=__profession__) + "圣洁之翼" + + BLESSOFCOURAGE = SkillRef(name='勇气祝福', code='blessofcourage', profession=__profession__) + "勇气祝福" + + BLESSOFPROTECTION = SkillRef(name='守护祝福', code='blessofprotection', profession=__profession__) + "守护祝福" + + BLESSOFRAPHAEL = SkillRef(name='大天使的庇护', code='blessofraphael', profession=__profession__) + "大天使的庇护" + + BRIONAC = SkillRef(name='救赎彼岸 : 惩戒圣枪', code='brionac', profession=__profession__) + "救赎彼岸 : 惩戒圣枪" + + CONVERSION = SkillRef(name='攻击类型转换', code='conversion', profession=__profession__) + "攻击类型转换" + + CROSSMASTERY = SkillRef(name='光杖精通', code='crossmastery', profession=__profession__) + "光杖精通" + + CRUSADE = SkillRef(name='启示 : 惩戒', code='crusade', profession=__profession__) + "启示 : 惩戒" + + CRUXOFSHAPIEL = SkillRef(name='圣言十字', code='cruxofshapiel', profession=__profession__) + "圣言十字" + + CRUXOFVICTORIA = SkillRef(name='圣光天启', code='cruxofvictoria', profession=__profession__) + "圣光天启" + + CURE = SkillRef(name='净化', code='cure', profession=__profession__) + "净化" + + CUTINDASH = SkillRef(name='冲刺斩', code='cutindash', profession=__profession__) + "冲刺斩" + + EDIFICATION = SkillRef(name='神之教诲', code='edification', profession=__profession__) + "神之教诲" + + FLAGELLANTS = SkillRef(name='苦修', code='flagellants', profession=__profession__) + "苦修" + + GRACEOFDEVINE = SkillRef(name='圣光灌注', code='graceofdevine', profession=__profession__) + "圣光灌注" + + GRANDCROSSCRASH = SkillRef(name='神光十字', code='grandcrosscrash', profession=__profession__) + "神光十字" + + HEAVYSIN = SkillRef(name='罪业加身', code='heavysin', profession=__profession__) + "罪业加身" + + HOLYCIRCLET = SkillRef(name='神圣锁环', code='holycirclet', profession=__profession__) + "神圣锁环" + + HOLYFLASH = SkillRef(name='圣洁之光', code='holyflash', profession=__profession__) + "圣洁之光" + + HOLYLIGHT = SkillRef(name='圣光守护', code='holylight', profession=__profession__) + "圣光守护" + + HOLYSMASH = SkillRef(name='审判锤击', code='holysmash', profession=__profession__) + "审判锤击" + + LAUSDEANGELUS = SkillRef(name='祈愿·天使赞歌', code='lausdeangelus', profession=__profession__) + "祈愿·天使赞歌" + + LIGHTOFHAPTISM = SkillRef(name='洗礼之光', code='lightofhaptism', profession=__profession__) + "洗礼之光" + + LUCULENTUISANGEL = SkillRef(name='圣天使之光', code='luculentuisangel', profession=__profession__) + "圣天使之光" + + MIRACLECHINE = SkillRef(name='圣光普照', code='miraclechine', profession=__profession__) + "圣光普照" + + NECKUPSCYTHE = SkillRef(name='钩颈斩', code='neckupscythe', profession=__profession__) + "钩颈斩" + + PRAYEROFHEAL = SkillRef(name='治愈祈祷', code='prayerofheal', profession=__profession__) + "治愈祈祷" + + PROTECTIONOFURIEL = SkillRef(name='圣佑之阵', code='protectionofuriel', profession=__profession__) + "圣佑之阵" + + REPENTENCESMASH = SkillRef(name='忏悔重击', code='repentencesmash', profession=__profession__) + "忏悔重击" + + REVIVE = SkillRef(name='复苏之光', code='revive', profession=__profession__) + "复苏之光" + + RISINGSLASH = SkillRef(name='升空斩', code='risingslash', profession=__profession__) + "升空斩" + + SAINTFLASH = SkillRef(name='圣光烬盾', code='saintflash', profession=__profession__) + "圣光烬盾" + + SHINECROSS = SkillRef(name='神光惩戒', code='shinecross', profession=__profession__) + "神光惩戒" + + SPEAROFVICTORY = SkillRef(name='胜利之矛', code='spearofvictory', profession=__profession__) + "胜利之矛" + + TALISMANOFLIGHTNING = SkillRef(name='唤雷符', code='talismanoflightning', profession=__profession__) + "唤雷符" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + THUNDEROFCLEANS = SkillRef(name='忏悔之雷', code='thunderofcleans', profession=__profession__) + "忏悔之雷" + + VIOLENTASSAULT = SkillRef(name='空中锤击', code='violentassault', profession=__profession__) + "空中锤击" + + WEAPONGUARD = SkillRef(name='武器格挡', code='weaponguard', profession=__profession__) + "武器格挡" + + ZEALOFFAITH = SkillRef(name='虔诚信念', code='zealoffaith', profession=__profession__) + "虔诚信念" diff --git a/backend/core/character/refs/priest_female/infighter_female.py b/backend/core/character/refs/priest_female/infighter_female.py new file mode 100644 index 00000000..e26ebcbb --- /dev/null +++ b/backend/core/character/refs/priest_female/infighter_female.py @@ -0,0 +1,117 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:priest_female/infighter_female/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs + + +class InfighterFemaleSkillRef(CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs): + """priest_female.infighter_female 的技能引用;包含继承的公共技能。""" + __profession__ = 'priest_female.infighter_female' + + ACCELDRIVE = SkillRef(name='圣光三重破', code='acceldrive', profession=__profession__) + "圣光三重破" + + ARDEREVEHEMENS = SkillRef(name='炽拳 : 以暴制暴', code='arderevehemens', profession=__profession__) + "炽拳 : 以暴制暴" + + ATDIVINECRUSH = SkillRef(name='圣拳锤击', code='atdivinecrush', profession=__profession__) + "圣拳锤击" + + ATGORGEOUSCOMBINATION = SkillRef(name='圣拳连击', code='atgorgeouscombination', profession=__profession__) + "圣拳连击" + + ATHEAVENLYCOMBINATION = SkillRef(name='神圣组合拳', code='atheavenlycombination', profession=__profession__) + "神圣组合拳" + + ATHURRICANEROLL = SkillRef(name='极速飓风拳', code='athurricaneroll', profession=__profession__) + "极速飓风拳" + + ATSECONDUPPER = SkillRef(name='勾拳追击', code='atsecondupper', profession=__profession__) + "勾拳追击" + + BLOWSHOT = SkillRef(name='旋风冲拳', code='blowshot', profession=__profession__) + "旋风冲拳" + + BODYBLOW = SkillRef(name='腹部重击', code='bodyblow', profession=__profession__) + "腹部重击" + + BODYSPIRITBECOMEONE = SkillRef(name='神体合一', code='bodyspiritbecomeone', profession=__profession__) + "神体合一" + + BRUTALCOMBINATION = SkillRef(name='怒气贯地击', code='brutalcombination', profession=__profession__) + "怒气贯地击" + + CURE = SkillRef(name='净化', code='cure', profession=__profession__) + "净化" + + DUCKINGSTEP = SkillRef(name='闪避步', code='duckingstep', profession=__profession__) + "闪避步" + + FAKETWIST = SkillRef(name='幻影直拳', code='faketwist', profession=__profession__) + "幻影直拳" + + FATALIMPACT = SkillRef(name='致命冲拳', code='fatalimpact', profession=__profession__) + "致命冲拳" + + GIGANTICCANNON = SkillRef(name='巨力炮拳', code='giganticcannon', profession=__profession__) + "巨力炮拳" + + GRABBLOW = SkillRef(name='抓取重击', code='grabblow', profession=__profession__) + "抓取重击" + + HOLLOWBACK = SkillRef(name='瞬闪袭拳', code='hollowback', profession=__profession__) + "瞬闪袭拳" + + HOLYFISTTRAINING = SkillRef(name='圣拳修炼', code='holyfisttraining', profession=__profession__) + "圣拳修炼" + + IMPERIUMRAGE = SkillRef(name='泯灭之怒', code='imperiumrage', profession=__profession__) + "泯灭之怒" + + INCOMPLETECOMBUSTION = SkillRef(name='斗志沸腾', code='incompletecombustion', profession=__profession__) + "斗志沸腾" + + MASSPISTOL = SkillRef(name='蓄劲轰拳', code='masspistol', profession=__profession__) + "蓄劲轰拳" + + MYWAY = SkillRef(name='破妄归真', code='myway', profession=__profession__) + "破妄归真" + + ONETWO = SkillRef(name='双刺拳', code='onetwo', profession=__profession__) + "双刺拳" + + PRAYEROFHEAL = SkillRef(name='治愈祈祷', code='prayerofheal', profession=__profession__) + "治愈祈祷" + + PUGNUSVOLUNTATIS = SkillRef(name='意志之拳 : 与神同行', code='pugnusvoluntatis', profession=__profession__) + "意志之拳 : 与神同行" + + SCREWSTRAIGHT = SkillRef(name='螺旋直拳', code='screwstraight', profession=__profession__) + "螺旋直拳" + + SIDEKNUCKLE = SkillRef(name='侧击拳', code='sideknuckle', profession=__profession__) + "侧击拳" + + STORMFIST = SkillRef(name='风暴猛击', code='stormfist', profession=__profession__) + "风暴猛击" + + TEMPORARYREALIZATION5 = SkillRef(name='超卓之心', code='temporaryrealization5', profession=__profession__) + "超卓之心" + + TENSION = SkillRef(name='战意', code='tension', profession=__profession__) + "战意" + + UPPERCUT = SkillRef(name='上勾拳', code='uppercut', profession=__profession__) + "上勾拳" + + VEILEDINSTINCT = SkillRef(name='潜藏暴戾', code='veiledinstinct', profession=__profession__) + "潜藏暴戾" + + VIOLENTCRUSH = SkillRef(name='拳震八方', code='violentcrush', profession=__profession__) + "拳震八方" + + WEAVING = SkillRef(name='摆步', code='weaving', profession=__profession__) + "摆步" + + WILLOFFIST = SkillRef(name='意志之拳', code='willoffist', profession=__profession__) + "意志之拳" diff --git a/backend/core/character/refs/priest_female/inquistor.py b/backend/core/character/refs/priest_female/inquistor.py new file mode 100644 index 00000000..04871f17 --- /dev/null +++ b/backend/core/character/refs/priest_female/inquistor.py @@ -0,0 +1,123 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:priest_female/inquistor/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class InquistorSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """priest_female.inquistor 的技能引用;包含继承的公共技能。""" + __profession__ = 'priest_female.inquistor' + + BATTLEAXEMASTERY = SkillRef(name='战斧精通', code='battleaxemastery', profession=__profession__) + "战斧精通" + + BLOOMINGFLAME = SkillRef(name='神焰疾降', code='bloomingflame', profession=__profession__) + "神焰疾降" + + BRANDOFHERESY = SkillRef(name='异徒烙印', code='brandofheresy', profession=__profession__) + "异徒烙印" + + BURNATTHESTAKE = SkillRef(name='火之净化', code='burnatthestake', profession=__profession__) + "火之净化" + + CROSSOFPUNISHMENT = SkillRef(name='惩戒十字', code='crossofpunishment', profession=__profession__) + "惩戒十字" + + CURE = SkillRef(name='净化', code='cure', profession=__profession__) + "净化" + + CUTINDASH = SkillRef(name='冲刺斩', code='cutindash', profession=__profession__) + "冲刺斩" + + DECOLLATION = SkillRef(name='行刑', code='decollation', profession=__profession__) + "行刑" + + DISMEMBER = SkillRef(name='裁决轮回斩', code='dismember', profession=__profession__) + "裁决轮回斩" + + DREADFULFLAME = SkillRef(name='无间业火 : 罪灭神威', code='dreadfulflame', profession=__profession__) + "无间业火 : 罪灭神威" + + ERADICATECROSS = SkillRef(name='补赎逆十字', code='eradicatecross', profession=__profession__) + "补赎逆十字" + + ESSENCEOFPHLEGE = SkillRef(name='火焰精华', code='essenceofphlege', profession=__profession__) + "火焰精华" + + FANATICISM = SkillRef(name='狂热信仰', code='fanaticism', profession=__profession__) + "狂热信仰" + + FIRECONFESSION = SkillRef(name='狂炎告解', code='fireconfession', profession=__profession__) + "狂炎告解" + + FLAMEOFBAPTISM = SkillRef(name='神焰洗礼', code='flameofbaptism', profession=__profession__) + "神焰洗礼" + + HEAVYSIN = SkillRef(name='罪业加身', code='heavysin', profession=__profession__) + "罪业加身" + + HOLYFLAME = SkillRef(name='神焰', code='holyflame', profession=__profession__) + "神焰" + + HOLYSMASH = SkillRef(name='审判锤击', code='holysmash', profession=__profession__) + "审判锤击" + + INFERNO = SkillRef(name='炎狱祭坛 : 炮烙', code='inferno', profession=__profession__) + "炎狱祭坛 : 炮烙" + + JUDGMENTBLOW = SkillRef(name='审判重击', code='judgmentblow', profession=__profession__) + "审判重击" + + MALLEUSMALEFICARUM = SkillRef(name='定罪法则', code='malleusmaleficarum', profession=__profession__) + "定罪法则" + + NECKUPSCYTHE = SkillRef(name='钩颈斩', code='neckupscythe', profession=__profession__) + "钩颈斩" + + PATROLBOMB = SkillRef(name='净化火焰瓶', code='patrolbomb', profession=__profession__) + "净化火焰瓶" + + POURESSENCE = SkillRef(name='神焰恩泽', code='pouressence', profession=__profession__) + "神焰恩泽" + + PRAYEROFHEAL = SkillRef(name='治愈祈祷', code='prayerofheal', profession=__profession__) + "治愈祈祷" + + PUNISHMENTBLOW = SkillRef(name='裁决之击', code='punishmentblow', profession=__profession__) + "裁决之击" + + PURIFICATION = SkillRef(name='净化之焰', code='purification', profession=__profession__) + "净化之焰" + + REMOVALTREASON = SkillRef(name='逆炎灭罪', code='removaltreason', profession=__profession__) + "逆炎灭罪" + + RISINGSLASH = SkillRef(name='升空斩', code='risingslash', profession=__profession__) + "升空斩" + + SUMMARYTIRAL = SkillRef(name='神焰斩', code='summarytiral', profession=__profession__) + "神焰斩" + + TALISMANOFLIGHTNING = SkillRef(name='唤雷符', code='talismanoflightning', profession=__profession__) + "唤雷符" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + VIOLENTASSAULT = SkillRef(name='空中锤击', code='violentassault', profession=__profession__) + "空中锤击" + + VIRTUOUSFURY = SkillRef(name='神焰怒火', code='virtuousfury', profession=__profession__) + "神焰怒火" + + VORTEXOFHELLFIRE = SkillRef(name='神焰漩涡', code='vortexofhellfire', profession=__profession__) + "神焰漩涡" + + WEAPONGUARD = SkillRef(name='武器格挡', code='weaponguard', profession=__profession__) + "武器格挡" + + WHEELOFPUNISHMENT = SkillRef(name='车轮刑', code='wheelofpunishment', profession=__profession__) + "车轮刑" + + WILLOFINQUISITOR = SkillRef(name='审判者的裁决', code='willofinquisitor', profession=__profession__) + "审判者的裁决" diff --git a/backend/core/character/refs/priest_female/mistress.py b/backend/core/character/refs/priest_female/mistress.py new file mode 100644 index 00000000..333900da --- /dev/null +++ b/backend/core/character/refs/priest_female/mistress.py @@ -0,0 +1,117 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:priest_female/mistress/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class MistressSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """priest_female.mistress 的技能引用;包含继承的公共技能。""" + __profession__ = 'priest_female.mistress' + + BODYPRESSEDSIN = SkillRef(name='罪业诱惑', code='bodypressedsin', profession=__profession__) + "罪业诱惑" + + CARDINALEXECUTION = SkillRef(name='至高之刑', code='cardinalexecution', profession=__profession__) + "至高之刑" + + CURE = SkillRef(name='净化', code='cure', profession=__profession__) + "净化" + + CUTINDASH = SkillRef(name='冲刺斩', code='cutindash', profession=__profession__) + "冲刺斩" + + DEPRAVITYSEVENSINS = SkillRef(name='原罪释放·净化', code='depravitysevensins', profession=__profession__) + "原罪释放·净化" + + DUALSLASH = SkillRef(name='双重切割', code='dualslash', profession=__profession__) + "双重切割" + + ENVIOUSKISS = SkillRef(name='嫉妒之吻', code='enviouskiss', profession=__profession__) + "嫉妒之吻" + + FIRSTPRANA = SkillRef(name='智慧起源 : 原罪结晶', code='firstprana', profession=__profession__) + "智慧起源 : 原罪结晶" + + FLOWEROFPURIFICATION = SkillRef(name='净化之花', code='flowerofpurification', profession=__profession__) + "净化之花" + + GLUTTONYVOMIT = SkillRef(name='暴食之噬', code='gluttonyvomit', profession=__profession__) + "暴食之噬" + + GREEDTHELURKER = SkillRef(name='贪婪之刺', code='greedthelurker', profession=__profession__) + "贪婪之刺" + + GUILLOTINE = SkillRef(name='镰勾旋击', code='guillotine', profession=__profession__) + "镰勾旋击" + + HANDAWAKENTOSIN = SkillRef(name='诱魔之手', code='handawakentosin', profession=__profession__) + "诱魔之手" + + HEAVYSIN = SkillRef(name='罪业加身', code='heavysin', profession=__profession__) + "罪业加身" + + HOLYSMASH = SkillRef(name='审判锤击', code='holysmash', profession=__profession__) + "审判锤击" + + LASTGENESIS = SkillRef(name='失乐园', code='lastgenesis', profession=__profession__) + "失乐园" + + LUSTHAND = SkillRef(name='欲望之手', code='lusthand', profession=__profession__) + "欲望之手" + + NECKUPSCYTHE = SkillRef(name='钩颈斩', code='neckupscythe', profession=__profession__) + "钩颈斩" + + ORIGINALSIN = SkillRef(name='原罪之初', code='originalsin', profession=__profession__) + "原罪之初" + + PRAYEROFHEAL = SkillRef(name='治愈祈祷', code='prayerofheal', profession=__profession__) + "治愈祈祷" + + PRIDEACCEL = SkillRef(name='傲慢之堕', code='prideaccel', profession=__profession__) + "傲慢之堕" + + RISINGSLASH = SkillRef(name='升空斩', code='risingslash', profession=__profession__) + "升空斩" + + ROLLINGRUSH = SkillRef(name='粉碎回旋击', code='rollingrush', profession=__profession__) + "粉碎回旋击" + + SCUDTHEWRATH = SkillRef(name='愤怒之袭', code='scudthewrath', profession=__profession__) + "愤怒之袭" + + SCYTHEMASTERY = SkillRef(name='负罪者镰刀精通', code='scythemastery', profession=__profession__) + "负罪者镰刀精通" + + SCYTHEMSSACRE = SkillRef(name='终结战镰', code='scythemssacre', profession=__profession__) + "终结战镰" + + SECONDSOUL = SkillRef(name='灵魂烙印 : 原罪冲击', code='secondsoul', profession=__profession__) + "灵魂烙印 : 原罪冲击" + + SINSAYER = SkillRef(name='罪业宣告', code='sinsayer', profession=__profession__) + "罪业宣告" + + SLOTHBODY = SkillRef(name='怠惰之息', code='slothbody', profession=__profession__) + "怠惰之息" + + TALISMANOFLIGHTNING = SkillRef(name='唤雷符', code='talismanoflightning', profession=__profession__) + "唤雷符" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + THESEVENDEADLYSINS = SkillRef(name='七宗罪', code='thesevendeadlysins', profession=__profession__) + "七宗罪" + + THIRDRIB = SkillRef(name='肋骨重塑 : 原罪战矛', code='thirdrib', profession=__profession__) + "肋骨重塑 : 原罪战矛" + + VIOLENTASSAULT = SkillRef(name='空中锤击', code='violentassault', profession=__profession__) + "空中锤击" + + WEAPONGUARD = SkillRef(name='武器格挡', code='weaponguard', profession=__profession__) + "武器格挡" + + WINGSOFREST = SkillRef(name='原罪之翼·永息', code='wingsofrest', profession=__profession__) + "原罪之翼·永息" diff --git a/backend/core/character/refs/priest_female/sorceress.py b/backend/core/character/refs/priest_female/sorceress.py new file mode 100644 index 00000000..2e0fcc3d --- /dev/null +++ b/backend/core/character/refs/priest_female/sorceress.py @@ -0,0 +1,111 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:priest_female/sorceress/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class SorceressSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """priest_female.sorceress 的技能引用;包含继承的公共技能。""" + __profession__ = 'priest_female.sorceress' + + BIGROSARY = SkillRef(name='天坠阴阳玉', code='bigrosary', profession=__profession__) + "天坠阴阳玉" + + CINTAMANI = SkillRef(name='神龙如意珠', code='cintamani', profession=__profession__) + "神龙如意珠" + + CONTRACTSPACEBYMAGIC = SkillRef(name='缩地成寸', code='contractspacebymagic', profession=__profession__) + "缩地成寸" + + CURE = SkillRef(name='净化', code='cure', profession=__profession__) + "净化" + + DRAGONWRATH = SkillRef(name='龙魂之怒', code='dragonwrath', profession=__profession__) + "龙魂之怒" + + EFFORTSPHERE = SkillRef(name='和合之玉', code='effortsphere', profession=__profession__) + "和合之玉" + + EXORCISMUS = SkillRef(name='驱邪咒', code='exorcismus', profession=__profession__) + "驱邪咒" + + HEAVYSIN = SkillRef(name='罪业加身', code='heavysin', profession=__profession__) + "罪业加身" + + HOLYSMASH = SkillRef(name='审判锤击', code='holysmash', profession=__profession__) + "审判锤击" + + IMMOBILITYMAGICLINE = SkillRef(name='不动珠箔阵', code='immobilitymagicline', profession=__profession__) + "不动珠箔阵" + + LIFEDEPRIVEDISPOSITION = SkillRef(name='夺命大念阵', code='lifedeprivedisposition', profession=__profession__) + "夺命大念阵" + + MIKOMASTERY = SkillRef(name='神术强化', code='mikomastery', profession=__profession__) + "神术强化" + + NECKUPSCYTHE = SkillRef(name='钩颈斩', code='neckupscythe', profession=__profession__) + "钩颈斩" + + POWEROFAGENT = SkillRef(name='乾坤之境', code='powerofagent', profession=__profession__) + "乾坤之境" + + POWEROFTHEDRAGON = SkillRef(name='龙神之力', code='powerofthedragon', profession=__profession__) + "龙神之力" + + PRAYEROFHEAL = SkillRef(name='治愈祈祷', code='prayerofheal', profession=__profession__) + "治愈祈祷" + + PRAYFORORACLE = SkillRef(name='神谕之祈愿', code='prayfororacle', profession=__profession__) + "神谕之祈愿" + + RISINGSLASH = SkillRef(name='升空斩', code='risingslash', profession=__profession__) + "升空斩" + + RITUALFORDRAGON = SkillRef(name='神谕 : 神龙雷雨祭', code='ritualfordragon', profession=__profession__) + "神谕 : 神龙雷雨祭" + + RITUALFORRAIN = SkillRef(name='祈雨祭', code='ritualforrain', profession=__profession__) + "祈雨祭" + + ROSARYOF108BEADS = SkillRef(name='百八念珠', code='rosaryof108beads', profession=__profession__) + "百八念珠" + + ROSARYSHOOTING = SkillRef(name='念珠连射', code='rosaryshooting', profession=__profession__) + "念珠连射" + + ROSARYSTRIKE = SkillRef(name='木槵子经', code='rosarystrike', profession=__profession__) + "木槵子经" + + ROSARYWILDSHOT = SkillRef(name='退魔阴阳符', code='rosarywildshot', profession=__profession__) + "退魔阴阳符" + + SKYSORCERESSUNITE = SkillRef(name='神龙之舞·天一', code='skysorceressunite', profession=__profession__) + "神龙之舞·天一" + + SWALLOWSKYDRGON = SkillRef(name='天泽神龙阵', code='swallowskydrgon', profession=__profession__) + "天泽神龙阵" + + TALISMANOFLIGHTNING = SkillRef(name='唤雷符', code='talismanoflightning', profession=__profession__) + "唤雷符" + + TALISMANOFOPPRESSION = SkillRef(name='束灵符', code='talismanofoppression', profession=__profession__) + "束灵符" + + TALISMANOFSOULSTEAL = SkillRef(name='聚魂吸星符', code='talismanofsoulsteal', profession=__profession__) + "聚魂吸星符" + + TALISMANOFTIMEBOMB = SkillRef(name='因果业火符', code='talismanoftimebomb', profession=__profession__) + "因果业火符" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + VIOLENTASSAULT = SkillRef(name='空中锤击', code='violentassault', profession=__profession__) + "空中锤击" + + WEAPONGUARD = SkillRef(name='武器格挡', code='weaponguard', profession=__profession__) + "武器格挡" + + WRATHOFGODDRAGON = SkillRef(name='龙威如狱·龙恩如海', code='wrathofgoddragon', profession=__profession__) + "龙威如狱·龙恩如海" diff --git a/backend/core/character/refs/priest_male/__init__.py b/backend/core/character/refs/priest_male/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/priest_male/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/priest_male/avenger.py b/backend/core/character/refs/priest_male/avenger.py new file mode 100644 index 00000000..5ab00182 --- /dev/null +++ b/backend/core/character/refs/priest_male/avenger.py @@ -0,0 +1,123 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:priest_male/avenger/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class AvengerSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """priest_male.avenger 的技能引用;包含继承的公共技能。""" + __profession__ = 'priest_male.avenger' + + ANTIAIRUPPER = SkillRef(name='空斩打', code='antiairupper', profession=__profession__) + "空斩打" + + AVENGERGUARD = SkillRef(name='恶魔屏障', code='avengerguard', profession=__profession__) + "恶魔屏障" + + AWAKENING = SkillRef(name='魔化 : 末日守卫者', code='awakening', profession=__profession__) + "魔化 : 末日守卫者" + + CHANGEHPTOMP = SkillRef(name='化魔', code='changehptomp', profession=__profession__) + "化魔" + + CURE = SkillRef(name='净化', code='cure', profession=__profession__) + "净化" + + DARKHOWLING = SkillRef(name='不朽战吼', code='darkhowling', profession=__profession__) + "不朽战吼" + + DEVILFIST = SkillRef(name='恶魔之拳', code='devilfist', profession=__profession__) + "恶魔之拳" + + DEVILSTRIKE = SkillRef(name='恶魔之力', code='devilstrike', profession=__profession__) + "恶魔之力" + + DIRESTREAM = SkillRef(name='极恶洪流', code='direstream', profession=__profession__) + "极恶洪流" + + DISASTEREX = SkillRef(name='末日浩劫', code='disasterex', profession=__profession__) + "末日浩劫" + + DOOMCRUSH = SkillRef(name='毁灭强击', code='doomcrush', profession=__profession__) + "毁灭强击" + + EARTHQUAKE = SkillRef(name='裂地锤', code='earthquake', profession=__profession__) + "裂地锤" + + EVILRETURN = SkillRef(name='邪魔再临', code='evilreturn', profession=__profession__) + "邪魔再临" + + EVILSTRIKE = SkillRef(name='原罪之力', code='evilstrike', profession=__profession__) + "原罪之力" + + EXECUTION = SkillRef(name='审判', code='execution', profession=__profession__) + "审判" + + FALLINGSOUL = SkillRef(name='堕落之魂', code='fallingsoul', profession=__profession__) + "堕落之魂" + + GRASPHANDOFANGER = SkillRef(name='恶魔之手', code='grasphandofanger', profession=__profession__) + "恶魔之手" + + HEARTHINGS = SkillRef(name='恶魔诅咒', code='hearthings', profession=__profession__) + "恶魔诅咒" + + HEDGEHOG = SkillRef(name='黑暗之刺', code='hedgehog', profession=__profession__) + "黑暗之刺" + + HIGHSPEEDSLASH = SkillRef(name='魔镰之舞', code='highspeedslash', profession=__profession__) + "魔镰之舞" + + LUCKYSTRAIGHT = SkillRef(name='直拳冲击', code='luckystraight', profession=__profession__) + "直拳冲击" + + METAMORPHOSIS = SkillRef(name='半魔化', code='metamorphosis', profession=__profession__) + "半魔化" + + MORTALGOSPEL = SkillRef(name='末日福音 : 毁灭之翼', code='mortalgospel', profession=__profession__) + "末日福音 : 毁灭之翼" + + NIGHTMARE = SkillRef(name='恶魔唤醒', code='nightmare', profession=__profession__) + "恶魔唤醒" + + PANDEMONIUMEX = SkillRef(name='地狱之门', code='pandemoniumex', profession=__profession__) + "地狱之门" + + POWEROFDARKNESS = SkillRef(name='黑暗权能', code='powerofdarkness', profession=__profession__) + "黑暗权能" + + QUAKEAREA = SkillRef(name='落凤锤', code='quakearea', profession=__profession__) + "落凤锤" + + REAPER = SkillRef(name='黑暗之触', code='reaper', profession=__profession__) + "黑暗之触" + + RIGHTEOUSDEVILIZE = SkillRef(name='光之影', code='righteousdevilize', profession=__profession__) + "光之影" + + RISINGAREA = SkillRef(name='升天阵', code='risingarea', profession=__profession__) + "升天阵" + + SCYTHEMASTERY = SkillRef(name='镰刀精通', code='scythemastery', profession=__profession__) + "镰刀精通" + + SECONDUPPER = SkillRef(name='勾拳追击', code='secondupper', profession=__profession__) + "勾拳追击" + + SLOWHEAL = SkillRef(name='缓慢愈合', code='slowheal', profession=__profession__) + "缓慢愈合" + + SMASHER = SkillRef(name='虎袭', code='smasher', profession=__profession__) + "虎袭" + + SPINCUTTER = SkillRef(name='回旋飞镰', code='spincutter', profession=__profession__) + "回旋飞镰" + + SPINNINGDEFORMATION = SkillRef(name='厄运之轮', code='spinningdeformation', profession=__profession__) + "厄运之轮" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + UNHOLYFURY = SkillRef(name='永堕 : 混沌弑神', code='unholyfury', profession=__profession__) + "永堕 : 混沌弑神" diff --git a/backend/core/character/refs/priest_male/crusader_male.py b/backend/core/character/refs/priest_male/crusader_male.py new file mode 100644 index 00000000..a051ca94 --- /dev/null +++ b/backend/core/character/refs/priest_male/crusader_male.py @@ -0,0 +1,141 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:priest_male/crusader_male/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class CrusaderMaleSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """priest_male.crusader_male 的技能引用;包含继承的公共技能。""" + __profession__ = 'priest_male.crusader_male' + + ANTIAIRUPPER = SkillRef(name='空斩打', code='antiairupper', profession=__profession__) + "空斩打" + + APOCALYPSE = SkillRef(name='天启之光', code='apocalypse', profession=__profession__) + "天启之光" + + ASTRAFE = SkillRef(name='惩罚之锤 : 天怒', code='astrafe', profession=__profession__) + "惩罚之锤 : 天怒" + + AURAOFFAITH = SkillRef(name='信念光环', code='auraoffaith', profession=__profession__) + "信念光环" + + BLADEOFPUREWHITE = SkillRef(name='纯白之刃', code='bladeofpurewhite', profession=__profession__) + "纯白之刃" + + CROSSCRASH = SkillRef(name='圣光十字', code='crosscrash', profession=__profession__) + "圣光十字" + + CURE = SkillRef(name='净化', code='cure', profession=__profession__) + "净化" + + DEFLECTWALL = SkillRef(name='圣光沁盾', code='deflectwall', profession=__profession__) + "圣光沁盾" + + DEFLECTWALLEX = SkillRef(name='双子沁盾', code='deflectwallex', profession=__profession__) + "双子沁盾" + + DIVINEAGENT = SkillRef(name='神之代行者', code='divineagent', profession=__profession__) + "神之代行者" + + DIVINEFLASH = SkillRef(name='神圣之光', code='divineflash', profession=__profession__) + "神圣之光" + + DIVINELIGHT = SkillRef(name='圣光守护', code='divinelight', profession=__profession__) + "圣光守护" + + DIVINEPUNISHMENT = SkillRef(name='神圣洗礼 : 信仰之翼', code='divinepunishment', profession=__profession__) + "神圣洗礼 : 信仰之翼" + + EMBLEMOFSAFEGUARD = SkillRef(name='守护徽章', code='emblemofsafeguard', profession=__profession__) + "守护徽章" + + FASTHEAL = SkillRef(name='快速愈合', code='fastheal', profession=__profession__) + "快速愈合" + + FLASHGLOBE = SkillRef(name='圣光球', code='flashglobe', profession=__profession__) + "圣光球" + + FLASHSCRAP = SkillRef(name='圣光琉璃碎', code='flashscrap', profession=__profession__) + "圣光琉璃碎" + + FOUNTAINOFLIFE = SkillRef(name='生命源泉', code='fountainoflife', profession=__profession__) + "生命源泉" + + GLORIOUSBLESS = SkillRef(name='荣誉祝福', code='gloriousbless', profession=__profession__) + "荣誉祝福" + + GRACEOFCOURAGE = SkillRef(name='勇气恩赐', code='graceofcourage', profession=__profession__) + "勇气恩赐" + + GRACEOFGOD = SkillRef(name='神的恩赐', code='graceofgod', profession=__profession__) + "神的恩赐" + + GRACEOFPROTECTION = SkillRef(name='守护恩赐', code='graceofprotection', profession=__profession__) + "守护恩赐" + + HAMMEROFCONTRITION = SkillRef(name='忏悔之锤', code='hammerofcontrition', profession=__profession__) + "忏悔之锤" + + HAPTISM = SkillRef(name='圣光聚合', code='haptism', profession=__profession__) + "圣光聚合" + + HARDENEDWILL = SkillRef(name='坚定信念', code='hardenedwill', profession=__profession__) + "坚定信念" + + HEALWIND = SkillRef(name='圣愈之风', code='healwind', profession=__profession__) + "圣愈之风" + + HOLLYSANCTUARY = SkillRef(name='圣佑结界', code='hollysanctuary', profession=__profession__) + "圣佑结界" + + HOLYMACE = SkillRef(name='圣灵之槌', code='holymace', profession=__profession__) + "圣灵之槌" + + JUDGEMENT = SkillRef(name='正义审判', code='judgement', profession=__profession__) + "正义审判" + + JUPITER = SkillRef(name='惩罚之锤', code='jupiter', profession=__profession__) + "惩罚之锤" + + LASTJUDGMENT = SkillRef(name='生命礼赞 : 神威', code='lastjudgment', profession=__profession__) + "生命礼赞 : 神威" + + LUCKYSTRAIGHT = SkillRef(name='直拳冲击', code='luckystraight', profession=__profession__) + "直拳冲击" + + MEDITATION = SkillRef(name='圣念', code='meditation', profession=__profession__) + "圣念" + + MIRACLESPLITER = SkillRef(name='圣光突袭', code='miraclespliter', profession=__profession__) + "圣光突袭" + + PENALTY = SkillRef(name='信仰之翼 : 裁决', code='penalty', profession=__profession__) + "信仰之翼 : 裁决" + + QUAKEAREA = SkillRef(name='落凤锤', code='quakearea', profession=__profession__) + "落凤锤" + + REVENGEOFLIGHT = SkillRef(name='光之正义', code='revengeoflight', profession=__profession__) + "光之正义" + + SACRIFICEOFSOUL = SkillRef(name='灵魂牺牲', code='sacrificeofsoul', profession=__profession__) + "灵魂牺牲" + + SECONDUPPER = SkillRef(name='勾拳追击', code='secondupper', profession=__profession__) + "勾拳追击" + + SLOWHEAL = SkillRef(name='缓慢愈合', code='slowheal', profession=__profession__) + "缓慢愈合" + + SMASHER = SkillRef(name='虎袭', code='smasher', profession=__profession__) + "虎袭" + + SPEAROFDESTINY = SkillRef(name='神圣之矛', code='spearofdestiny', profession=__profession__) + "神圣之矛" + + SPEAROFVICTORY = SkillRef(name='胜利之矛', code='spearofvictory', profession=__profession__) + "胜利之矛" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" diff --git a/backend/core/character/refs/priest_male/exorcist.py b/backend/core/character/refs/priest_male/exorcist.py new file mode 100644 index 00000000..63d18c59 --- /dev/null +++ b/backend/core/character/refs/priest_male/exorcist.py @@ -0,0 +1,123 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:priest_male/exorcist/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class ExorcistSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """priest_male.exorcist 的技能引用;包含继承的公共技能。""" + __profession__ = 'priest_male.exorcist' + + ADAPTATION = SkillRef(name='法阵 : 万悟', code='adaptation', profession=__profession__) + "法阵 : 万悟" + + ADVANCEDDRAGON = SkillRef(name='真龙焚天', code='advanceddragon', profession=__profession__) + "真龙焚天" + + ANTIAIRUPPER = SkillRef(name='空斩打', code='antiairupper', profession=__profession__) + "空斩打" + + ATOMICSMASH = SkillRef(name='无双击', code='atomicsmash', profession=__profession__) + "无双击" + + BEAKHONEW = SkillRef(name='式神 : 空之白虎', code='beakhonew', profession=__profession__) + "式神 : 空之白虎" + + BIGWEAPONMASTERY = SkillRef(name='巨兵精通', code='bigweaponmastery', profession=__profession__) + "巨兵精通" + + BOOKOFEXOCISM = SkillRef(name='驱魔之书', code='bookofexocism', profession=__profession__) + "驱魔之书" + + CHAKRAOFPASSION = SkillRef(name='封魔莲华', code='chakraofpassion', profession=__profession__) + "封魔莲华" + + CHANGEHPTOMP = SkillRef(name='化魔', code='changehptomp', profession=__profession__) + "化魔" + + CHARGEWEAPON = SkillRef(name='潜龙', code='chargeweapon', profession=__profession__) + "潜龙" + + CONVERSION = SkillRef(name='攻击类型转换', code='conversion', profession=__profession__) + "攻击类型转换" + + CURE = SkillRef(name='净化', code='cure', profession=__profession__) + "净化" + + DANGEROUSSCALE = SkillRef(name='逆鳞震', code='dangerousscale', profession=__profession__) + "逆鳞震" + + DRAGONCIRCLE = SkillRef(name='升龙·开阵', code='dragoncircle', profession=__profession__) + "升龙·开阵" + + FORCEOFEXORCISM = SkillRef(name='驱魔震慑', code='forceofexorcism', profession=__profession__) + "驱魔震慑" + + FOURGODDOOR = SkillRef(name='四座千泰门', code='fourgoddoor', profession=__profession__) + "四座千泰门" + + FOURGODPOWER = SkillRef(name='式神灭却·合', code='fourgodpower', profession=__profession__) + "式神灭却·合" + + GALESMASH = SkillRef(name='疾风打', code='galesmash', profession=__profession__) + "疾风打" + + GIANTSWING = SkillRef(name='疾空旋风破', code='giantswing', profession=__profession__) + "疾空旋风破" + + GODOFEXORCISM = SkillRef(name='式神之悟', code='godofexorcism', profession=__profession__) + "式神之悟" + + GRASPHANDOFANGER = SkillRef(name='恶魔之手', code='grasphandofanger', profession=__profession__) + "恶魔之手" + + HOMERUN = SkillRef(name='星落打', code='homerun', profession=__profession__) + "星落打" + + HYUNMOONEW = SkillRef(name='式神 : 地之玄武', code='hyunmoonew', profession=__profession__) + "式神 : 地之玄武" + + LUCKYSTRAIGHT = SkillRef(name='直拳冲击', code='luckystraight', profession=__profession__) + "直拳冲击" + + OCEANDRAGON = SkillRef(name='式神 : 幻海青龙', code='oceandragon', profession=__profession__) + "式神 : 幻海青龙" + + QUAKEAREA = SkillRef(name='落凤锤', code='quakearea', profession=__profession__) + "落凤锤" + + RADIATEFIGHTINGAURA = SkillRef(name='斗志散发', code='radiatefightingaura', profession=__profession__) + "斗志散发" + + REPEATEDSMASH = SkillRef(name='狂乱锤击', code='repeatedsmash', profession=__profession__) + "狂乱锤击" + + RISINGAREA = SkillRef(name='升天阵', code='risingarea', profession=__profession__) + "升天阵" + + SECONDUPPER = SkillRef(name='勾拳追击', code='secondupper', profession=__profession__) + "勾拳追击" + + SKYEARTHSTRIKE = SkillRef(name='雷鸣怒海·火啸山崩', code='skyearthstrike', profession=__profession__) + "雷鸣怒海·火啸山崩" + + SLOWHEAL = SkillRef(name='缓慢愈合', code='slowheal', profession=__profession__) + "缓慢愈合" + + SMASHER = SkillRef(name='虎袭', code='smasher', profession=__profession__) + "虎袭" + + STAGEOFHERMIT = SkillRef(name='式神之力', code='stageofhermit', profession=__profession__) + "式神之力" + + SUZAKU = SkillRef(name='式神 : 热炎朱雀', code='suzaku', profession=__profession__) + "式神 : 热炎朱雀" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + THEBEST7HIT = SkillRef(name='逆龙七杀', code='thebest7hit', profession=__profession__) + "逆龙七杀" + + YELLOWDRAGON = SkillRef(name='式神契结 : 真龙', code='yellowdragon', profession=__profession__) + "式神契结 : 真龙" diff --git a/backend/core/character/refs/priest_male/infighter.py b/backend/core/character/refs/priest_male/infighter.py new file mode 100644 index 00000000..ad69c27b --- /dev/null +++ b/backend/core/character/refs/priest_male/infighter.py @@ -0,0 +1,135 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:priest_male/infighter/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class InfighterSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """priest_male.infighter 的技能引用;包含继承的公共技能。""" + __profession__ = 'priest_male.infighter' + + AGGRESSIVEJUDGEMENT = SkillRef(name='正义铁拳', code='aggressivejudgement', profession=__profession__) + "正义铁拳" + + ANTIAIRUPPER = SkillRef(name='空斩打', code='antiairupper', profession=__profession__) + "空斩打" + + ATOMICCHOPPER = SkillRef(name='超重拳', code='atomicchopper', profession=__profession__) + "超重拳" + + BIGBANGPUNCH = SkillRef(name='泯灭神击', code='bigbangpunch', profession=__profession__) + "泯灭神击" + + CHANGEHPTOMP = SkillRef(name='化魔', code='changehptomp', profession=__profession__) + "化魔" + + CHOPPINGHAMMER = SkillRef(name='破碎之锤', code='choppinghammer', profession=__profession__) + "破碎之锤" + + CONSTELLATIONOFLEMIEDIOS = SkillRef(name='正义执行 : 雷米迪奥斯的圣座', code='constellationoflemiedios', profession=__profession__) + "正义执行 : 雷米迪奥斯的圣座" + + CORKSCREWBLOW = SkillRef(name='旋涡重拳', code='corkscrewblow', profession=__profession__) + "旋涡重拳" + + CURE = SkillRef(name='净化', code='cure', profession=__profession__) + "净化" + + DEATHBLOW = SkillRef(name='正义惩戒', code='deathblow', profession=__profession__) + "正义惩戒" + + DEMOLITIONPUNCH = SkillRef(name='破坏之拳', code='demolitionpunch', profession=__profession__) + "破坏之拳" + + DIVINECRUSH = SkillRef(name='圣拳锤击', code='divinecrush', profession=__profession__) + "圣拳锤击" + + DOUBLESHADOWBOXER = SkillRef(name='双重幻影', code='doubleshadowboxer', profession=__profession__) + "双重幻影" + + DRYOUT = SkillRef(name='干涸之泉', code='dryout', profession=__profession__) + "干涸之泉" + + DUCKING = SkillRef(name='俯冲', code='ducking', profession=__profession__) + "俯冲" + + DUCKINGBODYBLOW = SkillRef(name='俯冲腹拳', code='duckingbodyblow', profession=__profession__) + "俯冲腹拳" + + DUCKINGSTRAIGHT = SkillRef(name='俯冲直拳', code='duckingstraight', profession=__profession__) + "俯冲直拳" + + DUCKINGUPPER = SkillRef(name='俯冲翔拳', code='duckingupper', profession=__profession__) + "俯冲翔拳" + + EXTENDEDPUNCH = SkillRef(name='百炼成刚', code='extendedpunch', profession=__profession__) + "百炼成刚" + + GATLINGPUNCH = SkillRef(name='破碎之拳', code='gatlingpunch', profession=__profession__) + "破碎之拳" + + GORGEOUSCOMBINATION = SkillRef(name='圣拳连击', code='gorgeouscombination', profession=__profession__) + "圣拳连击" + + GRASPHANDOFANGER = SkillRef(name='恶魔之手', code='grasphandofanger', profession=__profession__) + "恶魔之手" + + HEAVENLYCOMBINATION = SkillRef(name='神圣组合拳', code='heavenlycombination', profession=__profession__) + "神圣组合拳" + + HOLYCOUNTER = SkillRef(name='神圣反击', code='holycounter', profession=__profession__) + "神圣反击" + + HURRICANEROLL = SkillRef(name='极速飓风拳', code='hurricaneroll', profession=__profession__) + "极速飓风拳" + + JUSTICEOFONE = SkillRef(name='绝对正义', code='justiceofone', profession=__profession__) + "绝对正义" + + LUCKYSTRAIGHT = SkillRef(name='直拳冲击', code='luckystraight', profession=__profession__) + "直拳冲击" + + MACHINEGUNJAB = SkillRef(name='刺拳猛击', code='machinegunjab', profession=__profession__) + "刺拳猛击" + + NUCLEARPUNCH = SkillRef(name='仲裁怒击', code='nuclearpunch', profession=__profession__) + "仲裁怒击" + + QUAKEAREA = SkillRef(name='落凤锤', code='quakearea', profession=__profession__) + "落凤锤" + + QUICKPARRY = SkillRef(name='急速闪避', code='quickparry', profession=__profession__) + "急速闪避" + + RISINGAREA = SkillRef(name='升天阵', code='risingarea', profession=__profession__) + "升天阵" + + SECONDUPPER = SkillRef(name='勾拳追击', code='secondupper', profession=__profession__) + "勾拳追击" + + SHADOWBOXER = SkillRef(name='幻影化身', code='shadowboxer', profession=__profession__) + "幻影化身" + + SIDEWIND = SkillRef(name='瞬拳', code='sidewind', profession=__profession__) + "瞬拳" + + SLOWHEAL = SkillRef(name='缓慢愈合', code='slowheal', profession=__profession__) + "缓慢愈合" + + SMASHER = SkillRef(name='虎袭', code='smasher', profession=__profession__) + "虎袭" + + SWAY = SkillRef(name='摆动', code='sway', profession=__profession__) + "摆动" + + TECHNICALMASTERY = SkillRef(name='技巧精通', code='technicalmastery', profession=__profession__) + "技巧精通" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + WILLDRIVER = SkillRef(name='意念驱动', code='willdriver', profession=__profession__) + "意念驱动" + + WRATHOFGOD = SkillRef(name='制裁 : 怒火疾风', code='wrathofgod', profession=__profession__) + "制裁 : 怒火疾风" diff --git a/backend/core/character/refs/swordman_female/__init__.py b/backend/core/character/refs/swordman_female/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/swordman_female/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/swordman_female/dark_templar.py b/backend/core/character/refs/swordman_female/dark_templar.py new file mode 100644 index 00000000..ab04c8b7 --- /dev/null +++ b/backend/core/character/refs/swordman_female/dark_templar.py @@ -0,0 +1,126 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:swordman_female/dark_templar/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class DarkTemplarSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """swordman_female.dark_templar 的技能引用;包含继承的公共技能。""" + __profession__ = 'swordman_female.dark_templar' + + APOSTATAE = SkillRef(name='灭罪 · 慈悲执刑', code='apostatae', profession=__profession__) + "灭罪 · 慈悲执刑" + + BLACKMIRROR = SkillRef(name='魔镜幻影阵', code='blackmirror', profession=__profession__) + "魔镜幻影阵" + + CHAINSLASH = SkillRef(name='连环斩', code='chainslash', profession=__profession__) + "连环斩" + + COLDHEART = SkillRef(name='冥思', code='coldheart', profession=__profession__) + "冥思" + + CONGEST = SkillRef(name='暗影蓄能', code='congest', profession=__profession__) + "暗影蓄能" + + DARKCOHESION = SkillRef(name='黑暗凝爆', code='darkcohesion', profession=__profession__) + "黑暗凝爆" + + DARKCRUEL = SkillRef(name='黑暗极刑', code='darkcruel', profession=__profession__) + "黑暗极刑" + + DARKSLASH = SkillRef(name='暗黑斩', code='darkslash', profession=__profession__) + "暗黑斩" + + DARKSPLIT = SkillRef(name='黑暗纷影斩', code='darksplit', profession=__profession__) + "黑暗纷影斩" + + DARKTRACER = SkillRef(name='黑暗追袭', code='darktracer', profession=__profession__) + "黑暗追袭" + + DEUSEXRAY = SkillRef(name='罚罪之光', code='deusexray', profession=__profession__) + "罚罪之光" + + DIESIRAE = SkillRef(name='审判日 : 净土救赎', code='diesirae', profession=__profession__) + "审判日 : 净土救赎" + + DOOMSDAY = SkillRef(name='末日狂战', code='doomsday', profession=__profession__) + "末日狂战" + + EXECUTION = SkillRef(name='索敌刺', code='execution', profession=__profession__) + "索敌刺" + + GORECROSS = SkillRef(name='十字剑', code='gorecross', profession=__profession__) + "十字剑" + + GUARD = SkillRef(name='招架', code='guard', profession=__profession__) + "招架" + + GUIDANCE = SkillRef(name='行动纲领', code='guidance', profession=__profession__) + "行动纲领" + + HERALDOFDARKNESS = SkillRef(name='乌希尔启示', code='heraldofdarkness', profession=__profession__) + "乌希尔启示" + + IMMACULATEDEATH = SkillRef(name='无瑕归冥', code='immaculatedeath', profession=__profession__) + "无瑕归冥" + + IMMOLATION = SkillRef(name='黑暗献祭', code='immolation', profession=__profession__) + "黑暗献祭" + + INCARNATION = SkillRef(name='以身载灵', code='incarnation', profession=__profession__) + "以身载灵" + + JIHAD = SkillRef(name='天罚之剑', code='jihad', profession=__profession__) + "天罚之剑" + + LIFTSLASH = SkillRef(name='浮空击', code='liftslash', profession=__profession__) + "浮空击" + + MOUNTAINCRASH = SkillRef(name='跃空斩', code='mountaincrash', profession=__profession__) + "跃空斩" + + PUNISHMENT = SkillRef(name='神罚 · 灭世裁决', code='punishment', profession=__profession__) + "神罚 · 灭世裁决" + + RESTRAINT = SkillRef(name='令行禁止', code='restraint', profession=__profession__) + "令行禁止" + + SCAFFOLD = SkillRef(name='暗影禁锢', code='scaffold', profession=__profession__) + "暗影禁锢" + + SHADOWHARVEST = SkillRef(name='暗影漩涡', code='shadowharvest', profession=__profession__) + "暗影漩涡" + + SHADOWHIDING = SkillRef(name='暗影遁行', code='shadowhiding', profession=__profession__) + "暗影遁行" + + SHADOWSNATCHER = SkillRef(name='暗影劫戮', code='shadowsnatcher', profession=__profession__) + "暗影劫戮" + + SHADOWSTABBING = SkillRef(name='暗影穿刺', code='shadowstabbing', profession=__profession__) + "暗影穿刺" + + SHADOWSWEEP = SkillRef(name='暗影横扫', code='shadowsweep', profession=__profession__) + "暗影横扫" + + SIRYUN = SkillRef(name='波动斩', code='siryun', profession=__profession__) + "波动斩" + + SNAKESHADOW = SkillRef(name='疾风斩', code='snakeshadow', profession=__profession__) + "疾风斩" + + SPATANOCTIS = SkillRef(name='暗影剑术', code='spatanoctis', profession=__profession__) + "暗影剑术" + + SPINSLASH = SkillRef(name='回旋反击', code='spinslash', profession=__profession__) + "回旋反击" + + STIGMA = SkillRef(name='黑暗烙印', code='stigma', profession=__profession__) + "黑暗烙印" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + VESPERS = SkillRef(name='薄暮', code='vespers', profession=__profession__) + "薄暮" diff --git a/backend/core/character/refs/swordman_female/demon_slayer.py b/backend/core/character/refs/swordman_female/demon_slayer.py new file mode 100644 index 00000000..354673cf --- /dev/null +++ b/backend/core/character/refs/swordman_female/demon_slayer.py @@ -0,0 +1,114 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:swordman_female/demon_slayer/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class DemonSlayerSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """swordman_female.demon_slayer 的技能引用;包含继承的公共技能。""" + __profession__ = 'swordman_female.demon_slayer' + + ALCATRAZ = SkillRef(name='弑神剑 : 恶魔孤岛', code='alcatraz', profession=__profession__) + "弑神剑 : 恶魔孤岛" + + BLOODDANCE = SkillRef(name='魔刃狂舞', code='blooddance', profession=__profession__) + "魔刃狂舞" + + BLOODDEMONSWORD = SkillRef(name='汲血魔剑', code='blooddemonsword', profession=__profession__) + "汲血魔剑" + + BLOODOCTOPUSSWORD = SkillRef(name='蛇舞血轮剑', code='bloodoctopussword', profession=__profession__) + "蛇舞血轮剑" + + CALLDAIMUS = SkillRef(name='唤魔 : 蛇腹剑', code='calldaimus', profession=__profession__) + "唤魔 : 蛇腹剑" + + CHAINSLASH = SkillRef(name='连环斩', code='chainslash', profession=__profession__) + "连环斩" + + CLAWBLADE = SkillRef(name='蛇腹剑 : 缠', code='clawblade', profession=__profession__) + "蛇腹剑 : 缠" + + COLDHEART = SkillRef(name='冥思', code='coldheart', profession=__profession__) + "冥思" + + CONTROLDEMONSWORD = SkillRef(name='魔剑控制', code='controldemonsword', profession=__profession__) + "魔剑控制" + + DARKSLASH = SkillRef(name='暗黑斩', code='darkslash', profession=__profession__) + "暗黑斩" + + DARKSTRIKE = SkillRef(name='唤魔 : 塔莫斯之袭', code='darkstrike', profession=__profession__) + "唤魔 : 塔莫斯之袭" + + DEVILSWORDTECH = SkillRef(name='唤魔 : 弑神剑', code='devilswordtech', profession=__profession__) + "唤魔 : 弑神剑" + + EXECUTION = SkillRef(name='索敌刺', code='execution', profession=__profession__) + "索敌刺" + + FRENZY = SkillRef(name='唤魔 : 狂暴', code='frenzy', profession=__profession__) + "唤魔 : 狂暴" + + GIGABLADE = SkillRef(name='空绝斩 : 千刃', code='gigablade', profession=__profession__) + "空绝斩 : 千刃" + + GIGASLASH = SkillRef(name='空绝斩 : 地裂', code='gigaslash', profession=__profession__) + "空绝斩 : 地裂" + + GORECROSS = SkillRef(name='十字剑', code='gorecross', profession=__profession__) + "十字剑" + + GREED = SkillRef(name='贪欲之燔祭', code='greed', profession=__profession__) + "贪欲之燔祭" + + GROUPDANCE = SkillRef(name='群魔乱舞', code='groupdance', profession=__profession__) + "群魔乱舞" + + GUARD = SkillRef(name='招架', code='guard', profession=__profession__) + "招架" + + LIFTSLASH = SkillRef(name='浮空击', code='liftslash', profession=__profession__) + "浮空击" + + MOUNTAINCRASH = SkillRef(name='跃空斩', code='mountaincrash', profession=__profession__) + "跃空斩" + + PHNOM = SkillRef(name='唤魔 : 逆天之普诺', code='phnom', profession=__profession__) + "唤魔 : 逆天之普诺" + + PIKESWORD = SkillRef(name='蛇腹剑 : 刺', code='pikesword', profession=__profession__) + "蛇腹剑 : 刺" + + QUEENOFMINE = SkillRef(name='魔源觉醒', code='queenofmine', profession=__profession__) + "魔源觉醒" + + RAGNAROK = SkillRef(name='弑神剑 : 诸神献祭', code='ragnarok', profession=__profession__) + "弑神剑 : 诸神献祭" + + SIRYUN = SkillRef(name='波动斩', code='siryun', profession=__profession__) + "波动斩" + + SNAKEDANCE = SkillRef(name='蛇腹剑 : 舞', code='snakedance', profession=__profession__) + "蛇腹剑 : 舞" + + SNAKESHADOW = SkillRef(name='疾风斩', code='snakeshadow', profession=__profession__) + "疾风斩" + + SPINSLASH = SkillRef(name='回旋反击', code='spinslash', profession=__profession__) + "回旋反击" + + SPLITDEMONSWORD = SkillRef(name='碎魔剑', code='splitdemonsword', profession=__profession__) + "碎魔剑" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + ULTIMATEBLADE = SkillRef(name='弑神剑 : 极', code='ultimateblade', profession=__profession__) + "弑神剑 : 极" + + WHIPSWORDBAL = SkillRef(name='蛇腹剑 : 破', code='whipswordbal', profession=__profession__) + "蛇腹剑 : 破" + + WILDWHIP = SkillRef(name='蛇腹剑 : 灭', code='wildwhip', profession=__profession__) + "蛇腹剑 : 灭" diff --git a/backend/core/character/refs/swordman_female/spectre.py b/backend/core/character/refs/swordman_female/spectre.py new file mode 100644 index 00000000..abca6c96 --- /dev/null +++ b/backend/core/character/refs/swordman_female/spectre.py @@ -0,0 +1,120 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:swordman_female/spectre/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs + + +class SpectreSkillRef(CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs): + """swordman_female.spectre 的技能引用;包含继承的公共技能。""" + __profession__ = 'swordman_female.spectre' + + BLACKOUT = SkillRef(name='封喉丝', code='blackout', profession=__profession__) + "封喉丝" + + BLENDINGPAIN = SkillRef(name='利刃旋风', code='blendingpain', profession=__profession__) + "利刃旋风" + + BULLSEYE = SkillRef(name='追袭逐影丝', code='bullseye', profession=__profession__) + "追袭逐影丝" + + CATHARSIS = SkillRef(name='悬丝风暴', code='catharsis', profession=__profession__) + "悬丝风暴" + + CHAINSLASH = SkillRef(name='连环斩', code='chainslash', profession=__profession__) + "连环斩" + + COLDHEART = SkillRef(name='冥思', code='coldheart', profession=__profession__) + "冥思" + + DANGEROUSHOOK = SkillRef(name='回旋勾斩', code='dangeroushook', profession=__profession__) + "回旋勾斩" + + DAREDEVIL = SkillRef(name='夜色敌意', code='daredevil', profession=__profession__) + "夜色敌意" + + DAYBREAK = SkillRef(name='黑曜真刃·破晓', code='daybreak', profession=__profession__) + "黑曜真刃·破晓" + + DEEPDUSK = SkillRef(name='薄暮利刃', code='deepdusk', profession=__profession__) + "薄暮利刃" + + DOUBLESHOT = SkillRef(name='双重斩', code='doubleshot', profession=__profession__) + "双重斩" + + FULLBODY = SkillRef(name='绚烂之舞', code='fullbody', profession=__profession__) + "绚烂之舞" + + GUARD = SkillRef(name='招架', code='guard', profession=__profession__) + "招架" + + HANGOVER = SkillRef(name='白牙落斩', code='hangover', profession=__profession__) + "白牙落斩" + + INFAMOUS = SkillRef(name='无情夜行', code='infamous', profession=__profession__) + "无情夜行" + + LASTORDER = SkillRef(name='秘术·心斩', code='lastorder', profession=__profession__) + "秘术·心斩" + + LICENSE = SkillRef(name='收刀秘术', code='license', profession=__profession__) + "收刀秘术" + + LIFTSLASH = SkillRef(name='浮空击', code='liftslash', profession=__profession__) + "浮空击" + + MOUNTAINCRASH = SkillRef(name='跃空斩', code='mountaincrash', profession=__profession__) + "跃空斩" + + MUDDLE = SkillRef(name='敛锋', code='muddle', profession=__profession__) + "敛锋" + + NIGHTFALL = SkillRef(name='夜之风', code='nightfall', profession=__profession__) + "夜之风" + + OLDFASHIONED = SkillRef(name='孤勇之志', code='oldfashioned', profession=__profession__) + "孤勇之志" + + OVERPACE = SkillRef(name='瞬影碎魂击', code='overpace', profession=__profession__) + "瞬影碎魂击" + + PROFESSIONAL = SkillRef(name='刃之心', code='professional', profession=__profession__) + "刃之心" + + RUSTYNAIL = SkillRef(name='鬼缚钉', code='rustynail', profession=__profession__) + "鬼缚钉" + + SHAKERBLAST = SkillRef(name='回旋十字刃', code='shakerblast', profession=__profession__) + "回旋十字刃" + + SHATTEREDGLASS = SkillRef(name='疾刃之影', code='shatteredglass', profession=__profession__) + "疾刃之影" + + SHOWDOWN = SkillRef(name='沉寂之狱', code='showdown', profession=__profession__) + "沉寂之狱" + + SLICEIMPACT = SkillRef(name='冲击斩', code='sliceimpact', profession=__profession__) + "冲击斩" + + SNAKESHADOW = SkillRef(name='疾风斩', code='snakeshadow', profession=__profession__) + "疾风斩" + + SPINSLASH = SkillRef(name='回旋反击', code='spinslash', profession=__profession__) + "回旋反击" + + STRAIGHTSHOT = SkillRef(name='秘术·曜夜斩', code='straightshot', profession=__profession__) + "秘术·曜夜斩" + + TEMPORARYREALIZATION5 = SkillRef(name='超卓之心', code='temporaryrealization5', profession=__profession__) + "超卓之心" + + TESTAMENT = SkillRef(name='秘术·雨夜终曲', code='testament', profession=__profession__) + "秘术·雨夜终曲" + + TRACE = SkillRef(name='追踪术', code='trace', profession=__profession__) + "追踪术" + + VINTAGE = SkillRef(name='刃之决意', code='vintage', profession=__profession__) + "刃之决意" + + WILDFLOWER = SkillRef(name='黑夜之花', code='wildflower', profession=__profession__) + "黑夜之花" diff --git a/backend/core/character/refs/swordman_female/sword_master.py b/backend/core/character/refs/swordman_female/sword_master.py new file mode 100644 index 00000000..ef806185 --- /dev/null +++ b/backend/core/character/refs/swordman_female/sword_master.py @@ -0,0 +1,141 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:swordman_female/sword_master/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class SwordMasterSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """swordman_female.sword_master 的技能引用;包含继承的公共技能。""" + __profession__ = 'swordman_female.sword_master' + + ACCEDENCE = SkillRef(name='剑心 : 魔剑唤醒', code='accedence', profession=__profession__) + "剑心 : 魔剑唤醒" + + AUTOGUARD = SkillRef(name='自动招架', code='autoguard', profession=__profession__) + "自动招架" + + BLADEMASTERY = SkillRef(name='血影之太刀精通', code='blademastery', profession=__profession__) + "血影之太刀精通" + + BLADESOUL = SkillRef(name='斩魂术', code='bladesoul', profession=__profession__) + "斩魂术" + + BLUNTMASTERY = SkillRef(name='波动之钝器精通', code='bluntmastery', profession=__profession__) + "波动之钝器精通" + + BREAKSWORDDANCE = SkillRef(name='极 · 驭剑术 (破剑阵)', code='breaksworddance', profession=__profession__) + "极 · 驭剑术 (破剑阵)" + + CHAINSLASH = SkillRef(name='连环斩', code='chainslash', profession=__profession__) + "连环斩" + + CHANGESWORD = SkillRef(name='魔剑降临', code='changesword', profession=__profession__) + "魔剑降临" + + COLDHEART = SkillRef(name='冥思', code='coldheart', profession=__profession__) + "冥思" + + COUNTERSLASH = SkillRef(name='招架反击', code='counterslash', profession=__profession__) + "招架反击" + + DARKSLASH = SkillRef(name='暗黑斩', code='darkslash', profession=__profession__) + "暗黑斩" + + DEVILSLASH = SkillRef(name='恶即斩', code='devilslash', profession=__profession__) + "恶即斩" + + DRAGONUPEX = SkillRef(name='裂刃天冲', code='dragonupex', profession=__profession__) + "裂刃天冲" + + DRAWSWORD = SkillRef(name='驭剑术', code='drawsword', profession=__profession__) + "驭剑术" + + EXCALIBUR = SkillRef(name='雷鸣千军破', code='excalibur', profession=__profession__) + "雷鸣千军破" + + EXECUTION = SkillRef(name='索敌刺', code='execution', profession=__profession__) + "索敌刺" + + FLASH = SkillRef(name='瞬影三绝斩', code='flash', profession=__profession__) + "瞬影三绝斩" + + FUSIONBLADE = SkillRef(name='极诣 · 驭剑术 : 聚魔剑', code='fusionblade', profession=__profession__) + "极诣 · 驭剑术 : 聚魔剑" + + GORECROSS = SkillRef(name='十字剑', code='gorecross', profession=__profession__) + "十字剑" + + GUARD = SkillRef(name='招架', code='guard', profession=__profession__) + "招架" + + HALFMOON = SkillRef(name='破军旋舞斩', code='halfmoon', profession=__profession__) + "破军旋舞斩" + + HEAVYSWORDMASTERY = SkillRef(name='毁灭之巨剑精通', code='heavyswordmastery', profession=__profession__) + "毁灭之巨剑精通" + + ILLUSIONBLADE = SkillRef(name='幻剑术', code='illusionblade', profession=__profession__) + "幻剑术" + + INNERBLADE = SkillRef(name='兵刃奥义', code='innerblade', profession=__profession__) + "兵刃奥义" + + JACKCATCH = SkillRef(name='极 · 驭剑术 (幻剑阵)', code='jackcatch', profession=__profession__) + "极 · 驭剑术 (幻剑阵)" + + LAEVATEINN = SkillRef(name='誓约之剑 : 雷沃汀', code='laevateinn', profession=__profession__) + "誓约之剑 : 雷沃汀" + + LIFTSLASH = SkillRef(name='浮空击', code='liftslash', profession=__profession__) + "浮空击" + + MAGICSWORDSHOOT = SkillRef(name='飓风魔剑', code='magicswordshoot', profession=__profession__) + "飓风魔剑" + + MAGICSWORDUP = SkillRef(name='魔剑奥义', code='magicswordup', profession=__profession__) + "魔剑奥义" + + MOUNTAINCRASH = SkillRef(name='跃空斩', code='mountaincrash', profession=__profession__) + "跃空斩" + + OVERDRIVE = SkillRef(name='人剑合一', code='overdrive', profession=__profession__) + "人剑合一" + + PROMISEOFANTIQUITY = SkillRef(name='帝皇盟约', code='promiseofantiquity', profession=__profession__) + "帝皇盟约" + + REGIONOFSUPREME = SkillRef(name='誓约之引 : 万剑之巅', code='regionofsupreme', profession=__profession__) + "誓约之引 : 万剑之巅" + + SHORTSWORDMASTERY = SkillRef(name='魔性之短剑精通', code='shortswordmastery', profession=__profession__) + "魔性之短剑精通" + + SIRYUN = SkillRef(name='波动斩', code='siryun', profession=__profession__) + "波动斩" + + SNAKESHADOW = SkillRef(name='疾风斩', code='snakeshadow', profession=__profession__) + "疾风斩" + + SPEEDSLASH = SkillRef(name='疾影斩', code='speedslash', profession=__profession__) + "疾影斩" + + SPINSLASH = SkillRef(name='回旋反击', code='spinslash', profession=__profession__) + "回旋反击" + + SWORDMAGIC = SkillRef(name='魔剑觉醒', code='swordmagic', profession=__profession__) + "魔剑觉醒" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + THUNDERSLASH = SkillRef(name='穿云破空剑', code='thunderslash', profession=__profession__) + "穿云破空剑" + + TIMESLASH = SkillRef(name='极 · 驭剑术 (时空斩)', code='timeslash', profession=__profession__) + "极 · 驭剑术 (时空斩)" + + UPPERSLASH = SkillRef(name='升龙剑', code='upperslash', profession=__profession__) + "升龙剑" + + WEAPONCOMBO = SkillRef(name='帝国剑术', code='weaponcombo', profession=__profession__) + "帝国剑术" diff --git a/backend/core/character/refs/swordman_female/vegabond.py b/backend/core/character/refs/swordman_female/vegabond.py new file mode 100644 index 00000000..09c9a7e2 --- /dev/null +++ b/backend/core/character/refs/swordman_female/vegabond.py @@ -0,0 +1,132 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:swordman_female/vegabond/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class VegabondSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """swordman_female.vegabond 的技能引用;包含继承的公共技能。""" + __profession__ = 'swordman_female.vegabond' + + BIGJANG = SkillRef(name='如来神掌', code='bigjang', profession=__profession__) + "如来神掌" + + BLASTSWORD = SkillRef(name='回天璇鸣剑', code='blastsword', profession=__profession__) + "回天璇鸣剑" + + BUDCLIMB = SkillRef(name='七星耀华', code='budclimb', profession=__profession__) + "七星耀华" + + CHAINSLASH = SkillRef(name='连环斩', code='chainslash', profession=__profession__) + "连环斩" + + COALBAN = SkillRef(name='游龙掌', code='coalban', profession=__profession__) + "游龙掌" + + COLDHEART = SkillRef(name='冥思', code='coldheart', profession=__profession__) + "冥思" + + COMETBLADE = SkillRef(name='花舞千魂', code='cometblade', profession=__profession__) + "花舞千魂" + + DARKSLASH = SkillRef(name='暗黑斩', code='darkslash', profession=__profession__) + "暗黑斩" + + DUALWEAPON = SkillRef(name='两仪功', code='dualweapon', profession=__profession__) + "两仪功" + + EARTHPRESSURE = SkillRef(name='碎岩裂地掌', code='earthpressure', profession=__profession__) + "碎岩裂地掌" + + ECSTASY = SkillRef(name='三花聚顶', code='ecstasy', profession=__profession__) + "三花聚顶" + + EQUIPLIGHTSWORD = SkillRef(name='光剑掌握', code='equiplightsword', profession=__profession__) + "光剑掌握" + + EXECUTION = SkillRef(name='索敌刺', code='execution', profession=__profession__) + "索敌刺" + + FATALFLOWER = SkillRef(name='花开寒影', code='fatalflower', profession=__profession__) + "花开寒影" + + FISTOFEXPLOSION = SkillRef(name='湮烈掌', code='fistofexplosion', profession=__profession__) + "湮烈掌" + + FIVECIRCLE = SkillRef(name='五气朝元', code='fivecircle', profession=__profession__) + "五气朝元" + + FLOWERBLADEDANCE = SkillRef(name='莲花剑舞', code='flowerbladedance', profession=__profession__) + "莲花剑舞" + + GODDESSOFSWORD = SkillRef(name='剑仙之境', code='goddessofsword', profession=__profession__) + "剑仙之境" + + GONEWITHTHEPETAL = SkillRef(name='落英惊鸿掌', code='gonewiththepetal', profession=__profession__) + "落英惊鸿掌" + + GORECROSS = SkillRef(name='十字剑', code='gorecross', profession=__profession__) + "十字剑" + + GUARD = SkillRef(name='招架', code='guard', profession=__profession__) + "招架" + + HERMITTRIPLESTEP = SkillRef(name='樱花劫', code='hermittriplestep', profession=__profession__) + "樱花劫" + + INHALATION = SkillRef(name='四象引', code='inhalation', profession=__profession__) + "四象引" + + LIFTSLASH = SkillRef(name='浮空击', code='liftslash', profession=__profession__) + "浮空击" + + MOONLIGHTDANCE = SkillRef(name='轻云出月风静夜', code='moonlightdance', profession=__profession__) + "轻云出月风静夜" + + MOONLIGHTSLASH = SkillRef(name='飞花逐月', code='moonlightslash', profession=__profession__) + "飞花逐月" + + MOUNTAINCRASH = SkillRef(name='跃空斩', code='mountaincrash', profession=__profession__) + "跃空斩" + + NEARBLOW = SkillRef(name='圆舞斩', code='nearblow', profession=__profession__) + "圆舞斩" + + OVERBLOWSLASH = SkillRef(name='乱花葬', code='overblowslash', profession=__profession__) + "乱花葬" + + RAPIDSTEP = SkillRef(name='一花渡江', code='rapidstep', profession=__profession__) + "一花渡江" + + REVOLVINGSWORD = SkillRef(name='轮回剑', code='revolvingsword', profession=__profession__) + "轮回剑" + + SIRYUN = SkillRef(name='波动斩', code='siryun', profession=__profession__) + "波动斩" + + SNAKESHADOW = SkillRef(name='疾风斩', code='snakeshadow', profession=__profession__) + "疾风斩" + + SOARCUT = SkillRef(name='樱落斩', code='soarcut', profession=__profession__) + "樱落斩" + + SPINSLASH = SkillRef(name='回旋反击', code='spinslash', profession=__profession__) + "回旋反击" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + THREEFLOWER = SkillRef(name='返本归元', code='threeflower', profession=__profession__) + "返本归元" + + THREESIDE = SkillRef(name='三才剑', code='threeside', profession=__profession__) + "三才剑" + + TWOHANDWEAPON = SkillRef(name='副武器可装备', code='twohandweapon', profession=__profession__) + "副武器可装备" + + VAGABONDSWORDMANSHIP = SkillRef(name='三才回轮剑', code='vagabondswordmanship', profession=__profession__) + "三才回轮剑" + + ZWEIVOLTAGEEX = SkillRef(name='啸空十字刃', code='zweivoltageex', profession=__profession__) + "啸空十字刃" diff --git a/backend/core/character/refs/swordman_male/__init__.py b/backend/core/character/refs/swordman_male/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/swordman_male/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/swordman_male/asura.py b/backend/core/character/refs/swordman_male/asura.py new file mode 100644 index 00000000..271938f3 --- /dev/null +++ b/backend/core/character/refs/swordman_male/asura.py @@ -0,0 +1,141 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:swordman_male/asura/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class AsuraSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """swordman_male.asura 的技能引用;包含继承的公共技能。""" + __profession__ = 'swordman_male.asura' + + ASHENFORK = SkillRef(name='银光落刃', code='ashenfork', profession=__profession__) + "银光落刃" + + BLADEMASTERY = SkillRef(name='太刀精通', code='blademastery', profession=__profession__) + "太刀精通" + + BLOODLUST = SkillRef(name='嗜魂之手', code='bloodlust', profession=__profession__) + "嗜魂之手" + + BLUNTMASTERY = SkillRef(name='钝器精通', code='bluntmastery', profession=__profession__) + "钝器精通" + + CONTEMPLATE = SkillRef(name='慧思', code='contemplate', profession=__profession__) + "慧思" + + DASHATTACKMULTIHIT = SkillRef(name='连突刺', code='dashattackmultihit', profession=__profession__) + "连突刺" + + DOTAREA = SkillRef(name='无尽波动', code='dotarea', profession=__profession__) + "无尽波动" + + EXPLOSIONOFPATH = SkillRef(name='波动慧眼 : 无为法', code='explosionofpath', profession=__profession__) + "波动慧眼 : 无为法" + + FIREWAVE = SkillRef(name='爆炎 · 波动剑', code='firewave', profession=__profession__) + "爆炎 · 波动剑" + + FIREWAVEEX = SkillRef(name='极炎 · 裂波剑', code='firewaveex', profession=__profession__) + "极炎 · 裂波剑" + + FORCEOFTHUNDERER = SkillRef(name='雷神之息', code='forceofthunderer', profession=__profession__) + "雷神之息" + + GORECROSS = SkillRef(name='十字刃', code='gorecross', profession=__profession__) + "十字刃" + + GRANDWAVE = SkillRef(name='邪光斩', code='grandwave', profession=__profession__) + "邪光斩" + + GRANDWAVECHARGE = SkillRef(name='修罗邪光斩', code='grandwavecharge', profession=__profession__) + "修罗邪光斩" + + GUARD = SkillRef(name='格挡', code='guard', profession=__profession__) + "格挡" + + HARDATTACK = SkillRef(name='鬼斩', code='hardattack', profession=__profession__) + "鬼斩" + + HEAVYSWORDMASTERY = SkillRef(name='巨剑精通', code='heavyswordmastery', profession=__profession__) + "巨剑精通" + + HOPSMASH = SkillRef(name='崩山击', code='hopsmash', profession=__profession__) + "崩山击" + + ICEWAVE = SkillRef(name='冰刃 · 波动剑', code='icewave', profession=__profession__) + "冰刃 · 波动剑" + + ICEWAVEEX = SkillRef(name='极冰 · 裂波剑', code='icewaveex', profession=__profession__) + "极冰 · 裂波剑" + + INDARAMANG = SkillRef(name='天雷 · 波动剑', code='indaramang', profession=__profession__) + "天雷 · 波动剑" + + INSIGHT = SkillRef(name='波动视界 : 慧眼', code='insight', profession=__profession__) + "波动视界 : 慧眼" + + JUMPATTACKMULTI = SkillRef(name='空之连刃', code='jumpattackmulti', profession=__profession__) + "空之连刃" + + KHAZAN = SkillRef(name='刀魂之卡赞', code='khazan', profession=__profession__) + "刀魂之卡赞" + + LIGHTNINGGOD = SkillRef(name='雷神降世 : 裁决', code='lightninggod', profession=__profession__) + "雷神降世 : 裁决" + + MINDFLASH = SkillRef(name='挫折意志', code='mindflash', profession=__profession__) + "挫折意志" + + MOONLIGHTSLASH = SkillRef(name='月光斩', code='moonlightslash', profession=__profession__) + "月光斩" + + NORMALWAVE = SkillRef(name='地裂 · 波动剑', code='normalwave', profession=__profession__) + "地裂 · 波动剑" + + REFLECTGUARD = SkillRef(name='鬼印珠', code='reflectguard', profession=__profession__) + "鬼印珠" + + RELEASEWAVE = SkillRef(name='波动爆发', code='releasewave', profession=__profession__) + "波动爆发" + + SENSEVIOLENTTEMPER = SkillRef(name='绝对感知', code='senseviolenttemper', profession=__profession__) + "绝对感知" + + SHOCKWAVEAREA = SkillRef(name='邪光波动阵', code='shockwavearea', profession=__profession__) + "邪光波动阵" + + SHORTSWORDMASTERY = SkillRef(name='短剑精通', code='shortswordmastery', profession=__profession__) + "短剑精通" + + STANDALONEWAVE = SkillRef(name='无双波', code='standalonewave', profession=__profession__) + "无双波" + + STUCKUPONCOUNTER = SkillRef(name='心眼', code='stuckuponcounter', profession=__profession__) + "心眼" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + TRIPLESLASH = SkillRef(name='三段刃', code='tripleslash', profession=__profession__) + "三段刃" + + UPPERSLASH = SkillRef(name='上挑', code='upperslash', profession=__profession__) + "上挑" + + VAJRA = SkillRef(name='天雷 · 降魔杵', code='vajra', profession=__profession__) + "天雷 · 降魔杵" + + VANESLASH = SkillRef(name='裂波斩', code='vaneslash', profession=__profession__) + "裂波斩" + + WAVEEYE = SkillRef(name='暗天波动眼', code='waveeye', profession=__profession__) + "暗天波动眼" + + WAVEMARK = SkillRef(name='波动刻印', code='wavemark', profession=__profession__) + "波动刻印" + + WAVEOFLIGHTNING = SkillRef(name='波动神诀 : 万空', code='waveoflightning', profession=__profession__) + "波动神诀 : 万空" + + WAVESPINAREA = SkillRef(name='不动明王阵', code='wavespinarea', profession=__profession__) + "不动明王阵" diff --git a/backend/core/character/refs/swordman_male/berserker.py b/backend/core/character/refs/swordman_male/berserker.py new file mode 100644 index 00000000..873f67c5 --- /dev/null +++ b/backend/core/character/refs/swordman_male/berserker.py @@ -0,0 +1,144 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:swordman_male/berserker/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class BerserkerSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """swordman_male.berserker 的技能引用;包含继承的公共技能。""" + __profession__ = 'swordman_male.berserker' + + ASHENFORK = SkillRef(name='银光落刃', code='ashenfork', profession=__profession__) + "银光落刃" + + BERSERKER = SkillRef(name='狂气涌动', code='berserker', profession=__profession__) + "狂气涌动" + + BLADEMASTERY = SkillRef(name='太刀精通', code='blademastery', profession=__profession__) + "太刀精通" + + BLEEDINGMASTERY = SkillRef(name='鲜血之忆', code='bleedingmastery', profession=__profession__) + "鲜血之忆" + + BLOODBOOM = SkillRef(name='浴血之怒', code='bloodboom', profession=__profession__) + "浴血之怒" + + BLOODINKANET = SkillRef(name='汲血之力', code='bloodinkanet', profession=__profession__) + "汲血之力" + + BLOODLUST = SkillRef(name='嗜魂之手', code='bloodlust', profession=__profession__) + "嗜魂之手" + + BLOODRIVEN = SkillRef(name='血魔 · 弑天', code='bloodriven', profession=__profession__) + "血魔 · 弑天" + + BLOODSCRATCH = SkillRef(name='狂气斩', code='bloodscratch', profession=__profession__) + "狂气斩" + + BLOODSNATCH = SkillRef(name='狂怒暴掠', code='bloodsnatch', profession=__profession__) + "狂怒暴掠" + + BLOODSWORD = SkillRef(name='爆发之刃', code='bloodsword', profession=__profession__) + "爆发之刃" + + BLOODYRAVE = SkillRef(name='嗜魂封魔斩', code='bloodyrave', profession=__profession__) + "嗜魂封魔斩" + + BLOODYVIGOROUS = SkillRef(name='血气旺盛', code='bloodyvigorous', profession=__profession__) + "血气旺盛" + + BLUNTMASTERY = SkillRef(name='钝器精通', code='bluntmastery', profession=__profession__) + "钝器精通" + + BRUTALCRUSHER = SkillRef(name='强悍碾压', code='brutalcrusher', profession=__profession__) + "强悍碾压" + + CRUELENGAGE = SkillRef(name='狂热回旋', code='cruelengage', profession=__profession__) + "狂热回旋" + + DASHATTACKMULTIHIT = SkillRef(name='连突刺', code='dashattackmultihit', profession=__profession__) + "连突刺" + + DIEHARD = SkillRef(name='死亡抗拒', code='diehard', profession=__profession__) + "死亡抗拒" + + EXTREAMBLOOD = SkillRef(name='血魔极道 : 灭世', code='extreamblood', profession=__profession__) + "血魔极道 : 灭世" + + FATALBLOOD = SkillRef(name='致命血陨', code='fatalblood', profession=__profession__) + "致命血陨" + + FRENZY = SkillRef(name='狂暴之力', code='frenzy', profession=__profession__) + "狂暴之力" + + GORECROSS = SkillRef(name='十字刃', code='gorecross', profession=__profession__) + "十字刃" + + GUARD = SkillRef(name='格挡', code='guard', profession=__profession__) + "格挡" + + HARDATTACK = SkillRef(name='鬼斩', code='hardattack', profession=__profession__) + "鬼斩" + + HEAVYSWORDMASTERY = SkillRef(name='巨剑精通', code='heavyswordmastery', profession=__profession__) + "巨剑精通" + + HELLBENTER = SkillRef(name='魔狱血刹', code='hellbenter', profession=__profession__) + "魔狱血刹" + + HOPSMASH = SkillRef(name='崩山击', code='hopsmash', profession=__profession__) + "崩山击" + + JUMPATTACKMULTI = SkillRef(name='空之连刃', code='jumpattackmulti', profession=__profession__) + "空之连刃" + + KHAZAN = SkillRef(name='刀魂之卡赞', code='khazan', profession=__profession__) + "刀魂之卡赞" + + MADNESS = SkillRef(name='狂暴血气', code='madness', profession=__profession__) + "狂暴血气" + + MERCILESSNESS = SkillRef(name='血气界限', code='mercilessness', profession=__profession__) + "血气界限" + + MOONLIGHTSLASH = SkillRef(name='月光斩', code='moonlightslash', profession=__profession__) + "月光斩" + + NORMALWAVE = SkillRef(name='地裂 · 波动剑', code='normalwave', profession=__profession__) + "地裂 · 波动剑" + + OUTRAGEBREAK = SkillRef(name='崩山裂地斩', code='outragebreak', profession=__profession__) + "崩山裂地斩" + + PINCHPOWERUP = SkillRef(name='力量唤醒', code='pinchpowerup', profession=__profession__) + "力量唤醒" + + RAGE = SkillRef(name='暴怒狂斩', code='rage', profession=__profession__) + "暴怒狂斩" + + RAGINGFURY = SkillRef(name='怒气爆发', code='ragingfury', profession=__profession__) + "怒气爆发" + + RAMPANTMADNESS = SkillRef(name='疯魔血魂斩', code='rampantmadness', profession=__profession__) + "疯魔血魂斩" + + RECKLESS = SkillRef(name='暴走', code='reckless', profession=__profession__) + "暴走" + + SACRIFICE = SkillRef(name='饥渴', code='sacrifice', profession=__profession__) + "饥渴" + + SHORTSWORDMASTERY = SkillRef(name='短剑精通', code='shortswordmastery', profession=__profession__) + "短剑精通" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + TRIPLESLASH = SkillRef(name='三段刃', code='tripleslash', profession=__profession__) + "三段刃" + + UPPERSLASH = SkillRef(name='上挑', code='upperslash', profession=__profession__) + "上挑" + + VANESLASH = SkillRef(name='裂波斩', code='vaneslash', profession=__profession__) + "裂波斩" diff --git a/backend/core/character/refs/swordman_male/ghostblade.py b/backend/core/character/refs/swordman_male/ghostblade.py new file mode 100644 index 00000000..2413c0fa --- /dev/null +++ b/backend/core/character/refs/swordman_male/ghostblade.py @@ -0,0 +1,129 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:swordman_male/ghostblade/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs + + +class GhostbladeSkillRef(CommonSkillRefs, Awakening5SkillRefs, ComboSkillRefs): + """swordman_male.ghostblade 的技能引用;包含继承的公共技能。""" + __profession__ = 'swordman_male.ghostblade' + + ASHENFORK = SkillRef(name='银光落刃', code='ashenfork', profession=__profession__) + "银光落刃" + + BLADEMASTERYBS = SkillRef(name='剑影太刀精通', code='blademasterybs', profession=__profession__) + "剑影太刀精通" + + BLADESPIRIT = SkillRef(name='鬼人化', code='bladespirit', profession=__profession__) + "鬼人化" + + BLOODLUST = SkillRef(name='嗜魂之手', code='bloodlust', profession=__profession__) + "嗜魂之手" + + BLUEFIGHTINGSPIRIT = SkillRef(name='幻鬼之力', code='bluefightingspirit', profession=__profession__) + "幻鬼之力" + + GHOSTDECOLLATION = SkillRef(name='冥灵断魂斩', code='ghostdecollation', profession=__profession__) + "冥灵断魂斩" + + GHOSTPIERCE = SkillRef(name='鬼连牙', code='ghostpierce', profession=__profession__) + "鬼连牙" + + GORECROSS = SkillRef(name='十字刃', code='gorecross', profession=__profession__) + "十字刃" + + GUARD = SkillRef(name='格挡', code='guard', profession=__profession__) + "格挡" + + HARDATTACK = SkillRef(name='鬼斩', code='hardattack', profession=__profession__) + "鬼斩" + + HELLSLASH = SkillRef(name='共鸣 : 聚渊', code='hellslash', profession=__profession__) + "共鸣 : 聚渊" + + HOPSMASH = SkillRef(name='崩山击', code='hopsmash', profession=__profession__) + "崩山击" + + INFINITYKILLING = SkillRef(name='灭魂极影剑·止煞', code='infinitykilling', profession=__profession__) + "灭魂极影剑·止煞" + + INVINCIBLESPIRIT = SkillRef(name='睥睨万物', code='invinciblespirit', profession=__profession__) + "睥睨万物" + + JUMPATTACKMULTI = SkillRef(name='空之连刃', code='jumpattackmulti', profession=__profession__) + "空之连刃" + + MOONLIGHTSLASH = SkillRef(name='月光斩', code='moonlightslash', profession=__profession__) + "月光斩" + + MOONSPIRITSLASH = SkillRef(name='共鸣 : 鬼灵斩', code='moonspiritslash', profession=__profession__) + "共鸣 : 鬼灵斩" + + NACHAL = SkillRef(name='鬼咲', code='nachal', profession=__profession__) + "鬼咲" + + NAMEOFYACHA = SkillRef(name='鬼夜', code='nameofyacha', profession=__profession__) + "鬼夜" + + NORMALWAVE = SkillRef(name='地裂 · 波动剑', code='normalwave', profession=__profession__) + "地裂 · 波动剑" + + ONESLASHVS = SkillRef(name='幻鬼 : 一闪', code='oneslashvs', profession=__profession__) + "幻鬼 : 一闪" + + RETURNSPIRITMOVE = SkillRef(name='幻鬼步', code='returnspiritmove', profession=__profession__) + "幻鬼步" + + SPEEDSLASH = SkillRef(name='鬼连击', code='speedslash', profession=__profession__) + "鬼连击" + + SPEEDSLASHUPPER = SkillRef(name='鬼连击 : 极', code='speedslashupper', profession=__profession__) + "鬼连击 : 极" + + SPEEDSLASHVS = SkillRef(name='幻鬼 : 连击', code='speedslashvs', profession=__profession__) + "幻鬼 : 连击" + + SPINNINGSLASHVS = SkillRef(name='幻鬼 : 回天', code='spinningslashvs', profession=__profession__) + "幻鬼 : 回天" + + SPIRITCONVERSION = SkillRef(name='双魂共鸣', code='spiritconversion', profession=__profession__) + "双魂共鸣" + + SPIRITCROSSSLASH = SkillRef(name='共鸣 : 离魂一闪', code='spiritcrossslash', profession=__profession__) + "共鸣 : 离魂一闪" + + SPIRITMOVE = SkillRef(name='鬼步', code='spiritmove', profession=__profession__) + "鬼步" + + SUDDENSTRIKEVS = SkillRef(name='幻鬼 : 奈落', code='suddenstrikevs', profession=__profession__) + "幻鬼 : 奈落" + + SWORDDANCEBS = SkillRef(name='裂魂乱舞', code='sworddancebs', profession=__profession__) + "裂魂乱舞" + + TEMPORARYREALIZATION5 = SkillRef(name='超卓之心', code='temporaryrealization5', profession=__profession__) + "超卓之心" + + TERRIBLEKILLING = SkillRef(name='鬼隐 · 夜奈落', code='terriblekilling', profession=__profession__) + "鬼隐 · 夜奈落" + + TRIPLESLASH = SkillRef(name='三段刃', code='tripleslash', profession=__profession__) + "三段刃" + + ULTIMATECROSSSLASH = SkillRef(name='冥夜鬼天杀', code='ultimatecrossslash', profession=__profession__) + "冥夜鬼天杀" + + UNLIMITEDSPEEDSLASHBVS = SkillRef(name='无式·极影剑', code='unlimitedspeedslashbvs', profession=__profession__) + "无式·极影剑" + + UPPERSLASH = SkillRef(name='上挑', code='upperslash', profession=__profession__) + "上挑" + + VANESLASH = SkillRef(name='裂波斩', code='vaneslash', profession=__profession__) + "裂波斩" + + WHITEGHOSTSLASH = SkillRef(name='魂破斩', code='whiteghostslash', profession=__profession__) + "魂破斩" + + WINDSPIRITVS = SkillRef(name='幻鬼 : 大回天', code='windspiritvs', profession=__profession__) + "幻鬼 : 大回天" diff --git a/backend/core/character/refs/swordman_male/soul_bender.py b/backend/core/character/refs/swordman_male/soul_bender.py new file mode 100644 index 00000000..6b7358b8 --- /dev/null +++ b/backend/core/character/refs/swordman_male/soul_bender.py @@ -0,0 +1,150 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:swordman_male/soul_bender/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class SoulBenderSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """swordman_male.soul_bender 的技能引用;包含继承的公共技能。""" + __profession__ = 'swordman_male.soul_bender' + + ASHENFORK = SkillRef(name='银光落刃', code='ashenfork', profession=__profession__) + "银光落刃" + + BLACHE = SkillRef(name='第7鬼神 : 怖拉修', code='blache', profession=__profession__) + "第7鬼神 : 怖拉修" + + BLADEMASTERY = SkillRef(name='太刀精通', code='blademastery', profession=__profession__) + "太刀精通" + + BLADEPHANTOM = SkillRef(name='幽魂之布雷德', code='bladephantom', profession=__profession__) + "幽魂之布雷德" + + BLADEPHANTOMEX = SkillRef(name='幽魂降临 : 式', code='bladephantomex', profession=__profession__) + "幽魂降临 : 式" + + BLOODLUST = SkillRef(name='嗜魂之手', code='bloodlust', profession=__profession__) + "嗜魂之手" + + BLUNTMASTERY = SkillRef(name='钝器精通', code='bluntmastery', profession=__profession__) + "钝器精通" + + BREMEN = SkillRef(name='侵蚀之普戾蒙', code='bremen', profession=__profession__) + "侵蚀之普戾蒙" + + DARKAURA = SkillRef(name='恐惧光环', code='darkaura', profession=__profession__) + "恐惧光环" + + DARKFLAMESLASH = SkillRef(name='冥炎剑', code='darkflameslash', profession=__profession__) + "冥炎剑" + + DARKFRIENDSHIP = SkillRef(name='暗之亲和', code='darkfriendship', profession=__profession__) + "暗之亲和" + + DARKTOLERANCEUP = SkillRef(name='暗月降临', code='darktoleranceup', profession=__profession__) + "暗月降临" + + DASHATTACKMULTIHIT = SkillRef(name='连突刺', code='dashattackmultihit', profession=__profession__) + "连突刺" + + DEMONICCROWN = SkillRef(name='鬼神冠冕', code='demoniccrown', profession=__profession__) + "鬼神冠冕" + + EPIDEMICRASA = SkillRef(name='瘟疫之罗刹', code='epidemicrasa', profession=__profession__) + "瘟疫之罗刹" + + GHOSTGATE = SkillRef(name='黄泉之门 : 万鬼度灵', code='ghostgate', profession=__profession__) + "黄泉之门 : 万鬼度灵" + + GHOSTPOWERUP = SkillRef(name='封印解除', code='ghostpowerup', profession=__profession__) + "封印解除" + + GHOSTSIDEWIND = SkillRef(name='鬼影鞭', code='ghostsidewind', profession=__profession__) + "鬼影鞭" + + GHOSTSOULRELEASE = SkillRef(name='鬼神解放', code='ghostsoulrelease', profession=__profession__) + "鬼神解放" + + GHOSTSTEP = SkillRef(name='残影之凯贾', code='ghoststep', profession=__profession__) + "残影之凯贾" + + GHOSTSTEPSLASH = SkillRef(name='鬼影闪', code='ghoststepslash', profession=__profession__) + "鬼影闪" + + GLUTTONYCREVASSE = SkillRef(name='鬼神剑·黄泉摆渡', code='gluttonycrevasse', profession=__profession__) + "鬼神剑·黄泉摆渡" + + GORECROSS = SkillRef(name='十字刃', code='gorecross', profession=__profession__) + "十字刃" + + GUARD = SkillRef(name='格挡', code='guard', profession=__profession__) + "格挡" + + HARDATTACK = SkillRef(name='鬼斩', code='hardattack', profession=__profession__) + "鬼斩" + + HARDATTACKCHARGE = SkillRef(name='噬灵鬼斩', code='hardattackcharge', profession=__profession__) + "噬灵鬼斩" + + HEAVYSWORDMASTERY = SkillRef(name='巨剑精通', code='heavyswordmastery', profession=__profession__) + "巨剑精通" + + HOPSMASH = SkillRef(name='崩山击', code='hopsmash', profession=__profession__) + "崩山击" + + JUMPATTACKMULTI = SkillRef(name='空之连刃', code='jumpattackmulti', profession=__profession__) + "空之连刃" + + KALLA = SkillRef(name='冥炎之卡洛', code='kalla', profession=__profession__) + "冥炎之卡洛" + + KHAZAN = SkillRef(name='刀魂之卡赞', code='khazan', profession=__profession__) + "刀魂之卡赞" + + MOONLIGHTSLASH = SkillRef(name='月光斩', code='moonlightslash', profession=__profession__) + "月光斩" + + MOONLIGHTSLASHFULL = SkillRef(name='满月斩', code='moonlightslashfull', profession=__profession__) + "满月斩" + + NECROMANTIC = SkillRef(name='湮灭仪式', code='necromantic', profession=__profession__) + "湮灭仪式" + + NORMALWAVE = SkillRef(name='地裂 · 波动剑', code='normalwave', profession=__profession__) + "地裂 · 波动剑" + + PHANTOMMASTERY = SkillRef(name='御鬼之极', code='phantommastery', profession=__profession__) + "御鬼之极" + + SAYA = SkillRef(name='冰霜之萨亚', code='saya', profession=__profession__) + "冰霜之萨亚" + + SHORTSWORDMASTERY = SkillRef(name='短剑精通', code='shortswordmastery', profession=__profession__) + "短剑精通" + + SLASHOFBOOM = SkillRef(name='鬼斩 : 狂怒', code='slashofboom', profession=__profession__) + "鬼斩 : 狂怒" + + SLASHOFHELL = SkillRef(name='鬼斩 : 炼狱', code='slashofhell', profession=__profession__) + "鬼斩 : 炼狱" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + TOMBSTONERAIN = SkillRef(name='死亡墓碑', code='tombstonerain', profession=__profession__) + "死亡墓碑" + + TOMBSTONESWAMP = SkillRef(name='冥祭之沼', code='tombstoneswamp', profession=__profession__) + "冥祭之沼" + + TRIPLESLASH = SkillRef(name='三段刃', code='tripleslash', profession=__profession__) + "三段刃" + + UPPERSLASH = SkillRef(name='上挑', code='upperslash', profession=__profession__) + "上挑" + + VANESLASH = SkillRef(name='裂波斩', code='vaneslash', profession=__profession__) + "裂波斩" + + ZIGADVENT = SkillRef(name='王者号令 : 吉格降临', code='zigadvent', profession=__profession__) + "王者号令 : 吉格降临" diff --git a/backend/core/character/refs/swordman_male/weapon_master.py b/backend/core/character/refs/swordman_male/weapon_master.py new file mode 100644 index 00000000..efe9cb16 --- /dev/null +++ b/backend/core/character/refs/swordman_male/weapon_master.py @@ -0,0 +1,162 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:swordman_male/weapon_master/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class WeaponMasterSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """swordman_male.weapon_master 的技能引用;包含继承的公共技能。""" + __profession__ = 'swordman_male.weapon_master' + + ASHENFORK = SkillRef(name='银光落刃', code='ashenfork', profession=__profession__) + "银光落刃" + + AUTOGUARD = SkillRef(name='自动格挡', code='autoguard', profession=__profession__) + "自动格挡" + + BACKSTEPCUTTER = SkillRef(name='后跳斩', code='backstepcutter', profession=__profession__) + "后跳斩" + + BLADEMASTERY = SkillRef(name='太刀精通', code='blademastery', profession=__profession__) + "太刀精通" + + BLOODLUST = SkillRef(name='嗜魂之手', code='bloodlust', profession=__profession__) + "嗜魂之手" + + BLUNTMASTERY = SkillRef(name='钝器精通', code='bluntmastery', profession=__profession__) + "钝器精通" + + CERTAINEXTERMINATION = SkillRef(name='万剑极诣·开天斩', code='certainextermination', profession=__profession__) + "万剑极诣·开天斩" + + CHARGEBURST = SkillRef(name='破军斩龙击', code='chargeburst', profession=__profession__) + "破军斩龙击" + + CHARGECRASH = SkillRef(name='破军升龙击', code='chargecrash', profession=__profession__) + "破军升龙击" + + DASHATTACKMULTIHIT = SkillRef(name='连突刺', code='dashattackmultihit', profession=__profession__) + "连突刺" + + DEFENSEDOWNONCRITICAL = SkillRef(name='极 · 鬼剑术 (斩铁式)', code='defensedownoncritical', profession=__profession__) + "极 · 鬼剑术 (斩铁式)" + + EQUIPLIGHTSWORD = SkillRef(name='光剑掌握', code='equiplightsword', profession=__profession__) + "光剑掌握" + + FARTHERHIT = SkillRef(name='无我剑气', code='fartherhit', profession=__profession__) + "无我剑气" + + FASTEQUIP = SkillRef(name='疾影手', code='fastequip', profession=__profession__) + "疾影手" + + FLASHCUT = SkillRef(name='极 · 神剑术 (瞬斩)', code='flashcut', profession=__profession__) + "极 · 神剑术 (瞬斩)" + + FLOWMIND = SkillRef(name='流心', code='flowmind', profession=__profession__) + "流心" + + FLOWMINDONE = SkillRef(name='流心 : 刺', code='flowmindone', profession=__profession__) + "流心 : 刺" + + FLOWMINDPOWERUP = SkillRef(name='流心 : 狂', code='flowmindpowerup', profession=__profession__) + "流心 : 狂" + + FLOWMINDTHREE = SkillRef(name='流心 : 升', code='flowmindthree', profession=__profession__) + "流心 : 升" + + FLOWMINDTWO = SkillRef(name='流心 : 跃', code='flowmindtwo', profession=__profession__) + "流心 : 跃" + + GORECROSS = SkillRef(name='十字刃', code='gorecross', profession=__profession__) + "十字刃" + + GUARD = SkillRef(name='格挡', code='guard', profession=__profession__) + "格挡" + + HANDLINGSWORD = SkillRef(name='万剑归宗', code='handlingsword', profession=__profession__) + "万剑归宗" + + HARDATTACK = SkillRef(name='鬼斩', code='hardattack', profession=__profession__) + "鬼斩" + + HEAVYSWORDMASTERY = SkillRef(name='巨剑精通', code='heavyswordmastery', profession=__profession__) + "巨剑精通" + + HITBACK = SkillRef(name='逆转反击', code='hitback', profession=__profession__) + "逆转反击" + + HOPSMASH = SkillRef(name='崩山击', code='hopsmash', profession=__profession__) + "崩山击" + + HUNDREDSWORD = SkillRef(name='极 · 鬼剑术 (暴风式)', code='hundredsword', profession=__profession__) + "极 · 鬼剑术 (暴风式)" + + ILLUSIONSLASH = SkillRef(name='幻影剑舞', code='illusionslash', profession=__profession__) + "幻影剑舞" + + INVISIBLESWORDCUT = SkillRef(name='极 · 神剑术 (无形斩)', code='invisibleswordcut', profession=__profession__) + "极 · 神剑术 (无形斩)" + + JUMPATTACKMULTI = SkillRef(name='空之连刃', code='jumpattackmulti', profession=__profession__) + "空之连刃" + + KHAZAN = SkillRef(name='刀魂之卡赞', code='khazan', profession=__profession__) + "刀魂之卡赞" + + LIGHTSWORDMASTERY = SkillRef(name='光剑精通', code='lightswordmastery', profession=__profession__) + "光剑精通" + + METEORSWORD = SkillRef(name='极 · 神剑术 (流星落)', code='meteorsword', profession=__profession__) + "极 · 神剑术 (流星落)" + + MOMENTARYSLASH = SkillRef(name='拔刀斩', code='momentaryslash', profession=__profession__) + "拔刀斩" + + MOMENTARYSLASHEX = SkillRef(name='破空拔刀斩', code='momentaryslashex', profession=__profession__) + "破空拔刀斩" + + MOONLIGHTSLASH = SkillRef(name='月光斩', code='moonlightslash', profession=__profession__) + "月光斩" + + MYSTICEQUIP = SkillRef(name='神影手', code='mysticequip', profession=__profession__) + "神影手" + + NORMALWAVE = SkillRef(name='地裂 · 波动剑', code='normalwave', profession=__profession__) + "地裂 · 波动剑" + + OVERDRIVE = SkillRef(name='破极兵刃', code='overdrive', profession=__profession__) + "破极兵刃" + + RAPIDMOVESLASH = SkillRef(name='猛龙断空斩', code='rapidmoveslash', profession=__profession__) + "猛龙断空斩" + + SHORTSWORDMASTERY = SkillRef(name='短剑精通', code='shortswordmastery', profession=__profession__) + "短剑精通" + + STATEOFINVISIBLESWORD = SkillRef(name='无形剑意', code='stateofinvisiblesword', profession=__profession__) + "无形剑意" + + STATEOFLIMIT = SkillRef(name='极 · 神剑术', code='stateoflimit', profession=__profession__) + "极 · 神剑术" + + SWORDOFMIND = SkillRef(name='极 · 神剑术 (破空斩)', code='swordofmind', profession=__profession__) + "极 · 神剑术 (破空斩)" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + TRIPLESLASH = SkillRef(name='三段刃', code='tripleslash', profession=__profession__) + "三段刃" + + UPPERSLASH = SkillRef(name='上挑', code='upperslash', profession=__profession__) + "上挑" + + VANESLASH = SkillRef(name='裂波斩', code='vaneslash', profession=__profession__) + "裂波斩" + + WEAPONCOMBO = SkillRef(name='里 · 鬼剑术', code='weaponcombo', profession=__profession__) + "里 · 鬼剑术" + + WEAPONMASTERYUP = SkillRef(name='武器奥义', code='weaponmasteryup', profession=__profession__) + "武器奥义" diff --git a/backend/core/character/refs/thief/__init__.py b/backend/core/character/refs/thief/__init__.py new file mode 100644 index 00000000..f802cced --- /dev/null +++ b/backend/core/character/refs/thief/__init__.py @@ -0,0 +1,2 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""职业技能引用分组;按需导入具体职业。""" diff --git a/backend/core/character/refs/thief/kunoichi.py b/backend/core/character/refs/thief/kunoichi.py new file mode 100644 index 00000000..6006cc54 --- /dev/null +++ b/backend/core/character/refs/thief/kunoichi.py @@ -0,0 +1,144 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:thief/kunoichi/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs + + +class KunoichiSkillRef(CommonSkillRefs, Awakening3SkillRefs, ComboSkillRefs): + """thief.kunoichi 的技能引用;包含继承的公共技能。""" + __profession__ = 'thief.kunoichi' + + AERIALJUMP = SkillRef(name='空跃', code='aerialjump', profession=__profession__) + "空跃" + + AMATERAS = SkillRef(name='天照', code='amateras', profession=__profession__) + "天照" + + ANKLECUT = SkillRef(name='碎踝', code='anklecut', profession=__profession__) + "碎踝" + + BIGKUNAI = SkillRef(name='火遁·螺旋手里剑', code='bigkunai', profession=__profession__) + "火遁·螺旋手里剑" + + BONESHIELD = SkillRef(name='骨盾', code='boneshield', profession=__profession__) + "骨盾" + + CHAKRATRINITY = SkillRef(name='三元刹', code='chakratrinity', profession=__profession__) + "三元刹" + + CURSESPEAR = SkillRef(name='诅咒之箭', code='cursespear', profession=__profession__) + "诅咒之箭" + + DARKSOUL = SkillRef(name='暗魂波', code='darksoul', profession=__profession__) + "暗魂波" + + DEITIESREBIRTH = SkillRef(name='忍法 : 六道轮回', code='deitiesrebirth', profession=__profession__) + "忍法 : 六道轮回" + + DIVINGARROW = SkillRef(name='疾空踏', code='divingarrow', profession=__profession__) + "疾空踏" + + DOOMFIELD = SkillRef(name='火遁·冥炎业火阵', code='doomfield', profession=__profession__) + "火遁·冥炎业火阵" + + EQUIPCHAKRAWEAPON = SkillRef(name='苦无掌握', code='equipchakraweapon', profession=__profession__) + "苦无掌握" + + ERASER = SkillRef(name='天诛', code='eraser', profession=__profession__) + "天诛" + + FIREHIDE = SkillRef(name='火遁·红莲', code='firehide', profession=__profession__) + "火遁·红莲" + + FIREMARK = SkillRef(name='毕方之印', code='firemark', profession=__profession__) + "毕方之印" + + FLAMEBALL = SkillRef(name='火遁·豪火球之术', code='flameball', profession=__profession__) + "火遁·豪火球之术" + + FLAMECUT = SkillRef(name='焰刃', code='flamecut', profession=__profession__) + "焰刃" + + FLAMEFLOWER = SkillRef(name='火遁·炎舞天璇', code='flameflower', profession=__profession__) + "火遁·炎舞天璇" + + FLAMETORNADO = SkillRef(name='火遁·飓风煞', code='flametornado', profession=__profession__) + "火遁·飓风煞" + + FLYINGSQUIRREL = SkillRef(name='忍法 : 飞鼠', code='flyingsquirrel', profession=__profession__) + "忍法 : 飞鼠" + + FLYINGSWALLOW = SkillRef(name='忍法 : 飞燕手里剑', code='flyingswallow', profession=__profession__) + "忍法 : 飞燕手里剑" + + FUUMASHURIKEN = SkillRef(name='火遁·风魔手里剑', code='fuumashuriken', profession=__profession__) + "火遁·风魔手里剑" + + GASOLINEFIRE = SkillRef(name='火遁·蟾蜍油炎弹', code='gasolinefire', profession=__profession__) + "火遁·蟾蜍油炎弹" + + ILUSIONSHURIKEN = SkillRef(name='忍法 : 幻影手里剑', code='ilusionshuriken', profession=__profession__) + "忍法 : 幻影手里剑" + + JADEKAMAITACHI = SkillRef(name='勾玉之火 : 镰鼬', code='jadekamaitachi', profession=__profession__) + "勾玉之火 : 镰鼬" + + KUROKAGENOJUTSU = SkillRef(name='暗炎残星', code='kurokagenojutsu', profession=__profession__) + "暗炎残星" + + KURVEJADE = SkillRef(name='八尺琼勾玉', code='kurvejade', profession=__profession__) + "八尺琼勾玉" + + LEAVETRACE = SkillRef(name='忍法 : 残影术', code='leavetrace', profession=__profession__) + "忍法 : 残影术" + + MARKOFFLAME = SkillRef(name='烈焰印记', code='markofflame', profession=__profession__) + "烈焰印记" + + MIGAWARI = SkillRef(name='忍法 : 替身术', code='migawari', profession=__profession__) + "忍法 : 替身术" + + MIRROROFYATA = SkillRef(name='八咫镜', code='mirrorofyata', profession=__profession__) + "八咫镜" + + NINJUTSU = SkillRef(name='忍术精通', code='ninjutsu', profession=__profession__) + "忍术精通" + + RISINGCUT = SkillRef(name='翔击', code='risingcut', profession=__profession__) + "翔击" + + SHADOWCUT = SkillRef(name='影袭', code='shadowcut', profession=__profession__) + "影袭" + + SHININGCUT = SkillRef(name='弧光闪', code='shiningcut', profession=__profession__) + "弧光闪" + + SHURIKEN = SkillRef(name='投掷苦无', code='shuriken', profession=__profession__) + "投掷苦无" + + SHURIKENIMPROVE = SkillRef(name='苦无精通', code='shurikenimprove', profession=__profession__) + "苦无精通" + + SKINTAKEOFF = SkillRef(name='忍法 : 影分身', code='skintakeoff', profession=__profession__) + "忍法 : 影分身" + + SKYROADS = SkillRef(name='火遁·炎天道', code='skyroads', profession=__profession__) + "火遁·炎天道" + + SLICER = SkillRef(name='切割', code='slicer', profession=__profession__) + "切割" + + SWORDOFKUSANAGI = SkillRef(name='火炎灼空 : 草雉剑', code='swordofkusanagi', profession=__profession__) + "火炎灼空 : 草雉剑" + + TEMPORARYREALIZATION3 = SkillRef(name='超卓之心', code='temporaryrealization3', profession=__profession__) + "超卓之心" + + WOODMOVE = SkillRef(name='忍法 : 原木分身术', code='woodmove', profession=__profession__) + "忍法 : 原木分身术" + + YAMATAOROCHI = SkillRef(name='八岐大蛇', code='yamataorochi', profession=__profession__) + "八岐大蛇" + + YATAGARASU = SkillRef(name='火源限界·八咫乌', code='yatagarasu', profession=__profession__) + "火源限界·八咫乌" diff --git a/backend/core/character/refs/thief/necro.py b/backend/core/character/refs/thief/necro.py new file mode 100644 index 00000000..3df60f81 --- /dev/null +++ b/backend/core/character/refs/thief/necro.py @@ -0,0 +1,147 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:thief/necro/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs + + +class NecroSkillRef(CommonSkillRefs, Awakening2SkillRefs, ComboSkillRefs): + """thief.necro 的技能引用;包含继承的公共技能。""" + __profession__ = 'thief.necro' + + AMBITIONOFBALLACRE = SkillRef(name='巴拉克的野心', code='ambitionofballacre', profession=__profession__) + "巴拉克的野心" + + ANKLECUT = SkillRef(name='碎踝', code='anklecut', profession=__profession__) + "碎踝" + + APPORTBALLACRE = SkillRef(name='降临 : 暴君巴拉克', code='apportballacre', profession=__profession__) + "降临 : 暴君巴拉克" + + BALLACREADVENT = SkillRef(name='亡者君临 : 巴拉克之戮', code='ballacreadvent', profession=__profession__) + "亡者君临 : 巴拉克之戮" + + BALLACRESTRONGATTACK = SkillRef(name='巴拉克强击', code='ballacrestrongattack', profession=__profession__) + "巴拉克强击" + + BLAMEOFDEAD = SkillRef(name='复苏者之怨', code='blameofdead', profession=__profession__) + "复苏者之怨" + + BLAMEOFDEADEX = SkillRef(name='复苏者之缚', code='blameofdeadex', profession=__profession__) + "复苏者之缚" + + BONESHIELD = SkillRef(name='骨盾', code='boneshield', profession=__profession__) + "骨盾" + + COCONOFUNDEAD = SkillRef(name='亡者之茧', code='coconofundead', profession=__profession__) + "亡者之茧" + + CURSESPEAR = SkillRef(name='诅咒之箭', code='cursespear', profession=__profession__) + "诅咒之箭" + + DARKLURE = SkillRef(name='百鬼夜行', code='darklure', profession=__profession__) + "百鬼夜行" + + DARKNAIL = SkillRef(name='毁灭之爪', code='darknail', profession=__profession__) + "毁灭之爪" + + DARKRITUAL = SkillRef(name='暗黑仪式', code='darkritual', profession=__profession__) + "暗黑仪式" + + DARKSOUL = SkillRef(name='暗魂波', code='darksoul', profession=__profession__) + "暗魂波" + + DIVINGARROW = SkillRef(name='疾空踏', code='divingarrow', profession=__profession__) + "疾空踏" + + ERASER = SkillRef(name='天诛', code='eraser', profession=__profession__) + "天诛" + + EXECUTIONERSLASH = SkillRef(name='暴君湮灭斩', code='executionerslash', profession=__profession__) + "暴君湮灭斩" + + FEAROFBALLACRE = SkillRef(name='无形之惧', code='fearofballacre', profession=__profession__) + "无形之惧" + + FLAMECUT = SkillRef(name='焰刃', code='flamecut', profession=__profession__) + "焰刃" + + FLYINGSQUIRREL = SkillRef(name='忍法 : 飞鼠', code='flyingsquirrel', profession=__profession__) + "忍法 : 飞鼠" + + GRABCOLLAR = SkillRef(name='暗击拳', code='grabcollar', profession=__profession__) + "暗击拳" + + GRIMGRIMOIRE = SkillRef(name='黑魔法书 : 亡者之魂', code='grimgrimoire', profession=__profession__) + "黑魔法书 : 亡者之魂" + + GUILLOTINE = SkillRef(name='巴拉克的愤怒', code='guillotine', profession=__profession__) + "巴拉克的愤怒" + + HATEFULGHOST = SkillRef(name='怨噬之沼', code='hatefulghost', profession=__profession__) + "怨噬之沼" + + HORROROFMOROS = SkillRef(name='命运殇痕·摩罗斯之咒', code='horrorofmoros', profession=__profession__) + "命运殇痕·摩罗斯之咒" + + KEYOFACERON = SkillRef(name='冥河之钥', code='keyofaceron', profession=__profession__) + "冥河之钥" + + LIVINGDEAD = SkillRef(name='降临 : 莱迪娅', code='livingdead', profession=__profession__) + "降临 : 莱迪娅" + + MADNESSBALLACRE = SkillRef(name='狂野乱舞', code='madnessballacre', profession=__profession__) + "狂野乱舞" + + NICOLASBEHAVIOR = SkillRef(name='服从', code='nicolasbehavior', profession=__profession__) + "服从" + + NICOLASBLACKARACHNIA = SkillRef(name='暗黑蛛丝引', code='nicolasblackarachnia', profession=__profession__) + "暗黑蛛丝引" + + NICOLASBLACKAREA = SkillRef(name='暗影蛛丝阵', code='nicolasblackarea', profession=__profession__) + "暗影蛛丝阵" + + NICOLASBLACKWAVE = SkillRef(name='吸影暗劲波', code='nicolasblackwave', profession=__profession__) + "吸影暗劲波" + + NICOLASSUMMONZOMBIE = SkillRef(name='驱使枯灵', code='nicolassummonzombie', profession=__profession__) + "驱使枯灵" + + PHANTOMSTROM = SkillRef(name='千魂祭', code='phantomstrom', profession=__profession__) + "千魂祭" + + RINGOFDARKNESS = SkillRef(name='黑暗之环', code='ringofdarkness', profession=__profession__) + "黑暗之环" + + RISINGCUT = SkillRef(name='翔击', code='risingcut', profession=__profession__) + "翔击" + + SACRIFICIALPACT = SkillRef(name='巴拉克的盟约', code='sacrificialpact', profession=__profession__) + "巴拉克的盟约" + + SHADOWCUT = SkillRef(name='影袭', code='shadowcut', profession=__profession__) + "影袭" + + SHININGCUT = SkillRef(name='弧光闪', code='shiningcut', profession=__profession__) + "弧光闪" + + SHURIKEN = SkillRef(name='投掷苦无', code='shuriken', profession=__profession__) + "投掷苦无" + + SKINTAKEOFF = SkillRef(name='忍法 : 影分身', code='skintakeoff', profession=__profession__) + "忍法 : 影分身" + + SLICER = SkillRef(name='切割', code='slicer', profession=__profession__) + "切割" + + SUMMONNICOLAS = SkillRef(name='降临 : 尼古拉斯', code='summonnicolas', profession=__profession__) + "降临 : 尼古拉斯" + + TEMPORARYREALIZATION2 = SkillRef(name='超卓之心', code='temporaryrealization2', profession=__profession__) + "超卓之心" + + UNHOLYAURA = SkillRef(name='亡魂之息', code='unholyaura', profession=__profession__) + "亡魂之息" + + WANDMASTERY = SkillRef(name='手杖精通', code='wandmastery', profession=__profession__) + "手杖精通" diff --git a/backend/core/character/refs/thief/rogue.py b/backend/core/character/refs/thief/rogue.py new file mode 100644 index 00000000..19724813 --- /dev/null +++ b/backend/core/character/refs/thief/rogue.py @@ -0,0 +1,144 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:thief/rogue/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs + + +class RogueSkillRef(CommonSkillRefs, Awakening1SkillRefs, ComboSkillRefs): + """thief.rogue 的技能引用;包含继承的公共技能。""" + __profession__ = 'thief.rogue' + + ADESPHANTOM = SkillRef(name='影·万古星辰', code='adesphantom', profession=__profession__) + "影·万古星辰" + + AERIALJUMP = SkillRef(name='空跃', code='aerialjump', profession=__profession__) + "空跃" + + ANKLECUT = SkillRef(name='碎踝', code='anklecut', profession=__profession__) + "碎踝" + + BONESHIELD = SkillRef(name='骨盾', code='boneshield', profession=__profession__) + "骨盾" + + BREAKINGRUSH = SkillRef(name='疾驰', code='breakingrush', profession=__profession__) + "疾驰" + + CHAINSAW = SkillRef(name='旋刃', code='chainsaw', profession=__profession__) + "旋刃" + + CHAINSAWEX = SkillRef(name='旋刃冲击', code='chainsawex', profession=__profession__) + "旋刃冲击" + + CURSESPEAR = SkillRef(name='诅咒之箭', code='cursespear', profession=__profession__) + "诅咒之箭" + + DARKSOUL = SkillRef(name='暗魂波', code='darksoul', profession=__profession__) + "暗魂波" + + DEATHHURRICANE = SkillRef(name='死亡风暴', code='deathhurricane', profession=__profession__) + "死亡风暴" + + DISTRIBUTION = SkillRef(name='月影突袭', code='distribution', profession=__profession__) + "月影突袭" + + DIVINGARROW = SkillRef(name='疾空踏', code='divingarrow', profession=__profession__) + "疾空踏" + + DOUBLEPIERCE = SkillRef(name='双刃穿刺', code='doublepierce', profession=__profession__) + "双刃穿刺" + + ERASER = SkillRef(name='天诛', code='eraser', profession=__profession__) + "天诛" + + EXCELSTRIKE = SkillRef(name='绝境瞬狱袭', code='excelstrike', profession=__profession__) + "绝境瞬狱袭" + + EXOTICRAMPANT = SkillRef(name='乱空杀', code='exoticrampant', profession=__profession__) + "乱空杀" + + FLAMECUT = SkillRef(name='焰刃', code='flamecut', profession=__profession__) + "焰刃" + + FLYINGSQUIRREL = SkillRef(name='忍法 : 飞鼠', code='flyingsquirrel', profession=__profession__) + "忍法 : 飞鼠" + + HITBLEED = SkillRef(name='极限追击', code='hitbleed', profession=__profession__) + "极限追击" + + HITEND = SkillRef(name='终结之击', code='hitend', profession=__profession__) + "终结之击" + + HURRICANE = SkillRef(name='剑刃风暴', code='hurricane', profession=__profession__) + "剑刃风暴" + + LIGHTNINGARROW = SkillRef(name='雷光刃影', code='lightningarrow', profession=__profession__) + "雷光刃影" + + MOMENTPANIC = SkillRef(name='绝命时刻', code='momentpanic', profession=__profession__) + "绝命时刻" + + MOONARC = SkillRef(name='月弧', code='moonarc', profession=__profession__) + "月弧" + + NOVAREMNANT = SkillRef(name='天渊星狱', code='novaremnant', profession=__profession__) + "天渊星狱" + + RISINGCUT = SkillRef(name='翔击', code='risingcut', profession=__profession__) + "翔击" + + ROGUEWEAPONRMASTERY = SkillRef(name='暗星武器精通', code='rogueweaponrmastery', profession=__profession__) + "暗星武器精通" + + SHADOWCUT = SkillRef(name='影袭', code='shadowcut', profession=__profession__) + "影袭" + + SHAKEDOWN = SkillRef(name='暗掠', code='shakedown', profession=__profession__) + "暗掠" + + SHININGCUT = SkillRef(name='弧光闪', code='shiningcut', profession=__profession__) + "弧光闪" + + SHININGCUTAERIAL = SkillRef(name='弧光连闪', code='shiningcutaerial', profession=__profession__) + "弧光连闪" + + SHURIKEN = SkillRef(name='投掷苦无', code='shuriken', profession=__profession__) + "投掷苦无" + + SIDESTEP = SkillRef(name='侧步', code='sidestep', profession=__profession__) + "侧步" + + SILVERSTREAM = SkillRef(name='月轮舞', code='silverstream', profession=__profession__) + "月轮舞" + + SKINTAKEOFF = SkillRef(name='忍法 : 影分身', code='skintakeoff', profession=__profession__) + "忍法 : 影分身" + + SLICER = SkillRef(name='切割', code='slicer', profession=__profession__) + "切割" + + SONICASSAULT = SkillRef(name='疾风乱舞', code='sonicassault', profession=__profession__) + "疾风乱舞" + + STREAMCLOSER = SkillRef(name='月舞终结', code='streamcloser', profession=__profession__) + "月舞终结" + + SWIFT = SkillRef(name='迅影', code='swift', profession=__profession__) + "迅影" + + SWORDDANCE = SkillRef(name='旋舞斩', code='sworddance', profession=__profession__) + "旋舞斩" + + TEMPORARYREALIZATION1 = SkillRef(name='超卓之心', code='temporaryrealization1', profession=__profession__) + "超卓之心" + + VANDITCUT = SkillRef(name='绝心击', code='vanditcut', profession=__profession__) + "绝心击" + + VANISHINGILLUSION = SkillRef(name='幻灭瞬杀', code='vanishingillusion', profession=__profession__) + "幻灭瞬杀" + + VERTICALSPIRAL = SkillRef(name='螺旋穿刺', code='verticalspiral', profession=__profession__) + "螺旋穿刺" + + VERTICALSPIRALEX = SkillRef(name='陨落螺旋刺', code='verticalspiralex', profession=__profession__) + "陨落螺旋刺" diff --git a/backend/core/character/refs/thief/shadow_dancer.py b/backend/core/character/refs/thief/shadow_dancer.py new file mode 100644 index 00000000..a8fa4d59 --- /dev/null +++ b/backend/core/character/refs/thief/shadow_dancer.py @@ -0,0 +1,129 @@ +# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。 +"""技能引用来源:thief/shadow_dancer/skill_tree.json;公共技能继承自 common.py 中的适用分组。""" +from core.character.refs.base import SkillRef +from core.character.refs.common import CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs + + +class ShadowDancerSkillRef(CommonSkillRefs, Awakening4SkillRefs, ComboSkillRefs): + """thief.shadow_dancer 的技能引用;包含继承的公共技能。""" + __profession__ = 'thief.shadow_dancer' + + ANKLECUT = SkillRef(name='碎踝', code='anklecut', profession=__profession__) + "碎踝" + + ASSASINSATTITUDE = SkillRef(name='潜行信条', code='assasinsattitude', profession=__profession__) + "潜行信条" + + ASSASSINATION = SkillRef(name='瞬袭', code='assassination', profession=__profession__) + "瞬袭" + + ASSASSINATIONSKILL = SkillRef(name='潜行教义', code='assassinationskill', profession=__profession__) + "潜行教义" + + BEHINDATTACK = SkillRef(name='潜行之心', code='behindattack', profession=__profession__) + "潜行之心" + + BLADEGUST = SkillRef(name='刃舞', code='bladegust', profession=__profession__) + "刃舞" + + BONESHIELD = SkillRef(name='骨盾', code='boneshield', profession=__profession__) + "骨盾" + + CARDIOCLASIS = SkillRef(name='穿心', code='cardioclasis', profession=__profession__) + "穿心" + + CHAINREACTION = SkillRef(name='幽冥链狱 : 瞬逝', code='chainreaction', profession=__profession__) + "幽冥链狱 : 瞬逝" + + COVERTACTION = SkillRef(name='潜影刺击', code='covertaction', profession=__profession__) + "潜影刺击" + + CURSESPEAR = SkillRef(name='诅咒之箭', code='cursespear', profession=__profession__) + "诅咒之箭" + + CUTTINGNECK = SkillRef(name='撕裂', code='cuttingneck', profession=__profession__) + "撕裂" + + DANCEOFGRIMREAPER = SkillRef(name='死亡连舞', code='danceofgrimreaper', profession=__profession__) + "死亡连舞" + + DARKSOUL = SkillRef(name='暗魂波', code='darksoul', profession=__profession__) + "暗魂波" + + DIVINGARROW = SkillRef(name='疾空踏', code='divingarrow', profession=__profession__) + "疾空踏" + + ERASER = SkillRef(name='天诛', code='eraser', profession=__profession__) + "天诛" + + EXTRACTHEART = SkillRef(name='摧心', code='extractheart', profession=__profession__) + "摧心" + + FINALDESTRUCTION = SkillRef(name='影戮', code='finaldestruction', profession=__profession__) + "影戮" + + FLAMECUT = SkillRef(name='焰刃', code='flamecut', profession=__profession__) + "焰刃" + + FLYINGSQUIRREL = SkillRef(name='忍法 : 飞鼠', code='flyingsquirrel', profession=__profession__) + "忍法 : 飞鼠" + + GOTOHELL = SkillRef(name='追袭', code='gotohell', profession=__profession__) + "追袭" + + HOLDUP = SkillRef(name='挑空', code='holdup', profession=__profession__) + "挑空" + + MENACINGSEIZE = SkillRef(name='影缚追魂锁', code='menacingseize', profession=__profession__) + "影缚追魂锁" + + POINTEDKNIFE = SkillRef(name='潜行之匕首精通', code='pointedknife', profession=__profession__) + "潜行之匕首精通" + + RISINGCUT = SkillRef(name='翔击', code='risingcut', profession=__profession__) + "翔击" + + RULEOFSHADOW = SkillRef(name='暗影禁忌', code='ruleofshadow', profession=__profession__) + "暗影禁忌" + + SHADOWCUT = SkillRef(name='影袭', code='shadowcut', profession=__profession__) + "影袭" + + SHADOWDANCING = SkillRef(name='潜行领域', code='shadowdancing', profession=__profession__) + "潜行领域" + + SHADOWFAKE = SkillRef(name='影遁', code='shadowfake', profession=__profession__) + "影遁" + + SHADOWLESS = SkillRef(name='无间影狱·噬灭', code='shadowless', profession=__profession__) + "无间影狱·噬灭" + + SHADOWMOVE = SkillRef(name='追影步', code='shadowmove', profession=__profession__) + "追影步" + + SHADOWPIERCE = SkillRef(name='绝境飞刃', code='shadowpierce', profession=__profession__) + "绝境飞刃" + + SHADOWSTING = SkillRef(name='八荒影杀', code='shadowsting', profession=__profession__) + "八荒影杀" + + SHININGCUT = SkillRef(name='弧光闪', code='shiningcut', profession=__profession__) + "弧光闪" + + SHURIKEN = SkillRef(name='投掷苦无', code='shuriken', profession=__profession__) + "投掷苦无" + + SKINTAKEOFF = SkillRef(name='忍法 : 影分身', code='skintakeoff', profession=__profession__) + "忍法 : 影分身" + + SLICER = SkillRef(name='切割', code='slicer', profession=__profession__) + "切割" + + TEMPORARYREALIZATION4 = SkillRef(name='超卓之心', code='temporaryrealization4', profession=__profession__) + "超卓之心" + + VEILEDATTACK = SkillRef(name='潜行之袭', code='veiledattack', profession=__profession__) + "潜行之袭" + + ZETSUEI = SkillRef(name='影斩·乱舞', code='zetsuei', profession=__profession__) + "影斩·乱舞" diff --git a/backend/openapi b/backend/openapi index d7eee839..b47f2091 160000 --- a/backend/openapi +++ b/backend/openapi @@ -1 +1 @@ -Subproject commit d7eee839430a3eaa5587969b435a2d006cfd5dc4 +Subproject commit b47f2091f74e6db16d4430250c0733d985a52a83 diff --git a/backend/tests/smoke/test_calc_availability.py b/backend/tests/smoke/test_calc_availability.py index 07474615..bfef0360 100644 --- a/backend/tests/smoke/test_calc_availability.py +++ b/backend/tests/smoke/test_calc_availability.py @@ -102,3 +102,50 @@ def test_all_equipment_can_calculate_when_equipped_once(equ, part, minimal_calc_ assert character is not None _assert_calc_result_shape(character.calc(config)) + + +@pytest.mark.parametrize('vp', [0, 1, 2]) +@pytest.mark.parametrize('alter', _character_params()) +def test_all_gf_learned_skill_results_ignore_configuration_order(alter, vp, minimal_calc_config): + """Exercise real profession rules, including every VP-dependent effect.""" + from copy import deepcopy + from random import Random + + probe = createCharacter(alter, '0') + values = [ + (str(skill.id), {'lv': skill.calculate_lv(), 'vp': vp, 'up': 0}) + for skill in sorted(probe.skills, key=lambda item: item.id) + ] + shuffled = values.copy() + Random(42).shuffle(shuffled) + results = [] + for ordered in (values, values[::-1], shuffled): + config = deepcopy(minimal_calc_config) + config['skills'] = dict(ordered) + config['skillShortcuts'] = {'combos': [[] for _ in range(6)]} + result = createCharacter(alter, '0').calc(config) + result.pop('uuid') + results.append(result) + assert results[0] == results[1] == results[2] + + +@pytest.mark.parametrize('alter', _character_params()) +def test_learned_skills_with_weapon_ignore_configuration_order(alter, minimal_calc_config): + from copy import deepcopy + + probe = createCharacter(alter, '0') + weapon = next( + equ for equ in get_equipment('0').equs + if equ.itemType == '武器' and equ.itemDetailType in probe.武器选项 + ) + values = [(str(skill.id), {'lv': skill.calculate_lv(), 'vp': 2, 'up': 0}) for skill in probe.skills] + results = [] + for ordered in (values, values[::-1]): + config = deepcopy(minimal_calc_config) + config['equips']['武器']['id'] = weapon.id + config['skills'] = dict(ordered) + config['skillShortcuts'] = {'combos': [[] for _ in range(6)]} + result = createCharacter(alter, '0').calc(config) + result.pop('uuid') + results.append(result) + assert results[0] == results[1] diff --git a/backend/tests/unit/test_character_generation_refs.py b/backend/tests/unit/test_character_generation_refs.py new file mode 100644 index 00000000..e62b81d4 --- /dev/null +++ b/backend/tests/unit/test_character_generation_refs.py @@ -0,0 +1,97 @@ +"""职业生成与更新保持稳定引用,并保留手写计算规则。""" +import ast +import json +from pathlib import Path +import runpy + +import pytest + +ROOT = Path(__file__).resolve().parents[3] +MERGER = runpy.run_path(str(ROOT / 'scripts/migrate_generated_characters.py')) +IMPORT = 'from core.character.refs.extra.creator import CreatorSkillRef as Ref\n' + + +def merge(tmp_path, runtime, generated): + old, new = tmp_path / 'runtime.py', tmp_path / 'generated.py' + old.write_text(runtime) + new.write_text(generated) + return MERGER['merge'](new, old) + + +def block(name='名称', ref='Ref.CREATESPACE', uuid='uuid1', number=0, extra=''): + return (f'class Skill{number}(PassiveSkill):\n name = {name!r}\n' + + (f' ref = {ref}\n' if ref else '') + + (f' uuid = {uuid!r}\n' if uuid else '') + + ' position = 1\n cellPos = (1, 1)\n' + extra + '\n') + + +def test_generate_class_uses_shared_member_normalization(monkeypatch): + scripts = ROOT / 'backend/openapi/scripts' + monkeypatch.syspath_prepend(str(scripts)) + gen = runpy.run_path(str(scripts / 'generate.py')) + job = {'name': 'gunner_female', 'jobId': 'job'} + profession = {'name': 'launcher_female'} + base = ROOT / 'backend/openapi/static/data/cn/gunner_female/launcher_female' + row = next(x for x in json.loads((base / 'skill_tree.json').read_text()) if x['code'] == 'apg-63') + detail = json.loads((base / 'skillDetail' / f"{row['skillId']}.json").read_text()) + skill = gen['convert_data'](detail, row['skillId'], job) + output = gen['generate_class'](skill, 0, row, job, profession) + assert 'ref = Ref.APG_63' in output + ast.parse(output) + with pytest.raises(ValueError, match='code'): + gen['generate_class'](skill, 0, {**row, 'code': None}, job, profession) + + +def test_renamed_skill_matches_ref_and_keeps_rules_and_alias(tmp_path): + runtime = IMPORT.replace('as Ref', 'as OldRef') + block('旧名称', 'OldRef.CREATESPACE', number=27, + extra=' associate = ["手写规则"]\n level_source = OldRef.THETREEOFSEFIROT\n def custom(self):\n return 42\n') + generated = IMPORT + block('新名称', extra=' data0 = [0, 10]\n') + output, stats = merge(tmp_path, runtime, generated) + assert stats['matched'] == 1 + assert 'class Skill27(' in output + assert 'ref = OldRef.CREATESPACE' in output + assert 'level_source = OldRef.THETREEOFSEFIROT' in output + assert 'return 42' in output and '手写规则' in output + assert "name = '旧名称'" in output + assert 'data0 = [0, 10]' in output + ast.parse(output) + + +def test_old_uuid_matches_after_rename_and_gets_ref_import(tmp_path): + output, stats = merge(tmp_path, block('旧名称', ref=None), IMPORT + block('新名称')) + assert stats['matched'] == 1 + assert IMPORT.strip() in output + assert 'ref = Ref.CREATESPACE' in output + output2, _ = merge(tmp_path, output, IMPORT + block('新名称')) + assert output == output2 + + +def test_runtime_only_skills_survive_and_new_skills_stay_commented(tmp_path): + old = IMPORT + block() + block('手写技能', ref='Ref.BACKSTEP', uuid='manual', number=9, + extra=' def effect(self, old, new):\n return 42\n') + new = IMPORT + block() + block('新增技能', ref='Ref.THETREEOFSEFIROT', uuid='new', number=1) + output, stats = merge(tmp_path, old, new) + assert stats['runtime_only'] == stats['commented'] == 1 + assert 'class Skill9(' in output and 'return 42' in output + assert '# class Skill1(' in output + assert len([x for x in ast.parse(output).body if isinstance(x, ast.ClassDef)]) == 2 + + +@pytest.mark.parametrize(('old_ref', 'old_uuid', 'new_ref', 'new_uuid'), [ + ('Ref.CREATESPACE', 'one', 'Ref.THETREEOFSEFIROT', 'one'), + (None, 'one', None, 'two'), +]) +def test_identity_conflicts_do_not_fall_back_to_name(tmp_path, old_ref, old_uuid, new_ref, new_uuid): + with pytest.raises(ValueError, match='冲突'): + merge(tmp_path, IMPORT + block(ref=old_ref, uuid=old_uuid), IMPORT + block(ref=new_ref, uuid=new_uuid)) + + +def test_duplicate_refs_fail_before_merge(tmp_path): + with pytest.raises(ValueError, match='duplicate ref_key'): + merge(tmp_path, IMPORT + block() + block('另一个技能', uuid='uuid2', number=1), IMPORT + block()) + + +def test_legacy_name_fallback_without_identity(tmp_path): + output, stats = merge(tmp_path, block(ref=None, uuid=None), block(ref=None, uuid=None)) + assert stats['matched'] == 1 + ast.parse(output) diff --git a/backend/tests/unit/test_demon_slayer_blade_dance.py b/backend/tests/unit/test_demon_slayer_blade_dance.py index 16d06e11..1070d3d3 100644 --- a/backend/tests/unit/test_demon_slayer_blade_dance.py +++ b/backend/tests/unit/test_demon_slayer_blade_dance.py @@ -41,26 +41,20 @@ def test_blade_dance_shadow_uses_final_hit_damage_not_hit_count(): assert shadow_final_hit.value.id == "data2" -def test_blade_dance_shadow_uses_its_own_passive_ratio(): - passive = _skill_class("唤魔 : 弑神剑") - associations = next( - item.value - for item in passive.body - if isinstance(item, ast.Assign) - and any(isinstance(target, ast.Name) and target.id == "associate" for target in item.targets) - ) - shadow_associations = [ - dict(zip((key.value for key in entry.keys), entry.values)) - for entry in associations.elts - if isinstance(entry, ast.Dict) - ] +def test_blade_dance_shadow_uses_its_own_passive_ratio(minimal_calc_config): + from core.basic.character import createCharacter + from core.basic.skill_effect_types import Operation, Power, SkillEffect - for power in ("+power4", "+power5"): - association = next( - entry - for entry in shadow_associations - if isinstance(entry.get("type"), ast.Constant) - and entry["type"].value == power - ) - assert isinstance(association["data"], ast.Name) - assert association["data"].id == "data3" + char = createCharacter('GF.swordman_female.demon_slayer') + char.calc(minimal_calc_config) + passive = char.GetSkillByName('唤魔 : 弑神剑') + for level in (1, 10, passive.maxLv): + passive.lv = level + for index in (4, 5): + association = next( + entry for entry in passive.associate + if isinstance(entry, SkillEffect) and entry.attribute == Power(index) + ) + assert association.operation == Operation.ADD + assert char.GetSkillByName('魔刃狂舞').ref in association.skills + assert association.evaluate(passive) == passive.data3[level] / 100 diff --git a/backend/tests/unit/test_skill_effects.py b/backend/tests/unit/test_skill_effects.py new file mode 100644 index 00000000..a73dea29 --- /dev/null +++ b/backend/tests/unit/test_skill_effects.py @@ -0,0 +1,329 @@ +"""Behavioral regressions for the shared skill association resolver.""" +from types import SimpleNamespace + +import pytest + +from core.basic.character import createCharacter +from core.basic.skill import ActiveSkill, PassiveSkill +from core.basic.skill_effects import SkillEffectEngine + + +@pytest.fixture +def character_factory(minimal_calc_config): + def create(alter): + char = createCharacter('GF.' + alter) + char.setInfo = minimal_calc_config + char.SetDetail(minimal_calc_config) + return char + return create + + +def grenade_factor(char): + awake = char.GetSkillByName('单兵推进器-02X') + return char.GetSkillByName('G-14手雷').skillDamage / (1 + awake.data0[awake.lv] / 100) + + +@pytest.mark.parametrize('reverse', [False, True]) +def test_grenade_mastery_uses_final_awakening_parameter(character_factory, reverse): + char = character_factory('gunner_female.spitfire_female') + mastery = char.GetSkillByName('手雷精通') + awake = char.GetSkillByName('单兵推进器-02X') + operations = [(mastery, 11), (awake, 10)] + for skill, lv in operations[::-1] if reverse else operations: + skill.lv = lv + assert mastery.ratio == pytest.approx(1.2) + assert grenade_factor(char) == pytest.approx(2.32) + mastery.lv = 12 + assert grenade_factor(char) == pytest.approx(2.44) + awake.lv = 0 + assert grenade_factor(char) == pytest.approx(2.2) + mastery.lv = 0 + assert grenade_factor(char) == pytest.approx(1) + + +def test_equipment_baseline_and_character_stats_survive_refresh(character_factory): + char = character_factory('gunner_female.spitfire_female') + mastery = char.GetSkillByName('手雷精通') + awake = char.GetSkillByName('单兵推进器-02X') + mastery.lv = 11 + char.SetSkillRation(1, 100, .15) + char.SetStatus(Spirit=40) + spirit = char.Spirit + awake.lv = 10 + assert grenade_factor(char) == pytest.approx(2.32 * 1.15) + assert char.Spirit == spirit + before = [(s.lv, s.skillDamage) for s in char.skills] + for _ in range(3): + char.skill_effects.resolve() + assert [(s.lv, s.skillDamage) for s in char.skills] == before + awake.lv = mastery.lv = 0 + assert char.GetSkillByName('G-14手雷').skillDamage == pytest.approx(1.15) + + +@pytest.mark.parametrize('auto_first', [False, True]) +def test_traveler_condition_reads_final_levels(character_factory, auto_first): + char = character_factory('archer.traveler') + crest = char.GetSkillByName('流浪之星的纹章') + auto = char.GetSkillByName('自动操作模式') + meteor = char.GetSkillByName('神雾兵仗·流星') + values = [(crest, 1), (auto, 1)] + char.SetSkills({str(s.id): {'lv': lv} for s, lv in (values[::-1] if auto_first else values)}) + assert meteor.cdReduce == 1 + auto.lv = 0 + assert meteor.cdReduce == pytest.approx(.9) + auto.lv = 1 + assert meteor.cdReduce == 1 + + +@pytest.mark.parametrize('sex', ['male', 'female']) +@pytest.mark.parametrize('mastery_first', [False, True]) +def test_launcher_level_bonus_ignores_request_order(character_factory, sex, mastery_first): + char = character_factory(f'gunner_{sex}.launcher_{sex}') + mastery = char.GetSkillByName('重火器奥义') + laser = char.GetSkillByName('激光炮') + values = [(mastery, 1), (laser, 10)] + config = {str(s.id): {'lv': lv} for s, lv in (values if mastery_first else values[::-1])} + char.SetSkills(config) + assert laser.lv == 11 + char.SetSkills(config) + assert laser.lv == 11 + char.AddSkillLv(1, 100, 1) + assert laser.lv == 12 + mastery.lv = 0 + assert laser.lv == 11 + + +def test_vp_switch_replaces_and_removes_associations(character_factory): + char = character_factory('gunner_female.launcher_female') + source = char.GetSkillByName('X-2太阳神光炮') + target = char.GetSkillByName('激光炮') + source.lv = 1 + source.vp = 1 + assert target.skillRation == pytest.approx(.875) + source.vp = 0 + assert target.skillRation == 1 + source.vp = 1 + assert target.skillRation == pytest.approx(.875) + source.lv = 0 + assert target.skillRation == 1 + + +@pytest.mark.parametrize('reverse', [False, True]) +def test_elementalist_uses_consistent_damage_and_cooldown_fields(character_factory, reverse): + char = character_factory('mage_female.elementalist') + mastery = char.GetSkillByName('属性精通') + show = char.GetSkillByName('魔法秀') + rune = char.GetSkillByName('圣灵符文') + wall = char.GetSkillByName('冰墙') + values = [(mastery, 5), (show, 10), (rune, 1)] + for s, lv in values[::-1] if reverse else values: + s.lv = lv + assert wall.skillDamage == pytest.approx(1 + mastery.data0[5] * mastery.ratio / 100) + assert wall.skillRation == 1 + assert wall.cdRatio == pytest.approx(1 - show.data1[10] * show.ratio / 100) + rune.lv = 0 + assert wall.skillDamage == pytest.approx(1 + mastery.data0[5] / 100) + + +def synthetic_character(classes): + char = SimpleNamespace(role='test', name='test', 武器选项=['test']) + char.GetWeaponType = lambda: ('test', '') + char.skills = [cls(char) for cls in classes] + char.GetSkillByName = lambda name: next((s for s in char.skills if s.name == name), None) + char.GetSkills = lambda *args: [s for s in char.skills if s.damage] + char.skill_effects = SkillEffectEngine(char) + return char + + +def test_state_dependencies_resolve_before_damage_and_clamp_after_aggregation(): + class Skill1(PassiveSkill): + name = 'upstream' + maxLv = 10 + associate = [{'type': '+lv', 'data': [0, 200], 'skills': ['middle']}] + + class Skill2(PassiveSkill): + name = 'middle' + maxLv = 3 + ratio = 1.0 + associate = [{'type': '*ratio', 'data': [0, 10, 20, 30], 'skills': ['mastery']}] + + class Skill3(PassiveSkill): + name = 'mastery' + maxLv = 10 + ratio = 1.0 + + def effect(self, old, new): + self.associate = [{'data': [0, 100 * self.ratio], 'skills': ['target']}] + super().effect(old, new) + + class Skill4(ActiveSkill): + name = 'target' + maxLv = 10 + + char = synthetic_character([Skill1, Skill2, Skill3, Skill4]) + with char.skill_effects.batch(): + for s in char.skills: + char.skill_effects.set_input_level(s, 1) + upstream, middle, mastery, target = char.skills + assert middle.lv == 3 + assert mastery.ratio == pytest.approx(1.3) + assert target.skillDamage == pytest.approx(2.3) + upstream.lv = 0 + assert middle.lv == 1 + assert mastery.ratio == pytest.approx(1.1) + assert target.skillDamage == pytest.approx(2.1) + + +def test_zero_assignment_can_be_removed_without_division(): + class Skill1(PassiveSkill): + name = 'disable' + maxLv = 1 + associate = [{'type': '=skillDamage', 'data': [0, 0], 'skills': ['target']}] + + class Skill2(ActiveSkill): + name = 'target' + maxLv = 1 + + char = synthetic_character([Skill1, Skill2]) + source, target = char.skills + with char.skill_effects.batch(): + target.skillDamage *= 1.15 + char.skill_effects.set_input_level(source, 1) + assert target.skillDamage == 0 + source.lv = 0 + assert target.skillDamage == pytest.approx(1.15) + + +def test_state_cycles_report_the_involved_skills(): + class Skill1(PassiveSkill): + name = 'first' + maxLv = 10 + associate = [{'type': '+lv', 'data': [0, 100], 'skills': ['second']}] + + class Skill2(PassiveSkill): + name = 'second' + maxLv = 10 + associate = [{'type': '+lv', 'data': [0, 100], 'skills': ['first']}] + + char = synthetic_character([Skill1, Skill2]) + with pytest.raises(ValueError, match='循环依赖:.*first.*second|循环依赖:.*second.*first'): + with char.skill_effects.batch(): + for s in char.skills: + char.skill_effects.set_input_level(s, 1) + + +def test_missing_target_is_exposed_for_rule_audits(): + class Skill1(PassiveSkill): + name = 'source' + maxLv = 1 + associate = [{'data': [0, 10], 'skills': ['missing']}] + + char = synthetic_character([Skill1]) + char.skills[0].lv = 1 + assert char.skill_effects.unresolved_targets == {('source', 'missing')} + + +@pytest.mark.parametrize('reverse', [False, True]) +def test_creator_tree_shares_final_creation_level_without_target_cap(character_factory, reverse): + char = character_factory('extra.creator') + source = char.GetSkillByName('创世') + tree = char.GetSkillByName('生命之树') + values = [(source, 10), (tree, 1)] + char.SetSkills({str(s.id): {'lv': lv} for s, lv in (values[::-1] if reverse else values)}) + assert tree.maxLv == 1 + assert source.lv == tree.lv == 10 + tree.lv = 1 + assert tree.lv == 10 + char.AddSkillLv(85, 85, 1) + assert source.lv == tree.lv == 11 + source.lv = 0 + assert tree.lv == 0 + + +def test_level_links_chain_and_detect_cycles(): + class Skill1(PassiveSkill): + name = 'source' + maxLv = 20 + + class Skill2(PassiveSkill): + name = 'middle' + maxLv = 1 + level_source = 'source' + + class Skill3(ActiveSkill): + name = 'target' + maxLv = 1 + level_source = 'middle' + + char = synthetic_character([Skill3, Skill2, Skill1]) + source = char.GetSkillByName('source') + source.lv = 10 + assert [s.lv for s in char.skills] == [10, 10, 10] + source.level_source = 'target' + with pytest.raises(ValueError, match='循环依赖'): + char.skill_effects.changed() + + +def test_exception_inside_batch_is_not_replaced_by_resolution_error(): + class Skill1(PassiveSkill): + name = 'source' + maxLv = 20 + level_source = 'missing' + + char = synthetic_character([Skill1]) + with pytest.raises(RuntimeError, match='original error'): + with char.skill_effects.batch(): + raise RuntimeError('original error') + + +def test_character_passive_stats_preserve_external_additions(character_factory): + char = character_factory('priest_male.crusader_male') + source = char.GetSkillByName('守护恩赐') + base = char.Spirit + source.lv = 10 + passive = source.data1[10] + assert char.Spirit == pytest.approx(base + passive) + char.SetStatus(Spirit=40) + source.lv = 11 + assert char.Spirit == pytest.approx(base + 40 + source.data1[11]) + source.lv = 0 + assert char.Spirit == pytest.approx(base + 40) + + +def test_conflicting_assignments_are_reported(): + class Skill1(PassiveSkill): + name = 'first' + maxLv = 1 + associate = [{'type': '=cd', 'data': [0, 20], 'skills': ['target']}] + + class Skill2(PassiveSkill): + name = 'second' + maxLv = 1 + associate = [{'type': '=cd', 'data': [0, 30], 'skills': ['target']}] + + class Skill3(ActiveSkill): + name = 'target' + maxLv = 1 + + char = synthetic_character([Skill1, Skill2, Skill3]) + with pytest.raises(ValueError, match='关联赋值冲突'): + with char.skill_effects.batch(): + for s in char.skills: + char.skill_effects.set_input_level(s, 1) + + +def test_random_grenade_level_updates_match_final_configuration(character_factory): + from random import Random + + char = character_factory('gunner_female.spitfire_female') + mastery = char.GetSkillByName('手雷精通') + awake = char.GetSkillByName('单兵推进器-02X') + rng = Random(42) + for _ in range(100): + if rng.randrange(2): + mastery.lv = rng.randrange(21) + else: + awake.lv = rng.randrange(11) + expected = (1 + mastery.data0[mastery.lv] * (1 + awake.data1[awake.lv] / 100) / 100) * (1 + awake.data0[awake.lv] / 100) + for name in ('G-14手雷', 'G-35L感电手雷', 'G-18C冰冻手雷'): + assert char.GetSkillByName(name).skillDamage == pytest.approx(expected) diff --git a/backend/tests/unit/test_skill_refs.py b/backend/tests/unit/test_skill_refs.py new file mode 100644 index 00000000..e54bdfa1 --- /dev/null +++ b/backend/tests/unit/test_skill_refs.py @@ -0,0 +1,235 @@ +"""技能引用生成的身份隔离、完整性及失败保护。""" +import importlib +import json +from pathlib import Path +import runpy + +import pytest + +from core.character.refs.base import SkillRef, SkillReferences +from core.character.refs.common import CommonSkillRefs +from core.character.refs.extra.creator import CreatorSkillRef +from core.character.refs.swordman_male.berserker import BerserkerSkillRef +from core.character.refs.swordman_male.weapon_master import WeaponMasterSkillRef + +ROOT = Path(__file__).resolve().parents[3] +GENERATOR = runpy.run_path(str(ROOT / 'scripts/generate_skill_refs.py')) + + +def write_tree(root, rows, *, include_common=True): + if include_common: + rows = [{'code': code, 'name': name} for code, name in GENERATOR['COMMON_SKILLS'].items()] + [ + {'code': code, 'name': labels[0]} for code, labels in GENERATOR['AWAKENING_SKILLS']['1'].items() + ] + rows + path = root / 'extra/creator/skill_tree.json' + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(rows, ensure_ascii=False), encoding='utf-8') + + +def test_refs_preserve_codes_and_profession_scope(): + assert CreatorSkillRef.CREATESPACE.code == 'createspace' + assert CreatorSkillRef.CREATESPACE.profession == 'extra.creator' + assert CreatorSkillRef.CREATESPACE.qualified_key == 'extra.creator:createspace' + assert WeaponMasterSkillRef.BLADEMASTERY != BerserkerSkillRef.BLADEMASTERY + assert WeaponMasterSkillRef.BLADEMASTERY != 'blademastery' + assert len({WeaponMasterSkillRef.BLADEMASTERY, BerserkerSkillRef.BLADEMASTERY}) == 2 + + +def test_committed_refs_match_all_source_trees(): + source = ROOT / 'backend/openapi/static/data/cn' + output = ROOT / 'backend/core/character/refs' + assert GENERATOR['generate'](source, output, check=True) == [] + for tree in source.glob('*/*/skill_tree.json'): + job, profession, _ = tree.relative_to(source).parts + module = importlib.import_module(f'core.character.refs.{job}.{profession}') + class_name = ''.join(part.capitalize() for part in profession.split('_')) + 'SkillRef' + refs = getattr(module, class_name) + assert {ref.code for ref in refs.members()} == {row['code'] for row in json.loads(tree.read_text())} + assert all(ref.profession in (None, f'{job}.{profession}') for ref in refs.members()) + assert all(name not in vars(refs) for name in CommonSkillRefs.__members__) + + +@pytest.mark.parametrize(('code', 'member'), [('apg-63', 'APG_63'), ('1000hands1000eyes', 'SKILL_1000HANDS1000EYES')]) +def test_non_identifier_codes_keep_original_values(tmp_path, code, member): + source, output = tmp_path / 'source', tmp_path / 'refs' + write_tree(source, [{'code': code, 'name': '中文名称"与换行\n说明'}]) + GENERATOR['generate'](source, output) + refs = runpy.run_path(str(output / 'extra/creator.py'))['CreatorSkillRef'] + assert getattr(refs, member).code == code + assert GENERATOR['generate'](source, output, check=True) == [] + + +@pytest.mark.parametrize('rows', [ + [{'code': 'a-b', 'name': '甲'}, {'code': 'a_b', 'name': '乙'}], + [{'code': 'same', 'name': '甲'}, {'code': 'same', 'name': '乙'}], + [{'name': '缺少 code'}], +]) +def test_invalid_source_does_not_partially_write(tmp_path, rows): + source, output = tmp_path / 'source', tmp_path / 'refs' + write_tree(source, rows) + with pytest.raises(ValueError): + GENERATOR['generate'](source, output) + assert not output.exists() + + +def test_check_is_read_only_and_manual_files_are_protected(tmp_path): + source, output = tmp_path / 'source', tmp_path / 'refs' + write_tree(source, [{'code': 'createspace', 'name': '创世'}]) + assert GENERATOR['generate'](source, output, check=True) + assert not output.exists() + target = output / 'extra/creator.py' + target.parent.mkdir(parents=True) + target.write_text('# 手工扩展\n') + with pytest.raises(ValueError, match='拒绝覆盖'): + GENERATOR['generate'](source, output) + assert target.read_text() == '# 手工扩展\n' + assert not (target.parent / '__init__.py').exists() + + + +def test_common_members_are_inherited_and_queries_include_them(): + assert CreatorSkillRef.BACKSTEP is CommonSkillRefs.BACKSTEP + assert CreatorSkillRef.BACKSTEP is WeaponMasterSkillRef.BACKSTEP + assert CreatorSkillRef.BACKSTEP.profession is None + assert CreatorSkillRef.BACKSTEP.qualified_key == 'common:backstep' + assert CreatorSkillRef.from_code('backstep') is CreatorSkillRef.BACKSTEP + assert CreatorSkillRef.from_code('createspace') is CreatorSkillRef.CREATESPACE + assert set(CommonSkillRefs.members()).issubset(CreatorSkillRef.members()) + assert len(CommonSkillRefs.members()) == 7 + with pytest.raises(KeyError): + CreatorSkillRef.from_code('missing') + + +def test_refs_and_namespaces_are_read_only(): + with pytest.raises(AttributeError): + CreatorSkillRef.BACKSTEP.code = 'changed' + with pytest.raises(AttributeError): + CreatorSkillRef.BACKSTEP = SkillRef('changed') + with pytest.raises(AttributeError): + del CreatorSkillRef.CREATESPACE + with pytest.raises(TypeError): + CreatorSkillRef.__members__['BACKSTEP'] = SkillRef('changed') + with pytest.raises(TypeError): + CreatorSkillRef() + + +def test_class_definition_rejects_overrides_duplicates_and_wrong_scope(): + with pytest.raises(ValueError, match='覆盖继承'): + class Override(CommonSkillRefs): + BACKSTEP = SkillRef('other') + + with pytest.raises(ValueError, match='重复技能 code'): + class Alias(CommonSkillRefs): + ANOTHER_BACKSTEP = SkillRef('backstep') + + with pytest.raises(ValueError, match='职业范围不一致'): + class WrongProfession(CommonSkillRefs): + __profession__ = 'extra.creator' + OTHER = SkillRef('other', 'extra.dark_knight') + + with pytest.raises(ValueError, match='覆盖公共查询接口'): + class OverrideMethod(CommonSkillRefs): + members = None + + with pytest.raises(ValueError, match='其他职业'): + class WrongParent(CreatorSkillRef): + __profession__ = 'extra.dark_knight' + + +def test_missing_or_renamed_common_skill_stops_generation(tmp_path): + rows = [{'code': code, 'name': name} for code, name in GENERATOR['COMMON_SKILLS'].items()] + source, output = tmp_path / 'source', tmp_path / 'refs' + write_tree(source, rows[:-1], include_common=False) + with pytest.raises(ValueError, match='缺少公共技能'): + GENERATOR['generate'](source, output) + rows[0]['name'] = '不同名称' + write_tree(source, rows, include_common=False) + with pytest.raises(ValueError, match='公共技能名称不一致'): + GENERATOR['generate'](source, output) + assert not output.exists() + + +def test_equal_values_are_stable_hashable_identities(): + assert SkillRef('backstep') == CommonSkillRefs.BACKSTEP + assert SkillRef('createspace', 'extra.creator') == CreatorSkillRef.CREATESPACE + assert SkillRef('backstep', 'extra.creator') != CommonSkillRefs.BACKSTEP + assert len({SkillRef('backstep'), CommonSkillRefs.BACKSTEP}) == 1 + assert SkillReferences.members() == () + + + +def test_additional_common_skills_keep_real_codes_and_coverage(): + from core.character.refs.common import Awakening1SkillRefs, ComboSkillRefs + from core.character.refs.extra.dark_knight import DarkKnightSkillRef + from core.character.refs.archer.hunter import HunterSkillRef + + assert CreatorSkillRef.ARMORMASTERYETC is CommonSkillRefs.ARMORMASTERYETC + assert CreatorSkillRef.CLUEOFAWAKENING1 is Awakening1SkillRefs.CLUEOFAWAKENING1 + assert CreatorSkillRef.INSTANTREALIZATION1 is Awakening1SkillRefs.INSTANTREALIZATION1 + assert WeaponMasterSkillRef.SKILLPRESETTYPE1 is ComboSkillRefs.SKILLPRESETTYPE1 + assert HunterSkillRef.from_code('clueofawakening3').profession is None + for refs in (CreatorSkillRef, DarkKnightSkillRef): + assert not hasattr(refs, 'SKILLPRESETTYPE1') + with pytest.raises(KeyError): + refs.from_code('skillpresettype1') + assert not hasattr(refs, 'CLUEOFAWAKENING5') + for refs in (CreatorSkillRef, WeaponMasterSkillRef, HunterSkillRef): + for member, ref in refs.__members__.items(): + if ref.code.startswith(('clueofawakening', 'instantrealization')) or ref.code in ('armormasteryetc', 'skillpresettype1'): + assert member not in vars(refs) + assert ref.profession is None + + +@pytest.mark.parametrize('extra', [ + [{'code': 'skillpresettype1', 'name': '技能连招'}], + [{'code': 'clueofawakening2', 'name': '觉醒之抉择'}], + [{'code': 'instantrealization2', 'name': '卓越之力'}], +]) +def test_common_group_mismatch_is_rejected_before_writing(tmp_path, extra): + source, output = tmp_path / 'source', tmp_path / 'refs' + write_tree(source, extra) + with pytest.raises(ValueError): + GENERATOR['generate'](source, output) + assert not output.exists() + + +def test_bound_refs_survive_display_rename_and_remain_character_local(minimal_calc_config): + from core.basic.character import createCharacter + from core.character.refs.extra.creator import CreatorSkillRef as Ref + + first = createCharacter('GF.extra.creator') + second = createCharacter('GF.extra.creator') + first.calc(minimal_calc_config) + second.calc(minimal_calc_config) + source = first.GetSkill(Ref.CREATESPACE) + tree = first.GetSkillByRef(Ref.THETREEOFSEFIROT) + assert source.code == 'createspace' + assert first.GetSkillByCode('createspace') is source + assert first.GetSkill('创世') is source + source.name = '显示名称已修改' + first.skills_dict = {s.name: s for s in first.skills} + assert first.GetSkill('创世') is None + assert first.GetSkill(Ref.CREATESPACE) is source + source.lv = 5 + assert tree.lv == source.lv == 5 + assert first.GetSkill(Ref.BACKSTEP) is not second.GetSkill(Ref.BACKSTEP) + with pytest.raises(ValueError, match='职业不匹配'): + first.GetSkill(WeaponMasterSkillRef.LIGHTSWORDMASTERY) + + +def test_bind_rejects_duplicate_codes_and_foreign_refs(): + from types import SimpleNamespace + from core.character.refs.base import bind_skill_refs + + char = SimpleNamespace(skills=[SimpleNamespace(name='甲', ref=SkillRef('a')), SimpleNamespace(name='乙', ref=SkillRef('a', 'extra.creator'))]) + with pytest.raises(ValueError, match='重复技能引用绑定'): + bind_skill_refs(char, 'extra.creator') + char.skills = [SimpleNamespace(name='错误职业', ref=WeaponMasterSkillRef.LIGHTSWORDMASTERY)] + with pytest.raises(ValueError, match='职业不匹配'): + bind_skill_refs(char, 'extra.creator') + + +def test_names_are_display_metadata_not_identity(): + assert SkillRef('a', name='旧名称') == SkillRef('a', name='新名称') + assert hash(SkillRef('a', name='旧名称')) == hash(SkillRef('a', name='新名称')) + assert CreatorSkillRef.ARMORMASTERYETC.name == '防具精通' diff --git a/backend/tests/unit/test_typed_skill_effects.py b/backend/tests/unit/test_typed_skill_effects.py new file mode 100644 index 00000000..1730769a --- /dev/null +++ b/backend/tests/unit/test_typed_skill_effects.py @@ -0,0 +1,375 @@ +"""Typed declarations must preserve baselines and expose all state dependencies.""" +import pytest + +from core.basic.skill import ActiveSkill, PassiveSkill +from core.basic.skill_effects import SkillEffectEngine +from core.basic.skill_effect_types import ( + CharacterAttribute, CharacterEffect, Equals, ExtraData, LevelTable, Operation, + Percent, Power, Read, Select, SkillAttribute as Attr, SkillEffect, WeaponCategoryContains, +) + + +def character(*classes): + class Character: + role = name = 'test' + 武器选项 = ['test'] + Spirit = 100 + + char = Character() + char.GetWeaponType = lambda: ('test', '') + char.skills = [cls(char) for cls in classes] + char.GetSkillByName = lambda name: next((s for s in char.skills if s.name == name), None) + char.GetSkills = lambda *args: [s for s in char.skills if s.damage] + char.skill_effects = SkillEffectEngine(char) + return char + + +def learn(char, values=None): + with char.skill_effects.batch(): + for skill, value in zip(char.skills, values or [1] * len(char.skills)): + char.skill_effects.set_input_level(skill, value) + + +@pytest.mark.parametrize('reverse', [False, True]) +def test_typed_cross_parameter_and_condition_use_final_state(reverse): + class Skill1(PassiveSkill): + name = 'reader' + maxLv = 1 + associate = [SkillEffect( + skills=['mastery'], attribute=Attr.RATIO, + value=Read(Attr.RATIO, 'parameter'), when=Equals(Read(Attr.LEVEL, 'parameter'), 2), + )] + + class Skill2(PassiveSkill): + name = 'upstream' + maxLv = 1 + associate = [ + {'type': '+lv', 'data': [0, 100], 'skills': ['parameter']}, + {'type': '*ratio', 'data': [0, 50], 'skills': ['parameter']}, + ] + + class Skill3(PassiveSkill): + name = 'parameter' + maxLv = 3 + ratio = 1.0 + + class Skill4(PassiveSkill): + name = 'mastery' + maxLv = 1 + ratio = 1.0 + associate = [SkillEffect(skills=['target'], value=1 + Read(Attr.RATIO))] + + class Skill5(ActiveSkill): + name = 'target' + maxLv = 1 + + char = character(Skill1, Skill2, Skill3, Skill4, Skill5) + with char.skill_effects.batch(): + for skill in char.skills[::-1] if reverse else char.skills: + char.skill_effects.set_input_level(skill, 1) + assert char.skills[-1].skillDamage == pytest.approx(2.5) + char.skills[1].lv = 0 + assert char.skills[-1].skillDamage == pytest.approx(2) + char.skills[1].lv = 1 + assert char.skills[-1].skillDamage == pytest.approx(2.5) + + +def test_discovery_does_not_evaluate_provisional_divisor_or_inactive_branch(): + class Skill1(PassiveSkill): + name = 'reader' + maxLv = 1 + vp = 0 + associate = [SkillEffect(skills=['target'], value=Select( + Equals(Read(Attr.VP), 0), 1 / Read(Attr.RATIO, 'parameter'), 1 / Read(Attr.VP), + ))] + + class Skill2(PassiveSkill): + name = 'upstream' + maxLv = 1 + associate = [SkillEffect(skills=['parameter'], attribute=Attr.RATIO, operation=Operation.ASSIGN, value=2)] + + class Skill3(PassiveSkill): + name = 'parameter' + maxLv = 1 + ratio = 0 + + class Skill4(ActiveSkill): + name = 'target' + maxLv = 1 + + char = character(Skill1, Skill2, Skill3, Skill4) + learn(char) + assert char.skills[-1].skillDamage == pytest.approx(.5) + char.skills[0].vp = 1 + assert char.skills[-1].skillDamage == 1 + + +def test_typed_level_assignment_can_activate_a_previously_unlearned_source(): + class Skill1(PassiveSkill): + name = 'new source' + maxLv = 1 + associate = [SkillEffect(skills=['target'], value=1 + Percent(LevelTable([0, 30])))] + + class Skill2(PassiveSkill): + name = 'activator' + maxLv = 1 + associate = [SkillEffect(skills=['new source'], attribute=Attr.LEVEL, operation=Operation.ASSIGN, value=1)] + + class Skill3(ActiveSkill): + name = 'target' + maxLv = 1 + + char = character(Skill1, Skill2, Skill3) + learn(char, [0, 1, 1]) + assert char.skills[0].lv == 1 + assert char.skills[-1].skillDamage == pytest.approx(1.3) + char.skills[1].lv = 0 + assert char.skills[0].lv == 0 + assert char.skills[-1].skillDamage == 1 + + +def test_typed_and_legacy_contributions_preserve_character_and_component_baselines(): + class Skill1(PassiveSkill): + name = 'source' + maxLv = 1 + associate = [ + CharacterEffect(attribute=CharacterAttribute.SPIRIT, operation=Operation.ADD, value=10), + {'type': '$*Spirit', 'data': [0, 10]}, + SkillEffect(skills=['target'], attribute=ExtraData(0), operation=Operation.ADD, value=20), + SkillEffect(skills=['target'], attribute=Power(0), operation=Operation.ASSIGN, value=0), + {'data': [50, 100], 'skills': ['target']}, + SkillEffect(skills=['target'], value=1.5), + ] + + class Skill2(ActiveSkill): + name = 'target' + maxLv = 1 + dataplus0 = 5 + + char = character(Skill1, Skill2) + learn(char) + source, target = char.skills + assert char.Spirit == pytest.approx(121) + assert target.dataplus0 == 25 + assert target.power0 == 0 + assert target.skillDamage == pytest.approx(2) + with char.skill_effects.batch(): + char.Spirit += 30 + target.dataplus0 += 3 + assert char.Spirit == pytest.approx(154) + assert target.dataplus0 == 28 + source.lv = 0 + assert char.Spirit == 130 + assert target.dataplus0 == 8 + assert not hasattr(target, 'power0') + assert target.skillDamage == 1 + + +def test_name_arrays_and_level_tables_are_snapshotted_and_filters_apply(): + names, data = ['first'], [0, 50] + rule = SkillEffect(skills=names, value=1 + Percent(LevelTable(data))) + names.append('second') + data[1] = 100 + + class Skill1(PassiveSkill): + name = 'source' + maxLv = 1 + vp = 1 + associate = [ + rule, + SkillEffect(value=2, except_skills=['second'], weapon=['test'], when=Equals(Read(Attr.VP), 1)), + SkillEffect(value=100, weapon=['other']), + ] + + class Skill2(ActiveSkill): + name = 'first' + maxLv = 1 + + class Skill3(ActiveSkill): + name = 'second' + maxLv = 1 + + char = character(Skill1, Skill2, Skill3) + learn(char) + assert char.skills[1].skillDamage == 3 + assert char.skills[2].skillDamage == 1 + char.skills[0].vp = 0 + assert char.skills[1].skillDamage == 1.5 + + +@pytest.mark.parametrize('factory', [ + lambda: SkillEffect(value=1, operation='*'), + lambda: SkillEffect(value=1, attribute='skillDamage'), + lambda: SkillEffect(value=1, attribute=Attr.VP), + lambda: SkillEffect(value=1, skills='target'), + lambda: CharacterEffect(value=1, attribute=Attr.RATIO), + lambda: Read(Attr.DAMAGE), + lambda: LevelTable([0, float('inf')]), + lambda: SkillEffect(value=lambda: 1), + lambda: Power(-1), +]) +def test_invalid_declarations_fail_at_construction(factory): + with pytest.raises((TypeError, ValueError)): + factory() + + +@pytest.mark.parametrize('rule, message', [ + (SkillEffect(skills=['missing'], value=1), '目标不存在'), + (SkillEffect(value=Read(Attr.LEVEL, 'missing')), '引用技能不存在'), + (SkillEffect(value=Read(Attr.RATIO)), '引用属性不存在'), + (SkillEffect(value=1 / Read(Attr.VP)), '除数为零'), +]) +def test_invalid_reference_and_arithmetic_report_errors(rule, message): + class Skill1(ActiveSkill): + name = 'source' + maxLv = 1 + associate = [rule] + + with pytest.raises(ValueError, match=message): + learn(character(Skill1)) + + +def test_typed_state_cycles_are_rejected(): + class Skill1(PassiveSkill): + name = 'first' + maxLv = 1 + ratio = 1 + associate = [SkillEffect(skills=['second'], attribute=Attr.RATIO, value=1.2)] + + class Skill2(PassiveSkill): + name = 'second' + maxLv = 1 + ratio = 1 + associate = [SkillEffect(skills=['first'], attribute=Attr.RATIO, value=1.2)] + + with pytest.raises(ValueError, match='循环依赖'): + learn(character(Skill1, Skill2)) + + +@pytest.mark.parametrize('category, expected', [('制式武器', 1.1), ('传世武器', 1.3), ('狄瑞吉传世武器', 1.3)]) +def test_weapon_category_selects_mastery_table(category, expected): + class Skill1(PassiveSkill): + name = 'mastery' + maxLv = 1 + associate = [CharacterEffect( + attribute=CharacterAttribute.P_ATK_P, + value=1 + Percent(Select(WeaponCategoryContains('传世武器'), LevelTable([0, 30]), LevelTable([0, 10]))), + )] + + char = character(Skill1) + char.PAtkP = 1 + char.GetWeaponType = lambda: ('test', category) + learn(char) + assert char.PAtkP == pytest.approx(expected) + + +def test_profession_attributes_are_local_typed_outputs(): + from core.basic.skill_effect_types import ProfessionAttribute + + class LocalAttribute(ProfessionAttribute): + BONUS = 'localBonus' + """测试职业的独立加成。""" + + class OtherAttribute(ProfessionAttribute): + BONUS = 'localBonus' + + class Source(PassiveSkill): + name = 'source' + maxLv = 1 + associate = [SkillEffect(attribute=LocalAttribute.BONUS, operation=Operation.ADD, value=2)] + + class Target(ActiveSkill): + name = 'target' + maxLv = 1 + localBonus = 3 + + char = character(Source, Target) + learn(char) + assert char.skills[1].localBonus == 5 + char.skills[0].lv = 0 + assert char.skills[1].localBonus == 3 + assert SkillEffect(attribute=OtherAttribute.BONUS, value=2).attribute is OtherAttribute.BONUS + with pytest.raises(ValueError, match='Read'): + Read(LocalAttribute.BONUS) + + +@pytest.mark.parametrize('name', ['lv', 'skillDamage', 'power2', 'hit0', 'not-valid']) +def test_profession_attribute_rejects_shared_or_invalid_names(name): + from core.basic.skill_effect_types import ProfessionAttribute + + local = ProfessionAttribute('LocalAttribute', {'VALUE': name}) + with pytest.raises(ValueError): + SkillEffect(attribute=local.VALUE, value=1) + + +def test_composed_conditions_track_inactive_dependencies_and_skip_only_explicit_missing_targets(): + from core.basic.skill_effect_types import All, GreaterThan, Hit, MissingTargetPolicy, Not + + class Source(PassiveSkill): + name = 'source' + maxLv = 1 + associate = [SkillEffect( + attribute=Hit(0), operation=Operation.ADD, value=2, + skills=['old missing name', 'target'], missing_target=MissingTargetPolicy.SKIP, + when=All([GreaterThan(Read(Attr.LEVEL, 'gate'), 0), Not(Equals(Read(Attr.LEVEL), 0))]), + )] + + class Gate(PassiveSkill): + name = 'gate' + maxLv = 1 + + class Target(ActiveSkill): + name = 'target' + maxLv = 1 + hit0 = 1 + + char = character(Source, Gate, Target) + learn(char, [1, 0, 1]) + assert char.skills[-1].hit0 == 1 + char.skills[1].lv = 1 + assert char.skills[-1].hit0 == 3 + assert ('source', 'old missing name') in char.skill_effects.unresolved_targets + assert Read(Attr.LEVEL, 'gate') in Source.associate[0].dependencies() + char.skills[1].lv = 0 + assert char.skills[-1].hit0 == 1 + + +def test_ref_targets_exclusions_and_reads_use_identity_after_rename(): + from core.character.refs.base import SkillRef, bind_skill_refs + + reader_ref = SkillRef('reader', 'test.job') + gate_ref = SkillRef('gate', 'test.job') + target_ref = SkillRef('target', 'test.job') + excluded_ref = SkillRef('excluded', 'test.job') + + class Source(PassiveSkill): + name = 'reader' + ref = reader_ref + maxLv = 1 + associate = [SkillEffect( + skills=[target_ref, excluded_ref], except_skills=[excluded_ref], + value=1 + Read(Attr.LEVEL, gate_ref), + )] + + class Gate(PassiveSkill): + name = 'gate' + ref = gate_ref + maxLv = 3 + + class Target(ActiveSkill): + name = 'renamed target' + ref = target_ref + maxLv = 1 + + class Excluded(ActiveSkill): + name = 'renamed excluded' + ref = excluded_ref + maxLv = 1 + + char = character(Source, Gate, Target, Excluded) + bind_skill_refs(char, 'test.job') + learn(char, [1, 2, 1, 1]) + assert char.skills[2].skillDamage == 3 + assert char.skills[3].skillDamage == 1 + char.skills[1].lv = 3 + assert char.skills[2].skillDamage == 4 diff --git a/scripts/generate_skill_refs.py b/scripts/generate_skill_refs.py new file mode 100644 index 00000000..5ade3fe8 --- /dev/null +++ b/scripts/generate_skill_refs.py @@ -0,0 +1,217 @@ +"""从 skill_tree.json 生成职业技能引用及中文悬停说明。 + +默认读取仓库内中文技能树;--source-root 可指向 dnfSkillData/openapi。 +只生成标准引用,不改技能计算代码,也不为未知技能猜测映射。 +使用 --check 校验已提交产物是否与输入一致;校验模式不写文件。 +""" +from __future__ import annotations + +import argparse +import json +from pathlib import Path +import re +import sys + +ROOT = Path(__file__).resolve().parents[1] +SOURCE_ROOT = ROOT / 'backend/openapi/static/data/cn' +OUTPUT_ROOT = ROOT / 'backend/core/character/refs' +MARKER = '# 此文件由 scripts/generate_skill_refs.py 自动生成,请勿手工修改。' + +# 显式公共技能清单;各职业输入必须包含这些 code,且名称一致。 +COMMON_SKILLS = { + 'physicalcriticalhitup': '暴击', + 'backstep': '后跳', + 'basicattackup': '基础精通', + 'escapebackstep': '强化 - 后跳', + 'jumppowerup': '跃翔', + 'quickstanding': '受身蹲伏', + 'armormasteryetc': '防具精通', +} + +# 两项觉醒技能按原始 code 后缀分组,所有定义集中在 common.py。 +# 只允许明确确认的名称差异,不用模糊名称推测 code。 +AWAKENING_SKILLS = { + str(index): { + f'clueofawakening{index}': ('觉醒之抉择', '觉醒之心') if index == 1 else ('觉醒之抉择',), + f'instantrealization{index}': ('卓越之力',), + } + for index in range(1, 6) +} +COMBO_SKILLS = {'skillpresettype1': '技能连招'} +COMBO_EXCLUDED_PROFESSIONS = {'extra.creator', 'extra.dark_knight'} + + +def render_common() -> str: + """集中生成基础、觉醒变体及连招引用,职业按实际技能树继承适用分组。""" + lines = [MARKER, '"""公共技能引用;保留觉醒 code 变体,按职业技能树选择继承分组。"""', + 'from core.character.refs.base import SkillRef, SkillReferences', '', '', + 'class CommonSkillRefs(SkillReferences):', + ' """全部职业共享的七项基础引用,仅共享身份,不合并技能计算实现。"""'] + + def append_members(skills): + for code, label in sorted(skills.items()): + lines.extend(['', f' {member_name(code)} = SkillRef(name={label!r}, code={code!r})', + ' ' + json.dumps(label, ensure_ascii=False)]) + + append_members(COMMON_SKILLS) + for suffix, skills in AWAKENING_SKILLS.items(): + lines.extend(['', '', f'class Awakening{suffix}SkillRefs(SkillReferences):', + f' """觉醒公共技能第 {suffix} 组;后缀沿用职业技能树原始 code。"""']) + append_members({code: ' / '.join(labels) for code, labels in skills.items()}) + lines.extend(['', '', 'class ComboSkillRefs(SkillReferences):', + ' """拥有技能连招的职业共享的引用;创造者、黑暗武士不继承。"""']) + append_members(COMBO_SKILLS) + return '\n'.join(lines) + '\n' + + +def common_groups(entries: dict, profession: str) -> tuple[list[str], set[str]]: + """校验公共技能覆盖和名称,返回适用继承分组及本职业的公共 code。""" + codes = {code: label for code, label in entries.values()} + for code, label in COMMON_SKILLS.items(): + if code not in codes: + raise ValueError(f'{profession}: 缺少公共技能 code: {code}') + if codes[code] != label: + raise ValueError(f'{profession}: 公共技能名称不一致: {code}: {codes[code]!r} != {label!r}') + groups = ['CommonSkillRefs'] + shared = set(COMMON_SKILLS) + variants = set().union(*(set(skills) for skills in AWAKENING_SKILLS.values())) + selected = variants.intersection(codes) + matching = [suffix for suffix, skills in AWAKENING_SKILLS.items() if set(skills) == selected] + if len(matching) != 1: + raise ValueError(f'{profession}: 觉醒公共技能必须为一组完整且唯一的 code: {sorted(selected)}') + suffix = matching[0] + for code, labels in AWAKENING_SKILLS[suffix].items(): + if codes[code] not in labels: + raise ValueError(f'{profession}: 觉醒公共技能名称不一致: {code}: {codes[code]!r}') + groups.append(f'Awakening{suffix}SkillRefs') + shared.update(selected) + for code, label in COMBO_SKILLS.items(): + expected = profession not in COMBO_EXCLUDED_PROFESSIONS + if (code in codes) != expected: + raise ValueError(f'{profession}: 技能连招覆盖与公共清单不一致: {code}') + if expected: + if codes[code] != label: + raise ValueError(f'{profession}: 公共技能名称不一致: {code}') + groups.append('ComboSkillRefs') + shared.add(code) + return groups, shared + + +def member_name(code: str) -> str: + """规范化 Python 成员名,原始 code 值保持不变;数字开头时添加 SKILL_。""" + if not isinstance(code, str) or not re.fullmatch(r'[A-Za-z0-9_\-]+', code): + raise ValueError(f'无效技能 code: {code!r}') + name = code.replace('-', '_').upper() + if not name or name.startswith('_'): + raise ValueError(f'无效技能成员名: {code!r}') + return f'SKILL_{name}' if name[0].isdigit() else name + + +def render_tree(path: Path, relative: Path) -> str: + """校验单职业技能树并渲染引用文件,重复 code 或成员名均报错。""" + job, profession, _ = relative.parts + if any(not re.fullmatch(r'[a-z][a-z0-9_]*', part) for part in (job, profession)): + raise ValueError(f'无效职业目录: {relative}') + rows = json.loads(path.read_text(encoding='utf-8')) + if not isinstance(rows, list) or not rows: + raise ValueError(f'{relative}: 技能树必须是非空数组') + entries = {} + codes = set() + for row in rows: + if not isinstance(row, dict): + raise ValueError(f'{relative}: 技能记录必须是对象') + code, label = row.get('code'), row.get('name') + if not isinstance(label, str) or not label.strip(): + raise ValueError(f'{relative}: 技能缺少中文名称: {code!r}') + member = member_name(code) + if code in codes: + raise ValueError(f'{relative}: 重复 code: {code}') + if member in entries: + raise ValueError(f'{relative}: 成员名冲突: {entries[member][0]} / {code} -> {member}') + codes.add(code) + entries[member] = (code, label) + groups, shared = common_groups(entries, f'{job}.{profession}') + common_members = {member_name(code) for code in shared} + class_name = ''.join(part.capitalize() for part in profession.split('_')) + 'SkillRef' + lines = [ + MARKER, + f'"""技能引用来源:{relative.as_posix()};公共技能继承自 common.py 中的适用分组。"""', + 'from core.character.refs.base import SkillRef', + 'from core.character.refs.common import ' + ', '.join(groups), + '', '', + f'class {class_name}({", ".join(groups)}):', + f' """{job}.{profession} 的技能引用;包含继承的公共技能。"""', + f" __profession__ = '{job}.{profession}'", + ] + for member, (code, label) in sorted(entries.items()): + if code in shared: + continue + if member in common_members: + raise ValueError(f'{relative}: 职业成员覆盖公共引用: {member}') + lines += ['', f' {member} = SkillRef(name={label!r}, code={code!r}, profession=__profession__)', + ' ' + json.dumps(label, ensure_ascii=False)] + return '\n'.join(lines) + '\n' + + +def expected_files(source_root: Path) -> dict[Path, str]: + """先校验全部输入,再返回期望产物,避免输入错误造成部分生成。""" + trees = sorted(source_root.glob('*/*/skill_tree.json')) + if not trees: + raise ValueError(f'未找到职业技能树: {source_root}') + files = {Path('common.py'): render_common()} + for tree in trees: + relative = tree.relative_to(source_root) + job, profession, _ = relative.parts + files[Path(job) / f'{profession}.py'] = render_tree(tree, relative) + files[Path(job) / '__init__.py'] = MARKER + '\n' + '"""职业技能引用分组;按需导入具体职业。"""\n' + return files + + +def generate(source_root: Path, output_root: Path, *, check: bool = False) -> list[str]: + """生成或只读检查引用;返回差异路径,不覆盖手工文件或自动删除旧职业。""" + expected = expected_files(source_root) + stale = [ + path.relative_to(output_root) for path in sorted(output_root.rglob('*.py')) + if path.read_text(encoding='utf-8').startswith(MARKER) and path.relative_to(output_root) not in expected + ] + if stale: + raise ValueError('存在来源已移除的生成文件,请核对后清理: ' + ', '.join(map(str, stale))) + changes = [] + for relative, content in expected.items(): + path = output_root / relative + if path.exists(): + existing = path.read_text(encoding='utf-8') + if not existing.startswith(MARKER): + raise ValueError(f'拒绝覆盖手工文件: {path}') + if existing == content: + continue + changes.append(str(relative)) + if not check: + for relative in changes: + path = output_root / relative + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(expected[Path(relative)], encoding='utf-8') + return changes + + +def main() -> int: + """命令行入口;--check 发现差异或输入校验失败时返回非零退出码。""" + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--source-root', type=Path, default=SOURCE_ROOT, help='包含职业技能树的目录') + parser.add_argument('--output-root', type=Path, default=OUTPUT_ROOT, help='生成引用文件的目录') + parser.add_argument('--check', action='store_true', help='只检查差异,不写文件') + args = parser.parse_args() + try: + changes = generate(args.source_root, args.output_root, check=args.check) + except (ValueError, OSError) as exc: + print(f'生成失败: {exc}', file=sys.stderr) + return 1 + if args.check and changes: + print('引用文件需要更新:\n' + '\n'.join(changes)) + return 1 + print(f'{"检查通过" if args.check else "生成完成"},差异文件数: {len(changes)}') + return 0 + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/scripts/migrate_generated_characters.py b/scripts/migrate_generated_characters.py index 4c08f66f..787f69e5 100644 --- a/scripts/migrate_generated_characters.py +++ b/scripts/migrate_generated_characters.py @@ -1,9 +1,11 @@ -"""Merge OpenAPI-generated layouts into runtime character modules. +"""将生成数据合并到已有职业实现。 -Skills are matched strictly by their constant ``name``. Runtime Skill class -identifiers and implementations are preserved; ``position`` and ``cellPos`` -come from the generated class. Generated-only skills are retained as commented blocks. -The runtime header and profession-specific footer are preserved unchanged. +优先按职业 ref、其次 UUID 匹配;缺少稳定身份时才兼容旧中文名称。 +保留运行时类编号、名称、关联规则和手写方法;旧技能缺少 ref 时补齐绑定及导入。 +生成器独有技能保持注释,运行时独有技能原样保留;职业变体按 prefix 查找来源。 + +先执行 backend/openapi/scripts/generate.py 同步 refs 和生成数据,再运行本脚本。 +--check 只检查合并及语法,不写职业文件;--generated-root/--character-root 可指定验证目录。 """ from __future__ import annotations @@ -30,6 +32,9 @@ class SkillBlock: end: int position: str | None cell_pos: str | None + ref: str | None + ref_key: tuple[str, str, str] | None + uuid: str | None def _offsets(source: str) -> list[int]: @@ -42,6 +47,12 @@ def _offsets(source: str) -> list[int]: def _skills(source: str, path: Path) -> list[SkillBlock]: tree = ast.parse(source, filename=str(path)) offsets = _offsets(source) + imports = { + item.asname or item.name: (node.module, item.name) + for node in tree.body if isinstance(node, ast.ImportFrom) + and (node.module or '').startswith('core.character.refs.') + for item in node.names + } result: list[SkillBlock] = [] for node in tree.body: if not isinstance(node, ast.ClassDef) or not re.fullmatch(r"Skill\d+", node.name): @@ -49,12 +60,21 @@ def _skills(source: str, path: Path) -> list[SkillBlock]: name = None position = None cell_pos = None + ref = ref_key = uuid = None for statement in node.body: if not isinstance(statement, (ast.Assign, ast.AnnAssign)): continue targets = statement.targets if isinstance(statement, ast.Assign) else [statement.target] if len(targets) != 1 or not isinstance(targets[0], ast.Name): continue + if targets[0].id == 'uuid' and isinstance(statement.value, ast.Constant): + uuid = statement.value.value + if targets[0].id == 'ref': + value = statement.value + if not isinstance(value, ast.Attribute) or not isinstance(value.value, ast.Name) or value.value.id not in imports: + raise ValueError(f'{path}: 技能 ref 必须引用已导入的职业 Ref 成员') + ref = ast.unparse(value) + ref_key = (*imports[value.value.id], value.attr) if targets[0].id == "name" and isinstance(statement.value, ast.Constant): name = statement.value.value elif targets[0].id == "position": @@ -71,6 +91,7 @@ def _skills(source: str, path: Path) -> list[SkillBlock]: offsets[node.end_lineno], position, cell_pos, + ref, ref_key, uuid, ) ) return result @@ -458,11 +479,72 @@ def _sync_module_assignment( def _comment(block: str, name: str) -> str: - lines = [f"# MIGRATION: character 中没有同名技能“{name}”,暂不启用\n"] + lines = [f"# MIGRATION: character 中没有匹配身份的技能“{name}”,暂不启用\n"] lines.extend("# " + line.rstrip() + "\n" if line.strip() else "#\n" for line in block.splitlines()) return "".join(lines) +def _identity_indexes(skills, path): + """校验稳定身份唯一性,禁止重复引用或 UUID 被字典静默覆盖。""" + indexes = {} + for field in ('ref_key', 'uuid', 'skill_name'): + index = {} + for skill in skills: + value = getattr(skill, field) + if value is None: + continue + if value in index: + raise ValueError(f'{path}: duplicate {field}: {value}') + index[value] = skill + indexes[field] = index + return indexes + + +def _match_skill(skill, indexes): + """优先 ref、其次 UUID;仅在缺少可比较身份时兼容旧中文名称。""" + by_ref = indexes['ref_key'].get(skill.ref_key) + by_uuid = indexes['uuid'].get(skill.uuid) + if by_ref is not None and by_uuid is not None and by_ref is not by_uuid: + raise ValueError(f'技能 ref 与 UUID 指向不同目标: {skill.skill_name}') + candidate = by_ref or by_uuid or indexes['skill_name'].get(skill.skill_name) + if candidate is None: + return None + if skill.ref_key and candidate.ref_key and skill.ref_key != candidate.ref_key: + raise ValueError(f'技能引用冲突: {skill.skill_name}: {candidate.ref} -> {skill.ref}') + if by_ref is None and skill.uuid and candidate.uuid and skill.uuid != candidate.uuid: + raise ValueError(f'同名技能 UUID 冲突: {skill.skill_name}') + return candidate + + +def _ensure_ref_imports(source, generated): + """补齐生成代码的职业 Ref 导入,保留原有别名,拒绝别名指向不同对象。""" + tree = ast.parse(source) + imports = { + item.asname or item.name: (node.module, item.name) + for node in tree.body if isinstance(node, ast.ImportFrom) for item in node.names + } + additions = [] + for node in ast.parse(generated).body: + if not isinstance(node, ast.ImportFrom) or not (node.module or '').startswith('core.character.refs.'): + continue + for item in node.names: + alias = item.asname or item.name + if alias in imports: + if imports[alias] != (node.module, item.name): + raise ValueError(f'职业引用导入别名冲突: {alias}') + else: + additions.append(f'from {node.module} import {item.name}' + (f' as {item.asname}' if item.asname else '') + '\n') + imports[alias] = (node.module, item.name) + if not additions: + return source + position = max((node.end_lineno for node in tree.body if isinstance(node, (ast.Import, ast.ImportFrom))), default=0) + if position == 0: + return ''.join(additions) + '\n' + source.lstrip('\r\n') + lines = source.splitlines(keepends=True) + lines[position:position] = additions + return ''.join(lines) + + def merge(generated_path: Path, character_path: Path) -> tuple[str, dict[str, int]]: generated = generated_path.read_text(encoding="utf-8") character = character_path.read_text(encoding="utf-8") @@ -470,9 +552,9 @@ def merge(generated_path: Path, character_path: Path) -> tuple[str, dict[str, in character_skills = _skills(character, character_path) if not generated_skills or not character_skills: raise ValueError(f"missing skills: {generated_path} or {character_path}") - runtime = {skill.skill_name: skill for skill in character_skills} - if len(runtime) != len(character_skills): - raise ValueError(f"duplicate skill name: {character_path}") + runtime = _identity_indexes(character_skills, character_path) + _identity_indexes(generated_skills, generated_path) + used = set() character_header_end, character_footer_start = _module_skill_bounds(character, character_path) generated_header_end, _ = _module_skill_bounds(generated, generated_path) @@ -483,13 +565,21 @@ def merge(generated_path: Path, character_path: Path) -> tuple[str, dict[str, in for index, generated_skill in enumerate(generated_skills): if index: chunks.append(generated[cursor:generated_skill.start]) - runtime_skill = runtime.get(generated_skill.skill_name) + runtime_skill = _match_skill(generated_skill, runtime) if runtime_skill is None: chunks.append(_comment(generated[generated_skill.start:generated_skill.end], generated_skill.skill_name)) commented += 1 else: + if runtime_skill.class_name in used: + raise ValueError(f'多个生成技能匹配同一运行时技能: {runtime_skill.class_name}') + used.add(runtime_skill.class_name) block = character[runtime_skill.start:runtime_skill.end] generated_block = generated[generated_skill.start:generated_skill.end] + if generated_skill.ref is not None and runtime_skill.ref is None: + block = _set_generated_field(block, 'ref', generated_skill.ref) + # 名称保留运行时值,防止破坏未迁移的名称关联;稳定 ref 匹配不要求名称相同。 + if generated_skill.uuid is not None and generated_skill.ref_key == runtime_skill.ref_key and generated_skill.ref_key is not None: + block = _set_generated_field(block, 'uuid', repr(generated_skill.uuid)) block = _sync_generated_assignment(block, generated_block, "vps") block = _sync_generated_data(block, generated_block) block = _sync_generated_comments(block, generated_block) @@ -502,11 +592,16 @@ def merge(generated_path: Path, character_path: Path) -> tuple[str, dict[str, in chunks.append(block.rstrip() + "\n") matched += 1 cursor = generated_skill.end + # 未出现在新生成数据中的手写技能必须保留,不能随布局重建被删除。 + for skill in character_skills: + if skill.class_name not in used: + chunks.append('\n' + character[skill.start:skill.end].rstrip() + '\n') chunks.append("\n" + character[character_footer_start:].lstrip("\r\n")) merged = "".join(chunks) merged = "\n".join(line.rstrip() for line in merged.splitlines()) + "\n" merged = _sync_module_assignment(merged, generated, "prefix") merged = _ensure_get_data_import(merged) + merged = _ensure_ref_imports(merged, generated) return merged, { "generated": len(generated_skills), "runtime": len(character_skills), "matched": matched, "commented": commented, @@ -545,12 +640,22 @@ def _atomic_write(path: Path, content: str) -> None: def main() -> int: parser = argparse.ArgumentParser() parser.add_argument("--check", action="store_true", help="validate without writing") + parser.add_argument("--generated-root", type=Path, default=GENERATED_ROOT) + parser.add_argument("--character-root", type=Path, default=CHARACTER_ROOT) args = parser.parse_args() totals = {key: 0 for key in ("files", "generated", "runtime", "matched", "commented", "runtime_only")} - for generated_path in sorted(GENERATED_ROOT.rglob("*.py")): - character_path = CHARACTER_ROOT / generated_path.relative_to(GENERATED_ROOT) - if not character_path.exists(): - print(f"SKIP {generated_path.relative_to(GENERATED_ROOT)}: no runtime profession") + for character_path in sorted(args.character_root.rglob("*.py")): + if character_path.name == '__init__.py': + continue + # 使用数据 prefix 找生成来源,输出圣骑士等变体也能复用来源职业。 + module = ast.parse(character_path.read_text(encoding='utf-8')) + prefix = next((node.value.value for node in module.body + if _statement_key(node) == 'prefix' and isinstance(node.value, ast.Constant)), None) + relative = character_path.relative_to(args.character_root) + generated_relative = Path(*prefix.split('/')[:2]).with_suffix('.py') if isinstance(prefix, str) else relative + generated_path = args.generated_root / generated_relative + if not generated_path.exists(): + print(f"SKIP {relative}: no generated profession") continue output, stats = merge(generated_path, character_path) ast.parse(output, filename=str(character_path)) @@ -559,7 +664,7 @@ def main() -> int: totals["files"] += 1 for key, value in stats.items(): totals[key] += value - print(f"{'CHECK' if args.check else 'WRITE'} {generated_path.relative_to(GENERATED_ROOT)}: " + print(f"{'CHECK' if args.check else 'WRITE'} {relative}: " f"matched={stats['matched']} commented={stats['commented']} runtime_only={stats['runtime_only']}") print("TOTAL " + " ".join(f"{key}={value}" for key, value in totals.items())) return 0