Add mission customization, HQ support and aggression-driven AI
Integrate faction and random settings menus, generated objectives, scouts, convoys, air support, mortar stations and body-intel recovery. Add identified-body aggression, finite hunter UAZ deployment, dedicated objective defence and maximum AI skill with separate reduced aim accuracy. Include policy tests, native probes, evidence and documentation.
This commit is contained in:
@@ -6,9 +6,9 @@ H = ROOT/'addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c'
|
||||
def cpp(s):
|
||||
s=s.replace('protected ', '').replace('null','nullptr').replace('foreach (','for (')
|
||||
for x in ('ERR_HQPursuitRules','vector','string'): s=s.replace(x+'.',x+'::')
|
||||
for typ in ('ERR_HQUnit','ERR_HQReport','ERR_HQWatchEntry','ERR_HQRoute','ERR_ConvoyCombatOrder','ERR_ConvoyVehicle'):
|
||||
for typ in ('ERR_HQUnit','ERR_HQReport','ERR_HQWatchEntry','ERR_HQRoute','ERR_ConvoyCombatOrder','ERR_ConvoyVehicle','ERR_ConvoyTask'):
|
||||
s=re.sub(r'\b'+typ+r' (?=\w)',typ+'* ',s)
|
||||
for x in ('entry','unit','best','report','vehicle','contact','route','order','m_ConvoyTask'):
|
||||
for x in ('entry','unit','best','report','vehicle','contact','route','order','task','m_ConvoyTask'):
|
||||
s=s.replace(x+'.',x+'->')
|
||||
s=s.replace('->Combat.', '->Combat->').replace('->Receipt.', '->Receipt->')
|
||||
s=s.replace('unit->Downlink.', 'unit->Downlink->')
|
||||
@@ -16,7 +16,7 @@ def cpp(s):
|
||||
s=s.replace('bool accepted;', 'bool accepted = false;')
|
||||
return s
|
||||
methods='\n'.join(cpp(body(H,s)) for s in ('protected bool ConvoyPositionKnown(',
|
||||
'protected ERR_HQReport ConvoyContact(', 'protected void PlanConvoy(', 'protected void DeliverConvoyOrder('))
|
||||
'protected ERR_HQReport ConvoyContact(', 'protected void PlanConvoy(', 'protected void PlanConvoyTask(', 'protected void DeliverConvoyOrder('))
|
||||
downlink=cpp(body(H,'if (unit.Downlink)\n'))
|
||||
cancel=cpp(body(H,'void CancelPending('))
|
||||
src=H.read_text()
|
||||
@@ -40,20 +40,21 @@ struct Watch {std::map<string,ERR_HQWatchEntry*> entries;ERR_HQWatchEntry* Find(
|
||||
struct Journal {int seq=100;int Message(){return ++seq;}void Write(string,string,int){}};
|
||||
struct ERR_HQRoute {int MessageId=0;string Payload;int result=0;int Advance(float,Journal&){return result;}};
|
||||
struct Network {bool available=true;int calls=0;ERR_HQRoute* Route(void*,bool down){assert(down);calls++;return available?new ERR_HQRoute:nullptr;}};
|
||||
struct ERR_ConvoyCombatOrder {int CommandId=0,ReportId=0,VehicleIndex=0;string SourceId;SCR_AIGroup* Group=nullptr;bool Hold=false;float ObservedAt=-1,IssuedAt=0,ExpiresAt=0;};
|
||||
struct ERR_ConvoyCombatOrder {int CommandId=0,ReportId=0,VehicleIndex=0;string SourceId;SCR_AIGroup* Group=nullptr;vector Position;bool Hold=false;float ObservedAt=-1,IssuedAt=0,ExpiresAt=0;};
|
||||
struct CombatState {bool Held=false;int LastCommandId=0,ReportId=0;float ObservedAt=-1;};
|
||||
struct ERR_ConvoyVehicle {int SupplyToken=0,Index=0;SCR_AIGroup* Group=nullptr;bool Released=false,Arrived=false,Registered=true;CombatState state;CombatState* Combat=&state;};
|
||||
struct Receipt {string SourceId="convoy-1";};
|
||||
struct ConvoyTask {bool Stopped=false,Ready=true;struct Receipt receipt;struct Receipt* Receipt=&receipt;std::vector<ERR_ConvoyVehicle*> Vehicles;};
|
||||
struct Service {int calls=0;bool valid=true;ERR_ConvoyCombatOrder* last=nullptr;
|
||||
bool ApplyCombatOrder(ConvoyTask* task,ERR_ConvoyCombatOrder* o,float){calls++;last=o;if(!task||!valid)return false;
|
||||
struct ERR_ConvoyTask {bool Stopped=false,Ready=true;struct Receipt receipt;struct Receipt* Receipt=&receipt;std::vector<ERR_ConvoyVehicle*> Vehicles;};
|
||||
struct Service {ERR_ConvoyTask* task=nullptr;int Count(){return task?1:0;}ERR_ConvoyTask* At(int){return task;}ERR_ConvoyTask* Find(string id){return task&&task->Receipt->SourceId==id?task:nullptr;}
|
||||
int calls=0;bool valid=true;ERR_ConvoyCombatOrder* last=nullptr;
|
||||
bool ApplyCombatOrder(ERR_ConvoyTask* task,ERR_ConvoyCombatOrder* o,float){calls++;last=o;if(!task||!valid)return false;
|
||||
auto s=task->Vehicles.at(o->VehicleIndex)->Combat;s->Held=o->Hold;s->LastCommandId=o->CommandId;s->ReportId=o->ReportId;s->ObservedAt=o->ObservedAt;return true;}};
|
||||
struct ERR_HQUnit {SCR_AIGroup* Group=nullptr;bool ReservedForSupport=true;void* Radio=this;string ForceSourceId="vehicle-0";
|
||||
ERR_HQRoute* Downlink=nullptr;ERR_ConvoyCombatOrder* PendingConvoyOrder=nullptr;void* PendingOrder=nullptr;void* PendingTask=nullptr;
|
||||
bool PendingCheckin=false;float NextStatus=0;
|
||||
'''+cancel+r'''
|
||||
};
|
||||
struct HQ {Watch m_Watch;Network m_Network;Journal m_Journal;Service m_Convoys;ConvoyTask* m_ConvoyTask=nullptr;
|
||||
struct HQ {Watch m_Watch;Network m_Network;Journal m_Journal;Service m_Convoys;ERR_ConvoyTask* m_ConvoyTask=nullptr;
|
||||
std::vector<ERR_HQUnit*> m_Units;std::vector<ERR_HQReport*> m_Contacts;int ordinary=0,lost=0;
|
||||
void DeliverOrder(ERR_HQUnit*,float){ordinary++;}void LostOrder(ERR_HQUnit* u,float){lost++;u->CancelPending();}
|
||||
'''+methods+r'''
|
||||
@@ -62,7 +63,7 @@ struct HQ {Watch m_Watch;Network m_Network;Journal m_Journal;Service m_Convoys;C
|
||||
}
|
||||
};
|
||||
int main(){
|
||||
HQ h;SCR_AIGroup g;ERR_HQUnit u;u.Group=&g;h.m_Units={&u};ConvoyTask t;h.m_ConvoyTask=&t;
|
||||
HQ h;SCR_AIGroup g;ERR_HQUnit u;u.Group=&g;h.m_Units={&u};ERR_ConvoyTask t;h.m_ConvoyTask=&t;h.m_Convoys.task=&t;
|
||||
ERR_ConvoyVehicle v;v.Group=&g;t.Vehicles={&v};ERR_HQWatchEntry e;e.ObservedAt=1000;e.Position={0,0};
|
||||
ERR_HQReport r;r.MessageId=1;r.ObservedAt=2000;r.Position={200,0};
|
||||
h.PlanConvoy(3000);assert(!u.Downlink); // no delivered own status or target report
|
||||
|
||||
Reference in New Issue
Block a user