Count-based dirty tracking missed content changes when tile/visibility count stayed the same (e.g., door opening, player moving through corridor). Now re-renders all layers when GameState.current_tick advances, which correctly handles every snapshot change. Adds 3 tests for tick advancement and same-count-different-content scenarios. 68 total tests, 0 failures. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
38 lines
1.3 KiB
GDScript
38 lines
1.3 KiB
GDScript
extends Node2D
|
|
|
|
# World renderer — manages all visual representation from GameState
|
|
# Attached to the World node in main.tscn
|
|
# Render order (scene tree): TileMapLayer -> FogOverlay -> Entities
|
|
|
|
@onready var tile_renderer = $TileMapLayer
|
|
@onready var fog_renderer = $FogOverlay
|
|
@onready var entity_renderer = $Entities
|
|
|
|
var _last_tick: int = -1
|
|
|
|
func _ready() -> void:
|
|
print("WorldRenderer: Initialized")
|
|
|
|
# Called each frame to update visuals from game state.
|
|
# Uses tick-based invalidation — re-renders all layers when a new snapshot arrives.
|
|
func update_from_state() -> void:
|
|
var tick := GameState.current_tick
|
|
if tick == _last_tick:
|
|
return
|
|
_last_tick = tick
|
|
|
|
# Update tiles (may include new chunks or modified tiles)
|
|
if tile_renderer and tile_renderer.has_method("update_tiles"):
|
|
if GameState.visible_tiles.size() > 0:
|
|
tile_renderer.update_tiles(GameState.visible_tiles)
|
|
if fog_renderer and fog_renderer.has_method("register_tile_positions"):
|
|
fog_renderer.register_tile_positions(GameState.visible_tiles)
|
|
|
|
# Update fog overlay from visibility data
|
|
if fog_renderer and fog_renderer.has_method("update_fog"):
|
|
fog_renderer.update_fog(GameState.visible_positions, GameState.player_position)
|
|
|
|
# Update entity sprites
|
|
if entity_renderer and entity_renderer.has_method("update_entities"):
|
|
entity_renderer.update_entities(GameState.visible_entities)
|