mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-07-07 18:31:23 +08:00
AWC/XML conversion bugfixes
This commit is contained in:
parent
94b75dda20
commit
70b490e552
|
@ -250,10 +250,27 @@ namespace CodeWalker.GameFiles
|
||||||
chunkinfo.Write(w);
|
chunkinfo.Write(w);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int i = 0; i < StreamCount; i++)
|
if (MultiChannelFlag)
|
||||||
{
|
{
|
||||||
var stream = Streams[i];
|
for (int i = 0; i < StreamCount; i++)
|
||||||
stream.Write(w);
|
{
|
||||||
|
var stream = Streams[i];
|
||||||
|
stream.Write(w);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < StreamCount; i++)
|
||||||
|
{
|
||||||
|
var stream = Streams[i];
|
||||||
|
stream.WriteDataChunks(w);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < StreamCount; i++)
|
||||||
|
{
|
||||||
|
var stream = Streams[i];
|
||||||
|
stream.Write(w);
|
||||||
|
stream.WriteDataChunks(w);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -359,6 +376,71 @@ namespace CodeWalker.GameFiles
|
||||||
{
|
{
|
||||||
dataOffset += (stream?.Chunks?.Length ?? 0) * 8;
|
dataOffset += (stream?.Chunks?.Length ?? 0) * 8;
|
||||||
}
|
}
|
||||||
|
if (MultiChannelFlag)
|
||||||
|
{
|
||||||
|
foreach (var stream in Streams)
|
||||||
|
{
|
||||||
|
if (stream.Chunks != null)
|
||||||
|
{
|
||||||
|
foreach (var chunk in stream.Chunks)
|
||||||
|
{
|
||||||
|
if (!(chunk is AwcDataChunk))
|
||||||
|
{
|
||||||
|
if (chunk is AwcMarkersChunk)
|
||||||
|
{
|
||||||
|
//align to 4 bytes
|
||||||
|
var padc = (4 - (dataOffset % 4)) % 4;
|
||||||
|
dataOffset += padc;
|
||||||
|
}
|
||||||
|
|
||||||
|
var chunkinfo = chunk.ChunkInfo;
|
||||||
|
var size = chunk.ChunkSize;
|
||||||
|
chunkinfo.Size = size;
|
||||||
|
chunkinfo.Offset = dataOffset;
|
||||||
|
dataOffset += size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (var stream in Streams)
|
||||||
|
{
|
||||||
|
if (stream.Chunks != null)
|
||||||
|
{
|
||||||
|
foreach (var chunk in stream.Chunks)
|
||||||
|
{
|
||||||
|
if (chunk is AwcDataChunk)
|
||||||
|
{
|
||||||
|
//align to 16 bytes
|
||||||
|
var padc = (16 - (dataOffset % 16)) % 16;
|
||||||
|
dataOffset += padc;
|
||||||
|
|
||||||
|
var chunkinfo = chunk.ChunkInfo;
|
||||||
|
var size = chunk.ChunkSize;
|
||||||
|
chunkinfo.Size = size;
|
||||||
|
chunkinfo.Offset = dataOffset;
|
||||||
|
dataOffset += size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var stream in Streams)
|
||||||
|
{
|
||||||
|
if (stream.Chunks != null)
|
||||||
|
{
|
||||||
|
foreach (var chunk in stream.Chunks)
|
||||||
|
{
|
||||||
|
var chunkinfo = chunk.ChunkInfo;
|
||||||
|
var size = chunk.ChunkSize;
|
||||||
|
chunkinfo.Size = size;
|
||||||
|
chunkinfo.Offset = dataOffset;
|
||||||
|
dataOffset += size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
foreach (var stream in Streams)
|
foreach (var stream in Streams)
|
||||||
{
|
{
|
||||||
var streaminfo = stream.StreamInfo;
|
var streaminfo = stream.StreamInfo;
|
||||||
|
@ -370,10 +452,6 @@ namespace CodeWalker.GameFiles
|
||||||
{
|
{
|
||||||
var chunkinfo = chunk.ChunkInfo;
|
var chunkinfo = chunk.ChunkInfo;
|
||||||
chunkinfos.Add(chunkinfo);
|
chunkinfos.Add(chunkinfo);
|
||||||
var size = chunk.ChunkSize;
|
|
||||||
chunkinfo.Size = size;
|
|
||||||
chunkinfo.Offset = dataOffset;
|
|
||||||
dataOffset += size;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
streaminfo.Chunks = chunkinfos.ToArray();
|
streaminfo.Chunks = chunkinfos.ToArray();
|
||||||
|
@ -648,16 +726,45 @@ namespace CodeWalker.GameFiles
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Write(DataWriter w)
|
public void Write(DataWriter w)
|
||||||
|
{
|
||||||
|
if (Chunks != null)
|
||||||
|
{
|
||||||
|
foreach (var chunk in Chunks)
|
||||||
|
{
|
||||||
|
if (!(chunk is AwcDataChunk))
|
||||||
|
{
|
||||||
|
if (Awc.MultiChannelFlag && (chunk is AwcMarkersChunk))
|
||||||
|
{
|
||||||
|
//write padding to align to 4 bytes
|
||||||
|
var padc = (4 - (w.Position % 4)) % 4;
|
||||||
|
if (padc > 0) w.Write(new byte[padc]);
|
||||||
|
}
|
||||||
|
|
||||||
|
chunk.Write(w);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void WriteDataChunks(DataWriter w)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (Chunks != null)
|
if (Chunks != null)
|
||||||
{
|
{
|
||||||
foreach (var chunk in Chunks)
|
foreach (var chunk in Chunks)
|
||||||
{
|
{
|
||||||
chunk.Write(w);
|
if (chunk is AwcDataChunk)
|
||||||
|
{
|
||||||
|
if (Awc.MultiChannelFlag)
|
||||||
|
{
|
||||||
|
//write padding to align to 16 bytes
|
||||||
|
var padc = (16 - (w.Position % 16)) % 16;
|
||||||
|
if (padc > 0) w.Write(new byte[padc]);
|
||||||
|
}
|
||||||
|
|
||||||
|
chunk.Write(w);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteXml(StringBuilder sb, int indent, string wavfolder)
|
public void WriteXml(StringBuilder sb, int indent, string wavfolder)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user