2482 lines
85 KiB
Markdown
2482 lines
85 KiB
Markdown
|
||
# Emergent Gameplay Design: Simple Rules → Complex Outcomes
|
||
|
||
## Purpose
|
||
|
||
**This is the FOUNDATIONAL skill for the systems-as-experience skillpack.** It teaches how to design systems where simple rules create complex, surprising, player-discovered behaviors—the essence of emergent gameplay.
|
||
|
||
Every other skill in this pack applies emergence principles to specific domains (systemic level design, dynamic narratives, player-driven economies). Master this foundational skill first.
|
||
|
||
|
||
## When to Use This Skill
|
||
|
||
Use this skill when:
|
||
- Designing immersive sims (Deus Ex, Prey, Dishonored style)
|
||
- Building sandbox games with creative player expression
|
||
- Creating simulation-driven games (Dwarf Fortress, RimWorld, Minecraft)
|
||
- Designing combat/stealth/puzzle systems with multiple solutions
|
||
- Players should discover tactics rather than follow instructions
|
||
- You want replayability through emergent variety, not authored content
|
||
- Systems should interact in surprising ways
|
||
- The goal is "possibility space", not scripted experiences
|
||
|
||
**ALWAYS use this skill BEFORE implementing emergent systems.** Retrofitting emergence into scripted systems is nearly impossible.
|
||
|
||
|
||
## Core Philosophy: Emergence as Design Goal
|
||
|
||
### The Fundamental Truth
|
||
|
||
> **Emergent gameplay happens when simple orthogonal mechanics interact to create complex outcomes that surprise even the designer.**
|
||
|
||
The goal is NOT to script every player action. The goal is to create a "possibility space" where players discover their own solutions through experimentation.
|
||
|
||
### Emergence vs Scripting: The Spectrum
|
||
|
||
```
|
||
SCRIPTED HYBRID EMERGENT
|
||
│ │ │
|
||
│ Designer controls outcomes │ Designer sets boundaries │ Designer sets rules
|
||
│ Players follow intended path │ Players choose from options │ Players discover possibilities
|
||
│ Low replayability │ Medium replayability │ High replayability
|
||
│ Predictable │ Somewhat variable │ Surprising
|
||
│ High authoring cost │ Medium authoring cost │ Low authoring cost (per hour of play)
|
||
│ │ │
|
||
Examples: Examples: Examples:
|
||
- Uncharted setpieces - Breath of the Wild shrines - Minecraft redstone
|
||
- Scripted boss phases - XCOM tactical combat - Dwarf Fortress simulation
|
||
- QTE sequences - Hitman contracts - Prey Typhon powers
|
||
- Linear puzzles - Portal 2 (limited toolset) - Noita wand crafting
|
||
```
|
||
|
||
Your job is to choose where on this spectrum your design should live, and understand the tradeoffs.
|
||
|
||
|
||
## CORE CONCEPT #1: Orthogonal Mechanics (The Multiplication Principle)
|
||
|
||
### What is Orthogonality?
|
||
|
||
**Orthogonal mechanics** are mechanics that:
|
||
1. Operate on DIFFERENT dimensions of the simulation
|
||
2. Don't overlap in function
|
||
3. MULTIPLY possibilities when combined (not add them)
|
||
|
||
### Non-Orthogonal (Bad) Example
|
||
|
||
```
|
||
Mechanics:
|
||
- Fire spell (damages enemies)
|
||
- Ice spell (damages enemies)
|
||
- Lightning spell (damages enemies)
|
||
- Poison spell (damages enemies)
|
||
|
||
Problem: All four do the same thing (damage).
|
||
Possibility count: 4 (just 4 different ways to deal damage)
|
||
Result: Redundant complexity, no emergence
|
||
```
|
||
|
||
### Orthogonal (Good) Example
|
||
|
||
```
|
||
Mechanics:
|
||
- Fire: Creates persistent burning (area denial, light source, spreads)
|
||
- Ice: Changes surface friction (creates slippery surfaces, brittleness)
|
||
- Electricity: Conducts through materials (chains, disables electronics)
|
||
- Magnetism: Attracts/repels metal objects (moves objects, shields)
|
||
|
||
Why orthogonal: Each affects DIFFERENT simulation properties
|
||
Possibility count: 4! = 24 combinations (way more than 4)
|
||
Result: Combinatorial explosion of tactics
|
||
```
|
||
|
||
### The Multiplication Test
|
||
|
||
When adding a new mechanic, ask:
|
||
|
||
**"Does this mechanic create NEW interactions with existing mechanics, or does it duplicate existing interactions?"**
|
||
|
||
**Multiplication** (orthogonal):
|
||
- 3 mechanics with 5 interactions each = 15 total interactions
|
||
- Add 4th mechanic: Now 4 × 5 = 20 interactions (33% increase from 25% mechanic increase)
|
||
|
||
**Addition** (non-orthogonal):
|
||
- 3 damage types + 1 damage type = 4 damage types (linear growth)
|
||
- No new interactions, just more of the same
|
||
|
||
### Real-World Example: Breath of the Wild
|
||
|
||
**Orthogonal Mechanics**:
|
||
1. **Fire**: Burns wood, creates updrafts, melts ice, lights torches
|
||
2. **Ice**: Freezes water, creates platforms, brittleness when struck
|
||
3. **Electricity**: Conducts through metal/water, stuns enemies, magnetizes metal
|
||
4. **Wind**: Pushes objects, propels glider, affects projectiles
|
||
5. **Stasis**: Freezes object, stores kinetic energy
|
||
6. **Magnesis**: Moves metal objects
|
||
|
||
**Why it works**:
|
||
- Each mechanic affects different simulation properties
|
||
- 6 mechanics create ~30 meaningful interactions
|
||
- Players discover combinations: "Freeze enemy → strike → shatter damage bonus"
|
||
|
||
**Non-Orthogonal Anti-Pattern**:
|
||
- If BotW had "Ice Sword (freezes), Fire Sword (burns), Thunder Sword (shocks)" = 3 mechanics, 0 interactions
|
||
- Instead: Weapons can conduct elements from environment = infinite combinations
|
||
|
||
### Design Process for Orthogonality
|
||
|
||
1. **List simulation properties** (not mechanics):
|
||
- Position, velocity, friction, flammability, conductivity, brittleness, density, temperature, magnetism, opacity, etc.
|
||
|
||
2. **Design mechanics that affect DIFFERENT properties**:
|
||
- Fire mechanic → changes flammability state
|
||
- Ice mechanic → changes friction coefficient
|
||
- Electricity mechanic → uses conductivity property
|
||
- Magnet mechanic → uses magnetism property
|
||
|
||
3. **Test for overlap**:
|
||
- Do any two mechanics affect the same property in the same way?
|
||
- If yes, one is redundant or they should be combined
|
||
|
||
4. **Verify multiplication**:
|
||
- Count interactions: Mechanic A + B should create 2 new interactions (A→B, B→A)
|
||
- If it doesn't, they're not orthogonal
|
||
|
||
### Common Orthogonality Failures
|
||
|
||
❌ **Damage type redundancy**: Multiple attack types that all just "do damage"
|
||
❌ **Movement ability redundancy**: Double jump, dash, and teleport all "move faster"
|
||
❌ **Resource redundancy**: Mana, stamina, and energy all "limit ability usage"
|
||
|
||
✅ **Instead**:
|
||
- Damage types affect different material properties (fire burns wood, electricity conducts, ice shatters)
|
||
- Movement abilities affect different traversal contexts (jump = vertical, dash = speed + invincibility, teleport = through walls)
|
||
- Resources gate different gameplay loops (mana = magic, stamina = physics actions, energy = time manipulation)
|
||
|
||
|
||
## CORE CONCEPT #2: Interaction Matrices (The Possibility Map)
|
||
|
||
### What is an Interaction Matrix?
|
||
|
||
An **interaction matrix** explicitly documents what happens when every mechanic/object/element combines with every other.
|
||
|
||
It's the MOST IMPORTANT TOOL for emergent design because:
|
||
1. Forces you to design interactions, not just mechanics
|
||
2. Reveals gaps (missing interactions)
|
||
3. Counts total possibilities (complexity budget)
|
||
4. Prevents dominant strategies (you can see imbalances)
|
||
|
||
### Basic Interaction Matrix Format
|
||
|
||
```
|
||
Fire Water Electric Explosive Oil Glass
|
||
Fire ✓ X ✓ ✓ ✓ ✓
|
||
Water X ✓ ✓ X X X
|
||
Electric ✓ ✓ ✓ ✓ ✓ ✓
|
||
Explosive ✓ X ✓ ✓ ✓ ✓
|
||
Oil ✓ X X ✓ ✓ X
|
||
Glass ✓ X ✓ ✓ X ✓
|
||
```
|
||
|
||
Legend:
|
||
- ✓ = Interesting interaction exists
|
||
- X = No interaction (or neutral)
|
||
|
||
### Detailed Interaction Matrix (With Rules)
|
||
|
||
For each ✓, document the rule:
|
||
|
||
```
|
||
Fire + Water = X (fire extinguished, steam created if hot enough)
|
||
Fire + Electric = ✓ (electric ignites fire if flammable material present)
|
||
Fire + Explosive = ✓ (explosive detonates, creates larger fire)
|
||
Fire + Oil = ✓ (oil ignites, fire spreads faster)
|
||
Fire + Glass = ✓ (glass shatters from thermal shock if cooled rapidly)
|
||
|
||
Water + Electric = ✓ (water conducts electricity, area-of-effect damage)
|
||
Water + Explosive = X (water dampens explosive, reduces blast radius)
|
||
Water + Oil = X (oil floats, doesn't mix)
|
||
Water + Glass = X (no interaction)
|
||
|
||
Electric + Explosive = ✓ (electric detonates explosive remotely)
|
||
Electric + Oil = ✓ (oil is non-conductive, insulates against electric)
|
||
Electric + Glass = ✓ (glass is insulator, blocks electric conduction)
|
||
|
||
...etc for all combinations
|
||
```
|
||
|
||
### Interaction Count Analysis
|
||
|
||
For N mechanics, maximum interactions = N × (N-1) / 2
|
||
|
||
Examples:
|
||
- 3 mechanics = 3 interactions possible
|
||
- 6 mechanics = 15 interactions possible
|
||
- 10 mechanics = 45 interactions possible
|
||
|
||
**Design goal**: Implement 60-80% of possible interactions. 100% is over-designed, <50% means mechanics don't interact enough.
|
||
|
||
### Real-World Example: Noita
|
||
|
||
Noita has ~30 materials with interaction matrix:
|
||
|
||
```
|
||
Sample interactions (simplified):
|
||
- Water + Lava = Steam + Obsidian
|
||
- Oil + Fire = Burning Oil + Fire Spread
|
||
- Acid + Metal = Dissolved Metal
|
||
- Polymorphine + Any Creature = Random Creature
|
||
- Teleportatium + Any Object = Teleports Object
|
||
- Worm Blood + Worm = Pacified Worm
|
||
```
|
||
|
||
**Why it works**:
|
||
- 30 materials × 30 materials = 900 possible interactions
|
||
- ~600 actually implemented (67% coverage)
|
||
- Players discover interactions through experimentation
|
||
- Entire game is interaction matrix + physics
|
||
|
||
**Failure mode**: If only 10% of interactions implemented, systems feel disconnected.
|
||
|
||
### Design Process for Interaction Matrices
|
||
|
||
1. **List all mechanics/objects/elements** (rows and columns)
|
||
|
||
2. **Fill in diagonal (self-interactions)**:
|
||
- Fire + Fire = bigger fire (positive feedback)
|
||
- Water + Water = more water (accumulation)
|
||
- Explosive + Explosive = chain reaction
|
||
|
||
3. **Fill in obvious interactions first**:
|
||
- Fire + Water = extinguish (classic opposition)
|
||
- Electric + Water = conduction (well-known physics)
|
||
|
||
4. **Fill in creative interactions**:
|
||
- Oil + Glass = slippery glass surface
|
||
- Magnetism + Explosive = sticky mine (attach to metal)
|
||
|
||
5. **Identify gaps**:
|
||
- Is Fire interacting with <60% of other elements?
|
||
- Are some elements isolated (no interactions)?
|
||
|
||
6. **Prune redundant interactions**:
|
||
- If Fire + Ice and Fire + Water do the same thing, combine them
|
||
|
||
7. **Balance interaction density**:
|
||
- Some elements are "hub elements" (interact with everything): Electric, Fire
|
||
- Some elements are "niche elements" (few interactions): Glass, specific chemicals
|
||
- This is OK! Creates strategy depth.
|
||
|
||
### Common Interaction Matrix Failures
|
||
|
||
❌ **Sparse matrix**: Only 20% of interactions implemented (systems feel disconnected)
|
||
❌ **Diagonal dominance**: Elements only interact with themselves (no emergence)
|
||
❌ **Binary interactions**: A+B does something, but A+B+C doesn't add depth (no cascades)
|
||
❌ **Missing documentation**: Interactions exist in code but not design docs (can't reason about them)
|
||
|
||
✅ **Instead**:
|
||
- Target 60-80% coverage
|
||
- Design off-diagonal interactions explicitly
|
||
- Document 3+ element chains
|
||
- Make matrix accessible to entire team
|
||
|
||
|
||
## CORE CONCEPT #3: Feedback Loops (The Stabilization Principle)
|
||
|
||
### What are Feedback Loops?
|
||
|
||
**Feedback loops** determine whether emergence is:
|
||
- **Stable** (interesting equilibrium)
|
||
- **Explosive** (runaway chaos)
|
||
- **Dampened** (boring stagnation)
|
||
|
||
Every emergent system has feedback loops. Your job is to balance them.
|
||
|
||
### Positive Feedback (Runaway Growth)
|
||
|
||
**Positive feedback**: Output amplifies input, creating exponential growth
|
||
|
||
Examples:
|
||
- Fire spreads to adjacent tiles → more fire → spreads more → runaway
|
||
- Player gets powerful weapon → kills enemies easier → gets more loot → gets more powerful → trivializes game
|
||
- More creatures → more food → more reproduction → more creatures → overpopulation
|
||
|
||
**When to use positive feedback**:
|
||
- Creating tension: "Fire is spreading, act fast!"
|
||
- Snowball effects: "If you succeed early, you dominate"
|
||
- Epic moments: "Chain reaction destroyed entire level"
|
||
|
||
**Danger**: Without negative feedback, positive feedback makes systems unplayable.
|
||
|
||
### Negative Feedback (Self-Correction)
|
||
|
||
**Negative feedback**: Output reduces input, creating stability
|
||
|
||
Examples:
|
||
- Fire spreads → consumes fuel → less fuel → fire slows → stops
|
||
- Player is powerful → faces harder enemies → dies more → becomes appropriately leveled
|
||
- Many creatures → consume all food → starvation → population crashes → equilibrium
|
||
|
||
**When to use negative feedback**:
|
||
- Preventing runaway states: "Fire eventually stops"
|
||
- Rubber-banding difficulty: "Losing players get help, winning players face challenges"
|
||
- Resource management: "Use it all → scarcity → conservation"
|
||
|
||
**Danger**: Too much negative feedback creates stagnation (nothing ever changes).
|
||
|
||
### Balanced Feedback (Dynamic Equilibrium)
|
||
|
||
**Best emergent systems have BOTH**:
|
||
|
||
Example: Fire Spread System
|
||
- **Positive feedback**: Fire spreads to adjacent flammable tiles (growth)
|
||
- **Negative feedback**: Fire consumes fuel, reducing flammability (depletion)
|
||
- **Negative feedback**: Smoke reduces oxygen, slowing spread (environmental limit)
|
||
- **Negative feedback**: Player can extinguish with water (player intervention)
|
||
|
||
**Result**: Fire creates tension (grows), but eventually stabilizes or stops. Player has agency to influence equilibrium.
|
||
|
||
### Real-World Example: Dwarf Fortress Ecosystem
|
||
|
||
**Positive Feedback**:
|
||
- More dwarves → more labor → more food production → supports more dwarves
|
||
- Cats reproduce → more cats → more hunting → more food for cats → more reproduction
|
||
|
||
**Negative Feedback**:
|
||
- More dwarves → more food consumption → eventually exceeds production → starvation
|
||
- Too many cats → overhunted vermin → no food for cats → cats starve → population crashes
|
||
- Player must manage breeding → controls population → prevents runaway
|
||
|
||
**Result**: Dynamic equilibrium where player must actively manage systems.
|
||
|
||
### Feedback Loop Analysis Process
|
||
|
||
1. **Identify loops**:
|
||
- Trace paths: A increases B, B increases C, C increases A (positive loop)
|
||
- Trace negative paths: A increases B, B decreases A (negative loop)
|
||
|
||
2. **Classify each loop**:
|
||
- Positive (reinforcing): →+→+→+ or →−→−→+ (even number of negatives)
|
||
- Negative (dampening): →+→− or →−→+→− (odd number of negatives)
|
||
|
||
3. **Count loop strength**:
|
||
- Strong positive + weak negative = runaway (bad)
|
||
- Strong negative + weak positive = stagnation (bad)
|
||
- Balanced = dynamic equilibrium (good)
|
||
|
||
4. **Add dampening to strong positive loops**:
|
||
- Fuel consumption limits fire spread
|
||
- Enemy reinforcements have delay (time-based negative feedback)
|
||
- Loot quality diminishes with player power (rubber-banding)
|
||
|
||
5. **Add amplification to strong negative loops**:
|
||
- Player abilities counter stabilization (keeps things dynamic)
|
||
- Random events perturb equilibrium (prevents stagnation)
|
||
|
||
### Common Feedback Loop Failures
|
||
|
||
❌ **Runaway snowball**: Player who gets early lead trivializes game
|
||
❌ **Stagnation**: Systems stabilize into unchanging state (boring)
|
||
❌ **Rubber-band overcompensation**: Losing player gets so much help they always win
|
||
❌ **Oscillation**: Systems wildly swing between extremes (no control)
|
||
|
||
✅ **Instead**:
|
||
- Design both positive and negative loops
|
||
- Test for runaway conditions (what if player does X repeatedly?)
|
||
- Add player agency (player can influence loops)
|
||
- Tune time constants (slow loops = strategy, fast loops = tactics)
|
||
|
||
|
||
## CORE CONCEPT #4: Cascade Chains (The Surprise Principle)
|
||
|
||
### What are Cascade Chains?
|
||
|
||
**Cascade chains** are sequences where one action triggers a second, which triggers a third, creating surprising outcomes.
|
||
|
||
Formula: A → B → C → D
|
||
|
||
The longer the chain, the more surprising the outcome (but also harder to predict).
|
||
|
||
### Cascade Length vs Predictability
|
||
|
||
```
|
||
Chain Length 1 (Deterministic):
|
||
- Shoot enemy → enemy dies
|
||
- Result: Completely predictable
|
||
|
||
Chain Length 2 (Tactical):
|
||
- Shoot barrel → barrel explodes → enemy dies
|
||
- Result: Predictable with planning
|
||
|
||
Chain Length 3 (Strategic):
|
||
- Shoot light → darkness → enemy can't see → you flank
|
||
- Result: Requires setup and understanding
|
||
|
||
Chain Length 4+ (Emergent):
|
||
- Shoot chandelier → falls → breaks floor → water floods → electrified water → multiple enemies shocked → domino effect
|
||
- Result: Surprising even to designer
|
||
```
|
||
|
||
**Design goal**: Enable chains of 3-5 steps. Longer chains are rare, shorter chains are predictable.
|
||
|
||
### Cascade Dampening (Preventing Infinite Chains)
|
||
|
||
Without dampening, cascades become infinite:
|
||
- Explosion hits barrel → barrel explodes → hits another barrel → explodes → infinite chain
|
||
|
||
**Dampening mechanisms**:
|
||
1. **Energy loss**: Each step reduces effect (explosion damage decreases with distance)
|
||
2. **Probability decay**: Each step has chance to stop (80% → 64% → 51% → 41%)
|
||
3. **Cooldowns**: Same object can't trigger twice in short time
|
||
4. **Fuel depletion**: Chain stops when resources exhausted
|
||
|
||
### Real-World Example: Breath of the Wild
|
||
|
||
**Common Cascade**:
|
||
1. Player shoots fire arrow at grass
|
||
2. Grass burns
|
||
3. Fire creates updraft
|
||
4. Updraft lifts player in paraglider
|
||
5. Player gains altitude to reach high area
|
||
|
||
**Why it works**:
|
||
- 5-step chain
|
||
- Each step uses different mechanic (projectile → fire → air → movement → traversal)
|
||
- Dampening: Fire eventually stops, updraft dissipates
|
||
- Player-initiated: Cascade is deliberate, not random
|
||
|
||
**Anti-pattern**: If fire never stopped spreading, entire world would burn (no dampening).
|
||
|
||
### Cascade Design Process
|
||
|
||
1. **Design individual mechanics** with clear inputs/outputs:
|
||
- Fire: Input = ignition source, Output = heat + light
|
||
- Water: Input = container break, Output = fluid spread
|
||
- Electricity: Input = power source, Output = current through conductors
|
||
|
||
2. **Define trigger conditions**:
|
||
- Fire output (heat) can be input to explosives (ignition source)
|
||
- Water output (fluid) can be input to electricity (conductor)
|
||
- Electricity output (current) can be input to mechanisms (power)
|
||
|
||
3. **Map cascade paths**:
|
||
```
|
||
Fire → (heat) → Explosives → (blast) → Structure → (falls) → Water → (floods) → Electric → (shocks) → Enemies
|
||
```
|
||
|
||
4. **Add dampening at each step**:
|
||
- Fire: Burns for 10 seconds, then stops
|
||
- Explosives: One-time effect, doesn't chain without fuel
|
||
- Structure: Falls once, can't re-trigger
|
||
- Water: Finite volume, spreads until area filled
|
||
- Electric: Dissipates in water over time
|
||
|
||
5. **Test cascade length distribution**:
|
||
- Most cascades should be 2-3 steps (tactical)
|
||
- Some cascades reach 4-5 steps (strategic)
|
||
- Rare cascades hit 6+ steps (surprising)
|
||
|
||
6. **Ensure player agency**:
|
||
- Player should INITIATE cascades
|
||
- Cascades shouldn't happen randomly
|
||
- Player can predict at least first 2-3 steps
|
||
|
||
### Common Cascade Failures
|
||
|
||
❌ **No cascades**: Every action is single-step (predictable, boring)
|
||
❌ **Infinite cascades**: Chain never stops (uncontrollable, frustrating)
|
||
❌ **Random cascades**: Player can't predict or control (feels unfair)
|
||
❌ **Required cascades**: Puzzle has only one solution via specific cascade (not emergent)
|
||
|
||
✅ **Instead**:
|
||
- Design 3-5 step cascades as baseline
|
||
- Add dampening at every step
|
||
- Make cascades player-initiated
|
||
- Enable multiple cascade paths to same goal
|
||
|
||
|
||
## CORE CONCEPT #5: Systemic Solutions (The Multiple-Paths Principle)
|
||
|
||
### What are Systemic Solutions?
|
||
|
||
**Systemic solutions** are when players solve problems using the simulation, not designer-intended mechanics.
|
||
|
||
**Scripted solution**: "Use key to open door"
|
||
**Systemic solution**: "Shoot door with explosive, hack lock, teleport through wall, or stack boxes to climb over"
|
||
|
||
The hallmark of emergent gameplay is that players discover solutions you DIDN'T DESIGN.
|
||
|
||
### Systemic vs Scripted Design
|
||
|
||
**Scripted Design**:
|
||
- Designer creates problem: "Door is locked"
|
||
- Designer creates solution: "Find key"
|
||
- Player follows designer's path
|
||
- One solution, predictable
|
||
|
||
**Systemic Design**:
|
||
- Designer creates constraints: "Door has lock (hackable), hinges (destructible), walls (solid)"
|
||
- Designer creates mechanics: "Explosives destroy objects, hacking opens electronics, glue climbs surfaces"
|
||
- Player discovers solutions: "Blow hinges, hack lock, climb wall, or use physics to bypass"
|
||
- Multiple solutions, unpredictable
|
||
|
||
### The Systemic Solution Checklist
|
||
|
||
For every challenge, ask:
|
||
|
||
1. **Can physics solve it?** (Stack boxes, use momentum, throw objects)
|
||
2. **Can chemistry solve it?** (Burn, freeze, melt, dissolve)
|
||
3. **Can abilities solve it?** (Teleport, time stop, invisibility)
|
||
4. **Can AI manipulation solve it?** (Distract, lure, possess)
|
||
5. **Can environment solve it?** (Use existing objects, terrain, hazards)
|
||
|
||
If answer is "yes" to 3+, you have systemic design. If only 1, it's scripted.
|
||
|
||
### Real-World Example: Deus Ex
|
||
|
||
**Challenge**: Reach a building's upper floor
|
||
|
||
**Scripted game would have**: "Find keycard, use elevator"
|
||
|
||
**Deus Ex systemic solutions**:
|
||
1. **Front door**: Hack security, use legitimate keycard
|
||
2. **Break-in**: Lockpick side door, blow open vent with LAM
|
||
3. **Stealth**: Find hidden window entrance, use multitool on lock
|
||
4. **Social**: Convince guard to let you in (dialog)
|
||
5. **Vertical**: Stack crates, jump from adjacent building
|
||
6. **Aggressive**: Kill everyone, walk in freely
|
||
|
||
**Why it works**:
|
||
- No "intended" solution
|
||
- Each solution uses different systems (hacking, explosives, lockpicking, social, physics, combat)
|
||
- Player chooses based on playstyle and resources
|
||
- Designer didn't script "crate stacking solution"—it emerged from physics
|
||
|
||
### Systemic Solution Design Process
|
||
|
||
1. **Define constraints, not solutions**:
|
||
- ❌ "Door needs key" (scripted)
|
||
- ✅ "Door has lock (hackable), hinges (destructible), walls (climbable)" (systemic)
|
||
|
||
2. **Give objects properties, not functions**:
|
||
- ❌ "Keycard opens door" (single function)
|
||
- ✅ "Keycard has RFID signature, doors check RFID" (property-based)
|
||
- Result: Players can clone RFID, spoof signature, steal card—not just "use key"
|
||
|
||
3. **Make challenges orthogonal to mechanics**:
|
||
- If you have 5 mechanics and 5 challenges, each challenge should be solvable by 3+ mechanics
|
||
- This prevents 1:1 mapping (which is just scripted with extra steps)
|
||
|
||
4. **Playtest for unintended solutions**:
|
||
- If playtesters solve challenge differently than you designed: GOOD
|
||
- If every playtester uses same solution: BAD (it's scripted)
|
||
- Track "solution diversity" metric: How many different solutions do players discover?
|
||
|
||
5. **Resist the urge to "fix" creative solutions**:
|
||
- If player uses barrels to climb wall you wanted them to hack: Feature, not bug
|
||
- Only patch solutions that trivialize ALL challenges (dominant strategy)
|
||
|
||
### Common Systemic Solution Failures
|
||
|
||
❌ **Lock-and-key design**: Every challenge has exactly one solution item
|
||
❌ **Hard-coded solutions**: "Only explosives open this door" (ignores physics, hacking, etc.)
|
||
❌ **Invisible walls**: "You can climb walls, but not THIS wall" (breaks consistency)
|
||
❌ **Required scripted sequence**: "You must hack the terminal" (removes player choice)
|
||
|
||
✅ **Instead**:
|
||
- Every challenge has 3+ solutions using different systems
|
||
- Properties, not hard-coded gates
|
||
- Consistent rules (if climbable surface, always climbable)
|
||
- Optional hints, never required paths
|
||
|
||
|
||
## CORE CONCEPT #6: Emergence Testing Methodology
|
||
|
||
### How Do You Know If Emergence is Happening?
|
||
|
||
Emergence is hard to measure, but you can test for it:
|
||
|
||
### Test 1: Solution Diversity Test
|
||
|
||
**Method**:
|
||
1. Give 10 playtesters the same challenge
|
||
2. Don't tell them how to solve it
|
||
3. Count unique solutions
|
||
|
||
**Scoring**:
|
||
- 1-2 unique solutions: Scripted (failed)
|
||
- 3-5 unique solutions: Systemic (good)
|
||
- 6+ unique solutions: Highly emergent (excellent)
|
||
|
||
**Example**: Hitman contracts
|
||
- "Eliminate target"
|
||
- Players discover: Sniper, poison, disguise, accident, distraction + snipe, etc.
|
||
- Result: 10+ solutions per contract (highly emergent)
|
||
|
||
### Test 2: Designer Surprise Test
|
||
|
||
**Method**:
|
||
1. Watch playtesting footage
|
||
2. Count times you think: "I didn't know you could do that!"
|
||
|
||
**Scoring**:
|
||
- 0 surprises: Scripted (failed)
|
||
- 1-3 surprises: Some emergence (ok)
|
||
- 5+ surprises: Highly emergent (excellent)
|
||
|
||
**Example**: Breath of the Wild
|
||
- Designers were surprised by: Minecart launching, shield surfing combat, using metal boxes as elevators
|
||
- Result: High emergence
|
||
|
||
### Test 3: Interaction Coverage Test
|
||
|
||
**Method**:
|
||
1. Count total possible interactions in your matrix (N × N)
|
||
2. Count actually implemented interactions (M)
|
||
3. Calculate coverage: M / (N × N) × 100%
|
||
|
||
**Scoring**:
|
||
- <30% coverage: Disconnected systems (failed)
|
||
- 30-50% coverage: Some interaction (ok)
|
||
- 60-80% coverage: High interaction (excellent)
|
||
- >90% coverage: Over-designed (diminishing returns)
|
||
|
||
**Example**: Noita
|
||
- ~30 materials = 900 possible interactions
|
||
- ~600 implemented = 67% coverage (excellent)
|
||
|
||
### Test 4: Cascade Length Distribution Test
|
||
|
||
**Method**:
|
||
1. Instrument code to track action chains
|
||
2. Measure how many actions trigger secondary actions
|
||
3. Plot distribution of chain lengths
|
||
|
||
**Scoring**:
|
||
```
|
||
Ideal distribution:
|
||
- 1-step chains: 40% (direct actions)
|
||
- 2-step chains: 30% (tactical combinations)
|
||
- 3-step chains: 20% (strategic setups)
|
||
- 4+ step chains: 10% (emergent surprises)
|
||
|
||
Bad distribution:
|
||
- 1-step chains: 95% (no emergence)
|
||
- 2+ step chains: 5% (rare)
|
||
```
|
||
|
||
### Test 5: Dominant Strategy Test
|
||
|
||
**Method**:
|
||
1. Identify optimal strategy (math or playtesting)
|
||
2. Measure how often players use it
|
||
3. Measure win rate with optimal strategy
|
||
|
||
**Scoring**:
|
||
- Optimal strategy used >80% of time: Dominant (failed)
|
||
- Optimal strategy used 50-70% of time: Balanced (ok)
|
||
- No clear optimal strategy: Rich meta (excellent)
|
||
|
||
**Example**: Rock-Paper-Scissors
|
||
- No dominant strategy (33% each in balanced play)
|
||
- Compare to "Gun-Knife-Fist" where Gun always wins (dominant)
|
||
|
||
### Test 6: Runaway Condition Test
|
||
|
||
**Method**:
|
||
1. Identify positive feedback loops
|
||
2. Test: "What if player does X repeatedly?"
|
||
3. Measure: Does system stabilize or explode?
|
||
|
||
**Scoring**:
|
||
- System explodes (infinite growth): Failed (needs dampening)
|
||
- System stabilizes within 10 iterations: Good (negative feedback working)
|
||
- System oscillates predictably: Good (dynamic equilibrium)
|
||
|
||
**Example**: Fire spread
|
||
- Without fuel depletion: Infinite spread (failed)
|
||
- With fuel depletion: Stops after consuming local fuel (good)
|
||
|
||
### Emergence Testing Checklist
|
||
|
||
Before shipping emergent system, verify:
|
||
|
||
- [ ] Solution Diversity: 3+ solutions to most challenges
|
||
- [ ] Designer Surprise: 5+ unintended solutions discovered in playtest
|
||
- [ ] Interaction Coverage: 60-80% of interaction matrix implemented
|
||
- [ ] Cascade Distribution: 20%+ of actions trigger 3+ step chains
|
||
- [ ] No Dominant Strategy: Optimal strategy used <70% of time
|
||
- [ ] Runaway Dampening: All positive feedback loops have negative counterparts
|
||
- [ ] Consistency: Rules apply uniformly (no special cases)
|
||
- [ ] Documentation: Interaction matrix documented and accessible
|
||
|
||
|
||
## DECISION FRAMEWORK #1: Scripted vs Emergent (Control vs Surprise)
|
||
|
||
### The Core Tradeoff
|
||
|
||
Every design decision involves choosing:
|
||
- **Control**: Designer dictates experience (scripted)
|
||
- **Surprise**: Players discover experience (emergent)
|
||
|
||
You can't maximize both. Choose deliberately.
|
||
|
||
### When to Choose Scripted
|
||
|
||
Choose scripted when:
|
||
- **Story beats must happen**: "Hero confronts villain" can't be skipped or done wrong
|
||
- **Tutorial sequences**: New players need hand-holding
|
||
- **Pacing critical**: "Calm before storm" requires designer control
|
||
- **One-time spectacles**: Setpiece moments (building collapses, epic entrance)
|
||
- **Budget constraints**: Emergent systems cost more upfront dev time
|
||
|
||
**Example**: Uncharted
|
||
- Heavily scripted setpieces (train crash, building collapse)
|
||
- Why: Story-driven, cinematic experience
|
||
- Tradeoff: Low replayability, but strong narrative
|
||
|
||
### When to Choose Emergent
|
||
|
||
Choose emergent when:
|
||
- **Replayability is goal**: Players will play 100+ hours
|
||
- **Player expression valued**: "Play your way" philosophy
|
||
- **Sandboxes or simulations**: Open-ended goals
|
||
- **Competitive depth**: Meta-game evolution
|
||
- **Content creation cost high**: 100 hours of scripted content = expensive, 100 hours of emergent play = cheaper per hour
|
||
|
||
**Example**: Minecraft
|
||
- Highly emergent (redstone, building, exploration)
|
||
- Why: Infinite replayability from simple rules
|
||
- Tradeoff: No strong narrative, requires player creativity
|
||
|
||
### Hybrid Approach (Best for Most Games)
|
||
|
||
Most games use hybrid:
|
||
- **Scripted structure**: Main story missions, key moments
|
||
- **Emergent gameplay**: Moment-to-moment tactics, side content
|
||
|
||
**Example**: Breath of the Wild
|
||
- Scripted: Four Divine Beasts quest structure, Ganon confrontation
|
||
- Emergent: Shrine solutions, combat tactics, exploration routes
|
||
- Why: Best of both worlds (narrative + replayability)
|
||
|
||
### Decision Process
|
||
|
||
For each game system, ask:
|
||
|
||
**1. What is the player's goal?**
|
||
- Clear goal (reach exit) → Can be emergent
|
||
- Specific outcome (witness betrayal) → Must be scripted
|
||
|
||
**2. How often will player experience this?**
|
||
- Once → Can be scripted (high authoring cost ok)
|
||
- 100+ times → Should be emergent (need variety)
|
||
|
||
**3. Does player need agency?**
|
||
- Yes (core fantasy) → Emergent
|
||
- No (spectator moment) → Scripted
|
||
|
||
**4. Can failure be interesting?**
|
||
- Yes (learn and retry) → Emergent
|
||
- No (frustrates story) → Scripted with retry checkpoints
|
||
|
||
### Example Decision Table
|
||
|
||
| System | Goal | Frequency | Agency | Failure | Decision |
|
||
|--------|------|-----------|--------|---------|----------|
|
||
| Combat | Defeat enemies | 1000+ times | High | Interesting (tactics) | **Emergent** |
|
||
| Boss intro cutscene | See villain | 1 time | None | N/A (no failure) | **Scripted** |
|
||
| Boss fight | Defeat villain | 5-20 times (retries) | High | Learn patterns | **Hybrid** (phases scripted, tactics emergent) |
|
||
| Side quests | Complete objectives | 50+ times | Medium | Interesting | **Emergent** (systemic solutions) |
|
||
| Ending | Story resolution | 1 time | None (watch) | N/A | **Scripted** |
|
||
|
||
### Common Decision Failures
|
||
|
||
❌ **Scripting emergent moments**: "You must use explosive to open door" (but player has 5 other tools)
|
||
❌ **Emergent story beats**: "Boss might die to random fire before cinematic" (breaks pacing)
|
||
❌ **Hybrid confusion**: "Game teaches scripted solutions, then expects emergent creativity" (mixed signals)
|
||
|
||
✅ **Instead**:
|
||
- Separate emergent gameplay from scripted story moments
|
||
- Teach emergent thinking early (tutorials show multiple solutions)
|
||
- Use scripting for pacing, emergence for variety
|
||
|
||
|
||
## DECISION FRAMEWORK #2: Constraint Tuning (Goldilocks Zone)
|
||
|
||
### The Constraint Paradox
|
||
|
||
- **Too constrained**: No emergence (players follow single path)
|
||
- **Too open**: No strategy (random outcomes, no skill)
|
||
- **Goldilocks zone**: Constrained enough for strategy, open enough for creativity
|
||
|
||
Your job: Find the Goldilocks zone.
|
||
|
||
### The Constraint Spectrum
|
||
|
||
```
|
||
OVER-CONSTRAINED GOLDILOCKS UNDER-CONSTRAINED
|
||
│ │ │
|
||
│ One solution per puzzle │ 3-5 solutions per puzzle │ Infinite solutions, all equally valid
|
||
│ Linear progression │ Multiple paths forward │ No clear progression
|
||
│ No experimentation │ Experimentation rewarded │ Experimentation required (trial/error)
|
||
│ High control │ Balanced freedom │ Overwhelming freedom
|
||
│ │ │
|
||
Examples: Examples: Examples:
|
||
- Portal 1 (exact solutions) - Prey (many solutions) - Garry's Mod (no goals)
|
||
- Linear tutorials - Hitman (many paths) - Minecraft creative (no constraints)
|
||
- Lock-and-key design - Breath of the Wild - Sandbox with no objectives
|
||
```
|
||
|
||
### Over-Constrained Warning Signs
|
||
|
||
- Players discover creative solution, you patch it out ("not intended")
|
||
- Every challenge has one item that solves it (lock-and-key)
|
||
- Playtesters all use same solution (no diversity)
|
||
- "Correct" and "incorrect" solutions (rather than effective/ineffective)
|
||
- Hidden collectibles are required, not optional
|
||
- Tutorials force specific actions (no room to experiment)
|
||
|
||
**Example**: Bioshock (2007)
|
||
- Over-constrained hack minigame (pipe puzzle with one solution)
|
||
- Contrast with Prey (2017): Multiple ways to overcome locked doors
|
||
- Result: Prey feels more emergent
|
||
|
||
### Under-Constrained Warning Signs
|
||
|
||
- Players are confused what to do
|
||
- Random experimentation is only strategy (no skill)
|
||
- Outcomes feel arbitrary (no cause-effect)
|
||
- "Anything goes" means no interesting choices
|
||
- Too many options = choice paralysis
|
||
- Lack of feedback (did that work? no way to tell)
|
||
|
||
**Example**: Early survival games
|
||
- Too many crafting recipes (hundreds of useless items)
|
||
- No guidance what matters
|
||
- Result: Wiki-required gameplay
|
||
|
||
### Finding the Goldilocks Zone
|
||
|
||
**Method 1: Constraint Counting**
|
||
|
||
For each challenge:
|
||
1. Count possible solutions
|
||
2. Count effective solutions (solutions that work reasonably well)
|
||
3. Count optimal solutions (best solutions)
|
||
|
||
**Scoring**:
|
||
```
|
||
Possible solutions: 10+
|
||
Effective solutions: 3-5
|
||
Optimal solutions: 1-2
|
||
|
||
Result: Goldilocks (many options, few are good, encouraging experimentation)
|
||
```
|
||
|
||
Compare:
|
||
```
|
||
Over-constrained:
|
||
Possible solutions: 2
|
||
Effective solutions: 1
|
||
Optimal solutions: 1
|
||
(No room for creativity)
|
||
|
||
Under-constrained:
|
||
Possible solutions: 100
|
||
Effective solutions: 95
|
||
Optimal solutions: 90
|
||
(No meaningful choice)
|
||
```
|
||
|
||
**Method 2: Playtesting Diversity**
|
||
|
||
1. Watch 10 players solve same challenge
|
||
2. Count unique approaches
|
||
3. Measure success rate per approach
|
||
|
||
**Goldilocks**:
|
||
- 5-8 unique approaches (high diversity)
|
||
- All approaches have 40-80% success rate (no dominant strategy, but some are better)
|
||
|
||
**Over-constrained**:
|
||
- 1-2 approaches (low diversity)
|
||
- One approach has 100% success, others 0% (forced solution)
|
||
|
||
**Under-constrained**:
|
||
- 10+ approaches, all succeed 100% (no differentiation, no mastery)
|
||
|
||
### Real-World Example: Dishonored
|
||
|
||
**Goldilocks Zone Achieved**:
|
||
|
||
For "Eliminate target" mission:
|
||
- **Possible solutions**: 20+ (high creativity)
|
||
- **Effective solutions**: 6-8 (varied playstyles)
|
||
- Direct combat
|
||
- Stealth lethal
|
||
- Stealth non-lethal
|
||
- Possess NPC to reach target
|
||
- Engineer accident (chandelier, poison)
|
||
- Social (frame someone else)
|
||
- **Optimal solutions**: 2-3 (ghost non-lethal, or speed kill)
|
||
|
||
**Why Goldilocks**:
|
||
- Many options encourage experimentation
|
||
- Some options clearly harder/riskier (stealth vs combat)
|
||
- Mastery is choosing right tool for situation
|
||
- Players feel creative ("I solved it my way")
|
||
|
||
### Constraint Tuning Process
|
||
|
||
1. **Start over-constrained** (easier to loosen than tighten):
|
||
- Design one intended solution first
|
||
- Playtest: Does it work?
|
||
|
||
2. **Add alternative solutions** (expand constraint):
|
||
- "What if player has different tools?"
|
||
- "What if player uses physics?"
|
||
- Implement 2-3 alternatives
|
||
|
||
3. **Playtest for diversity**:
|
||
- Are players discovering different solutions?
|
||
- Are some solutions never used? (Too weak or non-obvious)
|
||
|
||
4. **Balance effectiveness**:
|
||
- If one solution always wins, it's dominant (bad)
|
||
- Make alternatives competitive, not equal
|
||
|
||
5. **Test for confusion**:
|
||
- Are players stuck? (Too constrained)
|
||
- Are players overwhelmed? (Too open)
|
||
|
||
6. **Iterate toward Goldilocks**:
|
||
- Add constraints if players are confused
|
||
- Remove constraints if players are frustrated
|
||
|
||
### Common Constraint Failures
|
||
|
||
❌ **Binary gating**: "You must have X to proceed" (over-constrained)
|
||
❌ **Everything is optional**: "All collectibles are cosmetic" (under-constrained, no stakes)
|
||
❌ **Fake choices**: "Three dialogue options that all lead to same outcome" (illusion of freedom)
|
||
❌ **Overwhelming tutorials**: "Here are 50 mechanics, good luck" (under-constrained onboarding)
|
||
|
||
✅ **Instead**:
|
||
- Multiple paths, clear consequences
|
||
- Optional content provides advantages (not cosmetic, not required)
|
||
- Choices lead to different outcomes (real agency)
|
||
- Tutorials introduce mechanics gradually (constrained early, open late)
|
||
|
||
|
||
## DECISION FRAMEWORK #3: Exploit Handling (Feature vs Bug)
|
||
|
||
### The Core Question
|
||
|
||
When players discover unintended tactics:
|
||
|
||
**"Is this a feature or a bug?"**
|
||
|
||
Wrong answer → Patch emergent gameplay, anger players
|
||
Right answer → Embrace creativity, enrich game
|
||
|
||
### The Feature vs Bug Criteria
|
||
|
||
| Factor | Feature (Keep It) | Bug (Patch It) |
|
||
|--------|-------------------|----------------|
|
||
| **Skill Required** | High skill ceiling | No skill (trivial) |
|
||
| **Consistency** | Uses game rules consistently | Breaks game rules |
|
||
| **Depth** | Adds strategic depth | Removes strategic depth |
|
||
| **Counterplay** | Can be countered | Uncounterable |
|
||
| **Scope** | Solves some challenges creatively | Trivializes all challenges |
|
||
| **Fun** | Players excited to share | Players feel dirty using it |
|
||
|
||
### Feature Examples (Kept by Designers)
|
||
|
||
**Rocket Jumping (Quake)**:
|
||
- Unintended: Explosions damage player, explosions apply physics force → player can launch self
|
||
- Why feature: High skill (timing, aim), adds mobility depth, fun to master
|
||
- Result: Became core mechanic in games (TF2, etc.)
|
||
|
||
**Combos (Street Fighter II)**:
|
||
- Unintended: Animation canceling allows multi-hit chains
|
||
- Why feature: High skill ceiling, adds competitive depth, exciting to watch
|
||
- Result: Combo system became fighting game standard
|
||
|
||
**Bunny Hopping (Quake/CS)**:
|
||
- Unintended: Strafe + jump preserves momentum, allowing speed gain
|
||
- Why feature: High skill (timing, mouse control), can be countered (predict path), fun movement skill
|
||
- Result: Became competitive mechanic (some games keep it, others remove it based on design philosophy)
|
||
|
||
### Bug Examples (Patched by Designers)
|
||
|
||
**Infinite Money Glitches**:
|
||
- Unintended: Duplication exploit creates infinite currency
|
||
- Why bug: No skill, trivializes all progression, breaks economy
|
||
- Result: Always patched
|
||
|
||
**Invincibility Exploits**:
|
||
- Unintended: Animation glitch makes player immune to damage
|
||
- Why bug: No counterplay, removes all challenge, not fun
|
||
- Result: Always patched
|
||
|
||
**Out of Bounds Skips**:
|
||
- Unintended: Player clips through wall, skips entire level
|
||
- Why bug (sometimes): If it trivializes game for casual players (bad onboarding)
|
||
- Why feature (sometimes): If speedrunning community values it (adds depth to competitive play)
|
||
- Result: Context-dependent (Zelda OOT keeps some skips for speedruns, patches gamebreaking ones)
|
||
|
||
### The Decision Process
|
||
|
||
When exploit discovered:
|
||
|
||
**Step 1: Can it be countered?**
|
||
- Yes → Likely feature (adds meta-game)
|
||
- No → Likely bug (removes strategy)
|
||
|
||
**Step 2: Does it require skill?**
|
||
- Yes → Likely feature (rewards mastery)
|
||
- No (trivial) → Likely bug (no depth)
|
||
|
||
**Step 3: Does it affect all players or just experts?**
|
||
- Just experts → Likely feature (optional advanced technique)
|
||
- All players forced to use it → Consider patching (removes diversity)
|
||
|
||
**Step 4: Does it trivialize intended challenges?**
|
||
- Some challenges → Likely feature (creative solution)
|
||
- All challenges → Likely bug (breaks game)
|
||
|
||
**Step 5: Are players excited or guilty?**
|
||
- Excited (sharing videos) → Likely feature
|
||
- Guilty (feels like cheating) → Likely bug
|
||
|
||
**Step 6: Does it align with design philosophy?**
|
||
- Philosophy: "Player creativity" → Likely feature
|
||
- Philosophy: "Balanced competitive play" → Might be bug
|
||
- Philosophy: "Accessible to all" → Might be bug
|
||
|
||
### Real-World Example: Prey (2017)
|
||
|
||
**GLOO Cannon Climbing**:
|
||
- Unintended: GLOO creates platforms → player can shoot GLOO upward → climb to reach any height
|
||
- Designer decision: FEATURE
|
||
- Why:
|
||
- Requires skill (aim, resource management)
|
||
- Opens creative exploration
|
||
- Fits "immersive sim" philosophy
|
||
- Can be countered (limited ammo, enemy interruption)
|
||
- Doesn't trivialize all challenges (just traversal)
|
||
- Result: Became beloved mechanic, community shares creative uses
|
||
|
||
**Typhon Power Stacking**:
|
||
- Unintended: Certain power combinations create near-invincibility
|
||
- Designer decision: BUG (later patched)
|
||
- Why:
|
||
- No skill (just combo selection)
|
||
- Trivializes combat for rest of game
|
||
- No counterplay
|
||
- Breaks intended difficulty curve
|
||
- Result: Balanced in patches
|
||
|
||
### Exploit Handling Process
|
||
|
||
1. **Document exploit** (repro steps, impact, skill required)
|
||
|
||
2. **Playtest with and without**:
|
||
- Have testers use exploit deliberately
|
||
- Measure: Fun? Skill? Trivialization?
|
||
|
||
3. **Check community sentiment**:
|
||
- Are players sharing it excitedly?
|
||
- Are players complaining it's required?
|
||
|
||
4. **Make decision**:
|
||
- Feature → Document it, maybe hint at it, balance around it
|
||
- Bug → Patch ASAP with explanation
|
||
|
||
5. **Communicate decision**:
|
||
- If keeping: "This is creative use of mechanics, intentionally kept"
|
||
- If patching: "This removed strategic depth, patched to preserve variety"
|
||
|
||
### Common Exploit Handling Failures
|
||
|
||
❌ **Patching all emergent tactics**: "Not intended = must be bug" (kills creativity)
|
||
❌ **Keeping gamebreaking exploits**: "Players should just not use it" (breaks game for everyone who discovers it)
|
||
❌ **Inconsistent enforcement**: "Exploit A is feature, exploit B is bug" with no clear criteria (confuses players)
|
||
❌ **Knee-jerk patching**: Patch immediately without community input (angers creative players)
|
||
|
||
✅ **Instead**:
|
||
- Use criteria table (skill, depth, counterplay)
|
||
- Consult community before patching beloved exploits
|
||
- Communicate reasoning ("Why this is feature/bug")
|
||
- Balance, don't remove (nerf exploit, don't delete it)
|
||
|
||
|
||
## IMPLEMENTATION PATTERN #1: Orthogonal Mechanic Design
|
||
|
||
### Step-by-Step Process
|
||
|
||
**Step 1: List Simulation Properties**
|
||
|
||
Before designing mechanics, list properties your simulation tracks:
|
||
|
||
Example (Immersive Sim):
|
||
- Position (x, y, z)
|
||
- Velocity (vector)
|
||
- Mass (kg)
|
||
- Temperature (celsius)
|
||
- Flammability (0-1)
|
||
- Conductivity (0-1)
|
||
- Brittleness (0-1)
|
||
- Opacity (0-1)
|
||
- Friction (coefficient)
|
||
- Magnetism (ferrous/non-ferrous)
|
||
|
||
**Step 2: Design Mechanics That Affect Different Properties**
|
||
|
||
Each mechanic should modify 1-2 properties, NOT the same properties as other mechanics:
|
||
|
||
```
|
||
Fire Mechanic:
|
||
- Affects: Temperature, Flammability
|
||
- Does NOT affect: Position, Conductivity (other mechanics handle these)
|
||
|
||
Ice Mechanic:
|
||
- Affects: Temperature, Friction
|
||
- Does NOT affect: Flammability (Fire handles this)
|
||
|
||
Electricity Mechanic:
|
||
- Affects: Conductivity (creates current through conductive materials)
|
||
- Does NOT affect: Temperature (unless through resistance heating)
|
||
|
||
Magnetism Mechanic:
|
||
- Affects: Position (of ferrous objects), Magnetism
|
||
- Does NOT affect: Temperature, Flammability
|
||
```
|
||
|
||
**Step 3: Verify No Overlap**
|
||
|
||
Create property matrix:
|
||
|
||
```
|
||
Position Velocity Mass Temp Flamm Conduct Brittle Opacity Friction Magnet
|
||
Fire - - - ✓ ✓ - - ✓ - -
|
||
Ice - - - ✓ - - ✓ - ✓ -
|
||
Electric - - - - - ✓ - - - -
|
||
Magnetism ✓ ✓ - - - - - - - ✓
|
||
Gravity ✓ ✓ - - - - - - - -
|
||
Explosion ✓ ✓ - ✓ ✓ - ✓ - - -
|
||
```
|
||
|
||
**Rule**: Each column should have 1-2 checkmarks (property affected by 1-2 mechanics). If 3+ mechanics affect same property in same way, they're redundant.
|
||
|
||
**Step 4: Define Cross-Property Interactions**
|
||
|
||
Once mechanics are orthogonal, define how properties interact:
|
||
|
||
```
|
||
High Temperature + High Flammability → Ignition
|
||
Low Temperature + High Water Content → Freezing (Brittle state)
|
||
High Conductivity + Electric Current → Current flows through object
|
||
High Magnetism + Ferrous Material → Attraction force applied to Position
|
||
```
|
||
|
||
**Step 5: Test Multiplication**
|
||
|
||
Count interactions:
|
||
- 5 mechanics × 10 properties = 50 possible mechanic-property pairs
|
||
- If 30 pairs are implemented = 60% coverage (good)
|
||
|
||
**Step 6: Implement Mechanics as Property Modifiers**
|
||
|
||
Code pattern:
|
||
```python
|
||
class FireMechanic:
|
||
def apply(self, object):
|
||
object.temperature += 50 # Raise temperature
|
||
if object.temperature > object.ignition_point:
|
||
object.flammability = 1.0 # Fully flammable
|
||
object.on_fire = True
|
||
object.opacity -= 0.3 # Smoke reduces visibility
|
||
|
||
class IceMechanic:
|
||
def apply(self, object):
|
||
object.temperature -= 100 # Lower temperature
|
||
if object.temperature < 0:
|
||
object.friction *= 0.1 # 10× more slippery
|
||
object.brittleness += 0.5 # More likely to shatter
|
||
```
|
||
|
||
**Why this works**: Mechanics don't know about each other, they just modify properties. Interactions emerge from property relationships.
|
||
|
||
|
||
## IMPLEMENTATION PATTERN #2: Interaction Matrix Creation
|
||
|
||
### Step-by-Step Process
|
||
|
||
**Step 1: List All Elements**
|
||
|
||
Elements = Objects, materials, abilities that can interact
|
||
|
||
Example:
|
||
- Fire, Water, Ice, Electricity, Oil, Wood, Metal, Glass, Explosive, Acid
|
||
|
||
**Step 2: Create Empty Matrix**
|
||
|
||
```
|
||
Fire Water Ice Elec Oil Wood Metal Glass Explo Acid
|
||
Fire ? ? ? ? ? ? ? ? ? ?
|
||
Water ? ? ? ? ? ? ? ? ? ?
|
||
Ice ? ? ? ? ? ? ? ? ? ?
|
||
Elec ? ? ? ? ? ? ? ? ? ?
|
||
Oil ? ? ? ? ? ? ? ? ? ?
|
||
Wood ? ? ? ? ? ? ? ? ? ?
|
||
Metal ? ? ? ? ? ? ? ? ? ?
|
||
Glass ? ? ? ? ? ? ? ? ? ?
|
||
Explo ? ? ? ? ? ? ? ? ? ?
|
||
Acid ? ? ? ? ? ? ? ? ? ?
|
||
```
|
||
|
||
**Step 3: Fill Diagonal (Self-Interactions)**
|
||
|
||
```
|
||
Fire + Fire = Bigger fire (accumulation)
|
||
Water + Water = More water (pooling)
|
||
Ice + Ice = Larger frozen area
|
||
Electricity + Electricity = Higher voltage (stronger effect)
|
||
Oil + Oil = Larger slick
|
||
...etc
|
||
```
|
||
|
||
**Step 4: Fill Obvious Opposites**
|
||
|
||
```
|
||
Fire + Water = Extinguish (fire out, steam produced)
|
||
Fire + Ice = Melt (ice becomes water)
|
||
Electricity + Water = Conduction (electrified water)
|
||
```
|
||
|
||
**Step 5: Fill Material Interactions**
|
||
|
||
```
|
||
Fire + Wood = Wood burns (flammable material)
|
||
Fire + Metal = Metal heats up (not flammable, but conducts heat)
|
||
Fire + Glass = Glass shatters (thermal shock if cooled rapidly)
|
||
Electricity + Metal = Conducts (metal is conductor)
|
||
Electricity + Wood = No conduction (insulator)
|
||
Acid + Metal = Dissolves (chemical reaction)
|
||
```
|
||
|
||
**Step 6: Fill Creative Interactions**
|
||
|
||
```
|
||
Oil + Fire = Burning oil (spreads fire faster)
|
||
Oil + Water = Oil floats (doesn't mix, creates slippery surface on water)
|
||
Oil + Electricity = Insulator (non-conductive)
|
||
Ice + Explosive = Ice shards (frozen shrapnel)
|
||
Electricity + Explosive = Remote detonation
|
||
Glass + Sound = Shatter (resonance frequency)
|
||
```
|
||
|
||
**Step 7: Mark Non-Interactions**
|
||
|
||
```
|
||
Water + Wood = X (water doesn't significantly affect wood structurally)
|
||
Ice + Metal = X (metal doesn't change when cold)
|
||
Wood + Glass = X (no meaningful interaction)
|
||
```
|
||
|
||
**Step 8: Calculate Coverage**
|
||
|
||
Total cells: 10 × 10 = 100
|
||
Implemented interactions: ~65
|
||
Coverage: 65%
|
||
(Good: Target 60-80%)
|
||
|
||
**Step 9: Document Rules**
|
||
|
||
For each interaction, write explicit rule:
|
||
|
||
```
|
||
Fire + Water:
|
||
- If Fire.intensity < Water.volume: Fire extinguished
|
||
- If Fire.intensity >= Water.volume: Water evaporates (steam)
|
||
- Steam: Reduces visibility (opacity), deals minor heat damage
|
||
|
||
Fire + Oil:
|
||
- Oil ignites immediately
|
||
- Burning oil spreads at 2× rate of normal fire
|
||
- Oil cannot be extinguished by water (oil floats)
|
||
```
|
||
|
||
**Step 10: Implement Interaction System**
|
||
|
||
Code pattern:
|
||
```python
|
||
class InteractionMatrix:
|
||
def __init__(self):
|
||
self.rules = {}
|
||
|
||
def register(self, element_a, element_b, rule_func):
|
||
key = (element_a, element_b)
|
||
self.rules[key] = rule_func
|
||
|
||
def interact(self, obj_a, obj_b):
|
||
key = (obj_a.element_type, obj_b.element_type)
|
||
if key in self.rules:
|
||
return self.rules[key](obj_a, obj_b)
|
||
else:
|
||
return None # No interaction
|
||
|
||
# Usage:
|
||
matrix = InteractionMatrix()
|
||
matrix.register("Fire", "Water", lambda f, w: extinguish_fire(f, w))
|
||
matrix.register("Fire", "Oil", lambda f, o: ignite_oil(o))
|
||
matrix.register("Electricity", "Water", lambda e, w: electrify_water(w))
|
||
|
||
# At runtime:
|
||
matrix.interact(fire_object, water_object) # Calls extinguish_fire
|
||
```
|
||
|
||
|
||
## IMPLEMENTATION PATTERN #3: Feedback Loop Balancing
|
||
|
||
### Step-by-Step Process
|
||
|
||
**Step 1: Identify All Feedback Loops**
|
||
|
||
Trace system paths:
|
||
|
||
Example (Fire Spread):
|
||
- Fire increases Temperature
|
||
- Temperature increases Fire Spread Rate
|
||
- Fire Spread Rate increases Fire Area
|
||
- Fire Area increases Temperature (of adjacent tiles)
|
||
- **LOOP**: Fire → Temp → Spread → More Fire → More Temp → ...
|
||
|
||
**Step 2: Classify Loop Type**
|
||
|
||
Positive loop (each arrow is positive, or even number of negatives):
|
||
- Fire → (+) Temp → (+) Spread → (+) More Fire
|
||
- **Positive feedback** = Runaway growth
|
||
|
||
**Step 3: Add Negative Feedback**
|
||
|
||
To balance positive loop, add negative feedback:
|
||
|
||
- Fire → Consumes Fuel → (-) Available Fuel → (-) Fire Duration → Fire Stops
|
||
- Fire → Produces Smoke → (-) Oxygen Level → (-) Fire Intensity
|
||
|
||
Now:
|
||
- **Positive feedback**: Fire → Temp → Spread (growth)
|
||
- **Negative feedback**: Fire → Fuel Depletion → Stop (limit)
|
||
|
||
**Step 4: Model Equilibrium**
|
||
|
||
Where do loops balance?
|
||
|
||
```
|
||
Positive growth rate: +10 area/second (fire spreads)
|
||
Negative depletion rate: -2 area/second (fuel consumed)
|
||
Net growth: +8 area/second initially
|
||
|
||
As fire grows:
|
||
- More area = more fuel consumption
|
||
- Eventually: Consumption rate = Spread rate
|
||
- Equilibrium: Fire stops growing, maintains size
|
||
```
|
||
|
||
**Step 5: Tune Time Constants**
|
||
|
||
Time constant = How long until equilibrium?
|
||
|
||
Too fast: System stabilizes immediately (boring, no emergence)
|
||
Too slow: System runs away before stabilizing (uncontrollable)
|
||
|
||
Good range: 10-60 seconds for most gameplay systems
|
||
|
||
**Step 6: Add Player Agency**
|
||
|
||
Player should be able to influence feedback loops:
|
||
|
||
- Player can extinguish fire (adds negative feedback)
|
||
- Player can add fuel (adds positive feedback)
|
||
- Player can create firebreaks (limits spread)
|
||
|
||
**Step 7: Implement Dampening Mechanisms**
|
||
|
||
Code pattern:
|
||
```python
|
||
class Fire:
|
||
def __init__(self):
|
||
self.area = 1.0 # Current fire size
|
||
self.fuel = 100.0 # Available fuel
|
||
self.spread_rate = 1.0 # Base spread rate
|
||
|
||
def update(self, dt):
|
||
# Positive feedback: Fire spreads based on temperature
|
||
growth = self.spread_rate * self.area * dt
|
||
|
||
# Negative feedback: Consumes fuel
|
||
fuel_consumption = self.area * 0.5 * dt
|
||
self.fuel -= fuel_consumption
|
||
|
||
# Negative feedback: Spread rate decreases as fuel depletes
|
||
fuel_factor = self.fuel / 100.0 # 0.0 to 1.0
|
||
actual_growth = growth * fuel_factor
|
||
|
||
self.area += actual_growth
|
||
|
||
# Stabilization: Fire stops if no fuel
|
||
if self.fuel <= 0:
|
||
self.area -= self.area * 0.1 * dt # Fire dies out
|
||
```
|
||
|
||
**Step 8: Test for Runaway**
|
||
|
||
Simulation test:
|
||
```python
|
||
# Worst-case test: Infinite fuel
|
||
fire.fuel = float('inf')
|
||
for i in range(1000):
|
||
fire.update(dt=1.0)
|
||
assert fire.area < MAX_REASONABLE_SIZE, "Fire runaway detected"
|
||
```
|
||
|
||
If test fails, add more negative feedback or reduce positive feedback strength.
|
||
|
||
**Step 9: Test for Stagnation**
|
||
|
||
Simulation test:
|
||
```python
|
||
# Best-case test: Optimal conditions
|
||
fire.fuel = 1000.0
|
||
fire.spread_rate = 2.0
|
||
for i in range(100):
|
||
fire.update(dt=1.0)
|
||
assert fire.area > 1.0, "Fire never grows (over-dampened)"
|
||
```
|
||
|
||
If test fails, reduce negative feedback or increase positive feedback strength.
|
||
|
||
|
||
## IMPLEMENTATION PATTERN #4: Cascade Chain Design
|
||
|
||
### Step-by-Step Process
|
||
|
||
**Step 1: Define Event Types**
|
||
|
||
Events = Things that can trigger other things
|
||
|
||
Example:
|
||
- Impact (collision)
|
||
- Ignition (fire starts)
|
||
- Explosion (blast force)
|
||
- Electric current
|
||
- Water flow
|
||
- Object break
|
||
|
||
**Step 2: Define Trigger Conditions**
|
||
|
||
For each object, define what events it emits and what events trigger it:
|
||
|
||
```python
|
||
class ExplosiveBarrel:
|
||
def on_impact(self, force):
|
||
if force > 50:
|
||
self.emit(ExplosionEvent(self.position, damage=100))
|
||
|
||
def on_ignition(self):
|
||
self.emit(ExplosionEvent(self.position, damage=100))
|
||
|
||
def on_electric_current(self, voltage):
|
||
if voltage > 20:
|
||
self.emit(ExplosionEvent(self.position, damage=100))
|
||
|
||
class WoodObject:
|
||
def on_ignition(self):
|
||
self.emit(FireEvent(self.position, intensity=10))
|
||
|
||
def on_impact(self, force):
|
||
if force > 100:
|
||
self.emit(BreakEvent(self.position, debris=5))
|
||
|
||
class GlassObject:
|
||
def on_impact(self, force):
|
||
if force > 20:
|
||
self.emit(ShatterEvent(self.position, shards=10))
|
||
|
||
def on_fire(self, temperature):
|
||
if temperature > 500:
|
||
self.emit(ShatterEvent(self.position, shards=10))
|
||
```
|
||
|
||
**Step 3: Define Event Propagation**
|
||
|
||
Events affect nearby objects:
|
||
|
||
```python
|
||
class ExplosionEvent:
|
||
def propagate(self, world):
|
||
nearby_objects = world.get_objects_in_radius(self.position, radius=10)
|
||
for obj in nearby_objects:
|
||
force = calculate_force(self.damage, distance(obj, self.position))
|
||
obj.on_impact(force)
|
||
obj.on_ignition() # Explosions create fire
|
||
|
||
class FireEvent:
|
||
def propagate(self, world):
|
||
nearby_objects = world.get_objects_in_radius(self.position, radius=2)
|
||
for obj in nearby_objects:
|
||
if obj.flammable:
|
||
obj.on_ignition()
|
||
```
|
||
|
||
**Step 4: Add Dampening**
|
||
|
||
Each step in cascade has probability to continue:
|
||
|
||
```python
|
||
class ExplosionEvent:
|
||
def propagate(self, world):
|
||
nearby_objects = world.get_objects_in_radius(self.position, radius=10)
|
||
for obj in nearby_objects:
|
||
force = calculate_force(self.damage, distance(obj, self.position))
|
||
|
||
# Dampening: Force decreases with distance
|
||
if force > obj.impact_threshold:
|
||
obj.on_impact(force)
|
||
|
||
# Dampening: Only 50% chance to ignite at distance
|
||
ignition_chance = 1.0 / (1 + distance(obj, self.position))
|
||
if random() < ignition_chance:
|
||
obj.on_ignition()
|
||
```
|
||
|
||
**Step 5: Instrument Cascade Tracking**
|
||
|
||
Track cascade chains for metrics:
|
||
|
||
```python
|
||
class EventSystem:
|
||
def __init__(self):
|
||
self.cascade_depth = 0
|
||
self.max_cascade_depth = 0
|
||
|
||
def emit(self, event):
|
||
self.cascade_depth += 1
|
||
self.max_cascade_depth = max(self.max_cascade_depth, self.cascade_depth)
|
||
|
||
event.propagate(self.world)
|
||
|
||
self.cascade_depth -= 1
|
||
|
||
def get_metrics(self):
|
||
return {
|
||
"max_cascade_depth": self.max_cascade_depth,
|
||
"cascade_distribution": self.cascade_histogram
|
||
}
|
||
```
|
||
|
||
**Step 6: Test Cascade Lengths**
|
||
|
||
```python
|
||
def test_cascade_distribution():
|
||
world = World()
|
||
# Setup: 100 explosive barrels in grid
|
||
|
||
# Trigger: Explode one barrel
|
||
world.explode(barrel_0)
|
||
|
||
metrics = world.event_system.get_metrics()
|
||
|
||
# Assert: Most cascades are 2-4 steps
|
||
assert metrics["max_cascade_depth"] >= 3, "No cascades happening"
|
||
assert metrics["max_cascade_depth"] < 20, "Infinite cascade detected"
|
||
```
|
||
|
||
**Step 7: Add Cascade Cooldowns**
|
||
|
||
Prevent same object from triggering twice in short time:
|
||
|
||
```python
|
||
class ExplosiveBarrel:
|
||
def __init__(self):
|
||
self.last_trigger_time = 0
|
||
self.cooldown = 1.0 # seconds
|
||
|
||
def on_impact(self, force, current_time):
|
||
if current_time - self.last_trigger_time < self.cooldown:
|
||
return # Ignore impact (cooldown active)
|
||
|
||
if force > 50:
|
||
self.emit(ExplosionEvent(self.position, damage=100))
|
||
self.last_trigger_time = current_time
|
||
```
|
||
|
||
|
||
## IMPLEMENTATION PATTERN #5: Systemic Solution Architecture
|
||
|
||
### Step-by-Step Process
|
||
|
||
**Step 1: Define Challenges as Constraints, Not Solutions**
|
||
|
||
Bad (scripted):
|
||
```python
|
||
class LockedDoor:
|
||
required_item = "RedKey"
|
||
|
||
def attempt_open(self, player):
|
||
if player.has_item(self.required_item):
|
||
self.open()
|
||
else:
|
||
self.show_message("You need the Red Key")
|
||
```
|
||
|
||
Good (systemic):
|
||
```python
|
||
class Door:
|
||
def __init__(self):
|
||
self.has_lock = True
|
||
self.lock_strength = 50 # Hacking difficulty
|
||
self.hinge_strength = 100 # Explosive damage required
|
||
self.is_open = False
|
||
|
||
def attempt_open(self, player):
|
||
if not self.has_lock:
|
||
self.is_open = True
|
||
|
||
def on_hack_attempt(self, skill):
|
||
if skill > self.lock_strength:
|
||
self.has_lock = False
|
||
|
||
def on_explosive_damage(self, damage):
|
||
self.hinge_strength -= damage
|
||
if self.hinge_strength <= 0:
|
||
self.is_open = True
|
||
self.emit(DebrisEvent()) # Door blown off hinges
|
||
|
||
def on_unlock_spell(self):
|
||
self.has_lock = False
|
||
```
|
||
|
||
**Why better**: Player can solve with hacking, explosives, magic—not just finding key.
|
||
|
||
**Step 2: Give Objects Properties, Not Functions**
|
||
|
||
Bad (hard-coded):
|
||
```python
|
||
class Keycard:
|
||
def use(self):
|
||
return "OpensDoor"
|
||
```
|
||
|
||
Good (property-based):
|
||
```python
|
||
class Keycard:
|
||
def __init__(self):
|
||
self.rfid_signature = "ABC123"
|
||
self.physical_properties = {
|
||
"flammable": False,
|
||
"conductive": True,
|
||
"mass": 0.01
|
||
}
|
||
|
||
class Door:
|
||
def __init__(self):
|
||
self.required_rfid = "ABC123"
|
||
|
||
def check_rfid(self, item):
|
||
if hasattr(item, 'rfid_signature'):
|
||
return item.rfid_signature == self.required_rfid
|
||
return False
|
||
```
|
||
|
||
**Why better**: Now players can clone RFID, spoof signature, steal card, or use physics to bypass door.
|
||
|
||
**Step 3: Query Simulation State, Don't Script Triggers**
|
||
|
||
Bad (scripted AI):
|
||
```python
|
||
class EnemyAI:
|
||
def update(self):
|
||
if self.state == "PATROL":
|
||
self.patrol_route()
|
||
elif self.state == "ALERT":
|
||
self.search_for_player()
|
||
elif self.state == "COMBAT":
|
||
self.attack_player()
|
||
```
|
||
|
||
Good (simulation-query AI):
|
||
```python
|
||
class EnemyAI:
|
||
def update(self):
|
||
# Query simulation
|
||
visible_threats = self.vision_system.get_visible_objects(type="Threat")
|
||
nearby_fire = self.environment.query(type="Fire", radius=5)
|
||
nearby_cover = self.environment.query(type="Cover", radius=10)
|
||
|
||
# Decide based on simulation state
|
||
if visible_threats:
|
||
if nearby_cover:
|
||
self.move_to_cover(nearby_cover[0])
|
||
self.attack(visible_threats[0])
|
||
elif nearby_fire:
|
||
self.flee_from(nearby_fire[0])
|
||
else:
|
||
self.patrol()
|
||
```
|
||
|
||
**Why better**: AI reacts to fire, explosions, physics objects—not just player. Emergent tactics appear.
|
||
|
||
**Step 4: Use Verb System, Not Item System**
|
||
|
||
Bad (item-centric):
|
||
```python
|
||
class Player:
|
||
def use_item(self, item):
|
||
if item.type == "Key":
|
||
self.unlock_door()
|
||
elif item.type == "Explosive":
|
||
self.place_explosive()
|
||
elif item.type == "Medkit":
|
||
self.heal()
|
||
```
|
||
|
||
Good (verb-centric):
|
||
```python
|
||
class Player:
|
||
def attach(self, item, target):
|
||
# General-purpose verb
|
||
if item.can_attach_to(target):
|
||
target.add_attachment(item)
|
||
|
||
def ignite(self, target):
|
||
# General-purpose verb
|
||
if target.flammable:
|
||
target.on_ignition()
|
||
|
||
def throw(self, item, direction, force):
|
||
# General-purpose verb
|
||
item.apply_force(direction * force)
|
||
```
|
||
|
||
**Why better**: Players discover combinations: attach explosive to object → throw object → detonate mid-air.
|
||
|
||
**Step 5: Make Challenges Orthogonal to Mechanics**
|
||
|
||
Design N mechanics and M challenges such that each challenge can be solved by multiple mechanics.
|
||
|
||
Example:
|
||
```
|
||
Mechanics: [Hacking, Explosives, Stealth, Physics, Social]
|
||
Challenges:
|
||
- Reach Upper Floor: [Physics (stack boxes), Stealth (climb vent), Explosives (blow floor), Social (convince guard)]
|
||
- Disable Security: [Hacking (terminal), Explosives (destroy cameras), Stealth (avoid cameras), Social (bribe guard)]
|
||
- Obtain Keycard: [Stealth (pickpocket), Social (convince NPC), Hacking (clone RFID), Physics (loot from distance)]
|
||
```
|
||
|
||
**Orthogonality check**: Each challenge solvable by 3+ mechanics? Yes. → Good.
|
||
|
||
|
||
## COMMON PITFALL #1: Over-Constraint (No Emergence Possible)
|
||
|
||
### Symptom
|
||
|
||
- Players discover creative solution, you patch it out
|
||
- Every puzzle has one intended solution
|
||
- Playtesters all use same approach
|
||
- "You must do X to proceed" gates
|
||
|
||
### Why It Happens
|
||
|
||
- Designer wants control over pacing and story
|
||
- Fear of sequence breaking
|
||
- Lack of confidence in systemic design
|
||
- Easier to script one solution than design multiple
|
||
|
||
### Example
|
||
|
||
**Game**: Bioshock (2007)
|
||
**Pitfall**: Hacking minigame is pipe puzzle with one solution
|
||
**Result**: Player must solve specific puzzle (no creativity), breaks immersion
|
||
|
||
**Contrast**: Prey (2017)
|
||
**Solution**: Hacking is one option among many (GLOO climb, Mimic into vent, break window, possess NPC)
|
||
**Result**: Player chooses method based on playstyle
|
||
|
||
### How to Avoid
|
||
|
||
1. **Constraint audit**: For each challenge, list 3+ solutions BEFORE implementing
|
||
2. **Playtest for diversity**: Do different players solve it differently?
|
||
3. **Remove binary gates**: Replace "must have key" with "lock can be picked/blown/hacked/bypassed"
|
||
4. **Embrace sequence breaking**: If player skips content creatively, that's a feature
|
||
|
||
### How to Fix
|
||
|
||
If already over-constrained:
|
||
|
||
1. **Identify bottlenecks**: Where are players forced into single path?
|
||
2. **Add alternative mechanics**: Can physics/chemistry/abilities solve this differently?
|
||
3. **Replace keys with properties**: "Lock strength 50" instead of "requires Red Key"
|
||
4. **Test again**: Did solution diversity increase?
|
||
|
||
|
||
## COMMON PITFALL #2: Under-Constraint (Chaos Without Depth)
|
||
|
||
### Symptom
|
||
|
||
- Players confused what to do
|
||
- Random experimentation is only strategy
|
||
- No skill development (outcomes feel arbitrary)
|
||
- Too many options = choice paralysis
|
||
|
||
### Why It Happens
|
||
|
||
- "More options = more emergent" fallacy
|
||
- No clear goals or feedback
|
||
- Mechanics don't have meaningful differences
|
||
- No constraints to push against
|
||
|
||
### Example
|
||
|
||
**Game**: Early Minecraft (Alpha)
|
||
**Pitfall**: No goals, no progression, just "build whatever"
|
||
**Result**: Some players loved it, many quit (no direction)
|
||
|
||
**Solution**: Minecraft added:
|
||
- Survival mode (constraint: stay alive)
|
||
- The End (goal: defeat Ender Dragon)
|
||
- Achievements (guided progression)
|
||
|
||
**Result**: Constraints gave players direction while maintaining creative freedom.
|
||
|
||
### How to Avoid
|
||
|
||
1. **Clear goals**: Even sandbox games need goals (player-chosen or designer-provided)
|
||
2. **Feedback loops**: Players need to know if their actions are effective
|
||
3. **Tiered complexity**: Start constrained (tutorial), open up gradually
|
||
4. **Meaningful differences**: Each option should have clear tradeoffs
|
||
|
||
### How to Fix
|
||
|
||
If already under-constrained:
|
||
|
||
1. **Add goals**: Short-term, medium-term, long-term objectives
|
||
2. **Add feedback**: Visual/audio cues when mechanics interact
|
||
3. **Add progression**: Unlock mechanics gradually (not all at once)
|
||
4. **Reduce redundancy**: Remove mechanics that don't add meaningful choices
|
||
|
||
|
||
## COMMON PITFALL #3: Dominant Strategies (Optimization Kills Diversity)
|
||
|
||
### Symptom
|
||
|
||
- One strategy is always optimal
|
||
- Players use same tactic repeatedly
|
||
- Meta-game stagnates
|
||
- Variety exists but is suboptimal (players feel "forced" to optimize)
|
||
|
||
### Why It Happens
|
||
|
||
- Balancing is hard
|
||
- Some combinations unintentionally overpowered
|
||
- No counterplay to optimal strategy
|
||
- Playtesting didn't test for optimization
|
||
|
||
### Example
|
||
|
||
**Game**: Skyrim (2011)
|
||
**Pitfall**: Stealth archery is overwhelmingly powerful
|
||
**Result**: Even melee-focused players switch to stealth archery (dominant strategy)
|
||
|
||
**Why dominant**:
|
||
- High damage (sneak attack multiplier)
|
||
- Safe (range keeps player out of danger)
|
||
- No counterplay (enemies can't effectively counter stealth archery)
|
||
|
||
**Solution needed**: Nerf damage OR add counterplay (enemies with stealth detection, archers with shields, etc.)
|
||
|
||
### How to Avoid
|
||
|
||
1. **Test for dominance**: Have competitive players try to break your game
|
||
2. **Counterplay design**: Every strategy should have a counter-strategy
|
||
3. **Scissors-Paper-Rock**: Multiple strategies with circular counters
|
||
4. **Balance by situational strength**: Strategy A is best in situation X, Strategy B is best in situation Y
|
||
|
||
### How to Fix
|
||
|
||
If dominant strategy exists:
|
||
|
||
1. **Identify why it's dominant**: Damage? Safety? Resource efficiency?
|
||
2. **Add counterplay**: Enemies that specifically counter dominant strategy
|
||
3. **Nerf gently**: Reduce effectiveness 10-20% at a time (iterate)
|
||
4. **Buff alternatives**: Make other strategies more attractive (better than nerfing fun strategy)
|
||
|
||
**Example fix for Skyrim**:
|
||
- Add enemies with "Sixth Sense" perk (detect stealth archers)
|
||
- Add enemies with shields (block arrows)
|
||
- Add enemies that close distance quickly (negate range advantage)
|
||
- Buff melee with crowd control (makes melee more fun)
|
||
|
||
|
||
## COMMON PITFALL #4: Non-Interacting Systems (Isolated Mechanics)
|
||
|
||
### Symptom
|
||
|
||
- Physics doesn't affect AI
|
||
- Chemistry doesn't affect physics
|
||
- Systems run in parallel, not in interaction
|
||
- "Integration tests" mentioned but not designed
|
||
|
||
### Why It Happens
|
||
|
||
- Systems built by different teams
|
||
- Architecture doesn't support cross-system communication
|
||
- Each system designed in isolation
|
||
- "Integration" is left to end of project (never happens)
|
||
|
||
### Example
|
||
|
||
**Baseline response in RED test**:
|
||
```
|
||
PhysicsEngine (separate)
|
||
ChemistryEngine (separate)
|
||
AIController (separate)
|
||
```
|
||
|
||
**Why this fails**: How does AI react to chemistry? How does physics trigger chemical reactions? Architecture prevents interaction.
|
||
|
||
### How to Avoid
|
||
|
||
1. **Shared simulation state**: All systems read/write to common world state
|
||
2. **Event system**: Systems emit events, other systems listen
|
||
3. **Design interactions first**: Before implementing systems, design interaction matrix
|
||
4. **Integrate early**: Week 1 should have basic versions of all systems interacting
|
||
|
||
### How to Fix
|
||
|
||
If systems are isolated:
|
||
|
||
1. **Add event system**:
|
||
```python
|
||
class EventBus:
|
||
def emit(self, event_type, data):
|
||
for listener in self.listeners[event_type]:
|
||
listener.handle(data)
|
||
|
||
# Physics emits events
|
||
physics.emit("Collision", {objA, objB, force})
|
||
|
||
# Chemistry listens
|
||
chemistry.on_collision(objA, objB, force)
|
||
```
|
||
|
||
2. **Create interaction layer**:
|
||
```python
|
||
class InteractionSystem:
|
||
def __init__(self, physics, chemistry, ai):
|
||
self.physics = physics
|
||
self.chemistry = chemistry
|
||
self.ai = ai
|
||
|
||
def update(self):
|
||
# Check for interactions
|
||
for fire in self.chemistry.get_fires():
|
||
self.ai.notify_fire(fire.position)
|
||
self.physics.apply_heat(fire.position, fire.temperature)
|
||
```
|
||
|
||
3. **Refactor architecture**: Move from isolated engines to unified simulation.
|
||
|
||
|
||
## COMMON PITFALL #5: Prescribing Solutions (Telling Instead of Enabling)
|
||
|
||
### Symptom
|
||
|
||
- Tutorial says "Use fire to melt ice"
|
||
- Loading screen tips: "Shoot explosive barrels to kill grouped enemies"
|
||
- Designer has already solved puzzles for player
|
||
- Players follow instructions instead of experimenting
|
||
|
||
### Why It Happens
|
||
|
||
- Fear players won't discover mechanics
|
||
- Playtester says "I didn't know I could do that" → designer adds tutorial
|
||
- Desire to showcase mechanics
|
||
- Lack of trust in player creativity
|
||
|
||
### Example
|
||
|
||
**Bad**: Tutorial popup: "Use GLOO gun to climb walls!"
|
||
**Better**: Player sees GLOO creates platforms, experiments, discovers climbing
|
||
**Best**: Level design encourages experimentation (high ledge with GLOO ammo nearby, no popup)
|
||
|
||
### How to Avoid
|
||
|
||
1. **Show, don't tell**: Environmental storytelling (NPC using mechanic, visual cues)
|
||
2. **Trust players**: Players will experiment if mechanics are intuitive
|
||
3. **Reward discovery**: Players feel smart when they discover solutions
|
||
4. **Resist tutorial creep**: Not every mechanic needs explanation
|
||
|
||
### How to Fix
|
||
|
||
If already prescribing solutions:
|
||
|
||
1. **Remove explicit tutorials**: Delete "Do X to solve Y" instructions
|
||
2. **Add environmental hints**: NPC corpse surrounded by ice + nearby fire source = implicit hint
|
||
3. **Reward experimentation**: Achievement for discovering creative solutions
|
||
4. **Playtest with zero guidance**: Can players discover mechanics without help?
|
||
|
||
|
||
## REAL-WORLD EXAMPLE #1: Breath of the Wild (Physics + Chemistry Emergence)
|
||
|
||
### What Makes It Emergent
|
||
|
||
**Orthogonal Mechanics**:
|
||
- Fire: Burns wood, creates updrafts, melts ice, lights torches, scares animals
|
||
- Ice: Freezes water (platforms), creates slippery surfaces, brittleness (shatter damage)
|
||
- Electricity: Conducts through metal/water, stuns enemies, magnetizes metal (Magnesis rune)
|
||
- Wind: Affects glider, pushes objects, extinguishes fire, affects projectiles
|
||
- Stasis: Freezes object in time, stores kinetic energy, released when unfrozen
|
||
- Magnesis: Moves metal objects, creates platforms, weaponizes objects
|
||
|
||
**Interaction Matrix** (Sample):
|
||
```
|
||
Fire + Wood = Burns (damage over time, light source)
|
||
Fire + Ice = Melts (ice becomes water)
|
||
Fire + Updraft = Glider lift (traversal)
|
||
Ice + Water = Freezing (platform creation)
|
||
Ice + Weapon = Frozen weapon (brittleness bonus)
|
||
Electricity + Metal = Conduction (chain damage)
|
||
Electricity + Water = Electrified water (area damage)
|
||
Stasis + Hit = Kinetic energy storage (launch objects)
|
||
Magnesis + Metal = Manipulation (puzzles, combat, traversal)
|
||
```
|
||
|
||
**Cascade Chains**:
|
||
1. Player shoots fire arrow at grass
|
||
2. Grass burns, fire spreads
|
||
3. Fire creates updraft (hot air rises)
|
||
4. Player uses paraglider in updraft
|
||
5. Gains altitude to reach high platform
|
||
|
||
Length: 5 steps, highly emergent
|
||
|
||
**Systemic Solutions**:
|
||
|
||
Challenge: Reach high platform
|
||
- Solution 1: Climb wall (stamina required)
|
||
- Solution 2: Fire updraft + glider
|
||
- Solution 3: Stasis boulder, hit it, launch up
|
||
- Solution 4: Magnesis metal box, stack, climb
|
||
- Solution 5: Ice pillar from water, climb
|
||
|
||
Result: 5+ solutions, all emergent (not explicitly taught)
|
||
|
||
### Key Lessons
|
||
|
||
1. **Simple rules, complex outcomes**: 6 core mechanics, 30+ interactions
|
||
2. **Consistent physics**: Fire always burns wood, ice always melts from fire
|
||
3. **Environmental design**: Levels designed to hint at interactions without prescribing
|
||
4. **Trust players**: No tutorial says "Burn grass for updraft", players discover it
|
||
|
||
|
||
## REAL-WORLD EXAMPLE #2: Dwarf Fortress (Simulation Depth)
|
||
|
||
### What Makes It Emergent
|
||
|
||
**Simulation Properties** (Hundreds):
|
||
- Each dwarf: Personality traits, relationships, skills, injuries, mental state, needs
|
||
- Each material: Melting point, sharpness, density, value, color
|
||
- Each creature: Body parts, can bleed, can feel pain, can rage
|
||
- World simulation: Weather, seasons, civilizations, history generation
|
||
|
||
**Interaction Matrix** (Massive):
|
||
- Water + Magma = Obsidian + Steam
|
||
- Alcohol + Dwarf (trait: alcoholic) = Happiness boost
|
||
- Injury (severed leg) + Dwarf = Reduced mobility + bleeding
|
||
- Cat + Vermin = Hunt (food source)
|
||
- Too many cats + Vermin depletion = Cat starvation
|
||
|
||
**Emergence Examples**:
|
||
|
||
1. **The Cat Cascade**:
|
||
- Player adopts cats for vermin control
|
||
- Cats breed rapidly
|
||
- Too many cats deplete vermin population
|
||
- Cats starve, corpses rot
|
||
- Dwarves depressed by dead cats
|
||
- Fortress falls to unhappiness cascade
|
||
|
||
2. **The Unfortunate Alcohol Incident**:
|
||
- Dwarf walks through spilled alcohol
|
||
- Alcohol on dwarf ignites near torch
|
||
- Dwarf catches fire
|
||
- Runs through barracks
|
||
- Ignites bedding
|
||
- Barracks burns down
|
||
|
||
3. **The Artifact Obsession**:
|
||
- Dwarf becomes obsessed (personality trait + mood)
|
||
- Demands specific materials for artifact
|
||
- Materials unavailable
|
||
- Dwarf goes insane
|
||
- Kills other dwarves (berserk)
|
||
- Fortress in chaos
|
||
|
||
**Feedback Loops**:
|
||
- Positive: More dwarves → more labor → more resources → support more dwarves
|
||
- Negative: More dwarves → more consumption → resource depletion → starvation
|
||
- Player manages equilibrium
|
||
|
||
### Key Lessons
|
||
|
||
1. **Deep simulation creates emergent stories**: Players share stories of disasters and triumphs
|
||
2. **Feedback loops drive drama**: Cascading failures are memorable
|
||
3. **Complexity from properties**: Hundreds of properties = thousands of interactions
|
||
4. **Unintended interactions are features**: Cat cascade wasn't designed, but became legendary
|
||
|
||
|
||
## REAL-WORLD EXAMPLE #3: Minecraft (Simple → Complex Combinatorics)
|
||
|
||
### What Makes It Emergent
|
||
|
||
**Simple Core Mechanics**:
|
||
- Place blocks
|
||
- Break blocks
|
||
- Blocks have properties (solid, flammable, conductive)
|
||
- Redstone transmits signal
|
||
|
||
**Emergent Complexity**:
|
||
|
||
From 4 simple mechanics, players created:
|
||
- Logic gates (AND, OR, NOT)
|
||
- Arithmetic circuits (adders, multipliers)
|
||
- Memory (RAM, registers)
|
||
- Computers (functioning CPUs)
|
||
- Games within game (Pong, Snake)
|
||
|
||
**Interaction Matrix** (Redstone):
|
||
```
|
||
Redstone + Block = Signal transmission
|
||
Redstone + Torch = NOT gate (inverter)
|
||
Redstone + Repeater = Signal delay + amplification
|
||
Redstone + Piston = Mechanical movement
|
||
Redstone + Hopper = Item transport
|
||
Redstone + Comparator = Signal comparison (branching logic)
|
||
```
|
||
|
||
6 core redstone components × 6 = 36 interactions → Infinite computational complexity
|
||
|
||
**Cascade Example**:
|
||
|
||
Button press → Redstone signal → Piston extends → Pushes block → Triggers pressure plate → Opens door → Activates hopper → Drops item → Triggers comparator → Loops back
|
||
|
||
Length: 9 steps, player-designed
|
||
|
||
### Key Lessons
|
||
|
||
1. **Turing completeness from simple rules**: Redstone is Turing-complete (can compute anything)
|
||
2. **Combinatorial explosion**: 6 components → infinite possibilities
|
||
3. **No prescriptive tutorials**: Players discovered redstone computers organically
|
||
4. **Community-driven emergence**: Players teach each other discoveries
|
||
|
||
|
||
## REAL-WORLD EXAMPLE #4: Deus Ex (Systemic Solutions)
|
||
|
||
### What Makes It Emergent
|
||
|
||
**Design Philosophy**: "One game, many paths"
|
||
|
||
**Core Systems**:
|
||
- Combat (lethal/non-lethal)
|
||
- Stealth (vision cones, sound propagation)
|
||
- Hacking (computers, security)
|
||
- Social (dialogue, persuasion)
|
||
- Augmentations (player abilities)
|
||
- Environment (destructible, climbable, manipulable)
|
||
|
||
**Systemic Solution Example**:
|
||
|
||
Challenge: Reach NSF headquarters upper floor
|
||
|
||
**Solution 1 (Combat)**: Fight through front door, kill all guards
|
||
**Solution 2 (Stealth)**: Side entrance, lockpick door, avoid patrols
|
||
**Solution 3 (Hacking)**: Hack security, disable cameras, waltz in
|
||
**Solution 4 (Social)**: Convince guard to let you in (dialogue skill)
|
||
**Solution 5 (Physics)**: Stack crates, jump from adjacent building
|
||
**Solution 6 (Augmentations)**: Cloak augmentation, walk past guards
|
||
**Solution 7 (Hybrid)**: Tranquilize guard, steal keycard, use front door
|
||
|
||
Result: 7+ solutions, all viable, players choose based on playstyle and resources
|
||
|
||
**No Dominant Strategy**:
|
||
- Combat is loud (attracts reinforcements)
|
||
- Stealth is slow (time pressure in some missions)
|
||
- Hacking requires skill investment
|
||
- Social requires previous dialogue choices
|
||
- Physics is unpredictable (crates fall)
|
||
|
||
Tradeoffs ensure no one solution always wins.
|
||
|
||
### Key Lessons
|
||
|
||
1. **Systems orthogonal to challenges**: 6 systems, each challenge solvable by 3+ systems
|
||
2. **No "intended" solution**: Designer supports all approaches equally
|
||
3. **Resource constraints create choices**: Limited ammo/energy forces variety
|
||
4. **Playstyle expression**: Players develop personal playstyle (ghost, rambo, hacker)
|
||
|
||
|
||
## REAL-WORLD EXAMPLE #5: Prey (2017) (Typhon Powers Emergence)
|
||
|
||
### What Makes It Emergent
|
||
|
||
**Orthogonal Powers**:
|
||
- Mimic: Transform into any object (infiltration, hiding, traversal)
|
||
- Lift Field: Create gravity well, lift objects (combat, traversal, physics puzzles)
|
||
- Kinetic Blast: Explosive force (combat, move objects, break structures)
|
||
- Electrostatic Burst: Electric damage + EMP (combat, disable electronics)
|
||
- Thermal: Fire damage (combat, melt ice, ignite objects)
|
||
- Phantom Shift: Teleport (combat, traversal, stealth)
|
||
|
||
**Interaction Matrix**:
|
||
```
|
||
Mimic + Small object = Infiltrate vents
|
||
Mimic + Physics = Bypass "object weight" gates
|
||
Lift Field + Combat = Levitate enemies (disable, fall damage)
|
||
Lift Field + Traversal = Levitate self on object
|
||
Kinetic Blast + Lift Field = Launch objects at high velocity
|
||
Electrostatic + Water = Electrified area
|
||
Thermal + Ice = Melt frozen paths
|
||
Phantom Shift + Combat = Tactical repositioning
|
||
```
|
||
|
||
**Emergent Solution Example**:
|
||
|
||
Challenge: Reach high area, door locked from inside
|
||
|
||
**Solution 1 (Intended)**: Find keycard elsewhere
|
||
**Solution 2 (GLOO gun)**: Shoot GLOO upward, climb platforms (emergent)
|
||
**Solution 3 (Mimic)**: Transform into small object, go through vent
|
||
**Solution 4 (Lift Field)**: Levitate on object (trash can), float upward
|
||
**Solution 5 (Recycler Charge)**: Throw charge near door, suck door inward (physics exploit)
|
||
|
||
**Designer Decision**: GLOO climbing was unintended but kept as feature (fits immersive sim philosophy)
|
||
|
||
### Key Lessons
|
||
|
||
1. **Embrace unintended solutions**: GLOO climbing became beloved mechanic
|
||
2. **Physics as mechanic**: Consistent physics enables creative solutions
|
||
3. **Orthogonal powers**: Each power opens different possibilities
|
||
4. **Immersive sim philosophy**: "If player is creative, it's a feature"
|
||
|
||
|
||
## CROSS-REFERENCES
|
||
|
||
### Prerequisites (Learn These First)
|
||
|
||
**From bravos/simulation-tactics** (Pack 3):
|
||
- **simulation-vs-faking**: Foundational skill for when to simulate vs fake
|
||
- **physics-simulation-patterns**: Physics interactions underpin emergence
|
||
- **ai-and-agent-simulation**: AI must react to emergent simulation state
|
||
|
||
**Why these matter**: Emergence requires simulation. Without simulation, you have scripted content. These skills teach how to build simulation foundations.
|
||
|
||
### Building on This Skill (Learn These Next)
|
||
|
||
**From bravos/systems-as-experience** (Pack 4 - this pack):
|
||
- **systemic-level-design**: Apply emergence principles to level design
|
||
- **dynamic-narrative-systems**: Emergent storytelling from player actions
|
||
- **player-driven-economies**: Economic emergence from trading/production systems
|
||
- **emergent-ai-behaviors**: AI that creates emergent squad tactics
|
||
- **procedural-content-from-rules**: Generate content from emergent rules
|
||
|
||
**Why these matter**: This skill teaches foundational emergence concepts. Other Pack 4 skills apply these concepts to specific domains.
|
||
|
||
### Related Skills (Complementary Knowledge)
|
||
|
||
**From ordis/security-architect** (Pack 1):
|
||
- **threat-modeling**: Emergence can create unintended security vulnerabilities
|
||
- **defense-in-depth**: Layered defenses parallel layered emergence dampening
|
||
|
||
**From muna/technical-writer** (Pack 2):
|
||
- **documentation-structure**: Document interaction matrices clearly
|
||
- **clarity-and-style**: Explain emergence to team without ambiguity
|
||
|
||
|
||
## TESTING CHECKLIST: How to Verify Emergence
|
||
|
||
Before shipping emergent system:
|
||
|
||
### 1. Orthogonality Tests
|
||
|
||
- [ ] **Property matrix filled**: Each mechanic affects different properties (60%+ off-diagonal)
|
||
- [ ] **Multiplication verified**: N mechanics create N×(N-1)/2 interactions (60-80% implemented)
|
||
- [ ] **No redundancy**: No two mechanics do "the same thing"
|
||
|
||
### 2. Interaction Tests
|
||
|
||
- [ ] **Interaction matrix documented**: All N×N interactions documented (60-80% implemented)
|
||
- [ ] **Cross-system interactions work**: Physics + Chemistry + AI all interact
|
||
- [ ] **Cascade chains possible**: 3-5 step chains happen regularly, 6+ steps rare
|
||
|
||
### 3. Feedback Loop Tests
|
||
|
||
- [ ] **Positive loops identified**: All growth/snowball loops documented
|
||
- [ ] **Negative loops implemented**: All positive loops have negative counterparts
|
||
- [ ] **Runaway test passed**: No infinite growth in worst-case scenario
|
||
- [ ] **Stagnation test passed**: Systems grow under optimal conditions
|
||
- [ ] **Equilibrium reached**: Systems stabilize within 10-60 seconds
|
||
|
||
### 4. Solution Diversity Tests
|
||
|
||
- [ ] **Multiple solutions exist**: Each challenge has 3+ solutions
|
||
- [ ] **Playtest diversity**: 10 players find 5+ unique solutions
|
||
- [ ] **Designer surprise**: Playtesters discover 5+ unintended solutions
|
||
- [ ] **No forced path**: No challenge requires specific item/ability
|
||
|
||
### 5. Dominant Strategy Tests
|
||
|
||
- [ ] **Optimal strategy identified**: Math or playtesting reveals best strategy
|
||
- [ ] **Usage < 70%**: Optimal strategy used <70% of time
|
||
- [ ] **Counterplay exists**: Every strategy has counter-strategy
|
||
- [ ] **Situational strength**: No strategy is best in all situations
|
||
|
||
### 6. Constraint Tests
|
||
|
||
- [ ] **Not over-constrained**: Playtest shows high solution diversity (5+ solutions)
|
||
- [ ] **Not under-constrained**: Playtest shows players aren't confused
|
||
- [ ] **Goldilocks zone**: 3-5 effective solutions, 1-2 optimal solutions per challenge
|
||
|
||
### 7. Architecture Tests
|
||
|
||
- [ ] **Systems interact**: Physics, Chemistry, AI communicate via events or shared state
|
||
- [ ] **No silos**: Systems aren't isolated modules
|
||
- [ ] **Consistent rules**: Same rules apply everywhere (no special cases)
|
||
|
||
### 8. Documentation Tests
|
||
|
||
- [ ] **Interaction matrix accessible**: Team can read and update matrix
|
||
- [ ] **Feedback loops documented**: All loops identified and classified
|
||
- [ ] **Cascade examples documented**: Sample 3-5 step chains written out
|
||
- [ ] **No prescriptive solutions**: Docs don't say "Use X to solve Y"
|
||
|
||
### 9. Performance Tests
|
||
|
||
- [ ] **Cascade dampening works**: No infinite cascades causing lag
|
||
- [ ] **Feedback loops stabilize**: No runaway systems causing performance collapse
|
||
- [ ] **Interaction count manageable**: Not checking N² interactions every frame
|
||
|
||
### 10. Player Experience Tests
|
||
|
||
- [ ] **Players feel creative**: Post-playtest surveys show "I felt creative/clever"
|
||
- [ ] **Replayability high**: Players want to replay to try different approaches
|
||
- [ ] **Emergent stories shared**: Players naturally share "cool thing that happened"
|
||
- [ ] **No frustration**: Players aren't confused or overwhelmed
|
||
|
||
|
||
## ANTI-PATTERNS: What NOT to Do
|
||
|
||
### Anti-Pattern #1: "Emergent" as Marketing Buzzword
|
||
|
||
**Symptom**: Claim game has "emergent gameplay" but it's actually scripted with random elements.
|
||
|
||
**Example**: "Emergent AI" that's just random behavior selection, not simulation-driven.
|
||
|
||
**Why bad**: Players feel deceived, "emergent" moments are actually scripted RNG.
|
||
|
||
**Fix**: Only claim emergence if systems truly interact to create surprising outcomes. Random ≠ Emergent.
|
||
|
||
|
||
### Anti-Pattern #2: Emergence Without Constraints
|
||
|
||
**Symptom**: "Players can do anything!" but no goals, feedback, or consequences.
|
||
|
||
**Example**: Garry's Mod with no objectives (fun for some, overwhelming for others).
|
||
|
||
**Why bad**: Emergence without constraints is chaos, not gameplay.
|
||
|
||
**Fix**: Provide clear goals, feedback loops, and constraints to push against.
|
||
|
||
|
||
### Anti-Pattern #3: Patching Emergent Tactics
|
||
|
||
**Symptom**: Players discover creative solution, designer patches it out as "unintended".
|
||
|
||
**Example**: Speed-running games patching glitches that speedrunners love.
|
||
|
||
**Why bad**: Kills player creativity, signals "don't experiment".
|
||
|
||
**Fix**: Use feature vs bug criteria. Only patch if trivializes ALL challenges or has no skill requirement.
|
||
|
||
|
||
### Anti-Pattern #4: Interaction Matrix with 10% Coverage
|
||
|
||
**Symptom**: Many mechanics listed, but they don't actually interact (isolated systems).
|
||
|
||
**Example**: Baseline RED test response (Physics, Chemistry, AI separate).
|
||
|
||
**Why bad**: No emergence if systems don't interact.
|
||
|
||
**Fix**: Target 60-80% interaction matrix coverage. If <50%, systems are too isolated.
|
||
|
||
|
||
### Anti-Pattern #5: Prescriptive Tutorials Killing Discovery
|
||
|
||
**Symptom**: Tutorial says "Use fire to melt ice", "Shoot barrels to kill enemies", etc.
|
||
|
||
**Example**: Loading screen tips that pre-solve puzzles.
|
||
|
||
**Why bad**: Players follow instructions instead of experimenting.
|
||
|
||
**Fix**: Show examples via environment (NPC using mechanic), don't tell explicitly.
|
||
|
||
|
||
## FINAL NOTES: The Emergence Mindset
|
||
|
||
### Design for Discovery, Not Instruction
|
||
|
||
- Players feel smartest when they discover solutions themselves
|
||
- Your job: Create possibility space, not guided tour
|
||
- Resist urge to "help" players by prescribing solutions
|
||
|
||
### Simple Rules, Complex Outcomes
|
||
|
||
- 3 mechanics with 10 properties each > 10 mechanics with 3 properties each
|
||
- Depth from interaction, not number of features
|
||
- Test: Can you explain core mechanics in 1 minute? If no, simplify.
|
||
|
||
### Trust Player Creativity
|
||
|
||
- Players will surprise you (this is good!)
|
||
- "I didn't intend that" is a feature, not a bug (if it adds depth)
|
||
- Best emergent games have designer humility: "I don't control outcomes, I set rules"
|
||
|
||
### Balance is Ongoing
|
||
|
||
- Emergence means meta-game evolves
|
||
- Dominant strategies will emerge (that's ok)
|
||
- Your job: Add counterplay, not remove strategies
|
||
|
||
### Embrace Failure
|
||
|
||
- Some interactions will be overpowered (patch them)
|
||
- Some interactions will be useless (remove them)
|
||
- Emergence is iterative, not one-shot design
|
||
|
||
|
||
## WHEN YOU'RE READY
|
||
|
||
Once you've mastered emergent gameplay design, you can apply these principles to specific domains:
|
||
|
||
- **Systemic level design**: Levels as possibility spaces
|
||
- **Dynamic narratives**: Stories that emerge from player actions
|
||
- **Player-driven economies**: Markets that self-balance
|
||
- **Emergent AI**: Squad tactics from individual behaviors
|
||
- **Procedural generation**: Content from rules, not templates
|
||
|
||
All of these build on the foundation you've learned here: Simple orthogonal rules → Complex emergent outcomes.
|
||
|
||
|
||
**Remember**: Emergence is not a feature you add. It's an architecture you design.
|