From 97cd17c0cfbc7736c11c79002e900ea5d313b83a Mon Sep 17 00:00:00 2001 From: Ashby Issac Date: Tue, 10 Feb 2026 19:24:08 +0530 Subject: [PATCH 1/2] Added auto selecting logic for player. --- Assets/Scenes/Game.unity | 4 + Assets/Scripts/Gameplay/GameplayManager.cs | 114 ++++++++++++------ .../Scripts/Gameplay/Player/PlayerGameData.cs | 1 + 3 files changed, 83 insertions(+), 36 deletions(-) diff --git a/Assets/Scenes/Game.unity b/Assets/Scenes/Game.unity index 02d3725..f8fe5ac 100644 --- a/Assets/Scenes/Game.unity +++ b/Assets/Scenes/Game.unity @@ -8476,24 +8476,28 @@ MonoBehaviour: playersParent: {fileID: 1373272158} totalPawnsInHome: 0 totalPawnsFinished: 0 + totalPawnsInFinishingPath: 0 - playerType: 1 startIndex: 13 endIndex: 11 playersParent: {fileID: 1841959051} totalPawnsInHome: 0 totalPawnsFinished: 0 + totalPawnsInFinishingPath: 0 - playerType: 2 startIndex: 26 endIndex: 24 playersParent: {fileID: 1934858463} totalPawnsInHome: 0 totalPawnsFinished: 0 + totalPawnsInFinishingPath: 0 - playerType: 3 startIndex: 39 endIndex: 37 playersParent: {fileID: 1094154913} totalPawnsInHome: 0 totalPawnsFinished: 0 + totalPawnsInFinishingPath: 0 playerBaseHandler: {fileID: 433034051} --- !u!4 &896294589 stripped Transform: diff --git a/Assets/Scripts/Gameplay/GameplayManager.cs b/Assets/Scripts/Gameplay/GameplayManager.cs index 3351c42..a5d53ac 100644 --- a/Assets/Scripts/Gameplay/GameplayManager.cs +++ b/Assets/Scripts/Gameplay/GameplayManager.cs @@ -76,7 +76,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader private bool CanRollDiceAgain = false; // used for when you get a 6 or when you reach the finish point private int diceSixRollCounter = 0; - private List availPlayers = new List(); + private List availPlayersToMove = new List(); private bool canSwitchPlayer = true; public bool CanRollDiceForUser @@ -396,7 +396,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader // What happens when you get a 6 private void SelectPawnFromBotBase() { - if (canSwitchPlayer || availPlayers.Count() < 1 && !CanRollDiceAgain || !botTypesInGame.Contains(currentPlayerTypeTurn)) + if (canSwitchPlayer || availPlayersToMove.Count() < 1 && !CanRollDiceAgain || !botTypesInGame.Contains(currentPlayerTypeTurn)) { Debug.Log($"returning from SelectPawnFromBotBase"); return; // Have a better check here @@ -408,7 +408,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader int savedPlayerId = -1; PlayerPawn pawn = null; - Debug.Log($"SelectPawnFromBotBase: availPlayers.Count(): {availPlayers.Count()}, CanRollDiceAgain: {CanRollDiceAgain}"); + Debug.Log($"SelectPawnFromBotBase: availPlayers.Count(): {availPlayersToMove.Count()}, CanRollDiceAgain: {CanRollDiceAgain}"); if (playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInHome == 0) { @@ -428,7 +428,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader } Debug.Log($"Before Iterating"); - foreach (var playerPawn in availPlayers) + foreach (var playerPawn in availPlayersToMove) { int possibleSteps = 0; Tile possibleTileData = null; @@ -578,15 +578,12 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader Debug.Log($"Tile Index :: LUDO :: rolledVal: {rolledVal} :: {currentPlayerTypeTurn}"); diceRolledValue = rolledVal; diceText.text = $"{diceRolledValue}"; - availPlayers = new List(); + availPlayersToMove = new List(); + InitActivePlayers(); if (!CanRollDiceAgain) { - UpdateActivePlayersAndSetDisplay(true); - } - else - { - InitActivePlayers(); + SetDisplayCountForAllAvailPlayers(true); } if (rolledVal == Ludo_3D_Constants.Max_Dice_Rolls) @@ -596,6 +593,27 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader // also play a simple animation before selecting CanRollDiceAgain = true; diceSixRollCounter++; + + if (botTypesInGame != null && !botTypesInGame.Contains(currentPlayerTypeTurn)) + { + var hasNoPlayersTraveling = Mathf.Abs(availPlayersToMove.Count - playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInFinishingPath) < 1; + Debug.Log($"availPlayersToMove.Count: {availPlayersToMove.Count}, hasNoPlayersTraveling: {hasNoPlayersTraveling}, totalPawnsInFinishingPath: {playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInFinishingPath}"); + if (availPlayersToMove.Count < 1 || hasNoPlayersTraveling) + { + if (playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInHome > 0) + { + OnPawnSelected(playerGameDatasDict[currentPlayerTypeTurn].playerPawnsDict.Values + .FirstOrDefault(pawn => pawn.GetPlayerState() == PlayerState.InHome)); + return; + } + } + else + { + if (playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInHome < 1 && CanMoveSoloPlayer()) + return; + } + } + #if UNITY_EDITOR pointerMeshRend.material = selectMat; #endif @@ -612,56 +630,75 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader } Debug.Log($"### EnablePlayerSelectionStates"); - + EnablePlayerSelectionStates(true); - // pointerMeshRend.materials[0] = selectMat; } else // if there are any other pawns that are in safe or moving state { - // for player's logic - - int customAvailPlayers = availPlayers.Count(); - Debug.Log($"before CustomAvailablePlayers: {customAvailPlayers}"); + Debug.Log($"before CustomAvailablePlayers: {availPlayersToMove.Count}"); List indexesToRemove = new List(); - for (int i = 0; i < availPlayers.Count; i++) + for (int i = 0; i < availPlayersToMove.Count; i++) { - Debug.Log($"## playerPawn.GetPlayerState(): {availPlayers[i].GetPlayerState()}"); + Debug.Log($"## playerPawn.GetPlayerState(): {availPlayersToMove[i].GetPlayerState()}"); - if (availPlayers[i].GetPlayerState() == PlayerState.InFinishingPath) + if (availPlayersToMove[i].GetPlayerState() == PlayerState.InFinishingPath) { - Debug.Log($"diceRolledValue: {diceRolledValue}, FinishingDataLen: {TilesManager.GetFinishingTileDataLength(currentPlayerTypeTurn)}, playerPawn.CurrentTileIndex: {availPlayers[i].CurrentTileIndex}"); - if (diceRolledValue <= TilesManager.GetFinishingTileDataLength(currentPlayerTypeTurn) - (availPlayers[i].CurrentTileIndex + 1)) + Debug.Log($"diceRolledValue: {diceRolledValue}, FinishingDataLen: {TilesManager.GetFinishingTileDataLength(currentPlayerTypeTurn)}, playerPawn.CurrentTileIndex: {availPlayersToMove[i].CurrentTileIndex}"); + if (diceRolledValue <= TilesManager.GetFinishingTileDataLength(currentPlayerTypeTurn) - (availPlayersToMove[i].CurrentTileIndex + 1)) { - availPlayers[i].SetPlayerSelectionState(true); + availPlayersToMove[i].SetPlayerSelectionState(true); } else { indexesToRemove.Add(i); - availPlayers[i].SetPlayerSelectionState(false); - availPlayers[i].ShowPlayerCountCanvas(false); - customAvailPlayers--; + availPlayersToMove[i].SetPlayerSelectionState(false); + availPlayersToMove[i].ShowPlayerCountCanvas(false); } continue; } - availPlayers[i].SetPlayerSelectionState(true); + availPlayersToMove[i].SetPlayerSelectionState(true); } for (int idx = indexesToRemove.Count - 1; idx >= 0; idx--) - availPlayers.RemoveAt(idx); + availPlayersToMove.RemoveAt(idx); - // if (availPlayers.Count() < 1) - Debug.Log($"CustomAvailablePlayers: {customAvailPlayers}"); - canSwitchPlayer = customAvailPlayers < 1; + Debug.Log($"CustomAvailablePlayers: {availPlayersToMove.Count}"); + canSwitchPlayer = availPlayersToMove.Count < 1; CanRollDiceAgain = false; + + if (botTypesInGame != null && !botTypesInGame.Contains(currentPlayerTypeTurn) && + availPlayersToMove.Count > 0) + { + if (CanMoveSoloPlayer()) + { + EnablePlayerSelectionStates(false); + OnPawnSelected(availPlayersToMove[0]); + } + } } Debug.Log($"CanRollDiceAgain: {CanRollDiceAgain}, canSwitchPlayer: {canSwitchPlayer}"); } + private bool CanMoveSoloPlayer() + { + if (availPlayersToMove.Count == 1) + { + if (availPlayersToMove[0].GetPlayerState() == PlayerState.InSafeZone || availPlayersToMove[0].GetPlayerState() == PlayerState.Moving + || availPlayersToMove[0].GetPlayerState() == PlayerState.InFinishingPath) + { + + return true; + } + } + + return false; + } + private void UpdateActivePlayersAndSetDisplay(bool state) { InitActivePlayers(); @@ -670,7 +707,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader private void InitActivePlayers() { - availPlayers = playerGameDatasDict[currentPlayerTypeTurn].playerPawnsDict.Values.Select(pawn => pawn) + availPlayersToMove = playerGameDatasDict[currentPlayerTypeTurn].playerPawnsDict.Values.Select(pawn => pawn) .Where(pawn => pawn.GetPlayerState() == PlayerState.InSafeZone || pawn.GetPlayerState() == PlayerState.Moving || pawn.GetPlayerState() == PlayerState.InFinishingPath).ToList(); @@ -770,6 +807,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader else if (selectedPawn.CurrentTileIndex == playerGameDatasDict[currentPlayerTypeTurn].endIndex) { TilesManager.RetrieveTileBasedOnIndex(selectedPawn.CurrentTileIndex).ResetPlayerPawn(selectedPawn); + playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInFinishingPath++; ApplyFinishingPathLogic(selectedPawn); } else if (selectedPawn.GetPlayerState() == PlayerState.InSafeZone || selectedPawn.GetPlayerState() == PlayerState.Moving) @@ -843,10 +881,10 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader Debug.Log($"currentPlayerTurn: {currentPlayerTypeTurn}"); Debug.Log($"currentPlayerTurnIndex: {currentPlayerTurnIndex}"); - Debug.Log($"before SwitchPlayer availPlayers: {availPlayers.Count}, playerPawn: {playerPawn}"); + Debug.Log($"before SwitchPlayer availPlayers: {availPlayersToMove.Count}, playerPawn: {playerPawn}"); UpdateActivePlayersAndSetDisplay(false); - Debug.Log($"after SwitchPlayer availPlayers: {availPlayers.Count}, playerPawn: {playerPawn}"); + Debug.Log($"after SwitchPlayer availPlayers: {availPlayersToMove.Count}, playerPawn: {playerPawn}"); Debug.Log($"after allPlayerTypes.Count: {allPlayerTypes.Count}"); if (allPlayerTypes.Count == 0) @@ -906,11 +944,11 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader { if (state) { - availPlayers.ForEach(pawn => ShowUpdatedPlayerCountOnTile(pawn)); + availPlayersToMove.ForEach(pawn => ShowUpdatedPlayerCountOnTile(pawn)); } else { - availPlayers.ForEach(pawn => pawn.ShowPlayerCountCanvas(false)); + availPlayersToMove.ForEach(pawn => pawn.ShowPlayerCountCanvas(false)); } } @@ -948,6 +986,9 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader { // MoveThroughTiles(playerPawn, index, targetIndex); Debug.Log($"TargetIdx: {targetIndex - index}"); + if (index == playerGameDatasDict[currentPlayerTypeTurn].endIndex) + playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInFinishingPath++; + CheckForGamePause(() => MoveThroughFinishingPath(playerPawn, 0, targetIndex - index)); } else if (nextTileIndex <= targetIndex) @@ -1066,6 +1107,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader UpdatePlayerState(playerPawn, PlayerState.HasFinished); playerGameDatasDict[currentPlayerTypeTurn].totalPawnsFinished++; + playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInFinishingPath--; Debug.Log($"playerGameDatasDict[currentPlayerTypeTurn].totalPawnsFinished: {playerGameDatasDict[currentPlayerTypeTurn].totalPawnsFinished}"); Debug.Log($"playerGameDatasDict[currentPlayerTypeTurn].playerPawnsDict.Count: {playerGameDatasDict[currentPlayerTypeTurn].playerPawnsDict.Count}"); @@ -1185,7 +1227,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader playerGameDatasDict = null; playerDatas = null; - availPlayers = null; + availPlayersToMove = null; botTypesInGame = null; botRuntimeMovementData = null; diff --git a/Assets/Scripts/Gameplay/Player/PlayerGameData.cs b/Assets/Scripts/Gameplay/Player/PlayerGameData.cs index 92a5954..967f3ea 100644 --- a/Assets/Scripts/Gameplay/Player/PlayerGameData.cs +++ b/Assets/Scripts/Gameplay/Player/PlayerGameData.cs @@ -27,6 +27,7 @@ public class PlayerGameData public Dictionary playerPawnsDict; public int totalPawnsInHome = 0; public int totalPawnsFinished = 0; + public int totalPawnsInFinishingPath = 0; } [System.Serializable] From da4b44957b89a589a148505dfd6e2b72e1357ba0 Mon Sep 17 00:00:00 2001 From: Ashby Issac Date: Wed, 11 Feb 2026 19:53:16 +0530 Subject: [PATCH 2/2] Applied probability logic for pawns. --- .../Gameplay/Snake and Ladder/DiceView.cs | 79 +++++++++++++------ Assets/Scripts/Abstraction/Game.meta | 8 ++ Assets/Scripts/Abstraction/Game/IRollBase.cs | 11 +++ .../Abstraction/Game/IRollBase.cs.meta | 11 +++ Assets/Scripts/Gameplay/GameplayManager.cs | 62 +++++++++++---- Assets/Scripts/Gameplay/Player/PlayerBase.cs | 23 +++++- .../Gameplay/Player/PlayerBaseHandler.cs | 3 +- Assets/Scripts/Input/DiceRollHandler.cs | 12 ++- 8 files changed, 164 insertions(+), 45 deletions(-) create mode 100644 Assets/Scripts/Abstraction/Game.meta create mode 100644 Assets/Scripts/Abstraction/Game/IRollBase.cs create mode 100644 Assets/Scripts/Abstraction/Game/IRollBase.cs.meta diff --git a/Assets/External-Assets/packages/Project/Scripts/Gameplay/Snake and Ladder/DiceView.cs b/Assets/External-Assets/packages/Project/Scripts/Gameplay/Snake and Ladder/DiceView.cs index 5c62e5b..f254ac2 100644 --- a/Assets/External-Assets/packages/Project/Scripts/Gameplay/Snake and Ladder/DiceView.cs +++ b/Assets/External-Assets/packages/Project/Scripts/Gameplay/Snake and Ladder/DiceView.cs @@ -1,6 +1,8 @@ using System; using System.Collections; +using System.Collections.Generic; using UnityEngine; +using Random = UnityEngine.Random; public class DiceView : MonoBehaviour, IBase { @@ -16,10 +18,14 @@ public class DiceView : MonoBehaviour, IBase [SerializeField] private float sideForce = 0.18f; [SerializeField] private float liftForce = 0.1f; + private List probabilityValues = new List() { 3, 4, 5 }; private Quaternion startRotation; private Action onRollingComplete = null; + + private IRollBase rollBase = null; + private bool hasNoActionOnRoll = false; - void Awake() + private void Awake() { rb = GetComponent(); rb.useGravity = false; @@ -39,31 +45,31 @@ public class DiceView : MonoBehaviour, IBase } } - IEnumerator RollRoutine() + private IEnumerator RollRoutine() { rolling = true; // MICRO DELAY → breaks physics sync between dice - yield return new WaitForSeconds(UnityEngine.Random.Range(0.01f, 0.06f)); + yield return new WaitForSeconds(Random.Range(0.01f, 0.06f)); rb.useGravity = true; // PER-DICE FORCE MULTIPLIER - float spinMultiplier = UnityEngine.Random.Range(0.8f, 1.25f); + float spinMultiplier = Random.Range(0.8f, 1.25f); // RANDOM TORQUE rb.AddTorque( - UnityEngine.Random.Range(-baseSpinForce, baseSpinForce) * spinMultiplier, - UnityEngine.Random.Range(-baseSpinForce, baseSpinForce) * spinMultiplier, - UnityEngine.Random.Range(-baseSpinForce, baseSpinForce) * spinMultiplier, + Random.Range(-baseSpinForce, baseSpinForce) * spinMultiplier, + Random.Range(-baseSpinForce, baseSpinForce) * spinMultiplier, + Random.Range(-baseSpinForce, baseSpinForce) * spinMultiplier, ForceMode.Impulse ); // RANDOM SIDE FORCE Vector3 sideDir = new Vector3( - UnityEngine.Random.Range(-1f, 1f), + Random.Range(-1f, 1f), 0f, - UnityEngine.Random.Range(-1f, 1f) + Random.Range(-1f, 1f) ).normalized; rb.AddForce(sideDir * sideForce, ForceMode.Impulse); @@ -73,28 +79,44 @@ public class DiceView : MonoBehaviour, IBase yield return new WaitForSeconds(sideValueTime); - int value = GetDiceValue(); - - //TODO: Use the dice value as needed - Debug.Log($"Dice rolled: {value}"); - - ResetDice(); - onRollingComplete?.Invoke(value); - } - - int GetDiceValue() - { - foreach (DiceSide side in diceSides) + int rolledVal = 0; + if (hasNoActionOnRoll) { - if (side.OnGround()) - return side.sideValue; + if (rollBase.SixRollCount == 0) + { + rollBase.UpdateMaxRollCount(probabilityValues[Random.Range(0, probabilityValues.Count)]); + } + + rollBase.UpdateSixRollCount(); + rolledVal = rollBase.SixRollCount == rollBase.MaxRollCount ? + Ludo_3D_Constants.Max_Dice_Rolls : GetDiceValue(); + } + else + { + rolledVal = GetDiceValue(); } - return 1; + if (rolledVal == Ludo_3D_Constants.Max_Dice_Rolls) + ResetRollData(); + + ResetDice(); + Debug.Log($"Dice rolled: {rolledVal}"); + onRollingComplete?.Invoke(rolledVal); + } + + private int GetDiceValue() + { + return Random.Range(1, Ludo_3D_Constants.Max_Dice_Rolls + 1); + } + + public void ResetRollData() + { + if (rollBase != null) rollBase.ResetRollData(); } public void ResetDice() { + rollBase = null; rb.useGravity = false; rb.velocity = Vector3.zero; rb.angularVelocity = Vector3.zero; @@ -108,4 +130,13 @@ public class DiceView : MonoBehaviour, IBase transform.localRotation = startRotation; onRollingComplete = null; } + + public void InitOnNoActionsAfterRoll(IRollBase rollBase, bool state) + { + hasNoActionOnRoll = state; + if (!state) + return; + + this.rollBase = rollBase; + } } diff --git a/Assets/Scripts/Abstraction/Game.meta b/Assets/Scripts/Abstraction/Game.meta new file mode 100644 index 0000000..194c636 --- /dev/null +++ b/Assets/Scripts/Abstraction/Game.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 05273ddf992ca4671b13f0b4b9dde85d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Abstraction/Game/IRollBase.cs b/Assets/Scripts/Abstraction/Game/IRollBase.cs new file mode 100644 index 0000000..5343e22 --- /dev/null +++ b/Assets/Scripts/Abstraction/Game/IRollBase.cs @@ -0,0 +1,11 @@ + +public interface IRollBase +{ + public int SixRollCount { get; } + + public int MaxRollCount { get; } + + void UpdateSixRollCount(); + void UpdateMaxRollCount(int val); + void ResetRollData(); +} diff --git a/Assets/Scripts/Abstraction/Game/IRollBase.cs.meta b/Assets/Scripts/Abstraction/Game/IRollBase.cs.meta new file mode 100644 index 0000000..4c36559 --- /dev/null +++ b/Assets/Scripts/Abstraction/Game/IRollBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4683cbbafe11541cf8a71cdd12df62ac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Gameplay/GameplayManager.cs b/Assets/Scripts/Gameplay/GameplayManager.cs index a5d53ac..12dfd21 100644 --- a/Assets/Scripts/Gameplay/GameplayManager.cs +++ b/Assets/Scripts/Gameplay/GameplayManager.cs @@ -169,7 +169,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader private void HandleDiceRollWithDelay() { - Invoke(nameof(HandleDiceRoll), botDiceRollDelay); + Invoke(nameof(RollDiceForBot), botDiceRollDelay); } private void InitBotRuntimeData() @@ -267,7 +267,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader currentPlayerTurnTimer.Init(currentPlayerTurnMaxTime, onComplete: () => { Debug.Log($"currentPlayerTurnTimer: HandleDiceViewForUser"); - diceRollHandler.HandleDiceViewForUser(); + RollDiceForUser(); }, inProgress: (remTime) => { uIManager.UpdatePlayerTurnText(currentPlayerTypeTurn, currentPlayerTurnMaxTime - (int)remTime); @@ -349,7 +349,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader public void OnDiceInteracted() { ResetCurrentPlayerTurnTimer(); - diceRollHandler.HandleDiceViewForUser(); + RollDiceForUser(); } public void RollDiceForPlayer(int rolledVal) @@ -515,7 +515,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader } if (CanRollDiceAgain) - HandleDiceRoll(); + RollDiceForBot(); else SwitchPlayer(); } @@ -570,6 +570,8 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader return possibleSteps > TilesManager.GetGeneralTilesLength() - 1; } + private bool HasNoPlayersTravelling() => Mathf.Abs(availPlayersToMove.Count - playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInFinishingPath) < 1; + public void OnDiceRolled(int rolledVal) { SetCanRollDiceForUser(false); @@ -578,9 +580,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader Debug.Log($"Tile Index :: LUDO :: rolledVal: {rolledVal} :: {currentPlayerTypeTurn}"); diceRolledValue = rolledVal; diceText.text = $"{diceRolledValue}"; - availPlayersToMove = new List(); - - InitActivePlayers(); + if (!CanRollDiceAgain) { SetDisplayCountForAllAvailPlayers(true); @@ -596,9 +596,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader if (botTypesInGame != null && !botTypesInGame.Contains(currentPlayerTypeTurn)) { - var hasNoPlayersTraveling = Mathf.Abs(availPlayersToMove.Count - playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInFinishingPath) < 1; - Debug.Log($"availPlayersToMove.Count: {availPlayersToMove.Count}, hasNoPlayersTraveling: {hasNoPlayersTraveling}, totalPawnsInFinishingPath: {playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInFinishingPath}"); - if (availPlayersToMove.Count < 1 || hasNoPlayersTraveling) + if (availPlayersToMove.Count < 1 || HasNoPlayersTravelling()) { if (playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInHome > 0) { @@ -707,6 +705,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader private void InitActivePlayers() { + availPlayersToMove = new List(); availPlayersToMove = playerGameDatasDict[currentPlayerTypeTurn].playerPawnsDict.Values.Select(pawn => pawn) .Where(pawn => pawn.GetPlayerState() == PlayerState.InSafeZone || pawn.GetPlayerState() == PlayerState.Moving || @@ -745,16 +744,48 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader { if (CanRollDiceAgain) { - HandleDiceRoll(); + RollDiceForBot(); } } - private void HandleDiceRoll() + private void RollDiceForUser() + { + InitActivePlayers(); + bool canUsePawnsFromHome = CanUsePawnsFromHome(); + diceRollHandler.HandleDiceViewForUser( + hasNoActionOnRoll: canUsePawnsFromHome, + playerBase: canUsePawnsFromHome ? PlayerBaseHandler.GetPlayerBase(currentPlayerTypeTurn) : null); + } + + private void RollDiceForBot() + { + InitActivePlayers(); + HandleDiceRollForBot(); + } + + /*** + * Summary: + * Scenario where the user/bot has no other move when some of the pawns/characters out of home + * are in finishing path and doesn't have a move from dice rolled value + */ + private bool CanUsePawnsFromHome() + { + return playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInHome > 0 && HasNoPlayersTravelling(); + } + + private void HandleDiceRollForBot() { if (isDebugAITest) - diceRollHandler.HandleDiceViewForBot((rollVal) => RollDiceForBot(rollVal), diceValue == 0 ? UnityEngine.Random.Range(1, Ludo_3D_Constants.Max_Dice_Rolls + 1) : diceValue); - else - diceRollHandler.HandleDiceViewForBot((rollVal) => RollDiceForBot(rollVal)); + diceRollHandler.HandleDiceViewForBot((rollVal) => RollDiceForBot(rollVal), + diceValue == 0 ? UnityEngine.Random.Range(1, Ludo_3D_Constants.Max_Dice_Rolls + 1) : diceValue); + else + { + bool canUsePawnsFromHome = CanUsePawnsFromHome(); + diceRollHandler.HandleDiceViewForBot( + (rollVal) => RollDiceForBot(rollVal), + hasNoActionOnRoll: canUsePawnsFromHome, + playerBase: canUsePawnsFromHome ? PlayerBaseHandler.GetPlayerBase(currentPlayerTypeTurn) : null); + } } public void OnPawnSelected(PlayerPawn selectedPawn) @@ -1106,6 +1137,7 @@ public class GameplayManager : MonoBehaviour, IBase, IBootLoader, IDataLoader // ShowUpdatedPlayerCountOnTile(playerPawn); UpdatePlayerState(playerPawn, PlayerState.HasFinished); + playerGameDatasDict[currentPlayerTypeTurn].totalPawnsFinished++; playerGameDatasDict[currentPlayerTypeTurn].totalPawnsInFinishingPath--; diff --git a/Assets/Scripts/Gameplay/Player/PlayerBase.cs b/Assets/Scripts/Gameplay/Player/PlayerBase.cs index 49ed2fe..765d0b8 100644 --- a/Assets/Scripts/Gameplay/Player/PlayerBase.cs +++ b/Assets/Scripts/Gameplay/Player/PlayerBase.cs @@ -7,12 +7,17 @@ public class BasePlacementData public Transform placementTransform; } -public class PlayerBase : MonoBehaviour +public class PlayerBase : MonoBehaviour, IRollBase { [SerializeField] private PlayerType playerType; [SerializeField] private BasePlacementData[] basePlacementDatas; [SerializeField] private PlayerPawn[] playerPawns; [SerializeField] private GameObject playerBaseEffect; + + private int sixRollCount, maxRollCount; + + public int SixRollCount => sixRollCount; + public int MaxRollCount => maxRollCount; public bool IsBotBase { @@ -21,6 +26,22 @@ public class PlayerBase : MonoBehaviour public PlayerType GetPlayerType() => playerType; + public void UpdateSixRollCount() + { + sixRollCount++; + } + + public void ResetRollData() + { + sixRollCount = 0; + maxRollCount = 0; + } + + public void UpdateMaxRollCount(int val) + { + maxRollCount = val; + } + public void InitPlayerData() { for (int idx = 0; idx < basePlacementDatas.Length; idx++) diff --git a/Assets/Scripts/Gameplay/Player/PlayerBaseHandler.cs b/Assets/Scripts/Gameplay/Player/PlayerBaseHandler.cs index 4c431d4..709f3db 100644 --- a/Assets/Scripts/Gameplay/Player/PlayerBaseHandler.cs +++ b/Assets/Scripts/Gameplay/Player/PlayerBaseHandler.cs @@ -1,6 +1,5 @@ -using System; -using System.Collections.Generic; using UnityEngine; +using System.Collections.Generic; [System.Serializable] public class PlayerBaseData diff --git a/Assets/Scripts/Input/DiceRollHandler.cs b/Assets/Scripts/Input/DiceRollHandler.cs index 5ae04e2..c43904a 100644 --- a/Assets/Scripts/Input/DiceRollHandler.cs +++ b/Assets/Scripts/Input/DiceRollHandler.cs @@ -29,7 +29,7 @@ public class DiceRollHandler : MonoBehaviour inputManager.SetDiceRollValue(rolledVal); } - public void HandleDiceViewForUser() + public void HandleDiceViewForUser(bool hasNoActionOnRoll = false, PlayerBase playerBase = null) { if (!inputManager.GameplayManager.CanRollDiceForUser) return; @@ -39,11 +39,17 @@ public class DiceRollHandler : MonoBehaviour if (inputManager.GameplayManager.IsDebugPlayerTest) OnUserDiceRollComplete(GetDiceTestVal()); else - diceView.Roll(onComplete: (rolledVal) => OnUserDiceRollComplete(rolledVal), false); + { + diceView.InitOnNoActionsAfterRoll(playerBase, hasNoActionOnRoll); + diceView.Roll( + (rolledVal) => OnUserDiceRollComplete(rolledVal), + false); + } } - public void HandleDiceViewForBot(Action onComplete) + public void HandleDiceViewForBot(Action onComplete, bool hasNoActionOnRoll = false, PlayerBase playerBase = null) { + diceView.InitOnNoActionsAfterRoll(playerBase, hasNoActionOnRoll); diceView.Roll(onComplete: onComplete, true); }