drain and pump
[ekitaihs.git] / Sim.hs
diff --git a/Sim.hs b/Sim.hs
index 8f20343..64aef9b 100644 (file)
--- a/Sim.hs
+++ b/Sim.hs
@@ -17,7 +17,9 @@ data Simulation = Simulation
 
 data ChunkType = Air
     | Water 
-    | Wall deriving (Show, Enum)
+    | Wall
+    | Pump
+    | Drain deriving (Show, Enum)
 
 data ChunkData = ChunkData 
     { chunkType         :: ChunkType
@@ -47,6 +49,8 @@ _physStep grid acc sim@Simulation{simSpace=s,simW=w,simH=h} =
           valid = validDirects x y w h
           next = case simGetChunkType sim x y of
               Water -> updateWaterChunk x y valid acc
+              Pump -> updatePumpChunk x y valid acc
+              Drain -> updateDrainChunk x y valid acc
               _ -> acc
           -- spawn = simSet next (ChunkData Water) 5 0
 
@@ -77,6 +81,26 @@ updateWaterChunk x y valid sim =
     -- 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
+
 -- gets chunks around a given chunk that are inside grid
 -- validDirects x y w h | trace ("w:"++ show w ++ "h:" ++ show h) False = undefined
 validDirects x y w h = filter
@@ -95,14 +119,20 @@ insert n y xs = countdown n xs where
    countdown _ [] = []
    countdown m (x:xs) = x:countdown (m-1) xs
 
-stringToSim :: Int -> Int -> [Char] -> Simulation
-stringToSim w h st =
-    _stringToSim st [(x, y) | x <- [0..w-1], y <- [0..h-1]] (initSimSpace w h)
+-- stringToSim :: [String] -> Simulation
+stringToSim strings =
+    _stringToSim st grid (initSimSpace w h)
+    where stripped = strings
+          w = maximum $ [(length s) | s <- stripped]
+          h = length stripped
+          grid = [(a,b) | a <- [0..(length stripped)-1], b <- [0..(length $ stripped !! a)-1]]
+          st = concat stripped
+
 _stringToSim st grid acc =
     if null grid || null st then acc
     else _stringToSim (tail st) (tail grid) next
-    where x = fst $ head grid
-          y = snd $ head grid
+    where y = fst $ head grid -- not exactly sure why y and x got switched here
+          x = snd $ head grid
           next = simSet acc (charToChunk $ head st) x y
 
 -- maps each chunktype to an ascii character
@@ -110,8 +140,10 @@ chunkToChar :: ChunkData -> Char
 chunkToChar c =
     case chunkType c of
         Water -> '~'
-        Air -> '.'
+        Air -> ' '
         Wall -> '#'
+        Pump -> '@'
+        Drain -> 'O'
         _ -> '?'
 
 -- this is redundant, fix this somehow
@@ -120,5 +152,7 @@ charToChunk c =
     ChunkData { chunkType=ctype }
     where ctype = if c=='~' then Water
                   else if c=='#' then Wall
+                  else if c=='@' then Pump
+                  else if c=='O' then Drain
                   else Air