# Code Review Findings ## Fixed ### 1. Camera and PlayerController input conflict **Files:** `scripts/camera_controller.gd`, `nodes/player_controller.gd` Both scripts used `_unhandled_input` with left mouse button. The camera used left click for dragging and never called `set_input_as_handled()`, so every left click also triggered unit selection/movement. Fixed with a drag threshold and click-on-release pattern. --- ## Outstanding ### 2. Unit lookup is fragile **File:** `nodes/player_controller.gd:75` `_get_unit_at()` iterates `get_parent().get_children()` to find units. This couples the controller to a specific scene tree layout and will degrade as the scene grows. **Fix:** Use a group (`"units"`) or a dedicated unit registry so lookup doesn't depend on parent structure. ### 3. No pathfinding — movement can skip walls diagonally **File:** `nodes/player_controller.gd:45-60` Step-by-step movement picks one axis per frame. If the goal is diagonally past an L-shaped wall, the unit can path around it depending on approach angle since only the next immediate tile is checked. **Fix:** Implement BFS/A* on the grid, or at minimum validate the full path before starting movement. ### ~~4. CombatMap extends CanvasItem instead of Node2D~~ (fixed) **File:** `nodes/combat_map.gd:2` Changed to extend `Node2D`. ### ~~5. Inconsistent naming convention~~ (fixed) **File:** `nodes/combat_map.gd:16` Renamed `tileCoords` to `tile_coords`. ### ~~6. unit_template is a string path, not a PackedScene~~ (fixed) **File:** `scripts/test_map_generator.gd:7` Changed to `@export var unit_template: PackedScene` and removed the `load()` call. **Note:** The scene must be assigned in the Godot inspector on the TestMapGenerator node. ### ~~7. No current_hp on units~~ (fixed) **File:** `nodes/unit.gd` Added `current_hp` variable, initialized to `max_hp` in `_ready()`. ### ~~8. Debug print left in production code~~ (fixed) **File:** `scripts/test_map_generator.gd` Removed the debug `print()` call. ### 9. tile_highlight.gd runs every frame unconditionally **File:** `scripts/tile_highlight.gd:12-17` `_process` updates position and alpha every frame even when the highlight is hidden. Could skip processing when invisible via `set_process(false)` on hide. ### 10. GridOverlay is wired but unused **Files:** `scripts/grid_overlay.gd`, `nodes/combat_map.gd:6` `highlight_map` reference exists but is never called from any game logic. Dead code at the moment. --- ## Priority | Priority | Issue | |----------|-------| | ~~High~~ | ~~#1 Input conflict~~ (fixed) | | High | #3 Wall-skipping movement | | Medium | #2 Fragile unit lookup | | ~~Medium~~ | ~~#6 String path instead of PackedScene~~ (fixed) | | ~~Low~~ | ~~#4 CanvasItem base class~~ (fixed) | | ~~Low~~ | ~~#5 Inconsistent naming~~ (fixed) | | ~~Low~~ | ~~#7 No current_hp~~ (fixed) | | ~~Low~~ | ~~#8 Debug print~~ (fixed) | | Low | #9, #10 |