Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
"""Execute actual Intel reroll methods against adversarial async inventory adapters."""
|
||||
import re
|
||||
import os, re
|
||||
from pathlib import Path
|
||||
from policy_harness import ROOT, body, run
|
||||
service=ROOT/'addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelService.c'
|
||||
batch=ROOT/'addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelReroll.c'
|
||||
batch=Path(os.environ.get('ERR_INTEL_REROLL_SOURCE',ROOT/'addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelReroll.c'))
|
||||
def adapt(text,cls):
|
||||
text=text.replace('protected ', '').replace('null','nullptr')
|
||||
text=re.sub(r'array<([^>]+)> (\w+) = \{\};',r'Array<\1> \2;',text)
|
||||
@@ -84,6 +85,23 @@ int main(){
|
||||
Mode rejectMode;Service reject(&rejectMode);Actor ra,rf;Add(reject,ra);ra.inv.folders.Insert(&rf);ra.inv.acceptRemove=false;rejectMode.settings.chance=0;assert(reject.BeginReroll());reject.Tick(0);assert(reject.m_Reroll->Running()&&reject.m_Reroll->m_Failed==0&&!rejectMode.discovery.IsSpent(&rf)&&!rejectMode.owned.Contains(&rf));ra.inv.acceptRemove=true;reject.Tick(1);assert(ra.inv.removes==2&&rejectMode.discovery.IsSpent(&rf)&&rejectMode.owned.Contains(&rf));ra.inv.folders.Clear();rf.item.attached=false;reject.Tick(2);assert(!reject.m_Reroll->Running()&&reject.m_Reroll->m_Failed==0);
|
||||
// Persistent refusal exhausts exactly thirty native attempts without spending.
|
||||
Mode refusalMode;Service refusal(&refusalMode);Actor pa,pf;Add(refusal,pa);pa.inv.folders.Insert(&pf);pa.inv.acceptRemove=false;assert(refusal.BeginReroll());Drain(refusal);assert(pa.inv.removes==30&&refusal.m_Reroll->m_Failed==1&&!refusalMode.discovery.IsSpent(&pf)&&!refusalMode.owned.Contains(&pf)&&refusal.m_Reroll->m_Entries[0]->WaitingFor=="removal-refused");
|
||||
// Completed entries must not monopolize all eight native-work slots. The
|
||||
// last actor is still processed at most once, even when the scan wraps around.
|
||||
{Mode sparseMode;Service sparse(&sparseMode);Batch pending(&sparseMode,&sparse,100);Actor cohort[20];
|
||||
for(auto& actor:cohort){actor.hasInventory=false;pending.Add(&actor);}
|
||||
for(int i=0;i<19;i++){pending.m_Entries[i]->Done=true;pending.m_Completed++;}
|
||||
pending.Tick();assert(pending.m_Entries[19]->Attempts==1);
|
||||
pending.Tick();assert(pending.m_Entries[19]->Attempts==2);
|
||||
for(int i=0;i<19;i++)assert(pending.m_Entries[i]->Attempts==0);
|
||||
}
|
||||
// Large completed prefixes use no more than 32 cheap scans per tick. One
|
||||
// remaining request advances on tick five rather than waiting seventeen.
|
||||
{Mode largeMode;Service large(&largeMode);Batch pending(&largeMode,&large,100);Actor cohort[129];
|
||||
for(auto& actor:cohort){actor.hasInventory=false;pending.Add(&actor);}
|
||||
for(int i=0;i<128;i++){pending.m_Entries[i]->Done=true;pending.m_Completed++;}
|
||||
for(int tick=0;tick<4;tick++){pending.Tick();assert(pending.m_Entries[128]->Attempts==0);assert(pending.m_Next==(tick+1)*32);}
|
||||
pending.Tick();assert(pending.m_Entries[128]->Attempts==1);
|
||||
}
|
||||
// Tick budget, bounded missing inventory, Stop prevents further work/restart.
|
||||
Mode manyMode;Service many(&manyMode);Actor actors[20];for(auto& actor:actors){actor.hasInventory=false;Add(many,actor);}assert(many.BeginReroll());many.Tick(0);int attempts=0;for(auto entry:many.m_Reroll->m_Entries)attempts+=entry->Attempts;assert(attempts==8);Drain(many,100);assert(many.m_Reroll->m_Failed==20);many.Stop();assert(!many.BeginReroll()&&many.m_Rolled.empty()&&many.m_Requests.IsEmpty()&&many.m_Reroll->m_Cancelled);for(auto entry:many.m_Reroll->m_Entries)assert(!entry->Actor&&!entry->Removing);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user