# ordnance
One-paragraph description of what this module provides and who consumes
it.
## Exports
- `M.exampleFn(arg) -> result` — what it does and when to call it.
- `M.exampleValue: type` — what value it carries.
## Usage
```luau
local M = require("@<youridentity>::modules.ordnance")
M.exampleFn("foo")
```
## Notes
- Anything callers need to know about THIS module: required runtime
ordering, state ownership, side effects.
# film
One-paragraph description of what this module provides and who consumes
it.
## Exports
- `M.exampleFn(arg) -> result` — what it does and when to call it.
- `M.exampleValue: type` — what value it carries.
## Usage
```luau
local M = require("@<youridentity>::modules.film")
M.exampleFn("foo")
```
## Notes
- Anything callers need to know about THIS module: required runtime
ordering, state ownership, side effects.
# ridge
Saddle 3400 — the place *Fire For Effect* happens on. The snow col the battery
is dug into, its two rock horns, the cloud deck 140 m below that fills the
valley and reads as ground, the pour that comes over the col's west lip, the
emplacements, the ammunition dump, the spotting mast, and the valley floor at
y = -900 with the scree fan the rounds land on.
Serves shots 1, 2, 8, 12, 14 and 16, and the ground under 6 and 7.
## Exports
- `M.build(root)` — called by `FilmDirector`. Re-entrant: every piece asks the
world whether its entities are still there rather than trusting a flag, and
everything it makes is marked **temporary**, because all of it is rebuilt on
the next load and none of it belongs in the saved scene.
- `M.tick(t, dt)` — film seconds, fixed 1/24. Also pumps the massif and the
deck a few patches a frame until they stand.
- `M.reset()` — on `Film.restart()`.
- `M.groundHeightAt(x, z) -> y` — the snow's world height at a point. Anything
that stands on the saddle asks this rather than guessing.
- `M.valleyHeightAt(x, z) -> y` — the same for the floor under the deck.
- `M.deck` — the tearing surface `ordnance` drives:
`tear(i, x, z, radius, heat)`, `setHoles({ {x, z, radius, heat}, ... })`,
`close(i)`, `holes()`, `setUnderglow(v)`. Up to `deck.MAX_HOLES` = 8.
- `M.setUnderfire(v)` — how much fire the cloud is catching from below; drives
the pour and the deck's general orange wash together.
- `M.setSoot(v)` — force the snow's soot instead of letting it ride `Film.ruin`.
- `M.mast()` / `M.dump()` — the spotting mast and the ammunition dump, by ref.
- `M.ground` / `M.pour` / `M.works` — the submodules, for anything finer.
## Usage
```luau
local Ridge = require("ffe.ridge")
Ridge.deck.tear(1, -1750, 120, 90, 1.4) -- open a hole in the sky-floor
Ridge.setUnderfire(0.8) -- and light the cloud from under it
local y = Ridge.groundHeightAt(-4, -22.5) -- where the snow is under Gun One
```
## Notes
- Everything this slice owns also stands on a **`ridge` render layer** beside
`default`, so `capture { renderLayers = "ridge sky" }` shows the place on its
own while three other agents fire effects through the same frame.
- The massif is one height function sampled into meshes. It is meshed a few
patches a frame from `tick`, not from a spawned task: a task started inside a
component's update is bound to that call's script context and is cancelled
when the call returns.
- The deck's churn rides the ENGINE clock (`uniforms.time`) because a vertex
stage cannot read per-instance data; everything else in the slice — the pour,
the plumes, the tarp, the mast, the racks — is a pure function of film time.