2018-03-15 22:32:24 +01:00
|
|
|
{-# LANGUAGE NamedFieldPuns #-}
|
2019-01-08 22:37:09 +01:00
|
|
|
{-# LANGUAGE FlexibleContexts #-}
|
|
|
|
{-# LANGUAGE ConstraintKinds #-}
|
2018-03-15 22:32:24 +01:00
|
|
|
module Hanafuda.KoiKoi.Game (
|
2019-01-08 22:37:09 +01:00
|
|
|
Action(..)
|
|
|
|
, Environment
|
2019-10-16 10:30:31 +02:00
|
|
|
, Game(..)
|
2019-08-24 23:04:37 +02:00
|
|
|
, GameID
|
|
|
|
, ID
|
2018-03-15 22:32:24 +01:00
|
|
|
, Mode(..)
|
|
|
|
, Move(..)
|
2019-10-17 12:05:34 +02:00
|
|
|
, Player
|
2019-08-24 23:04:37 +02:00
|
|
|
, PlayerID
|
2019-10-22 17:42:23 +02:00
|
|
|
, PlayerTurn
|
2019-10-17 12:05:34 +02:00
|
|
|
, Players
|
|
|
|
, Scores
|
2019-01-08 22:37:09 +01:00
|
|
|
, Source(..)
|
2018-03-15 22:32:24 +01:00
|
|
|
, Step(..)
|
|
|
|
, end
|
|
|
|
, setPlayer
|
|
|
|
) where
|
|
|
|
|
2019-01-08 22:37:09 +01:00
|
|
|
import Control.Monad.Except (MonadError)
|
|
|
|
import Control.Monad.IO.Class (MonadIO)
|
|
|
|
import Control.Monad.Writer (MonadWriter)
|
2019-10-22 17:42:23 +02:00
|
|
|
import Data.Map (Map)
|
2018-03-15 22:32:24 +01:00
|
|
|
import Hanafuda (Card, Flower, Pack)
|
2020-01-04 12:07:26 +01:00
|
|
|
import Hanafuda.ID (ID, IDType(..), Prefix(..))
|
2019-08-24 23:04:37 +02:00
|
|
|
import qualified Hanafuda.KoiKoi.Yaku as KoiKoi (Score)
|
2019-10-17 12:05:34 +02:00
|
|
|
import qualified Hanafuda.Player as Player (ID, Players, Player, Scores, set)
|
2018-03-15 22:32:24 +01:00
|
|
|
|
|
|
|
data Mode = FirstAt Int | WholeYear deriving (Show)
|
2019-11-12 22:10:45 +01:00
|
|
|
data Move = Play Card | Capture (Card, Card) | Choose Card | KoiKoi Bool deriving (Show)
|
2019-08-12 23:02:17 +02:00
|
|
|
data Step = ToPlay | Turned Card | Scored | Over deriving (Show)
|
2019-01-08 22:37:09 +01:00
|
|
|
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-10-17 12:05:34 +02:00
|
|
|
type Player = Player.Player KoiKoi.Score
|
2019-08-24 23:04:37 +02:00
|
|
|
type PlayerID = Player.ID KoiKoi.Score
|
2019-10-17 12:05:34 +02:00
|
|
|
type Players = Player.Players KoiKoi.Score
|
|
|
|
type Scores = Player.Scores KoiKoi.Score
|
2019-08-24 23:04:37 +02:00
|
|
|
type GameID = ID Game
|
2020-01-04 12:07:26 +01:00
|
|
|
instance IDType Game where
|
|
|
|
prefix = Prefix "Game"
|
2019-10-22 17:42:23 +02:00
|
|
|
type PlayerTurn = Map PlayerID PlayerID
|
2018-03-15 22:32:24 +01:00
|
|
|
|
2019-10-16 10:30:31 +02:00
|
|
|
data Game = Game {
|
2020-01-13 08:40:38 +01:00
|
|
|
gameID :: GameID
|
|
|
|
, mode :: Mode
|
2019-10-17 12:05:34 +02:00
|
|
|
, scores :: Scores
|
2018-03-15 22:32:24 +01:00
|
|
|
, month :: Flower
|
2019-10-22 17:42:23 +02:00
|
|
|
, nextPlayer :: PlayerTurn
|
2019-10-17 12:05:34 +02:00
|
|
|
, players :: Players
|
2019-08-24 23:04:37 +02:00
|
|
|
, playing :: PlayerID
|
|
|
|
, winning :: PlayerID
|
|
|
|
, oyake :: PlayerID
|
2019-10-16 10:30:31 +02:00
|
|
|
, deck :: [Card]
|
2018-03-15 22:32:24 +01:00
|
|
|
, river :: Pack
|
|
|
|
, step :: Step
|
|
|
|
, trick :: [Card]
|
2019-08-24 23:04:37 +02:00
|
|
|
, rounds :: [(PlayerID, KoiKoi.Score)]
|
2018-03-15 22:32:24 +01:00
|
|
|
} deriving (Show)
|
|
|
|
|
2019-10-17 12:05:34 +02:00
|
|
|
setPlayer :: Game -> Player -> Game
|
|
|
|
setPlayer game@(Game {players, playing}) player = game {
|
|
|
|
players = Player.set playing player players
|
|
|
|
}
|
2018-03-15 22:32:24 +01:00
|
|
|
|
2019-08-24 23:04:37 +02:00
|
|
|
end :: Monad m => Game -> m Game
|
2019-08-12 23:02:17 +02:00
|
|
|
end game = return $ game {step = Over}
|