draw-steel-dto-generator

star 1

Generates Draw Steel TTRPG Dynamic Terrain Objectives (DTOs) with pattern-compliant stat blocks. Use when creating traps, hazards, fieldworks, mechanisms, siege engines, power fixtures, or supernatural objects for the Draw Steel tabletop roleplaying game.

stgreenb By stgreenb schedule Updated 2/22/2026

name: draw-steel-dto-generator description: Generates Draw Steel TTRPG Dynamic Terrain Objectives (DTOs) with pattern-compliant stat blocks. Use when creating traps, hazards, fieldworks, mechanisms, siege engines, power fixtures, or supernatural objects for the Draw Steel tabletop roleplaying game. license: MIT compatibility: Designed for Claude Code, Cursor, Gemini CLI, and Antigravity Google following the Agent Skills specification. metadata: author: stgreenb version: "1.0"

Draw Steel Dynamic Terrain Objective Generator

Generate Draw Steel TTRPG Dynamic Terrain Objectives (DTOs) that strictly conform to official MCDM format from the Dynamic Terrain chapter.

Quick Start

Input Format: "Create a Level [X] [Category] [Name]" or "Create a Level [X] [Category] ([Role]) [Name]"

Examples:

  • "Create a Level 2 Environmental Hazard Acidic Bog"
  • "Create a Level 1 Fieldwork (Ambusher) Snap Trap"
  • "Create a Level 3 Siege Engine Scorpion Ballista"
  • "Create a Level 5 Power Fixture Crystal Shrine --format foundry"
  • "Create a Level 1 Trap Bear Trap --format both"

Categories: Environmental Hazard, Fieldwork, Mechanism, Siege Engine, Power Fixture, Supernatural Object

Output Formats: --format markdown (default), --format foundry, --format both

Roles (secondary tags indicating mechanical pattern):

  • Defender: High Stamina, protects allies (Brambles, Column of Blades)
  • Hexer: Applies conditions (Angry Beehive, Lava, Toxic Plants)
  • Ambusher: Triggered sudden damage (Bear Trap, Dart Trap, Snare Trap)
  • Artillery: Long-range area attacks (Arrow Launcher, Catapult)
  • Support: Grants resources or mobility (Pressure Plate, Pulley, Holy Idol)
  • Controller: Complex battlefield control (Black Obelisk, Throne of A'An)

Critical: Draw Steel Mechanics (NOT D&D)

CRITICAL: There is NO concept of Difficulty Class (DC) in Draw Steel. DTOs use Draw Steel's unique mechanics, NOT D&D-style saving throws.

Converting D&D Mechanics to Draw Steel

When converting traps/hazards from D&D or other systems:

Original D&D Concept Draw Steel Method When to Use
DC vs. Saving Throw (to apply a condition) Potency Check In DTO abilities to apply conditions based on target's characteristic
DC vs. Skill Check (to interact/resist) Characteristic Test For deactivating DTOs, resisting effects, or actively challenging the effect
Saving Throw (to end a persistent effect) Saving Throw (d10) ONLY for conditions marked "(save ends)"

Three Draw Steel Mechanics

Purpose Mechanic When to Use
Apply a condition Potency Check In DTO abilities to apply conditions based on target's characteristic
Interact/resist Characteristic Test For deactivating DTOs, resisting environment effects
End a condition Saving Throw (d10) ONLY for conditions marked "(save ends)"

Potency Check Format

[Characteristic] < [Value] [condition]

  • M = Might, A = Agility, R = Reason, I = Intuition, P = Presence
  • Value = potency threshold (typically -1, 0, 1, 2, 3 based on tier)
  • Condition = the condition applied (may include "(save ends)")

Example: A < 1 slowed (save ends) means "If target's Agility is less than 1, they are slowed (save ends)"

D&D Terms → Draw Steel Terms

D&D Term (NEVER USE) Draw Steel Term
"DC 15" "A < 2" or "Agility test"
"saving throw" "save" or "save ends"
"1d6 damage" "5 damage" (fixed values)
"Dexterity save" "Agility test" or "A < X"
"half damage on save" Not used in Draw Steel

Conversion Examples

Example 1: D&D Trap with DC Save → Potency Check

❌ D&D: "DC 13 Dexterity save or take 2d6 piercing damage and be restrained"

✓ Draw Steel:
Power Roll + 2:
- ≤11: 5 damage
- 12-16: 7 damage; A < 1 slowed (save ends)
- 17+: 9 damage; A < 2 restrained (save ends)

Example 2: D&D Skill Check to Disarm → Characteristic Test

❌ D&D: "DC 12 Thieves' Tools check to disarm"

✓ Draw Steel:
As a maneuver, a creature adjacent to the trap can make an Agility test.
- ≤11: The creature triggers the trap.
- 12-16: The trap is deactivated but the creature is slowed (EoT).
- 17+: The trap is deactivated and doesn't trigger.

Example 3: D&D Ongoing Damage → Burning Condition

❌ D&D: "takes 1d6 fire damage at start of each turn, DC 12 Con save to end"

✓ Draw Steel:
M < 2 burning (save ends)

Note: Burning means "takes 1d6 fire damage at start of each turn". The target rolls d10 (6+ ends it).

Power Roll Outcomes

Active DTO Power Rolls (DTO Rolls)

Power Roll + 2:
- ≤11: [Tier 1 effect - weakest]
- 12-16: [Tier 2 effect - average]
- 17+: [Tier 3 effect - strongest]

Passive Player Tests (Player Rolls)

For deactivation, avoidance, etc.:

As a maneuver, a creature adjacent to [DTO] can make an [Characteristic] test.
- ≤11: [Worst outcome for player]
- 12-16: [Partial success]
- 17+: [Best outcome for player]

Potency Scaling by Tier

Tier Potency Value Example (with +2 Might)
Tier 1 (≤11) Characteristic - 2 M < 0 slowed
Tier 2 (12-16) Characteristic - 1 M < 1 slowed
Tier 3 (17+) Characteristic M < 2 slowed

DTO Categories

1. Environmental Hazards

Natural elements that threaten creatures in an area.

Format: [Name] (Level X Hazard [Role])

EV Ranges:

  • Level 1: 1 EV (Brambles, Frozen Pond)
  • Level 2: 2-3 EV (Angry Beehive 2, Corrosive Pool 3)
  • Level 3: 3-4 EV (Lava 4, Quicksand 3)

Stamina Types:

  • Per-square: Multi-square terrain (Brambles 3/sq, Lava 12/sq)
  • Fixed: Single objects (Angry Beehive 3)
  • None: Indestructible (Quicksand -)

Characteristics:

  • Often difficult terrain
  • Activate on enter/start turn
  • May have Immunity field

Example:

Lava (Level 3 Hazard Hexer)

- EV: 4 per 10 x 10 patch
- Stamina: 12 per square
- Size: One or more squares of difficult terrain
- Immunity: 20 to all damage except cold damage

> 🌀 Deactivate
> Each square of lava must be individually destroyed.

> ❕ Activate
> A creature or object enters the lava or starts their turn there, or starts their turn adjacent to the lava.
> Effect: The Liquid Hot Magma ability.

> ❗️ Liquid Hot Magma
> | Melee, Strike | Free triggered action |
> | 📏 Melee 1 | 🎯 The triggering creature or object |
> Power Roll + 2:
> - ≤11: 5 fire damage; M < 1 burning (save ends)
> - 12-16: 9 fire damage; M < 2 burning (save ends)
> - 17+: 12 fire damage; M < 3 burning (save ends)

2. Fieldworks

Military fortifications and traps placed by defenders.

Format: [Name] (Level X [Type] [Role]) where Type = Trap or Fortification

EV Ranges:

  • Level 1: 1-2 EV (Bear Trap 2, Hidey-Hole 1, Pavise Shield 1)
  • Level 2: 3 EV (Spike Trap 3, Pillar 3, Ram 3)

Stamina Types:

  • Fixed: Point traps (Bear Trap 6, Snare Trap 1)
  • Per-square: Barriers (Archer's Stakes 3/sq)
  • None: Non-physical (Hidey-Hole -, Flammable Oil -)

Characteristics:

  • Often have Hidden property
  • May have Allied Awareness
  • Often calibrated to trigger on specific creature sizes
  • Direction field for directional DTOs

Example:

Bear Trap (Level 1 Trap Ambusher)

- EV: 2
- Stamina: 6
- Size: 1S

> ⭐️ Hidden
> The bear trap is hidden until triggered or detected.

> 🌀 Deactivate
> As a maneuver, a creature adjacent to a bear trap can make an Agility test.
> - ≤11: The creature triggers the trap and is affected as if in its space.
> - 12-16: The trap is deactivated but the creature is slowed (EoT).
> - 17+: The trap is deactivated and doesn't trigger.

> ❕ Activate
> The bear trap is calibrated to be triggered by creatures or objects of a particular size. The trap triggers when a creature or object of the appropriate size enters its space.
> Effect: A triggering creature or object ends their movement and is targeted by the Bear Trap ability.

> ❗️ Bear Trap
> | Melee, Strike, Weapon | Free triggered action |
> | 📏 Melee 0 | 🎯 The triggering creature or object |
> Power Roll + 2:
> - ≤11: 1 damage; the target shifts 1 square away from the trap
> - 12-16: 3 damage; A < 1 slowed (save ends)
> - 17+: 5 damage; A < 2 slowed (save ends)
> Effect: The bear trap must be manually reset.

3. Mechanisms

Intricate devices that may be linked to triggers.

Format: [Name] (Level X [Type] [Role]) where Type = Trap, Trigger, or Fortification

EV Ranges:

  • Level 1: 1-2 EV (Dart Trap 1, Switch 1, Pressure Plate 2)
  • Level 2: 3 EV (Pillar 3, Ram 3)
  • Level 3: 3-4 EV (Column of Blades 3, Portcullis 4)

Stamina Types:

  • Fixed: Single devices (Dart Trap 3, Switch 3, Pillar 6)
  • Per-square: Large barriers (Portcullis 9/sq, Ram 3/sq)
  • None: Triggers (Pressure Plate -)

Trigger Mechanisms: Have Link field: "A [mechanism type] is linked to another mechanism that it activates when triggered."

Linked DTOs: Activate section specifies: "A pressure plate, switch, or other linked trigger is activated."

Example (Trigger Mechanism):

Pressure Plate (Level 1 Trigger Support)

- EV: 2
- Stamina: -
- Size: Any area
- Typical Space: One square, up to a 4 x 4-square area
- Link: A pressure plate is linked to another mechanism that it activates when triggered.

> 🌀 Deactivate
> As a maneuver, a creature adjacent to a pressure plate can make an Agility test.
> - ≤11: The creature triggers the pressure plate.
> - 12-16: The pressure plate is deactivated but the creature is slowed (EoT).
> - 17+: The pressure plate is deactivated and doesn't trigger.

> ❕ Activate
> The pressure plate is calibrated to be triggered by creatures or objects of a particular size. The pressure plate triggers when a creature or object of the appropriate size enters its area.
> Effect: The linked mechanism is activated. A pressure plate automatically resets and can be triggered repeatedly.

4. Siege Engines

Large weapons requiring creatures to operate.

Format: [Name] (Level X Siege Engine [Role])

EV Ranges:

  • Level 2: 8 EV (Arrow Launcher, Field Ballista)
  • Level 3: 10 EV (Catapult, Boiling Oil Cauldron)
  • Level 4: 12 EV (Iron Dragon)

Stamina:

  • Level 2: 30-50 (Arrow Launcher 30, Field Ballista 40)
  • Level 3: 25-60 (Exploding Mill Wheel 25, Catapult 50)
  • Level 4: 60 (Iron Dragon 60)

Siege Engine Abilities:

All abilities labeled: Main action (Adjacent creature)

Required abilities:

  1. Primary Attack - Main damaging ability
  2. Reload - Enables primary attack again

Optional abilities: 3. Spot - Grants edge + range bonus 4. Move - Moves engine + operator

Example:

Arrow Launcher (Level 2 Siege Engine Artillery)

- EV: 8
- Stamina: 30
- Size: 1L

> 🌀 Deactivate
> As a maneuver, a creature adjacent to an arrow launcher can make an Agility test.
> - ≤11: The creature accidentally activates the Arrow Storm ability.
> - 12-16: The arrow launcher is deactivated but the creature is slowed (EoT).
> - 17+: The arrow launcher is deactivated and can't be used.

> 🔳 Arrow Storm
> | Area, Ranged, Weapon | Main action (Adjacent creature) |
> | 📏 5 cube within 20 | 🎯 Each creature and object in the area |
> Power Roll + 2:
> - ≤11: 5 damage
> - 12-16: 8 damage
> - 17+: 11 damage
> Effect: This ability can't be used again until the arrow launcher is reloaded.

> ⭐️ Reload
> | - | Main action (Adjacent creature) |
> | 📏 - | 🎯 - |
> Effect: The arrow launcher is reloaded, allowing Arrow Storm to be used again. This action can be used only once per round.

> ⭐️ Spot
> | - | Main action (Adjacent creature) |
> | 📏 - | 🎯 - |
> Effect: The next use of Arrow Storm gains an edge and has a +10 bonus to ranged distance. This action can be used only once per round.

> ⭐️ Move
> | - | Main action (Adjacent creature) |
> | 📏 - | 🎯 - |
> Effect: The arrow launcher and the creature using this action move together up to 3 squares.

5. Power Fixtures

Powerful fortifications for solo creature encounters.

Format: [Name] (Level X Relic [Role]) or [Name] (Level X Hazard [Role])

EV Ranges:

  • Level 5: 7-14 EV (Holy Idol 7, Psionic Shard 7, Tree of Might 14)

Stamina:

  • Level 5: 35-60 (Holy Idol 35, Psionic Shard 40, Tree of Might 60)

Characteristics:

  • Provide ongoing effects at start of round
  • Often grant resources (dice, temporary Stamina, bonuses)
  • May have defensive buffs or environmental control
  • High durability

Example:

Holy Idol (Level 5 Relic Support)

- EV: 7
- Stamina: 35
- Size: 2

> 🌀 Deactivate
> The holy idol must be completely destroyed.

> ⭐️ Empowered Will
> At the start of each round while the holy idol is intact, the Director gains a d6 that lasts until the end of the round. When a Director-controlled creature deals or takes damage, the Director can roll the d6 to increase the damage the creature deals or reduce the damage the creature takes by an amount equal to the roll (to a minimum of 2 damage).

6. Supernatural Objects

Magical or psionic objects with complex abilities.

Format: [Name] (Level X Relic [Role])

EV Ranges:

  • Level 3: 20 EV (Black Obelisk, Chronal Hypercube)
  • Level 4: 24 EV (Throne of A'An)

Stamina:

  • Level 3: 80-100 (Chronal Hypercube 80, Black Obelisk 100)
  • Level 4: 140 (Throne of A'An 140)

Characteristics:

  • Very high EV (20+)
  • Effects target enemies and sometimes allies
  • Unique, complex abilities
  • Often require special conditions to deactivate

Example:

The Black Obelisk (Level 3 Relic Controller)

- EV: 20
- Stamina: 100
- Size: 2

> 🌀 Deactivate
> As a maneuver, a creature adjacent to the black obelisk can make a Reason test.
> - ≤11: The creature accidentally activates the Your Fears Become Manifest ability, which gains an edge.
> - 12-16: The creature must make another test to deactivate the obelisk. If they obtain this outcome a second time, they accidentally activate Your Fears Become Manifest.
> - 17+: The obelisk is deactivated until the end of the encounter.

> ❕ Activate
> A new round starts.
> Effect: The Your Fears Become Manifest ability.

> ❗️ Your Fears Become Manifest
> | Area, Magic | Free triggered action |
> | 📏 10 burst | 🎯 Each enemy in the area |
> Power Roll + 2:
> - ≤11: P < 1 slowed (EoT)
> - 12-16: P < 2 slowed and weakened (EoT)
> - 17+: P < 3 frightened, slowed, and weakened (EoT)
> Effect: The target is pushed 2 squares.

EV Calculation Patterns

EV by Category and Level

Category Level 1 Level 2 Level 3 Level 4 Level 5
Environmental Hazard 1 2-3 3-4 - -
Fieldwork 1-2 3 - - -
Mechanism 1-2 3 3-4 - -
Siege Engine - 8 10 12 -
Power Fixture - - - - 7-14
Supernatural Object - - 20 24 -

Linked EV

CRITICAL: Linked mechanisms are TWO SEPARATE DTOs, not one combined stat block.

When generating a linked system (pressure plate + trap), output:

  1. Trigger DTO (e.g., Pressure Plate) - complete stat block
  2. Linked DTO (e.g., Dart Trap) - complete stat block

❌ WRONG - Combined stat block:

EV: 3 (Pressure Plate 2 + Dart Trap 1)  ← NEVER do this

✓ CORRECT - Two separate stat blocks:

Pressure Plate (Level 1 Trigger Support)
- EV: 2
- Stamina: -
...
Link: A pressure plate is linked to another mechanism...

---

Dart Trap (Level 1 Trap Ambusher)
- EV: 1
- Stamina: 3
...
Activate: A pressure plate, switch, or other linked trigger is activated.
Type Description Examples
Fixed Single object Bear Trap 2, Dart Trap 1
Per-10×10 Scales with size Brambles 1/10×10, Lava 4/10×10

Upgrade EV Costs

Complexity EV Cost Examples
Simple +1 EV Concealed Hive, Chain, Large Darts
Moderate +2 EV Killer Bees, Poison Darts
Major +3-4 EV Screamers, Magma Flow, Gatling Darts
Multiple items +3 EV per item Additional pillars, rams

Stamina Patterns

By Category

Category Stamina Type Range
Environmental Hazard Per-square or Fixed 3-12/sq or 3 fixed
Fieldwork Fixed or Per-square 1-9 or 3-9/sq
Mechanism Fixed or None 3-6 or -
Siege Engine Fixed 25-60
Power Fixture Fixed 35-60
Supernatural Object Fixed 80-140

By Level

Level Siege Engine Power Fixture Supernatural Object
2 30-50 - -
3 25-60 - 80-100
4 60 - 140
5 - 35-60 -

Damage Values by Level

Power Roll Damage (Tier 1 / Tier 2 / Tier 3)

Level Tier 1 (≤11) Tier 2 (12-16) Tier 3 (17+)
1 1-4 3-5 5-6
2 3-5 6-9 9-11
3 3-5 6-9 9-12
4 6 10 13
5 6 11 14

Mechanism Damage (Lower than Siege Engines)

Mechanisms (traps, devices) deal less damage than siege engines at the same level.

Level Mechanism (T1/T2/T3) Siege Engine (T1/T2/T3)
1 2/4/5 -
2 3/5/7 to 4/6/9 5/8/11
3 3/7/10 5/9/12
4 - 6/10/13

Examples:

  • Dart Trap (L1): 2/4/5 damage
  • Pillar (L2): 4/6/9 damage
  • Portcullis (L3): 3/7/10 damage
  • Arrow Launcher (L2 Siege): 5/8/11 damage

Siege Engine Damage

Level Tier 1 Tier 2 Tier 3
2 5 8 11
3 5 9 12
4 6 10 13

Damage Types

ALWAYS specify damage type - NEVER use generic "damage"

When validating damage types or conditions: ../shared/DRAW_STEEL_BASICS.md

Theme Matching

DTO Theme Damage Type
Lava, oil, fire fire
Ice, cold cold
Acid, corrosive acid
Venomous, toxic poison
Magical, supernatural psychic, corruption, or holy
Physical traps Just say "damage" (no type in power rolls)

Physical Trap Example (Bear Trap, Dart Trap, Column of Blades):

Power Roll + 2:
- ≤11: 3 damage
- 12-16: 5 damage
- 17+: 7 damage

Elemental Hazard Example (Lava, Angry Beehive):

Power Roll + 2:
- ≤11: 5 fire damage
- 12-16: 9 fire damage
- 17+: 12 fire damage

Conditions

When validating conditions: ../shared/DRAW_STEEL_BASICS.md

Condition Durations

Duration Format How It Ends
Save ends [condition] (save ends) Target rolls d10, 6+ ends condition
End of turn [condition] (EoT) Ends at end of current turn
End of encounter [condition] until the end of the encounter Ends when encounter ends
Conditional [condition] with no duration Ends by specific action

Special Conditions

Condition Duration Behavior
grabbed Ends by escape, release, or breaking adjacency
prone Ends by standing up maneuver
frightened Ends when source changes or is removed
burning Takes 1d6 fire damage at start of each turn (save ends)
bleeding Takes damage when using actions (save ends)

CRITICAL: grabbed NEVER uses "(save ends)"

Grabbed is a conditional condition that ends when the target escapes or breaks adjacency. It does NOT end via saving throw.

❌ WRONG: M < 2 grabbed (save ends)
✓ CORRECT: M < 2 grabbed

Example from Bear Trap:

- 12-16: 3 damage; A < 1 slowed (save ends)  ← slowed uses save ends
- 17+: 5 damage; A < 2 slowed (save ends)    ← slowed uses save ends

Note: Bear Trap mentions grabbed in Effect text, not potency. When using grabbed in potency, just say "M < 2 grabbed" without (save ends).

Special DTO Properties

Hidden Property

Many DTOs are hidden until triggered or detected.

Format:

> ⭐️ Hidden
> The [DTO name] is hidden until triggered or detected.

Discovery: Intuition test as part of Search for Hidden Creatures maneuver:

  • ≤11: Find hidden terrain objects adjacent to you
  • 12-16: Find hidden terrain objects within 5 squares
  • 17+: Find hidden terrain objects within 10 squares

Common Hidden DTOs: Bear Trap, Snare Trap, Spike Trap, Quicksand, Dart Trap, Portcullis, Ram, Pressure Plate

Allied Awareness

Benefits for defenders familiar with the DTO.

Format:

> ⭐️ Allied Awareness
> [Description of benefits and options available to creatures with familiarity and training]

Examples:

  • Corrosive Pool: Allies with torches can trigger Explosive Reaction
  • Archer's Stakes: Allies ignore difficult terrain, take no damage, have cover
  • Column of Blades: Allies who shift don't trigger

Immunity

Durable DTOs have damage immunities.

Format: Immunity: [value] to all damage except [type] damage

Examples:

  • Lava: Immunity 20 to all damage except cold
  • Corrosive Pool: Immunity 20 to all damage except cold or fire
  • Frozen Pond: Immunity 5 to all damage except fire
  • Tree of Might: Immunity 5 to all damage except corruption or fire

Link Field

Trigger mechanisms use Link field to indicate connection.

Format: Link: A [mechanism type] is linked to another mechanism that it activates when triggered.

Direction Field

Directional DTOs indicate firing direction.

Format: Direction: The [DTO name] fires in a fixed direction.

Typical Space

Large trigger areas have typical space guidance.

Format: Typical Space: [size description]

Characteristic Tests by DTO

Deactivation Test Characteristics

Characteristic Use Case Example DTOs
Agility Traps, mechanisms, nimble work Bear Trap, Dart Trap, Arrow Launcher, Catapult
Might Physical strength tasks Hidey-Hole, Pavise Shield
Reason Intellectual or magical tasks Black Obelisk, Exploding Mill Wheel
Intuition Perception and awareness Column of Blades (Allied Awareness)
Presence Social or supernatural tasks Throne of A'An

Deactivate Section Rules

Deactivate sections have ONE primary method, optionally followed by a consequence note.

Pattern Example
Test-based "As a maneuver, a creature...can make an Agility test."
Destruction "The [object] must be completely destroyed."
Impossible "The [object] can't be deactivated."
Impossible + consequence "The [object] can't be deactivated. If it takes damage, [effect]."
❌ WRONG - Two separate methods:
> 🌀 Deactivate
> The spirits must be completely destroyed. As a maneuver, a creature can make a Presence test.

✓ CORRECT - One method:
> 🌀 Deactivate
> As a maneuver, a creature adjacent to the gravebound spirits can make a Presence test.

✓ CORRECT - Impossible with consequence (from Angry Beehive):
> 🌀 Deactivate
> The beehive can't be deactivated. If it takes damage or is destroyed, the hive unleashes a swarm of bees.

DTO Stat Block Template

###### [Name] (Level [X] [Category] [Role])

[Flavor text description]

- **EV:** [value] [per 10×10 if applicable]
- **Stamina:** [value] [per square if applicable, or "-"]
- **Size:** [size]
- **[Optional: Immunity/Direction/Typical Space/Link]**

<!-- -->
> 🌀 **Deactivate**
>
> [Deactivation method, often with characteristic test and outcomes]

<!-- -->
> ❕ **Activate**
>
> [Trigger condition]
>
> **Effect:** [What happens when triggered]

<!-- -->
> ❗️ **[Ability Name]**
>
> | **[Keywords]** | **[Action Type]** |
> | -------------- | ----------------: |
> | **📏 [Distance]** | **🎯 [Target]** |
>
> **[Trigger if applicable]**
>
> **Power Roll + 2:**
>
> - **≤11:** [Tier 1 effect]
> - **12-16:** [Tier 2 effect]
> - **17+:** [Tier 3 effect]
>
> **Effect:** [Additional effects]

<!-- -->
> ⭐️ **[Optional: Upgrades/Hidden/Allied Awareness]**
>
> [Upgrade name (+X EV)] [Description]

Ability Keywords

DTOs DO NOT have object-level keywords. Their abilities use standard ability keywords.

Valid DTO Ability Keywords

Keyword Use Example
area Area attacks Arrow Storm, Black Obelisk
melee Melee attacks Bear Trap, Lava
ranged Ranged attacks Dart Trap, Arrow Storm
strike Attack abilities Most DTO abilities
weapon Physical traps Bear Trap, Dart Trap
magic Supernatural effects Black Obelisk, Frozen Pond

Keywords are always lowercase.

Keyword + Distance Combinations

CRITICAL: Keywords must match distance type.

Keywords Distance Format Example DTOs
melee, strike, weapon 📏 Melee 0 or 📏 Melee 1 Bear Trap, Column of Blades
ranged, strike, weapon 📏 Ranged 5 Dart Trap
area, ranged, weapon 📏 5 cube within 20 Arrow Storm
area, magic 📏 10 burst Black Obelisk
melee, strike 📏 Melee 0 or 📏 Melee 1 Lava (no weapon)
magic, melee, strike 📏 Melee 0 Frozen Pond, Sleep Spores
❌ WRONG - Keyword/distance mismatch:
| Melee, Strike, Weapon | Free triggered action |
| 📏 Ranged 5 | 🎯 One creature |    ← Melee keyword but Ranged distance

❌ WRONG - Keyword/distance mismatch:
| Ranged, Strike, Weapon | Free triggered action |
| 📏 Melee 1 | 🎯 One creature |    ← Ranged keyword but Melee distance

✓ CORRECT - Keyword/distance match:
| Ranged, Strike, Weapon | Free triggered action |
| 📏 Ranged 5 | 🎯 One creature |    ← Dart Trap

Damage Type is NOT a Keyword

CRITICAL: Do NOT use damage types as keywords.

Damage type (fire, cold, poison, etc.) belongs in the power roll damage description, NOT in keywords.

❌ WRONG - Damage type as keyword:
| Fire, Area, Magic | Free triggered action |
| 📏 5 burst | 🎯 Each creature in area |
Power Roll + 2:
- ≤11: 5 fire damage    ← redundant "fire" keyword above

✓ CORRECT - Damage type in power roll only:
| Area, Magic | Free triggered action |
| 📏 5 burst | 🎯 Each creature in area |
Power Roll + 2:
- ≤11: 5 fire damage; M < 1 burning (save ends)

Action Types:

  • Free triggered action - Most DTO activations
  • Main action (Adjacent creature) - Siege engine abilities

Special Sections

Hidden Property Format

Keep Hidden sections simple. Do not include discovery mechanics.

✓ CORRECT:
> ⭐️ Hidden
> The bear trap is hidden until triggered or detected.

❌ WRONG - Too detailed:
> ⭐️ Hidden
> The illusory floor is hidden until triggered or detected. A creature who succeeds on an Intuition test as part of a Search for Hidden Creatures maneuver can see through the illusion.

Discovery rules are handled by the standard Search for Hidden Creatures maneuver, not in the Hidden section.

Allied Awareness Format

Allied Awareness grants automatic benefits to allies familiar with the DTO, not test-based abilities.

✓ CORRECT - Automatic benefits:
> ⭐️ Allied Awareness
> Allies ignore difficult terrain, take no damage from moving through, and have cover.

❌ WRONG - Test-based ability:
> ⭐️ Allied Awareness
> Creatures familiar with the runes can make an Agility test as a maneuver to move through the area without triggering them.

If you need a test-based ability, create it as a separate feature, not Allied Awareness.

Self-Validation Checklist

Before outputting a DTO, verify:

  • Header line includes: Name (Level X Category Role)
  • EV value present with correct type (fixed, per-area, linked)
  • Stamina value present (fixed, per-square, or "-")
  • Size value present (use "One or more squares" for variable-size DTOs)
  • Deactivate section has ONE method (test OR destruction OR impossible)
  • Activate section with trigger condition (if applicable)
  • All damaging abilities use power roll with tiered outcomes
  • All damage has a type specified (fire, acid, poison, etc.) OR just "damage" for physical traps
  • Potency checks use correct format: [Characteristic] < [value] [condition]
  • Condition durations specified: (save ends), (EoT), or conditional
  • No D&D terminology used (no "DC", "saving throw", dice notation)
  • Keywords lowercase and valid
  • Keywords match distance type (Melee keyword → Melee distance, Ranged keyword → Ranged distance)
  • No damage types used as keywords (fire, cold, poison are NOT keywords)
  • Hidden property included for traps/hazards that should be concealed
  • Hidden section is simple (no discovery mechanics)
  • Allied Awareness grants automatic benefits (not test-based abilities)
  • Upgrade EV costs reasonable (+1 simple, +2 moderate, +3-4 major)

Validation Script

Run validation on generated DTOs:

python .claude/skills/draw-steel-dto-generator/scripts/validate_dto.py output/filename.md

Output interpretation:

  • PASSED (✓): All checks successful
  • ERRORS (❌): Critical issues - fix before using
  • WARNINGS (⚠️): Minor issues - review but acceptable

This is MANDATORY when generating DTOs - never skip validation.

Cross-System Conversion

When converting traps/hazards from other systems:

Extract from source (for inspiration ONLY):

  • Theme & concept (fire trap → fire damage type)
  • DTO category (trap, hazard, mechanism, etc.)
  • Effect concepts (area damage, conditions, triggers)
  • Level/CR as starting point for DTO level

Calculate using Draw Steel formulas:

  • Stamina from Draw Steel patterns (NOT source HP)
  • Damage from Draw Steel formulas (NOT source dice)
  • DC → potency notation (NOT "DC X save")

Never copy:

  • HP → Use Draw Steel stamina formulas instead
  • Damage dice (2d6, etc.) → Use fixed Draw Steel damage values
  • DC values → Use potency (M < 2, A < 1, etc.)
  • Saving throws → Use power rolls with potency
  • Source system terminology or mechanics

❌ WRONG - Direct conversion:

PF2e Hazard: "HP 60, Disable DC 22, 2d6 fire + 2d6 mental damage"
DTO: Stamina 60, Deactivate DC 22, 7 fire + 7 psychic damage  ❌

✓ CORRECT - Use Draw Steel formulas:

PF2e Level 4 Hazard → Level 4 Supernatural Object
Stamina: Use DTO stamina pattern for L4 (NOT source HP 60)
- L4 Supernatural Object: 100-140 stamina (see Published Examples)
- L4 Siege Engine: 60 stamina
Damage: Use Draw Steel damage formula for L4
- L4 damage: 7/12/16 or 8/13/17 (NOT source dice 2d6+2d6)
Deactivate: Presence test with tiered outcomes (NOT "DC 22")

✅ DO:

  • Extract THEME and CONCEPT
  • Take ability CONCEPTS and reimagine with Draw Steel mechanics
  • Use appropriate damage type for theme
  • Use Draw Steel stamina patterns by level and category

❌ DO NOT:

  • Copy HP values directly → Use Draw Steel stamina formulas
  • Copy damage dice → Use Draw Steel fixed damage values
  • Copy DC values → Use potency or power rolls
  • Use D&D/PF2e terminology
  • Try to recreate exact effects from source

Example Conversion:

D&D 5e Fireball Trap:

"DC 15 Dexterity save, 8d6 fire damage on fail, half on success"

Draw Steel DTO:

> ❗️ Fireball Trap
> | Area, Magic | Free triggered action |
> | 📏 4 cube within 5 | 🎯 Each creature in the area |
> Power Roll + 2:
> - ≤11: 5 fire damage
> - 12-16: 8 fire damage; A < 1 dazed (EoT)
> - 17+: 11 fire damage; A < 2 dazed (EoT)

Foundry VTT Object Actor JSON Schema

Output Workflow

CRITICAL: All formats require internal Foundry JSON generation and validation.

  1. Generate Foundry Object actor JSON internally
  2. Run validation: python .claude/skills/draw-steel-dto-generator/scripts/validate_dto_json.py output/filename.json
  3. Convert validated JSON to requested format(s)
  4. Display validation results to user
  5. Return output

Core Object Actor Structure

{
  "name": "Bear Trap",
  "type": "object",
  "img": "systems/draw-steel/assets/roles/ambusher.webp",
  "system": {
    "stamina": { "value": 6, "max": 6, "temporary": 0 },
    "characteristics": {
      "might": { "value": 0, "banes": 0, "edges": 0 },
      "agility": { "value": 0, "banes": 0, "edges": 0 },
      "reason": { "value": 0, "banes": 0, "edges": 0 },
      "intuition": { "value": 0, "banes": 0, "edges": 0 },
      "presence": { "value": 0, "banes": 0, "edges": 0 }
    },
    "combat": {
      "save": { "threshold": 6, "bonus": "" },
      "size": { "value": 1, "letter": "S" },
      "stability": 0,
      "turns": 0
    },
    "movement": null,
    "damage": {
      "immunities": { "all": 0 },
      "weaknesses": {}
    },
    "statuses": { "immunities": [] },
    "biography": { "value": "", "director": "" },
    "source": { "book": "Dynamic Terrain", "page": "", "license": "Draw Steel Creator License" },
    "ev": 2,
    "object": {
      "level": 1,
      "category": "trap",
      "role": "ambusher",
      "area": "",
      "squareStamina": false
    }
  },
  "prototypeToken": {
    "name": "Bear Trap",
    "displayName": 20,
    "displayBars": 20,
    "bar1": { "attribute": "stamina" },
    "width": 1,
    "height": 1,
    "disposition": -1,
    "texture": { "src": "systems/draw-steel/assets/roles/ambusher.webp" }
  },
  "items": [],
  "_stats": { "systemId": "draw-steel", "systemVersion": "0.10.0" },
  "_id": "I2HA61b5E3GHnHTH"
}

_ID Format (Critical)

All _id fields must match ^[a-zA-Z0-9]{16}$ (exactly 16 alphanumeric chars).

CRITICAL: All IDs must be UNIQUE within the same DTO. This includes:

  • The actor's _id
  • Each item/ability's _id
  • Each effect's _id inside system.power.effects

⚠️ NEVER reuse the same ID for multiple entities:

// WRONG - same ID used for actor, ability, AND effect:
"_id": "Feu32e27L0EEvSda"           // Actor
...
{
  "_id": "Feu32e27L0EEvSda",        // Ability - DUPLICATE!
  "system": { "power": { "effects": {
    "Feu32e27L0EEvSda": {           // Effect - TRIPLE DUPLICATE!
      "_id": "Feu32e27L0EEvSda",
      ...
    }
  }}}
}

✅ CORRECT - every ID is unique:

{
  "_id": "I2HA61b5E3GHnHTH",        // Actor ID
  "items": [
    {
      "_id": "XyPJJOU0fiU8VyHl",    // Ability 1 ID (unique)
      "system": { "power": { "effects": {
        "le5j4jZ6dJLk4UuE": {       // Effect ID (unique)
          "_id": "le5j4jZ6dJLk4UuE",
          ...
        }
      }}}
    },
    {
      "_id": "PdL6EvIAV8xSMb3m"     // Ability 2 ID (unique)
    }
  ]
}

Workflow: Generate ALL IDs upfront, then assign them sequentially.

# Calculate needed IDs:
# 1 actor + 3 abilities + 5 effects = 9 IDs
python scripts/generate_foundry_ids.py --count 9

# Assign in order:
# ID[0] = actor._id
# ID[1] = items[0]._id
# ID[2] = items[0].system.power.effects[effect_key]._id
# ID[3] = items[1]._id
# ...and so on

Use the ID generator script to avoid errors:

# Generate 1 ID (for actor)
python scripts/generate_foundry_ids.py

# Generate 5 IDs (for DTO abilities)
python scripts/generate_foundry_ids.py --count 5

Example workflow:

# 1. Generate IDs for your DTO
python scripts/generate_foundry_ids.py --count 5
# Output:
# aB2c3D4e5F6G7890
# mK9jn2Lp4Qr6St8u
# vX1yZ3w5A7b9C0dE
# fG2hI4j6K8lM0nO2
# pQ4rS6tU8vW0xY2z

# 2. Use these IDs in your JSON
"_id": "aB2c3D4e5F6G7890"  # Actor ID
"_id": "mK9jn2Lp4Qr6St8u"  # Ability 1 ID
"_id": "vX1yZ3w5A7b9C0dE"  # Ability 2 ID

Manual generation is error-prone and discouraged. Common errors:

  • Wrong length (15 or 17 characters instead of 16)
  • Including dashes (UUID format like a1b2c3d4-e5f6-7890-abcd)
  • Using placeholder text like "BearTrapObject001"
  • Generating duplicate IDs within the same DTO ← THIS CAUSES VALIDATION FAILURES

Object Category Mapping

DTO Category Object Category
Environmental Hazard hazard
Fieldwork (Trap) trap
Fieldwork (Fortification) fortification
Mechanism (Trap) trap
Mechanism (Trigger) trigger
Mechanism (Fortification) fortification
Siege Engine siegeEngine
Power Fixture relic
Supernatural Object relic

Object Image Paths

CRITICAL: Use role-based images, NOT category-specific paths.

The Draw Steel system does NOT have category-specific icons (no trap.svg, hazard.svg, etc.). Use the role images from assets/roles/:

DTO Role Image Path
ambusher systems/draw-steel/assets/roles/ambusher.webp
artillery systems/draw-steel/assets/roles/artillery.webp
brute systems/draw-steel/assets/roles/brute.webp
controller systems/draw-steel/assets/roles/controller.webp
defender systems/draw-steel/assets/roles/defender.webp
harrier systems/draw-steel/assets/roles/harrier.webp
hexer systems/draw-steel/assets/roles/hexer.webp
support systems/draw-steel/assets/roles/support.webp
no role systems/draw-steel/assets/roles/minion.webp

For DTOs without a role, use minion.webp as a fallback.

❌ WRONG - These paths do NOT exist:
"img": "systems/draw-steel/assets/icons/svg/trap.svg"
"img": "systems/draw-steel/assets/icons/svg/hazard.svg"
"img": "systems/draw-steel/assets/icons/svg/fortification.svg"

✓ CORRECT - Use role-based images:
"img": "systems/draw-steel/assets/roles/ambusher.webp"

Object Fields

Field Type Description
type string Always "object" for DTOs
system.object.level integer DTO level (1-5 typically)
system.object.category string One of: hazard, trap, trigger, siegeEngine, relic, fortification
system.object.role string Same roles as monsters: ambusher, artillery, brute, controller, defender, harrier, hexer, mount, support, or ""
system.object.area string Number of squares as string (e.g., "4") or "" for single-square
system.object.squareStamina boolean true if stamina is per-square
system.ev integer REQUIRED - Encounter Value (e.g., 1-4 for hazards, 8-12 for siege engines)
system.movement null/object null for static objects, object with movement for mobile

Ability Fields (Critical)

damageDisplay (Required):

// CORRECT - Only valid values:
"damageDisplay": "melee"   // For melee attacks (distance.type: "melee")
"damageDisplay": "ranged"  // For ranged attacks, area attacks, bursts, cubes, etc.

// WRONG - These cause validation errors:
"damageDisplay": "none"    // ❌ NOT VALID
"damageDisplay": "other"   // ❌ NOT VALID
"damageDisplay": ""        // ❌ NOT VALID

When to use "ranged":

  • Distance type is ranged, burst, cube, line, wall, or aura
  • Area effects (10 burst, 5 cube, etc.)
  • Any non-melee attack

Deactivate/Activate features (no attack roll):

  • Use "damageDisplay": "melee" as default
  • These features typically don't have power rolls with damage

target.value (Required integer):

// CORRECT:
"target": {"type": "creatureObject", "value": 1}                    // Single target
"target": {"type": "creatureObject", "value": null, "custom": "..."}  // Multiple targets

// WRONG:
"target": {"type": "creatureObject", "value": "special"}  // ❌ String not allowed

Static vs Mobile Objects

Static Objects (most DTOs):

"movement": null

Mobile Objects (e.g., mobile siege engines):

"movement": {
  "value": 3,
  "types": ["walk"],
  "hover": false,
  "disengage": 0
}

Object Stamina Patterns

Fixed Stamina:

"stamina": { "value": 6, "max": 6, "temporary": 0 },
"object": {
  "area": null,
  "squareStamina": false
}

Per-Square Stamina:

"stamina": { "value": 3, "max": 3, "temporary": 0 },
"object": {
  "area": 4,
  "squareStamina": true
}

No Stamina (indestructible):

"stamina": { "value": 0, "max": 0, "temporary": 0 },
"object": {
  "area": null,
  "squareStamina": false
}

Damage Immunities & Weaknesses

"damage": {
  "immunities": {
    "all": 0,
    "poison": 0,
    "acid": 0,
    "cold": 0,
    "corruption": 0,
    "fire": 0,
    "holy": 0,
    "lightning": 0,
    "psychic": 0,
    "sonic": 0
  },
  "weaknesses": { "all": 0, "cold": 5 }
}

Numeric Values Explained

Official Rule: "Damage immunity often has a value associated with it... Whenever a target with damage immunity takes damage of the indicated type, they can reduce the damage by the value of the immunity (to a minimum of 0 damage)."

Immunities:

  • 0 = No immunity (takes full damage from this type)
  • Numeric value = Reduces damage by that amount (e.g., "poison": 7 reduces poison damage by 7)
  • 1000 = Total immunity (Foundry VTT pattern for complete immunity)
  • For DTOs, set value to DTO's level or a thematic amount

Example: A DTO with "fire": 5 takes 10 fire damage → reduced to 5 damage. If it takes 4 fire damage → reduced to 0.

Total Immunity: Use "psychic": 1000 (or similar high value) for complete immunity. This is appropriate for inanimate objects that cannot be affected by certain damage types at all.

Weaknesses:

  • 0 = No weakness to this damage type
  • Numeric value = Extra damage dealt TO the DTO when hit with this type

Example: "cold": 5 means cold attacks deal +5 damage against this DTO.

CRITICAL: Always use numeric values, NOT booleans:

❌ WRONG - Boolean values:
"immunities": {"poison": true, "psychic": true}

✓ CORRECT - Numeric values:
"immunities": {"poison": 1000, "psychic": 1000}  // Total immunity
"immunities": {"poison": 3, "psychic": 3}        // Partial reduction (level-based)

Immunity Patterns by DTO Type

DTO Type Common Immunities Typical Value
Inanimate Objects poison, psychic 1000 (total immunity)
Constructs/Mechanisms poison, psychic, corruption 1000 (total immunity)
Elemental Hazards their element Level or 1000
Durable Objects physical types Level-based

Example - Steam Pressure Vent (construct):

"immunities": {
  "all": 0,
  "poison": 1000,
  "psychic": 1000,
  "corruption": 1000
}

Damage Type Conversions

When converting from other systems, use these Draw Steel damage types:

Other System Draw Steel
mental psychic
necrotic corruption
radiant holy
thunder sonic

Valid Draw Steel damage types: acid, cold, corruption, fire, holy, lightning, poison, psychic, sonic

Condition Immunities

DTOs can be immune to conditions via system.statuses.immunities:

"statuses": {
  "immunities": ["dazed", "frightened", "grabbed", "prone", "restrained", "slowed", "weakened"]
}

Valid conditions: bleeding, dazed, frightened, grabbed, prone, restrained, slowed, surprised, taunted, weakened

All Conditions Immunity:

"statuses": {
  "immunities": ["bleeding", "dazed", "frightened", "grabbed", "prone", "restrained", "slowed", "surprised", "taunted", "weakened"]
}

Object Ability Structure

DTO abilities use the same structure as monster abilities:

{
  "name": "Bear Trap",
  "type": "ability",
  "system": {
    "type": "freeTriggered",
    "category": "signature",
    "keywords": ["melee", "strike", "weapon"],
    "distance": { "type": "melee", "primary": 0 },
    "target": { "type": "creatureObject", "value": 1 },
    "damageDisplay": "melee",
    "power": {
      "roll": { "formula": "@chr", "characteristics": ["agility"] },
      "effects": {
        "XyPJJOU0fiU8VyHl": {
          "_id": "XyPJJOU0fiU8VyHl",
          "type": "damage",
          "damage": {
            "tier1": { "value": "1", "types": [], "properties": [] },
            "tier2": { "value": "3", "types": [], "properties": [] },
            "tier3": { "value": "5", "types": [], "properties": [] }
          }
        }
      }
    },
    "effect": { "before": "", "after": "<p>The bear trap must be manually reset.</p>" },
    "spend": { "text": "", "value": null },
    "source": { "book": "Dynamic Terrain", "license": "Draw Steel Creator License" }
  },
  "_id": "le5j4jZ6dJLk4UuE"
}

Validation Script

Run before outputting with --format foundry or --format both:

python .claude/skills/draw-steel-dto-generator/scripts/validate_dto_json.py output/filename.json

Output interpretation:

  • PASSED (✓): All checks successful
  • ERRORS (❌): Critical issues - fix before importing
  • WARNINGS (⚠️): Minor issues - review but acceptable

This is MANDATORY - never skip validation.

Published Examples Reference

DTO Level Category Role EV Stamina
Brambles 1 Hazard Defender 1/10×10 3/sq
Bear Trap 1 Fieldwork Ambusher 2 6
Dart Trap 1 Mechanism Ambusher 1 3
Pressure Plate 1 Mechanism Support 2 -
Angry Beehive 2 Hazard Hexer 2 3
Arrow Launcher 2 Siege Engine Artillery 8 30
Field Ballista 2 Siege Engine Artillery 8 40
Lava 3 Hazard Hexer 4/10×10 12/sq
Column of Blades 3 Mechanism Defender 3 5
Catapult 3 Siege Engine Artillery 10 50
Black Obelisk 3 Supernatural Controller 20 100
Holy Idol 5 Power Fixture Support 7 35
Tree of Might 5 Power Fixture Hexer 14 60
Iron Dragon 4 Siege Engine Artillery 12 60
Throne of A'An 4 Supernatural Controller 24 140

Stamina by Category and Level

CRITICAL: Never copy HP from source systems. Use these Draw Steel patterns:

Category Stamina Pattern Notes
Hazard 3-12 per square Area-based, squareStamina: true
Fieldwork 3-6 Low stamina, defensive structures
Mechanism 3-5 Low stamina, can be disabled
Siege Engine 30-60 by level High stamina, L2=30-40, L3=50, L4=60
Supernatural Object 100-140 by level Very high stamina, L3=100, L4=140
Power Fixture 35-60 by level Medium-high stamina
Trigger - or 0 Usually indestructible

Stamina by Level (approximate):

  • Level 1: 3-6 (simple traps), 3/sq (hazards)
  • Level 2: 3-6 (traps), 30-40 (siege engines)
  • Level 3: 5-12 (traps/mechanisms), 50 (siege engines), 100 (supernatural)
  • Level 4: 60 (siege engines), 140 (supernatural)
  • Level 5: 35-60 (power fixtures)

Damage by Level

CRITICAL: Never copy damage dice from source systems. Use Draw Steel formulas:

Damage = ceil((4 + Level + Role_Modifier) × Tier_Multiplier)

Role Modifiers:

  • Ambusher, Artillery, Brute: +1
  • Controller, Defender, Harrier, Hexer, Mount, Support: +0

Tier Multipliers:

  • Tier 1 (≤11): ×0.5
  • Tier 2 (12-16): ×1.0
  • Tier 3 (17+): ×1.5

Quick Reference:

Level Tier 1 Tier 2 Tier 3 (with +1 role)
1 2 5 7 3/6/9
2 3 6 9 4/7/11
3 4 7 11 4/8/12
4 4 8 12 5/9/14
5 5 9 14 5/10/15

Example: Level 4 Ambusher DTO → damage is 5/9/14

Install via CLI
npx skills add https://github.com/stgreenb/draw-steel-ai-skills --skill draw-steel-dto-generator
Repository Details
star Stars 1
call_split Forks 0
navigation Branch main
article Path SKILL.md
More from Creator