using Code.Example.Platformer.Entity; using Code.Example.Platformer.Level; using Code.Infrastructure.App; using Code.Infrastructure.Audio; using Code.Infrastructure.Camera; using Code.Infrastructure.EventBus; using Code.Infrastructure.Generators; using Code.Infrastructure.Input; using Code.Infrastructure.Loadings; using Code.Infrastructure.SceneLoader; using Code.Infrastructure.UI; using Reflex.Core; using Unity.Cinemachine; using UnityEngine.SceneManagement; namespace Code.Example.Platformer { [State(typeof(AppStates),typeof(AppStateMachineContext))] [StateRaisingEvent] public partial class PlatformerState : IOnPlatformerSceneLoadedHandler, IOnPlatformer2SceneLoadedHandler, IOnPlatformer3SceneLoadedHandler, ICinematicMachineHandle, IPlatformerEnemyLoadedHandle, IPlatformerPlayerLoadedHandle, IPlatformerPlayerSpawnedHandle, IReadyToPlayHandle, IPlayerReachedFinishHandle { private IPlatformerEnemyFactory _enemyFactory; private IPlatformerPlayerFactory _playerFactory; private PlatformerFirstLevelData _currentLevelData; private Entity.Entity _playerEntity; private IAudioFactory _audioFactory; private Container _fixdamncontainer; private Loading _loading; public PlatformerState(AppStateMachineContext context, EventBus eventBus) : base(context, eventBus) { } public override AppStates myState => AppStates.Platformer; protected override void OnEnterState() { EventBus.Subscribe(this); // Dependency scene // Level scene // Camera // Enemy snail // Enemy bee // Enemy boar // Player // Music _loading = new(8, InitialLoadingCompleted); Context.UIService.OpenPanel(UIPanelType.Loading); Context.SceneLoader.LoadSceneAsync(SceneId.Platformer, LoadSceneMode.Single).Forget(); Context.InputService.EnableMap(ActionMappings.Platformer); Context.CameraFactory.LoadCinemachineCamera(CameraMode.Platformer).Forget(); } private void InitialLoadingCompleted() { Context.UIService.ClosePanel(UIPanelType.Loading); _enemyFactory.SpawnEnemy(PlatformerEntityType.Boar, _currentLevelData.enemySpawnPoints[0].position); _playerFactory.SpawnPlayer(_currentLevelData.playerCheckPoints[0].position); } protected override void OnExitState() { _enemyFactory.ReleaseEnemy(PlatformerEntityType.Bee); _enemyFactory.ReleaseEnemy(PlatformerEntityType.Snail); _enemyFactory.ReleaseEnemy(PlatformerEntityType.Boar); _playerFactory.ReleasePlayer(); Context.CameraFactory.ReleaseCinemachineCamera(CameraMode.Platformer); EventBus.Unsubscribe(this); Context.InputService.DisableMap(ActionMappings.Platformer); _audioFactory.ReleaseAudios(AudioNames.Platformer); } public void CinemachineLoaded(CinemachineCamera cinemachineCamera) { _loading.DoProgress(); } public void PlatformerEnemyLoaded(PlatformerEntityType type, Entity.Entity entity) { if(entity) _loading.DoProgress(); } public void PlatformerPlayerLoaded() { _loading.DoProgress(); } public void PlatformerPlayerSpawned(Entity.Entity entity) { _playerEntity = entity; Context.CameraFactory.GetCinematicCamera(CameraMode.Platformer).Follow = entity.transform; } public void OnReadyToPlay(AudioNames groupName) { if(groupName == AudioNames.Platformer) _loading.DoProgress(); } public void PlayerReachedFinish() { _loading = new(1, Level2LoadingCompleted); Context.UIService.OpenPanel(UIPanelType.Loading); _playerEntity.Freeze(); SceneManager.MoveGameObjectToScene(_playerEntity.gameObject, Context.SceneLoader.GetScene(SceneId.Platformer)); Context.SceneLoader.UnloadSceneAsync(SceneId.Platformer2).Forget(); Context.SceneLoader.LoadSceneAsync(SceneId.Platformer3, LoadSceneMode.Additive).Forget(); } private void Level2LoadingCompleted() { Context.UIService.ClosePanel(UIPanelType.Loading); _enemyFactory.SpawnEnemy(PlatformerEntityType.Boar, _currentLevelData.enemySpawnPoints[0].position); _playerEntity.transform.position = _currentLevelData.playerCheckPoints[0].position; _playerEntity.UnFreeze(); } public void OnPlatformerSceneLoaded() { Context.SceneLoader.LoadSceneAsync(SceneId.Platformer2, LoadSceneMode.Additive).Forget(); } public void OnPlatformerSceneInitialized(Container container) { _fixdamncontainer = container; _audioFactory = container.Resolve(); _audioFactory.LoadAudioClips(AudioNames.Platformer); _enemyFactory = container.Resolve(); _enemyFactory.WarmEnemy(PlatformerEntityType.Bee); _enemyFactory.WarmEnemy(PlatformerEntityType.Boar); _enemyFactory.WarmEnemy(PlatformerEntityType.Snail); _playerFactory = container.Resolve(); _playerFactory.WarmPlayer(); _loading.DoProgress(); } public void OnPlatformer2SceneLoaded() { SceneManager.SetActiveScene(Context.SceneLoader.GetScene(SceneId.Platformer2)); } public void OnPlatformer2SceneInitialized(Container container) { _currentLevelData = container.Resolve(); _loading.DoProgress(); } public void OnPlatformer3SceneLoaded() { } public void OnPlatformer3SceneInitialized(Container container) { _currentLevelData = container.Resolve(); _loading.DoProgress(); } } public interface IPlayerReachedFinishHandle : IGlobalSubscriber { void PlayerReachedFinish(); } }