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