Onde está o Gato
A cat jumps out the window at dusk and disappears over the rooftops, and you go after it. It is not running away: it stops and looks back to check whether you are still coming. The name is Portuguese for “Where is the Cat”.
Made to be played as a family. It is not going to an app store: the package is installed directly on the devices.
The central decision
The game rule does not know the engine. The domain is a pure C# library, without a line of Godot, and it is where progression, collectibles, save and the narrative machine live. The engine project is a thin layer that reads that domain and draws it.
This is not purism, and it has two practical consequences:
Most of the game is testable without a GPU. The whole suite runs headless in a few seconds. The machine I develop on is a two-core Pentium G4560, where opening an Android emulator to check a business rule would be unfeasible in practice, and what is unfeasible in practice nobody checks.
The engine becomes a replaceable detail. If Godot gets out of the way, what is lost is presentation, not the game.
Why this is in a backend engineer’s portfolio
Because it is the same decision as in Domain modeling, DDD and CQRS in a context that makes it non-negotiable. In an enterprise system, mixing rules with the framework has a diffuse cost that is paid slowly. In a game, it means needing an emulator to test a progression rule, and the cost shows up in the first week.
The same design repeats in Reino do Ritmo, in another language and another engine, which is the best evidence I have that the principle does not depend on the stack.
Decisions that cost discovery
I record them because they are the kind of thing that only shows up by doing:
- The target framework was not a choice, it was a restriction of the engine’s Android export template. The domain multi-targets to meet two incompatible requirements, without conditional compilation: if an API only exists in the newer version, it does not go in
- The engine requires a solution file in the project folder. Without it, the export “works” and generates a package without the assemblies inside, which installs and breaks on opening, with no obvious cause
- Every interface respects the screen’s safe area, validated on a real device: the notch of the built-in camera cut off text in the prototype
Technical target
The floor device was defined before starting, not after: a Moto G06 with 4 GB of RAM and a modest integrated GPU. Compatibility renderer, locked landscape, single architecture.