I liked Bubble Saver enough to want a maths version of it. Swapping letters for numbers took about
an hour. Swapping the dictionary for arithmetic took the rest of the week.
This is the same game as Bubble Saver: ice made of tiles, water below, bubbles that need a hole to escape through,
and a path you trace across adjacent tiles to melt them. The only difference is what makes a path legal. In the
original it is a word. Here it is a sum — trace numbers that add up to the target, and those tiles melt.
It sounds like a find-and-replace. It was not, and the reasons are more interesting than the port.
A dictionary answers. A target has to be proved.
Here is the whole difficulty in one line.
In the spelling game, validating a word is a lookup. Is SLATE in the list? Yes or no, instantly, and the
board plays no part in the answer. Generating the board is equally easy: scatter letters by how often they appear in
English and the player will find something. You do not need to know in advance what they will find, and it
does not matter if some boards are richer than others.
Now try that with numbers. The game shows a target and asks the player to reach it. Which means the game has to
pick the target — and a target nobody can make is not a hard puzzle, it is a broken one. The player
will trace every promising run of tiles, fail, and correctly conclude the game is lying to them.
So before a target can be displayed it has to be proved reachable on the actual board in front of the player. That
means searching: walk outward from every tile through its neighbours in all eight directions, accumulating as you
go, and see whether any path lands exactly on the number. The equivalent of the dictionary is not a list at all. It
is a solver that runs against this specific arrangement of these specific tiles, every time a target is chosen.
That inverted the shape of the whole thing. The spelling version generates a board and trusts it. The maths version
generates a board, then searches it, and only then knows what it is allowed to ask for.
It also gave the game a property the original never had: every target is guaranteed solvable at the moment it
appears. Which is a promise worth making and one you can only keep if you check.
The daily has to be the same for everyone
A puzzle of the day means every player gets the same board and the same targets, which means the target selection has
to be deterministic — seeded from the date rather than from chance.
That is easy to say and it collides immediately with the paragraph above. The target picker is not a random draw; it
is a search over a board, and it has to produce the same answer for everyone. So the seed has to feed the search,
not just the shuffle, and anything in there that quietly depends on iteration order or timing would put two players
on different puzzles while both believed they were doing today's.
Running totals are not words
A selection in the spelling game has two states that matter: is this a word, and is it long enough. A selection in
the maths version has three, and they are not the same three.
You can be under the target, which is fine and normal — keep going. You can be at it, which
means you may submit. Or you can be over it, which is a dead end: there is no tile you can add that brings
a sum back down, so the path is finished and wrong, and the game should say so immediately rather than letting you
keep dragging hopefully.
That third state has no equivalent in the word version. A half-built word is never ruined, only unfinished.
A sum that has gone past its target is over, and the interface has to communicate that instantly or the player
wastes their time on a path that cannot recover.
Which is why the display ended up as a single chip showing the running sum against the target, updating as you trace.
Earlier versions had the running total in one corner and the target somewhere else, and reading a game by comparing
two numbers in two places is one job too many while your finger is moving. Putting them adjacent, as a fraction,
removed the reading entirely: you are watching one thing approach another.
The old game hiding inside the new one
The part of a port nobody warns you about is the vocabulary that survives the transplant.
When the swap was done and the game was playing correctly, I went looking for every remaining trace of the spelling
version by name — the lexicon, the current word, the minimum word length, the letter generator, the word-ready
flag, the fallback word list. Most were gone. One was not: a timing constant still called something about words,
being read by code that had nothing to do with words any more.
It worked. It would have gone on working indefinitely, which is exactly the problem — it was a piece of the old
game's vocabulary sitting in the middle of the new game's logic, waiting to confuse whoever read it next, quite
possibly me in a year. A port is not finished when it runs. It is finished when nothing in it is still named after
the game it used to be.
Two modes, one set of constants, one very specific bug
There is a continuous survival mode alongside the levelled one: bubbles keep arriving, the ice keeps coming, and it
ends when real ice reaches the floor.
It produced my favourite bug of the build. On a late level, a perfectly good two-tile sum — thirteen and
fifteen, making twenty-eight — was rejected. The numbers were right, the tiles were adjacent, the target was
correct, and the game said no.
The cause was that continuous mode was borrowing its rules from whichever level you happened to be on, and that level
required a minimum of three tiles. A rule that makes sense in a designed level — forcing longer chains as
difficulty rises — made no sense at all in a mode with no levels, and it was silently in force.
The fix was to give continuous mode its own constants rather than letting it inherit. Which sounds obvious written
down, and the reason it was not obvious is that sharing them was correct right up until the two modes disagreed
about one value. Shared configuration between two things that are nearly the same is a trap of exactly this
kind: it works, and works, and works, and then produces a bug that makes no sense from either side.
Was it worth it?
The honest accounting: the visible half of this port — tiles, rendering, physics, bubbles, ice, the entire feel
of the thing — came across almost free, because it never cared what was written on a tile. Everything that
touched meaning had to be rebuilt from nothing, because a dictionary and an arithmetic target are not the
same kind of object at all. One is a question you ask about a string. The other is a question you ask about a board.
What came out is not a re-skin. The spelling version rewards a big vocabulary and spatial judgement. This one rewards
arithmetic you can do while your finger is already moving, and it turns out to be a genuinely different game wearing
the same coat — which is the best possible outcome, and not the one I expected when I started.