You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			136 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			GDScript
		
	
		
		
			
		
	
	
			136 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			GDScript
		
	
| 
								 
											2 years ago
										 
									 | 
							
								extends Control
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@onready var map_overlay: Control = $MapOverlay
							 | 
						||
| 
								 | 
							
								@onready var map: Control = %Map
							 | 
						||
| 
								 | 
							
								@onready var current_layer_spinbox: SpinBox = %CurrentLayer
							 | 
						||
| 
								 | 
							
								@onready var status_label: Label = %StatusLabel
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const NULL_VECTOR2I = Vector2i(-9999999, -9999999)
							 | 
						||
| 
								 | 
							
								var plugin: EditorPlugin
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var drag_from: Vector2i = NULL_VECTOR2I
							 | 
						||
| 
								 | 
							
								var view_drag: Vector4
							 | 
						||
| 
								 | 
							
								var map_offset := Vector2i(10, 10)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var current_layer: int
							 | 
						||
| 
								 | 
							
								var force_mapped: bool
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _enter_tree() -> void:
							 | 
						||
| 
								 | 
							
									if owner:
							 | 
						||
| 
								 | 
							
										plugin = owner.plugin
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _ready() -> void:
							 | 
						||
| 
								 | 
							
									map.draw.connect(_on_map_draw)
							 | 
						||
| 
								 | 
							
									map_overlay.mouse_exited.connect(status_label.hide)
							 | 
						||
| 
								 | 
							
									map_overlay.gui_input.connect(_on_overlay_input)
							 | 
						||
| 
								 | 
							
									map_overlay.draw.connect(_on_overlay_draw)
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									current_layer_spinbox.value_changed.connect(on_layer_changed)
							 | 
						||
| 
								 | 
							
									%RecenterButton.pressed.connect(on_recenter_view)
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									status_label.hide()
							 | 
						||
| 
								 | 
							
									await get_tree().process_frame
							 | 
						||
| 
								 | 
							
									update_map_position()
							 | 
						||
| 
								 | 
							
									map.size = MetSys.CELL_SIZE * 200
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									var refresh := func():
							 | 
						||
| 
								 | 
							
										update_map_position()
							 | 
						||
| 
								 | 
							
										on_layer_changed(current_layer)
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									MetSys.settings.theme_changed.connect(refresh)
							 | 
						||
| 
								 | 
							
									MetSys.theme_modified.connect(refresh.unbind(1))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func get_cursor_pos() -> Vector2i:
							 | 
						||
| 
								 | 
							
									var pos := (map_overlay.get_local_mouse_position() - MetSys.CELL_SIZE / 2).snapped(MetSys.CELL_SIZE) / MetSys.CELL_SIZE as Vector2i - map_offset
							 | 
						||
| 
								 | 
							
									return pos
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func on_layer_changed(l: int):
							 | 
						||
| 
								 | 
							
									current_layer = l
							 | 
						||
| 
								 | 
							
									map.queue_redraw()
							 | 
						||
| 
								 | 
							
									map_overlay.queue_redraw()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func on_recenter_view() -> void:
							 | 
						||
| 
								 | 
							
									map_offset = Vector2i(10, 10)
							 | 
						||
| 
								 | 
							
									map_overlay.queue_redraw()
							 | 
						||
| 
								 | 
							
									update_map_position()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_overlay_input(event: InputEvent) -> void:
							 | 
						||
| 
								 | 
							
									if event is InputEventMouseMotion:
							 | 
						||
| 
								 | 
							
										if view_drag != Vector4():
							 | 
						||
| 
								 | 
							
											if event.position.x >= map_overlay.size.x:
							 | 
						||
| 
								 | 
							
												map_overlay.warp_mouse(Vector2(event.position.x - map_overlay.size.x, event.position.y))
							 | 
						||
| 
								 | 
							
												view_drag.x -= map_overlay.size.x
							 | 
						||
| 
								 | 
							
											elif event.position.x < 0:
							 | 
						||
| 
								 | 
							
												map_overlay.warp_mouse(Vector2(map_overlay.size.x + event.position.x, event.position.y))
							 | 
						||
| 
								 | 
							
												view_drag.x += map_overlay.size.x
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											if event.position.y >= map_overlay.size.y:
							 | 
						||
| 
								 | 
							
												map_overlay.warp_mouse(Vector2(event.position.x, event.position.y - map_overlay.size.y))
							 | 
						||
| 
								 | 
							
												view_drag.y -= map_overlay.size.y
							 | 
						||
| 
								 | 
							
											elif event.position.y < 0:
							 | 
						||
| 
								 | 
							
												map_overlay.warp_mouse(Vector2(event.position.x, map_overlay.size.y + event.position.y))
							 | 
						||
| 
								 | 
							
												view_drag.y += map_overlay.size.y
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											map_offset = Vector2(view_drag.z, view_drag.w) + (map_overlay.get_local_mouse_position() - Vector2(view_drag.x, view_drag.y)) / MetSys.CELL_SIZE
							 | 
						||
| 
								 | 
							
											update_map_position()
							 | 
						||
| 
								 | 
							
											map_overlay.queue_redraw()
							 | 
						||
| 
								 | 
							
											_on_drag()
							 | 
						||
| 
								 | 
							
										else:
							 | 
						||
| 
								 | 
							
											map_overlay.queue_redraw()
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										_update_status_label()
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									if event is InputEventMouseButton:
							 | 
						||
| 
								 | 
							
										if event.button_index == MOUSE_BUTTON_MIDDLE:
							 | 
						||
| 
								 | 
							
											if event.pressed:
							 | 
						||
| 
								 | 
							
												view_drag.x = map_overlay.get_local_mouse_position().x
							 | 
						||
| 
								 | 
							
												view_drag.y = map_overlay.get_local_mouse_position().y
							 | 
						||
| 
								 | 
							
												view_drag.z = map_offset.x
							 | 
						||
| 
								 | 
							
												view_drag.w = map_offset.y
							 | 
						||
| 
								 | 
							
											else:
							 | 
						||
| 
								 | 
							
												view_drag = Vector4()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_drag():
							 | 
						||
| 
								 | 
							
									pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _update_status_label():
							 | 
						||
| 
								 | 
							
									status_label.show()
							 | 
						||
| 
								 | 
							
									status_label.text = str(get_cursor_pos())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _unhandled_key_input(event: InputEvent) -> void:
							 | 
						||
| 
								 | 
							
									if not visible:
							 | 
						||
| 
								 | 
							
										return
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									if event is InputEventKey and event.pressed:
							 | 
						||
| 
								 | 
							
										if event.physical_keycode == KEY_Q:
							 | 
						||
| 
								 | 
							
											current_layer_spinbox.value -= 1
							 | 
						||
| 
								 | 
							
											accept_event()
							 | 
						||
| 
								 | 
							
										elif event.physical_keycode == KEY_E:
							 | 
						||
| 
								 | 
							
											current_layer_spinbox.value += 1
							 | 
						||
| 
								 | 
							
											accept_event()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _notification(what: int) -> void:
							 | 
						||
| 
								 | 
							
									if what == NOTIFICATION_THEME_CHANGED:
							 | 
						||
| 
								 | 
							
										if map_overlay:
							 | 
						||
| 
								 | 
							
											map_overlay.queue_redraw()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_map_draw() -> void:
							 | 
						||
| 
								 | 
							
									if not plugin:
							 | 
						||
| 
								 | 
							
										return
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									MetroidvaniaSystem.RoomDrawer.force_mapped = force_mapped
							 | 
						||
| 
								 | 
							
									for x in range(-100, 100):
							 | 
						||
| 
								 | 
							
										for y in range(-100, 100):
							 | 
						||
| 
								 | 
							
											MetSys.draw_cell(map, Vector2i(x, y) + Vector2i(100, 100), Vector3i(x, y, current_layer), true, false)
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									if MetSys.settings.theme.use_shared_borders:
							 | 
						||
| 
								 | 
							
										MetSys.draw_shared_borders()
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									MetroidvaniaSystem.RoomDrawer.force_mapped = false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_overlay_draw() -> void:
							 | 
						||
| 
								 | 
							
									MetSys.draw_custom_elements(map_overlay, Rect2i(-map_offset, map_overlay.size / MetSys.CELL_SIZE + Vector2.ONE), Vector2(), current_layer)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func update_map_position():
							 | 
						||
| 
								 | 
							
									map.position = Vector2(map_offset - Vector2i(100, 100)) * MetSys.CELL_SIZE
							 |