import { VM } from "../../../../extensions/oops-plugin-framework/assets/libs/model-view/ViewModel"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { Initialize } from "../initialize/Initialize"; import { GameMap } from "../map/GameMap"; import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops"; import { WxCloudApi, UserGameData } from "../wx_clound_client_api/WxCloudApi"; import { Test } from "./Test"; import { GameEvent } from "./config/GameEvent"; /** 游戏模块 */ @ecs.register('SingletonModule') export class SingletonModuleComp extends ecs.Comp { /** 游戏初始化模块 */ initialize: Initialize = null!; /** 游戏地图 */ map: GameMap = null!; mission:any={ status:0, //0:未开始 1:进行中 2:胜利 3:失败 play:false, pause:false, in_select:false, in_fight:false, }; guides:any=[0,0,0,0,0] current_guide:number=0 data:any={ score:0, mission:1, diamond:100, //商店购买 及 双倍奖励资源 meat:0, exp:0, task:0, } fight_hero: number = 5001; // 单个出战英雄 heros:any = { 5001:{uuid:5001,lv:1}, 5005:{uuid:5005,lv:1}, }; monsters:any = []; vmdata: any = { game_over:false, game_pause:false, mission_data:{ mon_num:0,//怪物数量 hero_num:0,//英雄数量 wave_time_num:0,//波次时间 in_fight:false, fight_time:0,//战斗时间 level:1,//关卡等级 max_mission:4,//最大关卡 coin:0, }, gold: 100, // 金币数据(MVVM绑定字段) }; vmAdd() { VM.add(this.vmdata, "data"); } reset() { for (var key in this.vmdata) { delete this.vmdata[key]; } } // ==================== 数据管理方法 ==================== /** * 判断是否为微信客户端 */ private isWxClient(): boolean { // 检查是否存在微信API return typeof wx !== 'undefined' && typeof (wx as any).getSystemInfoSync === 'function'; } finishGuide(index:number){ smc.guides[index]=1 //存储到远程服务器 后续再添加 } //调试用 syncDataFromLocal(){ if(this.isWxClient()) return const loginResult = new Test().load_data_from_local() this.overrideLocalDataWithRemote(loginResult, "本地调试"); } /** * 用远程数据覆盖本地数据(统一方法) * @param remoteData 远程数据(云端或本地调试) * @param dataSource 数据源描述 */ async overrideLocalDataWithRemote(remoteData: UserGameData, dataSource: string) { try { // 直接覆盖基础游戏数据 if (remoteData.data) { // 保留原有的data字段数据 Object.assign(this.data, remoteData.data); // 同步gold到vmdata if (remoteData.data.gold !== undefined) { this.vmdata.gold = remoteData.data.gold; } } // 直接覆盖出战英雄配置 if (remoteData.fight_heros) { this.fight_hero = remoteData.fight_heros[0] || this.fight_hero; } // 直接覆盖英雄数据 if (remoteData.heros) { this.heros = { ...remoteData.heros }; } } catch (error) { console.error(`[SMC]: ${dataSource}数据覆盖失败:`, error); } } addHero(hero_uuid:number,autoSave:boolean=true){ if(this.isWxClient()){ // 适配原有接口,保持与云函数的兼容性 const result = WxCloudApi.addHero(hero_uuid); result.then((res) => { if(res.result.code === 200) { this.heros[hero_uuid]={ uuid:hero_uuid, lv:1, } return true } return false }).catch((error) => { console.error(`[SMC]: 添加英雄异常:`, error); this.error() return false }); } this.heros[hero_uuid]={ uuid:hero_uuid, lv:1, } return true } // 设置单个出战英雄 setFightHero(heroId: number, autoSave: boolean = true) { this.fight_hero = heroId; if (this.isWxClient()) { // 适配原有接口,保持与云函数的兼容性 WxCloudApi.updateFightHeros({ 0: heroId }).then((result) => { if (result.result.code !== 200) { console.warn(`[SMC]: 出战英雄配置更新失败: ${result.result.msg}`); } }).catch((error) => { console.error(`[SMC]: 更新出战英雄配置异常:`, error); this.error() }); } } // 获取出战英雄 getFightHero(): number { return this.fight_hero; } getHasHeroUUID(){ let heros=this.heros let heros_uuid=[] for(let key in heros){ heros_uuid.push(heros[key].uuid) } return heros_uuid } error(){ oops.gui.toast("数据处理异常,请重试或重新登录") } addGold(gold:number,autoSave:boolean=true){ if(this.isWxClient()){ WxCloudApi.addGameDataField("gold",gold).then((result) => { if(result.result.code === 200) { this.vmdata.gold += gold; this.data.gold = this.vmdata.gold; // 同步到data字段 oops.message.dispatchEvent(GameEvent.GOLD_UPDATE) return true } else { console.warn(`[SMC]: 游戏数据增加失败: ${result.result.msg}`); this.error() return false } }).catch((error) => { console.error(`[SMC]: 增加游戏数据异常:`, error); this.error() return false }); } this.vmdata.gold += gold; this.data.gold = this.vmdata.gold; // 同步到data字段 oops.message.dispatchEvent(GameEvent.GOLD_UPDATE) return true } spendGold(gold:number,autoSave:boolean=true){ if(this.isWxClient()){ WxCloudApi.spendGameDataField("gold",gold).then((result) => { if(result.result.code === 200) { this.vmdata.gold -= gold; this.data.gold = this.vmdata.gold; // 同步到data字段 oops.message.dispatchEvent(GameEvent.GOLD_UPDATE) return true } else { console.warn(`[SMC]: 游戏数据消耗失败: ${result.result.msg}`); return false } }).catch((error) => { console.error(`[SMC]: 消耗游戏数据异常:`, error); this.error() return false }); } this.vmdata.gold -= gold; this.data.gold = this.vmdata.gold; // 同步到data字段 oops.message.dispatchEvent(GameEvent.GOLD_UPDATE) return true } } export var smc: SingletonModuleComp = ecs.getSingleton(SingletonModuleComp);