From 473963b58b339341322c4265b8b761d209334626 Mon Sep 17 00:00:00 2001 From: Hide_D Date: Sat, 9 Mar 2024 07:46:27 +0000 Subject: [PATCH] wip: gameEngine --- @sammo/server/src/GameEngine.ts | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/@sammo/server/src/GameEngine.ts b/@sammo/server/src/GameEngine.ts index 4b80f6f..2cfe20c 100644 --- a/@sammo/server/src/GameEngine.ts +++ b/@sammo/server/src/GameEngine.ts @@ -41,6 +41,7 @@ export class GameEngine { private async gameLoop(): Promise { let generalWaitTimer: ReturnType | null = null; let prevSaveWaiter: Promise | null = null; + while (this.continueRun) { //가장 빠른 장수 do { @@ -55,6 +56,7 @@ export class GameEngine { if (waitGeneralTurnMs > 0) { generalWaitTimer = setTimeout(() => { this.signal.notify(); + generalWaitTimer = null; }, waitGeneralTurnMs); } else { @@ -62,8 +64,9 @@ export class GameEngine { } } while (0); - //이벤트를 대기 - const waitResult = await this.signal.wait(); + //이벤트 대기 + await this.signal.wait(); + if (generalWaitTimer) { clearTimeout(generalWaitTimer); } @@ -101,6 +104,8 @@ export class GameEngine { for (const [invoker, queue] of entriesWithType(this.actionQueue)) { let processEventCount = 0; + let responseQueue: (() => void)[] = []; + while (!queue.isEmpty()) { const action = must(queue.shift()); @@ -114,10 +119,14 @@ export class GameEngine { this.queueWaiters.delete(action.waiterSeq); if (errorReason) { - ticketRejected(errorReason); + responseQueue.push(() => { + ticketRejected(errorReason); + }); } else { - ticketResolve({ success: true }); + responseQueue.push(() => { + ticketResolve({ success: true }); + }); } processEventCount++; @@ -125,7 +134,11 @@ export class GameEngine { if (processEventCount > 0) { await prevSaveWaiter; - prevSaveWaiter = this.rsc.saveAll(); + prevSaveWaiter = null; + await this.rsc.saveAll(); + for(const response of responseQueue){ + response(); + } } } } @@ -146,7 +159,7 @@ export class GameEngine { return false; } - for(const queue of Object.values(this.actionQueue)){ + for (const queue of Object.values(this.actionQueue)) { queue.clear(); }