import { HttpUtil } from './HttpUtil'; import { StorageManager } from './StorageManager'; import { AuthManager } from './AuthManager'; import { API_TIMEOUT, getLevelEnterUrl, getLevelCompleteUrl } from '../config/ApiConfig'; import { ApiEnvelope, StaminaInfo, EnterLevelData, CompleteLevelData } from '../types/ApiTypes'; /** * 体力值管理器 * 单例模式,负责体力值的服务端同步、进入关卡和通关上报 * 以服务端为准,本地 StorageManager 作为缓存 */ export class StaminaManager { private static _instance: StaminaManager | null = null; static get instance(): StaminaManager { if (!this._instance) { this._instance = new StaminaManager(); } return this._instance; } private constructor() {} /** * 获取当前体力信息(从本地缓存) */ getStamina(): StaminaInfo { return StorageManager.getStamina(); } /** * 更新本地缓存的体力信息 * @param stamina 服务端返回的体力信息 */ updateStamina(stamina: StaminaInfo): void { StorageManager.setStamina(stamina); } /** * 检查当前是否有足够的体力 */ hasStamina(): boolean { return StorageManager.hasStamina(); } /** * 进入关卡 * 消耗 1 点体力(未通关关卡),获取完整关卡详情(含答案和线索) * @param levelId 关卡 ID * @returns 关卡详情,失败时返回 null */ async enterLevel(levelId: string): Promise { if (!AuthManager.instance.isLoggedIn) { console.warn('[StaminaManager] 未登录,无法进入关卡'); return null; } try { const response = await HttpUtil.post>( getLevelEnterUrl(levelId), {}, API_TIMEOUT.DEFAULT ); if (response.success && response.data) { StorageManager.setStamina(response.data.stamina); console.log(`[StaminaManager] 进入关卡 ${levelId},体力: ${response.data.stamina.current}/${response.data.stamina.max}`); return response.data; } console.warn('[StaminaManager] 进入关卡失败:', response.message); return null; } catch (err) { console.error('[StaminaManager] 进入关卡请求失败:', err); return null; } } /** * 通关上报 * @param levelId 关卡 ID * @param timeSpent 通关耗时(秒) * @returns 通关响应,失败时返回 null */ async completeLevel(levelId: string, timeSpent: number): Promise { if (!AuthManager.instance.isLoggedIn) { console.warn('[StaminaManager] 未登录,无法上报通关'); return null; } try { const response = await HttpUtil.post>( getLevelCompleteUrl(levelId), { timeSpent }, API_TIMEOUT.DEFAULT ); if (response.success && response.data) { console.log(`[StaminaManager] 通关上报成功: ${levelId}, 首次: ${response.data.firstClear}, 耗时: ${response.data.timeSpent}s`); return response.data; } console.warn('[StaminaManager] 通关上报失败:', response.message); return null; } catch (err) { console.error('[StaminaManager] 通关上报请求失败:', err); return null; } } }