packages feed

Eternal10Seconds-0.1: Score.hs

module Score where

import Monad
import IO
import Time
import qualified Graphics.UI.SDL as SDL
import Resource
import Number

-- ƒnƒCƒXƒRƒA‰æ–Ê
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‚̍XV
addScoreResource :: Resource -> IO Resource
addScoreResource res = foldM addImageResource res scoreImgs