Files
SabreTools.Serialization/SabreTools.Data.Models/BSP/LzmaHeader.cs
Matt Nadareski 7689c6dd07 Libraries
This change looks dramatic, but it's just separating out the already-split namespaces into separate top-level folders. In theory, every single one could be built into their own Nuget package. `SabreTools.Serialization` still builds the normal Nuget package that is used by all other projects and includes all namespaces.
2026-03-21 16:26:56 -04:00

41 lines
1.6 KiB
C#

using System.Runtime.InteropServices;
namespace SabreTools.Data.Models.BSP
{
/// <summary>
/// BSP files for console platforms such as PlayStation 3 and
/// Xbox 360 usually have their lumps compressed with LZMA.
/// In this case, the lump data starts with the following header
/// (from public/tier1/lzmaDecoder.h), which is used in place of
/// the standard 13-byte LZMA header.
///
/// lzmaSize denotes the size (in bytes) of compressed data, it
/// is equal to the size of a lump minus 17 bytes (lzma header).
/// actualSize denotes the size of decompressed data. properties[5]
/// field are used solely for LZMA decoding.
///
/// There are two special cases for compression: LUMP_PAKFILE is never
/// compressed as a lump (the contents of the zip are compressed instead)
/// and each of the game lumps in LUMP_GAME_LUMP are compressed individually.
/// The compressed size of a game lump can be determined by subtracting
/// the current game lump's offset with that of the next entry. For this
/// reason, when game lumps are compressed the last game lump is always
/// an empty dummy which only contains the offset.
/// </summary>
/// <see href="https://developer.valvesoftware.com/wiki/BSP_(Source)"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class LzmaHeader
{
public uint Id;
/// <remarks>Little-endian</remarks>
public uint ActualSize;
/// <remarks>Little-endian</remarks>
public uint LzmaSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public byte[] Properties = new byte[5];
}
}