Browse/Narrative & Choice/Failed Quest Consequence
Narrative & Choice

Failed Quest Consequence

Core mechanic handling failed quest consequence, establishing the rules, constraints, and player interactions for this game system.

Low complexity
4 examples
3 patterns

Overview

As a core game system, failed quest consequence creates a structured experience around this game element. Historical evolution of this mechanic shows a trend toward greater player agency and more nuanced implementation across different game genres. Modern implementations often combine this mechanic with procedural elements to increase variety and replayability.

Game Examples

Fighting Games

Fighting Games use this mechanic where players customize their experience to maximize their effectiveness. Multiple valid strategies exist for different playstyles, resulting in memorable moments.

First-Person Shooters

First-Person Shooters use this mechanic where players allocate limited resources to optimize their strategy. Each decision has cascading consequences, resulting in competitive depth.

Flight Simulators

Flight Simulators use this mechanic where players prioritize targets to achieve mastery over the system. The mechanic creates natural tension and release cycles, resulting in skill differentiation.

Cooperative Games

Cooperative Games use this mechanic where players customize their experience to min-max their character. The mechanic integrates seamlessly with other systems, resulting in build diversity.

Pros & Cons

Advantages

  • Balances economic against spatial effectively
  • Provides long-term progression targets for dedicated players
  • Enhances social without disrupting core gameplay
  • Enables creative player expression

Disadvantages

  • Can create frustrating when RNG is unfavorable
  • Can create confusing when RNG is unfavorable
  • May create an entry barrier for new players
  • Difficult to balance across a wide range of skill levels
  • Can create exploitation if not carefully balanced

Implementation Patterns

Dialogue Handler

Data-driven implementation that loads failed quest consequence configuration from external definitions.

class FailedQuestConsequenceController {
  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 Coordinator

A modular approach to failed quest consequence that separates concerns and enables easy testing.

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

Story Engine

A modular approach to failed quest consequence that separates concerns and enables easy testing.

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