|
|
|
|
@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
|