Reorganized input

This commit is contained in:
gamer147
2026-04-02 23:02:18 -04:00
parent b9030b7899
commit 2ad8686ad5
7 changed files with 533 additions and 75 deletions

View File

@@ -1,8 +1,6 @@
class_name CombatMap
extends Node2D
signal tile_hovered(coords: Vector2i)
@export var tile_set: DLTileset
@onready var tile_map: TileMapLayer = %TerrainLayer
@onready var highlight_map: GridOverlay = %OverlayLayer
@@ -82,7 +80,6 @@ func remove_unit(unit: Unit) -> void:
func target_tile(coords: Vector2i) -> void:
highlight_map.target_tile(coords)
tile_hovered.emit(coords)
func set_highlight_enabled(enabled: bool) -> void:

View File

@@ -5,12 +5,23 @@ const SPEED = 192.0
@export var dl_map: CombatMap
signal combat_requested(attacker: Unit, defender: Unit)
signal mouse_grid_changed(coords: Vector2i)
signal camera_drag(delta: Vector2)
var input_disabled := false
var _selected_unit: Unit = null
var _target_pos: Vector2
var _goal_pos: Vector2
var _moving := false
var _left_pending := false
var _drag_start := Vector2.ZERO
var _dragging := false
var _current_grid_coords := Vector2i(-99999, -99999)
const DRAG_THRESHOLD := 8.0
func _ready() -> void:
for unit: Unit in get_tree().get_nodes_in_group("units"):
@@ -30,23 +41,55 @@ func _on_unit_died(unit: Unit) -> void:
_moving = false
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseButton and not event.pressed and event.button_index == MOUSE_BUTTON_LEFT:
var world_pos: Vector2 = get_viewport().get_canvas_transform().affine_inverse() * event.position
var clicked_unit := _get_unit_at(world_pos)
func _process(_delta: float) -> void:
if input_disabled:
return
var mouse_pos := get_viewport().get_canvas_transform().affine_inverse() * get_viewport().get_mouse_position()
var coords := dl_map.world_to_coords(mouse_pos)
if coords != _current_grid_coords:
_current_grid_coords = coords
mouse_grid_changed.emit(coords)
if clicked_unit:
if _selected_unit and clicked_unit != _selected_unit and _selected_unit.is_alive() and clicked_unit.is_alive():
combat_requested.emit(_selected_unit, clicked_unit)
else:
_select_unit(clicked_unit)
get_viewport().set_input_as_handled()
elif _selected_unit:
var snapped_pos := dl_map.snap_to_grid(world_pos)
var grid_coords := dl_map.world_to_coords(world_pos)
if dl_map.is_wall(grid_coords):
return
_goal_pos = snapped_pos
func _unhandled_input(event: InputEvent) -> void:
if input_disabled:
return
if event is InputEventMouseButton:
match event.button_index:
MOUSE_BUTTON_LEFT:
if event.pressed:
_left_pending = true
_drag_start = event.position
else:
if _dragging:
_dragging = false
_left_pending = false
Input.set_default_cursor_shape(Input.CURSOR_ARROW)
get_viewport().set_input_as_handled()
else:
_left_pending = false
_handle_left_click(event.position)
MOUSE_BUTTON_MIDDLE:
if event.pressed:
_dragging = true
_drag_start = event.position
Input.set_default_cursor_shape(Input.CURSOR_DRAG)
else:
_dragging = false
Input.set_default_cursor_shape(Input.CURSOR_ARROW)
get_viewport().set_input_as_handled()
elif event is InputEventMouseMotion:
if _left_pending and not _dragging:
if event.position.distance_to(_drag_start) >= DRAG_THRESHOLD:
_dragging = true
_left_pending = false
Input.set_default_cursor_shape(Input.CURSOR_DRAG)
if _dragging:
var delta: Vector2 = _drag_start - event.position
_drag_start = event.position
camera_drag.emit(delta)
get_viewport().set_input_as_handled()
@@ -83,6 +126,25 @@ func _physics_process(delta: float) -> void:
_moving = true
func _handle_left_click(screen_pos: Vector2) -> void:
var world_pos: Vector2 = get_viewport().get_canvas_transform().affine_inverse() * screen_pos
var clicked_unit := _get_unit_at(world_pos)
if clicked_unit:
if _selected_unit and clicked_unit != _selected_unit and _selected_unit.is_alive() and clicked_unit.is_alive():
combat_requested.emit(_selected_unit, clicked_unit)
else:
_select_unit(clicked_unit)
get_viewport().set_input_as_handled()
elif _selected_unit:
var snapped_pos := dl_map.snap_to_grid(world_pos)
var grid_coords := dl_map.world_to_coords(world_pos)
if dl_map.is_wall(grid_coords):
return
_goal_pos = snapped_pos
get_viewport().set_input_as_handled()
func _select_unit(unit: Unit) -> void:
if _selected_unit:
_selected_unit.set_selected(false)

View File

@@ -4,20 +4,36 @@ class_name StrategyPhase extends Node2D
@onready var combat_system: CombatSystem = $CombatSystem
@onready var combat_ui: CombatUI = $CombatUI
@onready var combat_map: CombatMap = $CombatMap
@onready var camera: CameraController = $Camera2D
func _ready() -> void:
player_controller.combat_requested.connect(_on_combat_requested)
player_controller.mouse_grid_changed.connect(_on_mouse_grid_changed)
player_controller.camera_drag.connect(camera.apply_drag)
combat_ui.fight_confirmed.connect(_on_fight_confirmed)
combat_ui.fight_cancelled.connect(_on_fight_cancelled)
func _on_mouse_grid_changed(coords: Vector2i) -> void:
combat_map.target_tile(coords)
combat_map.tile_highlight.set_grid_coords(coords)
func _on_combat_requested(attacker: Unit, defender: Unit) -> void:
var proposal := combat_system.create_proposal(attacker, defender)
combat_map.set_highlight_enabled(false)
_set_input_disabled(true)
combat_ui.show_proposal(proposal)
func _on_fight_confirmed(proposal: CombatProposal) -> void:
combat_system.apply_proposal(proposal)
combat_map.set_highlight_enabled(true)
_set_input_disabled(false)
func _on_fight_cancelled() -> void:
combat_map.set_highlight_enabled(true)
_set_input_disabled(false)
func _set_input_disabled(disabled: bool) -> void:
player_controller.input_disabled = disabled
combat_map.set_highlight_enabled(not disabled)