Project status · status text updated 2026-10-04 · site built 2026-10-04 15:17 UTC

Packhorse

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.

Play it

Download for macOS (97 MB) Download for Windows (86 MB)

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.

In the engine now

Real screenshots from Unity, newest build first. These show where the game actually is.

Status

Last updated: 2026-10-04

What this is

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/.

Decisions made

DecisionChoice
EngineUnity 6000.3.18f1, URP
Game logicHidden tile grid (8 m tiles), smooth landscape drawn over it
AgesI Trails 800-1000, II Roads and rivers 1000-1250, III Wagonways 1250-1500
CombatNone; swords and axes are cargo
LicenceGPL-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

Step 0: look proof (in progress)

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):

ViewFirst buildWith grouped forest renderer
Village, 120 m12.6 ms6.2 ms
Forest edge, 70 m15.3 ms5.9 ms
Wide, 620 m27.0 ms8.2 ms
Fully zoomed out, 1300 m60.7 ms8.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).

Detail pass (2026-10-04)

The game: three ages, playable

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.

AgeFromWaysCarriersNew trades
I Trails800trails, fordsporter, handcart, donkey string, mule stringgrain, flour, logs, wool, cloth, salt
II Roads and rivers1000roads, timber bridgesox cart, horse wagon, river bargestone, iron ore, charcoal, iron, tools, planks
III Wagonways1250wooden rails, trestles, tunnels, lantern signalswagon train

The look

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.

How it was checked

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.

Download

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.

Since then: closing in on OpenTTD (2026-10-04)

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:

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).

Known gaps

Next

Our own extras (tolls on roads, seasons and harvest, market days), then canals and locks, timetables and conditional orders, sound.

Source

Private repository: https://github.com/pretjeuh/ttd-deluxe

Status site

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.

Known placeholders

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/.

Where the look is heading

Concept sketches, not the game. They show the target look and the three ages.

Commit log

The last 38 commits to the project repository.

WhenCommitWhat changed
2026-10-04 18:17d064497feat: the game is called Packhorse; the computer's companies use barges and wagonways
2026-10-04 17:557b3202bfix: upload the site's pictures and downloads before the page that points at them
2026-10-04 17:48ee13c56feat: one game on several machines
2026-10-04 16:400a3bf3afeat: rival companies run by the computer
2026-10-04 15:3703a841afeat: orders at each post, cargo in transfer, wagons on a train, signals along a line, industries that close
2026-10-04 14:34ffc4265test: a balance table from the real catalogue, and a first round of tuning from it
2026-10-04 14:250acd2ddfeat: shaping the land, founding industries and settlements, town actions, grouped tools
2026-10-04 14:08966d92afeat: valleys made from a seed
2026-10-04 13:51f3d9581feat: company record and rating, graphs, small map, lists, save slots, autosave, upkeep of built things, post removal, copy
2026-10-04 13:31342a182feat: post ratings, changing output, wear and tear, subsidies, travellers and letters, news
2026-10-04 13:116d79870feat: loans and yearly books, bankruptcy, one-way signals, a remove tool, loading orders
2026-10-04 10:16a5efd87docs: command-line build and check scripts in the README; fix the Windows freshness check
2026-10-04 10:122c0e98ffeat: all three ages in the game, and the look of the first sketch
2026-10-04 09:4769c7d06feat(sim): barges, wagon trains, lantern signals and tunnels
2026-10-04 09:29191ec7bfeat: Age II goods and two-input workshops; world layer for roads, bridges and carts
2026-10-04 09:11666c9b0feat(sim): ages, way kinds, bridges and new carriers
2026-10-04 09:0650cb130fix: zip option order in the Windows packaging script
2026-10-04 09:01dc065aafeat: Windows build, and a download per platform on the status page
2026-10-04 08:429a06ba6feat: parchment interface skin
2026-10-04 08:22b8df1ebfeat: sell and re-route donkey strings; donkeys with legs that stride
2026-10-04 02:565dde0a7feat: rippling river and a walking bob for the donkeys
2026-10-04 02:49eecc609docs: status covers help, new game and hover descriptions
2026-10-04 02:474baf1c8feat: help panel, new empty game, and hover descriptions
2026-10-04 02:4178b561bchore: rebuilt playable scene
2026-10-04 02:3520bd7a6feat: villages grow when supplied and pay more as they grow
2026-10-04 02:265f755d1feat: save and load
2026-10-04 02:184ba15c4feat: macOS build and a download on the status page
2026-10-04 02:0473bd123feat: watermill with a turning wheel, sheep farm, weaver and salt works
2026-10-04 01:48bd4a72bdocs: README and agent notes for the project
2026-10-04 01:454b0ddf0feat: playable Age I loop in the valley
2026-10-04 00:57fb68bfefeat: Age I rules engine with tests (trails, posts, cargo, donkey strings, money)
2026-10-04 00:3775ec24ffeat: cottages, barn and pack donkey modelled in Blender
2026-10-04 00:162877209feat: firs, meadow plants, strip fields and wattle fences
2026-10-04 00:05840bc2edocs: note benchmark variance under a shared GPU
2026-10-04 00:005488432perf: draw the forest in instanced cells instead of one call per tree
2026-10-03 23:54f551d3adocs: project status and the status site generator
2026-10-03 23:5443f4768feat: look-proof valley generated in Unity 6 (URP)
2026-10-03 23:540caa25bdocs: art direction and game design research pages