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.4 KiB
		
	
	
	
		
			GDScript
		
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.4 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
 |