feat(config-editor): add RecordValue type and enum mirror

This commit is contained in:
panFD
2026-06-20 23:46:54 +08:00
parent acb038a70a
commit 88c1a28c80
2 changed files with 70 additions and 0 deletions

View File

@@ -0,0 +1,15 @@
/** IO 层对配置对象字面量值的结构化表示。零依赖。 */
export type RecordValue =
| { kind: 'num'; value: number }
| { kind: 'str'; value: string }
| { kind: 'bool'; value: boolean }
| { kind: 'enumRef'; qualifier: string; member: string } // 如 FacSet.HERO
| { kind: 'speed'; level: string } // AtkSpeedSet[AtkSpeedLv.X].cd
| { kind: 'obj'; props: Record<string, RecordValue> }
| { kind: 'arr'; items: RecordValue[] }
| { kind: 'raw'; text: string }; // 未识别表达式,原样保留
export function isScalar(v: RecordValue): boolean {
return v.kind === 'num' || v.kind === 'str' || v.kind === 'bool'
|| v.kind === 'enumRef' || v.kind === 'speed' || v.kind === 'raw';
}

View File

@@ -0,0 +1,55 @@
export interface EnumMember { label: string; value: number | string; }
export interface EnumDef { qualifier: string; members: EnumMember[]; }
export const ENUMS: Record<string, EnumDef> = {
HType: { qualifier: 'HType', members: [
{ label: '近战 Melee', value: 0 }, { label: '中程 Mid', value: 1 }, { label: '远程 Long', value: 2 } ] },
FacSet: { qualifier: 'FacSet', members: [
{ label: '英雄 HERO', value: 0 }, { label: '怪物 MON', value: 1 } ] },
TGroup: { qualifier: 'TGroup', members: [
{ label: '自身 Self', value: 0 }, { label: '友方含己 Ally', value: 1 },
{ label: '友方 Team', value: 2 }, { label: '敌方 Enemy', value: 3 }, { label: '全体 All', value: 4 } ] },
DTType: { qualifier: 'DTType', members: [
{ label: '单体 single', value: 0 }, { label: '范围 range', value: 1 }, { label: '3x3 aoe_grid', value: 2 } ] },
SkillKind: { qualifier: 'SkillKind', members: [
{ label: '伤害 Damage', value: 0 }, { label: '治疗 Heal', value: 1 }, { label: '护盾 Shield', value: 2 },
{ label: '辅助 Support', value: 3 }, { label: '金币 Gold', value: 4 } ] },
DType: { qualifier: 'DType', members: [
{ label: '物理 ATK', value: 0 }, { label: '冰 ICE', value: 1 }, { label: '火 FIRE', value: 2 }, { label: '风 WIND', value: 3 } ] },
IType: { qualifier: 'IType', members: [
{ label: '近战 Melee', value: 0 }, { label: '远程 remote', value: 1 }, { label: '辅助 support', value: 2 } ] },
RType: { qualifier: 'RType', members: [
{ label: '直线 linear', value: 0 }, { label: '贝塞尔 bezier', value: 1 },
{ label: '固定起点 fixed', value: 2 }, { label: '固定终点 fixedEnd', value: 3 } ] },
EType: { qualifier: 'EType', members: [
{ label: '动画结束 animationEnd', value: 0 }, { label: '时间结束 timeEnd', value: 1 }, { label: '碰撞 collision', value: 2 } ] },
FieldSkillType: { qualifier: 'FieldSkillType', members: [
{ label: '召唤次数 SummonCount', value: 1 }, { label: '死亡次数 DeadCount', value: 2 },
{ label: '开场次数 StartCount', value: 3 }, { label: '结束次数 EndCount', value: 4 },
{ label: '每波金币 WaveGold', value: 5 }, { label: '卖出金币 SellGold', value: 6 },
{ label: '战后回复 WaveHeal', value: 7 }, { label: '英雄攻击 HeroAtk', value: 8 },
{ label: '英雄击晕 HeroStun', value: 9 }, { label: '英雄暴击 HeroCrit', value: 10 },
{ label: '英雄暴伤 HeroCritDamage', value: 11 }, { label: '英雄攻速 HeroSpeed', value: 12 },
{ label: '购买优惠 BuyDiscount', value: 13 }, { label: '刷新优惠 RefreshDiscount', value: 14 },
{ label: '英雄生命 HeroHp', value: 16 }, { label: '英雄风怒 HeroWindFury', value: 17 },
{ label: '英雄穿刺 HeroPuncture', value: 18 }, { label: '攻击次数 AtkCount', value: 19 },
{ label: '受击次数 BeAtkCount', value: 20 } ] },
AtkSpeedLv: { qualifier: 'AtkSpeedLv', members: [
{ label: '极速++ VeryFast1', value: 1 }, { label: '极速+ VeryFast2', value: 2 }, { label: '极速 VeryFast3', value: 3 },
{ label: '快速++ Fast1', value: 4 }, { label: '快速+ Fast2', value: 5 }, { label: '快速 Fast3', value: 6 },
{ label: '中速++ Normal1', value: 7 }, { label: '中速+ Normal2', value: 8 }, { label: '中速 Normal3', value: 9 },
{ label: '一般+ Mid1', value: 10 }, { label: '一般 Mid2', value: 11 }, { label: '一般- Mid3', value: 12 },
{ label: '慢 Slow1', value: 13 }, { label: '慢+ Slow2', value: 14 }, { label: '慢++ Slow3', value: 15 },
{ label: '很慢 VerySlow1', value: 16 }, { label: '很慢+ VerySlow2', value: 17 }, { label: '很慢++ VerySlow3', value: 18 } ] },
Attrs: { qualifier: 'Attrs', members: [
{ label: 'ap', value: 'ap' }, { label: 'hp', value: 'hp' }, { label: 'hp_max', value: 'hp_max' },
{ label: 'critical', value: 'critical' }, { label: 'critical_damage', value: 'critical_damage' },
{ label: 'stun_chance', value: 'stun_chance' }, { label: 'puncture_chance', value: 'puncture_chance' },
{ label: 'wfuny', value: 'wfuny' }, { label: 'freeze_chance', value: 'freeze_chance' },
{ label: 'knockback_chance', value: 'knockback_chance' } ] },
};
/** qualifier如 'FacSet')→ 对应 enumId如 'FacSet')。当前两者同名。 */
export const QUALIFIER_TO_ID: Record<string, string> = Object.fromEntries(
Object.entries(ENUMS).map(([id, def]) => [def.qualifier, id])
);