Merge owned systems into one addon while preserving resource identities. Gate player admission on the replicated prison scene, restore the original framed door, and hold enemy AI until escape. Correct scenario branding and author metadata, include publishing assets, and retain regression and native verification evidence.
45 lines
2.5 KiB
Python
45 lines
2.5 KiB
Python
"""Exercise actual radio tuning, defender and continuity policy bodies.
|
|
Native fixture covers service events and physical character state separately.
|
|
"""
|
|
from policy_harness import ROOT, body, run
|
|
source=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_RadioDefenceService.c'
|
|
functions='\n'.join(body(source, signature) for signature in (
|
|
'static float DefenceRadius(', 'static float TuneRadius(',
|
|
'static bool CanTune(', 'static bool Defender(', 'static float SinceAfterSample(',
|
|
)).replace('ERR_Phase.', 'ERR_Phase::')
|
|
functions+='\n'+body(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_MissionRules.c','static bool DefenceComplete(')
|
|
run('''#include <cassert>
|
|
#include <initializer_list>
|
|
namespace ERR_Phase {enum {PREPARING,PRISON,RADIO_SEARCH,RADIO_DEFENCE,EXTRACTION,VICTORY,DEFEAT};}
|
|
'''+functions+'''
|
|
int main() {
|
|
for (int phase=-1;phase<=7;++phase)
|
|
for (int flags=0;flags<16;++flags)
|
|
for (int knowledge=0;knowledge<=2;++knowledge)
|
|
for (float distance : {-1.f,0.f,4.999f,5.f,5.001f,60.f}) {
|
|
bool registered=flags&1,radio=flags&2,player=flags&4,conscious=flags&8;
|
|
bool expected=phase==ERR_Phase::RADIO_SEARCH && registered && radio && knowledge>=2 && player && conscious && distance>=0 && distance<=5;
|
|
assert(CanTune(phase,registered,radio,knowledge,player,conscious,distance)==expected);
|
|
}
|
|
for (int flags=0;flags<4;++flags)
|
|
for (float distance : {-1.f,0.f,59.999f,60.f,60.001f})
|
|
assert(Defender(flags&1,flags&2,distance)==(bool(flags&1)&&bool(flags&2)&&distance>=0&&distance<60));
|
|
assert(DefenceRadius()==60 && TuneRadius()==5);
|
|
float since=SinceAfterSample(-1,-1,1000,2);
|
|
assert(since==1000);
|
|
since=SinceAfterSample(since,1000,6000,1);
|
|
assert(since==1000); // second person can leave without resetting remaining defender
|
|
since=SinceAfterSample(since,6000,7000,0);
|
|
assert(since==-1); // absent/dead/unconscious/empty-server samples reset
|
|
since=SinceAfterSample(since,7000,8000,1);
|
|
assert(since==8000);
|
|
assert(!DefenceComplete(37999,since,30000,true));
|
|
assert(DefenceComplete(38000,since,30000,true));
|
|
assert(!DefenceComplete(38000,since,45000,true)); // live setting increased
|
|
assert(SinceAfterSample(since,38000,30000,1)==30000); // backward clock resets interval
|
|
assert(SinceAfterSample(since,38000,-1,1)==-1);
|
|
assert(SinceAfterSample(since,38000,50000,-1)==-1);
|
|
}
|
|
''')
|
|
print('PASS: radio authorization/discovery/phase matrix, exact distance limits, defender handover, interruption, empty samples, clock regression and duration boundary')
|