Files
DeviantMobile-Rohan/Assets/Scripts/RoundsScript.cs

671 lines
27 KiB
C#

using UnityEngine;
using TMPro;
using UnityEngine.UI;
using System.Collections;
using Unity.VisualScripting;
using System;
public class RoundsScript : MonoBehaviour
{
public int roundsToPlay;
public int playerWins;
public int enemyWins;
public int currentRound;
public TextMeshProUGUI roundInfoText;
public TextMeshProUGUI timerText;
public TextMeshProUGUI roundNumberText;
public bool isRoundActive = false;
private float roundTimeInSeconds = 85f;
public float currentTime;
public Sprite[] roundsImages;
public Sprite[] winnerIndicatorImages;
public Sprite[] emptyIndicatorImages;
public Sprite[] roundWinGraphics;
public GameObject R1player;
public GameObject R2player;
public GameObject R3player;
public GameObject R1enemy;
public GameObject R2enemy;
public GameObject R3enemy;
public GameObject roundsInfoGraphic;
public GameObject roundWinGraphic;
private string enemyname;
private string playername;
//Link to Mission Handler Script
//Initialize the scripts
MissionHandler mission_handler;
GameStatsManager game_statsManager;
void OnEnable(){
GameObject gamestatsmanager_go = GameObject.Find("GameStatsManager");
if (gamestatsmanager_go != null) {
game_statsManager = gamestatsmanager_go.GetComponent<GameStatsManager>();
mission_handler = gamestatsmanager_go.GetComponent<MissionHandler>();
} else {
DevLog.LogWarning("GameStatsManager not found - mission tracking will be disabled");
}
}
private void Start()
{
// Skip RoundsScript entirely in Cash System mode - CashSystemManager handles its own game flow
if (SelectionOptions.Instance != null && SelectionOptions.Instance.isCashSystemSelected)
{
DevLog.Log("[RoundsScript] Disabled for Cash System mode - CashSystemManager handles game flow");
enabled = false;
// Hide any rounds-related UI
if (roundInfoText != null) roundInfoText.gameObject.SetActive(false);
if (roundNumberText != null) roundNumberText.gameObject.SetActive(false);
if (roundsInfoGraphic != null) roundsInfoGraphic.SetActive(false);
if (roundWinGraphic != null) roundWinGraphic.SetActive(false);
if (R1player != null) R1player.SetActive(false);
if (R2player != null) R2player.SetActive(false);
if (R3player != null) R3player.SetActive(false);
if (R1enemy != null) R1enemy.SetActive(false);
if (R2enemy != null) R2enemy.SetActive(false);
if (R3enemy != null) R3enemy.SetActive(false);
return;
}
try
{
InitializeUIReferences();
if (roundWinGraphic != null)
roundWinGraphic.SetActive(false);
currentRound = 0;
playerWins = 0; enemyWins = 0; roundsToPlay = 3;
isRoundActive = false;
StartNewRound();
NameCharacters();
}
catch (Exception ex)
{
Debug.LogError($"RoundsScript.Start failed: {ex.Message}\n{ex.StackTrace}");
// Ensure gameplay still starts even if UI lookups fail
isRoundActive = false;
StartNewRound();
}
}
public IEnumerator RespawnDeadPlayer(GameObject character)
{
if (GameObject.FindGameObjectWithTag("Player").GetComponent<HealthNew>().currentHealth > GameObject.FindGameObjectWithTag("Enemy").GetComponent<HealthNew>().currentHealth)
{
//roundInfoText.text = $"{playername} WINS ROUND!";
//replace the sprtite with appropiate character graphic
PlaceRoundWinnerGraphic(playername);
}
else
{
//roundInfoText.text = $"{enemyname} WINS ROUND!";
PlaceRoundWinnerGraphic(enemyname);
}
yield return null;
Time.timeScale = 0f;//pause application for 5sces
yield return new WaitForSecondsRealtime(5.5f);
Time.timeScale = 1;//resume application
roundWinGraphic.SetActive(false);
if (SelectionOptions.Instance.isAISelected)
GameObject.FindGameObjectWithTag("Enemy").GetComponent<CharacterAIController>().attack = true;
else
GameObject.FindGameObjectWithTag("Enemy").GetComponent<PlayerScript>().attack = true;
GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerScript>().attack = true;
GameObject.FindGameObjectWithTag("Player").GetComponent<HealthNew>().ResetHealth();
GameObject.FindGameObjectWithTag("Enemy").GetComponent<HealthNew>().ResetHealth();
GameObject.FindGameObjectWithTag("Enemy").transform.position = new Vector3(6.32f, 0, 0);
GameObject.FindGameObjectWithTag("Player").transform.position = new Vector3(7.32f, 0, 0);
}
public void StartNewRound()
{
try
{
if (roundInfoText == null || roundWinGraphic == null)
{
Debug.LogError("UI references are null in StartNewRound. Attempting to find them.");
InitializeUIReferences();
}
if (roundInfoText != null)
{
roundInfoText.gameObject.SetActive(true);
}
if (roundWinGraphic != null)
{
roundWinGraphic.gameObject.SetActive(false);
}
// make sure this is empty, useful when restarting the gameplay
GameObject uiObject = GameObject.Find("UI");
if (uiObject != null && uiObject.transform.childCount > 0)
{
Transform child = uiObject.transform.GetChild(0);
if (child != null && child.childCount > 11)
{
TextMeshProUGUI textComponent = child.GetChild(11).gameObject.GetComponent<TextMeshProUGUI>();
if (textComponent != null)
{
textComponent.text = "";
}
}
}
//if this is the first ever round
if (currentRound == 0 && gameObject.CompareTag("Player"))
{
//Start of the game, start of the first round
int newRound = GetComponent<RoundsScript>().currentRound + 1;
GetComponent<RoundsScript>().currentRound = newRound;
GameObject.FindGameObjectWithTag("Enemy").GetComponent<RoundsScript>().currentRound = newRound;
if (IsTimerMode())
{
currentTime = roundTimeInSeconds;
if (R1player != null) R1player.GetComponent<Image>().sprite = emptyIndicatorImages[0];
if (R2player != null) R2player.GetComponent<Image>().sprite = emptyIndicatorImages[0];
if (R3player != null) R3player.GetComponent<Image>().sprite = emptyIndicatorImages[0];
if (R1enemy != null) R1enemy.GetComponent<Image>().sprite = emptyIndicatorImages[1];
if (R2enemy != null) R2enemy.GetComponent<Image>().sprite = emptyIndicatorImages[1];
if (R3enemy != null) R3enemy.GetComponent<Image>().sprite = emptyIndicatorImages[1];
StartTimerMode();
}
else
{
StartCoroutine(StartRoundCountdown());
}
}
else if(currentRound > 0)
{
if(gameObject.CompareTag("Player"))
{
int newRound = GetComponent<RoundsScript>().currentRound + 1;
GetComponent<RoundsScript>().currentRound = newRound;
GameObject.FindGameObjectWithTag("Enemy").GetComponent<RoundsScript>().currentRound = newRound;
//GameObject.FindGameObjectWithTag("Player").GetComponent<RoundsScript>().currentRound = newRound;
// Check the mode and perform the appropriate actions
if (IsTimerMode())
{
currentTime = roundTimeInSeconds;
StartTimerMode();
}
else
{
print("player countdown");
StartCoroutine(StartRoundCountdown());
}
}
else if(gameObject.CompareTag("Enemy"))
{
// Start of the game, start of the first round
int newRound = GetComponent<RoundsScript>().currentRound + 1;
GetComponent<RoundsScript>().currentRound = newRound;
GameObject.FindGameObjectWithTag("Player").GetComponent<RoundsScript>().currentRound = newRound;
if (IsTimerMode())
{
currentTime = roundTimeInSeconds;
StartTimerMode();
}
else
{
print("player countdown");
StartCoroutine(StartRoundCountdown());
}
}
}
//Link to Mission Handler Script
//START of each Round
if (mission_handler != null) {
mission_handler.StartOfEachRound(currentRound);
}
if (currentRound == 1 && game_statsManager != null){ //For the Start of the Match
game_statsManager.winsCountedEachMatch();
}
//Debug.LogError("XTP Current Round = " + currentRound.ToString());
}
catch (Exception ex)
{
Debug.LogError($"Error in StartNewRound: {ex.Message}\n{ex.StackTrace}");
}
}
private void InitializeUIReferences()
{
try
{
GameObject uiObject = GameObject.Find("UI");
if (uiObject != null)
{
Transform uiParent = uiObject.transform.GetChild(0);
if (uiParent != null)
{
// Initialize roundInfoText
if (uiParent.childCount > 9)
{
Transform child9 = uiParent.GetChild(9);
if (child9 != null)
{
roundInfoText = child9.GetComponent<TextMeshProUGUI>();
// Initialize roundsInfoGraphic and roundWinGraphic
if (child9.childCount > 0)
roundsInfoGraphic = child9.GetChild(0).gameObject;
if (child9.childCount > 1)
roundWinGraphic = child9.GetChild(1).gameObject;
}
}
// Initialize timer text
if (uiParent.childCount > 12)
{
Transform child12 = uiParent.GetChild(12);
if (child12 != null)
{
if (child12.childCount > 0)
{
Transform child0 = child12.GetChild(0);
if (child0 != null && child0.childCount > 0)
{
timerText = child0.GetChild(0).GetComponent<TextMeshProUGUI>();
}
}
// Initialize round number text
if (child12.childCount > 1)
{
roundNumberText = child12.GetChild(1).GetComponent<TextMeshProUGUI>();
}
// Initialize player/enemy round indicators
if (child12.childCount > 2) R1player = child12.GetChild(2).gameObject;
if (child12.childCount > 3) R2player = child12.GetChild(3).gameObject;
if (child12.childCount > 4) R3player = child12.GetChild(4).gameObject;
if (child12.childCount > 5) R1enemy = child12.GetChild(5).gameObject;
if (child12.childCount > 6) R2enemy = child12.GetChild(6).gameObject;
if (child12.childCount > 7) R3enemy = child12.GetChild(7).gameObject;
}
}
}
}
}
catch (Exception ex)
{
Debug.LogError($"Failed to initialize UI references: {ex.Message}");
}
}
private void StartTimerMode()
{
// Enable the timer UI if it exists (avoid brittle child chains)
var ui = GameObject.Find("UI");
if (ui != null && ui.transform.childCount > 0)
{
var p0 = ui.transform.GetChild(0);
if (p0 != null && p0.childCount > 12)
p0.GetChild(12).gameObject.SetActive(true);
}
if (roundNumberText != null)
roundNumberText.text = $"ROUND {currentRound}";
currentTime = roundTimeInSeconds;
StartCoroutine(StartRoundCountdown());
}
public void UpdateTimerText()
{
if (currentTime > 0)
{
int minutes = Mathf.FloorToInt(currentTime / 60);
int seconds = Mathf.FloorToInt(currentTime % 60);
timerText.text = string.Format("{0:00}:{1:00}", minutes, seconds);
}
else
{
timerText.text = string.Format("{0:00}:{1:00}", 0, 00);
}
}
private System.Collections.IEnumerator StartRoundCountdown()
{
NameCharacters();
if (roundInfoText != null) roundInfoText.text = "";
if (currentRound > 1 && !GameObject.Find("PlayerManager").GetComponent<PlayerManagerNew>().retry && IsTimerMode())
{
if (GameObject.FindGameObjectWithTag("Player").GetComponent<RoundsScript>().playerWins > GameObject.FindGameObjectWithTag("Enemy").GetComponent<RoundsScript>().enemyWins)
{
//roundInfoText.text = $"{playername} WINS ROUND!";
//replace the sprtite with appropiate character graphic
PlaceRoundWinnerGraphic(playername);
}
else
{
//roundInfoText.text = $"{enemyname} WINS ROUND!";
PlaceRoundWinnerGraphic(enemyname);
}
Time.timeScale = 0;//pause application for 5sces
yield return new WaitForSecondsRealtime(5.5f);
Time.timeScale = 1;//resume application
}
else if(currentRound > 1 && !GameObject.Find("PlayerManager").GetComponent<PlayerManagerNew>().retry && !IsTimerMode())
{
if (GameObject.FindGameObjectWithTag("Player").GetComponent<HealthNew>().currentHealth > GameObject.FindGameObjectWithTag("Enemy").GetComponent<HealthNew>().currentHealth)
{
//roundInfoText.text = $"{playername} WINS ROUND!";
//replace the sprtite with appropiate character graphic
PlaceRoundWinnerGraphic(playername);
}
else
{
//roundInfoText.text = $"{enemyname} WINS ROUND!";
PlaceRoundWinnerGraphic(enemyname);
}
Time.timeScale = 0;//pause application for 5sces
yield return new WaitForSecondsRealtime(5.5f);
Time.timeScale = 1;//resume application
}
GameObject.FindGameObjectWithTag("Enemy").transform.position = new Vector3(-2.32f, 0, 0);
GameObject.FindGameObjectWithTag("Player").transform.position = new Vector3(7.32f, 0, 0);
GameObject.FindGameObjectWithTag("Enemy").GetComponent<HealthNew>().ResetHealth();
GameObject.FindGameObjectWithTag("Player").GetComponent<HealthNew>().ResetHealth();
if (roundWinGraphic != null)
roundWinGraphic.SetActive(false);
// Safely set round image
if (roundsInfoGraphic != null && roundsImages != null && roundsImages.Length > 0)
{
int idx = Mathf.Clamp(currentRound - 1, 0, roundsImages.Length - 1);
var img = roundsInfoGraphic.GetComponent<Image>();
if (img != null) img.sprite = roundsImages[idx];
roundsInfoGraphic.SetActive(true);
}
yield return new WaitForSecondsRealtime(2f);
if (roundsInfoGraphic != null)
{
var img = roundsInfoGraphic.GetComponent<Image>();
if (img != null) img.sprite = null;
roundsInfoGraphic.SetActive(false);
}
if (roundInfoText != null) roundInfoText.text = "3";
yield return new WaitForSecondsRealtime(1f);
if (roundInfoText != null) roundInfoText.text = "2";
yield return new WaitForSecondsRealtime(1f);
if (roundInfoText != null) roundInfoText.text = "1";
yield return new WaitForSecondsRealtime(1f);
if (roundInfoText != null) roundInfoText.text = "Fight!";
yield return new WaitForSecondsRealtime(1f);
if (roundInfoText != null) roundInfoText.text = "";
isRoundActive = true;
var enemyRS = GameObject.FindGameObjectWithTag("Enemy")?.GetComponent<RoundsScript>();
if (enemyRS != null) enemyRS.isRoundActive = true;
// Enable attacks without using null-conditional on the assignment target
var enemyGO = GameObject.FindGameObjectWithTag("Enemy");
var playerGO = GameObject.FindGameObjectWithTag("Player");
if (SelectionOptions.Instance.isAISelected)
{
var enemyAI = enemyGO != null ? enemyGO.GetComponent<CharacterAIController>() : null;
if (enemyAI != null) enemyAI.attack = true;
}
else
{
var enemyPlayerScript = enemyGO != null ? enemyGO.GetComponent<PlayerScript>() : null;
if (enemyPlayerScript != null) enemyPlayerScript.attack = true;
}
var playerScript = playerGO != null ? playerGO.GetComponent<PlayerScript>() : null;
if (playerScript != null) playerScript.attack = true;
var pH = playerGO != null ? playerGO.GetComponent<HealthNew>() : null;
var eH = enemyGO != null ? enemyGO.GetComponent<HealthNew>() : null;
if (pH != null) pH.isDead = false;
if (eH != null) eH.isDead = false;
}
public IEnumerator EndRound()
{
if (IsTimerMode())
{
if(SelectionOptions.Instance.isAISelected)
GameObject.FindGameObjectWithTag("Enemy").GetComponent<CharacterAIController>().attack = false;
else
GameObject.FindGameObjectWithTag("Enemy").GetComponent<PlayerScript>().attack = false;
GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerScript>().attack = false;
GameObject.FindGameObjectWithTag("Player").GetComponent<CharacterMovement>().anim.SetFloat("Speed", 0);
isRoundActive = false;
GameObject.FindGameObjectWithTag("Enemy").GetComponent<RoundsScript>().isRoundActive = false;
if (GameObject.FindGameObjectWithTag("Player").GetComponent<RoundsScript>().playerWins > GameObject.FindGameObjectWithTag("Enemy").GetComponent<RoundsScript>().enemyWins)
{
if (currentRound == 1)
{
R1player.GetComponent<Image>().sprite = winnerIndicatorImages[0];
}
else if (currentRound == 2)
{
R2player.GetComponent<Image>().sprite = winnerIndicatorImages[0];
}
else if (currentRound == 3)
{
R3player.GetComponent<Image>().sprite = winnerIndicatorImages[0];
}
}
else if (GameObject.FindGameObjectWithTag("Player").GetComponent<RoundsScript>().playerWins < GameObject.FindGameObjectWithTag("Enemy").GetComponent<RoundsScript>().enemyWins)
{
if (currentRound == 1)
{
R1enemy.GetComponent<Image>().sprite = winnerIndicatorImages[1];
}
else if (currentRound == 2)
{
R2enemy.GetComponent<Image>().sprite = winnerIndicatorImages[1];
}
else if (currentRound == 3)
{
R3enemy.GetComponent<Image>().sprite = winnerIndicatorImages[1];
}
}
//Link to Mission Handler Script
//END of each Round
int playerendHealth = GameObject.FindGameObjectWithTag("Player").GetComponent<HealthNew>().currentHealth;
int enemyendHealth = GameObject.FindGameObjectWithTag("Enemy").GetComponent<HealthNew>().currentHealth;
//DevLog.LogWarning("CR = " + currentRound.ToString() + "|| RS!! with Remaining Health = " + playerendHealth + " Enemy Health = " + enemyendHealth);
string round_status = "round_status", player_character = "char";
//Player has won
if (enemyendHealth == 0)
{
round_status = "player_won";
game_statsManager.addWin();
player_character = GameObject.FindGameObjectWithTag("Player").name;
}
else
{
round_status = "player_lost";
game_statsManager.addLoss();
}
mission_handler.EndOfEachRound(currentRound, round_status, playerendHealth, 100, player_character, enemyendHealth);
if (currentRound < roundsToPlay)
StartNewRound();
else
{
if (GameObject.FindGameObjectWithTag("Player").GetComponent<RoundsScript>().playerWins > GameObject.FindGameObjectWithTag("Enemy").GetComponent<RoundsScript>().enemyWins)
{
//roundInfoText.text = $"{playername} WINS ROUND!";
//replace the sprtite with appropiate character graphic
PlaceRoundWinnerGraphic(playername);
}
else
{
//roundInfoText.text = $"{enemyname} WINS ROUND!";
PlaceRoundWinnerGraphic(enemyname);
}
Time.timeScale = 0;//pause application for 5sces
yield return new WaitForSecondsRealtime(5.5f);
Time.timeScale = 1;//resume application
EndGame();
}
}
else
{
if(SelectionOptions.Instance.isAISelected)
GameObject.FindGameObjectWithTag("Enemy").GetComponent<CharacterAIController>().attack = false;
else
GameObject.FindGameObjectWithTag("Enemy").GetComponent<PlayerScript>().attack = false;
GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerScript>().attack = false;
isRoundActive = false;
GameObject.FindGameObjectWithTag("Enemy").GetComponent<RoundsScript>().isRoundActive = false;
//Link to Mission Handler Script
//END of each Round
int playerendHealth = GameObject.FindGameObjectWithTag("Player").GetComponent<HealthNew>().currentHealth;
int enemyendHealth = GameObject.FindGameObjectWithTag("Enemy").GetComponent<HealthNew>().currentHealth;
//DevLog.LogWarning("CR = " + currentRound.ToString() + "|| RS!! with Remaining Health = " + playerendHealth + " Enemy Health = " + enemyendHealth);
string round_status = "round_status", player_character = "char";
//Player has won
if (enemyendHealth == 0)
{
round_status = "player_won";
game_statsManager.addWin();
player_character = GameObject.FindGameObjectWithTag("Player").name;
}
else
{
round_status = "player_lost";
game_statsManager.addLoss();
}
mission_handler.EndOfEachRound(currentRound, round_status, playerendHealth, 100, player_character, enemyendHealth);
/*
Round 1: CR = 1|| RS!! with Remaining Health = 0 Enemy Health = 66 Enemy Won
Round 2: CR = 2|| RS!! with Remaining Health = 0 Enemy Health = 70 Enemy Won
Round 3: CR = 3|| RS!! with Remaining Health = 28 Enemy Health = 0 Player Won
*/
if (currentRound < roundsToPlay)
{
StartNewRound();
}
else
{
if (GameObject.FindGameObjectWithTag("Player").GetComponent<HealthNew>().currentHealth > GameObject.FindGameObjectWithTag("Enemy").GetComponent<HealthNew>().currentHealth)
{
//roundInfoText.text = $"{playername} WINS ROUND!";
//replace the sprtite with appropiate character graphic
PlaceRoundWinnerGraphic(playername);
}
else
{
//roundInfoText.text = $"{enemyname} WINS ROUND!";
PlaceRoundWinnerGraphic(enemyname);
}
Time.timeScale = 0;//pause application for 5sces
yield return new WaitForSecondsRealtime(5.5f);
Time.timeScale = 1;//resume application
EndGame();
}
}
}
public bool IsTimerMode()
{
if (SelectionOptions.Instance.isTimeSelected)
return true;
return false;
}
public void EndGame()
{
GetComponent<HealthNew>().OnDeath();
}
public void PlaceRoundWinnerGraphic(string name)
{
roundWinGraphic.SetActive(true);
switch (name)
{
case "AMIRA":
roundWinGraphic.GetComponent<Image>().sprite = roundWinGraphics[1];
break;
case "AMON":
roundWinGraphic.GetComponent<Image>().sprite = roundWinGraphics[3];
break;
case "ZIGGY":
roundWinGraphic.GetComponent<Image>().sprite = roundWinGraphics[0];
break;
case "HANNIBAL":
roundWinGraphic.GetComponent<Image>().sprite = roundWinGraphics[4];
break;
case "IMANI":
roundWinGraphic.GetComponent<Image>().sprite = roundWinGraphics[5];
break;
case "WINDHAM":
roundWinGraphic.GetComponent<Image>().sprite = roundWinGraphics[6];
break;
case "BAHMAN":
roundWinGraphic.GetComponent<Image>().sprite = roundWinGraphics[2];
break;
case "ZIGGY NEW":
roundWinGraphic.GetComponent<Image>().sprite = roundWinGraphics[7];
break;
}
}
private void NameCharacters()
{
GameObject enemyObj = GameObject.FindGameObjectWithTag("Enemy");
GameObject playerObj = GameObject.FindGameObjectWithTag("Player");
enemyname = enemyObj ? CharacterPrefabManager.Instance.GetCharacterDisplayName(enemyObj) : "UNKNOWN";
playername = playerObj ? CharacterPrefabManager.Instance.GetCharacterDisplayName(playerObj) : "UNKNOWN";
}
}