module Score where
import Monad
import IO
import Time
import qualified Graphics.UI.SDL as SDL
import Resource
import Number
-- nCXRAæÊ
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 -- x³¹È¢
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
-- \[XÌXV
addScoreResource :: Resource -> IO Resource
addScoreResource res = foldM addImageResource res scoreImgs