Changelog

Die letzten Änderungen an "Return to the Roots"
e4ec788 s25client 05.10.2026 02:59 Flamefire Merge pull request #1928 from DevOpsOfChaos/sidequest/single-soldier-coin-training

Add single-soldier coin training addon
508762a s25client 05.10.2026 01:36 Flamefire Update languages submodule
10a4059 languages 05.10.2026 01:11 sirRobeN Polish translation correction (#60)

Polish translation correction

1. Fixed constant for "A preset named '%1%' already exists. Do you want to overwrite it?", where a '%' sign was missing in the Polish translation.
2. Tweak: replaced "!" with "." to match the original English string for "Preset '%1%' was not found."
59327b2 s25client 04.10.2026 18:19 Flamefire Merge pull request #1957 from FlexApex/ai-battle-teams

ai-battle: support team assignment (--teams) and establish team start-pacts
f18ec7e s25client 04.10.2026 16:32 Flamefire Fix clang-tidy warning
694b44d s25client 04.10.2026 15:09 Flamefire Merge branch 'master' into ai-battle-teams
d272282 s25client 04.10.2026 15:03 Flamefire Merge pull request #1942 from DevOpsOfChaos/sidequest/configurable-mine-resource-behavior

Configurable mine resource behavior
0262145 s25client 04.10.2026 14:59 Flamefire Add missing overload to get addon by ID
9051f3d s25client 04.10.2026 14:57 Flamefire Convert CLI parsing of AI battle to use value-references consistently.

Move from explicit type-templates and `count` checks to a struct passing members by reference to Boost.ProgramOptions.
890b737 s25client 04.10.2026 14:11 Flamefire Extent tests
e5d4776 languages 02.10.2026 22:34 FloSoft Update synchronize-launchpad.yml

Fix verification output
cf4047d languages 02.10.2026 16:28 Flamefire Harden CI

Set `pipefail` so the import causes a CI failure on error.
Print the LaunchPad head as a sanity check the push worked.
935bfcb languages 02.10.2026 15:58 sirRobeN Updated Polish translations (#57)
9a2f330 languages 01.10.2026 19:45 Flamefire Revert wrong fuzzy translation updates

The new strings were filled with similar translations which are however different.
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