diff options
| author | Somhairle H. Marisol <[email protected]> | 2026-09-21 14:55:37 +0800 |
|---|---|---|
| committer | Somhairle H. Marisol <[email protected]> | 2026-09-21 14:55:37 +0800 |
| commit | ab19df0ebad8da972cd30f89f7cfd8ef38b8c0ae (patch) | |
| tree | baa466d7afd04517d31cb3a1ab0fee04da0bcc5e /src/LivingVillage.Kernel | |
| parent | 655c22afe53b740e795f66c4da57714985ddccec (diff) | |
| download | living-village-ab19df0ebad8da972cd30f89f7cfd8ef38b8c0ae.tar.gz | |
feat(kernel): 地图边界参数化与存档 v2
Sim 地图边界由常量 52 改为可配置(configureBounds,默认 64x48 = 与全部基线一致);Sim.step 裁剪、initialWorld 中心出生时点按当前边界读取;WorldSave 升级 V2 头携带 width/height 两字段,V1 旧存档照常读入并自动回退到 64x48;回归:512x384 边界裁剪/初界转正/双份存档往返/案例 v1 档兼容读。修复前一段中报错已修正的测试代码(Ensure saved-file timeouts)。
Diffstat (limited to 'src/LivingVillage.Kernel')
| -rw-r--r-- | src/LivingVillage.Kernel/Sim.fs | 13 | ||||
| -rw-r--r-- | src/LivingVillage.Kernel/WorldSave.fs | 12 |
2 files changed, 20 insertions, 5 deletions
diff --git a/src/LivingVillage.Kernel/Sim.fs b/src/LivingVillage.Kernel/Sim.fs index 0845abd..9da7c46 100644 --- a/src/LivingVillage.Kernel/Sim.fs +++ b/src/LivingVillage.Kernel/Sim.fs @@ -235,8 +235,17 @@ module Sim = let dtSeconds = 1.0 / float ticksPerSecond let dtSecondsF = 1.0f / float32 ticksPerSecond - let mapWidthTiles = 64 - let mapHeightTiles = 48 + /// World dimensions are parameterized so a large procedural map (e.g. 512x384) + /// can reuse every movement/wander/clamp rule. Defaults stay the legacy 64x48 to + /// keep all existing deterministic tests and baselines untouched. + let mutable mapWidthTiles = 64 + let mutable mapHeightTiles = 48 + + /// Configure the world size. Note: the caller must not step worlds during a + /// reconfiguration; bounds are read per step from these values. + let configureBounds (widthTiles: int) (heightTiles: int) : unit = + mapWidthTiles <- widthTiles + mapHeightTiles <- heightTiles let tilePixels = 32 let avatarSpeed = 160.0f diff --git a/src/LivingVillage.Kernel/WorldSave.fs b/src/LivingVillage.Kernel/WorldSave.fs index 8a47c7d..e68a45f 100644 --- a/src/LivingVillage.Kernel/WorldSave.fs +++ b/src/LivingVillage.Kernel/WorldSave.fs @@ -469,7 +469,9 @@ module WorldSave = let save (world: World) : string = let tokens = ResizeArray<string>() - add tokens formatVersion + add tokens "LV_WORLD_SAVE_V2" + addInt tokens mapWidthTiles + addInt tokens mapHeightTiles addInt64 tokens world.Tick addFloat tokens world.Time addUInt64 tokens world.Rng.State @@ -492,8 +494,12 @@ module WorldSave = try let tokens = text.Split([| '|' |], StringSplitOptions.None) let reader = TokenReader(tokens) - if reader.Take("format") <> formatVersion then - invalid "unsupported save format" + match reader.Take("format") with + | "LV_WORLD_SAVE_V2" -> + configureBounds (readInt reader "bounds.w") (readInt reader "bounds.h") + | v1 when v1 = formatVersion -> + configureBounds 64 48 + | _ -> invalid "unsupported save format" let tick = readInt64 reader "tick" let time = readFloat reader "time" let rng = { State = readUInt64 reader "rng" } |
