diff --git a/app/Main.hs b/app/Main.hs index 5949c82..a25b568 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -1,10 +1,7 @@ module Main (main) where -import Graphics.Map.Map +import Application.App -import Graphics.Gloss main :: IO () -main = do - createinitmap <- initmap - display window black createinitmap +main = runPacMan diff --git a/hs-pac-man.cabal b/hs-pac-man.cabal index 09224dd..e232176 100644 --- a/hs-pac-man.cabal +++ b/hs-pac-man.cabal @@ -25,8 +25,11 @@ source-repository head library exposed-modules: - Application - Game.Ghosts.Algo.AStar.Common + Application.App + Application.HandleKeys + Application.RenderGS + Application.UpdateGS + Game.GameData.Tile Game.Ghosts.Algo.AStar.Default.Blinky Game.Ghosts.Algo.AStar.Default.Clyde Game.Ghosts.Algo.AStar.Default.Inky @@ -40,15 +43,23 @@ library Game.Ghosts.Algo.AStar.Tiles.AllTileDataAStar Game.Ghosts.Algo.AStar.Tiles.Default Game.Ghosts.Algo.AStar.Tiles.Definition + Game.Ghosts.GhostCoorToCookieCoor + Game.Ghosts.Movement.Blinky + Game.Ghosts.Movement.Clyde + Game.Ghosts.Movement.Inky + Game.Ghosts.Movement.Pinky Game.Initial.Definition Game.Initial.Level1 Game.Initial.Level2_4 Game.Initial.Level5_All + Game.Pacman.Movement + Game.Pacman.PacmanCoorToCookieCoor + Game.Pacman.Tile Game.Types Graphics.Map.Dynamic.Cookies.AllCookies Graphics.Map.Dynamic.Cookies.Common Graphics.Map.Dynamic.Cookies.Definition - Graphics.Map.Dynamic.Cookies.InitialCookies + Graphics.Map.Dynamic.Cookies.DrawCookies Graphics.Map.Dynamic.Ghosts.BlinkyStart Graphics.Map.Dynamic.Ghosts.ClydeStart Graphics.Map.Dynamic.Ghosts.Definition @@ -56,7 +67,6 @@ library Graphics.Map.Dynamic.Ghosts.PinkyStart Graphics.Map.Dynamic.Pacman.Definition Graphics.Map.Dynamic.Pacman.PacmanStart - Graphics.Map.Map Graphics.Map.Static.Borders.Common Graphics.Map.Static.Borders.InnerOuterBorder Graphics.Map.Static.Borders.OuterOuterBorder @@ -69,6 +79,7 @@ library Graphics.Map.Static.Tiles.AllTileData Graphics.Map.Static.Tiles.Default Graphics.Map.Static.Tiles.Definition + Graphics.Map.Static.Tiles.GhostHouse.AllTileData Graphics.Map.Static.Tiles.TileToCookieCoor Graphics.Map.Static.Walls.Common Graphics.Map.Static.Walls.Wall1 @@ -90,6 +101,12 @@ library Graphics.Map.Static.Walls.Wall7 Graphics.Map.Static.Walls.Wall8 Graphics.Map.Static.Walls.Wall9 + Rendering.GhostHouse.GhostHouseStart + Rendering.GhostHouse.StartingLoop.Clyde + Rendering.GhostHouse.StartingLoop.Definition + Rendering.GhostHouse.StartingLoop.Inky + Rendering.GhostHouse.StartingLoop.Pinky + Rendering.GhostHouse.StartingPositions other-modules: Paths_hs_pac_man hs-source-dirs: @@ -126,6 +143,7 @@ library Strict TupleSections TypeApplications + TypeFamilies TypeFamilyDependencies TypeOperators TypeSynonymInstances @@ -143,11 +161,11 @@ library , bytestring , containers , gloss + , iris , jose , lens , pqueue , servant - , stm , websockets , wuss default-language: Haskell2010 @@ -190,6 +208,7 @@ executable hs-pac-man Strict TupleSections TypeApplications + TypeFamilies TypeFamilyDependencies TypeOperators TypeSynonymInstances @@ -208,11 +227,11 @@ executable hs-pac-man , containers , gloss , hs-pac-man + , iris , jose , lens , pqueue , servant - , stm , websockets , wuss default-language: Haskell2010 @@ -233,11 +252,11 @@ test-suite hs-pac-man-test , containers , gloss , hs-pac-man + , iris , jose , lens , pqueue , servant - , stm , websockets , wuss default-language: Haskell2010 diff --git a/package.yaml b/package.yaml index 599d02c..d233b25 100644 --- a/package.yaml +++ b/package.yaml @@ -25,10 +25,10 @@ dependencies: - bytestring - containers - gloss +- iris - jose - lens - pqueue -- stm - servant - websockets - wuss @@ -80,6 +80,7 @@ library: - Strict - TupleSections - TypeApplications + - TypeFamilies - TypeFamilyDependencies - TypeOperators - TypeSynonymInstances @@ -126,6 +127,7 @@ executables: - Strict - TupleSections - TypeApplications + - TypeFamilies - TypeFamilyDependencies - TypeOperators - TypeSynonymInstances diff --git a/src/Application.hs b/src/Application.hs deleted file mode 100644 index 6b83029..0000000 --- a/src/Application.hs +++ /dev/null @@ -1,9 +0,0 @@ -module Application where - -import Graphics.Map.Map -import Game.Initial.Level1 -import Game.Initial.Level2_4 -import Game.Initial.Level5_All -import Game.Initial.Definition - -import Control.Monad (forever) diff --git a/src/Application/App.hs b/src/Application/App.hs new file mode 100644 index 0000000..98432e5 --- /dev/null +++ b/src/Application/App.hs @@ -0,0 +1,31 @@ +module Application.App where + +import Application.HandleKeys +import Application.UpdateGS +import Application.RenderGS +import Game.Initial.Definition +import Game.Initial.Level1 +import Game.Initial.Level2_4 +import Game.Initial.Level5_All + +import Control.Monad +import Graphics.Gloss.Interface.IO.Game + + +fps :: Int +fps = 60 + +runPacMan :: IO () +runPacMan = do + --Initialize starting game state. + startinggamestate <- initialgamestatelevel1 + --Run game loop. + playIO window + black + fps + startinggamestate + renderGS + handleKeys + updateGS + --createinitmap <- initmap + --display window black createinitmap diff --git a/src/Application/HandleKeys.hs b/src/Application/HandleKeys.hs new file mode 100644 index 0000000..610d247 --- /dev/null +++ b/src/Application/HandleKeys.hs @@ -0,0 +1,14189 @@ +module Application.HandleKeys where + +import Game.Types +import Game.GameData.Tile +import Game.Ghosts.Algo.AStar.Run.Blinky +import Game.Ghosts.Algo.AStar.Run.Pinky +import Game.Ghosts.Algo.AStar.Run.Inky +import Game.Ghosts.Algo.AStar.Run.Clyde +import Game.Ghosts.Algo.AStar.Tiles.Default +import Game.Ghosts.Algo.AStar.Tiles.Definition +import Game.Ghosts.Movement.Blinky +import Game.Ghosts.Movement.Pinky +import Game.Ghosts.Movement.Inky +import Game.Ghosts.Movement.Clyde +import Game.Initial.Level1 +import Game.Initial.Level2_4 +import Game.Initial.Level5_All +import Game.Pacman.Movement +import Game.Pacman.PacmanCoorToCookieCoor +import Game.Pacman.Tile +import Game.Ghosts.GhostCoorToCookieCoor +import Graphics.Map.Static.Tiles.AllTileData +import Graphics.Map.Static.Tiles.Default +import Graphics.Map.Static.Tiles.Definition +import Graphics.Map.Static.Tiles.TileToCookieCoor + +import Graphics.Gloss +import Graphics.Gloss.Interface.IO.Interact +import Data.IORef +import Data.Maybe (isJust,isNothing) +import Data.Sequence as Seq (filter,findIndexL,index,viewl,ViewL(..)) + + +handleKeys :: Event + -> GameData + -> IO GameData +handleKeys cevent@(EventKey (SpecialKey KeyUp) _ _ _) gd = do + --Get current pacman state. + pacmancurrentstate <- readIORef $ + pacmanstate gd + --Ensure pacman can move in the up direction. + if | (wallup $ + walldata $ + pacmancurrenttile pacmancurrentstate) == True + -> do --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Get current tile state. + tilecurrentstate <- readIORef $ + tilestate gd + --Get current pacman state. + pacmancurrentstate <- readIORef $ + pacmanstate gd + --Get the current tile center coordinates that pacman occupies. + let pacmancurrentcc = pacmanCoorToCookieCoor $ + pacmancurrentposition pacmancurrentstate + let pacmanincenteroftile = case Seq.viewl (Seq.filter (\x -> pacmancurrentcc == (centercoordinates $ cookiedata x)) tilecurrentstate) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + let pacmanintilethatcontainscookie = case Seq.viewl (Seq.filter (\x -> (tilenumber $ pacmancurrenttile pacmancurrentstate) == (tilenumber x)) tilecurrentstate) of + Seq.EmptyL -> False + (x Seq.:< _) -> isJust $ cookietype $ cookiedata x + --Run through positional possibilities for Pacman. + if | --Pacman is in the center of a tile AND the tile contains a cookie. + pacmanincenteroftile && + pacmanintilethatcontainscookie + -> do --Get tile to be updated since pacman just ate a cookie. + let tiletobeupdated = case Seq.viewl (Seq.filter (\x -> (tilenumber $ pacmancurrenttile pacmancurrentstate) == (tilenumber x)) tilecurrentstate) of + Seq.EmptyL -> defaulttile + (x Seq.:< _) -> x + --Update tilestate to reflect the change in the tile (cookie was eaten). + let updatedtilestate = updateGameDataTile tiletobeupdated + tilecurrentstate + _ <- writeIORef (tilestate gd) + updatedtilestate + --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | --Pacman is now in the center of a tile AND the tile DOESNT contain a cookie. + pacmanincenteroftile && + (not pacmanintilethatcontainscookie) + -> do --Update Pacman's position after moving up. + let updatedpacmanstatef = updatePacmanMovement cevent + pacmancurrentstate + --Update Pacman's current tile after moving up. + let updatedpacmanstateff = updatePacmanTile tilecurrentstate + pacmancurrentstate + --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | --Pacman is not in the center of a tile. + otherwise + -> do --Update Pacman's position after moving up. + _ <- modifyIORef' (pacmanstate gd) + (\x -> updatePacmanMovement cevent + x + ) + --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } +handleKeys cevent@(EventKey (SpecialKey KeyDown) _ _ _) gd = do + --Get current pacman state. + pacmancurrentstate <- readIORef $ + pacmanstate gd + --Ensure pacman can move in the down direction. + if | (walldown $ + walldata $ + pacmancurrenttile pacmancurrentstate) == True + -> do --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Get current tile state. + tilecurrentstate <- readIORef $ + tilestate gd + --Get current pacman state. + pacmancurrentstate <- readIORef $ + pacmanstate gd + --Get the current tile center coordinates that pacman occupies. + let pacmancurrentcc = pacmanCoorToCookieCoor $ + pacmancurrentposition pacmancurrentstate + let pacmanincenteroftile = case Seq.viewl (Seq.filter (\x -> pacmancurrentcc == (centercoordinates $ cookiedata x)) tilecurrentstate) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + let pacmanintilethatcontainscookie = case Seq.viewl (Seq.filter (\x -> (tilenumber $ pacmancurrenttile pacmancurrentstate) == (tilenumber x)) tilecurrentstate) of + Seq.EmptyL -> False + (x Seq.:< _) -> isJust $ cookietype $ cookiedata x + --Run through positional possibilities for Pacman. + if | --Pacman is in the center of a tile AND the tile contains a cookie. + pacmanincenteroftile && + pacmanintilethatcontainscookie + -> do --Get tile to be updated since pacman just ate a cookie. + let tiletobeupdated = case Seq.viewl (Seq.filter (\x -> (tilenumber $ pacmancurrenttile pacmancurrentstate) == (tilenumber x)) tilecurrentstate) of + Seq.EmptyL -> defaulttile + (x Seq.:< _) -> x + --Update tilestate to reflect the change in the tile (cookie was eaten). + let updatedtilestate = updateGameDataTile tiletobeupdated + tilecurrentstate + _ <- writeIORef (tilestate gd) + updatedtilestate + --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | --Pacman is now in the center of a tile AND the tile DOESNT contain a cookie. + pacmanincenteroftile && + (not pacmanintilethatcontainscookie) + -> do --Update Pacman's position after moving up. + let updatedpacmanstatef = updatePacmanMovement cevent + pacmancurrentstate + --Update Pacman's current tile after moving up. + let updatedpacmanstateff = updatePacmanTile tilecurrentstate + pacmancurrentstate + --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | --Pacman is not in the center of a tile. + otherwise + -> do --Update Pacman's position after moving up. + _ <- modifyIORef' (pacmanstate gd) + (\x -> updatePacmanMovement cevent + x + ) + --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } +handleKeys cevent@(EventKey (SpecialKey KeyLeft) _ _ _) gd = do + --Get current pacman state. + pacmancurrentstate <- readIORef $ + pacmanstate gd + --Ensure pacman can move in the left direction. + if | (wallleft $ + walldata $ + pacmancurrenttile pacmancurrentstate) == True + -> do --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Get current tile state. + tilecurrentstate <- readIORef $ + tilestate gd + --Get current pacman state. + pacmancurrentstate <- readIORef $ + pacmanstate gd + --Get the current tile center coordinates that pacman occupies. + let pacmancurrentcc = pacmanCoorToCookieCoor $ + pacmancurrentposition pacmancurrentstate + let pacmanincenteroftile = case Seq.viewl (Seq.filter (\x -> pacmancurrentcc == (centercoordinates $ cookiedata x)) tilecurrentstate) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + let pacmanintilethatcontainscookie = case Seq.viewl (Seq.filter (\x -> (tilenumber $ pacmancurrenttile pacmancurrentstate) == (tilenumber x)) tilecurrentstate) of + Seq.EmptyL -> False + (x Seq.:< _) -> isJust $ cookietype $ cookiedata x + --Run through positional possibilities for Pacman. + if | --Pacman is in the center of a tile AND the tile contains a cookie. + pacmanincenteroftile && + pacmanintilethatcontainscookie + -> do --Get tile to be updated since pacman just ate a cookie. + let tiletobeupdated = case Seq.viewl (Seq.filter (\x -> (tilenumber $ pacmancurrenttile pacmancurrentstate) == (tilenumber x)) tilecurrentstate) of + Seq.EmptyL -> defaulttile + (x Seq.:< _) -> x + --Update tilestate to reflect the change in the tile (cookie was eaten). + let updatedtilestate = updateGameDataTile tiletobeupdated + tilecurrentstate + _ <- writeIORef (tilestate gd) + updatedtilestate + --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | --Pacman is now in the center of a tile AND the tile DOESNT contain a cookie. + pacmanincenteroftile && + (not pacmanintilethatcontainscookie) + -> do --Update Pacman's position after moving up. + let updatedpacmanstatef = updatePacmanMovement cevent + pacmancurrentstate + --Update Pacman's current tile after moving up. + let updatedpacmanstateff = updatePacmanTile tilecurrentstate + pacmancurrentstate + --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | --Pacman is not in the center of a tile. + otherwise + -> do --Update Pacman's position after moving up. + _ <- modifyIORef' (pacmanstate gd) + (\x -> updatePacmanMovement cevent + x + ) + --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } +handleKeys cevent@(EventKey (SpecialKey KeyRight) _ _ _) gd = do + --Get current pacman state. + pacmancurrentstate <- readIORef $ + pacmanstate gd + --Ensure pacman can move in the right direction. + if | (wallright $ + walldata $ + pacmancurrenttile pacmancurrentstate) == True + -> do --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Get current tile state. + tilecurrentstate <- readIORef $ + tilestate gd + --Get current pacman state. + pacmancurrentstate <- readIORef $ + pacmanstate gd + --Get the current tile center coordinates that pacman occupies. + let pacmancurrentcc = pacmanCoorToCookieCoor $ + pacmancurrentposition pacmancurrentstate + let pacmanincenteroftile = case Seq.viewl (Seq.filter (\x -> pacmancurrentcc == (centercoordinates $ cookiedata x)) tilecurrentstate) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + let pacmanintilethatcontainscookie = case Seq.viewl (Seq.filter (\x -> (tilenumber $ pacmancurrenttile pacmancurrentstate) == (tilenumber x)) tilecurrentstate) of + Seq.EmptyL -> False + (x Seq.:< _) -> isJust $ cookietype $ cookiedata x + --Run through positional possibilities for Pacman. + if | --Pacman is in the center of a tile AND the tile contains a cookie. + pacmanincenteroftile && + pacmanintilethatcontainscookie + -> do --Get tile to be updated since pacman just ate a cookie. + let tiletobeupdated = case Seq.viewl (Seq.filter (\x -> (tilenumber $ pacmancurrenttile pacmancurrentstate) == (tilenumber x)) tilecurrentstate) of + Seq.EmptyL -> defaulttile + (x Seq.:< _) -> x + --Update tilestate to reflect the change in the tile (cookie was eaten). + let updatedtilestate = updateGameDataTile tiletobeupdated + tilecurrentstate + _ <- writeIORef (tilestate gd) + updatedtilestate + --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | --Pacman is now in the center of a tile AND the tile DOESNT contain a cookie. + pacmanincenteroftile && + (not pacmanintilethatcontainscookie) + -> do --Update Pacman's position after moving up. + let updatedpacmanstatef = updatePacmanMovement cevent + pacmancurrentstate + --Update Pacman's current tile after moving up. + let updatedpacmanstateff = updatePacmanTile tilecurrentstate + pacmancurrentstate + --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | --Pacman is not in the center of a tile. + otherwise + -> do --Update Pacman's position after moving up. + _ <- modifyIORef' (pacmanstate gd) + (\x -> updatePacmanMovement cevent + x + ) + --Determine if the ghosts need to rerun their astar searches + --(if the ghosts center coordinates match a tiles center coordinates). + --Blinky + blinkycurrentstate <- readIORef $ + blinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd + inkycurrentstate <- readIORef $ + inkystate gd + clydecurrentstate <- readIORef $ + clydestate gd + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition blinkycurrentstate + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | blinkyincenteroftile + -> do --Update blinky's state. + blinkyastar <- runAStarBlinky gd + _ <- writeIORef (blinkystate gd) + blinkyastar + --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clyde's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update blinky's movement. + _ <- modifyIORef' (blinkystate gd) + updateBlinkyMovement + --See if the other ghosts (Pinky, Inky and Clyde) are still in the ghost house. + if | (pinkycurrentmode pinkycurrentstate) == GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) == GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) == GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | (pinkycurrentmode pinkycurrentstate) /= GhostHouseStart && + (inkycurrentmode inkycurrentstate) /= GhostHouseStart && + (clydecurrentmode clydecurrentstate) /= GhostHouseStart + -> do --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition pinkycurrentstate + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition inkycurrentstate + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition clydecurrentstate + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (x Seq.:< _) -> True + if | pinkyincenteroftile && + inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and inky's state. + pinkyastar <- runAStarPinky gd + inkyastar <- runAStarInky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's and clyde's state. + pinkyastar <- runAStarPinky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (pinkystate gd) + pinkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile && + clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's and clydes's state. + inkyastar <- runAStarInky gd + clydeastar <- runAStarClyde gd + _ <- writeIORef (inkystate gd) + inkyastar + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | pinkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's state. + pinkyastar <- runAStarPinky gd + _ <- writeIORef (pinkystate gd) + pinkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | inkyincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update inky's state. + inkyastar <- runAStarInky gd + _ <- writeIORef (inkystate gd) + inkyastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | clydeincenteroftile + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update clyde's state. + clydeastar <- runAStarClyde gd + _ <- writeIORef (clydestate gd) + clydeastar + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } + | otherwise + -> do --Update gamestate (InProgress). + _ <- writeIORef (gamestate gd) + InProgress + --Update pinky's, inky's and clyde's movement. + _ <- modifyIORef' (pinkystate gd) + updatePinkyMovement + _ <- modifyIORef' (inkystate gd) + updateInkyMovement + _ <- modifyIORef' (clydestate gd) + updateClydeMovement + return GameData { gamestate = gamestate gd + , tilestate = tilestate gd + , currentlevel = currentlevel gd + , currentscore = currentscore gd + , pacmanstate = pacmanstate gd + , blinkystate = blinkystate gd + , pinkystate = pinkystate gd + , inkystate = inkystate gd + , clydestate = clydestate gd + , doteatentimer = doteatentimer gd + } +handleKeys _ gd = return gd diff --git a/src/Graphics/Map/Map.hs b/src/Application/RenderGS.hs similarity index 55% rename from src/Graphics/Map/Map.hs rename to src/Application/RenderGS.hs index d5dab33..0e0ac7a 100644 --- a/src/Graphics/Map/Map.hs +++ b/src/Application/RenderGS.hs @@ -1,4 +1,28 @@ -module Graphics.Map.Map where +module Application.RenderGS where + +import Game.Types +import Game.GameData.Tile +import Game.Ghosts.Algo.AStar.Run.Blinky +import Game.Ghosts.Algo.AStar.Run.Pinky +import Game.Ghosts.Algo.AStar.Run.Inky +import Game.Ghosts.Algo.AStar.Run.Clyde +import Game.Ghosts.Algo.AStar.Tiles.Default +import Game.Ghosts.Algo.AStar.Tiles.Definition +import Game.Ghosts.Movement.Blinky +import Game.Ghosts.Movement.Pinky +import Game.Ghosts.Movement.Inky +import Game.Ghosts.Movement.Clyde +import Game.Initial.Level1 +import Game.Initial.Level2_4 +import Game.Initial.Level5_All +import Game.Pacman.Movement +import Game.Pacman.PacmanCoorToCookieCoor +import Game.Pacman.Tile +import Game.Ghosts.GhostCoorToCookieCoor +import Graphics.Map.Static.Tiles.AllTileData +import Graphics.Map.Static.Tiles.Default +import Graphics.Map.Static.Tiles.Definition +import Graphics.Map.Static.Tiles.TileToCookieCoor import Graphics.Map.Dynamic.Pacman.PacmanStart import Graphics.Map.Dynamic.Ghosts.BlinkyStart @@ -37,25 +61,43 @@ import Graphics.Map.Static.GhostHouse.OuterGhostHouse import Graphics.Map.Static.GhostHouseGate.GhostHouseGate import Graphics.Map.Dynamic.Cookies.AllCookies -import Graphics.Map.Dynamic.Cookies.InitialCookies +import Graphics.Map.Dynamic.Cookies.DrawCookies -import Graphics.Gloss +import Rendering.GhostHouse.StartingPositions +import Graphics.Gloss +import Graphics.Gloss.Interface.IO.Interact +import Data.IORef +import Data.Maybe (isJust,isNothing) +import Data.Sequence as Seq (filter,findIndexL,index,viewl,ViewL(..)) -{-Define SDL2 window to display game.-} window :: Display window = InWindow "Pac-Man Clone" (1120,1440) --(224*5,288*5) (0,0) -{-------------------------------------} - - -{-Define all bitmaps making up the map.-} - -initmap :: IO Picture -initmap = do +renderGS :: GameData + -> IO Picture +renderGS gd = do + --Grab tile state. + tilecurrentstate <- readIORef $ + tilestate gd + --Grab pacman state. + pacmancurrentstate <- readIORef $ + pacmanstate gd + --Grab blinky state. + blinkycurrentstate <- readIORef $ + blinkystate gd + --Grab pinky state. + pinkycurrentstate <- readIORef $ + pinkystate gd + --Grab inky state. + inkycurrentstate <- readIORef $ + inkystate gd + --Grab clyde state. + clydecurrentstate <- readIORef $ + clydestate gd createhorizontalgridlines <- horizontalgridlines createverticalgridlines <- verticalgridlines createinnerouterborder <- innerouterborder @@ -82,12 +124,13 @@ initmap = do createinnerghosthouse <- innerghosthouse createouterghosthouse <- outerghosthouse createghosthousegate <- ghosthousegate - createallcookiesinit <- allcookiesinit allcookiedatainit - createpacmaninit <- drawpacmans (557,378) - createblinkyinit <- drawblinkys (557,858) - createpinkyinit <- drawpinkys (557,738) - createinkyinit <- drawinkys (487,738) - createclydeinit <- drawclydes (627,738) + cookiescurrent <- drawCookies tilecurrentstate + allcookiedatainit + pacmancurrent <- drawpacmans (pacmancurrentposition pacmancurrentstate) --drawpacmans pacmanstartingposition + blinkycurrent <- drawblinkys (blinkycurrentposition blinkycurrentstate) --drawblinkys blinkystartingposition + pinkycurrent <- drawpinkys (pinkycurrentposition pinkycurrentstate) --drawpinkys pinkystartingposition + inkycurrent <- drawinkys (inkycurrentposition inkycurrentstate) --drawinkys inkystartingposition + clydecurrent <- drawclydes (clydecurrentposition clydecurrentstate) --drawclydes clydestartingposition return $ Pictures [ createhorizontalgridlines , createverticalgridlines , createinnerouterborder @@ -114,12 +157,10 @@ initmap = do , createinnerghosthouse , createouterghosthouse , createghosthousegate - , createallcookiesinit - , createpacmaninit - , createblinkyinit - , createpinkyinit - , createinkyinit - , createclydeinit + , cookiescurrent + , pacmancurrent + , blinkycurrent + , pinkycurrent + , inkycurrent + , clydecurrent ] - -{---------------------------------------} diff --git a/src/Application/UpdateGS.hs b/src/Application/UpdateGS.hs new file mode 100644 index 0000000..914393d --- /dev/null +++ b/src/Application/UpdateGS.hs @@ -0,0 +1,90 @@ +module Application.UpdateGS where + +import Game.Types +import Game.GameData.Tile +import Game.Ghosts.Algo.AStar.Run.Blinky +import Game.Ghosts.Algo.AStar.Run.Pinky +import Game.Ghosts.Algo.AStar.Run.Inky +import Game.Ghosts.Algo.AStar.Run.Clyde +import Game.Ghosts.Algo.AStar.Tiles.Default +import Game.Ghosts.Algo.AStar.Tiles.Definition +import Game.Ghosts.Movement.Blinky +import Game.Ghosts.Movement.Pinky +import Game.Ghosts.Movement.Inky +import Game.Ghosts.Movement.Clyde +import Game.Initial.Level1 +import Game.Initial.Level2_4 +import Game.Initial.Level5_All +import Game.Pacman.Movement +import Game.Pacman.PacmanCoorToCookieCoor +import Game.Pacman.Tile +import Game.Ghosts.GhostCoorToCookieCoor +import Graphics.Map.Static.Tiles.AllTileData +import Graphics.Map.Static.Tiles.Default +import Graphics.Map.Static.Tiles.Definition +import Graphics.Map.Static.Tiles.TileToCookieCoor + +import Graphics.Gloss +import Graphics.Gloss.Interface.IO.Interact +import Data.IORef +import Data.Maybe (isJust,isNothing) +import Data.Sequence as Seq (filter,findIndexL,index,viewl,ViewL(..)) + + +updateGS :: Float + -> GameData + -> IO GameData +updateGS _ gd = do + --Get current tile state. + tilecurrentstate <- readIORef $ + tilestate gd + --Get pacman current state. + pacmancurrentstate <- readIORef $ + pacmanstate gd + --Get blinky's current state. + blinkycurrentstate <- readIORef $ + blinkystate gd + let blinkycurrenttiletn = tilenumberastar $ + blinkycurrenttile $ + blinkycurrentstate + --Get pinky's current state. + pinkycurrentstate <- readIORef $ + pinkystate gd + let pinkycurrenttiletn = case (pinkycurrenttile pinkycurrentstate) of + Nothing -> tilenumberastar defaulttileastar + Just tile -> tilenumberastar tile + --Get inky's current state. + inkycurrentstate <- readIORef $ + inkystate gd + let inkycurrenttiletn = case (inkycurrenttile inkycurrentstate) of + Nothing -> tilenumberastar defaulttileastar + Just tile -> tilenumberastar tile + --Get clyde's current state. + clydecurrentstate <- readIORef $ + clydestate gd + let clydecurrenttiletn = case (clydecurrenttile clydecurrentstate) of + Nothing -> tilenumberastar defaulttileastar + Just tile -> tilenumberastar tile + --Check to see if pacman has been caught by one of the ghosts. + if | (tilenumber $ pacmancurrenttile $ pacmancurrentstate) /= blinkycurrenttiletn && + (tilenumber $ pacmancurrenttile $ pacmancurrentstate) /= pinkycurrenttiletn && + (tilenumber $ pacmancurrenttile $ pacmancurrentstate) /= inkycurrenttiletn && + (tilenumber $ pacmancurrenttile $ pacmancurrentstate) /= clydecurrenttiletn + -> --Pacman wasn't caught by any of the ghosts. + --Check to see if the all of the dots have been eaten by pacman. + if | all (\x -> isNothing $ cookietype $ cookiedata x) tilecurrentstate + -> --Level was finished, bump level number. + do currentlevel' <- readIORef $ + currentlevel gd + let currentlevelnew = currentlevel' + 1 + if | currentlevelnew >= 2 && + currentlevelnew <= 4 + -> initialgamestatelevel2_4 currentlevelnew + | otherwise + -> initialgamestatelevel5_all currentlevelnew + | otherwise + -> --Still more dots to be eaten. + return gd + | otherwise + -> --Pacman was caught by a ghost! + initialgamestatelevel1 diff --git a/src/Game/GameData/Tile.hs b/src/Game/GameData/Tile.hs new file mode 100644 index 0000000..5cf63f8 --- /dev/null +++ b/src/Game/GameData/Tile.hs @@ -0,0 +1,29 @@ +module Game.GameData.Tile where + +import Graphics.Map.Static.Tiles.AllTileData +import Graphics.Map.Static.Tiles.Definition + +import Data.Sequence as Seq (filter,findIndexL,update,viewl,Seq(..),ViewL(..)) + + +updateGameDataTile :: TileData + -> Seq TileData + -> Seq TileData +updateGameDataTile tiletoupdate ts = + case Seq.viewl (Seq.filter (\t -> (tilenumber tiletoupdate) == (tilenumber t)) ts) of + Seq.EmptyL -> alltiledatainit + (x Seq.:< _) -> do let updateindex = case (Seq.findIndexL (\t -> (tilenumber tiletoupdate) == (tilenumber t)) ts) of + Nothing -> (-1) + Just i -> i + let updatedtile = TileData { tilenumber = tilenumber x + , tilecoordinate = tilecoordinate x + , tileoccupied = tileoccupied x + , cookiedata = CookieData { cookietype = Nothing + , centercoordinates = centercoordinates $ cookiedata x + } + , walldata = walldata x + , adjacentto = adjacentto x + } + Seq.update updateindex + updatedtile + ts diff --git a/src/Game/Ghosts/Algo/AStar/Common.hs b/src/Game/Ghosts/Algo/AStar/Common.hs deleted file mode 100644 index fd6c6c2..0000000 --- a/src/Game/Ghosts/Algo/AStar/Common.hs +++ /dev/null @@ -1,17 +0,0 @@ -module Game.Ghosts.Algo.AStar.Common where - -import Data.Map.Strict as DMS - - -get :: (Ord k, Bounded a) - => Map k a - -> k - -> a -get m x = DMS.findWithDefault maxBound x m - -set :: Ord k - => Map k a - -> k - -> a - -> Map k a -set m k x = DMS.insert k x m diff --git a/src/Game/Ghosts/Algo/AStar/Default/Clyde.hs b/src/Game/Ghosts/Algo/AStar/Default/Clyde.hs index e877e6d..96d71e2 100644 --- a/src/Game/Ghosts/Algo/AStar/Default/Clyde.hs +++ b/src/Game/Ghosts/Algo/AStar/Default/Clyde.hs @@ -16,4 +16,5 @@ clydeastardefault = ClydeState { clydecurrentmode = Chase , clydecurrentdirection = None , clydecurrentspeed = (-1) , clydedotcounter = (-1) + , clydeghsl = Nothing } diff --git a/src/Game/Ghosts/Algo/AStar/Default/Inky.hs b/src/Game/Ghosts/Algo/AStar/Default/Inky.hs index b6f319a..5a78deb 100644 --- a/src/Game/Ghosts/Algo/AStar/Default/Inky.hs +++ b/src/Game/Ghosts/Algo/AStar/Default/Inky.hs @@ -16,4 +16,5 @@ inkyastardefault = InkyState { inkycurrentmode = Chase , inkycurrentdirection = None , inkycurrentspeed = (-1) , inkydotcounter = (-1) + , inkyghsl = Nothing } diff --git a/src/Game/Ghosts/Algo/AStar/Default/Pinky.hs b/src/Game/Ghosts/Algo/AStar/Default/Pinky.hs index 6395030..8a54063 100644 --- a/src/Game/Ghosts/Algo/AStar/Default/Pinky.hs +++ b/src/Game/Ghosts/Algo/AStar/Default/Pinky.hs @@ -16,4 +16,5 @@ pinkyastardefault = PinkyState { pinkycurrentmode = Chase , pinkycurrentdirection = None , pinkycurrentspeed = (-1) , pinkydotcounter = (-1) + , pinkyghsl = Nothing } diff --git a/src/Game/Ghosts/Algo/AStar/Run/Blinky.hs b/src/Game/Ghosts/Algo/AStar/Run/Blinky.hs index c12b200..fbb07bd 100644 --- a/src/Game/Ghosts/Algo/AStar/Run/Blinky.hs +++ b/src/Game/Ghosts/Algo/AStar/Run/Blinky.hs @@ -6,15 +6,13 @@ import Game.Types import Game.Ghosts.Algo.AStar.Tiles.Default import Game.Ghosts.Algo.AStar.Tiles.Definition import Game.Ghosts.Algo.AStar.Tiles.AllTileDataAStar -import Game.Ghosts.Algo.AStar.Common import Game.Ghosts.Algo.AStar.Definition import Game.Ghosts.Algo.AStar.Distance import Game.Ghosts.Algo.AStar.Default.Blinky import Graphics.Map.Static.Tiles.Definition -import Control.Concurrent.STM as CCSTM -import Data.Foldable as DFold (toList) -import Data.List as DL (elem,map,unfoldr) +import Data.IORef +import Data.List as DL (unfoldr) import Data.Map.Strict as DMS import Data.PQueue.Min as DPQM import Data.Sequence as Seq (filter,fromList,Seq(..)) @@ -23,7 +21,7 @@ import Data.Sequence as Seq (filter,fromList,Seq(..)) runAStarBlinky :: GameData -> IO BlinkyState runAStarBlinky gd = do - blinkycurrentstate <- CCSTM.readTVarIO $ + blinkycurrentstate <- readIORef $ blinkystate gd let blinkyct = blinkycurrenttile blinkycurrentstate let pqstart = DPQM.singleton blinkyct @@ -34,9 +32,9 @@ runAStarBlinky gd = do astarblinky <- astarloop a0 return astarblinky where - astarloop a = do blinkycurrentstate <- CCSTM.readTVarIO $ - blinkystate gd - pacmancurrentstate <- CCSTM.readTVarIO $ + astarloop a = do blinkycurrentstate <- readIORef $ + blinkystate gd + pacmancurrentstate <- readIORef $ pacmanstate gd let pacmanct = pacmancurrenttile pacmancurrentstate let pacmanctastar = TileDataAStar { tilenumberastar = tilenumber pacmanct @@ -74,9 +72,9 @@ runAStarBlinky gd = do astarloop a' where go a Seq.Empty = return a - go a (currentneighbor :<| restofneighbors) = do blinkycurrentstate <- CCSTM.readTVarIO $ + go a (currentneighbor :<| restofneighbors) = do blinkycurrentstate <- readIORef $ blinkystate gd - pacmancurrentstate <- CCSTM.readTVarIO $ + pacmancurrentstate <- readIORef $ pacmanstate gd let blinkyct = blinkycurrenttile blinkycurrentstate let pacmanct = pacmancurrenttile pacmancurrentstate @@ -124,7 +122,7 @@ runAStarBlinky gd = do pqs = case (DPQM.getMin (openset a)) of Nothing -> defaulttileastar Just minqe -> minqe - getPath m = do pacmancurrentstate <- CCSTM.readTVarIO $ + getPath m = do pacmancurrentstate <- readIORef $ pacmanstate gd let pacmanct = pacmancurrenttile pacmancurrentstate let pacmanctastar = TileDataAStar { tilenumberastar = tilenumber pacmanct diff --git a/src/Game/Ghosts/Algo/AStar/Run/Clyde.hs b/src/Game/Ghosts/Algo/AStar/Run/Clyde.hs index f7417fa..7a3aacb 100644 --- a/src/Game/Ghosts/Algo/AStar/Run/Clyde.hs +++ b/src/Game/Ghosts/Algo/AStar/Run/Clyde.hs @@ -6,24 +6,22 @@ import Game.Types import Game.Ghosts.Algo.AStar.Tiles.Default import Game.Ghosts.Algo.AStar.Tiles.Definition import Game.Ghosts.Algo.AStar.Tiles.AllTileDataAStar -import Game.Ghosts.Algo.AStar.Common import Game.Ghosts.Algo.AStar.Definition import Game.Ghosts.Algo.AStar.Distance import Game.Ghosts.Algo.AStar.Default.Clyde import Graphics.Map.Static.Tiles.Definition -import Control.Concurrent.STM as CCSTM -import Data.Foldable as DFold (toList) -import Data.List as DL (elem,map,unfoldr) +import Data.IORef +import Data.List as DL (unfoldr) import Data.Map.Strict as DMS import Data.PQueue.Min as DPQM import Data.Sequence as Seq (filter,fromList,Seq(..)) runAStarClyde :: GameData - -> IO ClydeState + -> IO ClydeState runAStarClyde gd = do - clydecurrentstate <- CCSTM.readTVarIO $ + clydecurrentstate <- readIORef $ clydestate gd let clydect = case (clydecurrenttile clydecurrentstate) of Nothing -> defaulttileastar @@ -36,9 +34,9 @@ runAStarClyde gd = do astarclyde <- astarloop a0 return astarclyde where - astarloop a = do clydecurrentstate <- CCSTM.readTVarIO $ + astarloop a = do clydecurrentstate <- readIORef $ clydestate gd - pacmancurrentstate <- CCSTM.readTVarIO $ + pacmancurrentstate <- readIORef $ pacmanstate gd let pacmanct = pacmancurrenttile pacmancurrentstate let pacmanctastar = TileDataAStar { tilenumberastar = tilenumber pacmanct @@ -65,6 +63,7 @@ runAStarClyde gd = do , clydecurrentdirection = clydecurrentdirection clydecurrentstate , clydecurrentspeed = clydecurrentspeed clydecurrentstate , clydedotcounter = clydedotcounter clydecurrentstate + , clydeghsl = clydeghsl clydecurrentstate } return newclydestate | otherwise @@ -76,9 +75,9 @@ runAStarClyde gd = do astarloop a' where go a Seq.Empty = return a - go a (currentneighbor :<| restofneighbors) = do clydecurrentstate <- CCSTM.readTVarIO $ + go a (currentneighbor :<| restofneighbors) = do clydecurrentstate <- readIORef $ clydestate gd - pacmancurrentstate <- CCSTM.readTVarIO $ + pacmancurrentstate <- readIORef $ pacmanstate gd let clydect = case (clydecurrenttile clydecurrentstate) of Nothing -> defaulttileastar @@ -128,7 +127,7 @@ runAStarClyde gd = do pqs = case (DPQM.getMin (openset a)) of Nothing -> defaulttileastar Just minqe -> minqe - getPath m = do pacmancurrentstate <- CCSTM.readTVarIO $ + getPath m = do pacmancurrentstate <- readIORef $ pacmanstate gd let pacmanct = pacmancurrenttile pacmancurrentstate let pacmanctastar = TileDataAStar { tilenumberastar = tilenumber pacmanct diff --git a/src/Game/Ghosts/Algo/AStar/Run/Inky.hs b/src/Game/Ghosts/Algo/AStar/Run/Inky.hs index 1262bed..262b29e 100644 --- a/src/Game/Ghosts/Algo/AStar/Run/Inky.hs +++ b/src/Game/Ghosts/Algo/AStar/Run/Inky.hs @@ -6,15 +6,13 @@ import Game.Types import Game.Ghosts.Algo.AStar.Tiles.Default import Game.Ghosts.Algo.AStar.Tiles.Definition import Game.Ghosts.Algo.AStar.Tiles.AllTileDataAStar -import Game.Ghosts.Algo.AStar.Common import Game.Ghosts.Algo.AStar.Definition import Game.Ghosts.Algo.AStar.Distance import Game.Ghosts.Algo.AStar.Default.Inky import Graphics.Map.Static.Tiles.Definition -import Control.Concurrent.STM as CCSTM -import Data.Foldable as DFold (toList) -import Data.List as DL (elem,map,unfoldr) +import Data.IORef +import Data.List as DL (unfoldr) import Data.Map.Strict as DMS import Data.PQueue.Min as DPQM import Data.Sequence as Seq (filter,fromList,Seq(..)) @@ -23,7 +21,7 @@ import Data.Sequence as Seq (filter,fromList,Seq(..)) runAStarInky :: GameData -> IO InkyState runAStarInky gd = do - inkycurrentstate <- CCSTM.readTVarIO $ + inkycurrentstate <- readIORef $ inkystate gd let inkyct = case (inkycurrenttile inkycurrentstate) of Nothing -> defaulttileastar @@ -36,9 +34,9 @@ runAStarInky gd = do astarinky <- astarloop a0 return astarinky where - astarloop a = do inkycurrentstate <- CCSTM.readTVarIO $ + astarloop a = do inkycurrentstate <- readIORef $ inkystate gd - pacmancurrentstate <- CCSTM.readTVarIO $ + pacmancurrentstate <- readIORef $ pacmanstate gd let pacmanct = pacmancurrenttile pacmancurrentstate let pacmanctastar = TileDataAStar { tilenumberastar = tilenumber pacmanct @@ -65,6 +63,7 @@ runAStarInky gd = do , inkycurrentdirection = inkycurrentdirection inkycurrentstate , inkycurrentspeed = inkycurrentspeed inkycurrentstate , inkydotcounter = inkydotcounter inkycurrentstate + , inkyghsl = inkyghsl inkycurrentstate } return newinkystate | otherwise @@ -76,9 +75,9 @@ runAStarInky gd = do astarloop a' where go a Seq.Empty = return a - go a (currentneighbor :<| restofneighbors) = do inkycurrentstate <- CCSTM.readTVarIO $ + go a (currentneighbor :<| restofneighbors) = do inkycurrentstate <- readIORef $ inkystate gd - pacmancurrentstate <- CCSTM.readTVarIO $ + pacmancurrentstate <- readIORef $ pacmanstate gd let inkyct = case (inkycurrenttile inkycurrentstate) of Nothing -> defaulttileastar @@ -128,7 +127,7 @@ runAStarInky gd = do pqs = case (DPQM.getMin (openset a)) of Nothing -> defaulttileastar Just minqe -> minqe - getPath m = do pacmancurrentstate <- CCSTM.readTVarIO $ + getPath m = do pacmancurrentstate <- readIORef $ pacmanstate gd let pacmanct = pacmancurrenttile pacmancurrentstate let pacmanctastar = TileDataAStar { tilenumberastar = tilenumber pacmanct diff --git a/src/Game/Ghosts/Algo/AStar/Run/Pinky.hs b/src/Game/Ghosts/Algo/AStar/Run/Pinky.hs index 4dc4f36..25289ff 100644 --- a/src/Game/Ghosts/Algo/AStar/Run/Pinky.hs +++ b/src/Game/Ghosts/Algo/AStar/Run/Pinky.hs @@ -6,15 +6,14 @@ import Game.Types import Game.Ghosts.Algo.AStar.Tiles.Default import Game.Ghosts.Algo.AStar.Tiles.Definition import Game.Ghosts.Algo.AStar.Tiles.AllTileDataAStar -import Game.Ghosts.Algo.AStar.Common + import Game.Ghosts.Algo.AStar.Definition import Game.Ghosts.Algo.AStar.Distance import Game.Ghosts.Algo.AStar.Default.Pinky import Graphics.Map.Static.Tiles.Definition -import Control.Concurrent.STM as CCSTM -import Data.Foldable as DFold (toList) -import Data.List as DL (elem,map,unfoldr) +import Data.IORef +import Data.List as DL (unfoldr) import Data.Map.Strict as DMS import Data.PQueue.Min as DPQM import Data.Sequence as Seq (filter,fromList,Seq(..)) @@ -23,8 +22,8 @@ import Data.Sequence as Seq (filter,fromList,Seq(..)) runAStarPinky :: GameData -> IO PinkyState runAStarPinky gd = do - pinkycurrentstate <- CCSTM.readTVarIO $ - pinkystate gd + pinkycurrentstate <- readIORef $ + pinkystate gd let pinkyct = case (pinkycurrenttile pinkycurrentstate) of Nothing -> defaulttileastar Just ct -> ct @@ -36,9 +35,9 @@ runAStarPinky gd = do astarpinky <- astarloop a0 return astarpinky where - astarloop a = do pinkycurrentstate <- CCSTM.readTVarIO $ + astarloop a = do pinkycurrentstate <- readIORef $ pinkystate gd - pacmancurrentstate <- CCSTM.readTVarIO $ + pacmancurrentstate <- readIORef $ pacmanstate gd let pacmanct = pacmancurrenttile pacmancurrentstate let pacmanctastar = TileDataAStar { tilenumberastar = tilenumber pacmanct @@ -65,6 +64,7 @@ runAStarPinky gd = do , pinkycurrentdirection = pinkycurrentdirection pinkycurrentstate , pinkycurrentspeed = pinkycurrentspeed pinkycurrentstate , pinkydotcounter = pinkydotcounter pinkycurrentstate + , pinkyghsl = pinkyghsl pinkycurrentstate } return newpinkystate | otherwise @@ -76,9 +76,9 @@ runAStarPinky gd = do astarloop a' where go a Seq.Empty = return a - go a (currentneighbor :<| restofneighbors) = do pinkycurrentstate <- CCSTM.readTVarIO $ + go a (currentneighbor :<| restofneighbors) = do pinkycurrentstate <- readIORef $ pinkystate gd - pacmancurrentstate <- CCSTM.readTVarIO $ + pacmancurrentstate <- readIORef $ pacmanstate gd let pinkyct = case (pinkycurrenttile pinkycurrentstate) of Nothing -> defaulttileastar @@ -128,7 +128,7 @@ runAStarPinky gd = do pqs = case (DPQM.getMin (openset a)) of Nothing -> defaulttileastar Just minqe -> minqe - getPath m = do pacmancurrentstate <- CCSTM.readTVarIO $ + getPath m = do pacmancurrentstate <- readIORef $ pacmanstate gd let pacmanct = pacmancurrenttile pacmancurrentstate let pacmanctastar = TileDataAStar { tilenumberastar = tilenumber pacmanct diff --git a/src/Game/Ghosts/GhostCoorToCookieCoor.hs b/src/Game/Ghosts/GhostCoorToCookieCoor.hs new file mode 100644 index 0000000..31d6e70 --- /dev/null +++ b/src/Game/Ghosts/GhostCoorToCookieCoor.hs @@ -0,0 +1,5 @@ +module Game.Ghosts.GhostCoorToCookieCoor where + +ghostCoorToCookieCoor :: (Int,Int) + -> (Int,Int) +ghostCoorToCookieCoor (gx,gy) = ((1120 - (20 + gx)) + 10,gy + 10) diff --git a/src/Game/Ghosts/Movement/Blinky.hs b/src/Game/Ghosts/Movement/Blinky.hs new file mode 100644 index 0000000..4d6bbd6 --- /dev/null +++ b/src/Game/Ghosts/Movement/Blinky.hs @@ -0,0 +1,174 @@ +module Game.Ghosts.Movement.Blinky where + +import Game.Types +import Game.Ghosts.Algo.AStar.Tiles.Definition +import Game.Ghosts.GhostCoorToCookieCoor +import Graphics.Map.Static.Tiles.AllTileData +import Graphics.Map.Static.Tiles.Definition + +import Data.Sequence as Seq (filter,findIndexL,index,viewl,ViewL(..)) + + +updateBlinkyMovement :: BlinkyState + -> BlinkyState +updateBlinkyMovement ps = do + --Get the current tile center coordinates that blinky occupies. + let blinkycurrentcc = ghostCoorToCookieCoor $ + blinkycurrentposition ps + let blinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> blinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (_ Seq.:< _) -> True + if | blinkyincenteroftile + -> do let blinkynexttileindex = case (Seq.findIndexL (\x -> (tilenumberastar x) == (tilenumberastar $ blinkycurrenttile ps)) (blinkytargettileseq ps)) of + Nothing -> (-1) + Just i -> i + 1 + if | ((\(a,_) -> a) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + (blinkytargettileseq ps) `Seq.index` blinkynexttileindex) <= + ((\(a,_) -> a) $ + (\(x:_) -> x ) $ + tilecoordinateastar $ + blinkycurrenttile ps) + -> BlinkyState { blinkycurrentmode = blinkycurrentmode ps + , blinkycurrentdrawstate = if | (blinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , blinkycurrentposition = ( fst $ blinkycurrentposition ps + , (\x -> x - 1) $ fst $ blinkycurrentposition ps + ) + , blinkycurrenttile = blinkycurrenttile ps + , blinkytargettile = blinkytargettile ps + , blinkytargettileseq = blinkytargettileseq ps + , blinkycurrentdirection = Game.Types.Left + , blinkycurrentspeed = blinkycurrentspeed ps + , blinkydotcounter = blinkydotcounter ps + } + | ((\(a,_) -> a) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + (blinkytargettileseq ps) `Seq.index` blinkynexttileindex) >= + ((\(a,_) -> a) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + blinkycurrenttile ps) + -> BlinkyState { blinkycurrentmode = blinkycurrentmode ps + , blinkycurrentdrawstate = if | (blinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , blinkycurrentposition = ( fst $ blinkycurrentposition ps + , (\x -> x + 1) $ fst $ blinkycurrentposition ps + ) + , blinkycurrenttile = blinkycurrenttile ps + , blinkytargettile = blinkytargettile ps + , blinkytargettileseq = blinkytargettileseq ps + , blinkycurrentdirection = Game.Types.Right + , blinkycurrentspeed = blinkycurrentspeed ps + , blinkydotcounter = blinkydotcounter ps + } + | ((\(_,b) -> b) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + (blinkytargettileseq ps) `Seq.index` blinkynexttileindex) <= + ((\(_,b) -> b) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + blinkycurrenttile ps) + -> BlinkyState { blinkycurrentmode = blinkycurrentmode ps + , blinkycurrentdrawstate = if | (blinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , blinkycurrentposition = ( fst $ blinkycurrentposition ps + , (\y -> y + 1) $ snd $ blinkycurrentposition ps + ) + , blinkycurrenttile = blinkycurrenttile ps + , blinkytargettile = blinkytargettile ps + , blinkytargettileseq = blinkytargettileseq ps + , blinkycurrentdirection = Down + , blinkycurrentspeed = blinkycurrentspeed ps + , blinkydotcounter = blinkydotcounter ps + } + | otherwise + -> BlinkyState { blinkycurrentmode = blinkycurrentmode ps + , blinkycurrentdrawstate = if | (blinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , blinkycurrentposition = ( fst $ blinkycurrentposition ps + , (\y -> y - 1) $ snd $ blinkycurrentposition ps + ) + , blinkycurrenttile = blinkycurrenttile ps + , blinkytargettile = blinkytargettile ps + , blinkytargettileseq = blinkytargettileseq ps + , blinkycurrentdirection = Up + , blinkycurrentspeed = blinkycurrentspeed ps + , blinkydotcounter = blinkydotcounter ps + } + | otherwise + -> if | (blinkycurrentdirection ps) == Up + -> BlinkyState { blinkycurrentmode = blinkycurrentmode ps + , blinkycurrentdrawstate = if | (blinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , blinkycurrentposition = ( fst $ blinkycurrentposition ps + , (\y -> y + 1) $ snd $ blinkycurrentposition ps + ) + , blinkycurrenttile = blinkycurrenttile ps + , blinkytargettile = blinkytargettile ps + , blinkytargettileseq = blinkytargettileseq ps + , blinkycurrentdirection = blinkycurrentdirection ps + , blinkycurrentspeed = blinkycurrentspeed ps + , blinkydotcounter = blinkydotcounter ps + } + | (blinkycurrentdirection ps) == Down + -> BlinkyState { blinkycurrentmode = blinkycurrentmode ps + , blinkycurrentdrawstate = if | (blinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , blinkycurrentposition = ( fst $ blinkycurrentposition ps + , (\y -> y - 1) $ snd $ blinkycurrentposition ps + ) + , blinkycurrenttile = blinkycurrenttile ps + , blinkytargettile = blinkytargettile ps + , blinkytargettileseq = blinkytargettileseq ps + , blinkycurrentdirection = blinkycurrentdirection ps + , blinkycurrentspeed = blinkycurrentspeed ps + , blinkydotcounter = blinkydotcounter ps + } + | (blinkycurrentdirection ps) == Game.Types.Left + -> BlinkyState { blinkycurrentmode = blinkycurrentmode ps + , blinkycurrentdrawstate = if | (blinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , blinkycurrentposition = ( (\x -> x - 1) $ fst $ blinkycurrentposition ps + , snd $ blinkycurrentposition ps + ) + , blinkycurrenttile = blinkycurrenttile ps + , blinkytargettile = blinkytargettile ps + , blinkytargettileseq = blinkytargettileseq ps + , blinkycurrentdirection = blinkycurrentdirection ps + , blinkycurrentspeed = blinkycurrentspeed ps + , blinkydotcounter = blinkydotcounter ps + } + | otherwise + -> BlinkyState { blinkycurrentmode = blinkycurrentmode ps + , blinkycurrentdrawstate = if | (blinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , blinkycurrentposition = ( (\x -> x + 1) $ fst $ blinkycurrentposition ps + , snd $ blinkycurrentposition ps + ) + , blinkycurrenttile = blinkycurrenttile ps + , blinkytargettile = blinkytargettile ps + , blinkytargettileseq = blinkytargettileseq ps + , blinkycurrentdirection = blinkycurrentdirection ps + , blinkycurrentspeed = blinkycurrentspeed ps + , blinkydotcounter = blinkydotcounter ps + } diff --git a/src/Game/Ghosts/Movement/Clyde.hs b/src/Game/Ghosts/Movement/Clyde.hs new file mode 100644 index 0000000..691bd0d --- /dev/null +++ b/src/Game/Ghosts/Movement/Clyde.hs @@ -0,0 +1,186 @@ +module Game.Ghosts.Movement.Clyde where + +import Game.Ghosts.Algo.AStar.Tiles.Default +import Game.Types +import Game.Ghosts.Algo.AStar.Tiles.Definition +import Game.Ghosts.GhostCoorToCookieCoor +import Graphics.Map.Static.Tiles.AllTileData +import Graphics.Map.Static.Tiles.Definition + +import Data.Sequence as Seq (filter,findIndexL,index,viewl,ViewL(..)) + + +updateClydeMovement :: ClydeState + -> ClydeState +updateClydeMovement ps = do + --Get the current tile center coordinates that clyde occupies. + let clydecurrentcc = ghostCoorToCookieCoor $ + clydecurrentposition ps + let clydecurrentt = case (clydecurrenttile ps) of + Nothing -> defaulttileastar + Just ct -> ct + let clydeincenteroftile = case Seq.viewl (Seq.filter (\x -> clydecurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (_ Seq.:< _) -> True + if | clydeincenteroftile + -> do let clydenexttileindex = case (Seq.findIndexL (\x -> (tilenumberastar x) == (tilenumberastar clydecurrentt)) (clydetargettileseq ps)) of + Nothing -> (-1) + Just i -> i + 1 + if | ((\(a,_) -> a) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + (clydetargettileseq ps) `Seq.index` clydenexttileindex) <= + ((\(a,_) -> a) $ + (\(x:_) -> x ) $ + tilecoordinateastar $ + clydecurrentt) + -> ClydeState { clydecurrentmode = clydecurrentmode ps + , clydecurrentdrawstate = if | (clydecurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , clydecurrentposition = ( fst $ clydecurrentposition ps + , (\x -> x - 1) $ fst $ clydecurrentposition ps + ) + , clydecurrenttile = clydecurrenttile ps + , clydetargettile = clydetargettile ps + , clydetargettileseq = clydetargettileseq ps + , clydecurrentdirection = Game.Types.Left + , clydecurrentspeed = clydecurrentspeed ps + , clydedotcounter = clydedotcounter ps + , clydeghsl = clydeghsl ps + } + | ((\(a,_) -> a) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + (clydetargettileseq ps) `Seq.index` clydenexttileindex) >= + ((\(a,_) -> a) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + clydecurrentt) + -> ClydeState { clydecurrentmode = clydecurrentmode ps + , clydecurrentdrawstate = if | (clydecurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , clydecurrentposition = ( fst $ clydecurrentposition ps + , (\x -> x + 1) $ fst $ clydecurrentposition ps + ) + , clydecurrenttile = clydecurrenttile ps + , clydetargettile = clydetargettile ps + , clydetargettileseq = clydetargettileseq ps + , clydecurrentdirection = Game.Types.Right + , clydecurrentspeed = clydecurrentspeed ps + , clydedotcounter = clydedotcounter ps + , clydeghsl = clydeghsl ps + } + | ((\(_,b) -> b) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + (clydetargettileseq ps) `Seq.index` clydenexttileindex) <= + ((\(_,b) -> b) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + clydecurrentt) + -> ClydeState { clydecurrentmode = clydecurrentmode ps + , clydecurrentdrawstate = if | (clydecurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , clydecurrentposition = ( fst $ clydecurrentposition ps + , (\y -> y + 1) $ snd $ clydecurrentposition ps + ) + , clydecurrenttile = clydecurrenttile ps + , clydetargettile = clydetargettile ps + , clydetargettileseq = clydetargettileseq ps + , clydecurrentdirection = Down + , clydecurrentspeed = clydecurrentspeed ps + , clydedotcounter = clydedotcounter ps + , clydeghsl = clydeghsl ps + } + | otherwise + -> ClydeState { clydecurrentmode = clydecurrentmode ps + , clydecurrentdrawstate = if | (clydecurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , clydecurrentposition = ( fst $ clydecurrentposition ps + , (\y -> y - 1) $ snd $ clydecurrentposition ps + ) + , clydecurrenttile = clydecurrenttile ps + , clydetargettile = clydetargettile ps + , clydetargettileseq = clydetargettileseq ps + , clydecurrentdirection = Up + , clydecurrentspeed = clydecurrentspeed ps + , clydedotcounter = clydedotcounter ps + , clydeghsl = clydeghsl ps + } + | otherwise + -> if | (clydecurrentdirection ps) == Up + -> ClydeState { clydecurrentmode = clydecurrentmode ps + , clydecurrentdrawstate = if | (clydecurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , clydecurrentposition = ( fst $ clydecurrentposition ps + , (\y -> y + 1) $ snd $ clydecurrentposition ps + ) + , clydecurrenttile = clydecurrenttile ps + , clydetargettile = clydetargettile ps + , clydetargettileseq = clydetargettileseq ps + , clydecurrentdirection = clydecurrentdirection ps + , clydecurrentspeed = clydecurrentspeed ps + , clydedotcounter = clydedotcounter ps + , clydeghsl = clydeghsl ps + } + | (clydecurrentdirection ps) == Down + -> ClydeState { clydecurrentmode = clydecurrentmode ps + , clydecurrentdrawstate = if | (clydecurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , clydecurrentposition = ( fst $ clydecurrentposition ps + , (\y -> y - 1) $ snd $ clydecurrentposition ps + ) + , clydecurrenttile = clydecurrenttile ps + , clydetargettile = clydetargettile ps + , clydetargettileseq = clydetargettileseq ps + , clydecurrentdirection = clydecurrentdirection ps + , clydecurrentspeed = clydecurrentspeed ps + , clydedotcounter = clydedotcounter ps + , clydeghsl = clydeghsl ps + } + | (clydecurrentdirection ps) == Game.Types.Left + -> ClydeState { clydecurrentmode = clydecurrentmode ps + , clydecurrentdrawstate = if | (clydecurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , clydecurrentposition = ( (\x -> x - 1) $ fst $ clydecurrentposition ps + , snd $ clydecurrentposition ps + ) + , clydecurrenttile = clydecurrenttile ps + , clydetargettile = clydetargettile ps + , clydetargettileseq = clydetargettileseq ps + , clydecurrentdirection = clydecurrentdirection ps + , clydecurrentspeed = clydecurrentspeed ps + , clydedotcounter = clydedotcounter ps + , clydeghsl = clydeghsl ps + } + | otherwise + -> ClydeState { clydecurrentmode = clydecurrentmode ps + , clydecurrentdrawstate = if | (clydecurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , clydecurrentposition = ( (\x -> x + 1) $ fst $ clydecurrentposition ps + , snd $ clydecurrentposition ps + ) + , clydecurrenttile = clydecurrenttile ps + , clydetargettile = clydetargettile ps + , clydetargettileseq = clydetargettileseq ps + , clydecurrentdirection = clydecurrentdirection ps + , clydecurrentspeed = clydecurrentspeed ps + , clydedotcounter = clydedotcounter ps + , clydeghsl = clydeghsl ps + } diff --git a/src/Game/Ghosts/Movement/Inky.hs b/src/Game/Ghosts/Movement/Inky.hs new file mode 100644 index 0000000..9e639e2 --- /dev/null +++ b/src/Game/Ghosts/Movement/Inky.hs @@ -0,0 +1,186 @@ +module Game.Ghosts.Movement.Inky where + +import Game.Ghosts.Algo.AStar.Tiles.Default +import Game.Types +import Game.Ghosts.Algo.AStar.Tiles.Definition +import Game.Ghosts.GhostCoorToCookieCoor +import Graphics.Map.Static.Tiles.AllTileData +import Graphics.Map.Static.Tiles.Definition + +import Data.Sequence as Seq (filter,findIndexL,index,viewl,ViewL(..)) + + +updateInkyMovement :: InkyState + -> InkyState +updateInkyMovement ps = do + --Get the current tile center coordinates that inky occupies. + let inkycurrentcc = ghostCoorToCookieCoor $ + inkycurrentposition ps + let inkycurrentt = case (inkycurrenttile ps) of + Nothing -> defaulttileastar + Just ct -> ct + let inkyincenteroftile = case Seq.viewl (Seq.filter (\x -> inkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (_ Seq.:< _) -> True + if | inkyincenteroftile + -> do let inkynexttileindex = case (Seq.findIndexL (\x -> (tilenumberastar x) == (tilenumberastar inkycurrentt)) (inkytargettileseq ps)) of + Nothing -> (-1) + Just i -> i + 1 + if | ((\(a,_) -> a) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + (inkytargettileseq ps) `Seq.index` inkynexttileindex) <= + ((\(a,_) -> a) $ + (\(x:_) -> x ) $ + tilecoordinateastar $ + inkycurrentt) + -> InkyState { inkycurrentmode = inkycurrentmode ps + , inkycurrentdrawstate = if | (inkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , inkycurrentposition = ( fst $ inkycurrentposition ps + , (\x -> x - 1) $ fst $ inkycurrentposition ps + ) + , inkycurrenttile = inkycurrenttile ps + , inkytargettile = inkytargettile ps + , inkytargettileseq = inkytargettileseq ps + , inkycurrentdirection = Game.Types.Left + , inkycurrentspeed = inkycurrentspeed ps + , inkydotcounter = inkydotcounter ps + , inkyghsl = inkyghsl ps + } + | ((\(a,_) -> a) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + (inkytargettileseq ps) `Seq.index` inkynexttileindex) >= + ((\(a,_) -> a) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + inkycurrentt) + -> InkyState { inkycurrentmode = inkycurrentmode ps + , inkycurrentdrawstate = if | (inkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , inkycurrentposition = ( fst $ inkycurrentposition ps + , (\x -> x + 1) $ fst $ inkycurrentposition ps + ) + , inkycurrenttile = inkycurrenttile ps + , inkytargettile = inkytargettile ps + , inkytargettileseq = inkytargettileseq ps + , inkycurrentdirection = Game.Types.Right + , inkycurrentspeed = inkycurrentspeed ps + , inkydotcounter = inkydotcounter ps + , inkyghsl = inkyghsl ps + } + | ((\(_,b) -> b) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + (inkytargettileseq ps) `Seq.index` inkynexttileindex) <= + ((\(_,b) -> b) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + inkycurrentt) + -> InkyState { inkycurrentmode = inkycurrentmode ps + , inkycurrentdrawstate = if | (inkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , inkycurrentposition = ( fst $ inkycurrentposition ps + , (\y -> y + 1) $ snd $ inkycurrentposition ps + ) + , inkycurrenttile = inkycurrenttile ps + , inkytargettile = inkytargettile ps + , inkytargettileseq = inkytargettileseq ps + , inkycurrentdirection = Down + , inkycurrentspeed = inkycurrentspeed ps + , inkydotcounter = inkydotcounter ps + , inkyghsl = inkyghsl ps + } + | otherwise + -> InkyState { inkycurrentmode = inkycurrentmode ps + , inkycurrentdrawstate = if | (inkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , inkycurrentposition = ( fst $ inkycurrentposition ps + , (\y -> y - 1) $ snd $ inkycurrentposition ps + ) + , inkycurrenttile = inkycurrenttile ps + , inkytargettile = inkytargettile ps + , inkytargettileseq = inkytargettileseq ps + , inkycurrentdirection = Up + , inkycurrentspeed = inkycurrentspeed ps + , inkydotcounter = inkydotcounter ps + , inkyghsl = inkyghsl ps + } + | otherwise + -> if | (inkycurrentdirection ps) == Up + -> InkyState { inkycurrentmode = inkycurrentmode ps + , inkycurrentdrawstate = if | (inkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , inkycurrentposition = ( fst $ inkycurrentposition ps + , (\y -> y + 1) $ snd $ inkycurrentposition ps + ) + , inkycurrenttile = inkycurrenttile ps + , inkytargettile = inkytargettile ps + , inkytargettileseq = inkytargettileseq ps + , inkycurrentdirection = inkycurrentdirection ps + , inkycurrentspeed = inkycurrentspeed ps + , inkydotcounter = inkydotcounter ps + , inkyghsl = inkyghsl ps + } + | (inkycurrentdirection ps) == Down + -> InkyState { inkycurrentmode = inkycurrentmode ps + , inkycurrentdrawstate = if | (inkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , inkycurrentposition = ( fst $ inkycurrentposition ps + , (\y -> y - 1) $ snd $ inkycurrentposition ps + ) + , inkycurrenttile = inkycurrenttile ps + , inkytargettile = inkytargettile ps + , inkytargettileseq = inkytargettileseq ps + , inkycurrentdirection = inkycurrentdirection ps + , inkycurrentspeed = inkycurrentspeed ps + , inkydotcounter = inkydotcounter ps + , inkyghsl = inkyghsl ps + } + | (inkycurrentdirection ps) == Game.Types.Left + -> InkyState { inkycurrentmode = inkycurrentmode ps + , inkycurrentdrawstate = if | (inkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , inkycurrentposition = ( (\x -> x - 1) $ fst $ inkycurrentposition ps + , snd $ inkycurrentposition ps + ) + , inkycurrenttile = inkycurrenttile ps + , inkytargettile = inkytargettile ps + , inkytargettileseq = inkytargettileseq ps + , inkycurrentdirection = inkycurrentdirection ps + , inkycurrentspeed = inkycurrentspeed ps + , inkydotcounter = inkydotcounter ps + , inkyghsl = inkyghsl ps + } + | otherwise + -> InkyState { inkycurrentmode = inkycurrentmode ps + , inkycurrentdrawstate = if | (inkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , inkycurrentposition = ( (\x -> x + 1) $ fst $ inkycurrentposition ps + , snd $ inkycurrentposition ps + ) + , inkycurrenttile = inkycurrenttile ps + , inkytargettile = inkytargettile ps + , inkytargettileseq = inkytargettileseq ps + , inkycurrentdirection = inkycurrentdirection ps + , inkycurrentspeed = inkycurrentspeed ps + , inkydotcounter = inkydotcounter ps + , inkyghsl = inkyghsl ps + } diff --git a/src/Game/Ghosts/Movement/Pinky.hs b/src/Game/Ghosts/Movement/Pinky.hs new file mode 100644 index 0000000..d5ac2e2 --- /dev/null +++ b/src/Game/Ghosts/Movement/Pinky.hs @@ -0,0 +1,186 @@ +module Game.Ghosts.Movement.Pinky where + +import Game.Ghosts.Algo.AStar.Tiles.Default +import Game.Types +import Game.Ghosts.Algo.AStar.Tiles.Definition +import Game.Ghosts.GhostCoorToCookieCoor +import Graphics.Map.Static.Tiles.AllTileData +import Graphics.Map.Static.Tiles.Definition + +import Data.Sequence as Seq (filter,findIndexL,index,viewl,ViewL(..)) + + +updatePinkyMovement :: PinkyState + -> PinkyState +updatePinkyMovement ps = do + --Get the current tile center coordinates that pinky occupies. + let pinkycurrentcc = ghostCoorToCookieCoor $ + pinkycurrentposition ps + let pinkycurrentt = case (pinkycurrenttile ps) of + Nothing -> defaulttileastar + Just ct -> ct + let pinkyincenteroftile = case Seq.viewl (Seq.filter (\x -> pinkycurrentcc == (centercoordinates $ cookiedata x)) alltiledatainit) of + Seq.EmptyL -> False + (_ Seq.:< _) -> True + if | pinkyincenteroftile + -> do let pinkynexttileindex = case (Seq.findIndexL (\x -> (tilenumberastar x) == (tilenumberastar pinkycurrentt)) (pinkytargettileseq ps)) of + Nothing -> (-1) + Just i -> i + 1 + if | ((\(a,_) -> a) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + (pinkytargettileseq ps) `Seq.index` pinkynexttileindex) <= + ((\(a,_) -> a) $ + (\(x:_) -> x ) $ + tilecoordinateastar $ + pinkycurrentt) + -> PinkyState { pinkycurrentmode = pinkycurrentmode ps + , pinkycurrentdrawstate = if | (pinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , pinkycurrentposition = ( fst $ pinkycurrentposition ps + , (\x -> x - 1) $ fst $ pinkycurrentposition ps + ) + , pinkycurrenttile = pinkycurrenttile ps + , pinkytargettile = pinkytargettile ps + , pinkytargettileseq = pinkytargettileseq ps + , pinkycurrentdirection = Game.Types.Left + , pinkycurrentspeed = pinkycurrentspeed ps + , pinkydotcounter = pinkydotcounter ps + , pinkyghsl = pinkyghsl ps + } + | ((\(a,_) -> a) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + (pinkytargettileseq ps) `Seq.index` pinkynexttileindex) >= + ((\(a,_) -> a) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + pinkycurrentt) + -> PinkyState { pinkycurrentmode = pinkycurrentmode ps + , pinkycurrentdrawstate = if | (pinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , pinkycurrentposition = ( fst $ pinkycurrentposition ps + , (\x -> x + 1) $ fst $ pinkycurrentposition ps + ) + , pinkycurrenttile = pinkycurrenttile ps + , pinkytargettile = pinkytargettile ps + , pinkytargettileseq = pinkytargettileseq ps + , pinkycurrentdirection = Game.Types.Right + , pinkycurrentspeed = pinkycurrentspeed ps + , pinkydotcounter = pinkydotcounter ps + , pinkyghsl = pinkyghsl ps + } + | ((\(_,b) -> b) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + (pinkytargettileseq ps) `Seq.index` pinkynexttileindex) <= + ((\(_,b) -> b) $ + (\(x:_) -> x) $ + tilecoordinateastar $ + pinkycurrentt) + -> PinkyState { pinkycurrentmode = pinkycurrentmode ps + , pinkycurrentdrawstate = if | (pinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , pinkycurrentposition = ( fst $ pinkycurrentposition ps + , (\y -> y + 1) $ snd $ pinkycurrentposition ps + ) + , pinkycurrenttile = pinkycurrenttile ps + , pinkytargettile = pinkytargettile ps + , pinkytargettileseq = pinkytargettileseq ps + , pinkycurrentdirection = Down + , pinkycurrentspeed = pinkycurrentspeed ps + , pinkydotcounter = pinkydotcounter ps + , pinkyghsl = pinkyghsl ps + } + | otherwise + -> PinkyState { pinkycurrentmode = pinkycurrentmode ps + , pinkycurrentdrawstate = if | (pinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , pinkycurrentposition = ( fst $ pinkycurrentposition ps + , (\y -> y - 1) $ snd $ pinkycurrentposition ps + ) + , pinkycurrenttile = pinkycurrenttile ps + , pinkytargettile = pinkytargettile ps + , pinkytargettileseq = pinkytargettileseq ps + , pinkycurrentdirection = Up + , pinkycurrentspeed = pinkycurrentspeed ps + , pinkydotcounter = pinkydotcounter ps + , pinkyghsl = pinkyghsl ps + } + | otherwise + -> if | (pinkycurrentdirection ps) == Up + -> PinkyState { pinkycurrentmode = pinkycurrentmode ps + , pinkycurrentdrawstate = if | (pinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , pinkycurrentposition = ( fst $ pinkycurrentposition ps + , (\y -> y + 1) $ snd $ pinkycurrentposition ps + ) + , pinkycurrenttile = pinkycurrenttile ps + , pinkytargettile = pinkytargettile ps + , pinkytargettileseq = pinkytargettileseq ps + , pinkycurrentdirection = pinkycurrentdirection ps + , pinkycurrentspeed = pinkycurrentspeed ps + , pinkydotcounter = pinkydotcounter ps + , pinkyghsl = pinkyghsl ps + } + | (pinkycurrentdirection ps) == Down + -> PinkyState { pinkycurrentmode = pinkycurrentmode ps + , pinkycurrentdrawstate = if | (pinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , pinkycurrentposition = ( fst $ pinkycurrentposition ps + , (\y -> y - 1) $ snd $ pinkycurrentposition ps + ) + , pinkycurrenttile = pinkycurrenttile ps + , pinkytargettile = pinkytargettile ps + , pinkytargettileseq = pinkytargettileseq ps + , pinkycurrentdirection = pinkycurrentdirection ps + , pinkycurrentspeed = pinkycurrentspeed ps + , pinkydotcounter = pinkydotcounter ps + , pinkyghsl = pinkyghsl ps + } + | (pinkycurrentdirection ps) == Game.Types.Left + -> PinkyState { pinkycurrentmode = pinkycurrentmode ps + , pinkycurrentdrawstate = if | (pinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , pinkycurrentposition = ( (\x -> x - 1) $ fst $ pinkycurrentposition ps + , snd $ pinkycurrentposition ps + ) + , pinkycurrenttile = pinkycurrenttile ps + , pinkytargettile = pinkytargettile ps + , pinkytargettileseq = pinkytargettileseq ps + , pinkycurrentdirection = pinkycurrentdirection ps + , pinkycurrentspeed = pinkycurrentspeed ps + , pinkydotcounter = pinkydotcounter ps + , pinkyghsl = pinkyghsl ps + } + | otherwise + -> PinkyState { pinkycurrentmode = pinkycurrentmode ps + , pinkycurrentdrawstate = if | (pinkycurrentdrawstate ps) == GhostRegularDraw + -> GhostAltDraw + | otherwise + -> GhostRegularDraw + , pinkycurrentposition = ( (\x -> x + 1) $ fst $ pinkycurrentposition ps + , snd $ pinkycurrentposition ps + ) + , pinkycurrenttile = pinkycurrenttile ps + , pinkytargettile = pinkytargettile ps + , pinkytargettileseq = pinkytargettileseq ps + , pinkycurrentdirection = pinkycurrentdirection ps + , pinkycurrentspeed = pinkycurrentspeed ps + , pinkydotcounter = pinkydotcounter ps + , pinkyghsl = pinkyghsl ps + } diff --git a/src/Game/Initial/Level1.hs b/src/Game/Initial/Level1.hs index 1339894..7a9fce7 100644 --- a/src/Game/Initial/Level1.hs +++ b/src/Game/Initial/Level1.hs @@ -7,92 +7,104 @@ import Game.Ghosts.Algo.AStar.Tiles.AllTileDataAStar import Graphics.Map.Static.Tiles.AllTileData import Graphics.Map.Static.Tiles.Default import Graphics.Map.Static.Tiles.Definition -import Game.Initial.Definition +import Rendering.GhostHouse.StartingLoop.Definition -import Control.Monad.STM as CMSTM -import Control.Concurrent.STM.TVar as TVar +import Data.IORef import Data.Sequence as Seq (empty,filter,viewl,ViewL(..)) -initialgamestatelevel1 :: Level - -> IO GameData -initialgamestatelevel1 levelnumber = do - gamedatagamestate <- CMSTM.atomically $ newTVar Start - gamedatacurrentlevel <- CMSTM.atomically $ newTVar levelnumber - gamedatacurrentscore <- CMSTM.atomically $ newTVar 0 - gamedatapacmanstate <- CMSTM.atomically $ - newTVar $ - PacmanState { pacmancurrentposition = (557,378) - , pacmancurrenttile = case Seq.viewl (Seq.filter (\x -> (tilenumber x) == 299) alltiledatainit) of - Seq.EmptyL -> defaulttile - (x Seq.:< _) -> x - , pacmancurrentdirection = None - , pacmancurrentstate = Normal - , pacmancurrentdrawstate = PacmanRegularDraw - , pacmancurrentspeed = 80 - , pacmancurrentlives = 3 - } - gamedatablinkystate <- CMSTM.atomically $ - newTVar $ - BlinkyState { blinkycurrentmode = Chase - , blinkycurrentdrawstate = GhostRegularDraw - , blinkycurrentposition = (557,858) - , blinkycurrenttile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 256) alltiledataastarinit) of - Seq.EmptyL -> defaulttileastar - (x Seq.:< _) -> x - , blinkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of - Seq.EmptyL -> defaulttileastar - (x Seq.:< _) -> x - , blinkytargettileseq = Seq.empty - , blinkycurrentdirection = Game.Types.Right - , blinkycurrentspeed = 75 - , blinkydotcounter = 0 - } - gamedatapinkystate <- CMSTM.atomically $ - newTVar $ - PinkyState { pinkycurrentmode = GhostHouseStart - , pinkycurrentdrawstate = GhostRegularDraw - , pinkycurrentposition = (557,738) - , pinkycurrenttile = Nothing - , pinkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of - Seq.EmptyL -> defaulttileastar - (x Seq.:< _) -> x - , pinkytargettileseq = Seq.empty - , pinkycurrentdirection = Down - , pinkycurrentspeed = 75 - , pinkydotcounter = 0 - } - gamedatainkystate <- CMSTM.atomically $ - newTVar $ - InkyState { inkycurrentmode = GhostHouseStart - , inkycurrentdrawstate = GhostRegularDraw - , inkycurrentposition = (487,738) - , inkycurrenttile = Nothing - , inkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of - Seq.EmptyL -> defaulttileastar - (x Seq.:< _) -> x - , inkytargettileseq = Seq.empty - , inkycurrentdirection = Up - , inkycurrentspeed = 75 - , inkydotcounter = 0 - } - gamedataclydestate <- CMSTM.atomically $ - newTVar $ - ClydeState { clydecurrentmode = GhostHouseStart - , clydecurrentdrawstate = GhostRegularDraw - , clydecurrentposition = (627,738) - , clydecurrenttile = Nothing - , clydetargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of - Seq.EmptyL -> defaulttileastar - (x Seq.:< _) -> x - , clydetargettileseq = Seq.empty - , clydecurrentdirection = Up - , clydecurrentspeed = 75 - , clydedotcounter = 0 - } - gamedatadoteatencounter <- CMSTM.atomically $ - newTVar 0 +initialgamestatelevel1 :: IO GameData +initialgamestatelevel1 = do + gamedatagamestate <- newIORef Start + gamedatatilestate <- newIORef alltiledatainit + gamedatacurrentlevel <- newIORef 1 + gamedatacurrentscore <- newIORef 0 + gamedatapacmanstate <- newIORef $ + PacmanState { pacmancurrentposition = (557,378) + , pacmancurrenttile = case Seq.viewl (Seq.filter (\x -> (tilenumber x) == 299) alltiledatainit) of + Seq.EmptyL -> defaulttile + (x Seq.:< _) -> x + , pacmancurrentdirection = None + , pacmancurrentstate = Normal + , pacmancurrentdrawstate = PacmanRegularDraw + , pacmancurrentspeed = 80 + , pacmancurrentlives = 3 + } + gamedatablinkystate <- newIORef $ + BlinkyState { blinkycurrentmode = Chase + , blinkycurrentdrawstate = GhostRegularDraw + , blinkycurrentposition = (557,858) + , blinkycurrenttile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 256) alltiledataastarinit) of + Seq.EmptyL -> defaulttileastar + (x Seq.:< _) -> x + , blinkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of + Seq.EmptyL -> defaulttileastar + (x Seq.:< _) -> x + , blinkytargettileseq = Seq.empty + , blinkycurrentdirection = Game.Types.Right + , blinkycurrentspeed = 75 + , blinkydotcounter = 0 + } + gamedatapinkystate <- newIORef $ + PinkyState { pinkycurrentmode = GhostHouseStart + , pinkycurrentdrawstate = GhostRegularDraw + , pinkycurrentposition = (557,738) + , pinkycurrenttile = Nothing + , pinkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of + Seq.EmptyL -> defaulttileastar + (x Seq.:< _) -> x + , pinkytargettileseq = Seq.empty + , pinkycurrentdirection = Down + , pinkycurrentspeed = 75 + , pinkydotcounter = 0 + , pinkyghsl = Just $ + GHSLData { ghslnumber = [309,310] + , ghslmovementdirection = GHDown + , ghslup = Just [303,304] + , ghsldown = Just [315,316] + } + } + gamedatainkystate <- newIORef $ + InkyState { inkycurrentmode = GhostHouseStart + , inkycurrentdrawstate = GhostRegularDraw + , inkycurrentposition = (487,738) + , inkycurrenttile = Nothing + , inkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of + Seq.EmptyL -> defaulttileastar + (x Seq.:< _) -> x + , inkytargettileseq = Seq.empty + , inkycurrentdirection = Up + , inkycurrentspeed = 75 + , inkydotcounter = 0 + , inkyghsl = Just $ + GHSLData { ghslnumber = [311,312] + , ghslmovementdirection = GHUp + , ghslup = Just [301,302] + , ghsldown = Just [313,314] + } + } + gamedataclydestate <- newIORef $ + ClydeState { clydecurrentmode = GhostHouseStart + , clydecurrentdrawstate = GhostRegularDraw + , clydecurrentposition = (627,738) + , clydecurrenttile = Nothing + , clydetargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of + Seq.EmptyL -> defaulttileastar + (x Seq.:< _) -> x + , clydetargettileseq = Seq.empty + , clydecurrentdirection = Up + , clydecurrentspeed = 75 + , clydedotcounter = 0 + , clydeghsl = Just $ + GHSLData { ghslnumber = [307,308] + , ghslmovementdirection = GHUp + , ghslup = Just [305,306] + , ghsldown = Just [317,318] + } + } + gamedatadoteatencounter <- newIORef 0 return GameData { gamestate = gamedatagamestate + , tilestate = gamedatatilestate , currentlevel = gamedatacurrentlevel , currentscore = gamedatacurrentscore , pacmanstate = gamedatapacmanstate diff --git a/src/Game/Initial/Level2_4.hs b/src/Game/Initial/Level2_4.hs index c872ddd..27373be 100644 --- a/src/Game/Initial/Level2_4.hs +++ b/src/Game/Initial/Level2_4.hs @@ -8,90 +8,105 @@ import Graphics.Map.Static.Tiles.Definition import Graphics.Map.Static.Tiles.Default import Graphics.Map.Static.Tiles.AllTileData import Game.Initial.Definition +import Rendering.GhostHouse.StartingLoop.Definition -import Control.Monad.STM as CMSTM -import Control.Concurrent.STM.TVar as TVar +import Data.IORef import Data.Sequence as Seq (empty,filter,viewl,ViewL(..)) initialgamestatelevel2_4 :: Level -> IO GameData initialgamestatelevel2_4 levelnumber = do - gamedatagamestate <- CMSTM.atomically $ newTVar Start - gamedatacurrentlevel <- CMSTM.atomically $ newTVar levelnumber - gamedatacurrentscore <- CMSTM.atomically $ newTVar 0 - gamedatapacmanstate <- CMSTM.atomically $ - newTVar $ - PacmanState { pacmancurrentposition = (557,378) - , pacmancurrenttile = case Seq.viewl (Seq.filter (\x -> (tilenumber x) == 299) alltiledatainit) of - Seq.EmptyL -> defaulttile - (x Seq.:< _) -> x - , pacmancurrentdirection = None - , pacmancurrentstate = Normal - , pacmancurrentdrawstate = PacmanRegularDraw - , pacmancurrentspeed = 90 - , pacmancurrentlives = 3 + gamedatagamestate <- newIORef Start + gamedatatilestate <- newIORef alltiledatainit + gamedatacurrentlevel <- newIORef levelnumber + gamedatacurrentscore <- newIORef 0 + gamedatapacmanstate <- newIORef $ + PacmanState { pacmancurrentposition = (557,378) + , pacmancurrenttile = case Seq.viewl (Seq.filter (\x -> (tilenumber x) == 299) alltiledatainit) of + Seq.EmptyL -> defaulttile + (x Seq.:< _) -> x + , pacmancurrentdirection = None + , pacmancurrentstate = Normal + , pacmancurrentdrawstate = PacmanRegularDraw + , pacmancurrentspeed = 90 + , pacmancurrentlives = 3 + } + gamedatablinkystate <- newIORef $ + BlinkyState { blinkycurrentmode = Chase + , blinkycurrentdrawstate = GhostRegularDraw + , blinkycurrentposition = (557,858) + , blinkycurrenttile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 256) alltiledataastarinit) of + Seq.EmptyL -> defaulttileastar + (x Seq.:< _) -> x + , blinkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of + Seq.EmptyL -> defaulttileastar + (x Seq.:< _) -> x + , blinkytargettileseq = Seq.empty + , blinkycurrentdirection = Game.Types.Right + , blinkycurrentspeed = 85 + , blinkydotcounter = 0 + } + gamedatapinkystate <- newIORef $ + PinkyState { pinkycurrentmode = GhostHouseStart + , pinkycurrentdrawstate = GhostRegularDraw + , pinkycurrentposition = (557,738) + , pinkycurrenttile = Nothing + , pinkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of + Seq.EmptyL -> defaulttileastar + (x Seq.:< _) -> x + , pinkytargettileseq = Seq.empty + , pinkycurrentdirection = Down + , pinkycurrentspeed = 85 + , pinkydotcounter = 0 + , pinkyghsl = Just $ + GHSLData { ghslnumber = [309,310] + , ghslmovementdirection = GHDown + , ghslup = Just [303,304] + , ghsldown = Just [315,316] + } } - gamedatablinkystate <- CMSTM.atomically $ - newTVar $ - BlinkyState { blinkycurrentmode = Chase - , blinkycurrentdrawstate = GhostRegularDraw - , blinkycurrentposition = (557,858) - , blinkycurrenttile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 256) alltiledataastarinit) of - Seq.EmptyL -> defaulttileastar - (x Seq.:< _) -> x - , blinkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of - Seq.EmptyL -> defaulttileastar - (x Seq.:< _) -> x - , blinkytargettileseq = Seq.empty - , blinkycurrentdirection = Game.Types.Right - , blinkycurrentspeed = 85 - , blinkydotcounter = 0 - } - gamedatapinkystate <- CMSTM.atomically $ - newTVar $ - PinkyState { pinkycurrentmode = GhostHouseStart - , pinkycurrentdrawstate = GhostRegularDraw - , pinkycurrentposition = (557,738) - , pinkycurrenttile = Nothing - , pinkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of - Seq.EmptyL -> defaulttileastar - (x Seq.:< _) -> x - , pinkytargettileseq = Seq.empty - , pinkycurrentdirection = Down - , pinkycurrentspeed = 85 - , pinkydotcounter = 0 - } - gamedatainkystate <- CMSTM.atomically $ - newTVar $ - InkyState { inkycurrentmode = GhostHouseStart - , inkycurrentdrawstate = GhostRegularDraw - , inkycurrentposition = (487,738) - , inkycurrenttile = Nothing - , inkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of - Seq.EmptyL -> defaulttileastar - (x Seq.:< _) -> x - , inkytargettileseq = Seq.empty - , inkycurrentdirection = Up - , inkycurrentspeed = 85 - , inkydotcounter = 0 - } - gamedataclydestate <- CMSTM.atomically $ - newTVar $ - ClydeState { clydecurrentmode = GhostHouseStart - , clydecurrentdrawstate = GhostRegularDraw - , clydecurrentposition = (627,738) - , clydecurrenttile = Nothing - , clydetargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of + gamedatainkystate <- newIORef $ + InkyState { inkycurrentmode = GhostHouseStart + , inkycurrentdrawstate = GhostRegularDraw + , inkycurrentposition = (487,738) + , inkycurrenttile = Nothing + , inkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of Seq.EmptyL -> defaulttileastar (x Seq.:< _) -> x - , clydetargettileseq = Seq.empty - , clydecurrentdirection = Up - , clydecurrentspeed = 85 - , clydedotcounter = 0 - } - gamedatadoteatentimer <- CMSTM.atomically $ newTVar 0 - return GameData { gamestate = gamedatagamestate + , inkytargettileseq = Seq.empty + , inkycurrentdirection = Up + , inkycurrentspeed = 85 + , inkydotcounter = 0 + , inkyghsl = Just $ + GHSLData { ghslnumber = [311,312] + , ghslmovementdirection = GHUp + , ghslup = Just [301,302] + , ghsldown = Just [313,314] + } + } + gamedataclydestate <- newIORef $ + ClydeState { clydecurrentmode = GhostHouseStart + , clydecurrentdrawstate = GhostRegularDraw + , clydecurrentposition = (627,738) + , clydecurrenttile = Nothing + , clydetargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of + Seq.EmptyL -> defaulttileastar + (x Seq.:< _) -> x + , clydetargettileseq = Seq.empty + , clydecurrentdirection = Up + , clydecurrentspeed = 85 + , clydedotcounter = 0 + , clydeghsl = Just $ + GHSLData { ghslnumber = [307,308] + , ghslmovementdirection = GHUp + , ghslup = Just [305,306] + , ghsldown = Just [317,318] + } + } + gamedatadoteatentimer <- newIORef 0 + return GameData { gamestate = gamedatagamestate + , tilestate = gamedatatilestate , currentlevel = gamedatacurrentlevel , currentscore = gamedatacurrentscore , pacmanstate = gamedatapacmanstate diff --git a/src/Game/Initial/Level5_All.hs b/src/Game/Initial/Level5_All.hs index b6d3c52..f9a5176 100644 --- a/src/Game/Initial/Level5_All.hs +++ b/src/Game/Initial/Level5_All.hs @@ -8,90 +8,105 @@ import Graphics.Map.Static.Tiles.Definition import Graphics.Map.Static.Tiles.Default import Graphics.Map.Static.Tiles.AllTileData import Game.Initial.Definition +import Rendering.GhostHouse.StartingLoop.Definition -import Control.Monad.STM as CMSTM -import Control.Concurrent.STM.TVar as TVar +import Data.IORef import Data.Sequence as Seq (empty,filter,viewl,ViewL(..)) initialgamestatelevel5_all :: Level -> IO GameData initialgamestatelevel5_all levelnumber = do - gamedatagamestate <- CMSTM.atomically $ newTVar Start - gamedatacurrentlevel <- CMSTM.atomically $ newTVar levelnumber - gamedatacurrentscore <- CMSTM.atomically $ newTVar 0 - gamedatapacmanstate <- CMSTM.atomically $ - newTVar $ - PacmanState { pacmancurrentposition = (557,378) - , pacmancurrenttile = case Seq.viewl (Seq.filter (\x -> (tilenumber x) == 299) alltiledatainit) of - Seq.EmptyL -> defaulttile + gamedatagamestate <- newIORef Start + gamedatatilestate <- newIORef alltiledatainit + gamedatacurrentlevel <- newIORef levelnumber + gamedatacurrentscore <- newIORef 0 + gamedatapacmanstate <- newIORef $ + PacmanState { pacmancurrentposition = (557,378) + , pacmancurrenttile = case Seq.viewl (Seq.filter (\x -> (tilenumber x) == 299) alltiledatainit) of + Seq.EmptyL -> defaulttile + (x Seq.:< _) -> x + , pacmancurrentdirection = None + , pacmancurrentstate = Normal + , pacmancurrentdrawstate = PacmanRegularDraw + , pacmancurrentspeed = 100 + , pacmancurrentlives = 3 + } + gamedatablinkystate <- newIORef $ + BlinkyState { blinkycurrentmode = Chase + , blinkycurrentdrawstate = GhostRegularDraw + , blinkycurrentposition = (557,858) + , blinkycurrenttile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 256) alltiledataastarinit) of + Seq.EmptyL -> defaulttileastar (x Seq.:< _) -> x - , pacmancurrentdirection = None - , pacmancurrentstate = Normal - , pacmancurrentdrawstate = PacmanRegularDraw - , pacmancurrentspeed = 100 - , pacmancurrentlives = 3 - } - gamedatablinkystate <- CMSTM.atomically $ - newTVar $ - BlinkyState { blinkycurrentmode = Chase - , blinkycurrentdrawstate = GhostRegularDraw - , blinkycurrentposition = (557,858) - , blinkycurrenttile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 256) alltiledataastarinit) of - Seq.EmptyL -> defaulttileastar - (x Seq.:< _) -> x - , blinkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of - Seq.EmptyL -> defaulttileastar - (x Seq.:< _) -> x - , blinkytargettileseq = Seq.empty - , blinkycurrentdirection = Game.Types.Right - , blinkycurrentspeed = 95 - , blinkydotcounter = 0 + , blinkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of + Seq.EmptyL -> defaulttileastar + (x Seq.:< _) -> x + , blinkytargettileseq = Seq.empty + , blinkycurrentdirection = Game.Types.Right + , blinkycurrentspeed = 95 + , blinkydotcounter = 0 + } + gamedatapinkystate <- newIORef $ + PinkyState { pinkycurrentmode = GhostHouseStart + , pinkycurrentdrawstate = GhostRegularDraw + , pinkycurrentposition = (557,738) + , pinkycurrenttile = Nothing + , pinkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of + Seq.EmptyL -> defaulttileastar + (x Seq.:< _) -> x + , pinkytargettileseq = Seq.empty + , pinkycurrentdirection = Down + , pinkycurrentspeed = 95 + , pinkydotcounter = 0 + , pinkyghsl = Just $ + GHSLData { ghslnumber = [309,310] + , ghslmovementdirection = GHDown + , ghslup = Just [303,304] + , ghsldown = Just [315,316] + } } - gamedatapinkystate <- CMSTM.atomically $ - newTVar $ - PinkyState { pinkycurrentmode = GhostHouseStart - , pinkycurrentdrawstate = GhostRegularDraw - , pinkycurrentposition = (557,738) - , pinkycurrenttile = Nothing - , pinkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of + gamedatainkystate <- newIORef $ + InkyState { inkycurrentmode = GhostHouseStart + , inkycurrentdrawstate = GhostRegularDraw + , inkycurrentposition = (487,738) + , inkycurrenttile = Nothing + , inkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of Seq.EmptyL -> defaulttileastar (x Seq.:< _) -> x - , pinkytargettileseq = Seq.empty - , pinkycurrentdirection = Down - , pinkycurrentspeed = 95 - , pinkydotcounter = 0 - } - gamedatainkystate <- CMSTM.atomically $ - newTVar $ - InkyState { inkycurrentmode = GhostHouseStart - , inkycurrentdrawstate = GhostRegularDraw - , inkycurrentposition = (487,738) - , inkycurrenttile = Nothing - , inkytargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of - Seq.EmptyL -> defaulttileastar - (x Seq.:< _) -> x - , inkytargettileseq = Seq.empty - , inkycurrentdirection = Up - , inkycurrentspeed = 95 - , inkydotcounter = 0 - } - gamedataclydestate <- CMSTM.atomically $ - newTVar $ - ClydeState { clydecurrentmode = GhostHouseStart - , clydecurrentdrawstate = GhostRegularDraw - , clydecurrentposition = (627,738) - , clydecurrenttile = Nothing - , clydetargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of - Seq.EmptyL -> defaulttileastar - (x Seq.:< _) -> x - , clydetargettileseq = Seq.empty - , clydecurrentdirection = Up - , clydecurrentspeed = 95 - , clydedotcounter = 0 - } - gamedatadoteatentimer <- CMSTM.atomically $ newTVar 0 - return GameData { gamestate = gamedatagamestate + , inkytargettileseq = Seq.empty + , inkycurrentdirection = Up + , inkycurrentspeed = 95 + , inkydotcounter = 0 + , inkyghsl = Just $ + GHSLData { ghslnumber = [311,312] + , ghslmovementdirection = GHUp + , ghslup = Just [301,302] + , ghsldown = Just [313,314] + } + } + gamedataclydestate <- newIORef $ + ClydeState { clydecurrentmode = GhostHouseStart + , clydecurrentdrawstate = GhostRegularDraw + , clydecurrentposition = (627,738) + , clydecurrenttile = Nothing + , clydetargettile = case Seq.viewl (Seq.filter (\x -> (tilenumberastar x) == 299) alltiledataastarinit) of + Seq.EmptyL -> defaulttileastar + (x Seq.:< _) -> x + , clydetargettileseq = Seq.empty + , clydecurrentdirection = Up + , clydecurrentspeed = 95 + , clydedotcounter = 0 + , clydeghsl = Just $ + GHSLData { ghslnumber = [307,308] + , ghslmovementdirection = GHUp + , ghslup = Just [305,306] + , ghsldown = Just [317,318] + } + } + gamedatadoteatentimer <- newIORef 0 + return GameData { gamestate = gamedatagamestate + , tilestate = gamedatatilestate , currentlevel = gamedatacurrentlevel , currentscore = gamedatacurrentscore , pacmanstate = gamedatapacmanstate diff --git a/src/Game/Pacman/Movement.hs b/src/Game/Pacman/Movement.hs new file mode 100644 index 0000000..6cec07d --- /dev/null +++ b/src/Game/Pacman/Movement.hs @@ -0,0 +1,67 @@ +module Game.Pacman.Movement where + +import Game.Types + +import Graphics.Gloss.Interface.IO.Interact + + +updatePacmanMovement :: Event + -> PacmanState + -> PacmanState +updatePacmanMovement (EventKey (SpecialKey KeyUp) _ _ _) ps = + PacmanState { pacmancurrentposition = ( fst $ pacmancurrentposition ps + , (\y -> y - 1) $ snd $ pacmancurrentposition ps + ) + , pacmancurrenttile = pacmancurrenttile ps + , pacmancurrentdirection = Game.Types.Up + , pacmancurrentstate = pacmancurrentstate ps + , pacmancurrentdrawstate = if | (pacmancurrentdrawstate ps) == PacmanRegularDraw + -> PacmanAltDraw + | otherwise + -> PacmanRegularDraw + , pacmancurrentspeed = pacmancurrentspeed ps + , pacmancurrentlives = pacmancurrentlives ps + } +updatePacmanMovement (EventKey (SpecialKey KeyDown) _ _ _) ps = + PacmanState { pacmancurrentposition = ( fst $ pacmancurrentposition ps + , (\y -> y + 1) $ snd $ pacmancurrentposition ps + ) + , pacmancurrenttile = pacmancurrenttile ps + , pacmancurrentdirection = Game.Types.Down + , pacmancurrentstate = pacmancurrentstate ps + , pacmancurrentdrawstate = if | (pacmancurrentdrawstate ps) == PacmanRegularDraw + -> PacmanAltDraw + | otherwise + -> PacmanRegularDraw + , pacmancurrentspeed = pacmancurrentspeed ps + , pacmancurrentlives = pacmancurrentlives ps + } +updatePacmanMovement (EventKey (SpecialKey KeyLeft) _ _ _) ps = + PacmanState { pacmancurrentposition = ( (\x -> x - 1) $ fst $ pacmancurrentposition ps + , snd $ pacmancurrentposition ps + ) + , pacmancurrenttile = pacmancurrenttile ps + , pacmancurrentdirection = Game.Types.Left + , pacmancurrentstate = pacmancurrentstate ps + , pacmancurrentdrawstate = if | (pacmancurrentdrawstate ps) == PacmanRegularDraw + -> PacmanAltDraw + | otherwise + -> PacmanRegularDraw + , pacmancurrentspeed = pacmancurrentspeed ps + , pacmancurrentlives = pacmancurrentlives ps + } +updatePacmanMovement (EventKey (SpecialKey KeyRight) _ _ _) ps = + PacmanState { pacmancurrentposition = ( (\x -> x + 1) $ fst $ pacmancurrentposition ps + , (\y -> y - 1) $ snd $ pacmancurrentposition ps + ) + , pacmancurrenttile = pacmancurrenttile ps + , pacmancurrentdirection = Game.Types.Right + , pacmancurrentstate = pacmancurrentstate ps + , pacmancurrentdrawstate = if | (pacmancurrentdrawstate ps) == PacmanRegularDraw + -> PacmanAltDraw + | otherwise + -> PacmanRegularDraw + , pacmancurrentspeed = pacmancurrentspeed ps + , pacmancurrentlives = pacmancurrentlives ps + } +updatePacmanMovement _ ps = ps diff --git a/src/Game/Pacman/PacmanCoorToCookieCoor.hs b/src/Game/Pacman/PacmanCoorToCookieCoor.hs new file mode 100644 index 0000000..8bdba0f --- /dev/null +++ b/src/Game/Pacman/PacmanCoorToCookieCoor.hs @@ -0,0 +1,5 @@ +module Game.Pacman.PacmanCoorToCookieCoor where + +pacmanCoorToCookieCoor :: (Int,Int) + -> (Int,Int) +pacmanCoorToCookieCoor (gx,gy) = ((1120 - (20 + gx)) + 10,gy + 10) diff --git a/src/Game/Pacman/Tile.hs b/src/Game/Pacman/Tile.hs new file mode 100644 index 0000000..9040ef3 --- /dev/null +++ b/src/Game/Pacman/Tile.hs @@ -0,0 +1,24 @@ +module Game.Pacman.Tile where + +import Game.Pacman.PacmanCoorToCookieCoor +import Game.Types +import Graphics.Map.Static.Tiles.Default +import Graphics.Map.Static.Tiles.Definition + +import Data.Sequence as Seq (filter,viewl,Seq(..),ViewL(..)) + + +updatePacmanTile :: Seq TileData + -> PacmanState + -> PacmanState +updatePacmanTile ts ps = + PacmanState { pacmancurrentposition = pacmancurrentposition ps + , pacmancurrenttile = case Seq.viewl (Seq.filter (\t -> (centercoordinates $ cookiedata t) == (pacmanCoorToCookieCoor $ pacmancurrentposition ps)) ts) of + Seq.EmptyL -> defaulttile + (x Seq.:< _) -> x + , pacmancurrentdirection = pacmancurrentdirection ps + , pacmancurrentstate = pacmancurrentstate ps + , pacmancurrentdrawstate = pacmancurrentdrawstate ps + , pacmancurrentspeed = pacmancurrentspeed ps + , pacmancurrentlives = pacmancurrentlives ps + } diff --git a/src/Game/Types.hs b/src/Game/Types.hs index 0c93684..a1de699 100644 --- a/src/Game/Types.hs +++ b/src/Game/Types.hs @@ -2,8 +2,9 @@ module Game.Types where import Game.Ghosts.Algo.AStar.Tiles.Definition import Graphics.Map.Static.Tiles.Definition +import Rendering.GhostHouse.StartingLoop.Definition -import Control.Concurrent.STM.TVar as TVar +import Data.IORef import Data.Sequence (Seq(..)) import FRP.Yampa (DTime) import GHC.Generics @@ -72,6 +73,7 @@ data PinkyState = PinkyState { pinkycurrentmode :: GhostMode , pinkycurrentdirection :: Direction , pinkycurrentspeed :: Int , pinkydotcounter :: Int + , pinkyghsl :: Maybe GHSLData } deriving (Show,Eq,Generic) @@ -84,6 +86,7 @@ data InkyState = InkyState { inkycurrentmode :: GhostMode , inkycurrentdirection :: Direction , inkycurrentspeed :: Int , inkydotcounter :: Int + , inkyghsl :: Maybe GHSLData } deriving (Show,Eq,Generic) @@ -96,6 +99,7 @@ data ClydeState = ClydeState { clydecurrentmode :: GhostMode , clydecurrentdirection :: Direction , clydecurrentspeed :: Int , clydedotcounter :: Int + , clydeghsl :: Maybe GHSLData } deriving (Show,Eq,Generic) @@ -105,14 +109,15 @@ data Ghosts = Blinky | Clyde deriving (Show,Eq,Generic) -data GameData = GameData { gamestate :: TVar GameState - , currentlevel :: TVar Int - , currentscore :: TVar Int - , pacmanstate :: TVar PacmanState - , blinkystate :: TVar BlinkyState - , pinkystate :: TVar PinkyState - , inkystate :: TVar InkyState - , clydestate :: TVar ClydeState - , doteatentimer :: TVar DTime +data GameData = GameData { gamestate :: IORef GameState + , tilestate :: IORef (Seq TileData) + , currentlevel :: IORef Int + , currentscore :: IORef Int + , pacmanstate :: IORef PacmanState + , blinkystate :: IORef BlinkyState + , pinkystate :: IORef PinkyState + , inkystate :: IORef InkyState + , clydestate :: IORef ClydeState + , doteatentimer :: IORef Double } - deriving (Eq,Generic) + deriving (Generic) diff --git a/src/Graphics/Map/Dynamic/Cookies/DrawCookies.hs b/src/Graphics/Map/Dynamic/Cookies/DrawCookies.hs new file mode 100644 index 0000000..ca067d7 --- /dev/null +++ b/src/Graphics/Map/Dynamic/Cookies/DrawCookies.hs @@ -0,0 +1,64 @@ +module Graphics.Map.Dynamic.Cookies.DrawCookies where + +import Data.Foldable (toList) +import Data.Maybe (isJust) +import Data.Traversable + +import Graphics.Map.Dynamic.Cookies.Common +import Graphics.Map.Dynamic.Cookies.Definition +import Graphics.Map.Static.Tiles.Definition + +import Graphics.Gloss.Data.Picture +import Data.Sequence as Seq (filter,(><),Seq(..)) + + +{-Define the Picture that makes up all of the cookies on the map.-} + +{- +drawCookies :: Seq CookieDrawData + -> IO Picture +drawCookies allcookiedata = do + --Grab and create cookies. + let cookies = fmap cookiedrawcoordinates $ + DS.filter (\x -> (cookiedrawtype x) == Cookie + ) allcookiedata + allcookiescreated <- sequence $ fmap createCookie cookies + --Grab and create large cookies. + let largecookies = fmap cookiedrawcoordinates $ + DS.filter (\x -> (cookiedrawtype x) == LargeCookie + ) allcookiedata + alllargecookiescreated <- sequence $ fmap createCookie largecookies + return $ Pictures $ + toList $ + alllargecookiescreated + >< + allcookiescreated +-} + +drawCookies :: Seq TileData + -> Seq CookieDrawData + -> IO Picture +drawCookies td cdd = do + --Grab the cookies to be drawn based off of cookietype field + --(some cookies may have been eaten). + let tileswithcookies = Seq.filter (\t -> isJust $ cookietype $ cookiedata t) + td + let currentallcookies = Seq.filter (\c -> (cookiedrawnumber c) `elem` (fmap tilenumber tileswithcookies)) + cdd + --Grab and create cookies. + let cookies = fmap cookiedrawcoordinates $ + Seq.filter (\c -> (cookiedrawtype c) == Graphics.Map.Dynamic.Cookies.Definition.Cookie) + currentallcookies + allcookiescreated <- sequence $ fmap createCookie cookies + --Grab and create large cookies. + let largecookies = fmap cookiedrawcoordinates $ + Seq.filter (\c -> (cookiedrawtype c) == Graphics.Map.Dynamic.Cookies.Definition.LargeCookie) + currentallcookies + alllargecookiescreated <- sequence $ fmap createCookie largecookies + return $ Pictures $ + toList $ + alllargecookiescreated + >< + allcookiescreated + +{-----------------------------------------------------------------} diff --git a/src/Graphics/Map/Dynamic/Cookies/InitialCookies.hs b/src/Graphics/Map/Dynamic/Cookies/InitialCookies.hs deleted file mode 100644 index b5cf334..0000000 --- a/src/Graphics/Map/Dynamic/Cookies/InitialCookies.hs +++ /dev/null @@ -1,35 +0,0 @@ -module Graphics.Map.Dynamic.Cookies.InitialCookies where - - -import Data.Sequence as DS -import Data.Foldable (toList) -import Data.Traversable - -import Graphics.Map.Dynamic.Cookies.Common -import Graphics.Map.Dynamic.Cookies.Definition - -import Graphics.Gloss.Data.Picture - - -{-Define the Picture that makes up all of the cookies on the map.-} - -allcookiesinit :: Seq CookieDrawData - -> IO Picture -allcookiesinit allcookiedata = do - --Grab and create cookies. - let cookies = fmap cookiedrawcoordinates $ - DS.filter (\x -> (cookiedrawtype x) == Cookie - ) allcookiedata - allcookiescreated <- sequence $ fmap createCookie cookies - --Grab and create large cookies. - let largecookies = fmap cookiedrawcoordinates $ - DS.filter (\x -> (cookiedrawtype x) == LargeCookie - ) allcookiedata - alllargecookiescreated <- sequence $ fmap createCookie largecookies - return $ Pictures $ - toList $ - alllargecookiescreated - >< - allcookiescreated - -{-----------------------------------------------------------------} diff --git a/src/Graphics/Map/Static/Tiles/AllTileData.hs b/src/Graphics/Map/Static/Tiles/AllTileData.hs index 0e4ea29..e774691 100644 --- a/src/Graphics/Map/Static/Tiles/AllTileData.hs +++ b/src/Graphics/Map/Static/Tiles/AllTileData.hs @@ -1,6 +1,5 @@ module Graphics.Map.Static.Tiles.AllTileData where - import Graphics.Map.Static.Tiles.Definition import Data.Sequence @@ -3609,7 +3608,7 @@ alltiledatainit = fromList $ False ) [297,287] - --25(STARTING POSITION) + --26(STARTING POSITION) , TileData 299 [(520,1040),(560,1040),(520,1080),(560,1080)] False diff --git a/src/Graphics/Map/Static/Tiles/GhostHouse/AllTileData.hs b/src/Graphics/Map/Static/Tiles/GhostHouse/AllTileData.hs new file mode 100644 index 0000000..6aefc57 --- /dev/null +++ b/src/Graphics/Map/Static/Tiles/GhostHouse/AllTileData.hs @@ -0,0 +1,227 @@ +module Graphics.Map.Static.Tiles.GhostHouse.AllTileData where + +import Graphics.Map.Static.Tiles.Definition + +import Data.Sequence + + +allghosthousetiledatainit :: Seq TileData +allghosthousetiledatainit = fromList $ + [ --25(GHOST HOUSE) + TileData 301 + [(440,640),(480,640),(440,680),(480,680)] + False + (CookieData Nothing + (450,650) + ) + (WallData True + False + True + False + ) + [302,312] + , TileData 302 + [(480,640),(520,640),(480,680),(520,680)] + False + (CookieData Nothing + (490,650) + ) + (WallData True + False + False + False + ) + [301,303,311] + , TileData 303 + [(520,640),(560,640),(520,680),(560,680)] + False + (CookieData Nothing + (530,650) + ) + (WallData True + False + False + False + ) + [302,304,310] + , TileData 304 + [(560,640),(600,640),(560,680),(600,680)] + False + (CookieData Nothing + (570,650) + ) + (WallData True + False + False + False + ) + [303,305,309] + , TileData 305 + [(600,640),(640,640),(600,680),(640,680)] + False + (CookieData Nothing + (610,650) + ) + (WallData True + False + False + False + ) + [304,306,308] + , TileData 306 + [(640,640),(680,640),(640,680),(680,680)] + False + (CookieData Nothing + (650,650) + ) + (WallData True + False + False + False + ) + [305,307] + , TileData 307 + [(640,680),(680,680),(640,720),(680,720)] + False + (CookieData Nothing + (650,690) + ) + (WallData False + False + False + True + ) + [306,308,318] + , TileData 308 + [(600,680),(640,680),(600,720),(640,720)] + False + (CookieData Nothing + (610,690) + ) + (WallData False + False + False + False + ) + [305,307,309,317] + , TileData 309 + [(560,680),(600,680),(560,720),(600,720)] + False + (CookieData Nothing + (570,690) + ) + (WallData False + False + False + False + ) + [304,308,310,316] + , TileData 310 + [(520,680),(560,680),(520,720),(560,720)] + False + (CookieData Nothing + (530,690) + ) + (WallData False + False + False + False + ) + [303,309,311,315] + , TileData 311 + [(480,680),(520,680),(480,720),(520,720)] + False + (CookieData Nothing + (490,690) + ) + (WallData False + False + False + False + ) + [302,310,312,314] + , TileData 312 + [(440,680),(480,680),(440,720),(480,720)] + False + (CookieData Nothing + (450,690) + ) + (WallData False + False + True + False + ) + [301,311,313] + , TileData 313 + [(440,720),(480,720),(440,760),(480,760)] + False + (CookieData Nothing + (450,730) + ) + (WallData False + True + True + False + ) + [312,314] + , TileData 314 + [(480,720),(520,720),(480,760),(520,760)] + False + (CookieData Nothing + (490,730) + ) + (WallData False + True + False + False + ) + [311,313,315] + , TileData 315 + [(520,720),(560,720),(520,760),(560,760)] + False + (CookieData Nothing + (530,730) + ) + (WallData False + True + False + False + ) + [310,314,316] + , TileData 316 + [(560,720),(600,720),(560,760),(600,760)] + False + (CookieData Nothing + (570,730) + ) + (WallData False + True + False + False + ) + [309,315,317] + , TileData 317 + [(600,720),(640,720),(600,760),(640,760)] + False + (CookieData Nothing + (610,730) + ) + (WallData False + True + False + False + ) + [308,316,318] + , TileData 318 + [(640,720),(680,720),(640,760),(680,760)] + False + (CookieData Nothing + (650,730) + ) + (WallData False + True + False + True + ) + [307,317] + ] diff --git a/src/Rendering/GhostHouse/GhostHouseStart.hs b/src/Rendering/GhostHouse/GhostHouseStart.hs new file mode 100644 index 0000000..e6cbf5c --- /dev/null +++ b/src/Rendering/GhostHouse/GhostHouseStart.hs @@ -0,0 +1 @@ +module Rendering.GhostHouse.GhostHouseStart where diff --git a/src/Rendering/GhostHouse/StartingLoop/Clyde.hs b/src/Rendering/GhostHouse/StartingLoop/Clyde.hs new file mode 100644 index 0000000..b9de63a --- /dev/null +++ b/src/Rendering/GhostHouse/StartingLoop/Clyde.hs @@ -0,0 +1 @@ +module Rendering.GhostHouse.StartingLoop.Clyde where diff --git a/src/Rendering/GhostHouse/StartingLoop/Definition.hs b/src/Rendering/GhostHouse/StartingLoop/Definition.hs new file mode 100644 index 0000000..98b045d --- /dev/null +++ b/src/Rendering/GhostHouse/StartingLoop/Definition.hs @@ -0,0 +1,15 @@ +module Rendering.GhostHouse.StartingLoop.Definition where + +import GHC.Generics + + +data GHMovementDirection = GHUp + | GHDown + deriving (Show,Eq,Generic) + +data GHSLData = GHSLData { ghslnumber :: [Int] + , ghslmovementdirection :: GHMovementDirection + , ghslup :: Maybe [Int] + , ghsldown :: Maybe [Int] + } + deriving (Show,Eq,Generic) diff --git a/src/Rendering/GhostHouse/StartingLoop/Inky.hs b/src/Rendering/GhostHouse/StartingLoop/Inky.hs new file mode 100644 index 0000000..76b8e40 --- /dev/null +++ b/src/Rendering/GhostHouse/StartingLoop/Inky.hs @@ -0,0 +1 @@ +module Rendering.GhostHouse.StartingLoop.Inky where diff --git a/src/Rendering/GhostHouse/StartingLoop/Pinky.hs b/src/Rendering/GhostHouse/StartingLoop/Pinky.hs new file mode 100644 index 0000000..502d29d --- /dev/null +++ b/src/Rendering/GhostHouse/StartingLoop/Pinky.hs @@ -0,0 +1 @@ +module Rendering.GhostHouse.StartingLoop.Pinky where diff --git a/src/Rendering/GhostHouse/StartingPositions.hs b/src/Rendering/GhostHouse/StartingPositions.hs new file mode 100644 index 0000000..fb20af0 --- /dev/null +++ b/src/Rendering/GhostHouse/StartingPositions.hs @@ -0,0 +1,17 @@ +module Rendering.GhostHouse.StartingPositions where + + +pacmanstartingposition :: (Int,Int) +pacmanstartingposition = (557,378) + +blinkystartingposition :: (Int,Int) +blinkystartingposition = (557,858) + +pinkystartingposition :: (Int,Int) +pinkystartingposition = (557,696)--top(557,766)--(557,738) + +inkystartingposition :: (Int,Int) +inkystartingposition = (487,738) + +clydestartingposition :: (Int,Int) +clydestartingposition = (627,738)