Browse/Narrative & Choice/Spy / Intelligence
Narrative & Choice

Spy / Intelligence

Mechanic governing spy / intelligence behavior, establishing rules for player interaction, feedback, and progression within this system.

Low complexity
2 examples
1 patterns

Overview

As a core game system, spy / intelligence balances complexity with accessibility to engage diverse audiences. The mechanic interacts with multiple other game systems, creating emergent gameplay that extends beyond its individual components. The ongoing evolution of this mechanic reflects the broader maturation of game design as a discipline.

Game Examples

Dungeon Crawlers

Dungeon Crawlers use this mechanic where players balance risk and reward to support their team effectively. Edge cases create memorable moments, resulting in risk-reward tension.

Roguelikes

Roguelikes use this mechanic where players invest in long-term growth to complete objectives efficiently. The learning curve is steep but rewarding, resulting in satisfying progression.

Pros & Cons

Advantages

  • Reduces frustration while maintaining challenge
  • Adds depth without excessive complexity
  • Scales well from beginner to advanced play

Disadvantages

  • May overwhelm new players with too many options
  • May create a complexity barrier for new players
  • Increases network requirements significantly

Implementation Patterns

Dialogue Processor

Event-driven pattern that reacts to spy / intelligence changes and updates dependent systems.

class SpyIntelligenceProcessor {
  currentNode: string = "intro";
  flags: Set<string> = new Set();

  getDialogue() {
    const node = DIALOGUE_TREE[this.currentNode];
    return {
      text: node.text,
      choices: node.choices.filter(c =>
        !c.requires || c.requires.every(f => this.flags.has(f))
      )
    };
  }

  choose(choiceIndex: number) {
    const node = DIALOGUE_TREE[this.currentNode];
    const choice = node.choices[choiceIndex];
    if (choice.setsFlag) this.flags.add(choice.setsFlag);
    this.currentNode = choice.next;
    return this.getDialogue();
  }
}