Modular Monument / Statue with Progression
Design pattern addressing modular monument / statue with progression, defining how this system creates engagement and supports the overall game experience.
Overview
Modular Monument / Statue with Progression is a fundamental game mechanic 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. Modern implementations often combine this mechanic with procedural elements to increase variety and replayability.
Game Examples
Roguelikes
Roguelikes use this mechanic where players time their actions precisely to tell their own story. The mechanic integrates seamlessly with other systems, resulting in memorable moments.
Tycoon Games
Tycoon Games use this mechanic where players time their actions precisely to reach the highest tier. Edge cases create memorable moments, resulting in strategic variety.
Simulation Games
Simulation Games use this mechanic where players navigate branching paths to maximize their effectiveness. The mechanic integrates seamlessly with other systems, resulting in community formation.
Card Games
Card Games use this mechanic where players adapt to changing conditions to explore every possibility. The system tracks multiple variables simultaneously, resulting in creative expression.
Pros & Cons
Advantages
- Creates natural cooperation between players
- Encourages aggressive playstyles and experimentation
- Integrates naturally with social systems
Disadvantages
- Can create frustrating when RNG is unfavorable
- Can become overpowered in the late game
- Requires significant UI/UX work to implement well
- Can lead to player burnout if overused
- Risk of tedium in competitive environments
Implementation Patterns
Crafting Queue
A modular approach to modular monument / statue with progression that separates concerns and enables easy testing.
class ModularMonumentStatueWithProgressionManager {
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.1) return "rare";
if (roll < baseChance) return "uncommon";
return "common";
}
}