refactor(server,hero): 新增HeroList自动同步逻辑,格式化英雄配置

1.  新增syncHeroList工具函数,实现英雄列表自动去重、排序并格式化输出
2.  在apply接口中自动同步HeroList,保持图鉴与抽卡池数据源一致
3.  格式化heroSet.ts中的英雄配置代码,统一缩进与对象格式
4.  更新HeroList注释与内容,新增5010号英雄
This commit is contained in:
pan
2026-09-07 10:15:09 +08:00
parent b1de2c13f2
commit 2d82528abf
2 changed files with 104 additions and 60 deletions

View File

@@ -1,4 +1,4 @@
import { v3 } from "cc" import { v3 } from "cc"
import { BoxSet, FacSet, FightSet } from "./GameSet" import { BoxSet, FacSet, FightSet } from "./GameSet"
import { SkillOverrides, TGroup, SkillSet, FieldSkillSet, SkillConfig, SkillKind, FieldSkillConfig, FieldSkillType, mergeSkillParams } from "./SkillSet" import { SkillOverrides, TGroup, SkillSet, FieldSkillSet, SkillConfig, SkillKind, FieldSkillConfig, FieldSkillType, mergeSkillParams } from "./SkillSet"
import { BuffList, BuffConfig, ModOp } from "./BuffSet" import { BuffList, BuffConfig, ModOp } from "./BuffSet"
@@ -548,21 +548,23 @@ export const HeroInfo: Record<number, heroInfo> = {
5001: { 5001: {
uuid: 5001, name: "叠甲骑士", path: "hk1", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp + 20, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def + 10, uuid: 5001, name: "叠甲骑士", path: "hk1", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp + 20, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def + 10,
skills: { skills: {
6004: { uuid: 6004, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: {"ap":100,"proc_skill":{"s_uuid":6001,"chance":100,"overrides":{"crt":100}}}, desc: "挥剑对{target}造成攻击力{ap}%伤害", 6004: {
uuid: 6004, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { "ap": 100, "proc_skill": { "s_uuid": 6001, "chance": 100, "overrides": { "crt": 100 } } }, desc: "挥剑对{target}造成攻击力{ap}%伤害",
lv_entries: [ lv_entries: [
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"ap":120}, desc: "普通攻击造成 120% 攻击伤害" }, { lv: 2, s_lv: SkillLv.Lv2, overrides: { "ap": 120 }, desc: "普通攻击造成 120% 攻击伤害" },
], ],
}, },
6301: { uuid: 6301, name: "魔法盾", lv: 1, cd: 8, ccd: 0, overrides: {"ap":30}, desc: "{target}获得生命最大值{ap}%的护盾", 6301: {
uuid: 6301, name: "魔法盾", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 30 }, desc: "{target}获得生命最大值{ap}%的护盾",
lv_entries: [ lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":60}, desc: "{target}获得生命最大值{ap}%的护盾" }, { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 60 }, desc: "{target}获得生命最大值{ap}%的护盾" },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":120}, desc: "{target}获得生命最大值{ap}%的护盾" }, { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 120 }, desc: "{target}获得生命最大值{ap}%的护盾" },
], ],
}, },
}, },
atked: { atked: {
6301: [ 6301: [
{ lv: 4, s_lv: SkillLv.Lv1, name: "全体圣盾", t_num: 3, overrides: {"TGroup":null,"ap":10,"icon":"Stat_UnitSummonIncrease_01"}, desc: "全队获得本英雄生命最大值{ap}%的护盾" }, { lv: 4, s_lv: SkillLv.Lv1, name: "全体圣盾", t_num: 3, overrides: { "TGroup": null, "ap": 10, "icon": "Stat_UnitSummonIncrease_01" }, desc: "全队获得本英雄生命最大值{ap}%的护盾" },
], ],
}, },
info: "", info: "",
@@ -571,21 +573,23 @@ export const HeroInfo: Record<number, heroInfo> = {
5002: { 5002: {
uuid: 5002, name: "易伤剑仙", path: "hk3", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, hp: HERO_ROLE_BASE[HRole.Warrior].hp + 5, ap: HERO_ROLE_BASE[HRole.Warrior].ap + 20, def: HERO_ROLE_BASE[HRole.Warrior].def + 5, uuid: 5002, name: "易伤剑仙", path: "hk3", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, hp: HERO_ROLE_BASE[HRole.Warrior].hp + 5, ap: HERO_ROLE_BASE[HRole.Warrior].ap + 20, def: HERO_ROLE_BASE[HRole.Warrior].def + 5,
skills: { skills: {
6004: { uuid: 6004, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: {"ap":100}, desc: "对{target}造成攻击力{ap}%伤害", 6004: {
uuid: 6004, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { "ap": 100 }, desc: "对{target}造成攻击力{ap}%伤害",
lv_entries: [ lv_entries: [
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"ap":120}, desc: "普通攻击造成 120% 攻击伤害" }, { lv: 2, s_lv: SkillLv.Lv2, overrides: { "ap": 120 }, desc: "普通攻击造成 120% 攻击伤害" },
], ],
}, },
6101: { uuid: 6101, name: "气斩", lv: 1, cd: 8, ccd: 0, overrides: {"ap":150,"timed_buff_id":7002,"icon":"Stat_AttackSpeed_02"}, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,并使目标易伤(受到伤害加深,持续{dur}秒)", 6101: {
uuid: 6101, name: "气斩", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 150, "timed_buff_id": 7002, "icon": "Stat_AttackSpeed_02" }, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,并使目标易伤(受到伤害加深,持续{dur}秒)",
lv_entries: [ lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"buff_value":20} }, { lv: 8, s_lv: SkillLv.Lv2, overrides: { "buff_value": 20 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":180,"bck":60,"buff_value":40}, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,击退{bck},并使目标易伤(持续{dur}秒)" }, { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 180, "bck": 60, "buff_value": 40 }, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,击退{bck},并使目标易伤(持续{dur}秒)" },
], ],
}, },
}, },
atking: { atking: {
6004: [ 6004: [
{ lv: 4, s_lv: SkillLv.Lv1, name: "风暴打击", t_num: 3, overrides: {"ap":300,"icon":"Stat_AllUnitAttack"}, desc: "立刻打击{target},造成攻击力{ap}%伤害" }, { lv: 4, s_lv: SkillLv.Lv1, name: "风暴打击", t_num: 3, overrides: { "ap": 300, "icon": "Stat_AllUnitAttack" }, desc: "立刻打击{target},造成攻击力{ap}%伤害" },
], ],
}, },
info: "", info: "",
@@ -594,15 +598,17 @@ export const HeroInfo: Record<number, heroInfo> = {
5003: { 5003: {
uuid: 5003, name: "眩晕暴击哥", path: "hk5", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, hp: HERO_ROLE_BASE[HRole.Warrior].hp + 5, ap: HERO_ROLE_BASE[HRole.Warrior].ap + 20, def: HERO_ROLE_BASE[HRole.Warrior].def + 5, uuid: 5003, name: "眩晕暴击哥", path: "hk5", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, hp: HERO_ROLE_BASE[HRole.Warrior].hp + 5, ap: HERO_ROLE_BASE[HRole.Warrior].ap + 20, def: HERO_ROLE_BASE[HRole.Warrior].def + 5,
skills: { skills: {
6004: { uuid: 6004, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: {"ap":100}, desc: "挥斧对{target}造成攻击力{ap}%伤害", 6004: {
uuid: 6004, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { "ap": 100 }, desc: "挥斧对{target}造成攻击力{ap}%伤害",
lv_entries: [ lv_entries: [
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"stun":10}, desc: "普通攻击有{stun}%概率击晕敌人" }, { lv: 2, s_lv: SkillLv.Lv2, overrides: { "stun": 10 }, desc: "普通攻击有{stun}%概率击晕敌人" },
], ],
}, },
6104: { uuid: 6104, name: "开山斧", lv: 1, cd: 8, ccd: 0, overrides: {"ap":300,"stun":100}, desc: "劈出开山斧,对{target}造成攻击力{ap}%伤害,必定击晕", 6104: {
uuid: 6104, name: "开山斧", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 300, "stun": 100 }, desc: "劈出开山斧,对{target}造成攻击力{ap}%伤害,必定击晕",
lv_entries: [ lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":450,"stun":100} }, { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 450, "stun": 100 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":450,"stun":100} }, { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 450, "stun": 100 } },
], ],
}, },
}, },
@@ -615,15 +621,17 @@ export const HeroInfo: Record<number, heroInfo> = {
5004: { 5004: {
uuid: 5004, name: "刀刀暴击", path: "hc1", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Mid, grow_type: HGrowType.Assassin, role: HRole.Assassin, hp: HERO_ROLE_BASE[HRole.Assassin].hp, ap: HERO_ROLE_BASE[HRole.Assassin].ap + 30, def: HERO_ROLE_BASE[HRole.Assassin].def, uuid: 5004, name: "刀刀暴击", path: "hc1", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Mid, grow_type: HGrowType.Assassin, role: HRole.Assassin, hp: HERO_ROLE_BASE[HRole.Assassin].hp, ap: HERO_ROLE_BASE[HRole.Assassin].ap + 30, def: HERO_ROLE_BASE[HRole.Assassin].def,
skills: { skills: {
6002: { uuid: 6002, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, overrides: {"ap":100}, desc: "挥刀对{target}造成攻击力{ap}%伤害", 6002: {
uuid: 6002, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, overrides: { "ap": 100 }, desc: "挥刀对{target}造成攻击力{ap}%伤害",
lv_entries: [ lv_entries: [
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"crt":10}, desc: "普通攻击有{crt}%概率暴击" }, { lv: 2, s_lv: SkillLv.Lv2, overrides: { "crt": 10 }, desc: "普通攻击有{crt}%概率暴击" },
], ],
}, },
6100: { uuid: 6100, name: "光闪", lv: 1, cd: 8, ccd: 0, overrides: {"ap":150}, desc: "斩出光闪,对{target}造成攻击力{ap}%伤害", 6100: {
uuid: 6100, name: "光闪", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 150 }, desc: "斩出光闪,对{target}造成攻击力{ap}%伤害",
lv_entries: [ lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":250} }, { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 250 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":350} }, { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 350 } },
], ],
}, },
}, },
@@ -636,15 +644,17 @@ export const HeroInfo: Record<number, heroInfo> = {
5005: { 5005: {
uuid: 5005, name: "出血贼", path: "hc2", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Mid, grow_type: HGrowType.Assassin, role: HRole.Assassin, hp: HERO_ROLE_BASE[HRole.Assassin].hp, ap: HERO_ROLE_BASE[HRole.Assassin].ap + 30, def: HERO_ROLE_BASE[HRole.Assassin].def, uuid: 5005, name: "出血贼", path: "hc2", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Mid, grow_type: HGrowType.Assassin, role: HRole.Assassin, hp: HERO_ROLE_BASE[HRole.Assassin].hp, ap: HERO_ROLE_BASE[HRole.Assassin].ap + 30, def: HERO_ROLE_BASE[HRole.Assassin].def,
skills: { skills: {
6002: { uuid: 6002, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, overrides: {"ap":100}, desc: "挥刀对{target}造成攻击力{ap}%伤害", 6002: {
uuid: 6002, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, overrides: { "ap": 100 }, desc: "挥刀对{target}造成攻击力{ap}%伤害",
lv_entries: [ lv_entries: [
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"timed_buff_id":7007,"buff_value":30,"buff_chance":30}, desc: "普通攻击有{buff_chance}%概率使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" }, { lv: 2, s_lv: SkillLv.Lv2, overrides: { "timed_buff_id": 7007, "buff_value": 30, "buff_chance": 30 }, desc: "普通攻击有{buff_chance}%概率使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" },
], ],
}, },
6103: { uuid: 6103, name: "闪电斩", lv: 1, cd: 8, ccd: 0, overrides: {"ap":150}, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害", 6103: {
uuid: 6103, name: "闪电斩", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 150 }, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害",
lv_entries: [ lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":250,"timed_buff_id":7007}, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害,并使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" }, { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 250, "timed_buff_id": 7007 }, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害,并使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":350,"para":50,"timed_buff_id":7007,"buff_value":60}, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害,{para}%概率麻痹,并使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" }, { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 350, "para": 50, "timed_buff_id": 7007, "buff_value": 60 }, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害,{para}%概率麻痹,并使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" },
], ],
}, },
}, },
@@ -657,15 +667,17 @@ export const HeroInfo: Record<number, heroInfo> = {
5006: { 5006: {
uuid: 5006, name: "冻箭哥", path: "ha1", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Archer, role: HRole.Archer, hp: HERO_ROLE_BASE[HRole.Archer].hp, ap: HERO_ROLE_BASE[HRole.Archer].ap + 30, def: HERO_ROLE_BASE[HRole.Archer].def, uuid: 5006, name: "冻箭哥", path: "ha1", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Archer, role: HRole.Archer, hp: HERO_ROLE_BASE[HRole.Archer].hp, ap: HERO_ROLE_BASE[HRole.Archer].ap + 30, def: HERO_ROLE_BASE[HRole.Archer].def,
skills: { skills: {
6006: { uuid: 6006, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: {"ap":100}, desc: "射出箭矢,对{target}造成攻击力{ap}%伤害", 6006: {
uuid: 6006, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: { "ap": 100 }, desc: "射出箭矢,对{target}造成攻击力{ap}%伤害",
lv_entries: [ lv_entries: [
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"frz":10}, desc: "普通攻击有{frz}%概率 冰冻敌人" }, { lv: 2, s_lv: SkillLv.Lv2, overrides: { "frz": 10 }, desc: "普通攻击有{frz}%概率 冰冻敌人" },
], ],
}, },
6150: { uuid: 6150, name: "万箭齐发·冰", lv: 1, cd: 8, ccd: 0, overrides: {"ap":150,"frz":30,"icon":"Stat_AttackRangeIncrease_02"}, desc: "万箭齐发,对{target}造成攻击力{ap}%伤害,{frz}%概率冰冻", 6150: {
uuid: 6150, name: "万箭齐发·冰", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 150, "frz": 30, "icon": "Stat_AttackRangeIncrease_02" }, desc: "万箭齐发,对{target}造成攻击力{ap}%伤害,{frz}%概率冰冻",
lv_entries: [ lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":200,"frz":50} }, { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 200, "frz": 50 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":250,"frz":70} }, { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 250, "frz": 70 } },
], ],
}, },
}, },
@@ -678,15 +690,17 @@ export const HeroInfo: Record<number, heroInfo> = {
5007: { 5007: {
uuid: 5007, name: "击退火女", path: "hm1", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, hp: HERO_ROLE_BASE[HRole.Mage].hp - 5, ap: HERO_ROLE_BASE[HRole.Mage].ap + 10, def: HERO_ROLE_BASE[HRole.Mage].def, uuid: 5007, name: "击退火女", path: "hm1", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, hp: HERO_ROLE_BASE[HRole.Mage].hp - 5, ap: HERO_ROLE_BASE[HRole.Mage].ap + 10, def: HERO_ROLE_BASE[HRole.Mage].def,
skills: { skills: {
6010: { uuid: 6010, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: {"ap":100}, desc: "掷出紫魔球,对{target}造成攻击力{ap}%伤害", 6010: {
uuid: 6010, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { "ap": 100 }, desc: "掷出紫魔球,对{target}造成攻击力{ap}%伤害",
lv_entries: [ lv_entries: [
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"bck_chance":20}, desc: "普通攻击有{bck_chance}%概率击退敌人" }, { lv: 2, s_lv: SkillLv.Lv2, overrides: { "bck_chance": 20 }, desc: "普通攻击有{bck_chance}%概率击退敌人" },
], ],
}, },
6200: { uuid: 6200, name: "火焰喷射", lv: 1, cd: 8, ccd: 0, overrides: {"ap":250,"bck":100}, desc: "喷出烈焰风暴,对{target}造成攻击力{ap}%伤害,击退{bck}", 6200: {
uuid: 6200, name: "火焰喷射", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 250, "bck": 100 }, desc: "喷出烈焰风暴,对{target}造成攻击力{ap}%伤害,击退{bck}",
lv_entries: [ lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":350,"bck":100} }, { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 350, "bck": 100 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":450,"bck":100,"summon_count":2} }, { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 450, "bck": 100, "summon_count": 2 } },
], ],
}, },
}, },
@@ -699,21 +713,23 @@ export const HeroInfo: Record<number, heroInfo> = {
5008: { 5008: {
uuid: 5008, name: "团疗奶爸", path: "hh1", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Support, role: HRole.Support, hp: HERO_ROLE_BASE[HRole.Support].hp + 10, ap: HERO_ROLE_BASE[HRole.Support].ap + 20, def: HERO_ROLE_BASE[HRole.Support].def, uuid: 5008, name: "团疗奶爸", path: "hh1", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Support, role: HRole.Support, hp: HERO_ROLE_BASE[HRole.Support].hp + 10, ap: HERO_ROLE_BASE[HRole.Support].ap + 20, def: HERO_ROLE_BASE[HRole.Support].def,
skills: { skills: {
6011: { uuid: 6011, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: {"ap":100}, desc: "挥杖对{target}造成攻击力{ap}%伤害", 6011: {
uuid: 6011, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: { "ap": 100 }, desc: "挥杖对{target}造成攻击力{ap}%伤害",
lv_entries: [ lv_entries: [
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"ap":120}, desc: "普通攻击造成 120% 攻击伤害" }, { lv: 2, s_lv: SkillLv.Lv2, overrides: { "ap": 120 }, desc: "普通攻击造成 120% 攻击伤害" },
], ],
}, },
6302: { uuid: 6302, name: "治疗", lv: 1, cd: 8, ccd: 0, overrides: {"ap":30}, desc: "为{target}回复攻击力{ap}%生命", 6302: {
uuid: 6302, name: "治疗", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 30 }, desc: "为{target}回复攻击力{ap}%生命",
lv_entries: [ lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":40} }, { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 40 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":50} }, { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 50 } },
], ],
}, },
}, },
atking: { atking: {
6301: [ 6301: [
{ lv: 4, s_lv: SkillLv.Lv1, name: "圣愈之盾", t_num: 3, overrides: {"ap":30}, desc: "{target}获得生命最大值{ap}%的护盾" }, { lv: 4, s_lv: SkillLv.Lv1, name: "圣愈之盾", t_num: 3, overrides: { "ap": 30 }, desc: "{target}获得生命最大值{ap}%的护盾" },
], ],
}, },
info: "", info: "",
@@ -722,21 +738,23 @@ export const HeroInfo: Record<number, heroInfo> = {
5009: { 5009: {
uuid: 5009, name: "甲虫领主", path: "hk2", fac: FacSet.HERO, rarity: 2, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, uuid: 5009, name: "甲虫领主", path: "hk2", fac: FacSet.HERO, rarity: 2, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def,
skills: { skills: {
6004: { uuid: 6004, name: "普攻强化", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, 6004: {
uuid: 6004, name: "普攻强化", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0,
lv_entries: [ lv_entries: [
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"proc_skill":{"s_uuid":6502,"chance":10,"overrides":{"ap":5,"TGroup": TGroup.Self}}}, desc: "普通攻击有 10% 的概率为自己释放回春(5 秒恢复生命值的{ap}%)" }, { lv: 2, s_lv: SkillLv.Lv2, overrides: { "proc_skill": { "s_uuid": 6502, "chance": 10, "overrides": { "ap": 5, "TGroup": TGroup.Self } } }, desc: "普通攻击有 10% 的概率为自己释放回春(5 秒恢复生命值的{ap}%)" },
], ],
}, },
6102: { uuid: 6102, lv: 1, cd: 8, ccd: 0, overrides: {"ap":250,"bck":30}, 6102: {
uuid: 6102, lv: 1, cd: 8, ccd: 0, overrides: { "ap": 250, "bck": 30 },
lv_entries: [ lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":300,"bck":50} }, { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 300, "bck": 50 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":350,"bck":70} }, { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 350, "bck": 70 } },
], ],
}, },
}, },
atked: { atked: {
6302: [ 6302: [
{ lv: 4, s_lv: SkillLv.Lv1, t_num: 3, overrides: {"ap":5}, desc: "为自己释放治疗,恢复生命值的{ap}%" }, { lv: 4, s_lv: SkillLv.Lv1, t_num: 3, overrides: { "ap": 5 }, desc: "为自己释放治疗,恢复生命值的{ap}%" },
], ],
}, },
info: "", info: "",
@@ -745,26 +763,28 @@ export const HeroInfo: Record<number, heroInfo> = {
5010: { 5010: {
uuid: 5010, name: "火箭哥", path: "ha2", fac: FacSet.HERO, rarity: 3, lv: 1, type: HType.Mid, grow_type: HGrowType.Archer, role: HRole.Archer, hp: HERO_ROLE_BASE[HRole.Archer].hp, ap: HERO_ROLE_BASE[HRole.Archer].ap, def: HERO_ROLE_BASE[HRole.Archer].def, uuid: 5010, name: "火箭哥", path: "ha2", fac: FacSet.HERO, rarity: 3, lv: 1, type: HType.Mid, grow_type: HGrowType.Archer, role: HRole.Archer, hp: HERO_ROLE_BASE[HRole.Archer].hp, ap: HERO_ROLE_BASE[HRole.Archer].ap, def: HERO_ROLE_BASE[HRole.Archer].def,
skills: { skills: {
6006: { uuid: 6006, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, 6006: {
uuid: 6006, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0,
lv_entries: [ lv_entries: [
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"ap":100,"bck_chance":10} }, { lv: 2, s_lv: SkillLv.Lv2, overrides: { "ap": 100, "bck_chance": 10 } },
], ],
}, },
6151: { uuid: 6151, lv: 1, cd: 8, ccd: 0, overrides: {"ap":70,"summon_count":5,"bck_chance":100}, 6151: {
uuid: 6151, lv: 1, cd: 8, ccd: 0, overrides: { "ap": 70, "summon_count": 5, "bck_chance": 100 },
lv_entries: [ lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":80,"summon_count":5,"bck_chance":100} }, { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 80, "summon_count": 5, "bck_chance": 100 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"bck_chance":100,"ap":100,"summon_count":6} }, { lv: 16, s_lv: SkillLv.Lv3, overrides: { "bck_chance": 100, "ap": 100, "summon_count": 6 } },
], ],
}, },
}, },
atking: { atking: {
6008: [ 6008: [
{ lv: 4, s_lv: SkillLv.Lv1, t_num: 3, overrides: {"ap":120,"bck_chance":50} }, { lv: 4, s_lv: SkillLv.Lv1, t_num: 3, overrides: { "ap": 120, "bck_chance": 50 } },
], ],
}, },
info: "", info: "",
}, },
// @hero-setup:heroes-end // @hero-setup:heroes-end
/* /*
*=============怪物配置列表================ *=============怪物配置列表================
@@ -843,8 +863,8 @@ export const HeroInfo: Record<number, heroInfo> = {
}; };
export const HeroList: number[] = [ export const HeroList: number[] = [
// 几何王国复刻英雄(5001~5009) // 几何王国复刻英雄(5001~5010)
5001, 5002, 5003, 5004, 5005, 5006, 5007, 5008, 5009, 5001, 5002, 5003, 5004, 5005, 5006, 5007, 5008, 5009, 5010,
]; ];
// @hero-setup:region-end // @hero-setup:region-end

View File

@@ -370,6 +370,28 @@ app.get('/api/export-csv', (_req, res) => {
res.send(fs.readFileSync(CSV_PATH, 'utf8')) res.send(fs.readFileSync(CSV_PATH, 'utf8'))
}) })
/** HeroList 定义匹配(用于导出时同步图鉴/卡池数据源) */
const HERO_LIST_RE = /export const HeroList: number\[\] = \[[\s\S]*?\n\];/
/** 按导出英雄 uuid 升序重建 HeroList(每行 10 个,含去重),避免编辑器增删英雄后列表不同步 */
function syncHeroList(src, heroes) {
const uuids = [...new Set(heroes.map((h) => h.uuid))].sort((a, b) => a - b)
if (!uuids.length) return src
const lines = []
for (let i = 0; i < uuids.length; i += 10) {
lines.push(' ' + uuids.slice(i, i + 10).join(', ') + ',')
}
const block =
`export const HeroList: number[] = [\n` +
` // 编辑器导出自动同步(共 ${uuids.length} 个)\n` +
`${lines.join('\n')}\n` +
`];`
if (!HERO_LIST_RE.test(src)) {
throw new Error('heroSet.ts 中未找到 HeroList 定义,无法同步')
}
return src.replace(HERO_LIST_RE, block)
}
app.post('/api/apply', (req, res) => { app.post('/api/apply', (req, res) => {
try { try {
const heroes = req.body?.heroes const heroes = req.body?.heroes
@@ -383,7 +405,9 @@ app.post('/api/apply', (req, res) => {
return res.status(500).json({ error: 'heroSet.ts 中未找到英雄区域标记(@hero-setup:heroes-begin/end)' }) return res.status(500).json({ error: 'heroSet.ts 中未找到英雄区域标记(@hero-setup:heroes-begin/end)' })
} }
const body = heroes.map(renderSingleHero).join('') const body = heroes.map(renderSingleHero).join('')
const next = src.slice(0, bi) + HEROES_BEGIN + '\n' + body + HEROES_END + src.slice(ei + HEROES_END.length) let next = src.slice(0, bi) + HEROES_BEGIN + '\n' + body + HEROES_END + src.slice(ei + HEROES_END.length)
// 同步 HeroList:图鉴展示与抽卡池(HeroCardPoolList)均由该列表驱动
next = syncHeroList(next, heroes)
fs.writeFileSync(HEROSET_PATH, next, 'utf8') fs.writeFileSync(HEROSET_PATH, next, 'utf8')
res.json({ ok: true, path: HEROSET_PATH, count: heroes.length, bytes: Buffer.byteLength(next) }) res.json({ ok: true, path: HEROSET_PATH, count: heroes.length, bytes: Buffer.byteLength(next) })
} catch (e) { } catch (e) {