- 방 생성 로직 개선 방 생성시 급수를 전달 받아서 비슷한 급수 유저와 매칭 시도함 - 항복 기능 추가 항복 메세지 요청시 상대 플레이어에게 메세지 전달 - 무승부 제안 기능 추가 무승부 제안 요청시 상대방에게 트리거 전달 - 무승부 제안 받을 경우 수락 혹은 거절 - 재대결 요청 기능 추가
79 lines
2.8 KiB
JavaScript
79 lines
2.8 KiB
JavaScript
const { v4: uuidv4 } = require('uuid');
|
|
const { logger } = require('../../utils/logger');
|
|
|
|
module.exports = function(io, socket, gameState) {
|
|
socket.on('registerPlayer', function(data) {
|
|
try {
|
|
const rating = data.rating;
|
|
gameState.playerRating.set(socket.id, rating);
|
|
|
|
logger.info(`플레이어 등록: ID ${socket.id}, 급수 ${rating}`);
|
|
|
|
// 급수에 따른 매칭 진행
|
|
findMatch(socket, rating);
|
|
|
|
} catch (err) {
|
|
logger.error(`플레이어 등록 중 오류: ${err}`);
|
|
socket.emit('error', { message: "플레이어 등록 중 오류가 발생했습니다." });
|
|
}
|
|
});
|
|
|
|
const findMatch = (socket, playerRating) => {
|
|
let matchedRoom = null;
|
|
|
|
// 1. 같은 급수의 방 찾기
|
|
matchedRoom = gameState.rooms.find(room =>
|
|
Math.abs(gameState.playerRating.get(room.hostId) - playerRating) === 0);
|
|
|
|
// 2. 같은 급수 방이 없으면 ±1급 범위로 확장
|
|
if (!matchedRoom) {
|
|
matchedRoom = gameState.rooms.find(room =>
|
|
Math.abs(gameState.playerRating.get(room.hostId) - playerRating) <= 1);
|
|
}
|
|
|
|
if (matchedRoom) {
|
|
const roomId = matchedRoom.roomId;
|
|
|
|
// 매칭된 방은 대기 목록에서 제거
|
|
gameState.rooms = gameState.rooms.filter(room => room.roomId !== roomId);
|
|
|
|
// 방 입장
|
|
socket.join(roomId);
|
|
gameState.socketRooms.set(socket.id, roomId);
|
|
|
|
// 클라이언트에게 방 정보 전송 (상대 급수 정보 포함)
|
|
socket.emit('joinRoom', {
|
|
roomId: roomId,
|
|
opponentRating: gameState.playerRating.get(matchedRoom.hostId)
|
|
});
|
|
|
|
// 상대방에게 게임 시작 알림 (내 급수 정보 포함)
|
|
socket.to(roomId).emit('startGame', {
|
|
opponentId: socket.id,
|
|
opponentRating: playerRating
|
|
});
|
|
|
|
logger.info(`매칭 성공: ${socket.id}(${playerRating}급) - ${matchedRoom.hostId}(${gameState.playerRating.get(matchedRoom.hostId)}급)`);
|
|
} else { // 4. 매칭된 방이 없으면 새 방 생성
|
|
|
|
logger.info("매칭된 방 없음!")
|
|
const roomId = uuidv4();
|
|
socket.join(roomId);
|
|
|
|
gameState.rooms.push({
|
|
roomId: roomId,
|
|
hostId: socket.id,
|
|
rating: playerRating
|
|
});
|
|
|
|
gameState.socketRooms.set(socket.id, roomId);
|
|
socket.emit('createRoom', {
|
|
roomId: roomId,
|
|
message: "대기 중... 비슷한 상대를 찾고 있습니다."
|
|
});
|
|
|
|
logger.info(`대기방 생성: ID ${socket.id}, 급수 ${playerRating}, 방 ID ${roomId}`);
|
|
}
|
|
}
|
|
};
|