Godot Horror Pacing
From godot-game-skills by @themarco · View on GitHub
Coordinate Godot 4 horror encounters, ambient events and scripted presentations with shared priorities, recovery and witnessed-event tracking. Use when beats overlap, starve one another, or consume cooldowns before the player sees them.
This skill ships inside the godot-game-skills package. Install the package to get this skill plus everything else in the bundle.
sv install themarco/godot-game-skillsGodot Horror Pacing
Coordinate scare and atmosphere systems (hostiles, blackouts, visual beats, whispers, ambient stingers) so unrelated beats never talk over each other and the player gets a breath after major danger. Use when adding or tuning a horror beat — not for general game feel or difficulty balance.
Workflow
- Keep behavior in the owning system. Each horror system owns its
geometry, probability, and presentation. The pacing authority only answers "may this start now?" and tracks active leases plus recovery time.
- Arbitrate starts, not content. Offer
try_start_*style gates per beat
category; a denied start is a normal outcome the owner handles (retry later, stay dormant), never an error.
- Hold scripted presentations. A tape, card, or arrival sequence owns the
mix according to the game's rules. Define which leases pause, cancel or continue, and what happens to active threats. Release the hold on completion, interruption and teardown; quiet starts must respect the chosen ownership.
- Recover proportionally. After a beat ends, block fresh optional beats
for a recovery window. Major danger earns a longer breath than a whisper; tune each window to your game's rhythm.
- Spend sightings only on witnessed beats. Count a beat as "seen" only
when its legible motion is actually visible to the player. Unseen, cancelled, or interrupted preparations should not consume a successful-sighting quota. Keep attempt throttling separate so short retries cannot run unbounded.
- Seed randomness per system. Each director uses its own seeded RNG so
pacing stays reproducible and one system never drains another's stream. World-generation randomness is separate.
For authority shape, hold/recovery patterns, and deterministic clock testing, read references/pacing_patterns.md.
Adaptation criteria
Recovery lengths, cooldowns, reveal quotas, and which beats outrank others are your game's horror rules — derive them from playtesting your own mix, not from another project's constants. A slow-burn exploration game and a chase-heavy game need different windows.
Safety and player agency
Eligibility gates may delay any beat; the pacing layer must never force an event the safety check rejects (unsafe geometry, mid-interaction, paused or menu states). For discovery-driven events, combine timing with where the player walks and looks. Authored deadlines and unavoidable events remain design choices.
Common failures
- Recovery applied on denied starts, starving the mix after nothing happened.
- A cancelled preparation consuming a reveal quota or long cooldown.
- Shared-global RNG making beats irreproducible and order-dependent.
- Scripted holds that forget to release, silencing the game indefinitely.
- New beat added without routing its start through the authority.
Verification
- A deterministic clock test (advance fixed timesteps, assert gate outcomes)
proves arbitration logic headlessly. It proves nothing about fear, timing feel, or visibility — those need ordinary play sessions.
- Playtest with the authority disabled versus enabled: denial paths, hold
entry/exit, and the first minute of a floor (arrival grace vs. early beats).
Example invocations
- "Use $godot-horror-pacing to add a ceiling-drip ambient beat that yields to
hostiles and blackouts."
- "Use $godot-horror-pacing to check why scripted tapes keep getting talked
over by whisper stingers."