first commit
This commit is contained in:
		
							
								
								
									
										71
									
								
								app/GameMain.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								app/GameMain.hs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,71 @@
 | 
			
		||||
module Main where
 | 
			
		||||
 | 
			
		||||
import GameTypes
 | 
			
		||||
import GameLogic
 | 
			
		||||
import GameConfig
 | 
			
		||||
import GameDraw
 | 
			
		||||
import Draw
 | 
			
		||||
import Control.Lens
 | 
			
		||||
import Data.List
 | 
			
		||||
import Data.Maybe
 | 
			
		||||
import Linear.V2
 | 
			
		||||
import Control.Exception
 | 
			
		||||
import System.IO
 | 
			
		||||
import qualified Data.Map as M
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{- ncurses view -}
 | 
			
		||||
 | 
			
		||||
main :: IO ()
 | 
			
		||||
main = play' opts 60 world renderWorld (\_ w -> w) handleEvent
 | 
			
		||||
  where world = newWorldWithBoss (V2 10 1) (V2 10 16) (defaultConfig^.worldSize)
 | 
			
		||||
        opts  = defaultConfig^.ncursesOpts
 | 
			
		||||
 | 
			
		||||
handleEvent :: Event -> World -> World 
 | 
			
		||||
handleEvent (EventCharacter c) w = fromMaybe w $ performAction w <$> getAction c
 | 
			
		||||
handleEvent _ w                  = w
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{- Terminal view -}
 | 
			
		||||
 | 
			
		||||
main' :: IO ()
 | 
			
		||||
main' = gameLoop $ newWorldWithBoss (V2 10 1) (V2 10 16) (20, 32)
 | 
			
		||||
 | 
			
		||||
gameLoop :: World -> IO ()
 | 
			
		||||
gameLoop oldW = do
 | 
			
		||||
  putStrLn ""
 | 
			
		||||
  renderWorld' oldW
 | 
			
		||||
  putStrLn "Use 'w', 'a', 's', 'd' to navigate through the world. Press ' ' to attack, 'p' to pause."
 | 
			
		||||
  input <- getChar
 | 
			
		||||
  let newW = fromMaybe oldW $ performAction oldW <$> getAction input
 | 
			
		||||
  gameLoop newW
 | 
			
		||||
 | 
			
		||||
renderWorld' :: World -> IO ()
 | 
			
		||||
renderWorld' world = do
 | 
			
		||||
  let graphics = map (map (renderEntity)) (layout $ M.toAscList $ world^.entities)
 | 
			
		||||
      layout   = groupBy (\(u,_) (v,_) -> u^._y /= v^._y)
 | 
			
		||||
  mapM_ putStrLn graphics
 | 
			
		||||
 | 
			
		||||
renderEntity :: (V2 Integer, Entity) -> Char
 | 
			
		||||
renderEntity (p, Floor)     = '-'
 | 
			
		||||
renderEntity (p, (Hero s))  = 'H'
 | 
			
		||||
renderEntity (p, (Boss s))  = 'M'
 | 
			
		||||
renderEntity (p, (Wall))    = '#'
 | 
			
		||||
renderEntity (p, (Bomb _))  = 'o'
 | 
			
		||||
renderEntity (p, (Fire s))  | s^.life < 2 = 'x'
 | 
			
		||||
                            | otherwise   = 'X'
 | 
			
		||||
renderEntity _  = '?'
 | 
			
		||||
 | 
			
		||||
hide :: IO a -> IO a
 | 
			
		||||
hide action = bracket_
 | 
			
		||||
  (hSetEcho stdin False)
 | 
			
		||||
  (hSetEcho stdin True)
 | 
			
		||||
  action
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user