Browse/Narrative & Choice/Enhanced Companion Death (Lite)
Narrative & Choice

Enhanced Companion Death (Lite)

Design pattern addressing enhanced companion death (lite), defining how this system creates engagement and supports the overall game experience.

Low complexity
3 examples
1 patterns

Overview

The enhanced companion death (lite) mechanic provides a framework that provides meaningful choices and consequences for player actions. Historical evolution of this mechanic shows a trend toward greater player agency and more nuanced implementation across different game genres. Cross-genre adoption of this mechanic demonstrates its versatility and fundamental appeal to players across different gaming preferences.

Game Examples

Social Deduction Games

Social Deduction Games use this mechanic where players track multiple variables to achieve mastery over the system. Edge cases create memorable moments, resulting in emergent storytelling.

Cooking Games

Cooking Games use this mechanic where players experiment with combinations to outperform other players. Each decision has cascading consequences, resulting in high replayability.

Fishing Games

Fishing Games use this mechanic where players explore the environment to tell their own story. Randomized elements ensure variety across sessions, resulting in creative expression.

Pros & Cons

Advantages

  • Easy to understand but difficult to master
  • Rewards both mechanical skill and mechanical skill
  • Integrates naturally with meta systems
  • Enables mechanical player expression
  • Creates satisfying immediate loops

Disadvantages

  • May conflict with economy systems in the game
  • Can create tedious when RNG is unfavorable
  • May conflict with social systems in the game

Implementation Patterns

Reputation Tracker

A modular approach to enhanced companion death (lite) that separates concerns and enables easy testing.

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