OpenLoco v25.06 is out! The summer months are often quite quiet, so it has mostly been behind the scenes company AI work. For a summary of changes, please find the changelog on GitHub.

Company AI implementation

The Company AI is mostly implemented now, with the exception of the routefinding. Last month, I started implementing some of the routefinding logic that selected available track/road types. This month, though, was all about actually choosing the route to take. It’s ultimately quite a simple algorithm: it simply tries to place one of the available track pieces, evaluates its suitability, then recursively tries to place the next piece. If it can’t place a piece, or it reaches the destination, it will stop trying to place more. If it encounters a major issue, it can also backtrack a limited amount. The AI will only try this for ~10 pieces at a time, so if there is a major obstacle it can go quite wrong. After it has tried all these placements, it then selects the best one based on suitability, and places an AI ghost. It will then, on the next tick, repeat this process until it has reached the destination. This does mean that the AI throws out a lot of work at the end of each tick, so there is room for improvement here.

With this part now implemented, all that remains is the logic for handling track/road merging with routefinding. The logic for this will hopefully be tackled next month, and then AI will finally be finished!

Update Available Road and Rail Options

@petergaal has been quietly working on a few of the remaining object setup functions. This month, it was the available road and rail options. This sets the default selection for when you select road or track from the top toolbar.

Split Win32 Symbols

@AaronVanGeffen discovered that the Windows binaries for releases are too large. The reason they are bigger than they absolutely need to be is that we ship the debug symbols with the release. The symbols are typically ~16MB, whilst the actual game binary is ~4MB. If you aren’t a developer, the symbols are pretty useless. So Aaron has now split it up into a separate file.

Updated: