Narrative & Choice

Wanted Poster

Core mechanic handling wanted poster, establishing the rules, constraints, and player interactions for this game system.

High complexity
2 examples
3 patterns

Overview

Wanted Poster represents a design pattern that establishes rules governing player behavior and system responses. Designers must carefully balance the system's depth against its learning curve, ensuring that new players can engage while experienced players find room for mastery. Modern implementations often combine this mechanic with procedural elements to increase variety and replayability.

Game Examples

Board Game Adaptations

Board Game Adaptations use this mechanic where players optimize their build to survive increasingly difficult challenges. The feedback loop reinforces player engagement, resulting in a deeply engaging gameplay loop.

Simulation Games

Simulation Games use this mechanic where players coordinate with teammates to optimize their strategy. The system supports both casual and hardcore engagement, resulting in narrative investment.

Pros & Cons

Advantages

  • Enhances mechanical without disrupting core gameplay
  • Rewards both team coordination and pattern recognition
  • Provides clear contextual feedback on player actions

Disadvantages

  • Can create repetitive when RNG is unfavorable
  • Requires significant server resources to implement well
  • Can become overpowered in the late game
  • May reduce game balance if implemented poorly

Implementation Patterns

Quest Tracker

Data-driven implementation that loads wanted poster configuration from external definitions.

class WantedPosterHandler {
  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();
  }
}

Story Engine

Data-driven implementation that loads wanted poster configuration from external definitions.

class WantedPosterSystem {
  currentNode: string = "start";
  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();
  }
}

Lore Database

Optimized pattern for wanted poster that minimizes per-frame computation cost.

class WantedPosterHandler {
  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();
  }
}