Changed WFC acceptance to 100% connectivity and added test case to test the layer generation.

This commit is contained in:
2026-05-11 21:23:51 +02:00
parent 05d7df753f
commit 07cdd0a46f
2 changed files with 61 additions and 1 deletions
+60
View File
@@ -37,6 +37,7 @@ public partial class TestRunner : Node
Run("For node stops after configured amount", TestForNodeStopsAfterConfiguredAmount); Run("For node stops after configured amount", TestForNodeStopsAfterConfiguredAmount);
Run("Paused world does not drain survival", TestPausedWorldDoesNotDrainSurvival); Run("Paused world does not drain survival", TestPausedWorldDoesNotDrainSurvival);
Run("Open gate hides gate content", TestOpenGateHidesGateContent); Run("Open gate hides gate content", TestOpenGateHidesGateContent);
Run("Layer generation succeeds above threshold", TestLayerGenerationSuccessRate);
Run("Item data readable names are stable", TestItemDataReadableNames); Run("Item data readable names are stable", TestItemDataReadableNames);
Run("Resource files load core game data", TestResourceFilesLoadCoreData); Run("Resource files load core game data", TestResourceFilesLoadCoreData);
@@ -502,6 +503,40 @@ public partial class TestRunner : Node
AssertFalse(layer.tiles[0, 0].ContentNode.Visible, "gate content should be hidden"); AssertFalse(layer.tiles[0, 0].ContentNode.Visible, "gate content should be hidden");
} }
private void TestLayerGenerationSuccessRate()
{
const int layerCount = 1000;
const float minimumSuccessRate = 0.90f;
GameData.layerSize = 20;
WFC.FillAdjacencies();
Dictionary<string, MeshInstance3D> tileMeshes = ResourceLoader.LoadTiles();
int successfulLayers = 0;
for (int i = 0; i < layerCount; i++)
{
Layer layer = new Layer();
layer._Ready();
layer.SetupLayer(GameData.layerSize, 0, tileMeshes, new Vector2I());
if (IsGeneratedLayerValid(layer))
{
successfulLayers++;
}
layer.Free();
}
float successRate = successfulLayers / (float)layerCount;
GD.Print($"Layer generation success rate: {successfulLayers}/{layerCount} ({successRate:P2})");
AssertTrue(
successRate >= minimumSuccessRate,
$"layer generation success rate should be at least {minimumSuccessRate:P0}, got {successRate:P2}"
);
}
private void TestItemDataReadableNames() private void TestItemDataReadableNames()
{ {
AssertEqual("Iron gear", ItemData.GetReadableName("iron_gear"), "readable name"); AssertEqual("Iron gear", ItemData.GetReadableName("iron_gear"), "readable name");
@@ -539,6 +574,31 @@ public partial class TestRunner : Node
return layer; return layer;
} }
private bool IsGeneratedLayerValid(Layer layer)
{
bool hasGate = false;
foreach (Tile tile in layer.tiles)
{
if (tile.collapsedMesh == null)
{
return false;
}
if (tile.collapsedMesh == "gate")
{
hasGate = true;
}
}
if (!hasGate)
{
return false;
}
return WFC.IsMapConnected(layer.tiles, 1f);
}
private void AssertTrue(bool value, string message) private void AssertTrue(bool value, string message)
{ {
if (!value) if (!value)
+1 -1
View File
@@ -198,7 +198,7 @@ public partial class Layer : Node3D
if (safetyCounter == layerSize * layerSize) return false; if (safetyCounter == layerSize * layerSize) return false;
} }
if (updateFailed) return false; if (updateFailed) return false;
if (!WFC.IsMapConnected(tiles, 0.8f)) return false; if (!WFC.IsMapConnected(tiles, 1f)) return false;
return true; return true;
} }