lib/src/Hanafuda/KoiKoi/Game.hs

55 lines
1.5 KiB
Haskell
Raw Normal View History

{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ConstraintKinds #-}
module Hanafuda.KoiKoi.Game (
Action(..)
, Game(..)
, Environment
, Mode(..)
, Move(..)
, Source(..)
, Step(..)
, end
, setPlayer
) where
import Control.Monad.Except (MonadError)
import Control.Monad.IO.Class (MonadIO)
import Control.Monad.Writer (MonadWriter)
import Hanafuda (Card, Flower, Pack)
import Hanafuda.Player (Players, Player, Scores, set)
import Hanafuda.KoiKoi.Yaku (Score)
data Mode = FirstAt Int | WholeYear deriving (Show)
data Move = Play Card | Capture (Card, Card) | Choose Card | KoiKoi Bool
2019-08-12 23:02:17 +02:00
data Step = ToPlay | Turned Card | Scored | Over deriving (Show)
data Source = Hand | Deck deriving (Show)
data Action = Action {
source :: Source
, played :: Card
, captures :: Maybe Card
} deriving (Show)
type Environment m = (MonadIO m, MonadError String m, MonadWriter [Action] m)
2019-08-12 23:02:17 +02:00
data Game player = Game {
mode :: Mode
, scores :: Scores player
, month :: Flower
, players :: Players player Score
, playing :: player
, winning :: player
, oyake :: player
, deck :: [Card]
, river :: Pack
, step :: Step
, trick :: [Card]
2019-08-12 23:02:17 +02:00
, rounds :: [(player, Score)]
} deriving (Show)
2019-08-12 23:02:17 +02:00
setPlayer :: Ord player => Game player -> Player player Score -> Game player
setPlayer game@(Game {players, playing}) player = game {players = set playing player players}
2019-08-12 23:02:17 +02:00
end :: Monad m => Game player -> m (Game player)
end game = return $ game {step = Over}