#345: entity_renderer.gd already used entity_id; added regression tests confirming old "id" field is rejected and "entity_id" is accepted. #447 (OQ-29): DIALOGUE_MAX_WIDTH = 1920 added to constants.gd. Full viewport width at target resolution (60 × TILE_SIZE), per D-061 Lead directive "max-width". Recorded as D-076 in decisions/perception.md. #126: SoundIndicatorRenderer — fog-edge directional arrows for medium-range sound events (D-018). Node2D at z:951 in World scene. Color-coded per D-018/D-069 (neutral/voice/danger). GameState.medium_sound_events partitions Medium events from snapshot sound_events field. Tests added to test_rendering.gd; Hoshe's test_sound_indicators.gd stubs updated. #125: Close-range stereo audio pipeline wired. AudioManager.play_sound_event() maps event_type to D-038 asset key (Footstep/FootstepSprint → sfx_footstep_*). GameState.close_sound_events partitions Close events. main.gd calls _play_close_sound_events() each snapshot tick. test_audio_bus_routing.gd Layer 4 stubs upgraded to real tests. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
50 lines
2.1 KiB
GDScript
50 lines
2.1 KiB
GDScript
extends Node2D
|
|
|
|
# World renderer — manages all visual representation from GameState
|
|
# Attached to the World node in main.tscn
|
|
#
|
|
# D-049 Z-level rendering pipeline (z-layer-gap-analysis.md):
|
|
# FogGroup (CanvasGroup) composites world content:
|
|
# FloorTiles (TileMapLayer) — z:0 ground plane
|
|
# FloorObjects (Node2D) — z:10 cosmetic detail (placeholder)
|
|
# YSortGroup (Node2D, y_sort) — z:100 furniture + entities (all z:0 relative)
|
|
# Furniture (Node2D, y_sort) — z:0 placed objects (placeholder)
|
|
# Entities (Node2D, y_sort) — z:0 entity sprites (D-033 colors)
|
|
# Overhead (Node2D) — z:300 ceiling/upper structure (placeholder)
|
|
# FogOverlay (Node2D) — z:900 fog shader (OUTSIDE FogGroup)
|
|
|
|
@onready var tile_renderer = $FogGroup/FloorTiles
|
|
@onready var fog_renderer = $FogOverlay
|
|
@onready var entity_renderer = $FogGroup/YSortGroup/Entities
|
|
@onready var sound_indicator_renderer = $SoundIndicators # #126 D-018 medium-range indicators
|
|
|
|
var _last_tick: int = -1
|
|
|
|
func _ready() -> void:
|
|
print("WorldRenderer: Initialized (D-049 z-stack)")
|
|
|
|
# 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)
|
|
|
|
# Update fog overlay — shader-based, reads from FogState autoload
|
|
if fog_renderer and fog_renderer.has_method("update_fog"):
|
|
fog_renderer.update_fog()
|
|
|
|
# Update entity sprites
|
|
if entity_renderer and entity_renderer.has_method("update_entities"):
|
|
entity_renderer.update_entities(GameState.visible_entities)
|
|
|
|
# D-018 #126: Update medium-range sound indicators
|
|
if sound_indicator_renderer and sound_indicator_renderer.has_method("update_sound_events"):
|
|
sound_indicator_renderer.update_sound_events(GameState.medium_sound_events)
|