@tool extends Control const EDITOR_SCRIPT = preload("res://addons/MetroidvaniaSystem/Database/MapEditor.gd") var editor: EDITOR_SCRIPT var theme_cache: Dictionary var use_cursor := true var room_only_cursor := true var drag_from: Vector2i = EDITOR_SCRIPT.NULL_VECTOR2I var highlighted_room: Array[Vector3i] var highlighted_border := -1 var top_draw: Callable func _ready() -> void: if not owner.plugin: return editor = owner _editor_init.call_deferred() func _editor_init(): pass func _update_theme(): pass func _editor_enter(): pass func _editor_exit(): pass func _editor_input(event: InputEvent): pass func _editor_draw(map_overlay: CanvasItem): if highlighted_border == -1: for p in highlighted_room: map_overlay.draw_rect(Rect2(Vector2(p.x, p.y) * MetSys.CELL_SIZE, MetSys.CELL_SIZE), theme_cache.highlighted_room) if drag_from == EDITOR_SCRIPT.NULL_VECTOR2I: if use_cursor and map_overlay.cursor_inside and (not room_only_cursor or get_cell_at_cursor()): map_overlay.draw_rect(Rect2(get_cursor_pos() as Vector2 * MetSys.CELL_SIZE, MetSys.CELL_SIZE), theme_cache.cursor_color, false, 2) else: var rect := get_rect_between(drag_from, get_cursor_pos()) top_draw = func(map_overlay: CanvasItem): map_overlay.draw_string(get_theme_font(&"font", &"Label"), Vector2(get_cursor_pos()) * MetSys.CELL_SIZE + MetSys.CELL_SIZE * Vector2.UP * 0.5, "%d x %d" % [rect.size.x, rect.size.y]) rect.position *= MetSys.CELL_SIZE rect.size *= MetSys.CELL_SIZE map_overlay.draw_rect(rect, theme_cache.cursor_color, false, 2) if highlighted_border > -1: if highlighted_room.is_empty(): draw_border_highlight(map_overlay, get_cursor_pos(), highlighted_border) else: for p in highlighted_room: var cell_data := MetSys.map_data.get_cell_at(p) for i in 4: if cell_data.borders[i] > -1: draw_border_highlight(map_overlay, Vector2(p.x, p.y), i) func draw_border_highlight(map_overlay: CanvasItem, pos: Vector2, border: int): match border: MetSys.R: map_overlay.draw_rect(Rect2(pos * MetSys.CELL_SIZE + Vector2(MetSys.CELL_SIZE.x * 0.667, 0), MetSys.CELL_SIZE * Vector2(0.333, 1)), theme_cache.border_highlight) MetSys.D: map_overlay.draw_rect(Rect2(pos * MetSys.CELL_SIZE + Vector2(0, MetSys.CELL_SIZE.y * 0.667), MetSys.CELL_SIZE * Vector2(1, 0.333)), theme_cache.border_highlight) MetSys.L: map_overlay.draw_rect(Rect2(pos * MetSys.CELL_SIZE, MetSys.CELL_SIZE * Vector2(0.333, 1)), theme_cache.border_highlight) MetSys.U: map_overlay.draw_rect(Rect2(pos * MetSys.CELL_SIZE, MetSys.CELL_SIZE * Vector2(1, 0.333)), theme_cache.border_highlight) func get_cursor_pos() -> Vector2i: return editor.get_cursor_pos() func get_coords(p: Vector2i, layer := editor.current_layer) -> Vector3i: return Vector3i(p.x, p.y, layer) func get_rect_between(point1: Vector2, point2: Vector2) -> Rect2: var start: Vector2 start.x = minf(point1.x, point2.x) start.y = minf(point1.y, point2.y) var end: Vector2 end.x = maxf(point1.x, point2.x) end.y = maxf(point1.y, point2.y) return Rect2(start, Vector2.ONE).expand(end + Vector2.ONE) func get_square_border_idx(borders: Array[int], rel: Vector2) -> int: if borders[MetSys.L] > -1 and rel.x < MetSys.CELL_SIZE.x / 3: return MetSys.L if borders[MetSys.R] > -1 and rel.x > MetSys.CELL_SIZE.x - MetSys.CELL_SIZE.x / 3: return MetSys.R if borders[MetSys.U] > -1 and rel.y < MetSys.CELL_SIZE.y / 3: return MetSys.U if borders[MetSys.D] > -1 and rel.y > MetSys.CELL_SIZE.y - MetSys.CELL_SIZE.y / 3: return MetSys.D return -1 func get_cell_at_cursor() -> MetroidvaniaSystem.MapData.CellData: return MetSys.map_data.get_cell_at(get_coords(get_cursor_pos())) func mark_modified(): editor.plugin.modified = true func _notification(what: int) -> void: if what == NOTIFICATION_THEME_CHANGED: theme_cache.highlighted_room = get_theme_color(&"highlighted_room", &"MetSys") theme_cache.border_highlight = get_theme_color(&"border_highlight", &"MetSys") theme_cache.cursor_color = get_theme_color(&"cursor_color", &"MetSys") _update_theme()