Skip to content

Tools And Build Workflow

rayswaynl edited this page Jun 2, 2026 · 142 revisions

Tools And Build Workflow

LoadoutManager

Tools/LoadoutManager is a .NET 8 executable. Program.cs calls SqfFileGenerator.GenerateCommonBalanceInitAndTheEasaFileForEachTerrain().

Responsibilities:

  • generate common balance/EASA SQF files for terrains;
  • copy source mission files from Chernarus to vanilla/modded target missions;
  • adjust terrain-specific map parameters such as Takistan SET_MAP;
  • optionally package missions with 7-Zip.

The generated aircraft loadout and balance pipeline is mapped in Gear, loadout and EASA atlas. In short: change aircraft loadouts in Tools/LoadoutManager/Data/Vehicles/Aircrafts/**, then inspect generated Client/Module/EASA/EASA_Init.sqf and Common/Functions/Common_BalanceInit.sqf.

Build configurations:

  • DEBUG
  • SERVER_DEBUG
  • RELEASE
  • AIRWAR_DEBUG
  • AIRWAR_SERVER_DEBUG
  • AIRWAR_RELEASE

Repo instruction: after mission edits, run from Tools/LoadoutManager with dotnet run. If .NET SDK is missing, stop and tell the user. In the current code path, generation/copy work runs before packaging, but dotnet run always reaches ZipManager.DoZipOperations(). If 7za is missing, the run can still have produced useful copied/generated files before the final packaging failure.

Local workspace warning: FileManager.FindA2WaspWarfareDirectory searches ancestors for a folder literally named a2waspwarfare and throws if it cannot find one. This Codex checkout is under work\a, so dotnet run is not runnable here without using a correctly named checkout/worktree or changing that lookup.

Operator Checklist

Before running tooling or deployment-adjacent pieces, check these first:

Item Why it matters
Checkout path contains an ancestor folder named a2waspwarfare. LoadoutManager searches for that exact folder name and throws in short aliases such as work\a.
7za is configured and available if packaging is required. Generation/copy may succeed before the final packaging step fails. Missing 7za is packaging-only unless you need _MISSIONS.7z.
version.sqf exists for the mission being packed/tested. It is generated and git-ignored, but included by description.ext and initJIPCompatible.sqf.
DiscordBot has real preferences.json and token.txt outside git. Missing token/config is expected in repo and is not a mission-code failure.
AntiStack has the separate A2WaspDatabase DLL if enabled. The in-repo Extension project is a2waspwarfare_Extension / GLOBALGAMESTATS, not the AntiStack database extension.

Propagation rules & the skip-list trap (verified)

"Edit Chernarus, then run dotnet run" is correct for most files but silently incomplete for a fixed skip-list. LoadoutManager copies Chernarus → Takistan via FileManagement/FileManager.cs, which never overwrites certain files and never copies certain directories. A change made in Chernarus to any of these does not reach Takistan and must be hand-mirrored in both missions:

Not propagated (Chernarus → Takistan) Mechanism Why
mission.sqm ShouldSkipFile Map-specific editor data.
version.sqf ShouldSkipFile + git-ignored Generated per-terrain.
Client/GUI/GUI_Menu_Help.sqf skip + post-copy name patch Mission name differs per terrain.
WASP/unsort/StartVeh.sqf ShouldSkipFile Per-map starting vehicles.
texHeaders.bin, loadScreen.jpg ShouldSkipFile Binary/terrain assets.
Common/Config/Core_Artillery/* directory blacklist (co.takistan) Takistan keeps its own artillery configs.
Server/Config/* directory blacklist Map-specific server config.
Textures/* directory blacklist Per-terrain textures.
Server/Init/Init_Server.sqf copied then patched SET_MAP 1 → 2 rewrite post-copy.

A recursive diff at the current commit confirms Takistan differs from Chernarus only in exactly these files — propagation is consistent and there is no accidental drift, but the skip-list is a standing silent-divergence trap. If you edit a skip-listed gameplay file (most importantly mission.sqm and WASP/unsort/StartVeh.sqf), edit both missions. See Deep-review findings DR-4.

Modded missions are not maintained by dotnet run. The modded-terrain propagation call is commented out at SqfFileGenerators/SqfFileGenerator.cs:132, so Modded_Missions/* are far behind Chernarus (Napf/eden/lingor are ~280-350 files behind; smd_sahrani_a2/tavi/dingor/isladuala are 1-4-file stubs). Treat them as non-authoritative until that path is re-enabled and regenerated.

Generated Mission Status Table

Claude DR-32 split the campaign folders into three maintenance tiers. Use this table before assuming a fix in Chernarus reaches every mission folder.

Target Current status Development consequence
Missions/[55-2hc]warfarev2_073v48co.chernarus Source of truth. Apply gameplay and documentation evidence here first.
Missions_Vanilla/[61-2hc]warfarev2_073v48co.takistan Faithful generated/copy target. Current drift is map-config and terrain assets only; logic files are byte-identical to Chernarus outside the documented skip-list and SET_MAP patch. Source fixes should propagate through LoadoutManager, except skip-listed files that need hand-mirroring. All DR findings in Chernarus apply to vanilla Takistan unless the changed file is map-specific.
Modded_Missions/napf, Modded_Missions/eden, Modded_Missions/lingor Divergent hand-edited forks with 100+ logic-file differences, including security-sensitive runtime/PVF/victory/upgrade/HQ paths. Source fixes do not automatically reach these missions. Pick a maintenance model before shipping them: regenerate from hardened source or maintain as explicit forks with separate audits.
Modded_Missions/sahrani, Modded_Missions/dingor, Modded_Missions/tavi, Modded_Missions/isladuala Abandoned/non-runnable stubs with only a small fraction of the real mission tree. Complete or delete before presenting them as supported missions.

Tooling Project Inventory

Project Runtime Entry point Inputs Outputs / side effects Notes
Tools/LoadoutManager .NET 8 executable Program.cs -> SqfFileGenerator.GenerateCommonBalanceInitAndTheEasaFileForEachTerrain() Terrain/loadout data classes, source Chernarus mission, terrain skip lists. Generated EASA_Init.sqf, Common_BalanceInit.sqf, aircraft-name helper, per-terrain version.sqf, copied Takistan mission and _MISSIONS.7z. Requires ancestor folder named a2waspwarfare; always attempts packaging.
Tools/PerformanceAuditAnalyzer PowerShell Analyze-PerformanceAudit.ps1, GUI launcher Arma RPT lines containing [Performance Audit]. CSV, Markdown, HTML and Word-friendly performance reports. Safe read-only analyzer for logs.
DiscordBot .NET 9 executable DiscordBot/src/ProgramRuntime.cs preferences.json, token.txt, extension database.json. Discord channel name, bot presence and status embed updates every 60 seconds. Missing token/preferences are expected in repo; do not invent secrets.
Extension .NET Framework 4.8 Arma extension _RVExtension@12 export Arma callExtension arguments from mission scripts. Writes C:\a2waspwarfare\Data\database.json for DiscordBot. Uses legacy NuGet/MSBuild package layout.
Mods/mkswf_sidewinder_reload_time_fix Arma addon config CfgWeapons.hpp Sidewinder launcher class config. Sets magazineReloadTime = 1 for Sidewinder launchers. External addon fragment, not mission SQF.

PerformanceAuditAnalyzer

Tools/PerformanceAuditAnalyzer parses Arma 2 RPT lines containing [Performance Audit] and exports CSV/Markdown/HTML/Word-friendly reports.

Important outputs include:

  • performance_raw.csv
  • performance_pivot_ready.csv
  • performance_extra_fields.csv
  • performance_timeline.csv
  • performance_by_script.csv
  • performance_spikes.csv
  • performance_fps_context.csv
  • performance_by_player.csv
  • performance_by_map.csv
  • performance_by_session.csv
  • performance_report.md
  • performance_report.html

Use it after performance-sensitive mission changes or live-server audits.

Packaging And Deployment Notes

  • 7za environment variable points to 7za.exe.
  • ZipManager packages mission directories after copy/generation and currently zips only Missions plus Missions_Vanilla, not Modded_Missions.
  • Missing 7za causes the final packaging step to throw; inspect generated/copied files before assuming the whole run did nothing.
  • The source Chernarus mission is copied to target terrain folders. Avoid manual changes in generated targets unless the generator is being updated.

Development Commands

cd Tools\LoadoutManager
dotnet run
dotnet run -c SERVER_DEBUG
powershell -ExecutionPolicy Bypass -File .\Tools\PerformanceAuditAnalyzer\Analyze-PerformanceAudit.ps1 -InputPath ".\logs\arma2oa.rpt" -OutputPath ".\PerformanceAuditResults"

Continue Reading

Previous: Client UI systems atlas | Next: External integrations

Main map: Home | Fast path: Quickstart | Agent file: agent-context.json

Sidebar

Clone this wiki locally