FF SUITEArma 3 addons

Mission maker · chapter 02 of 06

Player loop / Soul, gear, puzzles, CBRN, field tools

Everything that happens to a player from the first breath to the last clue: respawn, wardrobe, keys, circuit puzzles, hazard exposure and field utilities.

5 sections 02 / 06 Mission maker chapter

Soul respawn

The template is FF_Horror_Soul. It is inactive until the mission lists it in description.ext.

respawn = "INSTANT";
respawnDelay = -1;
respawnOnStart = -1;
respawnTemplates[] = {"FF_Horror_Soul"};

Remove any old onPlayerKilled.sqf / onPlayerRespawn.sqf that also controls death. Two systems writing the same unit is the most common cause of a soul that never finishes.

What players experience

  1. An orbiting camera without cinematic borders. Space resists, but the bar cannot pass 30% until a shield is applied.
  2. Another living player applies a soul shield capsule through ACE interaction on the corpse.
  3. The camera keeps orbiting while the orb rises, then a white fade hands control over.
  4. The orb must move away from its start, then reach an eligible object. Arrival plays a short scene and respawns the player beside it.
  5. There is no automatic timeout. Zeus Soul tools can recover a genuinely stuck player.

Mission overrides

FF_horror_config = createHashMapFromArray [
    ["respawnClasses", ["Land_Calvary_01_V1_F", "Land_Bozi_muka"]],
    ["searchRadius", 700],
    ["wakeKey", 57],
    ["firstDeathMusic", "MyFirstDeathTrack"],
    ["soulMusic", "MySoulTrack"],
    ["onFirstDeath", { params ["_body", "_cfg"]; /* scene */ }],
    ["onDestination", { params ["_dest", "_pos", "_cfg"]; }],
    ["onRespawn", { params ["_new", "_old", "_pos", "_cfg"]; }]
];

Every key is validated before use; invalid values fall back to defaults instead of breaking the sequence.

Gear, clues and keys

Item classes keep their original FF_Horror_* names even though ownership moved. Utils defines the 36 clue/part/key classes, CBRN the four filter classes, Horror the 13 themed items. Editor pickups are under Props > FF: Horror in six subcategories.

_unit addMagazine "FF_Horror_CarKey_03";
if ("FF_Horror_CarKey_03" in magazines _unit) then { /* allow */ };

// any car key, without caring about the number
private _hasCarKey = ((magazines _unit) findIf {
    _x isKindOf ["FF_Horror_CarKey", configFile >> "CfgMagazines"]
}) >= 0;

Full list and copyable class names: Item catalog.

Wardrobe

Place Wardrobe settings once to publish a policy, then use Wardrobe access modules or the script entry point. The default destination is the player's current position, so nothing assumes a specific map location.

// trigger or module script
[[], createHashMapFromArray [["arsenalMode", "mission"]]] call FF_utils_fnc_wardrobeOpen;
// position array, or marker name
[getMarkerPos "wardrobe_spawn"] spawn FF_utils_fnc_wardrobeOpen;

Inspectable documents

[_object, "images\clue.paa"] call FF_utils_fnc_initDocument;

Puzzles with circuits

Circuit nodes replace one-off door scripts. Synchronize nodes, give each a Node ID, and list upstream IDs in the downstream node's Input node IDs. Direction comes from the IDs, so the same sync line can be reused.

  1. Producer — item in the player's inventory, item in a synchronized container, boolean/number on an object, or a mission variable.
  2. Gate — AND, OR, NOT, XOR.
  3. Consumer — ACE action on synchronized targets; on use it broadcasts a completion variable and optionally drives an animation source.
i

Circuits check conditions, they do not consume items. The server re-evaluates the circuit before writing state, so a desynced client cannot complete a puzzle it does not satisfy.

CBRN

Three ways to start, in order of precedence:

  1. Mission hash map FF_cbrn_config (falls back to FF_horror_cbrnConfig) plus a local start call.
  2. CBRN settings module (writes the CBRN configuration map).
  3. CBA setting FF_horror_cbrnEnabled.
// initPlayerLocal.sqf
FF_cbrn_config = createHashMapFromArray [
    ["enabled", true],
    ["followWorldFog", true],
    ["fogTopASL", 60]
];
[] call FF_cbrn_fnc_cbrnRefresh;

Hazard zones are hash maps. They can also be published at runtime:

FF_horror_cbrnZones = [createHashMapFromArray [
    ["center", gasTank], ["radius", 180], ["innerRadius", 30],
    ["danger", 7], ["minASL", 0], ["maxASL", 100]
]];

Full key list: Configuration reference. Mask/filter mechanics: CBRN internals.

Field utilities

Small Utils tools that need no modules. All shared-state calls are server-validated.

Blackout

private _r = [[[[1000,1000,0], 300]]] call FF_utils_fnc_blackout;
_r params ["_disabled", "_preserved"];

Disables terrain lamps outside the supplied safe circles. Zeus or server only.

Ammo provisioning

[_truck, units group player, 3] call FF_utils_fnc_prepareAmmo;

Tops a container up to a multiple of the operators' inventories. Server only.

Shared flashlights

Enable FF: Utils > Shared player flashlights so every client sees other players' beams. Off by default.

PASS beacons

Enable FF: Utils > PASS identification and casualty alarms for identification lights and automatic death/unconsciousness alarms on player bodies.

Loadout recovery

[createHashMapFromArray [["snapshotKey", "saved"]]
] call FF_utils_fnc_loadoutRecoveryStart;

Server-side snapshot that is copied to the respawned unit.

Inspectable documents

[_object, "images\clue.paa"] call FF_utils_fnc_initDocument;