Capture current mission, AI, map and administration development

Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
This commit is contained in:
2026-10-13 22:52:53 +02:00
parent a951a96edc
commit 6a667d8deb
8104 changed files with 2124945 additions and 2061 deletions
@@ -0,0 +1,64 @@
class ERR_TestRadioDelivery : ScriptedRadioMessage
{
BaseTransceiver Expected;
int Count;
float Quality;
override void OnDelivery(BaseTransceiver receiver, int freq, float quality)
{
if (receiver != Expected) return;
Count++; Quality = quality;
}
}
modded class ArmaReforgerScripted
{
protected float m_RadioProbeTime;
protected int m_RadioProbePhase;
protected BaseRadioComponent m_RadioProbeTX;
protected BaseRadioComponent m_RadioProbeRX;
protected ref ERR_TestRadioDelivery m_RadioProbeMessage;
protected bool m_RadioProbeFailed;
protected IEntity ProbeRadio(vector position)
{
EntitySpawnParams spawn = new EntitySpawnParams(); spawn.TransformMode = ETransformMode.WORLD;
spawn.Transform[3] = position;
return SpawnEntityPrefab(Resource.Load(ERR_EnemyRadio.BASIC), GetWorld(), spawn);
}
override void OnUpdate(BaseWorld world, float timeslice)
{
super.OnUpdate(world, timeslice);
if (m_RadioProbePhase > 11) return;
m_RadioProbeTime += timeslice;
if (m_RadioProbeTime < 2) return;
m_RadioProbeTime = 0;
if (m_RadioProbePhase == 0)
{
IEntity first = ProbeRadio("4000 50 4000"), second = ProbeRadio("4005 50 4000");
if (!first || !second) { Print("ERR RADIO PROBE FAILED: prefab"); m_RadioProbePhase = 99; return; }
m_RadioProbeTX = BaseRadioComponent.Cast(first.FindComponent(BaseRadioComponent));
m_RadioProbeRX = BaseRadioComponent.Cast(second.FindComponent(BaseRadioComponent));
m_RadioProbeTX.SetPower(true); m_RadioProbeRX.SetPower(true);
m_RadioProbeTX.SetEncryptionKey("probe"); m_RadioProbeRX.SetEncryptionKey("probe");
m_RadioProbeTX.GetTransceiver(0).SetFrequency(38000); m_RadioProbeRX.GetTransceiver(0).SetFrequency(38000);
m_RadioProbeTX.GetTransceiver(0).SetRange(1000); m_RadioProbeRX.GetTransceiver(0).SetMuteState(false);
}
else if (m_RadioProbePhase % 2 == 1)
{
m_RadioProbeMessage = new ERR_TestRadioDelivery(); m_RadioProbeMessage.Expected = m_RadioProbeRX.GetTransceiver(0);
m_RadioProbeMessage.SetEncryptionKey("probe");
m_RadioProbeTX.GetTransceiver(0).BeginTransmission(m_RadioProbeMessage);
}
else
{
bool shouldReceive = m_RadioProbePhase == 2;
bool received = m_RadioProbeMessage.Count > 0 && m_RadioProbeMessage.Quality > 0;
if (received != shouldReceive) m_RadioProbeFailed = true;
PrintFormat("ERR RADIO PROBE: phase=%1 count=%2 quality=%3 expected=%4", m_RadioProbePhase, m_RadioProbeMessage.Count, m_RadioProbeMessage.Quality, shouldReceive);
if (m_RadioProbePhase == 2) m_RadioProbeRX.GetTransceiver(0).SetFrequency(38200);
if (m_RadioProbePhase == 4) { m_RadioProbeRX.GetTransceiver(0).SetFrequency(38000); m_RadioProbeRX.SetEncryptionKey("wrong"); }
if (m_RadioProbePhase == 6) { m_RadioProbeRX.SetEncryptionKey("probe"); m_RadioProbeRX.SetPower(false); }
if (m_RadioProbePhase == 8) { m_RadioProbeRX.SetPower(true); m_RadioProbeTX.GetTransceiver(0).SetRange(1); }
if (m_RadioProbePhase == 10) PrintFormat("ERR TERRAIN LOOKUP COMPLETE: radio_probe_pass=%1", !m_RadioProbeFailed);
}
m_RadioProbePhase++;
}
}
@@ -0,0 +1,46 @@
{
"date": "2026-10-05",
"status": "Implemented locally; not published or deployed to the live server",
"source_sha256": {
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQSpeech.c": "a2152cd629c891fd9695be3d9ced81be4e789a427d79b3e21db32efc6dd18c35",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c": "84889054519126679148da19b5bc7963e5c8938f12437a93ec7c7355ceab7905",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpeechService.c": "b78bac5f8be0144a5f62db5ee49eddf584b79137753d8140577294f28a7dd77c",
"tests/test_hq_speech.py": "994694371c1458a373af3bd4ceba821e96ca206e334c0a4334c066faa7494e5c",
"tests/test_speech_service.py": "767b777051d73a232e8f3241adadff84807ee49986b98d76aaf6bbe8927edd5c"
},
"native_test": {
"runtime": "Reforger dedicated 1.8.0.13, isolated network, noBackend, noSound, private profile, Nogova",
"script_errors": [],
"radio_cases": [
"matching frequency/encryption and power: received",
"wrong frequency: blocked",
"wrong encryption: blocked",
"receiver powered off: blocked",
"beyond transmitter range: blocked"
],
"log": [
"03:14:51.579 SCRIPT : ERR RADIO PROBE: phase=2 count=1 quality=0.999975 expected=1",
"03:14:55.646 SCRIPT : ERR RADIO PROBE: phase=4 count=0 quality=0 expected=0",
"03:14:59.712 SCRIPT : ERR RADIO PROBE: phase=6 count=0 quality=0 expected=0",
"03:15:03.779 SCRIPT : ERR RADIO PROBE: phase=8 count=0 quality=0 expected=0",
"03:15:07.778 SCRIPT : ERR RADIO PROBE: phase=10 count=0 quality=0 expected=0",
"03:15:07.778 SCRIPT : ERR TERRAIN LOOKUP COMPLETE: radio_probe_pass=1"
],
"temporary_fixture_correction": "OnDelivery override argument renamed frequency to freq before successful native tests"
},
"passing_tests": [
"test_hq_speech.py",
"test_speech_service.py",
"test_speech_menu.py",
"test_hq_local_awareness.py",
"test_hq_radio_node.py",
"test_hq_local_handoff_intake.py"
],
"limitations": [
"Live multiplayer TTS download and audible playback on a carried stolen radio have not been verified.",
"Downloaded WAV plays at the eligible receiver; no native VoN injection, radio distortion, or spatial mouth audio.",
"Stock soldier callouts remain unchanged.",
"Carried radios only; vehicle-only receivers are excluded.",
"Native radio probe tests routing directly; eligibility uses production methods with mock inventory in the C++ policy test."
]
}