// 共享常量与工具 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', ]