diff --git a/Assets/Script/Common/Constants.cs b/Assets/Script/Common/Constants.cs index d7e84ab..83d9046 100644 --- a/Assets/Script/Common/Constants.cs +++ b/Assets/Script/Common/Constants.cs @@ -25,6 +25,12 @@ DrawConfirmed, DrawRejected, DrawRejectionConfirmed, + ReceiveRevengeRequest, // 재대결 요청 수신 + RevengeRequestSent, // 재대결 요청 전송 확인 + RevengeAccepted, // 재대결 수락 수신 + RevengeConfirmed, // 재대결 수락 전송 확인 + RevengeRejected, // 재대결 거절 수신 + RevengeRejectionConfirmed, // 재대결 거절 전송 확인 ReceiveTimeout // 상대방이 타임 아웃일 때 }; } \ No newline at end of file diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index d2d0037..f4dc454 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -496,7 +496,7 @@ public class GameLogic : IDisposable Debug.Log("무승부 요청 전송 완료"); break; case Constants.MultiplayManagerState.DrawAccepted: - Debug.Log("무승부 요청이 승락이 들어옴"); + Debug.Log("무승부 요청이 승낙이 들어옴"); UnityMainThreadDispatcher.Instance().Enqueue(() => { GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw); @@ -504,7 +504,7 @@ public class GameLogic : IDisposable }); break; case Constants.MultiplayManagerState.DrawConfirmed: - Debug.Log("무승부 요청 승락 완료"); + Debug.Log("무승부 요청 승낙 완료"); break; case Constants.MultiplayManagerState.DrawRejected: Debug.Log("무승부 요청이 거부가 들어옴"); @@ -525,6 +525,35 @@ public class GameLogic : IDisposable EndGame(Enums.GameResult.Win); }); break; + case Constants.MultiplayManagerState.RevengeRequestSent: + Debug.Log("재대결 요청 전송 완료"); + break; + case Constants.MultiplayManagerState.RevengeAccepted: + Debug.Log("재대결 요청이 승낙이 들어옴"); + InitBoardForRevenge(); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + + }); + break; + case Constants.MultiplayManagerState.RevengeConfirmed: + Debug.Log("재대결 요청 승낙 완료"); + InitBoardForRevenge(); + break; + case Constants.MultiplayManagerState.RevengeRejected: + Debug.Log("재대결 요청이 거부가 들어옴"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenConfirmPanel("재대결 요청을 거부하였습니다.", () => { }); + }); + break; + case Constants.MultiplayManagerState.RevengeRejectionConfirmed: + Debug.Log("재대결 요청 거부 완료"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenConfirmPanel("재대결 요청을 거부하였습니다.", () => { }); + }); + break; } ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB"); @@ -536,7 +565,27 @@ public class GameLogic : IDisposable break; } } - + + private void InitBoardForRevenge() + { + //보드 초기화 + _board = new Enums.PlayerType[15, 15]; + _totalStoneCounter = 0; + RequestDrawChance = true; + + selectedRow = -1; + selectedCol = -1; + + // 금수 감지기 초기화 + _forbiddenDetector.RenjuForbiddenMove(_board); + + _lastRow = -1; + _lastCol = -1; + + //timer 초기화 + fioTimer.InitTimer(); + } + //AI닉네임 랜덤 생성 private string RandomAINickname() { diff --git a/Assets/Script/Game/MultiplayManager.cs b/Assets/Script/Game/MultiplayManager.cs index ca9846d..d82358f 100644 --- a/Assets/Script/Game/MultiplayManager.cs +++ b/Assets/Script/Game/MultiplayManager.cs @@ -91,12 +91,20 @@ public class MultiplayManager : IDisposable _socket.On("doSurrender", DoSurrender); _socket.On("surrenderConfirmed", SurrenderConfirmed); _socket.On("receiveTimeout", ReceiveTimeout); + // 무승부 관련 _socket.On("receiveDrawRequest", ReceiveDrawRequest); _socket.On("drawRequestSent", DrawRequestSent); _socket.On("drawAccepted", DrawAccepted); _socket.On("drawConfirmed", DrawConfirmed); _socket.On("drawRejected", DrawRejected); _socket.On("drawRejectionConfirmed", DrawRejectionConfirmed); + // 재대결 관련 + _socket.On("receiveRevengeRequest", ReceiveRevengeRequest); + _socket.On("revengeRequestSent", DrawRequestSent); + _socket.On("revengeAccepted", RevengeAccepted); + _socket.On("revengeConfirmed", RevengeConfirmed); + _socket.On("revengeRejected", RevengeRejected); + _socket.On("revengeRejectionConfirmed", RevengeRejectionConfirmed); _socket.Connect(); } @@ -249,6 +257,8 @@ public class MultiplayManager : IDisposable _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.ReceiveTimeout, data.message); } + #region 무승부 + public void RequestDraw() { if (string.IsNullOrEmpty(_roomId)) @@ -321,6 +331,84 @@ public class MultiplayManager : IDisposable _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawRejectionConfirmed, data.message); } + #endregion + + #region 재대결 + + public void RequestRevengeRequest() + { + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("requestDraw 호출 실패: _roomId가 설정되지 않음"); + return; + } + _socket.Emit("requestRevenge",new { roomId = _roomId }); + } + + private void ReceiveRevengeRequest(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.ReceiveRevengeRequest, data.message); + } + + private void RevengeRequestSent(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.RevengeRequestSent, data.message); + } + + public void AcceptRevenge() + { + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("acceptRevenge 호출 실패: _roomId가 설정되지 않음"); + return; + } + _socket.Emit("acceptRevenge", new { roomId = _roomId }); + } + + private void RevengeAccepted(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.RevengeAccepted, data.message); + } + + private void RevengeConfirmed(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.RevengeConfirmed, data.message); + } + + public void RejectRevenge() + { + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("rejectRevenge 호출 실패: _roomId가 설정되지 않음"); + return; + } + _socket.Emit("rejectRevenge", new { roomId = _roomId }); + } + + private void RevengeRejected(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.RevengeRejected, data.message); + } + + private void RevengeRejectionConfirmed(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.RevengeRejectionConfirmed, data.message); + } + + #endregion + public void Dispose() { if (_socket != null)