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