diff options
author | Daniel Weipert <git@mail.dweipert.de> | 2025-02-12 20:05:59 +0100 |
---|---|---|
committer | Daniel Weipert <git@mail.dweipert.de> | 2025-02-12 20:05:59 +0100 |
commit | 218748f67a6a6b35efc4a732ad11426d0f528709 (patch) | |
tree | e58504dd758ce6525844872007221cda2a8b6926 /stage/grid_selector | |
parent | f6c81b065cf4d7f1302a50f2f72cfab32204a1ec (diff) |
Diffstat (limited to 'stage/grid_selector')
-rw-r--r-- | stage/grid_selector/grid_selector.gd | 22 | ||||
-rw-r--r-- | stage/grid_selector/grid_selector.tscn | 4 | ||||
-rw-r--r-- | stage/grid_selector/state_cube_placement.gd | 1 | ||||
-rw-r--r-- | stage/grid_selector/state_move_mode.gd | 1 | ||||
-rw-r--r-- | stage/grid_selector/state_range_select.gd | 6 | ||||
-rw-r--r-- | stage/grid_selector/state_select.gd | 64 |
6 files changed, 83 insertions, 15 deletions
diff --git a/stage/grid_selector/grid_selector.gd b/stage/grid_selector/grid_selector.gd index dd2f1e4..156065b 100644 --- a/stage/grid_selector/grid_selector.gd +++ b/stage/grid_selector/grid_selector.gd @@ -5,6 +5,8 @@ extends Node2D signal state_changed signal moved(grid_position: Vector2i) signal selected(node: Node2D) +signal hover_enter(node: Node2D) +signal hover_exit signal placed_tiles(grid_positions: Array) signal move_mode_changed(path: Array) signal move_mode_confirmed(path: Array) @@ -28,6 +30,7 @@ var current_entity: Node2D @export var stage: Stage @export var ground_map: TileMapLayer @export var floor_map: TileMapLayer +@export var camera: Camera2D @export var current_team: String @@ -41,6 +44,7 @@ var current_entity: Node2D @export_group("Range Select", "range_select") @export var range_select_current_range: int +@export var range_select_current_mode: GridSelectorStateRangeSelect.Mode @export_flags_2d_physics var range_select_collision_mask: int @export_group("Move Mode", "move_mode") @@ -74,8 +78,7 @@ func _process(delta: float) -> void: else: movement_delta_threshold += delta * movement_delta_speed - current_state.draw(ground_map.local_to_map(base_position) + Vector2i(input_vector)) - moved.emit(ground_map.local_to_map(base_position)) + move(ground_map.local_to_map(base_position) + Vector2i(input_vector)) else: movement_delta = 0 movement_delta_threshold = 0 @@ -91,6 +94,11 @@ func set_current_state(value: Node): state_changed.emit() +func move(grid_position: Vector2i) -> void: + current_state.draw(grid_position) + moved.emit(ground_map.local_to_map(base_position)) + + func adjust_height(selector_tile: Sprite2D) -> void: var tile_size: Vector2i = ground_map.tile_set.tile_size var tile_data: TileData = floor_map.get_cell_tile_data(ground_map.local_to_map(selector_tile.global_position)) @@ -114,7 +122,7 @@ func get_entity_at_floor_tile(grid_position: Vector2i, collision_mask: int) -> N var collision := get_world_2d().direct_space_state.intersect_point(query, 1) if collision.size() > 0: - return collision[0].collider.get_parent() + return collision[0].collider.get_root_node() return null @@ -128,6 +136,14 @@ func _on_state_select_selected(node: Node2D) -> void: selected.emit(node) +func _on_state_select_hover_enter(node: Node2D) -> void: + hover_enter.emit(node) + + +func _on_state_select_hover_exit() -> void: + hover_exit.emit() + + func _on_state_cube_placement_placed_tiles(grid_positions: Array) -> void: placed_tiles.emit(grid_positions) diff --git a/stage/grid_selector/grid_selector.tscn b/stage/grid_selector/grid_selector.tscn index d2541ed..11bb6df 100644 --- a/stage/grid_selector/grid_selector.tscn +++ b/stage/grid_selector/grid_selector.tscn @@ -17,7 +17,7 @@ shader_parameter/pattern = 0 shader_parameter/inside = true shader_parameter/add_margins = false -[node name="GridSelector" type="Node2D"] +[node name="GridSelector" type="Node2D" groups=["grid_selector"]] y_sort_enabled = true script = ExtResource("1_3pk7u") @@ -88,6 +88,8 @@ script = ExtResource("7_0k3dq") y_sort_enabled = true [connection signal="placed_tiles" from="StateCubePlacement" to="." method="_on_state_cube_placement_placed_tiles"] +[connection signal="hover_enter" from="StateSelect" to="." method="_on_state_select_hover_enter"] +[connection signal="hover_exit" from="StateSelect" to="." method="_on_state_select_hover_exit"] [connection signal="selected" from="StateSelect" to="." method="_on_state_select_selected"] [connection signal="changed" from="StateMoveMode" to="." method="_on_state_move_mode_changed"] [connection signal="confirmed" from="StateMoveMode" to="." method="_on_state_move_mode_confirmed"] diff --git a/stage/grid_selector/state_cube_placement.gd b/stage/grid_selector/state_cube_placement.gd index d238437..a1901ad 100644 --- a/stage/grid_selector/state_cube_placement.gd +++ b/stage/grid_selector/state_cube_placement.gd @@ -151,6 +151,7 @@ func draw(grid_position: Vector2i) -> void: if is_in_bounds(grid_position): grid_selector.global_position = ground_map.map_to_local(grid_position) grid_selector.base_position = grid_selector.global_position + grid_selector.camera.global_position = grid_selector.global_position var selector_tiles: Array = grid_selector.visual.get_children() for idx in selector_tiles.size(): diff --git a/stage/grid_selector/state_move_mode.gd b/stage/grid_selector/state_move_mode.gd index f903926..160d377 100644 --- a/stage/grid_selector/state_move_mode.gd +++ b/stage/grid_selector/state_move_mode.gd @@ -38,6 +38,7 @@ func draw(grid_position: Vector2i) -> void: return grid_selector.base_position = ground_map.map_to_local(grid_position) + grid_selector.camera.global_position = grid_selector.base_position current_path = calculated_path changed.emit(current_path) diff --git a/stage/grid_selector/state_range_select.gd b/stage/grid_selector/state_range_select.gd index d9345f1..cf671e6 100644 --- a/stage/grid_selector/state_range_select.gd +++ b/stage/grid_selector/state_range_select.gd @@ -23,8 +23,6 @@ enum Mode { Attack, } -var current_mode: Mode = Mode.Attack - @onready var grid_selector: GridSelector = get_parent() @onready var ground_map: TileMapLayer = grid_selector.ground_map @onready var floor_map: TileMapLayer = grid_selector.floor_map @@ -43,8 +41,9 @@ func _input(event: InputEvent) -> void: current_grid_position, grid_selector.range_select_collision_mask ) + if entity != null: - if current_mode == Mode.Attack: + if grid_selector.range_select_current_mode == Mode.Attack: if entity.current_team != grid_selector.current_team: confirmed.emit(current_grid_position, entity) get_viewport().set_input_as_handled() @@ -62,6 +61,7 @@ func draw(grid_position: Vector2i) -> void: current_grid_position = grid_position grid_selector.base_position = ground_map.map_to_local(grid_position) + grid_selector.camera.global_position = grid_selector.base_position var tile: Node2D = valid_tiles[grid_position] tile.modulate = selector_tile.modulate diff --git a/stage/grid_selector/state_select.gd b/stage/grid_selector/state_select.gd index 8c06750..23c387e 100644 --- a/stage/grid_selector/state_select.gd +++ b/stage/grid_selector/state_select.gd @@ -3,6 +3,10 @@ extends Node2D signal selected(node: Node2D) +signal hover_enter(node: Node2D) +signal hover_exit + +var current_unit_index: int = 0 @onready var grid_selector: GridSelector = get_parent() @onready var ground_map: TileMapLayer = grid_selector.ground_map @@ -12,21 +16,40 @@ signal selected(node: Node2D) func _input(event: InputEvent) -> void: if event.is_action_pressed("left_click"): - var query := PhysicsPointQueryParameters2D.new() - query.collision_mask = grid_selector.selection_collision_mask - query.collide_with_areas = true - query.position = selector_tile.global_position - - var collision := get_world_2d().direct_space_state.intersect_point(query, 1) + var collision := get_world_2d().direct_space_state.intersect_point( + get_collision_query(), 1 + ) if not collision.is_empty(): - var collider = collision[0].collider.get_parent() - grid_selector.current_entity = collider + var collider: Area2D = collision[0].collider + grid_selector.current_entity = collider.get_root_node() else: grid_selector.current_entity = null if grid_selector.current_entity: selected.emit(grid_selector.current_entity) + + + # jump to unit on field previous/next in list + if event.is_action_pressed("previous_rotation"): + if Network.local_player.units.size() > 0: + var next_index: int = (current_unit_index - 1) % Network.local_player.units.size() + current_unit_index = next_index + grid_selector.move( + floor_map.local_to_map( + Network.local_player.units[current_unit_index].global_position - floor_map.position + ) + ) + + if event.is_action_pressed("next_rotation"): + if Network.local_player.units.size() > 0: + var next_index: int = (current_unit_index + 1) % Network.local_player.units.size() + current_unit_index = next_index + grid_selector.move( + floor_map.local_to_map( + Network.local_player.units[current_unit_index].global_position - floor_map.position + ) + ) func draw(grid_position: Vector2i) -> void: @@ -34,8 +57,33 @@ func draw(grid_position: Vector2i) -> void: grid_selector.global_position = ground_map.map_to_local(grid_position) grid_selector.base_position = grid_selector.global_position selector_tile.global_position = grid_selector.global_position + grid_selector.camera.global_position = grid_selector.global_position grid_selector.adjust_height(selector_tile) + + # hover + var collision := get_world_2d().direct_space_state.intersect_point( + get_collision_query(), 1 + ) + + if not collision.is_empty(): + var collider: Area2D = collision[0].collider + grid_selector.current_entity = collider.get_root_node() + current_unit_index = Network.local_player.units.find(grid_selector.current_entity) + hover_enter.emit(grid_selector.current_entity) + else: + grid_selector.current_entity = null + hover_exit.emit() + + +func get_collision_query() -> PhysicsPointQueryParameters2D: + var query := PhysicsPointQueryParameters2D.new() + query.collision_mask = grid_selector.selection_collision_mask + query.collide_with_areas = true + query.collide_with_bodies = false + query.position = selector_tile.global_position + + return query func _state_enter() -> void: |