wip: gameEngine

This commit is contained in:
2024-03-09 07:46:27 +00:00
parent 31184c1cd4
commit 473963b58b
+19 -6
View File
@@ -41,6 +41,7 @@ export class GameEngine {
private async gameLoop(): Promise<void> { private async gameLoop(): Promise<void> {
let generalWaitTimer: ReturnType<typeof setTimeout> | null = null; let generalWaitTimer: ReturnType<typeof setTimeout> | null = null;
let prevSaveWaiter: Promise<void> | null = null; let prevSaveWaiter: Promise<void> | null = null;
while (this.continueRun) { while (this.continueRun) {
//가장 빠른 장수 //가장 빠른 장수
do { do {
@@ -55,6 +56,7 @@ export class GameEngine {
if (waitGeneralTurnMs > 0) { if (waitGeneralTurnMs > 0) {
generalWaitTimer = setTimeout(() => { generalWaitTimer = setTimeout(() => {
this.signal.notify(); this.signal.notify();
generalWaitTimer = null;
}, waitGeneralTurnMs); }, waitGeneralTurnMs);
} }
else { else {
@@ -62,8 +64,9 @@ export class GameEngine {
} }
} while (0); } while (0);
//이벤트 대기 //이벤트 대기
const waitResult = await this.signal.wait(); await this.signal.wait();
if (generalWaitTimer) { if (generalWaitTimer) {
clearTimeout(generalWaitTimer); clearTimeout(generalWaitTimer);
} }
@@ -101,6 +104,8 @@ export class GameEngine {
for (const [invoker, queue] of entriesWithType(this.actionQueue)) { for (const [invoker, queue] of entriesWithType(this.actionQueue)) {
let processEventCount = 0; let processEventCount = 0;
let responseQueue: (() => void)[] = [];
while (!queue.isEmpty()) { while (!queue.isEmpty()) {
const action = must(queue.shift()); const action = must(queue.shift());
@@ -114,10 +119,14 @@ export class GameEngine {
this.queueWaiters.delete(action.waiterSeq); this.queueWaiters.delete(action.waiterSeq);
if (errorReason) { if (errorReason) {
ticketRejected(errorReason); responseQueue.push(() => {
ticketRejected(errorReason);
});
} }
else { else {
ticketResolve({ success: true }); responseQueue.push(() => {
ticketResolve({ success: true });
});
} }
processEventCount++; processEventCount++;
@@ -125,7 +134,11 @@ export class GameEngine {
if (processEventCount > 0) { if (processEventCount > 0) {
await prevSaveWaiter; 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; return false;
} }
for(const queue of Object.values(this.actionQueue)){ for (const queue of Object.values(this.actionQueue)) {
queue.clear(); queue.clear();
} }