2.8 KiB
2.8 KiB
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:
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 connectionsinner- 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
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:
- Start with a map filled with walls
- Try to place up to
max_roomsrooms - 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)
- 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.