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
							 |