refactor(skill): 重构大招CD配置体系,统一档位管理

1. 新增大招CD档位配置ULT_CDS/ULT_CD_MAP,与普攻档位分离
2. 为职业默认值添加大招CD档配置,支持按职业类型适配
3. 改造技能编辑器与英雄向导,支持选择大招CD档位
4. 批量更新现有英雄数据与配置文件,统一使用档位化CD配置
5. 补充文档说明,规范大招CD配置规则
This commit is contained in:
panFD
2026-09-14 23:00:06 +08:00
parent 8c8810bb7e
commit 93dc59a616
8 changed files with 187 additions and 118 deletions

View File

@@ -69,8 +69,13 @@
<el-option v-for="uuid in ultSkillOptions" :key="uuid" :label="`${uuid} ${skillName(uuid)}`" :value="uuid" />
</el-select>
</el-form-item>
<el-form-item label="大招CD档">
<el-select v-model="form.ultCd">
<el-option v-for="s in ULT_CDS" :key="s.key" :label="s.label" :value="s.key" />
</el-select>
</el-form-item>
</div>
<div class="muted" style="font-size: 11px">普攻自动按攻速档生成 cd/cdExpr + lv2 档(ap120);大招自动 cd:8 + lv8/lv16 档</div>
<div class="muted" style="font-size: 11px">普攻自动按攻速档生成 cd/cdExpr + lv2 档(ap120);大招自动按CD档生成 cd/cdExpr + lv8/lv16 档</div>
</div>
<div class="panel">
@@ -115,7 +120,7 @@
<script setup>
import { ref, computed } from 'vue'
import {
HERO_ROLES, H_TYPES, ATK_SPEEDS, ATK_SPEED_MAP,
HERO_ROLES, H_TYPES, ATK_SPEEDS, ATK_SPEED_MAP, ULT_CDS, ULT_CD_MAP,
ROLE_DEFAULTS, TRIGGER_GROUPS,
ROLE_ATK_SKILL, ROLE_ULT_SKILL, SUPPORT_ULT,
defaultHero,
@@ -141,6 +146,7 @@ function emptyForm() {
rarity: 4,
typeKey: 'Melee',
atkSpeed: 'Normal',
ultCd: 'Normal',
statBase: { hp: 0, ap: 0, def: 0 },
path: '',
atkUuid: null,
@@ -166,11 +172,12 @@ function presetTriggerLabel(p) {
function onRoleChange(roleKey) {
form.value.roleKey = roleKey
// 职业默认值:形态/攻速/稀有度/三维偏移(用户可微调)
// 职业默认值:形态/攻速/大招CD档/稀有度/三维偏移(用户可微调)
const d = ROLE_DEFAULTS[roleKey]
if (d) {
form.value.typeKey = d.typeKey
form.value.atkSpeed = d.atkSpeed
form.value.ultCd = d.ultCd || 'Normal'
form.value.rarity = d.rarity
form.value.statBase = { ...d.statBase }
}
@@ -209,12 +216,13 @@ function confirm() {
desc: '',
lv_entries: [{ lv: 2, s_lv: 2, overrides: { ap: 120 }, desc: '' }],
}
// 大招:cd:8 + lv8/lv16 档(对齐 addUltSkill 惯例)
// 大招:cd/cdExpr 按大招CD档生成;lv8/lv16 档(对齐 addUltSkill 惯例)
const ultCdConf = ULT_CD_MAP[f.ultCd] || ULT_CD_MAP.Normal
hero.skills[1] = {
uuid: f.ultUuid,
name: '',
cd: 8,
cdExpr: null,
cd: ultCdConf.cd,
cdExpr: ultCdConf.cdExpr,
overrides: {},
desc: '',
lv_entries: [

View File

@@ -12,9 +12,9 @@
<el-form-item label="显示名">
<el-input v-model="skill.name" placeholder="对外展示名(可选)" />
</el-form-item>
<el-form-item label="攻速档位">
<el-select v-model="cdSpeedKey" @change="onSpeedChange">
<el-option v-for="s in ATK_SPEEDS" :key="s.key" :label="s.label" :value="s.key" />
<el-form-item :label="isUlt ? '大招CD档位' : '攻速档位'">
<el-select v-model="cdTierKey" @change="onTierChange">
<el-option v-for="s in (isUlt ? ULT_CDS : ATK_SPEEDS)" :key="s.key" :label="s.label" :value="s.key" />
</el-select>
</el-form-item>
<el-form-item label="CD(秒)">
@@ -64,7 +64,7 @@
<script setup>
import { computed } from 'vue'
import { ATK_SPEEDS } from '../constants'
import { ATK_SPEEDS, ATK_SPEED_MAP, ULT_CDS, ULT_CD_MAP } from '../constants'
import OverrideEditor from './OverrideEditor.vue'
const props = defineProps({
@@ -89,27 +89,24 @@ if (props.basicLv2) {
}
}
const cdSpeedKey = refFromCd(props.skill)
function refFromCd(skill) {
// 简单映射回攻速档
return computed({
get() {
const found = ATK_SPEEDS.find((s) => Math.abs(cdOf(s.key) - skill.cd) < 0.001)
return found?.key || 'Normal'
},
set() {},
})
// 档位配置:大招(isUlt)走 UltCdSet 档(6~10s),普攻走 AtkSpeedSet 档(0.75~1.5s),两档数值不重叠可按 cd 反查
function tierConf(key) {
return (props.isUlt ? ULT_CD_MAP : ATK_SPEED_MAP)[key]
}
function cdOf(key) {
const map = { VeryFast: 0.75, Fast: 0.9, Normal: 1.05, Slow: 1.2, VerySlow: 1.5 }
return map[key] ?? 1.05
}
const cdTierKey = computed({
get() {
const list = props.isUlt ? ULT_CDS : ATK_SPEEDS
const found = list.find((s) => Math.abs(tierConf(s.key).cd - props.skill.cd) < 0.001)
return found?.key || 'Normal'
},
set() {},
})
function onSpeedChange(key) {
props.skill.cd = cdOf(key)
props.skill.cdExpr = `AtkSpeedSet[AtkSpeedLv.${key}].cd`
function onTierChange(key) {
const conf = tierConf(key)
props.skill.cd = conf.cd
props.skill.cdExpr = conf.cdExpr
}
function onCdManual() {
props.skill.cdExpr = null