Reduce redundant AI equipment, radio and observation checks
continuous-integration/drone/push Build is passing
continuous-integration/drone/push Build is passing
Preserve live ownership and detection rules while skipping redundant work. Record published Workshop version 0.0.150 and add operation-count regressions.
This commit is contained in:
@@ -24,10 +24,17 @@ rules=convert(rules.replace('class ERR_EnemyEquipmentRules','struct ERR_EnemyEqu
|
||||
# Declare helper before rules, then define its real method bodies after rules.
|
||||
helper=helper[helper.index(' static ERR_ConvoyTask TaskForGroup'):helper.rfind('}')]
|
||||
helper=convert(helper).replace('static ERR_ConvoyTask* TaskForGroup','ERR_ConvoyTask* ERR_EnemyGunnerSkill::TaskForGroup').replace('static bool CapturedGroup','bool ERR_EnemyGunnerSkill::CapturedGroup').replace('static bool OriginalGunner','bool ERR_EnemyGunnerSkill::OriginalGunner').replace('static EAISkill Profile','EAISkill ERR_EnemyGunnerSkill::Profile')
|
||||
# Count entry into the real query; changing only the floor models a future policy.
|
||||
helper,count=re.subn(r'(bool ERR_EnemyGunnerSkill::OriginalGunner\([^)]*\)\s*\{)',r'\1 originalGunnerCalls++;',helper)
|
||||
assert count==1
|
||||
assert rules.count('return EAISkill::CYLON;')==1
|
||||
rules=rules.replace('return EAISkill::CYLON;','return useRequestedFloor ? skill : EAISkill::CYLON;')
|
||||
run(r'''
|
||||
#include <cassert>
|
||||
#include <vector>
|
||||
enum class EAISkill{ROOKIE=20,REGULAR=50,EXPERT=80,CYLON=100};
|
||||
bool useRequestedFloor=false;
|
||||
int originalGunnerCalls=0;
|
||||
enum class ERR_ForceKind{CONVOY,GUARD};
|
||||
enum class ECompartmentType{TURRET,CARGO};
|
||||
template<class T>struct Array:std::vector<T>{using std::vector<T>::vector;using std::vector<T>::operator=;int Count(){return this->size();}};
|
||||
@@ -97,7 +104,9 @@ int main(){
|
||||
}
|
||||
ERR_ConvoyRules::capture=true;assert(!ERR_EnemyGunnerSkill::OriginalGunner(&mode,&group,&actor));ERR_ConvoyRules::capture=false;
|
||||
// Current turret specialization must not overwrite the underlying requested skill.
|
||||
originalGunnerCalls=0;
|
||||
SCR_AICombatComponent combat;combat.owner=&actor;combat.ERR_BindEnemySkill(&mode,&group);assert(combat.skill==EAISkill::CYLON);
|
||||
assert(originalGunnerCalls==0);
|
||||
combat.ResetAISkill();assert(combat.skill==EAISkill::CYLON);
|
||||
combat.SetAISkill(static_cast<EAISkill>(90));assert(combat.skill==EAISkill::CYLON);
|
||||
actor.vehicle=nullptr;slot.occupant=nullptr;combat.ERR_RefreshEnemySkill();assert(combat.skill==EAISkill::CYLON);
|
||||
@@ -114,6 +123,18 @@ int main(){
|
||||
hq.task=nullptr;combat.SetAISkill(EAISkill::REGULAR);combat.ERR_BindEnemySkill(&mode,&group);assert(combat.skill==EAISkill::CYLON);
|
||||
combat.SetAISkill(static_cast<EAISkill>(90));assert(combat.skill==EAISkill::CYLON);
|
||||
combat.ERR_ReleaseEnemySkill(&mode);assert(combat.skill==EAISkill::REGULAR);
|
||||
assert(originalGunnerCalls==0); // Both refresh and setter skip irrelevant identity scans.
|
||||
// A future lower floor still queries real turret identity and applies its profile.
|
||||
useRequestedFloor=true;hq.task=&task;slot.occupant=&actor;actor.vehicle=&vehicle;
|
||||
SCR_AICombatComponent lower;lower.owner=&actor;
|
||||
lower.ERR_BindEnemySkill(&mode,&group);assert(lower.skill==EAISkill::CYLON&&originalGunnerCalls==1);
|
||||
lower.SetAISkill(EAISkill::ROOKIE);assert(lower.skill==EAISkill::CYLON&&originalGunnerCalls==2);
|
||||
slot.occupant=nullptr;lower.ERR_RefreshEnemySkill();assert(lower.skill==EAISkill::ROOKIE&&originalGunnerCalls==3);
|
||||
lower.SetAISkill(EAISkill::REGULAR);assert(lower.skill==EAISkill::REGULAR&&originalGunnerCalls==4);
|
||||
lower.SetAISkill(EAISkill::CYLON);lower.ERR_RefreshEnemySkill();assert(lower.skill==EAISkill::CYLON&&originalGunnerCalls==4);
|
||||
ERR_ConvoyRules::capture=true;int guardedWrites=lower.writes;lower.ERR_RefreshEnemySkill();
|
||||
assert(lower.writes==guardedWrites&&originalGunnerCalls==4);ERR_ConvoyRules::capture=false;
|
||||
lower.ERR_ReleaseEnemySkill(&mode);assert(lower.skill==EAISkill::REGULAR);
|
||||
}
|
||||
''')
|
||||
print('PASS: actual original turret identity, native/canonical guards, scoped maximum-skill profile, reset, dismount/reboard, requested-skill preservation and restoration')
|
||||
print('PASS: actual original turret identity and ownership guards; zero irrelevant query calls at maximum floor; lower-floor query/profile fallback; reset, dismount/reboard and restoration')
|
||||
|
||||
Reference in New Issue
Block a user