Skip to content

Tools And Build Workflow

rayswaynl edited this page Jun 2, 2026 · 142 revisions

Tools And Build Workflow

Page ownership: this page owns the operational LoadoutManager rules, skip-list and generated-mission status table. Full drift evidence and file-count analysis live in Deep-review findings DR-4 and DR-32; keep only the actionable build/propagation rules here.

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 in Deep-review findings DR-4 confirmed vanilla Takistan has no accidental drift outside this skip-list/blacklist and the SET_MAP rewrite. If you edit a skip-listed gameplay file, especially mission.sqm or WASP/unsort/StartVeh.sqf, hand-mirror it instead of assuming dotnet run will propagate it.

Modded missions are not maintained by the current dotnet run path. The modded-terrain propagation call is commented out at SqfFileGenerators/SqfFileGenerator.cs:132, and ZipManager.cs:10 packages only Missions plus Missions_Vanilla. Treat Modded_Missions/* as non-authoritative until the owner chooses regenerate-from-source or maintained-fork policy; see DR-32 for the full tier analysis.

Generated Mission Status Table

This is the operational summary of DR-32's three maintenance tiers. Use it 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