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.

83 lines
2.1 KiB
GDScript

2 years ago
@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