Crafting & Building

Textile Mill

Design pattern addressing textile mill, defining how this system creates engagement and supports the overall game experience.

Low complexity
4 examples
3 patterns

Overview

As a core game system, textile mill establishes rules governing player behavior and system responses. 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

Survival Games

Survival Games use this mechanic where players solve environmental puzzles to express their creativity. The difficulty scales with player performance, resulting in social interaction.

Extraction Shooters

Extraction Shooters use this mechanic where players coordinate with teammates to outperform other players. Player choice meaningfully affects outcomes, resulting in satisfying progression.

Party Games

Party Games use this mechanic where players master complex timing to create unique character builds. The learning curve is steep but rewarding, resulting in creative expression.

Management Games

Management Games use this mechanic where players explore the environment to discover hidden content. Multiple valid strategies exist for different playstyles, resulting in memorable moments.

Pros & Cons

Advantages

  • Integrates naturally with meta systems
  • Adds depth without excessive complexity
  • Creates natural cooperation between players

Disadvantages

  • Risk of analysis paralysis in multiplayer contexts
  • Can feel grindy if progression is too slow
  • Creates potential for cheese strategies by experienced players
  • May overwhelm returning players with too many options
  • Can create power creep if not carefully balanced

Implementation Patterns

Blueprint System

Data-driven implementation that loads textile mill configuration from external definitions.

class TextileMillManager {
  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.15);
    return { ...recipe.output, quality };
  }

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

Assembly Pipeline

Event-driven pattern that reacts to textile mill changes and updates dependent systems.

class TextileMillManager {
  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.2);
    return { ...recipe.output, quality };
  }

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

Blueprint System

Core implementation pattern for handling textile mill logic with clean state management.

class TextileMillEngine {
  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.15) return "rare";
    if (roll < baseChance) return "uncommon";
    return "common";
  }
}