diff --git a/assets/script/game/common/SingletonModuleComp.ts b/assets/script/game/common/SingletonModuleComp.ts index df8f6efe..b371719d 100644 --- a/assets/script/game/common/SingletonModuleComp.ts +++ b/assets/script/game/common/SingletonModuleComp.ts @@ -7,6 +7,8 @@ import { WxCloudApi } from "../wx_clound_client_api/WxCloudApi"; import { GameEvent } from "./config/GameEvent"; import { GameScoreStats } from "./config/HeroAttrs"; import { mLogger } from "./Logger"; +import { TalentType } from "./config/TalentSet"; + /** * 用远程数据覆盖本地数据(统一方法) * @param remoteData 远程数据(云端或本地调试) @@ -16,7 +18,7 @@ interface GameDate{ heros:any, fight_hero:number, collection?: { - talents: Record, + talents: Partial>, player_level: number, player_exp: number, talent_points: number, @@ -63,7 +65,7 @@ export class SingletonModuleComp extends ecs.Comp { heros:any= [5001] collection: { - talents: Record; + talents: Partial>; player_level: number; player_exp: number; talent_points: number; diff --git a/assets/script/game/common/config/TalentSet.ts b/assets/script/game/common/config/TalentSet.ts index fe4da9fe..959f9785 100644 --- a/assets/script/game/common/config/TalentSet.ts +++ b/assets/script/game/common/config/TalentSet.ts @@ -42,29 +42,29 @@ export const TalentConfig = { { maxLevel: 30, expPerLevel: 200 } ], - // 天赋列表 + // 所有天赋定义(使用数组维护) talents: [ - { id: 1, name: "攻击强化", icon: "⚔️", desc: "所有英雄 ATK +{value}%", + { id: TalentType.Attack, name: "攻击强化", icon: "⚔️", desc: "所有英雄 ATK +{value}%", maxLevel: 5, values: [3, 6, 9, 12, 15], costs: [1, 1, 2, 2, 3] }, - { id: 2, name: "生命强化", icon: "❤️", desc: "所有英雄 HP +{value}%", + { id: TalentType.Hp, name: "生命强化", icon: "❤️", desc: "所有英雄 HP +{value}%", maxLevel: 5, values: [5, 10, 15, 20, 25], costs: [1, 1, 2, 2, 3] }, - { id: 3, name: "暴击强化", icon: "🔥", desc: "所有英雄暴击率 +{value}%", + { id: TalentType.Critical, name: "暴击强化", icon: "🔥", desc: "所有英雄暴击率 +{value}%", maxLevel: 5, values: [2, 4, 6, 8, 10], costs: [1, 1, 2, 2, 3] }, - { id: 4, name: "风怒强化", icon: "⚡", desc: "所有英雄风怒率 +{value}%", + { id: TalentType.WindFury, name: "风怒强化", icon: "⚡", desc: "所有英雄风怒率 +{value}%", maxLevel: 5, values: [2, 4, 6, 8, 10], costs: [1, 1, 2, 2, 3] }, - { id: 5, name: "冰冻强化", icon: "❄️", desc: "所有英雄冰冻率 +{value}%", + { id: TalentType.Freeze, name: "冰冻强化", icon: "❄️", desc: "所有英雄冰冻率 +{value}%", maxLevel: 5, values: [2, 4, 6, 8, 10], costs: [1, 1, 2, 2, 3] }, - { id: 6, name: "穿刺强化", icon: "🗡️", desc: "所有英雄穿刺 +{value}", + { id: TalentType.Puncture, name: "穿刺强化", icon: "🗡️", desc: "所有英雄穿刺 +{value}", maxLevel: 5, values: [0.2, 0.4, 0.6, 0.8, 1.0], costs: [1, 1, 2, 2, 3] }, - { id: 7, name: "亡语强化", icon: "🛡️", desc: "死亡触发技能额外触发次数+{value}次", + { id: TalentType.DeadTrigger, name: "亡语强化", icon: "🛡️", desc: "死亡触发技能额外触发次数+{value}次", maxLevel: 5, values: [1], costs: [25] }, - { id: 8, name: "召唤强化", icon: "🛡️", desc: "召唤触发技能额外触发次数+{value}次", + { id: TalentType.Summon, name: "召唤强化", icon: "🛡️", desc: "召唤触发技能额外触发次数+{value}次", maxLevel: 1, values: [1], costs: [25] }, - { id: 9, name: "采购优惠", icon: "🛒", desc: "购买英雄 -{value}金", + { id: TalentType.BuyDiscount, name: "采购优惠", icon: "🛒", desc: "购买英雄 -{value}金", maxLevel: 1, values: [1], costs: [10] }, - { id: 10, name: "刷新优惠", icon: "🔄", desc: "刷新重抽 -{value}金", + { id: TalentType.RefreshDiscount, name: "刷新优惠", icon: "🔄", desc: "刷新重抽 -{value}金", maxLevel: 1, values: [1], costs: [10] }, - { id: 11, name: "出售补贴", icon: "💰", desc: "出售英雄返还 +{value}%金币", + { id: TalentType.SellBonus, name: "出售补贴", icon: "💰", desc: "出售英雄返还 +{value}金币", maxLevel: 1, values: [1], costs: [10] } ] as TalentInfo[] }; diff --git a/assets/script/game/hero/HeroAttrsComp.ts b/assets/script/game/hero/HeroAttrsComp.ts index cb12aa5e..8fd8abb8 100644 --- a/assets/script/game/hero/HeroAttrsComp.ts +++ b/assets/script/game/hero/HeroAttrsComp.ts @@ -5,7 +5,7 @@ import { Timer } from "db://oops-framework/core/common/timer/Timer"; import { FacSet, FightSet } from "../common/config/GameSet"; import { FieldSkillSet, FieldSkillType } from "../common/config/SkillSet"; import { smc } from "../common/SingletonModuleComp"; -import { TalentConfig } from "../common/config/TalentSet"; +import { TalentConfig, TalentType } from "../common/config/TalentSet"; @ecs.register('HeroAttrs') export class HeroAttrsComp extends ecs.Comp { public debugMode: boolean = false; @@ -302,7 +302,7 @@ export class HeroAttrsComp extends ecs.Comp { } /** 获取指定天赋的加成数值 */ - public static getTalentValue(talentId: number): number { + public static getTalentValue(talentId: TalentType): number { if (!smc || !smc.collection || !smc.collection.talents) return 0; let level = smc.collection.talents[talentId] || 0; if (level <= 0) return 0; diff --git a/assets/script/game/map/CardComp.ts b/assets/script/game/map/CardComp.ts index a23607ff..c6e9adc3 100644 --- a/assets/script/game/map/CardComp.ts +++ b/assets/script/game/map/CardComp.ts @@ -30,6 +30,8 @@ import { GameEvent } from "../common/config/GameEvent"; import { oops } from "db://oops-framework/core/Oops"; import { smc } from "../common/SingletonModuleComp"; import { UIID } from "../common/config/GameUIConfig"; +import { HeroAttrsComp } from "../hero/HeroAttrsComp"; +import { TalentType } from "../common/config/TalentSet"; @@ -272,7 +274,14 @@ export class CardComp extends CCComp { this.cardData = data; this.card_uuid = data.uuid; this.card_type = data.type; - this.card_cost = data.cost; + + let baseCost = data.cost ?? 0; + if (this.card_type === CardType.Hero) { + const discount = HeroAttrsComp.getTalentValue(TalentType.BuyDiscount); + baseCost = Math.max(0, baseCost - discount); + } + this.card_cost = Math.floor(baseCost); + this.node.active = true; this.isEnlarged = false; this.applyCardUI(); @@ -300,7 +309,7 @@ export class CardComp extends CCComp { */ useCard(): CardConfig | null { if (!this.cardData || this.isUsing) return null; - const cardCost = Math.max(0, Math.floor(this.cardData.cost ?? 0)); + const cardCost = this.card_cost; const currentCoin = this.getMissionCoin(); // 金币不足 → 提示并回弹 if (currentCoin < cardCost) { diff --git a/assets/script/game/map/HInfoComp.ts b/assets/script/game/map/HInfoComp.ts index aa8feb43..b3555887 100644 --- a/assets/script/game/map/HInfoComp.ts +++ b/assets/script/game/map/HInfoComp.ts @@ -24,6 +24,8 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ec import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp"; import { HeroInfo } from "../common/config/heroSet"; import { HeroAttrsComp } from "../hero/HeroAttrsComp"; +import { smc } from "../common/SingletonModuleComp"; +import { TalentType } from "../common/config/TalentSet"; import { Hero } from "../hero/Hero"; import { FieldSkillType } from "../common/config/SkillSet"; import { GameEvent } from "../common/config/GameEvent"; @@ -267,7 +269,15 @@ export class HInfoComp extends CCComp { // 卖出英雄金币收益 const baseSellGold = 1; // 基础卖出金币 const goldBoost = HeroAttrsComp.getFieldSkillTotalValue(FieldSkillType.SellGold); - const totalSellGold = baseSellGold + goldBoost; + let totalSellGold = baseSellGold + goldBoost; + + // 应用天赋 SellBonus (增加数值) + const bonusGold = HeroAttrsComp.getTalentValue(TalentType.SellBonus); + if (bonusGold > 0) { + totalSellGold += bonusGold; + } + totalSellGold = Math.floor(totalSellGold); + oops.message.dispatchEvent(GameEvent.CoinAdd, { delta: totalSellGold }); oops.gui.remove(UIID.IBox); diff --git a/assets/script/game/map/MissionCardComp.ts b/assets/script/game/map/MissionCardComp.ts index 96f33e47..ec3c2102 100644 --- a/assets/script/game/map/MissionCardComp.ts +++ b/assets/script/game/map/MissionCardComp.ts @@ -48,6 +48,7 @@ import { HeroViewComp } from "../hero/HeroViewComp"; import { FacSet, FightSet } from "../common/config/GameSet"; import { MoveComp } from "../hero/MoveComp"; import { MissionHeroCompComp } from "./MissionHeroComp"; +import { TalentType } from "../common/config/TalentSet"; const { ccclass, property } = _decorator; @@ -840,7 +841,10 @@ export class MissionCardComp extends CCComp { } private getRefreshCost(): number { - return Math.max(0, Math.floor(this.refreshCost)); + let cost = this.refreshCost; + const discount = HeroAttrsComp.getTalentValue(TalentType.RefreshDiscount); + cost = Math.max(0, cost - discount); + return Math.floor(cost); } private ensureHeroInfoPanel(eid: number, model: HeroAttrsComp) { diff --git a/assets/script/game/map/TalentsComp.ts b/assets/script/game/map/TalentsComp.ts index 8819602e..11f46860 100644 --- a/assets/script/game/map/TalentsComp.ts +++ b/assets/script/game/map/TalentsComp.ts @@ -24,7 +24,7 @@ import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/modu import { mLogger } from "../common/Logger"; import { smc } from "../common/SingletonModuleComp"; import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops"; -import { TalentConfig, TalentInfo } from "../common/config/TalentSet"; +import { TalentConfig, TalentInfo, TalentType } from "../common/config/TalentSet"; const { ccclass, property } = _decorator; @@ -145,14 +145,14 @@ export class TalentsComp extends CCComp { TalentConfig.talents.forEach(talentInfo => { let itemNode = instantiate(this.prefab_talent_item); this.talents_content.addChild(itemNode); - this.updateTalentItem(itemNode, talentInfo, collection.talents[talentInfo.id] || 0); + this.updateTalentItem(itemNode, talentInfo, collection.talents[talentInfo.id as TalentType] || 0); }); } else { // 否则直接更新现有节点 TalentConfig.talents.forEach((talentInfo, index) => { let itemNode = this.talents_content.children[index]; if (itemNode) { - this.updateTalentItem(itemNode, talentInfo, collection.talents[talentInfo.id] || 0); + this.updateTalentItem(itemNode, talentInfo, collection.talents[talentInfo.id as TalentType] || 0); } }); } @@ -197,7 +197,7 @@ export class TalentsComp extends CCComp { } /** 点击升级按钮 */ - private onUpgradeClicked(talentId: number, currentLevel: number, cost: number) { + private onUpgradeClicked(talentId: TalentType, currentLevel: number, cost: number) { const collection = smc.collection; let points = collection.talent_points || 0; @@ -228,8 +228,9 @@ export class TalentsComp extends CCComp { // 计算已消耗的天赋点总和 let refundedPoints = 0; for (let id in collection.talents) { - let level = collection.talents[id]; - let talentInfo = TalentConfig.talents.find(t => t.id === Number(id)); + let talentId = Number(id) as TalentType; + let level = collection.talents[talentId] || 0; + let talentInfo = TalentConfig.talents.find(t => t.id === talentId); if (talentInfo) { for (let i = 0; i < level; i++) { refundedPoints += talentInfo.costs[i];