forked from newt/gmtk-2024
143 lines
4 KiB
GDScript
143 lines
4 KiB
GDScript
@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)
|