"""Run the production search commitment state machine; not a native flight test.""" from policy_harness import ROOT, body, run path = ROOT / 'addons/core/Scripts/Game/ERR/10_AI/ERR_ReconFlightComponent.c' policy = body(path, 'class ERR_ReconSearchTask') policy = policy.replace('class ERR_ReconSearchTask', 'struct ERR_ReconSearchTask').replace('Math.', 'Math::') + ';' run(r''' #include #include struct Math { static float Max(float a,float b){return std::max(a,b);} static float Clamp(float a,float lo,float hi){return std::clamp(a,lo,hi);} }; ''' + policy + r''' int main() { ERR_ReconSearchTask task{}; assert(!task.Tick(1000,0)); assert(!task.Accept(-1,1000)); assert(!task.Accept(1001,1000)); assert(!task.Accept(0,60001)); assert(task.Accept(1000,61000)); // freshness boundary accepted // The reported RKS failure: report expires while heli still 1.4km away. for(int t=62000;t<=400000;t+=1000) assert(task.Tick(t,1446)); assert(task.SearchedMs==0); assert(!task.Accept(1000,400000)); // replay cannot renew travel allowance // Only time near the reported area consumes its search budget. assert(task.Tick(401000,650)); assert(task.SearchedMs==1000); assert(task.Tick(402000,651)); assert(task.SearchedMs==1000); for(int t=403000;t<=520000;t+=1000) assert(task.Tick(t,300)); assert(!task.Tick(521000,300)); assert(!task.Accept(1000,521000)); // exhausted report not selected again assert(task.Accept(521000,521000)); // a genuinely new sighting renews search assert(task.Tick(522000,300)); assert(!task.Accept(520000,522000)); // older target can't displace newest assert(task.Accept(522000,522000)); assert(task.SearchedMs==0); // Native crew sighting wins, including over earlier HQ reports arriving late. task.Cancel(530000); assert(!task.Active && !task.Accept(529000,531000)); assert(task.Accept(531000,531000)); assert(task.Tick(1430999,2000)); assert(!task.Tick(1431000,2000)); // finite fifteen-minute unreachable approach assert(!task.Accept(531000,1431000)); // Time spent on another task is not counted as local searching on return. ERR_ReconSearchTask interrupted{}; assert(interrupted.Accept(1000,1000)); assert(interrupted.Tick(500000,300)); assert(interrupted.SearchedMs==5000); } ''') print('PASS: expired-report approach, arrival-only search, completion, newer/older/replayed reports, visual priority, interrupted search and bounded travel')