diff options
Diffstat (limited to 'src/LivingVillage.Desktop/WorldBootstrap.fs')
| -rw-r--r-- | src/LivingVillage.Desktop/WorldBootstrap.fs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/LivingVillage.Desktop/WorldBootstrap.fs b/src/LivingVillage.Desktop/WorldBootstrap.fs new file mode 100644 index 0000000..612931b --- /dev/null +++ b/src/LivingVillage.Desktop/WorldBootstrap.fs @@ -0,0 +1,36 @@ +namespace LivingVillage.Desktop + +open LivingVillage.Kernel +open LivingVillage.Kernel.Sim + +module WorldBootstrap = + + let private tileCenter (x: int) (y: int) : Vec2 = + { X = float32 (x * Sim.tilePixels + Sim.tilePixels / 2) + Y = float32 (y * Sim.tilePixels + Sim.tilePixels / 2) } + + let private npcSpawnTiles : (int * int) array = + [| for y in [ 14; 18; 28; 32; 36; 40 ] do + for x in [ 24; 28; 32; 36; 40 ] do + yield x, y |] + + let private avatarSpawnPosition = tileCenter 31 25 + + let initialWorld (seed: uint64) (count: int) : World = + if count < 0 || count > npcSpawnTiles.Length then + invalidArg (nameof count) "Desktop bootstrap supports at most 30 NPCs." + + let baseWorld = Sim.initialWorldN seed count + let avatar = + { baseWorld.Avatar with + Pos = avatarSpawnPosition + Mind = { baseWorld.Avatar.Mind with Target = avatarSpawnPosition } } + let npcs = + baseWorld.Npcs + |> Array.mapi (fun index npc -> + let x, y = npcSpawnTiles.[index] + { npc with Pos = tileCenter x y }) + + { baseWorld with + Avatar = avatar + Npcs = npcs } |
