packages feed

werewolf 1.5.0.0 → 1.5.1.0

raw patch · 28 files changed

+178/−79 lines, 28 filesdep ~optparse-applicative

Dependency ranges changed: optparse-applicative

Files

CHANGELOG.md view
@@ -7,6 +7,16 @@  ### Upcoming +### v1.5.1.0++*Minor*++* Added the No Role Knowledge Or Reveal variant. ([#226](https://github.com/hjwylde/werewolf/issues/226))++*Revisions*++* Bump optparse-applicative max version constraint. ([#256](https://github.com/hjwylde/werewolf/issues/256))+ ### v1.5.0.0  *Major*
README.md view
@@ -93,7 +93,9 @@  * Standard * No role knowledge (players are not informed of the roles in play at the start of a game)-* No role reveal (player roles are not revealed upon death)+* No role knowledge or reveal (players are not informed of the roles in play at the start of a game,+  nor each others roles upon death)+* No role reveal (players are not informed of each others roles upon death) * Spiteful village (the default Villager role becomes the Spiteful Villager)  ### Installing
app/Game/Werewolf/Message/Command.hs view
@@ -63,16 +63,18 @@ import Game.Werewolf.Game import Game.Werewolf.Player import Game.Werewolf.Response-import Game.Werewolf.Role                            hiding (name)-import Game.Werewolf.Variant                         hiding (name)-import Game.Werewolf.Variant.NoRoleKnowledge.Command as NoRoleKnowledge-import Game.Werewolf.Variant.NoRoleReveal.Command    as NoRoleReveal-import Game.Werewolf.Variant.Standard.Command        as Standard+import Game.Werewolf.Role                                    hiding (name)+import Game.Werewolf.Variant                                 hiding (name)+import Game.Werewolf.Variant.NoRoleKnowledge.Command         as NoRoleKnowledge+import Game.Werewolf.Variant.NoRoleKnowledgeOrReveal.Command as NoRoleKnowledgeOrReveal+import Game.Werewolf.Variant.NoRoleReveal.Command            as NoRoleReveal+import Game.Werewolf.Variant.Standard.Command                as Standard  playerQuitMessage :: Player -> Game -> Message playerQuitMessage player game-    | has (variant . noRoleReveal) game = publicMessage $ NoRoleReveal.callerQuitText player-    | otherwise                         = publicMessage $ Standard.callerQuitText player+    | has (variant . noRoleKnowledgeOrReveal) game  = publicMessage $ NoRoleKnowledgeOrReveal.callerQuitText player+    | has (variant . noRoleReveal) game             = publicMessage $ NoRoleReveal.callerQuitText player+    | otherwise                                     = publicMessage $ Standard.callerQuitText player  playerVotedToBootMessage :: Player -> Player -> Message playerVotedToBootMessage caller = publicMessage . callerVotedBootText caller@@ -82,8 +84,9 @@  playerShotMessage :: Player -> Game -> Message playerShotMessage player game-    | has (variant . noRoleReveal) game = publicMessage $ NoRoleReveal.playerShotText player-    | otherwise                         = publicMessage $ Standard.playerShotText player+    | has (variant . noRoleKnowledgeOrReveal) game  = publicMessage $ NoRoleKnowledgeOrReveal.playerShotText player+    | has (variant . noRoleReveal) game             = publicMessage $ NoRoleReveal.playerShotText player+    | otherwise                                     = publicMessage $ Standard.playerShotText player  gameEndedMessage :: Text -> Message gameEndedMessage = publicMessage . gameEndedText@@ -173,9 +176,10 @@  pingNocturnalRoleMessage :: Role -> Game -> Message pingNocturnalRoleMessage role game-    | has (variant . noRoleKnowledge) game  = publicMessage $ NoRoleKnowledge.nocturnalRolePingedText role-    | has (variant . noRoleReveal) game     = publicMessage $ NoRoleReveal.nocturnalRolePingedText role-    | otherwise                             = publicMessage $ Standard.nocturnalRolePingedText role+    | has (variant . noRoleKnowledge) game          = publicMessage $ NoRoleKnowledge.nocturnalRolePingedText role+    | has (variant . noRoleKnowledgeOrReveal) game  = publicMessage $ NoRoleKnowledgeOrReveal.nocturnalRolePingedText role+    | has (variant . noRoleReveal) game             = publicMessage $ NoRoleReveal.nocturnalRolePingedText role+    | otherwise                                     = publicMessage $ Standard.nocturnalRolePingedText role  pingPlayerMessage :: Text -> Message pingPlayerMessage to = privateMessage to playerPingedText@@ -185,9 +189,10 @@  pingWerewolvesMessage :: Game -> Message pingWerewolvesMessage game-    | has (variant . noRoleKnowledge) game  = publicMessage NoRoleKnowledge.werewolvesPingedText-    | has (variant . noRoleReveal) game     = publicMessage NoRoleReveal.werewolvesPingedText-    | otherwise                             = publicMessage Standard.werewolvesPingedText+    | has (variant . noRoleKnowledge) game          = publicMessage NoRoleKnowledge.werewolvesPingedText+    | has (variant . noRoleKnowledgeOrReveal) game  = publicMessage NoRoleKnowledgeOrReveal.werewolvesPingedText+    | has (variant . noRoleReveal) game             = publicMessage NoRoleReveal.werewolvesPingedText+    | otherwise                                     = publicMessage Standard.werewolvesPingedText  deadRaisedMessages :: Game -> [Message] deadRaisedMessages game =@@ -207,9 +212,10 @@  currentNocturnalTurnMessage :: Text -> Game -> Message currentNocturnalTurnMessage to game-    | has (variant . noRoleKnowledge) game  = privateMessage to $ NoRoleKnowledge.currentNocturnalTurnText game-    | has (variant . noRoleReveal) game     = privateMessage to $ NoRoleReveal.currentNocturnalTurnText game-    | otherwise                             = privateMessage to $ Standard.currentNocturnalTurnText game+    | has (variant . noRoleKnowledge) game          = privateMessage to $ NoRoleKnowledge.currentNocturnalTurnText game+    | has (variant . noRoleKnowledgeOrReveal) game  = privateMessage to $ NoRoleKnowledgeOrReveal.currentNocturnalTurnText game+    | has (variant . noRoleReveal) game             = privateMessage to $ NoRoleReveal.currentNocturnalTurnText game+    | otherwise                                     = privateMessage to $ Standard.currentNocturnalTurnText game  gameIsOverMessage :: Text -> Message gameIsOverMessage to = privateMessage to gameOverText@@ -222,9 +228,10 @@     where         alivePlayersText' = alivePlayersText game         deadPlayersText'-            | hasn't (players . traverse . dead) game   = T.empty-            | has (variant . noRoleReveal) game         = NoRoleReveal.deadPlayersText game-            | otherwise                                 = Standard.deadPlayersText game+            | hasn't (players . traverse . dead) game       = T.empty+            | has (variant . noRoleKnowledgeOrReveal) game  = NoRoleKnowledgeOrReveal.deadPlayersText game+            | has (variant . noRoleReveal) game             = NoRoleReveal.deadPlayersText game+            | otherwise                                     = Standard.deadPlayersText game  playerRescindedVoteMessage :: Text -> Player -> Message playerRescindedVoteMessage to = privateMessage to . callerRescindedVoteText
app/Game/Werewolf/Message/Engine.hs view
@@ -34,16 +34,18 @@ import Game.Werewolf.Game import Game.Werewolf.Player import Game.Werewolf.Response-import Game.Werewolf.Role                           hiding (name)-import Game.Werewolf.Variant                        hiding (name)-import Game.Werewolf.Variant.NoRoleKnowledge.Engine as NoRoleKnowledge-import Game.Werewolf.Variant.NoRoleReveal.Engine    as NoRoleReveal-import Game.Werewolf.Variant.Standard.Engine        as Standard+import Game.Werewolf.Role                                   hiding (name)+import Game.Werewolf.Variant                                hiding (name)+import Game.Werewolf.Variant.NoRoleKnowledge.Engine         as NoRoleKnowledge+import Game.Werewolf.Variant.NoRoleKnowledgeOrReveal.Engine as NoRoleKnowledgeOrReveal+import Game.Werewolf.Variant.NoRoleReveal.Engine            as NoRoleReveal+import Game.Werewolf.Variant.Standard.Engine                as Standard  playerBootedMessage :: Player -> Game -> Message playerBootedMessage player game-    | has (variant . noRoleReveal) game = publicMessage $ NoRoleReveal.playerBootedText player-    | otherwise                         = publicMessage $ Standard.playerBootedText player+    | has (variant . noRoleKnowledgeOrReveal) game  = publicMessage $ NoRoleKnowledgeOrReveal.playerBootedText player+    | has (variant . noRoleReveal) game             = publicMessage $ NoRoleReveal.playerBootedText player+    | otherwise                                     = publicMessage $ Standard.playerBootedText player  gameOverMessages :: Game -> [Message] gameOverMessages game@@ -154,8 +156,9 @@  rolesInGameMessage :: Maybe Text -> Game -> Message rolesInGameMessage mTo game-    | has (variant . noRoleKnowledge) game  = Message mTo $ NoRoleKnowledge.rolesInGameText game-    | otherwise                             = Message mTo $ Standard.rolesInGameText game+    | has (variant . noRoleKnowledge) game          = Message mTo $ NoRoleKnowledge.rolesInGameText game+    | has (variant . noRoleKnowledgeOrReveal) game  = Message mTo $ NoRoleKnowledgeOrReveal.rolesInGameText game+    | otherwise                                     = Message mTo $ Standard.rolesInGameText game  newPlayerMessage :: Player -> Message newPlayerMessage player = privateMessage (player ^. name) $ newPlayerText player@@ -168,8 +171,9 @@  spitefulVillagerKilledMessage :: Text -> Game -> Message spitefulVillagerKilledMessage to game-    | has (variant . noRoleReveal) game = privateMessage to $ NoRoleReveal.spitefulVillagerKilledText game-    | otherwise                         = privateMessage to $ Standard.spitefulVillagerKilledText game+    | has (variant . noRoleKnowledgeOrReveal) game  = privateMessage to $ NoRoleKnowledgeOrReveal.spitefulVillagerKilledText game+    | has (variant . noRoleReveal) game             = privateMessage to $ NoRoleReveal.spitefulVillagerKilledText game+    | otherwise                                     = privateMessage to $ Standard.spitefulVillagerKilledText game  trueVillagerMessage :: Game -> Message trueVillagerMessage = publicMessage . trueVillagerText@@ -214,44 +218,52 @@  necromancersTurnMessages :: Text -> Game -> [Message] necromancersTurnMessages to game-    | has (variant . noRoleKnowledge) game  =+    | has (variant . noRoleKnowledge) game          =         [ privateMessage to necromancersTurnPrivateText ]-    | has (variant . noRoleReveal) game     =+    | has (variant . noRoleKnowledgeOrReveal) game  =         [ privateMessage to necromancersTurnPrivateText ]-    | otherwise                             =+    | has (variant . noRoleReveal) game             =+        [ privateMessage to necromancersTurnPrivateText ]+    | otherwise                                     =         [ publicMessage necromancersTurnPublicText         , privateMessage to necromancersTurnPrivateText         ]  oraclesTurnMessages :: Text -> Game -> [Message] oraclesTurnMessages to game-    | has (variant . noRoleKnowledge) game  =+    | has (variant . noRoleKnowledge) game          =         [ privateMessage to oraclesTurnPrivateText ]-    | has (variant . noRoleReveal) game     =+    | has (variant . noRoleKnowledgeOrReveal) game  =         [ privateMessage to oraclesTurnPrivateText ]-    | otherwise                             =+    | has (variant . noRoleReveal) game             =+        [ privateMessage to oraclesTurnPrivateText ]+    | otherwise                                     =         [ publicMessage oraclesTurnPublicText         , privateMessage to oraclesTurnPrivateText         ]  orphansTurnMessages :: Text -> Game -> [Message] orphansTurnMessages to game-    | has (variant . noRoleKnowledge) game  =+    | has (variant . noRoleKnowledge) game          =         [ privateMessage to orphansTurnPrivateText ]-    | has (variant . noRoleReveal) game     =+    | has (variant . noRoleKnowledgeOrReveal) game  =         [ privateMessage to orphansTurnPrivateText ]-    | otherwise                             =+    | has (variant . noRoleReveal) game             =+        [ privateMessage to orphansTurnPrivateText ]+    | otherwise                                     =         [ publicMessage orphansTurnPublicText         , privateMessage to orphansTurnPrivateText         ]  protectorsTurnMessages :: Text -> Game -> [Message] protectorsTurnMessages to game-    | has (variant . noRoleKnowledge) game  =+    | has (variant . noRoleKnowledge) game          =         [ privateMessage to protectorsTurnPrivateText ]-    | has (variant . noRoleReveal) game     =+    | has (variant . noRoleKnowledgeOrReveal) game  =         [ privateMessage to protectorsTurnPrivateText ]-    | otherwise                             =+    | has (variant . noRoleReveal) game             =+        [ privateMessage to protectorsTurnPrivateText ]+    | otherwise                                     =         [ publicMessage protectorsTurnPublicText         , privateMessage to protectorsTurnPrivateText         ]@@ -261,20 +273,23 @@  seersTurnMessages :: Text -> Game -> [Message] seersTurnMessages to game-    | has (variant . noRoleKnowledge) game  =+    | has (variant . noRoleKnowledge) game          =         [ privateMessage to seersTurnPrivateText ]-    | has (variant . noRoleReveal) game     =+    | has (variant . noRoleKnowledgeOrReveal) game  =         [ privateMessage to seersTurnPrivateText ]-    | otherwise                             =+    | has (variant . noRoleReveal) game             =+        [ privateMessage to seersTurnPrivateText ]+    | otherwise                                     =         [ publicMessage seersTurnPublicText         , privateMessage to seersTurnPrivateText         ]  villageDrunksTurnMessages :: Game -> [Message] villageDrunksTurnMessages game-    | has (variant . noRoleKnowledge) game  = []-    | has (variant . noRoleReveal) game     = []-    | otherwise                             = [publicMessage villageDrunksTurnText]+    | has (variant . noRoleKnowledge) game          = []+    | has (variant . noRoleKnowledgeOrReveal) game  = []+    | has (variant . noRoleReveal) game             = []+    | otherwise                                     = [publicMessage villageDrunksTurnText]  sunriseMessage :: Message sunriseMessage = publicMessage sunriseText@@ -295,11 +310,13 @@  werewolvesTurnMessages :: [Text] -> Game -> [Message] werewolvesTurnMessages tos game-    | has (variant . noRoleKnowledge) game  =+    | has (variant . noRoleKnowledge) game          =         groupMessages tos werewolvesTurnPrivateText-    | has (variant . noRoleReveal) game     =+    | has (variant . noRoleKnowledgeOrReveal) game  =         groupMessages tos werewolvesTurnPrivateText-    | otherwise                             =+    | has (variant . noRoleReveal) game             =+        groupMessages tos werewolvesTurnPrivateText+    | otherwise                                     =         publicMessage werewolvesTurnPublicText         : groupMessages tos werewolvesTurnPrivateText @@ -313,9 +330,10 @@     where         to              = game ^?! players . witches . name         wakeUpMessages-            | has (variant . noRoleKnowledge) game  = []-            | has (variant . noRoleReveal) game     = []-            | otherwise                             = [publicMessage witchsTurnText]+            | has (variant . noRoleKnowledge) game          = []+            | has (variant . noRoleKnowledgeOrReveal) game  = []+            | has (variant . noRoleReveal) game             = []+            | otherwise                                     = [publicMessage witchsTurnText]         passMessage     = privateMessage to passText         healMessages             | game ^. healUsed  = []@@ -356,18 +374,21 @@  werewolfLynchedMessage :: Player -> Game -> Message werewolfLynchedMessage player game-    | has (variant . noRoleReveal) game = publicMessage $ NoRoleReveal.playerLynchedText player-    | otherwise                         = publicMessage $ Standard.werewolfLynchedText player+    | has (variant . noRoleKnowledgeOrReveal) game  = publicMessage $ NoRoleKnowledgeOrReveal.playerLynchedText player+    | has (variant . noRoleReveal) game             = publicMessage $ NoRoleReveal.playerLynchedText player+    | otherwise                                     = publicMessage $ Standard.werewolfLynchedText player  playerLynchedMessage :: Player -> Game -> Message playerLynchedMessage player game-    | has (variant . noRoleReveal) game = publicMessage $ NoRoleReveal.playerLynchedText player-    | otherwise                         = publicMessage $ Standard.playerLynchedText player+    | has (variant . noRoleKnowledgeOrReveal) game  = publicMessage $ NoRoleKnowledgeOrReveal.playerLynchedText player+    | has (variant . noRoleReveal) game             = publicMessage $ NoRoleReveal.playerLynchedText player+    | otherwise                                     = publicMessage $ Standard.playerLynchedText player  saintLynchedMessage :: [Player] -> Game -> Message saintLynchedMessage voters game-    | has (variant . noRoleReveal) game = publicMessage $ NoRoleReveal.saintLynchedText voters-    | otherwise                         = publicMessage $ Standard.saintLynchedText voters+    | has (variant . noRoleKnowledgeOrReveal) game  = publicMessage $ NoRoleKnowledgeOrReveal.saintLynchedText voters+    | has (variant . noRoleReveal) game             = publicMessage $ NoRoleReveal.saintLynchedText voters+    | otherwise                                     = publicMessage $ Standard.saintLynchedText voters  scapegoatLynchedMessage :: Game -> Message scapegoatLynchedMessage = publicMessage . scapegoatLynchedText@@ -380,16 +401,18 @@  playerDevouredMessage :: Player -> Game -> Message playerDevouredMessage player game-    | has (variant . noRoleReveal) game = publicMessage $ NoRoleReveal.playerDevouredText player-    | otherwise                         = publicMessage $ Standard.playerDevouredText player+    | has (variant . noRoleKnowledgeOrReveal) game  = publicMessage $ NoRoleKnowledgeOrReveal.playerDevouredText player+    | has (variant . noRoleReveal) game             = publicMessage $ NoRoleReveal.playerDevouredText player+    | otherwise                                     = publicMessage $ Standard.playerDevouredText player  playerDivinedMessage :: Text -> Player -> Message playerDivinedMessage to = privateMessage to . playerDivinedText  playerPoisonedMessage :: Player -> Game -> Message playerPoisonedMessage player game-    | has (variant . noRoleReveal) game = publicMessage $ NoRoleReveal.playerPoisonedText player-    | otherwise                         = publicMessage $ Standard.playerPoisonedText player+    | has (variant . noRoleKnowledgeOrReveal) game  = publicMessage $ NoRoleKnowledgeOrReveal.playerPoisonedText player+    | has (variant . noRoleReveal) game             = publicMessage $ NoRoleReveal.playerPoisonedText player+    | otherwise                                     = publicMessage $ Standard.playerPoisonedText player  playerSeenMessage :: Text -> Player -> Message playerSeenMessage to player@@ -399,8 +422,9 @@  playerTurnedToStoneMessage :: Player -> Game -> Message playerTurnedToStoneMessage player game-    | has (variant . noRoleReveal) game = publicMessage $ NoRoleReveal.playerTurnedToStoneText player-    | otherwise                         = publicMessage $ Standard.playerTurnedToStoneText player+    | has (variant . noRoleKnowledgeOrReveal) game  = publicMessage $ NoRoleKnowledgeOrReveal.playerTurnedToStoneText player+    | has (variant . noRoleReveal) game             = publicMessage $ NoRoleReveal.playerTurnedToStoneText player+    | otherwise                                     = publicMessage $ Standard.playerTurnedToStoneText player  villageDrunkJoinedVillageMessage :: Text -> Message villageDrunkJoinedVillageMessage to = privateMessage to villageDrunkJoinedVillageText
app/Werewolf/Options.hs view
@@ -9,6 +9,7 @@ Optparse utilities. -} +{-# LANGUAGE CPP               #-} {-# LANGUAGE OverloadedStrings #-}  module Werewolf.Options (@@ -21,6 +22,9 @@  import Control.Lens +#if MIN_VERSION_optparse_applicative(0,13,0)+import Data.Monoid+#endif import           Data.Text    (Text) import qualified Data.Text    as T import           Data.Version (showVersion)@@ -74,7 +78,11 @@ -- | The default preferences. --   Limits the help output to 100 columns. werewolfPrefs :: ParserPrefs+#if MIN_VERSION_optparse_applicative(0,13,0)+werewolfPrefs = prefs $ columns 100 <> showHelpOnEmpty+#else werewolfPrefs = prefs $ columns 100+#endif  -- | An optparse parser of a werewolf command. werewolfInfo :: ParserInfo Options
src/Game/Werewolf/Variant.hs view
@@ -22,10 +22,11 @@     -- ** Instances     allVariants, -    standardVariant, noRoleKnowledgeVariant, noRoleRevealVariant, spitefulVillageVariant,+    standardVariant, noRoleKnowledgeVariant, noRoleKnowledgeOrRevealVariant, noRoleRevealVariant,+    spitefulVillageVariant,      -- ** Traversals-    standard, noRoleKnowledge, noRoleReveal, spitefulVillage,+    standard, noRoleKnowledge, noRoleKnowledgeOrReveal, noRoleReveal, spitefulVillage, ) where  import Control.Lens@@ -53,6 +54,7 @@ allVariants =     [ standardVariant     , noRoleKnowledgeVariant+    , noRoleKnowledgeOrRevealVariant     , noRoleRevealVariant     , spitefulVillageVariant     ]@@ -71,6 +73,13 @@     , _description  = T.strip [iFile|variant/no-role-knowledge/description.txt|]     } +noRoleKnowledgeOrRevealVariant :: Variant+noRoleKnowledgeOrRevealVariant = Variant+    { _tag          = "no-role-knowledge-or-reveal"+    , _name         = T.strip [iFile|variant/no-role-knowledge-or-reveal/name.txt|]+    , _description  = T.strip [iFile|variant/no-role-knowledge-or-reveal/description.txt|]+    }+ noRoleRevealVariant :: Variant noRoleRevealVariant = Variant     { _tag          = "no-role-reveal"@@ -93,7 +102,6 @@ standard :: Traversal' Variant () standard = only standardVariant - -- | The traversal of 'noRoleKnowledge' 'Variant's. -- -- @@@ -102,6 +110,13 @@ noRoleKnowledge :: Traversal' Variant () noRoleKnowledge = only noRoleKnowledgeVariant +-- | The traversal of 'noRoleKnowledgeOrReveal' 'Variant's.+--+-- @+-- 'noRoleKnowledgeOrReveal' = 'only' 'noRoleKnowledgeOrRevealVariant'+-- @+noRoleKnowledgeOrReveal :: Traversal' Variant ()+noRoleKnowledgeOrReveal = only noRoleKnowledgeOrRevealVariant  -- | The traversal of 'noRoleReveal' 'Variant's. --@@ -110,7 +125,6 @@ -- @ noRoleReveal :: Traversal' Variant () noRoleReveal = only noRoleRevealVariant-  -- | The traversal of 'spitefulVillage' 'Variant's. --
+ variant/no-role-knowledge-or-reveal/command/choose/player-shot.txt view
@@ -0,0 +1,1 @@+#{humanise player} slumps down to the ground, hands clutching at their chest while blood slips between their fingers and pools around them.
+ variant/no-role-knowledge-or-reveal/command/ping/nocturnal-role-pinged.txt view
@@ -0,0 +1,1 @@+Waiting on the nocturnal players...
+ variant/no-role-knowledge-or-reveal/command/ping/werewolves-pinged.txt view
@@ -0,0 +1,1 @@+Waiting on the nocturnal players...
+ variant/no-role-knowledge-or-reveal/command/quit/caller-quit.txt view
@@ -0,0 +1,1 @@+#{humanise caller} has quit!
+ variant/no-role-knowledge-or-reveal/command/status/current-nocturnal-turn.txt view
@@ -0,0 +1,1 @@+It's currently night.
+ variant/no-role-knowledge-or-reveal/command/status/dead-players.txt view
@@ -0,0 +1,1 @@+The following players are dead: #{humanise $ map humanisePlayerWithRoleIfKnown (game ^..  players . traverse . dead)}.
+ variant/no-role-knowledge-or-reveal/description.txt view
@@ -0,0 +1,1 @@+Players are not informed of the roles in play at the start of a game, nor each others roles upon death. Further, nocturnal player turns are obscured.
+ variant/no-role-knowledge-or-reveal/engine/general/player-booted.txt view
@@ -0,0 +1,1 @@+#{humanise player} has been booted from the game!
+ variant/no-role-knowledge-or-reveal/engine/general/spiteful-villager-killed.txt view
@@ -0,0 +1,1 @@+Being ethereal seldom has it's benefits. Perhaps however this knowledge of the townsfolks' natures will bring you some joy in the afterlife: #{humanisePlayersWithRoles $ game ^. players}.
+ variant/no-role-knowledge-or-reveal/engine/lynching/player-lynched.txt view
@@ -0,0 +1,1 @@+#{humanise player} is tied up to a pyre and set alight. Eventually the screams start to die and nothing is left but their charred corpse.
+ variant/no-role-knowledge-or-reveal/engine/lynching/saint-lynched.txt view
@@ -0,0 +1,1 @@+Furious with the village for murdering them, God enacts revenge upon those responsible: #{humanise voters}.
+ variant/no-role-knowledge-or-reveal/engine/lynching/werewolf-lynched.txt view
@@ -0,0 +1,1 @@+#{humanise werewolf} is tied up to a pyre and set alight. Eventually the screams start to die and nothing is left but their charred corpse.
+ variant/no-role-knowledge-or-reveal/engine/new-game/roles-in-game.txt view
@@ -0,0 +1,1 @@+The roles in play have a total balance of #{T.pack $ show totalBalance}.
+ variant/no-role-knowledge-or-reveal/engine/sunrise/player-devoured.txt view
@@ -0,0 +1,1 @@+As you open them you notice a door broken down and #{humanise player}'s guts half devoured and spilling out over the cobblestones.
+ variant/no-role-knowledge-or-reveal/engine/sunrise/player-poisoned.txt view
@@ -0,0 +1,1 @@+Upon further discovery, it looks like the #{humanise witchRole} struck in the night. #{humanise player} is hanging over the side of their bed, poisoned.
+ variant/no-role-knowledge-or-reveal/engine/sunrise/player-turned-to-stone.txt view
@@ -0,0 +1,1 @@+Next to them you see a stone statue, cold to the touch. #{humanise player} must have looked into the eyes of the #{humanise medusaRole} at the very end.
+ variant/no-role-knowledge-or-reveal/name.txt view
@@ -0,0 +1,1 @@+No role knowledge or reveal
variant/no-role-knowledge/description.txt view
@@ -1,1 +1,1 @@-In "No role knowledge", players are not informed of the roles in play at the start of a game. Further, nocturnal player turns are obscured.+Players are not informed of the roles in play at the start of a game. Further, nocturnal player turns are obscured.
variant/no-role-reveal/description.txt view
@@ -1,1 +1,1 @@-In "No role reveal", players are not informed of each others roles upon death. Further, nocturnal player turns are obscured.+Players are not informed of each others roles upon death. Further, nocturnal player turns are obscured.
variant/spiteful-village/description.txt view
@@ -1,1 +1,1 @@-In "Spiteful village", the default Villager role becomes the #{humanise spitefulVillagerRole}.+The default Villager role becomes the #{humanise spitefulVillagerRole}.
variant/standard/description.txt view
@@ -1,1 +1,1 @@-The Standard variant; everything plays out as normal.+Everything plays out as normal.
werewolf.cabal view
@@ -1,5 +1,5 @@ name:           werewolf-version:        1.5.0.0+version:        1.5.1.0  author:         Henry J. Wylde maintainer:     public@hjwylde.com@@ -27,6 +27,23 @@     variant/no-role-knowledge/command/ping/werewolves-pinged.txt     variant/no-role-knowledge/command/status/current-nocturnal-turn.txt     variant/no-role-knowledge/engine/new-game/roles-in-game.txt+    variant/no-role-knowledge-or-reveal/description.txt+    variant/no-role-knowledge-or-reveal/name.txt+    variant/no-role-knowledge-or-reveal/command/choose/player-shot.txt+    variant/no-role-knowledge-or-reveal/command/ping/nocturnal-role-pinged.txt+    variant/no-role-knowledge-or-reveal/command/ping/werewolves-pinged.txt+    variant/no-role-knowledge-or-reveal/command/quit/caller-quit.txt+    variant/no-role-knowledge-or-reveal/command/status/current-nocturnal-turn.txt+    variant/no-role-knowledge-or-reveal/command/status/dead-players.txt+    variant/no-role-knowledge-or-reveal/engine/general/player-booted.txt+    variant/no-role-knowledge-or-reveal/engine/general/spiteful-villager-killed.txt+    variant/no-role-knowledge-or-reveal/engine/lynching/player-lynched.txt+    variant/no-role-knowledge-or-reveal/engine/lynching/saint-lynched.txt+    variant/no-role-knowledge-or-reveal/engine/lynching/werewolf-lynched.txt+    variant/no-role-knowledge-or-reveal/engine/new-game/roles-in-game.txt+    variant/no-role-knowledge-or-reveal/engine/sunrise/player-devoured.txt+    variant/no-role-knowledge-or-reveal/engine/sunrise/player-poisoned.txt+    variant/no-role-knowledge-or-reveal/engine/sunrise/player-turned-to-stone.txt     variant/no-role-reveal/description.txt     variant/no-role-reveal/name.txt     variant/no-role-reveal/command/choose/player-shot.txt@@ -339,7 +356,7 @@         lens >= 4.12 && < 4.15,         MonadRandom == 0.4.*,         mtl == 2.2.*,-        optparse-applicative >= 0.11 && < 0.13,+        optparse-applicative >= 0.11 && < 0.14,         random-shuffle,         text == 1.2.*,         transformers >= 0.4 && < 0.6,