Files
RuinAdventurer/Scripts/Tile.cs
T

75 lines
1.5 KiB
C#

using Godot;
using System;
using System.Collections.Generic;
using System.Linq;
public partial class Tile
{
public Dictionary<string, MeshInstance3D> tileMeshes;
public string collapsedMesh;
Random rand = new Random();
public Vector3 Position;
public Vector2I GridPosition;
public Node3D DecorationNode;
public void SetMeshes(Dictionary<string, MeshInstance3D> tileMeshes)
{
this.tileMeshes = new Dictionary<string, MeshInstance3D>(tileMeshes);
}
public string Collapse(string tile)
{
if (collapsedMesh != null) return "";
if (tileMeshes.Keys.Count <= 0) return "ERR";
collapsedMesh = (tile.Length > 0) ? tile : ChooseWeighted();
tileMeshes.Clear();
return collapsedMesh;
}
private string ChooseWeighted()
{
float totalWeight = 0f;
foreach (string tile in tileMeshes.Keys)
{
totalWeight += WFC.weights[tile];
}
float r = (float)(rand.NextDouble() * totalWeight);
float cumulative = 0f;
foreach (string tile in tileMeshes.Keys)
{
cumulative += WFC.weights[tile];
if (r <= cumulative)
return tile;
}
return "junction";
}
public int Propagate(HashSet<string> possibleKeys)
{
int amountRemoved = 0;
if (collapsedMesh != null) return 0;
foreach (string key in tileMeshes.Keys.ToList())
{
if (!possibleKeys.Contains(key))
{
tileMeshes.Remove(key);
amountRemoved++;
}
}
if (tileMeshes.Count == 0) return int.MaxValue;
return amountRemoved;
}
public void Reset(Dictionary<string, MeshInstance3D> tileMeshes)
{
collapsedMesh = null;
SetMeshes(tileMeshes);
}
}