feat(editor): 完成英雄配置编辑器全功能开发
本提交新增完整的英雄配置可视化编辑器: 1. 初始化前后端项目结构,配置monorepo工作区 2. 实现后端API服务,支持读取游戏配置、导出hexport.ts文件 3. 开发前端Vue应用,包含完整的英雄增删改、属性配置、技能编辑功能 4. 实现多类型编辑器组件:基础属性、普攻/大招编辑、触发技能、光环、复活、属性加成等 5. 清理冗余的配置元数据文件
This commit is contained in:
72
put/web/src/components/TriggerGroupEditor.vue
Normal file
72
put/web/src/components/TriggerGroupEditor.vue
Normal file
@@ -0,0 +1,72 @@
|
||||
<template>
|
||||
<div>
|
||||
<div v-for="(group, sid) in model" :key="sid" class="skill-block">
|
||||
<div class="head">
|
||||
<span>技能 {{ sid }} — {{ skillName(sid) }}</span>
|
||||
<el-button type="danger" size="small" text @click="removeGroup(sid)">删除组</el-button>
|
||||
</div>
|
||||
<div v-for="(entry, idx) in group" :key="idx" style="border-top: 1px dashed #eee; padding-top: 8px; margin-top: 8px">
|
||||
<div class="form-grid">
|
||||
<el-form-item label="等级 lv">
|
||||
<el-input-number v-model="entry.lv" :min="1" :max="20" :controls="false" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="SkillLv">
|
||||
<el-select v-model="entry.s_lv">
|
||||
<el-option v-for="n in 5" :key="n" :label="`Lv${n}`" :value="n" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="t_num (1=每次,3≈33%,4≈25%)">
|
||||
<el-input-number v-model="entry.t_num" :min="1" :controls="false" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="组名(仅第1档)" v-if="idx === 0">
|
||||
<el-input v-model="entry.name" />
|
||||
</el-form-item>
|
||||
</div>
|
||||
<el-form-item label="overrides">
|
||||
<OverrideEditor v-model="entry.overrides" />
|
||||
</el-form-item>
|
||||
<el-form-item label="描述">
|
||||
<el-input v-model="entry.desc" type="textarea" :rows="2" />
|
||||
</el-form-item>
|
||||
<el-button type="danger" size="small" text @click="group.splice(idx, 1)">删除档位</el-button>
|
||||
</div>
|
||||
<el-button size="small" @click="addEntry(group)" style="margin-top: 6px">+ 添加档位</el-button>
|
||||
</div>
|
||||
<div style="display: flex; gap: 8px; align-items: center">
|
||||
<el-select v-model="newSid" placeholder="选择触发技能" filterable style="width: 240px">
|
||||
<el-option v-for="s in skillOptions" :key="s.uuid" :label="`${s.uuid} ${s.name}`" :value="s.uuid" />
|
||||
</el-select>
|
||||
<el-button size="small" type="primary" @click="addGroup">+ 新增触发组</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import OverrideEditor from './OverrideEditor.vue'
|
||||
import { defaultTriggerEntry } from '../constants'
|
||||
|
||||
const props = defineProps({
|
||||
model: { type: Object, required: true }, // TriggerGrouped
|
||||
skillOptions: { type: Array, default: () => [] },
|
||||
skillMap: { type: Object, default: () => ({}) },
|
||||
})
|
||||
const newSid = ref(null)
|
||||
|
||||
function skillName(sid) {
|
||||
return props.skillMap[sid]?.name || ''
|
||||
}
|
||||
function addGroup() {
|
||||
if (!newSid.value) return
|
||||
if (!props.model[newSid.value]) props.model[newSid.value] = []
|
||||
props.model[newSid.value].push(defaultTriggerEntry(6))
|
||||
newSid.value = null
|
||||
}
|
||||
function removeGroup(sid) {
|
||||
delete props.model[sid]
|
||||
}
|
||||
function addEntry(group) {
|
||||
const lastLv = group.length ? group[group.length - 1].lv : 6
|
||||
group.push({ lv: lastLv + 3, s_lv: 2, name: '', t_num: 3, overrides: {}, desc: '' })
|
||||
}
|
||||
</script>
|
||||
Reference in New Issue
Block a user