154 lines
4.6 KiB
C#
154 lines
4.6 KiB
C#
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<SpriteRenderer>();
|
|
bgSpriteRenderer.sprite = groundSprite;
|
|
|
|
GameObject envObject = GameObject.Instantiate(spritePrefab, worldPos, Quaternion.identity);
|
|
envSpriteRenderer = envObject.GetComponent<SpriteRenderer>();
|
|
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>();
|
|
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;
|
|
}
|
|
}
|
|
}
|