feat(hero-config): 新增英雄额外属性加成档位的图鉴展示支持

本次变更完成了英雄bonus属性加成系统的图鉴可视化改造:
1. 扩展LvBonusAttrsEntry类型,新增name/icon/info配置字段
2. 服务端渲染兼容新增字段,仅在配置存在时输出
3. 更新英雄配置文档,补充bonus字段的新参数说明
4. 新增属性加成编辑器表单,支持配置名称、图标和自定义描述
5. 实现英雄图鉴的bonus档位图标渲染逻辑,支持锁定状态和点击弹窗
6. 新增bonus效果文案生成工具,支持自定义模板和属性自动生成
7. 为技能弹窗新增bonus专属渲染逻辑,适配属性加成档位的展示
8. 为部分测试英雄配置了bonus档位的名称属性
This commit is contained in:
panFD
2026-09-07 23:58:44 +08:00
parent 771b0aad26
commit dbc013a20f
9 changed files with 183 additions and 19 deletions

View File

@@ -100,7 +100,8 @@
"lv": 12,
"attrs": {
"def": 50
}
},
"name": "钢铁壁垒"
}
]
},
@@ -200,7 +201,8 @@
"lv": 12,
"attrs": {
"hp": 50
}
},
"name": "不屈战意"
}
]
},
@@ -297,7 +299,8 @@
"lv": 12,
"attrs": {
"hp": 50
}
},
"name": "不屈战意"
}
]
},
@@ -396,7 +399,8 @@
"lv": 12,
"attrs": {
"ap": 50
}
},
"name": "致命本能"
}
]
},
@@ -496,7 +500,8 @@
"lv": 12,
"attrs": {
"ap": 50
}
},
"name": "致命本能"
}
]
},
@@ -594,7 +599,8 @@
"lv": 12,
"attrs": {
"ap": 50
}
},
"name": "鹰眼锁定"
}
]
},
@@ -692,7 +698,8 @@
"lv": 12,
"attrs": {
"ap": 50
}
},
"name": "奥术共鸣"
}
]
},
@@ -787,7 +794,8 @@
"lv": 12,
"attrs": {
"hp": 50
}
},
"name": "守护之心"
}
]
},
@@ -889,7 +897,8 @@
"lv": 12,
"attrs": {
"def": 50
}
},
"name": "钢铁壁垒"
}
]
},
@@ -989,7 +998,8 @@
"lv": 12,
"attrs": {
"ap": 50
}
},
"name": "鹰眼锁定"
}
]
},
@@ -1092,7 +1102,8 @@
"lv": 12,
"attrs": {
"def": 50
}
},
"name": "钢铁壁垒"
}
]
},
@@ -1214,7 +1225,8 @@
"lv": 12,
"attrs": {
"ap": 50
}
},
"name": "奥术共鸣"
}
]
},
@@ -1321,7 +1333,8 @@
"lv": 12,
"attrs": {
"hp": 50
}
},
"name": "守护之心"
}
]
},
@@ -1426,7 +1439,8 @@
"lv": 12,
"attrs": {
"hp": 50
}
},
"name": "不屈战意"
}
]
}

View File

@@ -44,7 +44,7 @@
| `skills` | array | **恰好 2 个**:`[普攻, 大招]`,结构见 §3 |
| `atking`/`atked`/`fstart`/`dead` | object | 触发组,结构见 §4 |
| `field` | array | 驻场光环档位,结构见 §5 |
| `bonus` | array | 额外属性加成 `[{lv,attrs:{...}}]`,运行时累加所有 lv ≤ 英雄等级 的档位;`hp`/`ap`/`def` 为百分比(基数取"基础×品质+成长"快照,多档加法叠加),`crt`/`frz`/`stun`/`para` 为固定百分点;常规英雄留空 |
| `bonus` | array | 额外属性加成 `[{lv,attrs:{...},name?,icon?,info?}]`,运行时累加所有 lv ≤ 英雄等级 的档位;`hp`/`ap`/`def` 为百分比(基数取"基础×品质+成长"快照,多档加法叠加),`crt`/`frz`/`stun`/`para` 为固定百分点;配了 `icon` 的档位在图鉴技能列表最末出图标(点击弹窗展示 name/效果,描述缺省按 attrs 自动生成,`info` 可自定义模板支持 `{lv}` 占位);常规英雄留空 |
| `info` | string | 描述文案,可空 |
| `revive` | — | **已废弃**:复活改在 `dead` 组 overrides 里配 `revive_hp`/`revive_count`,不要写独立字段 |

View File

@@ -206,7 +206,11 @@ function renderSingleHero(h) {
if (bonusList.length) {
push(` bonus: [`)
for (const b of bonusList) {
push(` { lv: ${b.lv}, attrs: ${JSON.stringify(b.attrs)} },`)
// 展示字段(name/icon/info)非空才输出,保持底座纯净
const nameSeg = b.name ? ` name: ${JSON.stringify(b.name)},` : ''
const iconSeg = b.icon ? ` icon: ${JSON.stringify(b.icon)},` : ''
const infoSeg = b.info ? ` info: ${JSON.stringify(b.info)},` : ''
push(` { lv: ${b.lv}, attrs: ${JSON.stringify(b.attrs)},${nameSeg}${iconSeg}${infoSeg} },`)
}
push(` ],`)
}

View File

@@ -9,7 +9,18 @@
<el-form-item label="等级 lv">
<el-input-number v-model="b.lv" :min="1" :max="20" :controls="false" style="width: 100%" />
</el-form-item>
<el-form-item label="名称 name">
<el-input v-model="b.name" placeholder="如 钢铁壁垒(缺省不出图标)" />
</el-form-item>
<el-form-item label="图标 icon">
<el-select v-model="b.icon" clearable filterable allow-create placeholder="gui/ui7 帧名(缺省该档不出图标)">
<el-option v-for="opt in SKILL_ICON_OPTIONS" :key="opt" :label="opt" :value="opt" />
</el-select>
</el-form-item>
</div>
<el-form-item label="自定义描述 info">
<el-input v-model="b.info" type="textarea" :rows="1" placeholder="可选;占位符 {lv} 替换为解锁等级;缺省按属性自动生成效果文案" />
</el-form-item>
<el-form-item label="属性加成">
<div style="width: 100%">
<div v-for="(a, i) in attrList(b)" :key="i" style="display: flex; gap: 8px; margin-bottom: 6px">