Changelog

Die letzten Änderungen an "Return to the Roots"
d9a4572 s25client 28.09.2026 23:55 FloSoft Merge pull request #1886 from Flamefire/campaign

Allow relative path for campaign images
d3c6c71 s25client 28.09.2026 23:52 FloSoft Merge pull request #1972 from Flamefire/unused-cleanup

Remove `SUPPRESS_UNUSED`, duplicate `isSoldierJob` and fix CMake version range issues
82cd540 s25client 28.09.2026 23:50 FloSoft Merge pull request #1976 from Return-To-The-Roots/road-refactor

Return success indicator for BuildRoad and SetFlag
29d3ecd s25client 28.09.2026 23:48 FloSoft Merge pull request #1974 from Flamefire/maxDiff-fix

Fix `absDiff`
a131e83 s25client 28.09.2026 23:47 FloSoft Merge pull request #1984 from Flamefire/fix-bob-crash

Fix out-of-bounds access to override BOBs ny-offset
ff0200e s25client 28.09.2026 23:45 FloSoft Merge pull request #1986 from jarvis-jhk/fix/ai-battle-log-dir

ai-battle: log to the user data folder, not ./logs
516bfaf s25client 27.09.2026 11:37 JARVIS ai-battle: log to the user data folder, not ./logs

Without a log path set, LOG writes to ./logs relative to the working
directory; when that folder does not exist, the first Lua error or AI log
line dies with "Could not open logs/... for writing" instead of the real
message. Use RTTR's logs folder and create it, as the game does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
dc38c36 s25client 27.09.2026 11:37 JARVIS Guard IsBuildingEnabled against a missing game interface

GamePlayer::IsBuildingEnabled dereferenced world.GetGameInterface()
unconditionally for human players. Without a GUI (headless runs, tests)
that is null, so any disabled building (every campaign mission disables
some) crashed there. Guard it like the other GetGameInterface() uses:
no interface, no cheats.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
6e80cac s25client 23.09.2026 11:15 Flamefire Fix out-of-bounds access to override BOBs ny-offset

In `glArchivItem_Bob::mergeLinks` the ny-offset array for additional Bobs was not resized leading to an OOB access when accessing the sprites
after #1968
Fix by using a single array instead.

Fixes #1982
Fixes #1983
22754f4 libsiedler2 23.09.2026 11:12 Flamefire Merge `spriteOverlayIdx` & `spriteOverlayNyOffset`

Avoids having mismatching sizes of the arrays.
2f2104d s25client 09.09.2026 03:58 MichalLabuda Store the addon in AddonGui instance

Avoid indexing the addon list in parallel which is error prone
4623d2f s25client 08.09.2026 10:56 Flamefire Merge pull request #1951 from MichalLabuda/addon-presets

Add Addon presets
73aafa2 s25client 07.09.2026 15:35 Flamefire Store addon window/group in AddonGUI instance

Avoid repeated getting of the window which is error prone
42a3d70 s25client 06.09.2026 02:07 Michał Łabuda Merge branch 'master' into addon-presets
4c52e76 s25client 04.09.2026 23:35 FloSoft Merge pull request #1978 from Flamefire/skip-fix

Fix hanging game after skipping
81e0a2e s25client 04.09.2026 22:47 Flamefire Fix hanging game after skipping

When skipping the GameServer will accumulate executed time.
After skipping is done the next GF will be executed when the time passed
is bigger than 1 GF length.
However the realtime clock would first need to catch up to the
"game clock" which is significantly ahead.

Use the same approach as in `GameClient`: When skipping mark the game
clock such that the next unskipped GF will be run exactly 1 GF length
after the last execution of the skipped GF.

Fixes #1975
3111222 s25client 03.09.2026 16:24 Michał Łabuda Merge branch 'master' into addon-presets
8dc1386 s25client 01.09.2026 22:29 Flamefire Rename points in World::BuildRoad

The mix of `curPoint` and `end` is confusing.
Make them clear.
f4370d8 s25client 01.09.2026 21:20 Flamefire Return success indicator for BuildRoad and SetFlag

Useful for tests.
BuildRoad returns the end point calculated from the route.
320f32b s25client 01.09.2026 02:51 Michał Łabuda Merge branch 'master' into addon-presets
1813dfc s25client 31.08.2026 23:33 FloSoft Merge pull request #1973 from Return-To-The-Roots/clamp-fix

Fix ambiguous clamp and switch to `std::chrono::milliseconds`
44d7899 s25client 31.08.2026 13:32 Flamefire Fix spelling of Length
d8440ca s25client 31.08.2026 11:06 Flamefire Fix `absDiff`

Assert that it is indeed called with unsigned values.
Fix the violation.
163ec7a s25client 28.08.2026 12:02 Flamefire Add `assertNonNull`
2907dc1 s25client 28.08.2026 11:29 Flamefire Factor out type-agnostic helper for GameEvent time interpolation
6277878 s25client 27.08.2026 14:40 Flamefire Disable clang-format for a line it keeps changing

For some reason it sometimes adds a space before `&`
c771302 s25client 27.08.2026 12:50 Flamefire Use `std::chrono::milliseconds` consistently.
fcab253 s25client 27.08.2026 12:25 Flamefire Use `std::chrono::milliseconds` for game speed
de53cb1 s25client 26.08.2026 23:01 Flamefire Merge pull request #1969 from ottml/fix_trading_overflow

Fix underflow when trading
fac0308 s25client 26.08.2026 22:08 Flamefire Move `initGameRNG` to fixture
332b143 s25client 26.08.2026 15:15 sunrise Code review
144b846 s25client 26.08.2026 13:45 sunrise Use better name
7e655f0 s25client 26.08.2026 13:18 Flamefire Ignore opencode config
0fa587b s25client 26.08.2026 13:02 Flamefire Continue other CI jobs even on failure
bacf0fe s25client 24.08.2026 22:15 Flamefire Remove duplicate `isSoldierJob`

It's the same as `isSoldier` so rename/remove it.
151a3fb s25client 24.08.2026 21:51 Flamefire Remove use of `SUPPRESS_UNUSED`

- Use `constexpr` instead of `const`
- Use `[[maybe_unused]]` where applicable
- Remove includes
- Also shorten array-types to use CTAD instead of specifying the template params explicitely
32d5ac7 s25update 24.08.2026 21:41 Flamefire Fix dangling reference.

`.str()` returns a string which is destroyed if not stored.
So `.str().c_str()` yields a dangling pointer which effectively is a use-after free.
12e8d9d libutil 24.08.2026 21:40 Flamefire Remove `SUPPRESS_UNUSED`

C++17 supports the `[[maybe_unused]]` attribute which makes the macro redundant.
Convert the source to that instead to stay consistent.
8d5ed0d libutil 24.08.2026 21:38 Flamefire Update message on which Boost is used

The setting for static/dynamic Boost is enforced by the Boost CMake config files.
So the "either static or dynamic" option is no longer applicable.
557b444 s25client 24.08.2026 21:33 Flamefire Fix ambiguous clamp

C++17 introduced `std::clamp` which makes passing a type from std
namespace (such as chrono-types) ambiguous in the semi-recursive call.
Use constexpr-ifs and `std::clamp` in the final path.
88334c9 s25client 24.08.2026 21:33 Flamefire Fix missing space in CMake message
a8827b4 s25client 24.08.2026 20:11 ApexFlex Seed AI RNG deterministically on game start for reproducibility (#1956)
c112b2b s25client 17.08.2026 16:36 sunrise Return correct value for GetAvailableFiguresForTrading if not Job Helper
fdfd501 s25client 17.08.2026 16:35 sunrise Fix overflow
5609a52 s25client 17.08.2026 16:34 sunrise Add test for overflow when trading less figures as in the nearest store house
5ae47af s25client 13.08.2026 15:02 Michał Łabuda Merge branch 'master' into addon-presets
5aef739 s25client 12.08.2026 15:05 Flamefire Merge pull request #1961 from tost11/feature/fix-emergency-protocol

fixed emergency protocol by removing sheduled wares requested before ...
1fd8fe0 s25client 12.08.2026 13:13 Flamefire Merge branch 'master' into feature/fix-emergency-protocol
48b813d libutil 12.08.2026 01:33 Flamefire Modernize span.hpp
3fbfa86 s25client 11.08.2026 22:35 Flamefire Make `HQPlacement` test more reliable

Don't require ALL positions to be different.