You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.2 KiB
C#
127 lines
3.2 KiB
C#
using NetMFAPatcher.Utils;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using NetMFAPatcher.mmfparser;
|
|
using static NetMFAPatcher.MMFParser.Data.ChunkList;
|
|
|
|
namespace NetMFAPatcher.chunkloaders
|
|
{
|
|
public class SoundBank : ChunkLoader
|
|
{
|
|
public int num_of_items = 0;
|
|
public int references = 0;
|
|
public List<SoundItem> items;
|
|
public bool isCompressed = true;
|
|
|
|
public override void Print(bool ext)
|
|
{
|
|
}
|
|
|
|
public override void Read()
|
|
{
|
|
//Implementing for standalone-only because of my lazyness
|
|
items = new List<SoundItem>();
|
|
num_of_items = reader.ReadInt32();
|
|
return;
|
|
for (int i = 0; i < num_of_items; i++)
|
|
{
|
|
var item = new SoundItem(reader);
|
|
item.isCompressed = isCompressed;
|
|
item.Read();
|
|
|
|
items.Add(item);
|
|
}
|
|
}
|
|
|
|
public SoundBank(ByteIO reader) : base(reader)
|
|
{
|
|
}
|
|
|
|
public SoundBank(Chunk chunk) : base(chunk)
|
|
{
|
|
}
|
|
}
|
|
|
|
public class SoundBase : ChunkLoader
|
|
{
|
|
public int handle;
|
|
public string name = "ERROR";
|
|
public byte[] data;
|
|
|
|
public override void Print(bool ext)
|
|
{
|
|
}
|
|
|
|
public override void Read()
|
|
{
|
|
}
|
|
|
|
public SoundBase(ByteIO reader) : base(reader)
|
|
{
|
|
}
|
|
|
|
public SoundBase(Chunk chunk) : base(chunk)
|
|
{
|
|
}
|
|
}
|
|
|
|
public class SoundItem : SoundBase
|
|
{
|
|
public bool compressed;
|
|
public int checksum;
|
|
public int references;
|
|
public bool isCompressed = true;
|
|
|
|
public override void Read()
|
|
{
|
|
var start = reader.Tell();
|
|
|
|
handle = (int) reader.ReadUInt32();
|
|
checksum = reader.ReadInt32();
|
|
references = reader.ReadInt32();
|
|
var decompressed_size = reader.ReadInt32();
|
|
reader.ReadUInt32(); //flags
|
|
var reserved = reader.ReadInt32();
|
|
var name_lenght = reader.ReadInt32();
|
|
ByteIO SoundData;
|
|
if (isCompressed) //compressed
|
|
{
|
|
var size = reader.ReadInt32();
|
|
SoundData = new ByteIO(Decompressor.decompress_block(reader, size, decompressed_size));
|
|
}
|
|
else
|
|
{
|
|
SoundData = new ByteIO(reader.ReadBytes(decompressed_size));
|
|
}
|
|
if (isCompressed)
|
|
{
|
|
name = SoundData.ReadWideString(name_lenght);
|
|
}
|
|
else
|
|
{
|
|
name = SoundData.ReadAscii(name_lenght);
|
|
|
|
}
|
|
|
|
|
|
this.data = SoundData.ReadBytes((int) SoundData.Size());
|
|
name = Helper.CleanInput(name);
|
|
Console.WriteLine($"Dumping {name}");
|
|
|
|
string path = $"{Program.DumpPath}\\SoundBank\\{name}.wav";
|
|
File.WriteAllBytes(path, data);
|
|
}
|
|
|
|
public SoundItem(ByteIO reader) : base(reader)
|
|
{
|
|
}
|
|
|
|
public SoundItem(Chunk chunk) : base(chunk)
|
|
{
|
|
}
|
|
}
|
|
} |