using PrizeSystem; using System; using System.Collections; using UnityEngine; public enum GameMode { pve, pvp } public class GameManager : MonoBehaviour { public static event Action OnGameStarted; public static event Action OnGameFinished; public event Action OnRoundStarted; 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; [HideInInspector] public CellState currentPlayer = CellState.Player2; [Header("Scores")] public int player1score = 0, player2score = 0, vsBotScore = 0; private bool increaseVsBotTimer = false; public int vsBotMoves; public float vsBotThinkTime; [HideInInspector] public CheckResult lastResult; [Header("Gameplay")] public GameObject player1Chip; public GameObject player2Chip; public GameObject botChip; public Chip chipPrefab; [HideInInspector] public Chip currentChip; public bool canReturnToMenu = false; //todo: разобраться нафига эта переменная [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; [Header("Переходы")] [SerializeField] private MenuGameplayTransit menuGameplayTransit; //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+=ProcessDifficultyCounter; StatsService = new(); StatsService.Initialize(); StartCoroutine(AddBotRecordEvery2Days());// добавлять каждые 2 дня запись //stateMachine.ChangeState(new MenuState()); } public void TryEnterGame(GameMode mode) { if (!PaymentSystem.TryPayForMode(mode)) return; SetMode(mode); menuGameplayTransit.GotoGameplay(); OnGameStarted?.Invoke(gameMode); //timerManager.SetTimersActivity(gameMode); } private void OnApplicationQuit() => ComNativeWrapper.Serial_CloseAll(); private void Update() { if (increaseVsBotTimer) vsBotThinkTime += Time.deltaTime; } public void GotoMenu() { print("ПЕРЕХОД в МЕНЮ"); } 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 = CharactersController.CurrentCharacter.chipImage; } public void SwitchPlayer() { currentPlayer = currentPlayer == CellState.Player1 ? CellState.Player2 : CellState.Player1; } public void SetMode(GameMode mode) => gameMode = mode; public void IncreaseScore(CellState player) { if (player == CellState.Player1) player1score += 1; else player2score += 1; } public void ProcessDifficultyCounter()//вызывается каждый раз, когда приходит COIN с платы или обновились настройки { string previous = PlayerPrefs.GetString("PreviousBaseBotDifficulty", "Прохождение"); string difficultyType = SettingsManager.GetString(SettingKey.DIFFICULTY_MODE); //Инициализация 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); //todo: разобраться //if (pulses >= pulsesToResetDifficulty) //{ // PaymentSystem.ResetPulsesCounter(); //Setting difficultySetting = SettingsManager.Container.TryGetSetting(SettingKeys.DIFFICULTY_MODE); // 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; CharactersController.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(CharactersController.CurrentCharacter.ThinkTime); stateMachine.ChangeState(nextState); } } public void ResetGameSession() { vsBotThinkTime = 0; StopVsBotTimer(); vsBotMoves = 0; //movesAndTimeCounter.SetVisibility(false); CharactersController.HideCharacter(); CharactersController.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(); } } } }