about summary refs log blame commit diff
path: root/src/Main.hs
blob: 547dc92f4023f2b668d59fc589859b2d4ef6f9ca (plain) (tree)
1
2
3
4
5
6
7
8
9
10



                                                                                
                                           




                                                                                
                  



                       




                                                                                


                                      
 











                                        
                                             



















                                                
                
                                 

                                   




                                                    






                                       







                                                         
module Main ( main ) where
--------------------------------------------------------------------------------
import           Xanthous.Prelude
import           Brick
import qualified Options.Applicative as Opt
import           System.Random
--------------------------------------------------------------------------------
import           Xanthous.Game (getInitialState)
import           Xanthous.App (makeApp)
import           Xanthous.Generators
  ( GeneratorInput
  , parseGeneratorInput
  , generateFromInput
  , showCells
  )
import           Xanthous.Generators.Util (regions)
import           Xanthous.Generators.LevelContents
import           Xanthous.Data (Dimensions, Dimensions'(Dimensions))
import           Data.Array.IArray ( amap )
--------------------------------------------------------------------------------
data Command
  = Run
  | Generate GeneratorInput Dimensions

parseDimensions :: Opt.Parser Dimensions
parseDimensions = Dimensions
  <$> Opt.option Opt.auto
       ( Opt.short 'w'
       <> Opt.long "width"
       )
  <*> Opt.option Opt.auto
       ( Opt.short 'h'
       <> Opt.long "height"
       )

parseCommand :: Opt.Parser Command
parseCommand = (<|> pure Run) $ Opt.subparser
  $ Opt.command "run"
      (Opt.info
       (pure Run)
       (Opt.progDesc "Run the game"))
  <> Opt.command "generate"
      (Opt.info
       (Generate
        <$> parseGeneratorInput
        <*> parseDimensions
        <**> Opt.helper
       )
       (Opt.progDesc "Generate a sample level"))

optParser :: Opt.ParserInfo Command
optParser = Opt.info
  (parseCommand <**> Opt.helper)
  (Opt.header "Xanthous: a WIP TUI RPG")

runGame :: IO ()
runGame =  do
  app <- makeApp
  initialState <- getInitialState
  _ <- defaultMain app initialState
  pure ()

runGenerate :: GeneratorInput -> Dimensions -> IO ()
runGenerate input dims = do
  randGen <- getStdGen
  let res = generateFromInput input dims randGen
      rs = regions $ amap not res
  putStr "num regions: "
  print $ length rs
  putStr "region lengths: "
  print $ length <$> rs
  putStr "character position: "
  print =<< chooseCharacterPosition res
  putStrLn $ showCells res

runCommand :: Command -> IO ()
runCommand Run = runGame
runCommand (Generate input dims) = runGenerate input dims

main :: IO ()
main = runCommand =<< Opt.execParser optParser