GridPositioner2D
Unit test helper: verify tile...
Unit test helper: verify tile center calculation Returns the tile coordinate and world position for testing
Version: v5.0.0
Inherits: Node2D
Source: grid_positioner_2d.gd
Parsing: AST-based for maximum accuracy with symbol typing
Constants
LOG_PREFIX
Enums are defined in logic/utils
Type: String
Value: "[GridPositioner2D]"
Variables
_debug_settings:
_logger:
Explicitly injected dependencies (no service locator usage inside this class)
_actions:
_targeting_state: GridTargetingState
The state of the building/targeting system holding a reference to this positioner.
Type: GridTargetingState
_targeting_settings: GridTargetingSettings
Type: GridTargetingSettings
_mode_state: ModeState
Start invisible until proper dependencies are injected
Type: ModeState
_last_mouse_world:
Cache last known mouse world position from events/projection for safe per-frame follow
_has_mouse_world:
input_processing_enabled:
Public flag & API for enabling/disabling input processing (used by tests)
_enabled_internal:
Internal storage for assignments performed directly on the property
_last_mouse_input_status
Last evaluation of mouse input gate and projection snapshot for diagnostics
_last_gate_allowed:
Track last mouse gate state to throttle logs
_last_manual_recenter_mode:
Track last manual recenter mode (for diagnostics/tests)
_last_visibility_event_reason:
Capture the most recent visibility toggle reason to enhance diagnostics when turned off
Methods
_init
Signature: _init() -> void
Fail fast design. Defaults should be explicitly set by scenes or tests.
Returns: void
_ready
Signature: _ready() -> void
Returns: void
_physics_process
Signature: _physics_process(delta: float) -> void
Returns: void
Parameters:
delta: float
_process
Signature: _process(delta: float) -> void
Diagnostics when enabled (guarded by debug mode)
Returns: void
Parameters:
delta: float
set_input_processing_enabled
Signature: set_input_processing_enabled(p_enabled: bool) -> void
Public API used by tests to enable input handling on this node.
Returns: void
Parameters:
p_enabled: bool
is_input_processing_enabled
Signature: is_input_processing_enabled() -> bool
Returns: bool
is_input_ready
Signature: is_input_ready() -> bool
Public helper: returns true when dependencies are injected and a target map is assigned
Returns: bool
are_dependencies_ready
Signature: are_dependencies_ready() -> bool
Use this to guard input methods that need to log or access settings
Returns: bool
resolve_gb_dependencies
Signature: resolve_gb_dependencies(p_config : GBCompositionContainer: Variant) -> void
Internally delegates to set_dependencies() for actual wiring.
Returns: void
Parameters:
p_config : GBCompositionContainer: Variant
_input
Signature: _input(event : InputEvent: Variant) -> void
INPUT: All mouse movement is handled here in response to events; not in physics.
Returns: void
Parameters:
event : InputEvent: Variant
_handle_mouse_motion_event
Signature: _handle_mouse_motion_event(motion: InputEventMouseMotion, current_mode: GBEnums.Mode: Variant) -> void
Extracted helper: handle an InputEventMouseMotion event (snapped move + visibility)
Returns: void
Parameters:
motion: InputEventMouseMotioncurrent_mode: GBEnums.Mode: Variant
_convert_screen_to_world
Signature: _convert_screen_to_world(screen_pos: Vector2) -> Vector2
Delegates to GBPositioning2DUtils for DRY compliance and maintainability
Returns: Vector2
Parameters:
screen_pos: Vector2
_move_to_cached_mouse_world
Signature: _move_to_cached_mouse_world() -> Vector2i
Move the positioner back to its cached mouse world location when available.
Returns: Vector2i
_cache_current_world_position
Signature: _cache_current_world_position() -> void
Cache the current global position as the latest mouse world reference.
Returns: void
_get_active_viewport
Signature: _get_active_viewport() -> Viewport
Helper: retrieve active Viewport for the current target map (may be null)
Returns: Viewport
_get_active_camera
Signature: _get_active_camera(p_vp: Viewport) -> Camera2D
Helper: retrieve active Camera2D from a viewport (may be null)
Returns: Camera2D
Parameters:
p_vp: Viewport
_is_disabled_in_off_mode
Signature: _is_disabled_in_off_mode() -> bool
Returns true if positioner should be blocked from input/positioning in OFF mode
Returns: bool
_is_mouse_cursor_on_screen
Signature: _is_mouse_cursor_on_screen() -> bool
Returns true if mouse cursor is within the visible viewport area
Returns: bool
_is_mouse_follow_allowed
Signature: _is_mouse_follow_allowed() -> bool
Helper: decide whether mouse-follow behavior should run this frame
Returns: bool
_mouse_input_gate
Signature: _mouse_input_gate() -> bool
Returns a gate result for handling mouse input with an explicit reason when blocked
Returns: bool
_apply_mouse_world
Signature: _apply_mouse_world(world: Vector2, method: int, screen: Vector2) -> void
Centralizes caching + movement application and diagnostics
Returns: void
Parameters:
world: Vector2method: intscreen: Vector2
_log_mouse_motion
Signature: _log_mouse_motion(p_method: int, p_screen: Vector2, p_world: Vector2) -> void
Helper: structured mouse motion log
Returns: void
Parameters:
p_method: intp_screen: Vector2p_world: Vector2
_log_mouse_gate
Signature: _log_mouse_gate(p_allowed: bool) -> void
Helper: structured mouse gate log
Returns: void
Parameters:
p_allowed: bool
_apply_recenter_on_enable
Signature: _apply_recenter_on_enable() -> void
Respects the active when off setting - no positioning changes when disabled in OFF mode
Returns: void
_apply_positioning_and_visibility_sequence
Signature: _apply_positioning_and_visibility_sequence() -> void
This ensures Camera2D is available for positioning and visibility is updated based on final position
Returns: void
_recenter_decision_to_string
Signature: _recenter_decision_to_string(p_decision: int) -> String
Then apply visibility based on current state (respect hide_on_handled)
Returns: String
Parameters:
p_decision: int
_handle_mouse_movement
Signature: _handle_mouse_movement(mouse_global_override: Variant = null) -> void
compatibility with tests (SceneRunner) and hidden cursor scenarios.
Returns: void
Parameters:
mouse_global_override: Variant(optional, default:null)
_move_positioner_by_tile
Signature: _move_positioner_by_tile(p_tile_delta: Vector2i) -> void
p_direction: Vector2 - Direction vector (e.g., Vector2(1,0) for right, Vector2(0,1) for down)
Returns: void
Parameters:
p_tile_delta: Vector2i
move_to_viewport_center_tile
Signature: move_to_viewport_center_tile() -> Vector2i
Returns the tile coordinate where the positioner was positioned, or Vector2i.ZERO if failed.
Returns: Vector2i
move_to_cursor_center_tile
Signature: move_to_cursor_center_tile() -> Vector2i
Returns the tile coordinate where the positioner was positioned.
Returns: Vector2i
_apply_recenter
Signature: _apply_recenter() -> void
Apply manual recenter logic based on settings.
Returns: void
get_last_manual_recenter_mode
Signature: get_last_manual_recenter_mode() -> int
Retrieve the last manual recenter mode applied.
Returns: int
_exit_tree
Signature: _exit_tree() -> void
Returns: void
remove_self_as_positioner
Signature: remove_self_as_positioner() -> void
Removes this object from being set to the _targeting_state.positioner property
Returns: void
update_visibility
Signature: update_visibility() -> void
be visible or invisible. Only called when hide_on_handled is true
Returns: void
should_be_visible
Signature: should_be_visible() -> bool
Mouse handled gating remains event-driven and is not applied here.
Returns: bool
set_dependencies
Signature: set_dependencies(p_states : GBStates: Variant, p_config : GBConfig: Variant, p_logger: GBLogger = null, p_actions: GBActions = null, enable_input: bool = true) -> void
[param enable_input] When true, enable input processing immediately (default true)
Returns: void
Parameters:
p_states : GBStates: Variantp_config : GBConfig: Variantp_logger: GBLogger(optional, default:null)p_actions: GBActions(optional, default:null)enable_input: bool(optional, default:true)
get_runtime_issues
Signature: get_runtime_issues() -> Array
return: Array[String] - List of validation issues (empty if valid)
Returns: Array
validate_dependencies
Signature: validate_dependencies() -> bool
Call after all dependencies are expected to be resolved.
Returns: bool
_on_mode_changed
Signature: _on_mode_changed(p_mode : GBEnums.Mode: Variant) -> void
Returns: void
Parameters:
p_mode : GBEnums.Mode: Variant
_should_be_visible_for_mode
Signature: _should_be_visible_for_mode(p_mode: GBEnums.Mode: Variant) -> bool
Helper to compute visibility given an explicit mode value
Returns: bool
Parameters:
p_mode: GBEnums.Mode: Variant
get_visual_node
Signature: get_visual_node() -> Node
Visual helpers are provided by GBSearchUtils universally
Returns: Node
is_visual_visible
Signature: is_visual_visible() -> bool
Returns: bool
_set_visible_state
Signature: _set_visible_state(p_visible: bool) -> void
Helper to keep this node and its visual in sync for visibility
Returns: void
Parameters:
p_visible: bool
log_current_visual_state
Signature: log_current_visual_state() -> void
Helper: explicit render state log for manual triggering if needed
Returns: void
_schedule_end_of_frame_state_log
Signature: _schedule_end_of_frame_state_log() -> void
Schedule end-of-frame state logging (deferred to next frame to catch final state)
Returns: void
_log_end_of_frame_state_async
Signature: _log_end_of_frame_state_async() -> void
Async log of end-of-frame state (called deferred)
Returns: void
_log_screen_and_mouse_state
Signature: _log_screen_and_mouse_state() -> void
Diagnostic: log screen/camera bounds, positioner screen relation, mouse world, and tile info
Returns: void
_visibility_context
Signature: _visibility_context(visual: CanvasItem) -> String
Build a visibility context string: first hidden ancestor, alpha, z-index, and position
Returns: String
Parameters:
visual: CanvasItem
is_positioner_active
Signature: is_positioner_active() -> bool
Whether the positioner is active and should update each frame
Returns: bool
should_hide_under_handled_ui
Signature: should_hide_under_handled_ui() -> bool
Whether the positioner should hide when the mouse events are handled by UI
Returns: bool
are_dependencies_resolved
Signature: are_dependencies_resolved() -> bool
Check if all critical dependencies have been resolved
Returns: bool
to_diagnostic_string
Signature: to_diagnostic_string() -> String
Safe to call even before dependency injection - provides fallback values
Returns: String
_set_visibility_reason
Signature: _set_visibility_reason(p_reason: String) -> void
Defensive: provide diagnostic info even if dependencies aren’t fully resolved
Returns: void
Parameters:
p_reason: String
_visibility_decision_trace
Signature: _visibility_decision_trace() -> String
Returns: String
_get_debug_log_mode
Signature: _get_debug_log_mode() -> GBDebugSettings
Pass a Dictionary snapshot (public API) to the logic helper to satisfy its typed signature
Returns: GBDebugSettings
_is_logging_mode
Signature: _is_logging_mode(p_mode: GBDebugSettings.GridPositionerLogMode: Variant) -> bool
Returns: bool
Parameters:
p_mode: GBDebugSettings.GridPositionerLogMode: Variant
_is_visibility_logging_enabled
Signature: _is_visibility_logging_enabled() -> bool
Returns: bool
_is_mouse_input_logging_enabled
Signature: _is_mouse_input_logging_enabled() -> bool
Returns: bool
_is_positioning_logging_enabled
Signature: _is_positioning_logging_enabled() -> bool
Returns: bool
_is_state_flow_logging_enabled
Signature: _is_state_flow_logging_enabled() -> bool
Returns: bool
_log_debug
Signature: _log_debug(p_mode: GBDebugSettings.GridPositionerLogMode: Variant, p_message: String, p_throttled: bool = true) -> void
Returns: void
Parameters:
p_mode: GBDebugSettings.GridPositionerLogMode: Variantp_message: Stringp_throttled: bool(optional, default:true)
_log_visibility
Signature: _log_visibility(p_message: String, p_throttled: bool = true) -> void
Returns: void
Parameters:
p_message: Stringp_throttled: bool(optional, default:true)
_log_mouse
Signature: _log_mouse(p_message: String, p_throttled: bool = true) -> void
Returns: void
Parameters:
p_message: Stringp_throttled: bool(optional, default:true)
_log_positioning
Signature: _log_positioning(p_message: String, p_throttled: bool = true) -> void
Returns: void
Parameters:
p_message: Stringp_throttled: bool(optional, default:true)
_log_state_flow
Signature: _log_state_flow(p_message: String, p_throttled: bool = true) -> void
Returns: void
Parameters:
p_message: Stringp_throttled: bool(optional, default:true)
_test_convert_screen_to_world
Signature: _test_convert_screen_to_world(screen_pos: Vector2) -> Vector2
Returns the converted world position for testing purposes
Returns: Vector2
Parameters:
screen_pos: Vector2
_test_get_tile_center_from_screen
Signature: _test_get_tile_center_from_screen(screen_pos: Vector2) -> Dictionary
Returns the tile coordinate and world position for testing
Returns: Dictionary
Parameters:
screen_pos: Vector2
_apply_visibility_result
Signature: _apply_visibility_result(p_result: MouseEventVisibilityResult) -> void
Calculate tile center position using TileMapLayer methods
Returns: void
Parameters:
p_result: MouseEventVisibilityResult