| Copyright | (c) Henry J. Wylde 2016 |
|---|---|
| License | BSD3 |
| Maintainer | public@hjwylde.com |
| Safe Haskell | None |
| Language | Haskell2010 |
Game.Werewolf.Game
Description
A game is not quite as simple as players! Roughly speaking though, this engine is stateful. The
game state only changes when a command is issued. Thus, this module defines the Game data
structure and any fields required to keep track of the current state.
- data Game
- variant :: Lens' Game Variant
- stage :: Lens' Game Stage
- round :: Lens' Game Int
- players :: Lens' Game [Player]
- boots :: Lens' Game (Map Text [Text])
- chosenVoters :: Lens' Game [Text]
- deadRaised :: Lens' Game Bool
- divine :: Lens' Game (Maybe Text)
- fallenAngelLynched :: Lens' Game Bool
- healUsed :: Lens' Game Bool
- hunterRetaliated :: Lens' Game Bool
- jesterRevealed :: Lens' Game Bool
- marks :: Lens' Game [Text]
- passed :: Lens' Game Bool
- poison :: Lens' Game (Maybe Text)
- poisonUsed :: Lens' Game Bool
- priorProtect :: Lens' Game (Maybe Text)
- protect :: Lens' Game (Maybe Text)
- roleModel :: Lens' Game (Maybe Text)
- scapegoatBlamed :: Lens' Game Bool
- see :: Lens' Game (Maybe Text)
- votes :: Lens' Game (Map Text Text)
- data Stage
- _DruidsTurn :: Prism' Stage ()
- _GameOver :: Prism' Stage ()
- _HuntersTurn1 :: Prism' Stage ()
- _HuntersTurn2 :: Prism' Stage ()
- _Lynching :: Prism' Stage ()
- _NecromancersTurn :: Prism' Stage ()
- _OraclesTurn :: Prism' Stage ()
- _OrphansTurn :: Prism' Stage ()
- _ProtectorsTurn :: Prism' Stage ()
- _ScapegoatsTurn :: Prism' Stage ()
- _SeersTurn :: Prism' Stage ()
- _Sunrise :: Prism' Stage ()
- _Sunset :: Prism' Stage ()
- _VillageDrunksTurn :: Prism' Stage ()
- _VillagesTurn :: Prism' Stage ()
- _WerewolvesTurn :: Prism' Stage ()
- _WitchsTurn :: Prism' Stage ()
- activity :: (Functor f, Contravariant f) => (Activity -> f Activity) -> Stage -> f Stage
- allStages :: [Stage]
- stageCycle :: [Stage]
- stageAvailable :: Game -> Stage -> Bool
- newGame :: Variant -> [Player] -> Game
- votee :: Fold Game Player
- allowedVoters :: Fold Game Player
- pendingVoters :: Fold Game Player
- firstRound :: Prism' Game Game
- secondRound :: Prism' Game Game
- thirdRound :: Prism' Game Game
- getMarks :: Game -> [Player]
- hasAnyoneWon :: Game -> Bool
- hasDullahanWon :: Game -> Bool
- hasFallenAngelWon :: Game -> Bool
- hasNecromancerWon :: Game -> Bool
- hasVillagersWon :: Game -> Bool
- hasWerewolvesWon :: Game -> Bool
- hasEveryoneLost :: Game -> Bool
Game
There are a few key pieces of information that a game always needs to hold. These are:
Any further fields on the game are specific to one or more roles (and their respective turns!).
Some of the additional fields are reset each round (e.g., the Seer's see) while others are
kept around for the whole game (e.g., the Orphan's roleModel).
Most of these are fairly self-explainable (the turn stages). Sunrise and Sunset are
provided as meaningful breaks between the day and night as, for example, a VillagesTurn may
not always be available (curse that retched Scapegoat).
Once the game reaches a turn stage, it requires a command to help push it past. Often only certain roles and commands may be performed at any given stage.
_DruidsTurn :: Prism' Stage () Source #
_HuntersTurn1 :: Prism' Stage () Source #
_HuntersTurn2 :: Prism' Stage () Source #
_NecromancersTurn :: Prism' Stage () Source #
_OraclesTurn :: Prism' Stage () Source #
_OrphansTurn :: Prism' Stage () Source #
_ProtectorsTurn :: Prism' Stage () Source #
_ScapegoatsTurn :: Prism' Stage () Source #
_SeersTurn :: Prism' Stage () Source #
_VillageDrunksTurn :: Prism' Stage () Source #
_VillagesTurn :: Prism' Stage () Source #
_WerewolvesTurn :: Prism' Stage () Source #
_WitchsTurn :: Prism' Stage () Source #
stageCycle :: [Stage] Source #
An infinite cycle of all Stages in the order that they should occur.
stageAvailable :: Game -> Stage -> Bool Source #
Checks whether the stage is available for the given Game. Most often this just involves
checking if there is an applicable role alive, but sometimes it is more complex.
One of the more complex checks here is for the VillagesTurn. If the Fallen Angel is in play,
then the VillagesTurn is available on the first day rather than only after the first night.
newGame :: Variant -> [Player] -> Game Source #
Creates a new Game with the given players. No validations are performed here, those are left
to the binary.
Folds
votee :: Fold Game Player Source #
The traversal of the votes victim's name. This is the player, if they exist, that received
the majority of the votes. This could be an empty list depending on whether the votes were in
conflict.
allowedVoters :: Fold Game Player Source #
The traversal of the allowed voters during the VillagesTurn or WerewolvesTurn. In a
standard game, this is all Alive players. However there are two scenarios for the
VillagesTurn that may change this:
1) if the scapegoat has chosen some chosenVoters, it is these players.
2) if the jester has been revealed, he may not vote.
pendingVoters :: Fold Game Player Source #
The traversal of all Alive players that have yet to vote. This is synonymous to voters -
Map.keys votes
Prisms
Searches
getMarks :: Game -> [Player] Source #
Gets all the marks in a game (which is names only) and maps them to their player.
Queries
hasAnyoneWon :: Game -> Bool Source #
Queries whether anyone has won.
hasDullahanWon :: Game -> Bool Source #
Queries whether the Dullahan has won. The Dullahan wins if they manage to eliminate all their marks.
hasFallenAngelWon :: Game -> Bool Source #
Queries whether the Fallen Angel has won. The Fallen Angel wins if they manage to get themselves lynched by the Villagers.
hasNecromancerWon :: Game -> Bool Source #
Queries whether the Necromancer has won. The Necromancer wins if they and their zombies are
the only players surviving.
N.B., the Jester is not considered when determining whether the Necromancer has won.
hasVillagersWon :: Game -> Bool Source #
hasWerewolvesWon :: Game -> Bool Source #
Queries whether the Werewolves have won. The Werewolves win if they are the only players
surviving.
hasEveryoneLost :: Game -> Bool Source #
Queries whether everyone has lost.