using System.Collections; using System.Collections.Generic; using UnityEngine; using Objects; namespace Level { public class LayoutCell { [System.Serializable] public struct LayoutCellData { public enum CellContent { None, Block, Player, Crate } public CellContent cellContent; public bool isTarget; } // Public public LayoutCellData cellData; public Vector3 worldPos; public Crate crate; public Vector2Int layoutPosition; // Private private SpriteRenderer bgSpriteRenderer; private SpriteRenderer envSpriteRenderer; // Properties public bool IsFree { get { return cellData.cellContent == LayoutCellData.CellContent.None; } } private Grid grid => LevelBuilder.Instance.grid; private Sprite blockSprite => LevelBuilder.Instance.blockSprite; private Sprite environmentSprite => LevelBuilder.Instance.environmentSprite; private Sprite groundSprite => LevelBuilder.Instance.groundSprite; private GameObject spritePrefab => LevelBuilder.Instance.spritePrefab; private GameObject cratePrefab => LevelBuilder.Instance.cratePrefab; public LayoutCell(Vector3Int cellPos, Vector2Int layoutPos) { layoutPosition = layoutPos; // Init data cellData = new LayoutCellData { cellContent = LayoutCellData.CellContent.None, isTarget = false, }; worldPos = grid.GetCellCenterWorld(cellPos); // Init sprite objects GameObject bgObject = GameObject.Instantiate(spritePrefab, worldPos, Quaternion.identity); bgSpriteRenderer = bgObject.GetComponent(); bgSpriteRenderer.sprite = groundSprite; GameObject envObject = GameObject.Instantiate(spritePrefab, worldPos, Quaternion.identity); envSpriteRenderer = envObject.GetComponent(); envSpriteRenderer.sortingOrder = 1; // Subscribe to destroy event LevelBuilder.Instance.LevelDestroyed += Destroy; } public void ChangeEnv(LevelBuilderButtons.PlacementOption placementOption) { // Can't place on the same block as player if (cellData.cellContent == LayoutCellData.CellContent.Player) { return; } // Clean previous contents cellData.cellContent = LayoutCellData.CellContent.None; cellData.isTarget = false; if (crate) { GameObject.Destroy(crate.gameObject); } // Place new object if (placementOption == LevelBuilderButtons.PlacementOption.Block) { cellData.cellContent = LayoutCellData.CellContent.Block; } else if (placementOption == LevelBuilderButtons.PlacementOption.Environment) { cellData.isTarget = true; } else if (placementOption == LevelBuilderButtons.PlacementOption.Crate) { // This call handles updating cellData as well PlaceCrate(); } else if (placementOption == LevelBuilderButtons.PlacementOption.Player) { // This call handles updating cellData as well Player.Instance.Teleport(this); } UpdateSprites(); } public void PlaceCrate() { cellData.cellContent = LayoutCellData.CellContent.Crate; GameObject crateObject = GameObject.Instantiate(cratePrefab, worldPos, Quaternion.identity); crate = crateObject.GetComponent(); crate.layoutPosition = layoutPosition; } public void UpdateSprites() { if (cellData.cellContent == LayoutCellData.CellContent.Block) { envSpriteRenderer.sprite = blockSprite; } else if (cellData.isTarget) { envSpriteRenderer.sprite = environmentSprite; } else { envSpriteRenderer.sprite = null; } } public void Destroy() { GameObject.Destroy(bgSpriteRenderer.gameObject); GameObject.Destroy(envSpriteRenderer.gameObject); LevelBuilder.Instance.LevelDestroyed -= Destroy; } } }