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:
@@ -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."
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user