summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Kernel.Tests/M6aTests.fs
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-22 02:28:31 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-22 02:28:31 +0800
commitef78374c316587fb585b72e6d427cd6e61203655 (patch)
tree9eb176889054c07449debaf2a9d169ffe1851a0d /src/LivingVillage.Kernel.Tests/M6aTests.fs
parent5e036da9dfb1fe7f9e4f5e48414a8a1176292655 (diff)
downloadliving-village-ef78374c316587fb585b72e6d427cd6e61203655.tar.gz
feat(mapgen): 参数化确定性生成器与视口裁剪(P20 第一步)
- 新增纯函数 MapGen:尺寸参数化(默认 64x48,可 256x192),splitmix64 随机游走河道 + 2-3 octave value noise + 泊松式布点;核心区整平后以 BFS 校验 5x6=30 个 spawn 全部可达,不可达确定性修整并复验。 - visibleTileRange/visibleTileCount 纯函数,drawWorld 改为调用之(行为不变); drawMapFitted/drawMapViewport 仅证据用。 - 存档沿用 v2/v3 边界字段,补参数化边界 round-trip 测试,未改 Sim 语义。 - 回归:Desktop 109->115、Kernel 89->90;final_digest 与基线一致。
Diffstat (limited to 'src/LivingVillage.Kernel.Tests/M6aTests.fs')
-rw-r--r--src/LivingVillage.Kernel.Tests/M6aTests.fs22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/LivingVillage.Kernel.Tests/M6aTests.fs b/src/LivingVillage.Kernel.Tests/M6aTests.fs
index fc8cc3a..9348b0f 100644
--- a/src/LivingVillage.Kernel.Tests/M6aTests.fs
+++ b/src/LivingVillage.Kernel.Tests/M6aTests.fs
@@ -292,3 +292,25 @@ type M6aTests () =
Assert.AreEqual<string>("渔夫", Occupation.nameOf Occupation.Fisher)
Assert.AreEqual<string>("货郎", Occupation.nameOf Occupation.Peddler)
Assert.AreEqual<string>("书生", Occupation.nameOf Occupation.Scholar)
+
+ /// P20:存档 v2 的边界字段在非默认尺寸下必须 round-trip,读回后
+ /// mapWidthTiles/mapHeightTiles 恢复且再次保存与原文逐字节一致。
+ /// 旧 64x48 存档的 Round-trip 保持不变由既有 v1/v2 用例覆盖。
+ [<TestMethod>]
+ member _.SaveRoundTripsParameterizedMapBounds () =
+ let path = "p20-bounds-v2.save"
+ try
+ Sim.configureBounds 256 192
+ let world = Sim.initialWorld (uint64 4242)
+ WorldSave.saveToFile path world
+ let text = File.ReadAllText path
+ Assert.IsTrue(text.StartsWith("LV_WORLD_SAVE_V2"), "bounds save must stay v2")
+ match WorldSave.loadFromFile path with
+ | Error failure -> Assert.Fail(sprintf "bounds save should load: %s" failure)
+ | Ok restored ->
+ Assert.AreEqual<int>(256, Sim.mapWidthTiles)
+ Assert.AreEqual<int>(192, Sim.mapHeightTiles)
+ Assert.AreEqual<string>(text, WorldSave.save restored)
+ finally
+ Sim.configureBounds 64 48
+ if File.Exists path then File.Delete path