Ghosts, Scallions, and the Doctor Who Shouldn't Be There
By Claude (Anthropic) & Faye
There’s a moment in every project where you stop building systems and start playing the game. This week, that moment arrived — and the game immediately started talking back, telling us all the ways it wasn’t ready. Pre-production officially wrapped on Thursday. By Friday, we’d filed enough bugs to fill a small notebook. By Sunday, most of them were fixed, and a few had taught us something genuinely surprising about our own design.
Act 1: The Gathering at the North Wall
The first full playthrough from the player’s house to the village revealed something eerie: every single NPC was huddled together at one point in the far north of the map, like they’d all received the same mysterious invitation.
The culprit turned out to be a timing race between Godot’s NavigationServer and our LOD system. When a player transitions between scenes, _activate_schedules was being called during _ready() — before the TransitionManager had finished positioning the player and baking the navigation mesh. LOD1 NPCs (the ones off-screen, running simplified path interpolation) would query NavigationServer2D.map_get_path() against an unready nav mesh, and every single one got back the same garbage coordinate: (1048, 568).
The fix was elegant in its simplicity: connect schedule activation to the transition_completed signal instead of firing during _ready(). A secondary fix preserved the waypoint queue during LOD1 redirect — previously, multi-waypoint road routes were being truncated to a single endpoint, causing NPCs to stop at the first road intersection instead of walking their full route.
One bug, two fixes, and suddenly the village felt alive instead of haunted.
Act 2: The Immortal Scallion
During testing, Faye noticed something odd about scallions. Pick them, put them in your backpack — they have a freshness timer, destined to wilt in a few days. But move them to a storage chest and back? Suddenly immortal. The scallion that refuses to die.
The root cause was scattered across five transfer functions in inventory_manager.gd. Each one — quick_transfer_to_backpack, quick_transfer_to_hotbar, quick_transfer_to_container, _transfer_to_bag_contents, and _try_stack_or_swap — was creating new slot data by copying item_id, count, and state, but silently dropping fresh_day. When stacking items, the code also wasn’t taking the minimum freshness date (the way you’d expect — the oldest item in the stack determines when the whole stack expires).
A five-function fix, all in one file. Every transfer path now preserves fresh_day and durability, and stacking uses min() to pick the most urgent expiry. The scallions are mortal again.
Act 3: The Doctor Who Shouldn’t Exist
Professor 白术 is supposed to be a mystery — a hidden NPC who only appears during Main Quest 3’s healing storyline. Instead, he was standing outside his house, asleep, visible to everyone, from the very first day.
The bug was a layering problem. NPCManager.register_npc() correctly detected his initially_hidden flag and called set_npc_visible(false), disabling his visibility and physics. But his child BehaviorController node kept ticking independently. Every time the game’s time period changed, ScheduledBehavior._on_time_period_changed() would check his schedule, find mode: "hidden", and helpfully call _show_npc() to make him visible before trying to navigate him to a hiding spot. Since physics was disabled, he couldn’t move, so _hide_npc() would fail the distance check and skip — leaving him permanently visible at his spawn point.
The fix added story-gate checks at two levels: the behavior controller’s _physics_process (blocking all behavior ticks for gated NPCs) and the scheduled behavior’s time-period handler (preventing the show/navigate/hide cycle from even starting). Belt and suspenders — because a doctor appearing before his time ruins a story.
Act 4: Can the Player Actually Heal Anyone?
While testing the medical system, Faye ran a full audit of early-game healing coverage and discovered something uncomfortable: 7 out of 13 disease archetypes available in spring are effectively untreatable.
The problem wasn’t that we lacked herbs — spring has 37 usable medicinal items with solid coverage across wind, cold, heat, dampness, and several other axes. But archetypes like “Spring Dampness Stagnation” require reducing the interior (里) axis, and the only spring item that touches interior is honeysuckle at a modest -2. Archetypes involving organ meridians (liver, spleen) are completely impossible — no spring items affect those axes at all.
This wasn’t a bug in the traditional sense. It was a design gap that only became visible when someone actually tried to play the game as a player rather than a developer. The proposed solution is a two-layer adjustment: first, limit early-game axes to the six evils plus exterior, qi stagnation, and food stagnation (9 axes total, all well-covered by available items); second, adjust archetype mastery gates so only fully-treatable diseases appear in early game. The deeper TCM concepts — organ meridians, eight principles, blood and fluid deficiency — unlock as the player progresses to new maps with new herbs.
It’s the kind of insight that only comes from playing your own game. The spreadsheet said everything was balanced. The playthrough said otherwise.
Act 5: Ink and Parchment
The battle UI got a complete visual rework this week, trading generic borders for an aesthetic inspired by Chinese ink painting. Thin separator lines became three-layer ink brush strokes: a dark shadow on top, a warm brown main line, and a pale gold highlight underneath — mimicking the natural pressure variation of a calligraphy brush.
The battle history panel was rebuilt from scratch. Previously a minimal afterthought, it now shows turn-by-turn detail: which remedy targeted which pathogen, exact damage numbers with multiplier breakdowns (first-strike bonus, spirit modifier), splash damage to adjacent pathogens, combo triggers, counter-attacks, and even misses. The close button became a collapse arrow (»), because the panel persists through the fight — you might want to review your strategy mid-battle.
The pot (medicine-crafting) interface got its own round of fixes: ingredients that overflowed their containers, items that weren’t centered, and hover tooltips that now show all 30 TCM axes for each herb so players can make informed choices about what goes into their prescriptions.
The Quieter Wins
Beyond the headline stories, a steady stream of improvements flowed through:
- Player constitution generator: A new TCM-style questionnaire during character creation lets players discover their body constitution type (nine presets based on traditional classifications), which affects starting health axes
- Localization audit: A full review of the bilingual system found ~15 hardcoded
if is_entranslations scattered across 8 files, now being migrated to the proper CSV-based system - Vote system update: MQ3’s village expansion vote options were revised — the old choices (orchard, valley path, mountain road, desert passage) gave way to new ones (library, orchard, herb garden, bamboo trail) that better match the current map development plan
- Animation lock fix: A single-frame farming animation (
action_up) was never emittinganimation_finished, permanently locking player input. Root cause: the animation system’s_process()returned early for single-frame animations - NPC art pipeline pivot: Shifted from pure AI generation to a template-based approach using the character creator system, producing more consistent and controllable sprite sheets
- BGM exploration: Downloaded candidate tracks for scene-specific background music, exploring fusion of Chinese traditional instruments with modern arrangement
Milestone: Pre-production Complete
The biggest news might be the quietest: pre-production is officially done. The main quest framework spans multiple scenes and days. Weather, biome, emotion, and five-fatigue systems are tuned. The medical system has 30 axes, 45 traditional formulas, and a full diagnosis-to-treatment gameplay loop. NPCs have schedules, relationships, and art. The calendar works. The music plays.
What remains is production: more maps (herb garden, orchard, cave), more NPC houses, more props, and the long tail of balancing that only real playtesting reveals. This week was the first real playtest, and it delivered exactly what first playtests always deliver — a humbling list of things that almost work.
Almost is close. We’re getting there.
