diff --git a/put/web/src/App.vue b/put/web/src/App.vue
index e89ddd1f..eff28cad 100644
--- a/put/web/src/App.vue
+++ b/put/web/src/App.vue
@@ -116,14 +116,14 @@
普攻 skills[0]
-
+
+ 添加普攻
大招 skills[1]
-
+
+ 添加大招
@@ -131,10 +131,10 @@
触发技能(lv4 激活)
-
-
-
-
+
+
+
+
@@ -203,6 +203,8 @@ const current = computed(() => heroes.value[activeIdx.value])
const skillMap = computed(() => meta.value?.SkillSet || {})
const allSkills = computed(() => Object.values(skillMap.value).sort((a, b) => a.uuid - b.uuid))
const fieldOptions = computed(() => Object.values(meta.value?.FieldSkillSet || {}).sort((a, b) => a.uuid - b.uuid))
+// buff 候选:timed_buff_id 覆写下拉用(BuffList 按 id 升序)
+const buffOptions = computed(() => Object.values(meta.value?.BuffList || {}).sort((a, b) => a.id - b.id))
// 复活已纳入 dead 触发组,通过 dead 编辑器的 overrides 配置 revive_hp / revive_count
const reviveOptions = computed(() => allSkills.value.filter((s) => s.uuid >= 6500 && s.uuid < 6600))
diff --git a/put/web/src/components/OverrideEditor.vue b/put/web/src/components/OverrideEditor.vue
index 5995427a..b61c4c79 100644
--- a/put/web/src/components/OverrideEditor.vue
+++ b/put/web/src/components/OverrideEditor.vue
@@ -50,10 +50,27 @@
/>
被触发技能覆写:
-
+
+
+
+
+ {{ b.id }} {{ b.name }}
+ {{ b.info }}
+
+
删除
@@ -69,6 +86,8 @@ const props = defineProps({
modelValue: { type: Object, default: () => ({}) },
// 全部技能候选(proc_skill.s_uuid 下拉用),由 App 经 SkillEditor 透传
skillOptions: { type: Array, default: () => [] },
+ // 全部 buff 候选(timed_buff_id 下拉用),由 App 从 meta.BuffList 计算后透传
+ buffOptions: { type: Array, default: () => [] },
})
const emit = defineEmits(['update:modelValue'])
@@ -131,6 +150,18 @@ function enumOptions(key) {
return OVERRIDE_KEYS.find((k) => k.key === key)?.options || []
}
+// 该覆写字段是否为 buff 型(timed_buff_id:值为 BuffList 配置 id)
+function isBuffKey(key) {
+ return OVERRIDE_KEYS.find((k) => k.key === key)?.type === 'buff'
+}
+
+// allow-create 手输的 buff id 是字符串,归一化为数字,保证导出 TS 配置类型正确
+function onBuffValueChange(item) {
+ if (typeof item.value === 'string' && item.value.trim() !== '' && !isNaN(Number(item.value))) {
+ item.value = Number(item.value)
+ }
+}
+
// 对象型覆写行选中时初始化默认结构,避免 v-model 绑定到 undefined 子字段
function onKeyChange(item) {
if (isObjectKey(item.key)) {
@@ -140,6 +171,8 @@ function onKeyChange(item) {
} else if (isEnumKey(item.key)) {
// 枚举默认取首个候选值
item.value = enumOptions(item.key)[0]?.value
+ } else if (isBuffKey(item.key)) {
+ item.value = undefined // buff id 必须显式选择,0 不是合法 id
} else {
item.value = 0
}
diff --git a/put/web/src/components/SkillEditor.vue b/put/web/src/components/SkillEditor.vue
index bed247b6..f398dba9 100644
--- a/put/web/src/components/SkillEditor.vue
+++ b/put/web/src/components/SkillEditor.vue
@@ -25,7 +25,7 @@
-
+
@@ -47,7 +47,7 @@
-
+
@@ -72,6 +72,8 @@ const props = defineProps({
options: { type: Array, default: () => [] },
// 全部技能候选(proc_skill.s_uuid 下拉用),由 App 透传
skillOptions: { type: Array, default: () => [] },
+ // 全部 buff 候选(timed_buff_id 下拉用),由 App 透传
+ buffOptions: { type: Array, default: () => [] },
isUlt: { type: Boolean, default: false },
// 普攻 lv2 强化档模式:仅允许配置单个 lv2 档(lv=2 / s_lv=2 锁定,禁用增删)
basicLv2: { type: Boolean, default: false },
diff --git a/put/web/src/components/TriggerGroupEditor.vue b/put/web/src/components/TriggerGroupEditor.vue
index ae9a29ff..17ddce74 100644
--- a/put/web/src/components/TriggerGroupEditor.vue
+++ b/put/web/src/components/TriggerGroupEditor.vue
@@ -23,7 +23,7 @@
-
+
@@ -50,6 +50,8 @@ const props = defineProps({
model: { type: Object, required: true }, // TriggerGrouped
skillOptions: { type: Array, default: () => [] },
skillMap: { type: Object, default: () => ({}) },
+ // 全部 buff 候选(timed_buff_id 下拉用),由 App 透传
+ buffOptions: { type: Array, default: () => [] },
})
const newSid = ref(null)
diff --git a/put/web/src/constants.js b/put/web/src/constants.js
index f86b1550..ed76778e 100644
--- a/put/web/src/constants.js
+++ b/put/web/src/constants.js
@@ -52,7 +52,7 @@ export const ROLE_ULT_SKILL = {
}
// 辅助类技能(任意职业可用作大招)
-export const SUPPORT_ULT = [6301, 6302, 6407, 6412, 6413, 6414, 6501, 6514, 6515, 6516]
+export const SUPPORT_ULT = [6301, 6302, 6407, 6412, 6413, 6414, 6501, 6514, 6515, 6516, 6517]
export function defaultHero() {
return {
@@ -108,7 +108,8 @@ export const OVERRIDE_KEYS = [
{ key: 'para', label: 'para 麻痹概率' },
{ key: 'bck', label: 'bck 击退' },
{ key: 'bck_chance', label: 'bck_chance 击退概率' },
- { key: 'timed_buff_id', label: 'timed_buff_id 计时buff' },
+ // buff 型覆写:值为 BuffList 配置 id,前端用 meta.BuffList 渲染下拉(支持 allow-create 手输兜底)
+ { key: 'timed_buff_id', label: 'timed_buff_id 计时buff', type: 'buff' },
{ key: 'buff_value', label: 'buff_value 修饰数值' },
{ key: 'buff_duration', label: 'buff_duration 持续时间' },
{ key: 'buff_chance', label: 'buff_chance 附加概率' },