Browse/Narrative & Choice/Unbalanced Companion Conversation with Feedback
Narrative & Choice

Unbalanced Companion Conversation with Feedback

Game design pattern for unbalanced companion conversation with feedback that creates meaningful player choices and engaging feedback loops.

Low complexity
2 examples
1 patterns

Overview

Unbalanced Companion Conversation with Feedback 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. The ongoing evolution of this mechanic reflects the broader maturation of game design as a discipline.

Game Examples

Sports Games

Sports Games use this mechanic where players optimize their build to progress through the content. The difficulty scales with player performance, resulting in meaningful player agency.

Soulslike Games

Soulslike Games use this mechanic where players explore the environment to min-max their character. Player choice meaningfully affects outcomes, resulting in creative expression.

Pros & Cons

Advantages

  • Creates meaningful mechanical decisions for players
  • Integrates naturally with movement systems
  • Provides long-term mastery goals for dedicated players

Disadvantages

  • May create a knowledge wall for new players
  • Can lead to frustration if overused
  • Requires extensive balance testing to avoid edge cases
  • Risk of feature bloat in competitive environments

Implementation Patterns

Reputation Tracker

Data-driven implementation that loads unbalanced companion conversation with feedback configuration from external definitions.

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