A transport game in the spirit of OpenTTD, set between the years 800 and 1500. You start with pack donkeys on dirt trails, move up to carts and river barges, and end with horse-drawn wagon trains on wooden rails with lantern signals.
Packhorse-mac-2026-10-04-d064497.zip, built 2026-10-04 18:17; Packhorse-windows-2026-10-04-d064497.zip, built 2026-10-04 18:17. An early build: one valley.
macOS refuses an unsigned app the first time. Open it, dismiss the warning, then go to System Settings, Privacy & Security, scroll down and choose Open Anyway. Or in Terminal: xattr -cr ~/Downloads/"Packhorse.app"
Windows: unzip the folder and run Packhorse.exe. SmartScreen may warn about an unknown publisher; choose More info, then Run anyway. The Windows build is made on a Mac and has not been run on Windows yet.
Real screenshots from Unity, newest build first. These show where the game actually is.








































Last updated: 2026-10-04
A transport game set in 800-1500: donkey trails, then roads and rivers, then wooden wagonways with lantern signals. All three ages can now be played. Chosen look: "the living landscape" (detailed 3D). Research pages are in research/.
| Decision | Choice |
|---|---|
| Engine | Unity 6000.3.18f1, URP |
| Game logic | Hidden tile grid (8 m tiles), smooth landscape drawn over it |
| Ages | I Trails 800-1000, II Roads and rivers 1000-1250, III Wagonways 1250-1500 |
| Combat | None; swords and axes are cargo |
| Licence | GPL-2.0: rules are ported from OpenTTD where that helps (decided 2026-10-04). See docs/OPENTTD-PARITY.md for what is in and what is not yet |
Game > Build Look-Proof Valley (UnityProject/Assets/Game/Editor/ValleyBuilder.cs) generates Assets/Game/Scenes/Valley.unity: 2 km terrain, river with a ford, 86,844 trees, a village street, an upland hamlet, a donkey string walking the trail, evening light, tycoon camera.
Frame times on the M4 Pro, in the editor, 2560x1440, 4x MSAA (Game > Run Render Benchmark):
| View | First build | With grouped forest renderer |
|---|---|---|
| Village, 120 m | 12.6 ms | 6.2 ms |
| Forest edge, 70 m | 15.3 ms | 5.9 ms |
| Wide, 620 m | 27.0 ms | 8.2 ms |
| Fully zoomed out, 1300 m | 60.7 ms | 8.6 ms |
The target is 16.7 ms (60 frames per second).
These figures are from quiet runs and repeat within about 1 ms. While another game was using the GPU on the same Mac, the same benchmark read 30 to 50 ms with identical draw counts and returned to 8 ms afterwards, so a single slow run is not evidence of a regression: run it three times.
Gate result: passed. The first build drew every tree separately, about 50,000 draws per frame; ForestRenderer now sorts trees into 64 m cells and draws each cell in one instanced call.
After the detail pass below, the same views take 9 to 13 ms on a quiet machine: grass, flowers and wheat are drawn near the camera, and leafy tree models are kept out to 750 m (leafDetailMetres on the Forest object; 1000 m costs about 5 ms more in the wide view, 400 m saves about 2 ms).
tools/blender/build_cottages.py): three cottages and a barn with timber frames, thatch, stone footings, doors, shutters and woodpiles, using CC0 textures.tools/blender/build_animals.py) with sacks and a pack saddle.Game > Build Playable Valley generates Assets/Game/Scenes/Game.unity. A new game can start in 800, 1000 or 1250 (Help panel, then New), and a running game moves on through the years by itself.
| Age | From | Ways | Carriers | New trades |
|---|---|---|---|---|
| I Trails | 800 | trails, fords | porter, handcart, donkey string, mule string | grain, flour, logs, wool, cloth, salt |
| II Roads and rivers | 1000 | roads, timber bridges | ox cart, horse wagon, river barge | stone, iron ore, charcoal, iron, tools, planks |
| III Wagonways | 1250 | wooden rails, trestles, tunnels, lantern signals | wagon train |
Assets/Game/Sim, no Unity types): 202 automated tests. For every batch of new rules the rules were deliberately broken one at a time (22 breaks in the last three batches) and each break failed specific tests.The default view is now closer to the first concept sketch: a long lens for a flat, map-like angle, warm hazy evening light, round-crowned broadleaf trees, a denser village with red-tiled and thatched roofs and hearth smoke, a stone keep with a banner and a windmill with turning sails.
The Unity editor's remote connection was down for this stretch of work, so the game checks itself: tools/smoke.sh builds the macOS game from the command line and starts it with -smoke. The game then starts an empty valley in 1250, builds posts, roads, a bridge, a signalled rail line and a tunnel through the same commands the tools use, buys one of every carrier, lets it run, takes 30 screenshots and writes a report. The last run: nine carriers of eight kinds all drawn and moving, 88 lengths of rail, two tunnel mouths, two landing stages, both signal lamps seen, 0 errors, about 300 frames a second at 1600x900 on the M4 Pro.
tools/smoke.sh builds and checks the macOS game; tools/build_windows.sh builds the Windows one. tools/package_mac_build.sh and tools/package_windows_build.sh zip them for the status page. The Windows build is made on this Mac and has not been run on Windows.
The project is now GPL-2.0 and ports OpenTTD's rules where that helps. docs/OPENTTD-PARITY.md lists every OpenTTD feature against this game. Added in three batches, each tested, each rule broken on purpose to prove its test, each run through the scripted play-through:
tools/netsmoke.sh: two copies of the build on one machine play two years together and must end on the same sum.406 automated tests. Of 215 deliberate rule breaks in these batches, 193 failed a test at once; 17 showed tests that were too weak and were rewritten until they caught the break; five cannot change any outcome (dropping the interest remainder, while loans come in steps whose monthly interest is always a whole penny; and four checks in the computer's player that are made again further on).
docs/design/balance-2026-10-04.txt, from the BalanceReport test) plays every carrier on routes of 12, 30 and 60 tiles for twelve years under the full rules; after one round of tuning each kind has a route length it suits and a first route pays for itself in one to three years. That is arithmetic, not play.docs/OPENTTD-PARITY.md.Our own extras (tolls on roads, seasons and harvest, market days), then canals and locks, timetables and conditional orders, sound.
Private repository: https://github.com/pretjeuh/ttd-deluxe
tools/progress-site/deploy.sh builds this page from docs/STATUS.md, docs/site/ and the git log, and publishes it to https://packhorse.kroesneger.nl/ on pislik.
Broadleaf trees are a few smooth lumps and firs are bough cards; the vehicles and people are simple models. Terrain and building textures are CC0 from Poly Haven, prepared by the scripts in tools/.
Concept sketches, not the game. They show the target look and the three ages.





The last 38 commits to the project repository.
| When | Commit | What changed |
|---|---|---|
| 2026-10-04 18:17 | d064497 | feat: the game is called Packhorse; the computer's companies use barges and wagonways |
| 2026-10-04 17:55 | 7b3202b | fix: upload the site's pictures and downloads before the page that points at them |
| 2026-10-04 17:48 | ee13c56 | feat: one game on several machines |
| 2026-10-04 16:40 | 0a3bf3a | feat: rival companies run by the computer |
| 2026-10-04 15:37 | 03a841a | feat: orders at each post, cargo in transfer, wagons on a train, signals along a line, industries that close |
| 2026-10-04 14:34 | ffc4265 | test: a balance table from the real catalogue, and a first round of tuning from it |
| 2026-10-04 14:25 | 0acd2dd | feat: shaping the land, founding industries and settlements, town actions, grouped tools |
| 2026-10-04 14:08 | 966d92a | feat: valleys made from a seed |
| 2026-10-04 13:51 | f3d9581 | feat: company record and rating, graphs, small map, lists, save slots, autosave, upkeep of built things, post removal, copy |
| 2026-10-04 13:31 | 342a182 | feat: post ratings, changing output, wear and tear, subsidies, travellers and letters, news |
| 2026-10-04 13:11 | 6d79870 | feat: loans and yearly books, bankruptcy, one-way signals, a remove tool, loading orders |
| 2026-10-04 10:16 | a5efd87 | docs: command-line build and check scripts in the README; fix the Windows freshness check |
| 2026-10-04 10:12 | 2c0e98f | feat: all three ages in the game, and the look of the first sketch |
| 2026-10-04 09:47 | 69c7d06 | feat(sim): barges, wagon trains, lantern signals and tunnels |
| 2026-10-04 09:29 | 191ec7b | feat: Age II goods and two-input workshops; world layer for roads, bridges and carts |
| 2026-10-04 09:11 | 666c9b0 | feat(sim): ages, way kinds, bridges and new carriers |
| 2026-10-04 09:06 | 50cb130 | fix: zip option order in the Windows packaging script |
| 2026-10-04 09:01 | dc065aa | feat: Windows build, and a download per platform on the status page |
| 2026-10-04 08:42 | 9a06ba6 | feat: parchment interface skin |
| 2026-10-04 08:22 | b8df1eb | feat: sell and re-route donkey strings; donkeys with legs that stride |
| 2026-10-04 02:56 | 5dde0a7 | feat: rippling river and a walking bob for the donkeys |
| 2026-10-04 02:49 | eecc609 | docs: status covers help, new game and hover descriptions |
| 2026-10-04 02:47 | 4baf1c8 | feat: help panel, new empty game, and hover descriptions |
| 2026-10-04 02:41 | 78b561b | chore: rebuilt playable scene |
| 2026-10-04 02:35 | 20bd7a6 | feat: villages grow when supplied and pay more as they grow |
| 2026-10-04 02:26 | 5f755d1 | feat: save and load |
| 2026-10-04 02:18 | 4ba15c4 | feat: macOS build and a download on the status page |
| 2026-10-04 02:04 | 73bd123 | feat: watermill with a turning wheel, sheep farm, weaver and salt works |
| 2026-10-04 01:48 | bd4a72b | docs: README and agent notes for the project |
| 2026-10-04 01:45 | 4b0ddf0 | feat: playable Age I loop in the valley |
| 2026-10-04 00:57 | fb68bfe | feat: Age I rules engine with tests (trails, posts, cargo, donkey strings, money) |
| 2026-10-04 00:37 | 75ec24f | feat: cottages, barn and pack donkey modelled in Blender |
| 2026-10-04 00:16 | 2877209 | feat: firs, meadow plants, strip fields and wattle fences |
| 2026-10-04 00:05 | 840bc2e | docs: note benchmark variance under a shared GPU |
| 2026-10-04 00:00 | 5488432 | perf: draw the forest in instanced cells instead of one call per tree |
| 2026-10-03 23:54 | f551d3a | docs: project status and the status site generator |
| 2026-10-03 23:54 | 43f4768 | feat: look-proof valley generated in Unity 6 (URP) |
| 2026-10-03 23:54 | 0caa25b | docs: art direction and game design research pages |