This project was a personnal test, it's full of bad things, doesn't work, but won't be continued for now.
Global.lua Core engine: dice, turn management, VP tracking
GameManager.lua Table token with game control buttons
GangWar.lua Gang War scenario token
AgendaDeck.lua 35-agenda deck with two-dice draw system
CharacterToken.lua Template for character tokens (copy per character)
characters/
Capodecina.lua Example of a fully configured character token
SETUP.md This file
Each Lua file corresponds to one TTS object. For each file:
- In TTS, go to Objects → Components → Custom → Custom Token (or any object type you prefer for the physical appearance).
- Right-click the object → Scripting → paste the contents of the corresponding
.luafile. - Press Save & Play.
| File | TTS object type |
|---|---|
GameManager.lua |
Custom Token (square, neutral color) |
GangWar.lua |
Custom Token (scenario card art if available) |
CharacterToken.lua |
Custom Token (character art) or Custom Figure |
Every character token must have the TTS tag carnevale_character so the Global script can find them (for round resets, VP counting, etc.).
To add a tag: right-click the token → Tags → Add Tag → type carnevale_character.
Open GameManager.lua and find the line near the top:
local RULEBOOK_URL = "file:///home/eldrim/Downloads/Carnevale_after_party_rulebook_smaller_size.pdf"- Local / LAN play: the
file:///path works as-is for the host. Other players on the same machine will see it; remote players will not. - Online play: upload the PDF somewhere publicly accessible and replace the URL.
- Upload the PDF to Google Drive.
- Right-click → Share → set to "Anyone with the link".
- Copy the share link. It looks like:
https://drive.google.com/file/d/FILE_ID/view - Change it to the direct download format:
https://drive.google.com/uc?id=FILE_ID - Paste that URL into
RULEBOOK_URL.
- Copy
CharacterToken.lua. - At the top, fill in the
PROFILEblock with the character's stats from their card:
local PROFILE = {
name = "Capodecina",
playerColor = "White", -- will be overwritten in-game via "Claim for me"
faction = "The Guild",
keywords = { "The Guild", "Leader", "Trade" },
size = 30, -- base diameter in mm
cost = 30, -- Ducats
move = 6,
dexterity = 6,
attack = 4,
protection = 2,
mind = 4,
ap_max = 3,
lp_max = 13,
wp_max = 4,
cp_max = 4,
weapons = {
{ name = "Futa Blade", range = 0, evasion = nil, damage = nil, penetration = 2, abilities = {} },
},
abilities = { "Aerial Attack", "Expert Offence (2)", "Infiltration" },
}- Paste the modified script into a TTS Custom Token object.
- Add the tag
carnevale_characterto the object. - Save the object into a Bag named after its faction (e.g. "The Guild").
See characters/Capodecina.lua for a complete filled-in example.
- Create one Bag per faction (Objects → Components → Bag).
- Place all character tokens for that faction inside.
- Any player can take tokens from any bag — ownership is assigned in-game.
When a player pulls a token from a bag and places it in their deployment zone:
- Right-click the token → Claim for me.
- The token tints to the player's color and registers them as the owner for VP counting.
- Place the Game Manager, Gang War, and Agenda Deck tokens on the table.
- Place terrain (aim for 1/3 water, 1/3 ground, 1/3 buildings).
- Each player places 1 Gondola in water during terrain setup.
- Press Setup Scenario on the Gang War token — this prints full setup instructions to chat.
- Each player presses Draw Agenda on the Agenda Deck token 3 times.
- Roll for deployment zones (highest roll picks first). Deploy within 8" of your board edge.
- Each player pulls their characters from their faction bag, places them, and Claim for me on each one.
- Press New Round on the Game Manager — resets all AP, prints initiative prompt.
- Players roll initiative manually (CP dice, 7+ = Ace, most Aces goes first).
- Press Start Turns — the first character is announced and highlighted.
- The active player takes their character's turn (up to 3 AP). Use right-click menus for rolls and status changes.
- When done, right-click the character → End Activation — the next character is highlighted.
- Repeat until all characters have activated, then press New Round again.
Use the Agenda Deck token for all agenda interactions:
| Button | When to press |
|---|---|
| Draw Agenda | During setup — press 3 times per player |
| My Agendas | Any time — shows your agendas privately in chat |
| Score Agenda 1/2/3 | When you achieve agenda 1, 2, or 3 — awards 1 VP |
| Hold for Double 1/2/3 | Gang War Double rule — hold instead of scoring now; achieving it again awards 2 VP |
| Discard & Redraw | If an agenda is impossible for your gang (e.g. Unholy Power with no Mage) |
| Reset Deck | Between games — clears all hands |
Gang War uses the Double rule: when you achieve an agenda you may hold it (use Hold for Double) and try to achieve it again for 2 VP instead of 1.
Press End Game / Tally on the Gang War token.
- The script automatically counts 1 VP per surviving character per player.
- Agenda VP (tracked by button presses) is added.
- Final standings are printed to chat.
All rolls are made via right-click context menu on a character token, or by calling Global functions directly from the TTS scripting console.
| Roll type | Ace threshold | Used for |
|---|---|---|
| Basic (DEX, MIND…) | 7+ | Climbing, jumping, falling, hiding |
| Attack | ≥ target's DEXTERITY | Combat actions |
| Protection | 7+ | Saving against damage |
| Magic | ≥ spell's Difficulty | Cast Spell actions |
| Opposed | 7+ | Grapple, Disengage |
Will Points: each WP spent adds 1 die to the roll (max 2 WP per roll, max 10 dice total). Declare before rolling — you cannot change your mind after.
Destiny Die: one die in every roll is marked with [ ] in chat. A 10 on the Destiny Die + at least one other Ace = Critical. A 1 on the Destiny Die + no Aces = Fumble.
- Duplicate
CharacterToken.lua. - Fill in the
PROFILEblock from the character's card (available at ttcombat.com/pages/carnevale-resources). - Create a TTS token, paste the script, tag it
carnevale_character. - Put it in the appropriate faction Bag.
No changes to Global.lua or GameManager.lua are needed for new characters.