mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/PCK-Studio.git
synced 2026-05-22 11:36:11 +00:00
105 lines
3.2 KiB
C#
105 lines
3.2 KiB
C#
using OMI;
|
|
using OMI.Workers;
|
|
using PckStudio.Core.FileFormats;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text;
|
|
|
|
namespace PckStudio.Core.IO.PckAudio
|
|
{
|
|
public class PckAudioFileWriter : IDataFormatWriter
|
|
{
|
|
|
|
private PckAudioFile _file;
|
|
private Endianness _endianness;
|
|
private static readonly List<string> LUT = new List<string>
|
|
{
|
|
"CUENAME",
|
|
"CREDIT",
|
|
"CREDITID"
|
|
};
|
|
|
|
public PckAudioFileWriter(PckAudioFile file, Endianness endianness)
|
|
{
|
|
_file = file;
|
|
_endianness = endianness;
|
|
}
|
|
|
|
public void WriteToFile(string filename)
|
|
{
|
|
using (FileStream fs = File.OpenWrite(filename))
|
|
{
|
|
WriteToStream(fs);
|
|
}
|
|
}
|
|
|
|
public void WriteToStream(Stream stream)
|
|
{
|
|
using (var writer = new EndiannessAwareBinaryWriter(stream,
|
|
_endianness == Endianness.BigEndian
|
|
? Encoding.BigEndianUnicode
|
|
: Encoding.Unicode,
|
|
leaveOpen: true, _endianness))
|
|
{
|
|
writer.Write(_file.type);
|
|
WriteLookUpTable(writer);
|
|
WriteCategories(writer);
|
|
WriteCategorySongs(writer);
|
|
}
|
|
}
|
|
|
|
private void WriteString(EndiannessAwareBinaryWriter writer, string s)
|
|
{
|
|
writer.Write(s.Length);
|
|
writer.WriteString(s);
|
|
writer.Write(0); // padding
|
|
}
|
|
|
|
private void WriteLookUpTable(EndiannessAwareBinaryWriter writer)
|
|
{
|
|
writer.Write(3);
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
writer.Write(i);
|
|
WriteString(writer, LUT[i]);
|
|
}
|
|
}
|
|
|
|
private void WriteCategories(EndiannessAwareBinaryWriter writer)
|
|
{
|
|
writer.Write(_file.Categories.Length);
|
|
foreach (PckAudioFile.AudioCategory category in _file.Categories)
|
|
{
|
|
writer.Write((int)category.parameterType);
|
|
writer.Write((int)category.AudioType);
|
|
WriteString(writer, category.Name);
|
|
}
|
|
}
|
|
|
|
private void WriteCategorySongs(EndiannessAwareBinaryWriter writer)
|
|
{
|
|
bool addCredit = true;
|
|
foreach (PckAudioFile.AudioCategory category in _file.Categories)
|
|
{
|
|
writer.Write(category.SongNames.Count + (addCredit ? _file.Credits.Count * 2 : 0));
|
|
foreach (var name in category.SongNames)
|
|
{
|
|
writer.Write(LUT.IndexOf("CUENAME"));
|
|
WriteString(writer, name);
|
|
}
|
|
if (addCredit)
|
|
{
|
|
foreach (KeyValuePair<string, string> credit in _file.Credits)
|
|
{
|
|
writer.Write(LUT.IndexOf("CREDIT"));
|
|
WriteString(writer, credit.Value);
|
|
writer.Write(LUT.IndexOf("CREDITID"));
|
|
WriteString(writer, credit.Key);
|
|
}
|
|
}
|
|
addCredit = false;
|
|
}
|
|
}
|
|
}
|
|
}
|