BecknerWeb Fan Series · Release 1.0 · October 23, 2026
A complete turn-based coaching game with 12 original teams, 240 fictional players, local exhibitions, shared-device play, computer exhibitions, private internet rooms, seasons, and four-team playoffs. No build, package installation, external artwork, gameplay API, subscription, or player account is required. The optional development tests use Node; the installed game does not.
games.asp and any existing /tabletophockey/ folder.tabletophockey folder to the website root. Open /tabletophockey/index.html through your website.games.asp with the supplied updated file. It was based on the latest supplied menu, version 95, and changes only one list entry: Tabletop Hockey → /tabletophockey/index.html. All prior entries and the ASP header/footer includes are preserved. If your live menu has changed since this package, merge that one entry into the newer menu instead.file:// so browser storage and server requests use a consistent origin.sql/install.sql.dbo.HockeyRooms, dbo.HockeyRequests, their indexes, and constraints. It never creates a database, login, user, or role, and deletes no data. All DDL is inside one transaction with XACT_ABORT and TRY/CATCH. Failure rolls back and rethrows the actual SQL error; the success message runs only after commit. Rerunning after a failed/partial install is safe. Existing incompatible tables cause an explicit failure without destroying them.server/config.asp with the server/database connection for your environment. The default example uses Windows authentication and Microsoft's MSOLEDBSQL provider. Install the provider and match the IIS application pool bitness to the installed provider. Use a server certificate trusted by IIS, or supply your administrator's working encrypted connection string.@ExistingUser and run the separate sql/permissions-optional.sql. This grants Rooms SELECT/INSERT/UPDATE and Requests SELECT/INSERT only. It rejects dbo, sa, the current database identity, and the current login. It does not create any user or role. Do not run permission grants as the application itself.sql/diagnostics.sql under the application identity and open /tabletophockey/server/diagnostics.asp to inspect the actual IIS database user. Both diagnostics are read-only. The ASP page reports effective permissions; a successful connection alone does not prove table writes. Restrict or remove that diagnostic endpoint once setup is complete.<system.webServer>
<httpErrors existingResponse="PassThrough" />
</system.webServer>
Open Private internet rooms. The host chooses home/visiting, their own name and team, and Create Room. Share only the eight-character room code. The joiner chooses their own different team and Join Room; their side is assigned opposite the host. Each coach presses Save team & Ready. Both screens enter the match automatically when ready.
Both coaches choose and commit their own tactics. Choices remain concealed until both have committed. Each rolls only their own dice. Automatic Dice is a per-seat setting in Settings; one coach can automate while the other rolls manually. Both coaches acknowledge each result before the next play. You can leave and close a room for both coaches; refresh or temporary network interruptions do not close it.
Reconnect uses the private token and room saved in this browser, always targeting the room most recently created/joined successfully. Interrupted mutation requests retain the same request identifier and token before any transmission, including room creation/joining. Requests retry without resolving another play. Reconnect from a different browser/device requires the original browser's stored seat; there is deliberately no account or public token-recovery service. Do not clear site data or share seat tokens. Teams cannot be changed after the game starts.
The service hashes private 256-bit browser-generated seat tokens with SHA-256 in SQL; raw tokens are never stored in room rows or returned to the opponent. Online dice/event draws come from SQL CRYPT_GEN_RANDOM. Commands use parameterized ADO queries, room-row UPDLOCK/HOLDLOCK transactions, state revisions, request identifiers, phase/tactic validation and ownership derived from the token (not a submitted side). Exact mutation retries return the current state without another mutation. A stale new request is rejected and refreshed. Room creation/joining retries find the same seat by its token hash. No browser-submitted game state or dice are accepted. The complete room state lives in SQL, rather than in ASP session memory. Keep both tables together when backing up. The app preserves rooms and request records indefinitely; schedule any database retention with your administrator.
Choose your name, team, side, opponent mode, difficulty and overtime format in New game. For local two-player play, pass the device at the coach-handoff prompt after sealing a tactic. Neither coach can revise an already sealed tactic. Computer players use the identical engine, ratings, and probability tables.
Click/tap, or Tab then Enter. Number keys 1–6 choose the matching visible tactic; R rolls the next locally owned pending pair; Space continues a result. Shortcuts pause in dialogs and input fields. Focus indicators are visible. Browser reduced-motion preferences suppress movement. On portrait screens, the scoreboard and rink precede the result and coaching buttons; secondary information is below labeled tabs. Rotation uses the same responsive document, without recreating the game.
Settings independently control effects, Audience (on by default), narration, dice automation, game speed and speech speed. Shared-device coaches switch between their two Automatic Dice settings. Computer exhibitions can optionally auto-continue. Local autoplay pauses while a dialog is open. Narration uses an installed browser/device voice; availability and naturalness vary by device, and a device voice may be needed for fully offline speech. All information is visual. New games/continue cancel previous speech rather than allowing overlap. The supplied crowd and effect clips are local synthesized WAV files.
| Situation | Tactic | Tradeoff |
|---|---|---|
| Faceoff | Balanced | No added bonus or risk. |
| Faceoff | Quick / Physical | +2 using skating / checking; Quick gains another +3 against Physical. |
| Defensive or neutral zone | Carry | Skating versus defense; forecheck opens a +2 carry counter. |
| Defensive or neutral zone | Pass | Passing versus defense; controlled entry gives +1 shot quality. |
| Defensive or neutral zone | Dump | Checking contest; entry succeeds at margin -2 or better and avoids offside. |
| Attacking zone | Pass / Carry | Win a contest to build +1 shot quality, maximum +4. |
| Attacking zone | Cycle | Win a passing contest to build +2 quality; pressure penalizes it by -3. Uses more clock. |
| Attacking zone | Shoot | Attempt a shot with current quality; a strong offensive roll can generate a rebound. |
| Live play | Change | Change forward line and defensive pair, concede possession, use 20 seconds. |
| Live play | Clear | Shorthanded clear is legal; otherwise icing and a defensive faceoff with no offending-team line change. |
| Defense | Slot | Reduces shot quality by 2, but permits passing. Useful on penalty kills. |
| Defense | Pressure | -2 against passes, -3 against cycles, but +1 shooting modifier and greater penalty risk. |
| Defense | Block | Raises shot-block percentile interval from 12 to 28. |
| Defense | Forecheck | Checking instead of defense, +2 in contests except Carry counters it; increased penalty risk. |
Power plays use the same tactical choices with a +2 contest/shot modifier per net skater advantage. Cycle to create a lane; penalty killers can protect the slot or clear. A goalie pull adds an attacker and +2 advantage, but leaves an empty net. In a late lead, cycle can use 28 seconds; shooting takes 12. At stoppages choose a fresh line/pair, substitute either goalie, or use your one timeout to restore 60 fatigue points to every line. Goalie return/pull is permitted before committing a live-play decision; it uses no clock. A goal automatically restores both goalies.
These are internally consistent fictional-league tabletop rules, informed by ice hockey, with the following deliberate abstractions. They are not labeled as a complete NHL rules implementation. No fights, injuries, video review, delayed penalty advantage, penalty shots, double minors, misconducts, or on-the-fly goalie substitutions are modeled.
All 2d6 pairs are independent, uniformly distributed six-sided dice. The total frequencies from 2 through 12 are 1,2,3,4,5,6,5,4,3,2,1 out of 36. Ratings are means of the active individual skaters' relevant attributes (2–10), with fatigue applied. Team card ratings describe the profile used to construct those fictional player ratings.
Faceoff: each coach's 2d6 + effective skating (Balanced/Quick) or checking (Physical); Quick and Physical add 2, and Quick against Physical adds a further 3. Higher total wins; ties use event d100 ≤50 for visitors, otherwise home. The displayed modifier is the rounded difference of the full faceoff scores.
Contests: offense 2d6 − defense 2d6 + rounded modifier. Modifier = effective offensive attribute − effective defensive attribute + 2 × net active skater advantage + tactical modifiers listed above. Dump uses checking, Pass/Cycle passing, others skating; defense uses checking for Forecheck, otherwise defense. Nonnegative margin succeeds; Dump succeeds at -2 or better. Skater advantage includes extra attackers and the opponent's extra attacker. Success gives possession/zone/shot-quality benefits, not a goal automatically.
Event d100: one public uniform percentile is used for each resolved play. For a non-faceoff play, penalty chance P = clamp(round(8 − defending discipline × 0.55) + 2 when Pressure/Forecheck, 1, 8). If d100 ≤P, stop play for a penalty: 1 with equal coach dice totals is matching minors; 2 with defending 2d6 totaling 2 is a major; other penalty results are a minor. Matching/major events are therefore rare and depend on the public dice as well as the percentile. On controlled entries, non-penalty values through P+6 are offside. Other values use the contest.
Shooting: penalties take priority. Next, d100 ≤P+B is blocked, where B=28 for Block defense, otherwise 12. Values 95–100 are wide. All other shot values are remapped uniformly over their available interval to percentile Q = floor((d100−(P+B)−1) ×100 / (94−(P+B))) +1. A goal occurs when Q is at or below:
clamp(8 + round(1.8 × (offense 2d6 − defense 2d6 + shot modifier)), 2, 35) percent of unblocked on-target shots.
Shot modifier = effective offense − selected opponent goalie rating + accumulated shot quality + 2 × skater advantage −2 against Slot, or +1 against Pressure. An empty net replaces the finishing threshold with 80%; failure is wide, not a save. A non-goal saved shot rebounds if offense 2d6 is at least 9; otherwise it is frozen. Because Q is obtained from the finite public interval, realized conditional chances are quantized around the displayed percentage. Penalty, block, and miss chances are in addition to the conditional finishing probability. Inspection shows each pair, tactics, event d100, rounded modifier, conditional goal threshold, and elapsed time.
Shootout: chance = clamp(30 +4 × (attacker 2d6 − goalie 2d6 + individual shooting/skating − selected goalie rating + counter modifier),10,65) percent. Wrist/Challenge, Deke/Deep and Power/Read use counter modifier -3; all other combinations use +1. Deke uses skating; Wrist and Power use offense. Event d100 at or below this chance scores. Attempts rotate through the twelve forwards before repeating.
AI: Easy chooses uniformly from legal tactics. Normal mixes 35% random choices with a position/manpower/quality policy; Hard uses 12%; Expert 2%. The policy chooses draws based on roster strengths, controlled entries based on skating/passing, protection on the penalty kill, blocks against developed shots, cycling and timely shooting, live line changes for high fatigue in manual mode, goalie pulls when trailing late, and timeouts at useful late stoppages. Difficulties never alter dice, ratings, or outcome thresholds.
Create a 4/6/8/12-team season using that many teams from the ordered roster list. Choose 1–4 meetings per pairing, with home/away reversed on alternating cycles. Every team plays every other team that number of times. The sequential schedule can be coached one game at a time or simulated using the same complete engine. Simulation yields periodically so the interface can remain responsive.
Wins earn 2 points, all overtime/shootout losses 1, regulation losses 0. This league does not use a professional-league overtime empty-net point forfeiture. Standings break ties by points, wins, goal differential, goals for, then roster order. The top four enter 1-v-4 and 2-v-3 semifinals, then a championship, using your selected single-game or best-of-3/5/7 series. Home advantage alternates by game. Playoffs always use continuous sudden death. Completed fixtures record exactly once; refresh cannot count a result again. Regular-season totals remain separate from playoff series wins and scoring summaries.
Game and regular-season statistics include score, SOG, goals/assists/points, goalie shots/saves/save percentage, wins/losses/OTL, goals for/against, PP goals/penalty opportunities and completed PK attempts. One unmatched assessed penalty is one PP opportunity; multiple goals on a major can make PPG/opportunities exceed 100%. PK completed counts only penalties that have expired or ended on a power-play goal; active and queued penalties are not yet counted as completed kills. A kill fails if that penalty allowed any power-play goal. Goals against an empty net have no goalie attribution. Shootout deciding goals affect team standings GF/GA, but not player or goalie totals. No made-up research claims accompany the fictional identities or ratings.
Local settings, names, chosen teams, lineups, season, statistics and every game decision are stored after each mutation under the website's browser localStorage. Resume saved game restores exact clock, puck, lines, penalties, tactics, partially rolled dice and current decision. Each browser/origin has one local saved game and one season; normal confirmation protects an unfinished game or existing season from replacement. Clearing site data deletes local saves and private-seat access. Online match data remains in SQL; each coach's audio preferences stay local and their dice preference lives with their private seat.
index.html, css/hockey.css, js/ — complete local application, shared rules, team rosters and season manager.assets/ — 12 original SVG crests, complete JSON roster and eight local WAV clips. Rink art is inline SVG.server/ — authoritative Classic ASP JScript API, strict JSON codec, shared engine/team copies, connection example, read-only diagnostics.sql/ — transactional installation, separate optional grants, read-only diagnostics.tests/ — reproducible development tests and a portrait viewport harness. Not required at runtime.TEST-SUMMARY.md — completed checks and remaining deployment/device checks.games.asp is at the ZIP root alongside the installation folder.See the test summary before enabling live internet matches. Live IIS/SQL behavior, true simultaneous database locking, real network disruption, and physical Pixel voice/audio/touch must be checked on the installed site; those platforms are not present in the build environment.