54 lines
1.2 KiB
Haskell
54 lines
1.2 KiB
Haskell
|
{-# LANGUAGE NamedFieldPuns #-}
|
||
|
module Hanafuda.KoiKoi.Game (
|
||
|
Game(..)
|
||
|
, Mode(..)
|
||
|
, Move(..)
|
||
|
, On(..)
|
||
|
, Over(..)
|
||
|
, Step(..)
|
||
|
, end
|
||
|
, raise
|
||
|
, setPlayer
|
||
|
, stop
|
||
|
) where
|
||
|
|
||
|
import Hanafuda (Card, Flower, Pack)
|
||
|
import Hanafuda.Player (Players, Player, Scores, Seat)
|
||
|
import Hanafuda.KoiKoi.Yaku (Score)
|
||
|
import Data.Map (insert)
|
||
|
|
||
|
data Mode = FirstAt Int | WholeYear deriving (Show)
|
||
|
data Move = Play Card | Capture (Card, Card) | Choose Card | KoiKoi Bool
|
||
|
data Step = ToPlay | Turned Card | Scored deriving (Show)
|
||
|
|
||
|
data On = On_ {
|
||
|
mode :: Mode
|
||
|
, scores :: Scores
|
||
|
, month :: Flower
|
||
|
, players :: Players Score
|
||
|
, playing :: Seat
|
||
|
, winning :: Seat
|
||
|
, oyake :: Seat
|
||
|
, stock :: [Card]
|
||
|
, river :: Pack
|
||
|
, step :: Step
|
||
|
, trick :: [Card]
|
||
|
} deriving (Show)
|
||
|
data Over = Over_ {
|
||
|
finalScores :: Scores
|
||
|
} deriving (Show)
|
||
|
|
||
|
data Game = Error String | Over Over | On On deriving (Show)
|
||
|
|
||
|
setPlayer :: On -> Player Score -> On
|
||
|
setPlayer on@(On_ {players, playing}) player = on {players = insert playing player players}
|
||
|
|
||
|
end :: On -> IO Game
|
||
|
end (On_ {scores}) = return . Over $ Over_ {finalScores = scores}
|
||
|
|
||
|
stop :: On -> IO Game
|
||
|
stop = return . On
|
||
|
|
||
|
raise :: String -> IO Game
|
||
|
raise = return . Error
|