public Array<FreeTypeFontData> verifyFreeTypeFontPaths() {
        Array<FreeTypeFontData> errors = new Array<>();
        
        if (!areResourcesRelative()) {
            for (var font : jsonData.getFreeTypeFonts()) {
                if (font.useCustomSerializer && (font.file == null || !font.file.exists())) {
                    errors.add(font);
                }
            }
        } else {
            FileHandle targetFolder = saveFile.sibling(saveFile.nameWithoutExtension() + "_data/");
            
            for (var font : jsonData.getFreeTypeFonts()) {
                if (font.file != null) {
                    FileHandle localFile = targetFolder.child(font.file.name());
                    if (!localFile.exists()) {
                        errors.add(font);
                    }
                } else if (font.useCustomSerializer) {
                    errors.add(font);
                }
            }
        }
        return errors;
    }
Checks every drawable path for existence. Errors are reported as a list
of DrawableDatas.
@return A list of all DrawableDatas that must have their paths resolved.
Returns an empty list if there are no errors.
core/src/com/ray3k/skincomposer/data/ProjectData.java