using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.Events; using Ambiance; using OHM.UnityToolkit.FSM; using OHM.UnityToolkit.Pooling; public class CoreController : CoreBehaviour { [SerializeField] public CoreDef def; [SerializeField] public CamController cam; [SerializeField] public ScoreController scoreController; [SerializeField] private Transform dynamicCont; [SerializeField] public PickupSkinProvider pickupSkinProvider; [HideInInspector] public UnityEvent onWarmup; [HideInInspector] public UnityEvent onGameStarted; [HideInInspector] public UnityEvent onGameWon; [HideInInspector] public UnityEvent onGameOver; [NonSerialized] public List
debugForcedLevel; private List
_currentLevelPrefabs; private List
previousSectionsToRemove; [NonSerialized] public int keyCountToSpawn; public CoreCurrenciesController currenciesController = new CoreCurrenciesController(); private System.Random random = new System.Random(); private int _currentSeed; public FiniteStateMachine GameStateMachine = new FiniteStateMachine(); public GameStateType GS_WARMUP; public GameStateType GS_STARTED; public GameStateType GS_WON; public GameStateType GS_GAME_OVER; public float progressionRatio; private Coroutine _warmupCoroutine; private PlayerSkinDef _playerSkinDef; public List
CurrentSections { get; private set; } public int CurrentSectionIndex { get; private set; } public List
CurrentLevelPrefabs => _currentLevelPrefabs; public long CurrentLevelIdx { get; private set; } public Player CurrentPlayer { get; private set; } public static event Action OnSectionCreated; public void Awake() { GS_WARMUP = new GameStateType { startAction = EnterWarmup }; GS_STARTED = new GameStateType { startAction = EnterGame, updateAction = GameUpdate, getInputsListenerFunc = GameGetInputsListener }; GS_WON = new GameStateType { startAction = EnterWon }; GS_GAME_OVER = new GameStateType { startAction = EnterGameOver }; GameStateMachine = new FiniteStateMachine(); } private void Update() { GameStateMachine.Update(); } public void Warmup(long levelIdx) { bool levelChanged = CurrentLevelIdx != levelIdx; if (levelChanged) { previousSectionsToRemove = ((def.GetProgression().removePreviousSectionsForNextGame && _currentLevelPrefabs != null) ? new List
(_currentLevelPrefabs) : null); } int seed; if (!levelChanged && def.GetProgression().replaySameLevelsAfterGameOver) { seed = _currentSeed; } else { seed = (_currentSeed = random.Next()); } random = new System.Random(seed); CurrentLevelIdx = levelIdx; GameStateMachine.SetState(GS_WARMUP); } private void EnterWarmup() { Cleanup(); SetupAmbiance(); if (_warmupCoroutine != null) { StopCoroutine(_warmupCoroutine); } _warmupCoroutine = StartCoroutine(WarmupCoroutine()); } private IEnumerator WarmupCoroutine() { yield return new WaitForEndOfFrame(); GenerateLevel(); yield return CreateCurrentSection(); CurrentPlayer = CreatePlayer(); scoreController.InitScore(CurrentPlayer.richManagePlayer.curScore); cam.Warmup(); onWarmup.Invoke(); } public void ChangeRichValueStartRV() { CurrentPlayer.richManagePlayer.SetRichPoorValue(base.CoreDef.player.richValueStartABTestStartRich, true); } private void SetupAmbiance() { int levelIdx = (int)CurrentLevelIdx; AmbianceController.Instance.SetLevelIdx(levelIdx, onFire: false, forceReload: true); } private void Cleanup() { scoreController.Reset(); currenciesController.Reset(); CurrentSections = new List
(); CurrentPlayer = null; PoolsManager.ReleaseAllPooledChildren(dynamicCont); var children = new List(); foreach (Transform child in dynamicCont) { children.Add(child); } foreach (Transform child in children) { PoolsManager.ReleaseObject(child.gameObject); } } public bool IsReadyToPlay() { return CurrentPlayer != null && CurrentPlayer.IsReady; } public void GenerateLevel() { List
generated = LevelGenerator.GenerateLevel(base.CoreDef, CurrentLevelIdx, random, debugForcedLevel, previousSectionsToRemove); debugForcedLevel = null; CurrentSectionIndex = 0; _currentLevelPrefabs = CreateAllSection(generated); } private Section CreateSection(Section prefab, Transform pos) { Section section = UnityEngine.Object.Instantiate(prefab, dynamicCont); section.Setup(base.CoreDef); if (pos != null) { section.transform.position = pos.position; section.transform.rotation = pos.rotation; } CurrentSections.Add(section); return section; } private List
CreateAllSection(List
sectionsPrefabs) { var result = new List
(); bool turnRight = UnityEngine.Random.Range(0, 1) == 0; ProgressionDef progression = def.GetProgression(); bool useTurn = progression.useTurn; int sinceTurn = 0; for (int i = 0; i < sectionsPrefabs.Count; i++) { result.Add(sectionsPrefabs[i]); if (useTurn && i != 0 && i < sectionsPrefabs.Count - 2 && sinceTurn >= progression.turnEachSection) { result.Add(turnRight ? progression.GroundRight : progression.GroundLeft); result.Add(progression.SafeZone); sinceTurn = 0; turnRight = !turnRight; } sinceTurn++; } return result; } private IEnumerator CreateCurrentSection() { Transform pos = null; for (int i = 0; i < _currentLevelPrefabs.Count; i++) { Section section = CreateSection(_currentLevelPrefabs[i], pos); yield return new WaitForEndOfFrame(); pos = section.endLevel; } yield return new WaitForEndOfFrame(); } private Player CreatePlayer() { Player player = UnityEngine.Object.Instantiate(_playerSkinDef.prefab, dynamicCont); player.transform.position = Vector3.zero; player.onWin = (Action)Delegate.Combine(player.onWin, new Action(Win)); player.onLose = (Action)Delegate.Combine(player.onLose, new Action(GameOver)); player.richManagePlayer.onUpdateScore += OnUpdateScore; cam.SetTarget(player); return player; } public void SetPlayerSkin(PlayerSkinDef skin) { _playerSkinDef = skin; if (CurrentPlayer == null) { return; } bool wasShopMode = CurrentPlayer.ShopMode; UnityEngine.Object.Destroy(CurrentPlayer.gameObject); CurrentPlayer = CreatePlayer(); if (wasShopMode) { CurrentPlayer.ShopSkinMode(); } } public void Go() { if (IsReadyToPlay()) { CurrentPlayer.Go(); onGameStarted.Invoke(); GameStateMachine.SetState(GS_STARTED); } } private void EnterGame() { UnityEngine.Debug.Log("Enter Game"); cam.Go(); } private void GameUpdate() { } private IInputsListener GameGetInputsListener() { return CurrentPlayer.movePlayer.swerveInput; } private void OnUpdateScore(long score) { scoreController.UpdateScore(score, CurrentPlayer.movePlayer.transform, ScoreController.ScoreType.DEFAULT_SCORE); } private void Win(int multCurrency) { scoreController.SetMultCurrency(multCurrency); cam.Win(true); GameStateMachine.SetState(GS_WON); } private void EnterWon() { UnityEngine.Debug.Log("VICTORY"); onGameWon.Invoke(); } public void WinCurrencies() { currenciesController.WinCurrency((int)scoreController.Score, CurrentPlayer.movePlayer.transform); } public void WinCurrenciesRaw(int rawValue) { currenciesController.WinCurrency(rawValue, CurrentPlayer.movePlayer.transform); } private void GameOver() { cam.GameOver(); GameStateMachine.SetState(GS_GAME_OVER); } private void EnterGameOver() { UnityEngine.Debug.Log("GAME OVER"); onGameOver.Invoke(); } public IInputsListener GetCurrentInputsListener() { Func func = GameStateMachine.CurrentState?.getInputsListenerFunc; return (func != null) ? func() : null; } }