Compare commits
2 Commits
923d81c2a0
...
5583dca2b6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5583dca2b6 | ||
|
|
b63572c383 |
@@ -544,6 +544,15 @@ export class HeroViewComp extends CCComp {
|
||||
// 清理残留的定时器和缓动
|
||||
this.unscheduleAllCallbacks();
|
||||
Tween.stopAllByTarget(this.node);
|
||||
// 清理挂在节点下未播完的特效子节点(冰冻/击晕/受击等),
|
||||
// 防止对象池复用节点时把上一个单位的特效带到新单位身上。
|
||||
// 判定依据:特效由 spawnTimedFx/spawnAnimEndFx 实例化并挂 timedCom/oneCom,
|
||||
// 预制体自带子节点(anm/top 等)无这两个组件,不受影响。
|
||||
for (const child of [...this.node.children]) {
|
||||
if (child.getComponent(timedCom) || child.getComponent(oneCom)) {
|
||||
child.destroy();
|
||||
}
|
||||
}
|
||||
this.topBar.reset();
|
||||
|
||||
// 清理碰撞器事件监听
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
| `statBase` | {hp,ap,def} | 相对 `HERO_ROLE_BASE[roleKey]` 的**偏移量**(可为负,如 5007 hp=−5);惯例量级 ±5/10/20/30 |
|
||||
| `dis` / `speed` | number\|null | 英雄一般 null(走默认);显式配置才填 |
|
||||
| `skills` | array | **恰好 2 个**:`[普攻, 大招]`,结构见 §3 |
|
||||
| `atking`/`atked`/`fstart`/`dead` | object | 触发组,结构见 §4 |
|
||||
| `atking`/`atked`/`fstart`/`fend`/`dead` | object | 触发组,结构见 §4 |
|
||||
| `field` | array | 驻场光环档位,结构见 §5 |
|
||||
| `bonus` | array | 额外属性加成 `[{lv,attrs:{...},name?,icon?,info?}]`,运行时累加所有 lv ≤ 英雄等级 的档位;`hp`/`ap`/`def` 为百分比(基数取"基础×品质+成长"快照,多档加法叠加),`crt`/`frz`/`stun`/`para` 为固定百分点;配了 `icon` 的档位在图鉴技能列表最末出图标(点击弹窗展示 name/效果,描述缺省按 attrs 自动生成,`info` 可自定义模板支持 `{lv}` 占位);常规英雄留空 |
|
||||
| `info` | string | 描述文案,可空 |
|
||||
@@ -67,12 +67,12 @@
|
||||
- `desc` 为描述模板,占位符 `{target}` `{ap}` `{dur}` `{技能字段名}` 由 HeroSkillText 渲染实时数值;空字符串等价省略;
|
||||
- 档位 `overrides` 与基础 `overrides` **浅合并**(档位优先),档位只写变化键。
|
||||
|
||||
## 4. 触发组规范(atking / atked / fstart / dead)
|
||||
## 4. 触发组规范(atking / atked / fstart / fend / dead)
|
||||
|
||||
- 结构:`{ "<技能uuid字符串>": [条目, ...] }`,一个组可挂多个技能 uuid;
|
||||
- 条目:`{lv, s_lv, name, t_num, overrides, desc}`;
|
||||
- 解锁等级惯例 **lv4**(`lv:4, s_lv:1`;heroSet.ts 头部注释写的 lv6 已过时,现有英雄与编辑器默认值均为 lv4);
|
||||
- `t_num`:每 n 次普攻(atking)/受击(atked)触发一次;
|
||||
- `t_num`:每 n 次普攻(atking)/受击(atked)触发一次;fstart/fend 为每回合开始/结束固定触发 1 次,`t_num` 恒填 1;
|
||||
- `name` 为组对外展示名(写在该组首档),留空回退底座名;
|
||||
- 复活:在 `dead` 某条目 `overrides` 配 `revive_hp`(回血%)+ `revive_count`(次数上限);
|
||||
- 无触发组时写空对象 `{}`,**不要省略字段**。
|
||||
|
||||
@@ -130,7 +130,7 @@ app.post('/api/templates', (req, res) => {
|
||||
return res.status(400).json({ error: 'triggerPresets 与 fieldPresets 必须为数组' })
|
||||
}
|
||||
// 触发预设必须绑定合法触发组
|
||||
const groups = ['atking', 'atked', 'fstart', 'dead']
|
||||
const groups = ['atking', 'atked', 'fstart', 'fend', 'dead']
|
||||
const bad = triggerPresets.find((p) => !groups.includes(p.group))
|
||||
if (bad) {
|
||||
return res.status(400).json({ error: `触发预设 ${bad.id || bad.label} 的 group 非法:${bad.group}` })
|
||||
@@ -203,7 +203,7 @@ function renderSingleHero(h) {
|
||||
push(` },`)
|
||||
|
||||
// triggers
|
||||
const triggerKeys = ['atking', 'atked', 'fstart', 'dead']
|
||||
const triggerKeys = ['atking', 'atked', 'fstart', 'fend', 'dead']
|
||||
for (const tk of triggerKeys) {
|
||||
const grp = h[tk]
|
||||
if (!grp || !Object.keys(grp).length) continue
|
||||
@@ -413,6 +413,7 @@ function renderHeroCsv(heroes) {
|
||||
rows.push(['atking[0]_lv4', ...sorted.map((h) => csvTrigger(h.atking))])
|
||||
rows.push(['atked[0]_lv4', ...sorted.map((h) => csvTrigger(h.atked))])
|
||||
rows.push(['fstart[0]_lv4', ...sorted.map((h) => csvTrigger(h.fstart))])
|
||||
rows.push(['fend[0]_lv4', ...sorted.map((h) => csvTrigger(h.fend))])
|
||||
rows.push(['dead[0]_lv4', ...sorted.map((h) => csvTrigger(h.dead))])
|
||||
rows.push(['field[0]_lv4', ...sorted.map((h) => csvField(h.field))])
|
||||
rows.push(['bonus', ...sorted.map((h) => csvBonus(h.bonus))])
|
||||
|
||||
@@ -168,6 +168,7 @@
|
||||
<el-tab-pane label="atking 攻击后"><TriggerGroupEditor :model="current.atking" :skill-options="allSkills" :skill-map="skillMap" :buff-options="buffOptions" /></el-tab-pane>
|
||||
<el-tab-pane label="atked 受击后"><TriggerGroupEditor :model="current.atked" :skill-options="allSkills" :skill-map="skillMap" :buff-options="buffOptions" /></el-tab-pane>
|
||||
<el-tab-pane label="fstart 战斗开始"><TriggerGroupEditor :model="current.fstart" :skill-options="allSkills" :skill-map="skillMap" :buff-options="buffOptions" /></el-tab-pane>
|
||||
<el-tab-pane label="fend 回合结束"><TriggerGroupEditor :model="current.fend" :skill-options="allSkills" :skill-map="skillMap" :buff-options="buffOptions" /></el-tab-pane>
|
||||
<el-tab-pane label="dead 死亡后"><TriggerGroupEditor :model="current.dead" :skill-options="allSkills" :skill-map="skillMap" :buff-options="buffOptions" /></el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
@@ -369,7 +370,7 @@ function heroStats(h) {
|
||||
// 触发明细行:atking: 6004 奋力一击 lv4 ap300 格式,仅输出已启用的组
|
||||
function triggerSummary(h) {
|
||||
const lines = []
|
||||
for (const tk of ['atking', 'atked', 'fstart', 'dead']) {
|
||||
for (const tk of ['atking', 'atked', 'fstart', 'fend', 'dead']) {
|
||||
const grp = h[tk]
|
||||
if (!grp) continue
|
||||
for (const [sid, entries] of Object.entries(grp)) {
|
||||
@@ -384,7 +385,7 @@ function triggerSummary(h) {
|
||||
return lines
|
||||
}
|
||||
function hasTriggers(h) {
|
||||
return ['atking', 'atked', 'fstart', 'dead'].some((k) => h[k] && Object.keys(h[k]).length)
|
||||
return ['atking', 'atked', 'fstart', 'fend', 'dead'].some((k) => h[k] && Object.keys(h[k]).length)
|
||||
}
|
||||
// 光环明细行:lv4 · 大圣神威 0.25
|
||||
function fieldSummary(h) {
|
||||
@@ -471,9 +472,11 @@ async function loadHeroes() {
|
||||
try {
|
||||
const r = await api.fetchHeroes()
|
||||
if (Array.isArray(r.heroes) && r.heroes.length) {
|
||||
// 兼容旧数据:ap_bonus/hp_bonus/def_bonus 已废弃,统一迁移为空 bonus
|
||||
// 兼容旧数据:ap_bonus/hp_bonus/def_bonus 已废弃,统一迁移为空 bonus;
|
||||
// 旧英雄无 fend 触发组(后期新增),补空对象避免 TriggerGroupEditor 拿到 undefined
|
||||
for (const h of r.heroes) {
|
||||
if (!Array.isArray(h.bonus)) h.bonus = []
|
||||
if (!h.fend) h.fend = {}
|
||||
delete h.ap_bonus; delete h.hp_bonus; delete h.def_bonus
|
||||
}
|
||||
heroes.value = r.heroes
|
||||
|
||||
@@ -79,6 +79,7 @@ export const TRIGGER_GROUPS = [
|
||||
{ key: 'atking', label: 'atking 攻击后' },
|
||||
{ key: 'atked', label: 'atked 受击后' },
|
||||
{ key: 'fstart', label: 'fstart 战斗开始' },
|
||||
{ key: 'fend', label: 'fend 回合结束' },
|
||||
{ key: 'dead', label: 'dead 死亡后' },
|
||||
]
|
||||
|
||||
@@ -101,6 +102,7 @@ export function defaultHero() {
|
||||
atking: {}, // {uuid:[{lv,s_lv,name,t_num,overrides,desc}]}
|
||||
atked: {},
|
||||
fstart: {},
|
||||
fend: {},
|
||||
dead: {},
|
||||
field: [], // [{lv,uuids:[{uuid,value,name}],desc}]
|
||||
// revive 已纳入 dead 触发组,通过 overrides.revive_hp / revive_count 配置
|
||||
|
||||
Reference in New Issue
Block a user