1. 新增触发组条目字段t_chance(触发概率)和pity_add(保底叠加),仅攻击/受击组生效 2. 为TriggerGroupEditor传入分组标识,动态显示概率配置表单项 3. 新增条目创建时继承同组末档概率参数的逻辑 4. 更新常量定义与文档说明,补充概率参数使用规则 5. 在前端展示和服务端导出中添加概率相关信息展示
245 lines
11 KiB
JavaScript
245 lines
11 KiB
JavaScript
// 共享常量与工具
|
||
export const HERO_ROLES = [
|
||
{ key: 'Tank', label: '坦克', value: 0 },
|
||
{ key: 'Warrior', label: '战士', value: 1 },
|
||
{ key: 'Assassin', label: '刺客', value: 2 },
|
||
{ key: 'Archer', label: '射手', value: 3 },
|
||
{ key: 'Mage', label: '法师', value: 4 },
|
||
{ key: 'Support', label: '辅助', value: 5 },
|
||
]
|
||
|
||
export const GROW_TYPES = [
|
||
{ key: 'Tank', label: '坦克', value: 0 },
|
||
{ key: 'Warrior', label: '战士', value: 1 },
|
||
{ key: 'Assassin', label: '刺客', value: 2 },
|
||
{ key: 'Mage', label: '法师', value: 3 },
|
||
{ key: 'Support', label: '辅助', value: 4 },
|
||
{ key: 'Archer', label: '射手', value: 5 },
|
||
]
|
||
|
||
export const H_TYPES = [
|
||
{ key: 'Melee', label: '近战', value: 0 },
|
||
{ key: 'Mid', label: '中程', value: 1 },
|
||
{ key: 'Long', label: '远程', value: 2 },
|
||
]
|
||
|
||
export const ATK_SPEEDS = [
|
||
{ key: 'VeryFast', label: '极速(0.75s)', value: 1 },
|
||
{ key: 'Fast', label: '快速(0.90s)', value: 2 },
|
||
{ key: 'Normal', label: '中速(1.05s)', value: 3 },
|
||
{ key: 'Slow', label: '慢速(1.20s)', value: 4 },
|
||
{ key: 'VerySlow', label: '极慢(1.50s)', value: 5 },
|
||
]
|
||
|
||
// 大招 CD 档位(与 heroSet.ts UltCdSet 对齐):按技能效果类型分档交错释放节奏
|
||
export const ULT_CDS = [
|
||
{ key: 'VeryFast', label: '极频(6s) 单体爆发', value: 1 },
|
||
{ key: 'Fast', label: '高频(7s) 频繁压制', value: 2 },
|
||
{ key: 'Normal', label: '标准(8s) 群体伤害/控制', value: 3 },
|
||
{ key: 'Slow', label: '低频(9s) 中度团队增益', value: 4 },
|
||
{ key: 'VerySlow', label: '稀有(10s) 全体增益/治疗/护盾', value: 5 },
|
||
]
|
||
|
||
// 按职业映射普攻底座
|
||
export const ROLE_ATK_SKILL = {
|
||
Tank: [6004],
|
||
Warrior: [6004],
|
||
Assassin: [6001, 6002, 6003, 6004],
|
||
Archer: [6004, 6006, 6007, 6008],
|
||
Mage: [6009, 6010, 6011, 6012],
|
||
Support: [6004, 6009, 6010, 6011, 6012],
|
||
}
|
||
|
||
// 按职业映射大招底座
|
||
export const ROLE_ULT_SKILL = {
|
||
Tank: [6100, 6101, 6102, 6103, 6104],
|
||
Warrior: [6100, 6101, 6102, 6103, 6104],
|
||
Assassin: [6150, 6151],
|
||
Archer: [6150, 6151],
|
||
Mage: [6200, 6201, 6202, 6203, 6204],
|
||
Support: [6200, 6201, 6202, 6203, 6204],
|
||
}
|
||
|
||
// 辅助类技能(任意职业可用作大招)
|
||
export const SUPPORT_ULT = [6301, 6302, 6407, 6412, 6413, 6414, 6415, 6416, 6501, 6514, 6515, 6516, 6517, 6518, 6519]
|
||
|
||
// 职业默认值(新建英雄向导用):形态/攻速/大招CD档/稀有度/三维偏移
|
||
// 数值取自现有英雄样本中位数,向导内可手动微调
|
||
export const ROLE_DEFAULTS = {
|
||
Tank: { typeKey: 'Melee', atkSpeed: 'Slow', ultCd: 'VerySlow', rarity: 4, statBase: { hp: 20, ap: 0, def: 10 } },
|
||
Warrior: { typeKey: 'Melee', atkSpeed: 'Slow', ultCd: 'Normal', rarity: 4, statBase: { hp: 5, ap: 20, def: 5 } },
|
||
Assassin: { typeKey: 'Mid', atkSpeed: 'Fast', ultCd: 'VeryFast', rarity: 4, statBase: { hp: 0, ap: 30, def: 0 } },
|
||
Archer: { typeKey: 'Long', atkSpeed: 'Normal', ultCd: 'Normal', rarity: 4, statBase: { hp: 0, ap: 30, def: 0 } },
|
||
Mage: { typeKey: 'Long', atkSpeed: 'Slow', ultCd: 'Normal', rarity: 4, statBase: { hp: -5, ap: 10, def: 0 } },
|
||
Support: { typeKey: 'Long', atkSpeed: 'Normal', ultCd: 'VerySlow', rarity: 4, statBase: { hp: 10, ap: 20, def: 0 } },
|
||
}
|
||
|
||
// 攻速档 → cd 数值 / cdExpr 表达式 映射(向导生成普攻用)
|
||
export const ATK_SPEED_MAP = {
|
||
VeryFast: { cd: 0.75, cdExpr: 'AtkSpeedSet[AtkSpeedLv.VeryFast].cd' },
|
||
Fast: { cd: 0.9, cdExpr: 'AtkSpeedSet[AtkSpeedLv.Fast].cd' },
|
||
Normal: { cd: 1.05, cdExpr: 'AtkSpeedSet[AtkSpeedLv.Normal].cd' },
|
||
Slow: { cd: 1.2, cdExpr: 'AtkSpeedSet[AtkSpeedLv.Slow].cd' },
|
||
VerySlow: { cd: 1.5, cdExpr: 'AtkSpeedSet[AtkSpeedLv.VerySlow].cd' },
|
||
}
|
||
|
||
// 大招 CD 档 → cd 数值 / cdExpr 表达式 映射(向导/技能编辑器生成大招用,与 ULT_CDS 同源)
|
||
export const ULT_CD_MAP = {
|
||
VeryFast: { cd: 6, cdExpr: 'UltCdSet[UltCdLv.VeryFast].cd' },
|
||
Fast: { cd: 7, cdExpr: 'UltCdSet[UltCdLv.Fast].cd' },
|
||
Normal: { cd: 8, cdExpr: 'UltCdSet[UltCdLv.Normal].cd' },
|
||
Slow: { cd: 9, cdExpr: 'UltCdSet[UltCdLv.Slow].cd' },
|
||
VerySlow: { cd: 10, cdExpr: 'UltCdSet[UltCdLv.VerySlow].cd' },
|
||
}
|
||
|
||
// 触发组 key 列表(向导/模板管理共用)
|
||
export const TRIGGER_GROUPS = [
|
||
{ key: 'atking', label: 'atking 攻击后' },
|
||
{ key: 'atked', label: 'atked 受击后' },
|
||
{ key: 'fstart', label: 'fstart 战斗开始' },
|
||
{ key: 'fend', label: 'fend 回合结束' },
|
||
{ key: 'dead', label: 'dead 死亡后' },
|
||
]
|
||
|
||
export function defaultHero() {
|
||
return {
|
||
uuid: 5001,
|
||
name: '',
|
||
comment: '',
|
||
path: '',
|
||
rarity: 4,
|
||
roleKey: 'Mage',
|
||
growKey: 'Mage',
|
||
typeKey: 'Long',
|
||
statBase: { hp: 0, ap: 0, def: 0 },
|
||
dis: null,
|
||
speed: null,
|
||
dodge: null, // 闪避率(null = 全局默认 15,填值覆盖)
|
||
accuracy: null, // 命中率(null = 全局默认 10,填值覆盖)
|
||
skills: [], // [{uuid,name,cd,cdExpr,overrides,desc,lv_entries:[{lv,s_lv,overrides,desc}]}]
|
||
atking: {}, // {uuid:[{lv,s_lv,name,t_num,t_chance?,pity_add?,overrides,desc}]} t_chance/pity_add 仅攻/受击组生效
|
||
atked: {},
|
||
fstart: {},
|
||
fend: {},
|
||
dead: {},
|
||
field: [], // [{lv,uuids:[{uuid,value,name}],desc}]
|
||
// revive 已纳入 dead 触发组,通过 overrides.revive_hp / revive_count 配置
|
||
bonus: [], // [{lv, attrs:{hp?,ap?,def?,crt?,frz?,stun?,para?}}] hp/ap/def 为百分比,概率类为固定百分点
|
||
info: '',
|
||
}
|
||
}
|
||
|
||
export function defaultSkill(uuid) {
|
||
return {
|
||
uuid,
|
||
name: '',
|
||
cd: 1.05,
|
||
cdExpr: 'AtkSpeedSet[AtkSpeedLv.Normal].cd',
|
||
overrides: {},
|
||
desc: '',
|
||
lv_entries: [],
|
||
}
|
||
}
|
||
|
||
export function defaultTriggerEntry(lv = 4) {
|
||
return { lv, s_lv: 1, name: '', t_num: 3, overrides: {}, desc: '' }
|
||
}
|
||
|
||
// 触发预设工厂:预设是跨职业复用的触发组条目(group + 技能底座 uuid + 完整 entry)
|
||
export function defaultTriggerPreset(group = 'atking') {
|
||
return {
|
||
id: `tp-${group}-${Date.now()}`,
|
||
label: '',
|
||
group,
|
||
uuid: null,
|
||
tags: [],
|
||
entry: defaultTriggerEntry(4),
|
||
}
|
||
}
|
||
|
||
// 光环预设工厂:一个预设 = 解锁等级 + 多个光环词条
|
||
export function defaultFieldPreset() {
|
||
return {
|
||
id: `fp-${Date.now()}`,
|
||
label: '',
|
||
tags: [],
|
||
lv: 4,
|
||
uuids: [],
|
||
}
|
||
}
|
||
|
||
// overrides 可用键说明
|
||
export const OVERRIDE_KEYS = [
|
||
{ key: 'ap', label: 'ap 攻击百分比' },
|
||
{ key: 'hit_count', label: 'hit_count 命中次数' },
|
||
{ key: 'hitcd', label: 'hitcd 持续伤害间隔' },
|
||
{ key: 'crt', label: 'crt 暴击率' },
|
||
{ key: 'frz', label: 'frz 冰冻概率' },
|
||
{ key: 'stun', label: 'stun 击晕概率' },
|
||
{ key: 'para', label: 'para 麻痹概率' },
|
||
{ key: 'bck', label: 'bck 击退' },
|
||
{ key: 'bck_chance', label: 'bck_chance 击退概率' },
|
||
// 护盾型覆写:仅 kind=Shield 技能生效(底座 6301 默认 7 秒)
|
||
{ key: 'shield_duration', label: 'shield_duration 护盾持续秒(0=永久)' },
|
||
// buff 型覆写:值为 BuffList 配置 id,前端用 meta.BuffList 渲染下拉(支持 allow-create 手输兜底)
|
||
// buff 语义为增益,缺省挂施法者自身;debuff 语义为对敌减益,缺省挂被命中者(目标不可覆写)
|
||
{ 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 附加概率' },
|
||
{ key: 'thorns_dmg', label: 'thorns_dmg 反伤固定值' },
|
||
{ key: 'thorns_rate', label: 'thorns_rate 反伤比例(%)' },
|
||
// 枚举型覆写:计时 buff 施加目标(缺省按技能主效果推导:伤害→施法者自身,辅助→友方目标)
|
||
{ key: 'buff_target', label: 'buff_target buff施加目标', type: 'enum', options: [
|
||
{ value: 0, label: '0 被命中者(Hit)' },
|
||
{ value: 1, label: '1 施法者自身(Self/默认)' },
|
||
{ value: 2, label: '2 全体友方(Ally)' },
|
||
{ value: 3, label: '3 全体敌方(Enemy)' },
|
||
]},
|
||
// debuff 型覆写:值为 BuffList 配置 id,命中被攻击者后施加;目标固定为被命中者,不可覆写
|
||
{ key: 'timed_debuff_id', label: 'timed_debuff_id 计时debuff', type: 'buff' },
|
||
{ key: 'debuff_value', label: 'debuff_value 修饰数值' },
|
||
{ key: 'debuff_duration', label: 'debuff_duration 持续时间' },
|
||
{ key: 'debuff_chance', label: 'debuff_chance 附加概率' },
|
||
// 枚举型覆写:技能目标群体(JSON 存字符串,导出还原 TGroup.X;proc_skill.overrides 可借此改变被触发技能的释放对象)
|
||
// 注:不提供 All —— SCastSystem 未对 TGroup.All 做友/敌分流(会落到敌方分支),避免误配
|
||
{ key: 'TGroup', label: 'TGroup 目标群体', type: 'enum', options: [
|
||
{ value: 'Self', label: 'Self 施法者自身' },
|
||
{ value: 'Ally', label: 'Ally 全体友方(含自己)' },
|
||
{ value: 'Team', label: 'Team 全体友方(不含自己)' },
|
||
{ value: 'Enemy', label: 'Enemy 敌方(最近敌人)' },
|
||
]},
|
||
{ key: 'summon_count', label: 'summon_count 召唤数' },
|
||
{ key: 'num', label: 'num 额外释放次数' },
|
||
{ key: 'call_hero', label: 'call_hero 召唤英雄id' },
|
||
{ key: 'revive_hp', label: 'revive_hp 复活回血比例(%)' },
|
||
{ key: 'revive_count', label: 'revive_count 复活次数上限' },
|
||
// 对象型覆写:施法后概率触发主动技能(大招/触发技),出手即判定、一次施法一次判定,含 s_uuid/chance/overrides 子字段
|
||
{ key: 'proc_skill', label: 'proc_skill 施法后概率触发技能', type: 'object' },
|
||
// 字符串型覆写:value 为图标ID(uicons 图集帧名),非数值
|
||
{ key: 'icon', label: 'icon 英雄语境图标(覆写 SkillSet.icon)', type: 'string' },
|
||
]
|
||
|
||
// bonus attrs 可用键:hp/ap/def 按"基础+成长"快照百分比加成;crt/frz/stun/para 为固定百分点累加
|
||
export const BONUS_ATTR_KEYS = [
|
||
{ key: 'hp', label: 'hp 生命%' },
|
||
{ key: 'ap', label: 'ap 攻击%' },
|
||
{ key: 'def', label: 'def 防御%' },
|
||
{ key: 'crt', label: 'crt 暴击率(百分点)' },
|
||
{ key: 'frz', label: 'frz 冰冻(百分点)' },
|
||
{ key: 'stun', label: 'stun 击晕(百分点)' },
|
||
{ key: 'para', label: 'para 麻痹(百分点)' },
|
||
]
|
||
|
||
// icon 覆写常用候选(SkillSet 各底座图标 + 通用图标),可在输入框直接键入其他帧名
|
||
export const SKILL_ICON_OPTIONS = [
|
||
'Stat_Attack_01', 'Stat_RangedAttack', 'Stat_Tripleshot',
|
||
'Sword-FA_WP_Main_Sword_003_PurpleSilver',
|
||
'Sword-FA_WP_Main_Sword_019_WoodSilver',
|
||
'Axe-FA_WP_Main_Axe_004_WoodGray',
|
||
'Sub_Item-FA_WP_Sub_MagicBall_001_Blue',
|
||
'Sub_Item-FA_WP_Sub_MagicBall_001_Purple',
|
||
'Sub_Item-FA_WP_Sub_Potion_001_Green',
|
||
'Sub_Item-FA_WP_Sub_Potion_001_Red',
|
||
]
|