+-- updateWaterChunk x y valid sim | trace ("x:" ++ show x ++ " y:" ++ show y ++ " " ++ show valid) False = undefined
+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)
+ else if elem (-1,0) valid && fromEnum (simGetChunkType sim (x-1) y) == fromEnum Air
+ then
+ let moved = simSet sim ChunkData { chunkType=Air } x y
+ in simSet moved ChunkData { chunkType=Water } (x-1) y
+ else if elem (1,0) valid && fromEnum (simGetChunkType sim (x+1) y) == fromEnum Air
+ then
+ let moved = simSet sim ChunkData { chunkType=Air } x y
+ in simSet moved ChunkData { chunkType=Water } (x+1) y
+ -- stay put
+ else sim
+
+updatePumpChunk x y valid sim =
+ if elem (0,1) valid && fromEnum (simGetChunkType sim x (y+1)) == fromEnum Air
+ then simSet sim ChunkData { chunkType=Water } x (y+1)
+ else if elem (-1,0) valid && fromEnum (simGetChunkType sim (x-1) y) == fromEnum Air
+ then simSet sim ChunkData { chunkType=Water } (x-1) y
+ else if elem (1,0) valid && fromEnum (simGetChunkType sim (x+1) y) == fromEnum Air
+ then simSet sim ChunkData { chunkType=Water } (x+1) y
+ else sim
+
+updateDrainChunk x y valid sim =
+ if elem (0,1) valid && fromEnum (simGetChunkType sim x (y+1)) == fromEnum Water
+ then simSet sim ChunkData { chunkType=Air } x (y+1)
+ else if elem (0,-1) valid && fromEnum (simGetChunkType sim x (y-1)) == fromEnum Water
+ then simSet sim ChunkData { chunkType=Air } x (y-1)
+ else if elem (1,0) valid && fromEnum (simGetChunkType sim (x+1) y) == fromEnum Water
+ then simSet sim ChunkData { chunkType=Air } (x+1) y
+ else if elem (-1,0) valid && fromEnum (simGetChunkType sim (x-1) y) == fromEnum Water
+ then simSet sim ChunkData { chunkType=Air } (x-1) y
+ else sim