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
+14
View File
@@ -11,6 +11,7 @@ class ERR_HQStatusReport
int Fit;
int ConfirmedLosses;
ref array<int> DeathSlots = {};
ref ERR_HQAmmoSnapshot AmmoState;
float ObservedAt = -1;
}
@@ -23,6 +24,7 @@ class ERR_HQWatchRules
if (!ERR_HQPursuitRules.PositionValid(report.Position) || !ERR_HQPursuitRules.Finite(report.ObservedAt)
|| !ERR_HQPursuitRules.Finite(now) || report.ObservedAt < 0 || now < report.ObservedAt
|| now - report.ObservedAt > 120000) return false;
if (report.AmmoState && !report.AmmoState.Valid(report.Count)) return false;
return report.Strength > 0 && report.Strength <= 32 && report.Count >= 0
&& report.Count <= report.Strength && report.Fit >= 0 && report.Fit <= report.Count
&& report.ConfirmedLosses >= 0 && report.ConfirmedLosses <= report.Strength - report.Count;
@@ -62,6 +64,7 @@ class ERR_HQWatchEntry
int Count = -1;
int Fit = -1;
int ConfirmedLosses;
ref ERR_HQAmmoSnapshot AmmoState;
ref ERR_HQDeliveredCasualties Casualties = new ERR_HQDeliveredCasualties();
float LastBodyDeliveredAt = -1;
float ObservedAt = -1;
@@ -87,6 +90,15 @@ class ERR_HQWatch
}
int ConfirmedLosses() { return m_ConfirmedLosses; }
int SquadLimit(int baseline) { return ERR_HQWatchRules.SquadLimit(baseline, m_ConfirmedLosses); }
// Conservative new-task veto, never a live inventory query or an active-order cancellation.
// A fresh complete own-roster check-in is required; silence or new bodily losses make no new ammo claims.
bool ArmedSearchBlocked(string sourceId, float now)
{
ERR_HQWatchEntry entry = Find(sourceId);
return entry && !entry.Closed && entry.AmmoState && entry.AmmoState.Members == entry.Count
&& ERR_HQPursuitRules.Finite(now) && entry.ObservedAt >= 0 && now >= entry.ObservedAt
&& now - entry.ObservedAt <= 180000 && entry.AmmoState.KnownSmallArmsEmpty();
}
protected ERR_HQWatchEntry Create(string sourceId, int strength)
{
// Closed identities remain tombstones: replays cannot recreate a formation.
@@ -130,6 +142,8 @@ class ERR_HQWatch
if (!entry.Casualties.AcceptStatus(report.DeathSlots, report.ConfirmedLosses, report.Count)) return false;
entry.MessageId = report.MessageId; entry.Position = report.Position;
entry.Count = report.Count; entry.Fit = report.Fit;
entry.AmmoState = null;
if (report.AmmoState) entry.AmmoState = report.AmmoState.Snapshot();
entry.ObservedAt = report.ObservedAt; entry.LastDeliveredAt = now;
entry.AskedAt = -1; entry.NextAttempt = 0; entry.Investigating = false;
ApplyLosses(entry);