feat(battle): add silver and diamond reward system

1. 新增银币、钻石奖励配置到游戏结算配置表
2. 添加银币、钻石奖励的预制体与组件绑定
3. 实现结算逻辑:固定发放银币,按胜负区间随机发放钻石
4. 新增奖励UI展示条目,完整展示新增奖励类型
This commit is contained in:
pan
2026-09-10 15:36:43 +08:00
parent 317a500439
commit ecd6be7a84
8 changed files with 2366 additions and 59 deletions

View File

@@ -231,6 +231,13 @@ export const VICTORY_REWARD_SET = {
played_fragment: 1,
/** 随机英雄碎片数量(发放给随机抽中的 1 个英雄) */
random_fragment: 2,
/** 银币:固定发放,不分输赢 */
silver: 3,
/** 钻石:按输赢在 [min, max] 闭区间内随机(不参与 victory_multiplier) */
diamond: {
victory: { min: 5, max: 10 },
defeat: { min: 1, max: 3 },
},
/** 胜利加成系数(失败 1.0) */
victory_multiplier: 1.2,
};

View File

@@ -200,6 +200,8 @@ export interface MonSkillSet {
dead?: TriggerGrouped;
/** 战斗开始触发 */
fstart?: TriggerGrouped;
/** 复活触发 */
revive?: TriggerGrouped;
/** 在技能池中的抽取权重 */
weight: number;
}
@@ -355,6 +357,7 @@ export interface GeneratedMonster {
atked?: TriggerGrouped;
dead?: TriggerGrouped;
fstart?: TriggerGrouped;
revive?: TriggerGrouped;
};
}

View File

@@ -47,6 +47,10 @@ interface RewardResult {
gold: number;
/** 发放的天赋经验数量 */
talentExp: number;
/** 发放的银币数量 */
silver: number;
/** 发放的钻石数量 */
diamond: number;
/** 英雄碎片奖励列表 */
fragments: FragmentReward[];
}
@@ -110,6 +114,12 @@ export class VictoryComp extends CCComp {
@property({ type: Prefab, tooltip: "天赋经验奖励条目预制体(reward_item_exp.prefab,挂 RewardItemComp)" })
reward_exp_prefab: Prefab = null!;
@property({ type: Prefab, tooltip: "银币奖励条目预制体(reward_item_silver.prefab,挂 RewardItemComp)" })
reward_silver_prefab: Prefab = null!;
@property({ type: Prefab, tooltip: "钻石奖励条目预制体(reward_item_diamond.prefab,挂 RewardItemComp)" })
reward_diamond_prefab: Prefab = null!;
/** 调试日志开关 */
debugMode: boolean = false;
/** 奖励等级(预留) */
@@ -557,6 +567,11 @@ export class VictoryComp extends CCComp {
const gold = Math.floor((cfg.gold.base + wave * cfg.gold.per_wave) * mult);
const talentExp = Math.floor((cfg.talent_exp.base + wave * cfg.talent_exp.per_wave) * mult);
// 1.5 银币固定发放;钻石按输赢在 [min, max] 内随机(不吃胜利加成,避免与固定区间重复放大)
const silver = cfg.silver;
const dRange = isVictory ? cfg.diamond.victory : cfg.diamond.defeat;
const diamond = dRange.min + Math.floor(Math.random() * (dRange.max - dRange.min + 1));
// 2. 英雄碎片:出场英雄各保底 + 1 个随机英雄
const playedUuids = this.collectPlayedHeroUuids();
const playedSet = new Set(playedUuids);
@@ -574,6 +589,12 @@ export class VictoryComp extends CCComp {
if (gold > 0) {
smc.updateGold(gold); // 统一入口:改 data 持久层 + 镜像 vmdata + 标脏同步
}
if (silver > 0) {
smc.updateSilver(silver);
}
if (diamond > 0) {
smc.updateDiamond(diamond);
}
if (talentExp > 0) {
smc.addTalentExp(talentExp);
}
@@ -581,10 +602,10 @@ export class VictoryComp extends CCComp {
smc.addHeroFragments(f.uuid, f.count);
}
this._rewardResult = { gold, talentExp, fragments };
this._rewardResult = { gold, talentExp, silver, diamond, fragments };
mLogger.log(this.debugMode, 'VictoryComp', '[VictoryComp] 结算奖励发放', {
isVictory, wave, gold, talentExp, fragments,
isVictory, wave, gold, talentExp, silver, diamond, fragments,
});
}
@@ -612,6 +633,20 @@ export class VictoryComp extends CCComp {
items.push(node);
}
// 银币条目
if (this.reward_silver_prefab && r.silver > 0) {
const node = instantiate(this.reward_silver_prefab);
node.getComponent(RewardItemComp)?.setReward(r.silver);
items.push(node);
}
// 钻石条目
if (this.reward_diamond_prefab && r.diamond > 0) {
const node = instantiate(this.reward_diamond_prefab);
node.getComponent(RewardItemComp)?.setReward(r.diamond);
items.push(node);
}
// 英雄碎片条目(复用 clips.prefab + ChipComp,num 子节点显示数量)
if (this.clip_prefab) {
for (const f of r.fragments) {