Preserve stolen intel evidence and safely clean up spent folders
continuous-integration/drone/push Build is passing
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -45,7 +45,7 @@ struct Mode{bool worldPreparing=false;bool WorldPreparing(){return worldPreparin
|
||||
Roster*Players(){return &roster;}Faction*PlayerFaction(){return faction;}struct Evidence*Evidence(){return &evidence;}struct Settings*Settings(){return &settings;}struct MineIntel*MineIntel(){return haveMine?&mine:nullptr;}void Locations(Array<ERR_LocationComponent*>&out){out=locations;}void ERR_IntelExhausted(bool){exhausted++;}};
|
||||
struct PlayerManager{int GetPlayerIdFromControlledEntity(IEntity){return 1;}};struct Game{PlayerManager manager;PlayerManager*GetPlayerManager(){return &manager;}}game;Game*GetGame(){return &game;}
|
||||
template<class...T>void PrintFormat(T...){}
|
||||
struct Discovery{Mode*m_Mode=nullptr;Array<IEntity>m_Spent;void Folders(InventoryStorageManagerComponent*i,Array<IEntity>&out){out=i->folders;}bool MarkSpent(IEntity e){if(!m_Spent.Contains(e))m_Spent.Insert(e);return true;}
|
||||
struct Discovery{bool m_Stopped=false;float m_CleanupNow=0;Mode*m_Mode=nullptr;Array<IEntity>m_Spent,cleanup;void QueueCleanup(IEntity item,float){cleanup.Insert(item);}void Folders(InventoryStorageManagerComponent*i,Array<IEntity>&out){out=i->folders;}bool MarkSpent(IEntity e){if(!m_Spent.Contains(e))m_Spent.Insert(e);return true;}
|
||||
'''+s+r'''
|
||||
};
|
||||
struct Fixture{Faction friendly,foreign;Mode mode;Discovery discovery;Entity player,second,folder;SCR_InventoryStorageManagerComponent firstInv,secondInv;ERR_DocumentComponent objective;ERR_LocationComponent radio,other;
|
||||
@@ -56,19 +56,15 @@ int main(){
|
||||
// advances ordinary discovery once across transfer between two valid players.
|
||||
Fixture f;f.objective.target="radio";f.folder.document=&f.objective;
|
||||
f.discovery.Recover(&f.player);assert(f.radio.knowledge==1&&f.other.knowledge==0&&f.discovery.m_Spent.Contains(&f.folder));
|
||||
assert(f.firstInv.deleteCalls==0&&!f.folder.deleted&&!f.mode.evidence.retired); // objective stays physical
|
||||
assert(f.discovery.cleanup.empty()&&!f.mode.evidence.retired); // objective stays physical
|
||||
assert(f.mode.mine.calls==1&&f.mode.mine.lastPlayer==&f.player&&f.mode.mine.recovered[0]==&f.folder);
|
||||
f.firstInv.folders.clear();f.secondInv.folders.Insert(&f.folder);f.discovery.Recover(&f.second);assert(f.radio.calls==1&&f.other.calls==0&&f.mode.mine.calls==1);
|
||||
// Existing sealed generic-folder target survives the supplemental hook.
|
||||
Fixture sealed;sealed.mode.evidence.sealed=&sealed.folder;sealed.mode.evidence.target="radio";sealed.discovery.Recover(&sealed.player);assert(sealed.radio.knowledge==1&&sealed.other.knowledge==0);
|
||||
assert(sealed.firstInv.deleted==&sealed.folder&&sealed.mode.evidence.retired==&sealed.folder&&!sealed.folder.deleted);
|
||||
sealed.discovery.Recover(&sealed.player);assert(sealed.firstInv.deleteCalls==1); // never consume twice
|
||||
Fixture refusal;refusal.firstInv.acceptDelete=false;refusal.discovery.Recover(&refusal.player);
|
||||
assert(refusal.firstInv.deleteCalls==1&&refusal.folder.deleted&&refusal.mode.evidence.retired==&refusal.folder);
|
||||
Fixture generic;InventoryStorageManagerComponent bare;bare.folders.Insert(&generic.folder);generic.player.inventory=&bare;generic.discovery.Recover(&generic.player);
|
||||
assert(generic.folder.deleted&&generic.mode.evidence.retired==&generic.folder); // missing scripted manager fallback
|
||||
assert(sealed.discovery.cleanup.size()==1&&sealed.discovery.cleanup[0]==&sealed.folder&&!sealed.mode.evidence.retired);
|
||||
sealed.discovery.Recover(&sealed.player);assert(sealed.discovery.cleanup.size()==1); // never consume/queue twice
|
||||
Fixture failed;failed.other.allow=false;failed.discovery.Recover(&failed.player);
|
||||
assert(failed.firstInv.deleteCalls==0&&!failed.folder.deleted&&!failed.mode.evidence.retired); // no clue, no deletion
|
||||
assert(failed.discovery.cleanup.empty()&&!failed.mode.evidence.retired); // no clue, no deletion
|
||||
// Unknown authored target stays unspent; a supplement cannot consume it first.
|
||||
Fixture missing;missing.objective.target="absent";missing.folder.document=&missing.objective;missing.discovery.Recover(&missing.player);assert(missing.discovery.m_Spent.IsEmpty()&&missing.radio.calls==0&&missing.other.calls==0);
|
||||
// Failed site discovery also retains the original retry semantics.
|
||||
@@ -80,10 +76,12 @@ int main(){
|
||||
assert(pending.radio.knowledge==1&&pending.discovery.m_Spent.Contains(&pending.folder));
|
||||
// Generic exhausted clue retains the existing spent/exhaustion behavior.
|
||||
Fixture exhausted;exhausted.radio.knowledge=2;exhausted.other.knowledge=2;exhausted.discovery.Recover(&exhausted.player);assert(exhausted.discovery.m_Spent.Contains(&exhausted.folder)&&exhausted.mode.exhausted==1);
|
||||
assert(exhausted.discovery.cleanup.size()==1&&!exhausted.mode.evidence.retired);
|
||||
// A newly published mine warning is useful even after site clues are exhausted.
|
||||
// Spend the original generic folder once without the contradictory exhaustion notice.
|
||||
Fixture mineOnly;mineOnly.mode.mine.newlyRecovered=true;mineOnly.radio.knowledge=2;mineOnly.other.knowledge=2;
|
||||
mineOnly.discovery.Recover(&mineOnly.player);assert(mineOnly.mode.mine.calls==1&&mineOnly.discovery.m_Spent.Contains(&mineOnly.folder)&&mineOnly.mode.exhausted==0);
|
||||
assert(mineOnly.discovery.cleanup.size()==1&&!mineOnly.mode.evidence.retired);
|
||||
mineOnly.discovery.Recover(&mineOnly.player);assert(mineOnly.mode.mine.calls==1&&mineOnly.mode.exhausted==0);
|
||||
// New warning supplements, never replaces, an available site clue.
|
||||
Fixture both;both.mode.mine.newlyRecovered=true;both.discovery.Recover(&both.player);assert(both.other.knowledge==1&&both.discovery.m_Spent.Contains(&both.folder)&&both.mode.exhausted==0);
|
||||
|
||||
Reference in New Issue
Block a user