Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
56 lines
3.3 KiB
C
56 lines
3.3 KiB
C
modded class ArmaReforgerScripted
|
|
{
|
|
protected bool m_ERRSawBootstrap;
|
|
protected bool m_ERRFinished;
|
|
protected int m_ERRInitialCount;
|
|
protected int m_ERRFailures;
|
|
protected void ERR_Check(bool pass, string label)
|
|
{
|
|
if (pass) Print("ERR SITES PASS: " + label);
|
|
else { m_ERRFailures++; Print("ERR SITES FAIL: " + label); }
|
|
}
|
|
override void OnUpdate(BaseWorld world, float timeslice)
|
|
{
|
|
super.OnUpdate(world, timeslice);
|
|
ERR_GameMode mode = ERR_GameMode.Get();
|
|
if (m_ERRFinished || !mode || !mode.Active() || !mode.Sites()) return;
|
|
if (!m_ERRSawBootstrap)
|
|
{
|
|
m_ERRSawBootstrap = true;
|
|
m_ERRInitialCount = mode.Sites().Count();
|
|
ref ERR_ScenarioDefinition maximum = ERR_ScenarioDefinition.Cast(SCR_BaseContainerTools.CreateInstanceFromPrefab("{BC310DC0CD27F523}Configs/ERR/EveronSites.conf"));
|
|
ERR_Check(maximum.ConfigurePopulation("{BC310DC0CD27F523}Configs/ERR/EveronSites.conf", 16, 8) && maximum.Sites.Count() == 32, "maximum menu counts produce a valid 32-site mission");
|
|
ERR_Check(maximum.ConfigurePopulation("{BC310DC0CD27F523}Configs/ERR/EveronSites.conf", 1, 1) && maximum.Sites.Count() == 10, "minimum counts preserve required objectives and independent clues");
|
|
ERR_Check(m_ERRInitialCount == 2, "active mission with only prison and extraction ready");
|
|
ERR_Check(mode.WorldPreparing(), "background still pending after spawn admission");
|
|
ERR_Check(mode.Sites().Find("everon-prison-1") != null, "real prison retained");
|
|
// Simulate an early prison exit, exercising reveal catch-up on late sites.
|
|
ERR_Check(mode.Transition(ERR_Phase.RADIO_SEARCH), "early escape while world generation continues");
|
|
}
|
|
if (mode.WorldPreparing()) return;
|
|
ERR_Check(mode.Sites().Count() == 26, "late sites adopted into live mission");
|
|
array<ERR_LocationComponent> locations = {}; mode.Locations(locations);
|
|
ERR_Check(locations.Count() == mode.Sites().Count(), "only committed locations registered, no duplicates");
|
|
int camps, hospitals, fixedGuards, mobileGuards;
|
|
bool radio, revealed = true, registered = true;
|
|
for (int i = 0; i < mode.Sites().Count(); i++)
|
|
{
|
|
ERR_SiteRuntime site = mode.Sites().At(i);
|
|
if (site.Definition.Kind == ERR_LocationKind.OUTPOST || site.Definition.Kind == ERR_LocationKind.HOSPITAL)
|
|
{ fixedGuards += site.InitialGuardCount; if (site.Responders) mobileGuards += site.Responders.InitialGuardCount; }
|
|
if (site.Definition.Kind == ERR_LocationKind.OUTPOST) camps++;
|
|
if (site.Definition.Kind == ERR_LocationKind.HOSPITAL) hospitals++;
|
|
if (site.Definition.Kind == ERR_LocationKind.RADIO) radio = true;
|
|
if (!site.Location || !site.Location.Prepared() || !mode.HasLocation(site.Location)) registered = false;
|
|
if (site.Definition.RevealOnEscape && site.Location.Knowledge() != 2) revealed = false;
|
|
}
|
|
ERR_Check(fixedGuards == 32 && mobileGuards == 16, "larger site count retains the original physical guard budget");
|
|
ERR_Check(camps == 12 && hospitals == 6, "default requested camps and hospitals physically committed");
|
|
ERR_Check(radio && registered, "required radio and late locations ready");
|
|
ERR_Check(revealed, "late reveal-on-escape sites caught up to current phase");
|
|
ERR_Check(mode.Active(), "mission remains active on an empty server");
|
|
m_ERRFinished = true;
|
|
PrintFormat("ERR SITES COMPLETE failures=%1 sites=%2", m_ERRFailures, mode.Sites().Count());
|
|
}
|
|
}
|