House of Bonsai · Development update

Two years in two seconds.

A developer slider now grows a tree two years ahead in about two seconds, on a copy of the growth model rewritten in Rust that has to match the original number for number. Stopping on any day shows that tree as the game draws it, and grower routines for the ficus, the juniper and the cherry run on their real calendar.

Results

Checks on the development PC, 10 October: quick suite 48 of 48; every grower routine grown for two years on both copies of the model came out identical day for day, and every stopped day loaded into the game (6 of 6, run 20261010-030222).

Development capture, 10 October: the slider stopped on its last day and shown by the game itself, a three-year-old ficus after two years of the develop routine (409 shoot segments, 40.9 cm). The bar at the top is the developer tool's.
Development capture, 10 October: the slider stopped on its last day and shown by the game itself, a three-year-old ficus after two years of the develop routine (409 shoot segments, 40.9 cm). The bar at the top is the developer tool's.

Watching a tree grow

Players need to see what their care does, and waiting at the real pace is for a later hardcore mode. For the developers the ask was a slider: drag it from left to right and watch a tree grow, with what growers report at each age beside it as a reference, keeping every rule the model has learned about wood, pruning and shared growth.

One game day of growth on a grown tree took 17.4 seconds on this PC, so a year took well over an hour. Running the whole-tree passes once an hour or once a day instead of every five minutes, while water and sugar still step every five minutes, kept a growing sapling within 2 % of the full-detail tree. The slider grows the game's own nursery sapling on a background thread and records each day as lines for wood and dots for leaves, so dragging only scrubs through days already grown.

The growth slider at day 0: a small ficus drawn as brown lines and green dots beside a ring for the pot rim.
Day 0, 1 June, the nursery sapling.
The slider at day 182: the ficus taller with more side shoots.
Day 182, 30 November, two days after the crown was sheared to a dome.
The slider at day 365: a branched young ficus.
Day 365, one year on.
The slider at day 730: a branched ficus about 41 cm tall, with the reference stages and the care log listed beside it.
Day 730, 41 cm; the reference for a three-year pre-bonsai, 41-47 cm, is highlighted beside it.

A second copy that must agree

GDScript had reached its ceiling for this model. A test showed where the speed was: Rust reading the tree out of Godot's dictionaries was twice as slow as GDScript, and the same walk over its own arrays about 1,370 times faster. So the slider got its own copy of the model in Rust, with the tree held in Rust's memory, and the GDScript model stays the reference that copy must match exactly.

Exactly turned out to be specific. Rust's sine and Godot's differed by millions of units in the last place on the large numbers the model feeds them, so the copy calls the engine's own math. Godot's vectors are 32-bit while its other numbers are 64-bit, so the vector math was rewritten from the engine's source, operation by operation. Each rule was ported and checked on the same tree in both. A growth-rule change now has to land in both copies, and two checks fail when they differ.

One game day of the modelGDScriptRust copy
Nursery sapling25 ms1.3 ms
Grown tree, 1,930 shoot segments, daily passes47.6 ms1.7 ms
Grown tree, passes every 5 minutes7,970 ms158 ms
A slider day (grow and record)61-120 msabout 2.9 ms

Measured on this PC. Two years of the slider take about two seconds, and the copy's slider frames hash the same as the GDScript slider's on all 730 days.

Stopping on a day

Lines and dots are enough to watch growth, not to judge it. Press M on any day and the game itself draws that tree on its exhibition stand. The slider keeps a snapshot every ten days, grows the chosen day on from the nearest one in a few tens of milliseconds (it must come out identical to the day the slider recorded, and does), writes it into the game's own save of the sapling and loads it like any save, in under a second.

Loading through the game's front door found two things at once. The game refused the save: the care routine had cut the sacrifice branch 6 mm from the trunk, closer than the game's own cutters ever go, so the routine now cuts where a player's cut would land. And on a winter day, white planks hung behind the stand. They were the snow on the garden wall outside the grow room, which the exhibition view never hid because it is not part of the room, so in winter it would have shown behind the stand for players too. It is hidden now, and a check covers it.

The slider's line drawing of the ficus on its last day.
The slider's drawing, day 730.
The same three-year-old ficus drawn by the game on its exhibition stand.
The same day in the game. Loaded from its save in under a second.
The ficus on the exhibition stand with white planks and specks in the dark behind it.
Before, a December day: the garden's snow behind the stand.
The same ficus on the exhibition stand with a clean dark background.
After, the seasonal garden hidden with the room.

What growers do, on their calendar

Each species now has routines from grower practice, dated by the calendar: the nursery sapling is potted on 1 June, which also showed that the old routine's "mid-summer" cut-back fell in late November. All of them grow for two years identically on both copies of the model; the cherry's seasons, winter chill and bloom had not been compared before.

  • Ficus, develop: a free sacrifice branch, the crown sheared to a dome, new shoots cut back to two leaves each month, the sacrifice branch removed after a year and a half.
  • Ficus, chop: free growth, then the trunk chopped at 12 cm on the second 1 July while a bud below takes over the line.
  • Ficus, refine: develop, plus a full defoliation on the second 15 June.
  • Juniper: let a young tree run, or from the second June cut runners longer than three foliage segments back to three with scissors, never into bare wood. The trimmed tree ends bushier: 188 segments against 153.
  • Cherry: shoots run the first year; in the second July the trunk is cut back for taper; on 1 September new shoots go back to three nodes; nothing thicker than 1.5 cm is cut.
A ficus five days after its trunk was chopped at 12 cm.
Ficus, chop, 6 July, five days after the chop.
A three-year-old juniper with tufted foliage after a season of scissor trimming.
Juniper, scissors, three years old.
A young cherry in leaf two weeks after its September cut-back.
Cherry, develop, 14 September, after the trunk and shoot cuts.

What the routines found

A defoliated ficus never puts out new leaves. Growers expect new leaves within three to six weeks, smaller each time; the model drops the leaves and wakes no bud, so the stripped wood stays bare and only new shoots carry leaves. Three years in, the refined tree has 199 leaves against the developed tree's 400 and a thinner trunk. Fixing it changes the growth rules, so it waits for research and goes into both copies.

The potted cherry is slow: 16 cm at potting, 29 cm after its first summer. The published figures are for ground-grown nursery cherries, 72-80 cm in a year, so this is a flag until a potted reference turns up.

A ficus a month after defoliation, its branches mostly bare.
A month after defoliation, 15 July: still bare.
The refined ficus at three years, sparser than the developed one.
Refine at three years, 199 leaves; develop's tree at the top of the page has 400.

Also since the last log

Between 8 and 10 October, each with its own automated check:

  • Wire now holds as firmly as when it went on and sets with growing time: 78 % of the bend after 30 growing days, 95 % after 60, so it can come off after about two months.
  • A tree's construction budget follows its leaves, and new trunk wood follows the leaves made, so grown trees grow as their leaves earn and a pot-bound tree slows.
  • The tree's view is built off the main thread: the longest frame of a watched day went from 2.9 s to 0.27 s on the test GPU.
  • The dev.42 playtest package was built and verified from its archive.

What's next

  • Give defoliation its new flush and smaller leaves, sourced first and in both copies of the model.
  • Find a potted-cherry growth reference before tuning the cherry.
  • Add wiring to the routines, since young junipers and figs are wired while they are whips.

What I learned

Load a tool's output through the product's own front door. The game's save check caught a cut the model allowed and the game never makes, and the game's own view showed snow that had been there all along. And a second copy of a model is only safe while the first stays the judge, compared bit for bit.

Sources & development context

Based on House of Bonsai's source history and notes from 8 to 10 October: the check runner's records (quick suite 20261010-024219, 48 of 48; the slider checks 20261010-030222, 6 of 6; the native port's runs 20261010-010431 to -021540), the growth slider's reports and captures (windowed runs at 1280 by 720 on the development PC), and GROWTH-SLIDER-RESEARCH.md for the grower practice and reference sizes. Model outputs, not field measurements; no package has been built since dev.42.

All House of Bonsai posts