module RPGEngine.Render.Level ( renderLevel ) where import Graphics.Gloss import RPGEngine.Data import RPGEngine.Render.Core (getRender, setRenderPos, zoom, resolution) renderLevel :: Level -> Picture 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 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 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)