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