module PlayTak.Commands ( client, login, seek, acceptGame, sendPlay ) where import Control.Concurrent import Data.List import Tak import PlayTak.Types client :: PlayTakClient -> String -> IO () client ptc name = do sendCmd ptc $ "Client " ++ name login :: PlayTakClient -> Username -> Password -> IO () login ptc username password = do sendCmd ptc $ "Login " ++ username ++ " " ++ password seek :: PlayTakClient -> Size -> Time -> Time -> Maybe Colour -> IO () seek ptc size time incr mColour = sendCmd ptc $ "Seek " ++ show size ++ " " ++ show time ++ " " ++ show incr ++ case mColour of Nothing -> "" Just White -> " W" Just Black -> " B" acceptGame :: PlayTakClient -> GameNumber -> IO () acceptGame ptc gameno = do sendCmd ptc $ "Accept " ++ show gameno sendPlay :: PlayTakClient -> GameNumber -> Play -> IO () sendPlay ptc gameno play = do let cmd = "Game#" ++ show gameno ++ " " ++ case play of Place stone loc -> "P " ++ square loc ++ case stone of Flat -> "" Cap -> " C" Standing -> " W" Move loc dir drops -> "M " ++ square loc ++ " " ++ square (endSquare loc dir $ length drops) ++ " " ++ (concat $ intersperse " " $ map show drops) sendCmd ptc cmd sendCmd :: PlayTakClient -> String -> IO () sendCmd ptc cmd = writeChan (clientChanCmd ptc) cmd endSquare :: Loc -> Dir -> Int -> Loc endSquare (i, j) PosX steps = (i + steps, j) endSquare (i, j) NegX steps = (i - steps, j) endSquare (i, j) PosY steps = (i, j + steps) endSquare (i, j) NegY steps = (i, j - steps) square :: Loc -> String square (i, j) = (ranks !! (i - 1)) : show j ranks :: String ranks = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"