Browse/Narrative & Choice/Inverted Bestiary / Monster Log (Modern)
Narrative & Choice

Inverted Bestiary / Monster Log (Modern)

A system that manages inverted bestiary / monster log (modern) mechanics, providing structured rules for how this feature operates within the game.

High complexity
2 examples
1 patterns

Overview

This mechanic, commonly known as inverted bestiary / monster log (modern), creates a structured experience around this game element. When well-implemented, this mechanic creates a satisfying feedback loop that keeps players engaged and motivated to continue playing. Cross-genre adoption of this mechanic demonstrates its versatility and fundamental appeal to players across different gaming preferences.

Game Examples

Roguelikes

Roguelikes use this mechanic where players navigate branching paths to complete objectives efficiently. The system tracks multiple variables simultaneously, resulting in exploration incentives.

Cooking Games

Cooking Games use this mechanic where players respond to dynamic events to collect all available items. Multiple valid strategies exist for different playstyles, resulting in risk-reward tension.

Pros & Cons

Advantages

  • Integrates naturally with economy systems
  • Creates natural competition between players
  • Rewards both resource management and strategic thinking
  • Provides long-term engagement for dedicated players

Disadvantages

  • Can create balance issues if not carefully balanced
  • Can create unfair when RNG is unfavorable
  • Creates potential for cheese strategies by experienced players
  • Can create griefing if not carefully balanced
  • Can become irrelevant in the late game

Implementation Patterns

NPC Scheduler

Core implementation pattern for handling inverted bestiary / monster log (modern) logic with clean state management.

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