# Table Football > A 3D in-browser table football game following the ITSF (International Table Soccer Federation) > Standard Matchplay Rules. Table football is the game commonly called *foosball* in the United > States; that word is a live US trademark and is deliberately not used as this app's name. URL: https://table-football.skillsafe.ai/ Type: single-player sports game, runs entirely client-side. No account, no network calls, no tracking. Free. ## What it is You control the four red rods of a table football table. Eight rods in all, four a side, in the order goalkeeper / 2 / opposing 3 / 5 / opposing 5 / 3 / opposing 2 / opposing goalkeeper, with 1, 2, 5 and 3 figures respectively - eleven figures a side, twenty-two in all. Every figure is rigidly fixed to its rod, so control is indirect: you cannot move a figure to the ball, you move a rod and every figure on it goes together. Each rod has exactly two degrees of freedom, both rate-limited. The slide is mapped positionally (the pointer's cross-table coordinate is the rod's position). The rotation is rate-based and unbounded, because an absolute pointer-to-angle mapping could never exceed a full turn and the 360-degree spinning rule would stop existing. ## The rules it enforces, and how they are cited From the ITSF Standard Matchplay Rules version 2.0 (December 2023), with Classic Matchplay version 1.0 (December 2025) selectable. That document NAMES its rules rather than numbering them - it says so in its own section 1.3 - so every rule is cited by name inside a numbered section, e.g. "SMR 10 / Rule: Illegal Spin". - Spinning (SMR 10): illegal to transition the ball by rotating the rod MORE THAN 360 degrees either before or after contact. Three conjuncts, all required: over a full turn in ONE of the two windows (never their sum), by the rod of active possession, and the contact must result in a transition. Classic Matchplay forbids REACHING 360 degrees instead. - Possession clocks (SMR 6): goalie rods 15 s, 5-rod 10 s, 3-rod 15 s. Three rules, not one: the 3-rod's expiry gives a goalie rod possession award, the other two a 5-rod award. - Three Walls (SMR 12), the trapped-ball counter and Trapped Ball Transition. - Restricted pass (SMR 11): the 5-rod-to-3-rod and goalie-rod-to-5-rod table, and the transfer that clears the restriction. - Dead ball (SMR 7.2), ball off table (SMR 7.3), Illegal Aerial, the opening sequence (SMR 5.2), Delay of Game (SMR 5.3), time-outs (SMR 7.1.2), penalty shots (SMR 17), and the Continue option (SMR 18). ## What the ITSF does NOT publish There is no ITSF table or equipment dimension standard. Its rulebook contains no length, no mass and no dimension of any kind; the superseded 2016 rulebook says only that "the Official tables are voted by ITSF General Assembly". The ITSF approves table MODELS - Bonzini, Roberto Sport, Garlando, Tornado, Leonhart - which genuinely differ. So the ball is sourced to the ITSF-B competition ball (34.5 mm, 18.5-19 g), the nominal table geometry to a published survey (120 x 70 cm surface, 20 x 8 cm goals, 70 mm figures), and rod positions, figure spacing, figure thickness and every coefficient are RECONSTRUCTED and labelled as such in CREDITS.txt. ## A real property of the table it reports A figure's longitudinal reach is 52.87 mm either side of its rod, against a rod pitch of 150 mm. So between every pair of consecutive rods there is a band 44.26 mm wide that no figure on either side can reach at any lateral position - nine such bands, 29.5% of the table's length. This is not a simplification, and the rulebook confirms it: SMR 5.1.1 gives a dedicated restart location for a "dead ball between the 5-rods", which is exactly the widest of those bands. ## Difficulty Difficulty is a reaction time, not an aim error: the opponent reads the ball as it was some milliseconds ago and plans from that. Rookie 380 ms, club 230 ms, pro 110 ms. Measured save rates against shots on target (400 per level, shots that reached a verdict): 33%, 52%, 82%. ## Engineering Deterministic seeded engine (mulberry32), pure and DOM-free, fixed 480 Hz substep with an accumulator and a strictly causal input ring - the same input trace produces a bitwise identical game at 30, 60, 90, 144 and 240 fps and through a jittery loop with dropped and doubled frames. Hand-written WebGL2 renderer, no libraries, no CDN, nothing external. Credits and full sourcing: /CREDITS.txt Licence: MIT, /LICENSE.txt