using PrizeSystem; using System.Collections; using TMPro; using UnityEngine; using UnityEngine.UI; public enum GameMode { pve, pvp } public class GameManager : MonoBehaviour { public int Rows = 7, Cols = 7; public PlayerStatsService StatsService; public int botsAmount = 5; [Header("General")] public GameStateMachine stateMachine; public static GameManager instance; public GameObject AdminPanel, NumberPanel; public TimerManager timerManager; public RulesController rulesController; public ChipPointer chipPointer; [Header("Menu")] public GameMode gameMode; public Transform boardTransform, noPrizeLabel; [Header("Scores")] public int player1score = 0, player2score = 0, vsBotScore = 0; private bool increaseVsBotTimer = false; public int vsBotMoves; public float vsBotThinkTime; public VictoryScale botScale, Player1Scale, Player2Scale; [HideInInspector] public CheckResult lastResult; [Header("Gameplay")] public GameObject player1Chip; public GameObject player2Chip; public GameObject botChip; public Chip chipPrefab; [HideInInspector] public Chip currentChip; [HideInInspector] public CellState currentPlayer = CellState.Player2; public bool canReturnToMenu = false; //todo: разобраться нафига эта переменная // Кешированные компоненты для избежания GetComponent в DrawAnimation [Header("Панели ввода")] public TextInput nameInput; public TextInput ValutaNameInput; public TextInput NumberTech; public NumberInput pricePveInput; public NumberInput pricePvpInput; public NumberInput pricePveRevengeInput; public NumberInput prizesAvailableInput; public NumberInput pulsesToResetDifficultyInput; public NumberInput valutaPerPulseInput; public Leaderboard leaderboard; public GameObject CharactersConfigurator; public PvpPointer pvpPointer; public MovesAndTimeCounter movesAndTimeCounter; public GameObject setPasswordPanel; public EnterPasswordPanel enterPasswordPanel; public VitrinaPanel vitrinaPanel; public QrPanel qrPanel; public TakeOrRiskPanel takeOrRiskPanel; public void Initialize() { if (instance == null) { instance = this; } ComWrapper.PaymentReceived += ProcessDifficultyCounter; ProcessDifficultyCounter(); SettingsManager.OnSettingsChanged.AddListener(ProcessDifficultyCounter); StatsService = new(); StatsService.Initialize(); StartCoroutine(AddBotRecordEvery2Days());// добавлять каждые 2 дня запись stateMachine.ChangeState(new MenuState()); } private void OnApplicationQuit() => ComNativeWrapper.Serial_CloseAll(); private void Update() { #if UNITY_EDITOR if (Input.GetKeyDown(KeyCode.G)) { PrizeSystemManager.GivePrize(PrizeUtils.CreatePrize(CountablePrizeType.Hopper, 1)); } if (Input.GetKeyDown(KeyCode.O)) { PlayerPrefs.SetInt("PrizeGivenBuffer", 1); } #endif if (increaseVsBotTimer) vsBotThinkTime += Time.deltaTime; } public void StartVsBotTimer() => increaseVsBotTimer = true; public void StopVsBotTimer() => increaseVsBotTimer = false; public void spawnChip() { GameObject chipToSpawn; if (gameMode == GameMode.pvp) chipToSpawn = currentPlayer == CellState.Player1 ? player1Chip : player2Chip; else chipToSpawn = currentPlayer == CellState.Player1 ? player1Chip : botChip; currentChip = Instantiate(chipPrefab, new Vector2(0, 20), Quaternion.identity); currentChip.Team = currentPlayer; if (currentPlayer == CellState.Player2) currentChip.GetComponentInChildren().sprite = CharacterController.CurrentChipImage; } public void SwitchPlayer() { currentPlayer = currentPlayer == CellState.Player1 ? CellState.Player2 : CellState.Player1; } public void SetMode(GameMode mode) => gameMode = mode; public void InitVictoryScales() { //Включить и обнулить нужные шкалы player1score = 0; player2score = 0; vsBotScore = 0; switch (gameMode) { case GameMode.pvp: botScale.gameObject.SetActive(false); Player1Scale.gameObject.SetActive(true); Player2Scale.gameObject.SetActive(true); Player1Scale.SetSlotsCount(5); Player2Scale.SetSlotsCount(5); Player1Scale.ResetScale(); Player2Scale.ResetScale(); break; case GameMode.pve: botScale.gameObject.SetActive(true); botScale.SetSlotsCount(botsAmount); Player1Scale.gameObject.SetActive(false); Player2Scale.gameObject.SetActive(false); botScale.ResetScale(); break; } } public void IncreaseScoreAndScaleOfPlayer(CellState player) { if (player == CellState.Player1) { player1score += 1; Player1Scale.SetMedalsCount(player1score); } else { player2score += 1; Player2Scale.SetMedalsCount(player2score); } } public void ProcessDifficultyCounter()//вызывается каждый раз, когда приходит COIN с платы или обновились настройки { string previous = PlayerPrefs.GetString("PreviousBaseBotDifficulty", "Обычная"); string difficultyType = SettingsManager.GetString("BaseBotDifficulty", "?"); //Инициализация if (!PlayerPrefs.HasKey("PulsesToResetDifficulty")) PlayerPrefs.SetInt("PulsesToResetDifficulty", 100); //если переход с повышенной на обычную - сброс счетчика if (previous == "Повышенная" && difficultyType != previous) { PaymentSystem.ResetPulsesCounter(); } PlayerPrefs.SetString("PreviousBaseBotDifficulty", difficultyType); if (difficultyType == "Повышенная") { int pulses = PaymentSystem.PulsesCounter; int pulsesToResetDifficulty = PlayerPrefs.GetInt("PulsesToResetDifficulty", 10); if (pulses >= pulsesToResetDifficulty) { PaymentSystem.ResetPulsesCounter(); Setting difficultySetting = SettingsManager.Container.TryGetSetting("BaseBotDifficulty"); difficultySetting.StringValue = "Обычная"; SettingsManager.OnSettingsChanged?.Invoke(); SettingsManager.SaveContainerToFile(); AdminPanel.GetComponent().RefreshViews(); print("Сложность сброшена"); } } } public void PrepareRound(CellState firstPlayer) { currentPlayer = firstPlayer; timerManager.SetupTimers(gameMode); if (gameMode == GameMode.pve) { timerManager.SetActiveTimer(CellState.Player1); int difficultyIndex = DifficultyManager.Instance.currentOpponent; CharacterController.SwitchToCharacter(difficultyIndex); } else if (gameMode == GameMode.pvp) DualAvatarController.Instance.ShowCharacters(); VitrinaView.Instance.ActivateIfNeed(); DetermineNextTurn(switchPlayer: false); } public void DetermineNextTurn(bool switchPlayer = true) { if (switchPlayer) SwitchPlayer(); spawnChip(); if (gameMode == GameMode.pvp)//переключаем таймеры только в pvp { timerManager.SetActiveTimer(currentPlayer); LightUtility.Player(currentPlayer); } if (currentPlayer == CellState.Player1) { stateMachine.ChangeState(new PositioningState()); } else { IState nextState; if (gameMode == GameMode.pvp) nextState = new PositioningState(); else nextState = new BotThinkingState(CharacterController.CurrentCharacter.ThinkTime); stateMachine.ChangeState(nextState); } } public void ResetGameSession() { vsBotThinkTime = 0; StopVsBotTimer(); vsBotMoves = 0; movesAndTimeCounter.SetVisibility(false); CharacterController.HideCharacter(); CharacterController.I.SetAllCharactersPrizeAvailable(true); DualAvatarController.Instance.HideCharacters(); DifficultyManager.Instance.ResetDifficulty(); player1score = 0; player2score = 0; vsBotScore = 0; VitrinaView.Instance.Deactivate(); canReturnToMenu = true; } IEnumerator AddBotRecordEvery2Days() { while (true) { yield return new WaitForSeconds(3600f); // ✅ Проверка каждый час double lastRecordTime = PlayerPrefs.GetFloat("LastBotRecord", 0); double currentTime = Utils.GetUnixTimestamp(); if (currentTime - lastRecordTime >= 172800f) { StatsService.AddDailyRecord(); PlayerPrefs.SetFloat("LastBotRecord", (float)currentTime); PlayerPrefs.Save(); } } } }