Compare commits

..

No commits in common. "f13fe1631724e75493151ce76cd1aea147b9fb39" and "c22827967f160a61937c185591edbe9318876ead" have entirely different histories.

6 changed files with 18 additions and 67 deletions

View File

@ -1,9 +1,8 @@
[gd_resource type="Resource" load_steps=4 format=2] [gd_resource type="Resource" load_steps=3 format=2]
[ext_resource path="res://scripts/tile/TileTypeCollection.cs" type="Script" id=1] [ext_resource path="res://scripts/tile/TileTypeCollection.cs" type="Script" id=1]
[ext_resource path="res://resources/tiles/tile_types/developed.tres" type="Resource" id=2] [ext_resource path="res://resources/tiles/tile_types/developed.tres" type="Resource" id=2]
[ext_resource path="res://resources/tiles/tile_types/wild.tres" type="Resource" id=3]
[resource] [resource]
script = ExtResource( 1 ) script = ExtResource( 1 )
_resources = [ ExtResource( 2 ), ExtResource( 3 ) ] _resources = [ ExtResource( 2 ) ]

View File

@ -1,13 +1,13 @@
using Godot; using Godot;
public class EnvironmentSystem public class HeatSystem
{ {
private readonly TileGrid _tiles; private readonly TileGrid _tiles;
private readonly float _diffusionCoefficient; private readonly float _diffusionCoefficient;
private float[] _nextTemperatures = null; private float[] _nextTemperatures = null;
public EnvironmentSystem(TileGrid tiles, float diffusionCoefficient) public HeatSystem(TileGrid tiles, float diffusionCoefficient)
{ {
_tiles = tiles; _tiles = tiles;
_diffusionCoefficient = diffusionCoefficient; _diffusionCoefficient = diffusionCoefficient;
@ -20,6 +20,7 @@ public class EnvironmentSystem
Diffuse(); Diffuse();
} }
private float TransferHeat(float t0, float alpha, float nx, float ny, float px, float py) private float TransferHeat(float t0, float alpha, float nx, float ny, float px, float py)
{ {
float d2tdx2 = nx - 2 * t0 + px; float d2tdx2 = nx - 2 * t0 + px;
@ -55,50 +56,13 @@ public class EnvironmentSystem
if (!(tile.type is IDamageable damageable)) if (!(tile.type is IDamageable damageable))
return; return;
var delta = tile.temperature - damageable.Threshold; var surplus = tile.temperature - damageable.Threshold;
if (delta < 0) if (surplus < 0)
{ return;
// we want to heal based on how many wild tiles surround us
float healRate = 0.01f;
// count neighbours // TODO: parameterised balancing
} tile.currentHealth -= surplus;
else tile.currentHealth = Mathf.Clamp(tile.currentHealth, 0, 1);
{
// take damage
// TODO: parameterised balancing
tile.currentHealth -= delta;
tile.currentHealth = Mathf.Clamp(tile.currentHealth, 0, 1);
}
}
public int GetNeighbourCount<T>(int x, int y) where T : TileType
{
int count = 0;
for (int i = -1; i < 1; i += 2)
{
for (int j = -1; j < 1; j += 2)
{
int xi = x + 1;
int yj = y + 1;
// assume tiles out side of bounds are the same type as this one
if (!_tiles.IsInBounds(xi, yj))
{
count += 1;
continue;
}
if (!(_tiles[xi, yj] is T))
continue;
count++;
}
}
return count;
} }
private void Diffuse() private void Diffuse()
@ -132,4 +96,5 @@ public class EnvironmentSystem
_tiles[i] = tile; _tiles[i] = tile;
} }
} }
} }

View File

@ -21,7 +21,7 @@ public class WorldGrid : Node2D
public ShaderMaterial material; public ShaderMaterial material;
} }
private TileView[] _tileViews; private TileView[] _tileViews;
private EnvironmentSystem _environment; private HeatSystem _heat;
// Called when the node enters the scene tree for the first time. // Called when the node enters the scene tree for the first time.
public override void _Ready() public override void _Ready()
@ -30,7 +30,7 @@ public class WorldGrid : Node2D
GenerateCanvasItems(_tileGrid); GenerateCanvasItems(_tileGrid);
_environment = new EnvironmentSystem(_tileGrid, DiffusionCoefficient); _heat = new HeatSystem(_tileGrid, DiffusionCoefficient);
} }
#region Positioning #region Positioning
@ -53,7 +53,6 @@ public class WorldGrid : Node2D
var tile = _tileGrid[idx]; var tile = _tileGrid[idx];
tile.type = tileType; tile.type = tileType;
tile = tileType.ApplySpawneffect(tile);
_tileGrid[x, y] = tile; _tileGrid[x, y] = tile;
} }
#endregion #endregion
@ -101,5 +100,5 @@ public class WorldGrid : Node2D
public ShaderMaterial GetTileMaterial(int idx) => _tileViews[idx].material; public ShaderMaterial GetTileMaterial(int idx) => _tileViews[idx].material;
public void _on_Clock_OnTick(int ticks) => _environment.Process(); public void _on_Clock_OnTick(int ticks) => _heat.Process();
} }

View File

@ -17,6 +17,4 @@ public class TileType : Resource
public float HeatGeneration { get; private set; } public float HeatGeneration { get; private set; }
public override string ToString() => Name; public override string ToString() => Name;
public virtual Tile ApplySpawneffect(Tile tile) => tile;
} }

View File

@ -4,10 +4,4 @@ public class Wild : TileType, IDamageable
{ {
[Export] [Export]
public float Threshold { get; private set; } public float Threshold { get; private set; }
public override Tile ApplySpawneffect(Tile tile)
{
tile.currentHealth = 0;
return tile;
}
} }

View File

@ -20,14 +20,10 @@ public class BuildModeUI : Control
_buildMode = GetNode<BuildMode>(_buildModePath); _buildMode = GetNode<BuildMode>(_buildModePath);
var buttonHeight = 40; var buttonHeight = 40;
var tileType = _buildMode.BuildableTiles[0];
int x = 50; int x = 50;
int margin = 5;
foreach (var tt in _buildMode.BuildableTiles) SpawnButton(tileType, buttonHeight, ref x);
{
SpawnButton(tt, buttonHeight, ref x);
x += margin;
}
} }
private void UpdateButtonToggleState(TileType tileType) private void UpdateButtonToggleState(TileType tileType)