module Score where import Monad import IO import Time import qualified Graphics.UI.SDL as SDL import Resource import Number -- ハイスコア画面 data Score = Score hiscoresPaint = (("./resource/image/hiscores.bmp", Nothing), Nothing) sepBmp = "./resource/image/sep.bmp" scoreImgs = numberBmp:sepBmp:(fst.fst) hiscoresPaint:[] slashPaint (x, y) = ((sepBmp, Just $ SDL.Rect 0 0 15 30), Just $ SDL.Rect x y 15 30) colonPaint (x, y) = ((sepBmp, Just $ SDL.Rect 30 0 15 30), Just $ SDL.Rect x y 15 30) scoreFile = "score.dat" -- 読み込み readScore :: IO [[Int]] readScore = do handle <- openFile scoreFile ReadMode file <- hGetContents handle return $! file -- 遅延させない hClose handle return [[read wd | wd <- words ln] | ln <- lines file] -- 書き込み writeScore :: Int -> IO () writeScore s = do clock <- getClockTime calendar <- toCalendarTime clock let record = [s, ctYear calendar, (fromEnum $ ctMonth calendar)+1, ctDay calendar, ctHour calendar, ctMin calendar, ctSec calendar] scores <- readScore let (large, small) = span ((>=s).head) scores let newScores = init (large ++ [record] ++ small) writeFile scoreFile $ unlines $ map (unwords.map show) newScores -- 描画 renderRecord :: SDL.Surface -> Resource -> Int -> [Int] -> IO () renderRecord surf res n r = let numX = [100, 150, 300, 385, 440, 500, 555, 610] y = (50 + n * 30) in do sequence_ $ zipWith ($) [renderNumber surf res numberBmp numberSize (x, y) | x <- numX] (n:r) mapM_ (\x -> renderPaint res surf (slashPaint (x, y))) [365, 420] mapM_ (\x -> renderPaint res surf (colonPaint (x, y))) [535, 590] renderScore :: Score -> SDL.Surface -> Resource -> IO () renderScore s surf res = do renderPaint res surf hiscoresPaint scores <- readScore sequence_ $ zipWith ($) [renderRecord surf res n | n <- [1..10]] scores -- リソースの更新 addScoreResource :: Resource -> IO Resource addScoreResource res = foldM addImageResource res scoreImgs