diff --git a/Assets/Script/Common/Constants.cs b/Assets/Script/Common/Constants.cs
index 2d5966a..d7e84ab 100644
--- a/Assets/Script/Common/Constants.cs
+++ b/Assets/Script/Common/Constants.cs
@@ -19,11 +19,12 @@
EndGame, // 상대방이 접속을 끊거나 방을 나갔을 때
DoSurrender, // 상대방이 항복했을 때
SurrenderConfirmed, // 항복 요청이 성공적으로 전송되었을 때
- ReceiveDrawRequest,
+ ReceiveDrawRequest,
DrawRequestSent,
DrawAccepted,
DrawConfirmed,
DrawRejected,
- DrawRejectionConfirmed
+ DrawRejectionConfirmed,
+ ReceiveTimeout // 상대방이 타임 아웃일 때
};
}
\ No newline at end of file
diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs
index 625bdab..4ecd89e 100644
--- a/Assets/Script/Game/GameLogic.cs
+++ b/Assets/Script/Game/GameLogic.cs
@@ -177,7 +177,7 @@ public class MultiPlayerState: BasePlayerState
gameLogic.UpdateForbiddenMoves();
#endregion
- // gameLogic.currentTurn = _playerType;
+ gameLogic.currentTurn = _playerType;
// gameLogic.stoneController.OnStoneClickedDelegate = (row, col) =>
// {
// HandleMove(gameLogic, row, col);
@@ -278,17 +278,24 @@ public class GameLogic : MonoBehaviour
//timer 시간초과시 진행 함수
this.fioTimer.OnTimeout = () =>
{
- if (currentTurn == Enums.PlayerType.PlayerA)
+ // 현재 턴의 플레이어가 로컬(유저)인지 확인
+ bool isCurrentPlayerLocal = (currentTurn == Enums.PlayerType.PlayerA && firstPlayerState is PlayerState) ||
+ (currentTurn == Enums.PlayerType.PlayerB && secondPlayerState is PlayerState);
+
+ if (isCurrentPlayerLocal) // 내가 타임 오버일 때
{
- GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: {Enums.PlayerType.PlayerB} Win",
- () =>{});
+ if (this.gameType == Enums.GameType.MultiPlay) // 멀티플레이인 경우
+ {
+ _multiplayManager?.SendTimeout();
+ }
+ GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Lose);
EndGame(Enums.GameResult.Lose);
}
- else if (currentTurn == Enums.PlayerType.PlayerB)
+ else // 로컬에서 자신의 타이머 기준으로 상대방이 타임 오버일 때
{
- GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: {Enums.PlayerType.PlayerA} Win",
- () =>{});
- EndGame(Enums.GameResult.Win);
+ // TODO: 컨펌 패널 OK 버튼 삭제?
+ GameManager.Instance.panelManager.OpenConfirmPanel("상대방의 응답을 기다리는 중입니다",
+ () => { } );
}
};
}
@@ -501,6 +508,14 @@ public class GameLogic : MonoBehaviour
case Constants.MultiplayManagerState.DrawRejectionConfirmed:
Debug.Log("무승부 요청 거부 완료");
+ break;
+ case Constants.MultiplayManagerState.ReceiveTimeout:
+ Debug.Log("상대방이 타임 아웃 됨");
+ UnityMainThreadDispatcher.Instance().Enqueue(() =>
+ {
+ GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Win);
+ EndGame(Enums.GameResult.Win);
+ });
break;
}
ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB");
diff --git a/Assets/Script/Game/MultiplayManager.cs b/Assets/Script/Game/MultiplayManager.cs
index 93cd65b..ca9846d 100644
--- a/Assets/Script/Game/MultiplayManager.cs
+++ b/Assets/Script/Game/MultiplayManager.cs
@@ -90,6 +90,7 @@ public class MultiplayManager : IDisposable
_socket.On("doOpponent", DoOpponent);
_socket.On("doSurrender", DoSurrender);
_socket.On("surrenderConfirmed", SurrenderConfirmed);
+ _socket.On("receiveTimeout", ReceiveTimeout);
_socket.On("receiveDrawRequest", ReceiveDrawRequest);
_socket.On("drawRequestSent", DrawRequestSent);
_socket.On("drawAccepted", DrawAccepted);
@@ -224,6 +225,30 @@ public class MultiplayManager : IDisposable
_onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.SurrenderConfirmed, data.message);
}
+ ///
+ /// 타임 아웃 요청
+ ///
+ public void SendTimeout()
+ {
+ if (string.IsNullOrEmpty(_roomId))
+ {
+ Debug.LogError("LeaveRoom 호출 실패: _roomId가 설정되지 않음");
+ return;
+ }
+ _socket.Emit("sendTimeout",new { roomId = _roomId });
+ }
+
+ ///
+ /// 타임 아웃 수신
+ ///
+ ///
+ private void ReceiveTimeout(SocketIOResponse response)
+ {
+ var data = response.GetValue();
+
+ _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.ReceiveTimeout, data.message);
+ }
+
public void RequestDraw()
{
if (string.IsNullOrEmpty(_roomId))
diff --git a/Assets/Script/Main/NetworkManager.cs b/Assets/Script/Main/NetworkManager.cs
index aca1bf4..b49ffd9 100644
--- a/Assets/Script/Main/NetworkManager.cs
+++ b/Assets/Script/Main/NetworkManager.cs
@@ -227,8 +227,13 @@ public class NetworkManager : Singleton
}
}
}
-
- public IEnumerator GetLeaderboard(Action success, Action failure)
+
+ public void GetLeaderboard(Action> success, Action failure)
+ {
+ StartCoroutine(GetLeaderboardCoroutine(success, failure));
+ }
+
+ public IEnumerator GetLeaderboardCoroutine(Action> success, Action failure)
{
using (UnityWebRequest www =
new UnityWebRequest(Constants.ServerURL + "/leaderboard", UnityWebRequest.kHttpVerbGET))
@@ -256,10 +261,15 @@ public class NetworkManager : Singleton
}
else
{
- var result = www.downloadHandler.text;
- var scores = JsonUtility.FromJson(result);
-
- success?.Invoke(scores);
+ // 성공적으로 데이터를 받아온 경우
+ string jsonResponse = www.downloadHandler.text; // 응답으로 받은 JSON 데이터
+
+ // JSON을 ScoreInfo 리스트로 파싱
+ ScoreListWrapper wrapper = JsonUtility.FromJson(jsonResponse);
+ List leaderboardItems = wrapper.leaderboardDatas;
+
+ // Show 메서드를 통해 데이터를 표시
+ success?.Invoke(leaderboardItems);
}
}
}
@@ -511,36 +521,4 @@ public class NetworkManager : Singleton
}
}
}
-
- public void GetLeaderboardData(Action> success, Action failure)
- {
- StartCoroutine(GetLeaderboardDataCoroutine(success, failure));
- }
-
- private IEnumerator GetLeaderboardDataCoroutine(Action> success, Action failure)
- {
- string url = Constants.ServerURL + "/leaderboard/"; // 서버의 리더보드 데이터 URL
-
- UnityWebRequest www = UnityWebRequest.Get(url); // GET 요청으로 데이터 받기
- yield return www.SendWebRequest(); // 요청 전송 대기
-
- // 요청이 실패했을 때
- if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError)
- {
- Debug.LogError("Error: " + www.error);
- failure?.Invoke();
- }
- else
- {
- // 성공적으로 데이터를 받아온 경우
- string jsonResponse = www.downloadHandler.text; // 응답으로 받은 JSON 데이터
-
- // JSON을 ScoreInfo 리스트로 파싱
- ScoreListWrapper wrapper = JsonUtility.FromJson(jsonResponse);
- List leaderboardItems = wrapper.leaderboardDatas;
-
- // Show 메서드를 통해 데이터를 표시
- success?.Invoke(leaderboardItems);
- }
- }
}
\ No newline at end of file
diff --git a/Assets/Script/UI/PanelController/LeaderBoardController.cs b/Assets/Script/UI/PanelController/LeaderBoardController.cs
index 6143beb..dd2de8f 100644
--- a/Assets/Script/UI/PanelController/LeaderBoardController.cs
+++ b/Assets/Script/UI/PanelController/LeaderBoardController.cs
@@ -27,7 +27,7 @@ public class LeaderBoardController : MonoBehaviour
if (isLeaderboardLoaded) return; // 이미 리더보드가 로드되었으면 중복 호출 방지
leaderboardPanel.SetActive(true);
- NetworkManager.Instance.GetLeaderboardData((leaderboardItems) =>
+ NetworkManager.Instance.GetLeaderboard((leaderboardItems) =>
{
Show(leaderboardItems);
}, () => { });