packages feed

tateti-tateti-0.1.0.0: src/OtherScreens.hs

{-# LANGUAGE LambdaCase #-}
module OtherScreens where

import Control.Monad.Trans
import UI.NCurses

import Types
import Util


-- | Select screen types
data Choice = CPlayer Player
            | CRandom
            deriving Show


whoPlaysLoop :: Window -> Colors -> Choice -> Game (Maybe Choice)
whoPlaysLoop w colors who = do
    lift . updateWindow w $ do
        moveCursor 10 4
        drawString "Who should play?"

        uncurry moveCursor . getPos $ CPlayer X
        setColor . colors . color $ X
        drawString "X"

        uncurry moveCursor . getPos $ CPlayer O
        setColor . colors . color $ O
        drawString "O"

        uncurry moveCursor . getPos $ CRandom
        setColor . colors . color $ Draw
        drawString "Random"

        setColor defaultColorID

        uncurry moveCursor $ getPos who

    lift render

    parseInput w >>= \case
        Movement KLeft -> whoPlaysLoop w colors $ toLeft who
        Movement KRight -> whoPlaysLoop w colors $ toRight who
        Select -> return $ Just who
        Quit -> return Nothing
        _ -> whoPlaysLoop w colors who
  where
    toLeft (CPlayer X) = CPlayer X
    toLeft (CPlayer O) = CPlayer X
    toLeft CRandom = CPlayer O

    toRight (CPlayer X) = CPlayer O
    toRight (CPlayer O) = CRandom
    toRight CRandom = CRandom

    getPos (CPlayer X) = (12, 6)
    getPos (CPlayer O) = (12, 8)
    getPos CRandom = (12, 10)


endGameLoop :: Winner -> Window -> Colors -> Game ()
endGameLoop winner w colors = do
    lift . updateWindow w $ do

        moveCursor 0 2
        setColor . colors . color $ winner
        drawString $ case winner of
            Player pl -> show pl ++ " wins!"
            Draw -> "Draw lolz..."

    lift render

    parseInput w >>= \case
        Quit -> return ()
        _ -> endGameLoop winner w colors