content: module Game.GameInit
      (gameInit) where
  
  import Data.IORef
  import World.World hiding (itemPanel, mainPanel, messagePanel)
  import qualified Nxt.Graphics
  import Nxt.Types
  import Input.InputState as InputState
  import Items.Items
  import Panels.MainPanel hiding (cat)
  import Panels.ItemPanel
  import Panels.MessagePanel
  import Nxt.Audio
  import Cat.Cat
  import Level.Level
  import Settings.CatSettings as CatSettings
  import Items.ItemEffects
  import Level.EndMarker
  import Level.FireHydrant
  import Game.GameState
  import Settings.Path
  
  -- gameInit
  gameInit :: IO WorldState
  gameInit = do
      dataPath <- getDataDir
      keys     <- newIORef (InputState.KeysState False False False False False False False False False)
      mousePos <- newIORef (InputState.MousePos 0 0)
  
      initAudio
      m <- loadMusic (dataPath ++ "/data/music/project_raincat.ogg")
      playMusic m
  
      lvl <- openLevel (dataPath ++ "/data/levels/pinball/pinball.lvl")
      let lvlData = levelData lvl
          lvlRect = levelRects lvlData
          lvlPoly = levelPolys lvlData
          lvlPuddles = levelPuddles lvlData
          lvlEndRect = levelEnd lvlData
          lvlFireHydrantsL = levelFireHydrantsL lvlData
          lvlFireHydrantsR = levelFireHydrantsR lvlData
          catStartRect = levelCat lvlData
          catStart = (rectX catStartRect, rectY catStartRect)
      lvlFireHydrants <- sequence $ map (\fhRect -> initFireHydrant (rectX fhRect, rectY fhRect) DirLeft) lvlFireHydrantsL
                                    ++
                                    map (\fhRect -> initFireHydrant (rectX fhRect, rectY fhRect) DirRight) lvlFireHydrantsR
      levelend <- initEndMarker (rectX lvlEndRect, rectY lvlEndRect)
  
      -- main panel
      let initCameraPos = (0, 0)
      backgroundTexObj <- Nxt.Graphics.loadTexture (dataPath ++ "/data/backgrounds/clouds_background.png")
      cat <- initCat catStart
  
      -- item panel
      itemPanel <- initItemPanel
      let item = itemButItem $ last $ itemButtonList itemPanel
  
      -- main panel
      let mainPanel = MainPanel initCameraPos [] backgroundTexObj cat lvlRect lvlPoly lvlPuddles lvlFireHydrants levelend [] [] [] item Nothing m
  
      -- message panel
      let messagePanel = MessagePanel "I am the message panel! Hover the cursor over the items on the panel at right to see their description!"
  
      -- menu textures
      menuTex <- Nxt.Graphics.loadTexture (dataPath ++ "/data/menu/level-select.png")
      howtoTex <- Nxt.Graphics.loadTexture (dataPath ++ "/data/menu/how-to.png")
  
      return (WorldState MainMenuState keys mousePos lvl mainPanel itemPanel messagePanel (menuTex, howtoTex))
  
  -- initItemPanel
  initItemPanel :: IO ItemPanel
  initItemPanel = do
      dataPath                <- getDataDir
      umbrellaTex             <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-umbrella.png")
      upsidedownUmbrellaTex   <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-upsidedown-umbrella.png")
      ponchoTex               <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-poncho.png")
      hairdryerTex            <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-hairdryer.png")
      springbootsTex          <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-springboots.png")
      skateboardTex           <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-skateboard.png")
      wrenchTex               <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-wrench.png")
      corkTex                 <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-cork.png")
      pogostickTex            <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-pogostick.png")
      speedbootsTex           <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-speedboots.png")
      tarpTex                 <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-tarp.png")
      shieldTex               <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-happy-shield.png")
      rainbootsTex            <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-rainboots.png")
      eraserTex               <- Nxt.Graphics.loadTexture (dataPath ++ "/data/item-buttons/item-eraser.png")
  
      corkItemTex <- Nxt.Graphics.loadTexture (dataPath ++ "/data/items/cork.png")
      tarpItemTex <- Nxt.Graphics.loadTexture (dataPath ++ "/data/items/tarp.png")
  
      let umbrellaItem            = Item (0, 0) umbrellaTex umbrellaEffect "Umbrella"
          upsidedownUmbrellaItem  = Item (0, 0) upsidedownUmbrellaTex upsUmbrellaEffect "Inverted Umbrella"
          ponchoItem              = Item (0, 0) ponchoTex ponchoEffect "Poncho"
          hairdryerItem           = Item (0, 0) hairdryerTex hairDryerEffect "Hairdryer"
          springbootsItem         = Item (0, 0) springbootsTex springBootsEffect "Spring Boots"
          skateboardItem          = Item (0, 0) skateboardTex skateboardEffect "Skateboard"
          wrenchItem              = Item (0, 0) wrenchTex wrenchEffect "Wrench"
          corkItem                = Item (0, 0) corkItemTex noEffect "Cork"
          pogostickItem           = Item (0, 0) pogostickTex pogostickEffect "Pogostick"
          speedbootsItem          = Item (0, 0) speedbootsTex speedBootsEffect "Speed Boots"
          tarpItem                = Item (0, 0) tarpItemTex noEffect "Tarp"
          shieldItem              = Item (0, 0) shieldTex shieldEffect "Shield"
          rainbootsItem           = Item (0, 0) rainbootsTex rainBootsEffect "Rain Boots"
          eraserItem              = Item (0, 0) eraserTex noEffect "Eraser"
  
      let umbrellaDesc            = "Umbrella - Normal umbrella on the ground (lasts " ++ show (CatSettings.catUmbrellaDuration `div` 60) ++ " seconds), Mary Poppins umbrella in the air. (one use)"
          upsidedownUmbrellaDesc  = "Upsidedown Umbrella - A rather crude, makeshift boat. This can actually float perfectly fine on puddles. (one use)"
          ponchoDesc              = "Poncho - This will protect your fuzzy head and fuzzy back, but not your fuzzy feet or fuzzy face. (lasts " ++ show (CatSettings.catPonchoDuration `div` 60) ++  " seconds)"
          hairdryerDesc           = "Hairdryer - You'd think this would have something to do with drying, but it actually turns the cat around."
          springbootsDesc         = "Springboots - Insta-*BOING* (one use)"
          skateboardDesc          = "Skateboard - Ride swiftly over hazardous terrain. (lasts " ++ show (CatSettings.catSkateDuration `div` 60) ++ " seconds)"
          wrenchDesc              = "Wrench - Turn off a fire hydrant, much to the disappointment of the neighborhood children. (one use)"
          corkDesc                = "Cork - It's a floating platform. Go figure."
          pogostickDesc           = "Pogostick - Spring back up after falling a distance. Only works when grabbed in the air! (one use)"
          speedbootsDesc          = "Speedboots - Move disturbingly quickly. (lasts " ++ show (CatSettings.catSpeedDuration `div` 60) ++ " second)"
          tarpDesc                = "Tarp - This impressive material blocks rain. It is not strong enough to walk on though."
          rainbootsDesc           = "Rainboots - Walk through puddles with brazen impunity (lasts " ++ show (CatSettings.catRainDuration `div` 60) ++ " seconds)"
          shieldDesc              = "Shield - Complete protection from water. (lasts " ++ show (CatSettings.catShieldDuration `div` 60) ++ " seconds)"
          eraserDesc              = ""
  
      let itemButtons = [ItemButton (860, 700.0) umbrellaTex umbrellaDesc umbrellaItem 0,
                         ItemButton (950, 700.0) upsidedownUmbrellaTex upsidedownUmbrellaDesc upsidedownUmbrellaItem 0,
                         ItemButton (860, 600.0) ponchoTex ponchoDesc ponchoItem 0,
                         ItemButton (950, 600.0) hairdryerTex hairdryerDesc hairdryerItem 0,
                         ItemButton (860, 500.0) springbootsTex springbootsDesc springbootsItem 0,
                         ItemButton (950, 500.0) skateboardTex skateboardDesc skateboardItem 0,
                         ItemButton (860, 400.0) wrenchTex wrenchDesc wrenchItem 0,
                         ItemButton (950, 400.0) corkTex corkDesc corkItem 0,
                         ItemButton (860, 300.0) pogostickTex pogostickDesc pogostickItem 0,
                         ItemButton (950, 300.0) speedbootsTex speedbootsDesc speedbootsItem 0,
                         ItemButton (860, 200.0) tarpTex tarpDesc tarpItem 0,
                         ItemButton (950, 200.0) rainbootsTex rainbootsDesc rainbootsItem 0,
                         ItemButton (860, 100.0) shieldTex shieldDesc shieldItem 0,
                         ItemButton (950, 100.0) eraserTex eraserDesc eraserItem (-1)]
  
      goStopBtn <- initGoStopButton
  
      return (ItemPanel itemButtons goStopBtn)
  
  