From bfbba1676f792161abb91bc497d6e09e5e5969a9 Mon Sep 17 00:00:00 2001 From: Chisel Date: Fri, 15 Mar 2024 00:43:19 +0000 Subject: [PATCH 1/2] chore: fetch latest upstream json --- data/imported/roles-combined.json | 235 +++++++++++++++++------------- 1 file changed, 135 insertions(+), 100 deletions(-) diff --git a/data/imported/roles-combined.json b/data/imported/roles-combined.json index 2fc68e8b..8376c632 100644 --- a/data/imported/roles-combined.json +++ b/data/imported/roles-combined.json @@ -3,11 +3,11 @@ "DAWN": { "ability": "", "edition": "_meta", - "firstNight": 60, + "firstNight": 61, "firstNightReminder": "Wait approximately 10 seconds. Call for eyes open, then immediately announce which players (if any) died.", "id": "DAWN", "name": "DAWN", - "otherNight": 78, + "otherNight": 79, "otherNightReminder": "Wait approximately 10 seconds. Call for eyes open, then immediately announce which players (if any) died.", "reminders": [], "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/DAWN.png", @@ -17,7 +17,7 @@ "DEMON": { "ability": "", "edition": "_meta", - "firstNight": 10, + "firstNight": 11, "firstNightReminder": "If 7 or more players: wake up the Demon. Show the 'These are your minions' card. Point to each Minion. Show the 'These characters are not in play' card. Show 3 character tokens of Good characters that are not in play", "id": "DEMON", "name": "DEMON", @@ -45,7 +45,7 @@ "MINION": { "ability": "", "edition": "_meta", - "firstNight": 7, + "firstNight": 8, "firstNightReminder": "If 7 or more players: wake up all of the Minions. They make eye contact with each other. Show the 'This is the Demon' card. Point to the Demon.", "id": "MINION", "name": "MINION", @@ -63,7 +63,7 @@ "firstNightReminder": null, "id": "acrobat", "name": "Acrobat", - "otherNight": 42, + "otherNight": 43, "otherNightReminder": "If a good living neighbour is drunk or poisoned, the Acrobat player dies.", "reminders": [ "Dead" @@ -112,11 +112,11 @@ "amnesiac": { "ability": "You do not know what your ability is. Each day, privately guess what it is: you learn how accurate you are.", "edition": "ks", - "firstNight": 34, + "firstNight": 35, "firstNightReminder": "Decide the Amnesiac's entire ability. If the Amnesiac's ability causes them to wake tonight: Wake the Amnesiac and run their ability.", "id": "amnesiac", "name": "Amnesiac", - "otherNight": 51, + "otherNight": 52, "otherNightReminder": "If the Amnesiac's ability causes them to wake tonight: Wake the Amnesiac and run their ability.", "reminders": [ "?" @@ -181,7 +181,7 @@ "firstNightReminder": null, "id": "assassin", "name": "Assassin", - "otherNight": 39, + "otherNight": 40, "otherNightReminder": "If the Assassin has not yet used their ability: The Assassin either shows the 'no' head signal, or points to a player. That player dies.", "reminders": [ "Dead", @@ -208,11 +208,11 @@ "balloonist": { "ability": "Each night, you learn 1 player of each character type, until there are no more types to learn. [+1 Outsider]", "edition": "experimental", - "firstNight": 49, + "firstNight": 50, "firstNightReminder": "Choose a character type. Point to a player whose character is of that type. Place the Balloonist's Seen reminder next to that character.", "id": "balloonist", "name": "Balloonist", - "otherNight": 66, + "otherNight": 67, "otherNightReminder": "Choose a character type that does not yet have a Seen reminder next to a character of that type. Point to a player whose character is of that type, if there are any. Place the Balloonist's Seen reminder next to that character.", "reminders": [ "Seen Townsfolk", @@ -232,7 +232,7 @@ "firstNightReminder": null, "id": "barber", "name": "Barber", - "otherNight": 44, + "otherNight": 45, "otherNightReminder": "If the Barber died today: Wake the Demon. Show the 'This character selected you' card, then Barber token. The Demon either shows a 'no' head signal, or points to 2 players. If they chose players: Swap the character tokens. Wake each player. Show 'You are', then their new character token.", "reminders": [ "Haircuts tonight" @@ -351,11 +351,11 @@ "bountyhunter": { "ability": "You start knowing 1 evil player. If the player you know dies, you learn another evil player tonight. [1 Townsfolk is evil]", "edition": "experimental", - "firstNight": 52, + "firstNight": 53, "firstNightReminder": "Point to 1 evil player. Wake the townsfolk who is evil and show them the 'You are' card and the thumbs down evil sign.", "id": "bountyhunter", "name": "Bounty Hunter", - "otherNight": 69, + "otherNight": 70, "otherNightReminder": "If the known evil player has died, point to another evil player. ", "reminders": [ "Known" @@ -411,11 +411,11 @@ "butler": { "ability": "Each night, choose a player (not yourself): tomorrow, you may only vote if they are voting too.", "edition": "tb", - "firstNight": 41, + "firstNight": 42, "firstNightReminder": "The Butler points to a player. Mark that player as 'Master'.", "id": "butler", "name": "Butler", - "otherNight": 72, + "otherNight": 73, "otherNightReminder": "The Butler points to a player. Mark that player as 'Master'.", "reminders": [ "Master" @@ -444,7 +444,7 @@ "cerenovus": { "ability": "Each night, choose a player & a good character: they are \u201cmad\u201d they are this character tomorrow, or might be executed.", "edition": "snv", - "firstNight": 26, + "firstNight": 27, "firstNightReminder": "The Cerenovus points to a player, then to a character on their sheet. Wake that player. Show the 'This character selected you' card, then the Cerenovus token. Show the selected character token. If the player is not mad about being that character tomorrow, they can be executed.", "id": "cerenovus", "name": "Cerenovus", @@ -460,11 +460,11 @@ "chambermaid": { "ability": "Each night, choose 2 alive players (not yourself): you learn how many woke tonight due to their ability.", "edition": "bmr", - "firstNight": 58, + "firstNight": 59, "firstNightReminder": "The Chambermaid points to two players. Show the number signal (0, 1, 2, \u2026) for how many of those players wake tonight for their ability.", "id": "chambermaid", "name": "Chambermaid", - "otherNight": 76, + "otherNight": 77, "otherNightReminder": "The Chambermaid points to two players. Show the number signal (0, 1, 2, \u2026) for how many of those players wake tonight for their ability.", "reminders": [], "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/chambermaid.png", @@ -474,7 +474,7 @@ "chef": { "ability": "You start knowing how many pairs of evil players there are.", "edition": "tb", - "firstNight": 38, + "firstNight": 39, "firstNightReminder": "Show the finger signal (0, 1, 2, \u2026) for the number of pairs of neighbouring evil players.", "id": "chef", "name": "Chef", @@ -492,7 +492,7 @@ "firstNightReminder": null, "id": "choirboy", "name": "Choirboy", - "otherNight": 48, + "otherNight": 49, "otherNightReminder": "If the King was killed by the Demon, wake the Choirboy and point to the Demon player.", "reminders": [], "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/choirboy.png", @@ -502,7 +502,7 @@ "clockmaker": { "ability": "You start knowing how many steps from the Demon to its nearest Minion.", "edition": "snv", - "firstNight": 43, + "firstNight": 44, "firstNightReminder": "Show the hand signal for the number (1, 2, 3, etc.) of places from Demon to closest Minion.", "id": "clockmaker", "name": "Clockmaker", @@ -516,7 +516,7 @@ "courtier": { "ability": "Once per game, at night, choose a character: they are drunk for 3 nights & 3 days.", "edition": "bmr", - "firstNight": 20, + "firstNight": 21, "firstNightReminder": "The Courtier either shows a 'no' head signal, or points to a character on the sheet. If the Courtier used their ability: If that character is in play, that player is drunk.", "id": "courtier", "name": "Courtier", @@ -535,11 +535,11 @@ "cultleader": { "ability": "Each night, you become the alignment of an alive neighbour. If all good players choose to join your cult, your team wins.", "edition": "experimental", - "firstNight": 54, + "firstNight": 55, "firstNightReminder": "If the cult leader changed alignment, show them the thumbs up good signal of the thumbs down evil signal accordingly.", "id": "cultleader", "name": "Cult Leader", - "otherNight": 71, + "otherNight": 72, "otherNightReminder": "If the cult leader changed alignment, show them the thumbs up good signal of the thumbs down evil signal accordingly.", "reminders": [], "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/cultleader.png", @@ -549,11 +549,11 @@ "damsel": { "ability": "All Minions know you are in play. If a Minion publicly guesses you (once), your team loses.", "edition": "ks", - "firstNight": 33, + "firstNight": 34, "firstNightReminder": "Wake all the Minions, show them the 'This character selected you' card and the Damsel token.", "id": "damsel", "name": "Damsel", - "otherNight": 50, + "otherNight": 51, "otherNightReminder": "If selected by the Huntsman, wake the Damsel, show 'You are' card and a not-in-play Townsfolk token.", "reminders": [ "Guess used" @@ -579,7 +579,7 @@ "devilsadvocate": { "ability": "Each night, choose a living player (different to last night): if executed tomorrow, they don't die.", "edition": "bmr", - "firstNight": 23, + "firstNight": 24, "firstNightReminder": "The Devil\u2019s Advocate points to a living player. That player survives execution tomorrow.", "id": "devilsadvocate", "name": "Devil's Advocate", @@ -623,11 +623,11 @@ "dreamer": { "ability": "Each night, choose a player (not yourself or Travellers): you learn 1 good and 1 evil character, 1 of which is correct.", "edition": "snv", - "firstNight": 44, + "firstNight": 45, "firstNightReminder": "The Dreamer points to a player. Show 1 good and 1 evil character token; one of these is correct.", "id": "dreamer", "name": "Dreamer", - "otherNight": 60, + "otherNight": 61, "otherNightReminder": "The Dreamer points to a player. Show 1 good and 1 evil character token; one of these is correct.", "reminders": [], "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/dreamer.png", @@ -671,11 +671,11 @@ "empath": { "ability": "Each night, you learn how many of your 2 alive neighbours are evil.", "edition": "tb", - "firstNight": 39, + "firstNight": 40, "firstNightReminder": "Show the finger signal (0, 1, 2) for the number of evil alive neighbours of the Empath.", "id": "empath", "name": "Empath", - "otherNight": 57, + "otherNight": 58, "otherNightReminder": "Show the finger signal (0, 1, 2) for the number of evil neighbours.", "reminders": [], "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/empath.png", @@ -685,7 +685,7 @@ "engineer": { "ability": "Once per game, at night, choose which Minions or which Demon is in play.", "edition": "ks", - "firstNight": 14, + "firstNight": 15, "firstNightReminder": "The Engineer shows a 'no' head signal, or points to a Demon or points to the relevant number of Minions. If the Engineer chose characters, replace the Demon or Minions with the choices, then wake the relevant players and show them the You are card and the relevant character tokens.", "id": "engineer", "name": "Engineer", @@ -701,7 +701,7 @@ "eviltwin": { "ability": "You & an opposing player know each other. If the good player is executed, evil wins. Good can't win if you both live.", "edition": "snv", - "firstNight": 24, + "firstNight": 25, "firstNightReminder": "Wake the Evil Twin and their twin. Confirm that they have acknowledged each other. Point to the Evil Twin. Show their Evil Twin token to the twin player. Point to the twin. Show their character token to the Evil Twin player.", "id": "eviltwin", "name": "Evil Twin", @@ -754,7 +754,7 @@ "firstNightReminder": null, "id": "farmer", "name": "Farmer", - "otherNight": 52, + "otherNight": 53, "otherNightReminder": "If a Farmer died tonight, choose another good player and make them the Farmer. Wake this player, show them the 'You are' card and the Farmer character token.", "reminders": [], "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/farmer.png", @@ -764,7 +764,7 @@ "fearmonger": { "ability": "Each night, choose a player. If you nominate & execute them, their team loses. All players know if you choose a new player.", "edition": "ks", - "firstNight": 27, + "firstNight": 28, "firstNightReminder": "The Fearmonger points to a player. Place the Fear token next to that player and announce that a new player has been selected with the Fearmonger ability.", "id": "fearmonger", "name": "Fearmonger", @@ -830,7 +830,7 @@ "firstNightReminder": null, "id": "flowergirl", "name": "Flowergirl", - "otherNight": 61, + "otherNight": 62, "otherNightReminder": "Nod 'yes' or shake head 'no' for whether the Demon voted today. Place the 'Demon not voted' marker (remove 'Demon voted', if any).", "reminders": [ "Demon voted", @@ -859,11 +859,11 @@ "fortuneteller": { "ability": "Each night, choose 2 players: you learn if either is a Demon. There is a good player that registers as a Demon to you.", "edition": "tb", - "firstNight": 40, + "firstNight": 41, "firstNightReminder": "The Fortune Teller points to two players. Give the head signal (nod yes, shake no) for whether one of those players is the Demon. ", "id": "fortuneteller", "name": "Fortune Teller", - "otherNight": 58, + "otherNight": 59, "otherNightReminder": "The Fortune Teller points to two players. Show the head signal (nod 'yes', shake 'no') for whether one of those players is the Demon.", "reminders": [ "Red herring" @@ -905,11 +905,11 @@ "general": { "ability": "Each night, you learn which alignment the Storyteller believes is winning: good, evil, or neither.", "edition": "ks", - "firstNight": 57, + "firstNight": 58, "firstNightReminder": "Show the General thumbs up for good winning, thumbs down for evil winning or thumb to the side for neither.", "id": "general", "name": "General", - "otherNight": 75, + "otherNight": 76, "otherNightReminder": "Show the General thumbs up for good winning, thumbs down for evil winning or thumb to the side for neither.", "reminders": [], "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/general.png", @@ -935,11 +935,11 @@ "godfather": { "ability": "You start knowing which Outsiders are in play. If 1 died today, choose a player tonight: they die. [\u22121 or +1 Outsider]", "edition": "bmr", - "firstNight": 22, + "firstNight": 23, "firstNightReminder": "Show each of the Outsider tokens in play.", "id": "godfather", "name": "Godfather", - "otherNight": 40, + "otherNight": 41, "otherNightReminder": "If an Outsider died today: The Godfather points to a player. That player dies.", "reminders": [ "Died today", @@ -988,7 +988,7 @@ "firstNightReminder": null, "id": "gossip", "name": "Gossip", - "otherNight": 41, + "otherNight": 42, "otherNightReminder": "If the Gossip\u2019s public statement was true: Choose a player not protected from dying tonight. That player dies.", "reminders": [ "Dead" @@ -1000,11 +1000,11 @@ "grandmother": { "ability": "You start knowing a good player & their character. If the Demon kills them, you die too.", "edition": "bmr", - "firstNight": 42, + "firstNight": 43, "firstNightReminder": "Show the marked character token. Point to the marked player.", "id": "grandmother", "name": "Grandmother", - "otherNight": 55, + "otherNight": 56, "otherNightReminder": "If the Grandmother\u2019s grandchild was killed by the Demon tonight: The Grandmother dies.", "reminders": [ "Grandchild" @@ -1046,7 +1046,7 @@ "harpy": { "ability": "Each night, choose 2 players: tomorrow, the 1st player is mad that the 2nd is evil, or both might die.", "edition": "experimental", - "firstNight": 28, + "firstNight": 29, "firstNightReminder": "Wake the Harpy; they point at one player, then another. Wake the 1st player the Harpy pointed to, show them the 'This character has selected you' card, show them the Harpy token, then point at the 2nd player the Harpy pointed to.", "id": "harpy", "image": "your direct url here", @@ -1069,7 +1069,7 @@ "id": "hatter", "image": "your direct url here", "name": "Hatter", - "otherNight": 43, + "otherNight": 44, "otherNightReminder": "If the Hatter died today: Wake the Minions and Demon. Show them the 'This Character Selected You' info token, then the Hatter token. Each player either shakes their head no or points to another character of the same type as their current character. If a second player would end up with the same character as another player, shake your head no and gesture for them to choose again. Put them to sleep. Change each player to the character they chose.", "reminders": [ "Tea Party Tonight" @@ -1110,12 +1110,12 @@ "highpriestess": { "ability": "Each night, learn which player the Storyteller believes you should talk to most.", "edition": "experimental", - "firstNight": 56, + "firstNight": 57, "firstNightReminder": "Point to a player.", "id": "highpriestess", "image": "your direct url here", "name": "High Priestess", - "otherNight": 74, + "otherNight": 75, "otherNightReminder": "Point to a player.", "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/highpriestess.png", "setup": false, @@ -1124,11 +1124,11 @@ "huntsman": { "ability": "Once per game, at night, choose a living player: the Damsel, if chosen, becomes a not-in-play Townsfolk. [+the Damsel]", "edition": "ks", - "firstNight": 32, + "firstNight": 33, "firstNightReminder": "The Huntsman shakes their head 'no' or points to a player. If they point to the Damsel, wake that player, show the 'You are' card and a not-in-play character token.", "id": "huntsman", "name": "Huntsman", - "otherNight": 49, + "otherNight": 50, "otherNightReminder": "The Huntsman shakes their head 'no' or points to a player. If they point to the Damsel, wake that player, show the 'You are' card and a not-in-play character token.", "reminders": [ "No ability" @@ -1173,7 +1173,7 @@ "investigator": { "ability": "You start knowing that 1 of 2 players is a particular Minion.", "edition": "tb", - "firstNight": 37, + "firstNight": 38, "firstNightReminder": "Show the character token of a Minion in play. Point to two players, one of which is that character.", "id": "investigator", "name": "Investigator", @@ -1210,7 +1210,7 @@ "firstNightReminder": null, "id": "juggler", "name": "Juggler", - "otherNight": 65, + "otherNight": 66, "otherNightReminder": "If today was the Juggler\u2019s first day: Show the hand signal for the number (0, 1, 2, etc.) of 'Correct' markers. Remove markers.", "reminders": [ "Correct" @@ -1227,7 +1227,7 @@ "id": "kazali", "image": "your direct url here", "name": "Kazali", - "otherNight": 38, + "otherNight": 39, "otherNightReminder": "The Kazali points to a player. That player dies", "reminders": [ "Dead" @@ -1239,11 +1239,11 @@ "king": { "ability": "Each night, if the dead outnumber the living, you learn 1 alive character. The Demon knows who you are.", "edition": "ks", - "firstNight": 11, + "firstNight": 12, "firstNightReminder": "Wake the Demon, show them the 'This character selected you' card, show the King token and point to the King player.", "id": "king", "name": "King", - "otherNight": 68, + "otherNight": 69, "otherNightReminder": "If there are more dead than living, show the King a character token of a living player.", "reminders": [], "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/king.png", @@ -1267,7 +1267,7 @@ "knight": { "ability": "You start knowing 2 players that are not the Demon.", "edition": "experimental", - "firstNight": 47, + "firstNight": 48, "firstNightReminder": "Point to two players who are not the Demon.", "id": "knight", "image": null, @@ -1301,11 +1301,11 @@ "leviathan": { "ability": "If more than 1 good player is executed, you win. All players know you are in play. After day 5, evil wins.", "edition": "ks", - "firstNight": 61, + "firstNight": 62, "firstNightReminder": "Place the Leviathan 'Day 1' marker. Announce 'The Leviathan is in play; this is Day 1.'", "id": "leviathan", "name": "Leviathan", - "otherNight": 79, + "otherNight": 80, "otherNightReminder": "Change the Leviathan Day reminder for the next day.", "reminders": [ "Day 1", @@ -1322,7 +1322,7 @@ "librarian": { "ability": "You start knowing that 1 of 2 players is a particular Outsider. (Or that zero are in play.)", "edition": "tb", - "firstNight": 36, + "firstNight": 37, "firstNightReminder": "Show the character token of an Outsider in play. Point to two players, one of which is that character.", "id": "librarian", "name": "Librarian", @@ -1339,7 +1339,7 @@ "lilmonsta": { "ability": "Each night, Minions choose who babysits Lil' Monsta's token & \"is the Demon\". A player dies each night*. [+1 Minion]", "edition": "experimental", - "firstNight": 16, + "firstNight": 17, "firstNightReminder": "Wake all Minions together, allow them to vote by pointing at who they want to babysit Lil' Monsta.", "id": "lilmonsta", "name": "Lil' Monsta", @@ -1357,7 +1357,7 @@ "lleech": { "ability": "Each night*, choose a player: they die. You start by choosing an alive player: they are poisoned - you die if & only if they die.", "edition": "ks", - "firstNight": 17, + "firstNight": 18, "firstNightReminder": "The Lleech points to a player. Place the Poisoned reminder token.", "id": "lleech", "name": "Lleech", @@ -1374,7 +1374,7 @@ "lunatic": { "ability": "You think you are a Demon, but you are not. The Demon knows who you are & who you choose at night.", "edition": "bmr", - "firstNight": 9, + "firstNight": 10, "firstNightReminder": "If 7 or more players: Show the Lunatic a number of arbitrary 'Minions', players equal to the number of Minions in play. Show 3 character tokens of arbitrary good characters. If the token received by the Lunatic is a Demon that would wake tonight: Allow the Lunatic to do the Demon actions. Place their 'attack' markers. Wake the Demon. Show the Demon\u2019s real character token. Show them the Lunatic player. If the Lunatic attacked players: Show the real demon each marked player. Remove any Lunatic 'attack' markers.", "id": "lunatic", "name": "Lunatic", @@ -1408,7 +1408,7 @@ "magician": { "ability": "The Demon thinks you are a Minion. Minions think you are a Demon.", "edition": "ks", - "firstNight": 6, + "firstNight": 7, "firstNightReminder": null, "id": "magician", "name": "Magician", @@ -1422,7 +1422,7 @@ "marionette": { "ability": "You think you are a good character but you are not. The Demon knows who you are. [You neighbour the Demon]", "edition": "ks", - "firstNight": 13, + "firstNight": 14, "firstNightReminder": "Select one of the good players next to the Demon and place the Is the Marionette reminder token. Wake the Demon and show them the Marionette.", "id": "marionette", "name": "Marionette", @@ -1453,11 +1453,11 @@ "mathematician": { "ability": "Each night, you learn how many players\u2019 abilities worked abnormally (since dawn) due to another character's ability.", "edition": "snv", - "firstNight": 59, + "firstNight": 60, "firstNightReminder": "Show the hand signal for the number (0, 1, 2, etc.) of players whose ability malfunctioned due to other abilities.", "id": "mathematician", "name": "Mathematician", - "otherNight": 77, + "otherNight": 78, "otherNightReminder": "Show the hand signal for the number (0, 1, 2, etc.) of players whose ability malfunctioned due to other abilities.", "reminders": [ "Abnormal" @@ -1514,7 +1514,7 @@ "mezepheles": { "ability": "You start knowing a secret word. The 1st good player to say this word becomes evil that night.", "edition": "ks", - "firstNight": 29, + "firstNight": 30, "firstNightReminder": "Show the Mezepheles their secret word.", "id": "mezepheles", "name": "Mezepheles", @@ -1567,7 +1567,7 @@ "firstNightReminder": null, "id": "moonchild", "name": "Moonchild", - "otherNight": 54, + "otherNight": 55, "otherNightReminder": "If the Moonchild used their ability to target a player today: If that player is good, they die.", "reminders": [ "Dead" @@ -1593,11 +1593,11 @@ "nightwatchman": { "ability": "Once per game, at night, choose a player: they learn who you are.", "edition": "experimental", - "firstNight": 53, + "firstNight": 54, "firstNightReminder": "The Nightwatchman may point to a player. Wake that player, show the 'This character selected you' card and the Nightwatchman token, then point to the Nightwatchman player.", "id": "nightwatchman", "name": "Nightwatchman", - "otherNight": 70, + "otherNight": 71, "otherNightReminder": "The Nightwatchman may point to a player. Wake that player, show the 'This character selected you' card and the Nightwatchman token, then point to the Nightwatchman player.", "reminders": [ "No ability" @@ -1609,7 +1609,7 @@ "noble": { "ability": "You start knowing 3 players, 1 and only 1 of which is evil.", "edition": "ks", - "firstNight": 48, + "firstNight": 49, "firstNightReminder": "Point to 3 players including one evil player, in no particular order.", "id": "noble", "name": "Noble", @@ -1662,7 +1662,7 @@ "firstNightReminder": null, "id": "oracle", "name": "Oracle", - "otherNight": 63, + "otherNight": 64, "otherNightReminder": "Show the hand signal for the number (0, 1, 2, etc.) of dead evil players.", "reminders": [], "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/oracle.png", @@ -1733,7 +1733,7 @@ "pixie": { "ability": "You start knowing 1 in-play Townsfolk. If you were mad that you were this character, you gain their ability when they die.", "edition": "ks", - "firstNight": 31, + "firstNight": 32, "firstNightReminder": "Show the Pixie 1 in-play Townsfolk character token.", "id": "pixie", "name": "Pixie", @@ -1784,7 +1784,7 @@ "poisoner": { "ability": "Each night, choose a player: they are poisoned tonight and tomorrow day.", "edition": "tb", - "firstNight": 18, + "firstNight": 19, "firstNightReminder": "The Poisoner points to a player. That player is poisoned.", "id": "poisoner", "name": "Poisoner", @@ -1830,7 +1830,7 @@ "preacher": { "ability": "Each night, choose a player: a Minion, if chosen, learns this. All chosen Minions have no ability.", "edition": "experimental", - "firstNight": 15, + "firstNight": 16, "firstNightReminder": "The Preacher chooses a player. If a Minion is chosen, wake the Minion and show the 'This character selected you' card and then the Preacher token.", "id": "preacher", "name": "Preacher", @@ -1850,7 +1850,7 @@ "firstNightReminder": null, "id": "professor", "name": "Professor", - "otherNight": 47, + "otherNight": 48, "otherNightReminder": "If the Professor has not used their ability: The Professor either shakes their head no, or points to a player. If that player is a Townsfolk, they are now alive.", "reminders": [ "Alive", @@ -1877,7 +1877,7 @@ "pukka": { "ability": "Each night, choose a player: they are poisoned. The previously poisoned player dies then becomes healthy.", "edition": "bmr", - "firstNight": 30, + "firstNight": 31, "firstNightReminder": "The Pukka points to a player. That player is poisoned.", "id": "pukka", "name": "Pukka", @@ -1915,7 +1915,7 @@ "firstNightReminder": null, "id": "ravenkeeper", "name": "Ravenkeeper", - "otherNight": 56, + "otherNight": 57, "otherNightReminder": "If the Ravenkeeper died tonight: The Ravenkeeper points to a player. Show that player\u2019s character token.", "reminders": [], "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/ravenkeeper.png", @@ -1973,7 +1973,7 @@ "firstNightReminder": null, "id": "sage", "name": "Sage", - "otherNight": 46, + "otherNight": 47, "otherNightReminder": "If the Sage was killed by a Demon: Point to two players, one of which is that Demon.", "reminders": [], "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/sage.png", @@ -1983,7 +1983,7 @@ "sailor": { "ability": "Each night, choose an alive player: either you or they are drunk until dusk. You can't die.", "edition": "bmr", - "firstNight": 12, + "firstNight": 13, "firstNightReminder": "The Sailor points to a living player. Either the Sailor, or the chosen player, is drunk.", "id": "sailor", "name": "Sailor", @@ -2057,11 +2057,11 @@ "seamstress": { "ability": "Once per game, at night, choose 2 players (not yourself): you learn if they are the same alignment.", "edition": "snv", - "firstNight": 45, + "firstNight": 46, "firstNightReminder": "The Seamstress either shows a 'no' head signal, or points to two other players. If the Seamstress chose players , nod 'yes' or shake 'no' for whether they are of same alignment.", "id": "seamstress", "name": "Seamstress", - "otherNight": 64, + "otherNight": 65, "otherNightReminder": "If the Seamstress has not yet used their ability: the Seamstress either shows a 'no' head signal, or points to two other players. If the Seamstress chose players , nod 'yes' or shake 'no' for whether they are of same alignment.", "reminders": [ "No ability" @@ -2104,7 +2104,7 @@ "shugenja": { "ability": "You start knowing if your closest evil player is clockwise or anti-clockwise. If equidistant, this info is arbitrary.", "edition": "experimental", - "firstNight": 50, + "firstNight": 51, "firstNightReminder": "Wake the Shugenja; point horizontally in the direction of the closest evil player. If the two closest evil players are equidistant, point your finger horizontally in either direction.", "id": "shugenja", "image": "[Your direct url here]", @@ -2134,7 +2134,7 @@ "snakecharmer": { "ability": "Each night, choose an alive player: a chosen Demon swaps characters & alignments with you & is then poisoned.", "edition": "snv", - "firstNight": 21, + "firstNight": 22, "firstNightReminder": "The Snake Charmer points to a player. If that player is the Demon: swap the Demon and Snake Charmer character and alignments. Wake each player to inform them of their new role and alignment. The new Snake Charmer is poisoned.", "id": "snakecharmer", "name": "Snake Charmer", @@ -2150,7 +2150,7 @@ "snitch": { "ability": "Minions start knowing 3 not-in-play characters.", "edition": "ks", - "firstNight": 8, + "firstNight": 9, "firstNightReminder": "After Minion info wake each Minion and show them three not-in-play character tokens. These may be the same or different to each other and the ones shown to the Demon.", "id": "snitch", "name": "Snitch", @@ -2194,11 +2194,11 @@ "spy": { "ability": "Each night, you see the Grimoire. You might register as good & as a Townsfolk or Outsider, even if dead.", "edition": "tb", - "firstNight": 55, + "firstNight": 56, "firstNightReminder": "Show the Grimoire to the Spy for as long as they need.", "id": "spy", "name": "Spy", - "otherNight": 73, + "otherNight": 74, "otherNightReminder": "Show the Grimoire to the Spy for as long as they need.", "reminders": [], "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/spy.png", @@ -2208,7 +2208,7 @@ "steward": { "ability": "You start knowing 1 good player.", "edition": "experimental", - "firstNight": 46, + "firstNight": 47, "firstNightReminder": "Point to a good player.", "id": "steward", "image": null, @@ -2245,7 +2245,7 @@ "firstNightReminder": null, "id": "sweetheart", "name": "Sweetheart", - "otherNight": 45, + "otherNight": 46, "otherNightReminder": "Choose a player that is drunk.", "reminders": [ "Drunk" @@ -2293,7 +2293,7 @@ "firstNightReminder": null, "id": "tinker", "name": "Tinker", - "otherNight": 53, + "otherNight": 54, "otherNightReminder": "The Tinker might die.", "reminders": [ "Dead" @@ -2309,7 +2309,7 @@ "firstNightReminder": null, "id": "towncrier", "name": "Town Crier", - "otherNight": 62, + "otherNight": 63, "otherNightReminder": "Nod 'yes' or shake head 'no' for whether a Minion nominated today. Place the 'Minion not nominated' marker (remove 'Minion nominated', if any).", "reminders": [ "Minions not nominated", @@ -2342,7 +2342,7 @@ "firstNightReminder": null, "id": "undertaker", "name": "Undertaker", - "otherNight": 59, + "otherNight": 60, "otherNightReminder": "If a player was executed today: Show that player\u2019s character token.", "reminders": [ "Executed" @@ -2372,12 +2372,12 @@ "villageidiot": { "ability": "Each night, choose a player: you learn their alignment. [+0 to +2 Village Idiots. 1 of the extras is drunk]", "edition": "experimental", - "firstNight": 51, + "firstNight": 52, "firstNightReminder": "The Village Idiot points to a player; give a thumbs up if that player is good or a thumbs down if that player is evil.", "id": "villageidiot", "image": "your direct url here", "name": "Village Idiot", - "otherNight": 67, + "otherNight": 68, "otherNightReminder": "The Village Idiot points to a player; give a thumbs up if that player is good or a thumbs down if that player is evil.", "reminders": [ "Drunk" @@ -2405,7 +2405,7 @@ "vizier": { "ability": "All players know who you are. You can not die during the day. If good voted, you may choose to execute immediately.", "edition": "experimental", - "firstNight": 62, + "firstNight": 63, "firstNightReminder": "Announce 'The Vizier is in play' and state which player they are.", "id": "vizier", "name": "Vizier", @@ -2447,7 +2447,7 @@ "washerwoman": { "ability": "You start knowing that 1 of 2 players is a particular Townsfolk.", "edition": "tb", - "firstNight": 35, + "firstNight": 36, "firstNightReminder": "Show the character token of a Townsfolk in play. Point to two players, one of which is that character.", "id": "washerwoman", "name": "Washerwoman", @@ -2464,7 +2464,7 @@ "widow": { "ability": "On your 1st night, look at the Grimoire and choose a player: they are poisoned. 1 good player knows a Widow is in play.", "edition": "experimental", - "firstNight": 19, + "firstNight": 20, "firstNightReminder": "Show the Grimoire to the Widow for as long as they need. The Widow points to a player. That player is poisoned. Wake a good player. Show the 'These characters are in play' card, then the Widow character token.", "id": "widow", "name": "Widow", @@ -2483,7 +2483,7 @@ "witch": { "ability": "Each night, choose a player: if they nominate tomorrow, they die. If just 3 players live, you lose this ability.", "edition": "snv", - "firstNight": 25, + "firstNight": 26, "firstNightReminder": "The Witch points to a player. If that player nominates tomorrow they die immediately.", "id": "witch", "name": "Witch", @@ -2496,6 +2496,22 @@ "setup": false, "team": "minion" }, + "yaggababble": { + "ability": "You start knowing a secret phrase. For each time you said it publicly today, a player might die.", + "edition": "experimental", + "firstNight": 6, + "firstNightReminder": "Show the Yaggababble their secret phrase.", + "id": "yaggababble", + "image": "your direct url here", + "name": "Yaggababble", + "otherNight": 38, + "otherNightReminder": "Choose a number of players up to the total number of times the Yaggababble said their secret phrase publicly, those players die.", + "reminders": [ + "Dead" + ], + "remote_image": "https://raw.githubusercontent.com/chizmw/json-on-the-clocktower/main/data/images/yaggababble.png", + "team": "demon" + }, "zombuul": { "ability": "Each night*, if no-one died today, choose a player: they die. The 1st time you die, you live but register as dead.", "edition": "bmr", @@ -2901,6 +2917,11 @@ "id": "widow", "name": "widow", "physicaltoken": false + }, + "yaggababble": { + "id": "yaggababble", + "name": "yaggababble", + "physicaltoken": false } }, "ks": { @@ -3641,6 +3662,15 @@ } ] }, + { + "id": "Yaggababble", + "jinx": [ + { + "id": "Exorcist", + "reason": "If the Exorcist chooses the Yaggababble, the Yaggababble ability does not kill tonight." + } + ] + }, { "id": "Baron", "jinx": [ @@ -3659,7 +3689,7 @@ "jinx": [ { "id": "Lil' Monsta", - "reason": "The Marionette neighbors a Minion, not the Demon. \nThe Marionette is not woken to choose who takes the Lil' Monsta token, and does not learn they are the Marionette if they have the Lil' Monsta token." + "reason": "The Marionette neighbors a Minion, not the Demon. The Marionette is not woken to choose who takes the Lil' Monsta token, and does not learn they are the Marionette if they have the Lil' Monsta token." }, { "id": "Poppy Grower", @@ -4070,6 +4100,7 @@ "washerwoman", "widow", "witch", + "yaggababble", "zombuul" ], "teams": { @@ -4159,6 +4190,10 @@ { "id": "kazali", "name": "Kazali" + }, + { + "id": "yaggababble", + "name": "Yaggababble" } ], "fabled": [ From 8ccac0a0c1ce5f458a6fcd255d6ca63dd72bec2b Mon Sep 17 00:00:00 2001 From: Chisel Date: Wed, 13 Mar 2024 23:20:50 +0000 Subject: [PATCH 2/2] WIP: flex and improve the template --- .vscode/settings.json | 2 +- Makefile | 3 +- botcpdf/role.py | 40 +-- poetry.lock | 286 +++++++-------- templates/full-fat-night-order.jinja | 58 ++-- templates/player-reference.jinja | 28 +- templates/script.jinja | 6 +- templates/simple-night-order.jinja | 16 +- templates/style.css | 501 +++++++++++---------------- 9 files changed, 412 insertions(+), 528 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index c8a3defc..b5ba357f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,5 +12,5 @@ "[python]": { "editor.defaultFormatter": "ms-python.black-formatter" }, - "conventionalCommits.scopes": ["changelog"] + "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python" } diff --git a/Makefile b/Makefile index 928cb748..ae134969 100644 --- a/Makefile +++ b/Makefile @@ -45,8 +45,9 @@ script-nrb: TARGET:="No Roles Barred" script-gmv: TARGET:="Grind My Viz" script-cs: TARGET:="Clean Sweep" script-jinx: TARGET="Let's Test Some Jinxes" +script-strings: TARGET="Strings Pulling" -script-tb script-nrb script-gmv script-cs script-jinx: poetry +script-tb script-nrb script-gmv script-cs script-jinx script-strings: poetry $(MAKE_PDF) scripts/$(TARGET).json ifeq ($(shell uname),Darwin) @open -a Preview "pdfs/just-baked.pdf" diff --git a/botcpdf/role.py b/botcpdf/role.py index dfb9b22e..7d733c20 100644 --- a/botcpdf/role.py +++ b/botcpdf/role.py @@ -1,5 +1,6 @@ """ Holds information about a BOTC role """ +import re from typing import Optional from botcpdf.jinx import Jinx @@ -53,34 +54,25 @@ def stylize(self, text: str) -> str: if not self.stylized: return text - # this looks weird to me, and as we fetch this data from the json - # we modify it here to suit our desired - text = text.replace( + # we need to match parts of strings that look like: + # - "[+1 Outsider]" + # - "[-2 Outsiders]" + # and wrap the matches in + match_re = r"(\[[+-\u2212]\d+ .+\])" + # replace ALL matches + text = re.sub(match_re, r" \1 ", text) + + easy_replacements = [ "[Most players are Legion]", - " [Most players are Legion]", - ) - text = text.replace( "(Travellers don’t count)", - " [Travellers don’t count]", - ) - text = text.replace( "(not yourself)", - " [not yourself]", - ) - text = text.replace( "[1 Townsfolk is evil]", - " [1 Townsfolk is evil]", - ) - - # replace '[+N Outsider]' with '[+N Outsider]' - text = text.replace("[+", "  [+") - # the next two likes look visually similar, but are different - # the json appears to have a unicode minus sign - text = text.replace("[-", "  [-") - text = text.replace("[\u2212", "  [-") - - # and close - text = text.replace("]", "]") + "[You neighbour the Demon]", + ] + for match_string in easy_replacements: + text = text.replace( + match_string, f" {match_string} " + ) return text diff --git a/poetry.lock b/poetry.lock index 1827470f..b2a686c1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,14 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.1 and should not be changed by hand. [[package]] name = "astroid" -version = "3.0.3" +version = "3.1.0" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.8.0" files = [ - {file = "astroid-3.0.3-py3-none-any.whl", hash = "sha256:92fcf218b89f449cdf9f7b39a269f8d5d617b27be68434912e11e79203963a17"}, - {file = "astroid-3.0.3.tar.gz", hash = "sha256:4148645659b08b70d72460ed1921158027a9e53ae8b7234149b1400eddacbb93"}, + {file = "astroid-3.1.0-py3-none-any.whl", hash = "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819"}, + {file = "astroid-3.1.0.tar.gz", hash = "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4"}, ] [package.dependencies] @@ -16,20 +16,20 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "aws-lambda-powertools" -version = "2.33.1" +version = "2.35.1" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." optional = false python-versions = ">=3.8,<4.0.0" files = [ - {file = "aws_lambda_powertools-2.33.1-py3-none-any.whl", hash = "sha256:f3796733ed345cdf6aa51583465ffd685c34c48a9427083db74bcf7af4f14fa8"}, - {file = "aws_lambda_powertools-2.33.1.tar.gz", hash = "sha256:443846fbd46d4ab1a3a4b3bfc753131f86e0f5e52a79949ecc90201b09661c79"}, + {file = "aws_lambda_powertools-2.35.1-py3-none-any.whl", hash = "sha256:70ff17435a973d9dffff9f99c513477de190c675ad8c0297f67951f0724adcda"}, + {file = "aws_lambda_powertools-2.35.1.tar.gz", hash = "sha256:dc58bbe8a81c22f8cf525cac5c09fa3fcabfd1a4b2ec2abbfeb4c445e0912aa5"}, ] [package.dependencies] typing-extensions = ">=4.6.2,<5.0.0" [package.extras] -all = ["aws-encryption-sdk (>=3.1.1,<4.0.0)", "aws-xray-sdk (>=2.8.0,<3.0.0)", "fastjsonschema (>=2.14.5,<3.0.0)", "jsonpath-ng (>=1.6.0,<2.0.0)", "pydantic (>=1.8.2,<2.0.0)"] +all = ["aws-xray-sdk (>=2.8.0,<3.0.0)", "fastjsonschema (>=2.14.5,<3.0.0)", "pydantic (>=1.8.2,<2.0.0)"] aws-sdk = ["boto3 (>=1.26.164,<2.0.0)"] datadog = ["datadog-lambda (>=4.77,<6.0)"] datamasking = ["aws-encryption-sdk (>=3.1.1,<4.0.0)", "jsonpath-ng (>=1.6.0,<2.0.0)"] @@ -40,13 +40,13 @@ validation = ["fastjsonschema (>=2.14.5,<3.0.0)"] [[package]] name = "aws-xray-sdk" -version = "2.12.1" +version = "2.13.0" description = "The AWS X-Ray SDK for Python (the SDK) enables Python developers to record and emit information from within their applications to the AWS X-Ray service." optional = false python-versions = ">=3.7" files = [ - {file = "aws-xray-sdk-2.12.1.tar.gz", hash = "sha256:0bbfdbc773cfef4061062ac940b85e408297a2242f120bcdfee2593209b1e432"}, - {file = "aws_xray_sdk-2.12.1-py2.py3-none-any.whl", hash = "sha256:f6803832dc08d18cc265e2327a69bfa9ee41c121fac195edc9745d04b7a566c3"}, + {file = "aws-xray-sdk-2.13.0.tar.gz", hash = "sha256:816186126917bc35ae4e6e2f304702a43d494ecef34a39e6330f5018bdecc9f5"}, + {file = "aws_xray_sdk-2.13.0-py2.py3-none-any.whl", hash = "sha256:d18604a8688b4bed03ce4a858cc9acd72b71400e085bf7512fc31cf657ca85f9"}, ] [package.dependencies] @@ -55,33 +55,33 @@ wrapt = "*" [[package]] name = "black" -version = "24.1.1" +version = "24.2.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2588021038bd5ada078de606f2a804cadd0a3cc6a79cb3e9bb3a8bf581325a4c"}, - {file = "black-24.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a95915c98d6e32ca43809d46d932e2abc5f1f7d582ffbe65a5b4d1588af7445"}, - {file = "black-24.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fa6a0e965779c8f2afb286f9ef798df770ba2b6cee063c650b96adec22c056a"}, - {file = "black-24.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:5242ecd9e990aeb995b6d03dc3b2d112d4a78f2083e5a8e86d566340ae80fec4"}, - {file = "black-24.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fc1ec9aa6f4d98d022101e015261c056ddebe3da6a8ccfc2c792cbe0349d48b7"}, - {file = "black-24.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0269dfdea12442022e88043d2910429bed717b2d04523867a85dacce535916b8"}, - {file = "black-24.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3d64db762eae4a5ce04b6e3dd745dcca0fb9560eb931a5be97472e38652a161"}, - {file = "black-24.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:5d7b06ea8816cbd4becfe5f70accae953c53c0e53aa98730ceccb0395520ee5d"}, - {file = "black-24.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e2c8dfa14677f90d976f68e0c923947ae68fa3961d61ee30976c388adc0b02c8"}, - {file = "black-24.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a21725862d0e855ae05da1dd25e3825ed712eaaccef6b03017fe0853a01aa45e"}, - {file = "black-24.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07204d078e25327aad9ed2c64790d681238686bce254c910de640c7cc4fc3aa6"}, - {file = "black-24.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:a83fe522d9698d8f9a101b860b1ee154c1d25f8a82ceb807d319f085b2627c5b"}, - {file = "black-24.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08b34e85170d368c37ca7bf81cf67ac863c9d1963b2c1780c39102187ec8dd62"}, - {file = "black-24.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7258c27115c1e3b5de9ac6c4f9957e3ee2c02c0b39222a24dc7aa03ba0e986f5"}, - {file = "black-24.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40657e1b78212d582a0edecafef133cf1dd02e6677f539b669db4746150d38f6"}, - {file = "black-24.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e298d588744efda02379521a19639ebcd314fba7a49be22136204d7ed1782717"}, - {file = "black-24.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:34afe9da5056aa123b8bfda1664bfe6fb4e9c6f311d8e4a6eb089da9a9173bf9"}, - {file = "black-24.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:854c06fb86fd854140f37fb24dbf10621f5dab9e3b0c29a690ba595e3d543024"}, - {file = "black-24.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3897ae5a21ca132efa219c029cce5e6bfc9c3d34ed7e892113d199c0b1b444a2"}, - {file = "black-24.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:ecba2a15dfb2d97105be74bbfe5128bc5e9fa8477d8c46766505c1dda5883aac"}, - {file = "black-24.1.1-py3-none-any.whl", hash = "sha256:5cdc2e2195212208fbcae579b931407c1fa9997584f0a415421748aeafff1168"}, - {file = "black-24.1.1.tar.gz", hash = "sha256:48b5760dcbfe5cf97fd4fba23946681f3a81514c6ab8a45b50da67ac8fbc6c7b"}, + {file = "black-24.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6981eae48b3b33399c8757036c7f5d48a535b962a7c2310d19361edeef64ce29"}, + {file = "black-24.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d533d5e3259720fdbc1b37444491b024003e012c5173f7d06825a77508085430"}, + {file = "black-24.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61a0391772490ddfb8a693c067df1ef5227257e72b0e4108482b8d41b5aee13f"}, + {file = "black-24.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:992e451b04667116680cb88f63449267c13e1ad134f30087dec8527242e9862a"}, + {file = "black-24.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:163baf4ef40e6897a2a9b83890e59141cc8c2a98f2dda5080dc15c00ee1e62cd"}, + {file = "black-24.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e37c99f89929af50ffaf912454b3e3b47fd64109659026b678c091a4cd450fb2"}, + {file = "black-24.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9de21bafcba9683853f6c96c2d515e364aee631b178eaa5145fc1c61a3cc92"}, + {file = "black-24.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:9db528bccb9e8e20c08e716b3b09c6bdd64da0dd129b11e160bf082d4642ac23"}, + {file = "black-24.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d84f29eb3ee44859052073b7636533ec995bd0f64e2fb43aeceefc70090e752b"}, + {file = "black-24.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e08fb9a15c914b81dd734ddd7fb10513016e5ce7e6704bdd5e1251ceee51ac9"}, + {file = "black-24.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810d445ae6069ce64030c78ff6127cd9cd178a9ac3361435708b907d8a04c693"}, + {file = "black-24.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ba15742a13de85e9b8f3239c8f807723991fbfae24bad92d34a2b12e81904982"}, + {file = "black-24.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e53a8c630f71db01b28cd9602a1ada68c937cbf2c333e6ed041390d6968faf4"}, + {file = "black-24.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93601c2deb321b4bad8f95df408e3fb3943d85012dddb6121336b8e24a0d1218"}, + {file = "black-24.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0057f800de6acc4407fe75bb147b0c2b5cbb7c3ed110d3e5999cd01184d53b0"}, + {file = "black-24.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:faf2ee02e6612577ba0181f4347bcbcf591eb122f7841ae5ba233d12c39dcb4d"}, + {file = "black-24.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:057c3dc602eaa6fdc451069bd027a1b2635028b575a6c3acfd63193ced20d9c8"}, + {file = "black-24.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08654d0797e65f2423f850fc8e16a0ce50925f9337fb4a4a176a7aa4026e63f8"}, + {file = "black-24.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca610d29415ee1a30a3f30fab7a8f4144e9d34c89a235d81292a1edb2b55f540"}, + {file = "black-24.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:4dd76e9468d5536abd40ffbc7a247f83b2324f0c050556d9c371c2b9a9a95e31"}, + {file = "black-24.2.0-py3-none-any.whl", hash = "sha256:e8a6ae970537e67830776488bca52000eaa37fa63b9988e8c487458d9cd5ace6"}, + {file = "black-24.2.0.tar.gz", hash = "sha256:bce4f25c27c3435e4dace4815bcb2008b87e167e3bf4ee47ccdc5ce906eb4894"}, ] [package.dependencies] @@ -101,17 +101,17 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.34.39" +version = "1.34.61" description = "The AWS SDK for Python" optional = false python-versions = ">= 3.8" files = [ - {file = "boto3-1.34.39-py3-none-any.whl", hash = "sha256:476896e70d36c9134d4125834280c597c17b54bff4902baf2e5fcde74f8acec8"}, - {file = "boto3-1.34.39.tar.gz", hash = "sha256:35bcbecf1b5d3620c93f0062d2994177f8bda25a9d2cba144d6462793c16065b"}, + {file = "boto3-1.34.61-py3-none-any.whl", hash = "sha256:992e994c7e481a5d3259c699574882b79d631a46f7c369bea350b7ccb0651317"}, + {file = "boto3-1.34.61.tar.gz", hash = "sha256:4b40bf2c8494647c9e88c180537dc9fc0c1047a9fffbb1e5b0da6596f1e59b7b"}, ] [package.dependencies] -botocore = ">=1.34.39,<1.35.0" +botocore = ">=1.34.61,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -120,13 +120,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.39" +version = "1.34.61" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">= 3.8" files = [ - {file = "botocore-1.34.39-py3-none-any.whl", hash = "sha256:e175360445424b83b0e28ae20d301b99cf44ff2c9d5ab1d8670899bec05a9753"}, - {file = "botocore-1.34.39.tar.gz", hash = "sha256:9f00bd5e4698bcdd37ce6e224a896baf58d209678ed92834944b767de9061cc5"}, + {file = "botocore-1.34.61-py3-none-any.whl", hash = "sha256:079f3288d38f97fd5656c25c44a94bea0e7090b938abfdeea463eaadb210c4a0"}, + {file = "botocore-1.34.61.tar.gz", hash = "sha256:72df4af7e4e6392552c882d48c74e4be9bf7be4cd8d829711b312fbae13d7034"}, ] [package.dependencies] @@ -534,53 +534,53 @@ test = ["pytest (>=6)"] [[package]] name = "fonttools" -version = "4.48.1" +version = "4.49.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.48.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:702ae93058c81f46461dc4b2c79f11d3c3d8fd7296eaf8f75b4ba5bbf813cd5f"}, - {file = "fonttools-4.48.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97f0a49fa6aa2d6205c6f72f4f98b74ef4b9bfdcb06fd78e6fe6c7af4989b63e"}, - {file = "fonttools-4.48.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3260db55f1843e57115256e91247ad9f68cb02a434b51262fe0019e95a98738"}, - {file = "fonttools-4.48.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e740a7602c2bb71e1091269b5dbe89549749a8817dc294b34628ffd8b2bf7124"}, - {file = "fonttools-4.48.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4108b1d247953dd7c90ec8f457a2dec5fceb373485973cc852b14200118a51ee"}, - {file = "fonttools-4.48.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56339ec557f0c342bddd7c175f5e41c45fc21282bee58a86bd9aa322bec715f2"}, - {file = "fonttools-4.48.1-cp310-cp310-win32.whl", hash = "sha256:bff5b38d0e76eb18e0b8abbf35d384e60b3371be92f7be36128ee3e67483b3ec"}, - {file = "fonttools-4.48.1-cp310-cp310-win_amd64.whl", hash = "sha256:f7449493886da6a17472004d3818cc050ba3f4a0aa03fb47972e4fa5578e6703"}, - {file = "fonttools-4.48.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18b35fd1a850ed7233a99bbd6774485271756f717dac8b594958224b54118b61"}, - {file = "fonttools-4.48.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cad5cfd044ea2e306fda44482b3dd32ee47830fa82dfa4679374b41baa294f5f"}, - {file = "fonttools-4.48.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f30e605c7565d0da6f0aec75a30ec372072d016957cd8fc4469721a36ea59b7"}, - {file = "fonttools-4.48.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee76fd81a8571c68841d6ef0da750d5ff08ff2c5f025576473016f16ac3bcf7"}, - {file = "fonttools-4.48.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5057ade278e67923000041e2b195c9ea53e87f227690d499b6a4edd3702f7f01"}, - {file = "fonttools-4.48.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b10633aafc5932995a391ec07eba5e79f52af0003a1735b2306b3dab8a056d48"}, - {file = "fonttools-4.48.1-cp311-cp311-win32.whl", hash = "sha256:0d533f89819f9b3ee2dbedf0fed3825c425850e32bdda24c558563c71be0064e"}, - {file = "fonttools-4.48.1-cp311-cp311-win_amd64.whl", hash = "sha256:d20588466367f05025bb1efdf4e5d498ca6d14bde07b6928b79199c588800f0a"}, - {file = "fonttools-4.48.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0a2417547462e468edf35b32e3dd06a6215ac26aa6316b41e03b8eeaf9f079ea"}, - {file = "fonttools-4.48.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cf5a0cd974f85a80b74785db2d5c3c1fd6cc09a2ba3c837359b2b5da629ee1b0"}, - {file = "fonttools-4.48.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0452fcbfbce752ba596737a7c5ec5cf76bc5f83847ce1781f4f90eab14ece252"}, - {file = "fonttools-4.48.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578c00f93868f64a4102ecc5aa600a03b49162c654676c3fadc33de2ddb88a81"}, - {file = "fonttools-4.48.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:63dc592a16cd08388d8c4c7502b59ac74190b23e16dfc863c69fe1ea74605b68"}, - {file = "fonttools-4.48.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9b58638d8a85e3a1b32ec0a91d9f8171a877b4b81c408d4cb3257d0dee63e092"}, - {file = "fonttools-4.48.1-cp312-cp312-win32.whl", hash = "sha256:d10979ef14a8beaaa32f613bb698743f7241d92f437a3b5e32356dfb9769c65d"}, - {file = "fonttools-4.48.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdfd7557d1bd294a200bd211aa665ca3b02998dcc18f8211a5532da5b8fad5c5"}, - {file = "fonttools-4.48.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3cdb9a92521b81bf717ebccf592bd0292e853244d84115bfb4db0c426de58348"}, - {file = "fonttools-4.48.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b4ec6d42a7555f5ae35f3b805482f0aad0f1baeeef54859492ea3b782959d4a"}, - {file = "fonttools-4.48.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902e9c4e9928301912f34a6638741b8ae0b64824112b42aaf240e06b735774b1"}, - {file = "fonttools-4.48.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8c8b54bd1420c184a995f980f1a8076f87363e2bb24239ef8c171a369d85a31"}, - {file = "fonttools-4.48.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:12ee86abca46193359ea69216b3a724e90c66ab05ab220d39e3fc068c1eb72ac"}, - {file = "fonttools-4.48.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6978bade7b6c0335095bdd0bd97f8f3d590d2877b370f17e03e0865241694eb5"}, - {file = "fonttools-4.48.1-cp38-cp38-win32.whl", hash = "sha256:bcd77f89fc1a6b18428e7a55dde8ef56dae95640293bfb8f4e929929eba5e2a2"}, - {file = "fonttools-4.48.1-cp38-cp38-win_amd64.whl", hash = "sha256:f40441437b039930428e04fb05ac3a132e77458fb57666c808d74a556779e784"}, - {file = "fonttools-4.48.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0d2b01428f7da26f229a5656defc824427b741e454b4e210ad2b25ed6ea2aed4"}, - {file = "fonttools-4.48.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:df48798f9a4fc4c315ab46e17873436c8746f5df6eddd02fad91299b2af7af95"}, - {file = "fonttools-4.48.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2eb4167bde04e172a93cf22c875d8b0cff76a2491f67f5eb069566215302d45d"}, - {file = "fonttools-4.48.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c900508c46274d32d308ae8e82335117f11aaee1f7d369ac16502c9a78930b0a"}, - {file = "fonttools-4.48.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:594206b31c95fcfa65f484385171fabb4ec69f7d2d7f56d27f17db26b7a31814"}, - {file = "fonttools-4.48.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:292922dc356d7f11f5063b4111a8b719efb8faea92a2a88ed296408d449d8c2e"}, - {file = "fonttools-4.48.1-cp39-cp39-win32.whl", hash = "sha256:4709c5bf123ba10eac210d2d5c9027d3f472591d9f1a04262122710fa3d23199"}, - {file = "fonttools-4.48.1-cp39-cp39-win_amd64.whl", hash = "sha256:63c73b9dd56a94a3cbd2f90544b5fca83666948a9e03370888994143b8d7c070"}, - {file = "fonttools-4.48.1-py3-none-any.whl", hash = "sha256:e3e33862fc5261d46d9aae3544acb36203b1a337d00bdb5d3753aae50dac860e"}, - {file = "fonttools-4.48.1.tar.gz", hash = "sha256:8b8a45254218679c7f1127812761e7854ed5c8e34349aebf581e8c9204e7495a"}, + {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d970ecca0aac90d399e458f0b7a8a597e08f95de021f17785fb68e2dc0b99717"}, + {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac9a745b7609f489faa65e1dc842168c18530874a5f5b742ac3dd79e26bca8bc"}, + {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ba0e00620ca28d4ca11fc700806fd69144b463aa3275e1b36e56c7c09915559"}, + {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdee3ab220283057e7840d5fb768ad4c2ebe65bdba6f75d5d7bf47f4e0ed7d29"}, + {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ce7033cb61f2bb65d8849658d3786188afd80f53dad8366a7232654804529532"}, + {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:07bc5ea02bb7bc3aa40a1eb0481ce20e8d9b9642a9536cde0218290dd6085828"}, + {file = "fonttools-4.49.0-cp310-cp310-win32.whl", hash = "sha256:86eef6aab7fd7c6c8545f3ebd00fd1d6729ca1f63b0cb4d621bccb7d1d1c852b"}, + {file = "fonttools-4.49.0-cp310-cp310-win_amd64.whl", hash = "sha256:1fac1b7eebfce75ea663e860e7c5b4a8831b858c17acd68263bc156125201abf"}, + {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:edc0cce355984bb3c1d1e89d6a661934d39586bb32191ebff98c600f8957c63e"}, + {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:83a0d9336de2cba86d886507dd6e0153df333ac787377325a39a2797ec529814"}, + {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36c8865bdb5cfeec88f5028e7e592370a0657b676c6f1d84a2108e0564f90e22"}, + {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33037d9e56e2562c710c8954d0f20d25b8386b397250d65581e544edc9d6b942"}, + {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8fb022d799b96df3eaa27263e9eea306bd3d437cc9aa981820850281a02b6c9a"}, + {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33c584c0ef7dc54f5dd4f84082eabd8d09d1871a3d8ca2986b0c0c98165f8e86"}, + {file = "fonttools-4.49.0-cp311-cp311-win32.whl", hash = "sha256:cbe61b158deb09cffdd8540dc4a948d6e8f4d5b4f3bf5cd7db09bd6a61fee64e"}, + {file = "fonttools-4.49.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc11e5114f3f978d0cea7e9853627935b30d451742eeb4239a81a677bdee6bf6"}, + {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d647a0e697e5daa98c87993726da8281c7233d9d4ffe410812a4896c7c57c075"}, + {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f3bbe672df03563d1f3a691ae531f2e31f84061724c319652039e5a70927167e"}, + {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bebd91041dda0d511b0d303180ed36e31f4f54b106b1259b69fade68413aa7ff"}, + {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4145f91531fd43c50f9eb893faa08399816bb0b13c425667c48475c9f3a2b9b5"}, + {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea329dafb9670ffbdf4dbc3b0e5c264104abcd8441d56de77f06967f032943cb"}, + {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c076a9e548521ecc13d944b1d261ff3d7825048c338722a4bd126d22316087b7"}, + {file = "fonttools-4.49.0-cp312-cp312-win32.whl", hash = "sha256:b607ea1e96768d13be26d2b400d10d3ebd1456343eb5eaddd2f47d1c4bd00880"}, + {file = "fonttools-4.49.0-cp312-cp312-win_amd64.whl", hash = "sha256:a974c49a981e187381b9cc2c07c6b902d0079b88ff01aed34695ec5360767034"}, + {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b85ec0bdd7bdaa5c1946398cbb541e90a6dfc51df76dfa88e0aaa41b335940cb"}, + {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:af20acbe198a8a790618ee42db192eb128afcdcc4e96d99993aca0b60d1faeb4"}, + {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d418b1fee41a1d14931f7ab4b92dc0bc323b490e41d7a333eec82c9f1780c75"}, + {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b44a52b8e6244b6548851b03b2b377a9702b88ddc21dcaf56a15a0393d425cb9"}, + {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7c7125068e04a70739dad11857a4d47626f2b0bd54de39e8622e89701836eabd"}, + {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29e89d0e1a7f18bc30f197cfadcbef5a13d99806447c7e245f5667579a808036"}, + {file = "fonttools-4.49.0-cp38-cp38-win32.whl", hash = "sha256:9d95fa0d22bf4f12d2fb7b07a46070cdfc19ef5a7b1c98bc172bfab5bf0d6844"}, + {file = "fonttools-4.49.0-cp38-cp38-win_amd64.whl", hash = "sha256:768947008b4dc552d02772e5ebd49e71430a466e2373008ce905f953afea755a"}, + {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:08877e355d3dde1c11973bb58d4acad1981e6d1140711230a4bfb40b2b937ccc"}, + {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fdb54b076f25d6b0f0298dc706acee5052de20c83530fa165b60d1f2e9cbe3cb"}, + {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0af65c720520710cc01c293f9c70bd69684365c6015cc3671db2b7d807fe51f2"}, + {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f255ce8ed7556658f6d23f6afd22a6d9bbc3edb9b96c96682124dc487e1bf42"}, + {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d00af0884c0e65f60dfaf9340e26658836b935052fdd0439952ae42e44fdd2be"}, + {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:263832fae27481d48dfafcc43174644b6706639661e242902ceb30553557e16c"}, + {file = "fonttools-4.49.0-cp39-cp39-win32.whl", hash = "sha256:0404faea044577a01bb82d47a8fa4bc7a54067fa7e324785dd65d200d6dd1133"}, + {file = "fonttools-4.49.0-cp39-cp39-win_amd64.whl", hash = "sha256:b050d362df50fc6e38ae3954d8c29bf2da52be384649ee8245fdb5186b620836"}, + {file = "fonttools-4.49.0-py3-none-any.whl", hash = "sha256:af281525e5dd7fa0b39fb1667b8d5ca0e2a9079967e14c4bfe90fd1cd13e0f18"}, + {file = "fonttools-4.49.0.tar.gz", hash = "sha256:ebf46e7f01b7af7861310417d7c49591a85d99146fc23a5ba82fdb28af156321"}, ] [package.dependencies] @@ -769,38 +769,38 @@ files = [ [[package]] name = "mypy" -version = "1.8.0" +version = "1.9.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, - {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, - {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, - {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, - {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, - {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, - {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, - {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, - {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, - {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, - {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, - {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, - {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, - {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, - {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, - {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, - {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, - {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, - {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, + {file = "mypy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8a67616990062232ee4c3952f41c779afac41405806042a8126fe96e098419f"}, + {file = "mypy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d357423fa57a489e8c47b7c85dfb96698caba13d66e086b412298a1a0ea3b0ed"}, + {file = "mypy-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c87c15aed320de9b438ae7b00c1ac91cd393c1b854c2ce538e2a72d55df150"}, + {file = "mypy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:48533cdd345c3c2e5ef48ba3b0d3880b257b423e7995dada04248725c6f77374"}, + {file = "mypy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:4d3dbd346cfec7cb98e6cbb6e0f3c23618af826316188d587d1c1bc34f0ede03"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:653265f9a2784db65bfca694d1edd23093ce49740b2244cde583aeb134c008f3"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a3c007ff3ee90f69cf0a15cbcdf0995749569b86b6d2f327af01fd1b8aee9dc"}, + {file = "mypy-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2418488264eb41f69cc64a69a745fad4a8f86649af4b1041a4c64ee61fc61129"}, + {file = "mypy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68edad3dc7d70f2f17ae4c6c1b9471a56138ca22722487eebacfd1eb5321d612"}, + {file = "mypy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:85ca5fcc24f0b4aeedc1d02f93707bccc04733f21d41c88334c5482219b1ccb3"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aceb1db093b04db5cd390821464504111b8ec3e351eb85afd1433490163d60cd"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0235391f1c6f6ce487b23b9dbd1327b4ec33bb93934aa986efe8a9563d9349e6"}, + {file = "mypy-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d5ddc13421ba3e2e082a6c2d74c2ddb3979c39b582dacd53dd5d9431237185"}, + {file = "mypy-1.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:190da1ee69b427d7efa8aa0d5e5ccd67a4fb04038c380237a0d96829cb157913"}, + {file = "mypy-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe28657de3bfec596bbeef01cb219833ad9d38dd5393fc649f4b366840baefe6"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e54396d70be04b34f31d2edf3362c1edd023246c82f1730bbf8768c28db5361b"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5e6061f44f2313b94f920e91b204ec600982961e07a17e0f6cd83371cb23f5c2"}, + {file = "mypy-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a10926e5473c5fc3da8abb04119a1f5811a236dc3a38d92015cb1e6ba4cb9e"}, + {file = "mypy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b685154e22e4e9199fc95f298661deea28aaede5ae16ccc8cbb1045e716b3e04"}, + {file = "mypy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d741d3fc7c4da608764073089e5f58ef6352bedc223ff58f2f038c2c4698a89"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:587ce887f75dd9700252a3abbc9c97bbe165a4a630597845c61279cf32dfbf02"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f88566144752999351725ac623471661c9d1cd8caa0134ff98cceeea181789f4"}, + {file = "mypy-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61758fabd58ce4b0720ae1e2fea5cfd4431591d6d590b197775329264f86311d"}, + {file = "mypy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e49499be624dead83927e70c756970a0bc8240e9f769389cdf5714b0784ca6bf"}, + {file = "mypy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:571741dc4194b4f82d344b15e8837e8c5fcc462d66d076748142327626a1b6e9"}, + {file = "mypy-1.9.0-py3-none-any.whl", hash = "sha256:a260627a570559181a9ea5de61ac6297aa5af202f06fd7ab093ce74e7181e43e"}, + {file = "mypy-1.9.0.tar.gz", hash = "sha256:3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974"}, ] [package.dependencies] @@ -827,13 +827,13 @@ files = [ [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -989,13 +989,13 @@ files = [ [[package]] name = "pydyf" -version = "0.8.0" +version = "0.9.0" description = "A low-level PDF generator." optional = false python-versions = ">=3.7" files = [ - {file = "pydyf-0.8.0-py3-none-any.whl", hash = "sha256:901186a2e9f897108139426a6486f5225bdcc9b70be2ec965f25111e42f8ac5d"}, - {file = "pydyf-0.8.0.tar.gz", hash = "sha256:b22b1ef016141b54941ad66ed4e036a7bdff39c0b360993b283875c3f854dd9a"}, + {file = "pydyf-0.9.0-py3-none-any.whl", hash = "sha256:f0e447d9f69ca20cfa3ab3d17e274e26cc877bb6e36b4a83d196616a089db0dd"}, + {file = "pydyf-0.9.0.tar.gz", hash = "sha256:d5b244e8fc24119ce7bd5d51ea2d6773c0ff88aa81597db556bc440c6b880610"}, ] [package.extras] @@ -1004,17 +1004,17 @@ test = ["flake8", "isort", "pillow", "pytest"] [[package]] name = "pylint" -version = "3.0.3" +version = "3.1.0" description = "python code static checker" optional = false python-versions = ">=3.8.0" files = [ - {file = "pylint-3.0.3-py3-none-any.whl", hash = "sha256:7a1585285aefc5165db81083c3e06363a27448f6b467b3b0f30dbd0ac1f73810"}, - {file = "pylint-3.0.3.tar.gz", hash = "sha256:58c2398b0301e049609a8429789ec6edf3aabe9b6c5fec916acd18639c16de8b"}, + {file = "pylint-3.1.0-py3-none-any.whl", hash = "sha256:507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74"}, + {file = "pylint-3.1.0.tar.gz", hash = "sha256:6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23"}, ] [package.dependencies] -astroid = ">=3.0.1,<=3.1.0-dev0" +astroid = ">=3.1.0,<=3.2.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -1033,13 +1033,13 @@ testutils = ["gitpython (>3)"] [[package]] name = "pypdf" -version = "4.0.1" +version = "4.1.0" description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" optional = false python-versions = ">=3.6" files = [ - {file = "pypdf-4.0.1-py3-none-any.whl", hash = "sha256:fe7c313c7e8074a516eae9d9df0111b7b9769f7a210479af7a342d27270ef81a"}, - {file = "pypdf-4.0.1.tar.gz", hash = "sha256:871badcfe335dd68b6b563aa7646288c6b86f9ceecffb21e86341261d65d8173"}, + {file = "pypdf-4.1.0-py3-none-any.whl", hash = "sha256:16cac912a05200099cef3f347c4c7e0aaf0a6d027603b8f9a973c0ea500dff89"}, + {file = "pypdf-4.1.0.tar.gz", hash = "sha256:01c3257ec908676efd60a4537e525b89d48e0852bc92b4e0aa4cc646feda17cc"}, ] [package.extras] @@ -1066,13 +1066,13 @@ test = ["flake8", "isort", "pytest"] [[package]] name = "pytest" -version = "8.0.0" +version = "8.1.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.0.0-py3-none-any.whl", hash = "sha256:50fb9cbe836c3f20f0dfa99c565201fb75dc54c8d76373cd1bde06b06657bdb6"}, - {file = "pytest-8.0.0.tar.gz", hash = "sha256:249b1b0864530ba251b7438274c4d251c58d868edaaec8762893ad4a0d71c36c"}, + {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, + {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, ] [package.dependencies] @@ -1080,21 +1080,21 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.3.0,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +pluggy = ">=1.4,<2.0" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -1205,24 +1205,24 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.3" +version = "0.12.4" description = "Style preserving TOML library" optional = false python-versions = ">=3.7" files = [ - {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, - {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, + {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, + {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, ] [[package]] name = "types-requests" -version = "2.31.0.20240125" +version = "2.31.0.20240311" description = "Typing stubs for requests" optional = false python-versions = ">=3.8" files = [ - {file = "types-requests-2.31.0.20240125.tar.gz", hash = "sha256:03a28ce1d7cd54199148e043b2079cdded22d6795d19a2c2a6791a4b2b5e2eb5"}, - {file = "types_requests-2.31.0.20240125-py3-none-any.whl", hash = "sha256:9592a9a4cb92d6d75d9b491a41477272b710e021011a2a3061157e2fb1f1a5d1"}, + {file = "types-requests-2.31.0.20240311.tar.gz", hash = "sha256:b1c1b66abfb7fa79aae09097a811c4aa97130eb8831c60e47aee4ca344731ca5"}, + {file = "types_requests-2.31.0.20240311-py3-none-any.whl", hash = "sha256:47872893d65a38e282ee9f277a4ee50d1b28bd592040df7d1fdaffdf3779937d"}, ] [package.dependencies] @@ -1230,13 +1230,13 @@ urllib3 = ">=2" [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.10.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, ] [[package]] diff --git a/templates/full-fat-night-order.jinja b/templates/full-fat-night-order.jinja index 67d7f184..5857dccc 100644 --- a/templates/full-fat-night-order.jinja +++ b/templates/full-fat-night-order.jinja @@ -13,18 +13,23 @@ - {%- for character in first_night %} -
- {{ character.name }} - {{ character.name }} - {{ character.ability }} -
{{ character.first_night_reminder }}
-
- - {%- if not loop.last %} -
- {%- endif %} - {%- endfor %} +
+ {%- for role in first_night %} +
+ {{ role.name }} +
+
+
{{ role.name }}
+
{{ role.ability }}
+
+
{{ role.first_night_reminder }}
+
+
+ {%- if not loop.last %} +
+ {%- endif %} + {%- endfor %} +
{# if we have at most 15 items in first_night #} {% if first_night|length <= 15 %} @@ -46,18 +51,23 @@ - {%- for character in other_nights %} -
- {{ character.name }} - {{ character.name }} - {{ character.ability }} -
{{ character.other_night_reminder }}
-
- - {%- if not loop.last %} -
- {%- endif %} - {%- endfor %} +
+ {%- for role in other_nights %} +
+ {{ role.name }} +
+
+
{{ role.name }}
+
{{ role.ability }}
+
+
{{ role.other_night_reminder }}
+
+
+ {%- if not loop.last %} +
+ {%- endif %} + {%- endfor %} +
{# if we have at most 15 items in other_nights #} {% if other_nights|length <= 15 %} diff --git a/templates/player-reference.jinja b/templates/player-reference.jinja index 2bc76fc7..b996f9b9 100644 --- a/templates/player-reference.jinja +++ b/templates/player-reference.jinja @@ -15,24 +15,20 @@ {%- for type in characters %} {%- set type_plural = type + 's' if type != 'townsfolk' else type %} -

{{ type_plural | upper }}

-
- {%- for character in characters[type] %} -
- {{ character.name }} -
- {{ character.name }} - {%- if hatred[character.id_slug] %} -
- JINXES - {%- for hater in hatred[character.id_slug] %} - {{ hater }} - {%- endfor %} -
- {%- endif %} +

{{ type_plural | upper }}

+
+ {%- for role in characters[type] %} +
+ {{ role.name }} +
+
+ {{ role.name }} +
+
+ {{ role.ability }}
-
{{ character.ability }}
+
{%- endfor %}
diff --git a/templates/script.jinja b/templates/script.jinja index 690810d7..9ceba8db 100644 --- a/templates/script.jinja +++ b/templates/script.jinja @@ -27,11 +27,11 @@ - {% include 'player-reference-easyloop.jinja' %} + {%- include 'player-reference-easyloop.jinja' %} {%- if script_options.simple_night_order == True %} {%- set night_include = "simple-night-order.jinja" -%} @@ -39,7 +39,7 @@ {%- set night_include = "full-fat-night-order.jinja" -%} {%- endif %} - {% include night_include %} + {%- include night_include %} diff --git a/templates/simple-night-order.jinja b/templates/simple-night-order.jinja index 2e143265..32b13d29 100644 --- a/templates/simple-night-order.jinja +++ b/templates/simple-night-order.jinja @@ -1,20 +1,20 @@

First Night

- {%- for character in first_night %} -
- {{ character.name }} - {{ character.name }} + {%- for role in first_night %} +
+ {{ role.name }} + {{ role.name }}
{%- endfor %}

Other Nights

- {%- for character in other_nights %} -
- {{ character.name }} - {{ character.name }} + {%- for role in other_nights %} +
+ {{ role.name }} + {{ role.name }}
{%- endfor %}
diff --git a/templates/style.css b/templates/style.css index b834ceca..1559abe7 100644 --- a/templates/style.css +++ b/templates/style.css @@ -1,3 +1,5 @@ +/* page "magic" for the PDF hints */ +/* we usually override size in generated.css */ @page { background-color: white; margin-bottom: 5mm; @@ -6,74 +8,67 @@ margin-top: 5mm; size: A5 landscape; } + +/* the page body - with a weird font colour to make it really obvious if we missed it in a style */ body { - color: #ff0; + color: purple; font-family: 'Fira Sans', sans-serif; font-size: 8pt; margin-left: 20px; + border: 1px dashed white; } -div.not-first-night { - bottom: 2%; - color: #000; - font-family: 'Fira Sans', sans-serif; - font-size: 8pt; - left: 50%; - position: absolute; - transform: translateX(-50%); -} - -.full-page { - align-items: center; - bottom: 5mm; - justify-content: center; - left: 12mm; - position: absolute; - right: 12mm; - top: 5mm; -} +/* the page header */ -.first-night { - left: 0; - margin-left: -20px; /* Adjust this value to match the column gap */ - position: absolute; - top: 0; - width: 50%; +.heading-container { + display: flex; + justify-content: space-between; + align-items: flex-start; + width: 100%; } -.other-nights { - bottom: 0; - position: absolute; - right: 0; - transform: rotate(180deg); - width: 50%; +header { + align-items: flex-start; + background-color: #2f4f4f; + color: #fff; + display: flex; + justify-content: space-between; } -.centered-div { - border-color: #dddddd; - border-style: solid dashed; - border-width: 3px; - left: 50%; - max-width: 40%; - padding: 1rem; - position: absolute; - top: 30%; - transform: translate(-50%, -30%); - - max-height: 1200px; /* Adjust the height value as needed */ - overflow: auto; +.author-presents { + display: inline-block; + font-size: 14px; + font-weight: 700; + color: darkslategray; + font-family: 'Dancing Script', cursive; + transform: rotate(-8deg); + opacity: 0.8; + padding-top: 8px; } -footer .footer-left { +.top-left-header { + font-family: 'Alegreya Sans SC', sans-serif; font-size: 8px; - left: 0; - margin-left: 10px; + padding-left: 10px; } -footer .footer-right { +.top-right-header { + font-family: 'Alegreya Sans SC', sans-serif; font-size: 8px; - right: 0; + padding-right: 10px; } + +h1.script-title { + color: #000; + font-family: 'Alegreya Sans SC', sans-serif; + font-size: 18pt; + font-weight: 900; + text-align: right; + margin-bottom: 0; + margin-left: 5px; +} + +/* the (page) footer */ footer { align-items: flex-start; bottom: 10px; @@ -86,7 +81,63 @@ footer { position: fixed; right: 0; } -h2.character-type { +footer .footer-left { + font-size: 8px; + left: 0; + margin-left: 10px; +} +footer .footer-right { + font-size: 8px; + right: 0; +} + +/* roles container(s) */ + +.role-container { + display: flex; + flex-wrap: wrap; + background-color: white; +} + +.role-block { + min-width: 340px; + max-width: 340px; + margin: 5px; + display: flex; + align-items: flex-start; + background-color: white; +} + +.role-block > img, +.night-role-block > img { + max-height: 50px; + max-width: 50px; + margin-right: 10px; + margin-left: -10px; + border: 1px solid white; + break-inside: avoid-column; +} + +.role-info { + display: flex; + flex-direction: column; /* Stack items vertically */ + flex: 1; /* Take up equal space within the flex container */ + border: 1px dashed white; +} + +/* plyaer reference extras */ +div.not-first-night { + bottom: 2%; + color: #000; + font-family: 'Fira Sans', sans-serif; + font-size: 8pt; + left: 50%; + position: absolute; + transform: translateX(-50%); +} + +/* role type header */ +h2.role-type { font-family: 'Alegreya Sans SC', sans-serif; font-size: 18px; font-weight: 900; @@ -99,318 +150,152 @@ h2.character-type { transform-origin: left; white-space: nowrap; } -h2.simple-first-night { - border-bottom: 1.5px solid #000; - color: #000; - font-family: 'Alegreya Sans SC', sans-serif; - font-size: 18pt; - font-weight: 900; -} -header { - align-items: flex-start; - background-color: #2f4f4f; - color: #fff; - display: flex; - justify-content: space-between; +/* colour changes for role names and types */ + +/* role info styling */ +.role-name { + font-family: 'Fira Sans', sans-serif; + font-size: 10pt; + font-weight: 800; } -.character-ability { + +.role-ability { color: #000; font-family: 'Fira Sans', sans-serif; font-size: 9pt; font-weight: 400; } -.character-ability-reminder { - color: #708090; - font-family: 'Fira Sans', sans-serif; - font-size: 7pt; - font-weight: 200; -} -.character-block { - break-inside: avoid-column; - margin-bottom: 2px; - margin-top: 2px; - /* this seems odd, but seems to help the player reference flow/line up better */ - border: 2px solid #fff; -} -.character-block-nightinfo { - min-height: 36px; -} -.character-block-player { - min-height: 55px; -} -.character-icon { - border: none; - float: left; - margin-right: 2px; - max-height: 50px; - width: 50px; -} -.character-icon-nightinfo { - border: none; - display: inline-flex; - float: left; - margin-bottom: auto; - margin-top: auto; - max-height: 40px; - padding-right: 5px; - width: 40px; -} -.character-name { + +.role-name { font-family: 'Fira Sans', sans-serif; font-size: 10pt; font-weight: 800; } -.character-name-_meta { +.role-name-_meta { color: #000; } -.character-name-night { +.role-name-night { font-size: 8pt; padding-right: 3px; } -.character-name-demon, -.character-name-minion { +.role-name-demon, +.role-name-minion { color: red; } -.character-name-outsider, -.character-name-townsfolk { +.role-name-outsider, +.role-name-townsfolk { color: #00f; } -.character-name-fabled { +.role-name-fabled { color: #ff844a; } -.character-name-traveler { +.role-name-traveler { color: #804141; } -.character-reminder { - color: #000; - font-family: 'Fira Sans', sans-serif; - font-size: 7pt; - margin-top: 3px; -} -.character-type-demon, -.character-type-minion { + +.role-type-demon, +.role-type-minion { border-top: 2px solid red; color: red; } -.character-type-outsider, -.character-type-townsfolk { +.role-type-outsider, +.role-type-townsfolk { border-top: 2px solid #00f; color: #00f; } -.character-type-jinx { +.role-type-jinx { color: #af6e4c; } -.character-type-fabled { +.role-type-fabled { color: #ff844a; } -.character-type-traveler { +.role-type-traveler { color: #804141; } -.cols-2 { - -moz-column-count: 2; - -webkit-column-count: 2; - column-count: 2; - -moz-column-gap: 20px; - -webkit-column-gap: 20px; - column-gap: 20px; -} -.cols-3 { - -moz-column-count: 3; - -webkit-column-count: 3; - column-count: 3; - -moz-column-gap: 20px; - -webkit-column-gap: 20px; - column-gap: 20px; -} -.cols-auto { - break-inside: avoid-column; - column-count: auto; - column-width: 8rem; -} - -.hatred-icon { - border: none; - height: 30px; - margin-left: 0; - margin-right: -8px; - max-width: 30px; - vertical-align: bottom; -} - -.night-icon { - border: none; - max-height: 40px; - width: 40px; -} -.traveler-night-icon, -.fabled-night-icon { - border: none; - display: inline-flex; - float: left; - height: 30px; - margin-bottom: auto; - margin-top: auto; - max-width: 30px; - padding-right: 5px; -} - -.jinx-night-icon { - align-items: center; - display: flex; - justify-content: center; - margin-bottom: -10px; +/* player reference - night order */ +.first-night { + left: 0; + margin-left: -20px; /* Adjust this value to match the column gap */ + position: absolute; + top: 0; + width: 50%; } -.jinx-night-reason { - color: #af6e4c; - display: flex; - font-family: 'Fira Sans', sans-serif; - max-width: 45%; +.other-nights { + bottom: 0; + position: absolute; + right: 0; + transform: rotate(180deg); + width: 50%; } -.jinx-simple-night-icon { - align-items: center; - display: flex; - justify-content: center; -} -.jinx-simple-night-reason { - color: #af6e4c; - font-family: 'Fira Sans', sans-serif; - text-align: center; - white-space: normal; -} -.traveler-night-ability { - color: #af6e4c; -} -.fabled-night-ability { - color: #ff844a; -} -.jinx-reminder-block { - align-items: center; - break-inside: avoid-column; - display: flex; - margin-bottom: -2px; -} -.jinx-reminder-block-night { - align-items: center; - border: 1px solid #af6e4c; - break-inside: avoid-column; - display: flex; - flex-direction: column; +.centered-div { + border-color: #dddddd; + border-style: solid dashed; + border-width: 3px; + left: 50%; + max-width: 40%; + padding: 1rem; + position: absolute; + top: 30%; + transform: translate(-50%, -30%); + + max-height: 1200px; /* Adjust the height value as needed */ + overflow: auto; } -.traveler-reminder-block, -.fabled-reminder-block { - border: none; - break-inside: avoid-column; - margin-bottom: 2px; - margin-top: 2px; - min-height: 30px; - vertical-align: top; -} -.jinx-reminder-wrapper { - align-items: center; - border: none; + +/* storytelly first night order */ + +.night-role-block { + margin: 0px; + margin-bottom: -10px; display: flex; - justify-content: center; - margin-top: 15px; + align-items: flex-start; + background-color: white; width: 100%; -} -.jinxes { - border-top: 1.5px solid #af6e4c; - flex-direction: row; - float: right; - font-family: 'Alegreya Sans SC', sans-serif; - justify-content: flex-end; - padding: 2px; - vertical-align: middle; -} -.jinxes-label-text { - color: #af6e4c; - font-family: 'Alegreya Sans SC', sans-serif; - font-size: 8pt; - margin-right: -3px; -} -.line { - border-bottom: 0.5px solid #a9a9a9; - flex: 1; - margin-bottom: 2px; -} -.line-nightinfo { - border-bottom: 0.5px solid #d3d3d3; - flex: 1; - margin-bottom: 2px; -} -.line-prejinx-nightinfo { - border-bottom: 3px double #a9a9a9; - flex: 1; - margin-bottom: 2px; -} -.line-pretraveler-nightinfo { - border-bottom: 3px double #a9a9a9; - flex: 1; - margin-bottom: 2px; - padding-top: 5px; -} -.line-prefabled-nightinfo { - border-bottom: 3px double #a9a9a9; - flex: 1; - margin-bottom: 2px; - padding-top: 5px; -} -.top-left-header { - font-family: 'Alegreya Sans SC', sans-serif; - font-size: 8px; - padding-left: 10px; -} -.top-right-header { - font-family: 'Alegreya Sans SC', sans-serif; - font-size: 8px; - padding-right: 10px; + border: 1px dashed white; } -h1.script-title { - color: #000; - font-family: 'Alegreya Sans SC', sans-serif; - font-size: 18pt; - font-weight: 900; - text-align: right; - margin-bottom: 0; - margin-left: 5px; +.night-role-title-line { + display: flex; + flex-direction: row; + background-color: white; } -.heading-container { +.night-role-info { display: flex; - justify-content: space-between; - align-items: flex-start; - width: 100%; + flex-direction: column; + flex: 1; /* Take up equal space within the flex container */ + border: 1px dashed white; + margin-left: -6px; } -.spacer { - flex-grow: 1; +.role-ability-reminder { + color: darkred; + font-family: 'Fira Sans', sans-serif; + font-size: 7pt; + font-weight: 400; + margin-left: 5px; } -.author-presents { - display: inline-block; - font-size: 14px; - font-weight: 700; - color: darkslategray; - font-family: 'Dancing Script', cursive; - transform: rotate(-8deg); - opacity: 0.8; - padding-top: 8px; +.night-role-reminder { + color: black; + font-family: 'Fira Sans', sans-serif; + font-size: 7pt; + margin-top: 3px; + font-weight: 500; } -.blank-page-qr-code { - position: absolute; - bottom: 0; - right: 0; - width: 50mm; /* Adjust the width of the image as needed */ - height: 50mm; /* Adjust the height of the image as needed */ +.line-nightinfo { + border-bottom: 0.5px solid #d3d3d3; + flex: 1; + margin-bottom: 1px; } -.blank-page-qr-code > img { - max-width: 125px; - max-height: 125px; +/* extra ability styling */ +div.role-ability > strong, +div.role-ability-reminder > strong { + color: black; }