2 Commits

Author SHA1 Message Date
pan
2a2abf24b2 feat(hero): 补全所有英雄技能的名称字段
统一给多个英雄的基础普攻技能添加"强化普攻"名称,同时优化技能配置的格式可读性,移除冗余的空字段和换行,修正了JSON文件末尾缺少换行的问题。
2026-09-04 16:03:28 +08:00
pan
22e91fc99d feat(hero-ui): 新增普攻lv2强化档独立展示功能
实现英雄图鉴中普攻lv2强化档的单独展示逻辑:
1. 为技能档位渲染添加minLv参数,支持裁剪低档位
2. 新增普攻lv2专属模式,图标/名称取lv1,弹窗仅展示lv2+档位
3. 自动为符合条件的普攻强化档生成独立技能图标
4. 适配等级显示偏移,配置Lv2显示为Lv1
2026-09-04 15:25:35 +08:00
6 changed files with 121 additions and 91 deletions

View File

@@ -542,9 +542,11 @@ function buildTierLines(tiers: ISkillTierInfo[], triggerLabel: string): HeroSkil
* @param heroUuid 英雄 uuid(HeroInfo key)
* @param skillUuid 技能 uuid(skills key / 触发组 s_uuid / FieldSkillSet uuid / 复活 SkillSet uuid)
* @param slot 技能所属槽位(可空):指定时仅在该槽位查找;缺省按上述顺序自动定位
* @param minLv 最低展示档(默认 1):传 2 时裁剪掉 sLv<2 的档,仅保留 lv2+ 档位
* (普攻强化档作为独立技能展示的场景,如 heroSet 普攻 lv2 档单独出图标)
* @returns 档位行数组;技能不属于该英雄时返回 []
*/
export function buildHeroSkillTierLines(heroUuid: number, skillUuid: number, slot?: SkillTriggerType): HeroSkillTierLine[] {
export function buildHeroSkillTierLines(heroUuid: number, skillUuid: number, slot?: SkillTriggerType, minLv: number = 1): HeroSkillTierLine[] {
const hero = HeroInfo[heroUuid];
if (!hero) return [];
@@ -577,12 +579,13 @@ export function buildHeroSkillTierLines(heroUuid: number, skillUuid: number, slo
// 光环路径(无 ISkillTierInfo 中间结构,直接生成 HeroSkillTierLine)
if (tiers.length === 0) {
const fieldLines = collectFieldTierLines(hero, skillUuid);
if (fieldLines.length > 0) return fieldLines;
if (fieldLines.length > 0) return minLv > 1 ? fieldLines.filter(l => l.sLv >= minLv) : fieldLines;
// 复活已纳入 dead 触发组,通过 dead 路径处理
return [];
}
return buildTierLines(tiers, triggerLabel);
const lines = buildTierLines(tiers, triggerLabel);
return minLv > 1 ? lines.filter(l => l.sLv >= minLv) : lines;
}
/**

View File

@@ -490,23 +490,21 @@ export const HeroInfo: Record<number, heroInfo> = {
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,
skills: {
6004: {
uuid: 6004, 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: 2, s_lv: SkillLv.Lv2, overrides: { "ap": 120 } },
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"ap":120} },
],
},
6301: {
uuid: 6301, name: "魔法盾", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 30, "summon_count": 1 }, desc: "{target}获得生命最大值{ap}%的护盾",
6301: { uuid: 6301, name: "魔法盾", lv: 1, cd: 8, ccd: 0, overrides: {"ap":30}, desc: "{target}获得生命最大值{ap}%的护盾",
lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 60, "summon_count": 1 }, desc: "{target}获得生命最大值{ap}%的护盾" },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 120, "summon_count": 1 }, 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}%的护盾" },
],
},
},
atked: {
6301: [
{ lv: 4, s_lv: SkillLv.Lv1, name: "全体圣盾", t_num: 3, overrides: { "TGroup": null, "ap": 10, "summon_count": 1 }, desc: "全队获得本英雄生命最大值{ap}%的护盾" },
{ lv: 4, s_lv: SkillLv.Lv1, name: "全体圣盾", t_num: 3, overrides: {"TGroup":null,"ap":10,"summon_count":1}, desc: "全队获得本英雄生命最大值{ap}%的护盾" },
],
},
info: "",
@@ -515,23 +513,21 @@ export const HeroInfo: Record<number, heroInfo> = {
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,
skills: {
6004: {
uuid: 6004, 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: 2, s_lv: SkillLv.Lv2, overrides: { "ap": 120 } },
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"ap":120} },
],
},
6101: {
uuid: 6101, name: "气斩", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 150, "timed_buff_id": 7002, "summon_count": 1 }, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,并使目标易伤(受到伤害加深,持续{dur}秒)",
6101: { uuid: 6101, name: "气斩", lv: 1, cd: 8, ccd: 0, overrides: {"ap":150,"timed_buff_id":7002,"summon_count":1}, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,并使目标易伤(受到伤害加深,持续{dur}秒)",
lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "buff_value": 20, "summon_count": 1 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 180, "bck": 60, "buff_value": 40, "summon_count": 2 }, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,击退{bck},并使目标易伤(持续{dur}秒)" },
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"buff_value":20,"summon_count":1} },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":180,"bck":60,"buff_value":40,"summon_count":2}, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,击退{bck},并使目标易伤(持续{dur}秒)" },
],
},
},
atking: {
6004: [
{ lv: 4, s_lv: SkillLv.Lv1, name: "风暴打击", t_num: 3, overrides: { "ap": 300 }, desc: "立刻打击{target},造成攻击力{ap}%伤害" },
{ lv: 4, s_lv: SkillLv.Lv1, name: "风暴打击", t_num: 3, overrides: {"ap":300}, desc: "立刻打击{target},造成攻击力{ap}%伤害" },
],
},
info: "",
@@ -540,17 +536,15 @@ export const HeroInfo: Record<number, heroInfo> = {
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,
skills: {
6004: {
uuid: 6004, 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: 2, s_lv: SkillLv.Lv2, overrides: { "stun": 10 }, desc: "挥斧对{target}造成攻击力{ap}%伤害,{stun}%概率击晕" },
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"stun":10}, desc: "挥斧对{target}造成攻击力{ap}%伤害,{stun}%概率击晕" },
],
},
6104: {
uuid: 6104, name: "开山斧", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 300, "stun": 100, "summon_count": 1 }, desc: "劈出开山斧,对{target}造成攻击力{ap}%伤害,必定击晕",
6104: { uuid: 6104, name: "开山斧", lv: 1, cd: 8, ccd: 0, overrides: {"ap":300,"stun":100,"summon_count":1}, desc: "劈出开山斧,对{target}造成攻击力{ap}%伤害,必定击晕",
lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 450, "stun": 100, "summon_count": 1 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 450, "stun": 100, "summon_count": 2 } },
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":450,"stun":100,"summon_count":1} },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":450,"stun":100,"summon_count":2} },
],
},
},
@@ -563,17 +557,15 @@ export const HeroInfo: Record<number, heroInfo> = {
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,
skills: {
6002: {
uuid: 6002, 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: 2, s_lv: SkillLv.Lv2, overrides: { "crt": 10 }, desc: "挥刀对{target}造成攻击力{ap}%伤害,{crt}%概率暴击" },
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"crt":10}, desc: "挥刀对{target}造成攻击力{ap}%伤害,{crt}%概率暴击" },
],
},
6100: {
uuid: 6100, name: "光闪", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 150, "summon_count": 1 }, desc: "斩出光闪,对{target}造成攻击力{ap}%伤害",
6100: { uuid: 6100, name: "光闪", lv: 1, cd: 8, ccd: 0, overrides: {"ap":150,"summon_count":1}, desc: "斩出光闪,对{target}造成攻击力{ap}%伤害",
lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 250, "summon_count": 1 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 350, "summon_count": 2 } },
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":250,"summon_count":1} },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":350,"summon_count":2} },
],
},
},
@@ -586,17 +578,15 @@ export const HeroInfo: Record<number, heroInfo> = {
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,
skills: {
6002: {
uuid: 6002, 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: 2, s_lv: SkillLv.Lv2, overrides: { "timed_buff_id": 7007, "buff_value": 30, "buff_chance": 30 }, desc: "挥刀对{target}造成攻击力{ap}%伤害,{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: "挥刀对{target}造成攻击力{ap}%伤害,{buff_chance}%概率使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" },
],
},
6103: {
uuid: 6103, name: "闪电斩", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 150, "summon_count": 1 }, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害",
6103: { uuid: 6103, name: "闪电斩", lv: 1, cd: 8, ccd: 0, overrides: {"ap":150,"summon_count":1}, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害",
lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 250, "timed_buff_id": 7007, "summon_count": 1 }, 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, "summon_count": 2 }, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害,{para}%概率麻痹,并使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" },
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":250,"timed_buff_id":7007,"summon_count":1}, 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,"summon_count":2}, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害,{para}%概率麻痹,并使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" },
],
},
},
@@ -609,17 +599,15 @@ export const HeroInfo: Record<number, heroInfo> = {
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,
skills: {
6006: {
uuid: 6006, 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: 2, s_lv: SkillLv.Lv2, overrides: { "bck": 10 }, desc: "射出箭矢,对{target}造成攻击力{ap}%伤害,击退{bck}" },
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"bck":10}, desc: "射出箭矢,对{target}造成攻击力{ap}%伤害,击退{bck}" },
],
},
6150: {
uuid: 6150, name: "万箭齐发·冰", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 150, "frz": 30, "summon_count": 1 }, desc: "万箭齐发,对{target}造成攻击力{ap}%伤害,{frz}%概率冰冻",
6150: { uuid: 6150, name: "万箭齐发·冰", lv: 1, cd: 8, ccd: 0, overrides: {"ap":150,"frz":30,"summon_count":1}, desc: "万箭齐发,对{target}造成攻击力{ap}%伤害,{frz}%概率冰冻",
lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 200, "frz": 50, "summon_count": 1 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 250, "frz": 70, "summon_count": 2 } },
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":200,"frz":50,"summon_count":1} },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":250,"frz":70,"summon_count":2} },
],
},
},
@@ -632,17 +620,15 @@ export const HeroInfo: Record<number, heroInfo> = {
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,
skills: {
6010: {
uuid: 6010, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { "ap": 100, "bck": 30 }, desc: "掷出紫魔球,对{target}造成攻击力{ap}%伤害,击退{bck}",
6010: { uuid: 6010, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: {"ap":100,"bck":30}, desc: "掷出紫魔球,对{target}造成攻击力{ap}%伤害,击退{bck}",
lv_entries: [
{ lv: 2, s_lv: SkillLv.Lv2, overrides: { "bck": 40 } },
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"bck":40} },
],
},
6200: {
uuid: 6200, name: "火焰喷射", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 250, "bck": 100, "summon_count": 1 }, desc: "喷出烈焰风暴,对{target}造成攻击力{ap}%伤害,击退{bck}",
6200: { uuid: 6200, name: "火焰喷射", lv: 1, cd: 8, ccd: 0, overrides: {"ap":250,"bck":100,"summon_count":1}, desc: "喷出烈焰风暴,对{target}造成攻击力{ap}%伤害,击退{bck}",
lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 350, "bck": 100, "summon_count": 1 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 450, "bck": 100, "summon_count": 2 } },
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":350,"bck":100,"summon_count":1} },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":450,"bck":100,"summon_count":2} },
],
},
},
@@ -655,28 +641,26 @@ export const HeroInfo: Record<number, heroInfo> = {
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,
skills: {
6011: {
uuid: 6011, 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: 2, s_lv: SkillLv.Lv2, overrides: { "bck": 10 }, desc: "挥杖对{target}造成攻击力{ap}%伤害,击退{bck}" },
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"bck":10}, desc: "挥杖对{target}造成攻击力{ap}%伤害,击退{bck}" },
],
},
6302: {
uuid: 6302, name: "治疗", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 300, "summon_count": 1 }, desc: "为{target}回复攻击力{ap}%生命",
6302: { uuid: 6302, name: "治疗", lv: 1, cd: 8, ccd: 0, overrides: {"ap":300,"summon_count":1}, desc: "为{target}回复攻击力{ap}%生命",
lv_entries: [
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 400, "summon_count": 1 } },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 450, "summon_count": 2 } },
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":400,"summon_count":1} },
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":450,"summon_count":2} },
],
},
},
atking: {
6301: [
{ lv: 4, s_lv: SkillLv.Lv1, name: "圣愈之盾", t_num: 3, overrides: { "ap": 30, "summon_count": 1 }, desc: "{target}获得生命最大值{ap}%的护盾" },
{ lv: 4, s_lv: SkillLv.Lv1, name: "圣愈之盾", t_num: 3, overrides: {"ap":30,"summon_count":1}, desc: "{target}获得生命最大值{ap}%的护盾" },
],
},
info: "",
},
// @hero-setup:heroes-end
// @hero-setup:heroes-end
/*
*=============怪物配置列表================

View File

@@ -22,7 +22,7 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ec
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
import { oops } from "db://oops-framework/core/Oops";
import { mLogger } from "../common/Logger";
import { HeroInfo, HeroList, SkillTriggerType, LvFieldEntry, LvTriggerEntry, TriggerGrouped, getHeroDisplayStats } from "../common/config/heroSet";
import { HeroInfo, HeroList, SkillTriggerType, LvFieldEntry, LvTriggerEntry, TriggerGrouped, HSkillInfo, getHeroDisplayStats } from "../common/config/heroSet";
import { buildHeroSkillDesc } from "../common/HeroSkillText";
import { GameEvent } from "../common/config/GameEvent";
import { HERO_UPGRADE_NEED_FRAGMENTS, RARITY_BG_COLORS } from "../common/config/GameSet";
@@ -524,6 +524,9 @@ export class HerosListComp extends CCComp {
this.addSkillIcon(hSkill.uuid, sLv, false, false)
})
// ---- 普攻 lv2 强化档:作为独立技能图标(名称/图标取 lv1,弹窗只展示 lv2 说明) ----
this.addNormalLv2Icon(Object.values(hero.skills)[0], lv)
// ---- 触发技能:每个触发槽位整组一个图标,按 PANEL_TRIGGER_TYPES 顺序追加 ----
for (const type of HerosListComp.PANEL_TRIGGER_TYPES) {
if (type === SkillTriggerType.Field) {
@@ -536,21 +539,23 @@ export class HerosListComp extends CCComp {
/**
* 实例化技能小图标并初始化
* @param s_uuid 技能 UUID(SkillSet 或 FieldSkillSet;整组模式下取组内首个,仅用于图标)
* @param s_lv 当前等级对应的技能等级(locked 时为解锁预览档)
* @param locked 当前等级未激活 → 显示锁定遮罩
* @param isField true 表示驻场光环词条(图标取 FieldSkillSet)
* @param slot 技能所属槽位(普攻/大招传 undefined;触发/光环传对应类型,
* 同一底座不同槽位视为不同技能,弹窗按槽位取档;复活已纳入 dead)
* @param isGroup 整组模式:该图标代表整个触发槽位,组名取组内首个自定义名,
* 弹窗按整组合并渲染(组内多技能/词条统一说明)
* @param s_uuid 技能 UUID(SkillSet 或 FieldSkillSet;整组模式下取组内首个,仅用于图标)
* @param s_lv 当前等级对应的技能等级(locked 时为解锁预览档)
* @param locked 当前等级未激活 → 显示锁定遮罩
* @param isField true 表示驻场光环词条(图标取 FieldSkillSet)
* @param slot 技能所属槽位(普攻/大招传 undefined;触发/光环传对应类型,
* 同一底座不同槽位视为不同技能,弹窗按槽位取档;复活已纳入 dead)
* @param isGroup 整组模式:该图标代表整个触发槽位,组名取组内首个自定义名,
* 弹窗按整组合并渲染(组内多技能/词条统一说明)
* @param normalLv2 普攻 lv2 专属模式:该图标代表普攻 lv2 强化档,名称/图标取 lv1,
* 弹窗只展示 lv2 档位说明
*/
private addSkillIcon(s_uuid: number, s_lv: number, locked: boolean, isField: boolean, slot?: SkillTriggerType, isGroup: boolean = false) {
private addSkillIcon(s_uuid: number, s_lv: number, locked: boolean, isField: boolean, slot?: SkillTriggerType, isGroup: boolean = false, normalLv2: boolean = false) {
const node = instantiate(this.skill_icon_prefab)
node.name = `skill_${s_uuid}`
const comp = node.getComponent(SSkillBoxComp) || node.addComponent(SSkillBoxComp)
// 携带所属英雄与槽位,点击弹窗按英雄技能分档描述渲染
comp.initHeroSkill(s_uuid, s_lv, locked, isField, this.huuid, slot, isGroup)
comp.initHeroSkill(s_uuid, s_lv, locked, isField, this.huuid, slot, isGroup, normalLv2)
this.skills_node.addChild(node)
}
@@ -598,6 +603,22 @@ export class HerosListComp extends CCComp {
/** 复活技能已纳入 dead 触发组,通过 dead 配置展示(revive_hp / revive_count),无需单独处理 */
/**
* 普攻 lv2+ 强化档作为独立技能图标:
* 普攻(skills[0])lv_entries 存在档时单独出图标,名称/图标取 lv1(s_uuid 相同),
* 等级显示偏移一档(配置 Lv2 → Lv1,SSkillBoxComp 统一处理),弹窗按 hero_normal_lv2
* 模式只展示 lv2+ 档位说明;激活判定按档位的英雄等级(lv 阈值)。
* Why: 普攻 lv2 档是独立成长机制(如附加暴击/冰冻),需让玩家明确感知其存在与解锁条件。
*/
private addNormalLv2Icon(normal: HSkillInfo | undefined, lv: number) {
const entry = normal?.lv_entries?.[0]
if (!normal || !entry) return
// 节点命名区分 lv2 档(普攻与触发槽位可能同底座,uuid 重名会互相干扰)
this.addSkillIcon(normal.uuid, entry.s_lv ?? 2, lv < entry.lv, false, undefined, false, true)
const icon = this.skills_node.children[this.skills_node.children.length - 1]
if (icon) icon.name = `skill_${normal.uuid}_lv2`
}
// ======================== 英雄动画 ========================
private updateHeroAnimation(uuid: number) {

View File

@@ -48,6 +48,9 @@ export class SSkillBoxComp extends CCComp {
/** 整组模式(英雄图鉴):true 时该图标代表整个触发槽位(atking/dead/fstart/atked/call/field),
* 组内多技能/词条合并为一个名称与一套说明展示,弹窗按整组取档 */
private hero_group: boolean = false;
/** 普攻 lv2 专属模式(英雄图鉴):true 时该图标代表普攻 lv2 强化档,
* 名称/图标取 lv1,弹窗只展示 lv2 档位说明(裁剪 lv1 档) */
private hero_normal_lv2: boolean = false;
/** 卡牌等级 */
private rarity: number = 1;
/** 卡牌自定义图标ID(优先级最高,未定义则按 trigger_type 自动取) */
@@ -89,6 +92,8 @@ export class SSkillBoxComp extends CCComp {
hero_slot: this.hero_uuid ? this.hero_slot : undefined,
// 整组模式:弹窗按整个触发槽位合并渲染(组内多技能/词条统一说明)
hero_group: this.hero_uuid ? this.hero_group : undefined,
// 普攻 lv2 专属模式:弹窗只展示 lv2 档位说明(名称/图标取 lv1)
hero_normal_lv2: this.hero_uuid ? this.hero_normal_lv2 : undefined,
});
}
@@ -115,13 +120,18 @@ export class SSkillBoxComp extends CCComp {
* @param slot 技能所属槽位(普攻/大招传 undefined;触发/光环传对应类型,复活已纳入 dead)
* @param isGroup 整组模式:该图标代表整个触发槽位,组名取组内首个自定义名,
* 弹窗按整组合并渲染(组内多技能/词条统一说明)
*/
initHeroSkill(s_uuid: number, s_lv: number, locked: boolean, isField: boolean = false, heroUuid: number = 0, slot?: SkillTriggerType, isGroup: boolean = false) {
* @param normalLv2 普攻 lv2+ 强化档专属模式:名称/图标取 lv1,弹窗只展示 lv2+ 档位说明;
* 等级显示偏移一档(配置 Lv2 → 显示 Lv1,Lv3 → 显示 Lv2),强化档从 1 起计
*/
initHeroSkill(s_uuid: number, s_lv: number, locked: boolean, isField: boolean = false, heroUuid: number = 0, slot?: SkillTriggerType, isGroup: boolean = false, normalLv2: boolean = false) {
this.s_uuid = s_uuid;
this.hero_uuid = heroUuid;
this.hero_slot = slot;
this.hero_group = isGroup;
this.rarity = s_lv;
this.hero_normal_lv2 = normalLv2;
// 普攻 lv2+ 强化档:等级显示偏移一档(配置 Lv2 显示 Lv1,Lv3 显示 Lv2),
// 强化档作为独立于普攻的技能存在,等级从 1 起计
this.rarity = normalLv2 ? Math.max(1, s_lv - 1) : s_lv;
this.hero_icon_source = isField ? "field" : "skill";
this.updateUI();
this.setLocked(locked);

View File

@@ -64,6 +64,9 @@ export interface SInfoParams {
/** 触发组整体模式(英雄图鉴):true 时按 hero_slot 整组渲染,
* 组内多技能/词条合并为一套分档说明统一展示(每个触发槽位视为一个技能) */
hero_group?: boolean;
/** 普攻 lv2+ 强化档专属模式(英雄图鉴):名称/图标取 lv1,只展示 lv2+ 档位说明
* (裁剪 lv1 档,隐藏 2/3 级面板);等级显示偏移一档(配置 Lv2 → 显示 Lv1,Lv3 → Lv2) */
hero_normal_lv2?: boolean;
}
/** 等级提升信息(用于 2 级 / 3 级面板) */
@@ -256,15 +259,16 @@ export class SinfoComp extends CCComp {
private renderHeroSkill(p: SInfoParams): boolean {
const tiers = (p.hero_group && p.hero_slot !== undefined)
? buildHeroGroupTierLines(p.hero_uuid!, p.hero_slot)
: buildHeroSkillTierLines(p.hero_uuid!, p.uuid, p.hero_slot);
: buildHeroSkillTierLines(p.hero_uuid!, p.uuid, p.hero_slot, p.hero_normal_lv2 ? 2 : 1);
if (tiers.length === 0) return false;
// 图标 / 名称 / 当前技能等级与通用逻辑一致(skill_lv 传的就是当前生效 s_lv)
// 图标 / 名称 / 当前技能等级与通用逻辑一致(skill_lv 传的就是当前生效 s_lv;
// 普攻 lv2+ 强化档等级偏移一档显示:配置 Lv2 → Lv1,Lv3 → Lv2)
this.renderIcon(p);
this.setLabel(this.name_label, this.resolveName(p));
this.setLabel(this.lv_label, `Lv.${p.skill_lv}`);
this.setLabel(this.lv_label, `Lv.${p.hero_normal_lv2 ? Math.max(1, p.skill_lv - 1) : p.skill_lv}`);
// 技能 1 级:完整能力描述
// 主说明:普攻 lv2 专属模式只展示 lv2 档位文本(裁剪后首档即 lv2),否则 slv1 完整能力
if (this.main_info && this.main_info.isValid) {
this.main_info.string = tiers[0].text || "暂无描述";
}
@@ -272,9 +276,17 @@ export class SinfoComp extends CCComp {
// 英雄当前局外等级:激活判定基准
const heroLv = Math.max(1, smc.getHeroOuterLv(p.hero_uuid!));
// 未激活图标背景:1 级档位未解锁时显示
// 未激活图标背景:首档未解锁时显示
this.updateInactiveBg(heroLv >= tiers[0].heroLv);
// 普攻 lv2 专属模式:等级/档位面板均由该档接管,隐藏 2/3 级面板(只展示 lv2 描述)
if (p.hero_normal_lv2) {
this.setPanelActive(this.lv2_node, false);
this.setPanelActive(this.lv3_node, false);
this.renderLvPanelFromTier(tiers[0], heroLv, this.main_status, null);
return true;
}
// 技能 1 级:激活状态与 2/3 级面板同一表示方式(描述已在 main_info 展示,此处仅渲染状态)
this.renderLvPanelFromTier(tiers[0], heroLv, this.main_status, null);

View File

@@ -19,7 +19,7 @@
"skills": [
{
"uuid": 6004,
"name": "",
"name": "强化普攻",
"cd": 1.2,
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Slow].cd",
"overrides": {
@@ -111,7 +111,7 @@
"skills": [
{
"uuid": 6004,
"name": "",
"name": "强化普攻",
"cd": 1.2,
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Slow].cd",
"overrides": {
@@ -207,7 +207,7 @@
"skills": [
{
"uuid": 6004,
"name": "",
"name": "强化普攻",
"cd": 1.2,
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Slow].cd",
"overrides": {
@@ -302,7 +302,7 @@
"skills": [
{
"uuid": 6002,
"name": "",
"name": "强化普攻",
"cd": 0.9,
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Fast].cd",
"overrides": {
@@ -399,7 +399,7 @@
"skills": [
{
"uuid": 6002,
"name": "",
"name": "强化普攻",
"cd": 0.9,
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Fast].cd",
"overrides": {
@@ -497,7 +497,7 @@
"skills": [
{
"uuid": 6006,
"name": "",
"name": "强化普攻",
"cd": 1.05,
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Normal].cd",
"overrides": {
@@ -592,7 +592,7 @@
"skills": [
{
"uuid": 6010,
"name": "",
"name": "强化普攻",
"cd": 1.2,
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Slow].cd",
"overrides": {
@@ -688,7 +688,7 @@
"skills": [
{
"uuid": 6011,
"name": "",
"name": "强化普攻",
"cd": 1.05,
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Normal].cd",
"overrides": {
@@ -764,4 +764,4 @@
"info": ""
}
]
}
}