fix(client): address PR review — invalidation, constants, tests
Review feedback from Hoshe + Tyre on PR #8: - Extract shared TILE_SIZE to Constants class_name (Tyre #5, Hoshe #7) - Fix tile invalidation: detect tile/visibility count changes instead of one-shot dirty flag, supports chunk loading (Tyre #3, #4) - Fog dirty tracking: only re-render when visible_positions changes - Add bounds warning for unknown tile types (Hoshe #1) - Add player-not-found warning in GameState (Hoshe #5) - Use Image.fill_rect() instead of pixel loops (Tyre #10) - Document _player_pos as reserved for fog decay #113 (Tyre #6) - Add TODO(#130) for D-033 relationship colors (Hoshe #3, Tyre #8) - Add class_name to EntityRenderer, FogRenderer, TileRenderer - 20 new rendering tests (D-030 Layer 1): entity lifecycle, fog registration, tile type mapping, snapshot completeness, constants - 65 total tests passing, 0 failures Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -8,30 +8,31 @@ extends Node2D
|
||||
@onready var fog_renderer = $FogOverlay
|
||||
@onready var entity_renderer = $Entities
|
||||
|
||||
var _tiles_dirty: bool = true
|
||||
var _last_tile_count: int = 0
|
||||
var _last_visible_count: int = 0
|
||||
|
||||
func _ready() -> void:
|
||||
print("WorldRenderer: Initialized")
|
||||
|
||||
# Called each frame to update visuals from game state
|
||||
func update_from_state() -> void:
|
||||
# Update tiles (only when tile data changes)
|
||||
var tile_count := GameState.visible_tiles.size()
|
||||
var visible_count := GameState.visible_positions.size()
|
||||
|
||||
# Update tiles when tile data changes (new chunks loaded, D-012)
|
||||
if tile_renderer and tile_renderer.has_method("update_tiles"):
|
||||
if _tiles_dirty and GameState.visible_tiles.size() > 0:
|
||||
if tile_count > 0 and tile_count != _last_tile_count:
|
||||
tile_renderer.update_tiles(GameState.visible_tiles)
|
||||
# Register tile positions with fog renderer for coverage
|
||||
if fog_renderer and fog_renderer.has_method("register_tile_positions"):
|
||||
fog_renderer.register_tile_positions(GameState.visible_tiles)
|
||||
_tiles_dirty = false
|
||||
_last_tile_count = tile_count
|
||||
|
||||
# Update fog overlay
|
||||
# Update fog overlay when visibility changes
|
||||
if fog_renderer and fog_renderer.has_method("update_fog"):
|
||||
fog_renderer.update_fog(GameState.visible_positions, GameState.player_position)
|
||||
if visible_count != _last_visible_count:
|
||||
fog_renderer.update_fog(GameState.visible_positions, GameState.player_position)
|
||||
_last_visible_count = visible_count
|
||||
|
||||
# Update entity sprites
|
||||
if entity_renderer and entity_renderer.has_method("update_entities"):
|
||||
entity_renderer.update_entities(GameState.visible_entities)
|
||||
|
||||
# Mark tiles as needing re-render (call when tile data changes significantly)
|
||||
func invalidate_tiles() -> void:
|
||||
_tiles_dirty = true
|
||||
|
||||
Reference in New Issue
Block a user