produce/absorb heat by tile type #6

This commit is contained in:
Cat Flynn 2022-12-10 03:02:54 +00:00
parent 7a02c9a951
commit 006510956c
5 changed files with 34 additions and 11 deletions

View File

@ -8,3 +8,4 @@ Name = "Developed"
BuildLabel = "[D]eveloped" BuildLabel = "[D]eveloped"
Key = 68 Key = 68
Color = Color( 0.372549, 0.372549, 0.372549, 1 ) Color = Color( 0.372549, 0.372549, 0.372549, 1 )
HeatGeneration = 0.1

View File

@ -8,3 +8,4 @@ Name = "Wild"
BuildLabel = "[W]ild" BuildLabel = "[W]ild"
Key = 87 Key = 87
Color = Color( 0, 0.545098, 0.0196078, 1 ) Color = Color( 0, 0.545098, 0.0196078, 1 )
HeatGeneration = -0.025

View File

@ -40,7 +40,7 @@ public class WorldGrid : Node2D
{ {
var tile = _tiles[x, y]; var tile = _tiles[x, y];
var material = tile.material; var material = tile.material;
material.SetShaderParam("t", tile.value); material.SetShaderParam("t", tile.temperature);
} }
} }
} }
@ -100,7 +100,7 @@ public class WorldGrid : Node2D
{ {
var tile = new Tile(); var tile = new Tile();
tile.isHighlighted = false; tile.isHighlighted = false;
tile.value = 0.0f; tile.temperature = 0.0f;
tile.type = _startTileType; tile.type = _startTileType;
var node = TileScene.Instance<Node2D>(); var node = TileScene.Instance<Node2D>();
@ -122,6 +122,7 @@ public class WorldGrid : Node2D
public void _on_Clock_OnTick(int ticks) public void _on_Clock_OnTick(int ticks)
{ {
GenerateHeat();
Diffuse(); Diffuse();
} }
@ -135,13 +136,27 @@ public class WorldGrid : Node2D
private void GetNeighbourTemperatures(int x, int y, out float nx, out float ny, out float px, out float py) private void GetNeighbourTemperatures(int x, int y, out float nx, out float ny, out float px, out float py)
{ {
// default value // default value
var t = _tiles[x, y].value; var t = _tiles[x, y].temperature;
nx = x > 0 ? _tiles[x - 1, y].value : t; nx = x > 0 ? _tiles[x - 1, y].temperature : t;
px = x < Size - 1 ? _tiles[x + 1, y].value : t; px = x < Size - 1 ? _tiles[x + 1, y].temperature : t;
ny = y > 0 ? _tiles[x, y - 1].value : t; ny = y > 0 ? _tiles[x, y - 1].temperature : t;
py = y < Size - 1 ? _tiles[x, y + 1].value : t; py = y < Size - 1 ? _tiles[x, y + 1].temperature : t;
}
private void GenerateHeat()
{
for (int x = 0; x < Size; x++)
{
for (int y = 0; y < Size; y++)
{
var tile = _tiles[x, y];
var type = tile.type;
tile.temperature += type.HeatGeneration;
_tiles[x, y] = tile;
}
}
} }
private void Diffuse() private void Diffuse()
@ -150,7 +165,7 @@ public class WorldGrid : Node2D
{ {
for (int y = 0; y < Size; y++) for (int y = 0; y < Size; y++)
{ {
float t = _tiles[x, y].value; float t = _tiles[x, y].temperature;
var D = DiffusionCoefficient; var D = DiffusionCoefficient;
GetNeighbourTemperatures( GetNeighbourTemperatures(
@ -161,7 +176,10 @@ public class WorldGrid : Node2D
out var py); out var py);
// current value // current value
_nextValues[x, y] = TransferHeat(t, D, nx, ny, px, py); var temperature = TransferHeat(t, D, nx, ny, px, py);
// TODO: what if it's really really cold out?
temperature = Mathf.Max(0, temperature);
_nextValues[x, y] = temperature;
} }
} }
@ -169,7 +187,7 @@ public class WorldGrid : Node2D
{ {
for (int y = 0; y < Size; y++) for (int y = 0; y < Size; y++)
{ {
_tiles[x, y].value = _nextValues[x, y]; _tiles[x, y].temperature = _nextValues[x, y];
} }
} }
} }

View File

@ -3,7 +3,7 @@ using Godot;
public struct Tile public struct Tile
{ {
public bool isHighlighted; public bool isHighlighted;
public float value; public float temperature;
public ShaderMaterial material; public ShaderMaterial material;
public TileType type; public TileType type;
} }

View File

@ -14,6 +14,9 @@ public class TileType : Resource
[Export] [Export]
public Color Color { get; private set; } public Color Color { get; private set; }
[Export]
public float HeatGeneration { get; private set; }
public override string ToString() public override string ToString()
{ {
return Name; return Name;