chip-gameV3/Assets/Scripts/Common/GameManager.cs
sega f32d7dd69b Как вот это вот описать...
Было очень много экстренных ситуаций.
И по мне стреляли, и я упал в лужу нахуй блять, и лежал нахуй
2026-07-29 15:05:01 +03:00

317 lines
9.6 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.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 дня запись
}
private void OnApplicationQuit() => ComNativeWrapper.Serial_CloseAll();
private void Start()
{
stateMachine.ChangeState(new MenuState());
Instantiate(new GameObject()).AddComponent(typeof(VfxPrefab));
}
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<SpriteRenderer>().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<SettingsScreen>().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();
}
}
}
}