+ valid = validDirects x y w h
+ next = case simGetChunkType sim x y of
+ Water -> updateWaterChunk x y valid acc
+ _ -> acc
+
+-- 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