diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/FileCompressed.resource_order b/FileCompressed.resource_order new file mode 100644 index 0000000..4b560a2 --- /dev/null +++ b/FileCompressed.resource_order @@ -0,0 +1,6 @@ +{ + "FolderOrderSettings": [ + {"name":"FileCompressed","order":3,"path":"folders/FileCompressed.yy",}, + ], + "ResourceOrderSettings": [], +} \ No newline at end of file diff --git a/FileCompressed.yyp b/FileCompressed.yyp new file mode 100644 index 0000000..6a4c5a7 --- /dev/null +++ b/FileCompressed.yyp @@ -0,0 +1,30 @@ +{ + "resourceType": "GMProject", + "resourceVersion": "1.7", + "name": "FileCompressed", + "AudioGroups": [ + {"resourceType":"GMAudioGroup","resourceVersion":"1.3","name":"audiogroup_default","targets":-1,}, + ], + "configs": { + "children": [], + "name": "Default", + }, + "defaultScriptType": 1, + "Folders": [ + {"resourceType":"GMFolder","resourceVersion":"1.0","name":"FileCompressed","folderPath":"folders/FileCompressed.yy",}, + ], + "IncludedFiles": [], + "isEcma": false, + "LibraryEmitters": [], + "MetaData": { + "IDEVersion": "2023.8.2.108", + }, + "resources": [ + {"id":{"name":"__file_compressed","path":"scripts/__file_compressed/__file_compressed.yy",},}, + ], + "RoomOrderNodes": [], + "templateType": "game", + "TextureGroups": [ + {"resourceType":"GMTextureGroup","resourceVersion":"1.3","name":"Default","autocrop":true,"border":2,"compressFormat":"bz2","directory":"","groupParent":null,"isScaled":true,"loadType":"default","mipsToGenerate":0,"targets":-1,}, + ], +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fdddb29 --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/README.md b/README.md new file mode 100644 index 0000000..b78b034 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# FileCompressed +
+ Repo size + Stars + GitHub all releases + GitHub +
+ +Simple and ready to use GameMaker functions for saving/loading structs into binary-like files using buffers. Released for public domain under the [Unlicense](./LICENSE), credit is good but not mandatory :) + +## How to install +- [Download the .yymps](https://github.com/AntikoreDev/file-compressed) +- Drag it into your project +- Include the script into your project. + +## Contributing +Feel free to open pull requests to improve the functions, however I'm not planning into doing any big additions soon. +Commit names should be using [Gitmoji](https://gitmoji.dev/) emoji standard + +## Donating +If you want to support me, you can just buy me a coffee + +[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/P5P7827IB) \ No newline at end of file diff --git a/options/android/options_android.yy b/options/android/options_android.yy new file mode 100644 index 0000000..8ceeb2e --- /dev/null +++ b/options/android/options_android.yy @@ -0,0 +1,79 @@ +{ + "resourceType": "GMAndroidOptions", + "resourceVersion": "1.0", + "name": "Android", + "option_android_application_tag_inject": "", + "option_android_arch_arm64": true, + "option_android_arch_armv7": false, + "option_android_arch_x86_64": false, + "option_android_attribute_allow_backup": false, + "option_android_build_tools": "", + "option_android_compile_sdk": "", + "option_android_device_support": 0, + "option_android_display_name": "Created with GameMaker", + "option_android_facebook_app_display_name": "", + "option_android_facebook_id": "", + "option_android_gamepad_support": true, + "option_android_google_apk_expansion": false, + "option_android_google_cloud_saving": false, + "option_android_google_dynamic_asset_delivery": false, + "option_android_google_licensing_public_key": "", + "option_android_google_services_app_id": "", + "option_android_icon_adaptive_generate": false, + "option_android_icon_adaptive_hdpi": "${base_options_dir}/android/icons_adaptive/hdpi.png", + "option_android_icon_adaptive_ldpi": "${base_options_dir}/android/icons_adaptive/ldpi.png", + "option_android_icon_adaptive_mdpi": "${base_options_dir}/android/icons_adaptive/mdpi.png", + "option_android_icon_adaptive_xhdpi": "${base_options_dir}/android/icons_adaptive/xhdpi.png", + "option_android_icon_adaptive_xxhdpi": "${base_options_dir}/android/icons_adaptive/xxhdpi.png", + "option_android_icon_adaptive_xxxhdpi": "${base_options_dir}/android/icons_adaptive/xxxhdpi.png", + "option_android_icon_adaptivebg_hdpi": "${base_options_dir}/android/icons_adaptivebg/hdpi.png", + "option_android_icon_adaptivebg_ldpi": "${base_options_dir}/android/icons_adaptivebg/ldpi.png", + "option_android_icon_adaptivebg_mdpi": "${base_options_dir}/android/icons_adaptivebg/mdpi.png", + "option_android_icon_adaptivebg_xhdpi": "${base_options_dir}/android/icons_adaptivebg/xhdpi.png", + "option_android_icon_adaptivebg_xxhdpi": "${base_options_dir}/android/icons_adaptivebg/xxhdpi.png", + "option_android_icon_adaptivebg_xxxhdpi": "${base_options_dir}/android/icons_adaptivebg/xxxhdpi.png", + "option_android_icon_hdpi": "${base_options_dir}/android/icons/hdpi.png", + "option_android_icon_ldpi": "${base_options_dir}/android/icons/ldpi.png", + "option_android_icon_mdpi": "${base_options_dir}/android/icons/mdpi.png", + "option_android_icon_xhdpi": "${base_options_dir}/android/icons/xhdpi.png", + "option_android_icon_xxhdpi": "${base_options_dir}/android/icons/xxhdpi.png", + "option_android_icon_xxxhdpi": "${base_options_dir}/android/icons/xxxhdpi.png", + "option_android_install_location": 0, + "option_android_interpolate_pixels": false, + "option_android_launchscreen_fill": 0, + "option_android_lint": false, + "option_android_logcat": "yoyo:V DEBUG:V AndroidRuntime:V", + "option_android_minimum_sdk": "", + "option_android_orient_landscape": true, + "option_android_orient_landscape_flipped": true, + "option_android_orient_portrait": true, + "option_android_orient_portrait_flipped": true, + "option_android_package_company": "company", + "option_android_package_domain": "com", + "option_android_package_product": "game", + "option_android_permission_bluetooth": true, + "option_android_permission_internet": true, + "option_android_permission_network_state": false, + "option_android_permission_read_phone_state": false, + "option_android_permission_record_audio": false, + "option_android_permission_write_external_storage": false, + "option_android_proguard_minifying": false, + "option_android_proguard_shrinking": false, + "option_android_scale": 0, + "option_android_screen_depth": 0, + "option_android_sleep_margin": 4, + "option_android_splash_screens_landscape": "${base_options_dir}/android/splash/landscape.png", + "option_android_splash_screens_portrait": "${base_options_dir}/android/splash/portrait.png", + "option_android_splash_time": 0, + "option_android_splashscreen_background_colour": 255, + "option_android_support_lib": "", + "option_android_sync_amazon": false, + "option_android_target_sdk": "", + "option_android_texture_page": "2048x2048", + "option_android_tools_from_version": false, + "option_android_tv_banner": "${base_options_dir}/android/tv_banner.png", + "option_android_tv_isgame": true, + "option_android_tv_supports_leanback": true, + "option_android_use_facebook": false, + "option_android_version": "1.0.0.0", +} \ No newline at end of file diff --git a/options/ios/options_ios.yy b/options/ios/options_ios.yy new file mode 100644 index 0000000..382c05f --- /dev/null +++ b/options/ios/options_ios.yy @@ -0,0 +1,46 @@ +{ + "resourceType": "GMiOSOptions", + "resourceVersion": "1.3", + "name": "iOS", + "option_ios_bundle_name": "com.company.game", + "option_ios_cocoapods_checkbox": true, + "option_ios_defer_home_indicator": false, + "option_ios_devices": 2, + "option_ios_display_name": "Created with GameMaker", + "option_ios_half_ipad1_textures": false, + "option_ios_icon_ipad_app_152": "${base_options_dir}/ios/icons/app/ipad_152.png", + "option_ios_icon_ipad_app_76": "${base_options_dir}/ios/icons/app/ipad_76.png", + "option_ios_icon_ipad_notification_20": "${base_options_dir}/ios/icons/notification/ipad_20.png", + "option_ios_icon_ipad_notification_40": "${base_options_dir}/ios/icons/notification/ipad_40.png", + "option_ios_icon_ipad_pro_app_167": "${base_options_dir}/ios/icons/app/ipad_pro_167.png", + "option_ios_icon_ipad_settings_29": "${base_options_dir}/ios/icons/settings/ipad_29.png", + "option_ios_icon_ipad_settings_58": "${base_options_dir}/ios/icons/settings/ipad_58.png", + "option_ios_icon_ipad_spotlight_40": "${base_options_dir}/ios/icons/spotlight/ipad_40.png", + "option_ios_icon_ipad_spotlight_80": "${base_options_dir}/ios/icons/spotlight/ipad_80.png", + "option_ios_icon_iphone_app_120": "${base_options_dir}/ios/icons/app/iphone_120.png", + "option_ios_icon_iphone_app_180": "${base_options_dir}/ios/icons/app/iphone_180.png", + "option_ios_icon_iphone_notification_40": "${base_options_dir}/ios/icons/notification/iphone_40.png", + "option_ios_icon_iphone_notification_60": "${base_options_dir}/ios/icons/notification/iphone_60.png", + "option_ios_icon_iphone_settings_58": "${base_options_dir}/ios/icons/settings/iphone_58.png", + "option_ios_icon_iphone_settings_87": "${base_options_dir}/ios/icons/settings/iphone_87.png", + "option_ios_icon_iphone_spotlight_120": "${base_options_dir}/ios/icons/spotlight/iphone_120.png", + "option_ios_icon_iphone_spotlight_80": "${base_options_dir}/ios/icons/spotlight/iphone_80.png", + "option_ios_icon_itunes_artwork_1024": "${base_options_dir}/ios/icons/itunes/itunes_1024.png", + "option_ios_interpolate_pixels": false, + "option_ios_launchscreen_fill": 0, + "option_ios_launchscreen_image": "${base_options_dir}/ios/splash/launchscreen.png", + "option_ios_launchscreen_image_landscape": "${base_options_dir}/ios/splash/launchscreen-landscape.png", + "option_ios_min_version": "10.0", + "option_ios_orientation_landscape": true, + "option_ios_orientation_landscape_flipped": true, + "option_ios_orientation_portrait": true, + "option_ios_orientation_portrait_flipped": true, + "option_ios_output_dir": "~/gamemakerstudio2", + "option_ios_podfile_lock_path": "${options_dir}/ios/Podfile.lock", + "option_ios_podfile_path": "${options_dir}/ios/Podfile", + "option_ios_scale": 0, + "option_ios_splashscreen_background_colour": 255, + "option_ios_team_id": "", + "option_ios_texture_page": "2048x2048", + "option_ios_version": "1.0.0.0", +} \ No newline at end of file diff --git a/options/linux/options_linux.yy b/options/linux/options_linux.yy new file mode 100644 index 0000000..b6c5a50 --- /dev/null +++ b/options/linux/options_linux.yy @@ -0,0 +1,24 @@ +{ + "resourceType": "GMLinuxOptions", + "resourceVersion": "1.0", + "name": "Linux", + "option_linux_allow_fullscreen": false, + "option_linux_disable_sandbox": false, + "option_linux_display_cursor": true, + "option_linux_display_name": "Created with GameMaker", + "option_linux_display_splash": false, + "option_linux_enable_steam": false, + "option_linux_homepage": "http://www.yoyogames.com", + "option_linux_icon": "${base_options_dir}/linux/icons/64.png", + "option_linux_interpolate_pixels": true, + "option_linux_long_desc": "", + "option_linux_maintainer_email": "", + "option_linux_resize_window": false, + "option_linux_scale": 0, + "option_linux_short_desc": "", + "option_linux_splash_screen": "${base_options_dir}/linux/splash/splash.png", + "option_linux_start_fullscreen": false, + "option_linux_sync": false, + "option_linux_texture_page": "2048x2048", + "option_linux_version": "1.0.0.0", +} \ No newline at end of file diff --git a/options/mac/options_mac.yy b/options/mac/options_mac.yy new file mode 100644 index 0000000..3d2d171 --- /dev/null +++ b/options/mac/options_mac.yy @@ -0,0 +1,35 @@ +{ + "resourceType": "GMMacOptions", + "resourceVersion": "1.0", + "name": "macOS", + "option_mac_allow_fullscreen": false, + "option_mac_allow_incoming_network": false, + "option_mac_allow_outgoing_network": false, + "option_mac_app_category": "Games", + "option_mac_app_id": "com.company.game", + "option_mac_apple_sign_in": false, + "option_mac_arm64": true, + "option_mac_build_app_store": false, + "option_mac_copyright": "", + "option_mac_disable_sandbox": false, + "option_mac_display_cursor": true, + "option_mac_display_name": "Created with GameMaker", + "option_mac_enable_retina": false, + "option_mac_enable_steam": false, + "option_mac_icon_png": "${base_options_dir}/mac/icons/1024.png", + "option_mac_installer_background_png": "${base_options_dir}/mac/splash/installer_background.png", + "option_mac_interpolate_pixels": true, + "option_mac_menu_dock": false, + "option_mac_min_version": "10.10", + "option_mac_output_dir": "~/gamemakerstudio2", + "option_mac_resize_window": false, + "option_mac_scale": 0, + "option_mac_signing_identity": "Developer ID Application:", + "option_mac_splash_png": "${base_options_dir}/mac/splash/splash.png", + "option_mac_start_fullscreen": false, + "option_mac_team_id": "", + "option_mac_texture_page": "2048x2048", + "option_mac_version": "1.0.0.0", + "option_mac_vsync": false, + "option_mac_x86_64": true, +} \ No newline at end of file diff --git a/options/main/options_main.yy b/options/main/options_main.yy new file mode 100644 index 0000000..e1d639a --- /dev/null +++ b/options/main/options_main.yy @@ -0,0 +1,20 @@ +{ + "resourceType": "GMMainOptions", + "resourceVersion": "1.4", + "name": "Main", + "option_author": "", + "option_collision_compatibility": false, + "option_copy_on_write_enabled": false, + "option_draw_colour": 4294967295, + "option_game_speed": 60, + "option_gameguid": "a7aadbc1-ff1c-4518-aad0-99dace2336f7", + "option_gameid": "0", + "option_mips_for_3d_textures": false, + "option_sci_usesci": false, + "option_spine_licence": false, + "option_steam_app_id": "0", + "option_template_description": null, + "option_template_icon": "${base_options_dir}/main/template_icon.png", + "option_template_image": "${base_options_dir}/main/template_image.png", + "option_window_colour": 255, +} \ No newline at end of file diff --git a/options/operagx/options_operagx.yy b/options/operagx/options_operagx.yy new file mode 100644 index 0000000..9d6b5a0 --- /dev/null +++ b/options/operagx/options_operagx.yy @@ -0,0 +1,27 @@ +{ + "resourceType": "GMOperaGXOptions", + "resourceVersion": "1.1", + "name": "operagx", + "option_operagx_display_cursor": true, + "option_operagx_editUrl": "", + "option_operagx_game_name": "${project_name}", + "option_operagx_guid": "", + "option_operagx_internalShareUrl": "", + "option_operagx_interpolate_pixels": true, + "option_operagx_mod_editUrl": "", + "option_operagx_mod_game_name": "${project_name}", + "option_operagx_mod_guid": "", + "option_operagx_mod_internalShareUrl": "", + "option_operagx_mod_next_version": "1.0.0.0", + "option_operagx_mod_publicShareUrl": "", + "option_operagx_mod_team_id": "", + "option_operagx_mod_team_name": "", + "option_operagx_mod_version": "1.0.0.0", + "option_operagx_next_version": "1.0.0.0", + "option_operagx_publicShareUrl": "", + "option_operagx_scale": 0, + "option_operagx_team_id": "", + "option_operagx_team_name": "", + "option_operagx_texture_page": "2048x2048", + "option_operagx_version": "1.0.0.0", +} \ No newline at end of file diff --git a/options/windows/options_windows.yy b/options/windows/options_windows.yy new file mode 100644 index 0000000..0321be2 --- /dev/null +++ b/options/windows/options_windows.yy @@ -0,0 +1,34 @@ +{ + "resourceType": "GMWindowsOptions", + "resourceVersion": "1.1", + "name": "Windows", + "option_windows_allow_fullscreen_switching": false, + "option_windows_borderless": false, + "option_windows_company_info": "YoYo Games Ltd", + "option_windows_copy_exe_to_dest": false, + "option_windows_copyright_info": "", + "option_windows_description_info": "A GameMaker Game", + "option_windows_disable_sandbox": false, + "option_windows_display_cursor": true, + "option_windows_display_name": "Created with GameMaker", + "option_windows_enable_steam": false, + "option_windows_executable_name": "${project_name}.exe", + "option_windows_icon": "${base_options_dir}/windows/icons/icon.ico", + "option_windows_installer_finished": "${base_options_dir}/windows/installer/finished.bmp", + "option_windows_installer_header": "${base_options_dir}/windows/installer/header.bmp", + "option_windows_interpolate_pixels": false, + "option_windows_license": "${base_options_dir}/windows/installer/license.txt", + "option_windows_nsis_file": "${base_options_dir}/windows/installer/nsis_script.nsi", + "option_windows_product_info": "Created with GameMaker", + "option_windows_resize_window": false, + "option_windows_save_location": 0, + "option_windows_scale": 0, + "option_windows_sleep_margin": 10, + "option_windows_splash_screen": "${base_options_dir}/windows/splash/splash.png", + "option_windows_start_fullscreen": false, + "option_windows_steam_use_alternative_launcher": false, + "option_windows_texture_page": "2048x2048", + "option_windows_use_splash": false, + "option_windows_version": "1.0.0.0", + "option_windows_vsync": false, +} \ No newline at end of file diff --git a/scripts/__file_compressed/__file_compressed.gml b/scripts/__file_compressed/__file_compressed.gml new file mode 100644 index 0000000..1e101bc --- /dev/null +++ b/scripts/__file_compressed/__file_compressed.gml @@ -0,0 +1,174 @@ +/* +# =================================================================== # +FileCompressed - By AntikoreDev +Save and load structs into binary-like files using buffers. +Available on Github at https://github.com/AntikoreDev/file-compressed +# =================================================================== # +*/ + +/** + * @desc Loads the struct from a file saved previously with `file_compressed_save` + * + * @arg {string} filename Name of the file to load + * @arg {any} default Value to return if loaded unsucessfully, defaults to undefined + * + * @return {struct} JSON containing the data from the file or default if couldn't load correctly + */ + +function file_compressed_load(_filename, _default = undefined){ + + var _data_buffer = buffer_load(_filename); + if (_data_buffer < 0) + return _default; + + var _uncompressed_buffer = buffer_decompress(_data_buffer); + if (_uncompressed_buffer < 0){ + buffer_delete(_data_buffer); + return _default; + } + + var _data_string = buffer_read(_uncompressed_buffer, buffer_string); + + buffer_delete(_uncompressed_buffer); + buffer_delete(_data_buffer); + + var _data = _default; + try { + _data = json_parse(_data_string); + } catch (e) {} + + return _data; +} + +/** + * @desc Asynchronously loads the struct from a file saved previously with `file_compressed_save` + * + * @arg {string} filename Path to the file + * + * @return {struct} Async Even ID `event_id` and buffer object `buffer` to parse with `file_compressed_load_parse` + */ + +function file_compressed_load_async(_filename){ + + var _data_buffer = buffer_create(16, buffer_grow, 1); + var _event_id = buffer_load_async(_data_buffer, _filename, 0, -1); + + return { + event_id: _event_id, + buffer: _data_buffer + }; +} + +/** + * @desc Parses the data from a buffer loaded with `file_compressed_load_async` and converts it to an struct + * + * @arg {real} buffer Buffer ID to parse + * @arg {any} default Value to return if loaded unsucessfully, defaults to undefined + * + * @return {struct} JSON containing the data from the buffer or default if couldn't load correctly + */ + +function file_compressed_load_parse(_buffer, _default = undefined){ + + if (!buffer_exists(_buffer)) + return _default; + + var _uncompressed_buffer = buffer_decompress(_buffer); + if (_uncompressed_buffer < 0){ + buffer_delete(_buffer); + return _default; + } + + var _data_string = buffer_read(_uncompressed_buffer, buffer_string); + + buffer_delete(_uncompressed_buffer); + buffer_delete(_buffer); + + var _data = _default; + try { + _data = json_parse(_data_string); + } catch (e) {} + + return _data; +} + +/** + * @desc Saves a json struct into the chosen filename as compressed data. + * + * @arg {string} filename The file to save the file to + * @arg {struct} data The json data to save onto the file + * + * @return {boolean} true if sucess, otherwise false + */ +function file_compressed_save(_filename, _data){ + + var _compressed_buffer = -1; + var _data_buffer = -1; + + var _data_string = ""; + + var _result = false; + + try { + _data_string = json_stringify(_data); + _data_buffer = buffer_create(256, buffer_grow, 1); + + buffer_seek(_data_buffer, buffer_seek_start, 0); + buffer_write(_data_buffer, buffer_string, _data_string); + + _compressed_buffer = buffer_compress(_data_buffer, 0, buffer_tell(_data_buffer)); + buffer_save(_compressed_buffer, _filename); + + buffer_delete(_compressed_buffer); + buffer_delete(_data_buffer); + + _result = true; + + } catch (e) {} + + if (buffer_exists(_compressed_buffer)) + buffer_delete(_compressed_buffer); + + if (buffer_exists(_data_buffer)) + buffer_delete(_data_buffer); + + return _result; +} + +/** + * @desc Asynchronously saves a json struct into the chosen filename as compressed data. + * + * @arg {string} filename The file to save the file to + * @arg {struct} data The json data to save onto the file + * + * @return {real} Async event ID + */ +function file_compressed_save_async(_filename, _data){ + + var _compressed_buffer = -1; + var _data_buffer = -1; + + var _data_string = ""; + + var _event_id = -1; + + try { + _data_string = json_stringify(_data); + _data_buffer = buffer_create(256, buffer_grow, 1); + + buffer_seek(_data_buffer, buffer_seek_start, 0); + buffer_write(_data_buffer, buffer_string, _data_string); + + _compressed_buffer = buffer_compress(_data_buffer, 0, buffer_tell(_data_buffer)); + _event_id = buffer_save_async(_compressed_buffer, _filename, 0, -1); + + } catch (e) {} + + if (buffer_exists(_compressed_buffer)) + buffer_delete(_compressed_buffer); + + if (buffer_exists(_data_buffer)) + buffer_delete(_data_buffer); + + return _event_id; +} \ No newline at end of file diff --git a/scripts/__file_compressed/__file_compressed.yy b/scripts/__file_compressed/__file_compressed.yy new file mode 100644 index 0000000..01475b0 --- /dev/null +++ b/scripts/__file_compressed/__file_compressed.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "__file_compressed", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "FileCompressed", + "path": "folders/FileCompressed.yy", + }, +} \ No newline at end of file