/ 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"