Summary
A project-wide audit found 114 .connect() calls across .gd files and only 6 .disconnect() calls (all in EntityVisualProxy). Most UI nodes connect to signals in _ready() but never disconnect in _exit_tree(), causing dangling callbacks when nodes are freed.
Affected Files (non-autoload)
| File |
Connections |
Disconnections |
scripts/ui/settings_panel.gd |
15+ |
0 |
scripts/ui/combat_hud.gd |
2 (SafeZoneManager) |
0 |
scripts/ui/remap_panel.gd |
3 |
0 |
scripts/ui/settings_menu.gd |
1 |
0 |
scripts/entities/burden_visuals.gd |
1 (BurdenManager) |
0 |
Autoloads (e.g., SafeZoneManager, ToastManager, BurdenShaderManager) are exempt — they live for the full session.
Impact
Suggested Fix
Add _exit_tree() to each affected file that disconnects its own signals. Use is_connected() guards:
func _exit_tree() -> void:
if signal_name.is_connected(handler_name):
signal_name.disconnect(handler_name)
Related
Priority: P2 · Size: M · Status: Ready
Summary
A project-wide audit found 114
.connect()calls across.gdfiles and only 6.disconnect()calls (all inEntityVisualProxy). Most UI nodes connect to signals in_ready()but never disconnect in_exit_tree(), causing dangling callbacks when nodes are freed.Affected Files (non-autoload)
scripts/ui/settings_panel.gdscripts/ui/combat_hud.gdscripts/ui/remap_panel.gdscripts/ui/settings_menu.gdscripts/entities/burden_visuals.gdAutoloads (e.g.,
SafeZoneManager,ToastManager,BurdenShaderManager) are exempt — they live for the full session.Impact
Suggested Fix
Add
_exit_tree()to each affected file that disconnects its own signals. Useis_connected()guards:Related
Priority: P2 · Size: M · Status: Ready