Files
EscapistsReintroduced/addons/chat/Scripts/Game/ERR/ERR_NativeHQMemoryProbe.c
T

296 lines
13 KiB
C

#ifdef WORKBENCH
// Explicit fixture payloads, physical radio delivery, production HQ intake.
// This does not certify visual detection or an actual ground sweep completing.
modded class ERR_HQ
{
int ERR_MemoryFixtureRegisteredForces()
{
if (!ERR_NativeHQMemoryProbe.Enabled() || !m_Mode || !m_Mode.Forces()) return -1;
int registered;
foreach (ERR_HQUnit unit : m_Units)
{
if (unit.ReservedForSupport || !unit.Group) continue;
ERR_ForceRecord record = m_Mode.Forces().FindGroup(unit.Group);
if (!record || record.Group != unit.Group || !record.Physical || record.Eliminated) return -1;
registered++;
}
if (m_Mode.Forces().Count() < registered) return -1;
return registered;
}
protected bool ERR_MemoryFixtureHealthy(ERR_HQRoute route)
{
if (!route || route.Nodes.IsEmpty()) return false;
for (int i = 0; i < route.Nodes.Count(); i++)
if (!route.Nodes[i] || !route.Nodes[i].Valid(i == route.Nodes.Count() - 1)) return false;
return true;
}
ERR_HQRoute ERR_MemoryFixtureQueue(ERR_HQReport report)
{
if (!ERR_NativeHQMemoryProbe.Enabled()) return null;
foreach (ERR_HQUnit unit : m_Units)
{
if (unit.ReservedForSupport || !unit.Radio || unit.Uplink || unit.PendingReport || unit.PendingSweep) continue;
if (unit.PendingSupplyStatus || unit.PendingStatus) continue;
ERR_HQRoute route = m_Network.Route(unit.Radio);
if (!ERR_MemoryFixtureHealthy(route)) continue;
report.Source = unit.Group;
route.MessageId = report.MessageId;
route.Payload = "FIXTURE synthetic observed position; " + report.Description(report.ObservedAt);
unit.PendingReport = report.Snapshot(); unit.Uplink = route;
return route;
}
return null;
}
ERR_HQRoute ERR_MemoryFixtureSweep(ERR_HQSearchReport report)
{
if (!ERR_NativeHQMemoryProbe.Enabled()) return null;
foreach (ERR_HQUnit unit : m_Units)
{
if (unit.ReservedForSupport || !unit.Radio || unit.Uplink || unit.PendingReport || unit.PendingSweep) continue;
if (unit.PendingSupplyStatus || unit.PendingStatus) continue;
ERR_HQRoute route = m_Network.Route(unit.Radio);
if (!ERR_MemoryFixtureHealthy(route)) continue;
report.SourceId = unit.Id;
route.MessageId = report.MessageId;
route.Payload = "FIXTURE synthetic completed sweep; real uplink required";
unit.PendingSweep = report; unit.Uplink = route;
return route;
}
return null;
}
void ERR_MemoryFixtureReplaySweep(ERR_HQSearchReport report, float now)
{
if (ERR_NativeHQMemoryProbe.Enabled()) AcceptSweep(report, now);
}
override void Stop()
{
super.Stop();
if (!ERR_NativeHQMemoryProbe.Enabled()) return;
if (m_Memory.Count() != 0)
Print("ERR SMOKE FAIL: HQ memory stop retained beliefs", LogLevel.ERROR);
else Print("ERR SMOKE PASS: HQ memory actual command stop clears all belief history");
}
}
class ERR_NativeHQMemoryProbe
{
protected ERR_GameMode m_Mode;
protected ref ERR_HQRoute m_Route;
protected ref ERR_HQReport m_Report;
protected ref ERR_HQSearchReport m_Sweep;
protected int m_Step;
protected int m_BeliefId;
protected int m_Revision;
protected float m_FirstObserved;
protected float m_SecondObserved;
protected vector m_FirstPosition;
protected float m_Deadline;
protected bool m_Failed;
protected bool m_ValueChecked;
protected int m_RouteRetries;
static bool Enabled()
{
string enabled, outcome;
return Replication.IsServer() && System.GetCLIParam("errSmoke", enabled) && enabled == "1"
&& System.GetCLIParam("errSmokeOutcome", outcome) && outcome == "hq-memory";
}
void ERR_NativeHQMemoryProbe(ERR_GameMode mode) { m_Mode = mode; }
protected bool Check(bool condition, string description)
{
if (condition) { Print("ERR SMOKE PASS: HQ memory " + description); return true; }
m_Failed = true; Print("ERR SMOKE FAIL: HQ memory " + description, LogLevel.ERROR); return false;
}
protected float Unaged(ERR_HQBelief belief)
{
if (!belief) return -1;
float decay = ERR_HQMemoryRules.Confidence((belief.EvaluatedAt - belief.ObservedAt) / 1000);
if (decay <= 0) return -1;
return belief.Confidence / decay;
}
protected ERR_HQReport Payload(ERR_HQ hq, float now, vector position)
{
ERR_HQReport report = new ERR_HQReport();
report.MessageId = hq.Journal().Message(); report.Target = m_Mode;
report.ObservedAt = now; report.Position = position; report.TravelMode = "on foot";
return report;
}
protected bool LocalPolicies()
{
ERR_ForceLedger ledger = new ERR_ForceLedger();
ERR_ForceRecord force = ledger.Register("memory-value-fixture", ERR_ForceKind.PATROL, "100 0 100", 6);
if (!Check(force && ledger.Count() == 1 && !force.Group && !force.Physical,
"detached native Core ledger registers one arithmetic fixture without spawning")) return false;
if (!Check(ledger.Eliminate(force.Id, 1000), "detached native ledger records elimination")) return false;
ERR_ForceRecord duplicate = ledger.Register("memory-value-fixture", ERR_ForceKind.PATROL, "100 0 100", 6);
if (!Check(duplicate == force && ledger.Count() == 1 && force.Strength == 0 && force.Eliminated
&& !force.Group && !force.Physical, "eliminated source re-registration cannot restore strength or spawn"))
return false;
ERR_HQMemory memory = new ERR_HQMemory();
ERR_HQReport first = new ERR_HQReport();
first.Target = m_Mode; first.MessageId = 1; first.ObservedAt = 0;
first.Position = "100 7 100"; first.TravelMode = "on foot";
if (!Check(memory.Ingest(first, 0), "injected value fixture begins with a detached report")) return false;
first.Position = "999 7 999";
ERR_HQBelief belief = memory.Get(m_Mode);
if (!Check(belief && belief.Position == "100 7 100", "stored snapshot ignores later input mutation")) return false;
ERR_HQReport next = first.Snapshot();
next.MessageId = 2; next.ObservedAt = 10000; next.Position = "160 7 100";
if (!Check(memory.Ingest(next, 12000), "newer delivered-value fixture advances trajectory")) return false;
belief = memory.Get(m_Mode);
if (!Check(belief.HasVelocity && Math.AbsFloat(belief.Speed - 6) < 0.01,
"native vector arithmetic infers six metres per second from snapshots")) return false;
memory.Tick(610000); belief = memory.Get(m_Mode);
if (!Check(belief && Math.AbsFloat(belief.Confidence - 0.5) < 0.001 && belief.Radius > 700,
"ten-minute value-clock advance retains a weaker wider belief")) return false;
if (!Check(belief.PredictionSeconds == 30 && vector.DistanceXZ(belief.Position, belief.PredictedPosition) <= 300,
"old trajectory prediction remains capped in time and distance")) return false;
int id = belief.BeliefId;
if (!Check(memory.NegativeSearch(id, belief.BeliefRevision, 610000)
&& !memory.NegativeSearch(id, belief.BeliefRevision, 610000), "negative revision is idempotent")) return false;
memory.Clear();
if (!Check(memory.Count() == 0 && !memory.GetById(id), "clear removes detached value history")) return false;
return true;
}
protected bool RemoveRadios(IEntity carrier)
{
InventoryStorageManagerComponent inventory;
if (carrier)
inventory = InventoryStorageManagerComponent.Cast(carrier.FindComponent(InventoryStorageManagerComponent));
if (!inventory) return false;
array<IEntity> items = {}; inventory.GetItems(items);
int removed;
foreach (IEntity item : items)
{
if (!item || !item.FindComponent(BaseRadioComponent)) continue;
SCR_EntityHelper.DeleteEntityAndChildren(item); removed++;
}
return removed > 0;
}
int Tick(ERR_HQ hq, float now)
{
if (!Enabled() || !hq || !m_Mode || m_Failed) return -1;
if (m_Deadline == 0) m_Deadline = now + 120000;
if (now > m_Deadline) { Check(false, "fixture deadline"); return -1; }
if (m_Step == 0)
{
if (!hq.ERR_ProbeSquadsReady()) return 0;
if (!m_ValueChecked)
{
if (!Check(hq.ERR_MemoryFixtureRegisteredForces() == 6,
"actual six site groups are registered once in the Core force ledger")) return -1;
if (!LocalPolicies()) return -1;
m_ValueChecked = true;
}
m_FirstPosition = m_Mode.PrisonPosition() + "300 0 300";
m_Report = Payload(hq, now, m_FirstPosition);
m_Route = hq.ERR_MemoryFixtureQueue(m_Report);
if (!m_Route) return 0;
if (!Check(!hq.Memory().Get(m_Mode) && m_Route.Advance(now, hq.Journal()) == 0,
"queued synthetic sighting has no belief while actual transmitter starts")) return -1;
if (!Check(!m_Route.Originated && !m_Route.Sending && m_Route.OriginDue - m_Route.StartedAt == 3000,
"uplink holds original caller for three seconds before its first network hop")) return -1;
if (!Check(RemoveRadios(m_Route.Nodes[0].Carrier), "fixture removes actual transmitting equipment mid-uplink"))
return -1;
m_Step = 1; return 0;
}
if (m_Step == 1)
{
if (hq.Memory().Get(m_Mode))
{ Check(false, "interrupted uplink created a belief"); return -1; }
if (!m_Route.Failed) return 0;
if (!Check(!m_Route.Originated && !m_Route.Sending, "original caller radio loss interrupts call before any hop")) return -1;
Print("ERR SMOKE PASS: HQ memory physical uplink loss prevents production Accept");
m_Step = 2;
}
// A real carrier can fail after selection. Retry with a fresh immutable payload;
// a fixture may not hang waiting for a message that production correctly dropped.
if (m_Route && m_Route.Failed && m_Step >= 3)
{
m_RouteRetries++;
if (m_RouteRetries > 5) { Check(false, "positive-route retry bound"); return -1; }
if (m_Step == 3) m_Step = 2;
else if (m_Step == 5) m_Step = 4;
else if (m_Step == 7) m_Step = 6;
else if (m_Step == 9) m_Step = 8;
else if (m_Step == 10) m_Step = 9;
m_Route = null;
}
if (m_Step == 2 || m_Step == 4 || m_Step == 8)
{
if (m_Step == 4 && now - m_FirstObserved < 4000) return 0;
vector position = m_FirstPosition;
if (m_Step >= 4) position += "24 0 0";
m_Report = Payload(hq, now, position);
m_Route = hq.ERR_MemoryFixtureQueue(m_Report);
if (!m_Route) return 0;
if (m_Step == 2) m_FirstObserved = now;
if (m_Step == 4) m_SecondObserved = now;
m_Step++; return 0;
}
ERR_HQBelief current = hq.Memory().Get(m_Mode);
if (m_Step == 3)
{
if (!current || current.MessageId != m_Report.MessageId) return 0;
if (!Check(m_Route.Originated && now - m_Route.StartedAt >= 5000, "delivered uplink includes originating call and physical hop latency")) return -1;
if (!Check(current.Position == m_Report.Position && current.SampleCount == 1,
"actual uplink delivery reaches production intake exactly once")) return -1;
m_BeliefId = current.BeliefId; m_Step = 4; return 0;
}
if (m_Step == 5)
{
if (!current || current.MessageId != m_Report.MessageId) return 0;
if (!Check(current.BeliefId == m_BeliefId && current.SampleCount == 2 && current.HasVelocity,
"second physical delivery extends one stable credible trajectory")) return -1;
m_Revision = current.BeliefRevision;
m_Step = 6;
}
if (m_Step == 6)
{
m_Sweep = new ERR_HQSearchReport();
m_Sweep.MessageId = hq.Journal().Message(); m_Sweep.BeliefId = m_BeliefId;
m_Sweep.BeliefRevision = m_Revision; m_Sweep.ObservedAt = now; m_Sweep.Position = current.Position;
m_Sweep.SweepCompleted = true;
m_Route = hq.ERR_MemoryFixtureSweep(m_Sweep);
if (!m_Route) return 0;
if (!Check(Unaged(hq.Memory().GetById(m_BeliefId)) > 0.99,
"synthetic completed sweep is not knowledge before radio delivery")) return -1;
m_Step = 7; return 0;
}
if (m_Step == 7)
{
if (!current || Unaged(current) > 0.99) return 0;
if (!Check(Math.AbsFloat(Unaged(current) - 0.65) < 0.001 && current.BeliefRevision == m_Revision
&& current.ObservedAt == m_SecondObserved && current.SampleCount == 2,
"delivered negative sweep lowers confidence without inventing a sighting")) return -1;
hq.ERR_MemoryFixtureReplaySweep(m_Sweep, now);
if (!Check(Math.AbsFloat(Unaged(hq.Memory().Get(m_Mode)) - 0.65) < 0.001,
"replayed completed-sweep payload cannot multiply confidence loss")) return -1;
m_Step = 8; return 0;
}
if (m_Step == 9)
{
if (!current || current.MessageId != m_Report.MessageId) return 0;
if (!Check(current.BeliefRevision > m_Revision && Unaged(current) > 0.99,
"fresh delivered sighting supersedes prior negative evidence")) return -1;
ERR_HQSearchReport stale = new ERR_HQSearchReport();
stale.MessageId = hq.Journal().Message(); stale.BeliefId = m_BeliefId;
stale.BeliefRevision = m_Revision; stale.ObservedAt = now; stale.Position = m_FirstPosition;
stale.SweepCompleted = true;
m_Route = hq.ERR_MemoryFixtureSweep(stale);
if (!m_Route) return 0;
m_Step = 10; return 0;
}
if (m_Step == 10)
{
if (m_Route.Failed) { Check(false, "old-revision fixture sweep route failed"); return -1; }
if (m_Route.Cursor < m_Route.Nodes.Count() || m_Route.Sending) return 0;
if (!Check(current && current.BeliefRevision > m_Revision && Unaged(current) > 0.99,
"delivered old-revision sweep cannot weaken a newer sighting")) return -1;
return 1;
}
return 0;
}
}
#endif