Not like this
The engine gets pulled apart into deep, single-purpose modules, and a day later the entire day-two Norwegian layer, carried for three weeks without a dictionary worth playing against, comes out for good.
The engine’s shared word-processing function came apart two days after it was written, split into three deep modules built around what the game actually does rather than around the code that had accumulated. A day after that, the whole day-two Norwegian layer, a language config module, translated UI copy, a dictionary nobody had curated, came out of the codebase entirely.
Physics, food, and turns, each with its own module#
The shared core extracted two days earlier had done its job, giving daily and duel mode one pipeline instead of two, but it was still one function carrying several unrelated concerns. It split into a SnakeManager owning the snake’s own physics, the silent no-reversal rule, tail vacation during movement, self-collision, growth, with its own dedicated tests; an EdibleOrchestrator centralizing apple replenishment and every combo trigger; and a TurnProcessor sequencing the actual submission pipeline, preflight, physical simulation, combo detection, edible resolution, as a single high-leverage interface. GameEngine itself shrank to a pure state manager sitting on top of all three. The shape is the same idea day one’s engine-first build started with, applied a second time now that the shape of the problem was better understood.
The language layer comes out#
The day-two Norwegian layer had been carried for three weeks: a language config module, direction letters and keyboard rows for two languages, and a dictionary that was never more than an unfiltered spell-check word list, not a set curated for a game where the same letters also steer a snake. Removing it took four small, deliberate steps: new English-only constants for direction keys and UI copy landed test-first, every consumer still reading from the old language config got migrated across, the file itself was deleted once nothing imported it anymore, and the dictionary build and licensing docs were updated to stop mentioning a word list the game no longer shipped.
The decision was not that Norwegian didn’t belong here, only that this version of it didn’t.
Where this leaves things#
A handful of stats fixes rode along in the same two days: sessions abandoned mid-game no longer counted toward games-played, a word that ended in a crash stopped skewing the community’s most-used word, and a longest-word card joined the stats page. None of that is the story. The story is two different kinds of correction landing back to back: one narrowing the engine to modules built around what the game actually needs, the other narrowing the game itself back to a language it can actually stand behind.