Seams & Stitches

Quick rating

Community listing page, reviews here may not be monitored by the author.

Seams & Stitches

No reviews yet

This mod adds sewing to Minecraft! In an interactive way.

Mod Loaders
Minecraft

About

Description

Seams and Stitches

Summary

This mod adds interactive sewing to Minecraft. It introduces a Tailoring Bench where players craft items by stitching along seam paths in a minigame. Hit more stitches within the timing window to produce higher-quality results. Mastering a pattern unlocks Quick Craft, letting you skip the minigame for repeat crafts. How many completions are required before mastery is unlocked is configurable per recipe.

A Needle and Scissors are required to use the bench. Both are craftable.

Dependencies: QualityAPI (1.3.3+) and SilverLib (1.2.1+, required by QualityAPI) are required. Project MMO, JEI and EMI are optional.


Quality Tiers

Item quality is owned by QualityAPI. Seams & Stitches only decides which QualityAPI tier a craft earns; the tier's tooltip, colour, crafter name, durability and mining-speed scaling, granted enchantments and attribute bonuses all come from QualityAPI and its data.

Each completed craft is scored on two rates, both a fraction of the pattern's total stitches:

  • hit rate: stitches landed at all
  • perfect rate: stitches landed inside the target's inner (green) ring

A pattern's quality_tiers ladder maps those rates to tiers; the craft takes the highest band whose thresholds it meets on both counts. Below the easiest band's hit_rate the craft fails and no item is produced. The default ladder, used by any pattern that does not declare its own:

Tier Hit rate Perfect rate
quality_api:crude 0.25 —
quality_api:standard 0.45 —
quality_api:fine 0.60 0.25
quality_api:superior 0.75 0.50
quality_api:exquisite 0.88 0.75
quality_api:masterwork 0.97 0.92

quality_api:standard is QualityAPI's level-0 tier, so an item that lands there is left plain and still stacks with ordinary items. Tier ids are plain resource locations: tiers a datapack or another mod adds to QualityAPI work with no code change.

What a tier does to a given item is defined in QualityAPI's quality_api:item_qualities data map, not in the recipe. This mod ships entries for leather armor and leather horse armor (data/quality_api/data_maps/item/item_qualities.json); a pack overrides or extends them by writing to the same path. Effects are added on top of the item's own stats.

Quick Craft (unlocked by mastering a pattern) skips the minigame, so its output is always plain.


Instructions for Use

1. Folder Structure

To add custom sewing recipes, place them in the following path inside your modpack or data pack:

modpack_name/
└── data/
    └── seamsandstitches/
        └── recipe/

2. JSON Recipe Structure

Each custom recipe must be its own individual JSON file and can be named anything you like.

Top-level fields:

Key Description
type Must be "seamsandstitches:sewing_pattern"
texture Path to the item texture used as the sewing canvas (e.g., "minecraft:textures/item/leather_helmet.png")
output Object with id ("mod_id:item_name") and count
ingredients List of ingredient objects ({ "item": "mod_id:item_name" }), shapeless and order-independent
seams List of seam definitions (see below)
requires_pattern (Optional) Recipe ID the player must have unlocked before this recipe appears in the bench
quality_tiers (Optional) The quality ladder: a list of bands mapping minigame performance to QualityAPI tiers (see below). Defaults to the six-tier ladder under Quality Tiers. An empty list never fails and never awards quality
deferred_ingredients (Optional) List of 0-based ingredient indices that are not consumed when the craft starts. These items remain in the bench during the minigame and are consumed only on successful completion. If the craft is cancelled they are returned.
transfer_contents (Optional, default false) When true, the inventory contents of the first deferred ingredient are copied onto the assembled output while leaving the output's own component configuration intact (e.g. a toolbelt:belt_size value set in the recipe output). Items exposing IItemHandler are copied slot-by-slot; items using minecraft:container or minecraft:bundle_contents have only that component transferred. Those two component types are also auto-detected when non-empty even without this flag; set it explicitly when the source container may be empty, or for IItemHandler-only modded containers.
crafts_to_master (Optional, default 1) Number of successful minigame completions required before Quick Craft is unlocked for this recipe. While progress is below the threshold, the preview panel shows X/N where X is the current count.
display_name (Optional) Overrides the name shown in the pattern picker dropdown and selector button. Accepts a plain string or a full Minecraft text component (e.g. { "translate": "my.key" }). Falls back to the output item's hover name if omitted.

Seam fields:

Key Description
id Unique name for this seam segment (e.g., "collar", "left_sleeve")
path Array of [x, y] pixel coordinates (0–15 for a 16×16 texture) tracing the seam line
speed Float — traversal speed in path-index units per second (e.g., 2.0)

Quality tier band fields (quality_tiers is a list of these):

Key Default Description
quality — QualityAPI tier id awarded by this band (e.g. "quality_api:fine")
hit_rate — Minimum fraction of stitches landed (0.0–1.0). The lowest hit_rate in the list is the pass mark: below it the craft fails
perfect_rate 0.0 Minimum fraction of stitches landed inside the inner ring (0.0–1.0)

Bands can be listed in any order; the hardest one cleared wins. A pattern whose output should never carry quality (a book, a painting) can use a single quality_api:standard band: the craft can still fail below its hit_rate, but a success is always plain.

Tier effects live in QualityAPI's quality_api:item_qualities data map, keyed by item or #tag, then by tier id. Example (from this mod's leather helmet entry):

{
  "replace": false,
  "values": {
    "minecraft:leather_helmet": {
      "quality_api:fine": {
        "attributes": [ { "type": "minecraft:generic.armor", "operation": "add_value", "amount": 1.0, "slot": "head" } ]
      }
    }
  }
}

Besides attributes (type, operation, amount, slot), an effect can set durability_multiplier, mining_speed_multiplier, enchantment_levels, break_downgrade_chance and break_destroy_chance. See QualityAPI's documentation for the full schema.

Attribute ids usable as an effect type:

Generic

Attribute ResourceLocation
Armor minecraft:generic.armor
Armor toughness minecraft:generic.armor_toughness
Attack damage minecraft:generic.attack_damage
Attack knockback minecraft:generic.attack_knockback
Attack speed minecraft:generic.attack_speed
Burning time minecraft:generic.burning_time
Explosion knockback resistance minecraft:generic.explosion_knockback_resistance
Fall damage multiplier minecraft:generic.fall_damage_multiplier
Flying speed minecraft:generic.flying_speed
Follow range minecraft:generic.follow_range
Gravity minecraft:generic.gravity
Jump strength minecraft:generic.jump_strength
Knockback resistance minecraft:generic.knockback_resistance
Luck minecraft:generic.luck
Max absorption minecraft:generic.max_absorption
Max health minecraft:generic.max_health
Movement efficiency minecraft:generic.movement_efficiency
Movement speed minecraft:generic.movement_speed
Oxygen bonus minecraft:generic.oxygen_bonus
Safe fall distance minecraft:generic.safe_fall_distance
Scale minecraft:generic.scale
Step height minecraft:generic.step_height
Water movement efficiency minecraft:generic.water_movement_efficiency

Player

Attribute ResourceLocation
Block break speed minecraft:player.block_break_speed
Block interaction range minecraft:player.block_interaction_range
Entity interaction range minecraft:player.entity_interaction_range
Mining efficiency minecraft:player.mining_efficiency
Sneaking speed minecraft:player.sneaking_speed
Submerged mining speed minecraft:player.submerged_mining_speed
Sweeping damage ratio minecraft:player.sweeping_damage_ratio

3. Example Recipe

{
  "type": "seamsandstitches:sewing_pattern",
  "texture": "minecraft:textures/item/leather_helmet.png",
  "output": {
    "id": "minecraft:leather_helmet",
    "count": 1
  },
  "ingredients": [
    { "item": "minecraft:leather" },
    { "item": "minecraft:leather" },
    { "item": "minecraft:leather" },
    { "item": "minecraft:leather" },
    { "item": "minecraft:leather" }
  ],
  "seams": [
    {
      "id": "crown",
      "path": [[4,11],[3,10],[3,9],[3,8],[3,7],[3,6],[3,5],[4,4],[5,3],[6,3],[7,3],[8,3],[9,3],[10,3],[11,4],[12,5],[12,6],[12,7],[12,8],[12,9],[12,10],[11,11]],
      "speed": 2
    },
    {
      "id": "left_strap",
      "path": [[6,4],[6,5],[6,6],[7,7],[6,7],[5,8],[5,9],[5,10],[5,11]],
      "speed": 2
    }
  ],
  "quality_tiers": [
    { "quality": "quality_api:crude",      "hit_rate": 0.25 },
    { "quality": "quality_api:standard",   "hit_rate": 0.45 },
    { "quality": "quality_api:fine",       "hit_rate": 0.60, "perfect_rate": 0.25 },
    { "quality": "quality_api:superior",   "hit_rate": 0.75, "perfect_rate": 0.50 },
    { "quality": "quality_api:exquisite",  "hit_rate": 0.88, "perfect_rate": 0.75 },
    { "quality": "quality_api:masterwork", "hit_rate": 0.97, "perfect_rate": 0.92 }
  ],
  "crafts_to_master": 3
}

4. Upgrade Recipe (Container Content Transfer)

When upgrading a container item — such as a wallet or shulker box — use deferred_ingredients to keep the source item in the bench until the craft completes, and transfer_contents to carry its stored contents onto the new item.

The deferred ingredient index refers to its position in the ingredients array (0-based). In the example below, index 0 is the copper wallet.

{
  "type": "seamsandstitches:sewing_pattern",
  "texture": "lightmanscurrency:textures/item/wallet/wallet_copper.png",
  "output": {
    "id": "lightmanscurrency:wallet_iron",
    "count": 1
  },
  "ingredients": [
    { "item": "lightmanscurrency:wallet_copper" },
    { "item": "minecraft:iron_ingot" },
    { "item": "minecraft:iron_ingot" }
  ],
  "deferred_ingredients": [0],
  "transfer_contents": true,
  "seams": [
    {
      "id": "stitching",
      "path": [[4,4],[5,4],[6,4],[7,4],[8,4],[9,4],[10,4],[11,4],[11,5],[11,6],[11,7],[11,8],[10,9],[9,9],[8,9],[7,9],[6,9],[5,9],[4,9],[4,8],[4,7],[4,6],[4,5]],
      "speed": 2.0
    }
  ]
}

How it works:

  • The copper wallet (index 0) stays in the bench when the minigame starts. If the player cancels, the wallet is returned.
  • On successful completion, the wallet's stored items are copied onto the iron wallet output — only the inventory is transferred; the output keeps its own component configuration.
  • The remaining ingredients (iron ingots) are consumed immediately when the craft starts as normal.

5. Custom Ingredient Types

seamsandstitches:item_variation

Matches a base ingredient only when a specific data marker is present (or absent) on the item. Useful for distinguishing items that share an item ID but differ in internal state — for example, toolbelts of different slot capacities that are all toolbelt:belt.

Fields:

Key Description
base Base ingredient — { "item": "..." } or { "tag": "..." } — the item must satisfy this first
component_key The marker to check. Use a plain tag name (e.g. "my_tag") to check the item's minecraft:custom_data compound, or a namespaced resource location (e.g. "toolbelt:belt_size") to look up a registered data component type
component_value (Optional) Expected value as a plain string. Integer and string component values both serialise to their natural string form ("4", "small", etc.). If omitted, the ingredient matches items where the component or tag is entirely absent

Absence matching — omitting component_value lets you target the "default" state of an item that gains a component only after being upgraded:

{
  "type": "seamsandstitches:item_variation",
  "base": { "item": "toolbelt:belt" },
  "component_key": "toolbelt:belt_size"
}

Matches any toolbelt:belt that has no belt_size component (the base, un-upgraded belt).

Value matching — specify component_value to require a specific value:

{
  "type": "seamsandstitches:item_variation",
  "base": { "item": "toolbelt:belt" },
  "component_key": "toolbelt:belt_size",
  "component_value": "3"
}

Matches only a belt whose belt_size component serialises to "3". A belt with belt_size: 4 or no component at all is rejected.

Combine with deferred_ingredients and transfer_contents to build a full upgrade chain:

{
  "type": "seamsandstitches:sewing_pattern",
  "transfer_contents": true,
  "deferred_ingredients": [0],
  "display_name": "Iron Toolbelt (4 Slots)",
  "output": {
    "id": "toolbelt:belt",
    "count": 1,
    "components": { "toolbelt:belt_size": 4 }
  },
  "ingredients": [
    {
      "type": "seamsandstitches:item_variation",
      "base": { "item": "toolbelt:belt" },
      "component_key": "toolbelt:belt_size",
      "component_value": "3"
    },
    { "item": "toolbelt:pouch" },
    { "item": "materialistic:red_string" },
    { "item": "materialistic:red_string" },
    { "item": "materialistic:iron_emblem" },
    { "tag": "c:ingots/iron" }
  ],
  "seams": [ "..." ]
}

The output's belt_size: 4 component is preserved by the targeted content transfer — only the tool inventory carries over from the size-3 belt.


Configuration

Config file: config/seamsandstitches-common.toml


Default Recipes

Output Ingredients Quality ladder Tier effects Crafts to master
Book 3x Paper, 1x Leather Standard only (always plain) — 1
Painting 1x White Wool, 8x Sticks Standard only (always plain) — 1
Leather Helmet 5x Leather Default six-tier Armor (head) crude −1, fine +1, superior +1 & 0.5 toughness, exquisite +2 & 0.5, masterwork +2 & 1 3
Leather Chestplate 8x Leather Default six-tier Armor (chest) crude −3, then as helmet 3
Leather Leggings 7x Leather Default six-tier Armor (legs) crude −2, then as helmet 3
Leather Boots 3x Leather, 1x String Default six-tier Armor (feet) as helmet 3
Leather Horse Armor 12x Leather Default six-tier Armor (body) as helmet 3

Tier effects stack with QualityAPI's own per-tier durability and mining-speed multipliers.


Recipe Overrides

When enabled, the specified items can no longer be crafted at a crafting table and must instead be made at the Tailoring Bench.

Option Default Description
enableRecipeOverrides true Globally enables or disables all Tailoring Bench recipe overrides
override_<recipe_id> true Per-recipe toggle (only active when overrides are enabled globally)

Overridable recipe IDs:

  • Armor: leather_helmet, leather_chestplate, leather_leggings, leather_boots, leather_horse_armor
  • Items: book, painting

Dye Basin Overrides

By default the Dye Basin is the only way to dye items. The config gives per-category control over both sides of that: whether the vanilla crafting-table recipe is disabled, and whether the basin recipe itself is active.

Master switch

Option Default Description
disableShapelessDyeRecipes true When true (default), vanilla shapeless dye recipes are disabled and the Dye Basin is the primary way to re-color items. Set to false to restore all vanilla dye recipes regardless of per-category settings

[dye_basin_overrides.vanilla] — re-enable individual vanilla shapeless dye recipes

Only meaningful when disableShapelessDyeRecipes is true. Set an entry to true to restore that specific vanilla recipe while keeping all others disabled.

Option Default Vanilla recipe(s) restored when true
enable_shapeless_armor_dyeing false Leather armor dyeing (special crafting)
enable_shapeless_wool_dyeing false {color}_wool shapeless dye recipes
enable_shapeless_bed_dyeing false {color}_bed shapeless dye recipes
enable_shapeless_carpet_dyeing false {color}_carpet shapeless dye recipes
enable_shapeless_terracotta_dyeing false {color}_terracotta shapeless dye recipes
enable_shapeless_candle_dyeing false {color}_candle shapeless dye recipes
enable_shapeless_stained_glass_dyeing false {color}_stained_glass crafting-table recipes
enable_shapeless_shulker_box_dyeing false Shulker box coloring (special crafting)
enable_shapeless_concrete_powder_dyeing false {color}_concrete_powder shapeless dye recipes

[dye_basin_overrides.basin] — enable/disable individual basin recipes

Set to false to remove a basin recipe entirely (useful if another mod handles that item family).

Option Default
enable_dyeable true
enable_wool true
enable_carpet true
enable_terracotta true
enable_banner true
enable_candle true
enable_bed true
enable_stained_glass true
enable_stained_glass_pane true
enable_shulker_box true
enable_glazed_terracotta true
enable_concrete_powder true
enable_concrete true
enable_sophisticated_backpacks true

All options require a game restart or /reload to take effect.


Leather Tanning

Option Default Description
animalsDropHides true When true (default), leather-dropping animals (cows, mooshrooms, horses, donkeys, mules, llamas, hoglins) drop raw hides instead of vanilla leather, requiring the Tanning Rack to convert them back. Set to false to restore vanilla leather drops
airTanningTimeMultiplier 8.0 How many times longer a hide takes to tan without lye than with it
enableHideScraping true Allows scraping a tanning hide with flint (or a Farmer's Delight knife) to guarantee leather. Unscraped hides risk rotting (see below)
flintConsumeChance 0.5 Chance (0.0–1.0) the flint breaks when used to scrape
unscrapedFailureChance 0.35 Chance (0.0–1.0) an unscraped hide turns into rotten flesh instead of leather
leather_output_per_hide.<hide> 2 (4 hoglin) Leather produced per successfully tanned hide, per species

General Options

Option Default Description
vanillafyUI true When true (default), the Tailoring Bench and Tanning Rack UIs use the classic vanilla gray style; false uses the modern dark UI

Project MMO Options ([pmmo], only used when Project MMO is installed)

Completing a sewing pattern pays the sewn item's Project MMO xp map, the same way Realms of Reverie's smithing anvil and gemcutter's table do: round(base × quality multiplier × (1 + stitch score × bonus)) × count. Which skills are paid, and how much, is entirely the pack's Project MMO data. Quick Craft pays the unscaled amount.

Option Default Description
awardTailoringXp true Master switch for tailoring xp
tailoringXpEvent "CRAFT" Project MMO event type whose item xp map is paid (e.g. CRAFT, SMELT). The bench never fires the event itself, so nothing is paid twice
tailoringXpMultiplierByQuality ["-1=0.75", "0=1.0", "1=1.5", "2=2.0", "3=5.0", "4=10.0"] level=multiplier points over QualityAPI tier levels (crude −1 … masterwork 4), interpolated between points
tailoringXpMinigameBonus 0.3 Extra xp for clean stitching: at 0.3, every stitch in the inner ring pays 30% more

Debug Options

Option Default Description
debugOverlay false When enabled, hovering over the sewing canvas shows [x, y] pixel coordinates; clicking records them to a growing array; R clears the array; C copies it to the clipboard. Useful when designing seam paths for custom recipes

Dye Basin

The Dye Basin is a block for dyeing items. Craft it with any planks arranged in a U-shape with a bucket in the center (W_W / WBW / WWW).

How to use:

  1. Fill the basin with a water bucket.
  2. Right-click with a dye item to load a color — the water tints to match.
  3. Right-click with an item that has a registered dye_bath recipe for that color. The item sits on the washboard ridge.
  4. Right-click empty-handed three times to dunk the item into the dye.
  5. After the third dunk, the dyed result ejects from the front face and the dye clears. The water remains for the next item.

Hold Shift + right-click empty-handed to retrieve the placed item without dyeing it.

Dye Bath Recipe Structure

Place recipe JSONs in the same data/seamsandstitches/recipe/ folder as sewing patterns.

Top-level fields:

Key Description
type Must be "seamsandstitches:dye_bath"
ingredient Ingredient object ({ "item": "..." } or { "tag": "..." }) matching the item to be dyed
dye (Optional) Lowercase dye color name (e.g., "red", "light_blue"). If omitted, the recipe matches any dye and uses the active dye at craft time
result_pattern (Optional) Item ID template where {color} is replaced with the active dye's name (e.g., "minecraft:{color}_wool" → "minecraft:red_wool"). Use this when the output item follows a standard color-naming convention. Logs a warning and produces no output if the resolved item is unknown
result (Optional) Static output item ({ "id": "...", "count": 1 }). The input item's data components are always transmuted onto the output. Omit when using result_pattern or when the output is the input item re-colored
dye_component_selectors (Optional) List of DataComponentType<Integer> IDs to write the dye's ARGB value into. Use for modded items that store color in their own integer components rather than vanilla's minecraft:dyed_color (e.g., "sophisticatedcore:main_color"). Gate these recipes with a neoforge:mod_loaded condition
display_rotation (Optional) [x, y, z] pre-rotation in degrees applied to the held item before the basin renderer tilts it onto the washboard. Full-cube block items (wool, concrete, glass blocks, etc.) are automatically detected and get a rotation that lays them flat on the slope. Only specify this to override that auto-detected value — e.g. carpet uses [-90, 0, 0] because it is a thin block, not a full cube
display_translation (Optional) [x, y, z] offset in the washboard's slope-aligned frame, in blocks. Full-cube blocks automatically receive a small lift so they sit on the slope surface. Specify to fine-tune positioning for non-standard models
display_scale (Optional) Scale applied to the item rendered on the washboard. Accepts a bare float for uniform scale (0.8) or an [x, y, z] array for per-axis scale ([1, 1, 0.5]). Full-cube blocks automatically receive a Z-squish to prevent them protruding through the back of the basin. Specify to override

Color output rules — exactly one of the following determines what color is applied:

Condition Output item Color applied
result_pattern present New item resolved from pattern None (color is encoded in the item ID)
result present Transmuted copy of input (preserves all data components) None (output is static)
Neither present, dye_component_selectors non-empty Copy of input Written to each listed component as an ARGB integer
Neither present, dye_component_selectors empty Copy of input Written as vanilla minecraft:dyed_color component automatically

Default Dye Bath Items

The following items are supported out of the box. All 16 dye colors are accepted for each family unless noted. Applying a new dye to an already-colored item re-colors it.

Item family Ingredient tag Notes
Wool minecraft:wool
Carpet minecraft:wool_carpets
Terracotta c:terracotta Includes plain (uncolored) terracotta
Glass / Stained Glass c:glass_blocks Includes plain minecraft:glass; dyeing it produces stained glass
Glass Pane / Stained Glass Pane c:glass_panes Includes plain minecraft:glass_pane; dyeing it produces a stained glass pane
Glazed Terracotta c:glazed_terracotta
Candle minecraft:candles Includes plain (uncolored) candle
Bed minecraft:beds
Banner minecraft:banners Applied banner patterns are preserved across re-dyes
Shulker Box c:shulker_boxes Includes undyed shulker box; inventory contents are preserved
Concrete Powder c:concrete_powder
Concrete c:concrete
Leather armor & wolf armor minecraft:dyeable Uses minecraft:dyed_color component; any item added to this tag is automatically compatible

Any mod item added to the minecraft:dyeable tag is automatically compatible with the dyeable recipe.

Custom Dyeing Recipes

Color-pattern dyeing — one recipe covers all 16 dyes for wool. {color} is substituted with the active dye name at craft time:

{
  "type": "seamsandstitches:dye_bath",
  "ingredient": { "tag": "minecraft:wool" },
  "result_pattern": "minecraft:{color}_wool"
}

Vanilla dyed items — one recipe covers all 16 dyes for leather armor. Omitting result and result_pattern copies the input item and writes minecraft:dyed_color automatically:

{
  "type": "seamsandstitches:dye_bath",
  "ingredient": { "tag": "minecraft:dyeable" },
  "display_scale": 0.8
}

Modded container dyeing — for items that store color in their own integer data component rather than vanilla's minecraft:dyed_color, use dye_component_selectors to name those components. The input item is copied with all data components preserved, then each listed component is written with the dye's ARGB value:

{
  "neoforge:conditions": [{ "type": "neoforge:mod_loaded", "modid": "examplemod" }],
  "type": "seamsandstitches:dye_bath",
  "ingredient": { "tag": "c:example_dyeable_items" },
  "dye_component_selectors": ["examplemod:primary_color"],
  "display_scale": 0.8
}

Cross-mod color conversion — when a mod's colored item set has no white variant, use a specific dye: "white" recipe with a static result to redirect to the vanilla equivalent. Pair it with a general result_pattern recipe for the other 15 colors:

{
  "type": "seamsandstitches:dye_bath",
  "ingredient": { "tag": "examplemod:colored_items" },
  "dye": "white",
  "result": { "id": "minecraft:string", "count": 1 }
}

Tanning Rack

Leather no longer drops directly from animals — cows, mooshrooms, horses, donkeys, mules, llamas, and hoglins instead drop a species-specific raw hide item. Hides can only be tanned back into leather with the Tanning Rack.

Building and Using the Rack

The Tanning Rack is a 2×2×2 block made by 6 sticks and 3 planks.

Slots:

Slot Purpose
4 hide slots Each holds a single hide (any species), stretched and displayed in the frame. Progress ticks independently per slot
1 lye slot Holds seamsandstitches:lye, consumed one per hide

Tanning process:

  1. Insert up to 4 hides, one per slot.
  2. Insert lye. One lye is consumed the moment a hide begins tanning.
    • Lye is crafted from 2 Sand + 2 Bone Meal placed diagonally (2×2 grid).
  3. Each slot finishes independently and converts its hide into leather.