Embed RHS 1.9 compatibility; record Workshop 0.0.141
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-11-05 16:39:35 +01:00
parent 9418b6950a
commit 9caed3f12d
325 changed files with 76722 additions and 25 deletions
@@ -0,0 +1,87 @@
// Shared player-facing copy; reads replicated mission state and never changes it.
class ERR_ObjectiveText
{
static string Title(ERR_Phase phase)
{
if (phase == ERR_Phase.PRISON) return "Escape the prison";
if (phase == ERR_Phase.RADIO_SEARCH) return "Locate the radio station";
if (phase == ERR_Phase.RADIO_DEFENCE) return "Hold while the escape route is prepared";
if (phase == ERR_Phase.EXTRACTION) return "Signal the rescue helicopters";
return "Escape the island";
}
static string Extraction(float radius)
{
return "The map marks the exact extraction pickup point. Throw a burning smoke grenade within 25 metres to call the rescue transport and armed escorts. Any smoke colour works. Clear the landing point, then board with every living prisoner, including wounded teammates. The AI crew will fly you to safety. Use the casualty-loading action beside the grounded, stationary transport to load unconscious survivors.";
}
static string RadioFeedbackMessage(ERR_RadioFeedback feedback)
{
if (feedback == ERR_RadioFeedback.WAITING)
return "Waiting for a conscious defender near the radio. Keep someone within 60 metres to start the transmission.";
if (feedback == ERR_RadioFeedback.TRANSMITTING)
return "Transmission in progress. Keep a conscious survivor within 60 metres of the radio. Leaving the area resets progress.";
if (feedback == ERR_RadioFeedback.INTERRUPTED)
return "Transmission interrupted. Progress has reset. Return a conscious survivor to within 60 metres of the radio to resume.";
return "Keep a conscious survivor within 60 metres of the radio until the transmission finishes. Leaving the area resets the defence timer.";
}
static string Description(ERR_GameMode mode, bool progress = true)
{
string description = PhaseDescription(mode, progress);
if (mode && mode.Active() && !mode.RecoveryStatus().IsEmpty()) description += "\n" + mode.RecoveryStatus();
return description;
}
protected static string PhaseDescription(ERR_GameMode mode, bool progress)
{
if (!mode) return "";
ERR_Phase phase = mode.Phase();
if (phase == ERR_Phase.PREPARING)
{
if (!mode.PreparationError().IsEmpty()) return "Reason: " + mode.PreparationError() + "\n\nAn administrator must correct the problem and restart the scenario before players can spawn.";
return "Preparing mission sites and equipment. You will spawn when the mission is ready.";
}
if (phase == ERR_Phase.PRISON)
return "Search the supply backpack inside the prison for weapons and a field map. Pick the gate lock, then get clear of the guards.";
if (phase == ERR_Phase.RADIO_SEARCH)
{
array<ERR_LocationComponent> locations = {};
mode.Locations(locations);
bool roughRadio;
foreach (ERR_LocationComponent location : locations)
{
if (!location || location.Kind() != ERR_LocationKind.RADIO) continue;
if (location.Knowledge() == 2)
return "The radio station is identified on your map. Reach its radio and complete the 'Contact extraction HQ' action to start the transmission.";
if (location.Knowledge() == 1) roughRadio = true;
}
// The frozen radio-intel gate is server-owned; conditional guidance remains
// correct on clients, with the gate disabled and on sparse terrains.
string intelRequirement = "Keep any radio document that cannot yet be deciphered. If radio intel is locked, fully identify more distinct non-radio sites; the starting clue markers do not count. Kept radio documents are read automatically when the requirement is met. ";
// Scan all sites before acknowledging rough intel: an identified radio wins.
if (roughRadio)
return "Intel recovered: a question mark shows an approximate location, but its type is still unknown. Take a different intelligence folder into your inventory to pinpoint the radio; a folder already recovered cannot provide another clue. Try the other marked clue site if needed. A close approach with a clear view can also identify the station. " + intelRequirement;
string startHint;
if (mode.StartMode() == 1) startHint = "Search the salvage backpack at the crash site for weapons and a field map. ";
return startHint + "Choose either marked clue site and take its intelligence folders into your own inventory. " + intelRequirement + "After radio intel unlocks, a different folder can refine a rough location. Use the other clue site if folders are lost. Even if every folder is lost, a close approach with a clear view can identify the station itself. Nearby medical and guard sites can also be discovered by approaching with a clear view.";
}
if (phase == ERR_Phase.RADIO_DEFENCE)
{
if (!progress) return RadioFeedbackMessage(mode.RadioFeedback());
int seconds = mode.DefenceSecondsRemaining();
if (!mode.DefenceOccupied())
{
if (mode.RadioFeedback() == ERR_RadioFeedback.WAITING)
return string.Format("Waiting for a conscious defender near the radio. Keep someone within 60 metres for %1 seconds to finish the transmission. Leaving resets progress.", seconds);
return string.Format("Transmission interrupted. Keep a conscious survivor within 60 metres of the radio for %1 seconds. Leaving resets progress.", seconds);
}
int displayed = Math.Ceil(seconds / 5.0) * 5;
return string.Format("Transmission in progress: up to %1 seconds remaining. Keep a conscious survivor within 60 metres of the radio. Leaving resets progress.", displayed);
}
if (phase == ERR_Phase.EXTRACTION)
{
if (mode.PickupStage() == 2 || mode.PickupStage() == 3) return "Smoke accepted. Armed rescue helicopters are approaching. Keep the marked landing point clear and gather everyone nearby.";
if (mode.PickupStage() == 4) return "Board the rescue transport. It waits for all living prisoners, including unconscious or disconnected survivors. Escorts cover the landing zone. After everyone is aboard for eight seconds, the pilot takes off.";
if (mode.PickupStage() == 5) return "Stay aboard. Escape completes after all rescue transports have remained airborne for 30 continuous seconds.";
return Extraction(mode.EscapeRadius());
}
return "";
}
}
@@ -0,0 +1,14 @@
{
"files": {
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveText.c": {
"before_sha256": "0d1e84c7e20cfd60876330221929e33f920df31d8907413d5e2f6c04fb0a6026",
"after_sha256": "d2fd3670c89d679fcb1359ebccf67b58734fe5168e31fc239bdeffa7f8ff0607"
},
"docs/player-route.md": {
"before_sha256": "2127ccac1b28d6669f24f71a4705a8fcc54d5905415181ec63dd1c32b257b910",
"after_sha256": "979d47b33b085a87bd589b327f772dff5bd84ffe743e2e4643f62d2718741e80"
}
},
"index_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"head": "9418b6950a12610361d96a99d058e9e10de03713"
}
@@ -0,0 +1,17 @@
{
"ERR_ObjectiveText.c": "d2fd3670c89d679fcb1359ebccf67b58734fe5168e31fc239bdeffa7f8ff0607",
"application.json": "a2d1f298135c3506a5798a2833ee17c09be3592ca463190d0be4e5e91ab18553",
"finding.json": "98e6a2c7882dbd6432bc680587c122e28c881dbd2eea0b3473ca2c239326592d",
"fix.patch": "08522e89d88a3e6bbe6bef705b58710199bc03137db0859ec4a8fe674705c4d3",
"objective-copy-review.json": "2973887224cc0d03f55575a6327e80369c00966eb3b8de9270d2e8cdaf014f13",
"player-route-change.json": "ed16e69fe145db30d5749fd88336bccacc9396f72ee45fa4d5a79d43943cbc98",
"player-route.md": "979d47b33b085a87bd589b327f772dff5bd84ffe743e2e4643f62d2718741e80",
"preservation.json": "0cdbdf8901e32765be9214cae3fb92c4507636e0d02fe88ebcc4250dd1cb6acd",
"report.json": "4e1554ce63028b10b48946867659a44fe61f442757a901620b10730a7d7f1792",
"source-manifest.json": "a3fc868b87484b8f7bca213a42741474a55f41e7b64dbbd6d7f729b85463ab9b",
"test_radio_intel.py.log": "0ba63f93a6077518aa4ebbc31b1571a085125577980f28d6eedb6970b2d41697",
"test_radio_waiting_text.py.log": "b8ad2d5ff62ab9bf44bef345f6f7ac36b52eee1ffed656ed6067f4b996066b21",
"test_rescue_boarding.py.log": "80260a91526cec22b9607d05d7768e6e7c0b35818ab90d1a742db3e3f2d554f9",
"test_rough_intel_feedback.py.log": "3496e5f3a9644b630a6e1de0b6cca5dd9b5b86718369e206fa672d999df2bd7c",
"validation.json": "f738658bac57afd366bd742c81a32761c8c52c1a41d1def6d9bbfb6e9bf71a91"
}
@@ -0,0 +1,7 @@
{
"issue": "Persistent radio search objective promised station discovery from another fixed clue folder despite default distinct non-radio discovery threshold; stage5 retained an obsolete escape-boundary description.",
"change": "Conditional persistent advice to retain locked documents and identify distinct non-radio sites, excluding starting clue markers; automatic reread and direct visual fallback remain. Stage5 states all rescue transports must stay airborne for 30 continuous seconds.",
"synchronization": "No gate count/settings reads, replication, gameplay timing or inventory behavior changes. Conditional wording supports disabled gate and sparse terrain clamping.",
"validation": "Three unchanged focused tests passed. No new test assertions or registration. No native engine, physical flight or UI rendering proof.",
"preservation": "Live ObjectiveText baseline unchanged at proposal seal; unrelated current edits not touched."
}
@@ -0,0 +1,29 @@
--- a/addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveText.c
+++ b/addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveText.c
@@ -52,12 +52,15 @@
return "The radio station is identified on your map. Reach its radio and complete the 'Contact extraction HQ' action to start the transmission.";
if (location.Knowledge() == 1) roughRadio = true;
}
+ // The frozen radio-intel gate is server-owned; conditional guidance remains
+ // correct on clients, with the gate disabled and on sparse terrains.
+ string intelRequirement = "Keep any radio document that cannot yet be deciphered. If radio intel is locked, fully identify more distinct non-radio sites; the starting clue markers do not count. Kept radio documents are read automatically when the requirement is met. ";
// Scan all sites before acknowledging rough intel: an identified radio wins.
if (roughRadio)
- return "Intel recovered: a question mark shows an approximate location, but its type is still unknown. Take a different intelligence folder into your inventory to pinpoint the radio; a folder already recovered cannot provide another clue. Try the other marked clue site if needed. A close approach with a clear view can also identify the station.";
+ return "Intel recovered: a question mark shows an approximate location, but its type is still unknown. Take a different intelligence folder into your inventory to pinpoint the radio; a folder already recovered cannot provide another clue. Try the other marked clue site if needed. A close approach with a clear view can also identify the station. " + intelRequirement;
string startHint;
if (mode.StartMode() == 1) startHint = "Search the salvage backpack at the crash site for weapons and a field map. ";
- return startHint + "Choose either marked clue site. Take its intelligence folders into your own inventory to reveal the station on your map. If the location is not yet identified, take another folder. Each marked site has enough folders; use the other if one is lost. If every folder is lost, a close approach with a clear view can identify the station itself. Nearby medical and guard sites can also be discovered by approaching with a clear view.";
+ return startHint + "Choose either marked clue site and take its intelligence folders into your own inventory. " + intelRequirement + "After radio intel unlocks, a different folder can refine a rough location. Use the other clue site if folders are lost. Even if every folder is lost, a close approach with a clear view can identify the station itself. Nearby medical and guard sites can also be discovered by approaching with a clear view.";
}
if (phase == ERR_Phase.RADIO_DEFENCE)
{
@@ -76,7 +79,7 @@
{
if (mode.PickupStage() == 2 || mode.PickupStage() == 3) return "Smoke accepted. Armed rescue helicopters are approaching. Keep the marked landing point clear and gather everyone nearby.";
if (mode.PickupStage() == 4) return "Board the rescue transport. It waits for all living prisoners, including unconscious or disconnected survivors. Escorts cover the landing zone. After everyone is aboard for eight seconds, the pilot takes off.";
- if (mode.PickupStage() == 5) return "Stay aboard. The rescue pilot and escorts are taking you beyond the escape boundary to safety.";
+ if (mode.PickupStage() == 5) return "Stay aboard. Escape completes after all rescue transports have remained airborne for 30 continuous seconds.";
return Extraction(mode.EscapeRadius());
}
return "";
@@ -0,0 +1,22 @@
{
"approved": true,
"scope": "Source copy and documentation only; no test-file changes approved for application.",
"files": {
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveText.c": {
"before_sha256": "0d1e84c7e20cfd60876330221929e33f920df31d8907413d5e2f6c04fb0a6026",
"after_sha256": "d2fd3670c89d679fcb1359ebccf67b58734fe5168e31fc239bdeffa7f8ff0607"
},
"docs/player-route.md": {
"before_sha256": "2127ccac1b28d6669f24f71a4705a8fcc54d5905415181ec63dd1c32b257b910",
"after_sha256": "979d47b33b085a87bd589b327f772dff5bd84ffe743e2e4643f62d2718741e80"
}
},
"findings": [
"Conditional objective instructions match frozen server-side radio-intel gate; no unreplicated counter is consulted or guessed. Distinct fully identified eligible sites count, automatically revealed clue sites do not.",
"Targeted radio folders remain unspent while blocked and are retried from participant inventory. Retain and automatic-read instruction is supported.",
"Known radio still takes priority over rough/unknown guidance; crash salvage hint preserved.",
"Stage5 text matches conjunction over all rescue transports AirborneAfterPickup and continuous30000ms interval reset.",
"Player-route change confined to step2, matching Settings default5 and placing existing15-percent reveal statement after gate."
],
"validation_limits": "Read-only independent source/doc review. No tests or native runs by reviewer. Scratch added text assertions are diagnostic only and excluded from applied scope; no new regression or runtime qualification claimed."
}
@@ -0,0 +1,5 @@
{
"path": "docs/player-route.md",
"before_sha256": "2127ccac1b28d6669f24f71a4705a8fcc54d5905415181ec63dd1c32b257b910",
"after_sha256": "979d47b33b085a87bd589b327f772dff5bd84ffe743e2e4643f62d2718741e80"
}
@@ -0,0 +1,24 @@
# Player route playtest guide
This describes the intended current Everon route from source. **It is a playtest guide, not an executed manual run.** Use normal player input and an isolated test profile with the single **Co10 Escape Reintroduced** addon and its required RHS: Status Quo, WCS Armaments, WCS BMP-1 and Parachute Framework, with their supporting addons. Choose **Missions/ERR_Everon.conf** (`{C1E20667DCE324ED}`); it includes the mission and companion modules and does not require original Escapists. See [single-mod setup](single-mod.md) and [external dependencies](external-addons.md). Record build/settings and any failed interaction using the [runtime checklist](runtime-testing.md).
1. **Leave prison.** Wait for mission preparation and your prisoner spawn. Search the Kolobok **backpack inside the prison** for the shared finite stock: five PM pistols, eight pistol magazines and one field map. Prisoners begin with basic medical supplies, not an issued rifle. At the gate, select **“Pick prison lock”** and hold your interaction control for four seconds, then walk out. If the selected prompt is disabled **“Open”**, switch actions at the handle until **“Pick prison lock”** is selected. Confirm the objective changes to locating the radio. A destroyed gate also has an observed physical-escape path; simply losing the gate must not immediately advance the mission.
2. **Recover physical clues.** After escape, the map identifies the **Southern supply cache** and **Field hospital 1**. Each holds two objective folders targeting the radio. The southern cache also has weapons, ammunition, a replacement map, one emergency repair kit (20 finite supplies) and two fuel cans (five litres each); the hospital has medical supplies. For vehicle maintenance, carry and equip the item, park the vehicle, then use the native repair action at an eligible damaged part or the refuel action at its fuel cap. Supplies are finite and do not respawn. Transfer folders into your own inventory; looking inside a container alone is insufficient. By default, radio documents become usable after your team fully identifies five distinct non-radio sites; the server can change or disable this requirement. The automatically revealed starting clue sites do not count. If a radio folder reveals nothing yet, keep it in your inventory and identify other camps or hospitals through exploration or their own intel. Retained radio documents are read automatically once the requirement is met. After that, the first folder may identify the radio immediately (15% with fresh default settings), otherwise it reveals a rough search area. In that case, take a different folder to pinpoint the station. The shared objective acknowledges the rough clue with **“Intel recovered”**, and the map shows a question mark at the centre of a 500 m grid cell. An already identified radio takes precedence over rough clues from other sites. Dropping or handing around a recovered folder cannot grant another clue. If one source is lost, try the other. Other surviving field hospitals also carry radio documents, but are not marked automatically. If all documents are lost, approaching within eight metres with a clear view can identify the station itself.
3. **Read the map and objective.** Use your bound map control with the carried map. Rough discovery shows an approximate search area; identification gives the station's position. Confirm the label and task text update. The backpack **OCRAM OLOP Autoatlas** stays in your hands. Its cover, terrain name, overview grid and numbered overlapping sheets are generated from the active terrain, with no player marker or automatic centering. Enter or right opens the index from the cover and the first sheet from the index; on detail sheets, arrows move west/east/north/south. Type a page number on the numpad and press either Enter key to jump directly; 0 + Enter returns to the index, and left from the index returns to the cover. Quickly press the bound map key twice (M by default) to open the interactive map; a single press puts the held paper away. Larger terrains have more sheets at the same readable scale, coarsened only if needed to keep the atlas at most 400 detail sheets. Discovered mission markers and mine warnings also appear on the atlas island index, regional pages and relevant detail sheets, using the same labels and approximate or exact positions as the interactive map. The cover has no markers. An ordinary stolen map opens the usual full-screen view; equip the desired item if carrying both. Shared-map visibility to other real players still needs multiplayer testing. The prison, radio, hospitals and field camps use generated positions, so follow this round's discoveries rather than coordinates from a previous run. Other field camps and hospitals may be omitted when no safe placement is found; omitted sites have no marker or intel target. Field hospital 1 is required as the second initially marked clue source: if it cannot be placed, preparation fails instead of admitting players to an incomplete route. **The western cache and its vehicle belong to historical test fixtures and are absent from the normal mission.** The Southern cache now attempts one locked UAZ. If safe placement or vehicle preparation fails, it is omitted and the walking route remains available. If present, approach its driver-door lock and hold **“Force vehicle lock”** for four seconds before boarding. One native startup confirms Southern parking and the locked state; ordinary driving and remote lock interactions still need playtesting. An eight-second horn alarm is now implemented; audible output and remote behavior still need playtesting.
4. **Call for extraction.** Once identified, approach the physical radio and complete **“Contact extraction HQ”** (eight seconds). The interaction is close-range; standing elsewhere inside the defence area does not start it. Confirm the objective changes to defending the transmission.
5. **Keep a defender present.** Maintain at least one living, conscious prisoner strictly inside 60 metres of the radio for the configured duration—180 seconds by default. Players can hand over defence while coverage remains continuous. If everyone leaves, becomes unconscious/dies, or disconnects, progress resets. Check the task's interruption message and remaining time; returning resumes a fresh interval.
6. **Signal the pickup.** Keep your smoke grenades ready. When preparations finish, the map marks the exact pickup point. Gather your team nearby and throw a smoke grenade within 25 metres of it. Wait for the smoke-confirmation announcement and keep the landing point clear. One armed transport and two armed escorts approach.
7. **Board together.** The AI transport lands and waits for every living prisoner. For unconscious survivors, use **“Load casualty into extraction helicopter”** beside the grounded, stationary transport. Reserved disconnected bodies also count as survivors. Once everyone has remained aboard for eight seconds, the pilot takes off and escorts cover the flight to safety. Statistics open after all rescue transports have been airborne for 30 continuous seconds. Stay aboard until extraction resolves; no player pilot is required. Losing the assigned transport causes defeat.
Enemy engineer documents can also reveal a historical **500 m mine warning**. Treat the marked area as potentially dangerous: the warning does not track individual mines or confirm clearance. This new interaction still needs ordinary and multiplayer playtesting.
Administrators can open the integrated settings dialog with **`/esc menu`** and inspect values with **`/esc settings`**. Commands require the game's administrator permission. The quoted defaults assume a fresh test profile; saved settings in the `mission` section of `$profile:Escapists.json` can override them. Check the active radio duration before testing. No separate Chat addon is needed.
Action prompts now explain the locked gate, radio identification requirement, current transmission phase and conscious-player requirement. These messages describe the existing availability checks; the server still revalidates each action when performed. Confirm their visibility and clearing during a real playtest; native UI presentation has not yet been checked.
Record inventory transfers, map/task updates, interrupted defence, medical/casualty interactions, manual signalling, AI landing/boarding and results and restart. A completed local route still does not establish remote reconnects, twelve-player behavior or improved FPS. The smoke-signalled rescue fixture is separate from the historical vertical-flight test. [Current status](current-status.md) distinguishes those acceptance gaps from source-bound native evidence.
Source references: [objective text](../addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveText.c), [normal site stock](../addons/core/Configs/ERR/EveronSites.conf), [generated-site placement and skipping](../addons/core/Scripts/Game/ERR/00_Core/ERR_GeneratedSites.c), [required clue-source validation](../addons/core/Scripts/Game/ERR/00_Core/ERR_SiteDefinition.c), [document recovery](../addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryService.c), [radio rules](../addons/core/Scripts/Game/ERR/00_Core/ERR_RadioDefenceService.c), [casualty loading](../addons/core/Scripts/Game/ERR/00_Core/ERR_CasualtyLoadingService.c) and [extraction](../addons/core/Scripts/Game/ERR/00_Core/ERR_ExtractionService.c).
The rough-clue acknowledgement is source-policy tested for unknown, rough and exact radio states and multiple-site ordering. Its ordinary native task/hint presentation remains pending; it uses the existing shared objective text and adds no separate notification or inventory effect. Discovery markers use the native map system; the integrated field-map surface is additional presentation. No separate Map addon is required.
@@ -0,0 +1,14 @@
{
"head": "9418b6950a12610361d96a99d058e9e10de03713",
"prior_hq_fix": {
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c": "9bd25f9fc7e574c515c7131e8b52eb357e295822e1ce2f401e6e86cfd6ce062f",
"tests/test_hq_ammo_dispatch.py": "89858dcb20dc8da6856140223bbff38bf0cef2b62f081ed70b9d239c53197abb",
"tests/test_hq_delivered_task.py": "9fd05d454b07f15a90d01761684f7019c650d63587d9fe54e5cc131ee236b445"
},
"current_status_sha256": "bc690d6b0a578ab7d753c51e0e89ec9b3ef37837c7773df89b6128f543a6f645",
"native_preflight": {
"matching_engine_processes": 0,
"established_private_prefix_exists": false,
"launched": false
}
}
@@ -0,0 +1,16 @@
{
"scope": "Persistent objective copy and player-route guidance; no progression behavior or test files changed",
"existing_checks_passed": 4,
"tested_inputs_unchanged": true,
"native_run": false,
"native_preflight": "Established /tmp/erri-headless-compat prefix was absent; no environment rebuilt or engine launched for wording change.",
"installed_or_published": false,
"prior_hq_fix_preserved": {
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c": "9bd25f9fc7e574c515c7131e8b52eb357e295822e1ce2f401e6e86cfd6ce062f",
"tests/test_hq_ammo_dispatch.py": "89858dcb20dc8da6856140223bbff38bf0cef2b62f081ed70b9d239c53197abb",
"tests/test_hq_delivered_task.py": "9fd05d454b07f15a90d01761684f7019c650d63587d9fe54e5cc131ee236b445"
},
"documentation_before_sha256": "bc690d6b0a578ab7d753c51e0e89ec9b3ef37837c7773df89b6128f543a6f645",
"documentation_after_sha256": "266868531a875a50504eff7d8bc24549969c0d13b66acd8bb1cbe74cd7a3df90",
"review_sha256": "2973887224cc0d03f55575a6327e80369c00966eb3b8de9270d2e8cdaf014f13"
}
@@ -0,0 +1,36 @@
{
"files": {
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveText.c": {
"before_sha256": "0d1e84c7e20cfd60876330221929e33f920df31d8907413d5e2f6c04fb0a6026",
"after_sha256": "d2fd3670c89d679fcb1359ebccf67b58734fe5168e31fc239bdeffa7f8ff0607"
}
},
"patch_sha256": "08522e89d88a3e6bbe6bef705b58710199bc03137db0859ec4a8fe674705c4d3",
"tests": [
{
"path": "tests/test_rough_intel_feedback.py",
"sha256": "5a36b2b00ac205a65ef625f2f9f01cdc760030568049b8adc66c01317ae4f7bc",
"exit_code": 0,
"log": "test_rough_intel_feedback.py.log",
"log_sha256": "3496e5f3a9644b630a6e1de0b6cca5dd9b5b86718369e206fa672d999df2bd7c",
"source_override": true
},
{
"path": "tests/test_radio_waiting_text.py",
"sha256": "7f4b4ce57075322d1e5f337c31b0a3fe2edd7b07f22f502c0cdfd3e963140f4e",
"exit_code": 0,
"log": "test_radio_waiting_text.py.log",
"log_sha256": "b8ad2d5ff62ab9bf44bef345f6f7ac36b52eee1ffed656ed6067f4b996066b21",
"source_override": true
},
{
"path": "tests/test_rescue_boarding.py",
"sha256": "f00e60ba24f55fee371a5837af9422a83cdc4c9822c1b16a36ab43b0bad22c4b",
"exit_code": 0,
"log": "test_rescue_boarding.py.log",
"log_sha256": "80260a91526cec22b9607d05d7768e6e7c0b35818ab90d1a742db3e3f2d554f9",
"source_override": false
}
],
"scope": "One production text file only. Existing tests unmodified; no native validation."
}
@@ -0,0 +1 @@
PASS: radio intel boundary, exclusions, preparation cap, next-round configuration, sticky unlock, redirection/evidence, fixed retention, automatic recovery and lifecycle guards
@@ -0,0 +1 @@
PASS: actual initial WAITING task/guide copy, configured duration, unchanged interruption and rounded progress; native task assertion pending
@@ -0,0 +1,2 @@
PASS: all survivors required, continuous eight-second boarding hold, reset on exit and clock rollback
PASS: thirty continuous airborne seconds, grounded reset and clock rollback
@@ -0,0 +1 @@
PASS: actual rough-intel objective selection, exact precedence, source grid dimensions and unchanged other-phase dispatch; native UI pending
@@ -0,0 +1,32 @@
{
"tests": [
{
"test": "test_rough_intel_feedback.py",
"exit_code": 0
},
{
"test": "test_radio_waiting_text.py",
"exit_code": 0
},
{
"test": "test_radio_intel.py",
"exit_code": 0
},
{
"test": "test_rescue_boarding.py",
"exit_code": 0
}
],
"inputs": {
"tests/test_rough_intel_feedback.py": "5a36b2b00ac205a65ef625f2f9f01cdc760030568049b8adc66c01317ae4f7bc",
"tests/test_radio_waiting_text.py": "7f4b4ce57075322d1e5f337c31b0a3fe2edd7b07f22f502c0cdfd3e963140f4e",
"tests/test_radio_intel.py": "e3cd012a7c3475c58e44f3940fc7b4798aed03e67e0b44b7df365705695b7012",
"tests/test_rescue_boarding.py": "f00e60ba24f55fee371a5837af9422a83cdc4c9822c1b16a36ab43b0bad22c4b",
"tests/policy_harness.py": "e861c30037b3e456f0c8ef1c02e9fe1417b601ffb15d2037974715008865e4be",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveText.c": "d2fd3670c89d679fcb1359ebccf67b58734fe5168e31fc239bdeffa7f8ff0607",
"addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryService.c": "552d9e40f72a135f19d25a17fbecf475b8bba8d8b62ec6b6d055c65499a0b637",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ExtractionService.c": "c48e79a117990f83839704ae221af05fc7995b956af2d4b4f9ed2a6b91ec335a"
},
"inputs_unchanged": true,
"native_run": false
}