LevelSessionManager.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { JsonAsset } from 'cc';
  2. import { BundleLoader } from './BundleLoader';
  3. export interface LevelRuntimeData {
  4. levelId: number; // 本局关卡
  5. wallHealth: number; // 当前墙血
  6. enemiesTotal: number; // 本关总敌人
  7. enemiesKilled: number; // 已击杀
  8. currentWave: number; // 当前波
  9. //drops: DropItemData[]; // 已掉落的道具
  10. startTime: number;
  11. sessionCoins: number; // 本局金币(购买方块)
  12. addBallUsageCount: number; // 添加小球使用次数
  13. refreshUsageCount: number; // 刷新方块使用次数
  14. addCoinUsageCount: number; // 观看广告奖励使用次数
  15. }
  16. export class LevelSessionManager {
  17. private static _inst: LevelSessionManager;
  18. public static get inst() { return this._inst || (this._inst = new LevelSessionManager()); }
  19. private data: LevelRuntimeData = null;
  20. /** 准备本关运行期数据 */
  21. public async initialize(levelId: number, wallHealth: number) {
  22. // 从关卡配置读取初始金币
  23. const initialCoins = await this.loadInitialCoins(levelId);
  24. this.data = {
  25. levelId,
  26. wallHealth,
  27. enemiesTotal: 0,
  28. enemiesKilled: 0,
  29. currentWave: 1,
  30. //drops: [],
  31. startTime: Date.now(),
  32. sessionCoins: initialCoins,
  33. addBallUsageCount: 0,
  34. refreshUsageCount: 0,
  35. addCoinUsageCount: 0
  36. };
  37. console.log(`[LevelSessionManager] 初始化完成,关卡${levelId}初始金币设置为: ${this.data.sessionCoins}`);
  38. }
  39. /** 从关卡配置文件加载初始金币数量 */
  40. private async loadInitialCoins(levelId: number): Promise<number> {
  41. try {
  42. const resourcePath = `levels/Level${levelId}`;
  43. console.log(`[LevelSessionManager] 尝试从data Bundle加载关卡配置: ${resourcePath}`);
  44. const levelConfig = await BundleLoader.getInstance().loadDataJson(resourcePath);
  45. if (levelConfig && levelConfig.json && typeof levelConfig.json.initialCoins === 'number') {
  46. console.log(`[LevelSessionManager] 关卡${levelId}初始金币配置: ${levelConfig.json.initialCoins}`);
  47. return levelConfig.json.initialCoins;
  48. } else {
  49. console.warn(`[LevelSessionManager] 关卡${levelId}配置中未找到initialCoins字段,使用默认值45`);
  50. return 45; // 默认值
  51. }
  52. } catch (error) {
  53. console.warn(`[LevelSessionManager] 加载关卡${levelId}配置失败,使用默认初始金币45:`, error);
  54. return 45; // 默认值
  55. }
  56. }
  57. public get runtime() { return this.data; }
  58. /** 关卡结束后调用,让 GC 自动回收 */
  59. public clear() { this.data = null; }
  60. // ======== 本局金币接口 ========
  61. public getCoins(): number {
  62. const coins = this.data?.sessionCoins ?? 0;
  63. console.log(`[LevelSessionManager] getCoins() 返回: ${coins}, data存在: ${!!this.data}`);
  64. return coins;
  65. }
  66. public addCoins(amt:number){ if(this.data) this.data.sessionCoins += amt; }
  67. /** 成功返回true */
  68. public spendCoins(amt:number):boolean{ if(!this.data || amt<=0) return false; if(this.data.sessionCoins<amt) return false; this.data.sessionCoins-=amt; return true; }
  69. // ======== 使用次数接口 ========
  70. public getAddBallUsageCount(): number { return this.data?.addBallUsageCount ?? 0; }
  71. public getRefreshUsageCount(): number { return this.data?.refreshUsageCount ?? 0; }
  72. public getAddCoinUsageCount(): number { return this.data?.addCoinUsageCount ?? 0; }
  73. public incrementAddBallUsageCount(): void { if(this.data) this.data.addBallUsageCount++; }
  74. public incrementRefreshUsageCount(): void { if(this.data) this.data.refreshUsageCount++; }
  75. public incrementAddCoinUsageCount(): void { if(this.data) this.data.addCoinUsageCount++; }
  76. }