DO-49 매칭 타임아웃 적용
This commit is contained in:
parent
e5169086f6
commit
47414fc7b0
@ -20,6 +20,20 @@ module.exports = function(io, socket, gameState) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const switchToAI = (roomId, socket) => {
|
||||||
|
// 대기방 목록에서 제거
|
||||||
|
gameState.rooms = gameState.rooms.filter(room => room.roomId !== roomId);
|
||||||
|
|
||||||
|
// 플레이어 매칭 정보 제거
|
||||||
|
gameState.playerRating.delete(socket.id);
|
||||||
|
gameState.nickname.delete(socket.id);
|
||||||
|
gameState.matchingTimeouts.delete(socket.id);
|
||||||
|
|
||||||
|
socket.emit('switchAI', {
|
||||||
|
message: "타임아웃 AI로 전환"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const findMatch = (socket, playerRating, nickname) => {
|
const findMatch = (socket, playerRating, nickname) => {
|
||||||
let matchedRoom = null;
|
let matchedRoom = null;
|
||||||
|
|
||||||
@ -83,6 +97,23 @@ module.exports = function(io, socket, gameState) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
logger.info(`대기방 생성: ID ${socket.id}, 급수 ${playerRating}, 방 ID ${roomId}`);
|
logger.info(`대기방 생성: ID ${socket.id}, 급수 ${playerRating}, 방 ID ${roomId}`);
|
||||||
|
|
||||||
|
// 10초 타임아웃 설정
|
||||||
|
const timeoutId = setTimeout(() => {
|
||||||
|
logger.info("타이머 종료, 15초 경과");
|
||||||
|
// 타임 아웃 AI로 던지기
|
||||||
|
|
||||||
|
// 아직 방에 혼자인지 확인
|
||||||
|
const room = gameState.rooms.find(r => r.roomId === roomId);
|
||||||
|
if (room) {
|
||||||
|
// 방이 남아 있으면 매칭 전임
|
||||||
|
logger.info("방이 남아 있어 방 삭제 후 AI로 전달");
|
||||||
|
switchToAI(roomId, socket);
|
||||||
|
}
|
||||||
|
},15000)
|
||||||
|
|
||||||
|
// 타임아웃 ID 저장
|
||||||
|
gameState.matchingTimeouts.set(socket.id, timeoutId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -12,8 +12,17 @@ module.exports = function(io, socket, gameState) {
|
|||||||
|
|
||||||
// 혼자 대기 중인 경우 대기방 목록에서 제거
|
// 혼자 대기 중인 경우 대기방 목록에서 제거
|
||||||
gameState.rooms = gameState.rooms.filter(room => room.roomId !== roomId);
|
gameState.rooms = gameState.rooms.filter(room => room.roomId !== roomId);
|
||||||
|
|
||||||
|
// 타임아웃이 있으면 제거
|
||||||
|
if (gameState.matchingTimeouts.has(socket.id)) {
|
||||||
|
clearTimeout(gameState.matchingTimeouts.get(socket.id));
|
||||||
|
gameState.matchingTimeouts.delete(socket.id);
|
||||||
|
}
|
||||||
|
|
||||||
// 매핑 정보 삭제
|
// 매핑 정보 삭제
|
||||||
gameState.socketRooms.delete(socket.id);
|
gameState.socketRooms.delete(socket.id);
|
||||||
|
gameState.playerRating.delete(socket.id);
|
||||||
|
gameState.nickname.delete(socket.id);
|
||||||
|
|
||||||
logger.info(`방 나가기 처리: 플레이어 ${socket.id}, 방 ${roomId}`);
|
logger.info(`방 나가기 처리: 플레이어 ${socket.id}, 방 ${roomId}`);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -9,7 +9,8 @@ const gameState = {
|
|||||||
rooms: [], // {roomId, hostId, rating} 형태로 저장
|
rooms: [], // {roomId, hostId, rating} 형태로 저장
|
||||||
socketRooms: new Map(), // 소켓ID와 방ID 매핑
|
socketRooms: new Map(), // 소켓ID와 방ID 매핑
|
||||||
playerRating: new Map(), // 소켓ID와 플레이어 급수 매핑
|
playerRating: new Map(), // 소켓ID와 플레이어 급수 매핑
|
||||||
nickname: new Map() // 플레이어 닉네임
|
nickname: new Map(), // 플레이어 닉네임
|
||||||
|
matchingTimeouts: new Map(), // 매치메이킹 타임아웃
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(server) {
|
module.exports = function(server) {
|
||||||
@ -34,6 +35,12 @@ module.exports = function(server) {
|
|||||||
socket.on('disconnect', function(reason) {
|
socket.on('disconnect', function(reason) {
|
||||||
logger.info('Disconnected: ' + socket.id + ', Reason: ' + reason);
|
logger.info('Disconnected: ' + socket.id + ', Reason: ' + reason);
|
||||||
|
|
||||||
|
// 타임아웃이 있으면 제거
|
||||||
|
if (gameState.matchingTimeouts.has(socket.id)) {
|
||||||
|
clearTimeout(gameState.matchingTimeouts.get(socket.id));
|
||||||
|
gameState.matchingTimeouts.delete(socket.id);
|
||||||
|
}
|
||||||
|
|
||||||
// 해당 소켓이 속한 방 찾기
|
// 해당 소켓이 속한 방 찾기
|
||||||
const roomId = gameState.socketRooms.get(socket.id);
|
const roomId = gameState.socketRooms.get(socket.id);
|
||||||
|
|
||||||
@ -49,8 +56,9 @@ module.exports = function(server) {
|
|||||||
gameState.socketRooms.delete(socket.id);
|
gameState.socketRooms.delete(socket.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 플레이어 급수 정보 제거
|
// 플레이어 매칭 정보 제거
|
||||||
gameState.playerRating.delete(socket.id);
|
gameState.playerRating.delete(socket.id);
|
||||||
|
gameState.nickname.delete(socket.id);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
Loading…
x
Reference in New Issue
Block a user