Fix convoy coordination, AI combat and spectator recovery
This commit is contained in:
@@ -132,6 +132,26 @@ int main(){
|
||||
assert(memory.Get(&a)->SampleCount==8&&memory.Get(&a)->BeliefRevision==12&&memory.Get(&a)->HasVelocity);
|
||||
auto old=Report(13,&a,23000);assert(!memory.Ingest(&old,25000)&&memory.Get(&a)->BeliefRevision==12);
|
||||
auto jump=Report(14,&a,26000,{10000,0,0});assert(memory.Ingest(&jump,26000)&&!memory.Get(&a)->HasVelocity);
|
||||
// A near-simultaneous second observer must not erase credible motion
|
||||
// history. Use the nearest sample at least two seconds old, never a live
|
||||
// entity position or an older convenient sample across a mode change.
|
||||
memory.Clear();
|
||||
auto spaced=Report(1,&a,1000,{10,0,20});assert(memory.Ingest(&spaced,1000));
|
||||
auto closeA=Report(2,&a,4000,{10,0,20});assert(memory.Ingest(&closeA,4000));
|
||||
auto closeB=Report(3,&a,4500,{10,0,20});assert(memory.Ingest(&closeB,4500));
|
||||
assert(memory.Get(&a)->HasVelocity&&near(memory.Get(&a)->Speed,0));
|
||||
auto moving=Report(4,&a,5000,{18,0,20});assert(memory.Ingest(&moving,5000));
|
||||
assert(memory.Get(&a)->HasVelocity&&near(memory.Get(&a)->Speed,2));
|
||||
auto boarded=Report(5,&a,5500,{18,0,20},"vehicle");assert(memory.Ingest(&boarded,5500));
|
||||
assert(!memory.Get(&a)->HasVelocity);
|
||||
auto dismounted=Report(6,&a,6000,{18,0,20});assert(memory.Ingest(&dismounted,6000));
|
||||
assert(!memory.Get(&a)->HasVelocity); // do not bridge the intervening vehicle observation
|
||||
auto farJump=Report(7,&a,8000,{10000,0,0});assert(memory.Ingest(&farJump,8000));
|
||||
assert(!memory.Get(&a)->HasVelocity); // do not skip an implausible eligible pair
|
||||
memory.Clear();
|
||||
auto rapidA=Report(1,&a,1000);assert(memory.Ingest(&rapidA,1000));
|
||||
auto rapidB=Report(2,&a,1500);assert(memory.Ingest(&rapidB,1500));
|
||||
assert(!memory.Get(&a)->HasVelocity); // insufficient time baseline still refuses motion
|
||||
// No equal/weak burst can evict a stronger current sighting; later stronger reports can.
|
||||
memory.Clear();Identity people[70];for(int i=0;i<70;i++)people[i].id=i+10;
|
||||
for(int i=0;i<64;i++){auto r=Report(i+1,&people[i],0);assert(memory.Ingest(&r,0));}
|
||||
@@ -139,6 +159,18 @@ int main(){
|
||||
over.ObservedAt=10000;assert(memory.Ingest(&over,10000)&&memory.Count()==64);
|
||||
auto weak=Report(66,&people[65],10000);weak.Distress=true;assert(!memory.Ingest(&weak,10000));
|
||||
assert(!memory.At(-1)&&!memory.At(64)&&!memory.Get(nullptr));
|
||||
// Heard fire is source-keyed, imprecise, short-lived, never a precision target.
|
||||
memory.Clear();auto sound=Report(1,nullptr,1000,{75,0,225},"heard gunfire");sound.Source=&friendly;
|
||||
assert(memory.Ingest(&sound,1000));auto noise=memory.At(0);
|
||||
assert(noise->Kind==ERR_HQMemoryKind::GUNFIRE&&!noise->Target&&!noise->HasVelocity&&!noise->Actionable());
|
||||
assert(near(noise->Radius,150)&&near(noise->Confidence,.4));
|
||||
int soundId=noise->BeliefId;assert(memory.NegativeSearch(soundId,1,1000));
|
||||
assert(near(memory.GetById(soundId)->Confidence,.26));
|
||||
sound.MessageId=2;sound.ObservedAt=3000;sound.Position={375,0,225};assert(memory.Ingest(&sound,3000));
|
||||
assert(memory.Count()==1&&!memory.At(0)->HasVelocity&&memory.At(0)->Target==nullptr);
|
||||
auto visual=Report(3,&a,3000,{400,0,210});assert(memory.Ingest(&visual,3000));
|
||||
assert(memory.Count()==2&&memory.Get(&a)->Actionable()&&near(memory.Get(&a)->Confidence,1));
|
||||
memory.Tick(63000);assert(near(memory.GetById(soundId)->Confidence,.2));
|
||||
// The global replay table is bounded even when valid observation IDs arrive rapidly.
|
||||
memory.Clear();for(int i=1;i<=4096;i++){auto r=Report(i,&a,float(i));assert(memory.Ingest(&r,float(i)));}
|
||||
auto full=Report(4097,&a,4097);assert(!memory.Ingest(&full,4097)&&memory.m_Seen.Count()==4096);
|
||||
|
||||
Reference in New Issue
Block a user