Integrate radio-delivered convoy cover and conservative squad ammunition reports

This commit is contained in:
2026-09-20 04:23:11 +02:00
parent 9b6596eb3e
commit 9205e2129a
88 changed files with 13934 additions and 28 deletions
+40
View File
@@ -66,3 +66,43 @@ int main(){
}
''')
print('PASS: actual native fixture lookup selects exact BODY kind/identity/message from bounded evaluations, never sighting-only Get')
# Native ammo proof extends the already-real status delivery; it never changes gear or sender payloads.
for forbidden in ('SetAmmoCount(', 'ClearChamber(', 'TryMoveItem', 'TryDelete', 'TrySpawn'):
assert forbidden not in p.read_text(),forbidden
native_ammo=body(p,'protected bool NativeAmmo(')
for evidence in ('InitialMember(slot)', 'ERR_Actors.Alive(actor)', 'ERR_Actors.Group(actor) != unit.Group',
'CanAttribute(slot, actor)', 'ERR_HQAmmoSampler.Inspect(actor, unit.Group, inspected)',
'manager.GetWeaponsList(weapons)', 'loaded.GetAmmoCount()',
'loadedIdentities.Contains(loaded.GetOwner())', 'queued.SmallArmsRounds >= nativeLoadedRounds',
'SameAmmo(queued, inspected)', 'nativeLoadedRounds > 0'):
assert evidence in native_ammo,evidence
assert 'PendingStatus =' not in native_ammo and 'AmmoState =' not in native_ammo
for frozen in ('m_AmmoAtQueue = m_Status.AmmoState.Snapshot()',
'status.AmmoState != m_Status.AmmoState', 'status.AmmoState != m_AmmoAtQueue',
'SameAmmo(status.AmmoState, m_AmmoAtQueue)', 'SameAmmo(stable.AmmoState, m_AmmoAtQueue)'):
assert frozen in p.read_text(),frozen
compare=body(p,'protected bool SameAmmo(').replace('protected ', '').replace('ERR_HQAmmoSnapshot ', 'ERR_HQAmmoSnapshot* ')
compare=compare.replace('a.', 'a->').replace('b.', 'b->')
run(r'''
#include <cassert>
struct ERR_HQAmmoSnapshot{
bool Complete=true,LauncherComplete=false;
int Members=5,SmallArmsMuzzles=5,SmallArmsRounds=150,SmallArmsMagazines=10,SmallArmsChambers=5;
int LauncherRounds=2,LauncherMagazines=2,LauncherChambers=0;
};
struct Probe{
'''+compare+r'''
};
int main(){
Probe probe;ERR_HQAmmoSnapshot a,b;
assert(probe.SameAmmo(&a,&b)&&!probe.SameAmmo(nullptr,&b)&&!probe.SameAmmo(&a,nullptr));
int* fields[]={&b.Members,&b.SmallArmsMuzzles,&b.SmallArmsRounds,&b.SmallArmsMagazines,&b.SmallArmsChambers,
&b.LauncherRounds,&b.LauncherMagazines,&b.LauncherChambers};
for(auto* field:fields){(*field)++;assert(!probe.SameAmmo(&a,&b));(*field)--;}
b.Complete=false;assert(!probe.SameAmmo(&a,&b));b.Complete=true;
b.LauncherComplete=true;assert(!probe.SameAmmo(&a,&b));b.LauncherComplete=false;
assert(probe.SameAmmo(&a,&b));
}
''')
print('PASS: actual ammo snapshot comparison checks every scalar/category flag; native probe requires real roster rescan, loaded-round lower bound and separate immutable pending/Watch objects')