using System; using System.Collections; using Mirror; using UnityEngine; using UnityEngine.Networking; public class GameTutorialManager : MonoBehaviour { public const string CpuOpponentName = "CPU"; public const string DefaultGameSceneName = "Game"; public static bool tutorialModeTrigger = false; public bool isTutorial = false; public static bool tutorialModeEnabled = false; public AiBotController aiController; void Awake() { tutorialModeEnabled = false; if (isTutorial) tutorialModeTrigger = true; if (tutorialModeTrigger) tutorialModeEnabled = true; tutorialModeTrigger = false; } void OnDestroy() { if (tutorialModeEnabled) tutorialModeEnabled = false; } void Start() { if (tutorialModeEnabled) { NetworkManager.singleton.networkAddress = "localhost"; NetworkManager.singleton.StartHost(); StartCoroutine(SetupAiWhenReady()); } } /// Call from the main menu before loading the game scene. public static void PrepareLaunch(MatchmadePlayer myPlayer, MatchmadePlayer cpuPlayer, Team myTeam = Team.Red) { LoginManager.ClearMatchYourTeam(); GameManager.MyTeam = myTeam; GameManager.MatchRcPrizeCoins = 0; GameManager.ConfigureDedicatedMatchReporting(0); if (myTeam == Team.Red) { GameManager.RedPlayer = myPlayer; GameManager.BluePlayer = cpuPlayer; } else { GameManager.RedPlayer = cpuPlayer; GameManager.BluePlayer = myPlayer; } LevelLoadManager.myPlayer = myPlayer; LevelLoadManager.opponentPlayer = cpuPlayer; if (LevelLoadManager.instance != null) LevelLoadManager.instance.SetupMatchMade(myTeam, myPlayer, cpuPlayer, "0 RC"); tutorialModeTrigger = true; } public static MatchmadePlayer CreateCpuOpponent() { return new MatchmadePlayer { Name = CpuOpponentName, l10_wins = 10, l10_losses = 0 }; } public static MatchmadePlayer CreateMyPlayerFromUser(UserData user) { return new MatchmadePlayer { Name = user.username, UserId = user.id, rc = user.rc }; } public static IEnumerator CoFetchPlayerL10(MatchmadePlayer player) { if (player == null || player.UserId <= 0) yield break; string baseUrl = (GameManager.DedicatedInternalApiBase ?? LoginManager.AuthBaseUrl ?? "").TrimEnd('/'); if (string.IsNullOrEmpty(baseUrl)) yield break; string url = baseUrl + "/players/" + player.UserId + "/l10"; using (var req = UnityWebRequest.Get(url)) { yield return req.SendWebRequest(); if (req.result != UnityWebRequest.Result.Success) { Logger.Log("Tutorial L10 fetch failed: " + req.error + " " + url); yield break; } var resp = JsonUtility.FromJson(req.downloadHandler.text); if (resp != null && resp.ok) { player.l10_wins = resp.l10_wins; player.l10_losses = resp.l10_losses; } } } [Serializable] class PlayerL10Response { public bool ok; public int player_id; public int l10_wins; public int l10_losses; } IEnumerator SetupAiWhenReady() { float timeout = 5f; while (NetPlayer.localPlayer == null && timeout > 0f) { timeout -= Time.deltaTime; yield return null; } Team playerTeam = NetPlayer.localPlayer != null ? NetPlayer.localPlayer.myTeam : GameManager.MyTeam; Team opponentTeam = playerTeam == Team.Red ? Team.Blue : Team.Red; if (GameManager.instance.SelectedTeam != playerTeam) GameManager.instance.SwitchTeams(); aiController.Setup(opponentTeam); } }