feat(field-skill): 新增驻场技能卡牌支持与属性计算逻辑

为CardConfig接口新增field字段用于配置驻场技能UUID数组
新增两个示例驻场光环卡牌
优化FieldSkillHelper统计场上技能卡牌的属性加成
调整SkillBoxComp逻辑:驻场技能隐藏剩余次数、跳过定期触发
This commit is contained in:
panFD
2026-06-04 21:21:34 +08:00
parent 998300f721
commit c1f1aea387
3 changed files with 46 additions and 5 deletions

View File

@@ -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<number, number> = {
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%
}
);

View File

@@ -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;
}
}

View File

@@ -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;