I remade a game from my childhood phone. Three problems ate most of the time.
I made Builder: Match 3, an Android remake of Stack Attack 2 — the game that came preinstalled on old Siemens phones. A crane drops coloured crates on a building site, you play the builder below, three of a colour clears them, a crate on your head kills you. The one thing I added is carrying: you can pick a crate up, walk with it and put it down where you want. In the original you could only push them.
It is free, works offline, no ads and no purchases. Unity, portrait, one hand. Art by an artist I worked with, everything else mine.
Three problems took most of the development time. None of them were the ones I expected.
1. My logic and my graphics disagreed about the truth
I made the grid the source of truth. The moment a crate is released it already owns its final cell, and the sprite glides down for about a second to catch up. Clean model. It caused both bugs that reached players.
Push two red crates into two red crates, and only three cleared instead of four — the first crate to land started the match check while its neighbour was still moving. And later: the board is full, one free cell left, the bonus that clears half the field drops into it, and the game ends instantly while that bonus is still visibly in the air above the player.
Same mistake twice. I was reading logical truth at a moment when the player was looking at the visual lie. If your logic runs ahead of your animation, every check has to say which of the two it means — and the checks that decide winning or losing must mean what the player sees.
2. My first build was 56 MB and it was not the art
I spent days assuming textures. It was not textures.
libil2cpp.so was 48 MB and libunity.so
33 MB, purely because I was building with the Development flag on. Release build, managed
stripping on Medium, IL2CPP set to optimise for size: 21 MB, with nothing cut from the game.
The textures were about 15 MB the whole time. Measure the native libraries before you touch
your art.
3. Making it harder made it unfair, not harder
My first idea was the obvious one: speed the crane up forever. It became unfair long before it became difficult — crates arrived faster than a human can decide anything.
What worked was adding cranes instead. A second one appears at 500 points, a third at 2000, and each owns its own set of columns so they never drop into the same place. Same falling speed, more crates in the air. Now carrying a crate costs you time you can actually feel, and the difficulty comes from having to choose what to ignore.
The part nobody warns you about
Shipping is not the last step. Screenshots, a feature graphic, store text in a lot of languages, data safety forms, and a content rating questionnaire that gave a cartoon game about a flattened builder a 16+ badge. Budget real days for that, not an evening.
AI disclosure: I used an AI coding assistant while writing the code, and AI help for the store text, the localisation and this post. The art was drawn by a human artist. The design, mechanics and tuning are mine.


Discussion