From 1178ce593c696b64e36b8e7b355de06d5c73086c Mon Sep 17 00:00:00 2001 From: David Reed Date: Wed, 28 Aug 2024 14:39:07 -0600 Subject: [PATCH 1/4] Add paperwork rendering (WIP) --- content/guides/penalty-lineup-tracker.md | 85 +++++++++++ content/guides/scorekeeper.md | 79 ++++++++-- justfile | 8 +- static/statsbook.css | 176 +++++++++++++++++++++++ templates/guide.html | 4 + templates/shortcodes/plt.html | 27 ++++ templates/shortcodes/plt_penalties.html | 36 +++++ templates/shortcodes/score.html | 17 +++ 8 files changed, 419 insertions(+), 13 deletions(-) create mode 100644 content/guides/penalty-lineup-tracker.md create mode 100644 static/statsbook.css create mode 100644 templates/shortcodes/plt.html create mode 100644 templates/shortcodes/plt_penalties.html create mode 100644 templates/shortcodes/score.html diff --git a/content/guides/penalty-lineup-tracker.md b/content/guides/penalty-lineup-tracker.md new file mode 100644 index 0000000..2abe0d6 --- /dev/null +++ b/content/guides/penalty-lineup-tracker.md @@ -0,0 +1,85 @@ +--- +title: "Penalty Lineup Tracker" +date: "2024-02-11" +template: "guide.html" +draft: true +extra: + author: "David Reed / Stacktrace" +--- + +## Introduction + +The Penalty Lineup Tracker is arguably the broadest off-skates officiating role. The PLT is responsible for + +- recording a single team's lineup each jam, including any Star Passes that occur; +- tracking entries to and exits from the Penalty Box; +- recording the type and number of penalties for each skater on their assigned team; +- confirming with the Penalty Box staff as each skater approaches and reaches the foul-out threshold. + +Because they are stationed in the center of the track and highly mobile, the PLT may also play supporting roles, such as communicating changes to the score table and penalty box. + +The PLT's broad responsibilities mean that the role requires excellent game knowledge and track awareness, the ability to complete complex paperwork under stress, and good communication skills. The PLT role is a good one for the Head NSO. + +The PLT role combines the older Penalty Tracker (PT) and Lineup Tracker (LT) roles. These roles are rarely staffed today; a full complement of one PT and two LTs is more difficult to staff than two PLTs. + +## The Basic Routine + +### During the Lineup Period + +As your team lines up for the jam, record the player numbers in the Lineup section of your paperwork. + +If the team does not field a pivot, make sure to mark the _noPivot_ box for the jam. Mark the box for any blocker not fielded with a slash or X symbol to be clear that it wasn't simply _missed_, but actually not fielded. + + + +If any jams were ended due to injury, verify that the skaters on the track are eligible to be there. + +Any skaters not on the roster, tell the Head Referee and Jam Timer. + +### During the Jam +During the jam: +- Capture penalties. Echo the penalty calls +- Capture entrances and exits +- Capture Star Passes +- Signal double penalties + +As needed: +- Signal penalty counts + +At play stoppages: +- Verify penalty counts + +At halftime: +- Shading + +At halftime and end-of-game: +- Verify penalty counts +- Relay penalty counts to Head NSO + +## Paperwork Nuances + +### Penalties versus Box Entries + +The PLT paperwork makes more sense when you understand that it is the fusion of two older forms of the paperwork, for the Penalty Tracker and Lineup Tracker roles. Those older forms are the source of the two distinct ways in which penalties are recorded on the PLT paperwork. + +The left-hand side of the PLT paperwork tracks _lineups_, and comes from the old Lineup Tracker position. In lineup-tracking mode, you record _box entries and exits_. Your concern in this mode is not when the penalty was assessed (or even how many penalties were assessed), but in when the skater physically entered and exited the penalty box. Your paperwork here aligns with the Penalty Box Timer's, which also records entries and exits. + +The right-hand side of the PLT paperwork tracks _penalties_, and comes from the old Penalty Tracker position. In penalty-tracking mode, you record _penalties assessed_. In this mode, you care about what kind of penalty was assessed and the jam in which it was assessed, but not when it was served. + +As a result of these distinct rubrics, you may record the same event in different jams on the left- and right-hand side of your paperwork, and you may have different numbers of entries on those sides as well. + +Imagine that Black 34 receives two penalties in Jam 10, a Back Block and an Illegal Procedure for failing to leave the track. By the time Black 34 reaches the Penalty Box, the jam has concluded (they sit between jams). You'd record that event like this: + +{% plt() %} +10 - 34 - - - - - - - - - - - - - - - - - - - +11 - 34 S - - - - - - - - - - - - - - - - - - +12 - 34 $ - - - - - - - - - - - - - - - - - - +{% end %} + +{% plt_penalties() %} +34 B10 I10 - - - - - - - - +{% end %} + +Notice that the event is shown in Jam 10 under the Penalty Tracking side, but Jam 11 under the Lineup Tracking side (with an "S" indicating the skater sat between jams). Further, the double penalty is shown on the Penalty Tracking side, but the Lineup Tracking side records only a single box entry. + +### Substitutions in the Penalty Box \ No newline at end of file diff --git a/content/guides/scorekeeper.md b/content/guides/scorekeeper.md index 7e2430e..e9ba301 100644 --- a/content/guides/scorekeeper.md +++ b/content/guides/scorekeeper.md @@ -11,7 +11,7 @@ extra: As with all officiating positions in roller derby, it’s important to be aware that Scorekeeping is a combination of *what the rules explicitly say*, *how the rules are interpreted by the community*, and *common practices that are not rule-driven*. -Scorekeeping, in particular, is driven by the needs of the WFTDA Statsbook. +Scorekeeping, in particular, is driven by the needs of the WFTDA Statsbook. TODO ## Resources @@ -28,7 +28,7 @@ Scorekeepers are typically seated on each side of the scoreboard operator, but t Watch your Jam Referee and Jammer (in that order) during each jam. Follow the Statsbook Manual's instructions to record points and jam events (Lost Lead, Lead, Call, Injury, No Initial; Star Passes). **This guide deliberately does not cover the paperwork, because the Statsbook Manual is the authority**. -When each event happens, or when points are awarded, verbally communicate it to the Scoreboard Operator. The Scoreboard Operator will often echo this back to you to indicate that they received it. +When each event happens, or when points are awarded, verbally communicate it to the Scoreboard Operator. The Scoreboard Operator should echo this back to you to indicate that they received it. For example, a jam might go like this: @@ -59,7 +59,7 @@ For example, a jam might go like this: The conversation doesn't have to go exactly like this. Nobody needs to use these exact phrases. The scorekeepers could confirm the total rather than the scoreboard operator. Someone might miss an event and hear it from a colleague. -What's important in this example is that the two scorekeepers and the scoreboard operator are _talking constantly_. They make sure that everyone has the information they need to do their jobs. They acknowledge that a game environment is noisy and fast-moving by acknowledging what they hear. And they make sure to confirm their most important job - keeping the visible score accurate - constantly, so that problems are caught right away while the rules still permit a correction. +What's important in this example is that the two scorekeepers and the scoreboard operator are _talking constantly_. They make sure that everyone has the information they need to do their jobs. They acknowledge that a game environment is noisy and fast-moving by confirming what they hear. And they make sure to check their most important job - keeping the visible score accurate - constantly, so that problems are caught right away while the rules still permit a correction. Why call out these specific pieces of information? @@ -67,6 +67,16 @@ Why call out these specific pieces of information? - The scorekeepers _both_ record star passes for _both_ teams. Since each scorekeeper is watching their own Jam Referee, they need to make sure their counterparts receive notice when a star pass occurs for the other team. - Redundancy - the two scorekeepers plus that data in the scoreboard - increases the likelihood that a correct game record can be achieved during statsbook data entry. +--- + +Your Jam Referee will signal points to you starting when the jammer leaves the Engagement Zone (TODO reference). Many Jam Referees will continue to signal until the jammer enters the Engagement Zone for their next scoring trip. You should do the same. Remember that your signal may be seen by others throughout the venue, not just by your Jam Referee confirming that you've caught the points. + +You do not need to echo other signals, such as the Lead sign or No Pass - No Penalty. Some scorekeepers do, but it may provoke confusion. + +### Start-of-Game Check-ins + +Before the game, your assigned Jammer Referee should meet with you to show you their hand signals. Echo the signals back to them as they make them. Make sure to ask the Jammer Referee what signal they use for "No Initial Trip": there is no standard signal for this, and a number of different conventions are in wide use. + ### End-of-Period and End-of-Game Responsibilities At the end of each period, the scorekeeper should perform a series of steps to validate their points and paperwork. @@ -79,12 +89,6 @@ At the end of each period, the scorekeeper should perform a series of steps to v ### Jam Referee -Your Jam Referee will signal points to you starting when the jammer leaves the Engagement Zone (TODO reference). Many Jam Referees will continue to signal until the jammer enters the Engagement Zone for their next scoring trip. You should do the same. Remember that your signal may be seen by others throughout the venue, not just by your Jam Referee confirming that you've caught the points. - -You do not need to echo other signals, such as the Lead sign. Some scorekeepers do, but it may provoke confusion. - -There is no standardized hand signal for "no initial trip". There are several widespread conventions with more or less equal popularity. You should always ask your Jam Referee before the game how they signal a "no initial" to you, and be prepared to echo using the same signal. - There is no standard signal for "a star pass occurred". It is very common for referees and NSOs based in the center of the track to signal this by touching their hands and raising their hands repeatedly, sometimes with a plucking motion. This may indicate a star pass for _either_ team. You may echo this signal but don't need to. _Always_ make sure that your co-scorekeeper and scoreboard operator are aware of the star pass. @@ -99,9 +103,11 @@ Confirming star pass count ## Paperwork Beyond the Manual -Many experienced scorekeepers go beyond what's specified in the Statsbook Manual. +Many experienced scorekeepers go beyond what's specified in the Statsbook Manual. The conventions you adopt should always be _additive_, not _contrastive_: you can write down more information than the Statsbook Manual requires in the margins or un-marked areas of your paperwork, but do not make non-standard marks in standard spaces. This will produce confusion for your Head NSO when they complete the statsbook. + +Writing down the pivot's number in the margin of your score sheet, to the left of the Jam column, is a very common and useful convention. This ensures that when a star pass occurs, you have the pivot number you need at hand; you may not be able to see the pivot when the star pass actually takes place. It also allows your paperwork to support the Penalty Lineup Tracker's during statsbook data entry. -It's a good idea to always write down your pivot's number in the margin of your score sheet, to the left of the Jam column. This ensures that when a star pass occurs, you have the information at hand. It also allows your paperwork to support the Penalty Lineup Tracker's during statsbook data entry. +It may be useful to mark the margin of your paperwork with a symbol, such as a horizontal line, on each jam in which a Star Pass occurs. This makes it easier for you to rapidly count Star Passes to confirm that you are in sync with the other scorekeeper or with a Penalty Lineup Tracker. Some scorekeepers use "Dot System". Dot System is a way to annotate your paperwork with more information about the progress of the jam, which can help you keep track of scoring trips. This guide deliberately does not cover Dot System. You can read about it [here](TODO). We neither encourage nor discourage the Dot System. We encourage reviewing it and experimenting to find what makes you most effective. @@ -111,6 +117,57 @@ Some scorekeepers use "Dot System". Dot System is a way to annotate your paperwo ## Common Paperwork Mistakes +### Star Passes and Trips + +Notating Star Passes is often confusing for newer scorekeepers. The key principles to remember are: + +1. The _meanings_ of all of the boxes on your paperwork stay the same. +1. A completed scoring trip belongs to the jammer who finished the trip. + +For example, suppose that White 32 passes the star to the pivot, White 494, during the initial trip. White 494 is unable to clear the pack, and never starts their first scoring trip. You'd record it like this: + +{% score() %} +1 32 - - - - X - - - - - - - - 0 0 +SP 494 - - - - X - - - - - - - - 0 0 +{% end %} + +The definition of the "No Initial Trip" box stays the same. _Both_ jammers failed to complete an initial pass, so it's marked for both. + +What if White 494 _had_ gotten out of the pack, but the opposing jammer called the jam before they could score any points? + +{% score() %} +1 32 - - - - X - - - - - - - - 0 0 +SP 494 - - - - - 0 - - - - - - - 0 0 +{% end %} + +The definitions stay the same: White 32 had no initial trip, but White 494 did complete the initial trip. White 494 started the scoring trip, so the 0 belongs to them and goes on the Star Pass row. + +Take a different scenario. Blue 02 gets Lead status. They score 4 points on the first scoring trip. During the second scoring trip, they get stuck and pass the star to Blue 999, who completes the second and third scoring trips. We'd complete the paperwork thus: + +{% score() %} +1 02 X X - - - 4 - - - - - - - 4 4 +SP 999 - - - - - - 4 3 - - - - - 7 11 +{% end %} + +Definitions stay the same. Jammer 02 got Lead, and then Lost Lead by removing their helmet cover. Both of those marks belong to the row for Jam 1. The Jam Total and Game Total columns function just like they do elsewhere: total up the points for each row, and maintain the running total. + +Jammer 02 completed the first scoring trip _before_ they passed the star, so the first 4 belongs to their row. However, Blue 02 did _not_ complete the second scoring trip; Blue 999 did. The points for scoring trips 2 and 3 _both_ go in the row for Blue 999, the Star Pass row. It's irrelevant if Blue 02 actually earned some points before handing off the star. The record of the scoring trip belongs to the skater who completed the trip. + +The Statsbook Manual offers many examples of how to complete Star Pass paperwork correctly. Apply these two principles consistently and you'll be able to handle any in-game situation. + +### Missed Star Passes + +{% score() %} +1 32 - X X - - 4 - - - - - - - 4 4 +2 99 - X X - - 4 4 - - - - - - 8 12 +{% end %} + +### Closing Zero Trips + +### Lost Lead + +### Math Errors + ## Score Corrections Mistakes happen all the time. Roller derby is not a precise science! diff --git a/justfile b/justfile index 7d7b788..9526a26 100644 --- a/justfile +++ b/justfile @@ -1,13 +1,15 @@ build: - zola build + zola build --drafts render: build #!/usr/bin/env bash for guide in public/guides/*/index.html; do base="$(basename $(dirname $guide))" - weasyprint "$guide" "$(dirname $guide)/$base.pdf" -s build-assets/print.css + weasyprint "$guide" "$(dirname $guide)/$base.pdf" \ + -s build-assets/print.css -s static/statsbook.css pandoc -r commonmark+yaml_metadata_block \ -w epub --toc --css build-assets/print.css \ + --css static/statsbook.css \ --metadata-file build-assets/epub-metadata.txt \ -M "publisher=https://nonskating.club/guides/$base/" \ "content/guides/$base.md" -o "$(dirname $guide)/$base.epub" @@ -19,5 +21,7 @@ watch: --exclude "(.*\\.pdf$)|public|justfile|\\.git" \ -e close_write,move,create,delete \ | while read -r directory events filename; do + pkill -f zola just render + zola serve --drafts & done diff --git a/static/statsbook.css b/static/statsbook.css new file mode 100644 index 0000000..88fb013 --- /dev/null +++ b/static/statsbook.css @@ -0,0 +1,176 @@ +:root { + --pink: #F8A4A7; + --light-pink: #fcd2d4; + --light-blue: #eeeef6; + --blue: #d3d2e7; + --box-blue: #cbcae3; + --light-green: #e9f5da; + --green: #d3ecb5; +} + +table.nso { + border-collapse: collapse; + margin-left: auto; + margin-right: auto; + page-break-inside: avoid; + margin-top: 2em; + margin-bottom: 2em; +} + +table.nso thead th { + background-color: black !important; + color: white; + font-size: 50%; +} + +table.nso tr, +table.nso td, +table.nso th { + border: 1px black solid; + color: black; + text-align: center; +} + +/* PLT */ + +/* Highlight the Box columns in darker blue */ +table.plt td:nth-of-type(4n+4), +table.plt td:nth-of-type(4n+5), +table.plt td:nth-of-type(4n+6) { + background-color: var(--box-blue); + width: 1em; + max-width: 1em; + min-width: 1em; + padding: 0.1em; +} + +table.plt tr:nth-of-type(even) { + background-color: var(--light-blue); +} + +table.plt tr:nth-of-type(odd) { + background-color: white; +} + +/* PLT Penalties */ + +table.plt-penalties tr:nth-of-type(even) { + border-bottom: 2px black solid; +} + +table.plt-penalties tr td { + height: 1.5em; +} + +table.plt-penalties tr td:not(:first-child) { + min-width: 2em; + width: 2em; + max-width: 2em; +} + +/* White-backed rows */ +table.plt-penalties tr:nth-of-type(4n-2) td, +table.plt-penalties tr:nth-of-type(4n-3) td { + background-color: white; +} + +/* Skater number */ +table.plt-penalties tr:nth-of-type(4n-2) th, +table.plt-penalties tr:nth-of-type(4n-3) th { + background-color: var(--light-pink); +} + + +/* Pink-backed rows */ +table.plt-penalties tr:nth-of-type(4n) td, +table.plt-penalties tr:nth-of-type(4n-1) td { + background-color: var(--light-pink); +} + +/* Skater number */ +table.plt-penalties tr:nth-of-type(4n) th, +table.plt-penalties tr:nth-of-type(4n-1) th { + background-color: var(--pink); +} + +/* Heavier stroke at the foulout point */ +table.plt-penalties td:nth-of-type(7) { + border-left: 4px solid black; +} + +/* and at the FO/EXP line */ +table.plt-penalties td:nth-of-type(10) { + border-left: 2px solid black; + background-color: var(--pink) !important; +} + +/* Score */ + +/* The five flags (LOST LEAD CALL INJ. N.I.) + Render the headers with vertical text. + Make the columns slim and the same width. +*/ +table.score th:nth-of-type(3), +table.score th:nth-of-type(4), +table.score th:nth-of-type(5), +table.score th:nth-of-type(6), +table.score th:nth-of-type(7) { + writing-mode: vertical-lr; + width: 1em; + max-width: 1em; + min-width: 1em; + padding: 0.1em; +} + +table.score td:nth-of-type(3), +table.score td:nth-of-type(4), +table.score td:nth-of-type(5), +table.score td:nth-of-type(6), +table.score td:nth-of-type(7) { + width: 1em; + max-width: 1em; + min-width: 1em; + padding: 0.1em; +} + +/* Table row backgrounds. Start white and alternate with light green */ +table.score tr:nth-of-type(even) td { + background-color: var(--light-green); +} + +table.score tr:nth-of-type(odd) td { + background-color: white; +} + +/* Darker backgrounds used on the Jam and flag columns */ + +/* For white rows */ +table.score tr:nth-of-type(odd) td:nth-of-type(1), +table.score tr:nth-of-type(odd) td:nth-of-type(3), +table.score tr:nth-of-type(odd) td:nth-of-type(4), +table.score tr:nth-of-type(odd) td:nth-of-type(5), +table.score tr:nth-of-type(odd) td:nth-of-type(6), +table.score tr:nth-of-type(odd) td:nth-of-type(7) { + background-color: var(--light-green); +} + +/* For green rows */ +table.score tr:nth-of-type(even) td:nth-of-type(1), +table.score tr:nth-of-type(even) td:nth-of-type(3), +table.score tr:nth-of-type(even) td:nth-of-type(4), +table.score tr:nth-of-type(even) td:nth-of-type(5), +table.score tr:nth-of-type(even) td:nth-of-type(6), +table.score tr:nth-of-type(even) td:nth-of-type(7) { + background-color: var(--green); +} + + +/* Darker background used on the Game Total column */ + +table.score td:nth-last-of-type(1) { + background-color: var(--green) !important; +} + +table.score tr td { + height: 1.5em; +} \ No newline at end of file diff --git a/templates/guide.html b/templates/guide.html index 9533451..0923fbd 100644 --- a/templates/guide.html +++ b/templates/guide.html @@ -2,6 +2,10 @@ {% import "ns-macros.html" as macros %} +{% block css %} + +{% endblock %} + {% block content %}