module RPGEngine.Render.Playing ( renderPlaying ) where import RPGEngine.Render.Core ( Renderer, getRender, setRenderPos ) import RPGEngine.Data ( Player(..), Entity(..), Item(..), Physical(..), Layout, Level(..), State(..), Game(..) ) import Graphics.Gloss ( Picture, pictures ) import Graphics.Gloss.Data.Picture (translate) import RPGEngine.Config (resolution, zoom) import Graphics.Gloss (text) import Graphics.Gloss (blank) ------------------------------ Exported ------------------------------ renderPlaying :: Renderer State renderPlaying Playing { level = lvl, player = player } = pictures [ renderLevel lvl, renderPlayer player ] renderPlaying _ = blank ------------------------------- Player ------------------------------- renderPlayer :: Renderer Player renderPlayer Player{ position = (x, y) } = move picture where move = setRenderPos x y picture = getRender "player" -- Center the player in the middle of the screen. -- Not in use at the moment, might be useful later. focusPlayer :: Game -> Picture -> Picture focusPlayer Game{ state = Playing{ player = Player{ position = (x, y) }}} = move where move = translate centerX centerY centerX = resolution * zoom * fromIntegral (negate x) centerY = resolution * zoom * fromIntegral (negate y) ------------------------------- Level -------------------------------- renderLevel :: Renderer Level renderLevel Level{ layout = l, items = i, entities = e } = level where level = pictures [void, layout, items, entities] void = createVoid layout = renderLayout l items = renderItems i entities = renderEntities e renderLayout :: Layout -> Picture renderLayout strips = pictures [setRenderPos 0 y (renderStrip (strips !! y)) | y <- [0 .. count]] where count = length strips - 1 renderStrip :: [Physical] -> Picture renderStrip list = pictures physicals where physicals = [setRenderPos x 0 (image (list !! x)) | x <- [0 .. count]] image Void = getRender "void" image Walkable = getRender "tile" image Blocked = getRender "wall" image Entrance = pictures [getRender "tile", getRender "entrance"] image Exit = pictures [getRender "tile", getRender "exit"] count = length list - 1 createVoid :: Picture createVoid = setRenderPos offX offY $ pictures voids where voids = [setRenderPos x y void | x <- [0 .. width], y <- [0 .. height]] void = getRender "void" intZoom = round zoom :: Int height = round $ 4320 / resolution / zoom width = round $ 7680 / resolution / zoom offX = negate (width `div` 2) offY = negate (height `div` 2) -------------------------- Items & Entities -------------------------- renderItems :: [Item] -> Picture renderItems list = pictures $ map renderItem list renderItem :: Item -> Picture renderItem Item{ itemId = id, itemX = x, itemY = y} = setRenderPos x y image where image = getRender id renderEntities :: [Entity] -> Picture renderEntities list = pictures $ map renderEntity list renderEntity :: Entity -> Picture renderEntity Entity{ entityId = id, entityX = x, entityY = y} = setRenderPos x y image where image = getRender id