DEV Community

Taehyun Kim
Taehyun Kim

Posted on

Traceroute devlog #5

Most of this week went into the hint feature, and it kept teaching me that "helpful" is a much harder word to actually implement than it sounds.

 The first version was almost embarrassingly broken. Load a fresh level and press the hint button before touching anything, and nothing happened at all, because the game had no idea which color you meant to get help with. Fixing that was easy, just default to the first unfinished color. The real problem showed up once I started actually playing with hints turned on. If you'd drawn a path that diverged from the stored solution, but your path was still perfectly valid and still completable, pressing hint would wipe it out and replace it with the stored one anyway. That felt awful to hit as a player. So I rebuilt the whole feature around one rule instead: never erase progress that can still be finished, no matter how it compares to the solution on file.

 That rule sounded complete until I found the case it didn't cover. A hint aimed at helping one color could, while doing exactly what it was supposed to for that color, accidentally cut through the only remaining path available to a different color that hadn't been started yet. Checking whether the target color alone could still be completed wasn't enough. I needed to check whether the entire board, every unfinished color at once, was still solvable after the hint went in, in real time, while the player was sitting there waiting for a response. That is the one thing the whole project had been built to avoid. The rule from day one was that actual solving only ever happens ahead of time, offline, and the live game just reads the answer off a file. Hints were supposed to be an exception to that too, just reading a stored path, no live computation. Now they weren't. I didn't love making that call, but pretending the board-wide check wasn't necessary would've meant shipping a hint button that could occasionally hand a player an unsolvable board, which is worse than bending a rule I'd written for myself weeks earlier. I wrote it down as a deliberate, documented exception instead of quietly ignoring it.

 There was a smaller, funnier scare later in the week on the developer demo screen, the one that visualizes the generator and solver actually running. After wiring it up, starting a search would just sit on "Solving..." and never move. My first guess was that something had deadlocked. It hadn't. The visualization was queuing up a tiny delay for every single step the search touched internally, and there are a lot more of those than there are steps that actually matter to watch, so the playback queue had quietly grown into something that would've taken hours to finish draining, one slow frame at a time. Nothing was frozen. It was just patiently working through a backlog longer than my patience for testing it. Sampling the interesting steps instead of queuing every single one fixed it in a few minutes once I understood what was actually happening.

 The last thing I built this week was the piece that was supposed to feel like the finish line: a fully automated pipeline that generates new levels on its own schedule, has an outside reviewer weigh in on whether they're any good, and opens a pull request for me to approve. All of it works. The tests pass, the workflow file is wired up, the review logic runs clean. Then I went to actually turn it on and found out I can't get an API key issued at all, because the phone number tied to my account got disconnected at some point and I never noticed. So the feature that was meant to close out the week sits there finished, tested, and completely unusable, not because of anything in the code, but because of a phone number that stopped working for reasons that have nothing to do with any of this. That's an oddly deflating way to end a week of real technical work, and I don't have a clean resolution for it yet. It's just sitting in my queue to sort out with customer support.

 Everything else landed without drama by comparison: progress now survives a refresh, the game holds up on a phone-sized screen, obstacles and the star-scoring system are both fully wired in, and the level-select screen went through a handful of layout fixes once I actually clicked through it myself instead of just reading the plan for it. None of those needed a second definition of "done." The hint system needed three.

Top comments (0)