Jump to: |
What is a LS? |
Setting up the LS |
Adding an action |
Adding a reverse action |
Adding Conditions |
Using Conditions |
Priority |
Placeholders |
Removing Conditions |
Automatic actions |
Items |
Examples |
You DON'T need to know anything about coding or programming to make a Lore Sheet! General knowledge of how to use an internet browser is a big plus, though. Hey! You're doing that now!
A Lore Sheet (or "LS") is a spreadsheet that gives details of all of the actions that players can do in your game of Mafia. As the name says, it determines what lore should be sent to each player at the end of the round (messages such as "You died" or "Your target was mafia").
Additionally, it determines what each action does - it handles killing, reviving, roleblocking, information, items, locations, and anything else you can think of. There are, of course, things it can't do, and those suggestions should be sent to me.
Sound complicated, amirite? It's really not. Assuming you already know what roles are going to be in your mafia and what each of them does, this process should be super-easy... but it does require a lot of thinking about how different roles interact with each other. If you'd rather spend an hour after each night of your mafia calculating the results manually, this tool might not be for you.
1. Head over to Google Drive using your Google Account and make a new spreadsheet (or "Google Sheet" as they like to call it)
2. You should start with columns A - Z and rows 1 - 1000. Delete all of the columns except ten (so you're left with A - J) and delete about 950 rows.
3. In Row 1, give your columns the following titles, in this order: Group, Desc, Sender, SenderCond, Action, Target, TargetCond, ApplyCond, PrivateLore, PublicLore. Capitalisation isn't important, but you must have all of the titles present.
"Group" and "Desc" aren't actually used by this tool, they just make it easier for you to manage the sheet. So rename them whatever you like or ignore them completely, but don't delete those columns (just leave them "empty" by filling them with a hyphen).
4. Publish the sheet. This means that anyone with the link can view a copy of the sheet, and AutoMafia needs this link to access your LS. On your spreadsheet in Google Sheets, hit "File" > "Publish to the web...". In the dialogue box that pops up, set the first dropdown box to either "Whole document" or the name of the worksheet in which your LS is contained. Set the second dropdown box to "Web page". Then click the big blue "Publish" button. You don't need to do anything else.
5. I lied, you do. Go back to your spreadsheet and copy the URL as it is in the address bar. It should look something like the defaul value for the text box at the top of this page. When you're ready to use this tool, paste that in there and click Validate.
You can format the LS however you like (bold, italics, colours etc). It doesn't matter because AutoMafia will ignore it.
Explanation time! This spreadsheet will basically determine what actions are available for players to use. The player who performs an action ("Sender") on a target ("Target") will recieve a message ("Lore").
So, Column C ("Sender") should contain the role of the player who initiates the action. Column F ("Target") contains the role of the player to whom the action was directed. Column E ("Action") contains the name of the action.
For example, a Godfather might target a Cop using the action "kill", and you might have this setup in columns A to I:
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
---|---|---|---|---|---|---|---|---|
Godfather | kill | Cop | You killed the Cop! |
We should probably tell the Cop that he's died, so we're going to add a reverse of that on row 3.
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
---|---|---|---|---|---|---|---|---|
Godfather | kill | Cop | You killed the Cop! | |||||
Cop | ?kill | Godfather | You died! |
What have we done here? We've reversed the "kill" action by sticking a question mark in front of it. Now it's like a passive action for the Cop - if he is killed, it's like he's performed the action "?kill". This can be read as "killed by".
Great! Now the Cop knows that he's died, and so does the Godfather, and so do you. But the AutoMafia doesn't, so we'll need to declare that the Cop is actually dead now. For this we'll use a fancy thing called Conditions.
Conditions are applied via the "ApplyCond" column. It does what it says on the tin: applies a Condition (abbreviated to "Cond"). It will always be applied to the role in the Sender column, so even if you don't want to tell the dead person that they're dead via the Lore column, you'll still need a "?action".
Bear in mind that a lot of mafias don't send any messages to their players, with the exception of informative roles, so you may wish to leave your Lore column blank.
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
---|---|---|---|---|---|---|---|---|
Godfather | kill | Cop | You killed the Cop! | |||||
Cop | ?kill | Godfather | dead | You died! |
Okay then. But what if the Godfather, or someone else, let's say a Serial Killer, tried to kill this dead Cop?
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
---|---|---|---|---|---|---|---|---|
Godfather | kill | Cop | You killed the Cop! | |||||
Cop | ?kill | Godfather | dead | You died! | ||||
Serial Killer | kill | Cop | dead | He's already dead! |
The TargetCond column is used to detect Conditions on a Target. Similarly, SenderCond is used to detect Conditions on a Sender. For example:
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
---|---|---|---|---|---|---|---|---|
Godfather | kill | Cop | You killed the Cop! | |||||
Cop | ?kill | Godfather | dead | You died! | ||||
Serial Killer | kill | Cop | dead | He's already dead! | ||||
Serial Killer | dead | kill | % | You can't do that, you're dead! |
See? A Serial Killer with the Condition "dead" can't kill, because they are dead. Notice how we used the "%" placeholder to represent "anyone". This can also be used in any of the other columns:
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
---|---|---|---|---|---|---|---|---|
A | Godfather | kill | Cop | You killed the Cop! | ||||
Cop | ?kill | Godfather | dead | You died! | ||||
Serial Killer | kill | Cop | dead | He's already dead! | ||||
Serial Killer | dead | kill | % | You can't do that, you're dead! | ||||
B | % | dead | % | % | You can't do that, you're dead! |
Now, if anyone tries to to anything to anyone while dead, they'll be told that they can't, and nothing will happen.
However! The AutoMafia gets the relevant row by moving downwards through the Lore Sheet. So, if a dead Godfather tries to target a Cop, the Cop will still be killed because the row with Desc A will be picked up before the row with Desc B. The solution is simple - move higher priority rows to the top.
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
---|---|---|---|---|---|---|---|---|
B | % | dead | % | % | You can't do that, you're dead! | |||
A | Godfather | kill | Cop | You killed the Cop! | ||||
Cop | ?kill | Godfather | dead | You died! | ||||
Serial Killer | kill | Cop | dead | He's already dead! | ||||
Serial Killer | dead | kill | % | You can't do that, you're dead! |
Now a dead player will never be able to do anything... which is probably intentional.
Here's a cleaned-up version of our current table:
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
---|---|---|---|---|---|---|---|---|
block | roleblock the dead | % | dead | % | % | You can't do that, you're dead! | ||
role | template for murder | % | kill | % | You killed the $tROLE1! | |||
role | template for being murdered | % | ?kill | % | dead | You died! You were killed by the $tROLE1! | ||
role | can't kill a dead guy | % | kill | % | dead | $tROLE1's already dead! | ||
role | Cop investigates GF | Cop | investigate | Godfather | $tNAME is clearly innocent! | |||
role | Cop investigates mafia | Cop | investigate | % | mafia | $tNAME is clearly mafia! | ||
role | Cop investigates town | Cop | investigate | % | $tNAME is clearly innocent! |
Woah, what's happening here?
For a start, both of the killers have been merged - now it's not "SK kills Cop", it's "anyone kills anyone".
The Cop's investigation action has been added! If he investigates someone with the "mafia" Condition, his report will show that! However, the Godfather will appear to be innocent, and has the highest priority! (However, the killers have an even higher priority than that and will be processed before the Cop's actions, so if he is killed then he'll never get a chance to investigate)
Look! More placeholders! These are in addition to "%" and "@".
Placeholder | What it is replaced with |
$tROLE1 | The name of the target's role, eg Cop, Godfather. |
$sROLE1 | The name of the sender's role. |
$tNAME | The actual name of the target - eg Kent_Clark-101 or some other username. |
$sNAME | The actual name of the sender. |
$sLOC | The sender's location. Not used in games without Locations. |
$COLON | Inserts a colon character ":", because using real colons makes errors. |
Notice how the Cop uses $tNAME instead of $tROLE1. We don't want the Cop to find out players' roles, only their alignments!
Don't worry about including the $ symbol in your lore normally - the Automafia will only parse the listed placeholders. Everything else is left alone.
Once a Condition is applied it lasts forever. Make a player dead, they stay dead. But what if you need to remove a Condition? Say, for example, you have a Reviver role who can revive dead players. You'll need to remove that pesky "dead" Condition.
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
---|---|---|---|---|---|---|---|---|
% | dead | ?revives | Reviver | -dead | You have been revived! | |||
% | dead | % | % | You can't do that, you're dead! |
A dead player is targeted by the Reviver with the action "revives", and is no longer dead (the "dead" Condition has been removed). Because this action is used on a dead player, it should be a higher priority in the LS than the bit that says that no one can target dead players.
So, we've removed the "dead" Condition by declaring the Condition to be applied as "-dead". So, negative dead instead of regular dead. Does that make sense? Hopefully it does.
1 + -1 = 0, so dead + -dead = not dead. Logic!
Here's a Condition that we'll call "roleblocked". It means that a player can't use their action - so it's similar to being dead, really. However, the fun thing about being roleblocked is that it only lasts for one night, not forever.
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
---|---|---|---|---|---|---|---|---|
% | roleblocked | % | % | |||||
Hooker | distracts | % | You use your collection of hooks on $tNAME. They are distracted. | |||||
% | ?distracts | Hooker | roleblocked | You've been distracted! |
A Hooker is a role with an extremely interesting collection of hooks which can distract anyone to whom she shows it. Feel free to make your own game less politically correct.
The Hooker uses her "distracts" action on a target. The target gets the Condition "roleblocked". If a player with the Condition "roleblocked" attempts to perform any action, nothing will happen, and they will receive no notification.
That's all well and good, but that means this player won't be able to do anything ever again. So we need to get rid of it.
However, Conditions can only be added or removed as part of an action... so we need to make an action.
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
---|---|---|---|---|---|---|---|---|
% | roleblocked | @ | -roleblocked | |||||
% | roleblocked | % | % | |||||
Hooker | distracts | % | You use your collection of hooks on $tNAME. They are distracted. | |||||
% | ?distracts | Hooker | roleblocked | You've been distracted! |
Ooh, a new placeholder! You may have seen it mentioned just before the table of placeholders up above. The "@" symbol defines an automatic action - an action that will always occur and doesn't require a Sender to instigate it. Automatic actions take effect for all players, though in this case it will only make a difference to players with the "roleblocked" Condition.
The Automafia will ALWAYS parse automatic actions before any other - this means two things. First, it means that the Conditions are removed not at the end of the night in which they are applied, but at the start of the next. Second, it doesn't matter where you put it in your spreadsheet. Put it at the bottom if you want, or right in the middle (though I have no clue why you'd want to do that).
You should (usually) have at least one automatic rule for each Condition you have in your Mafia game, with the exception of permanent Conditions like "dead" and "isMafia".
Some Mafia hosts just love putting items in their games! They often have a wide variety of effects, which (hopefully) can be simulated via careful Condition manipulation. Here's me adding an item to my sheet:
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
---|---|---|---|---|---|---|---|---|
Shopkeeper | sells to | % | You gave Food to $tNAME! | |||||
% | ?sells to | Shopkeeper | hasFood | You've been given Food! | ||||
% | hasFood | eats | -hasFood | Mmm! Yummy! |
The item is Food! A player with the Condition "hasFood" has Food. Simple as that. They get the Food by having the Shopkeeper "sells to" them.
Eating the food via the action "eats" removes the "hasFood" Condition. Only a player who currently hasFood can perform this action.
In this example, Food does nothing except produces a silly message. However, with more rules, you could manipulate it such that eating Food could defend you from being killed, or something else entirely. It's up to you.
Note the lack of an automatic rule to get rid of food. Food stays with you forever, seemingly.
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
A | % | healed | ?kills | % | ||||
% | ?heals | Doctor | healed | You have been healed! | ||||
B | % | ?kills | % | dead | ||||
% | healed | @ | -healed |
It's the Doctor! The Doctor gives his target the "healed" Condition, meaning that an action that would normally kill them will not. Note the differences between row A and row B.
There's also an "@ rule" or "automatic rule" that removes the healed Condition at the start of the next round.
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
% | roleblocked | % | % | |||||
% | ?jails | Jailor | heal roleblocked | You have been jailed! |
A Jailor places their target in jail - they're immune to attack, but can't use any actions.
Group | Desc | Sender | SenderCond | Action | Target | TargetCond | ApplyCond | Lore |
% | hasDiary1 | giveDiary1 | % | -hasDiary1 | You gave the Diary to $tNAME. | |||
% | ?giveDiary1 | % | hasDiary1 | hasDiary1 | You've been given a Diary! | |||
% | hasDiary2 | giveDiary2 | % | -hasDiary2 | You gave the Diary to $tNAME. | |||
% | ?giveDiary2 | % | hasDiary2 | hasDiary2 | You've been given a Diary! |
A Diary item that gets passed from player to player. The host will have to fill in the contents of the Diary manually.
This assumes that one player starts with the Diary item. "Diary#" is used to distinguish between different Diaries in a game.