module Render where import Control.Monad (forM_) import Data.Array as A (Array, Ix,(!)) import GHC.Exts import Graphics.UI.SDL as SDL import Graphics.UI.SDL.TTF as TTF import Graphics.UI.SDL.Mixer as Mix import FRP.Yampa.Geometry import RenderPlayer import RenderBall import RenderGame import RenderUtil import Object import States import BasicTypes import Global init :: IO (Surface, Surface, A.Array Integer Font, Array Int (Surface, Int), Chunk, Chunk, Chunk) init = do SDL.init [SDL.InitVideo] TTF.init screen <- SDL.setVideoMode (truncate winWidth) (truncate winHeight) 32 [] openAudio 22050 AudioS16Sys 2 4096 pitch <- pitchRessources screen fonts <- fontsRessources balls <- ballRessources screen (tockWav, kickWav, whistleWav) <- soundRessources return (screen, pitch, fonts, balls, tockWav, kickWav, whistleWav) exit :: IO () exit = do closeAudio TTF.quit SDL.quit renderObjects :: (Num i, A.Ix i) => Param -> [ObsObjState] -> (Surface, t, A.Array i Font, A.Array Int (Surface, Int), Chunk, Chunk, Chunk) -> IO () renderObjects param oos (screen, _, fonts, balls, tockWav, kickWav, whistleWav) = do cf <- chalkFontsRessources cfb <- bigChalkFonts forM_ sorted $ \os -> case os of OOSBall oosPos' _ oosBounced' oosPState -> do renderBall param screen balls tockWav oosPos' oosBounced' renderBallDebug screen oosPState cf (point3Z oosPos') OOSPlayer oosPos' _ _ oosKicked' oosSelected' oosDesignated' _ (oosTeam, oosBorder, oosBody) (PlayerInfo oosNumber _ bpOff bpDef _ _ _) oosDir' (bs, _) (ts, _) _ -> do renderPlayer param screen oosPos' oosDir' oosSelected' oosNumber oosBody oosBorder oosBorder oosKicked' (ts==TSNonAI) oosDesignated' fonts kickWav renderPlayerDebug screen oosSelected' oosNumber bs ts oosBody cf bpDef bpOff oosTeam OOSGame oosGameTime' oosGameScore' oosGameState' oosAttacker' _ -> do renderGame param screen oosGameTime' oosGameScore' oosGameState' oosAttacker' cfb (fonts ! 4) whistleWav renderGameDebug screen oosGameState' cf where sorted = sortWith (point3Z . oosPos) oos render :: (Num i, Ix i) => Param -> [ObsObjState] -> (Surface, Surface, Array i Font, Array Int (Surface, Int), Chunk, Chunk, Chunk) -> IO () render param oos (screen, pitch, fonts, balls, tockWav, kickWav, whistleWav) = do SDL.blitSurface pitch Nothing screen Nothing renderObjects param oos (screen, pitch, fonts, balls, tockWav, kickWav, whistleWav) SDL.flip screen renderStartMsg :: (Num i, Ix i) => (Surface, t, Array i Font, t1, t2, t3, t4) -> IO () renderStartMsg (screen,_, fonts,_,_,_,_) = do let font = fonts ! 4 let color = colorFromPixel $ rgbColor 255 255 1 fontSurface <- TTF.renderTextSolid font ("PRESS TO START") color SDL.blitSurface fontSurface Nothing screen (Just $ Rect 250 400 100 100) SDL.flip screen renderEndMsg :: (Num i, Ix i) => (Surface, t, Array i Font, t1, t2, t3, Chunk) -> IO () renderEndMsg (screen,_, fonts,_,_,_,whistle) = do let font = fonts ! 4 let color = colorFromPixel $ rgbColor 255 255 1 fontSurface <- TTF.renderTextSolid font ("GAME OVER, TRY AGAIN (Y/N)") color playChannel (1) whistle 0 SDL.blitSurface fontSurface Nothing screen (Just $ Rect 200 400 100 100) SDL.flip screen