93 lines
1.8 KiB
C#
93 lines
1.8 KiB
C#
|
using Godot;
|
||
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
public class TileGrid : Resource, IReadOnlyList<Tile>
|
||
|
{
|
||
|
[Export]
|
||
|
public int Size { get; private set; } = 10;
|
||
|
|
||
|
[Export]
|
||
|
private Resource _startTileTypeResource;
|
||
|
public TileType StartTileType => (TileType)_startTileTypeResource;
|
||
|
|
||
|
public int Count => Size * Size;
|
||
|
|
||
|
public Tile this[int index]
|
||
|
{
|
||
|
get => Tiles[index];
|
||
|
set => Tiles[index] = value;
|
||
|
}
|
||
|
|
||
|
public Tile this[int x, int y]
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
MapPosition(x, y, out int idx);
|
||
|
return Tiles[idx];
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
MapPosition(x, y, out int idx);
|
||
|
Tiles[idx] = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private List<Tile> Tiles
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (_tiles == null)
|
||
|
{
|
||
|
_tiles = new List<Tile>();
|
||
|
Generate(_tiles);
|
||
|
}
|
||
|
|
||
|
return _tiles;
|
||
|
}
|
||
|
}
|
||
|
private List<Tile> _tiles = null;
|
||
|
|
||
|
private void Generate(List<Tile> tiles)
|
||
|
{
|
||
|
tiles.Clear();
|
||
|
for (int i = 0; i < Count; i++)
|
||
|
{
|
||
|
var tile = new Tile();
|
||
|
tile.isHighlighted = false;
|
||
|
tile.temperature = 0.0f;
|
||
|
tile.type = StartTileType;
|
||
|
|
||
|
tiles.Add(tile);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public IEnumerator<Tile> GetEnumerator()
|
||
|
{
|
||
|
return Tiles.GetEnumerator();
|
||
|
}
|
||
|
|
||
|
IEnumerator IEnumerable.GetEnumerator()
|
||
|
{
|
||
|
return Tiles.GetEnumerator();
|
||
|
}
|
||
|
|
||
|
public void MapIndex(int idx, out int x, out int y)
|
||
|
{
|
||
|
y = idx / Size;
|
||
|
x = idx % Size;
|
||
|
}
|
||
|
|
||
|
public void MapPosition(int x, int y, out int idx)
|
||
|
{
|
||
|
idx = y * Size + x;
|
||
|
}
|
||
|
|
||
|
public bool IsInBounds(int x, int y)
|
||
|
{
|
||
|
return x >= 0 && x < Size && y >= 0 && y < Size;
|
||
|
}
|
||
|
}
|
||
|
|