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.
		
		
		
		
		
			
		
			
	
	
		
			120 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			GDScript
		
	
		
		
			
		
	
	
			120 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			GDScript
		
	
| 
								 
											2 years ago
										 
									 | 
							
								@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()
							 |