-
Notifications
You must be signed in to change notification settings - Fork 0
Airfield Exclusive Roster And Special Unit Hints
Source-verified 2026-06-21 against master 0139a346. Paths relative to Missions/[55-2hc]warfarev2_073v48co.chernarus/ unless noted. Arma 2 OA 1.64.
When a side captures an airfield, the hangar buy menu stops showing that side's normal WFBE_<side>AIRPORTUNITS list and shows a cross-faction, airfield-exclusive aircraft roster instead. This page documents the small self-contained subsystem that drives that swap: three global lists published at boot by Init_Common.sqf (the tail of the post-load mutation layer, after the block that the Assets/Config atlas stops at), and the GUI_Menu_BuyUnits.sqf "Airport" case that consumes them. It also covers the parallel data-driven special-unit info popup table (WFBE_SPECIAL_UNIT_HINTS) that fires a hintSilent when the player selects a flagged classname.
This is distinct from the standard faction hangar list (owned by Factory and purchase systems) and from how an airfield is captured / its hangar object spawned (owned by Towns, camps and capture). This page owns only the roster-swap and hint mechanism.
These three globals are written near the very end of common initialization, just before commonInitComplete = true (Common/Init/Init_Common.sqf:419). They are plain missionNamespace-scoped globals set on every machine (no setVariable [..., true] broadcast and no server round-trip), so the buy menu can read them locally at menu-fill time. The roster block is gated on WFBE_C_AIRFIELDS > 0 (Init_Common.sqf:386); the hint table is unconditional.
| Global | Built at | Shape | Notes |
|---|---|---|---|
WFBE_AIRFIELD_UNITS |
Init_Common.sqf:387-401 |
[classname, ...] |
Generic cross-faction list shared by ALL captured airfields on BOTH sides. Map-forked on IS_chernarus_map_dependent (Init_Common.sqf:387). |
WFBE_AIRFIELD_UNITS_SPECIAL |
Init_Common.sqf:403-405 |
[[townName, [classname, ...]], ...] |
Per-airfield extras appended only at the named airfield. Resolved by town name at menu-fill time. |
WFBE_SPECIAL_UNIT_HINTS |
Init_Common.sqf:412-415 |
[[classname, stringtable-key], ...] |
Drives a selection-time info popup in the buy menu. Independent of the roster swap (applies to any unit, not just airfield ones). |
The header comment block (Init_Common.sqf:379-385) labels this "Task 12: Airfield-exclusive aircraft roster" and states the design intent: append a pair to WFBE_AIRFIELD_UNITS_SPECIAL to add a per-airfield special "no other file changes needed."
The Chernarus branch (Init_Common.sqf:387-396) publishes a five-entry list; the Takistan branch (Init_Common.sqf:397-400) publishes a two-entry list:
| Map condition |
WFBE_AIRFIELD_UNITS value |
Source |
|---|---|---|
IS_chernarus_map_dependent true |
["An2_TK_EP1","Mi17_Ins","Mi171Sh_rockets_CZ_EP1","Su25_Ins","L159_ACR"] |
Init_Common.sqf:394 |
| otherwise (Takistan) | ["An2_TK_EP1","Mi17_TK_EP1"] |
Init_Common.sqf:397 |
In-source comments (Init_Common.sqf:388-395) record the content rulings: the L-39C was removed from the generic Chernarus list and moved to a Balota-only special; the rocket-armed Mi-171Sh was added for early-game support; and a 2026-06-12 amendment added two light jets, Su25_Ins (EAST) and L159_ACR (WEST), priced between the Mi-171Sh and the cheapest factory jet. The comments also flag that Su25_Ins and L159_ACR deliberately appear in both the airfield pool and a faction factory list — confirmed at Common/Config/Core_Units/Units_CO_US.sqf:284 and :297 for L159_ACR. The cross-faction listing (Takistani/Insurgent airframes available to any captor) is called out as intentional, citing "soft-faction-walls precedent."
Mi171Sh_rockets_CZ_EP1 was explicitly relocated out of the US factory roster into this list — see the leftover marker comment at Units_CO_US.sqf:279 ("moved to WFBE_AIRFIELD_UNITS ... buy it at any captured airfield"), which sits right after the still-listed Mi171Sh_CZ_EP1 at Units_CO_US.sqf:278.
Only one special is defined in source (Init_Common.sqf:403-405):
| Town key | Appended classes | Map | Source |
|---|---|---|---|
Balota |
["L39_TK_EP1"] |
Chernarus only | Init_Common.sqf:404 |
Takistan defines no specials (empty array on that branch is implied — the whole WFBE_AIRFIELD_UNITS_SPECIAL assignment lives inside the WFBE_C_AIRFIELDS > 0 block but the literal at :403-405 is map-independent, so Takistan also gets the Balota entry; it simply never matches a Takistan town name). The comment at Init_Common.sqf:401-402 states Takistan has "no clean equivalent for L-39C."
One entry is defined (Init_Common.sqf:412-415):
| Classname | Stringtable key | Source |
|---|---|---|
Mi17_medevac_CDF |
STR_WF_HINT_SalvageHeli |
Init_Common.sqf:414 |
The key resolves at stringtable.xml:9566. A comment at Init_Common.sqf:413 records that a WEST salvage heli (UH1H_EP1) entry was removed as an invalid class on the live box, to be re-added with a validated airframe (claude-inbox#2 item 1).
The swap lives in the case 'Airport' branch of the menu's update-list switch (Client/GUI/GUI_Menu_BuyUnits.sqf:329-360). The normal path computes the nearest hangar via WFBE_CL_FNC_GetClosestAirport; the override triggers only when that hangar is a captured-airfield hangar.
| Step | Behaviour | Source |
|---|---|---|
| Detect | Trigger only if WFBE_C_AIRFIELDS > 0, the closest airport is non-null, and its wfbe_hangar object has wfbe_is_airfield_hangar == true. |
GUI_Menu_BuyUnits.sqf:334 |
| Base list |
_listUnits becomes WFBE_AIRFIELD_UNITS, OR WFBE_GUERAIRPORTUNITS when sideJoined == resistance. |
GUI_Menu_BuyUnits.sqf:335 |
| Resolve town |
_airfTownObj = [_closest, towns] Call WFBE_CO_FNC_GetClosestEntity, then read its name variable (empty string if null). |
GUI_Menu_BuyUnits.sqf:340-341 |
| Append special | Linear-scan WFBE_AIRFIELD_UNITS_SPECIAL for a (_x select 0) == _airfTownName match; if found, _listUnits = _listUnits + (entry select 1). |
GUI_Menu_BuyUnits.sqf:342-352 |
| Filter override 1 | Reset the saved faction filter to index 0 ("All") via setVariable [Format["WFBE_%1%2CURRENTFACTIONSELECTED",sideJoinedText,_type], 0] — otherwise the cross-faction rows are all dropped. |
GUI_Menu_BuyUnits.sqf:353,358 |
| Filter override 2 | Call UIFillListBuyUnits with upgrade-gate sentinel 999 instead of the real upgrade index — the capture itself is the unlock, and out-of-range is treated as "no gate." |
GUI_Menu_BuyUnits.sqf:354-357,359 |
The wfbe_is_airfield_hangar flag the detection reads is set server-side at capture time: server_town.sqf:571 tags the new hangar ["wfbe_is_airfield_hangar", true, true] (broadcast); line 572 records it as wfbe_hangar and sets wfbe_airfield_side. WFBE_C_AIRFIELDS itself defaults to 1 (Common/Init/Init_CommonConstants.sqf:598). WFBE_CO_FNC_GetClosestEntity is compiled at Init_Common.sqf:126 from Common/Functions/Common_GetClosestEntity.sqf.
The sentinel-999 pattern mirrors the unconditional GUER tab path elsewhere in the same file: the generic tab-update call at GUI_Menu_BuyUnits.sqf:308 already passes 999 when sideJoined == resistance to bypass the upgrade gate (GUER has no upgrades, only funds + time-tier gating).
WFBE_GUERAIRPORTUNITS is read at GUI_Menu_BuyUnits.sqf:335 with a default of [], but a repo-wide grep finds no setVariable/assignment for it anywhere in the source mission. Practical consequence: a resistance-side captor of an airfield gets an empty exclusive roster (plus any town special, which is also keyed off the same _listUnits and so would still append). The GUER airfield roster is therefore effectively non-functional unless populated by a generated or branch file outside this checkout. This is a real gap worth flagging before assuming GUER players can buy airfield aircraft.
GUER airfield ownership is otherwise wired: server_town.sqf:497 tags the logic with wfbe_airfield_side, and Client/Functions/Client_GetClosestAirport.sqf:14 filters so a resistance player only sees a hangar whose wfbe_airfield_side == resistance ("C-1: GUER airfield ownership gate").
On unit selection the menu runs a chain of hintSilent parseText info popups (VBIED, lift-helicopter, etc.); the data-driven special-hint lookup is the last general one (GUI_Menu_BuyUnits.sqf:623-635):
| Step | Behaviour | Source |
|---|---|---|
| Read table |
_wfbeSpecialHints = missionNamespace getVariable ["WFBE_SPECIAL_UNIT_HINTS", []]. |
GUI_Menu_BuyUnits.sqf:626 |
| Match | Linear-scan for (_x select 0) == _unit (the selected classname). |
GUI_Menu_BuyUnits.sqf:628-631 |
| Show | On match, hintSilent parseText (localize (entry select 1)). |
GUI_Menu_BuyUnits.sqf:632-635 |
So selecting Mi17_medevac_CDF anywhere in the buy menu (not only at an airfield) shows the STR_WF_HINT_SalvageHeli popup. The hint table and the roster swap are independent subsystems that happen to be initialized adjacently.
| To add | Edit | Effect |
|---|---|---|
| A new aircraft to all captured airfields | Append a classname to the relevant map branch of WFBE_AIRFIELD_UNITS (Init_Common.sqf:394/:397). |
Available at every captured airfield on that map for both sides. |
| A new per-airfield exclusive | Append [townName, [classes]] to WFBE_AIRFIELD_UNITS_SPECIAL (Init_Common.sqf:403-405). |
Town name must match the airfield's nearest-town name. |
| A new selection popup | Append [classname, "STR_WF_HINT_..."] to WFBE_SPECIAL_UNIT_HINTS (Init_Common.sqf:412-415) and add the stringtable key. |
Fires the hint whenever that class is selected in the buy menu. |
No FSM, server router, or description.ext change is needed for any of the above — the design is deliberately one-array-edit per addition.
-
Factory And Purchase Systems Atlas — the standard faction
WFBE_<side>AIRPORTUNITShangar list this roster replaces, plusUIFillListBuyUnitsand hangar purchase range. -
Towns Camps And Capture Atlas — how an airfield is captured and its
wfbe_is_airfield_hangarhangar object is spawned (server_town.sqf). -
Assets Config Localization And Parameters Atlas — the earlier
Init_Common.sqfpost-load mutation layer (pricing, currency, repair-truck aggregation) that precedes this block. - Auxiliary And Special Forces Unit Catalog — the individual airframes that populate the roster (e.g. the airfield-exclusive gunship).
- Server Init Deadspawn And Airfield Probe — airfield-logic setup at server init.
Home | Agent Guide | Current live state | Release 1.2.2 (B91) | Quickstart | Progress | Lifecycle wait-chain | Join/disconnect | Parameters/build | Assets/config | SQF atlas | PV index | Modules | Support/specials | Commander/HQ | Commander vote/reassign | Construction/CoIn | Construction cleanup | WDDM compositions | Factory/purchase | Upgrades/research | Towns/camps/capture | Victory/endgame | Markers/cleanup | Server runtime | AI runtime/HC | AI commander audit | HC delegation | Town AI safety | Commander reassignment | Resistance supply | Player UI workflow | UI atlas | Respawn/death | Gear template filter | Vehicle cargo loop | Service guards | UI IDD repair | UI design inspiration | WASP overlay | Feature status | Source propagation | release readiness | Tooling readiness | Integration trust | AntiStack DB | Owner decisions | Shelved registry | Abandoned feature revival | Hardening roadmap | PVF dispatch | Server authority | ICBM authority | Attack-wave authority | Telemetry families | AICOM V2 cutover | Consumer port map | Testing workflow | Server ops | Web tools | Ecosystem repos | Arma 2 OA refs | A2 traps | OA compatibility audit | Coverage ledger | Navigation inventory | Pruning ledger | Knowledge roadmap | Agent context | Collab protocol | Worklog | Audit archive 2026-07 | Briefing reference | Utes invasion concept
- Shelved AICOM concepts - revivable someday ideas (owner-shelved 2026-07-03)
Docs rule: source-backed claims only; Arma 2 OA scripting docs only; gameplay edits start in Missions/[55-2hc]warfarev2_073v48co.chernarus.
- Getting started
- Status and coordination
- Agent context
- Agent collaboration protocol
- Agent worklog
- Agent worklog archive
- Progress dashboard
- PR cleanup and integration lab
- Shelved PR #169: gear price double-count
- Shelved PR #194: Chernarus no-trees
- Coordination board
- Codebase coverage ledger
- Bottleneck removal queue
- Current source status
- Wiki mirror reconciliation
- Navigation inventory
- Registers
- Agent orchestration
- Architecture
- Architecture overview
- Mission entrypoints and lifecycle
- Lifecycle wait chain
- Player join/disconnect and AntiStack lifecycle
- Mission parameters/localization/build inputs
- Stringtable localization key-family catalog
- Source inventory
- Content structure and maps
- Assets/config/localization/parameters
- Mission start parameters index
- Code and networking
- Gameplay systems
- Core systems index
- Gameplay systems atlas
- Commander/HQ lifecycle atlas
- Economy, towns and supply
- Economy system reference
- Balance asymmetries
- Anti-stack skill-balance mechanic
- Empty-side supply income stagnation
- Towns, camps and capture atlas
- Victory and endgame atlas
- Victory conditions reference
- Territorial victory reference
- Marker cleanup and restoration
- Marker loop engine and registries
- Map marker families content catalog
- Marker subsystem function reference
- Client marker FSM updater map
- Support specials and tactical modules
- SCUD TEL tactical munitions
- Naval HVT objectives (carriers/SCUD)
- SCUD saturation strike mechanic
- Takistan airfield FPV drone design
- Construction and CoIn systems
- Structure damage reduction & friendly-fire
- Construction logic list cleanup
- Flak tower & WDDM anchor compositions
- Resistance supply scaffold
- GUER Insurgents faction overview
- GUER Insurgents branch audit
- GUER insurgent player economy
- GUER air-defense loop (Ka-137/Mi-24)
- Upgrades and research atlas
- Supply mission architecture
- Supply mission authority cleanup
- Current supply helicopters PR1
- Respawn and death-loop lifecycle
- Vehicle theft economy pitch
- GUER tunnel network pitch
- Content, reference and catalogs
- Faction unit/vehicle roster catalog
- Auxiliary/SF/civilian unit catalog
- Gear store loadout route catalog
- Upgrade research (cross-faction)
- Gear store price and upgrade catalog
- Gear store catalog (complete, per faction)
- Defense structures catalog
- Artillery reference per faction
- AI squad team templates catalog
- Town AI lifecycle reference
- Town AI group composition catalog
- Class-skill system reference
- Player skill abilities reference
- Default gear template content catalog
- Chernarus map content reference
- Takistan map content reference
- Takistan features
- Takistan parity reference
- Takistan oilfields objective reference
- IRS IR-smoke countermeasure
- Arty module special munitions
- Zeta cargo sling-load reference
- Spawn primitive function reference
- Kill and score pipeline
- Waypoint helper function reference
- Position and proximity function reference
- Side/team state function reference
- Player AI watchdog and recovery
- AICOM stuck-recovery v2
- LoadoutManager data-model contributor guide
- Discord status bot setup and reference
- GLOBALGAMESTATS extension reference
- New player quickstart (player guide)
- Optional client mods (player guide)
- Earning funds and score (player guide)
- Vehicle service and logistics (player guide)
- Commander's handbook (player guide)
- Tactical support menu
- Paradrop player experience
- Supply missions (player guide)
- In-game briefing & Diary field manual
- Playable maps catalog
- Faction root variables reference
- Faction base structures catalog
- Counter-battery radar system
- Bank, Reserve and Artillery Radar structures
- Map ruleset model and object config
- Countermeasures module reference
- Vehicle countermeasure (flares/spoofing)
- UAV terminal and spotter system
- Artillery firing function reference
- Service Point pricing model
- Medic redeployment truck (forward spawn)
- Side-patrol runtime and convoy mechanics
- Day/night cycle and weather system
- Config lookup helper reference
- CIPHER sort utilities reference
- Modded maps status and content
- BattlEye filter setup and OA taxonomy
- Player squad/group join protocol
- AutoFlip vehicle recovery
- Engine stealth fuel toggle
- Valhalla vehicle climbing-assist
- Missile and ordnance Fired-EH reference
- Vehicle equip and rearm reference
- Array and collection utilities
- Server composition spawner reference
- Upgrade queue server loop
- Map boundaries and off-map enforcement
- Namespace/profile/diagnostic utilities
- Group bool getVariable A2-OA trap
- Vehicle weapon balance init
- View distance auto-throttle
- Camp & respawn-camp getters
- Performance audit writer
- Site clearance (bulldozer)
- Factory queue cancel & refund
- AI commander tunable constants
- Experimental feature-flag constants
- Flag system quick reference
- Mission tunable constants catalog
- Gear parsing & cargo capacity
- Structure dressing function
- Paradrop delivery functions
- ICBM nuke client VFX & radiation
- Server HandleSpecial router
- LocalizeMessage chat router
- Gear buy-menu render & price functions
- Server broadcast & telemetry loops
- Per-unit client init pipeline
- Vehicle marking & texture pipeline
- Defense category & budget
- Legacy AI order primitives
- Commander-team driver
- AICOM command verbs
- AICOM behavior fix taxonomy
- AI commander wildcard deck reference
- AICOM aircraft and airfield system
- Static-defense manning
- End-of-game stats screen
- AI commander execution loop
- Deployable bipod / weapon resting
- Town-economy getters
- Server-init deadspawn & airfield probe
- GUER VBIED detonate action
- Resource income-tick engine
- AI commander treasury accessors
- PVF send-helper contracts
- AICOM logging & AICOMSTAT telemetry
- AICOMSTAT v2 event census
- WASPSCALE v2 telemetry
- WASPSCALE v2-ext coverage audit
- Telemetry families reference
- Group lifecycle & entity reaping
- Batch AI spawner orchestrator
- Client funds/income HUD readout
- Server group GC & cap warning
- Town runtime tuning constants
- Client input/hotkey handler
- WASP base-repair system
- WASP DropRPG launcher/ordnance
- CoIn construction-interface client engine
- Town-capture garrison & airfield rebuild
- Map-control & minimap templates
- Client FPS & state telemetry
- Client service-proximity getters
- Airfield-exclusive roster & unit hints
- Unit-camera spectator system
- Town-garrison patrol/defense worker
- RequestTeamUpdate squad-discipline
- Arma2Warfare GPT assistant
- LoadoutManager build configs & defines
- GLOBALGAMESTATS extension logging
- Discord bot instrumented logging
- Eden/Everon & Taviana map content
- Cruise missile strike asset
- AI / HC
- AI headless and performance
- AI mods and pathfinding reference
- Headless client scaling and topology
- AI runtime/HC loop map
- Headless client init and stat loop
- HC delegation target selection
- Player AI caps and role balance
- Old WarfareBE FPS comparison
- AI commander autonomy audit
- Upstream BE 2073 AICOM delta
- Parent 2.073 divergence audit
- AI commander capture & fun plan
- AI commander B69 improvement roadmap
- AI commander B69 implementation sketches
- AICOM V2 cutover status
- Headless delegation and failover
- Commander reassignment call shape
- GUER Director living-resistance pitch
- Quality and operations
- Foundation perf findings & Tier-3 dead-ends
- Dead/stale code register
- Commander vote/reassignment
- Attack-wave authority
- Server runtime and operations
- Server ops runbook
- JIP enrollment & client data delivery (b74.2 lessons)
- Server gameplay runtime atlas
- PerformanceAuditAnalyzer
- Performance opportunity sweep
- Documentation plan
- Knowledge platform roadmap
- Wiki quality audit
- Wiki pruning and relevance ledger
- Audit findings queue (2026-06-03)
- Deep review findings
- Client UI / server-loop perf findings
- Performance gain simulation
- Self-host testing field notes
- Cleanup and work lanes
- Hardening and authority
- UI / player workflows
- Client UI, HUD and menus
- UI HUD and dialogs
- Player UI workflow map
- Client UI systems atlas
- UI IDD collision repair
- UI control class library reference
- UI theme palette and style macros
- UI design inspiration 2026-07
- Available-actions client gate FSM
- Gear/loadout/EASA atlas
- Gear template profile filter
- Vehicle cargo equip loop bounds
- Factory and purchase systems atlas
- Service menu affordability guards
- WASP overlay
- Class-skill system reference
- Skin selector and class swap
- Earplugs audio toggle
- Mission audio catalog
- HQ radio knowledge-base catalog
- QoL trio player hints
- Player vehicle/travel actions
- Tooling / release / integrations
- Tools and build workflow
- Warfare web tools
- Ecosystem & companion repos
- Zargabad tooling parity
- July 2026 release readiness
- Operator monitor and CPU affinity tools
- Tooling release readiness audit
- Source fix propagation queue
- Agent release readiness ledger
- Release source intake map
- Testing/debugging/release workflow
- Current RPT release gate
- RPT telemetry consumer port map
- External integrations
- Integration trust boundary audit
- AntiStack database extension audit
- Community & Dev
- Community & Dev
- Miksuu upstream wiki import / archive index
- Upstream changelog feature leads
- Developer history and upstream lessons
- Upstream Miksuu commit intel
- Upstream mining ledger
- Archive script mining v2
- Upstream BE 2073 AICOM delta
- Parent 2.073 divergence audit
- PR8 and Drone upstream lesson match
- Development lessons learned
- External research reports
- Audit archive 2026-07
- Briefing reference
- Utes invasion concept
- Miksuu archive: Home
- Miksuu archive: Welcome
- Miksuu archive: Big announcements
- Miksuu archive: Changelog
- Miksuu archive: Development process
- Miksuu archive: Discord bot
- Miksuu archive: Gameplay videos
- Miksuu archive: LoadoutManager
- Miksuu archive: Chernarus script architecture
- Base-game visual catalogs
- Compatibility and references
- HC upstream history and lessons
- Player stats branch audit
- BuyMenu EASA QoL branch audit
- Perf quick wins branch audit
- Commander positions branch audit
- Zargabad branch audit
- Quad AI Commander concept
- Arma 2 OA external reference guide
- Base-game config & image reference
- Arma 2 OA compatibility audit
- Arma 2 OA agent traps reference
- Arma 2 OA command versions
- Wiki source consistency
- External Arma 2 OA reference index