/ InputManager.gd
InputManager.gd
1 extends Node 2 3 @onready var message_bus = get_node("/root/MainGame/NetworkLayer/RPC/MessageBus") 4 @onready var event_bus = get_node("/root/MainGame/EventBus") 5 @onready var tilemap = get_node("/root/MainGame/ViewLayer/WorldRenderer/TileMapLayer") 6 @onready var camera = get_node("/root/MainGame/InputLayer/Node2D/Camera2D") 7 @onready var gui = get_node("/root/MainGame/GUILayer/UIRoot") 8 9 var selected_item 10 var selected_type 11 var selected_nodes = [] 12 13 #for growing zones maybe remove later 14 var is_dragging = false 15 var drag_start 16 var drag_end 17 var cam_drag_start 18 var cam_drag_end 19 var canvas_pos 20 var local_pos 21 22 func _unhandled_input(event): 23 if event is InputEventMouseButton and event.pressed: 24 if event.button_index == MOUSE_BUTTON_RIGHT: 25 clear_selection() 26 gui.queue_redraw() 27 return 28 #nothing selected dragbox to select things and single click to select things - does not work at the moment 29 if selected_type == null or selected_type == "basic": 30 if is_dragging and event is InputEventMouseMotion: 31 drag_end = camera.get_global_mouse_position() 32 cam_drag_end= get_viewport().get_mouse_position() 33 get_selection(drag_start, drag_end) 34 gui.queue_redraw() 35 return 36 elif event is InputEventMouseButton and not event.pressed: 37 is_dragging = false 38 gui.queue_redraw() 39 drag_start = null 40 drag_end = null 41 return 42 elif event is InputEventMouseButton and event.pressed: 43 if event.button_index == MOUSE_BUTTON_LEFT: 44 selected_type = "basic" 45 is_dragging = true 46 drag_start = camera.get_global_mouse_position() 47 cam_drag_start = get_viewport().get_mouse_position() 48 gui.queue_redraw() 49 return 50 #command flow for dragging a selection box 51 if selected_type == "command": 52 if selected_item == "growing": 53 if is_dragging and event is InputEventMouseMotion: 54 var grid_pos = tilemap.local_to_map(camera.get_global_mouse_position()) 55 var local_pos = tilemap.map_to_local(grid_pos) 56 drag_end = local_pos + Vector2(32, 32) 57 cam_drag_end = get_viewport().get_mouse_position() 58 gui.queue_redraw() 59 return 60 elif event is InputEventMouseButton and not event.pressed: 61 is_dragging = false 62 gui.queue_redraw() 63 message_bus.rpc_id(1, "request_zone_growing", drag_start, drag_end, multiplayer.get_unique_id()) 64 drag_start = null 65 drag_end = null 66 return 67 elif event is InputEventMouseButton and event.pressed: 68 if event.button_index == MOUSE_BUTTON_LEFT: 69 is_dragging = true 70 #to snap to grid 71 var grid_pos = tilemap.local_to_map(camera.get_global_mouse_position()) 72 var local_pos = tilemap.map_to_local(grid_pos) 73 drag_start = local_pos - Vector2(32, 32) 74 cam_drag_start = get_viewport().get_mouse_position() #this is broken cbf fixing maybe one day after selection is working 75 gui.queue_redraw() 76 return 77 if selected_type == "floor": 78 if event is InputEventMouseButton and event.pressed: 79 if event.button_index == MOUSE_BUTTON_LEFT: 80 var global_mouse_pos = camera.get_global_mouse_position() 81 var grid_pos = tilemap.local_to_map(global_mouse_pos) 82 if selected_item == null: 83 return 84 message_bus.rpc_id(1, "request_build_floor", selected_item, grid_pos, multiplayer.get_unique_id()) 85 return 86 if selected_type == "building": 87 if event is InputEventMouseButton and event.pressed: 88 if event.button_index == MOUSE_BUTTON_LEFT: 89 var global_mouse_pos = camera.get_global_mouse_position() 90 var grid_pos = tilemap.local_to_map(global_mouse_pos) 91 if selected_item == null: 92 return 93 message_bus.rpc_id(1, "request_build_structure", selected_item, grid_pos, multiplayer.get_unique_id()) 94 return 95 96 97 98 #fug I just realised this will never work for selecting items and buildings 99 func get_selection(drag_start, drag_end): 100 selected_nodes.clear() 101 var selection_rect = Rect2(drag_start, drag_end - drag_start).abs() 102 var selection = [] 103 var nodes = get_tree().get_nodes_in_group("selectable") 104 for node in nodes: 105 if selection_rect.has_point(node.global_position): 106 selection.append(node) 107 selected_nodes.append(node) 108 event_bus.emit_colonist_selected(node) 109 return selection 110 111 #called to clear all selected stuff 112 func clear_selection(): 113 if not selected_nodes.is_empty(): 114 for node in selected_nodes: 115 event_bus.emit_colonist_deselected(node) 116 selected_nodes.clear() 117 selected_item = null 118 selected_type = null 119 is_dragging = false 120 drag_end = null 121 drag_start = null 122 cam_drag_start = null 123 cam_drag_end = null 124 125 func _on_button_floor_pressed(id): 126 var item = Defs.get(id) 127 selected_item = id 128 selected_type = "floor" 129 130 func _on_button_structure_pressed(id): 131 var item = Defs.get(id) 132 selected_item = id 133 selected_type = "building" 134 135 func _on_dirt_road_pressed() -> void: 136 var item = Defs.tile_dict_dirt 137 selected_item = item.get("name") 138 selected_type = "floor" 139 140 141 func _on_stone_pressed() -> void: 142 var item = Defs.tile_dict_brick_path 143 selected_item = item.get("name") 144 selected_type = "floor" 145 146 147 func _on_wooden_wall_pressed() -> void: 148 #var item = Defs.tile_dict_brick_path 149 selected_item = "wall" 150 selected_type = "building" 151 152 func _on_colonist_selected(node): 153 selected_item = node 154 selected_type = "colonist" 155 156 157 func _on_work_pressed() -> void: 158 selected_item = "work" 159 selected_type = "command" 160 161 162 func _on_chop_pressed() -> void: 163 selected_item = "chop" 164 selected_type = "command" 165 166 167 func _on_growing_pressed() -> void: 168 selected_item = "growing" 169 selected_type = "command" 170 171 172 func _on_grow_pressed() -> void: 173 selected_item = "structure_dict_growing" 174 selected_type = "building"