Files
heros/assets/script/game/common/SingletonModuleComp.ts
2025-10-19 20:10:19 +08:00

191 lines
5.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 } from "../wx_clound_client_api/WxCloudApi";
import { Test } from "./Test";
import { GameEvent } from "./config/GameEvent";
/**
* 用远程数据覆盖本地数据(统一方法)
* @param remoteData 远程数据(云端或本地调试)
*/
interface GameDate{
gold:number,
heros:any,
fight_hero:number
}
interface CloudData {
openid: string;
data: GameDate;
}
/** 游戏模块 */
@ecs.register('SingletonModule')
export class SingletonModuleComp extends ecs.Comp {
/** 游戏初始化模块 */
initialize: Initialize = null!;
/** 游戏地图 */
map: GameMap = null!;
openid:string=''
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,5002]
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
//存储到远程服务器 后续再添加
}
updateCloudData(){
let gemeDate=this.getGameDate()
WxCloudApi.save(gemeDate).then((result) => {
if(result.result.code === 200) {
return true
} else {
console.warn(`[SMC]: 游戏数据增加失败: ${result.result.msg}`);
return false
}
}).catch((error) => {
console.error(`[SMC]: 增加游戏数据异常:`, error);
return false
});
return true
}
getCloudData(){
WxCloudApi.get().then(async (result) => {
if(result.result.code === 200) {
let data=result.result.data
this.overrideLocalDataWithRemote(data)
return true
} else {
console.warn(`[SMC]: 游戏数据增加失败: ${result.result.msg}`);
return false
}
}).catch((error) => {
console.error(`[SMC]: 获取游戏数据异常:`, error);
});
}
public async overrideLocalDataWithRemote(CloudData) {
try {
// 直接覆盖基础游戏数据
if (CloudData.openid) {
this.openid=CloudData.openid
}
// 直接覆盖出战英雄配置
if (CloudData.data) {
if(CloudData.data.gold) this.vmdata.gold=CloudData.data.gold
if(CloudData.data.heros) this.heros=CloudData.data.heros
if(CloudData.data.fight_hero) this.fight_hero=CloudData.data.fight_hero
}
} catch (error) {
console.error(`[SMC]: 数据覆盖失败:`, error);
}
}
getGameDate(){
return {gold:this.vmdata.gold,heros:this.heros,fight_hero:this.fight_hero}
}
addHero(hero_uuid:number){
if(this.heros.indexOf(hero_uuid)==-1){
this.heros.push(hero_uuid)
}
if(this.isWxClient()){
let res = this.updateCloudData()
if (res){
return true
}else{
// 同步不成功删除uuid
this.heros.splice(this.heros.indexOf(hero_uuid), 1);
oops.gui.toast("数据同步失败,已回滚操作");
return false
}
}
return true
}
// 设置单个出战英雄
updateFihgtHero(heroId: number) {
this.fight_hero = heroId;
if(this.isWxClient()){
let res = this.updateCloudData()
if (res){
return true
}else{
return false
}
}
return true
}
updateGold(gold:number){
this.vmdata.gold += gold;
if(this.isWxClient()){
let res = this.updateCloudData()
if (res){
oops.message.dispatchEvent(GameEvent.GOLD_UPDATE)
return true
}else{
this.vmdata.gold -= gold
return false
}
}
oops.message.dispatchEvent(GameEvent.GOLD_UPDATE)
return true
}
error(){
oops.gui.toast("数据处理异常,请重试或重新登录")
}
}
export var smc: SingletonModuleComp = ecs.getSingleton(SingletonModuleComp);