move irc messages to json and allow overriding in custom file
This commit is contained in:
parent
346af23a5d
commit
a4e21aa997
1
.gitignore
vendored
1
.gitignore
vendored
@ -11,6 +11,7 @@ __pycache__/
|
||||
# Config files
|
||||
botconfig.py
|
||||
/gamemodes.py
|
||||
/messages.json
|
||||
|
||||
# Database files
|
||||
*.sqlite3
|
||||
|
@ -1,8 +1,9 @@
|
||||
# To add new game modes, rename this file to 'gamemodes.py' then add them in
|
||||
# Basic frame for the game modes in src/gamemodes.py
|
||||
|
||||
# *** DO NOT TOUCH ANY OF THE CODE BETWEEN THE LINES 4 AND 16 ***
|
||||
# *** DO NOT TOUCH ANY OF THE CODE BETWEEN THE LINES 4 AND 17 ***
|
||||
|
||||
from src.messages import messages
|
||||
import src.settings as var
|
||||
|
||||
from src.gamemodes import (
|
||||
|
10
messages.json.example
Normal file
10
messages.json.example
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"ping": [
|
||||
"Why would you DO such a thing!?",
|
||||
"That was fun. Do it again."
|
||||
],
|
||||
"goat_actions": [
|
||||
"licks",
|
||||
"stares coldly at"
|
||||
]
|
||||
}
|
748
messages/en.json
Normal file
748
messages/en.json
Normal file
@ -0,0 +1,748 @@
|
||||
{
|
||||
"no_victims": [
|
||||
"The body of a young penguin pet is found.",
|
||||
"Paw prints are found circling around the village.",
|
||||
"A pool of blood and wolf paw prints are found.",
|
||||
"The body of a slain cat is found.",
|
||||
"Some house doors have been opened, but nothing has changed.",
|
||||
"A scent much like that of a wolf permeates the air.",
|
||||
"Half-buried wolf droppings are found.",
|
||||
"Traces of wolf fur are found."
|
||||
],
|
||||
"ping": [
|
||||
"Pong!",
|
||||
"Ping!",
|
||||
"Sure thing.",
|
||||
"No.",
|
||||
"!gniP",
|
||||
"!gnoP",
|
||||
"Segmentation fault",
|
||||
"Segmentation fault (core dumped)",
|
||||
"{bot_nick}.exe has stopped working. Windows is checking for a solution to the problem...",
|
||||
"HTTP Error 418: I'm a teapot",
|
||||
"An error has pinged and has been ponged.",
|
||||
"I'm here!",
|
||||
"I refuse!",
|
||||
"What?",
|
||||
"Don't you mean \u0002{cmd_char}ping\u0002?",
|
||||
"skynet.exe has stopped working. Windows is checking for a solution to the problem...",
|
||||
"No ping received for 1337 seconds.",
|
||||
"Congratulations! You're the 1337th person to use {cmd_char}ping. You win a goat!",
|
||||
"PING! {nick}",
|
||||
"I'm sorry Dave, I'm afraid I can't do that.",
|
||||
"Give me a ping, Vasily. One ping only, please."
|
||||
],
|
||||
"lynch_reveal": [
|
||||
"The villagers, after much debate, finally decide on lynching \u0002{0}\u0002, who turned out to be... a{1} \u0002{2}\u0002.",
|
||||
"After a prolonged struggle, \u0002{0}\u0002 is forced to the gallows, and is discovered after death to be a{1} \u0002{2}\u0002.",
|
||||
"The villagers choose to hang \u0002{0}\u0002; however, the rope stretches and breaks, and the ensuing fall kills the \u0002{2}\u0002.",
|
||||
"The villagers, heavy with the pain of death, reluctantly lynch \u0002{0}\u0002, a{1} \u0002{2}\u0002.",
|
||||
"Compliant with the will of the village, the gallows prove effective in killing \u0002{0}\u0002, a{1} \u0002{2}\u0002.",
|
||||
"Galvanized by fear, the mob puts \u0002{0}\u0002 to death. After inspection, they find that they have killed a{1} \u0002{2}\u0002.",
|
||||
"In a fit of hysteria, the villagers lynch \u0002{0}\u0002, killing a{1} \u0002{2}\u0002.",
|
||||
"Believing their fellow neighbor and friend to be dangerous, the mob puts \u0002{0}\u0002, a{1} \u0002{2}\u0002, to death.",
|
||||
"Under a lot of noise, the pitchfork-bearing villagers lynch \u0002{0}\u0002, who turned out to be... a{1} \u0002{2}\u0002.",
|
||||
"Despite protests, the mob drags their victim to the hanging tree. \u0002{0}\u0002 succumbs to the will of the horde, and is hanged. The villagers have killed a{1} \u0002{2}\u0002.",
|
||||
"Resigned to the inevitable, \u0002{0}\u0002 is led to the gallows. Once the twitching stops, it is discovered that the village lynched a{1} \u0002{2}\u0002.",
|
||||
"Before the rope is pulled, \u0002{0}\u0002, a{1} \u0002{2}\u0002, pulls the pin on a grenade. They hesitate, and it explodes, killing them.",
|
||||
"Before the rope is pulled, \u0002{0}\u0002, a{1} \u0002{2}\u0002, throws a grenade at the mob. The grenade explodes early."
|
||||
],
|
||||
"lynch_no_reveal": [
|
||||
"The villagers, after much debate, finally decide on lynching \u0002{0}\u0002.",
|
||||
"After a prolonged struggle, \u0002{0}\u0002 is forced to the gallows.",
|
||||
"The villagers choose to hang \u0002{0}\u0002; however, the rope stretches and breaks, and the ensuing fall kills them.",
|
||||
"The villagers, heavy with the pain of death, reluctantly lynch \u0002{0}\u0002.",
|
||||
"Compliant with the will of the village, the gallows prove effective in killing \u0002{0}\u0002.",
|
||||
"Galvanized by fear, the mob puts \u0002{0}\u0002 to death.",
|
||||
"In a fit of hysteria, the villagers lynch \u0002{0}\u0002.",
|
||||
"Believing their fellow neighbor and friend to be dangerous, the mob puts \u0002{0}\u0002 to death.",
|
||||
"Under a lot of noise, the pitchfork-bearing villagers lynch \u0002{0}\u0002.",
|
||||
"Despite protests, the mob drags their victim to the hanging tree. \u0002{0}\u0002 succumbs to the will of the horde, and is hanged.",
|
||||
"Resigned to the inevitable, \u0002{0}\u0002 is led to the gallows.",
|
||||
"Before the rope is pulled, \u0002{0}\u0002 pulls the pin on a grenade. They hesitate, and it explodes, killing them.",
|
||||
"Before the rope is pulled, \u0002{0}\u0002 throws a grenade at the mob. The grenade explodes early."
|
||||
],
|
||||
"quit_reveal": [
|
||||
"\u0002{0}\u0002, a{1} \u0002{2}\u0002, suddenly falls over dead before the astonished villagers.",
|
||||
"While wearing a fake pair of antlers, \u0002{0}\u0002, a{1} \u0002{2}\u0002, is shot dead by a hunter.",
|
||||
"Standing under a tree, \u0002{0}\u0002, a{1} \u0002{2}\u0002, is killed by a falling branch.",
|
||||
"\u0002{0}\u0002, a{1} \u0002{2}\u0002, is killed by lightning before the villagers' eyes. The air smells of burnt flesh.",
|
||||
"Rampaging through the village, a bull gores \u0002{0}\u0002, a{1} \u0002{2}\u0002.",
|
||||
"\u0002{0}\u0002, a{1} \u0002{2}\u0002, falls into a vat of molasses and drowns.",
|
||||
"A pack of wild animals sets upon \u0002{0}\u0002. Soon the \u0002{2}\u0002 is only a pile of bones and a lump in the beasts' stomachs.",
|
||||
"\u0002{0}\u0002, a{1} \u0002{2}\u0002, fell off the roof of their house and is now dead.",
|
||||
"\u0002{0}\u0002 is crushed to death by a falling tree. The villagers desperately try to save the \u0002{2}\u0002, but it is too late.",
|
||||
"\u0002{0}\u0002 suddenly bursts into flames and is now all but a memory. The survivors bury the \u0002{2}\u0002's ashes."
|
||||
],
|
||||
"quit_no_reveal": [
|
||||
"\u0002{0}\u0002 suddenly falls over dead before the astonished villagers.",
|
||||
"While wearing a fake pair of antlers, \u0002{0}\u0002 is shot dead by a hunter.",
|
||||
"Standing under a tree, \u0002{0}\u0002 is killed by a falling branch.",
|
||||
"\u0002{0}\u0002 is killed by lightning before the villagers' eyes. The air smells of burnt flesh.",
|
||||
"Rampaging through the village, a bull gores \u0002{0}\u0002.",
|
||||
"\u0002{0}\u0002 falls into a vat of molasses and drowns.",
|
||||
"A pack of wild animals sets upon \u0002{0}\u0002. Soon they are only a pile of bones and a lump in the beasts' stomachs.",
|
||||
"\u0002{0}\u0002 fell off the roof of their house and is now dead.",
|
||||
"\u0002{0}\u0002 is crushed to death by a falling tree. The villagers desperately try to save them, but it is too late.",
|
||||
"\u0002{0}\u0002 suddenly bursts into flames and is now all but a memory."
|
||||
],
|
||||
"fool_win": "Game over! The fool has been lynched, causing them to win.",
|
||||
"no_win": "Game over! There are no players remaining. Nobody wins.",
|
||||
"piper_win": "Game over! Everyone has fallen victim to the charms of the piper{0}. The piper{0} lead{1} the villagers away from the village, never to return...",
|
||||
"monster_win": "Game over! All the wolves are dead! As the villagers start preparing the BBQ, the monster{0} quickly kill{1} the remaining villagers, causing the monster{0} to win.",
|
||||
"monster_wolf_win": "Game over! There are the same number of wolves as uninjured villagers. The wolves overpower the villagers but then get destroyed by the monster{0}, causing the monster{0} to win.",
|
||||
"villager_win": "Game over! All the wolves are dead! The villagers chop them up, BBQ them, and have a hearty meal.",
|
||||
"wolf_win": "Game over! There are the same number of wolves as uninjured villagers. The wolves overpower the villagers and win.",
|
||||
"new_game": "\u0002{0}\u0002 has started a game of Werewolf. Type \"{1}join\" to join. Type \"{1}start\" to vote to start the game. Type \"{1}wait\" to increase the start wait time.",
|
||||
"stasis": "Sorry, but {0} in stasis for {1} game{2}.",
|
||||
"not_playing": "\u0002{0}\u0002 is not currently playing.",
|
||||
"invalid_mode": "\u0002{0}\u0002 is not a valid mode. Valid modes are: {1}",
|
||||
"simple_off": "You now no longer receive simple role instructions.",
|
||||
"simple_on": "You now receive simple role instructions.",
|
||||
"not_logged_in": "You are not logged in to NickServ.",
|
||||
"notice_off": "Gameplay interactions will now use PRIVMSG for you.",
|
||||
"notice_on": "The bot will now always NOTICE you.",
|
||||
"invalid_channel": "You need to be in {0} to use that command.",
|
||||
"swap_privmsg": "More than one player is logged in to your account. Use 'swap <nick>' to swap.",
|
||||
"swap_notice": "More than one player is logged in to your account. Use '{0}swap <nick>' to swap.",
|
||||
"account_not_playing": "You do not appear to be playing. Make sure you are identified to the same account.",
|
||||
"target_not_playing": "That person is no{0} playing.",
|
||||
"target_not_logged_in": "That person is not logged in to NickServ.",
|
||||
"player_swap": "\u0002{0}\u0002 has swapped places with \u0002{1}\u0002.",
|
||||
"get_pingif": "You will be pinged when there are at least {0} players joined.",
|
||||
"no_pingif": "You do not have any ping preferences currently set.",
|
||||
"unset_pingif": "Your ping preferences have been removed (was {0}).",
|
||||
"pingif_too_large": "That number is too large.",
|
||||
"pingif_already_set": "Your ping preferences are already set to {0}.",
|
||||
"pingif_change": "Your ping preferences have been changed from {0} to {1}.",
|
||||
"set_pingif": "Your ping preferences have been set to {0}.",
|
||||
"pingif_invalid": "Invalid parameter. Please enter a non-negative integer or a valid preference.",
|
||||
"ping_player": "PING! {0} player{1}! ",
|
||||
"vote_game_mode": "\u0002{0}\u0002 votes for the \u0002{1}\u0002 game mode.",
|
||||
"bot_not_opped": "Sorry, I'm not opped in {0}.",
|
||||
"already_playing": "{0}'re already playing!",
|
||||
"too_many_players": "Too many players! Try again next time.",
|
||||
"game_already_running": "Sorry, but the game is already running. Try again next time.",
|
||||
"account_already_joined": "Sorry, but \u0002{0}\u0002 is already joined under {1} account.{2}",
|
||||
"player_joined": "\u0002{0}\u0002 has joined the game and raised the number of players to \u0002{1}\u0002.",
|
||||
"game_idle_cancel": "The current game took too long to start and has been canceled. If you are still active, please join again to start a new game.",
|
||||
"too_many_players_to_join": "{0}: Too many players to join.",
|
||||
"fjoin_in_chan": ": You may only fjoin people who are in this channel.",
|
||||
"account_not_logged_in": "{0} is not logged in to NickServ.",
|
||||
"not_allowed": "No, that won't be allowed.",
|
||||
"fjoin_success": "\u0002{0}\u0002 used fjoin and raised the number of players to \u0002{1}\u0002.",
|
||||
"fquit_success": "\u0002{0}\u0002 is forcing \u0002{1}\u0002 to leave.",
|
||||
"fquit_goodbye": " Say goodbye to the \u0002{0}\u0002.",
|
||||
"no_players_remaining": " No more players remaining.",
|
||||
"new_player_count": " New player count: \u0002{0}\u0002",
|
||||
"fstart_success": "\u0002{0}\u0002 has forced the game to start.",
|
||||
"account_reidentify": "Please reidentify to the account \u0002{0}\u0002",
|
||||
"account_midgame_change": "Please do not change accounts midgame",
|
||||
"player_return": "\u0002{0}\u0002 has returned to the village.",
|
||||
"command_ratelimited": "This command is rate-limited. Please wait a while before using it again.",
|
||||
"stats": "{0}It is currently {4}. There {3} {1}, and {2}.",
|
||||
"daylight_warning": "\u0002As the sun sinks inexorably toward the horizon, turning the lanky pine trees into fire-edged silhouettes, the villagers are reminded that very little time remains for them to reach a decision; if darkness falls before they have done so, the majority will win the vote. No one will be lynched if there are no votes or an even split.\u0002",
|
||||
"sunset": "As the sun sets, the villagers agree to retire to their beds and wait for morning.",
|
||||
"twilight_warning": "\u0002A few villagers awake early and notice it is still dark outside. The night is almost over and there are still whispers heard in the village.\u0002",
|
||||
"sunrise": "Night lasted \u0002{0:0>2}:{1:0>2}\u0002. It is now daytime. The villagers awake, thankful for surviving the night, and search the village... ",
|
||||
"not_daytime": "It is not daytime.",
|
||||
"not_nighttime": "It is not nighttime.",
|
||||
"player_meek_abstain": "\u0002{0}\u0002 meekly votes not to lynch anyone today.",
|
||||
"village_abstain": "The villagers have agreed not to lynch anybody today.",
|
||||
"impatient_vote": "\u0002{0}\u0002 impatiently votes for \u0002{1}\u0002.",
|
||||
"mayor_reveal": "While being dragged to the gallows, \u0002{0}\u0002 reveals that they are the \u0002mayor\u0002. The village agrees to let them live for now.",
|
||||
"totem_amnesia_clear": "Your totem clears your amnesia and you now fully remember who you are!",
|
||||
"totem_reveal": "Before the rope is pulled, \u0002{0}\u0002's totem emits a brilliant flash of light. When the villagers are able to see again, they discover that {0} has escaped! The left-behind totem seems to have taken on the shape of a{1} \u0002{2}\u0002.",
|
||||
"totem_desperation": "As the noose is being fitted, \u0002{0}\u0002's totem emits a brilliant flash of light. When the villagers are able to see again, they discover that \u0002{1}\u0002, a{2} \u0002{3}\u0002, has fallen over dead.",
|
||||
"totem_desperation_no_reveal": "As the noose is being fitted, \u0002{0}\u0002's totem emits a brilliant flash of light. When the villagers are able to see again, they discover that \u0002{1}\u0002 has fallen over dead.",
|
||||
"majority_votes": "{0}Votes needed for a majority: {1}",
|
||||
"voting_daytime_only": "Voting is only during the day.",
|
||||
"no_votes": "No votes yet.",
|
||||
"vote_stats": "{0}\u0002{1}\u0002 players, \u0002{2}\u0002 votes required to lynch, \u0002{3}\u0002 players available to vote.",
|
||||
"vote_stats_abstain": " \u0002{0}\u0002 player{1} refrained from voting.",
|
||||
"cub_grow_up": "You have grown up into a wolf and vowed to take revenge for your dead parents!",
|
||||
"traitor_turn": "HOOOOOOOOOWL. You have become... a wolf!\nIt is up to you to avenge your fallen leaders!",
|
||||
"traitor_turn_channel": "\u0002The villagers, during their celebrations, are frightened as they hear a loud howl. The wolves are not gone!\u0002",
|
||||
"role_attribution_failed": "The role attribution failed 3 times. Game was canceled.",
|
||||
"endgame_stats": "Game lasted \u0002{0:0>2}:{1:0>2}\u0002. \u0002{2:0>2}:{3:0>2}\u0002 was day. \u0002{4:0>2}:{5:0>2}\u0002 was night. ",
|
||||
"single_winner": "The winner is \u0002{0}\u0002.",
|
||||
"two_winners": "The winners are \u0002{0}\u0002 and \u0002{1}\u0002.",
|
||||
"many_winners": "The winners are {0}, and \u0002{1}\u0002.",
|
||||
"clone_turn": "You are now a{0} \u0002{1}\u0002.",
|
||||
"forever_aclone": "It appears that \u0002{0}\u0002 was cloning you, so you are now stuck as a clone forever. How sad.",
|
||||
"clone_success": "You will now be cloning \u0002{0}\u0002 if they die.",
|
||||
"clone_wolf": "\u0002{0}\u0002 cloned \u0002{1}\u0002 and has now become a wolf!",
|
||||
"no_other_wolves": "There are no other wolves",
|
||||
"lover_suicide": "Saddened by the loss of their lover, \u0002{0}\u0002, a{1} \u0002{2}\u0002, commits suicide.",
|
||||
"lover_suicide_no_reveal": "Saddened by the loss of their lover, \u0002{0}\u0002 commits suicide.",
|
||||
"assassin_fail_totem": "Before dying, \u0002{0}\u0002 quickly attempts to slit \u0002{1}\u0002's throat; however, {1}'s totem emits a brilliant flash of light, causing the attempt to miss.",
|
||||
"assassin_fail_angel": "Before dying, \u0002{0}\u0002 quickly attempts to slit \u0002{1}\u0002's throat; however, a guardian angel was on duty and able to foil the attempt.",
|
||||
"assassin_fail_bodyguard": "Before dying, \u0002{0}\u0002 quickly attempts to slit \u0002{1}\u0002's throat; however, \u0002{2}\u0002, a bodyguard, sacrificed their life to protect them.",
|
||||
"assassin_success": "Before dying, \u0002{0}\u0002 quickly slits \u0002{1}\u0002's throat. The village mourns the loss of a{2} \u0002{3}\u0002.",
|
||||
"assassin_success_no_reveal": "Before dying, \u0002{0}\u0002 quickly slits \u0002{1}\u0002's throat.",
|
||||
"time_lord_dead": "Tick tock! Since the time lord has died, day will now only last {0} seconds and night will now only last {1} seconds!",
|
||||
"vengeful_turn": "OOOooooOOOOooo! You are the \u0002vengeful ghost\u0002. It is now your job to exact your revenge on the \u0002{0}\u0002 that killed you.",
|
||||
"bitten": "Upon gazing at {0}'s lifeless body, you feel a sharp pang of regret and vengeance. You quickly look away and the feelings subside...",
|
||||
"mad_scientist_kill": "\u0002{0}\u0002 throws a potent chemical concoction into the crowd. \u0002{1}\u0002, a{2} \u0002{3}\u0002, and \u0002{4}\u0002, a{5} \u0002{6}\u0002, get hit by the chemicals and die.",
|
||||
"mad_scientist_kill_no_reveal": "\u0002{0}\u0002 throws a potent chemical concoction into the crowd. \u0002{1}\u0002 and \u0002{2}\u0002 get hit by the chemicals and die.",
|
||||
"mad_scientist_kill_single": "\u0002{0}\u0002 throws a potent chemical concoction into the crowd. \u0002{1}\u0002, a{2} \u0002{3}\u0002, gets hit by the chemicals and dies.",
|
||||
"mad_scientist_kill_single_no_reveal": "\u0002{0}\u0002 throws a potent chemical concoction into the crowd. \u0002{1}\u0002 gets hit by the chemicals and dies.",
|
||||
"mad_scientist_fail": "\u0002{0}\u0002 throws a potent chemical concoction into the crowd. Thankfully, nobody seems to have gotten hit.",
|
||||
"hunter_discard": "Your target has died, so you may now pick a new one.",
|
||||
"idle_death": "\u0002{0}\u0002 didn't get out of bed for a very long time and has been found dead. The survivors bury the \u0002{1}\u0002's body.",
|
||||
"idle_death_no_reveal": "\u0002{0}\u0002 didn't get out of bed for a very long time and has been found dead.",
|
||||
"channel_idle_warning": "{0}: \u0002You have been idling for a while. Please say something soon or you might be declared dead.\u0002",
|
||||
"player_idle_warning": "\u0002You have been idling in {0} for a while. Please say something in {0} or you will be declared dead.\u0002",
|
||||
"quit_death": "\u0002{0}\u0002 was mauled by wild animals and has died. It seems that \u0002{1}\u0002 meat is tasty.",
|
||||
"quit_death_no_reveal": "\u0002{0}\u0002 was mauled by wild animals and has died.",
|
||||
"part_death": "\u0002{0}\u0002, a \u0002{1}\u0002, ate some poisonous berries and has died.",
|
||||
"part_death_no_reveal": "\u0002{0}\u0002 ate some poisonous berries and has died.",
|
||||
"account_death": "\u0002{0}\u0002 has died of a heart attack. The villagers couldn't save the \u0002{1}\u0002.",
|
||||
"account_death_2": "\u0002{0}\u0002 fell into a river and was swept away. The villagers couldn't save the \u0002{1}\u0002.",
|
||||
"account_death_no_reveal": "\u0002{0}\u0002 has died of a heart attack.",
|
||||
"account_death_no_reveal_2": "\u0002{0}\u0002 fell into a river and was swept away.",
|
||||
"kick_bold": "{0} {1} :Using bold is not allowed",
|
||||
"notice_no_bold": "Using bold in the channel is not allowed.",
|
||||
"kick_color": "{0} {1} :Using color is not allowed",
|
||||
"notice_no_color": "Using color in the channel is not allowed.",
|
||||
"goat_fail": "This can only be done once per day.",
|
||||
"not_enough_parameters": "Not enough parameters.",
|
||||
"goat_target_not_in_channel": "\u0002{0}\u0002 is not in this channel.",
|
||||
"goat_actions": [
|
||||
"kicks",
|
||||
"headbutts"
|
||||
],
|
||||
"goat_success": "\u0002{0}\u0002's goat walks by and {1} \u0002{2}\u0002.",
|
||||
"player_missing": "\u0002{0}\u0002 has gone missing.",
|
||||
"leave_death": "\u0002{0}\u0002 died due to falling off a cliff. The \u0002{1}\u0002 is lost to the ravine forever.",
|
||||
"leave_death_no_reveal": "\u0002{0}\u0002 died due to falling off a cliff.",
|
||||
"quit_new_game": "The game already started! If you still want to quit, try again in {0} second{1}.",
|
||||
"static_quit": "\u0002{0}\u0002, a \u0002{1}\u0002, has died of an unknown disease.",
|
||||
"static_quit_no_reveal": "\u0002{0}\u0002 has died of an unknown disease.",
|
||||
"villagers_lynch": "The villagers must now vote for whom to lynch. Use \"{0}lynch <nick>\" to cast your vote. {1} votes are required to lynch.",
|
||||
"random_totem_prefix": "Because you forgot to give out your totem at night, you",
|
||||
"random_clone": "Because you forgot to select someone to clone at night, you are now cloning \u0002{0}\u0002.",
|
||||
"random_matchmaker": "Because you forgot to choose lovers at night, two lovers have been selected for you.",
|
||||
"totem_retarget": "It seems that \u0002{0}\u0002 now has the totem you gave out last night.",
|
||||
"charmed": "You hear the sweet tones of a flute coming from outside your window... You inexorably walk outside and find yourself in the village square. ",
|
||||
"no_charmed_players": "There are no other charmed players.",
|
||||
"one_charmed_player": "You find out that \u0002{0}\u0002 is also charmed!",
|
||||
"two_charmed_players": "You find out that \u0002{0}\u0002 and \u0002{1}\u0002 are also charmed!",
|
||||
"many_charmed_players": "You find out that \u0002{0}\u0002, and \u0002{1}\u0002 are also charmed!",
|
||||
"players_charmed_one": "\u0002{0}\u0002 is now charmed!",
|
||||
"players_charmed_two": "\u0002{0}\u0002 and \u0002{1}\u0002 are now charmed!",
|
||||
"players_charmed_many": "\u0002{0}\u0002, and \u0002{1}\u0002 are also charmed!",
|
||||
"previously_charmed": " Previously charmed players: {0}",
|
||||
"alpha_bite_success": "You have bitten \u0002{0}\u0002.",
|
||||
"alpha_bite_failure": "You tried to bite \u0002{0}\u0002, but it didn't work. Better luck next time!",
|
||||
"fallen_angel_success": "A fell wind starts blowing through the village and you catch the flurry of blackened wings out of the corner of your eye. No longer caring for \u0002{0}\u0002's safety, you attempt to get away before your own life is taken...",
|
||||
"fallen_angel_deprotect": "A fell wind blows through you and chills you to the bone. You no longer feel safe or protected...",
|
||||
"assassin_random": "Because you forgot to select a target at night, you are now targeting \u0002{0}\u0002.",
|
||||
"werecrow_success": "As the sun rises, you conclude that \u0002{0}\u0002 was not in bed all night, and you fly back to your house.",
|
||||
"werecrow_failure": "As the sun rises, you conclude that \u0002{0}\u0002 was sleeping all night long, and you fly back to your house.",
|
||||
"new_wolf": "A chilling howl was heard last night. It appears there is another werewolf in our midst!",
|
||||
"target_not_home": "The wolves' selected victim was not at home last night, and avoided the attack.",
|
||||
"totem_protection": "\u0002{0}\u0002 was attacked last night, but their totem emitted a brilliant flash of light, blinding the attacker and allowing them to escape.",
|
||||
"angel_protection": "\u0002{0}\u0002 was attacked last night, but luckily, the guardian angel was on duty.",
|
||||
"bodyguard_protection": "\u0002{0}\u0002 sacrificed their life to guard that of another.",
|
||||
"lycan_turn": "HOOOOOOOOOWL. You have become... a wolf!",
|
||||
"lycan_wc_notification": "\u0002{0}\u0002 is now a wolf!",
|
||||
"totem_banish": "\u0002{0}\u0002's totem emitted a brilliant flash of light last night. It appears that \u0002{1}\u0002's spirit was driven away by the flash.",
|
||||
"totem_death": "\u0002{0}\u0002's totem emitted a brilliant flash of light last night. The dead body of \u0002{1}\u0002, a{2} \u0002{3}\u0002, was found at the scene.",
|
||||
"totem_death_no_reveal": "\u0002{0}\u0002's totem emitted a brilliant flash of light last night. The dead body of \u0002{1}\u0002 was found at the scene.",
|
||||
"death": "The dead body of \u0002{0}\u0002, a{1} \u0002{2}\u0002, is found. Those remaining mourn the tragedy.",
|
||||
"death_no_reveal": "The dead body of \u0002{0}\u0002 is found. Those remaining mourn the tragedy.",
|
||||
"visited_victim": "\u0002{0}\u0002, a \u0002{1}\u0002, made the unfortunate mistake of visiting the victim's house last night and is now dead.",
|
||||
"visited_victim_noreveal": "\u0002{0}\u0002 made the unfortunate mistake of visiting the victim's house last night and is now dead.",
|
||||
"no_victims_append": " All villagers, however, have survived.",
|
||||
"harlot_visited_wolf": "\u0002{0}\u0002, a \u0002harlot\u0002, made the unfortunate mistake of visiting a wolf's house last night and is now dead.",
|
||||
"bodyguard_protected_wolf": "\u0002{0}\u0002, a \u0002bodyguard\u0002, made the unfortunate mistake of guarding a wolf last night, and is now dead.",
|
||||
"bodyguard_protected_wolf_no_reveal": "\u0002{0}\u0002 made the unfortunate mistake of guarding a wolf last night, and is now dead.",
|
||||
"guardian_angel_protected_wolf": "\u0002{0}\u0002, a \u0002guardian angel\u0002, made the unfortunate mistake of guarding a wolf last night, and is now dead.",
|
||||
"guardian_angel_protected_wolf_no_reveal": "\u0002{0}\u0002 made the unfortunate mistake of guarding a wolf last night, and is now dead.",
|
||||
"gunner_killed_wolf_overnight": "Fortunately, \u0002{0}\u0002 had bullets and \u0002{1}\u0002, a \u0002{2}\u0002, was shot dead.",
|
||||
"gunner_killed_wolf_overnight_no_reveal": "Fortunately, \u0002{0}\u0002 had bullets and \u0002{1}\u0002 was shot dead.",
|
||||
"wolf_gunner": "While searching {0}'s belongings, you found a gun loaded with 1 silver bullet! You may only use it during the day. If you shoot at a wolf, you will intentionally miss. If you shoot a villager, it is likely that they will be injured.",
|
||||
"harlot_bit": "While out visiting last night, you were overcome by a fierce-looking wolf and bitten on your neck...",
|
||||
"generic_bit": "You woke up today feeling light-headed, and you notice some odd bite marks on your neck...",
|
||||
"totem_posession": "\u0002{0}\u0002 seem{1} to be in possession of {2} mysterious totem{3}...",
|
||||
"totem_broken": "Broken totem pieces were found next to \u0002{0}\u0002's body...",
|
||||
"command_disabled": "This command has been disabled.",
|
||||
"exhausted_abstain": "The village has already abstained once this game and may not do so again.",
|
||||
"no_abstain_day_one": "The village may not abstain on the first day.",
|
||||
"wounded_no_vote": "{0}: You are wounded and resting, thus you are unable to vote for the day.",
|
||||
"player_abstain": "\u0002{0}\u0002 votes not to lynch anyone today.",
|
||||
"totem_narcolepsy": "As you place your vote, your totem emits a brilliant flash of light. After recovering, you notice that you are still in your bed. That entire sequence of events must have just been a dream...",
|
||||
"no_self_lynch": "You may not vote yourself.",
|
||||
"save_self": "Please try to save yourself.",
|
||||
"player_vote": "\u0002{0}\u0002 votes for \u0002{1}\u0002.",
|
||||
"protector_disappeared": "Your protector seems to have disappeared...",
|
||||
"harlot_disappeared": "\u0002{0}\u0002 seems to have disappeared...",
|
||||
"role_swap": "You have exchanged roles with someone! You are now a \u0002{0}\u0002.",
|
||||
"clone_target": "You are cloning \u0002{0}\u0002.",
|
||||
"shaman_totem": "You have a \u0002{0}\u0002 totem.",
|
||||
"mystic_info": "There {0} \u0002{1}\u0002 evil villager{2} still alive.",
|
||||
"players_exchanged_roles": "\u0002{0}\u0002 and \u0002{1}\u0002 have exchanged roles!",
|
||||
"wolf_mystic_info": "There {0} \u0002{1}\u0002 special villager{2} still alive.",
|
||||
"ill_wolves": "You are feeling ill tonight, and are unable to kill anyone.",
|
||||
"angry_wolves": "You are \u0002angry\u0002 tonight, and may kill two targets by using \"kill <nick1> and <nick2>\".",
|
||||
"wolf_bite": "You may use \"bite <nick>\" tonight in order to turn the wolves' target into a wolf instead of killing them. They will turn into a wolf in {0} night{1}.",
|
||||
"player_not_playing": "You're not currently playing.",
|
||||
"werecrow_transformed": "You have already transformed into a crow, and cannot turn back until day.",
|
||||
"retracted_kill": "You have retracted your kill.",
|
||||
"wolfchat_retracted_kill": "\u0002{0}\u0002 has retracted their kill.",
|
||||
"no_bite": "You have decided not to bite anyone tonight.",
|
||||
"wolfchat_no_bite": "\u0002{0}\u0002 has decided not to bite anyone tonight.",
|
||||
"kill_bite_pending": "You have not chosen to kill or bite anyone yet.",
|
||||
"kill_pending": "You have not chosen to kill anyone yet.",
|
||||
"retracted_vote": "\u0002{0}\u0002's vote was retracted.",
|
||||
"pending_vote": "You haven't voted yet.",
|
||||
"no_gun": "You don't have a gun.",
|
||||
"no_bullets": "You don't have any more bullets.",
|
||||
"gunner_target_self": "You are holding it the wrong way.",
|
||||
"shoot_success": "\u0002{0}\u0002 shoots \u0002{1}\u0002 with a silver bullet!",
|
||||
"gunner_victim_wolf_death": "\u0002{0}\u0002 is a{1} \u0002{2}\u0002, and is dying from the silver bullet.",
|
||||
"gunner_victim_wolf_death_no_reveal": "\u0002{0}\u0002 is a wolf, and is dying from the silver bullet.",
|
||||
"gunner_victim_villager_death": "\u0002{0}\u0002 is not a wolf but was {1}fatally injured.",
|
||||
"gunner_victim_role": "The village has sacrificed a{0} \u0002{1}\u0002.",
|
||||
"gunner_victim_injured": "\u0002{0}\u0002 is a villager and was injured. Luckily the injury is minor and will heal after a day of rest.",
|
||||
"gunner_miss": "\u0002{0}\u0002 is a lousy shooter and missed!",
|
||||
"gunner_suicide": "Oh no! \u0002{0}\u0002's gun was poorly maintained and has exploded! The village mourns a gunner-\u0002{1}\u0002.",
|
||||
"gunner_suicide_no_reveal": "Oh no! \u0002{0}\u0002's gun was poorly maintained and has exploded!",
|
||||
"hunter_already_killed": "You have already killed someone this game.",
|
||||
"silenced": "You have been silenced, and are unable to use any special powers.",
|
||||
"alpha_bite_chosen": "You have chosen to bite someone tonight and cannot participate in the kill. Use \"retract\" if you want to not bite anyone tonight.",
|
||||
"werecrow_transformed_nokill": "You have already transformed into a crow; therefore, you are physically unable to kill a villager.",
|
||||
"player_dead": "You are already dead.",
|
||||
"no_suicide": "Suicide is bad. Don't do it.",
|
||||
"vengeful_ghost_wolf": "You must target a wolf.",
|
||||
"vengeful_ghost_villager": "You must target a villager.",
|
||||
"wolf_no_target_wolf": "You may only kill villagers, not other wolves.",
|
||||
"wolf_must_target_multiple": "You should select two different players.",
|
||||
"wolf_target_multiple": " selected \u0002{0}\u0002 and \u0002{1}\u0002 to be killed.",
|
||||
"player": "You have{0}",
|
||||
"wolfchat": "\u0002{0}\u0002 has{1}",
|
||||
"wolf_target": " selected \u0002{0}\u0002 to be killed.",
|
||||
"wolf_target_second": "You are angry tonight and may kill a second target. Use \"kill <nick1> and <nick2>\" to select multiple targets.",
|
||||
"already_protecting": "You are already protecting someone tonight.",
|
||||
"guardian_target_another": "You protected \u0002{0}\u0002 last night. You cannot protect the same person two nights in a row.",
|
||||
"cannot_guard_self": "You cannot guard yourself. Use pass if you do not wish to guard anyone tonight.",
|
||||
"guardian_guard_self": "You have decided to guard yourself tonight.",
|
||||
"protecting_target": "You are protecting \u0002{0}\u0002 tonight. Farewell!",
|
||||
"target_protected": "You can sleep well tonight, for you are being protected.",
|
||||
"werecrow_no_observe_self": "Instead of doing that, you should probably go kill someone.",
|
||||
"no_observe_self": "That would be a waste.",
|
||||
"werecrow_already_observing": "You are already flying to \u0002{0}\u0002's house.",
|
||||
"already_observed": "You have already observed tonight.",
|
||||
"werecrow_no_target_wolf": "Flying to another wolf's house is a waste of time.",
|
||||
"no_observe_wolf": "Observing another wolf is a waste of time.",
|
||||
"werecrow_observe_success": "You transform into a large crow and start your flight to \u0002{0}'s\u0002 house. You will return after collecting your observations when day begins.",
|
||||
"wolfchat_observe": "\u0002{0}\u0002 is observing \u0002{1}\u0002.",
|
||||
"sorcerer_success": "After casting your ritual, you determine that \u0002{0}\u0002 is a{1} \u0002{2}\u0002!",
|
||||
"sorcerer_fail": "After casting your ritual, you determine that \u0002{0}\u0002 does not have paranormal senses.",
|
||||
"sorcerer_success_wolfchat": "\u0002{0}\u0002 is observing \u0002{1}\u0002.",
|
||||
"already_investigated": "You may only investigate one person per round.",
|
||||
"no_investigate_self": "Investigating yourself would be a waste.",
|
||||
"investigate_success": "The results of your investigation have returned. \u0002{0}\u0002 is a... \u0002{1}\u0002!",
|
||||
"investigator_reveal": "Someone accidentally drops a paper. The paper reveals that \u0002{0}\u0002 is the detective!",
|
||||
"harlot_already_visited": "You are already spending the night with \u0002{0}\u0002.",
|
||||
"harlot_success": "You are spending the night with \u0002{0}\u0002. Have a good time!",
|
||||
"seer_fail": "You may only have one vision per round.",
|
||||
"no_see_self": "Seeing yourself would be a waste.",
|
||||
"seer_success": "You have a vision; in this vision, you see that \u0002{0}\u0002 is a \u0002{1}\u0002!",
|
||||
"oracle_success": "Your paranormal senses are tingling! The spirits tell you that \u0002{0}\u0002 is {1}a {2}wolf{2}!",
|
||||
"augur_success": "You have a vision; in this vision, you see that \u0002{0}\u0002 exudes a \u0002{1}\u0002 aura!",
|
||||
"shaman_no_target_twice": "You gave your totem to \u0002{0}\u0002 last time, you must choose someone else.",
|
||||
"shaman_success": "{0} have given a totem{1} to \u0002{2}\u0002.",
|
||||
"doctor_fail": "You have run out of immunizations.",
|
||||
"doctor_success": "You have given an immunization to \u0002{0}\u0002.",
|
||||
"lycan_cured": "You feel as if a curse has been lifted from you... It seems that your lycanthropy is cured and you will no longer become a werewolf if targeted by the wolves!",
|
||||
"immunized_already_bitten": "You have a brief flashback to {0} last night. The event quickly subsides, but a lingering thought remains in your mind...",
|
||||
"villager_immunized": "You don't feel any different...",
|
||||
"immunization_success": "You feel a sharp prick in the back of your arm and temporarily black out. When you come to, you notice an empty syringe lying on the ground. {0}",
|
||||
"angel_bit_1": "After returning from last night's activities, you felt another wave of pain, this time on your back. Your wings grew larger and you can now fly faster and farther than ever before. Along with the size change, their color shifted from pure white to a midnight black. You didn't spend much time thinking on what happened, as you were tired and went to sleep shortly thereafter.",
|
||||
"angel_bit_2": "Despite the gloves, it seems that the villagers have been keeping their distance from you as of late. None of them seem to know about your changes, so the change of behavior greatly angers you. You're doing just as good a job as ever, and if anything the changes make you MORE effective and powerful. These thoughts lingered for the rest of last night until you finally drifted off to an uneasy sleep.",
|
||||
"angel_bit_3": "As you were out last night, you felt a painful sensation as your hands grew very sharp claws. You figure they are now sharp enough to cut through most anything, but to avoid alarming the village you decide to fashion some gloves and wear them around from now on in an attempt to show nothing is happening.",
|
||||
"villager_bit_1": "You had the same dream again, but this time YOU were the pursuer. You smell fear from your quarry as you give an exhilerating chase, going only half your speed in order to draw out the fun. Suddenly your prey trips over a rock and falls down, allowing you to close in the remaining distance. You savor the fear in their eyes briefly before you raise your claw to deal a killing blow. Right before it connects, you wake up.",
|
||||
"villager_bit_2": "You dreamt of running through the woods outside the village at night, wind blowing across your face as you weave between the pines. Suddenly you hear a rustling sound as a monstrous creature jumps out at you - a werewolf! You start running as fast as you can, you soon feel yourself falling down as you trip over a rock. You look up helplessly as the werewolf catches up to you, then wake up screaming.",
|
||||
"villager_bit_3": "You had a strange dream last night; a person was running away from something through a forest. They tripped and fell over a rock as a shadow descended upon them. Before you could actually see who or what the pursuer was, you woke with a start.",
|
||||
"alpha_already_bit": "You have already bitten someone this game.",
|
||||
"alpha_no_bite": "You may only bite someone after another wolf has died during the day.",
|
||||
"bite_error": "Please choose who to bite by specifying their nick.",
|
||||
"alpha_no_bite_wolf": "You may not bite other wolves.",
|
||||
"alpha_bite_target": "You have chosen to bite \u0002{0}\u0002.",
|
||||
"alpha_bite_wolfchat": "\u0002{0}\u0002 has chosen to bite \u0002{1}\u0002.",
|
||||
"hunter_pass": "You have decided not to kill anyone tonight.",
|
||||
"no_visit": "You have chosen to stay home for the night.",
|
||||
"guardian_no_protect": "You have chosen not to guard anyone tonight.",
|
||||
"turncoat_fail": "You have already changed sides tonight. Use \"side villagers\" or \"side wolves\" to modify your selection.",
|
||||
"turncoat_pass": "You have decided not to change sides tonight.",
|
||||
"already_cursed": "You have already cursed someone tonight.",
|
||||
"warlock_pass": "You have chosen not to curse anyone tonight.",
|
||||
"warlock_pass_wolfchat": "\u0002{0}\u0002 has chosen not to curse anyone tonight.",
|
||||
"already_charmed": "You have already charmed players tonight.",
|
||||
"piper_pass": "You have chosen not to charm anyone tonight.",
|
||||
"turncoat_already_turned": "You have changed sides yesterday night, and may not do so again tonight.",
|
||||
"turncoat_error": "Please specify which team you wish to side with, villagers or wolves.",
|
||||
"turncoat_success": "You are now siding with \u0002{0}\u0002.",
|
||||
"already_matched": "You have already chosen lovers.",
|
||||
"match_different_people": "You must choose two different people.",
|
||||
"matchmaker_success": "You have selected \u0002{0}\u0002 and \u0002{1}\u0002 to be lovers.",
|
||||
"matchmaker_target_notify": "You are \u0002in love\u0002 with {0}. If that player dies for any reason, the pain will be too much for you to bear and you will commit suicide.",
|
||||
"matchmaker_target_notify_simple": "You are \u0002in love\u0002 with {0}.",
|
||||
"assassin_already_targeted": "You have already chosen a target.",
|
||||
"no_target_self": "You may not target yourself.",
|
||||
"assassin_target_success": "You have selected \u0002{0}\u0002 as your target.",
|
||||
"already_hexed": "You have already hexed someone tonight.",
|
||||
"no_multiple_hex": "You hexed \u0002{0}\u0002 last night. You cannot hex the same person two nights in a row.",
|
||||
"no_hex_wolf": "Hexing another wolf would be a waste.",
|
||||
"hex_success": "You have cast a hex on \u0002{0}\u0002.",
|
||||
"hex_success_wolfchat": "\u0002{0}\u0002 has cast a hex on \u0002{1}\u0002.",
|
||||
"target_already_cursed": "\u0002{0}\u0002 is already cursed.",
|
||||
"no_curse_wolf": "Cursing a fellow wolf would be a waste.",
|
||||
"curse_success": "You have cast a curse on \u0002{0}\u0002.",
|
||||
"curse_success_wolfchat": "\u0002{0}\u0002 has cast a curse on \u0002{1}\u0002.",
|
||||
"already_cloned": "You have already chosen to clone someone.",
|
||||
"clone_target_success": "You have chosen to clone \u0002{0}\u0002.",
|
||||
"must_charm_multiple": "You must choose two different people.",
|
||||
"no_charm_self": "You may not charm yourself.",
|
||||
"targets_already_charmed": "\u0002{0}\u0002 and \u0002{1}\u0002 are already charmed!",
|
||||
"target_already_charmed": "\u0002{0}\u0002 is already charmed!",
|
||||
"charm_success": "You have charmed \u0002{0}\u0002.",
|
||||
"charm_multiple_success": "You have charmed \u0002{0}\u0002 and \u0002{1}\u0002.",
|
||||
"another_piper_charmed_multiple": "Another piper has charmed \u0002{0}\u0002 and \u0002{1}\u0002!",
|
||||
"another_piper_charmed": "Another piper has charmed \u0002{0}\u0002!",
|
||||
"privmsg_idle_warning": "\u0002You have been idling in {0} for a while. Please say something in {0} or you will be declared dead.\u0002",
|
||||
"day_lasted": "Day lasted \u0002{0:0>2}:{1:0>2}\u0002. ",
|
||||
"fallen_angel_turn": "As the moonlight filters through your window, you think back on the past few days. Your power has been growing, but the villagers you protect subconsciously detected your shift and have been keeping more distant from you. Grinning with wicked resolve, you vow to show them what fools they have been as you take to the skies once more with an unholy vengeance. Soon they will know true fear.",
|
||||
"bitten_turn": "As you prepare for bed, you watch in horror as your body starts growing a coat of fur! Sudden realization hits you as you grin with your now muzzled face; that mysterious bite earlier slowly changed you into a werewolf! You feel bigger, stronger, faster, and ready to seize the night as you stealthily exit your home and search for the rest of your pack...",
|
||||
"bitten_turn_wolfchat": "\u0002{0}\u0002 is now a \u0002{1}\u0002!",
|
||||
"amnesia_clear": "Your amnesia clears and you now remember that you are a{0} \u0002{1}\u0002!",
|
||||
"amnesia_wolfchat": "\u0002{0}\u0002 is now a \u0002{1}\u0002!",
|
||||
"wolf_notify": "You are a \u0002wolf\u0002. It is your job to kill all the villagers. Use \"kill <nick>\" to kill a villager.",
|
||||
"cursed_traitor_notify": "You are a \u0002cursed traitor\u0002. Normally, you would be seen as a villager by the seer and oracle, but since you're cursed, you are seen as a wolf.",
|
||||
"traitor_notify": "You are a \u0002traitor\u0002. You are exactly like a villager and not even a seer or oracle can see your true identity, only detectives and augurs can.",
|
||||
"werecrow_notify": "You are a \u0002werecrow\u0002. You are able to fly at night. Use \"kill <nick>\" to kill a villager. Alternatively, you can use \"observe <nick>\" to check if someone is in bed or not. Observing will prevent you from participating in a killing.",
|
||||
"hag_notify": "You are a \u0002{0}hag\u0002. You can hex someone to prevent them from using any special powers they may have during the next day and night. Use \"hex <nick>\" to hex them. Only detectives can reveal your true identity, seers will see you as a regular villager.",
|
||||
"sorcerer_notify": "You are a \u0002{0}sorcerer\u0002. You can use \"observe <nick>\" to observe someone and determine if they are the seer, oracle, or augur. Only detectives can reveal your true identity, seers will see you as a regular villager.",
|
||||
"wolf_cub_notify": "You are a \u0002wolf cub\u0002. While you cannot kill anyone, the other wolves will become enraged if you die and will get two kills the following night.",
|
||||
"alpha_wolf_notify": "You are an \u0002alpha wolf\u0002. Once per game following the death of another wolf during the day, you can choose to bite the wolves' next target to turn them into a wolf instead of killing them. Kill villagers by using \"kill <nick>\" and \"bite\" to use your once-per-game bite power.",
|
||||
"werekitten_notify": "You are a \u0002werekitten\u0002. Due to your overwhelming cuteness, the seer always sees you as villager and the gunner will always miss you. Detectives can still reveal your true identity, however. Use \"kill <nick>\" to kill a villager.",
|
||||
"warlock_notify": "You are a \u0002{0}warlock\u0002. Each night you can curse someone with \"curse <nick>\" to turn them into a cursed villager, so the seer sees them as wolf. Act quickly, as your curse applies as soon as you cast it! Only detectives can reveal your true identity, seers will see you as a regular villager.",
|
||||
"wolf_mystic_notify": "You are a \u0002wolf mystic\u0002. Each night you divine the number of alive good villagers who have a special role. You may also use \"kill <nick>\" to kill a villager.",
|
||||
"fallen_angel_notify": "You are a \u0002fallen angel\u0002. Your sharp claws will rend any protection the villagers may have, and will likely kill living guardians as well. Use \"kill <nick>\" to kill a villager.",
|
||||
"undefined_role_notify": "You are a{0} \u0002{1}\u0002. There would normally be instructions here, but someone forgot to add them in. Please report this to the admins, you can PM me \"admins\" for a list of available ones.",
|
||||
"wolfchat_notify": "Also, if you PM me, your message will be relayed to other wolves.",
|
||||
"wolf_simple": "You are a{0} \u0002{1}{2}\u0002.",
|
||||
"gunner_info": "You have a \u0002gun\u0002 with {0} bullet{1}.",
|
||||
"seer_ability": "the role of a player",
|
||||
"oracle_ability": "whether or not a player is a wolf",
|
||||
"augur_ability": "which team a player is on",
|
||||
"seer_role_bug": "??? (this is a bug, please report to admins)",
|
||||
"seer_role_info": "You are {0} \u0002{1}\u0002. It is your job to detect the wolves, you may have a vision once per night. Use \"see <nick>\" to see {2}.",
|
||||
"seer_simple": "You are {0} \u0002{1}\u0002.",
|
||||
"harlot_info": "You are a \u0002harlot\u0002. You may spend the night with one person per round. If you visit a victim of a wolf, or visit a wolf, you will die. You may stay home by visiting yourself. Use \"visit <nick>\" to visit a player.",
|
||||
"harlot_simple": "You are a \u0002harlot\u0002.",
|
||||
"bodyguard_death_chance": "If you guard a wolf, there is a {0}% chance of you dying. ",
|
||||
"bodyguard_notify": "You are a \u0002bodyguard\u0002. It is your job to protect the villagers. {0}If you guard a victim, you will sacrifice yourself to save them. Use \"pass\" to not guard anyone tonight. Use \"guard <nick>\" to guard a player.",
|
||||
"bodyguard_simple": "You are a \u0002bodyguard\u0002.",
|
||||
"guardian_self_notification": "You may also guard yourself. ",
|
||||
"guardian_notify": "You are a \u0002guardian angel\u0002. It is your job to protect the villagers. {0}If you guard a victim, they will live. You may not guard the same person two nights in a row. {1}Use \"guard <nick>\" to guard a player.",
|
||||
"guardian_simple": "You are a \u0002guardian angel\u0002.",
|
||||
"detective_chance": "Each time you use your ability, you risk a {0}% chance of having your identity revealed to the wolves. ",
|
||||
"detective_notify": "You are a \u0002detective\u0002.\nIt is your job to determine all the wolves and traitors. Your job is during the day, and you can see the true identity of all players, even traitors.\n{0}Use \"id <nick>\" in PM to identify any player during the day.",
|
||||
"detective_simple": "You are a \u0002detective\u0002.",
|
||||
"drunk_notification": "You have been drinking too much! You are the \u0002village drunk\u0002.",
|
||||
"drunk_simple": "You are the \u0002village drunk\u0002.",
|
||||
"mystic_notify": "You are the \u0002mystic\u0002. Each night you divine the number of evil villagers (including wolves) that are still alive.",
|
||||
"mystic_simple": "You are the \u0002mystic\u0002.",
|
||||
"shaman_notify": "You are a \u0002{0}\u0002. You can select a player to receive a {1}totem each night by using \"give <nick>\". You may give yourself a totem, but you may not give the same player a totem two nights in a row. If you do not give the totem to anyone, it will be given to a random player.",
|
||||
"shaman_totem": "You have the \u0002{0}\u0002 totem. ",
|
||||
"death_totem": "The player who is given this totem will die tonight, even if they are being protected.",
|
||||
"protection_totem": "The player who is given this totem is protected from dying tonight.",
|
||||
"revealing_totem": "If the player who is given this totem is lynched, their role is revealed to everyone instead of them dying.",
|
||||
"narcolepsy_totem": "The player who is given this totem will be unable to vote during the day tomorrow.",
|
||||
"silence_totem": "The player who is given this totem will be unable to use any special powers during the day tomorrow and the night after.",
|
||||
"desperation_totem": "If the player who is given this totem is lynched, the last player to vote them will also die.",
|
||||
"impatience_totem": "The player who is given this totem is counted as voting for everyone except themselves, even if they do not !vote.",
|
||||
"pacificsm_totem": "Votes by the player who is given this totem do not count.",
|
||||
"influence_totem": "Votes by the player who is given this totem count twice.",
|
||||
"exchange_totem": "The first person to use a power on the player given this totem tomorrow night will have their role swapped with the recipient.",
|
||||
"lycanthropy_totem": "If the player who is given this totem is targeted by wolves tomorrow night, they will become a wolf.",
|
||||
"luck_totem": "If the player who is given this totem is targeted tomorrow night, one of the players adjacent to them will be targeted instead.",
|
||||
"pestilence_totem": "If the player who is given this totem is killed by wolves tomorrow night, the wolves will not be able to kill the night after.",
|
||||
"retribution_totem": "If the player who is given this totem will die tonight, they also kill anyone who killed them.",
|
||||
"misdirection_totem": "If the player who is given this totem attempts to use a power the following day or night, they will target a player adjacent to their intended target instead of the player they targeted.",
|
||||
"generic_bug_totem": "No description for this totem is available. This is a bug, so please report this to the admins.",
|
||||
"shaman_simple": "You are a \u0002{0}\u0002.",
|
||||
"totem_simple": "You have the \u0002{0}\u0002 totem.",
|
||||
"hunter_notify": "You are a \u0002hunter\u0002. Once per game, you may kill another player with \"kill <nick>\". If you do not wish to kill anyone tonight, use \"pass\" instead.",
|
||||
"hunter_simple": "You are a \u0002hunter\u0002.",
|
||||
"mad_scientist_notify": "You are the \u0002mad scientist\u0002. If you die, you will let loose a potent chemical concoction that will kill \u0002{0}\u0002 and \u0002{1}\u0002 if they are still alive.",
|
||||
"mad_scientist_simple": "You are the \u0002mad scientist\u0002. Targets: \u0002{0}\u0002 and \u0002{1}\u0002",
|
||||
"doctor_notify": "You are a \u0002doctor\u0002. You can give out immunizations to villagers by using \"give <nick>\" in PM during the daytime. An immunized villager will die instead of turning into a wolf due to the alpha wolf's or lycan's power.",
|
||||
"doctor_simple": "You are a \u0002doctor\u0002.",
|
||||
"doctor_immunizations": "You have \u0002{0}\u0002 immunization{1}.",
|
||||
"fool_notify": "You are a \u0002fool\u0002. The game immediately ends with you being the only winner if you are lynched during the day. You cannot otherwise win this game.",
|
||||
"fool_simple": "You are a \u0002fool\u0002.",
|
||||
"jester_notify": "You are a \u0002jester\u0002. You will win alongside the normal winners if you are lynched during the day. You cannot otherwise win this game.",
|
||||
"jester_simple": "You are a \u0002jester\u0002.",
|
||||
"monster_notify": "You are a \u0002monster\u0002. You cannot be killed by the wolves. If you survive until the end of the game, you win instead of the normal winners.",
|
||||
"monster_simple": "You are a \u0002monster\u0002.",
|
||||
"lycan_notify": "You are a \u0002lycan\u0002. You are currently on the side of the villagers, but will turn into a wolf instead of dying if you are targeted by the wolves during the night.",
|
||||
"lycan_simple": "You are a \u0002lycan\u0002.",
|
||||
"vengeful_ghost_notify": "You are a \u0002vengeful ghost\u0002, sworn to take revenge on the {0} that you believe killed you. You must kill one of them with \"kill <nick>\" tonight. If you do not, one of them will be selected at random.",
|
||||
"vengeful_ghost_simple": "You are a \u0002vengeful ghost\u0002.",
|
||||
"drunken_assassin_notification": "You are an \u0002assassin\u0002. In your drunken stupor you have selected \u0002{0}\u0002 as your target.",
|
||||
"assassin_info": " If you die you will take out your target with you.",
|
||||
"assassin_notify": "You are an \u0002assassin\u0002. Choose a target with \"target <nick>\". If you die you will take out your target with you. If your target dies you may choose another one.",
|
||||
"assassin_simple": "You are an \u0002assassin\u0002.",
|
||||
"piper_notify": "You are a \u0002piper\u0002. You must select two players to charm each night. The charmed players will know each other, but not who charmed them. You win when all other players are charmed. Use \"charm <nick1> and <nick2>\" to select the players to charm.",
|
||||
"piper_simple": "You are a \u0002piper\u0002.",
|
||||
"turncoat_notify": "You are a \u0002turncoat\u0002. You can change which team you're siding with every other night. Use \"side villagers\" or \"side wolves\" to select your team. ",
|
||||
"turncoat_current_team": "You are currently siding with \u0002{0}\u0002.",
|
||||
"turncoat_no_team": "If you die before selecting a side, you will not win.",
|
||||
"turncoat_simple": "You are a \u0002turncoat\u0002. Current side: \u0002{0}\u0002.",
|
||||
"matchmaker_notify": "You are a \u0002matchmaker\u0002. You can select two players to be lovers with \"choose <nick1> and <nick2>\". If one lover dies, the other will as well. You may select yourself as one of the lovers. You may only select lovers during the first night. If you do not select lovers, they will be randomly selected and you will not be told who they are (unless you are one of them).",
|
||||
"matchmaker_simple": "You are a \u0002matchmaker\u0002.",
|
||||
"clone_notify": "You are a \u0002clone\u0002. You can select someone to clone with \"clone <nick>\". If that player dies, you become their role(s). You may only clone someone during the first night.",
|
||||
"clone_simple": "You are a \u0002clone\u0002.",
|
||||
"gunner_notify": "You are a \u0002{0}\u0002 and hold a gun that shoots special silver bullets. You may only use it during the day by typing \"{1}shoot <nick>\" in channel. Wolves and the crow will die instantly when shot, but anyone else will likely survive. You have {2} bullet{3}.",
|
||||
"sharpshooter_notify": "You are a \u0002{0}\u0002 and hold a gun that shoots special silver bullets. You may only use it during the day by typing \"{1}shoot <nick>\" in channel. Wolves and the crow will die instantly when shot, and anyone else will likely die as well due to your skill with the gun. You have {2} bullet{3}.",
|
||||
"gunner_simple": "You are a \u0002{0}\u0002 and have a gun with {1} bullet{2}.",
|
||||
"night_begin": "It is now nighttime. All players check for PMs from me for instructions.",
|
||||
"first_night_begin": " If you did not receive one, simply sit back, relax, and wait patiently for morning.",
|
||||
"game_mode_not_found": "Mode \u0002{0}\u0002 not found.",
|
||||
"no_game_running": "No game is currently running.",
|
||||
"werewolf_already_running": "Werewolf is already in play.",
|
||||
"please_wait": "Please wait at least {0} more second{1}.",
|
||||
"not_enough_players": "{0}: \u0002{1}\u0002 or more players are required to play.",
|
||||
"max_players": "{0}: At most \u0002{1}\u0002 players may play.",
|
||||
"start_votes": "; Votes to start the game: {} ({})",
|
||||
"start_retract": "\u0002{0}\u0002's vote to start was retracted.",
|
||||
"start_novote": "You haven't voted to start.",
|
||||
"start_expired": "Not enough votes to start were accumulated in 1 minute, removing start votes.",
|
||||
"start_already_voted": "You have already voted to start the game.",
|
||||
"start_voted": "{0} has voted to \u0002start\u0002 the game. \u0002{1}\u0002 more {2} required.",
|
||||
"no_settings_defined": "{0}: No game settings are defined for \u0002{1}\u0002 player games.",
|
||||
"too_few_players_custom": "There are too few players in the game to use the custom roles.",
|
||||
"need_one_wolf": "There has to be at least one wolf!",
|
||||
"too_many_wolves": "Too many wolves.",
|
||||
"error_role_players_count": "Error: Not all roles have defined player counts.",
|
||||
"default_reset": "The default settings have been restored. Please {0}start again.",
|
||||
"command_disabled_admin": "This command has been disabled by an admin.",
|
||||
"not_enough_targets": "Not enough valid targets for the {0} template.",
|
||||
"role_skipped": "This role has been skipped for this game.",
|
||||
"stasis_non_negative": "The amount of stasis has to be a non-negative integer.",
|
||||
"target_in_stasis": "\u0002{0}\u0002 (Host: {1}) is in stasis for \u0002{2}\u0002 game{3}.",
|
||||
"target_not_in_stasis": "\u0002{0}\u0002 (Host: {1}) is not in stasis.",
|
||||
"fstasis_add_success": "\u0002{0}\u0002 (Host: {1}) is now in stasis for \u0002{2}\u0002 game{3}.",
|
||||
"fstasis_remove_success": "\u0002{0}\u0002 (Host: {1}) is no longer in stasis.",
|
||||
"fstasis_account_add_success": "\u0002{0}\u0002 (Account: {1}) is in stasis for \u0002{2}\u0002 game{3}.",
|
||||
"fstasis_account_remove_success": "\u0002{0}\u0002 (Account: {1}) is no longer in stasis.",
|
||||
"account_not_in_stasis": "\u0002{0}\u0002 (Account: {1}) is not in stasis.",
|
||||
"currently_stasised": "Currently stasised: {0}",
|
||||
"noone_stasised": "Nobody is currently stasised.",
|
||||
"no_command_specified": "Error: No command specified. Did you mean \u0002-cmds\u0002?",
|
||||
"invalid_option": "Invalid option: {0}",
|
||||
"command_does_not_exist": "That command does not exist.",
|
||||
"wait_time_increase": "\u0002{0}\u0002 increased the wait time by {1} seconds.",
|
||||
"forced_wait_time_increase": "\u0002{0}\u0002 forcibly increased the wait time by {1} second{3}.",
|
||||
"forced_wait_time_increase": "\u0002{0}\u0002 forcibly decreased the wait time by {1} second{3}.",
|
||||
"fstop_success": "\u0002{0}\u0002 has forced the game to stop.",
|
||||
"error_stop": "Game stopped due to error.",
|
||||
"documentation_unavailable": "Documentation for this command is not available.",
|
||||
"command_not_found": "Command not found.",
|
||||
"commands_list": "Commands: {0}",
|
||||
"admin_commands_list": "Admin Commands: {0}",
|
||||
"wiki_request_timed_out": "Request to https://github.com/lykoss/lykos/wiki timed out.",
|
||||
"wiki_no_open": "Could not open https://github.com/lykoss/lykos/wiki",
|
||||
"wiki_no_role_info": "Could not find information on that role in https://github.com/lykoss/lykos/wiki",
|
||||
"not_an_admin": "You are not an admin.",
|
||||
"fpart_usage": "Usage: fpart <channel>",
|
||||
"fpart_bot_error": "No, that won't be allowed.",
|
||||
"available_admins": "Available admins: ",
|
||||
"command_unavailable": "You may not use this command right now.",
|
||||
"start_timer_plural": "There are \u0002{0}\u0002 seconds remaining until the game may be started.",
|
||||
"start_timer_singular": "There is \u00021\u0002 second remaining until the game may be started.",
|
||||
"timers_disabled": "{0} timers are currently disabled.",
|
||||
"incorrect_syntax": "Incorrect syntax for this command.",
|
||||
"command_scheduled": "The command \u0002{0}\u0002 has been scheduled to run after this game by \u0002{1}\u0002.",
|
||||
"disable_new_games": "Creating a new game has now been disabled by \u0002{0}\u0002.",
|
||||
"stats_wait_for_game": "Wait until the game is over to view stats.",
|
||||
"invalid_mode_no_list": "{0} is not a valid game mode.",
|
||||
"integer_range": "Please enter an integer between {0} and {1}.",
|
||||
"no_mode_specified": "No game mode specified. Available game modes: ",
|
||||
"admin_forced_game": "A game mode has already been forced by an admin.",
|
||||
"vote_game_fail": "You can't vote for that game mode.",
|
||||
"fsend_usage": "Usage: {0}{1} <target> <message>",
|
||||
"wrong_channel": "You have to be in {0} to use this command.",
|
||||
"invalid_fsend_permissions": "You do not have permission to message this user or channel.",
|
||||
"temp_invalid_perms": "You are not allowed to use that command right now.",
|
||||
"fgame_success": "\u0002{0}\u0002 has changed the game settings successfully.",
|
||||
"available_mode_setters": "Available game mode setters: ",
|
||||
"setter_not_found": "Game mode setter \u0002{0}\u0002 not found.",
|
||||
"setter_no_doc": "Game mode {0} has no doc string",
|
||||
"invalid_target": "This can only be done on players in the channel or fake nicks.",
|
||||
"admin_only_force": "Only full admins can force an admin-only command.",
|
||||
"operation_successful": "Operation successful.",
|
||||
"template_default_role": "Added default role ({0}) because only a template was specified for a new player.",
|
||||
"improper_template_mod": "Improper template modification.",
|
||||
"template_mod_syntax": "Please specify \u0002+{0}\u0002 or \u0002-{0}\u0002 to add/remove this template.",
|
||||
"invalid_role": "Not a valid role.",
|
||||
"stats_accurate": "{0}stats type changed to accurate due to use of {0}frole.",
|
||||
"not_owner": "You are not the owner.",
|
||||
"invalid_permissions": "You do not have permission to use that command.",
|
||||
"player_joined_deadchat": "\u0002{0}\u0002 has joined the chat.",
|
||||
"multiple_joined_deadchat": "\u0002{0}\u0002 and \u0002{1}\u0002 have joined the chat.",
|
||||
"joined_deadchat": "You are now in the chat.",
|
||||
"list_deadchat": "Players: {0}",
|
||||
"force_leave_deadchat": "You have been forcibly removed from the chat by \u0002{0}\u0002.",
|
||||
"player_force_leave_deadchat": "\u0002{0}\u0002 has been removed from the chat by \u0002{1}\u0002.",
|
||||
"leave_deadchat": "You have left the chat.",
|
||||
"player_left_deadchat": "\u0002{0}\u0002 has left the chat.",
|
||||
"chat_on_death": "You will now join the chat on death.",
|
||||
"no_chat_on_death": "You will no longer join the chat on death.",
|
||||
"already_prayed": "You are exhausted and unable to receive any more visions tonight.",
|
||||
"specific_invalid_role": "\u0002{0}\u0002 is not a valid role.",
|
||||
"vision_only_role_self": "You receive a vision that you are the only \u0002{0}\u0002.",
|
||||
"vision_no_more_role": "You receive a vision that there are no other \u0002{0}\u0002.",
|
||||
"vision_players": "You receive a vision that at least one of these people is a \u0002{0}\u0002: ",
|
||||
"vision_prophet": "You receive a vision that \u0002{0}\u0002 is the prophet!",
|
||||
"vision_role": "You receive a vision that \u0002{0}\u0002 is a \u0002{1}\u0002.",
|
||||
"vision_none": "You receive a vision that there are no \u0002{0}\u0002.",
|
||||
"vision_recovering": "You are still recovering from your previous vision and are unable to receive any more visions tonight.",
|
||||
"succubus_already_visited": "You are already entrancing \u0002{0}\u0002 tonight.",
|
||||
"notify_succubus_target": "You have become entranced by \u0002{0}\u0002. From this point on, you must vote along with them or risk dying. For as long as they are alive, you \u0002cannot win with your own team\u0002, but you will win if \u0002{0}\u0002 wins as well.",
|
||||
"succubus_harlot_success": "You have entranced \u0002{0}\u0002.",
|
||||
"succubus_target_success": "You are entrancing \u0002{0}\u0002 tonight.",
|
||||
"no_kill_succubus": "You discover that \u0002{0}\u0002 is a succubus and have retracted your kill as a result.",
|
||||
"no_target_succubus": "You discover that \u0002{0}\u0002 is a succubus and must now target someone else.",
|
||||
"drunk_target": " In your drunken stupor, you have selected \u0002{0}\u0002 as your target.",
|
||||
"retract_totem_succubus": "You discover that \u0002{0}\u0002 is a succubus and have retracted your totem as a result.",
|
||||
"retract_hex_succubus": "You discover that \u0002{0}\u0002 is a succubus and have retracted your hex as a result.",
|
||||
"dullahan_no_kill_succubus": "While you remain entranced, the succubus does not need to die for you to win.",
|
||||
"no_see_wolf": "Seeing another wolf would be a waste.",
|
||||
"doomsayer_death": "You have a vision that \u0002{0}\u0002 will meet an untimely end tonight.",
|
||||
"doomsayer_lycan": "You have a vision that \u0002{0}\u0002 is transforming into a savage beast tomorrow night.",
|
||||
"doomsayer_sick": "You have a vision that \u0002{0}\u0002 will become incredibly ill tomorrow and unable to do anything.",
|
||||
"doomsayer_wolfchat": "\u0002{0}\u0002 is predicting \u0002{1}\u0002's doom.",
|
||||
"seer_bit_1": "This time in your vision, you saw your best friend surrounded by wolves. However, instead of dying, they started to mutate into a werewolf themselves. Looking on in shock, you start wondering how you can find help, when one of the wolves turns to you and says to get going before day breaks. Confused, you look down and notice that you too are a wolf; the shock of the realization wakes you with a start.",
|
||||
"seer_bit_2": "You had another strange vision last night. You saw an old childhood bully walking along the edge of a cliff. You follow behind them, and after a while they turn around, noticing you. Their face suddenly becomes devoid of all emotion, and they melancholily walk off the precipice, falling hundreds of feet into the rocky shoal below. A sinister grin forms on your face, and you notice that your teeth are pointer than normal as the vision fades.",
|
||||
"seer_bit_3": "Something felt strange in that vision you had last night. You saw the shadows of a person, bed-ridden and unable to move. You see they are sick, and probably contagious. They look up, and although you cannot recognize the face through the pock marks, they seem to recognize you. They point at you, and the vision ends.",
|
||||
"succubus_pass": "You have chosen to not entrance anyone tonight.",
|
||||
"seer_turn": "Reflecting on your visions the previous night, you believe that you have discovered a way to make them actually happen! This realization is combined with noting that you seem to have transformed into a werewolf, a fact that doesn't seem to faze you in the slightest. Your face grins with evil resolve as you head out to the forest, in search of the other wolves you were until recently trying so hard to kill.",
|
||||
"no_longer_entranced": "You are no longer entranced.",
|
||||
"doomsayer_notify": "You are a \u0002doomsayer\u0002. You can see how bad luck will befall someone at night by using \"see <nick>\" on them. You may also use \"kill <nick>\" to kill a villager.",
|
||||
"prophet_chance_1": "The first time each night you use your ability, you risk a {0}% chance of having your identity revealed to that person. If your identity is revealed this way, you cannot use your ability again that night. ",
|
||||
"prophet_chance_2": "The second time each night you use your ability, you risk a {0}% chance of having your identity revealed to that person. ",
|
||||
"prophet_notify": "You are a \u0002prophet\u0002. Each night you may pray up to twice to learn who has a particular role. The first time, you are given a list of players. The second time, you are given the exact player name. {0}Use \"pray <role>\" in PM to learn who has that role.",
|
||||
"prophet_simple": "You are a \u0002prophet\u0002.",
|
||||
"dullahan_targets_dead": "All your targets are already dead!",
|
||||
"dullahan_notify": "You are a \u0002dullahan\u0002. Every night, you may kill someone by using \"kill <nick>\". You win when all your targets are dead.",
|
||||
"dullahan_simple": "You are a \u0002dullahan\u0002.",
|
||||
"dullahan_targets": "Targets: ",
|
||||
"dullahan_remaining_targets": "Remaining targets: ",
|
||||
"succubus_notify": "You are a \u0002succubus\u0002. You may entrance someone and make them follow you by visiting them at night. If all alive players are entranced, you win. Use \"visit <nick>\" to visit a player or \"pass\" to stay home. If you visit the victim of the wolves, you will die.",
|
||||
"succubus_simple": "You are a \u0002succubus\u0002.",
|
||||
"vigilante_notify": "You are a \u0002vigilante\u0002. Each night, you may kill someone by using \"kill <nick>\", or \"pass\" to pass. If the person you kill is not a wolf or a win stealer, you will die alongside your victim.",
|
||||
"vigilante_simple": "You are a \u0002vigilante\u0002.",
|
||||
"demoniac_notify": "You are a \u0002demoniac\u0002. You win instead of the normal winners if all wolves are killed while you are alive.",
|
||||
"demoniac_simple": "You are a \u0002demoniac\u0002.",
|
||||
"priest_notify": "You are a \u0002priest\u0002. Once per game during the day, you may bless someone with \"bless <nick>\" to prevent them from being killed. Furthermore, you may consecrate the dead during the day with \"consecrate <nick>\" to settle down restless spirits and prevent the corpse from rising as undead; doing so removes your ability to participate in the vote that day.",
|
||||
"priest_simple": "You are a \u0002priest\u0002.",
|
||||
"minion_notify": "You are a \u0002minion\u0002. It is your job to help the wolves kill all of the villagers.",
|
||||
"minion_simple": "You are a \u0002minion\u0002.",
|
||||
"villager_notify": "You are a \u0002villager\u0002. It is your job to lynch all of the wolves.",
|
||||
"villager_simple": "You are a \u0002villager\u0002.",
|
||||
"cultist_notify": "You are a \u0002cultist\u0002. It is your job to help the wolves kill all of the villagers.",
|
||||
"cultist_simple": "You are a \u0002cultist\u0002.",
|
||||
"blessed_notify": "You feel incredibly safe. You are a \u0002blessed villager\u0002.",
|
||||
"blessed_simple": "You are a \u0002blessed villager\u0002.",
|
||||
"welcome": "{0}: Welcome to Werewolf, the popular detective/social party game (a theme of Mafia). Using the \u0002{1}\u0002 game mode{2}.",
|
||||
"invalid_mode_args": "Invalid syntax for mode arguments. arg={0}",
|
||||
"invalid_reveal": "Did not recognize value \u0002{0}\u0002 for role reveal. Allowed values: on, off, team",
|
||||
"invalid_stats": "Did not recognize value \u0002{0}\u0002 for stats type. Allowed values: default, accurate, team, disabled",
|
||||
"invalid_abstain": "Did not recognize value \u0002{0}\u0002 for abstain. Allowed values: enabled, restricted, disabled",
|
||||
"lovers_win": "Game over! The remaining villagers through their inseparable love for each other have agreed to stop all of this senseless violence and coexist in peace forever more. All remaining players win.",
|
||||
"role_disabled": "The role \u0002{0}\u0002 has been disabled.",
|
||||
"invalid_mode_roles": "Invalid syntax for mode roles. arg={0}",
|
||||
"bad_role_value": "A bad value was used in mode roles.",
|
||||
"evil_no_win": "Game over! All the villagers are dead, but the cult needed to sacrifice the wolves to accomplish that. The cult disperses shortly thereafter, and nobody wins.",
|
||||
"evil_villager_win": "Game over! All the wolves are dead! The villagers round up the remaining cultists, hang them, and live happily ever after.",
|
||||
"evil_wolf_win": "Game over! All the villagers are dead! The cultists rejoice with their wolf buddies and start plotting to take over the next village.",
|
||||
"evil_cultists_dead": "Game over! All the cultists are dead! The now-exposed wolves are captured and killed by the remaining villagers. A BBQ party commences shortly thereafter.",
|
||||
"evil_villager_tie": "Game over! There are the same number of villagers as cultists. They manage to regain control of the village and dispose of the remaining cultists.",
|
||||
"evil_more_villagers": "Game over! There are more villagers than cultists. They manage to regain control of the village and dispose of the remaining cultists.",
|
||||
"guardian_wolf_win": "Game over! There are more wolves than uninjured villagers. With the ancestral guardians dead, the wolves overpower the defenseless villagers and win.",
|
||||
"guardian_wolf_tie_no_guards": "Game over! There are the same number of wolves as uninjured villagers. With the ancestral guardians dead, the wolves overpower the defenseless villagers and win.",
|
||||
"guardian_villager_win": "Game over! All the wolves are dead! The remaining villagers throw a party in honor of the guardian angels that watched over the village, and live happily ever after.",
|
||||
"guardian_lose_no_guards": "Game over! The remaining villagers managed to destroy the wolves, however the guardians that used to watch over the village are nowhere to be found. The village lives on in an uneasy peace, not knowing when they will be destroyed completely now that they are defenseless. Nobody wins.",
|
||||
"guardian_lose_with_guards": "Game over! The guardians, angered by the loss of everyone they were meant to guard, engage the wolves in battle and mutually assured destruction. After the dust settles the village is completely dead, and nobody wins.",
|
||||
"sleepy_nightmare_begin": "While walking through the woods, you hear the clopping of hooves behind you. Turning around, you see a large black horse with dark red eyes and flames where its mane and tail would be. After a brief period of time, it starts chasing after you! You think if you can cross the bridge over the nearby river you'll be safe, but your surroundings are almost unrecognizable in this darkness.",
|
||||
"sleepy_nightmare_navigate": "You can pm me \"north\", \"east\", \"south\", and \"west\", or their abbreviations \"n\", \"e\", \"s\", and \"w\" to navigate.",
|
||||
"sleepy_nightmare_0": "You find yourself deep in the heart of the woods, with imposing trees covering up what little light exists with their dense canopy. The paths here are very twisty, and it's easy to wind up going in circles if one is not careful. Directions are {0}.",
|
||||
"sleepy_nightmare_1": "You come across a small creek, the water babbling softly in the night as if nothing is amiss. As you approach, a flock of ravens bathing there disperses into all directions. Directions are {0}.",
|
||||
"sleepy_nightmare_2": "The treeline starts thinning and you start feeling fresh air for the first time in a while, you must be getting close to the edge of the woods! Directions are {0}.",
|
||||
"sleepy_nightmare_wake": "You break clear of the woods and see a roaring river ahead with a rope bridge going over it. You sprint to the bridge with the beast hot on your tail, your adrenaline overcoming your tired legs as you push yourself for one final burst. You make it across the bridge, and not a moment too soon as the sun starts rising up, causing you to wake from your dream in a cold sweat.",
|
||||
"sleepy_nightmare_fake_1": "You break clear of the woods and see a roaring river ahead. However, look as you may you are unable to find any means of crossing it. Knowing how expansive the river is, and how fast the beast can chase you if it isn't being slowed down by the foliage, you think it's best to look for the correct side of the woods again by going back in. Cursing your bad luck, you head back into the woods.",
|
||||
"sleepy_nightmare_fake_2": "You break clear of the woods only to find an expansive plains ahead of you, with no river in sight. You must have found your way out through the wrong side of the woods! Attempting to circle around the woods would result in the beast catching you in short order, so you softly curse at your bad luck as you head back into the woods to find the correct path.",
|
||||
"sleepy_nightmare_invalid_direction": "That way lies madness and certain death.",
|
||||
"sleepy_nightmare_restart": "You find yourself back where you started...",
|
||||
"sleepy_nightmare_death": "As the sun starts rising, your legs give out, causing the beast to descend upon you and snuff out your life.",
|
||||
"sleepy_priest_death": "The sky suddenly darkens as a thunderstorm appears from nowhere. The bell on the newly-abandoned church starts ringing in sinister tones before the building is struck repeatedly by lightning, setting it alight in a raging inferno...",
|
||||
"sleepy_doomsayer_turn": "You feel something rushing into you and taking control over your mind and body. It causes you to rapidly start transforming into a werewolf, and you realize your vision powers can now be used to inflict malady on the unwary. You are now a \u0002doomsayer\u0002.",
|
||||
"sleepy_doomsayer_wolfchat": "\u0002{0}\u0002 is now a \u0002doomsayer\u0002.",
|
||||
"sleepy_succubus_turn": "You feel something rushing into you and taking control over your mind and body. You are now a \u0002succubus\u0002. Your job is to entrance the village, bringing them all under your absolute control.",
|
||||
"sleepy_demoniac_turn": "You feel something rushing into you and taking control over your mind and body, showing you your new purpose in life. There are far greater evils than the wolves lurking in the shadows, and by sacrificing all of the wolves, you can unleash those evils upon the world. You are now a \u0002demoniac\u0002.",
|
||||
"fquit_fail": "Forcing a live player to leave must be done in channel",
|
||||
"join_swap_instead": " Please use '{0}swap' to join instead.",
|
||||
"demoniac_win": "Game over! All the wolves are dead! As the villagers start preparing the BBQ, a sudden flash illuminates the sky. Demonic spirits emerge around the sacrificed wolves and possess all villagers, causing the demoniac{0} to win.",
|
||||
"dullahan_die_totem": "Before dying, \u0002{0}\u0002 snaps a whip made of a human spine at \u0002{1}\u0002; however, {1}'s totem emits a brilliant flash of light, causing the attempt to miss.",
|
||||
"dullahan_die_angel": "Before dying, \u0002{0}\u0002 snaps a whip made of a human spine at \u0002{1}\u0002; however, a guardian angel was on duty and able to foil the attempt.",
|
||||
"dullahan_die_bodyguard": "Before dying, \u0002{0}\u0002 snaps a whip made of a human spine at \u0002{1}\u0002; however, \u0002{2}\u0002, a bodyguard, sacrificed their life to protect them.",
|
||||
"assassin_fail_blessed": "\u0002{0}\u0002 seems to be blessed, causing your assassination attempt to fail.",
|
||||
"dullahan_die_success": "Before dying, \u0002{0}\u0002 snaps a whip made of a human spine at \u0002{1}\u0002, killing them. The village mourns the loss of a{2} \u0002{3}\u0002.",
|
||||
"dullahan_die_success_noreveal": "Before dying, \u0002{0}\u0002 snaps a whip made of a human spine at \u0002{1}\u0002, killing them.",
|
||||
"entranced_revert_win": "With all of the succubi dead, you are no longer entranced. \u0002Your win conditions have reset to normal.\u0002",
|
||||
"player_sick": "You woke up today not feeling very well, you think it best to stay home for the remainder of the day and night.",
|
||||
"consecrating_no_vote": "You are consecrating someone today and cannot participate in the vote.",
|
||||
"illness_no_vote": "You are staying home due to your illness and cannot participate in the vote.",
|
||||
"already_blessed": "You have already blessed someone this game.",
|
||||
"no_bless_self": "You may not bless yourself.",
|
||||
"blessed_success": "You have given a blessing to \u0002{0}\u0002",
|
||||
"blessed_notify_target": "You suddenly feel very safe.",
|
||||
"consecrate_fail": "\u0002{0}\u0002 is not currently playing or is not dead.",
|
||||
"consecrate_success": "You have consecrated the body of \u0002{0}\u0002.",
|
||||
"no_acting_on_succubus": "You may not {0} a succubus.",
|
||||
"coin_toss": "\u0002{0}\u0002 tosses a coin into the air...",
|
||||
"coin_choices": [
|
||||
"heads",
|
||||
"tails"
|
||||
],
|
||||
"coin_special": [
|
||||
"its side",
|
||||
"{bot_nick}"
|
||||
],
|
||||
"coin_land": "The coin lands on \u0002{0}\u0002.",
|
||||
"pony_toss": "\u0002{0}\u0002 tosses a pony into the air...",
|
||||
"pony_choices": [
|
||||
"hoof",
|
||||
"plot"
|
||||
],
|
||||
"pony_land": "The pony lands on \u0002{0}\u0002.",
|
||||
"vengeful_role": "You are a \u0002vengeful ghost\u0002 who is against the \u0002{0}\u0002.",
|
||||
"show_role": "You are a{0} \u0002{1}\u0002.",
|
||||
"original_wolves": "Original wolves: ",
|
||||
"turncoat_side": "Current side: \u0002{0}\u0002.",
|
||||
"assassin_role_info": "You are an \u0002assassin\u0002{0}.",
|
||||
"assassin_targeting": " and targeting {0}",
|
||||
"bitten_info": "You were bitten by an alpha wolf and have \u0002{0} night{1}\u0002 until your transformation.",
|
||||
"matched_info": "You are \u0002in love\u0002 with ",
|
||||
"no_command_in_channel": "You cannot use this command in channel right now",
|
||||
"no_such_role": "No such role: {0}",
|
||||
"available_modes": "Available game modes: \u0002",
|
||||
"process_exited": "Process %s exited with %s %d",
|
||||
"admin_fleave_deadchat": "You have forced {0} to leave the deadchat.",
|
||||
"available_mode_setters_help": "Votes to make a specific game mode more likely. Available game mode setters: "
|
||||
}
|
@ -10,6 +10,7 @@ import botconfig
|
||||
import src.settings as var
|
||||
from src.utilities import *
|
||||
from src import logger
|
||||
from src.messages import messages
|
||||
|
||||
adminlog = logger("audit.log")
|
||||
errlog = logger("errors.log")
|
||||
@ -146,16 +147,16 @@ class cmd:
|
||||
|
||||
if self.playing and (nick not in var.list_players() or nick in var.DISCONNECTED):
|
||||
if chan == nick:
|
||||
pm(cli, nick, "You're not currently playing.")
|
||||
pm(cli, nick, messages["player_not_playing"])
|
||||
else:
|
||||
cli.notice(nick, "You're not currently playing.")
|
||||
cli.notice(nick, messages["player_not_playing"])
|
||||
return
|
||||
|
||||
if self.silenced and nick in var.SILENCED:
|
||||
if chan == nick:
|
||||
pm(cli, nick, "You have been silenced, and are unable to use any special powers.")
|
||||
pm(cli, nick, messages["silenced"])
|
||||
else:
|
||||
cli.notice(nick, "You have been silenced, and are unable to use any special powers.")
|
||||
cli.notice(nick, messages["silenced"])
|
||||
return
|
||||
|
||||
if self.roles:
|
||||
@ -173,9 +174,9 @@ class cmd:
|
||||
return self.func(*largs)
|
||||
|
||||
if chan == nick:
|
||||
pm(cli, nick, "You are not the owner.")
|
||||
pm(cli, nick, messages["not_owner"])
|
||||
else:
|
||||
cli.notice(nick, "You are not the owner.")
|
||||
cli.notice(nick, messages["not_owner"])
|
||||
return
|
||||
|
||||
if var.is_admin(nick, ident, host):
|
||||
@ -188,9 +189,9 @@ class cmd:
|
||||
for command in self.cmds:
|
||||
if command in var.DENY_ACCOUNTS[acc]:
|
||||
if chan == nick:
|
||||
pm(cli, nick, "You do not have permission to use that command.")
|
||||
pm(cli, nick, messages["invalid_permissions"])
|
||||
else:
|
||||
cli.notice(nick, "You do not have permission to use that command.")
|
||||
cli.notice(nick, messages["invalid_permissions"])
|
||||
return
|
||||
|
||||
if acc in var.ALLOW_ACCOUNTS:
|
||||
@ -206,9 +207,9 @@ class cmd:
|
||||
for command in self.cmds:
|
||||
if command in var.DENY[pattern]:
|
||||
if chan == nick:
|
||||
pm(cli, nick, "You do not have permission to use that command.")
|
||||
pm(cli, nick, messages["invalid_permissions"])
|
||||
else:
|
||||
cli.notice(nick, "You do not have permission to use that command.")
|
||||
cli.notice(nick, messages["invalid_permissions"])
|
||||
return
|
||||
|
||||
for pattern in var.ALLOW:
|
||||
@ -221,9 +222,9 @@ class cmd:
|
||||
|
||||
if self.admin_only:
|
||||
if chan == nick:
|
||||
pm(cli, nick, "You are not an admin.")
|
||||
pm(cli, nick, messages["not_an_admin"])
|
||||
else:
|
||||
cli.notice(nick, "You are not an admin.")
|
||||
cli.notice(nick, messages["not_an_admin"])
|
||||
return
|
||||
|
||||
return self.func(*largs)
|
||||
|
144
src/gamemodes.py
144
src/gamemodes.py
@ -1,13 +1,13 @@
|
||||
from collections import OrderedDict
|
||||
|
||||
import random
|
||||
import math
|
||||
import threading
|
||||
from collections import OrderedDict
|
||||
|
||||
import botconfig
|
||||
import src.settings as var
|
||||
from src.utilities import *
|
||||
import botconfig
|
||||
|
||||
from src.messages import messages
|
||||
# utilities imported per Vgr's temporary fix to chk_nightdone(cli) in Sleepy
|
||||
from src import events, utilities
|
||||
|
||||
def game_mode(name, minp, maxp, likelihood = 0):
|
||||
@ -64,13 +64,12 @@ class GameMode:
|
||||
pair, *pairs = pairs[0].split(",", 1)
|
||||
change = pair.lower().replace(":", " ").strip().rsplit(None, 1)
|
||||
if len(change) != 2:
|
||||
raise var.InvalidModeException("Invalid syntax for mode arguments. arg={0}".format(arg))
|
||||
raise var.InvalidModeException(messages["invalid_mode_args"].format(arg))
|
||||
|
||||
key, val = change
|
||||
if key in ("role reveal", "reveal roles"):
|
||||
if val not in ("on", "off", "team"):
|
||||
raise var.InvalidModeException(("Did not recognize value \u0002{0}\u0002 for role reveal. "+
|
||||
"Allowed values: on, off, team").format(val))
|
||||
raise var.InvalidModeException(messages["invalid_reveal"].format(val))
|
||||
self.ROLE_REVEAL = val
|
||||
if val == "off" and not hasattr(self, "STATS_TYPE"):
|
||||
self.STATS_TYPE = "disabled"
|
||||
@ -78,13 +77,11 @@ class GameMode:
|
||||
self.STATS_TYPE = "team"
|
||||
elif key in ("stats type", "stats"):
|
||||
if val not in ("default", "accurate", "team", "disabled"):
|
||||
raise var.InvalidModeException(("Did not recognize value \u0002{0}\u0002 for stats type. "+
|
||||
"Allowed values: default, accurate, team, disabled").format(val))
|
||||
raise var.InvalidModeException(messages["invalid_stats"].format(val))
|
||||
self.STATS_TYPE = val
|
||||
elif key == "abstain":
|
||||
if val not in ("enabled", "restricted", "disabled"):
|
||||
raise var.InvalidModeException(("Did not recognize value \u0002{0}\u0002 for abstain. "+
|
||||
"Allowed values: enabled, restricted, disabled").format(val))
|
||||
raise var.InvalidModeException(messages["invalid_abstain"].format(val))
|
||||
if val == "enabled":
|
||||
self.ABSTAIN_ENABLED = True
|
||||
self.LIMIT_ABSTAIN = False
|
||||
@ -114,9 +111,7 @@ class GameMode:
|
||||
if len(lovers) == lpl:
|
||||
evt.data["winner"] = "lovers"
|
||||
evt.data["additional_winners"] = list(lovers)
|
||||
evt.data["message"] = ("Game over! The remaining villagers through their inseparable "
|
||||
"love for each other have agreed to stop all of this senseless "
|
||||
"violence and coexist in peace forever more. All remaining players win.")
|
||||
evt.data["message"] = messages["lovers_win"]
|
||||
|
||||
@game_mode("roles", minp = 4, maxp = 35)
|
||||
class ChangedRolesMode(GameMode):
|
||||
@ -137,11 +132,11 @@ class ChangedRolesMode(GameMode):
|
||||
pair, *pairs = pairs[0].split(",", 1)
|
||||
change = pair.replace(":", " ").strip().rsplit(None, 1)
|
||||
if len(change) != 2:
|
||||
raise var.InvalidModeException("Invalid syntax for mode roles. arg={0}".format(arg))
|
||||
raise var.InvalidModeException(messages["invalid_mode_roles"].format(arg))
|
||||
role, num = change
|
||||
try:
|
||||
if role.lower() in var.DISABLED_ROLES:
|
||||
raise var.InvalidModeException("The role \u0002{0}\u0002 has been disabled.".format(role))
|
||||
raise var.InvalidModeException(messages["role_disabled"].format(role))
|
||||
elif role.lower() in self.ROLE_GUIDE:
|
||||
self.ROLE_GUIDE[role.lower()] = tuple([int(num)] * len(var.ROLE_INDEX))
|
||||
elif role.lower() == "default" and num.lower() in self.ROLE_GUIDE:
|
||||
@ -150,10 +145,9 @@ class ChangedRolesMode(GameMode):
|
||||
# handled in parent constructor
|
||||
pass
|
||||
else:
|
||||
raise var.InvalidModeException(("The role \u0002{0}\u0002 "+
|
||||
"is not valid.").format(role))
|
||||
raise var.InvalidModeException(messages["specific_invalid_role"].format(role))
|
||||
except ValueError:
|
||||
raise var.InvalidModeException("A bad value was used in mode roles.")
|
||||
raise var.InvalidModeException(messages["bad_role_value"])
|
||||
|
||||
@game_mode("default", minp = 4, maxp = 24, likelihood = 20)
|
||||
class DefaultMode(GameMode):
|
||||
@ -265,30 +259,22 @@ class EvilVillageMode(GameMode):
|
||||
|
||||
if lrealwolves == 0 and lsafes == 0:
|
||||
evt.data["winner"] = "none"
|
||||
evt.data["message"] = ("Game over! All the villagers are dead, but the cult needed to sacrifice " +
|
||||
"the wolves to accomplish that. The cult disperses shortly thereafter, " +
|
||||
"and nobody wins.")
|
||||
evt.data["message"] = messages["evil_no_win"]
|
||||
elif lrealwolves == 0:
|
||||
evt.data["winner"] = "villagers"
|
||||
evt.data["message"] = ("Game over! All the wolves are dead! The villagers " +
|
||||
"round up the remaining cultists, hang them, and live " +
|
||||
"happily ever after.")
|
||||
evt.data["message"] = messages["evil_villager_win"]
|
||||
elif lsafes == 0:
|
||||
evt.data["winner"] = "wolves"
|
||||
evt.data["message"] = ("Game over! All the villagers are dead! The cultists rejoice " +
|
||||
"with their wolf buddies and start plotting to take over the " +
|
||||
"next village.")
|
||||
evt.data["message"] = messages["evil_wolf_win"]
|
||||
elif lcultists == 0:
|
||||
evt.data["winner"] = "villagers"
|
||||
evt.data["message"] = ("Game over! All the cultists are dead! The now-exposed wolves " +
|
||||
"are captured and killed by the remaining villagers. A BBQ party " +
|
||||
"commences shortly thereafter.")
|
||||
elif lsafes >= lpl / 2:
|
||||
evt.data["message"] = messages["evil_cultists_dead"]
|
||||
elif lsafes == lpl / 2:
|
||||
evt.data["winner"] = "villagers"
|
||||
evt.data["message"] = ("Game over! There are {0} villagers {1} cultists. They " +
|
||||
"manage to regain control of the village and dispose of the remaining " +
|
||||
"cultists.").format("more" if lsafes > lpl / 2 else "the same number of",
|
||||
"than" if lsafes > lpl / 2 else "as")
|
||||
evt.data["message"] = messages["evil_villager_tie"]
|
||||
elif lsafes > lpl / 2:
|
||||
evt.data["winner"] = "villagers"
|
||||
evt.data["message"] = messages["evil_more_villagers"]
|
||||
else:
|
||||
try:
|
||||
if evt.data["winner"][0] != "@":
|
||||
@ -667,27 +653,19 @@ class GuardianMode(GameMode):
|
||||
return
|
||||
elif not lguardians and lwolves > lpl / 2:
|
||||
evt.data["winner"] = "wolves"
|
||||
evt.data["message"] = ("Game over! There are more wolves than uninjured villagers. With the ancestral " +
|
||||
"guardians dead, the wolves overpower the defenseless villagers and win.")
|
||||
evt.data["message"] = messages["guardian_wolf_win"]
|
||||
elif not lguardians and lwolves == lpl / 2:
|
||||
evt.data["winner"] = "wolves"
|
||||
evt.data["message"] = ("Game over! There are the same number of wolves as uninjured villagers. With the ancestral " +
|
||||
"guardians dead, the wolves overpower the defenseless villagers and win.")
|
||||
evt.data["message"] = messages["guardian_wolf_tie_no_guards"]
|
||||
elif not lrealwolves and lguardians:
|
||||
evt.data["winner"] = "villagers"
|
||||
evt.data["message"] = ("Game over! All the wolves are dead! The remaining villagers throw a party in honor " +
|
||||
"of the guardian angels that watched over the village, and live happily ever after.")
|
||||
evt.data["message"] = messages["guardian_villager_win"]
|
||||
elif not lrealwolves and not lguardians:
|
||||
evt.data["winner"] = "none"
|
||||
evt.data["message"] = ("Game over! The remaining villagers managed to destroy the wolves, however the guardians " +
|
||||
"that used to watch over the village are nowhere to be found. The village lives on in an " +
|
||||
"uneasy peace, not knowing when they will be destroyed completely now that they are " +
|
||||
"defenseless. Nobody wins.")
|
||||
evt.data["message"] = messages["guardian_lose_no_guards"]
|
||||
elif lwolves == lguardians and lpl - lwolves - lguardians == 0:
|
||||
evt.data["winner"] = "none"
|
||||
evt.data["message"] = ("Game over! The guardians, angered by the loss of everyone they were meant to guard, " +
|
||||
"engage the wolves in battle and mutually assured destruction. After the dust settles " +
|
||||
"the village is completely dead, and nobody wins.")
|
||||
evt.data["message"] = messages["guardian_lose_with_guards"]
|
||||
else:
|
||||
evt.data["winner"] = None
|
||||
|
||||
@ -825,11 +803,8 @@ class SleepyMode(GameMode):
|
||||
if target not in var.list_players():
|
||||
return
|
||||
self.having_nightmare = target
|
||||
pm(cli, self.having_nightmare, ("While walking through the woods, you hear the clopping of hooves behind you. Turning around, " +
|
||||
"you see a large black horse with dark red eyes and flames where its mane and tail would be. " +
|
||||
"After a brief period of time, it starts chasing after you! You think if you can cross the bridge " +
|
||||
"over the nearby river you'll be safe, but your surroundings are almost unrecognizable in this darkness."))
|
||||
pm(cli, self.having_nightmare, 'You can pm me "north", "east", "south", and "west", or their abbreviations "n", "e", "s", and "w" to navigate.')
|
||||
pm(cli, self.having_nightmare, messages["sleepy_nightmare_begin"])
|
||||
pm(cli, self.having_nightmare, messages["sleepy_nightmare_navigate"])
|
||||
self.correct = [None, None, None]
|
||||
self.fake1 = [None, None, None]
|
||||
self.fake2 = [None, None, None]
|
||||
@ -868,38 +843,24 @@ class SleepyMode(GameMode):
|
||||
directions = "north, south, and west"
|
||||
|
||||
if self.step == 0:
|
||||
pm(cli, self.having_nightmare, ("You find yourself deep in the heart of the woods, with imposing trees covering up what little light " +
|
||||
"exists with their dense canopy. The paths here are very twisty, and it's easy to wind up going in " +
|
||||
"circles if one is not careful. Directions are {0}.").format(directions))
|
||||
pm(cli, self.having_nightmare, messages["sleepy_nightmare_0"].format(directions))
|
||||
elif self.step == 1:
|
||||
pm(cli, self.having_nightmare, ("You come across a small creek, the water babbling softly in the night as if nothing is amiss. " +
|
||||
"As you approach, a flock of ravens bathing there disperses into all directions. " +
|
||||
"Directions are {0}.").format(directions))
|
||||
pm(cli, self.having_nightmare, messages["sleepy_nightmare_1"].format(directions))
|
||||
elif self.step == 2:
|
||||
pm(cli, self.having_nightmare, ("The treeline starts thinning and you start feeling fresh air for the first time in a while, you " +
|
||||
"must be getting close to the edge of the woods! Directions are {0}.").format(directions))
|
||||
pm(cli, self.having_nightmare, messages["sleepy_nightmare_2"].format(directions))
|
||||
elif self.step == 3:
|
||||
if "correct" in self.on_path:
|
||||
pm(cli, self.having_nightmare, ("You break clear of the woods and see a roaring river ahead with a rope bridge going over it. " +
|
||||
"You sprint to the bridge with the beast hot on your tail, your adrenaline overcoming your tired " +
|
||||
"legs as you push yourself for one final burst. You make it across the bridge, and not a moment too " +
|
||||
"soon as the sun starts rising up, causing you to wake from your dream in a cold sweat."))
|
||||
pm(cli, self.having_nightmare, messages["sleepy_nightmare_wake"])
|
||||
self.having_nightmare = None
|
||||
utilities.chk_nightdone(cli)
|
||||
elif "fake1" in self.on_path:
|
||||
pm(cli, self.having_nightmare, ("You break clear of the woods and see a roaring river ahead. However, look as you may you are unable " +
|
||||
"to find any means of crossing it. Knowing how expansive the river is, and how fast the beast can chase " +
|
||||
"you if it isn't being slowed down by the foliage, you think it's best to look for the correct side of the " +
|
||||
"woods again by going back in. Cursing your bad luck, you head back into the woods."))
|
||||
pm(cli, self.having_nightmare, messages["sleepy_nightmare_fake_1"])
|
||||
self.step = 0
|
||||
self.on_path = set()
|
||||
self.prev_direction = self.start_direction
|
||||
self.nightmare_step(cli)
|
||||
elif "fake2" in self.on_path:
|
||||
pm(cli, self.having_nightmare, ("You break clear of the woods only to find an expansive plains ahead of you, with no river in sight. " +
|
||||
"You must have found your way out through the wrong side of the woods! Attempting to circle around the " +
|
||||
"woods would result in the beast catching you in short order, so you softly curse at your bad luck as you " +
|
||||
"head back into the woods to find the correct path."))
|
||||
pm(cli, self.having_nightmare, messages["sleepy_nightmare_fake_2"])
|
||||
self.step = 0
|
||||
self.on_path = set()
|
||||
self.prev_direction = self.start_direction
|
||||
@ -909,7 +870,7 @@ class SleepyMode(GameMode):
|
||||
if nick != self.having_nightmare:
|
||||
return
|
||||
if self.prev_direction == "s":
|
||||
pm(cli, nick, "That way lies madness and certain death.")
|
||||
pm(cli, nick, messages["sleepy_nightmare_invalid_direction"])
|
||||
return
|
||||
advance = False
|
||||
if ("correct" in self.on_path or self.step == 0) and self.correct[self.step] == "n":
|
||||
@ -934,14 +895,14 @@ class SleepyMode(GameMode):
|
||||
self.step = 0
|
||||
self.on_path = set()
|
||||
self.prev_direction = self.start_direction
|
||||
pm(cli, self.having_nightmare, "You find yourself back where you started...")
|
||||
pm(cli, self.having_nightmare, messages["sleepy_nightmare_restart"])
|
||||
self.nightmare_step(cli)
|
||||
|
||||
def east(self, cli, nick, chan, rest):
|
||||
if nick != self.having_nightmare:
|
||||
return
|
||||
if self.prev_direction == "w":
|
||||
pm(cli, nick, "That way lies madness and certain death.")
|
||||
pm(cli, nick, messages["sleepy_nightmare_invalid_direction"])
|
||||
return
|
||||
advance = False
|
||||
if ("correct" in self.on_path or self.step == 0) and self.correct[self.step] == "e":
|
||||
@ -966,14 +927,14 @@ class SleepyMode(GameMode):
|
||||
self.step = 0
|
||||
self.on_path = set()
|
||||
self.prev_direction = self.start_direction
|
||||
pm(cli, self.having_nightmare, "You find yourself back where you started...")
|
||||
pm(cli, self.having_nightmare, messages["sleepy_nightmare_restart"])
|
||||
self.nightmare_step(cli)
|
||||
|
||||
def south(self, cli, nick, chan, rest):
|
||||
if nick != self.having_nightmare:
|
||||
return
|
||||
if self.prev_direction == "n":
|
||||
pm(cli, nick, "That way lies madness and certain death.")
|
||||
pm(cli, nick, messages["sleepy_nightmare_invalid_direction"])
|
||||
return
|
||||
advance = False
|
||||
if ("correct" in self.on_path or self.step == 0) and self.correct[self.step] == "s":
|
||||
@ -998,14 +959,14 @@ class SleepyMode(GameMode):
|
||||
self.step = 0
|
||||
self.on_path = set()
|
||||
self.prev_direction = self.start_direction
|
||||
pm(cli, self.having_nightmare, "You find yourself back where you started...")
|
||||
pm(cli, self.having_nightmare, messages["sleepy_nightmare_restart"])
|
||||
self.nightmare_step(cli)
|
||||
|
||||
def west(self, cli, nick, chan, rest):
|
||||
if nick != self.having_nightmare:
|
||||
return
|
||||
if self.prev_direction == "e":
|
||||
pm(cli, nick, "That way lies madness and certain death.")
|
||||
pm(cli, nick, messages["sleepy_nightmare_invalid_direction"])
|
||||
return
|
||||
advance = False
|
||||
if ("correct" in self.on_path or self.step == 0) and self.correct[self.step] == "w":
|
||||
@ -1030,7 +991,7 @@ class SleepyMode(GameMode):
|
||||
self.step = 0
|
||||
self.on_path = set()
|
||||
self.prev_direction = self.start_direction
|
||||
pm(cli, self.having_nightmare, "You find yourself back where you started...")
|
||||
pm(cli, self.having_nightmare, messages["sleepy_nightmare_restart"])
|
||||
self.nightmare_step(cli)
|
||||
|
||||
def prolong_night(self, evt, cli, var):
|
||||
@ -1041,7 +1002,7 @@ class SleepyMode(GameMode):
|
||||
# if True, it means night ended before 1 minute
|
||||
if self.having_nightmare is not None and self.having_nightmare is not True and self.having_nightmare in var.list_players():
|
||||
var.DYING.add(self.having_nightmare)
|
||||
pm(cli, self.having_nightmare, ("As the sun starts rising, your legs give out, causing the beast to descend upon you and snuff out your life."))
|
||||
pm(cli, self.having_nightmare, messages["sleepy_nightmare_death"])
|
||||
|
||||
def happy_fun_times(self, evt, cli, var, nick, nickrole, nicktpls, forced_death, end_game, death_triggers, killer_role, deadlist, original, ismain, refresh_pl):
|
||||
if death_triggers:
|
||||
@ -1051,30 +1012,23 @@ class SleepyMode(GameMode):
|
||||
seers = [p for p in var.ROLES["seer"] if p in pl and random.random() < turn_chance]
|
||||
harlots = [p for p in var.ROLES["harlot"] if p in pl and random.random() < turn_chance]
|
||||
cultists = [p for p in var.ROLES["cultist"] if p in pl and random.random() < turn_chance]
|
||||
cli.msg(botconfig.CHANNEL, ("The sky suddenly darkens as a thunderstorm appears from nowhere. The bell on the newly-abandoned church starts ringing " +
|
||||
"in sinister tones before the building is struck repeatedly by lightning, setting it alight in a raging inferno..."))
|
||||
cli.msg(botconfig.CHANNEL, messages["sleepy_priest_death"])
|
||||
for seer in seers:
|
||||
var.ROLES["seer"].remove(seer)
|
||||
var.ROLES["doomsayer"].add(seer)
|
||||
var.FINAL_ROLES[seer] = "doomsayer"
|
||||
pm(cli, seer, ("You feel something rushing into you and taking control over your mind and body. It causes you to rapidly " +
|
||||
"start transforming into a werewolf, and you realize your vision powers can now be used to inflict malady " +
|
||||
"on the unwary. You are now a \u0002doomsayer\u0002."))
|
||||
relay_wolfchat_command(cli, seer, "\u0002{0}\u0002 is now a \u0002doomsayer\u0002.".format(seer), var.WOLF_ROLES, is_wolf_command=True, is_kill_command=True)
|
||||
pm(cli, seer, messages["sleepy_doomsayer_turn"])
|
||||
relay_wolfchat_command(cli, seer, messages["sleepy_doomsayer_wolfchat"].format(seer), var.WOLF_ROLES, is_wolf_command=True, is_kill_command=True)
|
||||
for harlot in harlots:
|
||||
var.ROLES["harlot"].remove(harlot)
|
||||
var.ROLES["succubus"].add(harlot)
|
||||
var.FINAL_ROLES[harlot] = "succubus"
|
||||
pm(cli, harlot, ("You feel something rushing into you and taking control over your mind and body. You are now a " +
|
||||
"\u0002succubus\u0002. Your job is to entrance the village, bringing them all under your absolute " +
|
||||
"control."))
|
||||
pm(cli, harlot, messages["sleepy_succubus_turn"])
|
||||
for cultist in cultists:
|
||||
var.ROLES["cultist"].remove(cultist)
|
||||
var.ROLES["demoniac"].add(cultist)
|
||||
var.FINAL_ROLES[cultist] = "demoniac"
|
||||
pm(cli, cultist, ("You feel something rushing into you and taking control over your mind and body, showing you your new purpose in life. " +
|
||||
"There are far greater evils than the wolves lurking in the shadows, and by sacrificing all of the wolves, you can " +
|
||||
"unleash those evils upon the world. You are now a \u0002demoniac\u0002."))
|
||||
pm(cli, cultist, messages["sleepy_demoniac_turn"])
|
||||
# NOTE: chk_win is called by del_player, don't need to call it here even though this has a chance of ending game
|
||||
|
||||
# vim: set expandtab:sw=4:ts=4:
|
||||
|
42
src/messages.py
Normal file
42
src/messages.py
Normal file
@ -0,0 +1,42 @@
|
||||
import json
|
||||
import os
|
||||
import src.settings as var
|
||||
|
||||
class Messages:
|
||||
def __init__ (self):
|
||||
self.lang = var.LANGUAGE
|
||||
self._load_messages()
|
||||
# some stuff
|
||||
|
||||
def get(self, key):
|
||||
if not self.messages[key.lower()]:
|
||||
raise KeyError("Key {0!r} does not exist! Add it to messages.json".format(key))
|
||||
return self.messages[key.lower()]
|
||||
|
||||
__getitem__ = get
|
||||
|
||||
def _load_messages(self):
|
||||
MESSAGES_DIR = os.path.join(os.path.dirname(__file__), '..', 'messages')
|
||||
ROOT_DIR = os.path.join(os.path.dirname(__file__), '..')
|
||||
with open(os.path.join(MESSAGES_DIR, self.lang + '.json')) as f:
|
||||
self.messages = json.load(f)
|
||||
|
||||
if not os.path.isfile(os.path.join(ROOT_DIR, 'messages.json')):
|
||||
return
|
||||
with open(os.path.join(ROOT_DIR, 'messages.json')) as f:
|
||||
custom_msgs = json.load(f)
|
||||
|
||||
if not custom_msgs:
|
||||
return
|
||||
|
||||
for key, message in custom_msgs.items():
|
||||
if key in self.messages:
|
||||
if not isinstance(message, type(self.messages[key.lower()])):
|
||||
raise TypeError("messages.json: Key {0!r} must be of type {1!r}".format(key, type(self.messages[key.lower()]).__name__))
|
||||
|
||||
self.messages[key.lower()] = message
|
||||
|
||||
messages = Messages()
|
||||
|
||||
# Because woffle is needy
|
||||
# vim: set expandtab:sw=4:ts=4:
|
@ -5,6 +5,7 @@ from collections import defaultdict, OrderedDict
|
||||
|
||||
import botconfig
|
||||
|
||||
LANGUAGE = 'en'
|
||||
MINIMUM_WAIT = 60
|
||||
EXTRA_WAIT = 30
|
||||
EXTRA_WAIT_JOIN = 0 # Add this many seconds to the waiting time for each !join
|
||||
@ -286,68 +287,6 @@ TEMPLATE_RESTRICTIONS["assassin"] -= {"fallen angel"}
|
||||
# Roles listed here cannot be used in !fgame roles=blah. If they are defined in ROLE_GUIDE they may still be used.
|
||||
DISABLED_ROLES = frozenset()
|
||||
|
||||
NO_VICTIMS_MESSAGES = ("The body of a young penguin pet is found.",
|
||||
"Paw prints are found circling around the village.",
|
||||
"A pool of blood and wolf paw prints are found.",
|
||||
"The body of a slain cat is found.",
|
||||
"Some house doors have been opened, but nothing has changed.",
|
||||
"A scent much like that of a wolf permeates the air.",
|
||||
"Half-buried wolf droppings are found.",
|
||||
"Traces of wolf fur are found.")
|
||||
LYNCH_MESSAGES = ("The villagers, after much debate, finally decide on lynching \u0002{0}\u0002, who turned out to be... a{1} \u0002{2}\u0002.",
|
||||
"After a prolonged struggle, \u0002{0}\u0002 is forced to the gallows, and is discovered after death to be a{1} \u0002{2}\u0002.",
|
||||
"The villagers choose to hang \u0002{0}\u0002; however, the rope stretches and breaks, and the ensuing fall kills the \u0002{2}\u0002.",
|
||||
"The villagers, heavy with the pain of death, reluctantly lynch \u0002{0}\u0002, a{1} \u0002{2}\u0002.",
|
||||
"Compliant with the will of the village, the gallows prove effective in killing \u0002{0}\u0002, a{1} \u0002{2}\u0002.",
|
||||
"Galvanized by fear, the mob puts \u0002{0}\u0002 to death. After inspection, they find that they have killed a{1} \u0002{2}\u0002.",
|
||||
"In a fit of hysteria, the villagers lynch \u0002{0}\u0002, killing a{1} \u0002{2}\u0002.",
|
||||
"Believing their fellow neighbor and friend to be dangerous, the mob puts \u0002{0}\u0002, a{1} \u0002{2}\u0002, to death.",
|
||||
"Under a lot of noise, the pitchfork-bearing villagers lynch \u0002{0}\u0002, who turned out to be... a{1} \u0002{2}\u0002.",
|
||||
"Despite protests, the mob drags their victim to the hanging tree. \u0002{0}\u0002 succumbs to the will of the horde, and is hanged. The villagers have killed a{1} \u0002{2}\u0002.",
|
||||
"Resigned to the inevitable, \u0002{0}\u0002 is led to the gallows. Once the twitching stops, it is discovered that the village lynched a{1} \u0002{2}\u0002.",
|
||||
"Before the rope is pulled, \u0002{0}\u0002, a{1} \u0002{2}\u0002, pulls the pin on a grenade. They hesitate, and it explodes, killing them.",
|
||||
"Before the rope is pulled, \u0002{0}\u0002, a{1} \u0002{2}\u0002, throws a grenade at the mob. The grenade explodes early.")
|
||||
LYNCH_MESSAGES_NO_REVEAL = ("The villagers, after much debate, finally decide on lynching \u0002{0}\u0002.",
|
||||
"After a prolonged struggle, \u0002{0}\u0002 is forced to the gallows.",
|
||||
"The villagers choose to hang \u0002{0}\u0002; however, the rope stretches and breaks, and the ensuing fall kills them.",
|
||||
"The villagers, heavy with the pain of death, reluctantly lynch \u0002{0}\u0002.",
|
||||
"Compliant with the will of the village, the gallows prove effective in killing \u0002{0}\u0002.",
|
||||
"Galvanized by fear, the mob puts \u0002{0}\u0002 to death.",
|
||||
"In a fit of hysteria, the villagers lynch \u0002{0}\u0002.",
|
||||
"Believing their fellow neighbor and friend to be dangerous, the mob puts \u0002{0}\u0002 to death.",
|
||||
"Under a lot of noise, the pitchfork-bearing villagers lynch \u0002{0}\u0002.",
|
||||
"Despite protests, the mob drags their victim to the hanging tree. \u0002{0}\u0002 succumbs to the will of the horde, and is hanged.",
|
||||
"Resigned to the inevitable, \u0002{0}\u0002 is led to the gallows.",
|
||||
"Before the rope is pulled, \u0002{0}\u0002 pulls the pin on a grenade. They hesitate, and it explodes, killing them.",
|
||||
"Before the rope is pulled, \u0002{0}\u0002 throws a grenade at the mob. The grenade explodes early.")
|
||||
QUIT_MESSAGES= ("\u0002{0}\u0002, a{1} \u0002{2}\u0002, suddenly falls over dead before the astonished villagers.",
|
||||
"While wearing a fake pair of antlers, \u0002{0}\u0002, a{1} \u0002{2}\u0002, is shot dead by a hunter.",
|
||||
"Standing under a tree, \u0002{0}\u0002, a{1} \u0002{2}\u0002, is killed by a falling branch.",
|
||||
"\u0002{0}\u0002, a{1} \u0002{2}\u0002, is killed by lightning before the villagers' eyes. The air smells of burnt flesh.",
|
||||
"Rampaging through the village, a bull gores \u0002{0}\u0002, a{1} \u0002{2}\u0002.",
|
||||
"\u0002{0}\u0002, a{1} \u0002{2}\u0002, falls into a vat of molasses and drowns.",
|
||||
"A pack of wild animals sets upon \u0002{0}\u0002. Soon the \u0002{2}\u0002 is only a pile of bones and a lump in the beasts' stomachs.",
|
||||
"\u0002{0}\u0002, a{1} \u0002{2}\u0002, fell off the roof of their house and is now dead.",
|
||||
"\u0002{0}\u0002 is crushed to death by a falling tree. The villagers desperately try to save the \u0002{2}\u0002, but it is too late.",
|
||||
"\u0002{0}\u0002 suddenly bursts into flames and is now all but a memory. The survivors bury the \u0002{2}\u0002's ashes.")
|
||||
QUIT_MESSAGES_NO_REVEAL = ("\u0002{0}\u0002 suddenly falls over dead before the astonished villagers.",
|
||||
"While wearing a fake pair of antlers, \u0002{0}\u0002 is shot dead by a hunter.",
|
||||
"Standing under a tree, \u0002{0}\u0002 is killed by a falling branch.",
|
||||
"\u0002{0}\u0002 is killed by lightning before the villagers' eyes. The air smells of burnt flesh.",
|
||||
"Rampaging through the village, a bull gores \u0002{0}\u0002.",
|
||||
"\u0002{0}\u0002 falls into a vat of molasses and drowns.",
|
||||
"A pack of wild animals sets upon \u0002{0}\u0002. Soon they are only a pile of bones and a lump in the beasts' stomachs.",
|
||||
"\u0002{0}\u0002 fell off the roof of their house and is now dead.",
|
||||
"\u0002{0}\u0002 is crushed to death by a falling tree. The villagers desperately try to save them, but it is too late.",
|
||||
"\u0002{0}\u0002 suddenly bursts into flames and is now all but a memory.")
|
||||
PING_MESSAGES = ("Pong!", "Ping!", "Sure thing.", "No.", "!gniP", "!gnoP", "Segmentation fault", "Segmentation fault (core dumped)",
|
||||
"{0}.exe has stopped working. Windows is checking for a solution to the problem...".format(botconfig.NICK), "HTTP Error 418: I'm a teapot",
|
||||
"An error has pinged and has been ponged.", "I'm here!", "I refuse!", "What?", "Don't you mean \u0002{0}ping\u0002?".format(botconfig.CMD_CHAR),
|
||||
"skynet.exe has stopped working. Windows is checking for a solution to the problem...", "No ping received for 1337 seconds.",
|
||||
"Congratulations! You're the 1337th person to use {0}ping. You win a goat!".format(botconfig.CMD_CHAR), "PING! {nick}",
|
||||
"I'm sorry Dave, I'm afraid I can't do that.", "Give me a ping, Vasily. One ping only, please.")
|
||||
|
||||
|
||||
GIF_CHANCE = 1/50
|
||||
FORTUNE_CHANCE = 1/25
|
||||
|
||||
|
1916
src/wolfgame.py
1916
src/wolfgame.py
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user