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.
		
		
		
		
		
			
		
			
	
	
		
			869 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Plaintext
		
	
		
		
			
		
	
	
			869 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Plaintext
		
	
| 
											2 years ago
										 | [gd_scene load_steps=13 format=3 uid="uid://dfbykrvyqnqr5"] | ||
|  | 
 | ||
|  | [ext_resource type="Script" path="res://addons/MetroidvaniaSystem/Database/MapEditor.gd" id="1_i7yda"] | ||
|  | [ext_resource type="Script" path="res://addons/MetroidvaniaSystem/Database/MapOverlay.gd" id="2_w1wnt"] | ||
|  | 
 | ||
|  | [sub_resource type="ButtonGroup" id="ButtonGroup_pv7fp"] | ||
|  | 
 | ||
|  | [sub_resource type="GDScript" id="GDScript_dsps8"] | ||
|  | resource_name = "RoomLayout" | ||
|  | script/source = "@tool | ||
|  | extends \"res://addons/MetroidvaniaSystem/Database/SubEditor.gd\" | ||
|  | 
 | ||
|  | var erase_mode: bool | ||
|  | 
 | ||
|  | func _editor_init() -> void: | ||
|  | 	room_only_cursor = false | ||
|  | 
 | ||
|  | func _update_theme(): | ||
|  | 	theme_cache.cursor_color = get_theme_color(&\"cursor_color\", &\"MetSys\") | ||
|  | 
 | ||
|  | func _editor_input(event: InputEvent): | ||
|  | 	if event is InputEventMouseButton: | ||
|  | 		if event.button_index == MOUSE_BUTTON_LEFT: | ||
|  | 			if event.pressed: | ||
|  | 				drag_from = get_cursor_pos() | ||
|  | 			else: | ||
|  | 				var rect := get_rect_between(drag_from, get_cursor_pos()) | ||
|  | 				update_rooms(rect) | ||
|  | 				drag_from = EDITOR_SCRIPT.NULL_VECTOR2I | ||
|  | 		elif event.button_index == MOUSE_BUTTON_RIGHT: | ||
|  | 			if event.pressed: | ||
|  | 				drag_from = get_cursor_pos() | ||
|  | 				erase_mode = true | ||
|  | 				theme_cache.cursor_color = get_theme_color(&\"cursor_color_erase\", &\"MetSys\") | ||
|  | 				queue_redraw() | ||
|  | 			else: | ||
|  | 				var rect := get_rect_between(drag_from, get_cursor_pos()) | ||
|  | 				erase_rooms(rect) | ||
|  | 				erase_mode = false | ||
|  | 				theme_cache.cursor_color = get_theme_color(&\"cursor_color\", &\"MetSys\") | ||
|  | 				drag_from = EDITOR_SCRIPT.NULL_VECTOR2I | ||
|  | 
 | ||
|  | func update_rooms(rect: Rect2i): | ||
|  | 	var map_data: MetroidvaniaSystem.MapData = MetSys.map_data | ||
|  | 	 | ||
|  | 	for x in range(rect.position.x, rect.end.x): | ||
|  | 		for y in range(rect.position.y, rect.end.y): | ||
|  | 			var coords := Vector3i(x, y, editor.current_layer) | ||
|  | 			 | ||
|  | 			var cell = map_data.get_cell_at(coords) | ||
|  | 			if cell: | ||
|  | 				remove_assign(coords) | ||
|  | 				 | ||
|  | 				if x != rect.end.x - 1: | ||
|  | 					cell.borders[0] = -1 | ||
|  | 				if y != rect.end.y - 1: | ||
|  | 					cell.borders[1] = -1 | ||
|  | 				if x != rect.position.x: | ||
|  | 					cell.borders[2] = -1 | ||
|  | 				if y != rect.position.y: | ||
|  | 					cell.borders[3] = -1 | ||
|  | 			else: | ||
|  | 				cell = map_data.create_cell_at(coords) | ||
|  | 				if x == rect.end.x - 1: | ||
|  | 					cell.borders[0] = 0 | ||
|  | 				if y == rect.end.y - 1: | ||
|  | 					cell.borders[1] = 0 | ||
|  | 				if x == rect.position.x: | ||
|  | 					cell.borders[2] = 0 | ||
|  | 				if y == rect.position.y: | ||
|  | 					cell.borders[3] = 0 | ||
|  | 	 | ||
|  | 	mark_modified() | ||
|  | 	editor.map.queue_redraw() | ||
|  | 
 | ||
|  | func erase_rooms(rect: Rect2i): | ||
|  | 	var map_data: MetroidvaniaSystem.MapData = MetSys.map_data | ||
|  | 	 | ||
|  | 	for x in range(rect.position.x, rect.end.x): | ||
|  | 		for y in range(rect.position.y, rect.end.y): | ||
|  | 			var coords := Vector3i(x, y, editor.current_layer) | ||
|  | 			var cell_data := map_data.get_cell_at(coords) | ||
|  | 			 | ||
|  | 			if not cell_data: | ||
|  | 				continue | ||
|  | 			 | ||
|  | 			if x == rect.end.x - 1: | ||
|  | 				close_border(Vector2i(x + 1, y), 2) | ||
|  | 			if y == rect.end.y - 1: | ||
|  | 				close_border(Vector2i(x, y + 1), 3) | ||
|  | 			if x == rect.position.x: | ||
|  | 				close_border(Vector2i(x - 1, y), 0) | ||
|  | 			if y == rect.position.y: | ||
|  | 				close_border(Vector2i(x, y - 1), 1) | ||
|  | 			 | ||
|  | 			map_data.erase_cell(coords) | ||
|  | 	 | ||
|  | 	mark_modified() | ||
|  | 	editor.map.queue_redraw() | ||
|  | 
 | ||
|  | func remove_assign(coords: Vector3i): | ||
|  | 	var assigned_scene: String = MetSys.map_data.cells[coords].assigned_scene | ||
|  | 	MetSys.map_data.assigned_scenes.erase(assigned_scene) | ||
|  | 
 | ||
|  | func close_border(pos: Vector2i, border: int): | ||
|  | 	var cell: MetroidvaniaSystem.MapData.CellData = MetSys.map_data.get_cell_at(get_coords(pos)) | ||
|  | 	 | ||
|  | 	if cell: | ||
|  | 		cell.borders[border] = 0 | ||
|  | " | ||
|  | 
 | ||
|  | [sub_resource type="GDScript" id="GDScript_tlx5u"] | ||
|  | resource_name = "CellColor" | ||
|  | script/source = "@tool | ||
|  | extends \"res://addons/MetroidvaniaSystem/Database/CellPaintEditor.gd\" | ||
|  | 
 | ||
|  | func _editor_init() -> void: | ||
|  | 	super() | ||
|  | 	can_pick = true | ||
|  | 
 | ||
|  | func _editor_enter(): | ||
|  | 	super() | ||
|  | 	%Colors.show() | ||
|  | 
 | ||
|  | func _editor_exit(): | ||
|  | 	super() | ||
|  | 	%Colors.hide() | ||
|  | 
 | ||
|  | func modify_cell(cell_data: MetroidvaniaSystem.MapData.CellData, mode: int) -> bool: | ||
|  | 	if mode == MODE_PICK: | ||
|  | 		if cell_data.color.a > 0: | ||
|  | 			%CurrentColor.color = cell_data.color | ||
|  | 	else: | ||
|  | 		var target_color := Color.TRANSPARENT | ||
|  | 		if mode == MODE_DRAW: | ||
|  | 			target_color = %CurrentColor.color | ||
|  | 		 | ||
|  | 		if cell_data.color != target_color: | ||
|  | 			cell_data.color = target_color | ||
|  | 			return true | ||
|  | 	 | ||
|  | 	return false | ||
|  | " | ||
|  | 
 | ||
|  | [sub_resource type="GDScript" id="GDScript_ujwfx"] | ||
|  | resource_name = "CellSymbol" | ||
|  | script/source = "@tool | ||
|  | extends \"res://addons/MetroidvaniaSystem/Database/CellPaintEditor.gd\" | ||
|  | 
 | ||
|  | var symbol_group: ButtonGroup | ||
|  | 
 | ||
|  | func _editor_init() -> void: | ||
|  | 	can_pick = true | ||
|  | 	super() | ||
|  | 	 | ||
|  | 	symbol_group = ButtonGroup.new() | ||
|  | 	reload_symbols() | ||
|  | 	MetSys.settings.theme_changed.connect(reload_symbols) | ||
|  | 	MetSys.theme_modified.connect(func(changes: Array[String]): | ||
|  | 		if \"symbols\" in changes: | ||
|  | 			reload_symbols()) | ||
|  | 
 | ||
|  | func reload_symbols(): | ||
|  | 	for symbol in %SymbolContainer.get_children(): | ||
|  | 		symbol.free() | ||
|  | 	 | ||
|  | 	for symbol in MetSys.settings.theme.symbols: | ||
|  | 		add_symbol(symbol) | ||
|  | 
 | ||
|  | func _editor_enter(): | ||
|  | 	super() | ||
|  | 	%Symbols.show() | ||
|  | 
 | ||
|  | func _editor_exit(): | ||
|  | 	super() | ||
|  | 	%Symbols.hide() | ||
|  | 
 | ||
|  | func modify_cell(cell_data: MetroidvaniaSystem.MapData.CellData, mode: int) -> bool: | ||
|  | 	if mode == MODE_PICK: | ||
|  | 		if cell_data.symbol > -1: | ||
|  | 			symbol_group.get_buttons()[cell_data.symbol].button_pressed = true | ||
|  | 		return false | ||
|  | 	 | ||
|  | 	var target_symbol := -1 | ||
|  | 	if mode == MODE_DRAW: | ||
|  | 		target_symbol = symbol_group.get_pressed_button().get_index() | ||
|  | 	 | ||
|  | 	if cell_data.symbol != target_symbol: | ||
|  | 		cell_data.symbol = target_symbol | ||
|  | 		return true | ||
|  | 	 | ||
|  | 	return false | ||
|  | 
 | ||
|  | func add_symbol(texture: Texture2D): | ||
|  | 	var button := Button.new() | ||
|  | 	button.icon = texture | ||
|  | 	button.toggle_mode = true | ||
|  | 	button.button_group = symbol_group | ||
|  | 	 | ||
|  | 	if not symbol_group.get_pressed_button(): | ||
|  | 		button.button_pressed = true | ||
|  | 	 | ||
|  | 	%SymbolContainer.add_child(button) | ||
|  | " | ||
|  | 
 | ||
|  | [sub_resource type="GDScript" id="GDScript_a80ln"] | ||
|  | resource_name = "CellGroup" | ||
|  | script/source = "@tool | ||
|  | extends \"res://addons/MetroidvaniaSystem/Database/CellPaintEditor.gd\" | ||
|  | 
 | ||
|  | var cell_groups: Dictionary | ||
|  | var drawing: int | ||
|  | 
 | ||
|  | func _editor_init() -> void: | ||
|  | 	super() | ||
|  | 	room_only_cursor = true | ||
|  | 	cell_groups = MetSys.map_data.cell_groups | ||
|  | 
 | ||
|  | func _update_theme(): | ||
|  | 	theme_cache.group_color = get_theme_color(&\"group_color\", &\"MetSys\") | ||
|  | 
 | ||
|  | func _editor_enter(): | ||
|  | 	super() | ||
|  | 	%Groups.show() | ||
|  | 
 | ||
|  | func _editor_exit(): | ||
|  | 	super() | ||
|  | 	%Groups.hide() | ||
|  | 
 | ||
|  | func _editor_draw(map_overlay: CanvasItem): | ||
|  | 	super(map_overlay) | ||
|  | 	 | ||
|  | 	for p in cell_groups.get(%CurrentGroup.value as int, []): | ||
|  | 		map_overlay.draw_rect(Rect2(Vector2(p.x, p.y) * MetSys.CELL_SIZE, MetSys.CELL_SIZE), theme_cache.group_color) | ||
|  | 
 | ||
|  | func modify_coords(coords: Vector3i, mode: int) -> bool: | ||
|  | 	var current_group: int = %CurrentGroup.value | ||
|  | 	 | ||
|  | 	if mode == MODE_DRAW: | ||
|  | 		if not current_group in cell_groups: | ||
|  | 			cell_groups[current_group] = [] | ||
|  | 		 | ||
|  | 		if not coords in cell_groups[current_group]: | ||
|  | 			cell_groups[current_group].append(coords) | ||
|  | 			return true | ||
|  | 	else: | ||
|  | 		if coords in cell_groups[current_group]: | ||
|  | 			cell_groups[current_group].erase(coords) | ||
|  | 			return true | ||
|  | 	 | ||
|  | 	return false | ||
|  | 
 | ||
|  | func draw_group(): | ||
|  | 	if drawing == 0: | ||
|  | 		return | ||
|  | 	 | ||
|  | 	var coords := get_coords(get_cursor_pos()) | ||
|  | 	var current_group: int = %CurrentGroup.value | ||
|  | 	 | ||
|  | 	if drawing & MOUSE_BUTTON_MASK_LEFT != 0: | ||
|  | 		var cell_data: MetroidvaniaSystem.MapData.CellData = MetSys.map_data.get_cell_at(coords) | ||
|  | 		if not cell_data: | ||
|  | 			return | ||
|  | 		 | ||
|  | 		if not current_group in cell_groups: | ||
|  | 			cell_groups[current_group] = [] | ||
|  | 		 | ||
|  | 		if not coords in cell_groups[current_group]: | ||
|  | 			cell_groups[current_group].append(coords) | ||
|  | 		 | ||
|  | 		mark_modified() | ||
|  | 		editor.map_overlay.queue_redraw() | ||
|  | 	elif drawing & MOUSE_BUTTON_MASK_RIGHT != 0: | ||
|  | 		if not current_group in cell_groups: | ||
|  | 			return | ||
|  | 		 | ||
|  | 		var cell_data: MetroidvaniaSystem.MapData.CellData = MetSys.map_data.get_cell_at(coords) | ||
|  | 		if not cell_data: | ||
|  | 			return | ||
|  | 		 | ||
|  | 		cell_groups[current_group].erase(coords) | ||
|  | 		mark_modified() | ||
|  | 		editor.map_overlay.queue_redraw() | ||
|  | " | ||
|  | 
 | ||
|  | [sub_resource type="GDScript" id="GDScript_ilxbw"] | ||
|  | resource_name = "BorderType" | ||
|  | script/source = "@tool | ||
|  | extends \"res://addons/MetroidvaniaSystem/Database/BorderPaintEditor.gd\" | ||
|  | 
 | ||
|  | var border_group: ButtonGroup | ||
|  | 
 | ||
|  | func _editor_init() -> void: | ||
|  | 	use_cursor = false | ||
|  | 	can_pick = true | ||
|  | 	super() | ||
|  | 	border_group = ButtonGroup.new() | ||
|  | 	 | ||
|  | 	reload_borders() | ||
|  | 	MetSys.settings.theme_changed.connect(reload_borders) | ||
|  | 	MetSys.theme_modified.connect(func(changes: Array[String]): | ||
|  | 		if \"borders\" in changes or \"vertical_borders\" or \"vertical_borders\" in changes: | ||
|  | 			reload_borders()) | ||
|  | 
 | ||
|  | func reload_borders(): | ||
|  | 	for symbol in %BorderContainer.get_children(): | ||
|  | 		symbol.free() | ||
|  | 	 | ||
|  | 	if MetSys.settings.theme.rectangle: | ||
|  | 		add_border(MetSys.settings.theme.vertical_wall) | ||
|  | 		add_border(MetSys.settings.theme.vertical_passage) | ||
|  | 		 | ||
|  | 		for border in MetSys.settings.theme.vertical_borders: | ||
|  | 			add_border(border) | ||
|  | 	else: | ||
|  | 		add_border(MetSys.settings.theme.wall) | ||
|  | 		add_border(MetSys.settings.theme.passage) | ||
|  | 		 | ||
|  | 		for border in MetSys.settings.theme.borders: | ||
|  | 			add_border(border) | ||
|  | 
 | ||
|  | func _editor_enter(): | ||
|  | 	super() | ||
|  | 	%Borders.show() | ||
|  | 
 | ||
|  | func _editor_exit(): | ||
|  | 	super() | ||
|  | 	%Borders.hide() | ||
|  | 
 | ||
|  | func modify_border(cell_data: MetroidvaniaSystem.MapData.CellData, border: int, mode: int) -> bool: | ||
|  | 	if cell_data.borders[border] == -1: | ||
|  | 		return false | ||
|  | 	 | ||
|  | 	if mode == MODE_PICK: | ||
|  | 		border_group.get_buttons()[cell_data.borders[border]].button_pressed = true | ||
|  | 	else: | ||
|  | 		var target_border := 0 | ||
|  | 		if mode == MODE_DRAW: | ||
|  | 			target_border = border_group.get_pressed_button().get_index() | ||
|  | 		 | ||
|  | 		if cell_data.borders[border] != target_border: | ||
|  | 			cell_data.borders[border] = target_border | ||
|  | 			return true | ||
|  | 	 | ||
|  | 	return false | ||
|  | 
 | ||
|  | func add_border(texture: Texture2D): | ||
|  | 	var button := Button.new() | ||
|  | 	button.icon = texture | ||
|  | 	button.toggle_mode = true | ||
|  | 	button.button_group = border_group | ||
|  | 	button.custom_minimum_size.x = MetSys.CELL_SIZE.x | ||
|  | 	button.icon_alignment = HORIZONTAL_ALIGNMENT_RIGHT | ||
|  | 	 | ||
|  | 	if not border_group.get_pressed_button(): | ||
|  | 		button.button_pressed = true | ||
|  | 	 | ||
|  | 	%BorderContainer.add_child(button) | ||
|  | " | ||
|  | 
 | ||
|  | [sub_resource type="GDScript" id="GDScript_a3fsx"] | ||
|  | resource_name = "BorderColor" | ||
|  | script/source = "@tool | ||
|  | extends \"res://addons/MetroidvaniaSystem/Database/BorderPaintEditor.gd\" | ||
|  | 
 | ||
|  | func _editor_init(): | ||
|  | 	can_pick = true | ||
|  | 	super() | ||
|  | 
 | ||
|  | func _editor_enter(): | ||
|  | 	super() | ||
|  | 	%Colors.show() | ||
|  | 
 | ||
|  | func _editor_exit(): | ||
|  | 	super() | ||
|  | 	%Colors.hide() | ||
|  | 
 | ||
|  | func modify_border(cell_data: MetroidvaniaSystem.MapData.CellData, border: int, mode: int) -> bool: | ||
|  | 	if cell_data.borders[border] == -1: | ||
|  | 		return false | ||
|  | 	 | ||
|  | 	if mode == MODE_PICK: | ||
|  | 		if cell_data.border_colors[border].a > 0: | ||
|  | 			%CurrentColor.color = cell_data.border_colors[border] | ||
|  | 	else: | ||
|  | 		var target_color := Color.TRANSPARENT | ||
|  | 		if mode == MODE_DRAW: | ||
|  | 			target_color = %CurrentColor.color | ||
|  | 		 | ||
|  | 		if cell_data.border_colors[border] != target_color: | ||
|  | 			cell_data.border_colors[border] = target_color | ||
|  | 			return true | ||
|  | 	 | ||
|  | 	return false | ||
|  | " | ||
|  | 
 | ||
|  | [sub_resource type="GDScript" id="GDScript_p75ne"] | ||
|  | resource_name = "SceneAssign" | ||
|  | script/source = "@tool | ||
|  | extends \"res://addons/MetroidvaniaSystem/Database/SubEditor.gd\" | ||
|  | 
 | ||
|  | func _editor_init() -> void: | ||
|  | 	use_cursor = false | ||
|  | 
 | ||
|  | func _update_theme(): | ||
|  | 	theme_cache.assigned_scene = get_theme_color(&\"assigned_scene\", &\"MetSys\") | ||
|  | 
 | ||
|  | func _editor_input(event: InputEvent): | ||
|  | 	if event is InputEventMouseMotion: | ||
|  | 		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() | ||
|  | 
 | ||
|  | 	if event is InputEventMouseButton: | ||
|  | 		if event.button_index == MOUSE_BUTTON_LEFT: | ||
|  | 			if event.pressed: | ||
|  | 				if not highlighted_room.is_empty(): | ||
|  | 					if %FileDialog.root_subfolder.is_empty(): | ||
|  | 						%FileDialog.root_subfolder = MetSys.settings.map_root_folder.trim_prefix(\"res://\") | ||
|  | 					%FileDialog.popup_centered_ratio(0.6) | ||
|  | 		elif event.button_index == MOUSE_BUTTON_RIGHT: | ||
|  | 			var first := true | ||
|  | 			for p in highlighted_room: | ||
|  | 				if first: | ||
|  | 					var assigned_scene: String = MetSys.map_data.get_cell_at(p).assigned_scene | ||
|  | 					MetSys.map_data.assigned_scenes.erase(assigned_scene) | ||
|  | 					first = false | ||
|  | 				 | ||
|  | 				MetSys.map_data.get_cell_at(p).assigned_scene = \"\" | ||
|  | 				MetSys.room_assign_updated.emit() | ||
|  | 			 | ||
|  | 			mark_modified() | ||
|  | 			editor.map_overlay.queue_redraw() | ||
|  | 
 | ||
|  | func _editor_draw(map_overlay: CanvasItem): | ||
|  | 	super(map_overlay) | ||
|  | 
 | ||
|  | 	for coords in MetSys.map_data.assigned_scenes.values(): | ||
|  | 		if coords[0].z != editor.current_layer: | ||
|  | 			continue | ||
|  | 		 | ||
|  | 		for p in coords: | ||
|  | 			map_overlay.draw_rect(Rect2(Vector2(p.x, p.y) * MetSys.CELL_SIZE, MetSys.CELL_SIZE), theme_cache.assigned_scene) | ||
|  | 
 | ||
|  | 	if not highlighted_room.is_empty(): | ||
|  | 		map_overlay.draw_set_transform_matrix(Transform2D()) | ||
|  | 		map_overlay.draw_string(get_theme_font(&\"font\", &\"Label\"), Vector2(0, 40), | ||
|  | 				MetSys.map_data.get_cell_at(highlighted_room.front()).assigned_scene) | ||
|  | 
 | ||
|  | func on_map_selected(path: String) -> void: | ||
|  | 	path = path.trim_prefix(MetSys.settings.map_root_folder) | ||
|  | 	 | ||
|  | 	MetSys.map_data.assigned_scenes[path] = [] | ||
|  | 	for coords in highlighted_room: | ||
|  | 		MetSys.map_data.get_cell_at(coords).assigned_scene = path | ||
|  | 		MetSys.map_data.assigned_scenes[path].append(coords) | ||
|  | 		MetSys.room_assign_updated.emit() | ||
|  | 	 | ||
|  | 	mark_modified() | ||
|  | 	editor.map_overlay.queue_redraw() | ||
|  | " | ||
|  | 
 | ||
|  | [sub_resource type="GDScript" id="GDScript_gb3rf"] | ||
|  | resource_name = "CustomElements" | ||
|  | script/source = "@tool | ||
|  | extends \"res://addons/MetroidvaniaSystem/Database/SubEditor.gd\" | ||
|  | 
 | ||
|  | var current_element: String | ||
|  | var custom_elements: Dictionary | ||
|  | 
 | ||
|  | func _editor_init() -> void: | ||
|  | 	room_only_cursor = false | ||
|  | 	custom_elements = MetSys.map_data.custom_elements | ||
|  | 	MetSys.settings.custom_elements_changed.connect(reload_custom_elements) | ||
|  | 	 | ||
|  | 	reload_custom_elements() | ||
|  | 
 | ||
|  | func _update_theme(): | ||
|  | 	theme_cache.active_custom_element = get_theme_color(&\"active_custom_element\", &\"MetSys\") | ||
|  | 	theme_cache.inactive_custom_element = get_theme_color(&\"inactive_custom_element\", &\"MetSys\") | ||
|  | 	theme_cache.custom_element_marker = get_theme_color(&\"custom_element_marker\", &\"MetSys\") | ||
|  | 
 | ||
|  | func reload_custom_elements(): | ||
|  | 	for element in %CustomElementContainer.get_children(): | ||
|  | 		element.queue_free() | ||
|  | 	current_element = \"\" | ||
|  | 	 | ||
|  | 	if not MetSys.settings.custom_elements or MetSys.settings.custom_elements.custom_elements.is_empty(): | ||
|  | 		%NoElements.show() | ||
|  | 		return | ||
|  | 	else: | ||
|  | 		%NoElements.hide() | ||
|  | 	 | ||
|  | 	var element_group := ButtonGroup.new() | ||
|  | 	 | ||
|  | 	for element in MetSys.settings.custom_elements.custom_elements: | ||
|  | 		var button := CheckBox.new() | ||
|  | 		button.text = str(element).capitalize() | ||
|  | 		button.button_group = element_group | ||
|  | 		button.pressed.connect(set_current_element.bind(element)) | ||
|  | 		%CustomElementContainer.add_child(button) | ||
|  | 		 | ||
|  | 		if not element_group.get_pressed_button(): | ||
|  | 			button.button_pressed = true | ||
|  | 			set_current_element(element) | ||
|  | 
 | ||
|  | func _editor_enter(): | ||
|  | 	%CustomElements.show() | ||
|  | 
 | ||
|  | func _editor_exit(): | ||
|  | 	%CustomElements.hide() | ||
|  | 
 | ||
|  | func set_current_element(element: String): | ||
|  | 	current_element = element | ||
|  | 	editor.map_overlay.queue_redraw() | ||
|  | 
 | ||
|  | func _editor_draw(map_overlay: CanvasItem): | ||
|  | 	super(map_overlay) | ||
|  | 	 | ||
|  | 	for coords in custom_elements: | ||
|  | 		if coords.z != editor.current_layer: | ||
|  | 			continue | ||
|  | 		 | ||
|  | 		var element_color: Color | ||
|  | 		var element: Dictionary = custom_elements[coords] | ||
|  | 		if element.name == current_element: | ||
|  | 			element_color = theme_cache.active_custom_element | ||
|  | 		else: | ||
|  | 			element_color = theme_cache.inactive_custom_element | ||
|  | 		 | ||
|  | 		map_overlay.draw_rect(Rect2(Vector2(coords.x, coords.y) * MetSys.CELL_SIZE, Vector2(element.size) * MetSys.CELL_SIZE), element_color) | ||
|  | 		 | ||
|  | 		var square := minf(MetSys.CELL_SIZE.x, MetSys.CELL_SIZE.y) | ||
|  | 		map_overlay.draw_rect(Rect2((Vector2(coords.x, coords.y) + Vector2(0.5, 0.5)) * MetSys.CELL_SIZE - Vector2.ONE * square * 0.5, Vector2.ONE * square).grow(-square * 0.2), theme_cache.custom_element_marker) | ||
|  | 
 | ||
|  | func _editor_input(event: InputEvent): | ||
|  | 	if event is InputEventMouseButton: | ||
|  | 		if event.button_index == MOUSE_BUTTON_LEFT: | ||
|  | 			if event.pressed: | ||
|  | 				drag_from = get_cursor_pos() | ||
|  | 			else: | ||
|  | 				var rect := get_rect_between(drag_from, get_cursor_pos()) | ||
|  | 				add_element(rect) | ||
|  | 				mark_modified() | ||
|  | 				drag_from = EDITOR_SCRIPT.NULL_VECTOR2I | ||
|  | 		elif event.button_index == MOUSE_BUTTON_RIGHT: | ||
|  | 			if event.pressed: | ||
|  | 				var coords := Vector3i(get_cursor_pos().x, get_cursor_pos().y, editor.current_layer) | ||
|  | 				if coords in MetSys.map_data.custom_elements: | ||
|  | 					MetSys.map_data.custom_elements.erase(coords) | ||
|  | 					mark_modified() | ||
|  | 					editor.map.queue_redraw() | ||
|  | 
 | ||
|  | func add_element(rect: Rect2i): | ||
|  | 	var element: Dictionary | ||
|  | 	element.name = current_element | ||
|  | 	element.size = rect.size | ||
|  | 	element.data = %CustomData.text | ||
|  | 	 | ||
|  | 	var coords := Vector3i(rect.position.x, rect.position.y, editor.current_layer) | ||
|  | 	MetSys.map_data.custom_elements[coords] = element | ||
|  | 	editor.map.queue_redraw() | ||
|  | " | ||
|  | 
 | ||
|  | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_xiyo8"] | ||
|  | content_margin_left = 4.0 | ||
|  | content_margin_right = 4.0 | ||
|  | bg_color = Color(0, 0, 0, 0.501961) | ||
|  | 
 | ||
|  | [node name="MapEditor" type="HBoxContainer"] | ||
|  | anchors_preset = 15 | ||
|  | anchor_right = 1.0 | ||
|  | anchor_bottom = 1.0 | ||
|  | grow_horizontal = 2 | ||
|  | grow_vertical = 2 | ||
|  | script = ExtResource("1_i7yda") | ||
|  | mode_group = SubResource("ButtonGroup_pv7fp") | ||
|  | metadata/_edit_lock_ = true | ||
|  | 
 | ||
|  | [node name="PanelContainer" type="PanelContainer" parent="."] | ||
|  | custom_minimum_size = Vector2(200, 0) | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer"] | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/ScrollContainer"] | ||
|  | layout_mode = 2 | ||
|  | size_flags_horizontal = 3 | ||
|  | size_flags_vertical = 3 | ||
|  | 
 | ||
|  | [node name="Layer" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer"] | ||
|  | layout_mode = 2 | ||
|  | mouse_filter = 2 | ||
|  | metadata/_edit_lock_ = true | ||
|  | 
 | ||
|  | [node name="Label" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/Layer"] | ||
|  | layout_mode = 2 | ||
|  | text = "当前层" | ||
|  | horizontal_alignment = 1 | ||
|  | 
 | ||
|  | [node name="CurrentLayer" type="SpinBox" parent="PanelContainer/ScrollContainer/VBoxContainer/Layer"] | ||
|  | unique_name_in_owner = true | ||
|  | layout_mode = 2 | ||
|  | size_flags_horizontal = 4 | ||
|  | 
 | ||
|  | [node name="Label2" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/Layer"] | ||
|  | layout_mode = 2 | ||
|  | text = "预览层" | ||
|  | horizontal_alignment = 1 | ||
|  | 
 | ||
|  | [node name="SpinBox2" type="SpinBox" parent="PanelContainer/ScrollContainer/VBoxContainer/Layer"] | ||
|  | layout_mode = 2 | ||
|  | size_flags_horizontal = 4 | ||
|  | min_value = -1.0 | ||
|  | value = -1.0 | ||
|  | 
 | ||
|  | [node name="RecenterButton" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Layer"] | ||
|  | unique_name_in_owner = true | ||
|  | layout_mode = 2 | ||
|  | size_flags_horizontal = 4 | ||
|  | text = "重置相机" | ||
|  | 
 | ||
|  | [node name="HSeparator" type="HSeparator" parent="PanelContainer/ScrollContainer/VBoxContainer"] | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="Modes" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer"] | ||
|  | layout_mode = 2 | ||
|  | alignment = 1 | ||
|  | 
 | ||
|  | [node name="Label" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"] | ||
|  | layout_mode = 2 | ||
|  | text = "模式" | ||
|  | horizontal_alignment = 1 | ||
|  | 
 | ||
|  | [node name="RoomLayout" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"] | ||
|  | layout_mode = 2 | ||
|  | toggle_mode = true | ||
|  | button_pressed = true | ||
|  | button_group = SubResource("ButtonGroup_pv7fp") | ||
|  | text = "房间布局" | ||
|  | script = SubResource("GDScript_dsps8") | ||
|  | 
 | ||
|  | [node name="CellColor" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"] | ||
|  | layout_mode = 2 | ||
|  | toggle_mode = true | ||
|  | button_group = SubResource("ButtonGroup_pv7fp") | ||
|  | text = "地块颜色" | ||
|  | script = SubResource("GDScript_tlx5u") | ||
|  | 
 | ||
|  | [node name="CellSymbol" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"] | ||
|  | layout_mode = 2 | ||
|  | toggle_mode = true | ||
|  | button_group = SubResource("ButtonGroup_pv7fp") | ||
|  | text = "地块符号" | ||
|  | script = SubResource("GDScript_ujwfx") | ||
|  | 
 | ||
|  | [node name="CellGroup" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"] | ||
|  | layout_mode = 2 | ||
|  | toggle_mode = true | ||
|  | button_group = SubResource("ButtonGroup_pv7fp") | ||
|  | text = "地块组" | ||
|  | script = SubResource("GDScript_a80ln") | ||
|  | 
 | ||
|  | [node name="BorderType" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"] | ||
|  | layout_mode = 2 | ||
|  | toggle_mode = true | ||
|  | button_group = SubResource("ButtonGroup_pv7fp") | ||
|  | text = "边缘类型" | ||
|  | script = SubResource("GDScript_ilxbw") | ||
|  | 
 | ||
|  | [node name="BorderColor" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"] | ||
|  | layout_mode = 2 | ||
|  | toggle_mode = true | ||
|  | button_group = SubResource("ButtonGroup_pv7fp") | ||
|  | text = "边缘颜色" | ||
|  | script = SubResource("GDScript_a3fsx") | ||
|  | 
 | ||
|  | [node name="SceneAssign" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"] | ||
|  | layout_mode = 2 | ||
|  | toggle_mode = true | ||
|  | button_group = SubResource("ButtonGroup_pv7fp") | ||
|  | text = "场景分配" | ||
|  | script = SubResource("GDScript_p75ne") | ||
|  | 
 | ||
|  | [node name="CustomElements" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"] | ||
|  | layout_mode = 2 | ||
|  | toggle_mode = true | ||
|  | button_group = SubResource("ButtonGroup_pv7fp") | ||
|  | text = "自定义元素" | ||
|  | script = SubResource("GDScript_gb3rf") | ||
|  | 
 | ||
|  | [node name="HSeparator2" type="HSeparator" parent="PanelContainer/ScrollContainer/VBoxContainer"] | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="EditControls" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer"] | ||
|  | layout_mode = 2 | ||
|  | size_flags_vertical = 0 | ||
|  | mouse_filter = 2 | ||
|  | alignment = 2 | ||
|  | metadata/_edit_lock_ = true | ||
|  | 
 | ||
|  | [node name="Symbols" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls"] | ||
|  | unique_name_in_owner = true | ||
|  | visible = false | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="SymbolContainer" type="HFlowContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Symbols"] | ||
|  | unique_name_in_owner = true | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="Borders" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls"] | ||
|  | unique_name_in_owner = true | ||
|  | visible = false | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="BorderContainer" type="HFlowContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Borders"] | ||
|  | unique_name_in_owner = true | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="Groups" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls"] | ||
|  | unique_name_in_owner = true | ||
|  | visible = false | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="Label" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Groups"] | ||
|  | layout_mode = 2 | ||
|  | text = "Group ID" | ||
|  | horizontal_alignment = 1 | ||
|  | 
 | ||
|  | [node name="CurrentGroup" type="SpinBox" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Groups"] | ||
|  | unique_name_in_owner = true | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="Colors" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls"] | ||
|  | unique_name_in_owner = true | ||
|  | visible = false | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="CurrentColor" type="ColorPickerButton" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Colors"] | ||
|  | unique_name_in_owner = true | ||
|  | custom_minimum_size = Vector2(0, 30) | ||
|  | layout_mode = 2 | ||
|  | edit_alpha = false | ||
|  | 
 | ||
|  | [node name="CustomElements" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls"] | ||
|  | unique_name_in_owner = true | ||
|  | visible = false | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/CustomElements"] | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="Label" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/CustomElements/HBoxContainer"] | ||
|  | layout_mode = 2 | ||
|  | text = "Data" | ||
|  | 
 | ||
|  | [node name="CustomData" type="LineEdit" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/CustomElements/HBoxContainer"] | ||
|  | unique_name_in_owner = true | ||
|  | layout_mode = 2 | ||
|  | size_flags_horizontal = 3 | ||
|  | 
 | ||
|  | [node name="NoElements" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/CustomElements"] | ||
|  | unique_name_in_owner = true | ||
|  | layout_mode = 2 | ||
|  | text = "No Custom Elements Registered" | ||
|  | autowrap_mode = 2 | ||
|  | 
 | ||
|  | [node name="CustomElementContainer" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/CustomElements"] | ||
|  | unique_name_in_owner = true | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="Shortcuts" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls"] | ||
|  | unique_name_in_owner = true | ||
|  | layout_mode = 2 | ||
|  | 
 | ||
|  | [node name="ShortcutPick" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Shortcuts"] | ||
|  | unique_name_in_owner = true | ||
|  | layout_mode = 2 | ||
|  | text = "Ctrl+Click: 从地图拾取" | ||
|  | autowrap_mode = 2 | ||
|  | 
 | ||
|  | [node name="Label2" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Shortcuts"] | ||
|  | layout_mode = 2 | ||
|  | text = "Shift+Click: 为整个房间设置" | ||
|  | autowrap_mode = 2 | ||
|  | 
 | ||
|  | [node name="MapOverlay" type="Control" parent="."] | ||
|  | texture_filter = 1 | ||
|  | clip_contents = true | ||
|  | layout_mode = 2 | ||
|  | size_flags_horizontal = 3 | ||
|  | focus_mode = 2 | ||
|  | script = ExtResource("2_w1wnt") | ||
|  | 
 | ||
|  | [node name="ColorRect" type="ColorRect" parent="MapOverlay"] | ||
|  | modulate = Color(0, 0, 0, 0.12549) | ||
|  | show_behind_parent = true | ||
|  | layout_mode = 1 | ||
|  | anchors_preset = 15 | ||
|  | anchor_right = 1.0 | ||
|  | anchor_bottom = 1.0 | ||
|  | grow_horizontal = 2 | ||
|  | grow_vertical = 2 | ||
|  | mouse_filter = 2 | ||
|  | 
 | ||
|  | [node name="Grid" type="Control" parent="MapOverlay"] | ||
|  | unique_name_in_owner = true | ||
|  | show_behind_parent = true | ||
|  | clip_contents = true | ||
|  | layout_mode = 1 | ||
|  | anchors_preset = 15 | ||
|  | anchor_right = 1.0 | ||
|  | anchor_bottom = 1.0 | ||
|  | grow_horizontal = 2 | ||
|  | grow_vertical = 2 | ||
|  | size_flags_horizontal = 3 | ||
|  | mouse_filter = 2 | ||
|  | 
 | ||
|  | [node name="Map" type="Control" parent="MapOverlay"] | ||
|  | unique_name_in_owner = true | ||
|  | show_behind_parent = true | ||
|  | clip_contents = true | ||
|  | layout_mode = 1 | ||
|  | anchors_preset = 15 | ||
|  | anchor_right = 1.0 | ||
|  | anchor_bottom = 1.0 | ||
|  | grow_horizontal = 2 | ||
|  | grow_vertical = 2 | ||
|  | size_flags_horizontal = 3 | ||
|  | mouse_filter = 2 | ||
|  | 
 | ||
|  | [node name="GhostMap" type="Control" parent="MapOverlay"] | ||
|  | unique_name_in_owner = true | ||
|  | modulate = Color(1, 1, 1, 0.12549) | ||
|  | show_behind_parent = true | ||
|  | clip_contents = true | ||
|  | layout_mode = 1 | ||
|  | anchors_preset = 15 | ||
|  | anchor_right = 1.0 | ||
|  | anchor_bottom = 1.0 | ||
|  | grow_horizontal = 2 | ||
|  | grow_vertical = 2 | ||
|  | size_flags_horizontal = 3 | ||
|  | mouse_filter = 2 | ||
|  | 
 | ||
|  | [node name="StatusLabel" type="Label" parent="MapOverlay"] | ||
|  | unique_name_in_owner = true | ||
|  | layout_mode = 0 | ||
|  | offset_right = 1.0 | ||
|  | offset_bottom = 23.0 | ||
|  | theme_override_styles/normal = SubResource("StyleBoxFlat_xiyo8") | ||
|  | vertical_alignment = 1 | ||
|  | 
 | ||
|  | [node name="FileDialog" type="FileDialog" parent="."] | ||
|  | unique_name_in_owner = true | ||
|  | title = "Open a File" | ||
|  | size = Vector2i(345, 162) | ||
|  | ok_button_text = "打开" | ||
|  | file_mode = 0 | ||
|  | filters = PackedStringArray("*.tscn") | ||
|  | 
 | ||
|  | [connection signal="value_changed" from="PanelContainer/ScrollContainer/VBoxContainer/Layer/SpinBox2" to="." method="preview_layer_changed"] | ||
|  | [connection signal="value_changed" from="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Groups/CurrentGroup" to="MapOverlay" method="queue_redraw" unbinds=1] | ||
|  | [connection signal="draw" from="MapOverlay/Grid" to="." method="_on_grid_draw"] | ||
|  | [connection signal="draw" from="MapOverlay/GhostMap" to="." method="_on_ghost_map_draw"] | ||
|  | [connection signal="file_selected" from="FileDialog" to="PanelContainer/ScrollContainer/VBoxContainer/Modes/SceneAssign" method="on_map_selected"] |