feat(战斗系统): 实现怪物金币掉落计算和抽卡升级消耗
- 添加calculateMonsterGold函数计算不同怪物类型的金币掉落 - 修改SingletonModuleComp初始化金币为0并添加抽卡和升级消耗 - 在MissionCardComp中添加抽卡和升级的金币检查逻辑 - 清理FightSet中无用配置并添加金币相关常量 - 在MissionComp中实现金币奖励计算和局内数据初始化
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -10,6 +10,7 @@ import { HeroAttrsComp } from "../hero/HeroAttrsComp";
|
|||||||
import { Attrs, GameScoreStats } from "./config/HeroAttrs";
|
import { Attrs, GameScoreStats } from "./config/HeroAttrs";
|
||||||
import { count, time } from "console";
|
import { count, time } from "console";
|
||||||
import { getLevelExp } from "../map/RogueConfig";
|
import { getLevelExp } from "../map/RogueConfig";
|
||||||
|
import { FightSet } from "./config/GameSet";
|
||||||
/**
|
/**
|
||||||
* 用远程数据覆盖本地数据(统一方法)
|
* 用远程数据覆盖本地数据(统一方法)
|
||||||
* @param remoteData 远程数据(云端或本地调试)
|
* @param remoteData 远程数据(云端或本地调试)
|
||||||
@@ -134,7 +135,9 @@ export class SingletonModuleComp extends ecs.Comp {
|
|||||||
skill: {uuid:0,count:0},
|
skill: {uuid:0,count:0},
|
||||||
friend:{uuid:0,count:0},
|
friend:{uuid:0,count:0},
|
||||||
},
|
},
|
||||||
gold: 200, // 金币数据(MVVM绑定字段)
|
gold: 0, // 金币数据(MVVM绑定字段)
|
||||||
|
chou_gold: FightSet.CHOU_GOLD,
|
||||||
|
lvup_gold: FightSet.LVUP_GOLD_UP,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -294,9 +297,9 @@ export class SingletonModuleComp extends ecs.Comp {
|
|||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
updateGold(gold:number){
|
updateGold(gold:number, is_sync: boolean = true){
|
||||||
this.vmdata.gold += gold;
|
this.vmdata.gold += gold;
|
||||||
if(this.isWxClient()){
|
if(this.isWxClient() && is_sync){
|
||||||
let res = this.updateCloudData()
|
let res = this.updateCloudData()
|
||||||
if (res){
|
if (res){
|
||||||
oops.message.dispatchEvent(GameEvent.GOLD_UPDATE)
|
oops.message.dispatchEvent(GameEvent.GOLD_UPDATE)
|
||||||
|
|||||||
@@ -100,55 +100,13 @@ export class NumberFormatter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
export enum FightSet {
|
export enum FightSet {
|
||||||
FRIEND_WAVE_UP=3, //伙伴登场波次
|
|
||||||
BOSS_WAVE_UP_1=3, //boss登场波次
|
|
||||||
BOSS_WAVE_UP_2=5, //boss登场波次
|
|
||||||
BOSS_WAVE_UP_3=7, //boss登场波次
|
|
||||||
EQUIP_WAVE_UP_1=4, //装备登场波次
|
|
||||||
EQUIP_WAVE_UP_2=6, //装备登场波次
|
|
||||||
EQUIP_WAVE_UP_3=8, //装备登场波次
|
|
||||||
SKILL_WAVE_UP_1=2, //技能登场波次
|
|
||||||
SKILL_WAVE_UP_2=5, //技能登场波次
|
|
||||||
SKILL_WAVE_UP_3=7, //技能登场波次
|
|
||||||
MON_WAVE_TIME=10,//怪物波次时间
|
|
||||||
ATK_ADD_COUNT=4,//伙伴攻击力增加
|
|
||||||
ATK_ADD_GLOD=1,//金币增加
|
|
||||||
CRIT_DAMAGE=50,//暴击伤害
|
CRIT_DAMAGE=50,//暴击伤害
|
||||||
DEF_C=100,//物理防御常数C
|
|
||||||
MDEF_C=100,//魔法防御常数C
|
|
||||||
DOUBLE_ATK_RATE=100,//额外攻击默认概率
|
|
||||||
GREEN_GOLD=1,//绿色金币
|
|
||||||
BLUE_GOLD=2,//蓝色金币
|
|
||||||
PURPLE_GOLD=3,//紫色金币
|
|
||||||
ORANGE_GOLD=4,//橙色金币
|
|
||||||
BURN_COUNT=5,//默认易伤次数 5秒
|
|
||||||
STUN_TIME=0.5,//默认晕时间
|
|
||||||
WEAPON_LV=2,//武器等级
|
|
||||||
SHIELD_LV=3,//护盾等级
|
|
||||||
ARMOR_LV=4,//防具等级
|
|
||||||
ACCESSORY_LV=5,//饰品等级
|
|
||||||
ATKED_TO_POWER=15,//被攻击涨能量
|
|
||||||
ATK_TO_POWER=10,//攻击涨能量
|
|
||||||
CRIT_TO_POWER=15,//暴击涨能量
|
|
||||||
DODGE_TO_POWER=15,//闪避涨能量
|
|
||||||
ONE_WAVE_TIME=30,//单波时间
|
|
||||||
DOWN_TIME=5,//倒计时时间
|
|
||||||
MORE_RC=10,//更多次数 广告获取的次数
|
MORE_RC=10,//更多次数 广告获取的次数
|
||||||
TAL_NUM=3,//天赋数量
|
|
||||||
HEARTPOS=-320,//基地位置
|
HEARTPOS=-320,//基地位置
|
||||||
HERO_MAX_NUM=3,//英雄最大数量
|
HERO_MAX_NUM=3,//英雄最大数量
|
||||||
// ATK_TO_ATK_RATIO=0.1,
|
LVUP_GOLD=10,//升级需要的金币
|
||||||
// ATK_TO_HP_RATIO=0.2,
|
LVUP_GOLD_UP=10,//升级需要的金币
|
||||||
// ATK_TO_SHIELD_RATIO=2,
|
CHOU_GOLD=5,//抽卡需要的金币
|
||||||
// ATK_LINES = 3, //英雄数
|
|
||||||
// MON_GOLD_ADD =2,
|
|
||||||
// MON_COIN_ADD=2,
|
|
||||||
// COIN_ADD=1,
|
|
||||||
// DEF_RATE=0.7,
|
|
||||||
// DODGE_MAX=70,
|
|
||||||
// HERO_NUM=3,
|
|
||||||
// AP_UPDATE_RATE=100,
|
|
||||||
// AP_CHANGE_RATE=0,
|
|
||||||
}
|
}
|
||||||
export enum IndexSet {
|
export enum IndexSet {
|
||||||
/** 英雄基础层级 */
|
/** 英雄基础层级 */
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/modu
|
|||||||
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
|
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
|
||||||
import { GameEvent } from "../common/config/GameEvent";
|
import { GameEvent } from "../common/config/GameEvent";
|
||||||
import { smc } from "../common/SingletonModuleComp";
|
import { smc } from "../common/SingletonModuleComp";
|
||||||
import { CardType } from "../common/config/GameSet";
|
import { CardType, FightSet } from "../common/config/GameSet";
|
||||||
import { getCardOptions, ICardInfo } from "../common/config/CardSet";
|
import { getCardOptions, ICardInfo } from "../common/config/CardSet";
|
||||||
|
|
||||||
const { ccclass, property } = _decorator;
|
const { ccclass, property } = _decorator;
|
||||||
@@ -192,11 +192,26 @@ export class MissionCardComp extends CCComp {
|
|||||||
* 显示等级对应的卡牌(正常升级模式)
|
* 显示等级对应的卡牌(正常升级模式)
|
||||||
*/
|
*/
|
||||||
private showLevelCards(level: number) {
|
private showLevelCards(level: number) {
|
||||||
|
if(smc.vmdata.gold < smc.vmdata.chou_gold){
|
||||||
|
oops.gui.toast("金币不足")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
smc.vmdata.gold -= smc.vmdata.chou_gold
|
||||||
this.curCardType = null; // 混合模式,无单一类型
|
this.curCardType = null; // 混合模式,无单一类型
|
||||||
this.fetchCards(level);
|
this.fetchCards(level);
|
||||||
this.openUI();
|
this.openUI();
|
||||||
}
|
}
|
||||||
|
private do_hero_lv_up(){
|
||||||
|
if(smc.vmdata.gold < smc.vmdata.lvup_gold){
|
||||||
|
oops.gui.toast("金币不足")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
smc.vmdata.hero.lv++
|
||||||
|
smc.vmdata.gold -= smc.vmdata.lvup_gold
|
||||||
|
smc.vmdata.lvup_gold += FightSet.LVUP_GOLD_UP*smc.vmdata.hero.lv
|
||||||
|
oops.gui.toast("升级成功")
|
||||||
|
oops.message.dispatchEvent(GameEvent.HeroLvUp,{lv:smc.vmdata.hero.lv})
|
||||||
|
}
|
||||||
private openUI() {
|
private openUI() {
|
||||||
this.node.active = true;
|
this.node.active = true;
|
||||||
this.hasSelected = false;
|
this.hasSelected = false;
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
import { _decorator, Vec3,Animation, instantiate, Prefab, Node, ProgressBar } from "cc";
|
import { _decorator, Vec3,Animation, instantiate, Prefab, Node, ProgressBar, Label } from "cc";
|
||||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||||
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
|
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
|
||||||
import { smc } from "../common/SingletonModuleComp";
|
import { smc } from "../common/SingletonModuleComp";
|
||||||
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
|
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
|
||||||
import { HeroAttrsComp } from "../hero/HeroAttrsComp";
|
import { HeroAttrsComp } from "../hero/HeroAttrsComp";
|
||||||
import { MonsterCost, MonType } from "./RogueConfig";
|
import { MonsterCost, MonType, calculateMonsterGold } from "./RogueConfig";
|
||||||
import { GameEvent } from "../common/config/GameEvent";
|
import { GameEvent } from "../common/config/GameEvent";
|
||||||
import { HeroViewComp } from "../hero/HeroViewComp";
|
import { HeroViewComp } from "../hero/HeroViewComp";
|
||||||
import { UIID } from "../common/config/GameUIConfig";
|
import { UIID } from "../common/config/GameUIConfig";
|
||||||
import { SkillView } from "../skill/SkillView";
|
import { SkillView } from "../skill/SkillView";
|
||||||
import { FightSet, getLevelRewardType, CardType } from "../common/config/GameSet";
|
import { FightSet, getLevelRewardType, CardType, FacSet } from "../common/config/GameSet";
|
||||||
const { ccclass, property } = _decorator;
|
const { ccclass, property } = _decorator;
|
||||||
|
|
||||||
|
|
||||||
@@ -22,10 +22,18 @@ export class MissionComp extends CCComp {
|
|||||||
// VictoryComp:any = null;
|
// VictoryComp:any = null;
|
||||||
// reward:number = 0;
|
// reward:number = 0;
|
||||||
// reward_num:number = 0;
|
// reward_num:number = 0;
|
||||||
|
@property(Node)
|
||||||
|
coins_node:Node = null!
|
||||||
|
@property(Node)
|
||||||
|
lv_node:Node = null!
|
||||||
|
@property(Node)
|
||||||
|
chou_node:Node = null!
|
||||||
|
@property(Node)
|
||||||
|
time_node:Node = null!
|
||||||
|
|
||||||
|
|
||||||
/** 剩余复活次数 */
|
/** 剩余复活次数 */
|
||||||
revive_times: number = 1;
|
revive_times: number = 1;
|
||||||
|
|
||||||
rewards:any[]=[]
|
rewards:any[]=[]
|
||||||
game_data:any={
|
game_data:any={
|
||||||
exp:0,
|
exp:0,
|
||||||
@@ -41,6 +49,7 @@ export class MissionComp extends CCComp {
|
|||||||
this.on(GameEvent.DO_AD_BACK,this.do_ad,this)
|
this.on(GameEvent.DO_AD_BACK,this.do_ad,this)
|
||||||
this.on(GameEvent.CanUpdateLv,this.onLevelUp,this)
|
this.on(GameEvent.CanUpdateLv,this.onLevelUp,this)
|
||||||
this.on(GameEvent.ReviveSuccess, this.onReviveSuccess, this)
|
this.on(GameEvent.ReviveSuccess, this.onReviveSuccess, this)
|
||||||
|
|
||||||
}
|
}
|
||||||
protected update(dt: number): void {
|
protected update(dt: number): void {
|
||||||
if(!smc.mission.play) return
|
if(!smc.mission.play) return
|
||||||
@@ -96,10 +105,7 @@ export class MissionComp extends CCComp {
|
|||||||
do_reward(){
|
do_reward(){
|
||||||
// 奖励发放
|
// 奖励发放
|
||||||
}
|
}
|
||||||
do_drop(drop_item:any[],game_data:any={exp:0,gold:0,diamond:0}){
|
|
||||||
// console.log("[MissionComp] do_drop",drop_item,game_data)
|
|
||||||
|
|
||||||
}
|
|
||||||
do_mon_dead(event:any,data:any){
|
do_mon_dead(event:any,data:any){
|
||||||
// console.log("[MissionComp] do_mon_dead",event,data)
|
// console.log("[MissionComp] do_mon_dead",event,data)
|
||||||
smc.vmdata.mission_data.mon_num--
|
smc.vmdata.mission_data.mon_num--
|
||||||
@@ -122,17 +128,26 @@ export class MissionComp extends CCComp {
|
|||||||
type = MonType.ELITE;
|
type = MonType.ELITE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.cal_gold_reward(data, type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cal_gold_reward(data: any, type: MonType) {
|
||||||
|
const cost = MonsterCost[data.uuid] || 1;
|
||||||
|
const level = data.lv || 1;
|
||||||
|
|
||||||
|
let add_gold = calculateMonsterGold(data.uuid, level, type);
|
||||||
|
|
||||||
|
smc.updateGold(add_gold, false);
|
||||||
|
}
|
||||||
|
|
||||||
do_hero_dead(event:any,data:any){
|
do_hero_dead(event:any,data:any){
|
||||||
// console.log("[MissionComp] do_hero_dead",event,data)
|
// console.log("[MissionComp] do_hero_dead",event,data)
|
||||||
// 收到 HeroDead 说明已经没有复活次数了,打开失败界面,等待玩家选择(复活或结束)
|
// 收到 HeroDead 说明已经没有复活次数了,打开失败界面,等待玩家选择(复活或结束)
|
||||||
// oops.message.dispatchEvent(GameEvent.FightEnd,{victory:false}) // 暂时不分发结束事件
|
// oops.message.dispatchEvent(GameEvent.FightEnd,{victory:false}) // 暂时不分发结束事件
|
||||||
this.open_Victory(null,true)
|
this.open_Victory(null,true)
|
||||||
}
|
}
|
||||||
do_ad(){
|
do_ad(){
|
||||||
if(this.ad_back()){
|
if(this.ad_back()){
|
||||||
oops.message.dispatchEvent(GameEvent.AD_BACK_TRUE)
|
oops.message.dispatchEvent(GameEvent.AD_BACK_TRUE)
|
||||||
smc.vmdata.mission_data.refresh_count+=FightSet.MORE_RC
|
smc.vmdata.mission_data.refresh_count+=FightSet.MORE_RC
|
||||||
@@ -147,7 +162,7 @@ export class MissionComp extends CCComp {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async mission_start(){
|
async mission_start(){
|
||||||
// 防止上一局的 fight_end 延迟回调干扰新局
|
// 防止上一局的 fight_end 延迟回调干扰新局
|
||||||
this.unscheduleAllCallbacks();
|
this.unscheduleAllCallbacks();
|
||||||
@@ -217,6 +232,10 @@ export class MissionComp extends CCComp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
data_init(){
|
data_init(){
|
||||||
|
// 重置金币为初始值 (如果需要保留金币,请注释掉此行)
|
||||||
|
smc.vmdata.gold = 0;
|
||||||
|
smc.vmdata.chou_gold = FightSet.CHOU_GOLD;
|
||||||
|
smc.vmdata.lvup_gold = FightSet.LVUP_GOLD_UP;
|
||||||
//局内数据初始化 smc 数据初始化
|
//局内数据初始化 smc 数据初始化
|
||||||
smc.mission.play = true;
|
smc.mission.play = true;
|
||||||
smc.mission.pause = false;
|
smc.mission.pause = false;
|
||||||
@@ -252,8 +271,7 @@ export class MissionComp extends CCComp {
|
|||||||
tal:[],
|
tal:[],
|
||||||
info:'',
|
info:'',
|
||||||
};
|
};
|
||||||
// 重置金币为初始值 (如果需要保留金币,请注释掉此行)
|
|
||||||
smc.vmdata.gold = 200;
|
|
||||||
|
|
||||||
// console.log("[MissionComp]局内数据初始化",smc.vmdata.mission_data)
|
// console.log("[MissionComp]局内数据初始化",smc.vmdata.mission_data)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -347,6 +347,29 @@ export function getLevelExp(level: number): number {
|
|||||||
return Math.floor(baseExp * Math.pow(growthFactor, level - 1));
|
return Math.floor(baseExp * Math.pow(growthFactor, level - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算怪物掉落金币
|
||||||
|
* @param uuid 怪物ID
|
||||||
|
* @param level 怪物等级
|
||||||
|
* @param type 怪物类型
|
||||||
|
*/
|
||||||
|
export function calculateMonsterGold(uuid: number, level: number, type: MonType): number {
|
||||||
|
const cost = MonsterCost[uuid] || 1;
|
||||||
|
|
||||||
|
// 危险值系数: cost越大越危险
|
||||||
|
let danger_ratio = 1 + cost * 0.1;
|
||||||
|
|
||||||
|
let type_ratio = 1;
|
||||||
|
if(type == MonType.BOSS) type_ratio = 10;
|
||||||
|
else if(type == MonType.ELITE) type_ratio = 3;
|
||||||
|
|
||||||
|
// 公式: 基础(5) * 类型 * 危险值 + 等级加成
|
||||||
|
const baseGold = 5;
|
||||||
|
let gold = Math.floor(baseGold * type_ratio * danger_ratio + level);
|
||||||
|
|
||||||
|
return gold;
|
||||||
|
}
|
||||||
|
|
||||||
// 怪物消耗点数配置
|
// 怪物消耗点数配置
|
||||||
export const MonsterCost: Record<number, number> = {
|
export const MonsterCost: Record<number, number> = {
|
||||||
5201: 1, // 兽人战士 (Warrior)
|
5201: 1, // 兽人战士 (Warrior)
|
||||||
|
|||||||
Reference in New Issue
Block a user