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://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]
script = ExtResource( 1 )
_resources = [ ExtResource( 2 ), ExtResource( 3 ) ]
_resources = [ ExtResource( 2 ) ]

View File

@ -1,13 +1,13 @@
using Godot;
public class EnvironmentSystem
public class HeatSystem
{
private readonly TileGrid _tiles;
private readonly float _diffusionCoefficient;
private float[] _nextTemperatures = null;
public EnvironmentSystem(TileGrid tiles, float diffusionCoefficient)
public HeatSystem(TileGrid tiles, float diffusionCoefficient)
{
_tiles = tiles;
_diffusionCoefficient = diffusionCoefficient;
@ -20,6 +20,7 @@ public class EnvironmentSystem
Diffuse();
}
private float TransferHeat(float t0, float alpha, float nx, float ny, float px, float py)
{
float d2tdx2 = nx - 2 * t0 + px;
@ -55,50 +56,13 @@ public class EnvironmentSystem
if (!(tile.type is IDamageable damageable))
return;
var delta = tile.temperature - damageable.Threshold;
if (delta < 0)
{
// we want to heal based on how many wild tiles surround us
float healRate = 0.01f;
var surplus = tile.temperature - damageable.Threshold;
if (surplus < 0)
return;
// count neighbours
}
else
{
// 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;
// TODO: parameterised balancing
tile.currentHealth -= surplus;
tile.currentHealth = Mathf.Clamp(tile.currentHealth, 0, 1);
}
private void Diffuse()
@ -132,4 +96,5 @@ public class EnvironmentSystem
_tiles[i] = tile;
}
}
}

View File

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

View File

@ -4,10 +4,4 @@ public class Wild : TileType, IDamageable
{
[Export]
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);
var buttonHeight = 40;
var tileType = _buildMode.BuildableTiles[0];
int x = 50;
int margin = 5;
foreach (var tt in _buildMode.BuildableTiles)
{
SpawnButton(tt, buttonHeight, ref x);
x += margin;
}
SpawnButton(tileType, buttonHeight, ref x);
}
private void UpdateButtonToggleState(TileType tileType)