3.9 KiB
		
	
	
	
	
	
			
		
		
	
	Part 4: Field of View and Exploration
Overview
Part 4 introduces the Field of View (FOV) system, transforming our fully-visible dungeon into an atmospheric exploration experience. We leverage McRogueFace's built-in FOV capabilities and perspective system for efficient rendering.
What's New in Part 4
Field of View System
- FOV Calculation: Using 
Grid.compute_fov()with configurable radius - Perspective System: Grid tracks which entity is the viewer
 - Visibility States: Unexplored (black), explored (dark), visible (lit)
 - Automatic Updates: FOV recalculates on player movement
 
Implementation Details
FOV with McRogueFace's Grid
Unlike TCOD which uses numpy arrays for visibility tracking, McRogueFace's Grid has built-in FOV support:
# In GameMap.update_fov()
self.compute_fov(viewer_x, viewer_y, radius, light_walls=True, algorithm=mcrfpy.FOV_BASIC)
The Grid automatically:
- Tracks which tiles have been explored
 - Applies appropriate color overlays (shroud, dark, light)
 - Updates entity visibility based on FOV
 
Perspective System
McRogueFace uses a perspective-based rendering approach:
# Set the viewer
self.game_map.perspective = self.player
# Grid automatically renders from this entity's viewpoint
This is more efficient than manually updating tile colors every turn.
Color Overlays
We define overlay colors but let the Grid handle application:
# In tiles.py
SHROUD = mcrfpy.Color(0, 0, 0, 255)      # Unexplored
DARK = mcrfpy.Color(100, 100, 150, 128)  # Explored but not visible
LIGHT = mcrfpy.Color(255, 255, 255, 0)   # Currently visible
Key Differences from TCOD
| TCOD Approach | McRogueFace Approach | 
|---|---|
visible and explored numpy arrays | 
Grid's built-in FOV state | 
| Manual tile color switching | Automatic overlay system | 
tcod.map.compute_fov() | 
Grid.compute_fov() | 
| Render conditionals for each tile | Perspective-based rendering | 
Movement and FOV Updates
The action system now updates FOV after player movement:
# In MovementAction.perform()
if self.entity == engine.player:
    engine.update_fov()
Architecture Notes
Why Grid Perspective?
The perspective system provides several benefits:
- Efficiency: No per-tile color updates needed
 - Flexibility: Easy to switch viewpoints (for debugging or features)
 - Automatic: Grid handles all rendering details
 - Clean: Separates game logic from rendering concerns
 
Entity Visibility
Entities automatically update their visibility state:
# After FOV calculation
self.player.update_visibility()
This ensures entities are only rendered when visible to the current perspective.
Files Modified
game/tiles.py: Added FOV color overlay constantsgame/game_map.py: Addedupdate_fov()methodgame/engine.py: Added FOV initialization and update methodgame/actions.py: Update FOV after player movementmain.py: Updated part description
What's Next
Part 5 will add enemies to our dungeon, introducing:
- Enemy entities with AI
 - Combat system
 - Turn-based gameplay
 - Health and damage
 
The FOV system will make enemies appear and disappear as you explore, adding tension and strategy to the gameplay.
Learning Points
- Leverage Framework Features: Use McRogueFace's built-in systems rather than reimplementing
 - Perspective-Based Design: Think in terms of viewpoints, not global state
 - Automatic Systems: Let the framework handle rendering details
 - Clean Integration: FOV updates fit naturally into the action system
 
Running Part 4
cd simple_tcod_tutorial/build
./mcrogueface scripts/main.py
You'll now see:
- Black unexplored areas
 - Dark blue tint on previously seen areas
 - Full brightness only in your field of view
 - Smooth exploration as you move through the dungeon