Developer · scripting and raw resources
Use it, bend it, understand it
This role is about consuming the addon: public functions, mission-facing state, assets you can reuse, and — when you choose — the internals that explain why a system behaves the way it does.
This role is about using the addon: calling its functions, reading and writing its state, and repurposing its models, icons, music, overlays and lore. You do not need to modify the PBO. When you do want to go deeper, every system's internals are documented with the exact functions, keys and ownership rules.
Two things you get from outside this suite.
Zombies come from the WebKnight (WBK) Zombies addon — FF Horror only spawns, scores and directs them.
ACE and CBA are hard dependencies. Anything that reads FFATM_fnc_zombieProfile, a horde pool or
the AI-balancing scope is talking about WBK classes.
1. Namespaces and naming
Each component compiles its own functions with CBA macros. A function's name tells you where it lives and where the implementation is.
| Component | Namespace | Example |
|---|---|---|
| Core | FF_core_fnc_* | FF_core_fnc_isCuratorRequest ? shared curator guard |
| Utils | FF_utils_fnc_* | FF_utils_fnc_wardrobeOpen |
| Cinematic | FF_cinematic_fnc_* | FF_cinematic_fnc_cameraPath |
| CBRN | FF_cbrn_fnc_* | FF_cbrn_fnc_cbrnGetDanger |
| Zeus | FF_zeus_fnc_* | FF_zeus_fnc_registerZeusFooterStatus |
| Horror | FF_horror_fnc_*, plus the FFATM_, FFPP_ and FFSC_ system namespaces | FF_horror_fnc_flyingSpawn |
Horror also exposes alias functions under its own prefix. They take the same arguments and return the same values as the implementation owned by the feature component, so either name is safe to call. The component-prefixed name is the recommended one because it says where the code lives.
Function aliases: Aliases and naming.
2. How to call a function
Functions are compiled globals. Call them normally; no CfgFunctions namespace is involved.
// no arguments
private _config = call FF_cbrn_fnc_cbrnGetConfig;
// arguments array
[player] call FF_cbrn_fnc_cbrnGetDanger;
// return values are documented per function; many return a boolean or a hash map
private _ok = ["server", createHashMapFromArray [["enabled", true]]]
call FF_utils_fnc_persistenceStart;
Suspending functions must be spawned. wardrobeOpen sleeps during the blackout and needs
spawn. Anything documented as returning "immediately" must not be called from a suspended context that
expects synchronous results, and providers that must not suspend (CBRN dangerProvider,
safePredicate, footer callbacks) must return without sleep or waitUntil.
3. Where code runs
| System | Authority | Practical rule |
|---|---|---|
| Soul respawn | Local player | Never remote-exec the sequence; the template hooks run locally by design. |
| Shield capsule | Server | Consumption is server-validated; call the request event, not the consumer. |
| CBRN | Each client | Start it per machine; there is no server hazard state to query. |
| Circuits | Server | Client builds the action, server re-checks before writing state. |
| Faulty optics | Unit owner | Loadout rewrites happen where the unit is local. |
| Wardrobe | Client + server policy | Policy is published by the server; the arsenal is built locally. |
| Flying spawn / hordes | Server | A client call is sent to the server; the local call returns an empty result. |
| Skulls | Server state, client rendering | Commands go to the server; visuals are local. |
| Atmosphere | Server mood | Clients report and play; never set the mood locally. |
| Scares | Server controller | Audience and lifecycle live on the server; visuals are local. |
| AI balancing | Server | Only runs in multiplayer and only when enabled. |
| Persistence | Server snapshots, client apply | Start both roles; never apply a plan manually. |
| Zeus footer | Owning machine | Register server values on the server, local values on the client. |
4. Recipes
Teleport a player into the wardrobe
[[8531.37, 4342.85, 0.148003]] spawn FF_utils_fnc_wardrobeOpen;
[getMarkerPos "locker_room"] spawn FF_utils_fnc_wardrobeOpen;
Curate the arsenal for one mission
[createHashMapFromArray [
["arsenalMode", "custom"],
["arsenalItems", ["arifle_MX_F", "30Rnd_65x39_caseless_mag"]],
["preserveLoadout", "once"],
["selfAction", true]
]] call FF_utils_fnc_wardrobeSetConfig;
Danger from a mission variable
FF_cbrn_config = createHashMapFromArray [
["enabled", true],
["dangerProvider", {
params ["_unit", "_cfg"];
_unit distance2D (getMarkerPos "reactor") < 120
}]
];
[] call FF_cbrn_fnc_cbrnRefresh;
A provider returning a boolean is rejected; return a number.
Night-vision blackout at a story beat
// action 0 = once, 0 = players, NVGs only, 2 s interval
[0, 0, [], true, false, false, 2] call FF_utils_fnc_faultyVision;
Pulse on a generator
private _id = [generator, createHashMapFromArray [
["radius", 100], ["speed", 80], ["count", 0], ["pause", 4],
["debris", 0.5], ["blur", 0.5], ["shake", 1], ["light", 2]
]] call FF_cinematic_fnc_gravityPulse;
["stop", _id] call FF_cinematic_fnc_gravityPulse;
Blackout for a night scene
// safe circles stay lit: [[positionATL, radius], ...]
private _r = [[[[getPosATL base, 400]]]] call FF_utils_fnc_blackout;
Curator-authorized loadout save
[player, "save", _target] remoteExecCall
["FF_utils_fnc_loadoutRecoveryRequest", 2];
One camera shot from script
[[
[getPosASL camBase, [0, 20, 0], [0.75, 1]],
[getPosASL camTarget, [90, 10, 0], [0.6, 1]]
], 8, true] call FF_cinematic_fnc_cameraPath;
[false] call FF_cinematic_fnc_cameraPath; // release
Animate an existing unit into the scene
[_unit, getPosASL _unit] call FF_horror_fnc_flyingSpawn;
["O_Soldier_F", AGLToASL [1000,1000,0]] call FF_horror_fnc_flyingSpawn;
Destination arrays are ASL. The first form preserves identity, group and loadout.
Freeze a skull for screenshots
missionNamespace setVariable ["FF_horror_skullFrozen", true, true];
// then false to resume
Claim the music channel
// local client, before your own track
["briefing", true, true] call FF_cinematic_fnc_musicHold;
playMusic "myBriefingTrack";
// after your track
["briefing", false] call FF_cinematic_fnc_musicHold;
Leaves the native follower with nothing to fight over and restores its own timeline afterwards.
Automate one UAV
[_uav, createHashMapFromArray [["watch", true]]]
call FF_utils_fnc_droneRegister;
[_uav, "patrol", []] call FF_utils_fnc_droneAssign;
Server only. Status is public; the airframe keeps working through JIP.
Gate a service on real power
["station", _terminal, createHashMapFromArray [
["power", {["campPower"] call FF_utils_fnc_powerHasSupply}]
]] call FF_utils_fnc_terminalRegister;
The predicate is re-checked server-side on every operation, never trusted from a client snapshot.
5. Raw resources
Everything the PBOs ship is addressable from a mission. Prefixes are stable.
| Resource | Path / class | Notes |
|---|---|---|
| Item classes | FF_Horror_* in CfgMagazines | 36 in Utils, 4 in CBRN, 13 in Horror. Same namespace across components. |
| Editor pickups | FF_Horror_Item_* in CfgVehicles | Placing one grants the matching magazine through TransportItems. |
| Lore library | x\FF\addons\horror\media\lore\images, ...\textures | Inspectable pages, posters and equipment sheets. |
| Ghost texture | x\FF\addons\horror\media\ghost\ghost3.paa | Billboard plus jumpscare picture; override per module. |
| Music | FFATM_* CfgMusic classes | 15 mood/event/boss tracks with measured durations. |
| Overlay frames | media\overlays\tendrils, media\overlays\noise | 50 tendril frames, 6 noise frames, played by FF_horror_fnc_overlay. |
| Positional scare audio | media\sounds\scare3d\ | Mono copies used by FFSC_fnc_audio. |
| Item models | x\FF\addons\horror\items\*.p3d | Mounted by the asset PBOs; icons live in items\icons. |
| Zeus UI | x\FF\addons\zeus_suite\ui\volunteer\*.html | Local browser panels used by the volunteer service. |
| Ready room page | x\FF\addons\utils\ui\ready_room\panel.html | Self-contained EN/CZ assembly browser; generated from the native template at build time. |
| Solar panel | x\FF\addons\utils\ui\solar\panel.html | Commissioning interface with embedded style, script and labels. |
| Drone cues | FF_Utils_DroneThreat, FF_Utils_DroneActivate | CfgSounds classes; override per UAV with threatSound / activationSound. |
| Spectator UI | x\FF\addons\spectator\ui_defines.hpp, stringtable.xml | Panel layout ids and the localized mode/overlay labels. |
// reuse a lore image on your own object
[_poster, "equipment_sheet_01.paa", 0,
"\x\FF\addons\horror\media\lore\images\"] call FF_utils_fnc_initDocument;
// play a bundled track
playMusic "FFATM_tension2";
6. State you can read
Missions can inspect these without calling internal functions. Treat them as read-only unless a section says otherwise.
| Key | Where | Meaning |
|---|---|---|
FF_horror_state | local (dead player) | Active soul state; nil while alive. |
FF_horror_cbrnActive | local | CBRN simulation running on this machine. |
FF_horror_cbrnExposure | unit variable | Accumulated exposure against damageThreshold. |
FF_horror_cbrnMinutes | backpack variable | Remaining air or cartridge minutes; write to refill. |
FF_horror_cbrnZones | per client / broadcast | Extra runtime zones. |
FF_horror_spawnPending | unit variable | Unit is in flight; integration hint for other zombie scripts. |
FF_horror_aiBalanceExclude | group/unit variable | Opt out of balancing; safe to write. |
FFPP_enabled, FFPP_epoch | server | Recovery state and staleness guard. |
FFATM_* | server / local | Atmosphere mood, tracks and reports. |
FFSC_overlayIntensity | local | 0..1 scare stress; other systems may read it. |
FF_Overlay1_fade / FF_Overlay2_fade | local | Shared overlay inputs, 1 = hidden. |
FF_utils_droneRegistered, FF_utils_droneStatus | vehicle + broadcast | UAV registration and [mode, watch, contactHold, operatorName, routeIndex, routeCount, contacts, availability, radius]. |
FF_utils_readyRoomState | server | Live room phase, epoch and frozen release decision. |
FF_utils_powerSites, FF_utils_powerState | broadcast / object | Site metadata and [generation, inputPresent, [lever, charge, trip, connected]]. |
FF_utils_solarSites, FF_utils_solarState | broadcast / object | Console metadata and the public challenge with its matrix. |
FF_utils_terminalState | object | [revision, generation, phase, powered, serviceValues]. |
FF_cinematic_musicDirectorStates | broadcast | Per-director descriptor, selected key, source and revision. |
FF_spectator_config | server | Viewer slots, controller policy, admin UIDs and allowCode. |
7. Extend without forking
- Callbacks — soul events, CBRN danger/protection changes, wardrobe item filters and entry checks.
- Providers —
dangerProvider,safePredicate,fogTopProviderreplace logic instead of overriding results. - Class arrays — masks, suits, backpacks, detectors and respawn destinations are configuration, not code.
- Footer registry — publish mission state to Zeus without touching the footer code.
- Policy maps — wardrobe and CBRN policies are hash maps, so a mission can express its rules as data.
- Service callbacks —
onSupply(power),onSolved(solar),onExportandonService(terminals),onStatusandaccess(UAVs),onRelease(ready room). Each receives plain values and runs on the server that owns the state. - Channel holds —
FF_cinematic_musicHoldlets any system take the music channel without patching the follower, and release it again when its own cue ends.
8. Go deeper
Each internals page documents the participants, the state machine, the exact keys and the failure paths, so you can reason about behaviour before you change it.
Soul pipeline
Template, wake, shield, orb, arrival, recovery.
CBRN tick
Danger sources, protection modes, medical effects.
Spawn scheduler
Jobs, hordes, terrain checks, capacity.
Skull actors
Anchor, motion modes, local proxies.
Circuit graph
Directional IDs and server revalidation.
Wardrobe policy
Merge order, arsenal build, restore.
Atmosphere
Reports, threat score, shared playback.
Scare entity
Gaze, teleport, rush, cleanup.
Persistence
Snapshots, epochs, restore plans.
Faulty optics
Loadout conversion and policy ownership.
AI balancing
Group discovery, weights, exclusions.
Zeus layer
Footer registry, FPS, volunteer sessions.
UAV automation
Registration, assignments, watch, live feeds.
Ready room
Records, privacy, votes, release handoff.
Weapon faults
Timed repair reservations and pulses.
Transfer power
Charge window, trips, supply edges.
Solar commissioning
XOR parity, flags, dials, dwell.
Terminals
Phases, credentials, exports, channels.
Music and overlays
Follower, holds, fades, frames.
Music director
Catalogues, priority, timed overrides.
Spectator
Presets, commands, radios, UI layers.