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

What is a "Lore Sheet" and why do I need one?

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.

Setting up the sheet

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.

Setting up an action

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!

Setting up a reverse action

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".

Adding Conditions

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!

Using Conditions

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.

Priority

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.

Placeholders

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.

Removing Conditions

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!

Automatic actions

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".

Items

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.

Some more examples

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.