AIR HOCKEY - credits, sources, and every single thing this app made up ===================================================================== WHAT THIS IS ------------ An independent reimplementation of tournament air hockey for the browser, written from scratch: its own physics engine, its own hand-written WebGL2 renderer, no libraries of any kind, and no network calls. It is not affiliated with, endorsed by, or licensed from any of the parties named below, and it contains no code, art or text taken from any of them. THE ORIGINAL ------------ Air hockey was invented at Brunswick Billiards between 1969 and 1972. Wikipedia names the inventors as Phil Crossman, Bob Lemieux and Brad Baldwin; the patents name the applicants P. E. Crossman and R. G. Kenrick, assigned to Brunswick Corporation: US 3,773,325 "Air cushion table game" priority 13 September 1971 US 3,927,885 "Puck and bat for an air cushion table game" priority 13 September 1971 https://patents.google.com/patent/US3773325A/en https://patents.google.com/patent/US3927885A/en Those two documents are the single most valuable source this app has, because they are the only place anywhere that states the air-hole diameter, the hole pitch, the rail height and the goal width as NUMBERS - and because they explain, in the inventors' own words, WHY those numbers are what they are. The rest of the world has forgotten them. The governing body is the United States Air Hockey Association. Note the name: the rulebook says "United States Air Hockey Association", while Dynamo badged its tables "U.S. AIR TABLE HOCKEY ASSOCIATION" - the same body, and the older badge is where the "Air-Table" form comes from. THE RULEBOOK ------------ USAA, "Air Hockey Rules of Play", revision date 03/03/2020, 10 pages. USAA, "Challenge Match Rules", revision date 03/23/2019, 3 pages. The USAA's own domain has lapsed and now serves an unrelated page; the rulebook survives in the Internet Archive, and Gold Standard Games republishes it: https://web.archive.org/web/20220812094503id_/https://airhockeypros.com/assets/pdfs/USAA-Air-Hockey-Rules.pdf https://web.archive.org/web/20220812083712id_/https://airhockeypros.com/assets/pdfs/USAA-Challenge-Match-Rules.pdf https://goldstandardairhockey.com/usaa-official-rules-of-air-hockey/ https://goldstandardairhockey.com/wp-content/uploads/2014/10/ah-rules-basic-2.pdf A 2003 snapshot of the same rules confirms the text is substantively unchanged over ~17 years: https://web.archive.org/web/20030126061526id_/http://www.airhockey.com/rules/rules.html Cited throughout the app as the rulebook cites itself: Roman-numeral section, then arabic rule. "Rule I.10", "Section II.C.3", "Challenge 3.1". THE THREE THINGS THE RULEBOOK DOES NOT SAY, and they matter ----------------------------------------------------------- 1. IT FIXES ALMOST NO DIMENSION. Tables are approved BY MODEL NAME (II.A.1.a, a list of about nineteen Brunswick, Dynamo and Gold Standard models) and pucks likewise (II.C.1, three of them). There is no regulation table size, playing surface, goal, rail height or puck. The ONLY dimensional limits in the entire document are the mallet's: "Weight must be 6 oz. or less" and "Diameter must be less than 4-1/16"" (II.B.1). A keyword scan of the full text returns zero hits for feet, foot, width, height, thickness and level. 2. IT SAYS NOTHING QUANTITATIVE ABOUT THE AIR SYSTEM. Zero hits for blower, hole and pressure. Nor does the manufacturer: Gold Standard's product pages say only "commercial-quality blower". 3. THERE IS NO CREASE IN AIR HOCKEY. The word "crease" appears zero times. There is no crease, no crease dimension and no crease violation. It is an ice-hockey concept, and if you have read that air hockey has one, you have read about a different game. What air hockey has instead is the centreline (I.11, I.12, VI.9, VI.13) and the vertical plane of the goal face (IV.3, V.2). MANUFACTURER SOURCES (the geometry the rulebook leaves open) ------------------------------------------------------------ https://shelti.com/product/gold-standard-games-tournament-pro-air-hockey-table/ cabinet 99-1/2 x 51-1/4 x 31 in, 412 lb; laminate playfield; aluminium rails; USAA-sanctioned https://www.gameroomguys.com/site/pdfs/GS%20TP%20GP%20GF%20Assembly%20Instructions.pdf the official service manual: part numbers, the 1/32 in hole-clearing bit, the levelling test https://goldstandardairhockey.com/table-maintenance/ the yellow fibreglass-filled Lexan puck as the USAA default; never clean the rails https://www.gameroomguys.com/api/items (Gold Standard's dealer product records) playfield panel 8MS-PFA-0: 96 x 48 x 1 in, 78 lb puck 201-0292-0: 3-1/4 in dia. x 0.25 in, 0.1 lb, Lexan mallet 201-0293-0: 4 in dia. x 2.5 in, 0.3 lb, nylon blower 8GS-PFA-0-03-03: 350 CFM, 110 V 3 A, 1/4 hp (the home blower is 210 CFM) side shield C-GS-OSS-0-TRS: 92-1/4 in long, for the 8 ft Gold Pro and Tournament Pro Great American 8 ft (items 51609/51578/51580/51614): cabinet 99 x 51 in, "Playing Surface: 93" x 44"" - a competing full-size maker that publishes both https://www.valley-dynamoparts.com/product_line.php?id=1 Dynamo: "Use 3-1/4" pucks on all 7-foot and 8-foot coin and ProStyle tables" https://en.wikipedia.org/wiki/Air_hockey only 8 ft tables are USAA/AHPA-approved; Lexan pucks; high-top and flat-top mallets MEASURED PUCK BEHAVIOUR (the only measurements of a real puck that exist) ------------------------------------------------------------------------ https://raw.githubusercontent.com/AirHockeyChallenge/air_hockey_challenge/qualifying-2025/baseline/baseline_agent/kalman_filter.py The NeurIPS Robot Air Hockey Challenge's baseline state estimator, whose parameters were fitted to tracked real puck trajectories: damping [0.2125, 0.2562] 1/s as a purely LINEAR viscous decay; rail collision v_n <- -0.79 v_n with tangential and spin retention 0.84 and spin generation -6.48 / +6.33 rad/s per m/s; and - decisively - spin coupling into velocity of 7.7e-4 tangential and EXACTLY ZERO normal, with no spin-velocity coupling in free flight. https://arxiv.org/abs/2411.05718 the challenge retrospective https://ar5iv.labs.arxiv.org/html/2107.06140 restitution search range 0.5-1.0; a 216 x 122 cm table https://ar5iv.labs.arxiv.org/html/2205.07657 "high-velocity puck (e.g., 15 m/s in professional games)" https://ar5iv.labs.arxiv.org/html/2407.03705 a state-of-the-art robot's shots: 2.37 +/- 0.50 m/s Two caveats travel with the drag and restitution figures and the app repeats them in its Help panel: they were fitted on a 213.5 x 122 cm table with a puck near 63.5 mm, not on a USAA 8-footer with a 3-1/4 in puck; and the drag fit is ANISOTROPIC (0.2125 along the table against 0.2562 across it), which a drag term has no business being - so it is a fit absorbing table tilt and unflatness into a drag coefficient. This app takes the mean of the two. The widely repeated claim that an air hockey puck reaches 80 mph traces only to a commercial content site with no measurement behind it. The current Wikipedia article carries no speed figure at all. This app uses the peer-reviewed 15 m/s (34 mph) and calls 80 mph folklore. FLUID MECHANICS --------------- https://en.wikipedia.org/wiki/Reynolds_equation the thin-film equation; the h^3/(12 mu) term https://en.wikipedia.org/wiki/Hagen%E2%80%93Poiseuille_equation plane Poiseuille Q = G h^3/(12 mu) https://en.wikipedia.org/wiki/Couette_flow tau = mu U / h, constant across the film https://en.wikipedia.org/wiki/Orifice_plate m_dot = Cd A sqrt(2 rho dp); Cd 0.6-0.63 sharp-edged; and: a thin-plate orifice never truly chokes https://en.wikipedia.org/wiki/International_Standard_Atmosphere T 288.15 K, rho 1.225, mu 1.7894e-5 https://en.wikipedia.org/wiki/Temperature_dependence_of_viscosity Sutherland constant for air, 113 K https://en.wikipedia.org/wiki/Air_bearing precision air bearings run 5-50 um of clearance https://en.wikipedia.org/wiki/Drag_coefficient flat plate normal to the flow, Cd 1.28 WHAT THIS APP MADE UP - THE COMPLETE LIST ========================================= Every item below is this app's own choice. Nothing else in the app is. GEOMETRY GOAL MOUTH WIDTH, 12 in. DERIVED FROM A SOURCED RATIO rather than chosen: the patent's detailed description puts the goal slot at "approximately 3 times the diameter of the bat", and the bat is sourced at 4.00 in. The same patent family's SUMMARY says 3-1/3 times (13.3 in); a ratio taken from the robot benchmark's table model would give 10.6 in; a 1997 aftermarket goal shield's 11 in plate suggests something under 11. So the honest range is 10.5 to 13.5 in and this app takes the patent's own detailed figure. The patent also says what the ratio is FOR - "to effectively prevent static blocking of the goal and place upon the player a significant goal tending responsibility" - and the app tests that: a 4 in mallet parked dead centre in a 12 in mouth leaves 102 mm of gap either side for an 82.6 mm puck. The threshold is 10.5 in, and this app's first guess of 10 in would have made the goal statically blockable. The research caught that. GOAL MOUTH HEIGHT, 1/2 in. Reconstructed inside a sourced bound: the goal is "a horizontal slot in the bumper strip and rail" (patent), the bumper is 3/4 in tall and the puck 1/4 in thick. PLAYING SURFACE, 93 x 44 in. This is the one geometric figure that is sourced BY ANALOGY rather than directly: no USAA-table maker publishes it. It is Great American Recreation's published playing surface for its same-size 8 ft table (cabinet 99 x 51 in against Gold Standard's 99.5 x 51.25), and it is corroborated on a real USAA table by Gold Standard's own 8 ft side shield being 92-1/4 in long. Everything geometric in the game follows from it. CENTRELINE WIDTH, 1/2 in - and it is RULES-BEARING, because I.11 gives the puck to EITHER player while it touches "any part of the centerline". The rulebook knows the width varies and still does not fix it: II.A.1.a distinguishes one approved table as "Dynamo Photon (Ice-Blue Top) w/ thin centerline". FACE-OFF CIRCLE RADIUS, 6 in. Gold Standard advertises the circle; nobody publishes its size. Note that the Gold Standard rules card adds a table rule the USAA does not have - "the player's mallets must remain completely outside the center circle" at a face-off. This app enforces the USAA's one-inch approach (III.2) and not that. THE AIR SYSTEM PLENUM PRESSURE, 400 Pa gauge. The one air number the whole cushion model turns on, and nothing anywhere publishes it: the patent gives the hole size and the grid, the part record gives 350 CFM and a quarter horsepower, and no source gives a pressure. 400 Pa is 1.6 inches of water, the right order for a squirrel-cage blower, and it is cross-checked against the flow that IS sourced: at 400 Pa the array passes about 22% of the blower's 350 CFM free-delivery rating, which is roughly where a centrifugal blower sits at a few hundred pascals. The app's Blower slider sweeps it from below the floating threshold upwards, and the harness asserts the array's flow never exceeds 350 CFM. ORIFICE DISCHARGE COEFFICIENT, 0.6. A choice among sourced values: 0.6-0.63 is the published range for a sharp-edged plate, which is what a drilled hole in a laminate playfield is. ROOM TEMPERATURE, 20 C. The ICAO standard atmosphere's 15 C is not a games room, so the air's viscosity and density are corrected to 20 C by Sutherland's formula and the ideal gas law - both with sourced constants. HOLE COUNT, about 4,608. Derived from the patent's sourced one-inch grid over the sourced 96 x 48 in panel; no source states a count. The renderer draws the holes about ten times oversize, because 0.032 in is a fraction of a pixel at any camera distance that shows the whole table. The GRID is true; the DOT is not, and the app says so on screen. THE LOSSES - and this is the part to read carefully The total LINEAR drag rate is NOT reconstructed: it is 0.2344 1/s, the mean of the two rates identified from tracked real puck trajectories. What is reconstructed is the ATTRIBUTION. The viscous shear in the air film that the cushion model DERIVES from first principles accounts for only about 5% of that measured rate. The other 95% is real and is not separately modelled - the puck's slight hydrodynamic tilt, intermittent rim contact on a playfield that is not perfectly flat, and momentum taken from the puck by the impinging jets. This app carries it as a multiplier on the film shear so that the total drag scales as 1/gap, which makes turning the blower up genuinely reduce the drag. That is a modelling choice about a mechanism, not about a number: the number is measured. It is stated on screen in the Help panel. AERODYNAMIC DRAG COEFFICIENT, 1.28 - the flat-plate figure, applied to the puck's exposed rim. An over-estimate, since the rim is a curved band in ground effect; over-stating it makes the reconstructed remainder smaller, which is the conservative direction. SLIDING FRICTION WITH THE BLOWER OFF, 0.25. Polycarbonate on laminate. For scale, an independent group measured an effective friction of 0.03-0.07 for a puck on a POWERED table - a quarter of this, and that ratio IS the air cushion. REST THRESHOLD, 2 cm/s. Linear plus quadratic drag never quite brings a body to rest; a real puck does stop, because its real friction has a Coulomb component this model folds into the linear term. PUCK-MALLET RESTITUTION, 0.88, and its friction, 0.12. No source anywhere publishes a puck-mallet restitution; the one measured collision map that exists is for a RAIL. SPIN DECAY, 0.4 1/s - the reference simulator's angular damping. Its fitted FILTER has no free-flight spin decay at all and applies a per-collision retention of 0.84 instead. The RAIL's restitution (0.79) and tangential retention (0.84) are SOURCED. The rail's friction coefficient is DERIVED from them - 0.16/1.79 - so that this app's Coulomb impulse reproduces the measured tangential retention at a 45-degree bank; and the spin the rail then generates follows from the puck's own moment of inertia at about 7.8 rad/s per m/s, against the measured 6.48. Neither number was tuned to the other. THE PUCK OFF THE TABLE: the mechanism is sourced and the threshold is not. The patent records the problem in the inventors' own words - "the puck leaving the table in high speed free flight ... irregularities in the bat and rails were found to give the puck a positive angle of attack which caused it to take off from the air bed" - and the modern manual tells the owner never to clean the rails because "the thin layer of dirt actually makes the puck bank properly and keeps it on the table". What is not modelled is the mechanism itself, which needs an out-of-plane degree of freedom this engine does not carry. So a rail impact above 15 m/s of NORMAL approach speed puts the puck off the table, the threshold anchored on the one sourced speed there is: the professional game's top puck speed. THE PLAYER AND THE OPPONENT MALLET TOP SPEED, 6.0 m/s. A mouse can cross the table between two events; a forearm cannot, so the mallet chases the pointer rather than teleporting to it. It is the single number that most changes how hard the game hits: a full-speed strike sends the puck out at about 10.9 m/s, against the 15 m/s of the professional game. MALLET PHYSICAL REACH PAST THE CENTRELINE, 0.20 m. Deliberately LARGER than VI.13's legal limit, because the limit has to be reachable in order to be a foul at all - clamp the mallet at the legal line and the rule quietly stops existing and can never be tested. The legal limit itself is sourced: VI.13's two clauses coincide and both put the mallet's CENTRE at most one RADIUS past the line. The opponent is clamped to the legal line, because an opponent that fouls continuously is not a difficulty setting. EFFECTIVE MALLET MASS, 1.34 kg - the sourced 136 g of nylon plus 1.2 kg of reconstructed hand and forearm. A struck puck does not push against the plastic alone. Note the patent's designed bat:puck MASS ratio of 10:1 does NOT hold for modern equipment (136/45 is 3:1), because the 1971 bat was a solid 1 in polyethylene disc and the modern one a taller moulded shell. THE OPPONENT'S REACTION TIMES: 340, 235, 150 and 90 ms, and its COMMIT DELAYS: 340, 260, 190 and 130 ms. Reconstructed but anchored - simple visual-motor reaction time in a person is around 200-250 ms, which is where "club" sits. It never sees the puck as it is, only as it was; it predicts by unfolding the side rails; and its error grows with how far ahead it is reading and with how many banks it has to unfold, which is why banking is how you beat it. Its measured save rates against direct shots are 59.7, 77.1, 94.4 and 99.3%. THE FIXED TIMESTEP, 1/480 s, and the FRAME CLAMP, 0.10 s. A frame longer than the clamp is clamped rather than simulated, so a backgrounded tab resumes instead of running a minute of physics in one frame. The visible consequence is deliberate: a machine that cannot hold 10 fps plays in slow motion rather than teleporting the puck. THE FLOAT IS DRAWN OVERSIZE. The gap the model solves for is 183 um on a puck 82.6 mm across; drawn true it is a fraction of a pixel. The drawing exaggerates it by 40x by default, and the app has a switch to turn that off. WHAT DIFFERS FROM A REAL TABLE ------------------------------ * There is no referee to argue with, so IV.5's interference, VI.10's distractive noise and the conduct offences of VII.1.a-i cannot arise. The conduct LADDER is implemented, because IV.4's extra-time-out warning reaches it without any of them. * The puck is a disc in a plane: it has no out-of-plane orientation. So V.1 (a puck that stops in the goal without tilting is not a score), V.2's rebound out of the goal mouth, VIII.8 and IX.10 (a puck flipping on its edge) and IX.16 (the tape facing up) cannot arise. A goal is scored the instant the puck's centre passes the goal line, which on a real table is the point past which it drops. * VI.7's lost mallet is implemented as a rules path but the app never fires it: nothing in a pointer-driven game corresponds to dropping the mallet, and the rulebook's own "string rule" makes losing grip a non-event when a strap is attached - which this app's mallet has. * Air hockey is a two-player game. There is no such thing as solo air hockey, so the opponent is a program, and its difficulty is stated as a reaction time in milliseconds rather than dressed up as a skill level. * Palming (I.13) and topping (I.8) are reachable through the app's Help panel rather than through play, because a pointer has no palm. Topping is also reachable in play by holding L to tilt the mallet past IX.14's forty degrees. * VI.15's second half - a defender who merely BLOCKS the puck off the table - is expressly not charging, and the rulebook then does not say who gets the puck. The app gives it to the offensive player, which is the outcome VI.15 reaches in the charging case, and records in its own log that the rulebook leaves it open rather than pretending otherwise. BUILT WITH ---------- No libraries, no frameworks, no CDN, no fonts, no network calls, and no analytics. The renderer is hand-written WebGL2 with two shaders in this bundle. The engine is a single pure module. The harnesses - tools-harness.js, tools-harness-page.js, tools-normals.js, tools-smoke.js and two independent oracles that share no code with the engine - are not shipped; they are what the app was checked with.