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:
2026-10-13 22:52:53 +02:00
parent a951a96edc
commit 6a667d8deb
8104 changed files with 2124945 additions and 2061 deletions
+12 -4
View File
@@ -7,6 +7,8 @@ MODE=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_GameMode.c'
ACTORS=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_Actors.c'
def cpp(s):
# Test mission scheduling inside the existing performance wrapper.
s=s.replace('ServerTickMeasured(', 'ServerTick(').replace('System.', 'System::').replace('ERR_PerfMetric.', 'ERR_PerfMetric::').replace('int perfStamp;', 'int perfStamp=0;')
s=s.replace('ERR_HQ.Event','ERR_HQ::Event').replace('protected ','').replace('Replication.IsServer()','server').replace('Replication.BumpMe()','Bump()')
s=s.replace('ERR_Phase.DEFEAT','5').replace('ERR_Phase.PRISON','1').replace('ERR_Phase.RADIO_SEARCH','2').replace('ERR_MissionRules.Terminal(m_Phase)','(m_Phase>=5)')
s=s.replace('array<int> connected = {};','std::vector<int> connected;').replace('foreach (int id : connected)','for (int id : connected)')
@@ -14,7 +16,7 @@ def cpp(s):
s=s.replace('foreach (IEntity entity : m_OwnedEntities)','for (Entity* entity : m_OwnedEntities)')
s=s.replace('SCR_AIGroup.Cast(entity)','(entity && entity->group)').replace('ERR_Actors.DeleteSpawned(entity)','Delete(entity)')
s=s.replace('ERR_ObserverReason.NONE','0')
for var in ('m_Extraction','m_RadioDefence','m_Recovery','m_Command','m_Roster','controller','GetWorld()','GetGame()','GetPlayerManager()','GetCallqueue()'):
for var in ('m_Performance','m_Extraction','m_RadioDefence','m_Recovery','m_Command','m_CivilianTraffic','m_Roster','controller','GetWorld()','GetGame()','GetPlayerManager()','GetCallqueue()'):
s=s.replace(var+'.',var+'->')
for name in ('StartScenario','ServerTick','BindLocalObserver'):s=s.replace('Remove('+name+')','Remove("'+name+'")')
return s
@@ -24,6 +26,7 @@ run(r'''
#include <functional>
#include <string>
#include <vector>
template<class... T>void PrintFormat(std::string,T...){}
bool server=true;int bumps=0;void Bump(){bumps++;}
std::vector<std::string> events;
struct World {float now=1234;float GetWorldTime(){return now;}}world;
@@ -50,19 +53,24 @@ struct Retained : Command {
void Stop() override {stops++;pending=false;events.push_back("stop");}
};
struct ForceBoundary {int clears=0;void Clear(){clears++;}};
namespace System {int GetTickCount(){return 0;}}
namespace ERR_PerfMetric {enum {MAINTENANCE,CIVILIANS,FORCES,OBSERVERS,HQ_TICK,LISTENERS};}
struct Performance {int Mark(int,int stamp){return stamp;}void Stop(int){}};
struct Mode {
Performance* m_Performance=nullptr;
int viewStops=0;void StopLocalViewDistance(){viewStops++;}
ForceBoundary m_Forces,m_ForceAgents;
int forceTicks=0;void TickForces(float){forceTicks++;}
bool m_Stopped=false,m_NativeEndHandled=false,m_StartedPlayers=false;int m_Phase=2;
float m_NoSurvivorsSince=-1;std::string m_EndReason;
Work extraction{0,"extraction",{}},radio{0,"radio",{}},recovery{0,"recovery",{}};
Work* m_Extraction=&extraction;Work* m_RadioDefence=&radio;Work* m_Recovery=&recovery;
Command* m_Command=nullptr;Roster* m_Roster=&roster;
Command* m_Command=nullptr;Work* m_CivilianTraffic=nullptr;Roster* m_Roster=&roster;
Hook m_OnTick{0,{},"event"},m_OnStop{0,{},"onstop"};std::vector<Entity*> m_OwnedEntities;
bool InitialAdmissionsExhausted(){return false;}
World* GetWorld(){return &world;}bool RefreshRadioFeedback(){return false;}
void Transition(int phase){m_Phase=phase;StopServices();}
'''+cpp(body(MODE,'bool Active('))+cpp(body(MODE,'protected void ServerTick('))+cpp(body(MODE,'protected void StopServices('))+r'''
'''+cpp(body(MODE,'bool Active('))+cpp(body(MODE,'protected void ServerTickMeasured('))+cpp(body(MODE,'protected void StopServices('))+r'''
};
void reset(){server=true;events.clear();world.now=1234;players.count=0;players.controller=Controller();queue.removed.clear();roster.survivor=true;deleted=0;}
int main(){
@@ -103,7 +111,7 @@ int main(){
// Stop removes the existing callback before the command receives terminal Stop;
// no maintenance drain loop or new scheduling has been introduced in Core.
{reset();Mode m;Retained c;m.m_Command=&c;Entity group{true},other{false};m.m_OwnedEntities={&group,&other};
m.StopServices();m.StopServices();m.ServerTick();assert(c.stops==1&&c.maintenance==0&&!c.pending&&deleted==1&&m.m_Forces.clears==1&&m.m_ForceAgents.clears==1&&m.forceTicks==0);
m.StopServices();m.StopServices();m.ServerTick();assert(m.viewStops==1&&c.stops==1&&c.maintenance==0&&!c.pending&&deleted==1&&m.m_Forces.clears==1&&m.m_ForceAgents.clears==1&&m.forceTicks==0);
assert((queue.removed==std::vector<std::string>{"StartScenario","ServerTick","BindLocalObserver"}));
assert((events==std::vector<std::string>{"stop","onstop"}));}
}