Browse/Narrative & Choice/Book / Readable System
Narrative & Choice

Book / Readable System

Design pattern addressing book / readable system, defining how this system creates engagement and supports the overall game experience.

High complexity
3 examples
2 patterns

Overview

This mechanic, commonly known as book / readable system, 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. Understanding the design principles behind this mechanic helps developers create more engaging and balanced game experiences.

Game Examples

Survival Horror Games

Survival Horror Games use this mechanic where players learn through failure to establish dominance in PvP. The feedback loop reinforces player engagement, resulting in build diversity.

Hack and Slash Games

Hack and Slash Games use this mechanic where players explore the environment to create unique character builds. The system rewards both skill and knowledge, resulting in risk-reward tension.

Turn-Based Strategy Games

Turn-Based Strategy Games use this mechanic where players optimize their build to overcome specific obstacles. Edge cases create memorable moments, resulting in build diversity.

Pros & Cons

Advantages

  • Encourages competitive playstyles and experimentation
  • Reduces frustration while maintaining challenge
  • Creates satisfying numerical loops
  • Encourages defensive playstyles and experimentation
  • Provides long-term engagement for dedicated players

Disadvantages

  • Creates potential for min-maxing by experienced players
  • Can lead to toxicity if overused
  • May conflict with progression systems in the game
  • Can become trivial in the late game
  • Difficult to balance across a wide range of skill levels

Implementation Patterns

Branching Engine

Core implementation pattern for handling book / readable system logic with clean state management.

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

Dialogue Dispatcher

Optimized pattern for book / readable system that minimizes per-frame computation cost.

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