chip-gameV3/Assets/Scripts/Common/GameManager.cs

284 lines
8.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using PrizeSystem;
using System;
using System.Collections;
using UnityEngine;
public enum GameMode { pve, pvp }
public class GameManager : MonoBehaviour
{
public static event Action<GameMode> OnGameStarted;
public static event Action<GameMode> 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 Team currentPlayer = Team.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 == Team.Player1 ? player1Chip : player2Chip;
else
chipToSpawn = currentPlayer == Team.Player1 ? player1Chip : botChip;
currentChip = Instantiate(chipPrefab, new Vector2(0, 20), Quaternion.identity);
currentChip.team = currentPlayer;
if (currentPlayer == Team.Player2)
currentChip.GetComponentInChildren<SpriteRenderer>().sprite = CharactersController.CurrentCharacter.chipImage;
}
public void SwitchPlayer()
{
currentPlayer = currentPlayer == Team.Player1 ? Team.Player2 : Team.Player1;
}
public void SetMode(GameMode mode) => gameMode = mode;
public void IncreaseScore(Team player)
{
if (player == Team.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<SettingsScreen>().RefreshViews();
// print("Сложность сброшена");
//}
}
}
public void PrepareRound(Team firstPlayer)
{
currentPlayer = firstPlayer;
timerManager.SetupTimers(gameMode);
if (gameMode == GameMode.pve)
{
timerManager.SetActiveTimer(Team.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 == Team.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();
}
}
}
}