Development

Development

This chapter covers build, release, and the project conventions. Testing has its own chapter.

Build

Check the project with pedantic mode:

hemtt check -p -e

Pedantic mode treats warnings as errors. Build the PBOs with:

hemtt build

Make a release with:

hemtt release

Release signs the PBOs with a per-release key and makes the bikey and zip files. No private key is required or stored.

Continuous integration

GitHub Actions runs these checks on every push:

  • hemtt check -p -e
  • hemtt build
  • The Python validators and physics tests
  • An SBOM on release tags
  • Release-drafter

The Docker test runs on demand.

Conventions

Naming

Functions use the name aee_<component>_fnc_<name>. PBOs use the name aee_<component>. Shared state uses aee_core_* mission variables.

Each function file is functions/fnc_<name>.sqf. The files are registered in XEH_PREP.hpp and compiled through CBA XEH. This is the standard ACE3/CBA pattern.

Localisation uses a per-addon stringtable.xml. Keys use the form STR_AEE_<Component>_<Key>.

Settings

AEE registers its settings at mission start with CBA_fnc_addSetting. The settings live in addons/core/initSettings.inc.sqf. All settings appear under the category “AEE Core” in the CBA settings UI. There are 26 settings.

EDEN module

The EDEN module, AEE Environment Config, is placed by mission editors. The module is global. It exposes these fields:

  • biomeOverride
  • tempOffset
  • precipBias
  • windMultiplier
  • updateInterval

Contributing

The project uses trunk-based development. All commits must be signed. A pre-commit hook runs hemtt check -p -e, ste-lint, and audit.

See CONTRIBUTING.md for the full guide.

Verify techniques against workshop source, not only the wiki

The BIS wiki is incomplete for some scripting topics. It marks the DepthOfField post-process effect as “TBD” with no parameter table, and states camSetFocus works only on camCreate cameras. Both are true of the wiki, but the first is misleading: production workshop mods use DepthOfField in the player view with ppEffectForceInNVG true.

The lesson: before declaring a rendering or scripting feature impossible, search the Steam Workshop for a mod that does it and read its source. Real implementations beat a wiki placeholder every time. TFN NVG Effects (workshop 3682613859) proved the NVG depth-of-field technique that this project now uses. KtweaK’s NVG (workshop 3711042620) shows a distance-based dynamicBlur alternative.

Technique sources referenced in this project:

Feature Workshop reference Technique
NVG depth of field TFN NVG Effects (3682613859) DepthOfField ppEffect, ppEffectForceInNVG true, ppEffectAdjust [blur, dist, 1]
Distance-aware blur KtweaK’s NVG (3711042620) dynamicBlur scaled by range factor
Thermal/CC params A3TI (2041057379) DEFAULT_TIPP_SETTINGS brightness/contrast