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.
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";
}
}