87 lines
2.8 KiB
Markdown
87 lines
2.8 KiB
Markdown
# Simple TCOD Tutorial Part 3 - Generating a dungeon
|
|
|
|
This is Part 3 of the Simple TCOD Tutorial adapted for McRogueFace. We now add procedural dungeon generation to create interesting, playable levels.
|
|
|
|
## Running the Code
|
|
|
|
From your tutorial build directory:
|
|
```bash
|
|
cd simple_tcod_tutorial/build
|
|
./mcrogueface scripts/main.py
|
|
```
|
|
|
|
## New Features
|
|
|
|
### Procedural Generation Module (`game/procgen.py`)
|
|
|
|
This dedicated module demonstrates separation of concerns - dungeon generation logic is kept separate from the game map implementation.
|
|
|
|
#### RectangularRoom Class
|
|
- **Clean Abstraction**: Represents a room with position and dimensions
|
|
- **Utility Properties**:
|
|
- `center` - Returns room center for connections
|
|
- `inner` - Returns slice objects for efficient carving
|
|
- **Intersection Detection**: `intersects()` method prevents overlapping rooms
|
|
|
|
#### Tunnel Generation
|
|
- **L-Shaped Corridors**: Simple but effective connection method
|
|
- **Iterator Pattern**: `tunnel_between()` yields coordinates efficiently
|
|
- **Random Variation**: 50/50 chance of horizontal-first vs vertical-first
|
|
|
|
#### Dungeon Generation Algorithm
|
|
```python
|
|
def generate_dungeon(max_rooms, room_min_size, room_max_size,
|
|
map_width, map_height, engine) -> GameMap:
|
|
```
|
|
- **Simple Algorithm**: Try to place random rooms, reject overlaps
|
|
- **Automatic Connection**: Each room connects to the previous one
|
|
- **Player Placement**: First room contains the player
|
|
- **Entity-Centric**: Uses `player.place()` for proper lifecycle
|
|
|
|
## Architecture Benefits
|
|
|
|
### Modular Design
|
|
- Generation logic separate from GameMap
|
|
- Easy to swap algorithms later
|
|
- Room class reusable for other features
|
|
|
|
### Forward Thinking
|
|
- Engine parameter anticipates entity spawning
|
|
- Room list available for future features
|
|
- Iterator-based tunnel generation is memory efficient
|
|
|
|
### Clean Integration
|
|
- Works seamlessly with existing entity placement
|
|
- Respects GameMap's tile management
|
|
- No special cases or hacks needed
|
|
|
|
## Visual Changes
|
|
|
|
- Map size increased to 80x45 for better dungeons
|
|
- Zoom reduced to 1.0 to see more of the map
|
|
- Random room layouts each time
|
|
- Connected rooms and corridors
|
|
|
|
## Algorithm Details
|
|
|
|
The generation follows these steps:
|
|
1. Start with a map filled with walls
|
|
2. Try to place up to `max_rooms` rooms
|
|
3. For each room attempt:
|
|
- Generate random size and position
|
|
- Check for intersections with existing rooms
|
|
- If valid, carve out the room
|
|
- Connect to previous room (if any)
|
|
4. Place player in center of first room
|
|
|
|
This simple algorithm creates playable dungeons while being easy to understand and modify.
|
|
|
|
## What's Next
|
|
|
|
Part 4 will add:
|
|
- Field of View (FOV) system
|
|
- Explored vs unexplored areas
|
|
- Light and dark tile rendering
|
|
- Torch radius around player
|
|
|
|
The modular dungeon generation makes it easy to add these visual features without touching the generation code. |