feat(rendering): GameplayRenderer base class — occlusion for all renderers (D-170)

New GameplayRenderer extends Node2D with built-in occlusion support.
Subclasses override _gameplay_process() and _gameplay_draw() instead
of _process() and _draw() — these are skipped when a fullscreen
implant app covers gameplay.

Migrated all 5 gameplay renderers:
- CursorRenderer: hover detection + bracket drawing paused
- EntityRenderer: position lerping paused
- FogEntities: fog dot rendering paused
- SoundIndicatorRenderer: directional arrows paused
- WorldRenderer: tile/fog/entity updates paused

No more manual occlusion wiring — the base class handles everything.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-05 11:51:30 +02:00
co-authored by Claude Opus 4.6
parent a01f7c9cfb
commit 34a21d4cd0
6 changed files with 70 additions and 23 deletions
@@ -1,5 +1,5 @@
class_name SoundIndicatorRenderer
extends Node2D
extends GameplayRenderer
## Medium-range sound indicators (#126, D-018).
## Renders directional arrows at the fog boundary for sounds outside LOS.
@@ -35,7 +35,7 @@ const COLOR_DANGER: Color = Constants.ENTITY_COLOR_HOSTILE # Alert / threat / g
var _indicators: Array = []
func _process(delta: float) -> void:
func _gameplay_process(delta: float) -> void:
if _indicators.is_empty():
return
@@ -84,7 +84,7 @@ func update_sound_events(events: Array) -> void:
queue_redraw()
func _draw() -> void:
func _gameplay_draw() -> void:
if _indicators.is_empty():
return