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:
@@ -60,7 +60,7 @@ create=body(site,'protected bool CreateTransport(').replace('protected ','').rep
|
||||
for name in ('ERR_SiteRuntime','ERR_SiteTransport','CarControllerComponent','ERR_VehicleSecurityComponent'):
|
||||
create=re.sub(r'\b'+name+r' (\w+)',name+r'* \1',create)
|
||||
for name in ('site','spec','controller','security'):create=create.replace(name+'.',name+'->')
|
||||
create=create.replace('site->Definition.','site->Definition->')
|
||||
create=create.replace('site->Definition.','site->Definition->').replace('GetGame().GetWorld().GetWorldTime()', '0')
|
||||
create=create.replace('ERR_Actors.','ERR_Actors::').replace('ERR_VehicleSecurityComponent.','ERR_VehicleSecurityComponent::')
|
||||
create=create.replace('Vehicle.Cast(entity)','CastVehicle(entity)').replace('CarControllerComponent.Cast(site->Transport.FindComponent(CarControllerComponent))','FindController(site->Transport)')
|
||||
run('''#include <cassert>
|
||||
@@ -75,25 +75,38 @@ struct Entity {bool vehicle=true;CarControllerComponent* controller=nullptr;ERR_
|
||||
ERR_VehicleSecurityComponent* ERR_VehicleSecurityComponent::Find(Entity* e){return e->security;}
|
||||
IEntity CastVehicle(IEntity e){return e->vehicle?e:nullptr;}
|
||||
CarControllerComponent* FindController(IEntity e){return e->controller;}
|
||||
struct ERR_SiteTransport {int Offset=0,ClearanceRadius=4,MaximumTerrainRange=1,Prefab=123,Heading=180;};
|
||||
struct ERR_SiteTransport {bool Optional=false;int Offset=0,ClearanceRadius=4,MaximumTerrainRange=1,Prefab=123,Heading=180;};
|
||||
struct Definition {ERR_SiteTransport* Transport=nullptr;string Id="supply";};
|
||||
struct ERR_SiteRuntime {struct Definition* Definition;IEntity Transport=nullptr;};
|
||||
struct ERR_SiteRuntime {struct Definition* Definition;IEntity Transport=nullptr,TransportEntity=nullptr;bool TransportAttempted=false,TransportOmitted=false;float TransportDeadline=-1;};
|
||||
struct ERR_Actors {static IEntity spawned;static int calls;static int Ground(int p){return p;}static IEntity Spawn(int,int,int){calls++;return spawned;}};IEntity ERR_Actors::spawned=nullptr;int ERR_Actors::calls=0;
|
||||
struct Array:std::vector<IEntity>{void Insert(IEntity e){push_back(e);}};
|
||||
struct Service{bool clear=true;string failure;Array m_Entities;bool Fail(string s){failure=s;return false;}bool TransportClearance(int,int,int){return clear;}
|
||||
struct Service{bool clear=true;string failure;Array m_Entities;bool Fail(string s){failure=s;return false;}bool TransportFailure(ERR_SiteRuntime*,string s){return Fail(s);}bool TransportClearance(int,int,int){return clear;}
|
||||
'''+create+'''
|
||||
};
|
||||
int main(){Service service;Definition def;ERR_SiteRuntime site{&def};ERR_SiteTransport spec;
|
||||
assert(service.CreateTransport(&site,0)&&ERR_Actors::calls==0);def.Transport=&spec;
|
||||
service.clear=false;assert(!service.CreateTransport(&site,0)&&ERR_Actors::calls==0);service.clear=true;
|
||||
assert(!service.CreateTransport(&site,0)&&service.m_Entities.empty());
|
||||
Entity vehicle;CarControllerComponent controller;ERR_VehicleSecurityComponent security;ERR_Actors::spawned=&vehicle;
|
||||
vehicle.vehicle=false;assert(!service.CreateTransport(&site,0)&&service.m_Entities.back()==&vehicle);vehicle.vehicle=true;
|
||||
assert(!service.CreateTransport(&site,0));vehicle.controller=&controller;
|
||||
assert(service.CreateTransport(&site,0)&&controller.parked); // ordinary vehicle has no security hook
|
||||
vehicle.security=&security;security.controller=&controller;security.result=false;controller.parked=false;
|
||||
assert(!service.CreateTransport(&site,0)&&security.calls==1&&service.failure.find("security configuration")!=string::npos);
|
||||
security.result=true;controller.parked=false;assert(service.CreateTransport(&site,0)&&security.calls==2&&site.Transport==&vehicle);
|
||||
int main(){
|
||||
{Service service;Definition def;ERR_SiteRuntime site{&def};assert(service.CreateTransport(&site,0)&&ERR_Actors::calls==0&&!site.TransportAttempted);}
|
||||
for(int fault=0;fault<6;fault++){
|
||||
Service service;Definition def;ERR_SiteRuntime site{&def};ERR_SiteTransport spec;def.Transport=&spec;
|
||||
Entity vehicle;CarControllerComponent controller;ERR_VehicleSecurityComponent security;vehicle.controller=&controller;security.controller=&controller;vehicle.security=&security;
|
||||
ERR_Actors::spawned=&vehicle;ERR_Actors::calls=0;
|
||||
if(fault==0){service.clear=false;}
|
||||
if(fault==1){ERR_Actors::spawned=nullptr;}
|
||||
if(fault==2){vehicle.vehicle=false;}
|
||||
if(fault==3){vehicle.controller=nullptr;}
|
||||
if(fault==4){security.result=false;}
|
||||
bool success=service.CreateTransport(&site,0);
|
||||
assert(success==(fault==5)&&site.TransportAttempted);
|
||||
assert(ERR_Actors::calls==(fault==0?0:1));
|
||||
if(fault>=2){assert(service.m_Entities.back()==&vehicle&&site.TransportEntity==&vehicle);}
|
||||
if(fault>=4){assert(controller.parked&&security.calls==1);}
|
||||
if(fault==4){assert(service.failure.find("security configuration")!=string::npos);}
|
||||
if(fault==5){assert(site.Transport==&vehicle);assert(service.CreateTransport(&site,0)&&ERR_Actors::calls==1&&security.calls==1);}
|
||||
}
|
||||
// Ordinary unlocked vehicle preserves the original successful path.
|
||||
{Service service;Definition def;ERR_SiteRuntime site{&def};ERR_SiteTransport spec;def.Transport=&spec;
|
||||
Entity vehicle;CarControllerComponent controller;vehicle.controller=&controller;ERR_Actors::spawned=&vehicle;
|
||||
assert(service.CreateTransport(&site,0)&&controller.parked);}
|
||||
|
||||
}
|
||||
''')
|
||||
print('PASS: actual CreateTransport requires successful scoped Configure after handbrake, preserves ordinary vehicles, tracks spawned entity before failures and never treats failed lock registration as ready.')
|
||||
|
||||
Reference in New Issue
Block a user