wip: gameEngine
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user