-physStep sim@(Simulation _ w h) = _physStep 0 (initSimSpace w h) sim
-_physStep i acc sim@(Simulation s w h) =
- if i >= w*h then acc
- else _physStep (i+1) next sim
- where
- getChunkData (ChunkData c) = c
- next = case getChunkData $ simGet sim i of
- Water -> sim
- _ -> sim
+-- takes in list of valid chunks, as well as the sim to modify
+updateWaterChunk x y valid sim =
+ -- if the chunk below is free, fall straight down
+ if elem (0,-1) valid && fromEnum (simGetChunkType sim x (y-1)) == fromEnum Air
+ then
+ let moved = simSet sim ChunkData { chunkType=Air } x y
+ in simSet moved ChunkData { chunkType=Water } x (y-1)
+ else if elem (-1,-1) valid && fromEnum (simGetChunkType sim (x-1) (y-1)) == fromEnum Air
+ then
+ let moved = simSet sim ChunkData { chunkType=Air } x y
+ in simSet moved ChunkData { chunkType=Water } (x-1) (y-1)
+ else if elem (1,-1) valid && fromEnum (simGetChunkType sim (x+1) (y-1)) == fromEnum Air
+ then
+ let moved = simSet sim ChunkData { chunkType=Air } x y
+ in simSet moved ChunkData { chunkType=Water } (x+1) (y-1)
+ -- stay put
+ else sim