Browse/Narrative & Choice/Simplified Companion Permadeath (Classic)
Narrative & Choice

Simplified Companion Permadeath (Classic)

Structured approach to simplified companion permadeath (classic) that balances depth with accessibility, creating satisfying player experiences.

Medium complexity
3 examples
1 patterns

Overview

The simplified companion permadeath (classic) mechanic provides a framework that establishes rules governing player behavior and system responses. The implementation varies significantly across genres, with each game adapting the core concept to fit its specific design goals and target audience. Modern implementations often combine this mechanic with procedural elements to increase variety and replayability.

Game Examples

Competitive Multiplayer Games

Competitive Multiplayer Games use this mechanic where players prioritize targets to reach the highest tier. The learning curve is steep but rewarding, resulting in risk-reward tension.

City Builders

City Builders use this mechanic where players manage resources carefully to min-max their character. The mechanic creates natural tension and release cycles, resulting in high replayability.

Stealth Games

Stealth Games use this mechanic where players solve environmental puzzles to create unique character builds. The system encourages experimentation, resulting in memorable moments.

Pros & Cons

Advantages

  • Creates satisfying visual loops
  • Easy to understand but difficult to master
  • Provides long-term collection objectives for dedicated players

Disadvantages

  • Risk of analysis paralysis in competitive environments
  • Can feel overwhelming if progression is too slow
  • May reduce game balance if implemented poorly
  • Requires significant player feedback to implement well

Implementation Patterns

NPC Scheduler

Data-driven implementation that loads simplified companion permadeath (classic) configuration from external definitions.

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