Compare commits

..

2 Commits

Author SHA1 Message Date
Cat Flynn 62416307ef WIP RESET THIS 2022-12-10 03:38:34 +00:00
Cat Flynn 7d8d80350b produce/absorb heat by tile type #6 2022-12-10 03:03:05 +00:00
9 changed files with 90 additions and 11 deletions

View File

@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://scripts/overlays/HeatOverlay.cs" type="Script" id=1]
[node name="Heat Overlay" type="Node"]
script = ExtResource( 1 )

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

@ -0,0 +1,10 @@
using Godot;
using System;
public class HeatOverlay : Node
{
public override void _Ready()
{
}
}

View File

@ -0,0 +1,6 @@
using Godot;
public class NoOverlay : Node
{
}

View File

@ -0,0 +1,34 @@
using Godot;
using System;
public class Overlays : Node
{
[Export]
private KeyList _cycleOverlayKey;
public override void _Ready()
{
}
public override void _Input(InputEvent @event)
{
base._Input(@event);
if (!(@event is InputEventKey keyEvent))
return;
if (!(keyEvent.Pressed))
return;
if ((KeyList)keyEvent.Scancode != _cycleOverlayKey)
return;
}
private void CycleOverlay()
{
}
}

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;