packages feed

minesweeper-0.8.8.3: Transition/Graphics.hs

module Transition.Graphics where

import State
import Configuration
import State.Functions
import Event
import Core.Square

import Numeric
import Data.Maybe
import qualified Data.ChangeMap as M
import qualified Data.ChangeSet as S

-------------------------------------------------------------

squareState :: State -> Square -> SquareState
squareState st p 
    | Just r <- revealing st
    , p == revSquare r
    , Just i <- busyAnimation r
    = BusySign focused prelight i
    | Just h         <- hint st
    , Just max       <- maxHiddenProb g
    , Just x         <- M.lookup p $ hiddenProbs g
    , h == FullHint || x == max || x == 0 || marked'
    = (if marked' then HintedBomb else Hint) focused prelight x
    | marked'      
    = Bomb focused prelight 
    | Just Nothing <- revealed
    = Death
    | Just (Just i) <- revealed
    = if hiddenTable st then HiddenSign else Clear focused i dangerousness
    | otherwise     
    = NoSign focused prelight 
 where
    g               = game st

    focused         = p == focus st && focusMoves st
    prelight        = maybe False (== p) (mouseFocus st) && mouseFocusShown st
    revealed        = M.lookup p $ revealResults g
    marked'         = S.member p $ marked g
    dangerousness   = head $ [x | (q,x)<-redness st, q==p] ++ [0]



infoString st
    | playerWins st
    = "Congratulations! You won with " ++ show_ 2 (luck st) ++ " luck."
    | alive (game st) == 0 
    = "Sorry, you died of necessity."
    | isFinished st  
    = "Sorry, you died by accident."
    | otherwise
    =  "Mines left: "  ++ show (mines_left st) ++ "  "
    ++ "Information: " ++ show_ 1 (100 * information st) ++ "%" ++ "  "
    ++ "Luck: "   ++ show_ 2 (luck st)
 where
    show_ :: RealFloat a => Int -> a -> [Char]
    show_ i x = showFFloat (Just i) x ""


timeString st
    | Just t <- timer st 
    = showSeconds t
    | isNew st 
    = "Timer will start"
    | otherwise 
    = "Timer stopped"
 where
    showSeconds :: Int -> String
    showSeconds s = f h ++ ":" ++ f m' ++ ":" ++ f s' where

        (m, s') = divMod s 60
        (h, m') = divMod m 60

        f :: Int -> String
        f i = reverse $ take 2 $ reverse $ "0" ++ show i