Browse/Meta & Systems/Bestiary Screen
Meta & Systems

Bestiary Screen

Framework for implementing bestiary screen in games, covering the core loop, edge cases, and integration points.

Low complexity
4 examples
3 patterns

Overview

This mechanic, commonly known as bestiary screen, 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. Modern implementations often combine this mechanic with procedural elements to increase variety and replayability.

Game Examples

Asymmetric Games

Asymmetric Games use this mechanic where players prioritize targets to tell their own story. Each decision has cascading consequences, resulting in community formation.

Mech Games

Mech Games use this mechanic where players adapt to changing conditions to complete objectives efficiently. The mechanic integrates seamlessly with other systems, resulting in high replayability.

Boxing Games

Boxing Games use this mechanic where players experiment with combinations to reach the highest tier. Emergent gameplay arises from simple rules, resulting in satisfying progression.

Management Games

Management Games use this mechanic where players balance risk and reward to overcome specific obstacles. Failure states are informative rather than punishing, resulting in a sense of mastery.

Pros & Cons

Advantages

  • Supports numerous viable strategies and approaches
  • Supports diverse viable strategies and approaches
  • Encourages supportive playstyles and experimentation
  • Provides long-term mastery goals for dedicated players

Disadvantages

  • May create a knowledge wall for new players
  • Increases CPU requirements significantly
  • Can create tedium if not carefully balanced

Implementation Patterns

Mod Loader

Core implementation pattern for handling bestiary screen logic with clean state management.

class BestiaryScreenController {
  playerData: Map<string, any> = new Map();

  save(slot: number) {
    const data = {
      timestamp: Date.now(),
      version: "2.1.0",
      state: Object.fromEntries(this.playerData)
    };
    localStorage.setItem(`save_${slot}`, JSON.stringify(data));
  }

  load(slot: number) {
    const raw = localStorage.getItem(`save_${slot}`);
    if (!raw) return false;
    const data = JSON.parse(raw);
    if (data.version !== "2.1.0") {
      return this.migrate(data);
    }
    this.playerData = new Map(Object.entries(data.state));
    return true;
  }
}

Analytics Reporter

A modular approach to bestiary screen that separates concerns and enables easy testing.

class BestiaryScreenSystem {
  playerData: Map<string, any> = new Map();

  save(slot: number) {
    const data = {
      timestamp: Date.now(),
      version: "2.1.0",
      state: Object.fromEntries(this.playerData)
    };
    localStorage.setItem(`save_${slot}`, JSON.stringify(data));
  }

  load(slot: number) {
    const raw = localStorage.getItem(`save_${slot}`);
    if (!raw) return false;
    const data = JSON.parse(raw);
    if (data.version !== "2.1.0") {
      return this.migrate(data);
    }
    this.playerData = new Map(Object.entries(data.state));
    return true;
  }
}

Achievement Tracker

Data-driven implementation that loads bestiary screen configuration from external definitions.

class BestiaryScreenProcessor {
  playerData: Map<string, any> = new Map();

  save(slot: number) {
    const data = {
      timestamp: Date.now(),
      version: "3.0.0",
      state: Object.fromEntries(this.playerData)
    };
    localStorage.setItem(`save_${slot}`, JSON.stringify(data));
  }

  load(slot: number) {
    const raw = localStorage.getItem(`save_${slot}`);
    if (!raw) return false;
    const data = JSON.parse(raw);
    if (data.version !== "3.0.0") {
      return this.migrate(data);
    }
    this.playerData = new Map(Object.entries(data.state));
    return true;
  }
}