Files
parkan-playground/ScrLib/ScrParser.cs
T

63 lines
2.0 KiB
C#
Raw Permalink Normal View History

2025-08-23 03:00:14 +03:00
using Common;
namespace ScrLib;
2025-02-26 04:27:16 +03:00
public class ScrParser
{
public static ScrFile ReadFile(string filePath)
{
2025-10-05 18:17:18 +03:00
using var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
2025-02-26 04:27:16 +03:00
2025-10-05 18:17:18 +03:00
return ReadFile(fs);
}
public static ScrFile ReadFile(Stream fs)
{
2026-05-09 20:36:43 +03:00
var magic = fs.ReadInt32LittleEndian();
var entryCount = fs.ReadInt32LittleEndian();
List<ScrEntry> entries = [];
2025-10-05 18:17:18 +03:00
2026-05-09 20:36:43 +03:00
for (var i = 0; i < entryCount; i++)
2025-02-26 04:27:16 +03:00
{
2026-05-09 20:36:43 +03:00
var title = fs.ReadLengthPrefixedString();
2025-10-05 18:17:18 +03:00
2025-02-26 04:27:16 +03:00
// тут игра дополнительно вычитывает ещё 1 байт, видимо как \0 для char*
fs.ReadByte();
2026-05-09 20:36:43 +03:00
var index = fs.ReadInt32LittleEndian();
var innerCount = fs.ReadInt32LittleEndian();
List<ScrEntryInner> inners = [];
for (var i1 = 0; i1 < innerCount; i1++)
2025-02-26 04:27:16 +03:00
{
2026-05-09 20:36:43 +03:00
var scriptIndex = fs.ReadInt32LittleEndian();
var unkInner2 = fs.ReadInt32LittleEndian();
var unkInner3 = fs.ReadInt32LittleEndian();
var type = (ScrEntryInnerType)fs.ReadInt32LittleEndian();
var unkInner5 = fs.ReadInt32LittleEndian();
var argumentsCount = fs.ReadInt32LittleEndian();
List<int> arguments = [];
for (var i2 = 0; i2 < argumentsCount; i2++)
2025-02-26 04:27:16 +03:00
{
2026-05-09 20:36:43 +03:00
arguments.Add(fs.ReadInt32LittleEndian());
2025-02-26 04:27:16 +03:00
}
2026-05-09 20:36:43 +03:00
var unkInner7 = fs.ReadInt32LittleEndian();
inners.Add(new ScrEntryInner(
scriptIndex,
unkInner2,
unkInner3,
type,
unkInner5,
argumentsCount,
arguments,
unkInner7));
2025-02-26 04:27:16 +03:00
}
2025-10-05 18:17:18 +03:00
2026-05-09 20:36:43 +03:00
entries.Add(new ScrEntry(title, index, innerCount, inners));
2025-02-26 04:27:16 +03:00
}
2026-05-09 20:36:43 +03:00
return new ScrFile(magic, entryCount, entries);
2025-02-26 04:27:16 +03:00
}
2026-05-09 20:36:43 +03:00
}