Not if I want to use the same function I have been using. I'd have to copy it and add some exceptions only to check for dummy roles, which is too much work for something that will rarely be used.
Minor update. If a theme has more than 13 roles on its role listing, it will bypass "nonpeak": true and the server will see it as a full theme. This means nonpeaks are only allowed between 3 and 13 players, though the preferred cut off is around 12.
It would be cool if it was like that and if we can use the command /vote to vote just to the number ("/vote 4" would stand for "/vote Marvel", in the example above)
There is mechanism of which i would like some extra explanation. From what i understand if a role with "charges" converts into a role without this quality inside their command they will inherit "charges" from the previous role. So i wanted to know if i this inheritance applies to "recharge" and "initilRecharge" too. Oh another question, can i use "winifdeadRoles" to make a role unable to win until some roles are alive? Or it will make the player simply win when those roles are eliminated?
Both charges and recharges, either for night and standby actions, are kept even if the player converts to another role. initialrecharge is the same as recharge, so it's kept as well. winIfDeadRoles can't be used to prevent someone from winning. It only adds another win condition to that role (win if those roles are dead), it doesn't modify or remove the default win condition.
Only for night actions. It shouldn't be hard to implement for standby actions though, since charges were easier to code for day actions too.
I want to report a bug. In my Fantasy theme there is a mafia role Naga: Spoiler { "role": "naga", "translation": "Naga", "side": "thenaga", "info": "Can poison (Shared) any creature during the night without being detected by spies, the target dies automatically from this poison. Revenge-poisons when killed during the night. Knows the Lamia(s). Vote counts as 1.5. Sided with itself.", "actions": { "vote": 1.5, "startup": { "revealRole": [ "spy" ] }, "avoidHax": [ "poison" ], "kill": { "mode": "poisonattacker", "msg": "You have won an intense fight against the Naga, but you cannot enjoy your victory because her deadly poison will kill you in about 1 day!", "poisonDeadMessage": "You succumbed to Naga's deadly venom!" }, "night": { "poison": { "target": "AnyButSelf", "common": "Team", "priority": 35, "count": 0, "broadcast": "team", "broadcastmsg": "±Game: You are going to assault ~Target~.", "msg": "Ssssss... You were bitten and died instantly!" } } } } and an Inspector role, Pegasus: Spoiler { "role": "inspector", "translation": "Pegasus", "side": "village", "info": "Can expose one creature during the standby. Vote counts as 1.5. Sided with Peaceful Beings.", "actions": { "vote": 1.5, "standby": { "expose": { "target": "AnyButSelf", "msg": "You can type /expose [name] to reveal someone's role! (You will not be revealed)", "exposemsg": "While the Pegasus was flying nearby he identified ~Target~ as the ~Role~!" } } } } BUG: The Naga has an insta-kill /poison, but Pegasus gets poisoned for 1 day instead of dieing immediately.
Is there a command to make an inspector inspect randomly, like /randinspect [yourname]? If there's already one, Im too lazt to check...maybe...I think..nah
I am not sure what do you want precisely. If you mean to use an /inspect that reveal a random player without targetting someone, the answer is no. But i think that you could simulate such thing with a massconvert that randomly convert one player into the role that that player already is so that the converting message reveals to you what role that player is, the only problem is that any role that happear multiple times will need to have an extra copy of himself for any player that will have it otherwise this /inspect would reveal all the common villagers if his random ability converts the common villager. For exemple if your theme has 3 villagers: you should have 3 identical roles with the only difference into their code name after "role": "", something like "role": "villager1", "role":"villager2", "role": "villager3". Anyway if you will use such method i suggest you to use the variables to make the code shorter and easier to modify into the future.
you can make an inspector that inspects all roles truly randomly using ["convert", "curse", "inspect"] in that order
Lots of new features :3 Stalk was changed: Previously, stalk would show who your target visited regardless of priority. Now stalk will only show players visited before your stalk action. Distracted players will still show as having visited the players they did before they got distracted, but no one else after that. This means that if you want a stalker to know everyone that their target visited, you must have stalk as one of the actions with the slowest priority. Watch (Night action): Similar to Stalk, it shows who visited your target, but only the first person to do so. As with stalk, Watch is an action that works on dead players. Code (text): "night": { "watch": { "common": "Self", "target": "AnyButSelf", "priority": 40, "watchmsg": "Your target (~Target~) was visited by ~Visit~ this night!" } } "watchmsg" is optional. ~Target~ will be the name of the person you are watching, while ~Visit~ will be the first person to have visited your target during that night. For both Stalk and Watch is recommended that those actions have low priority. noFollow: It's a property available for any night action. Actions with "No Follow" set to 'true' will not be detected by Stalk or Watch (other actions by the same player without No Follow will still be detected). Code (text): "night": { "kill": { "common": "Self", "target": "AnyButSelf", "priority": 40, "noFollow": true } } userMustBeVisited/targetMustBeVisited: Those properties are available for any night action. If userMustBeVisited/targetMustBeVisited is set to true, that night action will only work if the user/target was visited by someone else earlier during that same night. If it's set to false, the action will only work if the user/target was not visited by no one else during the night. The code below will make a kill action that only works if you had no guests at your home (AKA no one visited you at that night before you executed your action). Code (text): "night": { "kill": { "common": "Self", "target": "AnyButSelf", "priority": 40, "userMustBeVisited": false } } When an action fails due to userMustBeVisited/targetMustBeVisited, the user will receive a "Your kill didn't work because your ~Target~ was (not) visited during the night!" message. Note that targetMustBeVisited will not work very well for shared actions, with the possibility of the action failing for one the users that share the action, but working for the other one (userMustBeVisited will not suffer from this issue). userMustVisit/targetMustVisit: Those properties are available for any night action. Similar to the above, userMustBeVisited/targetMustBeVisited will define if a night action works or not according to the user/target visiting someone else. If set to true, the action will only work if user/target have visited someone earlier during that night. If set to false, the action will only work if the user/target stayed at home until you came to visit them. The code below will make a kill action that only works if find your target is outside instead of on their home (AKA target used some action on someone else during that night). Code (text): "night": { "kill": { "common": "Self", "target": "AnyButSelf", "priority": 40, "targetMustVisit": true } } When an action fails due to userMustVisit/targetMustVisit, the user will receive a "Your kill didn't work because your ~Target~ was (not) visiting someone else during the night!" message. Note that userMustVisit will not count the own action that has that attribute. A possible use is to make an action that only works if you used another action during the night (e.g.: A kill that only works if you used a distract at the same night). As with targetMustBeVisited, userMustVisit may have some problems with shared actions. evadeCharges for Standby Actions: evadeCharges now work for daykill and expose. It's the same as for night actions. Code (text): "actions": { "daykill": { "mode": { "evadeCharges": 2 } } } Also note that it's now possible to set "evadeCharges": "*" (both for night and day actions). With that, your role will still be able to evade, but will retain the evadesCharges from the previous role (instead of resetting the evadeCharge during the conversion). lynch.convertVoters: Similar to lynch.killVoters, this action will instead convert the players who voted the lynched person. The code below will convert the first and the last person to vote for the lynched player. If the converted player is an 'human' or 'kid', they become a 'werewolf'; if they are 'mafia1' or 'mafia2', they become 'godfather'. Code (text): "lynch": { "convertVoters": { "first": 1, "last": 1, "newRole": { "godfather": ["mafia1", "mafia2"], "werewolf": ["human", "kid"] }, "message": "~Target~ transformed for having voted for ~Self~!" } } 'newRole' is mandatory, and it follows the same syntax for the convert night action. If a role that should be converted by lynch.convertVoters is not found on 'newRole', they will simply keep their current role (I may add a property to define a default role someday). 'first' is optional and will default to 1. 'last' is optional and will default to 0. 'message' is optional and will default to the message used in the example above. ~Target~ will be replaced by the names of the players affected by this effect, while ~Self~ will be the lynched player's name. And finally... Packaged Spawns: Yes, it's finally here. It's now possible to define a random set of roles to spawn. The code below sets two packs: One to define the bad guys (3x WW / 2 IM + 1 DIM / 2 FCM + 1DFCM), and other to define the PRs that will spawn. Code (text): "spawnPacks": { "baddies": { "roles": [ ["werewolf"], ["mafia2", "mafia2", "mafiaboss2"], ["mafia1", "mafia1", "mafiaboss1"] ], "chance": [ 0.2, 0.3, 0.5 ] }, "PRs": { "roles": [ ["bodyguard", "hooker", "spy"], ["neighbour", "inspector"] ], "chance": [ 0.5, 0.5 ] } }, "roles1": [ "pack:PRs", "pack:baddies", "pack:PRs", "pack:baddies", "villager", "villager", "villager", "pack:PRs", "villager", "pack:baddies", "villager" ] "spawnPacks" can hold any number of packs you need. "roles" is an Array that stores any number of arrays. Those inner arrays then define the order in which roles will spawn when that pack is used. "chance" is the chance of each of those lists will be used. For example, on the "baddies" pack, there's a 20% chance of using the list 1 (Werewolf), 30% chance of using the list 2 (Mafia 2 + Mafia Boss 2) and 50% chance of using the list 3 (Mafia 1 and Mafia Boss 1). Note that the number of items under "roles" and "chance" must be the same. To actually use the packages, you must use "pack:PackageName" on the spawn list. On the example above, the first role to spawn will be picked from the 'PRs' pack. Once a list is chosen for a pack, the same list will be used for any other role that spawns from the same pack. On the example above, the "PRs" pack appears on slots 1, 3 and 8 of "roles1". That means those slots will be either [1: Bodyguard / 3: Hooker / 8: Spy] or [1: Neighbour / 3: Inspector / 8: Neighbour]. Note that the line "Players: 10-15 Players" that appears on /roles will not consider roles that spawn through Packaged Spawns (so you may need to write that line manually).
any way to add "count" for watch to check for multiples? other than that I love and have been wanting these additions ty rice
For now, there are no options for watch other than the watchmsg, but adding stuff like a count or the last instead of the first is simple. Stuff like "only watch for kills" would be more complicated. BTW, simply "count" would conflict with poison's count.
Nice Update Kirby. I have a question: what happens when a pack gets used more then the number of roles that are inserted into their lists? Does the pack restart from the begin the choosen list or will repeat the last role on the list?
Question, if a role has their own name inside their onDeadroles list, will they be unable to convert or if all the other roles with the same name disappear they will still be able to convert?
onDeadRoles makes no exception for the own player with that ability, so yes, they will be unable to convert. But that could be easily changed, as there's no point in having it block the ability.
I have a conspirator that can win with villager or mafia, but I don't want the game to auto-end in favor of mafia when the village could still win with conspirator's help. Adding the conspirator to the VCLR will make it work?? (altough it is not on village side)
No, merely adding to VCLR will make it make mafia completely unable to win while that role is alive (even if there's only Mafia and Conspirator alive). What you need to do is to make 2 forms of that role: the first one will win with anyone, be on VCLR and use onDeadRoles to convert into another form not on VCLR when all village roles are dead. BTW, although that it's possible, it kind of defeats the purpose of the conspirator.
I was wondering, i have 2 roles that share a /protect ability but this protect has "target": " OnlySelf" . Will each one of them protect themselves or will they protect together the last one that typed /protect that night?
For chance, can there be something added to make it automatically be equally weighted per number of packs? Possibly * or "*"?
All objects that use the syntax "random": { "chance1": 0.5, "chance2": 0.5 } to choose a random element already use relative chances. This means you could easily have "random": { "chance1": 2, "chance2": 1 } if you want "chance1 has twice the probability of being chosen than chance2". If you set all values to the same number, it will means they have the same chance of being chosen.
Er, I meant for packaged spawn's chance. Instead of having to write "chance": [1,1,1,1,1,1] for equal chance per pack, something like "chance": "*"
Too much trouble for too little gain. 99% of the themes will have at most 5 or 6 packs. If you use that several times in your theme and with the same number of items, you can always use variables.
Variables don't work if every line has to be edited. I think I'm looking at a couple thousand spawn packs and all the 1s are annoying. Luckily, Notepad makes counting simpler. spawnPack 'main12' must have the same number of lists and values under 'roles' and 'chance'. Although not much if I don't get it right.
I AM REPOSTING THE OPENING POST HERE BECAUSE THE SPOILER TAGS THERE Makes it difficult to read it after the change of forum Since my old guide sucks i'm rewriting it to make it more professional, better, and include all the new stuff. Anyway, welcome to my guide about how to make mafia themes. I hope this helps you, and if you still have any questions come to #Project Mafia on the server and people there will be glad to help. You can PM me too if you want. When making a theme i suggest you edit a different theme to create the backbone for yours, but make sure you aren't copying theirs. Default is a good start for most. When making themes, i suggest using Notepad++, which can be found here. It's a great program and really makes making themes easier. Themes used as reference~ Default Pokemon (by Cake) Rotom (by IceKirby) FF (by Deria) ~~~ The first step when making a team is obviously choosing what you want your theme to be about. The best things would be stuff that you know about a lot. For example, since my name is Hobbes2 you can kinda guess that i'm a big fan of Calvin and Hobbes so it would be easy to make a theme for it. Make sure your theme hasn't been done already by typing /themeinfo in the Mafia channel (this will bring up a list of every theme) Starting your Theme The first step when making your theme is, obviously, setting the name. This is quite simple. Code (text): "name": "Pokemon", Self explanatory; set the name of your theme there. Something to notice is that almost everything is surrounded by quotations; if you look at the theme i linked, most words and phrases are surrounded by quotations so don't forget those. Code (text): "author": "Cake", Put your name here. It will show up in the /themeinfo list. Cake made the theme so her name is there. If you have multiple authors, do this ~ Code (text): "author": [ "Cake" "Phoenix Down" ], That's called an Array, when you have multiple things like that. When you want to update the theme, ONLY THE NAMES IN THE AUTHOR LIST will be allowed to update so add your alts in there, not just your main. Code (text): "summary": "The legendaries are not your friends...except Celebi. Fight against first rogue Bidoof and the malevolent Missingno, then the Regi and the Eon Mafia! ...", There is part of the summary. For this part, put a description of the theme, perhaps putting in the roles, teams, etc. People who don't know a theme will read this part to understand it better, so don't be vague, but don't write an essay either. This goes below the author and theme name. Teams The teams are the sides in the mafia game. To find out the sides of the theme you are playing, type /sides. Spoiler (17:57:22) ±Side: The Conspirator consists of Conspirator. (17:57:22) ±Side: The French Canadian Mafia consists of Don French Canadian Mafia, French Canadian Conspirator, French Canadian Mafia. (17:57:22) ±Side: The Godfather consists of Godfather. (17:57:22) ±Side: The Good people consists of Bodyguard, Bomb, Inspector, Mayor, Miller, Miller, Miller, Miller, Pretty Lady, Samurai, Spy, Vigilante, Villager. (17:57:22) ±Side: The Italian Mafia consists of Don Italian Mafia, Italian Conspirator, Italian Mafia. (17:57:22) ±Side: The Mafia consists of Mafia. (17:57:22) ±Side: The WereWolf consists of WereWolf. These are the sides of default. Setting the sides in your theme is a fairly simple process. Spoiler Code (text): "sides": [ { "side": "village", "translation": "Treasure Town", "winmsg": "Treasure Town was saved by the hard-working actions of the residents, ~Players~, who continue to live a happy life in the town to this day." }, { "side": "bidoof", "translation": "Bidoof Army", "winmsg": "Before long, the Bidoof Army (~Players~) had taken over, making all the other Pokemon their servants..." }, { "side": "glitch", "translation": "Missingno", "winmsg": "No one could stop the corruption of ~Players~ and the game file was lost to Missingno!" }, { "side": "regi", "translation": "Regi Mafia", "winmsg": "The Regis, ~Players~, rebuilt the world in their own way, leaving no room for pesky invaders like the Treasure Town!" }, { "side": "eon", "translation": "Eon Mafia", "winmsg": "Latias is red, Latios is blue, Cresselia is pastel and they (~Players~) defeated you!" }, { "side": "arceus", "translation": "Arceus", "winmsg": "Arceus (~Players~) began to remake the world, purifying it of all the 'bad' presences it had to defeat to recreate it!" }, { "side": "mewtwo", "translation": "Psychic Felines", "winmsg": "Mewhahaha! The Psychic Felines, ~Players~, defeated all opposition, and began to make the world how it used to be." }, { "side": "deoxys", "translation": "Deoxys", "winmsg": "Having won the battle, Deoxys (~Players~) destroyed the world, getting its revenge on Arceus!" }, { "side": "counter", "translation": "Wobbuffet", "winmsg": "WOBBA! The Wobbuffet (~Players~) knocked everyone out with Counter and Mirror Coat!" }, { "side": "dragon", "translation": "Creation Trio", "winmsg": "The dragons of creation (~Players~) took control of the world!" }, { "side": "wish", "translation": "Wishmaker", "winmsg": "Uwaaaah... ~Players~, Jirachi, defeated the distractions and was able to sleep in peace..." }, { "side": "credits", "translation": "Credits", "winmsg": "So I heard you like reading my coding?" }, { "side": "cat", "translation": "Legendary Beasts", "winmsg": "~Players~, the Legendary Beasts, have the world free to roam as they wish!" } ], I'll take a look at one of the sides specifally, that being the village. Code (text): { "side": "village", "translation": "Treasure Town", "winmsg": "Treasure Town was saved by the hard-working actions of the residents, ~Players~, who continue to live a happy life in the town to this day." }, It starts off with the "{", then begins by you declaring the side's codename. The codename (a term i made up) is the name of the side (or role) in the coding. It will not be represented when playing, but is an easier way to represent the side or role in the theme's code. (I'm explaining bad lol, but you'll understand it if you don't) If your side is something like "Trolls", a good codename would be "troll". You'll see why codenames are important later. The "translation" is what the player sees in the game. The side in Pokemon isn't called village when playing, its called Treasure Town. Make sure you don't forget this. To finish off, the "winmsg" is the message at the end of the game if the side wins. ~Players~ is replaced by a list of the players, seperated by comma. When adding a new side to the list, add a comma after the closing bracket, then enter, then start the new side. Looking at the code from Pokemon, you can see clearly what i mean. When ending off the list, Code (text): { "side": "credits", "translation": "Credits", "winmsg": "So I heard you like reading my coding?" }, <--- { "side": "cat", "translation": "Legendary Beasts", "winmsg": "~Players~, the Legendary Beasts, have the world free to roam as they wish!" } <--- ], The comma placements are a common cause of syntax errors. Notice that the areas where i pointed to; the regular ones do have a comma, but the last one doesn't. That's all for sides, make sure your commas and everything are in the right place! This goes for the whole theme too, finding syntax errors is annoying and make sure your theme is correct as you're doing it. The Role The roles is where you define what your role is and what it does. This is the longest part and most painstaking part of making your theme. I'm going to put the role "Feebas" as my example here and explain each part indivdually Code (text): { "role": "ugly", "translation": "Feebas", "side": "village", "help": "Feebas are ugly. Eat more Pokeblocks! But at least you can stop a Pokemon acting (and hope they don't laugh) with /distract if you must.", "info": "An ugly distractor. Sided with the Treasure Town.", "actions": { "night": { "distract": { "target": "AnyButSelf", "common": "Self", "priority": 1, "distractmsg": "Feebas distracted you...xD You laughed at it all night!", "teammsg": "Feebas distracted your partner, who was too busy laughing to team up with you and perform your ~Action~ xD" } } } }, Code (text): { Starting up. Code (text): "role": "ugly", Define the codename for the roles (yes, roles have those too) Code (text): "side": "village", Define the side for the role (USE THE CODENAME OF THE SIDE, NOT THE TRANSLATION) Code (text): "help": "Feebas are ugly. Eat more Pokeblocks! But at least you can stop a Pokemon acting (and hope they don't laugh) with /distract if you must.", This is the startup help message the person gets. Make sure you describe the role, commands, and if you want add a little flavor (as Cake has done). Code (text): "info": "An ugly distractor. Sided with the Treasure Town.", Relatively new, this is a custom message for /roles. Keep it short and sweet. Code (text): "actions": { "night": { "distract": { "target": "AnyButSelf", "common": "Self", "priority": 1, "distractmsg": "Feebas distracted you...xD You laughed at it all night!", "teammsg": "Feebas distracted your partner, who was too busy laughing to team up with you and perform your ~Action~ xD" } } } The longest and most tedious part to write, the action. This will define what your role does. I will go more in depth in the next few sections, so i won't say much here. Code (text): }, Close it off! The Action - Basics You know the action is important as its getting multiple sections. It is best to plan out all the roles and actions beforehand, as, trust me, it'll be a load of help. This section will have what are considered the BASIC actions. ~~~ Distract - Prevents the target from doing their night command. Code (text): "actions": { "night": { "distract": { "target": "AnyButSelf", "common": "Self", "priority": 1, "distractmsg": "Feebas distracted you...xD You laughed at it all night!", "teammsg": "Feebas distracted your partner, who was too busy laughing to team up with you and perform your ~Action~ xD" } } } The distract is a "night" command, (obviously), and generally targets AnyButSelf (meaning you can't hit yourself but you can anyone else, though if the role knows its teammates, set it to AnyButTeam (meaning you can't hit yourself or your teammates). They also tend to be "common": "Self", which means that the roles command is shared only with the user. "Common": "team" means the command is shared with the team (ex - mafia in default; even if there are 4 mafia they all share one kill), and "common": "role" means everyone with the role shares the command. "priority" is the time the action hits over others. The lower the priority (1, 2, 3), that means they hit first. Distract tends to hit first as it STOPS the other roles from doing their role. "distractmsg" is what the distracted user sees. Cake decided to make hers flavory, though if you want you can leave it out to keep the default message. "teammsg" is what the roles teammates see, and again Cake decided to go flavory but you can leave it out if you want the default. Just something for actions in general, make sure the opening "{" 's match the closing "}" in number. Protect - Blocking a kill. Does not block Poison. Since cake doesn't have a clear protecter i'll use default's Code (text): "actions": { "night": { "protect": { "target": "AnyButSelf", "common": "Role", "priority": 5, "broadcast": "role" } }, "startup": "role-reveal" } The bodyguard, one of the most important roles. Prevents nightkills on the target, generally used on samurai or insp. These tend to be "Anybutself", though if you want it to be able to also protect yourself, remove that line entirely. To only protect yourself, it would just be "target": "onlyself". These tend to also have a fast priority as to protect against the killing roles. "broadcast": "role" means the game tells the BG who the other BG's are, if there are multiple. Finally, "startup": "role-reveal" reveals to the player upon starting of the game all the others with their role. replacing it with "team-reveal" would reveal the entire team. Kill - The act of eliminating a player during the night. Code (text): "actions": { "night": { "kill": { "target": "AnyButTeam", "common": "Team", "priority": 12, "broadcast": "team" } }, "startup": "team-reveal" } The kill. The kill is a role that generally makes up the "Mafia" of the theme. It happens during the "Night" (obviously), and if the player DOES know their team, it would be AnyButTeam (to prevent teamkills.) If the killer does not know their team it would generally be anybutself. If the role is to share a kill, "common": "team" means only one kill per night for that team. The priority of a killer should be preplanned so you don't get any mix ups. Some killers should be faster than others, naturally. Right after "priority", "limit": # can be added which specifies how many kills the role gets. Godfather, for example, would be "limit": 2 (two kills) Inspect - Allows you to figure out the role of the target Code (text): "actions": { "night": { "inspect": { "target": "AnyButSelf", "common": "Self", "priority": 30 } } } Inspectors are "night": commands, and they generally target any but self. They tend to act last as well. Stalk - Allows you to see who the target visited Code (text): "actions": { "night": { "stalk": { "target": "AnyButSelf", "common": "Self", "priority": 31 } } } Similar to inspector, tend to hit last. isn't in default so i just wrote that up. Be creative with it! Poison - A time bomb version of kill Code (text): "actions": { "night": { "poison": { "target": "AnyButSelf", "common": "Role", "priority": 40, "broadcast": "none", "limit": 99, "count": 8 Not closed, but this poison role is a good example of all the attributes it gets. They generally hit at the night and hit last, as when it hits doesn't matter. "limit": is as with kill, how many poisons you get, and "count": is how long it takes for the role to die. (amount of days) Safeguard - Blocks poison, distract, and inspect. Code (text): "safeguard": { "target": "AnyButSelf", "common": "Self", "priority": 2, "broadcast": "none" Doesn't have surrounding code but w/e. Its a nightcommand that hits near protect prioritywise. Very similar to protect except for what it does. Well that should be everything. Those are all the main night commands and what they do. The next section will feature a dictionary of attributes and stuff. Convert - Turns either yourself or a target into a different role. Code (text): "actions": { "night": { "heat": { "command": "convert", "target": "OnlySelf", "common": "Self", "priority": 1, "newRole": "fire", "canConvert": [ "rotom" ], "silent": true }, This is the most complex of all the commands, the convert. Its relatively new, which is why it wasn't on the old guide. I've been putting off adding it because lazy, but i realized the whole guide is out of date which is why i'm updating it anyway. on to convert, its an interesting command as it has many possibilities. You can convert other roles, though only once (generally for balance), or you can upgrade yourself to be stronger, but this all depends on the theme. To customize, your convert command, there are several different things. The first off is do you want it to be an upgrade or a convert something else. For this, you'd set in the "target". To upgrade, you'd do "target": "OnlySelf" which is self explanatory. For others, you'd do "target": "anybutself" or "anybutteam", which are also self explanatory. Next up is newrole. Following "newrole": you set the codename of the role the target is changing to. inside of "canconvert", you'd put an Array which is basically different things seperated by commans (in this case being the targets of the canconvert). Canconvert basically means what you are able to convert (if you want to be able to hit everything, leave it out) To explain this better, i'll provide an example. Say you want to only be able to target the roles "john", "rice", and "cookies". In this case, the code would look like, Code (text): "canConvert": [ "john", "rice", "cookies", ], as it can only hit those roles. New role is simple; it's the new role for the target. "silent":, if true, means that everyone will see what role (not the user) got converted into what. False means it will not be broadcasted to everyone. Well that's of the commands (I think), so now i'll move on to...the advanced stuff. Lets get a bit more advanced, shall we? Before I begin, read this - an in depth theme documentation by TheUnknownone, it's a great recourse so check it out! http://pokemon-online.eu/forums/showthread.php?15833-Mafia-Theme-Documentation This is a "table of contents" (not really) where basically i have everything below, and you can ctrl+f to the part you want. Best way i could think of. Custom Command Names Multiple Commands in the same role Distract Modes Hax Ignore Hax Random Side Team-Reveal If Reveal Role Evade Chance Bomb Reveal Side Specific Changetarget / Ignore Distractor Evade Daykills Daykill Bomb Daykill reveal chance Poison Bomb Side with multiple roles / Win as long as you survive Command Recharge Insane Inspector (!) Convert according to targets role Ignore specific kills Revenge Reveal Expose Winifdeadroles Reveal Custom Command Names Spoiler Code (text): "actions": { "night": { "heat": { "command": "convert", Just put after day or night the name of the custom command (in this case heat), and then after that you put in "command": and then what command it is. So if its a convert you want to call heat, it would be "command": "convert". Multiple Commands in the Same Role Spoiler This isn't too tricky. Code (text): "actions": { "night": { "glitch": { "target": "AnyButTeam", "common": "Team", "priority": 10, "command": "kill", "broadcast": "team", "msg": "Missingno glitched your data which had to be destroyed!" }, <---- "corrupt": { "target": "AnyButTeam", "common": "Self", "priority": 10, "command": "poison", "poisonDeadMessage": "Missingno's corruption was completed!" } }, "distract": { "mode": "ChangeTarget", "hookermsg": "You tried to distract the Missingno and your data got corrupted!", "msg": "~Distracter~ came to you so you corrupted their data." } } }, Now, before you kill yourself thinking "i have to learn how to do this?", it isn't that tricky if you look into it. If you want multiple commands in the same timeframe (day / night), then what you will do is only close ONE BRACKET at the end of the command (pointed to the place with an arrow), then add your next command there. How does this work? Well, since you aren't closing off "night": {, you can have multiple commands there. If you want a command that can both a nightcommand AND a daycommand, you would do the following - Code (text): "actions": { "night": { "kill": { "target": "AnyButSelf", "common": "Self", "priority": 20, "limit": 1 } }, "standby": { "kill": { "target": "AnyButSelf", "msg": "You can kill now using /kill [name] :", "killmsg": "Sephiroth darts through the crowd and swiftly slices through ~Target~. He then vanishes without a trace." } } } Where there's an extra line break i took out the middle stuff. Basically its like before but you want to close off the "night": { bracket and start a new bracket called "standby": {, which is where you add your command. Distract Modes Spoiler This is how you get roles to either ignore the distract or kill the distractor. Godfathers code ~ Code (text): "actions": { "night": { "kill": { "target": "AnyButTeam", "common": "Team", "priority": 11, "broadcast": "team" } }, "distract": { "mode": "ignore", "msg": "The Pretty Lady came to you last night, but she had no effect on you!" }, "startup": "team-reveal" } }, This goes outside of "night":{ or "standby:{. Basically, "mode" has two different possible things you can do; "ignore" which flat out ignores it, or "changeTarget", which kill sthe distractor. There are two different messages that come after here, the "msg" and the "hookermsg"; those are what the role sees (msg) and what the PL'd person sees (hookermsg) after you get distracted. Generally, you leave out a "hookermsg" if its ignore so they don't know. Hax Spoiler If you've played mafia you know what hax is. Coding a role to get hax is pretty simple. Here's an example code Code (text): "actions": { "hax": { "kill": { "revealTeam": 0.33, "revealPlayer": 0.1 } } } Inside of actions, you'd put "hax" (this goes OUTSIDE of night and day), then following you the command you are haxing, then the following is simple; "revealTeam" is the chance (out of 1) that you will hax the team doing the command, and "revealPlayer" is the chance (out of 1) that you will reveal the player doing the command. To add multiple. close off the bracket for the command ("kill": {...}) then start a new one with a new command. Unfortunately, arrays here are not supported. Ignore Hax Spoiler Fairly simple, outside of the "night" or "standby", you'd put in Code (text): "avoidHax": [ "kill" "distract" ], Somewhere. Inside of "avoidHax":, there is an array where you put all the commands you want to avoid. Random Side Spoiler Code (text): { "role": "magneton", "translation": "Magneton", "side": { "random" { "electric": 0.6, <-- This role has a 60% chance of being part of the "electric" team "steel": 0.4 <-- and 40% of being part of the "steel" team. } }, "help": "blablablabla", "actions": { } } It's not too hard, just in the "side":, put random then then put the sides you want and the chances (similar to hax). The chances don't have to add to 1, you can have .1 and .5 and it'll be out of 6 Team-Reveal If Spoiler Does anyone actually use this? Anyway this is only used with Random Side and it basically means you know your team ONLY IF you are sided with the sides listed. Code (text): "actions":{ "startup": { "team-revealif": [ "werewolf", "godfather" ] } } Reveal Role Spoiler Code (text): "actions": { "startup": { "revealRole": [ "bodyguard", "mayor" ] } } Basically what this does is when you start up you only get revealed the roles in there, but not the whole team. Evade Chance Spoiler This is a popular one, basically it gives the roels a chance of evading the kill / poison / whatever. Code (text): "actions": { "kill": { "mode": { "evadeChance": 0.3 } } } Bomb Spoiler Bomb is an interesting feature. It allows a role to revengekill a role during the night or day. Code (text): "actions": { "kill": { "mode": "killattacker" } } If you want to hit the attacker EVEN if they are protected, you'd do the following Code (text): "actions": { "kill": { "mode": "killattackerevenifprotected" } } Reveal Side Spoiler When inspected, the target will only reveal the side, not the role Code (text): "actions": { "inspect": { "revealSide": true } } Specific Changetarget / Ignore Distractor Spoiler Ricekirby's post about this explains it better than i can Evade Daykills Spoiler Code (text): "daykill": "evade", right after actions. Do i really have to explain? Evade daykills. Daykill Bomb Spoiler Code (text): "actions": { "daykill": "bomb", "daykillrevengemsg": "~Target~ tried to kill ~Self~, but both exploded and died!" } ~Target~ is replaced by the samurai, ~Self is replaced by the bomb Daykill reveal chance Spoiler There is a chance the daykill will be revealed Code (text): "actions": { "standby": { "kill": { "target": "AnyButSelf", "msg": "You can kill now by typing /kill [name] (You'll be revealed)!", "killmsg": "Sephiroth sliced ~Target~ in 3 parts, then sent each of them to a different planet!", "revealChance": 0.33, <--------- "revealmsg": "In the midst of the battle, ~Self~ was revealed to be ~Role~!" } } } Poison Bomb Spoiler Similar to bomb but with poison instead Code (text): "actions": { "kill": { "mode": "poisonattacker", "count": 2, "poisonDeadMessage": "You died from a horrible poison!" } } Side with multiple roles / Win as long as you survive Spoiler Lamperi explains it perfectly Command Recharge Spoiler Simply add "recharge": # in the same place where you would add "limit", etc Insane Inspector (!) Spoiler One of my favorites, it allows you to have an inspector that has a chance of inspecting incorrectly (need to go back to college) Code (text): "actions": { "night": { "inspect": { "target": "AnyButSelf", "common": "Self", "priority": 30, "Sight": { "true": 0.8, "werewolf": 0.1, "bodyguard": 0.1 } } } } It's in the "sight" { part. True means correct role. Convert according to targets role Spoiler Ignore specific kills Spoiler Revenge Reveal Spoiler If this role is daykilled, it'll reveal the its killer (the role with this action will die anyway). Of course, only make sense if there are concealed daykillers. Code (text): "actions": { "daykill": "revealkiller", "daykillrevengemsg": "±Game: Before dying, ~Self~ revealed that ~Target~ is the ~Role~!" } Expose Spoiler Reveal Spoiler This is when you purposefully give away your role during the daytime. Code (text): "standby": { "taunt": { "command": "reveal", "revealmsg": "~Self~ (~Role~) runs around everyone screaming 'YOU'RE TOO SLOW!'." } }, WinifDeadRoles Spoiler This is for the likes of the roles that have massive votes (like kronos, 9999) and the game comes down to Kronos and a bunch of non killers. Since kronos is going to win auto, you'd put in the Winifdeadroles all the killers and poisoners. Code (text): "winIfDeadRoles": [ "prokarp", "dual", "duck", "bidoof", "glitch", "uberglitch", "ice", "rock", "steel", "gigas", "latias", "latios", "arceus", "gengar", "bibarel", "derp", "deoxys", "deoxysa", "deoxysd", "deoxyss", "bell", "moon", "dialga", "palkia", "giratina", "giratinao", "jirachi", "krook", "gyarados", "shuckle", "shucklep", "raikou", "entei", "suicune" ], NOTE THIS GOES OUTSIDE OF ACTIONS Vote Shield: A value that will be added to the votes a person gets during the voting phase. Spoiler Code (text): "actions": { "voteshield": -5 } Poison Override: If you poison someone that's already poisoned, your poison will override the old poison IF it's going to kill the target faster than the current poison. Stalk Action: Night action /stalk [name]. Shows who your target visited during the night. User will get a message like "Your target (RiceKirby) visited Chinchou and Bebbz during the night!" or "Your target (RiceKirby) didn't visit anyone during the night!". Coded the same way as any night action. Spoiler "actions": { "night": { "stalk": { "target": "AnyButSelf", "common": "Self", "priority": 10 } } } Note: This actions won't show who your target visited if he/she dies for a faster priority. That means you can only find if someone distracted Werewolf if the Stalker's priority is higher than PL's. Because of that, I recommand having Stalk's priority right before or right after Distract. Daykill Bomb: If this role is daykilled, it'll kill the daykiller and die with him. Spoiler "actions": { "daykill": "bomb", "daykillrevengemsg": "~Target~ tried to kill ~Self~, but both exploded and died!" } Daykill Reveal Chance: Only meaningful for Daykillers that don't reveal. Allows to set a chance of making said daykiller reveal when killing. Spoiler "actions": { "standby": { "kill": { "target": "AnyButSelf", "msg": "You can kill now by typing /kill [name] (You'll be revealed)!", "killmsg": "Sephiroth sliced ~Target~ in 3 parts, then sent each of them to a different planet!", "revealChance": 0.33, "revealmsg": "In the midst of the battle, ~Self~ was revealed to be ~Role~!" } } } Set revealChance as a number between 0 and 1 (similar to Hax). If there's a revealmsg, that will be shown when the RevealChance is activaded instead of a default message. Note: The revealmsg will be shown in addition to the killmsg. It won't replace the message, so write something that will fit well :3 Poison Attacker: If someone kills this role, he/she will get poisoned. Spoiler "actions": { "kill": { "mode": "poisonattacker", "count": 2, "poisonDeadMessage": "You died from a horrible poison!" } } Note: It's also possible to use "poisonattackerevenifprotected". What it does is obvious. Roles with multiple sides. You still have your own default side, but additional sides can be added so that a role will win regardless of whose team is winning (as long as it stays alive). Spoiler Set additional sides: Code (text): { "role": "consp", "translation": "Conspirator", "side": "mafia", "winningSides": ["village"], ... } Win everytime if stays alive: (no array here) Code (text): { "role": "god", "translation": "Arceus", "side": "god", "winningSides": "*", ... } Command recharge allows you do use some action only every nth night (or less often). (no standby support as of now) Spoiler Kills every second night Code (text): { "role": "lamp", "translation": "Lamperi", "side": "auth", ..., "actions": { "night": {"kill": {..., "recharge": 2} } } } Only Self Target: It's now possible to have a night action that can only be used on yourself. Mostly useful for Protect, Safeguard and another action I'll talk about later. Code (text): "actions": { "night": { "protect": { "target": "OnlySelf", "common": "Self", "priority": 5 } } } Multiple roles for Miller: It's now possible to have a miller that reveals as more than one role. This one will reveal the roles in the revealAs Array (equal chances for each role) Code (text): "actions": { "inspect": { "revealAs": ["role1", "role2", "role3"] } } This one will show a random role among those in the beginning of the game. Note that this uses the roles lists as refence, so it has a higher chance of revealing as a villager. Code (text): "actions": { "inspect": { "revealAs": "*" } } Insane Inspector: An inspector that has a chance of inspecting someone as the wrong role. Use the "true" parameter to set the chance of correctly finding someone's role. Code (text): "actions": { "night": { "inspect": { "target": "AnyButSelf", "common": "Self", "priority": 30, "Sight": { "true": 0.8, "werewolf": 0.1, "bodyguard": 0.1 } } } } Note: Currently, an insane inspector will not be affected by millers. This will be fixed in the future. And now for the most interesting feature with the potential to change mafia as much as Daykill did: Convert: A night action that allows a player to change its target's role to another. Spoiler: CONVERT Code (text): "actions": { "night": { "convert": { "target": "AnyButSelf", "common": "Self", "priority": 30, "newRole": "godfather", "canConvert": ["villager", "miller", "truemiller", "miller1", "miller2"], "silent": true } } } In this example, if this action is used in a Villager or Miller, that person will become a Godfather (scary!). Don't forget to set the "newRole" (sets the role that person will be converted to) and the "canConvert" array (roles that can be affected by this action). The "silent": true line is optional. If set to true, only the user and the target will receive a message about the conversion. If set to false (or not set at all) a "A Villager has been converted into a Godfather!" message will be shown to everyone. Note: Convert can be blocked by Safeguard. Also convertmsg was already added. You can use ~Old~ and ~New~ to show the roles that changed. And Multi-miller is fixed. And some other minor additions: It's now possible to use "canConvert": "*" .This will allow any role to be converted. And because of this, Evade Convert was also added: Code (text): "actions": { "convert": { "mode": "ignore" } } Initial Recharge: Same as recharge, but for the startup. Note that recharge and initial recharge are separate parameters, so you can have only one of them. The following example shows a kill that can only be used after the 3rd night, and once every 2 nights after that. Spoiler: Initial Recharge EXEMPLE Code (text): "actions": { "night": { "kill": { "target": "AnyButSelf", "common": "Self", "priority": 5, "recharge": 2, "initialrecharge": 3 } } } Note: For now, initial recharge only works for players that start as that role (players converted to this role won't have to wait for the initial recharge) Win if Dead Roles: You can set a list of roles that, if dead, will give the victory to the team this role belongs to. Spoiler Code (text): { "role":"kronos", "translation":"Kronos", "side":"kronos", "help":"Leader of the Titans, you are all alone after your tyranny. However, you control immense power, and a single vote by you will vote someone out. You don't have any special commands during the night! Vote to remove people in the day!", "winIfDeadRoles": ["mafia1", "mafiaboss1", "mafia2", "mafiaboss2", "werewolf", "samurai", "vigilante" ], "actions":{ "vote":100 } } Note: Roles in the VillageCantLoseRoles list need to be dead too (After all, it's called Village Can't Lose Roles). Note 2: I strongly recommend against having roles in different sides with the same list. This could cause both teams elligible for a win, but only one of them actually winning. Note 3: This actually have been in Mafia Channel for a while, but I totally forgot about it ._. Revenge Reveal: If this role is daykilled, it'll reveal the its killer (the role with this action will die anyway). Of course, only make sense if there are concealed daykillers. Spoiler Code (text): "actions": { "daykill": "revealkiller", "daykillrevengemsg": "±Game: Before dying, ~Self~ revealed that ~Target~ is the ~Role~!" } Initial Poison: A role with this action will start the game poisoned. Code (text): "actions": { "initialCondition": { "poison": { "count": 5, "poisonDeadMessage": "Time is over!" } } } Note: Both Count and PoisonDeadMessage are optional and will be set to default if not added. Note 2: Like Initial Recharge, this only work for players that start with this role. Converted Players will not be affected by Initial Poison. Convert according to target's role: It's now possible to set a which role your target will become according to his/her current role. The following example will transform your target in a Cult PL if that person is a Pretty Lady, a Cult BG if you target the Bodyguard or a Cult if you target a villager or miller. Spoiler Code (text): "actions": { "night": { "convert": { "target": "Any", "common": "Self", "priority": 30, "newRole": { "culthooker": ["hooker"], "cultbg": ["bodyguard"], "cult": ["villager", "miller", "truemiller", "miller1","miller2"] } } } } Note: Don't set canConvert if you are using this mode. Note 2: If you add the same role to more than one list, that role will be converted to the first list it's found. Ignore specific kills: This works like Evade Nightkills, but only will evade kills coming from the roles in this list. The following example, if used on Default, will make that role evade kills from IM, FCM and both Dons, but not from regular Mafia, Werewolf, Vigilante or Godfather. Code (text): "actions": { "kill": { "mode": { "ignore": [ "mafia1", "mafia2", "mafiaboss1", "mafiaboss2" ] } } } Note: Pay attention to shared kills. If you add only IM and don't add Don IM, this role will evade IM's kill but will be killed by Don IM at the same night. Custom test for /roles: With this, you can set the ±Ability line in the /roles text for a role. Code (text): { "role": "rotom", "translation": "Rotom", "side": "rotom", "help": "You can possess a machine and get a new power! Type /heat [yourname], /wash [yourname], /frost [yourname], /fan [yourname] or /mow [yourname] to change forms. [HINT: Don't try using more than one of those commands]. If you don't possess anything, you can use /shock [name] after the 7th night!", "info": "Can transform itself into Heat, Wash, Frost, Fan or Mow Rotom. Can kill 10 times after Night 7. Sided with Rotom.", "actions": { } } This code will change this (the automatically generated text) to this: Fail Chance: For any night action, allow to set a chance of that action failing. Code (text): "actions": { "night": { "kill": { "target": "AnyButRole", "common": "Role", "priority": 12, "failChance": 0.5 } } } Note: For now, a player with failChance can receive the "You failed" message even if they didn't use that action. Will be fixed later. Note 2: This won't work perfectly for actions with "common": "Team". For example, if Larsa and Vayne had failChance in their kill actions, it's possible Larsa would get a fail message while Vayne would successfully kill their target. Expose: Basically a Inspect used during the day. The exposed person will have their role revealed to everyone. Use ~Self~ to show the Exposer's name, ~Target~ to show the target and ~Role~ to show the target's role. Code (text): "actions": { "standby": { "expose": { "target": "AnyButSelf", "msg": "You can type /expose [name] to reveal someone's role!", "exposemsg": "~Self~, the Inspector, points to ~Target~ and shouts: That person is the ~Role~!" } } } Reveal Chance now works for /expose too. Use in the same way as revealChance for daykills. Team Reveal (with roles): Same as startup: team-reveal, but it shows the players' roles too. Code (text): "actions": { "startup": "team-reveal-with-roles" } This will show a message like this when the game starts: instead of Fail Chance Spoiler Use this to give a command a certain chance of failing. Use this sparingly, because nothing's worse than a command failing at an opportune time. { "role": "puppy", "translation": "Puppy", "side": "dogs", "help": "You are a puppy! D'awww, you're so adorable that you can /distract people from doing stuff at night! But since you're so small, the bad guys might not see you (15% chance). ", "actions": { "night": { "distract": { "target": "AnyButSelf", "common": "Self", "failChance": 0.15, "priority": 1 } } } } Different Name On List Spoiler Use this to make a role appear as a different one on the Current Roles list. Useful for millers and hidden roles. { "role": "legless", "translation": "Legless Lizard", "side": "village", "help": "You are a Legless Lizard. No, you are not a snake, but people always seem to think you are one.", "actions": { "onlist": "snake", "inspect": { "revealAs": "snake" } } } Reveal As Spoiler Makes the inspector see you as a different role. Useful for millers and hidden roles. { "role": "legless", "translation": "Legless Lizard", "side": "village", "help": "You are a Legless Lizard. No, you are not a snake, but people always seem to think you are one.", "actions": { "onlist": "snake", "inspect": { "revealAs": "snake" } } } Reveal As Random Role Spoiler Makes the inspector see you as any random role in the theme. Be extremely careful when using this, because you could appear as a role not on the list, making it a dead giveaway as to your true identity. { "role": "ditto", "translation": "Ditto", "side": "ditto", "help": "You are Ditto, and with your ability to transform, you appear as possibly any other pokemon to the inspector.", "actions": { "inspect": { "revealAs": "*" } } } Broadcast Message: You can now customize the message broadcast to teammates for actions with "broadcast":"team" or "broadcast":"role". Code (text): "actions": { "night": { "kill": { "target": "AnyButTeam", "common": "Team", "priority": 14, "broadcast": "team", "broadcastmsg": "±Game: ~Player~, the Ax Knight, wants to ~Action~ ~Target~!" } } } The code above will the replace the default "Your partner(s) have decided to kill X" to the text in the "broadcastmsg" attribute. ~Player~ will show the name of the player inputting that action. ~Target~ will show the name of the person being targetted. ~Action~ will show the action used (it's redundant, since this is defined for each action). Lynch Message: You can now customize the message for when someone is voted out. The following code should go together with "killmsg" and "killusermsg". Code (text): "lynchmsg": "±Game: ~Player~, the ~Role~, won't be able to help the ~Side~ because they got lynched with ~Count~ votes!" Kind of obvious, but: ~Player~ wil show that player's name, ~Role~ will show its role, ~Side~ will show its team name and ~Count~ will show how many votes it got. Draw Message: You can customize the message for when a game ends in a draw too! The following code should go together with "killmsg" and "killusermsg". Code (text): "drawmsg": "Everybody died! I blame the economic crisis for that :(" Random Role for Convert: You can now have a random factor in /converts. The following code: Code (text): "convert": { "target": "AnyButTeam", "common": "Self", "priority": 20, "newRole": { "villager": [ "mayor", "bodyguard", "vigilante"], "mayor": [ "vigilante", "inspector"] } } Will make a Vigilante have a chance of becoming either a Villager or a Mayor when converted by this action. Basically, It's like any other convert action, but if you add a same role to more than one array, that role can be converted to any of those roles. Messages for Convert: You can now add a ~Target~ to a convertmsg. That will make the message that's broadcast to everyone show the player who got converted. And you can customize the message that only the converter sees! Code (text): "convert": { "target": "AnyButTeam", "common": "Self", "priority": 20, "newRole": "recruit", "usermsg": "You converted ~Target~! ~Old~ is now a ~New~!" } This will replace the "Your target (Name) was converted and now is a Role!" message. Recharge for Standby Actions: Recharge finally works for Standby Actions! And so do Initial Recharge! Code (text): "standby": { "kill": { "target": "AnyButSelf", "msg": "You can kill by typing /kill [name]!:", "killmsg": "~Self~ pulls out a stair and crashes it at ~Target~'s head!" "recharge": 2, "initialrecharge": 2 } } Remember that, as with Night Recharge, "limit" cannot be saved for the next day. That means a role with daykill with limit:2 and recharge:2 can't kill once D1, then once D2, then once D3: recharge will be set whenever that action is used at least once. Win If Dead Roles update: winIfDeadRoles will now make Conspirators win too. And it bypasses villageCantLoseRoles too (No need for Cook Kirby to die before Dark Matter can win). Defensive Modes: Did you ever want to give EvadeChance to a convert? Or ChangeTarget to Inspect? Well, now you can :D The following Defensive Modes now works for every night action (replace the action at the start for the action you want): Spoiler ignore: Role will be immune to that action. "msg" is optional, and will be shown to whoever used that action on this role (except when the action is Distract). "silent" is optional too and, if true, won't show the msg to the user. Code (text): "inspect": { "mode": "ignore", "msg": "Your target (~Self~) is too smart to be inspected!", "silent": true } ChangeTarget: This role will kill whoever uses that action on them (like Werewolf killing Pretty Lady when distracted). Remember that, when a role kills someone due to ChangeTarget, it won't proceed to execute any of their actions with lower priority. "targetmsg" or "hookermsg" can be used to set a message that the action user will see when targetting this role. "msg" can be used to set a message that this role will see. ~User~ or ~Distracter~ can be used in "msg" and will show that person's role. Code (text): "protect": { "mode": "ChangeTarget", "msg": "The ~User~ tried to help you, but you killed them! It was an accident!", "targetmsg": "You tried to protect Hulk, but he confused you with a salesman and killed you!" } Kill Attacker: A role with this action will kill whoever uses such action on it. Of course, this will be similar to ChangeTarget is you add to any action that's not a kill, BUT the role with this action will still perform their actions. "msg" is optional and will be shown to the person that was killed. You can use "killattackerevenifprotected" here too (in this case, it will bypass protect/safeguard, depending on the action used). Code (text): "stalk": { "mode": "killattacker", "msg": "Your target seems to dislike Stalkers! You were killed for stalking the wrong person!" } Poison Attacker: Same as Kill Attacker, but with Poison. You can use "poisonattackerevenifprotected" too. Code (text): "distract": { "mode": "poisonattacker", "msg": "Your target seems to dislike Distractors! You were poisoned for distracting the wrong person!", "poisonDeadMessage": "You shouldn't have distracted that Stalker 3 nights ago!", "count": 3 } Evade Chance: Similar to Ignore, but with a chance of evading instead of a guaranteed evade. For now it's not possible to customize evadeChance's message (because I forgot about that). Code (text): "protect": { "mode": { "evadeChance": 0.5 } } Ignore If and Kill If: You can have a different behavior depending on which role used that action. The following code will make that role ignore conversions from role1 and role2, and kill role3 and role4 if they try to convert this role. "msg", "usermsg" and "hookermsg" can be used the same way as "ignore" and "ChangeTarget (Note: Don't put the msgs in "mode"' braces). For now, ~User~ and ~Distracter~ will not show when a ignoreif is activated (going to fix that soon). Code (text): "convert": { "mode": { "ignore": ["role1", "role2"], "killif": ["role3", "role4"] }, "msg": "You dislike recruiters, so you ran over that ~User~" } All of these Defensive Modes already existed, but only for specific actions. Now they will work for any night action. Convert when lynched: 2nd best feature in this update. Allows a role to survive a lynch by converting to another role! A role with the following action will become a Werewolf if lynched: Code (text): "lynch": { "convertTo": "werewolf", "convertmsg": "~Self~, the ~Old~, received ~Count~ votes and was about to get lynched, but survived and became a ~New~!" } "convertmsg" is optional and will replace the Lynch message. ~Self~ will show that player's name, ~Old~ will show that player's former role, ~New~ will show the role it converted to and ~Count~ will show the ammount of votes it received. And yeah, ~Old~ and ~New~ are kind of redundant, but whatever. On Death Action: And now the best feature in this update: On Death actions. Those actions are performed right before a role with this action dies. The following code will be activated whenever that role dies, and will kill all players with the "human" role, poison all Frogs for 2 days and Dinosaurs for 5 days, convert all Bears into Sleeping Bears and Horses into Pegasus and expose any Godfather. Of course, you don't need to use all actions. Code (text): "onDeath": { "killRoles": ["human"], "poisonRoles": { "frog": 2, "dinosaur": 5 }, "convertRoles": { "bear": "sleepingbear", "horse": "pegasus" }, "exposeRoles": ["godfather"], "killmsg": "±Game: Before dying, ~Self~ cast a spell that killed ~Target~ (~Role~)!", "poisonmsg": "±Game: Before dying, ~Self~ cast a spell that poisoned ~Target~ (~Role~) for ~Count~ days!", "convertmsg": "±Game: ~Self~'s death made ~Target~, a good ~Old~, rage and become a ~New~!", "exposemsg": "±Game: ~Self~ left a dying message pointing to ~Target~ as the ~Role~!" } Important Notes about OnDeath: -"killmsg", "poisonmsg", "convertmsg" and "exposemsg" are optional and quite obvious at this point, EXCEPT for the ~Target~ part. ~Target~ will show all players with that role, so you should check if your theme allows for more than a copy of that role and write the message taking that in to consideration. Also, remember that those message are sent once for each role affected (not for each player, to reduce flood). For example, if the players Steve Jobs and Bill Gates are the Frog role and the players Bill, George and Barack are the role Dinosaur, the following messages will be broadcast: -The order of actions will always be Kill > Poison > Convert > Expose. Always. -You can't use onDeath to prevent a player's death. Even if you use convertRole to make the dying player change roles, the death process won't be stopped. This is fully intentend, and a true survival would be another feature. -There are 2 situations when OnDeath won't be activated: When a player is slain (to prevent abuses) and when a player dies due to another player's onDeath (to prevent infinite loops). In any other situation (kills, poison, lynch, bombs, etc.) the onDeath will be activated (or at least it's supposed to. Tell me if it doesn't). Mode: Identify: Whenever a player with this action is targetted by the specific night action, that player will identify the user of that action. Can be used with any night action, but it's not recommended for nightkills (since it can cause some deadtalk issues). Spoiler Code (text): "actions": { "poison": { "mode": "identify", "msg": "~Target~, the ~Role~, is the person that tried to ~Action~ you during this night!" } } Mode: Die: Whenever a player with this role is targetted by the specific night action, that player will die instantly (the action won't be performed). Can be used with any night action, but it's kind of pointless for nightkills. Spoiler Code (text): "actions": { "inspect": { "mode": "die", "msg": "~Target~, the ~Role~, tried to ~Action~ you, but you died due to their ugly face!", "targetmsg": "You tried to ~Action~ ~Self~, but your ugly face scared them to death!" } } Suicide Chance: Can be added to any night action to add a chance of the user dying when performing that action (the action will be performed normally). Can be used with any night action. Spoiler Code (text): "actions": { "night": { "protect": { "target": "AnyButSelf", "common": "Self", "priority": 4, "suicideChance": 0.75, "suicidemsg": "You swore to protect your partners with your life, and that's what happened." } } } Restrict: With this, you can set some night actions that can't be used during the same night (e.g. You can make a role with /kill and /poison who can only use one of those actions during each night). Can be used with any night action; Commands in the "restrict" list for an action can't be used during the same night (player will get a "You cannot use this action during this night" message when inputting the second command). Spoiler Code (text): "actions": { "night": { "inspect": { "target": "AnyButSelf", "common": "Self", "priority": 4, "restrict": ["kill"] }, "kill": { "target": "AnyButSelf", "common": "Self", "priority": 20, "restrict": ["inspect"] } } } You can add a command to its own "restrict" list to prevent that role from changing targets once it has input the command, but remember that it will also prevent a second command if that action has a "limit":2 or higher. Random Night Action: You can now set a night action's "command" attribute as an object to make a command have a chance of using different actions. For example, the following code will have a 50% chance of resulting in a kill, 30% chance of being a poison and 20% chance of:inspecting your target. Be aware that you can't set a different priority for each command, so you will have to think well about its priority. Spoiler Code (text): "actions": { "night": { "metronome": { "target": "AnyButSelf", "common": "Self", "priority": 4, "command": { "kill": 0.5, "poison": 0.3, "inspect": 0.2 } } } } Multiple Night Actions in a command: If the Random Night Action is not enough for you, then what about multiples night actions in the same command? You can also set the "command" attribute for a night action as an array, and all actions in that list will be performed when that action is used! As with Random Night Action, remember that you can't set a different priority for each command, so you will have to think well about its priority. Also, each defensive mode (changeTarget, ignore, killattacker, etc) will be applied separately for each action used. Spoiler Code (text): "actions": { "night": { "fullguard": { "target": "AnyButSelf", "common": "Self", "priority": 4, "command": ["protect", "safeguard"] }, "kidnap": { "target": "AnyButSelf", "common": "Self", "priority": 4, "command": ["distract", "inspect", "convert"], "newRole": "kidnapped" } } } You can (and should) add attributes specific for different actions, like distractmsg, newRole and poisonDeadMessage, since this is basically 2 or more actions merged. SilentVote: "silentVote":true Night Action - Copy: Copy allows the user to convert to another role depending on who's targetted. Basically, a night action for roles like Ditto and Kirby (but with other uses too). Coded similarly to Convert. "canCopy" is a list of roles that can be copied (optional, if not used any role can be copied). "copyAs" is the same as "canConvert". In the example below, the user will become "roleA" if copying "role2". It's also possible to have "copyAs": "*" if you want the user to become exactly the same role as the target. Spoiler Code (text): "actions": { "night": { "copy": { "target": "AnyButSelf", "common": "Self", "priority": 5, "canCopy": ["role1", "role2"], "copyAs": { "roleA": ["role2"], "roleB": ["role1"] }, "copymsg": "~Self~ copied ~Target~ and changed from ~Old~ to ~New~!" } } } P.S.: Copy has more uses than it seems initially. Night Action - Curse: Curse is yet another variation for Convert. It changes your target's role after a certain number of turns. Basically, it's a poison that converts instead of killing. Differently from poison, Curse can be overriden regardless of the current count. "canCurse" is a list of roles that can be cursed (optional, if not used any role can be cursed). "cursedRole" is the same as "canConvert". In the example below, the target will become "roleA" after 2 nights if it was "role2". It's also possible to have "cursedRole": "roleB" if you want any target to become roleB. "curseCount" is the number of turns for the curse to take effect. It's optional, and defaults to 2 (meaning curse will activated during the next night). "curseConvertMessage" is optional and, if defined, will show that message to everyone when the curse takes effect. For this message, you can use both ~Target~ and ~Player~ for the target's name. Spoiler Code (text): "actions": { "night": { "curse": { "target": "AnyButSelf", "common": "Self", "priority": 5, "canCurse": ["role1", "role2"], "cursedRole": { "roleA": ["role2"], "roleB": ["role1"] }, "curseCount": 3, "curseConvertMessage": "~Target~'s curse took effect and ~Player~ has changed from ~Old~ to ~New~!" } } } P.S.: Similar to Copy, it has more uses than you may think. On Death - Curse: Will curse those roles when this player dies. "curseRoles" is used to set which roles will be cursed. In this example, "role1" will become "roleA" after 2 nights, while "role2" will become "roleB" after the same time. curseCount and curseConvertMessage are the same as in the night action. "cursemsg" is the message broadcast to everyone when this role dies and their onDeath is triggered. Spoiler Code (text): "actions":{ "onDeath": { "curseRoles": { "role1": "roleA", "role2": "roleB" }, "curseCount": 3, "cursemsg": "Because ~Self~ died, ~Target~, the ~Old~ is/are doomed to become ~New~ in ~Count~ days!", "curseConvertMessage": "~Target~'s curse took effect and ~Player~ has changed from ~Old~ to ~New~!" } } Initial Condition - Curse: Same as Initial Condition: Poison, but with curse. In the following example, the player with this role will change to "role1" by N2. Spoiler Code (text): "actions":{ "initialCondition": { "curse": { "cursedRole": "role1", "curseCount": 3, "curseConvertMessage": "~Target~'s curse took effect and ~Player~ has changed from ~Old~ to ~New~!" } } } Initial Condition - Clear Curse: Only useful if you can convert to the role with this action. Removes any curse that that player holds. Spoiler Code (text): "actions":{ "initialCondition": { "clearCurse": true } } Random Role on Spawn List: Allows for some random factor in the Spawn Lists. In the following example, the 5th roles to appear in the game could be a Weedle (40% chance), Kakuna (20%) or Beedrill (40%). Spoiler Code (text): "roles1": [ "caterpie", "caterpie", "metapod", "caterpie", { "weedle": 0.4, "kakuna": 0.2, "beedrill": 0.4 }, "metapod" ] On Team: Changes how a role is displayed on the "Current Team" list. Works similarly to 'onlist'. Code (text): "actions": { "onteam": "villager" } Vote/Voteshield as an Array: Those previously would work as a range, so vote: [1, 5] could mean a vote of 1, 2, 3 or 4. Now it works as a list, so vote:[-100, 0, 100] would mean a role with 33% chance of voting with -100, 33% chance of voting with +100 and 33% chance of voting with 0. Below: Any of the listed values have the same chance of being used. You can even use repeated values to increase the chances for that value. Code (text): "actions": { "vote": [-2, -1, 0, 0, 0, 3, 6, 9.5, 12] } No Visit: It's now possible to have a role that will show as having visited no one when stalked, even if it actually visited someone! Code (text): "actions": { "stalk": { "mode": "noVisit" } } Pierce: You can now have an action that ignores protection/safeguard regardless of its priority. Below: Even with a really low priority, that command will ignore Protect and Safeguard. Code (text): "actions": { "night": { "kill": { "common": "Self", "target": "AnyButSelf", "priority": 999, "pierce": true } } } Evade Chance messages: Evade Chance for night actions now can have a customized message, or even no message at all. Below: A role with 50% chance of evading Inspection. If the evasion occurs, the inspector will get a customized message instead of the default one! Code (text): "actions": { "inspect": { "mode": { "evadeChance": 0.5 }, "msg": "You were unable to inspect this person! Who could this be?" } } Below: A role with 50% chance of evading Inspection. If the evasion occurs, the inspector will get no message! Code (text): "actions": { "inspect": { "mode": { "evadeChance": 0.5 }, "silent": true } } Silent Conversion: To help reducing the spam when you convert roles, you can have some attributes to make the converted player not receive any message at all. Notice that the examples below are valid for Night Actions, Initial Condition and On Death. Below: The target will not receive the "You have been converted and changed roles" message, nor the new role's help text (they still can use /myrole to read it though), but the user will receive those messages due to the Copy action. Code (text): "actions": { "night": { "convert": { "command": ["copy", "convert"], "common": "Self", "target": "AnyButSelf", "priority": 10, "newRole": "cultist", "copyAs": "*", "silentConvert": true, "silentCopy": false } } } Below: The cursed player won't receive the conversion and help messages, nor will see the "You will convert in X turns" message. Code (text): "actions": { "night": { "curse": { "common": "Self", "target": "AnyButSelf", "priority": 10, "cursedRole": "cultist", "silentCurse": true } }, "initialCondition": { "curse": { "cursedRole": "cultist", "curseConvertMessage": "A new cultist is born!", "silentCurse": true } } } Code (text): "actions": { "onDeath": { "curseRoles": { "villager": "cultist", }, "silentCurse": true, "convertRoles": { "cultist": "cultist2", }, "silentConvert": true } } Less messages for onDeath: Since some themes make heavy usage of onDeath, there's now an alternative to have less messages when those are activated. Code (text): "actions": { "onDeath": { "killRoles": [ "villager", "bodyguard", "mayor" ] } } The above code would result in the following messages: Code (text): "actions": { "onDeath": { "killRoles": [ "villager", "bodyguard", "mayor" ], "singlekillmsg": "When ~Self~ died, ~Target~ died too!" } } The above code would result in the following message: With this, you can change the "A message per role affected" to "A message per onDeath effect". Other than "singlekillmsg", you can also have "singlepoisonmsg", "singleconvertmsg" and "singlecursemsg", and those will take priority over the normal messages. The downside is that you can't specify anything other than ~Self~ (player that died) and ~Target~ (all players affected) for those messages (~Roles~ could be added in the future). For this reason, there's no "singleexposemsg", since that requires each player's role to be properly specified. -Daykills get "ignore" allowing stuff like Soren to evade Ike's daykill --Ignore ~Target~ = Player with the ignore ~Role~ = Role of the player with Ignore Code (text): "daykill": { "mode": { "ignore": ["samurai"], }, "msg": "You cannot kill ~Target~! They are ~Role~!" } Note: This will count as using the kill Default message: "±Game: Your target (~Target~) evaded your -commandName-!" -Expose gets a bunch of new stuff, everything is identical to Daykill unless noted: If no message is defined, a message will be put in for the player --Evade/exposeevademsg ~Self~ = Player with evasion ~Target~ = Player with expose Code (text): "actions": { "expose": "evade", "exposeevademsg": "I evaded an expose from ~Target~!" } Default message: "±Game: That person cannot be exposed right now!" --EvadeChance/evasionmsg/exposemissmsg ~Target~ = Player with expose ~Self~ = Player with evasion Code (text): "actions": { "expose": { "mode": { "evadeChance": 1, "evasionmsg": "I evaded an expose from ~Target~!" } } } (Goes on exposer) ~Target~ = Player being exposed ~Self~ = Role with expose Code (text): "exposemissmsg": "~Target~ evaded your expose!" Default message: To exposer: "±Game: Your expose was evaded!" To exposeee: "±Game: You evaded an expose!" --Ignore/msg ~Target~= Player with the ignore ~Role~ = Role of the player with Ignore Code (text): "expose": { "mode": { "ignore": ["exposer"], }, "msg": "You cannot expose ~Target~! They are ~Role~!" } Note: This will count as using the expose Default message: "±Game: Your target (~Target~) evaded your -commandName-!" Spoiler --RevealChance/revealmsg ~Self~ = Exposer ~Role~ = Exposer's role Code (text): "actions": { "standby": { "expose": { "target": "AnyButSelf", "msg": "You can expose now by typing /expose [name]. You will not be revealed!", "exposemsg": "Hey everyone! ~Target~ is ~Role~!", "revealChance": 0.5, "revealmsg": "Oh right! I, ~Self~, am the ~Role~!" } } } Default message: "±Game: While exposing, ~Self~ (~Role~) made a mistake and was revealed!" --Reveal Exposer (Reveals exposer when exposed)/revealexposermsg ~Target~ = Exposer ~Self~ = Player with revealexposer ~Role~ = Exposer's role Code (text): "actions": { "expose": "revealexposer", "revealexposermsg": "~Self~ would like you all to know that ~Target~ is ~Role~. Take that!" } Default message: "±Game: However, ~Self~ revealed that ~Target~ is the ~Role~!" --Revenge (Exposed role will kill the Exposer)/exposerevengemsg ~Target~ = Exposer ~Self~ = Player with the revenge ~Role~ = Role of player with revenge (in case you want to still reveal the role) Code (text): "actions": { "expose": "revenge", "exposerevengemsg": "Haha. Pitiful ~Target~. You really like you can learn my identity and live to tell anyone?" } Default message: "±Game: ~Target~ tries to expose ~Self~, but ~Self~ gets startled and kills ~Target~!" --exposedtargetmsg Used mainly for day inspects to remind you who you targeted. The message ONLY gets sent to the player with the expose command ~Target~ = Players name who you exposed Example of a dayinspect: Code (text): "standby": { "expose": { "target": "AnyButSelf", "msg": "You can expose now by typing /expose [name]. You will not be revealed!", "exposemsg": Hello ~Role~!", "exposedtargetmsg": "You exposed ~Target~!" } }, "team-revealif-with-roles" now exists Code (text): "startup": { "revealRole": [ "randomperson" ], "team-revealif-with-roles": [ "town" ] } Detox A night command that cures poison from a target. Spoiler There are 4 messages related to this command: msg: Sent to the player that uses the command. ~Target~ is the Target's name, ~Role~ is their role (~Role~ would pretty much make the command an inspect, as long as the target was poisoned.) targetmsg: Sent to the player that was cured of poison. ~Self~ is the Detox role, and ~Role~ is their role. failmsg: Sent to the player that uses the command, only if the target is not poisoned. ~Target~ is the Target's name detoxmsg: Broadcast to everyone noting that someone was cured of poison. ~Target~ is the player cured, ~Role~ is the curer's role, and ~Self~ is the curer. **Note: You can use "silent": true to prevent it being broadcast Example: Code (text): "actions": { "night": { "detox": { "target": "Any", "common": "Self", "priority": 3, "msg": "~Target~ (~Role~) was cured of poison.", "targetmsg": "~Self~, the ~Role~, cured you of poison", "failmsg": "~Target~ is not poisoned!", "detoxmsg": "~Self~, the ~Role~, cured ~Target~ of poison!" } } } ~~~~~~ Dispel A night command that removes curse from a target. Spoiler There are 4 messages related to this command: msg: Sent to the player that uses the command. ~Target~ is the Target's name, ~Role~ is their role (~Role~ would pretty much make the command an inspect, as long as the target was poisoned.) targetmsg: Sent to the player that was cured of cure. ~Self~ is the Dispelrole, and ~Role~ is their role. failmsg: Sent to the player that uses the command, only if the target is not curse. ~Target~ is the Target's name dispelmsg: Broadcast to everyone noting that someone was cured of curse. ~Target~ is the player cured, ~Role~ is the curer's role, and ~Self~ is the curer. **Note: You can use "silent": true to prevent it being broadcast Example: Code (text): "actions": { "night": { "dispel": { "target": "Any", "common": "Self", "priority": 3, "msg": "~Target~ (~Role~) was cured of curse.", "targetmsg": "~Self~, the ~Role~, cured you of curse", "failmsg": "~Target~ is not cursed!", "detoxmsg": "~Self~, the ~Role~, cured ~Target~ of curse!" } } } ~~~~~~ Resistance A mode used to alter the count of poison and curse. Spoiler There are 3 different "modes" for Resistance Rate: Count will be multiplied by this number. Use a number greater than 1 to delay the activation of poison/curse and use a number lower than 1 to speed up the activation. Constant: Count will be added to this number. Use a number greater than 0 to delay the activation, less than 0 to speed up. Default (Nothing defined): Count will be delayed by 1 (So a poison count of 2 takes 3 nights to kill now). No messages related to this as it is only modifying the count of poison and curse. Each of the 3 examples: Rate Code (text): "actions": { "poison": { "mode": "resistance", "rate": 0.5 } } Constant Code (text): "actions": { "poison": { "mode": "resistance", "constant": -1 } } Default Code (text): "actions": { "poison": { "mode": "resistance" } } ~~~~~~ HIDE An old feature, but given new life and functionality! Fully backwards compatible too. Spoiler You can now define different things to be hidden per role! You can set it to "side", "role", "both", or the previously usable true/false side: Removes the role from the listing on /sides (good for roles with the same name, but different coded roles. Take Ocean for example: Cthulhu has 2 different roles. If I put "hide": "side" on one of them, then when you do /sides, it only shows Cthulhu listed once. role: Removes the role from the /roles listing. Generally not used as much as the former, but in themes like Transport, where each role has 4 variations but can all be summarized in 1 info tag, could use it safely. both: Does both of the above features, same as the current "hide": true It is important to note, true does NOT use quotation marks, but "side", "role", and "both" REQUIRE quotation marks. Example coding Side: Code (text): "role": "villager", "translation": "vill", "side": "town", "hide": "side", ±Side: The Village consists of Bodyguard, Inspector. ±Role: Villager ±Ability: Sided with Good people. Role: Code (text): "role": "villager", "translation": "vill", "side": "town", "hide": "role", ±Side: The Village consists of Bodyguard, Inspector, Villager. ±Game: No such role in this theme! Both: Code (text): "role": "villager", "translation": "vill", "side": "town", "hide": "both", ±Side: The Village consists of Bodyguard, Inspector. ±Game: No such role in this theme! True: Code (text): "role": "villager", "translation": "vill", "side": "town", "hide": true, ±Side: The Village consists of Bodyguard, Inspector. ±Game: No such role in this theme! ~~~~~~ Revenge Specific Day Actions You can select specific roles to revenge their daykills or exposes. Spoiler You use the same messages as normal revenges Code (text): "actions": { "daykill": { "mode": { "revenge": ["samurai"], } }, "daykillrevengemsg": "Same as a normal revenge message" } Code (text): "actions": { "expose": { "mode": { "revenge": ["exposer"], } }, "exposerevengemsg": "Same as a normal revenge message" } votemsg Spoiler Global theme attribute Accepts 2 variables: ~Player~ = The person voting ~Target~ = The person being voted Important to note: The "±Game" bot will appear automatically. Example of where you can put it Code (text): "lynchmsg": "±Game: ~Player~ (~Role~) was voted off the island!", "killmsg": "±Game: ~Player~ (~Role~) could no longer survive on the island!", "votemsg": "~Player~ cast a ballot for ~Target~.", In addition, this allows for some interesting variations for silent vote. Flavored Vote: "votemsg": "~Player~ cast a ballot for ~Target~.", Reverse Silent Vote: "votemsg": "Someone cast a ballot for ~Target~.", Silent Vote: "votemsg": "~Player~ cast a ballot.", Completely Silent Vote: "votemsg": "Someone cast a ballot", As you can see, you can have multiple variations of the message. Perhaps this will help break a few more restraints to have some interesting theme ideas. And then, the long awaited: "broadcast": "all" (or "broadcast": "*") Spoiler Goes under the night action you're broadcasting Tip: If you're broadcasting to everyone, you should have the action be restricted, to prevent people from spamming EVERYONE in the game. Code (text): "night": { "kill": { "priority": 1, "common": "Self", "target": "AnyButSelf", "broadcast": "all", "restrict": ["kill"] } } Closing the Theme Now that that exhaustive work is out of the way, you'll want to finish your theme up. How do you do this? The first thing is the Roles list. Now that you have all your roles, you want to set when the roles come up with how many players. This isn't too difficult, just keep balance and everything in mind. Spoiler Code (text): "roles1": [ "bodyguard", "mafia", "inspector", "werewolf", "hooker", "villager", "truemiller", "villager", "mafia", "baka", "mayor" ], "roles2": [ "bodyguard", "mafia1", "mafia1", "inspector", "hooker", "villager", "mafia2", "mafia2", "villager", "baka", "villager", "mayor", "villager", "spy", "villager", "miller1", "miller2", "mafiaboss1", "villager", "vigilante", "villager", "godfather", "mafiaboss2", "samurai", "villager", "villager", "werewolf", "mafia1", "mafia2", "bodyguard", "villager", "bomb", "mayor", "hooker", "mafia1", "mafia2", "spy", "villager", "werewolf", "vigilante", "villager", "villager" ], What is roles1 and roles2? Well i'll make a clear cut example that describes the two. Say we have a 10 player max theme (lol), with the following roles list. Code (text): "roles1": [ "bodyguard", "mafia", "inspector", "werewolf", "hooker", "villager", ], "roles2": [ "bodyguard", "mafia", "inspector", "werewolf", "villager "villager", "mayor", "villager", "spy", "villager" ], When you have 1-6 players, the roles list that will be used is Roles1. However, when you go to 7 roles (overflow for Roles1), it will start using the Roles2 list. You can add as many Roles' lists as you want, but don't go overboard. You can see it be used in mafia when you have a Werewolf in small games, but it isn't in medium sized games. Village Can't Lose Roles This random part at the end of the code Code (text): "villageCantLoseRoles": [ "mayor", "vigilante", "samurai", "bomb" ] Basically makes it so if a role can do ANYTHING in a 2 village vs 2 mafia scenario to let the village win, then it goes on this list. If it is not on the list, the mafia auto wins even if the role is there when the number of mafia is = to the number of village. Note that if your village is called "herp", there's no "herpCantLoseRoles". For example, here is the pokemon theme's villagecantloseroles Code (text): "villageCantLoseRoles": [ "prokarp", "dual", "lie", "duck", "bomb", "gengar", "derp", "krook", "gyarados", "shuckle", "shucklep", "weavile" ], Kill message and Kill user message Code (text): "killmsg": "+Trainer: ~Player~ (~Role~) fainted!", "killusermsg": "You fainted!" "killmsg" is what is said to everyone when a role dies. ~Player~ is replaced with their name, and ~Role~ is replaced with the role. "killusermsg" is what is given to the killed user. (only to them, noone else) The final part After you added the above, there's only thing left. Code (text): } Finish off the code with a closing bracket to close off the opening bracket at the beginning ;) So you're done, right? Of course not, now that you've made the theme you have to check in Jsonlint for errors and bugs! This is a guide by RiceKirby that tells you how to fix "invalid array length" errors, and trust me it's a big help. So NOW you've finished your theme, what do you do? Once you're sure your theme is good to go, get it approved by a Mafia Admin (type /mafiaadmins in the #Mafia Channel on the server) and they'll add it. once they added it, you are free to update your theme whenever you want (make sure your name is in the authors list though) with the following command /update ThemeNameHere:url Questions or Help? Need help? Come to #Project Mafia on the server and people there will be glad to help you. I hope this guide has helped you make your theme at least somewhat, and thanks for reading ^^ Credits Me - I wrote it RiceKirby - Adding so much stuff ~.~ and i quoted him a bunch Cake - Answering some of my questions and "Beta Reading" (more like reading right after i posted :3) Jacze - ^ #Project Mafia in general - ^ Hobbes out~
Thanks Kyubey, that's much easier to navigate. Your post has triumphed over entropy. Also thanks to the original makers of the guide, while I'm at it ^_^
Someone should just give this thread's rights to Shazan so he can edit the initial post with the revised guide.
Damn, does it means that I cannot use anymore the entropy as an excuse to break and corrupt innocents' minds and souls? Well if this would mean to fix the opening post I am ok with it. Anyway I have a question about the typical miller's command "startup": "RevealAs" . Just to be safe I have always given an identical help message to the millers and the roles that they think to be, but I always wondered if the RevealAs copy only the "you are a Role" message for the miller or does copy the help message too from the copied role?
XenForo doesn't have that anymore... Would have to make a new thread. If one pops up, I'll be more than happy to sticky it. A v3.0 can always be created!