Untitled
unknown
plain_text
2 years ago
18 kB
8
Indexable
// Copyright (C) 2019-2022 gamevanilla. All rights reserved.
// This code can only be used under the standard Unity Asset Store EULA,
// a copy of which is available at http://unity3d.com/company/legal/as_terms.
using DG.Tweening;
using System.Collections;
using TMPro;
using Unity.Entities;
using UnityEngine;
using UnityEngine.Assertions;
using Image = UnityEngine.UI.Image;
using Random = UnityEngine.Random;
namespace FruitSwipeMatch3Kit
{
/// <summary>
/// This class manages the high-level logic of the game screen.
/// </summary>
public class GameScreen : BaseScreen, IRestartable
{
public GameConfiguration GameConfig;
public int LevelNumber;
#pragma warning disable 649
[SerializeField]
private GoalsWidget goalsWidget;
[SerializeField]
private ScoreWidget scoreWidget;
[SerializeField]
private GameObject topCanvas;
[SerializeField]
private BuyPowerupsWidget buyPowerupsWidget;
[SerializeField]
private Canvas powerupCanvas;
[SerializeField]
private Image powerupImage;
[SerializeField]
private TextMeshProUGUI powerupText;
[SerializeField]
private CheckForFreeLives freeLivesChecker;
#pragma warning restore 649
public LevelData LevelData => levelData;
public GameState GameState => gameState;
private LevelData levelData;
private GameState gameState;
private bool isPlayingEndGameSequence;
public bool IsPlayingEndGameSequence => isPlayingEndGameSequence;
private bool playerWon;
private bool playerLost;
private void Awake()
{
Assert.IsNotNull(goalsWidget);
Assert.IsNotNull(scoreWidget);
Assert.IsNotNull(topCanvas);
Assert.IsNotNull(buyPowerupsWidget);
Assert.IsNotNull(powerupCanvas);
Assert.IsNotNull(powerupImage);
Assert.IsNotNull(powerupText);
Assert.IsNotNull(freeLivesChecker);
}
protected override void Start()
{
base.Start();
InitializeLevel();
OpenPopup<LevelGoalsPopup>("Popups/LevelGoalsPopup", popup =>
{
popup.SetGoals(levelData);
});
EnableGameSystems();
InitializeSystems();
}
private void OnDestroy()
{
DisableGameSystems();
}
private void InitializeLevel()
{
var progressionSystem = World.DefaultGameObjectInjectionWorld.GetExistingSystem<GameProgressionSystem>();
var levelToLoad = LevelNumber;
if (progressionSystem.IsPlayerComingFromLevelScreen)
{
var lastSelectedLevel = PlayerPrefs.GetInt(GameplayConstants.LastSelectedLevelPrefKey);
if (lastSelectedLevel == 0)
lastSelectedLevel = LevelNumber;
levelToLoad = lastSelectedLevel;
progressionSystem.IsPlayerComingFromLevelScreen = false;
}
LoadLevel(levelToLoad);
var tilePools = FindObjectOfType<TilePools>();
tilePools.Initialize(levelData);
var particlePools = FindObjectOfType<ParticlePools>();
particlePools.Initialize();
var entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
var e = entityManager.CreateEntity(typeof(CreateLevelEvent));
entityManager.SetComponentData(e, new CreateLevelEvent { Number = levelData.Number });
goalsWidget.Initialize(levelData.Goals, tilePools);
scoreWidget.Initialize(levelData);
buyPowerupsWidget.Initialize(levelData);
gameState = new GameState();
}
private void LoadLevel(int levelNum)
{
levelData = FileUtils.LoadLevel(levelNum);
}
private void InitializeSystems()
{
var world = World.DefaultGameObjectInjectionWorld;
world.GetExistingSystem<LevelCreationSystem>().Initialize();
world.GetExistingSystem<BoosterCreationSystem>().Initialize();
world.GetExistingSystem<BoosterResolutionSystem>().Initialize();
world.GetExistingSystem<CollectTilesGoalTrackingSystem>().Initialize();
world.GetExistingSystem<CollectSlotsGoalTrackingSystem>().Initialize();
world.GetExistingSystem<CollectBlockersGoalTrackingSystem>().Initialize();
world.GetExistingSystem<CollectCollectiblesGoalTrackingSystem>().Initialize();
world.GetExistingSystem<FillEmptySlotsSystem>().Initialize();
world.GetExistingSystem<PlayerInputSystem>().Initialize();
world.GetExistingSystem<UpdateScoreSystem>().Initialize();
world.GetExistingSystem<CheckWinConditionSystem>().Initialize();
world.GetExistingSystem<CrusherPowerupResolutionSystem>().Initialize();
world.GetExistingSystem<BombPowerupResolutionSystem>().Initialize();
world.GetExistingSystem<SwapPowerupResolutionSystem>().Initialize();
world.GetExistingSystem<ColorBombPowerupResolutionSystem>().Initialize();
}
private void EnableGameSystems()
{
var world = World.DefaultGameObjectInjectionWorld;
world.GetExistingSystem<LevelCreationSystem>().Enabled = true;
world.GetExistingSystem<AnimateGravitySystem>().Enabled = true;
world.GetExistingSystem<BoosterCreationSystem>().Enabled = true;
world.GetExistingSystem<BoosterResolutionSystem>().Enabled = true;
world.GetExistingSystem<CollectTilesGoalTrackingSystem>().Enabled = true;
world.GetExistingSystem<CollectSlotsGoalTrackingSystem>().Enabled = true;
world.GetExistingSystem<CollectBlockersGoalTrackingSystem>().Enabled = true;
world.GetExistingSystem<CollectCollectiblesGoalTrackingSystem>().Enabled = true;
world.GetExistingSystem<FillEmptySlotsSystem>().Enabled = true;
world.GetExistingSystem<GravitySystem>().Enabled = true;
world.GetExistingSystem<PlayerInputSystem>().Enabled = true;
world.GetExistingSystem<UpdateScoreSystem>().Enabled = true;
world.GetExistingSystem<CheckWinConditionSystem>().Enabled = true;
world.GetExistingSystem<UpdateRemainingMovesUiSystem>().Enabled = true;
world.GetExistingSystem<CrusherPowerupResolutionSystem>().Enabled = true;
world.GetExistingSystem<BombPowerupResolutionSystem>().Enabled = true;
world.GetExistingSystem<SwapPowerupResolutionSystem>().Enabled = true;
world.GetExistingSystem<ColorBombPowerupResolutionSystem>().Enabled = true;
}
private void DisableGameSystems()
{
var world = World.DefaultGameObjectInjectionWorld;
if (world != null)
{
world.GetExistingSystem<LevelCreationSystem>().Enabled = false;
world.GetExistingSystem<AnimateGravitySystem>().Enabled = false;
world.GetExistingSystem<BoosterCreationSystem>().Enabled = false;
world.GetExistingSystem<BoosterResolutionSystem>().Enabled = false;
world.GetExistingSystem<CollectTilesGoalTrackingSystem>().Enabled = false;
world.GetExistingSystem<CollectSlotsGoalTrackingSystem>().Enabled = false;
world.GetExistingSystem<CollectBlockersGoalTrackingSystem>().Enabled = false;
world.GetExistingSystem<CollectCollectiblesGoalTrackingSystem>().Enabled = false;
world.GetExistingSystem<FillEmptySlotsSystem>().Enabled = false;
world.GetExistingSystem<GravitySystem>().Enabled = false;
world.GetExistingSystem<PlayerInputSystem>().Enabled = false;
world.GetExistingSystem<UpdateScoreSystem>().Enabled = false;
world.GetExistingSystem<CheckWinConditionSystem>().Enabled = false;
world.GetExistingSystem<UpdateRemainingMovesUiSystem>().Enabled = false;
world.GetExistingSystem<CrusherPowerupResolutionSystem>().Enabled = false;
world.GetExistingSystem<BombPowerupResolutionSystem>().Enabled = false;
world.GetExistingSystem<SwapPowerupResolutionSystem>().Enabled = false;
world.GetExistingSystem<ColorBombPowerupResolutionSystem>().Enabled = false;
}
}
public void OnPlayerWon()
{
if (playerWon)
return;
playerWon = true;
var nextLevel = PlayerPrefs.GetInt(GameplayConstants.NextLevelPrefKey);
if (nextLevel == 0)
nextLevel = 1;
if (levelData.Number == nextLevel)
{
PlayerPrefs.SetInt(GameplayConstants.NextLevelPrefKey, levelData.Number + 1);
PlayerPrefs.SetInt(GameplayConstants.UnlockedNextLevelPrefKey, 1);
}
else
{
PlayerPrefs.SetInt(GameplayConstants.UnlockedNextLevelPrefKey, 0);
}
var updateMovesSystem = World.DefaultGameObjectInjectionWorld.GetExistingSystem<UpdateRemainingMovesUiSystem>();
if (levelData.EndGameAward && updateMovesSystem.NumRemainingMoves > 0)
StartCoroutine(OpenEndGameAwardPopupAsync());
else
StartCoroutine(OpenWinPopupAsync());
}
public void OnPlayerLost()
{
if (playerLost)
return;
playerLost = true;
StartCoroutine(OpenOutOfMovesPopupAsync());
}
private IEnumerator OpenEndGameAwardPopupAsync()
{
yield return new WaitForSeconds(GameplayConstants.EndGameAwardPopupDelay);
OpenEndGameAwardPopup();
BeginEndGameAwardSequence();
}
private void OpenEndGameAwardPopup()
{
OpenPopup<EndGameAwardPopup>("Popups/EndGameAwardPopup");
}
private IEnumerator OpenWinPopupAsync()
{
yield return new WaitForSeconds(GameplayConstants.WinPopupDelay);
OpenWinPopup();
}
public void OpenLosePopup()
{
StartCoroutine(OpenLosePopupAsync());
}
private IEnumerator OpenLosePopupAsync()
{
yield return new WaitForSeconds(GameplayConstants.LosePopupDelay);
OpenPopup<LosePopup>("Popups/LosePopup", popup =>
{
popup.SetScore(gameState.Score);
popup.SetGoals(levelData.Goals, goalsWidget);
});
}
private IEnumerator OpenOutOfMovesPopupAsync()
{
yield return new WaitForSeconds(GameplayConstants.OutOfMovesPopupDelay);
OpenOutOfMovesPopup();
}
private void OpenWinPopup()
{
OpenPopup<WinPopup>("Popups/WinPopup", popup =>
{
var starsPrefKey = $"level_stars_{levelData.Number}";
var levelStars = PlayerPrefs.GetInt(starsPrefKey);
if (gameState.Score >= levelData.Star3Score)
{
popup.SetStars(3);
PlayerPrefs.SetInt(starsPrefKey, 3);
}
else if (gameState.Score >= levelData.Star2Score)
{
popup.SetStars(2);
if (levelStars < 3)
PlayerPrefs.SetInt(starsPrefKey, 2);
}
else if (gameState.Score >= levelData.Star1Score)
{
popup.SetStars(1);
if (levelStars < 2)
PlayerPrefs.SetInt(starsPrefKey, 1);
}
else
{
popup.SetStars(0);
}
var scorePrefKey = $"level_score_{levelData.Number}";
var levelScore = PlayerPrefs.GetInt(scorePrefKey);
if (levelScore < gameState.Score)
PlayerPrefs.SetInt(scorePrefKey, gameState.Score);
popup.SetScore(gameState.Score);
popup.SetGoals(levelData.Goals, goalsWidget);
});
}
private void OpenOutOfMovesPopup()
{
OpenPopup<OutOfMovesPopup>("Popups/OutOfMovesPopup", popup =>
{
OpenTopCanvas();
popup.SetFreeLivesChecker(freeLivesChecker);
});
}
public void OpenCoinsPopup()
{
OpenPopup<BuyCoinsPopup>("Popups/BuyCoinsPopup");
}
public void OpenTopCanvas()
{
topCanvas.SetActive(true);
}
public void CloseTopCanvas()
{
topCanvas.SetActive(false);
}
public void ContinueGame()
{
CloseTopCanvas();
var numExtraMoves = GameConfig.NumExtraMoves;
var world = World.DefaultGameObjectInjectionWorld;
world.GetExistingSystem<UpdateRemainingMovesUiSystem>().Initialize(numExtraMoves);
playerWon = false;
playerLost = false;
}
public void RestartGame()
{
var world = World.DefaultGameObjectInjectionWorld;
world.GetExistingSystem<LevelCreationSystem>().OnGameRestarted();
world.GetExistingSystem<UpdateScoreSystem>().OnGameRestarted();
world.GetExistingSystem<UpdateRemainingMovesUiSystem>().Initialize(levelData.Moves);
playerWon = false;
playerLost = false;
goalsWidget.OnGameRestarted();
}
public void OnGameRestarted()
{
CloseTopCanvas();
RestartGame();
}
public void OnSettingsButtonPressed()
{
OpenPopup<PausePopup>("Popups/PausePopup");
}
public void PenalizePlayer()
{
freeLivesChecker.RemoveLife();
}
public void ExitGame()
{
CloseTopCanvas();
PenalizePlayer();
GetComponent<ScreenTransition>().PerformTransition();
}
public void EnablePowerupOverlay()
{
powerupCanvas.gameObject.SetActive(true);
powerupImage.DOFade(220.0f/255.0f, 0.4f);
powerupText.DOFade(1.0f, 0.4f);
}
public void DisablePowerupOverlay()
{
powerupImage.DOFade(0.0f, 0.3f);
powerupText.DOFade(0.0f, 0.3f).OnComplete(() =>
{
powerupCanvas.gameObject.SetActive(false);
});
}
public void SetPowerupText(string text)
{
powerupText.text = text;
}
private void BeginEndGameAwardSequence()
{
isPlayingEndGameSequence = true;
StartCoroutine(BeginEndGameAwardSequenceAsync());
}
private IEnumerator BeginEndGameAwardSequenceAsync()
{
yield return new WaitForSeconds(2.0f);
var levelCreationSystem = World.DefaultGameObjectInjectionWorld.GetExistingSystem<LevelCreationSystem>();
var entityMgr = levelCreationSystem.EntityManager;
var tiles = levelCreationSystem.TileEntities;
var gos = levelCreationSystem.TileGos;
var updateMovesSystem = World.DefaultGameObjectInjectionWorld.GetExistingSystem<UpdateRemainingMovesUiSystem>();
var numMoves = updateMovesSystem.NumRemainingMoves;
while (numMoves > 0)
{
var selectedValidTile = false;
var idx = Random.Range(0, tiles.Length);
while (!selectedValidTile)
{
if (tiles[idx] != Entity.Null &&
gos[idx] != null &&
entityMgr.HasComponent<TileData>(tiles[idx]) &&
!entityMgr.HasComponent<BoosterData>(tiles[idx]))
{
selectedValidTile = true;
}
else
{
idx = Random.Range(0, tiles.Length);
}
}
var idx2 = Random.Range(0, 4);
TileUtils.AddBoosterToTile(gos[idx], (BoosterType)idx2, entityMgr);
entityMgr.CreateEntity(typeof(MatchHappenedEvent));
SoundPlayer.PlaySoundFx("AwardBoosterPop");
numMoves -= 1;
yield return new WaitForSeconds(GameplayConstants.EndGameSequenceSpawnFrequency);
}
AdvanceEndGameSequence();
}
public void AdvanceEndGameSequence()
{
var levelCreationSystem = World.DefaultGameObjectInjectionWorld.GetExistingSystem<LevelCreationSystem>();
var entityMgr = levelCreationSystem.EntityManager;
var tiles = levelCreationSystem.TileEntities;
var foundBooster = false;
foreach (var tile in tiles)
{
if (tile != Entity.Null &&
entityMgr.HasComponent<BoosterData>(tile))
{
entityMgr.AddComponentData(tile, new PendingBoosterData());
entityMgr.CreateEntity(typeof(ResolveBoostersData));
foundBooster = true;
break;
}
}
if (!foundBooster)
{
isPlayingEndGameSequence = false;
StartCoroutine(OpenWinPopupAsync());
}
}
}
}
Editor is loading...
Leave a Comment