Follow this sequence when creating 3D combat encounters:
- Generate Terrain →
generate_terrain_patchwith biome/density - Add Details →
place_propfor POIs, buildings, structures - Place Party → Party members positioned safely
- Place Enemies → Enemies positioned tactically
- Start Combat →
create_encounterwith all positions
| Z Value | Meaning | Use Case |
|---|---|---|
z=0 |
Standing on surface at (x,y) | Default for everything |
z>0 |
Flying/levitating in air | Only with flight capability |
z<0 |
In pit/valley/water below ground | Deep rivers, chasms |
"Standing on rocks" = same (x,y) as rock obstacle, z=0
The terrain height is IMPLICIT. Don't add synthetic Z values!
// ✅ CORRECT: Goblin standing ON rock at (15,3)
{ "position": { "x": 15, "y": 3, "z": 0 } }
// ❌ WRONG: Goblin floating above rock (will FALL!)
{ "position": { "x": 15, "y": 3, "z": 25 } }Create natural formations, not random squares:
- Hills/Mountains: Obstacles cluster with adjacent slopes
- Valleys: Negative elevation with gradual descent
- Cliffs: Only isolated vertical surfaces if INTENTIONALLY inaccessible
- Default: Add adjacent terrain that steps down to ground level
Unless designing inaccessible terrain:
Ground(0) → Low(1) → Mid(2) → High(3) ✅ Natural mountain
Ground(0) → HIGH(5) ❌ Floating platform (needs flying)
Water bodies should be connected as rivers, streams, or pools:
- Rivers: Long chains of tiles, narrow (1-2 wide)
- Streams: Short chains (2-5 tiles)
- Pools: Clustered circular-ish areas
- Lakes: Large connected bodies
Never place isolated single water tiles.
heightFeet describes the PROP's visual height, NOT entity position:
{
"position": "5,5",
"label": "30ft Cliff",
"heightFeet": 30 // Visual appearance
// Entity standing on top uses z=0, not z=30!
}| Type | Description | Example |
|---|---|---|
cliff |
Vertical rocky terrain | Mountain side |
wall |
Stone/brick barrier | Building wall |
bridge |
Spanning structure | River crossing |
tree |
Vegetation | Forest cover |
stairs |
Stepped ascent | Access to high ground |
pit |
Below ground (negative Y) | Trap, ravine |
water_pool |
Recessed water | Pond, stream section |
| Archetype | Description | Examples |
|---|---|---|
humanoid |
Bipedal | Goblins, orcs, humans |
quadruped |
Four-legged | Wolves, horses |
beast |
Hunched/bulky | Trolls, bears |
serpent |
Elongated | Snakes, worms |
avian |
Winged | Dragons, harpies |
arachnid |
Multi-legged | Spiders, scorpions |
amorphous |
Blob-like | Oozes, elementals |
- Archers: On elevated terrain (standing ON obstacles)
- Melee: Ground level, near approaches
- Ambushers: Behind cover props
- Flying: Only creatures with flight (z>0)
Use these exact patterns for consistent generation. COPY the coordinate patterns!
Parallel cliff walls with wide river in the middle.
Layout (top-down view):
CLIFF ROW 1 (West Wall) | RIVER (3-wide) | CLIFF ROW 2 (East Wall)
x=5 | x=8,9,10 | x=13
{
"terrain": {
"obstacles": [
// WEST CLIFF WALL (straight line at x=5)
"5,0",
"5,1",
"5,2",
"5,3",
"5,4",
"5,5",
"5,6",
"5,7",
"5,8",
"5,9",
"5,10",
"5,11",
"5,12",
"5,13",
"5,14",
"5,15",
"5,16",
"5,17",
"5,18",
"5,19",
// EAST CLIFF WALL (straight line at x=13)
"13,0",
"13,1",
"13,2",
"13,3",
"13,4",
"13,5",
"13,6",
"13,7",
"13,8",
"13,9",
"13,10",
"13,11",
"13,12",
"13,13",
"13,14",
"13,15",
"13,16",
"13,17",
"13,18",
"13,19"
],
"water": [
// RIVER CENTER (3 tiles wide, x=8,9,10)
"8,0",
"9,0",
"10,0",
"8,1",
"9,1",
"10,1",
"8,2",
"9,2",
"10,2",
"8,3",
"9,3",
"10,3",
"8,4",
"9,4",
"10,4",
"8,5",
"9,5",
"10,5",
"8,6",
"9,6",
"10,6",
"8,7",
"9,7",
"10,7",
"8,8",
"9,8",
"10,8",
"8,9",
"9,9",
"10,9",
"8,10",
"9,10",
"10,10",
"8,11",
"9,11",
"10,11",
"8,12",
"9,12",
"10,12",
"8,13",
"9,13",
"10,13",
"8,14",
"9,14",
"10,14",
"8,15",
"9,15",
"10,15",
"8,16",
"9,16",
"10,16",
"8,17",
"9,17",
"10,17",
"8,18",
"9,18",
"10,18",
"8,19",
"9,19",
"10,19"
]
}
}{
"terrain": {
"obstacles": [
// NORTH WALL
"0,5",
"1,5",
"2,5",
"3,5",
"4,5",
"5,5",
"6,5",
"7,5",
"8,5",
"9,5",
// SOUTH WALL
"0,15",
"1,15",
"2,15",
"3,15",
"4,15",
"5,15",
"6,15",
"7,15",
"8,15",
"9,15"
]
}
}{
"terrain": {
"obstacles": [
// Circle perimeter (radius 8, center at 10,10)
"10,2",
"11,2",
"12,3",
"13,4",
"14,5",
"15,6",
"16,7",
"17,8",
"17,9",
"17,10",
"17,11",
"16,12",
"15,13",
"14,14",
"13,15",
"12,16",
"11,17",
"10,17",
"9,17",
"8,16",
"7,15",
"6,14",
"5,13",
"4,12",
"3,11",
"3,10",
"3,9",
"3,8",
"4,7",
"5,6",
"6,5",
"7,4",
"8,3",
"9,2"
]
}
}{
"terrain": {
"obstacles": [
// LEFT WALL (narrows toward center)
"3,0",
"4,2",
"5,4",
"6,6",
"7,8",
"8,10",
"7,12",
"6,14",
"5,16",
"4,18",
"3,20",
// RIGHT WALL (mirrors left)
"17,0",
"16,2",
"15,4",
"14,6",
"13,8",
"12,10",
"13,12",
"14,14",
"15,16",
"16,18",
"17,20"
]
}
}{
"seed": "forest-ambush-001",
"terrain": {
"obstacles": [
"10,5",
"11,5",
"12,5", // Hill cluster
"10,6",
"11,6", // Slope down
"10,7" // Ground adjacent
],
"water": [
"5,10",
"5,11",
"5,12",
"6,12",
"7,12" // Connected stream
],
"difficultTerrain": [
"8,8",
"8,9",
"9,8",
"9,9" // Undergrowth cluster
]
},
"participants": [
// Party at ground level
{ "id": "player-1", "position": { "x": 15, "y": 15, "z": 0 } },
// Goblin archer ON the hill (not floating above it)
{ "id": "goblin-archer", "position": { "x": 10, "y": 5, "z": 0 } },
// Melee goblin at ground near slope
{ "id": "goblin-melee", "position": { "x": 10, "y": 8, "z": 0 } }
]
}