Files
heros/assets/script/game/common/GameDataSyncManager.ts
2025-08-21 14:33:42 +08:00

528 lines
20 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 { oops } from "db://oops-framework/core/Oops";
import { WxCloudApi ,UserGameData} from "../wx_clound_client_api/WxCloudApi";
import { smc } from "./SingletonModuleComp";
import { GameData } from "../wx_clound_client_api/WxCloudApi";
/**
* 游戏数据同步管理器
* 负责管理fight_heros、heros、items、tals、equips的远程操作和本地同步
* 只有在远程修改成功后才同步修改本地数据
*/
export class GameDataSyncManager {
private static instance: GameDataSyncManager;
private constructor() {}
public static getInstance(): GameDataSyncManager {
if (!GameDataSyncManager.instance) {
GameDataSyncManager.instance = new GameDataSyncManager();
}
return GameDataSyncManager.instance;
}
/**
* 用远程数据覆盖本地数据(统一方法)
* @param remoteData 远程数据(云端或本地调试)
* @param dataSource 数据源描述
*/
async overrideLocalDataWithRemote(remoteData: UserGameData, dataSource: string) {
try {
// console.log(`[Initialize]: 开始用${dataSource}数据覆盖客户端数据...`);
// 直接覆盖基础游戏数据
if (remoteData.data) {
Object.assign(smc.data, remoteData.data);
// console.log(`[Initialize]: 基础游戏数据已从${dataSource}覆盖`);
}
// 直接覆盖出战英雄配置
if (remoteData.fight_heros) {
Object.assign(smc.fight_heros, remoteData.fight_heros);
// console.log(`[Initialize]: 出战英雄配置已从${dataSource}覆盖`);
}
// 直接覆盖英雄数据
if (remoteData.heros) {
smc.heros = { ...remoteData.heros };
// console.log(`[Initialize]: 英雄数据已从${dataSource}覆盖`);
}
// 直接覆盖道具数据
if (remoteData.items) {
Object.assign(smc.items, remoteData.items);
// console.log(`[Initialize]: 道具数据已从${dataSource}覆盖`);
}
// 直接覆盖天赋数据
if (remoteData.tals) {
Object.assign(smc.tals, remoteData.tals);
// console.log(`[Initialize]: 天赋数据已从${dataSource}覆盖`);
}
// 直接覆盖装备数据
if (remoteData.equips) {
Object.assign(smc.equips, remoteData.equips);
// console.log(`[Initialize]: 装备数据已从${dataSource}覆盖`);
}
// 保存到本地存储(确保数据持久化)
// smc.saveGameData();
// console.log(`[Initialize]: ${dataSource}数据覆盖完成,已保存到本地`);
} catch (error) {
console.error(`[Initialize]: ${dataSource}数据覆盖失败:`, error);
}
}
/**
* 批量更新出战英雄配置
* @param fightHeros 出战英雄配置对象
* @returns 是否成功
*/
async updateFightHeros(fightHeros: any): Promise<boolean> {
try {
// console.log(`[GameDataSyncManager]: 批量更新出战英雄配置:`, fightHeros);
const result = await WxCloudApi.updateFightHeros(fightHeros);
if (result.result.code === 200) {
// 远程修改成功,同步本地数据
Object.assign(smc.fight_heros, fightHeros);
// console.log(`[GameDataSyncManager]: 出战英雄配置更新成功,本地数据已同步`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 出战英雄配置更新失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 更新出战英雄配置异常:`, error);
smc.error()
return false;
}
}
/**
* 重置出战英雄配置为默认值
* @returns 是否成功
*/
async resetFightHeros(): Promise<boolean> {
try {
// console.log(`[GameDataSyncManager]: 重置出战英雄配置`);
const result = await WxCloudApi.resetFightHeros();
if (result.result.code === 200) {
// 远程修改成功,同步本地数据
smc.fight_heros = result.result.data;
// console.log(`[GameDataSyncManager]: 出战英雄配置重置成功,本地数据已同步`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 出战英雄配置重置失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 重置出战英雄配置异常:`, error);
smc.error()
return false;
}
}
// ==================== 英雄管理 ====================
/**
* 添加新英雄到用户库存
* @param heroId 英雄ID
* @param heroData 英雄数据(可选)
* @returns 是否成功
*/
async addHero(heroId: number, heroData?: any): Promise<boolean> {
try {
// console.log(`[GameDataSyncManager]: 添加英雄 ID:${heroId}, 数据:`, heroData);
const result = await WxCloudApi.addHero(heroId, heroData);
if (result.result.code === 200) {
// 远程修改成功,同步本地数据
smc.heros[heroId] = result.result.data;
// console.log(`[GameDataSyncManager]: 英雄添加成功,本地数据已同步`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 英雄添加失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 添加英雄异常:`, error);
smc.error()
return false;
}
}
/**
* 更新英雄的多个属性
* @param heroId 英雄ID
* @param updateData 要更新的属性
* @returns 是否成功
*/
async updateHero(heroId: number, updateData: any): Promise<boolean> {
try {
// console.log(`[GameDataSyncManager]: 更新英雄 ID:${heroId}, 更新数据:`, updateData);
const result = await WxCloudApi.updateHero(heroId, updateData);
if (result.result.code === 200) {
// 远程修改成功,同步本地数据
Object.assign(smc.heros[heroId], result.result.data.new_data);
// console.log(`[GameDataSyncManager]: 英雄更新成功,本地数据已同步`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 英雄更新失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 更新英雄异常:`, error);
smc.error()
return false;
}
}
/**
* 设置英雄的单个属性值
* @param heroId 英雄ID
* @param property 属性名
* @param value 属性值
* @returns 是否成功
*/
async setHeroProperty(heroId: number, property: any, value: any): Promise<boolean> {
try {
// console.log(`[GameDataSyncManager]: 设置英雄属性 ID:${heroId}, 属性:${property}, 值:${value}`);
const result = await WxCloudApi.setHeroProperty(heroId, property, value);
if (result.result.code === 200) {
// 远程修改成功,同步本地数据
smc.heros[heroId][property] = value;
// console.log(`[GameDataSyncManager]: 英雄属性设置成功,本地数据已同步`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 英雄属性设置失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 设置英雄属性异常:`, error);
smc.error()
return false;
}
}
/**
* 英雄升级指定级数
* @param heroId 英雄ID
* @param levels 升级级数默认1级
* @returns 是否成功
*/
async levelUpHero(heroId: number,levels: number = 1,): Promise<boolean> {
try {
// console.log(`[GameDataSyncManager]: 英雄升级 ID:${heroId}, 级数:${levels}`);
const result = await WxCloudApi.levelUpHero(heroId,levels);
if (result.result.code === 200) {
// 远程修改成功,同步本地数据
smc.heros[heroId].lv = result.result.data.new_value;
// console.log(`[GameDataSyncManager]: 英雄升级成功,本地数据已同步`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 英雄升级失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 英雄升级异常:`, error);
smc.error()
return false;
}
}
// ==================== 便捷方法 ====================
/**
* 增加道具
* @param itemId 道具ID
* @param count 数量
* @returns 是否成功
*/
async addItem(itemId: number, count: number): Promise<boolean> {
smc.items[itemId] = (smc.items[itemId] || 0) + count;
try {
// console.log(`[GameDataSyncManager]: 增加道具 ID:${itemId}, 数量:${count}`);
const result = await WxCloudApi.addInventoryItem('items', itemId, count);
if (result.result.code === 200) {
// 远程修改成功,同步本地数据
// console.log(`[GameDataSyncManager]: 道具增加成功`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 道具增加失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 增加道具异常:`, error);
smc.error()
return false;
}
}
/**
* 消耗道具
* @param itemId 道具ID
* @param count 数量
* @returns 是否成功
*/
async consumeItem(itemId: number, count: number): Promise<boolean> {
if(!smc.items[itemId]||smc.items[itemId]<count){
oops.gui.toast("道具数量不足")
return false
}
try {
// console.log(`[GameDataSyncManager]: 消耗道具 ID:${itemId}, 数量:${count}`);
const result = await WxCloudApi.consumeInventoryItem('items', itemId, count);
if (result.result.code === 200) {
// 远程修改成功,同步本地数据
smc.items[itemId] = Math.max(0, (smc.items[itemId] || 0) - count);
// console.log(`[GameDataSyncManager]: 道具消耗成功,本地数据已同步`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 道具消耗失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 消耗道具异常:`, error);
smc.error()
return false;
}
}
/**
* 增加天赋点
* @param talId 天赋ID
* @param count 数量
* @returns 是否成功
*/
async addTalent(talId: number, count: number): Promise<boolean> {
try {
// console.log(`[GameDataSyncManager]: 增加天赋点 ID:${talId}, 数量:${count}`);
const result = await WxCloudApi.addInventoryItem('tals', talId, count);
if (result.result.code === 200) {
// 远程修改成功,同步本地数据
smc.tals[talId] = (smc.tals[talId] || 0) + count;
// console.log(`[GameDataSyncManager]: 天赋点增加成功,本地数据已同步`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 天赋点增加失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 增加天赋点异常:`, error);
smc.error()
return false;
}
}
/**
* 消耗天赋点
* @param talId 天赋ID
* @param count 数量
* @returns 是否成功
*/
async consumeTalent(talId: number, count: number): Promise<boolean> {
try {
// console.log(`[GameDataSyncManager]: 消耗天赋点 ID:${talId}, 数量:${count}`);
const result = await WxCloudApi.consumeInventoryItem('tals', talId, count);
if (result.result.code === 200) {
// 远程修改成功,同步本地数据
smc.tals[talId] = Math.max(0, (smc.tals[talId] || 0) - count);
// console.log(`[GameDataSyncManager]: 天赋点消耗成功,本地数据已同步`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 天赋点消耗失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 消耗天赋点异常:`, error);
smc.error()
return false;
}
}
/**
* 增加装备
* @param equipId 装备ID
* @param count 数量
* @returns 是否成功
*/
async addEquipment(equipId: number, count: number): Promise<boolean> {
try {
// console.log(`[GameDataSyncManager]: 增加装备 ID:${equipId}, 数量:${count}`);
const result = await WxCloudApi.addInventoryItem('equips', equipId, count);
if (result.result.code === 200) {
// 远程修改成功,同步本地数据
smc.equips[equipId] = (smc.equips[equipId] || 0) + count;
// console.log(`[GameDataSyncManager]: 装备增加成功,本地数据已同步`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 装备增加失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 增加装备异常:`, error);
smc.error()
return false;
}
}
/**
* 消耗装备
* @param equipId 装备ID
* @param count 数量
* @returns 是否成功
*/
async consumeEquipment(equipId: number, count: number): Promise<boolean> {
try {
// console.log(`[GameDataSyncManager]: 消耗装备 ID:${equipId}, 数量:${count}`);
const result = await WxCloudApi.consumeInventoryItem('equips', equipId, count);
if (result.result.code === 200) {
// 远程修改成功,同步本地数据
smc.equips[equipId] = Math.max(0, (smc.equips[equipId] || 0) - count);
// console.log(`[GameDataSyncManager]: 装备消耗成功,本地数据已同步`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 装备消耗失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 消耗装备异常:`, error);
smc.error()
return false;
}
}
async addGameProperty(property: string, value: any): Promise<boolean> {
try {
// console.log(`[GameDataSyncManager]: 增加游戏数据 ${property} = ${value}`);
const result = await WxCloudApi.addGameDataField(property, value);
if (result.result.code === 200) {
// console.log(`[GameDataSyncManager]: 游戏数据增加成功`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 游戏数据增加失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 增加游戏数据异常:`, error);
smc.error()
return false;
}
}
async spendGameProperty(property: string|Record<string, number>, value: any = undefined ): Promise<boolean> {
try {
// console.log(`[GameDataSyncManager]: 消耗游戏数据 ${property} = ${value}`);
const result = await WxCloudApi.spendGameDataField(property, value);
if (result.result.code === 200) {
// console.log(`[GameDataSyncManager]: 游戏数据消耗成功`);
return true;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 消耗游戏数据异常:`, error);
smc.error()
return false;
}
}
/**
* 从云端加载所有游戏数据并同步到本地
* @returns 是否成功
*/
async loadAllGameData(): Promise<boolean> {
try {
// console.log(`[GameDataSyncManager]: 从云端加载所有游戏数据`);
const result = await WxCloudApi.getAllGameData();
if (result.result.code === 200) {
// 远程数据获取成功,同步本地数据
const cloudData = result.result.data;
smc.data = cloudData.data;
smc.fight_heros = cloudData.fight_heros;
smc.heros = cloudData.heros;
smc.items = cloudData.items;
smc.tals = cloudData.tals;
smc.equips = cloudData.equips;
// console.log(`[GameDataSyncManager]: 云端数据加载成功,本地数据已同步`);
return true;
} else {
console.warn(`[GameDataSyncManager]: 云端数据加载失败: ${result.result.msg}`);
return false;
}
} catch (error) {
console.error(`[GameDataSyncManager]: 加载云端数据异常:`, error);
smc.error()
return false;
}
}
}
// 导出单例实例
export const gameDataSyncManager = GameDataSyncManager.getInstance();
/*
使用示例:
// 1. 出战英雄管理
await gameDataSyncManager.updateFightHeros({0: 5001, 1: 5005}); // 批量更新
await gameDataSyncManager.resetFightHeros(); // 重置为默认配置
// 2. 英雄管理
await gameDataSyncManager.addHero(5008, {uuid: 5008, lv: 1}); // 添加新英雄
await gameDataSyncManager.levelUpHero(5001, 100, 50, 5); // 英雄升级5级
await gameDataSyncManager.setHeroProperty(5001, "exp", 1000); // 设置英雄经验
// 3. 道具管理 (items)
await gameDataSyncManager.addItem(1001, 10); // 增加道具
await gameDataSyncManager.consumeItem(1001, 2); // 消耗道具
await gameDataSyncManager.setItem(1001, 5); // 设置道具数量
// 4. 天赋点管理 (tals)
await gameDataSyncManager.addTalent(2001, 5); // 增加天赋点
await gameDataSyncManager.consumeTalent(2001, 2); // 消耗天赋点
await gameDataSyncManager.setTalent(2001, 10); // 设置天赋点数量
// 5. 装备管理 (equips)
await gameDataSyncManager.addEquipment(3001, 2); // 增加装备
await gameDataSyncManager.consumeEquipment(3001, 1); // 消耗装备
await gameDataSyncManager.setEquipment(3001, 3); // 设置装备数量
// 6. 数据加载
await gameDataSyncManager.loadAllGameData(); // 从云端加载所有数据
注意:所有方法都返回 Promise<boolean>true表示成功false表示失败
只有在远程修改成功后,本地数据才会被同步修改
*/