module Game.Werewolf.Internal.Role (
Role, name, allegiance, balance, description, advice,
Allegiance(..),
allRoles, restrictedRoles,
allAllegiances,
wildChildRole, wolfHoundRole,
angelRole,
bearTamerRole, defenderRole, scapegoatRole, seerRole, simpleVillagerRole, villageIdiotRole,
villagerVillagerRole, witchRole,
simpleWerewolfRole,
) where
import Control.Lens
import Data.Function
import Data.List
import Data.Text (Text)
import qualified Data.Text as T
import Prelude hiding (all)
data Role = Role
{ _name :: Text
, _allegiance :: Allegiance
, _balance :: Int
, _description :: Text
, _advice :: Text
} deriving (Read, Show)
data Allegiance = Angel | Villagers | Werewolves
deriving (Eq, Read, Show)
makeLenses ''Role
instance Eq Role where
(==) = (==) `on` view name
allRoles :: [Role]
allRoles =
[ angelRole
, bearTamerRole
, defenderRole
, scapegoatRole
, seerRole
, simpleVillagerRole
, villageIdiotRole
, simpleWerewolfRole
, villagerVillagerRole
, wildChildRole
, witchRole
, wolfHoundRole
]
restrictedRoles :: [Role]
restrictedRoles = allRoles \\ [simpleVillagerRole, simpleWerewolfRole]
allAllegiances :: [Allegiance]
allAllegiances = [Angel, Villagers, Werewolves]
wildChildRole :: Role
wildChildRole = Role
{ _name = "Wild-child"
, _allegiance = Villagers
, _balance = 1
, _description = T.unwords
[ "Abandoned in the woods by his parents at a young age, he was raised by wolves."
, "As soon as he learned how to walk on all fours,"
, "the Wild-child began to wander around Miller's Hollow."
, "One day, fascinated by an inhabitant of the village who was walking upright"
, "with grace and presence, he made them his secret role model."
, "He then decided to integrate himself into the community of Miller's Hollow and entered,"
, "worried, in the village."
, "The community was moved by his frailty, adopted him, and welcomed him in their fold."
, "What will become of him: honest Villager or terrible Werewolf?"
, "For all of his life,"
, "the heart of the Wild-child will swing between these two alternatives."
, "May his model confirm him in his newfound humanity."
]
, _advice = T.unwords
[ "Nothing is keeping you from taking part in the elimination of your role model,"
, "if you so wish..."
]
}
wolfHoundRole :: Role
wolfHoundRole = Role
{ _name = "Wolf-hound"
, _allegiance = Villagers
, _balance = 1
, _description = T.unwords
[ "All dogs know in the depths of their soul that their ancestors were wolves"
, "and that it's mankind who has kept them in the state of childishness and fear,"
, "the faithful and generous companions."
, "In any case, only the Wolf-hound can decide if he'll obey his human and civilized master"
, "or if he'll listen to the call of wild nature buried within him."
]
, _advice =
"The choice of being a Simple Villager or Werewolf is final, so decide carefully!"
}
angelRole :: Role
angelRole = Role
{ _name = "Angel"
, _allegiance = Angel
, _balance = 0
, _description = T.unwords
[ "The muddy life of a village infested with evil creatures repulses him;"
, "he wishes to believe he's the victim of a terrible nightmare,"
, "in order to finally wake up in his comfortable bed."
]
, _advice = T.unwords
[ "It's going to take all your guile and wits to con the village into eliminating you."
, "Pretending to be a Werewolf is one tactic, but if it doesn't work then you may have just"
, "dug yourself a hole for the rest of the game..."
]
}
bearTamerRole :: Role
bearTamerRole = Role
{ _name = "Bear Tamer"
, _allegiance = Villagers
, _balance = 2
, _description = T.unwords
[ "Ah! How sweet it is, in my memory, the sound of chains slipping onto the cobblestones"
, "of the \"Three Road\" plaza, accompanied by the grunting of Ursus."
, "Ah! How long ago it was that Titan, the Bear Tamer, would lead his companion in a ballet"
, "so gravious that we'd cry every summer in Miller's Hollow."
, "Ursus even had the oh-so-previous ability to detect lycanthropes hidden near him."
]
, _advice =
"Aren't you lucky to have a companion with a strong nose. Just don't let him wander off!"
}
defenderRole :: Role
defenderRole = Role
{ _name = "Defender"
, _allegiance = Villagers
, _balance = 2
, _description =
"This character can save the Villagers from the bite of the Werewolves."
, _advice = T.unwords
[ "Be careful: you can protect yourself,"
, "but you're not allowed to protect the same player two nights in a row."
]
}
scapegoatRole :: Role
scapegoatRole = Role
{ _name = "Scapegoat"
, _allegiance = Villagers
, _balance = 1
, _description = T.unwords
[ "It's sad to say, but in Miller's Hollow, when something doesn't go right"
, "it's always him who unjustly suffers the consequences."
]
, _advice = T.unwords
[ "Cross your fingers that the votes don't end up tied."
, "If you do so happen to be that unlucky,"
, "then be wary of whom you allow to vote on the next day."
, "If you choose only one player and the Werewolves devour them in the night,"
, "then there will be no village vote."
]
}
seerRole :: Role
seerRole = Role
{ _name = "Seer"
, _allegiance = Villagers
, _balance = 2
, _description = T.unwords
[ "A fortunate teller by other names, with the ability to see into fellow"
, "townsfolk and determine their allegiance."
]
, _advice = T.unwords
[ "You should help the other Villagers,"
, "but try to remain discreet so as to not arouse suspicion from any of the Werewolves."
]
}
simpleVillagerRole :: Role
simpleVillagerRole = Role
{ _name = "Simple Villager"
, _allegiance = Villagers
, _balance = 1
, _description = T.unwords
[ "A simple, ordinary townsperson in every way."
, "Their only weapons are the ability to analyze behaviour to identify Werewolves,"
, "and the strength of their conviction to prevent"
, "the execution of the innocents like themselves."
]
, _advice =
"Bluffing can be a good technique, but you had better be convincing about what you say."
}
villageIdiotRole :: Role
villageIdiotRole = Role
{ _name = "Village Idiot"
, _allegiance = Villagers
, _balance = 0
, _description = T.unwords
[ "What is a village without an idiot?"
, "He does pretty much nothing important,"
, "but he's so charming that no one would want to hurt him."
]
, _advice =
"Hah! As if advice would do you any good..."
}
villagerVillagerRole :: Role
villagerVillagerRole = Role
{ _name = "Villager-Villager"
, _allegiance = Villagers
, _balance = 2
, _description = T.unwords
[ "This person has a soul as clear and transparent as the water from a mountain stream."
, "They will deserve the attentive ear of their peers"
, "and will make their word decisive in crucial moments."
]
, _advice = "You'll make friends quickly, but be wary about whom you trust."
}
witchRole :: Role
witchRole = Role
{ _name = "Witch"
, _allegiance = Villagers
, _balance = 3
, _description = T.unwords
[ "She knows how to brew two extremely powerful potions:"
, "a healing potion, to resurrect the player devoured by the Werewolves,"
, "and a poison potion, used at night to eliminate a player."
]
, _advice = T.unwords
[ "Each potion may only be used once per game,"
, "but there are no restrictions on using both of your potions in the same night."
]
}
simpleWerewolfRole :: Role
simpleWerewolfRole = Role
{ _name = "Simple Werewolf"
, _allegiance = Werewolves
, _balance = 4
, _description = T.unwords
[ "Each night they devour a Villager."
, "During the day they try to hide their nocturnal identity to avoid mob justice."
]
, _advice =
"Voting to lynch your partner can be a good way to deflect suspicion from yourself."
}