Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
4.4 KiB
The 29 September RKS2 log review found 1,058 missing-faction map-marking exceptions, a helicopter deletion exception during mission reload, and an artillery order that waited 120 seconds without producing a projectile. This change addresses the two exception paths and the mortar loading acknowledgement gap.
ERR_EnemyMapMarking.c checks the target faction, target entity and spotting group's leader before calling native map marking. An incomplete target skips only the annotation; group perception continues, and valid targets still use native markers. It does not assign an invented faction or disable enemy detection. The log's call chain includes DONS, but does not establish DONS as the cause of the missing faction.
ERR_GameMode tolerates unavailable game/faction services in both faction lookups. Recon helicopter capture checks also tolerate missing ownership services. Aircraft deletion releases flight callbacks and seat holds without querying capture state or operating an engine during teardown. Ordinary live-aircraft release retains its existing capture protection and engine handling.
The native mortar shoot action calls a void loading API: its SUCCESS result does not prove that an animation started or a shell fired. The mission-owned shoot node now waits for its physical projectile counter before reporting success. A silently refused or interrupted load can retry the same shell held by the same AI, under the same order and fresh firing authorization, at one-second intervals, at most three requests. An uncommitted load that never finishes fails after 15 seconds. A committed transfer is never retried; its original projectile and airspace ownership remain intact. Changed order, gunner, shell, player takeover, unsafe aim, or unavailable ammunition cannot authorize a retry. Native player-operated and unrelated artillery remain outside this adapter.
The native mortar fixture deliberately refuses its first LoadShell call without moving ammunition. Its existing proof still requires eight physical projectiles, eight authorized commits, exactly eight missing original shells, natural activity completion, and no replay. It additionally requires recovery from that refused request. The synthetic refusal demonstrates this failure path; it does not establish which engine condition caused the particular live-server timeout.
tests/test_server_log_regressions.py executes the production marking, faction-lookup and deletion bodies with API boundaries substituted. tests/test_mortar_load_ack.py executes the production shoot adapter through refused/interrupted loads, deadlines, ownership changes, physical confirmation and native delegation. Neither substitute test is presented as multiplayer evidence.
The user's follow-up makes a manual restart plausible for the middle round's abrupt ending; no spontaneous freeze fix is claimed. Convoy placement remains bounded and requires clear separated formations. The physical causes of the three stranded vehicles remain unconfirmed. Moving-target aim changes, expired observations, settlement exclusions and friendly-fire exclusions still cancel artillery; a complete salvo is not promised for those conditions.
Native evidence:
- Map marking and HQ awareness: 94 assertions, including 1,100 factionless calls, a deleted-target call, a valid native marker, and the existing real radio/awareness checks.
- Mortar refused-load recovery: 59 assertions; eight physical shells after the deliberately refused first load, exact ammunition accounting, delivered report refreshes, natural completion, and no replay.
All three runs completed with no script/runtime failures and confirmed process cleanup. Their strict reports remain nonzero because each retains the same 13 pre-existing asset/property/localization engine errors; they are not certified clean releases or live multiplayer qualification. No AMP deployment has been performed.
- Helicopter takeover and deletion: 13 assertions; original crew boarded, takeover preserved the new faction and released flight without a replacement, and explicit native deletion scheduled one full replacement delay. No script/runtime failures.
- Final
python3 tools/check.py: all repository checks passed, including the new production-body regressions.git diff --checkalso passed.