Changelog

Die letzten Änderungen an "Return to the Roots"
431bb13 s25client 01.10.2026 19:01 Flamefire Merge pull request #1929 from DevOpsOfChaos/sidequest/stranded-soldier-return-search

Add stranded soldier return-search addon
a224e91 s25client 01.10.2026 18:11 Flamefire Format source
ccc545b s25client 01.10.2026 18:10 Flamefire Merge branch 'master' into sidequest/stranded-soldier-return-search
be68dc6 s25client 01.10.2026 17:52 Flamefire Merge pull request #1924 from DevOpsOfChaos/sidequest/frontier-distance-static-blockers
9a0a240 s25client 01.10.2026 17:01 Flamefire Update translations
deb8d32 s25client 01.10.2026 16:58 FloSoft Merge pull request #1990 from Return-To-The-Roots/campaign

Fix invalid resource ID error in campaign selection for standard image paths
5eb7005 s25client 01.10.2026 16:56 FloSoft Merge pull request #1991 from Return-To-The-Roots/translation

Import new translations
f94cd05 s25client 01.10.2026 15:35 Flamefire Import new translations

Closes #1988
b5e089c languages 01.10.2026 15:32 Flamefire Update from sources
1f913a9 languages 01.10.2026 14:53 Flamefire LaunchPad translation import
7ab2361 s25client 01.10.2026 12:32 Flamefire Merge pull request #1980 from MichalLabuda/addon-presets-selection

Act on the selected addon preset, not a typed name
d5576d3 s25client 01.10.2026 11:59 Flamefire Fix invalid resource ID error in campaign selection for standard image paths

PR #1886 introduced support for relative image paths but the change in
the desktop class broke support for placeholder paths such as `<RTTR_GAME>/GFX/PICS/INSTALL.LBM`.

Revert the change breaking that.

Fixes #1989
5ca1516 s25client 29.09.2026 22:59 MichalLabuda Move addon preset layout and button logic into the base window

- Keep the layout constants in the source file and let the base window
compute its height from the room subclasses need
- Handle enabling Save/Load and Delete in the base window: Delete and
Load need a selected preset, Save needs a name
- Only picking a preset fills the name; editing it drops the selection,
while deselecting or rebuilding the list keeps the name
- Tests answer and close a specific message box and check pointers with
ensureNonNull; cover when saving is possible and that deleting from
the save window keeps the name
3a1fdce s25client 29.09.2026 17:53 Michał Łabuda Merge branch 'master' into addon-presets-selection
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.
16a5366 s25client 17.09.2026 07:13 MichalLabuda Create the addon presets folder at startup

The preset windows no longer create it or guard against it missing.
Rebuilding the preset list now keeps the entered name, so a failed save
or a delete leaves it in place to be retried. A failed save logs the
actual error and points the user at the log.
Both windows get their action button from the base class.
6990bb7 s25client 16.09.2026 18:52 MichalLabuda Restore deleting a preset from the save window
f8a302a s25client 16.09.2026 03:37 MichalLabuda Merge remote-tracking branch 'upstream/master' into addon-presets-selection
87422ef s25client 09.09.2026 20:02 MichalLabuda Create the addon presets folder in iwAddons

Avoids constructing a preset window just to have it close itself.
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
55062c1 s25client 09.09.2026 03:25 MichalLabuda Act on the selected addon preset, not a typed name

Load and Delete resolved their target from the name field,
so editing the name after picking a preset silently retargeted the
action.

Removed the Delete button from the Save preset window.
Removed the edit control from the Load preset window.
Load and Delete buttons stay disabled until a preset is picked.
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