July 26Jul 26 Localization Avatar Legends the fighting game uses Paks from what seems like a custom engine I believe since they they contains other files inside them I believe DDS and some other thingssamples are here from air_temple_island.pak https://drive.google.com/drive/folders/1b6K8-WDNQJ0soAJu4PGSlH7SXuo78FPo?usp=sharing Edited July 27Jul 27 by Sirduckdude fixed the misclick
July 27Jul 27 Localization Game was created on the ABARE Engine and uses 256-byte directory records. Kind of similar to Quake's PAK structure that uses 64-byte directory records iirc.I have attached a python script that will extract the content from the archives for you. Please use it as follows:python .\Abare_Engine_PAK.py "path\to\pak\file" -o "path\to\extraction\folder"I have also attached a 010 Editor binary template for those interested.Abare_Engine_PAK.py AvatarLegendsPak.bt Edited July 27Jul 27 by Falkrian
July 27Jul 27 Author Localization 18 minutes ago, Falkrian said:Game was created on the ABARE Engine and uses 256-byte directory records. Kind of similar to Quake's PAK structure that uses 64-byte directory records iirc.I have attached a python script that will extract the content from the archives for you. Please use it as follows:python .\Abare_Engine_PAK.py "path\to\pak\file" -o "path\to\extraction\folder"I have also attached a 010 Editor binary template for those interested.Abare_Engine_PAK.py AvatarLegendsPak.btthanks ! any idea on the fighters though when extracted it gives a munged file
July 27Jul 27 Localization Munged files are a separate issue to look into. There are clear references of PNG images in them. Just a matter of figuring out how to extract them.I have to leave for work now unfortunately, but I will occasionally remote home and try to figure this out. I encourage everyone to have a go at this! Edited July 27Jul 27 by Falkrian
July 27Jul 27 Localization OK. I am getting places. There is some palettized compression (proprietary) going on and some other stuff. I am still figuring things out as I go...Image #1Image #2 Edited July 27Jul 27 by Falkrian
July 27Jul 27 Author Localization 46 minutes ago, Falkrian said:OK. I am getting places. There is some palettized compression (proprietary) going on and some other stuff. I am still figuring things out as I go...Image #1Image #2yea! how are you extracting these images?
July 27Jul 27 Localization I am working on a python script that can fully extract all the images from these files. It is not ready yet, but as soon as it is, it will be released here.
July 27Jul 27 Author Localization 19 minutes ago, Falkrian said:I am working on a python script that can fully extract all the images from these files. It is not ready yet, but as soon as it is, it will be released here.alrighty thank you!
July 27Jul 27 Localization 44 minutes ago, Falkrian said:I am working on a python script that can fully extract all the images from these files. It is not ready yet, but as soon as it is, it will be released here.does the tool support localize as well?
July 27Jul 27 Localization 47 minutes ago, petermike867 said:does the tool support localize as well?There is a pretty big CSV file in there that contains the translation of game text in various languages. It looks like that English, French, Italian, German, Spanish and Brazilian Portuguese are filled in. There are empty rows for Korean, Japanese, Chinese, Simplified Chinese (?), and Russian.First I would like to deliver before possibly moving on to other things like localization.
July 27Jul 27 Localization Solution @Sirduckdude I think I am ready to share the scripts that will get you the data you're after and then some. Please know that the scripts might take a while to complete depending on what switches you're using and the amount of munged files in the initial extraction folder.First it would be good to perform a clean extract of all PAK archive data through pak_extract.py as follows:python .\pak_extract.py "path\to\data_packages" "path\to\extraction\folder"Once everything has been extracted then the actual extracting of the images can begin:# Combination 1: Unpalettized Material Images python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --source-paths --atlas --mask # -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --source-paths --atlas --canvas --mask # Combination 2: Automatic Default Palette python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --source-paths --atlas --mask # -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --source-paths --atlas --canvas --mask # Combination 3: Default Palette With Alternative Alpha Curve python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --alpha-curve --source-paths --atlas --mask # -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --alpha-curve --source-paths --atlas --canvas --mask # Combination 4: Every Available Palette python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --source-paths --atlas --mask # -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --source-paths --atlas --canvas --mask # Combination 5: Every Available Palette With Alternative Alpha Curve python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --alpha-curve --source-paths --atlas --mask # -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --alpha-curve --source-paths --atlas --canvas --maskExplanation of what the switches mean:--auto-palette | Automatically finds the relevant SPRBIN palette --all-palettes | Exports every available colour variant for each type-3 image. Type-6 images are exported once because they already contain final RGBA colours --source-paths | Organizes output using the original source paths embedded in the MUNGED files. --atlas | Adds the reconstructed packed atlas as an .atlas.png. For type 3, this is the unpalettized material data --mask | Extracts companion _mask.munged images separately as .mask.png variants. It does not merge them into the main image --canvas | Places the sprite on its original full-size canvas instead of exporting only the cropped area --alpha-curve | Applies the game shader’s alternative alpha curve to type-3 images, improving some soft edges. It does not affect type-6 images --raw | Exports the original compressed pixel data and related technical files for debugging. This is not needed for extraction Type-3 images are images that use palette and shader data to create the final colours Type-6 images are images that already store RGBA pixels and do not need a paletteHere are some screenshots of the extracted PNG images after running Combination 5 (Excluding --canvas switch) for some time:Please let me know if there are any issues.pak_extract.py munged_extract.pyAvatar-Legends-PAK.bt Edited August 16Aug 16 by Falkrian
July 27Jul 27 Author Localization 1 hour ago, Falkrian said:@Sirduckdude I think I am ready to share the scripts that will get you the data you're after and then some. Please know that the scripts might take a while to complete depending on what switches you're using.First it would be good to perform a clean extract of all PAK archive data through pak_extract.py as follows:python .\pak_extract.py "path\to\data_packages" "path\to\extraction\folder"Once everything has been extracted then the actual extracting of the images can begin. Extraction of the images is done as follows:# Combination 1: Unpalettized Material Images python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --source-paths --atlas --mask python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --source-paths --atlas --canvas --mask # Combination 2: Automatic Default Palette python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --source-paths --atlas --mask python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --source-paths --atlas --canvas --mask # Combination 3: Default Palette With Alternative Alpha Curve python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --alpha-curve --source-paths --atlas --mask python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --alpha-curve --source-paths --atlas --canvas --mask # Combination 4: Every Available Palette python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --source-paths --atlas --mask python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --source-paths --atlas --canvas --mask # Combination 5: Every Available Palette With Alternative Alpha Curve python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --alpha-curve --source-paths --atlas --mask python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --alpha-curve --source-paths --atlas --canvas --maskFor those wanting to know what each switch does:--auto-palette | Automatically finds the relevant SPRBIN palette --all-palettes | Exports every available colour variant for each type-3 image. Type-6 images are exported once because they already contain final RGBA colours --source-paths | Organizes output using the original source paths embedded in the MUNGED files. --atlas | Adds the reconstructed packed atlas as an .atlas.png. For type 3, this is the unpalettized material data --mask | Extracts companion _mask.munged images separately as .mask.png variants. It does not merge them into the main image --canvas | Places the sprite on its original full-size canvas instead of exporting only the cropped area --alpha-curve | Applies the game shader’s alternative alpha curve to type-3 images, improving some soft edges. It does not affect type-6 images --raw | Exports the original compressed pixel data and related technical files for debugging. This is not needed for extraction.Here is a screenshot of running combination 5 :pak_extract.py munged_extract.pyOmg HUGE thanks!1 hour ago, Falkrian said:@Sirduckdude I think I am ready to share the scripts that will get you the data you're after and then some. Please know that the scripts might take a while to complete depending on what switches you're using and the amount of munged files in the initial extraction folder.First it would be good to perform a clean extract of all PAK archive data through pak_extract.py as follows:python .\pak_extract.py "path\to\data_packages" "path\to\extraction\folder"Once everything has been extracted then the actual extracting of the images can begin:# Combination 1: Unpalettized Material Images python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --source-paths --atlas --mask# -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --source-paths --atlas --canvas --mask # Combination 2: Automatic Default Palette python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --source-paths --atlas --mask# -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --source-paths --atlas --canvas --mask # Combination 3: Default Palette With Alternative Alpha Curve python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --alpha-curve --source-paths --atlas --mask# -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --alpha-curve --source-paths --atlas --canvas --mask # Combination 4: Every Available Palette python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --source-paths --atlas --mask# -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --source-paths --atlas --canvas --mask # Combination 5: Every Available Palette With Alternative Alpha Curve python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --alpha-curve --source-paths --atlas --mask# -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --alpha-curve --source-paths --atlas --canvas --maskExplanation of what the switches mean:--auto-palette | Automatically finds the relevant SPRBIN palette --all-palettes | Exports every available colour variant for each type-3 image. Type-6 images are exported once because they already contain final RGBA colours --source-paths | Organizes output using the original source paths embedded in the MUNGED files. --atlas | Adds the reconstructed packed atlas as an .atlas.png. For type 3, this is the unpalettized material data --mask | Extracts companion _mask.munged images separately as .mask.png variants. It does not merge them into the main image --canvas | Places the sprite on its original full-size canvas instead of exporting only the cropped area --alpha-curve | Applies the game shader’s alternative alpha curve to type-3 images, improving some soft edges. It does not affect type-6 images --raw | Exports the original compressed pixel data and related technical files for debugging. This is not needed for extraction Type-3 images are images that use palette and shader data to create the final colours Type-6 images are images that already store RGBA pixels and do not need a paletteHere are some screenshots of the extracted PNG images after running Combination 5 (Excluding --canvas switch) for some time:Please let me know if there are any issues.pak_extract.py munged_extract.pyThank you so much!!
July 27Jul 27 Localization You are very welcome my friend!Please do let me know if there are any issues.
July 27Jul 27 Author Localization 11 minutes ago, Falkrian said:You are very welcome my friend!Please do let me know if there are any issues.alright!
July 27Jul 27 1 hour ago, Falkrian said:You are very welcome my friend!Please do let me know if there are any issues.how do you use the script? like what do you put it into? im sorry if my question sounds stupid im new to modding
July 28Jul 28 Localization 5 hours ago, nuggetman said:how do you use the script? like what do you put it into? im sorry if my question sounds stupid im new to moddingThere are no stupid questions so do not worry.Make sure you've got Python 3.10 or higher installed on your system. You can download Python from the official website. Make sure that Python is added to your PATH environment variables. There is a little checkbox you need to tick during installation.Once installed, open up an instance of Windows PowerShell and follow the instructions in my previous post. 😉
July 28Jul 28 Hiya! So I noticed the script only extracts scripts and sprites, with no support for other files or paths starting with "!src/", only data from "srcdata" paths. Are there plans to extract all other files in working condition? Specifically, the FMOD FSB5 audio and sound files; I did manage to extract those audio files via other methods (from azula.pak in particular), but they do not play in foobar2000/vgmstream whatsoever.Here are some observations I managed to make:- The FSB5 files all have a codec value of 16 (not 0-3 standard FMOD)- Audio data is NOT encrypted (verified entropy, patterns match real audio)- File paths say .ogg, but containers are FSB5- Each file has 1 sample; sizes range from ~10KB to 22KB- Tried AES decryption (from the engine.ini from an early build of the game), XOR, raw PCM, Vorbis - nothing worksDoes anyone have any ideas on what the proper extraction solution might be? Edited July 28Jul 28 by MaxNicoNatsu23 re-wording
July 28Jul 28 Localization Hey,I am still working on adding support for FSB and CTSBIN and some other stuff. Apologies if you were expecting a full dump. I just wanted to post what I had ready yesterday. 😓 Edited July 28Jul 28 by Falkrian
July 28Jul 28 is it possible to recompress the files back to .pak after editing them for the purposes of making mods?
July 28Jul 28 Localization 5 minutes ago, TesterOfTester said:is it possible to recompress the files back to .pak after editing them for the purposes of making mods?The script can be extended with repacking/rebuilding capabilities. It will be added, but I currently have no ETA on when.
July 28Jul 28 2 hours ago, Falkrian said:Hey,I am still working on adding support for FSB and CTSBIN and some other stuff. Apologies if you were expecting a full dump. I just wanted to post what I had ready yesterday. 😓Ayy, thanks for the reply! And yeah, no worries at all; the progress you have already made is a big step forward either way; no rush - whenever you get around to it. 😄I'm more than happy to share all the rough scripts and rough research I did regarding the FSB5 extraction. I also noticed that all FSB5 files have codec=16 (non-standard FMOD), just in case that comes up later. And yeah, your work is deffo appreciated!
July 28Jul 28 Localization The attached script will dump everything that is inside of the .sprbin files. This includes the FSB files. I am cheating a little bit as I am using vgmstream-cli to do the heavy lifting for me. The FSB files are still available raw. Hope you will excuse me. 🥺python .\SPRBIN_Extractor.py "path\to\folder\with\sprbin\files" "path\to\export\folder"Full list of resources this is currently extracting:Audio:Raw FSB filesWAV converted through embedded vgmstream-cliLocalization:CSV files containing game textPalettes:RGBA palette dataPNG palette overviewCSV for individual palette colour valuesTables:Symbols: Named IDs used by the SPRBIN scriptFrames: Main sprite-frame records and source image pathsFrames Extra: Additional values attached to individual framesFrame Placement: Objects or sprite positions associated with framesStates: Animation or behavior-state recordsState Strings: Strings inside of compiled state dataPairs: Pairs of unidentified values stored in the frame and state dataPalette Records: Details about embedded colour palettes and the images that use themDependencies: External asset paths referenced by the SPRBINSPRBIN_Extractor.7z Edited July 28Jul 28 by Falkrian
July 28Jul 28 YOOOOOOOO omg thank you so much!!!1 minute ago, Falkrian said:The attached script will dump everything that is inside of the .sprbin files. This includes the FSB files. I am cheating a little bit as I am using vgmstream-cli to do the heavy lifting for me. The FSB files are still available raw. Hope you will excuse me. 🥺python .\SPRBIN_Extractor.py "path\to\folder\with\sprbin\files" "path\to\export\folder"The remaining .ogg files can be found after extracting the .pak files through pak_extract.py.SPRBIN_Extractor.7z
July 28Jul 28 On 7/27/2026 at 3:32 PM, Falkrian said:@Sirduckdude I think I am ready to share the scripts that will get you the data you're after and then some. Please know that the scripts might take a while to complete depending on what switches you're using and the amount of munged files in the initial extraction folder.First it would be good to perform a clean extract of all PAK archive data through pak_extract.py as follows:python .\pak_extract.py "path\to\data_packages" "path\to\extraction\folder"Once everything has been extracted then the actual extracting of the images can begin:# Combination 1: Unpalettized Material Images python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --source-paths --atlas --mask# -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --source-paths --atlas --canvas --mask # Combination 2: Automatic Default Palette python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --source-paths --atlas --mask# -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --source-paths --atlas --canvas --mask # Combination 3: Default Palette With Alternative Alpha Curve python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --alpha-curve --source-paths --atlas --mask# -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --auto-palette --alpha-curve --source-paths --atlas --canvas --mask # Combination 4: Every Available Palette python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --source-paths --atlas --mask# -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --source-paths --atlas --canvas --mask # Combination 5: Every Available Palette With Alternative Alpha Curve python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --alpha-curve --source-paths --atlas --mask# -- OR -- python .\munged_extract.py "path\to\step_one\extraction\folder" "path\to\destination\folder" --all-palettes --alpha-curve --source-paths --atlas --canvas --maskExplanation of what the switches mean:--auto-palette | Automatically finds the relevant SPRBIN palette --all-palettes | Exports every available colour variant for each type-3 image. Type-6 images are exported once because they already contain final RGBA colours --source-paths | Organizes output using the original source paths embedded in the MUNGED files. --atlas | Adds the reconstructed packed atlas as an .atlas.png. For type 3, this is the unpalettized material data --mask | Extracts companion _mask.munged images separately as .mask.png variants. It does not merge them into the main image --canvas | Places the sprite on its original full-size canvas instead of exporting only the cropped area --alpha-curve | Applies the game shader’s alternative alpha curve to type-3 images, improving some soft edges. It does not affect type-6 images --raw | Exports the original compressed pixel data and related technical files for debugging. This is not needed for extraction Type-3 images are images that use palette and shader data to create the final colours Type-6 images are images that already store RGBA pixels and do not need a paletteHere are some screenshots of the extracted PNG images after running Combination 5 (Excluding --canvas switch) for some time:Please let me know if there are any issues.pak_extract.py munged_extract.pythis is what im suppose to do right? or am i missing something?
July 28Jul 28 Localization Just now, nuggetman said:this is what im suppose to do right? or am i missing something?Put both paths in between "" and you should be golden.
Create an account or sign in to comment