Skip to content

Commit

Permalink
Option to dump info
Browse files Browse the repository at this point in the history
  • Loading branch information
Razmoth committed Nov 14, 2023
1 parent bc60aac commit d9affa5
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 39 deletions.
7 changes: 0 additions & 7 deletions Audio/Models/Chunks/Package.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
namespace Audio.Models.Chunks;
public record Package : Chunk
{
public static Dictionary<ulong, string> BankIDToNames { get; private set; }

public string Path { get; set; }
public bool IsLittleEndian { get; set; }
public long FolderListSize { get; set; }
Expand All @@ -20,11 +18,6 @@ public record Package : Chunk
public Sound[] Sounds { get; set; }
public External[] Externals { get; set; }

static Package()
{
BankIDToNames = new Dictionary<ulong, string>();
}

public Package(Chunk chunk) : base(chunk) { }

public static Package Parse(string path)
Expand Down
2 changes: 2 additions & 0 deletions Audio/Models/Entries/Entry.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
using System.IO;
using System.Text.Json.Serialization;
using Audio.Models.Chunks;

namespace Audio.Models.Entries;
public record Entry
{
[JsonIgnore]
public Package Package { get; set; }
public ulong ID { get; set; }
public uint Offset { get; set; }
Expand Down
88 changes: 62 additions & 26 deletions Audio/ViewModels/MainViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
using Avalonia.Data;
using Audio.Models.Utils;
using System.Diagnostics;
using System.Text.Json.Serialization;
using System.Text.Json;

namespace Audio.ViewModels;

Expand Down Expand Up @@ -104,6 +106,7 @@ public async void LoadFolder(string folder)
public async void ExportAll(string outputDir) => await Task.Run(() => Export(Entries.Items.ToList(), outputDir));
public async void LoadVO(string path) => await Task.Run(() => LoadVOInternal(path));
public async void GenerateTXTP(string wwiser, string file) => await Task.Run(() => GenerateTXTPInternal(wwiser, file));
public async void DumpInfo(string output) => await Task.Run(() => DumpInfoInternal(output));
public void SelectAll()
{
for (int i = 0; i < EntrySource.Rows.Count; i++)
Expand All @@ -121,7 +124,37 @@ private async void LoadPaths(string[] paths)
Entries.Clear();
Packages.Clear();
Folders.Clear();
Package.BankIDToNames.Clear();

Packages = await LoadPackages(paths);

Folders.AddRange(Packages.SelectMany(x => x.Folders).DistinctBy(x => x.Name).ToList());

var banks = Packages.SelectMany(x => x.Banks).Cast<Bank>().ToList();
var sounds = Packages.SelectMany(x => x.Sounds).Cast<Entry>().ToList();
var externals = Packages.SelectMany(x => x.Externals).Cast<Entry>().ToList();
var entries = banks.Concat(sounds).Concat(externals).ToArray();

StatusText = $"Listing {entries.Length} entries...";

ProgressHelper.Reset();
for (int i = 0; i < entries.Length; i++)
{
var entry = entries[i];
if (entry is Bank bank)
{
Entries.AddRange(bank.EmbeddedSounds);
}
Entries.Add(entry);
ProgressHelper.Report(i, entries.Length);
}

Refresh();
StatusText = "Loaded !!";
}
private async Task<List<Package>> LoadPackages(string[] paths)
{
var packages = new List<Package>();
var bankIDToNames = new Dictionary<ulong, string>();

StatusText = $"Loading {paths.Length} files...";

Expand All @@ -130,57 +163,39 @@ private async void LoadPaths(string[] paths)
{
var path = paths[i];
var package = await ParsePackage(path);
Packages.Add(package);
packages.Add(package);
ProgressHelper.Report(i, paths.Length);
}

Folders.AddRange(Packages.SelectMany(x => x.Folders).DistinctBy(x => x.Name).ToList());

var banks = Packages.SelectMany(x => x.Banks).Cast<Bank>().ToList();
var banks = packages.SelectMany(x => x.Banks).Cast<Bank>().ToList();

StatusText = $"Processing {banks.Count} banks...";

ProgressHelper.Reset();
for (int i = 0; i < banks.Count; i++)
{
var bank = banks[i];
Entries.AddRange(bank.EmbeddedSounds);
foreach (var kv in bank.BankIDToName)
{
Package.BankIDToNames.TryAdd(kv.Key, kv.Value);
bankIDToNames.TryAdd(kv.Key, kv.Value);
}
ProgressHelper.Report(i, banks.Count);
}

StatusText = $"Mapping {Package.BankIDToNames.Count} found bank names...";
StatusText = $"Mapping {bankIDToNames.Count} found bank names...";

ProgressHelper.Reset();
for (int i = 0; i < banks.Count; i++)
{
var bank = banks[i];
if (Package.BankIDToNames.TryGetValue(bank.ID, out var name))
if (bankIDToNames.TryGetValue(bank.ID, out var name))
{
bank.Name = name;
}
ProgressHelper.Report(i, banks.Count);
}

var sounds = Packages.SelectMany(x => x.Sounds).Cast<Entry>().ToList();
var externals = Packages.SelectMany(x => x.Externals).Cast<Entry>().ToList();
var entries = banks.Concat(sounds).Concat(externals).ToArray();

StatusText = $"Listing {entries.Length} entries...";

ProgressHelper.Reset();
for (int i = 0; i < entries.Length; i++)
{
var entry = entries[i];
Entries.Add(entry);
ProgressHelper.Report(i, entries.Length);
}

Refresh();
StatusText = "Loaded !!";
return packages;
}
private async void LoadVOInternal(string path)
{
Expand Down Expand Up @@ -278,7 +293,7 @@ private async Task<Package> ParsePackage(string path)
var package = await Task.Run(() => Package.Parse(path));
return package;
}
private async void GenerateTXTPInternal(string wwiser, string file)
private void GenerateTXTPInternal(string wwiser, string file)
{
StatusText = "Exporting banks temporarly to temp folder...";

Expand Down Expand Up @@ -417,4 +432,25 @@ private void Export(List<Bank> banks, string txtpDir, Action<Entry, string> expo
}
}
}
private async void DumpInfoInternal(string output)
{
var banks = Packages.SelectMany(x => x.Banks).Cast<Entry>().ToList();
var sounds = Packages.SelectMany(x => x.Sounds).Cast<Entry>().ToList();
var externals = Packages.SelectMany(x => x.Externals).Cast<Entry>().ToList();
var embeddedSounds = Packages.SelectMany(x => x.Banks).SelectMany(x => x.EmbeddedSounds).Cast<Entry>().ToList();

var entries = banks.Concat(sounds).Concat(externals).Concat(embeddedSounds).ToList();

var options = new JsonSerializerOptions
{
ReferenceHandler = ReferenceHandler.IgnoreCycles,
WriteIndented = true
};
options.Converters.Add(new JsonStringEnumConverter());
var str = JsonSerializer.Serialize(entries, options);

File.WriteAllText(output, str);

StatusText = $"Dumped to {output} successfully !!";
}
}
3 changes: 3 additions & 0 deletions Audio/Views/MainView.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,12 @@
<MenuItem Header="Export Sounds" Click="ExportAudios_Click"/>
<MenuItem Header="Export Banks" Click="ExportBanks_Click"/>
<MenuItem Header="Export All" Click="ExportAll_Click"/>
<Separator/>
<MenuItem Header="Dump Info" Click="DumpInfo_Click"/>
</MenuItem>
<MenuItem Header="Options">
<MenuItem Header="Load VO" Click="LoadVO_Click"/>
<Separator/>
<MenuItem Header="Generate TXTP" Click="GenerateTXTP_Click"/>
<CheckBox Content="Export raw audio" IsChecked="{Binding RawAudio}"/>
<Separator/>
Expand Down
46 changes: 40 additions & 6 deletions Audio/Views/MainView.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,13 @@ private async Task<string[]> PickFileInternal(bool allowMultiple = false, FilePi

return Array.Empty<string>();
}
private async Task<string> PickFolder()
private async Task<string> PickFolder(string title = "")
{
var topLevel = TopLevel.GetTopLevel(this);

var folders = await topLevel.StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions()
{
Title = title,
SuggestedStartLocation = await topLevel.StorageProvider.TryGetFolderFromPathAsync(_lastOpenDirectory)
});

Expand All @@ -88,6 +89,30 @@ private async Task<string> PickFolder()

return "";
}
private async Task<string> SaveFile(string name = "", string extension = "", string title = "", FilePickerFileType[] types = null)

Check warning on line 92 in Audio/Views/MainView.axaml.cs

View workflow job for this annotation

GitHub Actions / build

Cannot convert null literal to non-nullable reference type.
{
var topLevel = TopLevel.GetTopLevel(this);

var file = await topLevel.StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions
{
Title = title,
SuggestedFileName = name,
DefaultExtension = extension,
ShowOverwritePrompt = true,
FileTypeChoices = types ?? Array.Empty<FilePickerFileType>(),
SuggestedStartLocation = await topLevel.StorageProvider.TryGetFolderFromPathAsync(_lastOpenDirectory)
});

if (file != null)
{
var dir = await file.GetParentAsync();
_lastOpenDirectory = dir.ToString();

return file.TryGetLocalPath();
}

return "";
}
private async Task<string[]> PickFiles(FilePickerFileType[] types = null) => await PickFileInternal(true, types);

Check warning on line 116 in Audio/Views/MainView.axaml.cs

View workflow job for this annotation

GitHub Actions / build

Cannot convert null literal to non-nullable reference type.
private async Task<string> PickFile(FilePickerFileType[] types = null)

Check warning on line 117 in Audio/Views/MainView.axaml.cs

View workflow job for this annotation

GitHub Actions / build

Cannot convert null literal to non-nullable reference type.
{
Expand All @@ -107,7 +132,7 @@ private async void LoadFile_Click(object? sender, RoutedEventArgs e)

private async void LoadFolder_Click(object? sender, RoutedEventArgs e)
{
var folder = await PickFolder();
var folder = await PickFolder("Select Folder");

if (!string.IsNullOrEmpty(folder))
{
Expand All @@ -126,7 +151,7 @@ private async void LoadVO_Click(object? sender, RoutedEventArgs e)

private async void ExportAudios_Click(object? sender, RoutedEventArgs e)
{
var folder = await PickFolder();
var folder = await PickFolder("Select Output Folder");

if (!string.IsNullOrEmpty(folder))
{
Expand All @@ -136,7 +161,7 @@ private async void ExportAudios_Click(object? sender, RoutedEventArgs e)

private async void ExportBanks_Click(object? sender, RoutedEventArgs e)
{
var folder = await PickFolder();
var folder = await PickFolder("Select Output Folder");

if (!string.IsNullOrEmpty(folder))
{
Expand All @@ -146,7 +171,7 @@ private async void ExportBanks_Click(object? sender, RoutedEventArgs e)

private async void ExportAll_Click(object? sender, RoutedEventArgs e)
{
var folder = await PickFolder();
var folder = await PickFolder("Select Output Folder");

if (!string.IsNullOrEmpty(folder))
{
Expand All @@ -173,7 +198,7 @@ private async void EntryDataGridExportSeleted_Click(object? sender, RoutedEventA
{
if (ViewModel.SelectedEntries.Count > 0)
{
var folder = await PickFolder();
var folder = await PickFolder("Select Output Folder");

if (!string.IsNullOrEmpty(folder))
{
Expand Down Expand Up @@ -211,4 +236,13 @@ private async void GenerateTXTP_Click(object? sender, RoutedEventArgs e)
}
}
}
private async void DumpInfo_Click(object? sender, RoutedEventArgs e)
{
var output = await SaveFile("Packages", "json", "Select Folder", new FilePickerFileType[] { new FilePickerFileType("Packages Info") { Patterns = new[] { "*.json" } } });

if (!string.IsNullOrEmpty(output))
{
ViewModel.DumpInfo(output);
}
}
}

0 comments on commit d9affa5

Please sign in to comment.