DO-77 [Feat] 머지 후 GameLogic.cs 재대결 추가

This commit is contained in:
Jay 2025-03-28 10:23:16 +09:00
parent b3f13d98fa
commit a50cd8d534

View File

@ -14,6 +14,9 @@ public partial class GameLogic : IDisposable
private RenjuForbiddenMoveDetector _forbiddenDetector; // 렌주룰 금수 검사기 private RenjuForbiddenMoveDetector _forbiddenDetector; // 렌주룰 금수 검사기
private List<Vector2Int> _forbiddenMoves = new (); // 현재 금수 위치 목록 private List<Vector2Int> _forbiddenMoves = new (); // 현재 금수 위치 목록
private string _roomId; private string _roomId;
private string _opponentNickname;
private int _opponentImageIndex;
private bool isFirstPlayer;
#endregion #endregion
@ -73,7 +76,6 @@ public partial class GameLogic : IDisposable
MultiPlayManager = new MultiplayManager((state, data) => MultiPlayManager = new MultiplayManager((state, data) =>
{ {
Debug.Log($"## {state}"); Debug.Log($"## {state}");
switch (state) switch (state)
{ {
case Constants.MultiplayManagerState.CreateRoom: case Constants.MultiplayManagerState.CreateRoom:
@ -83,12 +85,12 @@ public partial class GameLogic : IDisposable
case Constants.MultiplayManagerState.JoinRoom: case Constants.MultiplayManagerState.JoinRoom:
Debug.Log("## Join Room"); Debug.Log("## Join Room");
var joinRoomData = data as JoinRoomData; var joinRoomData = data as JoinRoomData;
_roomId = joinRoomData.roomId;
// TODO: 응답값 없을 때 서버에서 다시 받아오기 or AI 플레이로 넘기는 처리 필요 // TODO: 응답값 없을 때 서버에서 다시 받아오기 or AI 플레이로 넘기는 처리 필요
if (!ValidateRoomData(joinRoomData, "Join Room")) return; if (!ValidateRoomData(joinRoomData, "Join Room")) return;
// 플레이어 셋업 // 플레이어 셋업
SetupPlayer(joinRoomData.isBlack, joinRoomData.roomId, joinRoomData.opponentNickname, joinRoomData.opponentImageIndex); SetupPlayer(joinRoomData.isBlack, _roomId, joinRoomData.opponentNickname, joinRoomData.opponentImageIndex);
// 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요 // 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요
StartGameOnMainThread(); StartGameOnMainThread();
@ -138,7 +140,7 @@ public partial class GameLogic : IDisposable
Debug.Log("상대방의 무승부 요청 들어옴"); Debug.Log("상대방의 무승부 요청 들어옴");
ExecuteOnMainThread(() => ExecuteOnMainThread(() =>
{ {
GameManager.Instance.panelManager.OpenDrawConfirmPanel("무승부 요청을 승하시겠습니까?", () => GameManager.Instance.panelManager.OpenDrawConfirmPanel("무승부 요청을 승하시겠습니까?", () =>
{ {
GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw); GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw);
EndGame(Enums.GameResult.Draw); EndGame(Enums.GameResult.Draw);
@ -153,7 +155,7 @@ public partial class GameLogic : IDisposable
Debug.Log("무승부 요청 전송 완료"); Debug.Log("무승부 요청 전송 완료");
break; break;
case Constants.MultiplayManagerState.DrawAccepted: case Constants.MultiplayManagerState.DrawAccepted:
Debug.Log("무승부 요청이 승이 들어옴"); Debug.Log("무승부 요청이 승이 들어옴");
ExecuteOnMainThread(() => ExecuteOnMainThread(() =>
{ {
GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw); GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw);
@ -161,7 +163,7 @@ public partial class GameLogic : IDisposable
}); });
break; break;
case Constants.MultiplayManagerState.DrawConfirmed: case Constants.MultiplayManagerState.DrawConfirmed:
Debug.Log("무승부 요청 승 완료"); Debug.Log("무승부 요청 승 완료");
break; break;
case Constants.MultiplayManagerState.DrawRejected: case Constants.MultiplayManagerState.DrawRejected:
Debug.Log("무승부 요청이 거부가 들어옴"); Debug.Log("무승부 요청이 거부가 들어옴");
@ -182,6 +184,86 @@ public partial class GameLogic : IDisposable
EndGame(Enums.GameResult.Win); EndGame(Enums.GameResult.Win);
}); });
break; break;
case Constants.MultiplayManagerState.RevengeRequestSent:
Debug.Log("재대결 요청: 전송 완료");
break;
case Constants.MultiplayManagerState.ReceiveRevengeRequest:
Debug.Log("상대방의 재대결 요청이 들어옴");
UnityMainThreadDispatcher.Instance().Enqueue(() =>
{
GameManager.Instance.panelManager.OpenDrawConfirmPanel("상대방의 재대결 요청을\n승낙하시겠습니까?", () =>
{
MultiPlayManager.AcceptRevenge();
}, () =>
{
MultiPlayManager.RejectRevenge();
});
});
break;
case Constants.MultiplayManagerState.RevengeAccepted:
Debug.Log("재대결 요청: 승낙이 들어옴");
var revengeAcceptedData = data as RevengeData;
// TODO: 응답값 없을 때 서버에서 다시 받아오기 or AI 플레이로 넘기는 처리 필요
if (revengeAcceptedData == null)
{
Debug.Log("RevengeAccepted 응답값이 null 입니다");
return;
}
// 선공, 후공 처리
isFirstPlayer = revengeAcceptedData.isBlack;
UnityMainThreadDispatcher.Instance().Enqueue(() =>
{
GameManager.Instance.panelManager.OpenConfirmPanel("상대방이\n재대결을 승낙하였습니다.\n게임이 다시 시작됩니다.", () =>
{
InitBoardForRevenge(isFirstPlayer);
});
});
break;
case Constants.MultiplayManagerState.RevengeConfirmed:
Debug.Log("재대결 요청: 승낙 완료");
var revengConfirmedData = data as RevengeData;
// TODO: 응답값 없을 때 서버에서 다시 받아오기 or AI 플레이로 넘기는 처리 필요
if (revengConfirmedData == null)
{
Debug.Log("RevengeConfirmed 응답값이 null 입니다");
return;
}
// 선공, 후공 처리
isFirstPlayer = revengConfirmedData.isBlack;
UnityMainThreadDispatcher.Instance().Enqueue(() =>
{
GameManager.Instance.panelManager.OpenConfirmPanel("재대결 요청을\n승낙하였습니다.\n게임이 다시 시작됩니다.", () =>
{
InitBoardForRevenge(isFirstPlayer);
});
});
break;
case Constants.MultiplayManagerState.RevengeRejected:
Debug.Log("재대결 요청: 거부가 들어옴");
UnityMainThreadDispatcher.Instance().Enqueue(() =>
{
GameManager.Instance.panelManager.OpenConfirmPanel("상대방이\n재대결 요청을\n거부하였습니다.", () =>
{
GameManager.Instance.panelManager.CloseLoadingPanel();
});
});
break;
case Constants.MultiplayManagerState.RevengeRejectionConfirmed:
Debug.Log("재대결 요청: 거부 완료");
UnityMainThreadDispatcher.Instance().Enqueue(() =>
{
GameManager.Instance.panelManager.OpenConfirmPanel("재대결 요청을\n거부하였습니다.", () =>
{
GameManager.Instance.panelManager.CloseLoadingPanel();
});
});
break;
} }
ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB"); ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB");
}); });
@ -192,7 +274,10 @@ public partial class GameLogic : IDisposable
private void SetupPlayer(bool isBlack, string roomId, string opponentNickname, int opponentImageIndex) private void SetupPlayer(bool isBlack, string roomId, string opponentNickname, int opponentImageIndex)
{ {
// 선공, 후공 처리 // 선공, 후공 처리
var isFirstPlayer = isBlack; isFirstPlayer = isBlack;
_opponentNickname = opponentNickname;
_opponentImageIndex = opponentImageIndex;
if (isFirstPlayer) if (isFirstPlayer)
{ {
@ -200,7 +285,7 @@ public partial class GameLogic : IDisposable
FirstPlayerState = new PlayerState(true, MultiPlayManager, roomId); FirstPlayerState = new PlayerState(true, MultiPlayManager, roomId);
SecondPlayerState = new MultiPlayerState(false, MultiPlayManager); SecondPlayerState = new MultiPlayerState(false, MultiPlayManager);
UpdateUIForFirstPlayer(opponentNickname, opponentImageIndex); UpdateUIForFirstPlayer(_opponentNickname, _opponentImageIndex);
} }
else else
{ {
@ -208,7 +293,7 @@ public partial class GameLogic : IDisposable
FirstPlayerState = new MultiPlayerState(true, MultiPlayManager); FirstPlayerState = new MultiPlayerState(true, MultiPlayManager);
SecondPlayerState = new PlayerState(false, MultiPlayManager, roomId); SecondPlayerState = new PlayerState(false, MultiPlayManager, roomId);
UpdateUIForSecondPlayer(opponentNickname, opponentImageIndex); UpdateUIForSecondPlayer(_opponentNickname, _opponentImageIndex);
} }
} }
@ -344,6 +429,35 @@ public partial class GameLogic : IDisposable
} }
} }
private void InitBoardForRevenge(bool isFirstPlayer)
{
//보드 초기화
_board = new Enums.PlayerType[15, 15];
_totalStoneCounter = 0;
StoneController.InitStones();
RequestDrawChance = false;
SelectedRow = -1;
SelectedCol = -1;
_lastRow = -1;
_lastCol = -1;
// 금수 감지기 초기화
_forbiddenDetector.RenjuForbiddenMove(_board);
//timer 초기화
FioTimer.InitTimer();
// 플레이어 셋업
SetupPlayer(isFirstPlayer, _roomId, _opponentNickname, _opponentImageIndex);
// 로딩 패널 열려 있으면 닫기
GameManager.Instance.panelManager.CloseLoadingPanel();
// 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요
StartGameOnMainThread();
}
#endregion #endregion
public Enums.PlayerType[,] GetBoard() => _board; public Enums.PlayerType[,] GetBoard() => _board;