werewolf-0.4.3.2: app/Werewolf/Commands/Help.hs
{-|
Module : Werewolf.Commands.Help
Description : Options and handler for the help subcommand.
Copyright : (c) Henry J. Wylde, 2015
License : BSD3
Maintainer : public@hjwylde.com
Options and handler for the help subcommand.
-}
{-# LANGUAGE OverloadedStrings #-}
module Werewolf.Commands.Help (
-- * Options
Options(..), Command(..),
-- * Handle
handle,
) where
import Control.Lens
import Control.Monad.IO.Class
import Data.Text (Text)
import qualified Data.Text as T
import Game.Werewolf.Response
import Game.Werewolf.Role as Role
-- | Options.
data Options = Options
{ argCommand :: Maybe Command
} deriving (Eq, Show)
-- | Command.
data Command = Commands | Description | Rules | Roles
deriving (Eq, Show)
-- | Handle.
handle :: MonadIO m => Text -> Options -> m ()
handle callerName (Options (Just Commands)) = exitWith success
{ messages = map (privateMessage callerName) commandsMessages
}
handle callerName (Options (Just Description)) = exitWith success
{ messages = map (privateMessage callerName) descriptionMessages
}
handle callerName (Options (Just Roles)) = exitWith success
{ messages = map (\role -> privateMessage callerName $ T.intercalate "\n"
[ T.snoc (role ^. Role.name) ':'
, role ^. description
, role ^. advice
]) allRoles
}
handle callerName (Options (Just Rules)) = exitWith success
{ messages = map (privateMessage callerName) rulesMessages
}
handle callerName (Options Nothing) = exitWith success
{ messages = map (privateMessage callerName) helpMessages
}
commandsMessages :: [Text]
commandsMessages =
[ "end - ends the current game."
, "heal - heal a devoured player."
, "pass - pass on healing or poisoning a player."
, "ping - pings the status of the current game publicly."
, "poison PLAYER - poison a player."
, "protect PLAYER - protect a player."
, "quit - quit the current game."
, "see PLAYER - see a player's allegiance."
, "start [--extra-roles ROLE,...] PLAYER... - starts a new game with the given players and extra roles. A game requires at least 7 players."
, "status - gets the status of the current game."
, "vote PLAYER - vote against a player."
]
descriptionMessages :: [Text]
descriptionMessages = map (T.intercalate "\n")
[ [ T.unwords
[ "Deep in the American countryside,"
, "the little town of Millers Hollow has recently been infiltrated by Werewolves."
]
, T.unwords
[ "Each night, murders are committed by the Villagers,"
, "who due to some mysterious phenomenon (possibly the greenhouse effect)"
, "have become Werewolves."
]
, T.unwords
[ "It is now time to take control and eliminate this ancient evil,"
, "before the town loses its last few inhabitants."
]
]
, [ "Objective of the Game:"
, "For the Villagers: lynch all of the Werewolves."
, "For the Werewolves: devour all of the Villagers."
]
]
rulesMessages :: [Text]
rulesMessages = map (T.intercalate "\n")
[ [ T.unwords
[ "Each night, the Werewolves bite, kill and devour one Villager."
, "During the day they try to conceal their identity and vile deeds from the Villagers."
, "The number of Werewolves in play depends upon"
, " the number of players and variants used in the game."
]
, T.unwords
[ "Each day,"
, "the survivors gather in the town square and try to discover who the Werewolves are."
, "This is done by studying the other player's social behaviours"
, "for hidden signs of lycanthropy."
, "After discussing and debating, the village votes to lynch a suspect,"
, "who is then hanged, burned and eliminated from the game."
]
]
, [ T.unwords
[ "Each player is informed of their role (see `help roles' for a list)"
, "at the start of the game. A game begins at night and follows a standard cycle."
]
, "1. The village falls asleep."
, "2. The Defender wakes up and protects someone."
, "3. The Seer wakes up and sees someone's allegiance."
, "4. The Werewolves wake up and select a victim."
, "5. The Witch wakes up and may heal the victim and/or poison someone."
, "6. The village wakes up and find the victim."
, "7. The village votes to lynch a suspect."
, "The game is over when only Villagers or Werewolves are left alive."
]
]
helpMessages :: [Text]
helpMessages =
[ "help commands - print the in-game commands."
, "help description - print the game description."
, "help roles - print the roles and their description."
, "help rules - print the game rules."
]