Decouple systems through events, not direct references
GDC-L1-ARCH-000301
Statement
Let systems communicate by broadcasting events through a mediator, rather than holding direct references to one another. A sender announces "this happened" without knowing who listens; listeners subscribe without knowing who sent it. This keeps systems independent — new listeners can be added without touching the sender.
02
Rationale
Direct references make systems mutually dependent: the combat system calling the audio system, the UI, the achievement tracker, and the particle system directly becomes a knot where nothing can change in isolation [S-nystrom-gpp]. An event/observer boundary cuts the knot — the combat system fires "enemy died" and is done; any number of systems react, each ignorant of the others. An event queue goes further, decoupling when a message is sent from when it's processed, which smooths frame spikes and ordering. This is the architecture that lets a system like a behavior-observing skill engine watch everything the player does without every other system having to know it exists.
03
Applies when
Cross-cutting reactions to game events (audio, UI, VFX, analytics, progression), and any system that must observe many others without coupling to them.
04
Does not apply / Exceptions
Events are not free. Indirection makes control flow harder to trace, hides ordering dependencies, and — overused — produces "event spaghetti" where no one can tell what happens when. For tight, direct, one-to-one relationships a plain function call is clearer and more debuggable than an event. Use events to decouple across system boundaries; don't event-ify everything inside a system.
05
Implementation
Define a clear, typed event vocabulary (a fixed set of well-named events beats ad-hoc strings). Fire events at meaningful moments; let systems subscribe. Consider an event queue when timing/ordering or frame-spikes matter. Guard debuggability: log/inspect the event stream, and keep the vocabulary small and documented (this is where ARCH meets SYS-0006, legibility — events can hurt traceability, so invest in tooling that restores it).
06
Disagreement
Event-driven decoupling vs. direct calls is a real tradeoff: decoupling and extensibility vs. traceability and simplicity. The synthesis: use events at seams where decoupling pays (many independent reactors, or a system that must not know its observers), and direct calls where the relationship is tight and clarity matters more than flexibility.
07
Notes
Confidence 4.
↔
Connected principles
S