module Nomyx.Library.Victory where
import Data.Function
import Data.List
import Control.Arrow
import Control.Monad
import Nomyx.Language
import Nomyx.Library.Bank
victoryXRules :: Int -> Rule
victoryXRules x = setVictory $ do
rs <- getRules
let counts :: [(PlayerNumber,Int)]
counts = map (_rProposedBy . head &&& length) $ groupBy ((==) `on` _rProposedBy) rs
let victorious = map fst $ filter ((>= x) . snd) counts
return victorious
victoryXEcu :: Int -> Rule
victoryXEcu x = setVictory $ do
as <- readVar accounts
let victorious as = map fst $ filter ((>= x) . snd) as
return $ maybe [] victorious as
noGroupVictory :: Rule
noGroupVictory = do
let testVictory (VictoryInfo _ cond) = do
vics <- cond
when (length vics >1) $ setVictory (return [])
void $ onEvent_ victoryEvent testVictory
iWin :: Rule
iWin = getProposerNumber >>= giveVictory