refac: GameEngine 함수 분리

This commit is contained in:
2024-03-09 16:38:20 +00:00
parent 6b819bbce5
commit fb68d9be22
+91 -80
View File
@@ -55,9 +55,94 @@ export class GameEngine {
private continueRun = true;
private prevSaveWaiter: Promise<void> | null = null;
private async processGeneralTurn() {
const now = new Date();
let processedGeneralCount = 0;
while (true) {
//장수턴 부터 처리
const upcomingGeneral = this.rsc.popGeneralTurntimeQueue();
if (!upcomingGeneral) {
break;
}
const generalTurntime = upcomingGeneral.raw.turntime;
if (generalTurntime > now) {
break;
}
//TODO: 턴 수행해야지!
upcomingGeneral.updateTurntime();
this.rsc.insertGeneralTurntimeQueue(upcomingGeneral, true);
this.rsc.gameEnv().update((env) => {
env.lastExecuted = generalTurntime;
})
processedGeneralCount++;
}
if (processedGeneralCount > 0) {
await this.prevSaveWaiter;
const lastExecuted = this.rsc.gameEnv().raw.lastExecuted;
this.prevSaveWaiter = this.rsc.saveAll().then(() => {
this.postStatus({
type: 'update',
lastExecuted: lastExecuted.toISOString()
});
});
}
}
private async processActions() {
//서버 이벤트 처리
for (const [invoker, queue] of entriesWithType(this.actionQueue)) {
let processEventCount = 0;
let responseQueue: (() => void)[] = [];
while (!queue.isEmpty()) {
const action = must(queue.shift());
//TODO: action 처리
const errorReason: string | undefined = undefined;
const [ticketResolve, ticketRejected] = must_err(
this.queueWaiters.get(action.waiterSeq),
Error, `GameEngine: waiterSeq(${action.waiterSeq}) not found`
);
this.queueWaiters.delete(action.waiterSeq);
if (errorReason) {
responseQueue.push(() => {
ticketRejected(errorReason);
});
}
else {
responseQueue.push(() => {
ticketResolve({ success: true });
});
}
processEventCount++;
}
if (processEventCount > 0) {
await this.prevSaveWaiter;
this.prevSaveWaiter = null;
await this.rsc.saveAll();
for (const response of responseQueue) {
response();
}
}
}
}
private async gameLoop(): Promise<void> {
let generalWaitTimer: ReturnType<typeof setTimeout> | null = null;
let prevSaveWaiter: Promise<void> | null = null;
while (this.continueRun) {
//가장 빠른 장수
@@ -81,8 +166,8 @@ export class GameEngine {
}
} while (0);
for(const queue of Object.values(this.actionQueue)){
if(!queue.isEmpty()){
for (const queue of Object.values(this.actionQueue)) {
if (!queue.isEmpty()) {
this.signal.notify();
break;
}
@@ -98,91 +183,17 @@ export class GameEngine {
break;
}
const now = new Date();
await this.processGeneralTurn();
let processedGeneralCount = 0;
await this.processActions();
while (true) {
//장수턴 부터 처리
const upcomingGeneral = this.rsc.popGeneralTurntimeQueue();
if (!upcomingGeneral) {
break;
}
const generalTurntime = upcomingGeneral.raw.turntime;
if (generalTurntime > now) {
break;
}
//TODO: 턴 수행해야지!
upcomingGeneral.updateTurntime();
this.rsc.insertGeneralTurntimeQueue(upcomingGeneral, true);
this.rsc.gameEnv().update((env)=>{
env.lastExecuted = generalTurntime;
})
processedGeneralCount++;
}
if (processedGeneralCount > 0) {
await prevSaveWaiter;
const lastExecuted = this.rsc.gameEnv().raw.lastExecuted;
prevSaveWaiter = this.rsc.saveAll().then(()=>{
this.postStatus({
type: 'update',
lastExecuted: lastExecuted.toISOString()
});
});
}
//서버 이벤트 처리
for (const [invoker, queue] of entriesWithType(this.actionQueue)) {
let processEventCount = 0;
let responseQueue: (() => void)[] = [];
while (!queue.isEmpty()) {
const action = must(queue.shift());
//TODO: action 처리
const errorReason: string | undefined = undefined;
const [ticketResolve, ticketRejected] = must_err(
this.queueWaiters.get(action.waiterSeq),
Error, `GameEngine: waiterSeq(${action.waiterSeq}) not found`
);
this.queueWaiters.delete(action.waiterSeq);
if (errorReason) {
responseQueue.push(() => {
ticketRejected(errorReason);
});
}
else {
responseQueue.push(() => {
ticketResolve({ success: true });
});
}
processEventCount++;
}
if (processEventCount > 0) {
await prevSaveWaiter;
prevSaveWaiter = null;
await this.rsc.saveAll();
for (const response of responseQueue) {
response();
}
}
}
}
}
private gameLoopPromise: Promise<void> | null = null;
public static async initInstance(updateHandler: (msg: GameEngineMsg)=>void): Promise<GameEngine> {
public static async initInstance(updateHandler: (msg: GameEngineMsg) => void): Promise<GameEngine> {
if (GameEngine.instance) {
throw new Error('GameEngine is already initialized');
}