@tool extends "res://addons/MetroidvaniaSystem/Database/SubEditor.gd" enum { MODE_DRAW, MODE_ERASE, MODE_PICK } var can_pick: bool var super_use_cursor: bool var whole_room: bool func _editor_init() -> void: super_use_cursor = use_cursor func _editor_enter(): super() %Shortcuts.show() %ShortcutPick.visible = can_pick func _editor_exit(): super() %Shortcuts.hide() func _editor_input(event: InputEvent): if event is InputEventMouseButton: if event.pressed: if event.button_index == MOUSE_BUTTON_LEFT: if can_pick and not whole_room and event.is_command_or_control_pressed(): paint(MODE_PICK) else: paint(MODE_DRAW) elif event.button_index == MOUSE_BUTTON_RIGHT: paint(MODE_ERASE) elif event is InputEventMouseMotion: if whole_room: update_hovered_room() if event.button_mask & (MOUSE_BUTTON_MASK_LEFT | MOUSE_BUTTON_MASK_RIGHT): var erase := bool(event.button_mask & MOUSE_BUTTON_MASK_RIGHT) paint(MODE_ERASE if erase else MODE_DRAW) elif event is InputEventKey: if not event.echo and event.keycode == KEY_SHIFT: whole_room = event.pressed use_cursor = super_use_cursor and not whole_room if whole_room: update_hovered_room() else: highlighted_room.clear() editor.map_overlay.queue_redraw() func update_hovered_room(): var hr := highlighted_room highlighted_room = MetSys.map_data.get_whole_room(get_coords(get_cursor_pos())) if highlighted_room != hr: editor.map_overlay.queue_redraw() func paint(mode: int): var coords_to_modify: Array[Vector3i] if whole_room: coords_to_modify = highlighted_room else: coords_to_modify.assign([get_coords(get_cursor_pos())]) var modified: bool for coords in coords_to_modify: var cell_data := MetSys.map_data.get_cell_at(coords) if not cell_data: continue if modify_cell(cell_data, mode) or modify_coords(coords, mode): modified = true if modified: mark_modified() editor.map.queue_redraw() func modify_cell(cell_data: MetroidvaniaSystem.MapData.CellData, mode: int) -> bool: return false func modify_coords(coords: Vector3i, mode: int) -> bool: return false