Files
Alien_Sniper/assets/scripts/BattleLevel.ts
T
2026-07-17 10:54:32 +08:00

487 lines
24 KiB
TypeScript

// @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<BattlePhase, LevelState> = {
"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<void> {
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<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["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<void> {
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<void> {
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<void> {
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<BattleSessionSnapshot>): 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 {
}
}
}