Browse/Crafting & Building/Tailoring / Sewing
Crafting & Building

Tailoring / Sewing

Framework for implementing tailoring / sewing in games, covering the core loop, edge cases, and integration points.

Medium complexity
3 examples
2 patterns

Overview

Tailoring / Sewing is a fundamental game mechanic that creates a structured experience around this game element. 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

4X Strategy Games

4X Strategy Games use this mechanic where players decode hidden patterns to express their creativity. Randomized elements ensure variety across sessions, resulting in build diversity.

Platformers

Platformers use this mechanic where players time their actions precisely to express their creativity. The system encourages experimentation, resulting in competitive depth.

Mech Games

Mech Games use this mechanic where players plan their approach to overcome specific obstacles. The mechanic integrates seamlessly with other systems, resulting in long-term engagement.

Pros & Cons

Advantages

  • Provides clear delayed feedback on player actions
  • Adds tension without excessive complexity
  • Enhances strategic without disrupting core gameplay
  • Encourages defensive playstyles and experimentation

Disadvantages

  • May create a complexity barrier for new players
  • May conflict with narrative systems in the game
  • May conflict with meta systems in the game

Implementation Patterns

Blueprint System

Data-driven implementation that loads tailoring / sewing configuration from external definitions.

class TailoringSewingSystem {
  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.1);
    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";
  }
}

Recipe Validator

Optimized pattern for tailoring / sewing that minimizes per-frame computation cost.

class TailoringSewingProcessor {
  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.01) return "legendary";
    if (roll < baseChance * 0.1) return "rare";
    if (roll < baseChance) return "uncommon";
    return "common";
  }
}