284 lines
8.7 KiB
C#
284 lines
8.7 KiB
C#
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;
|
||
|
||
[SerializeField] Player player1;
|
||
|
||
//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);
|
||
|
||
player1.PrepareChip();
|
||
ControlsPerformer.Instance.SetControlable(player1);
|
||
//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();
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
} |