<aside> ✅ Casual, Casual Power, Ladder 3개의 게임큐 존재
</aside>
@Interval('gameType', 7000)
async checkCasualGame() {
if (this.gameQ[GAME_TYPE].getCount() < 2)
return;
const p1 = await this.checkPlayer(GameConstants.CASUAL, this.gameQ[GameConstants.CASUAL].peek(1), 1);
if (p1 === null)
return;
const p2 = await this.checkPlayer(GameConstants.CASUAL, this.gameQ[GameConstants.CASUAL].peek(2), 2);
if (p1 === null)
return;
if (p1.data.nickname === p2.data.nickname) {
this.gameQ[GAME_TYPE].deQueue();
return;
}
// p1, p2는 client의 socket
this.gameQ[GAME_TYPE].deQueue();
this.gameQ[GAME_TYPE].deQueue();
this.memberRepository.updateStatus(p1.data.nickname, MemberConstants.INGAME);
this.memberRepository.updateStatus(p2.data.nickname, MemberConstants.INGAME);
const roomId = randomBytes(13).toString('hex');
p1.emit("startGame", new GameInfoDto(GAME_TYPE, roomId, p1.data.nickname, p2.data.nickname, 0));
p2.emit("startGame", new GameInfoDto(GAME_TYPE, roomId, p1.data.nickname, p2.data.nickname, 1));
}
async checkPlayer(type: number, name: string, flag: number): Promise<Socket> {
if (this.gameQ[type].getCount() < 2) // 게임 대기큐에 2명 이상일 경우만 실행
return null;
const { status } = await this.memberRepository.getStatus(name);
if (status !== MemberConstants.ONLINE) { // 멤버의 상태가 온라인이 아닐 경우 대기큐에서 제거
if (flag === 1) // 첫번째 player를 체크하는 경우
this.gameQ[type].deQueue();
else // 두번째 player를 체크하는 경우
this.gameQ[type].deQueueSecond();
this.checkPlayer(type, this.gameQ[type].peek(flag), flag);
} // 가능한 player를 찾을 때까지 재귀적으로 함수 실행
return this.checkSocket(type, name, flag);
} // 플레이어를 찾았을 경우 socekt 상태 확인
waitGame(@MessageBody() type: number, @ConnectedSocket() socket: Socket): Promise<void> {
if (!this.gameQ[type].enQueue(socket.data.nickname)) {
socket.emit('errorMessage', "The waiting list is full. Please try again later.");
socket.emit('failQueue');
return; // 대기큐가 꽉 차있을 경우 Error 반환
}
socket.emit('addQueue', type);
}
async checkSocket(type: number, name: string, flag: number): Promise<Socket> {
const socket = await this.findSocketByName(name);
if (socket === null) {
if (flag === 1)
this.gameQ[type].deQueue();
else
this.gameQ[type].deQueueSecond();
return null
}
return socket;
}