From c1f1aea387d19e115f23518eb756df55217c3ea2 Mon Sep 17 00:00:00 2001 From: panFD Date: Thu, 4 Jun 2026 21:21:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(field-skill):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=A9=BB=E5=9C=BA=E6=8A=80=E8=83=BD=E5=8D=A1=E7=89=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=B8=8E=E5=B1=9E=E6=80=A7=E8=AE=A1=E7=AE=97=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为CardConfig接口新增field字段用于配置驻场技能UUID数组 新增两个示例驻场光环卡牌 优化FieldSkillHelper统计场上技能卡牌的属性加成 调整SkillBoxComp逻辑:驻场技能隐藏剩余次数、跳过定期触发 --- assets/script/game/common/config/CardSet.ts | 14 +++++++++++++- assets/script/game/hero/FieldSkillHelper.ts | 19 ++++++++++++++++++- assets/script/game/map/SkillBoxComp.ts | 18 +++++++++++++++--- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/assets/script/game/common/config/CardSet.ts b/assets/script/game/common/config/CardSet.ts index 19191aad..5b32d78a 100644 --- a/assets/script/game/common/config/CardSet.ts +++ b/assets/script/game/common/config/CardSet.ts @@ -65,6 +65,7 @@ export interface CardConfig { t_inv?: number // 触发间隔(秒) keep_waves?: number // 维持的波次数(-1表示持续到战斗结束,0或undefined表示仅本波次) overrides?: SkillOverrides // 技能参数覆写(如自定义伤害ap、buff值、金币数等) + field?: number[] // 驻场技能 UUID 数组,表示该卡牌提供驻场属性加成 } export const CardsUpSet: Record = { 1: 50, @@ -141,7 +142,18 @@ CardPoolList.push( { uuid: 6101, type: CardType.Skill, cost: 0, weight: 10, pool_lv: 1, wave: 1, kind: CKind.Skill, card_lv: 1, name: "持续天降火球", info: "战斗中每隔3秒释放一个火球,造成300%伤害,持续2波次", - is_inst: false, t_times: 999, t_inv: 3, keep_waves: 15, overrides: { TGroup: TGroup.Enemy, ap: 300, hit_count: 2 } + is_inst: false, t_times: 999, t_inv: 3, keep_waves: 2, overrides: { TGroup: TGroup.Enemy, ap: 300, hit_count: 2 } + }, + // 驻场技能示例卡牌 + { + uuid: 6501, type: CardType.Skill, cost: 0, weight: 10, pool_lv: 1, wave: 1, kind: CKind.Skill, card_lv: 1, + name: "全体攻击光环", info: "全体英雄攻击力增加20%,只要此卡在场就生效", + is_inst: false, t_times: 999, t_inv: 0, keep_waves: -1, field: [7008] // 对应 FieldSkillSet[7008] HeroAtk +20% + }, + { + uuid: 6502, type: CardType.Skill, cost: 0, weight: 10, pool_lv: 1, wave: 1, kind: CKind.Skill, card_lv: 1, + name: "全体生命光环", info: "全体英雄最大生命增加10%,只要此卡在场就生效", + is_inst: false, t_times: 999, t_inv: 0, keep_waves: -1, field: [7016] // 对应 FieldSkillSet[7016] HeroHp +10% } ); diff --git a/assets/script/game/hero/FieldSkillHelper.ts b/assets/script/game/hero/FieldSkillHelper.ts index 2ff54353..a8ca30d9 100644 --- a/assets/script/game/hero/FieldSkillHelper.ts +++ b/assets/script/game/hero/FieldSkillHelper.ts @@ -3,6 +3,7 @@ import { FacSet } from "../common/config/GameSet"; import { HeroInfo } from "../common/config/heroSet"; import { FieldSkillSet, FieldSkillType } from "../common/config/SkillSet"; import { HeroAttrsComp } from "./HeroAttrsComp"; +import { SkillBoxComp } from "../map/SkillBoxComp"; /** * 驻场技能(光环属性)计算辅助类 @@ -12,9 +13,11 @@ import { HeroAttrsComp } from "./HeroAttrsComp"; * 解耦原先写在 HeroAttrsComp 中的静态计算逻辑,符合单一职责原则。 */ export class FieldSkillHelper { - /** 获取指定驻场技能类型的总加成值(只计算存活的友方英雄) */ + /** 获取指定驻场技能类型的总加成值(计算存活的友方英雄 + 场上的驻场技能卡) */ public static getFieldSkillTotalValue(type: FieldSkillType): number { let total = 0; + + // 1. 统计英雄带来的驻场技能加成 ecs.query(ecs.allOf(HeroAttrsComp)).forEach((entity: ecs.Entity) => { const model = entity.get(HeroAttrsComp); if (!model || model.is_dead || model.fac !== FacSet.HERO) return; @@ -28,6 +31,20 @@ export class FieldSkillHelper { } } }); + + // 2. 统计技能盒子(技能卡)带来的驻场技能加成 + ecs.query(ecs.allOf(SkillBoxComp)).forEach((entity: ecs.Entity) => { + const skillBox = entity.get(SkillBoxComp); + if (!skillBox || !skillBox.field || skillBox.field.length === 0) return; + + for (const skillUuid of skillBox.field) { + const skillConfig = FieldSkillSet[skillUuid]; + if (skillConfig && skillConfig.type === type) { + total += skillConfig.value; + } + } + }); + return total; } } diff --git a/assets/script/game/map/SkillBoxComp.ts b/assets/script/game/map/SkillBoxComp.ts index ae9c22da..642ede63 100644 --- a/assets/script/game/map/SkillBoxComp.ts +++ b/assets/script/game/map/SkillBoxComp.ts @@ -75,6 +75,8 @@ export class SkillBoxComp extends CCComp { private keep_waves: number = 0; /** 技能覆写参数(自定义伤害、Buff等) */ private overrides?: SkillOverrides; + /** 驻场技能 UUID 列表 */ + public field: number[] = []; // ======================== 运行时状态 ======================== @@ -131,6 +133,7 @@ export class SkillBoxComp extends CCComp { this.trigger_interval = config.t_inv ?? 0; this.keep_waves = config.keep_waves ?? 0; this.overrides = config.overrides; + this.field = config.field || []; } this.current_trigger_times = 0; @@ -177,8 +180,12 @@ export class SkillBoxComp extends CCComp { // 更新剩余次数标签 if (this.info_label) { if (!this.is_instant) { - const remain = Math.max(0, this.trigger_times - this.current_trigger_times); - this.info_label.string = `${remain}`; + if (this.trigger_interval <= 0 && this.field && this.field.length > 0) { + this.info_label.string = ""; // 纯驻场技能不显示剩余次数 + } else { + const remain = Math.max(0, this.trigger_times - this.current_trigger_times); + this.info_label.string = `${remain}`; + } } else { this.info_label.string = ""; } @@ -189,7 +196,7 @@ export class SkillBoxComp extends CCComp { let sprite = this.cd_mask.getComponent(Sprite); if (sprite) { if (this.is_instant || this.trigger_interval <= 0) { - sprite.fillRange = 0; // 无需冷却,直接归 0 + sprite.fillRange = 0; // 无需冷却(包括驻场光环卡),直接归 0 } else { sprite.fillRange = Math.max(0, 1 - (this.timer / this.trigger_interval)); } @@ -284,6 +291,11 @@ export class SkillBoxComp extends CCComp { if (!this.initialized || !this.in_combat || this.is_instant) return; if (!smc.mission.play || smc.mission.pause) return; + // 如果是纯驻场光环技能且无触发间隔,则不执行定期触发逻辑 + if (this.trigger_interval <= 0 && this.field && this.field.length > 0) { + return; + } + if (this.current_trigger_times < this.trigger_times) { this.timer += dt;