gmtk-2024/addons/AsepriteWizard/aseprite/file_exporter.gd

144 lines
4 KiB
GDScript3
Raw Normal View History

2024-08-17 14:22:33 +00:00
@tool
extends RefCounted
var result_code = preload("../config/result_codes.gd")
var _aseprite = preload("aseprite.gd").new()
enum {
FILE_EXPORT_MODE,
LAYERS_EXPORT_MODE
}
##
## Generate Aseprite spritesheet and data files for source.
##
## Options:
## output_folder (string)
## output_filename (string, optional)
## export_mode (FILE_EXPORT_MODE, LAYERS_EXPORT_MODE) default: FILE_EXPORT_MODE
## exception_pattern (string, optional)
## only_visible_layers (boolean, optional)
##
## Return:
## Array
## Dictionary
## sprite_sheet: sprite sheet path
## data_file: json file path
##
func generate_aseprite_files(source_file: String, options: Dictionary):
var check = _initial_checks(source_file, options)
if check != result_code.SUCCESS:
return result_code.error(check)
match options.get('export_mode', FILE_EXPORT_MODE):
FILE_EXPORT_MODE:
var output = _aseprite.export_file(source_file, options.output_folder, options)
if output.is_empty():
return result_code.error(result_code.ERR_ASEPRITE_EXPORT_FAILED)
return result_code.result([output])
LAYERS_EXPORT_MODE:
var output = _aseprite.export_layers(source_file, options.output_folder, options)
if output.is_empty():
return result_code.error(result_code.ERR_NO_VALID_LAYERS_FOUND)
return result_code.result(output)
_:
return result_code.error(result_code.ERR_UNKNOWN_EXPORT_MODE)
##
## Generate Aseprite spritesheet and data file for source.
##
## Options:
## output_folder (string)
## output_filename (string, optional)
## layer (string, optional)
## exception_pattern (string, optional)
## only_visible_layers (boolean, optional)
##
## Return:
## Dictionary
## sprite_sheet: sprite sheet path
## data_file: json file path
##
func generate_aseprite_file(source_file: String, options: Dictionary) -> Dictionary:
var check = _initial_checks(source_file, options)
if check != result_code.SUCCESS:
return result_code.error(check)
var output
if options.get("layer", "") == "":
output = _aseprite.export_file(source_file, options.output_folder, options)
else:
output = _aseprite.export_layer(source_file, options.layer, options.output_folder, options)
if output.is_empty():
return result_code.error(result_code.ERR_ASEPRITE_EXPORT_FAILED)
return result_code.result(output)
##
## Generate a spritesheet with all tilesets in the file
##
## Options:
## exception_pattern (string)
## only_visible_layers (boolean)
## output_filename (string)
## output_folder (string)
##
## Return:
## Dictionary
## sprite_sheet: sprite sheet path
## data_file: json file path
##
func generate_tileset_files(source_file: String, options = {}) -> Dictionary:
var check = _initial_checks(source_file, options)
if check != result_code.SUCCESS:
return result_code.error(check)
var output = _aseprite.export_tileset_texture(source_file, options.output_folder, options)
if output.is_empty():
return result_code.error(result_code.ERR_ASEPRITE_EXPORT_FAILED)
return result_code.result(output)
##
## Perform initial source file and output folder checks
##
func _initial_checks(source: String, options: Dictionary) -> int:
if not _aseprite.test_command():
return result_code.ERR_ASEPRITE_CMD_NOT_FOUND
if not FileAccess.file_exists(source):
return result_code.ERR_SOURCE_FILE_NOT_FOUND
if not DirAccess.dir_exists_absolute(options.output_folder):
return result_code.ERR_OUTPUT_FOLDER_NOT_FOUND
return result_code.SUCCESS
##
## Load Aseprite source data file and fails if the
## content is not valid
##
func load_json_content(source_file: String) -> Dictionary:
var file = FileAccess.open(source_file, FileAccess.READ)
if file == null:
return result_code.error(FileAccess.get_open_error())
var test_json_conv = JSON.new()
test_json_conv.parse(file.get_as_text())
var content = test_json_conv.get_data()
if not _aseprite.is_valid_spritesheet(content):
return result_code.error(result_code.ERR_INVALID_ASEPRITE_SPRITESHEET)
return result_code.result(content)