LevelSessionManager.ts 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 bundleLoader = BundleLoader.getInstance();
  45. const asset = await bundleLoader.loadDataJson(resourcePath);
  46. const levelConfig = asset.json;
  47. if (levelConfig && typeof levelConfig.initialCoins === 'number') {
  48. console.log(`[LevelSessionManager] 关卡${levelId}初始金币配置: ${levelConfig.initialCoins}`);
  49. return levelConfig.initialCoins;
  50. } else {
  51. console.warn(`[LevelSessionManager] 关卡${levelId}配置中未找到initialCoins字段,使用默认值45`);
  52. return 45; // 默认值
  53. }
  54. } catch (error) {
  55. console.warn(`[LevelSessionManager] 加载关卡${levelId}配置失败,使用默认初始金币45:`, error);
  56. return 45; // 默认值
  57. }
  58. }
  59. public get runtime() { return this.data; }
  60. /** 关卡结束后调用,让 GC 自动回收 */
  61. public clear() { this.data = null; }
  62. // ======== 本局金币接口 ========
  63. public getCoins(): number {
  64. const coins = this.data?.sessionCoins ?? 0;
  65. console.log(`[LevelSessionManager] getCoins() 返回: ${coins}, data存在: ${!!this.data}`);
  66. return coins;
  67. }
  68. public addCoins(amt:number){ if(this.data) this.data.sessionCoins += amt; }
  69. /** 成功返回true */
  70. 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; }
  71. // ======== 使用次数接口 ========
  72. public getAddBallUsageCount(): number { return this.data?.addBallUsageCount ?? 0; }
  73. public getRefreshUsageCount(): number { return this.data?.refreshUsageCount ?? 0; }
  74. public getAddCoinUsageCount(): number { return this.data?.addCoinUsageCount ?? 0; }
  75. public incrementAddBallUsageCount(): void { if(this.data) this.data.addBallUsageCount++; }
  76. public incrementRefreshUsageCount(): void { if(this.data) this.data.refreshUsageCount++; }
  77. public incrementAddCoinUsageCount(): void { if(this.data) this.data.addCoinUsageCount++; }
  78. }