|
|
|
@@ -32,6 +32,10 @@ class Bidder a where |
|
|
|
askHand :: MonadIO m => a -> Bid -> m Bool |
|
|
|
askSkat :: MonadIO m => a -> Bid -> [Card] -> m [Card] |
|
|
|
toPlayer :: a -> Team -> PL |
|
|
|
onBid :: MonadIO m => a -> Maybe Bid -> Hand -> Hand -> m () |
|
|
|
onBid _ _ _ _ = return () |
|
|
|
onResponse :: MonadIO m => a -> Bool -> Hand -> Hand -> m () |
|
|
|
onResponse _ _ _ _ = return () |
|
|
|
onGame :: MonadIO m => a -> Game -> Hand -> m () |
|
|
|
onGame _ _ _ = return () |
|
|
|
onResult :: MonadIO m => a -> Result -> m () |
|
|
|
@@ -54,6 +58,8 @@ instance Bidder BD where |
|
|
|
onStart (BD b) = onStart b |
|
|
|
onGame (BD b) = onGame b |
|
|
|
onResult (BD b) = onResult b |
|
|
|
onBid (BD b) = onBid b |
|
|
|
onResponse (BD b) = onResponse b |
|
|
|
|
|
|
|
data Bidders = Bidders BD BD BD |
|
|
|
deriving Show |
|
|
|
@@ -79,6 +85,7 @@ runPreperation = do |
|
|
|
(finalWinner, finalBid) <- runBidding bid (bidder bds Hand3) (bidder bds winner) |
|
|
|
if finalBid == 0 then do |
|
|
|
bid <- askBid (bidder bds finalWinner) finalWinner 0 |
|
|
|
publishBid bid finalWinner finalWinner |
|
|
|
case bid of |
|
|
|
Just val -> (Just . (finalWinner,)) <$> initGame finalWinner val |
|
|
|
Nothing -> return Nothing |
|
|
|
@@ -90,11 +97,17 @@ runBidding startingBid reizer gereizter = do |
|
|
|
case first of |
|
|
|
Just val |
|
|
|
| val > startingBid -> do |
|
|
|
publishBid first (hand reizer) (hand gereizter) |
|
|
|
response <- askResponse gereizter (hand reizer) val |
|
|
|
publishResponse response (hand reizer) (hand gereizter) |
|
|
|
if response then runBidding val reizer gereizter |
|
|
|
else return (hand reizer, val) |
|
|
|
| otherwise -> return (hand gereizter, startingBid) |
|
|
|
Nothing -> return (hand gereizter, startingBid) |
|
|
|
| otherwise -> do |
|
|
|
publishBid Nothing (hand reizer) (hand gereizter) |
|
|
|
return (hand gereizter, startingBid) |
|
|
|
Nothing -> do |
|
|
|
publishBid Nothing (hand reizer) (hand gereizter) |
|
|
|
return (hand gereizter, startingBid) |
|
|
|
|
|
|
|
initGame :: Hand -> Bid -> Preperation SkatEnv |
|
|
|
initGame single bid = do |
|
|
|
@@ -139,8 +152,17 @@ publishGameResults res bidders = do |
|
|
|
onResult (bidder bidders Hand3) res |
|
|
|
|
|
|
|
publishGameStart :: Game -> Hand -> Preperation () |
|
|
|
publishGameStart game sglPlayer = do |
|
|
|
publishGameStart game sglPlayer = mapBidders (\b -> onGame b game sglPlayer) |
|
|
|
|
|
|
|
publishBid :: Maybe Bid -> Hand -> Hand -> Preperation () |
|
|
|
publishBid bid reizer gereizter = mapBidders (\b -> onBid b bid reizer gereizter) |
|
|
|
|
|
|
|
publishResponse :: Bool -> Hand -> Hand -> Preperation () |
|
|
|
publishResponse response reizer gereizter = mapBidders (\b -> onResponse b response reizer gereizter) |
|
|
|
|
|
|
|
mapBidders :: (BD -> Preperation ()) -> Preperation () |
|
|
|
mapBidders f = do |
|
|
|
bds <- asks bidders |
|
|
|
onGame (bidder bds Hand1) game sglPlayer |
|
|
|
onGame (bidder bds Hand2) game sglPlayer |
|
|
|
onGame (bidder bds Hand3) game sglPlayer |
|
|
|
f (bidder bds Hand1) |
|
|
|
f (bidder bds Hand2) |
|
|
|
f (bidder bds Hand3) |