summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Yin <fkfd@fkfd.me>2023-01-09 13:03:38 +0800
committerFrederick Yin <fkfd@fkfd.me>2023-01-09 13:03:38 +0800
commitbdb4482b8f4556263713fabe34c8b96528c3c494 (patch)
tree70a94818a1776a9cb791f3ea413355f77a3a6fa0
parentd034b9c9273a7f3ff91554c4b605dd488207caa1 (diff)
Restore stock pile if depleted
-rw-r--r--Game.hs18
1 files changed, 13 insertions, 5 deletions
diff --git a/Game.hs b/Game.hs
index 69c1d08..f2d6fd0 100644
--- a/Game.hs
+++ b/Game.hs
@@ -2,7 +2,7 @@ module Game where
import Data.Char (isDigit)
import Control.Monad (when)
-import System.Random (RandomGen)
+import System.Random (RandomGen, newStdGen)
import Player (Player, shed, draw)
import qualified Player as P
import Card (Card(..))
@@ -49,13 +49,21 @@ beginTurn game@(Game plyrs pidx att dir prev stock disc) = do
-- | Game state after player draws card(s) and skips turn.
drawAndSkip :: Game -> IO Game
drawAndSkip game@(Game plyrs pidx att dir prev stock disc) = do
+ gen <- newStdGen
+ let stockLongEnough = if length stock < att
+ then stock ++ (C.shuffle gen stock)
+ else stock
+ let stock' = drop att stockLongEnough
+ let disc' = if length stock < att
+ then []
+ else disc
+ let cardsToDraw = take att stockLongEnough
let player = plyrs !! pidx
- let player' = player `draw` (take att stock)
+ let player' = player `draw` cardsToDraw
let plyrs' = P.update plyrs pidx player'
let pidx' = (pidx + dir) `mod` length plyrs
- let stock' = drop att stock
- putStrLn $ (P.name player) ++ " draws " ++ (C.showCards $ take att stock)
- return $ Game plyrs' pidx' att dir prev stock' disc
+ putStrLn $ (P.name player) ++ " draws " ++ (C.showCards cardsToDraw)
+ return $ Game plyrs' pidx' att dir prev stock' disc'
-- | Game state after player sheds card.
shedAndContinue :: Card -> Game -> IO Game