content: 
  -- | Game state
  module State where
  import Graphics.Gloss
  import World
  
  
  -- | The game state.
  data State
          = State
          { stateWorld            :: World
          , stateModeInterface    :: ModeInterface
          , stateModeDisplay      :: ModeDisplay
          , stateModeOverlay      :: ModeOverlay
          , stateViewPos          :: Point
          , stateTargetPos        :: Maybe Point }
  
  
  -- | What mode the interface interaction is in.
  data ModeInterface
          -- | We're not doing anything inparticular.
          = ModeInterfaceIdle
  
          -- | We're moving the view position.
          | ModeInterfaceMove
          deriving (Show, Eq)
  
  
  -- | What mode the display is in.
  data ModeDisplay
          -- | Show the world in rectangular coordinates.
          = ModeDisplayWorld
  
          -- | Show the world normalised so the view position is at the origin.
          | ModeDisplayNormalised
          deriving (Show, Eq)
  
  
  -- | What overlay to display.
  data ModeOverlay
          -- | No overlay
          = ModeOverlayNone
  
          -- | Brute force, approximate visibility
          | ModeOverlayVisApprox
          deriving (Show, Eq)
  
  
  -- | Initial game state.
  initialState :: World -> State
  initialState world
          = State
          { stateWorld            = world
          , stateModeInterface    = ModeInterfaceIdle
          , stateModeDisplay      = ModeDisplayWorld
          , stateModeOverlay      = ModeOverlayVisApprox
          , stateViewPos          = (0, 0)
          , stateTargetPos        = Nothing }
  
  