Major improvements to the Field of View (FOV) system:
1. Added thread safety with mutex protection
- Added mutable std::mutex fov_mutex to UIGrid class
- Protected computeFOV() and isInFOV() with lock_guard
- Minimal overhead for current single-threaded operation
- Ready for future multi-threading requirements
2. Enhanced compute_fov() API to return visible cells
- Changed return type from void to List[Tuple[int, int, bool, bool]]
- Returns (x, y, visible, discovered) for all visible cells
- Maintains backward compatibility by still updating internal FOV state
- Allows FOV queries without affecting entity states
3. Fixed Part 4 tutorial visibility rendering
- Added required entity.update_visibility() calls after compute_fov()
- Fixed black grid issue in perspective rendering
- Updated hallway generation to use L-shaped corridors
The architecture now properly separates concerns while maintaining
performance and preparing for future enhancements. Each entity can
have independent FOV calculations without race conditions.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major refactor of the perspective system to use entity references instead of indices:
- Replaced `int perspective` with `std::weak_ptr<UIEntity> perspective_entity`
- Added `bool perspective_enabled` flag for explicit control
- Direct entity assignment: `grid.perspective = player`
- Automatic cleanup when entity is destroyed (weak_ptr becomes invalid)
- No issues with collection reordering or entity removal
- PythonObjectCache integration preserves Python derived classes
API changes:
- Old: `grid.perspective = 0` (index), `-1` for omniscient
- New: `grid.perspective = entity` (object), `None` to clear
- New: `grid.perspective_enabled` controls rendering mode
Three rendering states:
1. `perspective_enabled = False`: Omniscient view (default)
2. `perspective_enabled = True` with valid entity: Entity's FOV
3. `perspective_enabled = True` with invalid entity: All black
Also includes:
- Part 3: Procedural dungeon generation with libtcod.line()
- Part 4: Field of view with entity perspective switching
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>