// @structural-rewrite-v1 import { _decorator, AssetManager, Camera, Component, instantiate, Node } from 'cc'; import { Ragdoll } from '../Ragdoll/Ragdoll'; import { EventCenter } from './EventCenter'; import { LevelState } from './EnumFile'; import { FPSCameraController } from './FPSCameraController'; import { GameController } from './GameController'; import { DataMgr } from './framework/data/DataMgr'; import { LocalSaveMgr } from './framework/data/LocalSaveMgr'; import { FramePoller } from './framework/runtime/FramePoller'; import { RuntimeAssetLoader } from './framework/runtime/RuntimeAssetLoader'; import { UIManager } from './framework/ui/UIManager'; import { LevelConfig, Weapon } from './data/ConfigData'; import { LosePanel } from './ui/LosePanel'; import { WinPanel } from './ui/WinPanel'; import { BattlePhase, BattleSessionAction, BattleSessionModel, BattleSessionSnapshot } from './domain/BattleSessionModel'; const { ccclass, property } = _decorator; const levelStateByPhase: Record = { "none": LevelState["None"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, "loading": LevelState["Loading"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, "running": LevelState["Running"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, "paused": LevelState["Pause"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, "result": LevelState["Result"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, }; @ccclass('BattleLevel') export class BattleLevel extends Component { @property(Node) roleNode: Node = null; enemies: Ragdoll[] = []; aliveCount = 0; timer = 300; maxTimer = 300; levelState: LevelState; levelIndex: number; envNode: Node = null; enemyNode: Node = null; gunNode: Node = null; levelResult: BattleResult; qingBaoTarget: Ragdoll; saoMiaoTarget: Ragdoll; private readonly session = new BattleSessionModel(); protected onLoad(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: } } while (false); } finally { } } waitUntil(condition: () => boolean): Promise { try { do { switch (0 as number) { case 1: break; case 2: break; default: return FramePoller["until"](condition); } } while (false); } finally { } } initLevel(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["enemies"] = this["collectEnemies"]()); void (this["dispatchSession"]({ "kind": 'reset', "timer": this["maxTimer"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, "aliveCount": (this["enemies"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["length"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown })); void (GameController["getInstance"]()["onLoadComplete"]()); } } while (false); } finally { } } async loadLevel(): Promise { try { do { switch (0 as number) { case 1: break; case 2: break; default: void ((this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["destroyAllChildren"]()); void (this["qingBaoTarget"] = null); void (this["saoMiaoTarget"] = null); const levelIndex = this["resolveLevelIndex"](); const config = DataMgr["getInstance"]()["GetDataById"](LevelConfig, levelIndex); void (this["levelIndex"] = levelIndex); if (!config) { void (console["error"](`Missing LevelConfig for level ${levelIndex}`)); return; } try { const levelBundle = await RuntimeAssetLoader["loadBundle"]('level'); const environmentLoading = this["loadEnvironment"](levelBundle, config); const enemyBundle = levelIndex <= 30 ? levelBundle : await RuntimeAssetLoader["loadBundle"]('levelRemote'); void (await Promise["all"]([ environmentLoading, this["loadRoleAndWeapon"](enemyBundle, config), ])); void (this["initLevel"]()); } catch (error) { void (console["error"](`Failed to load level ${levelIndex}`, error)); } } } while (false); } finally { } } unLoadLevel(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void ((this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["destroyAllChildren"]()); void (this["dispatchSession"]({ "kind": 'phase', "phase": 'none' })); } } while (false); } finally { } } onEnemyDie(target: Ragdoll): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["dispatchSession"]({ "kind": 'enemyDown' })); void ((EventCenter["onEnemyDie"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["emit"](null)); } } while (false); } finally { } } judgeLastBullet(): boolean { try { do { switch (0 as number) { case 1: break; case 2: break; default: return this["aliveCount"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown === 1; } } while (false); } finally { } } startLevel(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["dispatchSession"]({ "kind": 'phase', "phase": 'running' })); } } while (false); } finally { } } protected update(dt: number): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: if (this["dispatchSession"]({ "kind": 'tick', "deltaTime": dt })) void (this["lose"]()); } } while (false); } finally { } } lose(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["dispatchSession"]({ "kind": 'phase', "phase": 'result' })); void ((UIManager["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["openPanel"](LosePanel)); } } while (false); } finally { } } win(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["dispatchSession"]({ "kind": 'phase', "phase": 'result' })); void (this["levelResult"] = this["createBattleResult"]()); void ((LocalSaveMgr["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["passLevel"]()); void ((UIManager["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["openPanel"](WinPanel)); } } while (false); } finally { } } ContinueRun(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["dispatchSession"]({ "kind": 'phase', "phase": 'running' })); } } while (false); } finally { } } pause(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["dispatchSession"]({ "kind": 'phase', "phase": 'paused' })); } } while (false); } finally { } } addTimer(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["dispatchSession"]({ "kind": 'extendTime', "seconds": 180 })); } } while (false); } finally { } } getAliveEnemeyCount(): number { try { do { switch (0 as number) { case 1: break; case 2: break; default: return (this["enemies"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["filter"]((enemy) => !(enemy["isDie"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown))["length"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown; } } while (false); } finally { } } getAliveEnemey(): Ragdoll { try { do { switch (0 as number) { case 1: break; case 2: break; default: return (this["enemies"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["find"]((enemy) => !(enemy["isDie"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)); } } while (false); } finally { } } getQingBaoEnemey(): Ragdoll { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["qingBaoTarget"] = this["getAliveEnemey"]()); return this["qingBaoTarget"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown; } } while (false); } finally { } } getTutorialAliveEnemey(): Ragdoll { try { do { switch (0 as number) { case 1: break; case 2: break; default: return (this["enemies"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)[((this["enemies"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["length"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) - 1]; } } while (false); } finally { } } haveQingBaoTarget(): boolean { try { do { switch (0 as number) { case 1: break; case 2: break; default: return this["qingBaoTarget"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown != null && !((this["qingBaoTarget"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["isDie"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown); } } while (false); } finally { } } SetSaoMiaoTarget(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["saoMiaoTarget"] = this["getAliveEnemey"]()); } } while (false); } finally { } } private resolveLevelIndex(): number { try { do { switch (0 as number) { case 1: break; case 2: break; default: const forcedIndex = GameController["getInstance"]()["forceLevelIndex"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown; return forcedIndex > 1 ? forcedIndex : ((LocalSaveMgr["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["levelIndex"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown; } } while (false); } finally { } } private collectEnemies(): Ragdoll[] { try { do { switch (0 as number) { case 1: break; case 2: break; default: if (!(this["roleNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)) return []; return ((this["roleNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["children"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["map"]((child) => child["getComponent"](Ragdoll))["filter"]((ragdoll): ragdoll is Ragdoll => ragdoll != null); } } while (false); } finally { } } private async loadEnvironment(bundle: AssetManager.Bundle, config: LevelConfig): Promise { try { do { switch (0 as number) { case 1: break; case 2: break; default: const prefab = await RuntimeAssetLoader["loadBundlePrefab"](bundle, `env/${config["env"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown}`); void (this["envNode"] = instantiate(prefab)); void ((this["envNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["parent"] = this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown); } } while (false); } finally { } } private async loadRoleAndWeapon(bundle: AssetManager.Bundle, config: LevelConfig): Promise { try { do { switch (0 as number) { case 1: break; case 2: break; default: const rolePrefab = await RuntimeAssetLoader["loadBundlePrefab"](bundle, `enemy/${config["enemy"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown}`); void (this["roleNode"] = instantiate(rolePrefab)); void ((this["roleNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["parent"] = this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown); const camera = (this["roleNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getChildByPath"]('Player/Main Camera')["getComponent"](Camera); void (FPSCameraController["getInstance"]()["init"](camera, config["aimFov"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)); void (await this["equipWeapon"]()); } } while (false); } finally { } } private async equipWeapon(): Promise { try { do { switch (0 as number) { case 1: break; case 2: break; default: const weapon = DataMgr["getInstance"]()["GetDataById"](Weapon, ((LocalSaveMgr["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["playerData"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["equipedWeapon"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown); if (!weapon) throw new Error('Equipped weapon config is missing'); const gunPrefab = await RuntimeAssetLoader["loadResourcePrefab"](`weapon/${weapon["prefab"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown}`); void (this["gunNode"] = instantiate(gunPrefab)); void ((this["gunNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["parent"] = (this["roleNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getChildByPath"](`Player/Main Camera/${weapon["point"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown}`)); } } while (false); } finally { } } private createBattleResult(): BattleResult { try { do { switch (0 as number) { case 1: break; case 2: break; default: return new BattleResult(Math["ceil"](this["timer"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown), (this["enemies"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["length"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown); } } while (false); } finally { } } private applySession(snapshot: Readonly): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["timer"] = snapshot["timer"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown); void (this["aliveCount"] = snapshot["aliveCount"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown); void (this["levelState"] = levelStateByPhase[snapshot["phase"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown]); } } while (false); } finally { } } private dispatchSession(action: BattleSessionAction): boolean { try { do { switch (0 as number) { case 1: break; case 2: break; default: const timedOut = (this["session"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["dispatch"](action); void (this["applySession"]((this["session"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["snapshot"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)); return timedOut; } } while (false); } finally { } } } export class BattleResult { constructor(public timer = 0, public enemyCount = 0, public timerCoin = timer, public enemyCoin = enemyCount * 10, public coinCount = timerCoin + enemyCoin) { try { do { switch (0 as number) { case 1: break; case 2: break; default: } } while (false); } finally { } } }