Files
pixelheros/assets/script/game/common/SingletonModuleComp.ts
walkpan 8a151a3922 feat(关卡): 添加英雄数量上限机制
- 在 MissionCardComp 中添加英雄数量显示与上限控制逻辑
- 当英雄数量达到上限时禁止使用英雄卡牌
- 英雄死亡时减少当前英雄计数并刷新显示
- 添加英雄数量变化的动画反馈效果
- 移除 SingletonModuleComp 中未使用的 unlockCoin 字段
2026-03-25 23:04:12 +08:00

239 lines
7.6 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 { GameEvent } from "./config/GameEvent";
import { GameScoreStats } from "./config/HeroAttrs";
import { mLogger } from "./Logger";
/**
* 用远程数据覆盖本地数据(统一方法)
* @param remoteData 远程数据(云端或本地调试)
*/
interface GameDate{
gold:number,
heros:any,
fight_hero:number,
collection?: {
talents: Record<number, number>,
skills: {uuid:0,count:0},
friend:{uuid:0,count:0},
}
}
interface CloudData {
openid: string;
data: GameDate;
}
/** 游戏模块 */
@ecs.register('SingletonModule')
export class SingletonModuleComp extends ecs.Comp {
private debugMode: boolean = false;
/** 游戏初始化模块 */
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,
stop_mon_action:false,
};
data:any={
score:0,
mission:1,
diamond:100, //商店购买 及 双倍奖励资源
gold:1000,
task:0,
noStop:false,
showInfo:true,
}
guides:any=[0,0,0,0,0]
current_guide:number=0
fight_hero: number = 5001; // 单个出战英雄
heros:any= [5001]
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,
time:15*60,//游戏时间
},
scores: {
score: 0, // 基础得分
// 战斗统计
crt_count: 0, // 暴击次数
wf_count: 0, // 风怒次数
dod_count: 0, // 闪避次数
back_count: 0, // 击退次数
stun_count: 0, // 击晕次数
freeze_count: 0, // 冰冻次数
// 伤害统计
total_dmg: 0, // 总伤害
atk_count: 0, // 攻击次数
avg_dmg: 0, // 平均伤害
thorns_dmg: 0, // 反伤伤害
crit_dmg_total: 0, // 暴击伤害总额
// 生存统计
heal_total: 0, // 治疗总量
lifesteal_total: 0, // 吸血总量
// 资源统计
exp_total: 0, // 经验总数
gold_total: 0, // 金币总数
// 击杀统计
melee_kill_count: 0, // 近战怪击杀数量
remote_kill_count: 0, // 远程怪击杀数量
elite_kill_count: 0, // 精英怪击杀数量
boss_kill_count: 0, // Boss击杀数
} as GameScoreStats,
gold: 0, // 金币数据MVVM绑定字段
};
vmAdd() {
VM.add(this.vmdata, "data");
// mLogger.log(this.debugMode, 'SMC', "[MissionComp]局内数据初始化",smc.vmdata.mission_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) => {
mLogger.log(this.debugMode, 'SMC', '云端保存')
if(result.result.code === 200) {
mLogger.log(this.debugMode, 'SMC', "保存成功",result.result)
return true
} else {
mLogger.warn(this.debugMode, 'SMC', `[SMC]: 游戏数据增加失败: ${result.result.msg}`);
return false
}
}).catch((error) => {
mLogger.error(this.debugMode, 'SMC', `[SMC]: 增加游戏数据异常:`, error);
return false
});
return true
}
getCloudData(){
WxCloudApi.get().then(async (result) => {
if(result.result.code === 200) {
let data=result.result.data
mLogger.log(this.debugMode, 'SMC', `[SMC]: 获取游戏数据成功:`, result.result);
this.overrideLocalDataWithRemote(data)
return true
} else {
mLogger.warn(this.debugMode, 'SMC', `[SMC]: 游戏数据增加失败`);
return false
}
}).catch((error) => {
mLogger.error(this.debugMode, 'SMC', `[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
// 恢复收集记录
if(CloudData.data.collection) {
this.vmdata.collection = CloudData.data.collection;
}
}
} catch (error) {
mLogger.error(this.debugMode, 'SMC', `[SMC]: 数据覆盖失败:`, error);
}
}
getGameDate(){
return {
gold:this.vmdata.gold,
heros:this.heros,
fight_hero:this.fight_hero,
collection: this.vmdata.collection
}
}
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
}
updateGold(gold:number, is_sync: boolean = true){
this.vmdata.gold += gold;
if(this.isWxClient() && is_sync){
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);