mirror of
				https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
				synced 2025-10-31 11:49:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			154 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
| @tool
 | |
| extends Window
 | |
| 
 | |
| 
 | |
| signal mod_dir_created
 | |
| 
 | |
| const DIR_NAME_DEFAULT_TEMPLATE = "default"
 | |
| const DIR_NAME_MINIMAL_TEMPLATE = "minimal"
 | |
| 
 | |
| @onready var mod_tool_store: ModToolStore = get_node_or_null("/root/ModToolStore")
 | |
| @onready var mod_namespace: ModToolInterfaceInputString = $"%Namespace"
 | |
| @onready var mod_name: ModToolInterfaceInputString = $"%ModName"
 | |
| @onready var mod_id: ModToolInterfaceInputString = $"%ModId"
 | |
| @onready var mod_template: ModToolInterfaceInputOptions = $"%ModTemplate"
 | |
| 
 | |
| 
 | |
| func _ready() -> void:
 | |
| 	mod_namespace.show_error_if_not(false)
 | |
| 	mod_name.show_error_if_not(false)
 | |
| 	mod_id.show_error_if_not(false)
 | |
| 
 | |
| 
 | |
| func add_mod() -> void:
 | |
| 	# Validate mod-id
 | |
| 	if not mod_tool_store.manifest_data.is_mod_id_valid(mod_tool_store.name_mod_dir, mod_tool_store.name_mod_dir, "", true):
 | |
| 		ModToolUtils.output_error('Invalid name or namespace: "%s". You may only use letters, numbers, underscores and at least 3 characters for each.' % mod_tool_store.name_mod_dir)
 | |
| 		return
 | |
| 
 | |
| 	# Check if mod dir exists
 | |
| 	if not _ModLoaderFile.dir_exists(mod_tool_store.path_mod_dir):
 | |
| 		# If not - create it
 | |
| 		var success := ModToolUtils.make_dir_recursive(mod_tool_store.path_mod_dir)
 | |
| 		if not success:
 | |
| 			return
 | |
| 
 | |
| 		# Get Template files
 | |
| 		var template_paths := ModToolUtils.get_flat_view_dict(mod_tool_store.path_current_template_dir, "", [], false, true)
 | |
| 
 | |
| 		# Copy current selected template dir files and folders to res://mods-unpacked
 | |
| 		for path in template_paths:
 | |
| 			var template_local_path := path.trim_prefix(mod_tool_store.path_current_template_dir) as String
 | |
| 			if _ModLoaderFile.file_exists(path):
 | |
| 				ModToolUtils.file_copy(path, mod_tool_store.path_mod_dir.path_join(template_local_path))
 | |
| 			else:
 | |
| 				ModToolUtils.make_dir_recursive(mod_tool_store.path_mod_dir.path_join(template_local_path))
 | |
| 
 | |
| 		# Update FileSystem
 | |
| 		mod_tool_store.editor_file_system.scan()
 | |
| 		# Wait for the scan to finish
 | |
| 		await mod_tool_store.editor_file_system.filesystem_changed
 | |
| 
 | |
| 		# Navigate to the new mod dir in the FileSystem pannel
 | |
| 		EditorInterface.get_file_system_dock().navigate_to_path(mod_tool_store.path_mod_dir.path_join("mod_main.gd"))
 | |
| 
 | |
| 		# Output info
 | |
| 		ModToolUtils.output_info("Added base mod files to " + mod_tool_store.path_mod_dir)
 | |
| 
 | |
| 		# Open mod_main.gd in the code editor
 | |
| 		var mod_main_script := load(mod_tool_store.path_mod_dir.path_join("mod_main.gd"))
 | |
| 		EditorInterface.edit_script(mod_main_script)
 | |
| 		EditorInterface.set_main_screen_editor("Script")
 | |
| 
 | |
| 		# Split the new mod id
 | |
| 		var name_mod_dir_split: Array = mod_tool_store.name_mod_dir.split("-")
 | |
| 
 | |
| 		# Update the namespace in the manifest
 | |
| 		mod_tool_store.manifest_data.mod_namespace = name_mod_dir_split[0]
 | |
| 
 | |
| 		# Update the mod name in the manifest
 | |
| 		mod_tool_store.manifest_data.name = name_mod_dir_split[1]
 | |
| 
 | |
| 		# Update manifest editor ui
 | |
| 		mod_tool_store.editor_plugin.tools_panel.manifest_editor.update_ui()
 | |
| 
 | |
| 		# Open manifest editor
 | |
| 		mod_tool_store.editor_plugin.tools_panel.show_manifest_editor()
 | |
| 
 | |
| 		# Save the manifest
 | |
| 		mod_tool_store.editor_plugin.tools_panel.manifest_editor.save_manifest()
 | |
| 
 | |
| 	else:
 | |
| 		# If so - show error and ask if user wants to connect with the mod instead
 | |
| 		ModToolUtils.output_error("Mod directory at %s already exists." % mod_tool_store.path_mod_dir)
 | |
| 		# TODO: Ask user to connect with the mod instead
 | |
| 		return
 | |
| 
 | |
| 
 | |
| func clear_mod_id_input() -> void:
 | |
| 	mod_id.input_text = ""
 | |
| 
 | |
| 
 | |
| func get_template_options() -> Array[String]:
 | |
| 	var mod_template_options: Array[String] = []
 | |
| 
 | |
| 	var template_dirs := _ModLoaderPath.get_dir_paths_in_dir(mod_tool_store.PATH_TEMPLATES_DIR)
 | |
| 
 | |
| 	# Add the default templates
 | |
| 	mod_template_options.push_back(DIR_NAME_DEFAULT_TEMPLATE)
 | |
| 	mod_template_options.push_back(DIR_NAME_MINIMAL_TEMPLATE)
 | |
| 
 | |
| 	for template_dir in template_dirs:
 | |
| 		var template_dir_name: String = template_dir.split("/")[-1]
 | |
| 
 | |
| 		# Skip if its one of the default templates
 | |
| 		if (
 | |
| 			template_dir_name == DIR_NAME_DEFAULT_TEMPLATE or
 | |
| 			template_dir_name == DIR_NAME_MINIMAL_TEMPLATE
 | |
| 		):
 | |
| 			continue
 | |
| 
 | |
| 		# Add all the custom templates
 | |
| 		mod_template_options.push_back(template_dir_name)
 | |
| 
 | |
| 	return mod_template_options
 | |
| 
 | |
| 
 | |
| func _on_Namespace_value_changed(new_value: String, input_node: ModToolInterfaceInputString) -> void:
 | |
| 	input_node.validate(mod_tool_store.manifest_data.is_name_or_namespace_valid(new_value, true))
 | |
| 	mod_id.input_text = "%s-%s" % [mod_namespace.get_input_value(), mod_name.get_input_value()]
 | |
| 
 | |
| 
 | |
| func _on_ModName_value_changed(new_value: String, input_node: ModToolInterfaceInputString) -> void:
 | |
| 	input_node.validate(mod_tool_store.manifest_data.is_name_or_namespace_valid(new_value, true))
 | |
| 	mod_id.input_text = "%s-%s" % [mod_namespace.get_input_value(), mod_name.get_input_value()]
 | |
| 
 | |
| 
 | |
| func _on_ModId_value_changed(new_value: String, input_node: ModToolInterfaceInputString) -> void:
 | |
| 	input_node.validate(mod_tool_store.manifest_data.is_mod_id_valid(new_value, new_value, "", true))
 | |
| 	mod_tool_store.name_mod_dir = new_value
 | |
| 
 | |
| 
 | |
| func _on_btn_create_mod_pressed() -> void:
 | |
| 	add_mod()
 | |
| 	emit_signal("mod_dir_created")
 | |
| 
 | |
| 
 | |
| func _on_CreateMod_about_to_show() -> void:
 | |
| 	# Reset Inputs
 | |
| 	mod_namespace.input_text = ""
 | |
| 	mod_name.input_text = ""
 | |
| 	# Reset Template
 | |
| 	mod_tool_store.path_current_template_dir = mod_tool_store.PATH_TEMPLATES_DIR + "default"
 | |
| 
 | |
| 	# Get all Template options
 | |
| 	mod_template.input_options = get_template_options()
 | |
| 
 | |
| 
 | |
| func _on_ModTemplate_value_changed(new_value: String, input_node: ModToolInterfaceInputOptions) -> void:
 | |
| 	mod_tool_store.path_current_template_dir = mod_tool_store.PATH_TEMPLATES_DIR + new_value
 | |
| 
 | |
| 
 | |
| func _on_close_requested() -> void:
 | |
| 	hide()
 | 
