Browse/Crafting & Building/Basic Trophy / Display Case with Progression
Crafting & Building

Basic Trophy / Display Case with Progression

Framework for implementing basic trophy / display case with progression in games, covering the core loop, edge cases, and integration points.

Low complexity
2 examples
2 patterns

Overview

The basic trophy / display case with progression mechanic provides a framework that defines how players interact with this aspect of the game world. The mechanic interacts with multiple other game systems, creating emergent gameplay that extends beyond its individual components. Understanding the design principles behind this mechanic helps developers create more engaging and balanced game experiences.

Game Examples

Survival Horror Games

Survival Horror Games use this mechanic where players explore the environment to overcome specific obstacles. The difficulty scales with player performance, resulting in competitive depth.

Platformers

Platformers use this mechanic where players respond to dynamic events to progress through the content. The system encourages experimentation, resulting in creative expression.

Pros & Cons

Advantages

  • Enables social player expression
  • Balances social against economic effectively
  • Easy to understand but difficult to master

Disadvantages

  • Difficult to balance across a wide range of skill levels
  • May conflict with movement systems in the game
  • Can create tedious when RNG is unfavorable
  • May conflict with progression systems in the game
  • Creates potential for exploits by experienced players

Implementation Patterns

Crafting Queue

Event-driven pattern that reacts to basic trophy / display case with progression changes and updates dependent systems.

class BasicTrophyDisplayCaseWithProgressionHandler {
  recipes: Recipe[] = [];

  craft(recipeId: string, inventory: Inventory) {
    const recipe = this.recipes.find(r => r.id === recipeId);
    if (!recipe) return null;

    for (const ingredient of recipe.ingredients) {
      if (!inventory.has(ingredient.id, ingredient.amount)) {
        return null; // Missing materials
      }
    }

    for (const ingredient of recipe.ingredients) {
      inventory.remove(ingredient.id, ingredient.amount);
    }

    const quality = this.rollQuality(0.05);
    return { ...recipe.output, quality };
  }

  rollQuality(baseChance: number) {
    const roll = Math.random();
    if (roll < baseChance * 0.05) return "legendary";
    if (roll < baseChance * 0.2) return "rare";
    if (roll < baseChance) return "uncommon";
    return "common";
  }
}

Durability Tracker

Optimized pattern for basic trophy / display case with progression that minimizes per-frame computation cost.

class BasicTrophyDisplayCaseWithProgressionController {
  recipes: Recipe[] = [];

  craft(recipeId: string, inventory: Inventory) {
    const recipe = this.recipes.find(r => r.id === recipeId);
    if (!recipe) return null;

    for (const ingredient of recipe.ingredients) {
      if (!inventory.has(ingredient.id, ingredient.amount)) {
        return null; // Missing materials
      }
    }

    for (const ingredient of recipe.ingredients) {
      inventory.remove(ingredient.id, ingredient.amount);
    }

    const quality = this.rollQuality(0.05);
    return { ...recipe.output, quality };
  }

  rollQuality(baseChance: number) {
    const roll = Math.random();
    if (roll < baseChance * 0.05) return "legendary";
    if (roll < baseChance * 0.2) return "rare";
    if (roll < baseChance) return "uncommon";
    return "common";
  }
}