← All posts

The Cooler: what happens when tic-tac-toe stops being the win condition

Gjorge Karakabakov

Play it: gorgekara.itch.io/the-cooler — runs in any modern browser, no install.

The Cooler title screen: a green felt table under a hanging lamp, dealing itself the seven, eight and nine of spades and scoring it as a straight flush worth 104 x 6

Tic-tac-toe is a solved game. Two competent players draw, every time, forever. That is usually where the conversation ends — which is a shame, because the problem isn’t the board. It’s that we keep asking the board to decide who wins.

The Cooler takes the win condition away from it. The opponent has HP, and the nine cells are just the machine you use to hurt them.

It shipped as Tick Tac Card, which described the mechanic and nothing else. A cooler is the house’s answer to a winning streak — the deck that has been seen to, or the man they sit down across from you when the night has gone your way for too long. There are thirty-two of them in the building, which turned out to be the game the thing had grown into.

Every line is a poker hand

A tic-tac-toe line is exactly three cells. A deck is 52 cards. Those two facts fit together with no seam at all: play cards into the grid, and every completed line gets scored as a three-card poker hand.

HandChipsMult
Straight flush80×6
Three of a kind60×5
Straight45×4
Flush40×3
Pair25×2
High card15×1

Damage is (hand chips + the cards' own chip values) × mult. So 7♠ 8♠ 9♠ is (80 + 24) × 6 — 624 before anything else gets involved.

Note that a straight beats a flush. That’s correct for three-card poker, where three to a run is rarer than three to a suit, and it is the exact opposite of the five-card ranking everyone already has memorised. It’s a small thing that quietly pays out to players who know the difference.

Suits carry their own trigger, so a flush stacks three of the same one:

+1 MultHeal 2+$1Draw 1

Every card in your hand now pulls in two directions at once: where it goes, which is the tic-tac-toe game, and what it makes, which is the poker game. Those two answers are rarely the same cell, and that tension is the whole design.

The fork is the bridge

Here’s the part that makes the fusion work rather than just co-exist.

Because three-by-three is a draw under perfect play, a decent opponent blocks every single threat you make. One line at a time gets you nothing. But a fork — one card completing two lines simultaneously — scores both, applies a global ×2 on top, and is the one thing a perfect blocker has no answer to.

That’s not a bonus mechanic bolted on. It’s the same double-threat that has always been the only way to actually beat someone at tic-tac-toe, except now it’s also your biggest damage spike. The old game’s one real tactic became the new game’s signature combo.

Nothing ever stalls

Completing a line detonates it: the line scores, deals its damage, and those three cells clear. The board empties as fast as it fills, so it can never lock into the nine-cell stalemate that makes tic-tac-toe boring — and cells are a renewable resource, not a countdown.

The opponent, meanwhile, doesn’t score hands at all. Their lines deal flat damage by tier, scaled by a per-opponent pressure multiplier. You’re a scoring engine; they’re a clock. Keeping those two on separate scales means their difficulty can be tuned without touching your power curve.

A fight in progress: the player's seven and eight of spades in the left column, the opponent's cards in red on the right, and the held nine of spades previewing 936 damage as a Straight Flush on the bottom-left cell, with a red exclamation warning on the cell the opponent completes next turn

The board can do the arithmetic for you

Pick up a card and every legal cell can answer three questions at once: what it would score, where it sets up a fork, and — the red ! — which cell the opponent completes into next turn and the worst it could cost you.

Those numbers aren’t estimates. They run through the same scoreLine the real hit uses, charms and enhancements included, so the figure on the cell is the figure the count-up lands on. In the screenshot above the held 9♠ shows 936 on the bottom-left cell: (80 straight flush + 7 + 8 + 9 chips) × (6 + 3 for the spades). That’s arithmetic you could do yourself with everything already face-up, which is exactly the kind worth handing over.

It is off by default now, which is a reversal. Fully annotated, the board stops being a thing you read and becomes a thing you compare, and the fork — the one idea the whole game is built on — arrives as a label rather than as something you spotted. So the default is a bare table, the setting has three steps (off, the damage figure alone, or everything including hand names and fork setups), and the tutorial always runs on full hints, because half of what it teaches is how to read them.

The run

Eight rooms of four fights — 32 in all. Four archetypes hold the difficulty curve and a cast of ten characters fills the seats, so the Padre who takes your money on the third floor is the same man, promoted, on the sixth.

The scaling is steep. The first boss has 2,000 HP, hits at ×1.5 pressure and blunders 6% of the time; the last has 11,644 HP, hits at ×3.11 and blunders 0.4%. Your ceiling has to climb with theirs, so clearing a room grants +20 max HP and a full heal, charm and hex slots open on a schedule, and there’s a shop between fights selling charms, card enhancements and consumable hexes — 40 charms, 17 hexes and a shelf of enhancements now. The interesting ones carry a real cost: Glass Cannon triples your mult and doubles the damage you take, and The Cooler itself gives ×2 Mult on every line but scores only the best half of a fork, which makes it the exact anti-charm to Fork Master. A charm with no drawback isn’t a decision, it’s just a number going up.

Health used to keep climbing past that — the last boss held nineteen thousand at one point — and a fight that size is not harder than half of it. The opponent’s play has already saturated by the fifth room, so the extra ten thousand buys twenty more turns of a decision you have already made. Long is not hard.

The building is different every time

The ladder used to be a fixed corridor: room three was always scorched earth, so the fiftieth run walked the same thirty-two fights as the first. A run now draws a seed, and the seed decides two things.

The boss rules are shuffled. Every room gets one and a run sees each exactly once — a Fisher–Yates shuffle rather than a per-room hash, because hashing room to rule independently gives a run that meets scorched earth three times and never sees the short hand, which reads as the game forgetting its own content rather than as variety. The eight: sealed corners, a centre that keeps slamming shut, scorched earth, a short hand, a hot cell worth double, a bleed, a double dealer, and a tax on every line they land.

One regular seat per room is an elite from the third room on — a regular handed one of the milder boss rules, more health, more pressure and a bigger purse. It breaks the three-warm-ups-and-a-boss shape every room otherwise had.

On top of the seat, every face carries a quirk of its own: the Docker hits a third harder and never blocks, the Black Widow bleeds you from every cell she holds, the Padre takes back a tenth of every line you land on him. The seat keeps the curve; the quirk belongs to the person, so meeting someone twice teaches you something usable. Two of the ten are read straight by the AI rather than implemented as events, because “never blocks” is a search parameter and not a thing that happens.

And beating the building opens the next rung of a five-step stake ladder, one at a time and only by winning. Every knob a stake turns is a number some other file was already reading, so no stake asks you to learn a new rule — the appeal of a difficulty ladder is that you already know the game and it has stopped being enough.

Three build notes

There are no image assets in the project. Not one. Every card, every suit glyph, the felt, the trapezoid board, the opponents’ portraits, the bar behind them — all drawn procedurally with Phaser Graphics and Unicode. Sound effects are synthesised too: oscillators and noise buffers with envelopes, no sample files. A scoring run climbs a semitone per beat, which is most of why a count-up feels good.

The rules don’t know Phaser exists. Everything in src/game/ — cards, board, hand evaluation, scoring, charms, hexes, quirks, the AI, fight resolution — imports no engine code at all. That one boundary buys two things that would otherwise be painful: 240 unit tests that run in milliseconds with no canvas, and a balance harness that plays whole runs headlessly through the real Fight and the real AI, off a seeded RNG so the same seed reproduces the same numbers exactly.

The desktop build is served, not opened. The same bundle is wrapped in Electron for Mac and Windows, and almost all of the wrapper is one decision: it goes over a custom app:// scheme rather than off file://. Two things break otherwise and both fail quietly — fetch refuses file://, so the music never loads, and localStorage is keyed to an origin that file:// barely has, so a player’s saves can evaporate when the install path changes. A smoke test launches the packaged app, asks the page whether storage round-trips and whether the music actually arrived, and exits non-zero on any console error, because “the packaging config compiles” and “the game runs when packaged” are unrelated claims.

What the harness caught

The balance harness is the reason I trust the tuning at all. It runs scripted policies — one that builds forks, one that greedily takes the best line it can see, one that places blindly — and the gap between the first two is the number that matters. Balance changes get measured there before they get written into the game.

The important change was measuring whole runs rather than single fights. Per-fight win rates are read from full health and badly overstate the run: HP carries across all thirty-two opponents, and a 70% fight played at half health is not a 70% fight. Three findings only showed up once the harness played the ladder end to end.

The Padre was unkillable. His quirk healed 2% of his own max health per line, which reads like a small number and is really a flat toll that grows with the room: by the sixth-room boss he took back 156 whatever you hit him with, so any build landing under that could not kill him — not slowly, but never. He posted a 0% win rate from the third room on. Keyed to the damage instead, he always loses nine tenths of every hit and is beaten in a bounded number of lines. Three tests pin that property now, because it is not visible by reading the rule.

The purse was shaped backwards. Players walked into the first five rooms holding $4, $1, $1, $2 and $11, and into the last three holding $59, $136 and $225 — broke through every room that could still kill them, and rich once their build was settled and the slots were full. A quarter of all runs ended at the first boss, four fights and about fifteen dollars in.

The shop is load-bearing, and so is knowing what to buy. Buying nothing clears 0% of runs. Buying at random clears 0%. Following one fixed shopping list, defence first, clears 37% — and a policy that never forks clears 0% even buying to the same plan. Forking isn’t a bonus; it’s the skill the whole ladder is built around.


It started as a joke about the most solved game there is. It turns out that if you stop asking tic-tac-toe to decide the winner and start asking it to decide the damage, the nine cells have quite a lot left to say.