using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using Enums; public class SC_GameLogic : MonoBehaviour { private Dictionary unityObjects; //this is a dictionary of all game objects in the scene private int score = 0; //current score private float displayScore = 0; //for animation, i think private GameBoard gameBoard; //game board object private GameState currentState = GameState.Move; //current game state public GameState CurrentState { get { return this.currentState; } } #region MonoBehaviour private void Awake() { Init(); } private void Start() { StartGame(); } private void Update() { this.displayScore = Mathf.Lerp(this.displayScore, this.gameBoard.Score, SC_GameVariables.Instance.scoreSpeed * Time.deltaTime); this.unityObjects["Txt_Score"].GetComponent().text = this.displayScore.ToString("0"); } #endregion #region Logic private void Init() { this.unityObjects = new Dictionary(); GameObject[] _obj = GameObject.FindGameObjectsWithTag("UnityObject"); foreach (GameObject g in _obj) this.unityObjects.Add(g.name,g); this.gameBoard = new GameBoard(7, 7); Setup(); } //GameBoardService private void Setup() { for (int x = 0; x < this.gameBoard.Width; x++) for (int y = 0; y < this.gameBoard.Height; y++) { Vector2 _pos = new Vector2(x, y); GameObject _bgTile = Instantiate(SC_GameVariables.Instance.bgTilePrefabs, _pos, Quaternion.identity); _bgTile.transform.SetParent(this.unityObjects["GemsHolder"].transform); _bgTile.name = "BG Tile - " + x + ", " + y; int _gemToUse = Random.Range(0, SC_GameVariables.Instance.gems.Length); int iterations = 0; while (this.gameBoard.MatchesAt(new Vector2Int(x, y), SC_GameVariables.Instance.gems[_gemToUse]) && iterations < 100) { _gemToUse = Random.Range(0, SC_GameVariables.Instance.gems.Length); iterations++; } SpawnGem(new Vector2Int(x, y), SC_GameVariables.Instance.gems[_gemToUse]); } } public void StartGame() { this.unityObjects["Txt_Score"].GetComponent().text = this.score.ToString("0"); } //GameBoardService private void SpawnGem(Vector2Int _Position, SC_Gem _GemToSpawn) { if (Random.Range(0, 100f) < SC_GameVariables.Instance.bombChance) _GemToSpawn = SC_GameVariables.Instance.bomb; SC_Gem _gem = Instantiate(_GemToSpawn, new Vector3(_Position.x, _Position.y + SC_GameVariables.Instance.dropHeight, 0f), Quaternion.identity); _gem.transform.SetParent(this.unityObjects["GemsHolder"].transform); _gem.name = "Gem - " + _Position.x + ", " + _Position.y; this.gameBoard.SetGem(_Position.x,_Position.y, _gem); _gem.SetupGem(this,_Position); } //GameBoardService public void SetGem(int _X,int _Y, SC_Gem _Gem) { this.gameBoard.SetGem(_X,_Y, _Gem); } //GameBoardService public SC_Gem GetGem(int _X, int _Y) { return this.gameBoard.GetGem(_X, _Y); } public void SetState(GameState _CurrentState) { this.currentState = _CurrentState; } //GameBoardService public void DestroyMatches() { for (int i = 0; i < this.gameBoard.CurrentMatches.Count; i++) if (this.gameBoard.CurrentMatches[i] != null) { ScoreCheck(this.gameBoard.CurrentMatches[i]); DestroyMatchedGemsAt(this.gameBoard.CurrentMatches[i].posIndex); } StartCoroutine(DecreaseRowCo()); } //I think, this moves gems down after a match? //MoveGemsDown //GameBoardService private IEnumerator DecreaseRowCo() { yield return new WaitForSeconds(.2f); int nullCounter = 0; for (int x = 0; x < this.gameBoard.Width; x++) { for (int y = 0; y < this.gameBoard.Height; y++) { SC_Gem _curGem = this.gameBoard.GetGem(x, y); if (_curGem == null) { nullCounter++; } else if (nullCounter > 0) { _curGem.posIndex.y -= nullCounter; SetGem(x, y - nullCounter, _curGem); SetGem(x, y, null); } } nullCounter = 0; } StartCoroutine(FilledBoardCo()); } //IScoreService public void ScoreCheck(SC_Gem gemToCheck) { this.gameBoard.Score += gemToCheck.scoreValue; } //GameBoardService - DestroyMatchedGems private void DestroyMatchedGemsAt(Vector2Int _Pos) { SC_Gem _curGem = this.gameBoard.GetGem(_Pos.x,_Pos.y); if (_curGem != null) { Instantiate(_curGem.destroyEffect, new Vector2(_Pos.x, _Pos.y), Quaternion.identity); Destroy(_curGem.gameObject); SetGem(_Pos.x,_Pos.y, null); } } //GameBoardService - FillBoard private IEnumerator FilledBoardCo() { yield return new WaitForSeconds(0.5f); RefillBoard(); yield return new WaitForSeconds(0.5f); this.gameBoard.FindAllMatches(); if (this.gameBoard.CurrentMatches.Count > 0) { yield return new WaitForSeconds(0.5f); DestroyMatches(); } else { yield return new WaitForSeconds(0.5f); this.currentState = GameState.Move; } } //GameBoardService private void RefillBoard() { for (int x = 0; x < this.gameBoard.Width; x++) { for (int y = 0; y < this.gameBoard.Height; y++) { SC_Gem _curGem = this.gameBoard.GetGem(x,y); if (_curGem == null) { int gemToUse = Random.Range(0, SC_GameVariables.Instance.gems.Length); SpawnGem(new Vector2Int(x, y), SC_GameVariables.Instance.gems[gemToUse]); } } } CheckMisplacedGems(); } //gets all gem game objects //if the gem is not in GameBoard, destroy it private void CheckMisplacedGems() { List foundGems = new List(); foundGems.AddRange(FindObjectsOfType()); for (int x = 0; x < this.gameBoard.Width; x++) { for (int y = 0; y < this.gameBoard.Height; y++) { SC_Gem _curGem = this.gameBoard.GetGem(x, y); if (foundGems.Contains(_curGem)) foundGems.Remove(_curGem); } } foreach (SC_Gem g in foundGems) Destroy(g.gameObject); } public void FindAllMatches() { this.gameBoard.FindAllMatches(); } #endregion }