Copyright | (c) Henry J. Wylde, 2016 |
---|---|
License | BSD3 |
Maintainer | public@hjwylde.com |
Safe Haskell | None |
Language | Haskell2010 |
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
- stage :: Lens' Game Stage
- round :: Lens' Game Int
- players :: Lens' Game [Player]
- boots :: Lens' Game (Map Text [Text])
- allowedVoters :: Lens' Game [Text]
- divine :: Lens' Game (Maybe Text)
- fallenAngelLynched :: Lens' Game Bool
- healUsed :: Lens' Game Bool
- hunterRetaliated :: Lens' Game Bool
- jesterRevealed :: Lens' Game Bool
- 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
- _FerinasGrunt :: Prism' Stage ()
- _GameOver :: Prism' Stage ()
- _HuntersTurn1 :: Prism' Stage ()
- _HuntersTurn2 :: Prism' Stage ()
- _Lynching :: 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 ()
- allStages :: [Stage]
- stageCycle :: [Stage]
- stageAvailable :: Game -> Stage -> Bool
- newGame :: [Player] -> Game
- votee :: Fold Game Player
- firstRound :: Prism' Game Game
- secondRound :: Prism' Game Game
- thirdRound :: Prism' Game Game
- getAllowedVoters :: Game -> [Player]
- getPendingVoters :: Game -> [Player]
- hasAnyoneWon :: Game -> Bool
- hasFallenAngelWon :: Game -> Bool
- hasVillagersWon :: Game -> Bool
- hasWerewolvesWon :: 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
).
allowedVoters :: Lens' Game [Text] Source
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.
_FerinasGrunt :: Prism' Stage () Source
_HuntersTurn1 :: Prism' Stage () Source
_HuntersTurn2 :: 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 Stage
s 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 :: [Player] -> Game Source
Creates a new Game
with the given players. No validations are performed here, those are left
to the binary.
Getters
votee :: Fold Game Player Source
The traversal of the votes
victim. This is the player, if they exist, that received the
majority of the votes.
Prisms
Searches
getAllowedVoters :: Game -> [Player] Source
Gets all the allowedVoters
in a game (which is names only) and maps them to their player.
getPendingVoters :: Game -> [Player] Source
Gets all Alive
players that have yet to vote.
Queries
hasAnyoneWon :: Game -> Bool Source
Queries whether anyone has won.
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.
hasVillagersWon :: Game -> Bool Source
Queries whether the Villagers
have won. The Villagers
win if they are the only players
surviving.
N.B., the Fallen Angel is not considered when determining whether the Villagers
have won.
hasWerewolvesWon :: Game -> Bool Source
Queries whether the Werewolves
have won. The Werewolves
win if they are the only players
surviving.