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
		
	
| [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"]
 |