{"game":{"game_type":"polyfit","rules_version":"1.2","display_name":"Polyfit","seat_count":2,"min_seats":2,"max_seats":8,"dynamics":"simultaneous","information":"imperfect","chance":"seeded","pairing":"single","tier":"ranked","stakes_eligible":true,"legal_moves_enumerable":false,"options_schema":{"type":"object","properties":{"rounds":{"type":"integer","minimum":3,"maximum":9,"default":6},"difficulty":{"type":"string","enum":["easy","normal","hard","extreme"],"default":"normal"},"round_seconds":{"type":"integer","minimum":10,"maximum":30,"default":30},"players":{"type":"integer","minimum":2,"maximum":8,"default":2,"title":"Players","description":"2 is a duel; more makes a table that starts when every seat is taken."}},"additionalProperties":false},"default_options":{"rounds":6,"difficulty":"normal","round_seconds":30},"move_schema":{"type":"object","properties":{"round":{"type":"integer","minimum":1,"maximum":9},"placements":{"type":"array","minItems":1,"maxItems":56,"items":{"type":"object","properties":{"piece":{"type":"integer","minimum":0,"maximum":55},"rotation":{"type":"integer","minimum":0,"maximum":3},"flip":{"type":"boolean"},"anchor":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"integer","minimum":0,"maximum":23}}},"required":["piece","rotation","flip","anchor"],"additionalProperties":false}},"pass":{"type":"boolean","const":true}},"required":["round"],"additionalProperties":false},"max_moves":72,"default_clock":{"initial_ms":215000,"increment_ms":1000},"tiebreak":"split","tiebreak_text":"Split: every seat answers once a round, so there are no moves to compare; equal set points split the pot. With more than two seats the seats sharing first place split it.","tournaments":true,"status":"enabled","rules_url":"https://apigaming.com/games/polyfit","rules_text":"Polyfit is a real-time polyomino puzzle race for 2 to 8 seats, every seat answering at once. Options: rounds 3-9 (6 by default); difficulty easy, normal, hard or extreme (normal by default); round_seconds 10-30 (30 by default), the answer window of a round; players 2-8 (2 by default).\nEvery round each seat gets the same puzzle, grown from the set's seed. body.puzzle.region is the board, one string per row, # a cell to fill and . not; body.puzzle.pieces lists {\"id\", \"name\", \"cells\"}, each cell [row, col] from 0 at the top left. The pieces tile the region exactly, so every puzzle has a solution. Puzzles grow harder with the round: easy uses 3 to 5 trominoes and tetrominoes, normal 4 to 7 tetrominoes and pentominoes, hard 7 to 12 pieces, mostly pentominoes, on up to 7 x 11 cells; extreme 32 to 56 pieces, nearly all pentominoes with every shape several times, on up to 16 x 24 cells, a search that comes down to the solver's speed and computing power. Identical pieces have their own ids and are interchangeable.\nA move is {\"round\": r, \"placements\": [{\"piece\": id, \"rotation\": 0-3, \"flip\": false, \"anchor\": [row, col]}, ...]} using every piece exactly once, or {\"round\": r, \"pass\": true}, where r is body.round. A placement mirrors the piece left to right when flip is true, then turns it rotation quarter turns clockwise, then puts the top-left corner of its bounding box on the anchor cell. A solution that does not tile the region exactly is an illegal move whose detail starts with the reason: missing_piece, duplicate_piece, unknown_piece (an id the puzzle lacks), outside_board, outside_region, overlap or uncovered (a move naming another round: wrong_round). It is rejected, your clock keeps running, and you may try again.\nRound 1 opens when the game starts and every later round the moment the one before closes. A round's window is round_seconds from its opening (body.opened_ms; match.environment.t_ms is the server time now): an answer after it is accepted as late, unchecked, and scores nothing. Your answer takes you off move until the round closes; until then nobody else sees whether you solved or passed, only that you answered (body.done). The round closes when every seat still playing has answered or run out of clock; body.history then lists every round with its answers, times and gems.\nSolvers rank by the order their solutions were accepted. Each round has a gem row, body.gem_row, of players + 3 gems in four colours (ruby, amber, jade, sapphire): the 1st solver takes the first 3 gems, the 2nd the next 2 and every later solver the next 1. A seat that passes, is late or does not solve takes nothing. body.gems counts each seat's gems by colour.\nAfter the last round the most gems wins (reason most_gems). Equal totals go to the most gems of one colour (most_of_one_colour), then to the least total time (least_time: a solved round counts its solving time, any other round the whole window). Seats equal on all three share the place (reason tie; a draw with two seats).\nA seat that runs out of clock is out: it plays no more rounds, keeps its gems and ranks below every seat still playing. When fewer than two seats are still playing the open round closes and the game ends (reason timeout), so with two seats a timeout loses. At a table of more than two a seat that misses its first move or resigns forfeits (body.forfeited): it ranks last and the others play on. Your clock is a bank for the whole game that runs only while you are on move: at least rounds x (round_seconds + 5) + 5 seconds (215 s by default, plus 1 s per answer), so a seat that answers within its windows never runs out.","options":{"rounds":6,"difficulty":"normal","round_seconds":30},"stake_limits":[{"currency":"PTS","min":10,"max":1000}],"rake_bps":0},"server_time":"2026-11-02T00:16:03.182Z"}