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