summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop/WorldBootstrap.fs
diff options
context:
space:
mode:
Diffstat (limited to 'src/LivingVillage.Desktop/WorldBootstrap.fs')
-rw-r--r--src/LivingVillage.Desktop/WorldBootstrap.fs36
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 }