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"
Key = 68
Color = Color( 0.372549, 0.372549, 0.372549, 1 )
HeatGeneration = 0.1

View File

@ -8,3 +8,4 @@ Name = "Wild"
BuildLabel = "[W]ild"
Key = 87
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 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();
tile.isHighlighted = false;
tile.value = 0.0f;
tile.temperature = 0.0f;
tile.type = _startTileType;
var node = TileScene.Instance<Node2D>();
@ -122,6 +122,7 @@ public class WorldGrid : Node2D
public void _on_Clock_OnTick(int ticks)
{
GenerateHeat();
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)
{
// default value
var t = _tiles[x, y].value;
var t = _tiles[x, y].temperature;
nx = x > 0 ? _tiles[x - 1, y].value : t;
px = x < Size - 1 ? _tiles[x + 1, y].value : t;
nx = x > 0 ? _tiles[x - 1, y].temperature : t;
px = x < Size - 1 ? _tiles[x + 1, y].temperature : t;
ny = y > 0 ? _tiles[x, y - 1].value : t;
py = y < Size - 1 ? _tiles[x, y + 1].value : t;
ny = y > 0 ? _tiles[x, y - 1].temperature : 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()
@ -150,7 +165,7 @@ public class WorldGrid : Node2D
{
for (int y = 0; y < Size; y++)
{
float t = _tiles[x, y].value;
float t = _tiles[x, y].temperature;
var D = DiffusionCoefficient;
GetNeighbourTemperatures(
@ -161,7 +176,10 @@ public class WorldGrid : Node2D
out var py);
// 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++)
{
_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 bool isHighlighted;
public float value;
public float temperature;
public ShaderMaterial material;
public TileType type;
}

View File

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