mirror of
https://github.com/SabreTools/SabreTools.Models.git
synced 2026-02-07 13:54:36 +00:00
Compare commits
104 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d144dd47a1 | ||
|
|
c4247c7ccb | ||
|
|
1e77437167 | ||
|
|
3d79e07d76 | ||
|
|
9d50d577ab | ||
|
|
494ca175fb | ||
|
|
73b3d4a7a8 | ||
|
|
bd40158423 | ||
|
|
149a45d871 | ||
|
|
e18d8d7543 | ||
|
|
38f0d4aef5 | ||
|
|
3959993255 | ||
|
|
00df5bdd6e | ||
|
|
00c087d8e0 | ||
|
|
6bc948784a | ||
|
|
c4f14854c2 | ||
|
|
adaac68898 | ||
|
|
a9bc4a2bfe | ||
|
|
262b91de65 | ||
|
|
62bd6a4bde | ||
|
|
7f14f0c5b0 | ||
|
|
33d63fddae | ||
|
|
209be57bf4 | ||
|
|
a1581e9d9b | ||
|
|
521664d5a8 | ||
|
|
73a8d91a83 | ||
|
|
438e87f833 | ||
|
|
2cdedbb456 | ||
|
|
b57a545598 | ||
|
|
8dc6eb2eee | ||
|
|
b58436d71a | ||
|
|
925c20021f | ||
|
|
9bebf95599 | ||
|
|
089e13ca03 | ||
|
|
de07b3b0dd | ||
|
|
22cb5360e6 | ||
|
|
a422ec7e6d | ||
|
|
f60afd6368 | ||
|
|
b8f67a8ab0 | ||
|
|
d844a8b582 | ||
|
|
8583baa862 | ||
|
|
8f3be17850 | ||
|
|
5856967794 | ||
|
|
8f78c73c6f | ||
|
|
af4ff3d383 | ||
|
|
3e638a5c57 | ||
|
|
638d0226c1 | ||
|
|
07c6d5b43a | ||
|
|
108e63a099 | ||
|
|
c636d3252b | ||
|
|
b19dbf2254 | ||
|
|
111b84170c | ||
|
|
2d7df0d4fb | ||
|
|
aba02663e5 | ||
|
|
594fec923a | ||
|
|
b5cf4e870d | ||
|
|
e6976796c2 | ||
|
|
295d8c7612 | ||
|
|
4dd184583c | ||
|
|
081c9c9245 | ||
|
|
b974380ccf | ||
|
|
41ed2cbc9a | ||
|
|
2cfcb49e35 | ||
|
|
b3f3f12b3e | ||
|
|
b41700ff92 | ||
|
|
e8a357546b | ||
|
|
68f0201c11 | ||
|
|
25b6493249 | ||
|
|
a551363c0b | ||
|
|
2fd92aea8f | ||
|
|
a61b3d0ed9 | ||
|
|
a40a6871df | ||
|
|
5792ec64c0 | ||
|
|
3b13c7cc96 | ||
|
|
894d7b62e2 | ||
|
|
38e37b1a63 | ||
|
|
1f340bd244 | ||
|
|
e582ce8726 | ||
|
|
dad71add36 | ||
|
|
cb2a28016e | ||
|
|
46a814ac73 | ||
|
|
8fabe9c02d | ||
|
|
21e22a1476 | ||
|
|
016057a837 | ||
|
|
69ca889ac7 | ||
|
|
cd67a7282b | ||
|
|
948edbad58 | ||
|
|
d445f02ba6 | ||
|
|
835fce7876 | ||
|
|
97513840e0 | ||
|
|
6112dcb391 | ||
|
|
c000e581c8 | ||
|
|
465cef4224 | ||
|
|
87cadbfd2b | ||
|
|
648ee2eaa5 | ||
|
|
daa814728d | ||
|
|
68aac36623 | ||
|
|
0c95cfcde4 | ||
|
|
6d6361c153 | ||
|
|
e4be402052 | ||
|
|
182c9bc756 | ||
|
|
cc62b3ffae | ||
|
|
7d34f486cd | ||
|
|
9c68cfc0c1 |
43
.github/workflows/build_nupkg.yml
vendored
Normal file
43
.github/workflows/build_nupkg.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
name: Nuget Pack
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 8.0.x
|
||||
|
||||
- name: Restore dependencies
|
||||
run: dotnet restore
|
||||
|
||||
- name: Pack
|
||||
run: dotnet pack
|
||||
|
||||
- name: Upload build
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: 'Nuget Package'
|
||||
path: 'SabreTools.Models/bin/Release/*.nupkg'
|
||||
|
||||
- name: Upload to rolling
|
||||
uses: ncipollo/release-action@v1.14.0
|
||||
with:
|
||||
allowUpdates: True
|
||||
artifacts: 'SabreTools.Models/bin/Release/*.nupkg'
|
||||
body: 'Last built commit: ${{ github.sha }}'
|
||||
name: 'Rolling Release'
|
||||
prerelease: True
|
||||
replacesArtifacts: True
|
||||
tag: "rolling"
|
||||
updateOnlyUnreleased: True
|
||||
17
.github/workflows/check_pr.yml
vendored
Normal file
17
.github/workflows/check_pr.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
name: Build PR
|
||||
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 8.0.x
|
||||
|
||||
- name: Build
|
||||
run: dotnet build
|
||||
@@ -1,150 +0,0 @@
|
||||
namespace SabreTools.Models.AttractMode
|
||||
{
|
||||
public class Row
|
||||
{
|
||||
/// <remarks>Also called Romname</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string Title { get; set; }
|
||||
#else
|
||||
public string? Title { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string Emulator { get; set; }
|
||||
#else
|
||||
public string? Emulator { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string CloneOf { get; set; }
|
||||
#else
|
||||
public string? CloneOf { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string Year { get; set; }
|
||||
#else
|
||||
public string? Year { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string Manufacturer { get; set; }
|
||||
#else
|
||||
public string? Manufacturer { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string Category { get; set; }
|
||||
#else
|
||||
public string? Category { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string Players { get; set; }
|
||||
#else
|
||||
public string? Players { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string Rotation { get; set; }
|
||||
#else
|
||||
public string? Rotation { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string Control { get; set; }
|
||||
#else
|
||||
public string? Control { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string Status { get; set; }
|
||||
#else
|
||||
public string? Status { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string DisplayCount { get; set; }
|
||||
#else
|
||||
public string? DisplayCount { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string DisplayType { get; set; }
|
||||
#else
|
||||
public string? DisplayType { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string AltRomname { get; set; }
|
||||
#else
|
||||
public string? AltRomname { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string AltTitle { get; set; }
|
||||
#else
|
||||
public string? AltTitle { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string Extra { get; set; }
|
||||
#else
|
||||
public string? Extra { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string Buttons { get; set; }
|
||||
#else
|
||||
public string? Buttons { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string Favorite { get; set; }
|
||||
#else
|
||||
public string? Favorite { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string Tags { get; set; }
|
||||
#else
|
||||
public string? Tags { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string PlayedCount { get; set; }
|
||||
#else
|
||||
public string? PlayedCount { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string PlayedTime { get; set; }
|
||||
#else
|
||||
public string? PlayedTime { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public string FileIsAvailable { get; set; }
|
||||
#else
|
||||
public string? FileIsAvailable { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public string[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public string[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
namespace SabreTools.Models.Compression.LZ
|
||||
{
|
||||
/// <summary>
|
||||
/// Format of first 14 byte of LZ compressed file
|
||||
/// </summary>
|
||||
/// <see href="https://github.com/wine-mirror/wine/blob/master/dlls/kernel32/lzexpand.c"/>
|
||||
public sealed class FileHeaader
|
||||
{
|
||||
#if NET48
|
||||
public string Magic { get; set; }
|
||||
#else
|
||||
public string? Magic { get; set; }
|
||||
#endif
|
||||
|
||||
public byte CompressionType { get; set; }
|
||||
|
||||
public char LastChar { get; set; }
|
||||
|
||||
public uint RealLength { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
namespace SabreTools.Models.Compression.LZX
|
||||
{
|
||||
public static class Constants
|
||||
{
|
||||
/* some constants defined by the LZX specification */
|
||||
public const int LZX_MIN_MATCH = (2);
|
||||
public const int LZX_MAX_MATCH = (257);
|
||||
public const int LZX_NUM_CHARS = (256);
|
||||
|
||||
/// <summary>
|
||||
/// also blocktypes 4-7 invalid
|
||||
/// </summary>
|
||||
public const int LZX_BLOCKTYPE_INVALID = (0);
|
||||
public const int LZX_BLOCKTYPE_VERBATIM = (1);
|
||||
public const int LZX_BLOCKTYPE_ALIGNED = (2);
|
||||
public const int LZX_BLOCKTYPE_UNCOMPRESSED = (3);
|
||||
public const int LZX_PRETREE_NUM_ELEMENTS = (20);
|
||||
|
||||
/// <summary>
|
||||
/// aligned offset tree #elements
|
||||
/// </summary>
|
||||
public const int LZX_ALIGNED_NUM_ELEMENTS = (8);
|
||||
|
||||
/// <summary>
|
||||
/// this one missing from spec!
|
||||
/// </summary>
|
||||
public const int LZX_NUM_PRIMARY_LENGTHS = (7);
|
||||
|
||||
/// <summary>
|
||||
/// length tree #elements
|
||||
/// </summary>
|
||||
public const int LZX_NUM_SECONDARY_LENGTHS = (249);
|
||||
|
||||
/* LZX huffman defines: tweak tablebits as desired */
|
||||
public const int LZX_PRETREE_MAXSYMBOLS = (LZX_PRETREE_NUM_ELEMENTS);
|
||||
public const int LZX_PRETREE_TABLEBITS = (6);
|
||||
public const int LZX_MAINTREE_MAXSYMBOLS = (LZX_NUM_CHARS + 50 * 8);
|
||||
public const int LZX_MAINTREE_TABLEBITS = (12);
|
||||
public const int LZX_LENGTH_MAXSYMBOLS = (LZX_NUM_SECONDARY_LENGTHS + 1);
|
||||
public const int LZX_LENGTH_TABLEBITS = (12);
|
||||
public const int LZX_ALIGNED_MAXSYMBOLS = (LZX_ALIGNED_NUM_ELEMENTS);
|
||||
public const int LZX_ALIGNED_TABLEBITS = (7);
|
||||
|
||||
public const int LZX_LENTABLE_SAFETY = (64); /* we allow length table decoding overruns */
|
||||
}
|
||||
}
|
||||
@@ -1,102 +0,0 @@
|
||||
namespace SabreTools.Models.Compression.LZX
|
||||
{
|
||||
public class Header
|
||||
{
|
||||
/*
|
||||
2.2 Header
|
||||
|
||||
2.2.1 Chunk Size
|
||||
|
||||
The LZXD compressor emits chunks of compressed data. A chunk represents exactly 32 KB of
|
||||
uncompressed data until the last chunk in the stream, which can represent less than 32 KB. To
|
||||
ensure that an exact number of input bytes represent an exact number of output bytes for each
|
||||
chunk, after each 32 KB of uncompressed data is represented in the output compressed bitstream, the
|
||||
output bitstream is padded with up to 15 bits of zeros to realign the bitstream on a 16-bit boundary
|
||||
(even byte boundary) for the next 32 KB of data. This results in a compressed chunk of a byte-aligned
|
||||
size. The compressed chunk could be smaller than 32 KB or larger than 32 KB if the data is
|
||||
incompressible when the chunk is not the last one.
|
||||
|
||||
The LZXD engine encodes a compressed, chunk-size prefix field preceding each compressed chunk in
|
||||
the compressed byte stream. The compressed, chunk-size prefix field is a byte aligned, little-endian,
|
||||
16-bit field. The chunk prefix chain could be followed in the compressed stream without
|
||||
decompressing any data. The next chunk prefix is at a location computed by the absolute byte offset
|
||||
location of this chunk prefix plus 2 (for the size of the chunk-size prefix field) plus the current chunk
|
||||
size.
|
||||
|
||||
2.2.2 E8 Call Translation
|
||||
|
||||
E8 call translation is an optional feature that can be used when the data to compress contains x86
|
||||
instruction sequences. E8 translation operates as a preprocessing stage before compressing each
|
||||
chunk, and the compressed stream header contains a bit that indicates whether the decoder shall
|
||||
reverse the translation as a postprocessing step after decompressing each chunk.
|
||||
|
||||
The x86 instruction beginning with a byte value of 0xE8 is followed by a 32-bit, little-endian relative
|
||||
displacement to the call target. When E8 call translation is enabled, the following preprocessing steps
|
||||
are performed on the uncompressed input before compression (assuming little-endian byte ordering):
|
||||
|
||||
Let chunk_offset refer to the total number of uncompressed bytes preceding this chunk.
|
||||
|
||||
Let E8_file_size refer to the caller-specified value given to the compressor or decoded from the header
|
||||
of the compressed stream during decompression.
|
||||
|
||||
The following example shows how E8 translation is performed for each 32-KB chunk of uncompressed
|
||||
data (or less than 32 KB if last chunk to compress).
|
||||
|
||||
if (( chunk_offset < 0x40000000 ) && ( chunk_size > 10 ))
|
||||
for ( i = 0; i < (chunk_size – 10); i++ )
|
||||
if ( chunk_byte[ i ] == 0xE8 )
|
||||
long current_pointer = chunk_offset + i;
|
||||
long displacement = chunk_byte[ i+1 ] |
|
||||
chunk_byte[ i+2 ] << 8 |
|
||||
chunk_byte[ i+3 ] << 16 |
|
||||
chunk_byte[ i+4 ] << 24;
|
||||
long target = current_pointer + displacement;
|
||||
if (( target >= 0 ) && ( target < E8_file_size+current_pointer))
|
||||
if ( target >= E8_file_size )
|
||||
target = displacement – E8_file_size;
|
||||
endif
|
||||
chunk_byte[ i+1 ] = (byte)( target );
|
||||
chunk_byte[ i+2 ] = (byte)( target >> 8 );
|
||||
chunk_byte[ i+3 ] = (byte)( target >> 16 );
|
||||
chunk_byte[ i+4 ] = (byte)( target >> 24 );
|
||||
endif
|
||||
i += 4;
|
||||
endif
|
||||
endfor
|
||||
endif
|
||||
|
||||
After decompression, the E8 scanning algorithm is the same. The following example shows how E8
|
||||
translation reversal is performed.
|
||||
|
||||
long value = chunk_byte[ i+1 ] |
|
||||
chunk_byte[ i+2 ] << 8 |
|
||||
chunk_byte[ i+3 ] << 16 |
|
||||
chunk_byte[ i+4 ] << 24;
|
||||
if (( value >= -current_pointer ) && ( value < E8_file_size ))
|
||||
if ( value >= 0 )
|
||||
displacement = value – current_pointer;
|
||||
else
|
||||
displacement = value + E8_file_size;
|
||||
endif
|
||||
chunk_byte[ i+1 ] = (byte)( displacement );
|
||||
chunk_byte[ i+2 ] = (byte)( displacement >> 8 );
|
||||
chunk_byte[ i+3 ] = (byte)( displacement >> 16 );
|
||||
chunk_byte[ i+4 ] = (byte)( displacement >> 24 );
|
||||
endif
|
||||
|
||||
The first bit in the first chunk in the LZXD bitstream (following the 2-byte, chunk-size prefix described
|
||||
in section 2.2.1) indicates the presence or absence of two 16-bit fields immediately following the
|
||||
single bit. If the bit is set, E8 translation is enabled for all the following chunks in the stream using the
|
||||
32-bit value derived from the two 16-bit fields as the E8_file_size provided to the compressor when E8
|
||||
translation was enabled. Note that E8_file_size is completely independent of the length of the
|
||||
uncompressed data. E8 call translation is disabled after the 32,768th chunk (after 1 gigabyte (GB) of
|
||||
uncompressed data).
|
||||
|
||||
Field Comments Size
|
||||
----------------------------------------------------------------
|
||||
E8 translation 0-disabled, 1-enabled 1 bit
|
||||
Translation size high word Only present if enabled 0 or 16 bits
|
||||
Translation size low word Only present if enabled 0 or 16 bits
|
||||
*/
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
namespace SabreTools.Models.Compression.Quantum
|
||||
{
|
||||
public static class Constants
|
||||
{
|
||||
/// <summary>
|
||||
/// Mask for Quantum Compression Level
|
||||
/// </summary>
|
||||
public const ushort MASK_QUANTUM_LEVEL = 0x00F0;
|
||||
|
||||
/// <summary>
|
||||
/// Lowest Quantum Level (1)
|
||||
/// </summary>
|
||||
public const ushort QUANTUM_LEVEL_LO = 0x0010;
|
||||
|
||||
/// <summary>
|
||||
/// Highest Quantum Level (7)
|
||||
/// </summary>
|
||||
public const ushort QUANTUM_LEVEL_HI = 0x0070;
|
||||
|
||||
/// <summary>
|
||||
/// Amount to shift over to get int
|
||||
/// </summary>
|
||||
public const ushort SHIFT_QUANTUM_LEVEL = 4;
|
||||
|
||||
/// <summary>
|
||||
/// Mask for Quantum Compression Memory
|
||||
/// </summary>
|
||||
public const ushort MASK_QUANTUM_MEM = 0x1F00;
|
||||
|
||||
/// <summary>
|
||||
/// Lowest Quantum Memory (10)
|
||||
/// </summary>
|
||||
public const ushort QUANTUM_MEM_LO = 0x0A00;
|
||||
|
||||
/// <summary>
|
||||
/// Highest Quantum Memory (21)
|
||||
/// </summary>
|
||||
public const ushort QUANTUM_MEM_HI = 0x1500;
|
||||
|
||||
/// <summary>
|
||||
/// Amount to shift over to get int
|
||||
/// </summary>
|
||||
public const ushort SHIFT_QUANTUM_MEM = 8;
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
namespace SabreTools.Models.Compression.Quantum
|
||||
{
|
||||
/// <see href="https://github.com/wine-mirror/wine/blob/master/dlls/cabinet/cabinet.h"/>
|
||||
/// <see href="http://www.russotto.net/quantumcomp.html"/>
|
||||
public sealed class Model
|
||||
{
|
||||
public int TimeToReorder { get; set; }
|
||||
|
||||
public int Entries { get; set; }
|
||||
|
||||
#if NET48
|
||||
public ModelSymbol[] Symbols { get; set; }
|
||||
#else
|
||||
public ModelSymbol?[]? Symbols { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public ushort[] LookupTable { get; set; } = new ushort[256];
|
||||
#else
|
||||
public ushort[]? LookupTable { get; set; } = new ushort[256];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
namespace SabreTools.Models.Compression.Quantum
|
||||
{
|
||||
/// <see href="https://github.com/wine-mirror/wine/blob/master/dlls/cabinet/cabinet.h"/>
|
||||
/// <see href="http://www.russotto.net/quantumcomp.html"/>
|
||||
public sealed class ModelSymbol
|
||||
{
|
||||
public ushort Symbol { get; set; }
|
||||
|
||||
public ushort CumulativeFrequency { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
namespace SabreTools.Models.N3DS
|
||||
{
|
||||
/// <see href="https://www.3dbrew.org/wiki/NCCH/Extended_Header#Access_Control_Info"/>
|
||||
public sealed class AccessControlInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// ARM11 local system capabilities
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public ARM11LocalSystemCapabilities ARM11LocalSystemCapabilities { get; set; }
|
||||
#else
|
||||
public ARM11LocalSystemCapabilities? ARM11LocalSystemCapabilities { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// ARM11 kernel capabilities
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public ARM11KernelCapabilities ARM11KernelCapabilities { get; set; }
|
||||
#else
|
||||
public ARM11KernelCapabilities? ARM11KernelCapabilities { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// ARM9 access control
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public ARM9AccessControl ARM9AccessControl { get; set; }
|
||||
#else
|
||||
public ARM9AccessControl? ARM9AccessControl { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,81 +0,0 @@
|
||||
namespace SabreTools.Models.N3DS
|
||||
{
|
||||
/// <see href="https://www.3dbrew.org/wiki/NCSD#Card_Info_Header"/>
|
||||
public sealed class CardInfoHeader
|
||||
{
|
||||
/// <summary>
|
||||
/// CARD2: Writable Address In Media Units (For 'On-Chip' Savedata). CARD1: Always 0xFFFFFFFF.
|
||||
/// </summary>
|
||||
public uint WritableAddressMediaUnits { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Card Info Bitmask
|
||||
/// </summary>
|
||||
public uint CardInfoBitmask { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Reserved1 { get; set; }
|
||||
#else
|
||||
public byte[]? Reserved1 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Filled size of cartridge
|
||||
/// </summary>
|
||||
public uint FilledSize { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Reserved2 { get; set; }
|
||||
#else
|
||||
public byte[]? Reserved2 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Title version
|
||||
/// </summary>
|
||||
public ushort TitleVersion { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Card revision
|
||||
/// </summary>
|
||||
public ushort CardRevision { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Reserved3 { get; set; }
|
||||
#else
|
||||
public byte[]? Reserved3 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Title ID of CVer in included update partition
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] CVerTitleID { get; set; }
|
||||
#else
|
||||
public byte[]? CVerTitleID { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Version number of CVer in included update partition
|
||||
/// </summary>
|
||||
public ushort CVerVersionNumber { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Reserved4 { get; set; }
|
||||
#else
|
||||
public byte[]? Reserved4 { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
namespace SabreTools.Models.N3DS
|
||||
{
|
||||
/// <see href="https://www.3dbrew.org/wiki/NCSD#Development_Card_Info_Header_Extension"/>
|
||||
public sealed class DevelopmentCardInfoHeader
|
||||
{
|
||||
/// <summary>
|
||||
/// InitialData
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public InitialData InitialData { get; set; }
|
||||
#else
|
||||
public InitialData? InitialData { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// CardDeviceReserved1
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] CardDeviceReserved1 { get; set; }
|
||||
#else
|
||||
public byte[]? CardDeviceReserved1 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// TitleKey
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] TitleKey { get; set; }
|
||||
#else
|
||||
public byte[]? TitleKey { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// CardDeviceReserved2
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] CardDeviceReserved2 { get; set; }
|
||||
#else
|
||||
public byte[]? CardDeviceReserved2 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// TestData
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public TestData TestData { get; set; }
|
||||
#else
|
||||
public TestData? TestData { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
namespace SabreTools.Models.N3DS
|
||||
{
|
||||
/// <see href="https://www.3dbrew.org/wiki/NCSD#InitialData"/>
|
||||
public sealed class InitialData
|
||||
{
|
||||
/// <summary>
|
||||
/// Card seed keyY (first u64 is Media ID (same as first NCCH partitionId))
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] CardSeedKeyY { get; set; }
|
||||
#else
|
||||
public byte[]? CardSeedKeyY { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Encrypted card seed (AES-CCM, keyslot 0x3B for retail cards, see CTRCARD_SECSEED)
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] EncryptedCardSeed { get; set; }
|
||||
#else
|
||||
public byte[]? EncryptedCardSeed { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Card seed AES-MAC
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] CardSeedAESMAC { get; set; }
|
||||
#else
|
||||
public byte[]? CardSeedAESMAC { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Card seed nonce
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] CardSeedNonce { get; set; }
|
||||
#else
|
||||
public byte[]? CardSeedNonce { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Reserved3
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Reserved { get; set; }
|
||||
#else
|
||||
public byte[]? Reserved { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Copy of first NCCH header (excluding RSA signature)
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public NCCHHeader BackupHeader { get; set; }
|
||||
#else
|
||||
public NCCHHeader? BackupHeader { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
namespace SabreTools.Models.N3DS
|
||||
{
|
||||
/// <see href="https://www.3dbrew.org/wiki/CIA#Meta"/>
|
||||
public sealed class MetaData
|
||||
{
|
||||
/// <summary>
|
||||
/// Title ID dependency list - Taken from the application's ExHeader
|
||||
/// </summary>
|
||||
/// TODO: Determine numeric format of each entry
|
||||
#if NET48
|
||||
public byte[] TitleIDDependencyList { get; set; }
|
||||
#else
|
||||
public byte[]? TitleIDDependencyList { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Reserved1 { get; set; }
|
||||
#else
|
||||
public byte[]? Reserved1 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Core Version
|
||||
/// </summary>
|
||||
public uint CoreVersion { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Reserved2 { get; set; }
|
||||
#else
|
||||
public byte[]? Reserved2 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Icon Data(.ICN) - Taken from the application's ExeFS
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] IconData { get; set; }
|
||||
#else
|
||||
public byte[]? IconData { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
namespace SabreTools.Models.N3DS
|
||||
{
|
||||
/// <see href="https://www.3dbrew.org/wiki/NCCH/Extended_Header#System_Control_Info"/>
|
||||
public sealed class SystemControlInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// Application title (default is "CtrApp")
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public string ApplicationTitle { get; set; }
|
||||
#else
|
||||
public string? ApplicationTitle { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Reserved1 { get; set; }
|
||||
#else
|
||||
public byte[]? Reserved1 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Flag (bit 0: CompressExefsCode, bit 1: SDApplication)
|
||||
/// </summary>
|
||||
public byte Flag { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Remaster version
|
||||
/// </summary>
|
||||
public ushort RemasterVersion { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Text code set info
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public CodeSetInfo TextCodeSetInfo { get; set; }
|
||||
#else
|
||||
public CodeSetInfo? TextCodeSetInfo { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Stack size
|
||||
/// </summary>
|
||||
public uint StackSize { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Read-only code set info
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public CodeSetInfo ReadOnlyCodeSetInfo { get; set; }
|
||||
#else
|
||||
public CodeSetInfo? ReadOnlyCodeSetInfo { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Reserved2 { get; set; }
|
||||
#else
|
||||
public byte[]? Reserved2 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Data code set info
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public CodeSetInfo DataCodeSetInfo { get; set; }
|
||||
#else
|
||||
public CodeSetInfo? DataCodeSetInfo { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// BSS size
|
||||
/// </summary>
|
||||
public uint BSSSize { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Dependency module (program ID) list
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public ulong[] DependencyModuleList { get; set; }
|
||||
#else
|
||||
public ulong[]? DependencyModuleList { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// SystemInfo
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public SystemInfo SystemInfo { get; set; }
|
||||
#else
|
||||
public SystemInfo? SystemInfo { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,95 +0,0 @@
|
||||
namespace SabreTools.Models.N3DS
|
||||
{
|
||||
/// <summary>
|
||||
/// The test data is the same one encountered in development DS/DSi cartridges.
|
||||
/// </summary>
|
||||
/// <see href="https://www.3dbrew.org/wiki/NCSD#TestData"/>
|
||||
public sealed class TestData
|
||||
{
|
||||
/// <summary>
|
||||
/// The bytes FF 00 FF 00 AA 55 AA 55.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Signature { get; set; }
|
||||
#else
|
||||
public byte[]? Signature { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// An ascending byte sequence equal to the offset mod 256 (08 09 0A ... FE FF 00 01 ... FF).
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] AscendingByteSequence { get; set; }
|
||||
#else
|
||||
public byte[]? AscendingByteSequence { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// A descending byte sequence equal to 255 minus the offset mod 256 (FF FE FD ... 00 FF DE ... 00).
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] DescendingByteSequence { get; set; }
|
||||
#else
|
||||
public byte[]? DescendingByteSequence { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Filled with 00 (0b00000000) bytes.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Filled00 { get; set; }
|
||||
#else
|
||||
public byte[]? Filled00 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Filled with FF (0b11111111) bytes.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] FilledFF { get; set; }
|
||||
#else
|
||||
public byte[]? FilledFF { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Filled with 0F (0b00001111) bytes.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Filled0F { get; set; }
|
||||
#else
|
||||
public byte[]? Filled0F { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Filled with F0 (0b11110000) bytes.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] FilledF0 { get; set; }
|
||||
#else
|
||||
public byte[]? FilledF0 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Filled with 55 (0b01010101) bytes.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Filled55 { get; set; }
|
||||
#else
|
||||
public byte[]? Filled55 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Filled with AA (0b10101010) bytes.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] FilledAA { get; set; }
|
||||
#else
|
||||
public byte[]? FilledAA { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// The final byte is 00 (0b00000000).
|
||||
/// </summary>
|
||||
public byte FinalByte { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
namespace SabreTools.Models.PortableExecutable
|
||||
{
|
||||
/// <summary>
|
||||
/// Contains information about each item in a menu resource that does not open a menu
|
||||
/// or a submenu. The structure definition provided here is for explanation only; it
|
||||
/// is not present in any standard header file.
|
||||
///
|
||||
/// Contains information about the menu items in a menu resource that open a menu
|
||||
/// or a submenu. The structure definition provided here is for explanation only;
|
||||
/// it is not present in any standard header file.
|
||||
/// </summary>
|
||||
/// <see href="https://learn.microsoft.com/en-us/windows/win32/menurc/normalmenuitem"/>
|
||||
/// <see href="https://learn.microsoft.com/en-us/windows/win32/menurc/popupmenuitem"/>
|
||||
public sealed class MenuItem
|
||||
{
|
||||
#region NORMALMENUITEM
|
||||
|
||||
/// <summary>
|
||||
/// The type of menu item.
|
||||
/// </summary>
|
||||
public MenuFlags NormalResInfo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// A null-terminated Unicode string that contains the text for this menu item.
|
||||
/// There is no fixed limit on the size of this string.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public string NormalMenuText { get; set; }
|
||||
#else
|
||||
public string? NormalMenuText { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
#region POPUPMENUITEM
|
||||
|
||||
/// <summary>
|
||||
/// Describes the menu item.
|
||||
/// </summary>
|
||||
public MenuFlags PopupItemType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Describes the menu item.
|
||||
/// </summary>
|
||||
public MenuFlags PopupState { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// A numeric expression that identifies the menu item that is passed in the
|
||||
/// WM_COMMAND message.
|
||||
/// </summary>
|
||||
public uint PopupID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// A set of bit flags that specify the type of menu item.
|
||||
/// </summary>
|
||||
public MenuFlags PopupResInfo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// A null-terminated Unicode string that contains the text for this menu item.
|
||||
/// There is no fixed limit on the size of this string.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public string PopupMenuText { get; set; }
|
||||
#else
|
||||
public string? PopupMenuText { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<!-- Assembly Properties -->
|
||||
<TargetFrameworks>net48;net6.0;net7.0;net8.0</TargetFrameworks>
|
||||
<RuntimeIdentifiers>win-x86;win-x64;linux-x64;osx-x64</RuntimeIdentifiers>
|
||||
<Version>1.1.2</Version>
|
||||
|
||||
<!-- Package Properties -->
|
||||
<Authors>Matt Nadareski</Authors>
|
||||
<Description>Common models used by other SabreTools projects</Description>
|
||||
<Copyright>Copyright (c) Matt Nadareski 2022-2023</Copyright>
|
||||
<PackageProjectUrl>https://github.com/SabreTools/</PackageProjectUrl>
|
||||
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||
<RepositoryUrl>https://github.com/SabreTools/SabreTools.Models</RepositoryUrl>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<PackageTags>model models executable protection archive</PackageTags>
|
||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(TargetFramework)'!='net48'">
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="README.md" Pack="true" PackagePath=""/>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.0.31903.59
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Models", "SabreTools.Models.csproj", "{51F0D5D9-7C2B-445A-8ECD-4A47B33609C4}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Models", "SabreTools.Models\SabreTools.Models.csproj", "{51F0D5D9-7C2B-445A-8ECD-4A47B33609C4}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.AACS
|
||||
{
|
||||
/// <summary>
|
||||
/// This record type is undocumented but found in real media key blocks
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public sealed class CopyrightRecord : Record
|
||||
{
|
||||
/// <summary>
|
||||
/// Null-terminated ASCII string representing the copyright
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public string Copyright { get; set; }
|
||||
#else
|
||||
public string? Copyright { get; set; }
|
||||
#endif
|
||||
[MarshalAs(UnmanagedType.LPStr)]
|
||||
public string? Copyright;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,9 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.AACS
|
||||
{
|
||||
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public sealed class DriveRevocationListEntry
|
||||
{
|
||||
/// <summary>
|
||||
@@ -9,17 +12,14 @@ namespace SabreTools.Models.AACS
|
||||
/// field indicates that only one ID is being revoked, a value of one
|
||||
/// in the Range field indicates two ID’s are being revoked, and so on.
|
||||
/// </summary>
|
||||
public ushort Range { get; set; }
|
||||
public ushort Range;
|
||||
|
||||
/// <summary>
|
||||
/// A 6-byte Drive ID value identifying the Licensed Drive being revoked
|
||||
/// (or the first in a range of Licensed Drives being revoked, in the
|
||||
/// case of a non-zero Range value).
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] DriveID { get; set; }
|
||||
#else
|
||||
public byte[]? DriveID { get; set; }
|
||||
#endif
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
|
||||
public byte[]? DriveID;
|
||||
}
|
||||
}
|
||||
@@ -21,10 +21,6 @@ namespace SabreTools.Models.AACS
|
||||
/// <summary>
|
||||
/// Revocation list entries
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public DriveRevocationSignatureBlock[] SignatureBlocks { get; set; }
|
||||
#else
|
||||
public DriveRevocationSignatureBlock?[]? SignatureBlocks { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -12,10 +12,6 @@ namespace SabreTools.Models.AACS
|
||||
/// A list of 8-byte Host Drive List Entry fields, the length of this
|
||||
/// list being equal to the number in the signature block.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public DriveRevocationListEntry[] EntryFields { get; set; }
|
||||
#else
|
||||
public DriveRevocationListEntry?[]? EntryFields { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -18,10 +18,6 @@ namespace SabreTools.Models.AACS
|
||||
/// determines that the signature does not verify or is omitted, it
|
||||
/// must refuse to use the Media Key.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] SignatureData { get; set; }
|
||||
#else
|
||||
public byte[]? SignatureData { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -6,10 +6,6 @@ namespace SabreTools.Models.AACS
|
||||
/// <summary>
|
||||
/// In this record, each subset-difference is encoded with 5 bytes.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public SubsetDifference[] SubsetDifferences { get; set; }
|
||||
#else
|
||||
public SubsetDifference?[]? SubsetDifferences { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,9 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.AACS
|
||||
{
|
||||
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public sealed class HostRevocationListEntry
|
||||
{
|
||||
/// <summary>
|
||||
@@ -9,17 +12,14 @@ namespace SabreTools.Models.AACS
|
||||
/// field indicates that only one ID is being revoked, a value of one
|
||||
/// in the Range field indicates two ID’s are being revoked, and so on.
|
||||
/// </summary>
|
||||
public ushort Range { get; set; }
|
||||
public ushort Range;
|
||||
|
||||
/// <summary>
|
||||
/// A 6-byte Host ID value identifying the host being revoked (or the
|
||||
/// first in a range of hosts being revoked, in the case of a non-zero
|
||||
/// Range value).
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] HostID { get; set; }
|
||||
#else
|
||||
public byte[]? HostID { get; set; }
|
||||
#endif
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
|
||||
public byte[]? HostID;
|
||||
}
|
||||
}
|
||||
@@ -24,10 +24,6 @@ namespace SabreTools.Models.AACS
|
||||
/// <summary>
|
||||
/// Revocation list entries
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public HostRevocationSignatureBlock[] SignatureBlocks { get; set; }
|
||||
#else
|
||||
public HostRevocationSignatureBlock?[]? SignatureBlocks { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -12,10 +12,6 @@ namespace SabreTools.Models.AACS
|
||||
/// A list of 8-byte Host Revocation List Entry fields, the length of this
|
||||
/// list being equal to the number in the signature block.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public HostRevocationListEntry[] EntryFields { get; set; }
|
||||
#else
|
||||
public HostRevocationListEntry?[]? EntryFields { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -9,10 +9,6 @@ namespace SabreTools.Models.AACS
|
||||
/// <summary>
|
||||
/// Records
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public Record[] Records { get; set; }
|
||||
#else
|
||||
public Record?[]? Records { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -13,10 +13,6 @@ namespace SabreTools.Models.AACS
|
||||
/// record. This 16 bytes is the ciphertext value C in the media
|
||||
/// key calculation.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[][] MediaKeyData { get; set; }
|
||||
#else
|
||||
public byte[][]? MediaKeyData { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,9 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.AACS
|
||||
{
|
||||
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public sealed class SubsetDifference
|
||||
{
|
||||
/// <summary>
|
||||
@@ -9,12 +12,12 @@ namespace SabreTools.Models.AACS
|
||||
/// the mask. For example, the value 0x01 denotes a mask of
|
||||
/// 0xFFFFFFFE; value 0x0A denotes a mask of 0xFFFFFC00.
|
||||
/// </summary>
|
||||
public byte Mask { get; set; }
|
||||
public byte Mask;
|
||||
|
||||
/// <summary>
|
||||
/// The last 4 bytes are the uv number, most significant
|
||||
/// byte first.
|
||||
/// </summary>
|
||||
public uint Number { get; set; }
|
||||
public uint Number;
|
||||
}
|
||||
}
|
||||
@@ -21,10 +21,6 @@ namespace SabreTools.Models.AACS
|
||||
/// Subset-Difference record, with 0 being the start of the record.
|
||||
/// </summary>
|
||||
// <remarks>UInt24 not UInt32</remarks>
|
||||
#if NET48
|
||||
public uint[] Offsets { get; set; }
|
||||
#else
|
||||
public uint[]? Offsets { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -19,10 +19,6 @@ namespace SabreTools.Models.AACS
|
||||
/// where 0xXXXXXXXXXXXXXXXX is an arbitrary 8-byte value, and Km is
|
||||
/// the correct final Media Key value.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] CiphertextValue { get; set; }
|
||||
#else
|
||||
public byte[]? CiphertextValue { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -7,438 +7,198 @@ namespace SabreTools.Models.ArchiveDotOrg
|
||||
public class File
|
||||
{
|
||||
[XmlAttribute("name")]
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>Is this a set of defined values?</remarks>
|
||||
[XmlAttribute("source")]
|
||||
#if NET48
|
||||
public string Source { get; set; }
|
||||
#else
|
||||
public string? Source { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("btih")]
|
||||
#if NET48
|
||||
public string BitTorrentMagnetHash { get; set; }
|
||||
#else
|
||||
public string? BitTorrentMagnetHash { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("mtime")]
|
||||
#if NET48
|
||||
public string LastModifiedTime { get; set; }
|
||||
#else
|
||||
public string? LastModifiedTime { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("size")]
|
||||
#if NET48
|
||||
public string Size { get; set; }
|
||||
#else
|
||||
public string? Size { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("md5")]
|
||||
#if NET48
|
||||
public string MD5 { get; set; }
|
||||
#else
|
||||
public string? MD5 { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("crc32")]
|
||||
#if NET48
|
||||
public string CRC32 { get; set; }
|
||||
#else
|
||||
public string? CRC32 { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("sha1")]
|
||||
#if NET48
|
||||
public string SHA1 { get; set; }
|
||||
#else
|
||||
public string? SHA1 { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("filecount")]
|
||||
#if NET48
|
||||
public string FileCount { get; set; }
|
||||
#else
|
||||
public string? FileCount { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>Is this a set of defined values?</remarks>
|
||||
[XmlElement("format")]
|
||||
#if NET48
|
||||
public string Format { get; set; }
|
||||
#else
|
||||
public string? Format { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("original")]
|
||||
#if NET48
|
||||
public string Original { get; set; }
|
||||
#else
|
||||
public string? Original { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>Is this a set of defined values?</remarks>
|
||||
[XmlElement("summation")]
|
||||
#if NET48
|
||||
public string Summation { get; set; }
|
||||
#else
|
||||
public string? Summation { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("matrix_number")]
|
||||
#if NET48
|
||||
public string MatrixNumber { get; set; }
|
||||
#else
|
||||
public string? MatrixNumber { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("collection-catalog-number")]
|
||||
#if NET48
|
||||
public string CollectionCatalogNumber { get; set; }
|
||||
#else
|
||||
public string? CollectionCatalogNumber { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("publisher")]
|
||||
#if NET48
|
||||
public string Publisher { get; set; }
|
||||
#else
|
||||
public string? Publisher { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("comment")]
|
||||
#if NET48
|
||||
public string Comment { get; set; }
|
||||
#else
|
||||
public string? Comment { get; set; }
|
||||
#endif
|
||||
|
||||
#region ASR-Related
|
||||
|
||||
[XmlElement("asr_detected_lang")]
|
||||
#if NET48
|
||||
public string ASRDetectedLang { get; set; }
|
||||
#else
|
||||
public string? ASRDetectedLang { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("asr_detected_lang_conf")]
|
||||
#if NET48
|
||||
public string ASRDetectedLangConf { get; set; }
|
||||
#else
|
||||
public string? ASRDetectedLangConf { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("asr_transcribed_lang")]
|
||||
#if NET48
|
||||
public string ASRTranscribedLang { get; set; }
|
||||
#else
|
||||
public string? ASRTranscribedLang { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("whisper_asr_module_version")]
|
||||
#if NET48
|
||||
public string WhisperASRModuleVersion { get; set; }
|
||||
#else
|
||||
public string? WhisperASRModuleVersion { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("whisper_model_hash")]
|
||||
#if NET48
|
||||
public string WhisperModelHash { get; set; }
|
||||
#else
|
||||
public string? WhisperModelHash { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("whisper_model_name")]
|
||||
#if NET48
|
||||
public string WhisperModelName { get; set; }
|
||||
#else
|
||||
public string? WhisperModelName { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("whisper_version")]
|
||||
#if NET48
|
||||
public string WhisperVersion { get; set; }
|
||||
#else
|
||||
public string? WhisperVersion { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
#region OCR-Related
|
||||
|
||||
[XmlElement("cloth_cover_detection_module_version")]
|
||||
#if NET48
|
||||
public string ClothCoverDetectionModuleVersion { get; set; }
|
||||
#else
|
||||
public string? ClothCoverDetectionModuleVersion { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("hocr_char_to_word_hocr_version")]
|
||||
#if NET48
|
||||
public string hOCRCharToWordhOCRVersion { get; set; }
|
||||
#else
|
||||
public string? hOCRCharToWordhOCRVersion { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("hocr_char_to_word_module_version")]
|
||||
#if NET48
|
||||
public string hOCRCharToWordModuleVersion { get; set; }
|
||||
#else
|
||||
public string? hOCRCharToWordModuleVersion { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("hocr_fts_text_hocr_version")]
|
||||
#if NET48
|
||||
public string hOCRFtsTexthOCRVersion { get; set; }
|
||||
#else
|
||||
public string? hOCRFtsTexthOCRVersion { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("hocr_fts_text_module_version")]
|
||||
#if NET48
|
||||
public string hOCRFtsTextModuleVersion { get; set; }
|
||||
#else
|
||||
public string? hOCRFtsTextModuleVersion { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("hocr_pageindex_hocr_version")]
|
||||
#if NET48
|
||||
public string hOCRPageIndexhOCRVersion { get; set; }
|
||||
#else
|
||||
public string? hOCRPageIndexhOCRVersion { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("hocr_pageindex_module_version")]
|
||||
#if NET48
|
||||
public string hOCRPageIndexModuleVersion { get; set; }
|
||||
#else
|
||||
public string? hOCRPageIndexModuleVersion { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("ocr")]
|
||||
#if NET48
|
||||
public string TesseractOCR { get; set; }
|
||||
#else
|
||||
public string? TesseractOCR { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("ocr_converted")]
|
||||
#if NET48
|
||||
public string TesseractOCRConverted { get; set; }
|
||||
#else
|
||||
public string? TesseractOCRConverted { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("ocr_detected_lang")]
|
||||
#if NET48
|
||||
public string TesseractOCRDetectedLang { get; set; }
|
||||
#else
|
||||
public string? TesseractOCRDetectedLang { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("ocr_detected_lang_conf")]
|
||||
#if NET48
|
||||
public string TesseractOCRDetectedLangConf { get; set; }
|
||||
#else
|
||||
public string? TesseractOCRDetectedLangConf { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("ocr_detected_script")]
|
||||
#if NET48
|
||||
public string TesseractOCRDetectedScript { get; set; }
|
||||
#else
|
||||
public string? TesseractOCRDetectedScript { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("ocr_detected_script_conf")]
|
||||
#if NET48
|
||||
public string TesseractOCRDetectedScriptConf { get; set; }
|
||||
#else
|
||||
public string? TesseractOCRDetectedScriptConf { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("ocr_module_version")]
|
||||
#if NET48
|
||||
public string TesseractOCRModuleVersion { get; set; }
|
||||
#else
|
||||
public string? TesseractOCRModuleVersion { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("ocr_parameters")]
|
||||
#if NET48
|
||||
public string TesseractOCRParameters { get; set; }
|
||||
#else
|
||||
public string? TesseractOCRParameters { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("pdf_module_version")]
|
||||
#if NET48
|
||||
public string PDFModuleVersion { get; set; }
|
||||
#else
|
||||
public string? PDFModuleVersion { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("word_conf_0_10")]
|
||||
#if NET48
|
||||
public string WordConfidenceInterval0To10 { get; set; }
|
||||
#else
|
||||
public string? WordConfidenceInterval0To10 { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("word_conf_11_20")]
|
||||
#if NET48
|
||||
public string WordConfidenceInterval11To20 { get; set; }
|
||||
#else
|
||||
public string? WordConfidenceInterval11To20 { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("word_conf_21_30")]
|
||||
#if NET48
|
||||
public string WordConfidenceInterval21To30 { get; set; }
|
||||
#else
|
||||
public string? WordConfidenceInterval21To30 { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("word_conf_31_40")]
|
||||
#if NET48
|
||||
public string WordConfidenceInterval31To40 { get; set; }
|
||||
#else
|
||||
public string? WordConfidenceInterval31To40 { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("word_conf_41_50")]
|
||||
#if NET48
|
||||
public string WordConfidenceInterval41To50 { get; set; }
|
||||
#else
|
||||
public string? WordConfidenceInterval41To50 { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("word_conf_51_60")]
|
||||
#if NET48
|
||||
public string WordConfidenceInterval51To60 { get; set; }
|
||||
#else
|
||||
public string? WordConfidenceInterval51To60 { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("word_conf_61_70")]
|
||||
#if NET48
|
||||
public string WordConfidenceInterval61To70 { get; set; }
|
||||
#else
|
||||
public string? WordConfidenceInterval61To70 { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("word_conf_71_80")]
|
||||
#if NET48
|
||||
public string WordConfidenceInterval71To80 { get; set; }
|
||||
#else
|
||||
public string? WordConfidenceInterval71To80 { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("word_conf_81_90")]
|
||||
#if NET48
|
||||
public string WordConfidenceInterval81To90 { get; set; }
|
||||
#else
|
||||
public string? WordConfidenceInterval81To90 { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("word_conf_91_100")]
|
||||
#if NET48
|
||||
public string WordConfidenceInterval91To100 { get; set; }
|
||||
#else
|
||||
public string? WordConfidenceInterval91To100 { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
#region Media-Related
|
||||
|
||||
[XmlElement("album")]
|
||||
#if NET48
|
||||
public string Album { get; set; }
|
||||
#else
|
||||
public string? Album { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("artist")]
|
||||
#if NET48
|
||||
public string Artist { get; set; }
|
||||
#else
|
||||
public string? Artist { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("bitrate")]
|
||||
#if NET48
|
||||
public string Bitrate { get; set; }
|
||||
#else
|
||||
public string? Bitrate { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("creator")]
|
||||
#if NET48
|
||||
public string Creator { get; set; }
|
||||
#else
|
||||
public string? Creator { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("height")]
|
||||
#if NET48
|
||||
public string Height { get; set; }
|
||||
#else
|
||||
public string? Height { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("length")]
|
||||
#if NET48
|
||||
public string Length { get; set; }
|
||||
#else
|
||||
public string? Length { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("preview-image")]
|
||||
#if NET48
|
||||
public string PreviewImage { get; set; }
|
||||
#else
|
||||
public string? PreviewImage { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>Is this a set of defined values?</remarks>
|
||||
[XmlElement("rotation")]
|
||||
#if NET48
|
||||
public string Rotation { get; set; }
|
||||
#else
|
||||
public string? Rotation { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("title")]
|
||||
#if NET48
|
||||
public string Title { get; set; }
|
||||
#else
|
||||
public string? Title { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("track")]
|
||||
#if NET48
|
||||
public string Track { get; set; }
|
||||
#else
|
||||
public string? Track { get; set; }
|
||||
#endif
|
||||
|
||||
[XmlElement("width")]
|
||||
#if NET48
|
||||
public string Width { get; set; }
|
||||
#else
|
||||
public string? Width { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -446,19 +206,11 @@ namespace SabreTools.Models.ArchiveDotOrg
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
[XmlAnyAttribute]
|
||||
#if NET48
|
||||
public XmlAttribute[] ADDITIONAL_ATTRIBUTES { get; set; }
|
||||
#else
|
||||
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
[XmlAnyElement]
|
||||
#if NET48
|
||||
public object[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -7,29 +7,17 @@ namespace SabreTools.Models.ArchiveDotOrg
|
||||
public class Files
|
||||
{
|
||||
[XmlElement("file")]
|
||||
#if NET48
|
||||
public File[] File { get; set; }
|
||||
#else
|
||||
public File?[]? File { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
[XmlAnyAttribute]
|
||||
#if NET48
|
||||
public XmlAttribute[] ADDITIONAL_ATTRIBUTES { get; set; }
|
||||
#else
|
||||
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
[XmlAnyElement]
|
||||
#if NET48
|
||||
public object[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -6,16 +6,8 @@ namespace SabreTools.Models.AttractMode
|
||||
public class MetadataFile
|
||||
{
|
||||
[Required]
|
||||
#if NET48
|
||||
public string[] Header { get; set; }
|
||||
#else
|
||||
public string[]? Header { get; set; }
|
||||
#endif
|
||||
|
||||
#if NET48
|
||||
public Row[] Row { get; set; }
|
||||
#else
|
||||
public Row?[]? Row { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
58
SabreTools.Models/AttractMode/Row.cs
Normal file
58
SabreTools.Models/AttractMode/Row.cs
Normal file
@@ -0,0 +1,58 @@
|
||||
namespace SabreTools.Models.AttractMode
|
||||
{
|
||||
public class Row
|
||||
{
|
||||
/// <remarks>Also called Romname</remarks>
|
||||
[Required]
|
||||
public string? Name { get; set; }
|
||||
|
||||
public string? Title { get; set; }
|
||||
|
||||
public string? Emulator { get; set; }
|
||||
|
||||
public string? CloneOf { get; set; }
|
||||
|
||||
public string? Year { get; set; }
|
||||
|
||||
public string? Manufacturer { get; set; }
|
||||
|
||||
public string? Category { get; set; }
|
||||
|
||||
public string? Players { get; set; }
|
||||
|
||||
public string? Rotation { get; set; }
|
||||
|
||||
public string? Control { get; set; }
|
||||
|
||||
public string? Status { get; set; }
|
||||
|
||||
public string? DisplayCount { get; set; }
|
||||
|
||||
public string? DisplayType { get; set; }
|
||||
|
||||
public string? AltRomname { get; set; }
|
||||
|
||||
public string? AltTitle { get; set; }
|
||||
|
||||
public string? Extra { get; set; }
|
||||
|
||||
public string? Buttons { get; set; }
|
||||
|
||||
public string? Favorite { get; set; }
|
||||
|
||||
public string? Tags { get; set; }
|
||||
|
||||
public string? PlayedCount { get; set; }
|
||||
|
||||
public string? PlayedTime { get; set; }
|
||||
|
||||
public string? FileIsAvailable { get; set; }
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
public string[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -6,20 +6,14 @@ namespace SabreTools.Models.BDPlus
|
||||
/// <summary>
|
||||
/// "BDSVM_CC"
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public string Signature { get; set; }
|
||||
#else
|
||||
/// <remarks>8 bytes</remarks>
|
||||
public string? Signature { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// 5 bytes of unknown data
|
||||
/// Unknown data
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Unknown1 { get; set; }
|
||||
#else
|
||||
/// <remarks>5 bytes</remarks>
|
||||
public byte[]? Unknown1 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Version year
|
||||
@@ -37,13 +31,10 @@ namespace SabreTools.Models.BDPlus
|
||||
public byte Day { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 4 bytes of unknown data
|
||||
/// Unknown data
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Unknown2 { get; set; }
|
||||
#else
|
||||
/// <remarks>4 bytes</remarks>
|
||||
public byte[]? Unknown2 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Length
|
||||
@@ -53,10 +44,6 @@ namespace SabreTools.Models.BDPlus
|
||||
/// <summary>
|
||||
/// Length bytes of data
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Data { get; set; }
|
||||
#else
|
||||
public byte[]? Data { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -9,19 +9,11 @@
|
||||
/// <summary>
|
||||
/// Header
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public Header Header { get; set; }
|
||||
#else
|
||||
public Header? Header { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Files
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public FileEntry[] Files { get; set; }
|
||||
#else
|
||||
public FileEntry?[]? Files { get; set; }
|
||||
#endif
|
||||
public FileEntry[]? Files { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -14,11 +14,7 @@
|
||||
/// <summary>
|
||||
/// Name
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Uncompressed size
|
||||
@@ -1,28 +1,28 @@
|
||||
namespace SabreTools.Models.BFPK
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.BFPK
|
||||
{
|
||||
/// <summary>
|
||||
/// Header
|
||||
/// </summary>
|
||||
/// <see cref="https://forum.xentax.com/viewtopic.php?t=5102"/>
|
||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
|
||||
public sealed class Header
|
||||
{
|
||||
/// <summary>
|
||||
/// "BFPK"
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public string Magic { get; set; }
|
||||
#else
|
||||
public string? Magic { get; set; }
|
||||
#endif
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
|
||||
public string? Magic;
|
||||
|
||||
/// <summary>
|
||||
/// Version
|
||||
/// </summary>
|
||||
public int Version { get; set; }
|
||||
public int Version;
|
||||
|
||||
/// <summary>
|
||||
/// Files
|
||||
/// </summary>
|
||||
public int Files { get; set; }
|
||||
public int Files;
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,5 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.BMP
|
||||
{
|
||||
/// <summary>
|
||||
@@ -5,31 +7,32 @@ namespace SabreTools.Models.BMP
|
||||
/// and layout of a file that contains a DIB.
|
||||
/// </summary>
|
||||
/// <see href="https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapfileheader"/>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public sealed class BITMAPFILEHEADER
|
||||
{
|
||||
/// <summary>
|
||||
/// The file type; must be BM.
|
||||
/// </summary>
|
||||
public ushort Type { get; set; }
|
||||
public ushort Type;
|
||||
|
||||
/// <summary>
|
||||
/// The size, in bytes, of the bitmap file.
|
||||
/// </summary>
|
||||
public uint Size { get; set; }
|
||||
public uint Size;
|
||||
|
||||
/// <summary>
|
||||
/// Reserved; must be zero.
|
||||
/// </summary>
|
||||
public ushort Reserved1 { get; set; }
|
||||
public ushort Reserved1;
|
||||
|
||||
/// <summary>
|
||||
/// Reserved; must be zero.
|
||||
/// </summary>
|
||||
public ushort Reserved2 { get; set; }
|
||||
public ushort Reserved2;
|
||||
|
||||
/// <summary>
|
||||
/// The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.
|
||||
/// </summary>
|
||||
public uint OffBits { get; set; }
|
||||
public uint OffBits;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,12 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.BMP
|
||||
{
|
||||
/// <summary>
|
||||
/// The BITMAPINFOHEADER structure contains information about the dimensions and
|
||||
/// color format of a device-independent bitmap (DIB).
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public sealed class BITMAPINFOHEADER
|
||||
{
|
||||
/// <summary>
|
||||
@@ -11,12 +14,12 @@ namespace SabreTools.Models.BMP
|
||||
/// not include the size of the color table or the size of the color masks,
|
||||
/// if they are appended to the end of structure.
|
||||
/// </summary>
|
||||
public uint Size { get; set; }
|
||||
public uint Size;
|
||||
|
||||
/// <summary>
|
||||
/// Specifies the width of the bitmap, in pixels.
|
||||
/// </summary>
|
||||
public int Width { get; set; }
|
||||
public int Width;
|
||||
|
||||
/// <summary>
|
||||
/// Specifies the height of the bitmap, in pixels.
|
||||
@@ -30,19 +33,19 @@ namespace SabreTools.Models.BMP
|
||||
/// or negative biHeight.
|
||||
/// - For compressed formats, biHeight must be positive, regardless of image orientation.
|
||||
/// </summary>
|
||||
public int Height { get; set; }
|
||||
public int Height;
|
||||
|
||||
/// <summary>
|
||||
/// Specifies the number of planes for the target device. This value must be set to 1.
|
||||
/// </summary>
|
||||
public ushort Planes { get; set; }
|
||||
public ushort Planes;
|
||||
|
||||
/// <summary>
|
||||
/// Specifies the number of bits per pixel (bpp). For uncompressed formats, this value
|
||||
/// is the average number of bits per pixel. For compressed formats, this value is the
|
||||
/// implied bit depth of the uncompressed image, after the image has been decoded.
|
||||
/// </summary>
|
||||
public ushort BitCount { get; set; }
|
||||
public ushort BitCount;
|
||||
|
||||
/// <summary>
|
||||
/// For compressed video and YUV formats, this member is a FOURCC code, specified as a
|
||||
@@ -59,36 +62,36 @@ namespace SabreTools.Models.BMP
|
||||
/// If biCompression equals BI_BITFIELDS, the format is either RGB 555 or RGB 565. Use
|
||||
/// the subtype GUID in the AM_MEDIA_TYPE structure to determine the specific RGB type.
|
||||
/// </summary>
|
||||
public uint Compression { get; set; }
|
||||
public uint Compression;
|
||||
|
||||
/// <summary>
|
||||
/// Specifies the size, in bytes, of the image. This can be set to 0 for uncompressed
|
||||
/// RGB bitmaps.
|
||||
/// </summary>
|
||||
public uint SizeImage { get; set; }
|
||||
public uint SizeImage;
|
||||
|
||||
/// <summary>
|
||||
/// Specifies the horizontal resolution, in pixels per meter, of the target device for
|
||||
/// the bitmap.
|
||||
/// </summary>
|
||||
public int XPelsPerMeter { get; set; }
|
||||
public int XPelsPerMeter;
|
||||
|
||||
/// <summary>
|
||||
/// Specifies the vertical resolution, in pixels per meter, of the target device for
|
||||
/// the bitmap.
|
||||
/// </summary>
|
||||
public int YPelsPerMeter { get; set; }
|
||||
public int YPelsPerMeter;
|
||||
|
||||
/// <summary>
|
||||
/// Specifies the number of color indices in the color table that are actually used by
|
||||
/// the bitmap.
|
||||
/// </summary>
|
||||
public uint ClrUsed { get; set; }
|
||||
public uint ClrUsed;
|
||||
|
||||
/// <summary>
|
||||
/// Specifies the number of color indices that are considered important for displaying
|
||||
/// the bitmap. If this value is zero, all colors are important.
|
||||
/// </summary>
|
||||
public uint ClrImportant { get; set; }
|
||||
public uint ClrImportant;
|
||||
}
|
||||
}
|
||||
@@ -9,37 +9,21 @@ namespace SabreTools.Models.BSP
|
||||
/// <summary>
|
||||
/// Header data
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public Header Header { get; set; }
|
||||
#else
|
||||
public Header? Header { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Lumps
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public Lump[] Lumps { get; set; }
|
||||
#else
|
||||
public Lump?[]? Lumps { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Texture header data
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public TextureHeader TextureHeader { get; set; }
|
||||
#else
|
||||
public TextureHeader? TextureHeader { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Textures
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public Texture[] Textures { get; set; }
|
||||
#else
|
||||
public Texture?[]? Textures { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,14 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.BSP
|
||||
{
|
||||
/// <see href="https://github.com/RavuAlHemio/hllib/blob/master/HLLib/BSPFile.h"/>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public sealed class Header
|
||||
{
|
||||
/// <summary>
|
||||
/// Version
|
||||
/// </summary>
|
||||
public uint Version { get; set; }
|
||||
public uint Version;
|
||||
}
|
||||
}
|
||||
@@ -1,16 +1,19 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.BSP
|
||||
{
|
||||
/// <see href="https://github.com/RavuAlHemio/hllib/blob/master/HLLib/BSPFile.h"/>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public sealed class Lump
|
||||
{
|
||||
/// <summary>
|
||||
/// Offset
|
||||
/// </summary>
|
||||
public uint Offset { get; set; }
|
||||
public uint Offset;
|
||||
|
||||
/// <summary>
|
||||
/// Length
|
||||
/// </summary>
|
||||
public uint Length { get; set; }
|
||||
public uint Length;
|
||||
}
|
||||
}
|
||||
@@ -6,11 +6,7 @@ namespace SabreTools.Models.BSP
|
||||
/// <summary>
|
||||
/// Name
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Width
|
||||
@@ -25,20 +21,12 @@ namespace SabreTools.Models.BSP
|
||||
/// <summary>
|
||||
/// Offsets
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public uint[] Offsets { get; set; }
|
||||
#else
|
||||
public uint[]? Offsets { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Texture data
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] TextureData { get; set; }
|
||||
#else
|
||||
public byte[]? TextureData { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Palette size
|
||||
@@ -48,10 +36,6 @@ namespace SabreTools.Models.BSP
|
||||
/// <summary>
|
||||
/// Palette data
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] PaletteData { get; set; }
|
||||
#else
|
||||
public byte[]? PaletteData { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -11,10 +11,7 @@ namespace SabreTools.Models.BSP
|
||||
/// <summary>
|
||||
/// Offsets
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public uint[] Offsets { get; set; }
|
||||
#else
|
||||
/// <remarks>TextureCount entries</remarks>
|
||||
public uint[]? Offsets { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -12,11 +12,7 @@ namespace SabreTools.Models.CFB
|
||||
/// <summary>
|
||||
/// Compound file header
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public FileHeader Header { get; set; }
|
||||
#else
|
||||
public FileHeader? Header { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// The FAT is the main allocator for space within a compound file.
|
||||
@@ -29,11 +25,7 @@ namespace SabreTools.Models.CFB
|
||||
///
|
||||
/// If Header Major Version is 4, there MUST be 1,024 fields specified to fill a 4,096-byte sector
|
||||
/// </remarks>
|
||||
#if NET48
|
||||
public SectorNumber[] FATSectorNumbers { get; set; }
|
||||
#else
|
||||
public SectorNumber?[]? FATSectorNumbers { get; set; }
|
||||
#endif
|
||||
public SectorNumber[]? FATSectorNumbers { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The mini FAT is used to allocate space in the mini stream.
|
||||
@@ -46,11 +38,7 @@ namespace SabreTools.Models.CFB
|
||||
///
|
||||
/// If Header Major Version is 4, there MUST be 1,024 fields specified to fill a 4,096-byte sector
|
||||
/// </remarks>
|
||||
#if NET48
|
||||
public SectorNumber[] MiniFATSectorNumbers { get; set; }
|
||||
#else
|
||||
public SectorNumber?[]? MiniFATSectorNumbers { get; set; }
|
||||
#endif
|
||||
public SectorNumber[]? MiniFATSectorNumbers { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The DIFAT array is used to represent storage of the FAT sectors.
|
||||
@@ -67,11 +55,7 @@ namespace SabreTools.Models.CFB
|
||||
/// If Header Major Version is 4, there MUST be 1,023 fields specified
|
||||
/// to fill a 4,096-byte sector minus the "Next DIFAT Sector Location" field.
|
||||
/// </remarks>
|
||||
#if NET48
|
||||
public SectorNumber[] DIFATSectorNumbers { get; set; }
|
||||
#else
|
||||
public SectorNumber?[]? DIFATSectorNumbers { get; set; }
|
||||
#endif
|
||||
public SectorNumber[]? DIFATSectorNumbers { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The directory entry array is an array of directory entries that
|
||||
@@ -103,10 +87,6 @@ namespace SabreTools.Models.CFB
|
||||
/// all zeroes. The Modified Time field in the root storage directory
|
||||
/// entry MAY be all zeroes.
|
||||
/// <remarks>
|
||||
#if NET48
|
||||
public DirectoryEntry[] DirectoryEntries { get; set; }
|
||||
#else
|
||||
public DirectoryEntry?[]? DirectoryEntries { get; set; }
|
||||
#endif
|
||||
public DirectoryEntry[]? DirectoryEntries { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.CFB
|
||||
{
|
||||
/// <see href="https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-CFB/%5bMS-CFB%5d.pdf"/>
|
||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||||
public sealed class DirectoryEntry
|
||||
{
|
||||
/// <summary>
|
||||
@@ -16,17 +18,15 @@ namespace SabreTools.Models.CFB
|
||||
/// The following characters are illegal and MUST NOT be part of the
|
||||
/// name: '/', '\', ':', '!'.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
/// <remarks>64 bytes</remarks>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
|
||||
public string? Name;
|
||||
|
||||
/// <summary>
|
||||
/// This field MUST be 0x00, 0x01, 0x02, or 0x05, depending on the
|
||||
/// actual type of object. All other values are not valid.
|
||||
/// </summary>
|
||||
public ushort NameLength { get; set; }
|
||||
public ushort NameLength;
|
||||
|
||||
/// <summary>
|
||||
/// This field MUST match the length of the Directory Entry Name Unicode
|
||||
@@ -34,31 +34,36 @@ namespace SabreTools.Models.CFB
|
||||
/// terminating null character in the count. This length MUST NOT exceed 64,
|
||||
/// the maximum size of the Directory Entry Name field.
|
||||
/// </summary>
|
||||
public ObjectType ObjectType { get; set; }
|
||||
[MarshalAs(UnmanagedType.U1)]
|
||||
public ObjectType ObjectType;
|
||||
|
||||
/// <summary>
|
||||
/// This field MUST be 0x00 (red) or 0x01 (black). All other values are not valid.
|
||||
/// </summary>
|
||||
public ColorFlag ColorFlag { get; set; }
|
||||
[MarshalAs(UnmanagedType.U1)]
|
||||
public ColorFlag ColorFlag;
|
||||
|
||||
/// <summary>
|
||||
/// This field contains the stream ID of the left sibling. If there
|
||||
/// is no left sibling, the field MUST be set to NOSTREAM (0xFFFFFFFF).
|
||||
/// </summary>
|
||||
public StreamID LeftSiblingID { get; set; }
|
||||
[MarshalAs(UnmanagedType.U4)]
|
||||
public StreamID LeftSiblingID;
|
||||
|
||||
/// <summary>
|
||||
/// This field contains the stream ID of the right sibling. If there
|
||||
/// is no right sibling, the field MUST be set to NOSTREAM (0xFFFFFFFF).
|
||||
/// </summary>
|
||||
public StreamID RightSiblingID { get; set; }
|
||||
[MarshalAs(UnmanagedType.U4)]
|
||||
public StreamID RightSiblingID;
|
||||
|
||||
/// <summary>
|
||||
/// This field contains the stream ID of a child object. If there is no
|
||||
/// child object, including all entries for stream objects, the field
|
||||
/// MUST be set to NOSTREAM (0xFFFFFFFF).
|
||||
/// </summary>
|
||||
public StreamID ChildID { get; set; }
|
||||
[MarshalAs(UnmanagedType.U4)]
|
||||
public StreamID ChildID;
|
||||
|
||||
/// <summary>
|
||||
/// This field contains an object class GUID, if this entry is for a
|
||||
@@ -71,7 +76,7 @@ namespace SabreTools.Models.CFB
|
||||
/// this value is not all zeroes, the object class GUID can be used as a
|
||||
/// parameter to start applications.
|
||||
/// </summary>
|
||||
public Guid CLSID { get; set; }
|
||||
public Guid CLSID;
|
||||
|
||||
/// <summary>
|
||||
/// This field contains the user-defined flags if this entry is for a storage
|
||||
@@ -82,7 +87,7 @@ namespace SabreTools.Models.CFB
|
||||
/// objects without explicitly setting state bits, it MUST write all zeroes
|
||||
/// by default.
|
||||
/// </summary>
|
||||
public uint StateBits { get; set; }
|
||||
public uint StateBits;
|
||||
|
||||
/// <summary>
|
||||
/// This field contains the creation time for a storage object, or all zeroes
|
||||
@@ -92,7 +97,7 @@ namespace SabreTools.Models.CFB
|
||||
/// object, this field MUST be all zeroes, and the creation time is retrieved
|
||||
/// or set on the compound file itself.
|
||||
/// </summary>
|
||||
public ulong CreationTime { get; set; }
|
||||
public ulong CreationTime;
|
||||
|
||||
/// <summary>
|
||||
/// This field contains the modification time for a storage object, or all
|
||||
@@ -102,7 +107,7 @@ namespace SabreTools.Models.CFB
|
||||
/// storage object, this field MAY<2> be set to all zeroes, and the modified
|
||||
/// time is retrieved or set on the compound file itself.
|
||||
/// </summary>
|
||||
public ulong ModifiedTime { get; set; }
|
||||
public ulong ModifiedTime;
|
||||
|
||||
/// <summary>
|
||||
/// This field contains the first sector location if this is a stream object.
|
||||
@@ -110,7 +115,7 @@ namespace SabreTools.Models.CFB
|
||||
/// mini stream, if the mini stream exists. For a storage object, this field MUST
|
||||
/// be set to all zeroes.
|
||||
/// </summary>
|
||||
public uint StartingSectorLocation { get; set; }
|
||||
public uint StartingSectorLocation;
|
||||
|
||||
/// <summary>
|
||||
/// This 64-bit integer field contains the size of the user-defined data if this
|
||||
@@ -132,6 +137,6 @@ namespace SabreTools.Models.CFB
|
||||
/// unless there is a specific reason to do otherwise (for example, a parser whose
|
||||
/// purpose is to verify the correctness of a compound file).
|
||||
/// </remarks>
|
||||
public ulong StreamSize { get; set; }
|
||||
public ulong StreamSize;
|
||||
}
|
||||
}
|
||||
@@ -1,38 +1,40 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.CFB
|
||||
{
|
||||
/// <see href="https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-CFB/%5bMS-CFB%5d.pdf"/>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public sealed class FileHeader
|
||||
{
|
||||
/// <summary>
|
||||
/// Iddentification signature for the compound file structure, and MUST be
|
||||
/// set to the value 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1.
|
||||
/// </summary>
|
||||
public ulong Signature { get; set; }
|
||||
public ulong Signature;
|
||||
|
||||
/// <summary>
|
||||
/// Reserved and unused class ID that MUST be set to all zeroes (CLSID_NULL)
|
||||
/// </summary>
|
||||
public Guid CLSID { get; set; }
|
||||
public Guid CLSID;
|
||||
|
||||
/// <summary>
|
||||
/// Version number for nonbreaking changes. This field SHOULD be set to
|
||||
/// 0x003E if the major version field is either 0x0003 or 0x0004.
|
||||
/// </summary>
|
||||
public ushort MinorVersion { get; set; }
|
||||
public ushort MinorVersion;
|
||||
|
||||
/// <summary>
|
||||
/// Version number for breaking changes. This field MUST be set to either
|
||||
/// 0x0003 (version 3) or 0x0004 (version 4).
|
||||
/// </summary>
|
||||
public ushort MajorVersion { get; set; }
|
||||
public ushort MajorVersion;
|
||||
|
||||
/// <summary>
|
||||
/// This field MUST be set to 0xFFFE. This field is a byte order mark for
|
||||
/// all integer fields, specifying little-endian byte order.
|
||||
/// </summary>
|
||||
public ushort ByteOrder { get; set; }
|
||||
public ushort ByteOrder;
|
||||
|
||||
/// <summary>
|
||||
/// This field MUST be set to 0x0009, or 0x000c, depending on the Major
|
||||
@@ -45,23 +47,21 @@ namespace SabreTools.Models.CFB
|
||||
/// If Major Version is 4, the Sector Shift MUST be 0x000C, specifying a
|
||||
/// sector size of 4096 bytes.
|
||||
/// </summary>
|
||||
public ushort SectorShift { get; set; }
|
||||
public ushort SectorShift;
|
||||
|
||||
/// <summary>
|
||||
/// This field MUST be set to 0x0006. This field specifies the sector size
|
||||
/// of the Mini Stream as a power of 2. The sector size of the Mini Stream
|
||||
/// MUST be 64 bytes.
|
||||
/// </summary>
|
||||
public ushort MiniSectorShift { get; set; }
|
||||
public ushort MiniSectorShift;
|
||||
|
||||
/// <summary>
|
||||
/// This field MUST be set to all zeroes.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Reserved { get; set; }
|
||||
#else
|
||||
public byte[]? Reserved { get; set; }
|
||||
#endif
|
||||
/// <remarks>6 bytes</remarks>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
|
||||
public byte[]? Reserved;
|
||||
|
||||
/// <summary>
|
||||
/// This integer field contains the count of the number of directory sectors
|
||||
@@ -70,18 +70,18 @@ namespace SabreTools.Models.CFB
|
||||
/// If Major Version is 3, the Number of Directory Sectors MUST be zero. This
|
||||
/// field is not supported for version 3 compound files.
|
||||
/// </summary>
|
||||
public uint NumberOfDirectorySectors { get; set; }
|
||||
public uint NumberOfDirectorySectors;
|
||||
|
||||
/// <summary>
|
||||
/// This integer field contains the count of the number of FAT sectors in the
|
||||
/// compound file.
|
||||
/// </summary>
|
||||
public uint NumberOfFATSectors { get; set; }
|
||||
public uint NumberOfFATSectors;
|
||||
|
||||
/// <summary>
|
||||
/// This integer field contains the starting sector number for the directory stream.
|
||||
/// </summary>
|
||||
public uint FirstDirectorySectorLocation { get; set; }
|
||||
public uint FirstDirectorySectorLocation;
|
||||
|
||||
/// <summary>
|
||||
/// This integer field MAY contain a sequence number that is incremented every time
|
||||
@@ -89,7 +89,7 @@ namespace SabreTools.Models.CFB
|
||||
/// This is the field that MUST be set to all zeroes if file transactions are not
|
||||
/// implemented.
|
||||
/// </summary>
|
||||
public uint TransactionSignatureNumber { get; set; }
|
||||
public uint TransactionSignatureNumber;
|
||||
|
||||
/// <summary>
|
||||
/// This integer field MUST be set to 0x00001000. This field specifies the maximum
|
||||
@@ -98,38 +98,36 @@ namespace SabreTools.Models.CFB
|
||||
/// greater than or equal to this cutoff size must be allocated as normal sectors from
|
||||
/// the FAT.
|
||||
/// </summary>
|
||||
public uint MiniStreamCutoffSize { get; set; }
|
||||
public uint MiniStreamCutoffSize;
|
||||
|
||||
/// <summary>
|
||||
/// This integer field contains the starting sector number for the mini FAT.
|
||||
/// </summary>
|
||||
public uint FirstMiniFATSectorLocation { get; set; }
|
||||
public uint FirstMiniFATSectorLocation;
|
||||
|
||||
/// <summary>
|
||||
/// This integer field contains the count of the number of mini FAT sectors in the
|
||||
/// compound file.
|
||||
/// </summary>
|
||||
public uint NumberOfMiniFATSectors { get; set; }
|
||||
public uint NumberOfMiniFATSectors;
|
||||
|
||||
/// <summary>
|
||||
/// This integer field contains the starting sector number for the DIFAT.
|
||||
/// </summary>
|
||||
public uint FirstDIFATSectorLocation { get; set; }
|
||||
public uint FirstDIFATSectorLocation;
|
||||
|
||||
/// <summary>
|
||||
/// This integer field contains the count of the number of DIFAT sectors in the
|
||||
/// compound file.
|
||||
/// </summary>
|
||||
public uint NumberOfDIFATSectors { get; set; }
|
||||
public uint NumberOfDIFATSectors;
|
||||
|
||||
/// <summary>
|
||||
/// This array of 32-bit integer fields contains the first 109 FAT sector
|
||||
/// locations of the compound file
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public SectorNumber[] DIFAT { get; set; }
|
||||
#else
|
||||
public SectorNumber?[]? DIFAT { get; set; }
|
||||
#endif
|
||||
/// <remarks>109 entries</remarks>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 109)]
|
||||
public SectorNumber[]? DIFAT;
|
||||
}
|
||||
}
|
||||
@@ -36,11 +36,7 @@ namespace SabreTools.Models.CFB
|
||||
/// <summary>
|
||||
/// 4 bytes of reserved data
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Reserved { get; set; }
|
||||
#else
|
||||
public byte[]? Reserved { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -54,11 +50,7 @@ namespace SabreTools.Models.CFB
|
||||
/// <summary>
|
||||
/// 16 bytes of unknown data
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Unknown { get; set; }
|
||||
#else
|
||||
public byte[]? Unknown { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -83,11 +75,7 @@ namespace SabreTools.Models.CFB
|
||||
/// Properties
|
||||
/// </summary>
|
||||
/// <remarks>Each Variant might be followed by an index and offset value</remarks>
|
||||
#if NET48
|
||||
public Variant[] Properties { get; set; }
|
||||
#else
|
||||
public Variant?[]? Properties { get; set; }
|
||||
#endif
|
||||
public Variant[]? Properties { get; set; }
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -40,10 +40,6 @@ namespace SabreTools.Models.CFB
|
||||
/// MUST contain an instance of the type, according to the value
|
||||
/// in the <see cref="VariantType"/> field.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public object Union { get; set; }
|
||||
#else
|
||||
public object? Union { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,28 +1,31 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.CHD
|
||||
{
|
||||
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
|
||||
public class CompressedMapEntryV5
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public sealed class CompressedMapEntryV5
|
||||
{
|
||||
/// <summary>
|
||||
/// Compression type
|
||||
/// </summary>
|
||||
public byte Compression { get; set; }
|
||||
public byte Compression;
|
||||
|
||||
/// <summary>
|
||||
/// Compressed length
|
||||
/// </summary>
|
||||
/// <remarks>Actually UInt24</remarks>
|
||||
public uint CompLength { get; set; }
|
||||
public uint CompLength;
|
||||
|
||||
/// <summary>
|
||||
/// Offset
|
||||
/// </summary>
|
||||
/// <remarks>Actually UInt48</remarks>
|
||||
public ulong Offset { get; set; }
|
||||
public ulong Offset;
|
||||
|
||||
/// <summary>
|
||||
/// CRC-16 of the data
|
||||
/// </summary>
|
||||
public ushort CRC { get; set; }
|
||||
public ushort CRC;
|
||||
}
|
||||
}
|
||||
@@ -1,42 +1,45 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.CHD
|
||||
{
|
||||
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
|
||||
public class CompressedMapHeaderV5
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public sealed class CompressedMapHeaderV5
|
||||
{
|
||||
/// <summary>
|
||||
/// Length of compressed map
|
||||
/// </summary>
|
||||
public uint Length { get; set; }
|
||||
public uint Length;
|
||||
|
||||
/// <summary>
|
||||
/// Offset of first block
|
||||
/// </summary>
|
||||
/// <remarks>Actually UInt48</remarks>
|
||||
public ulong DataStart { get; set; }
|
||||
public ulong DataStart;
|
||||
|
||||
/// <summary>
|
||||
/// CRC-16 of the map
|
||||
/// </summary>
|
||||
public ushort CRC { get; set; }
|
||||
public ushort CRC;
|
||||
|
||||
/// <summary>
|
||||
/// Bits used to encode complength
|
||||
/// </summary>
|
||||
public byte LengthBits { get; set; }
|
||||
public byte LengthBits;
|
||||
|
||||
/// <summary>
|
||||
/// Bits used to encode self-refs
|
||||
/// </summary>
|
||||
public byte HunkBits { get; set; }
|
||||
public byte HunkBits;
|
||||
|
||||
/// <summary>
|
||||
/// Bits used to encode parent unit refs
|
||||
/// </summary>
|
||||
public byte ParentUnitBits { get; set; }
|
||||
public byte ParentUnitBits;
|
||||
|
||||
/// <summary>
|
||||
/// Future use
|
||||
/// </summary>
|
||||
public byte Reserved { get; set; }
|
||||
public byte Reserved;
|
||||
}
|
||||
}
|
||||
@@ -6,11 +6,7 @@ namespace SabreTools.Models.CHD
|
||||
/// <summary>
|
||||
/// 'MComprHD'
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public string Tag { get; set; }
|
||||
#else
|
||||
public string? Tag { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Length of header (including tag and length fields)
|
||||
@@ -41,19 +41,11 @@
|
||||
/// <summary>
|
||||
/// MD5 checksum of raw data
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] MD5 { get; set; } = new byte[16];
|
||||
#else
|
||||
public byte[]? MD5 { get; set; } = new byte[16];
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// MD5 checksum of parent file
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] ParentMD5 { get; set; } = new byte[16];
|
||||
#else
|
||||
public byte[]? ParentMD5 { get; set; } = new byte[16];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -41,20 +41,12 @@
|
||||
/// <summary>
|
||||
/// MD5 checksum of raw data
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] MD5 { get; set; } = new byte[16];
|
||||
#else
|
||||
public byte[]? MD5 { get; set; } = new byte[16];
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// MD5 checksum of parent file
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] ParentMD5 { get; set; } = new byte[16];
|
||||
#else
|
||||
public byte[]? ParentMD5 { get; set; } = new byte[16];
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Number of bytes per sector
|
||||
@@ -31,20 +31,12 @@
|
||||
/// <summary>
|
||||
/// MD5 checksum of raw data
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] MD5 { get; set; } = new byte[16];
|
||||
#else
|
||||
public byte[]? MD5 { get; set; } = new byte[16];
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// MD5 checksum of parent file
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] ParentMD5 { get; set; } = new byte[16];
|
||||
#else
|
||||
public byte[]? ParentMD5 { get; set; } = new byte[16];
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Number of bytes per hunk
|
||||
@@ -54,19 +46,11 @@
|
||||
/// <summary>
|
||||
/// SHA1 checksum of raw data
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] SHA1 { get; set; } = new byte[20];
|
||||
#else
|
||||
public byte[]? SHA1 { get; set; } = new byte[20];
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// SHA1 checksum of parent file
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] ParentSHA1 { get; set; } = new byte[20];
|
||||
#else
|
||||
public byte[]? ParentSHA1 { get; set; } = new byte[20];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -36,28 +36,16 @@
|
||||
/// <summary>
|
||||
/// Combined raw+meta SHA1
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] SHA1 { get; set; } = new byte[20];
|
||||
#else
|
||||
public byte[]? SHA1 { get; set; } = new byte[20];
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Combined raw+meta SHA1 of parent
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] ParentSHA1 { get; set; } = new byte[20];
|
||||
#else
|
||||
public byte[]? ParentSHA1 { get; set; } = new byte[20];
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Raw data SHA1
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] RawSHA1 { get; set; } = new byte[20];
|
||||
#else
|
||||
public byte[]? RawSHA1 { get; set; } = new byte[20];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -36,28 +36,16 @@
|
||||
/// <summary>
|
||||
/// Raw data SHA1
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] RawSHA1 { get; set; }
|
||||
#else
|
||||
public byte[]? RawSHA1 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Combined raw+meta SHA1
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] SHA1 { get; set; }
|
||||
#else
|
||||
public byte[]? SHA1 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Combined raw+meta SHA1 of parent
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] ParentSHA1 { get; set; }
|
||||
#else
|
||||
public byte[]? ParentSHA1 { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,16 +1,19 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.CHD
|
||||
{
|
||||
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
|
||||
public class MapV1
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public sealed class MapV1
|
||||
{
|
||||
/// <summary>
|
||||
/// Starting offset within the file
|
||||
/// </summary>
|
||||
public ulong StartingOffset { get; set; }
|
||||
public ulong StartingOffset;
|
||||
|
||||
/// <summary>
|
||||
/// Length of data; If == hunksize, data is uncompressed
|
||||
/// </summary>
|
||||
public ulong Length { get; set; }
|
||||
public ulong Length;
|
||||
}
|
||||
}
|
||||
@@ -1,31 +1,34 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.CHD
|
||||
{
|
||||
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
|
||||
public class MapV3
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public sealed class MapV3
|
||||
{
|
||||
/// <summary>
|
||||
/// Starting offset within the file
|
||||
/// </summary>
|
||||
public ulong StartingOffset { get; set; }
|
||||
public ulong StartingOffset;
|
||||
|
||||
/// <summary>
|
||||
/// 32-bit CRC of the uncompressed data
|
||||
/// </summary>
|
||||
public uint CRC32 { get; set; }
|
||||
public uint CRC32;
|
||||
|
||||
/// <summary>
|
||||
/// Lower 16 bits of length
|
||||
/// </summary>
|
||||
public ushort LengthLo { get; set; }
|
||||
public ushort LengthLo;
|
||||
|
||||
/// <summary>
|
||||
/// Upper 8 bits of length
|
||||
/// </summary>
|
||||
public byte LengthHi { get; set; }
|
||||
public byte LengthHi;
|
||||
|
||||
/// <summary>
|
||||
/// Flags, indicating compression info
|
||||
/// </summary>
|
||||
public byte Flags { get; set; }
|
||||
public byte Flags;
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,14 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.CHD
|
||||
{
|
||||
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public class UncompressedMapV5
|
||||
{
|
||||
/// <summary>
|
||||
/// Starting offset / hunk size
|
||||
/// </summary>
|
||||
public uint StartingOffset { get; set; }
|
||||
public uint StartingOffset;
|
||||
}
|
||||
}
|
||||
@@ -12,71 +12,43 @@ namespace SabreTools.Models.Charts
|
||||
/// Title of the song.
|
||||
/// </summary>
|
||||
/// <remarks>name</remarks>
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Artist(s) or band(s) behind the song.
|
||||
/// </summary>
|
||||
/// <remarks>artist</remarks>
|
||||
#if NET48
|
||||
public string Artist { get; set; }
|
||||
#else
|
||||
public string? Artist { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Title of the album the song is featured in.
|
||||
/// </summary>
|
||||
/// <remarks>album</remarks>
|
||||
#if NET48
|
||||
public string Album { get; set; }
|
||||
#else
|
||||
public string? Album { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Genre of the song.
|
||||
/// </summary>
|
||||
/// <remarks>genre</remarks>
|
||||
#if NET48
|
||||
public string Genre { get; set; }
|
||||
#else
|
||||
public string? Genre { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Sub-genre for the song.
|
||||
/// </summary>
|
||||
/// <remarks>sub_genre</remarks>
|
||||
#if NET48
|
||||
public string SubGenre { get; set; }
|
||||
#else
|
||||
public string? SubGenre { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Year of the song’s release.
|
||||
/// </summary>
|
||||
/// <remarks>year</remarks>
|
||||
#if NET48
|
||||
public string Year { get; set; }
|
||||
#else
|
||||
public string? Year { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Community member responsible for charting the song.
|
||||
/// </summary>
|
||||
/// <remarks>charter, frets</remarks>
|
||||
#if NET48
|
||||
public string Charter { get; set; }
|
||||
#else
|
||||
public string? Charter { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Version number for the song.
|
||||
@@ -118,11 +90,7 @@ namespace SabreTools.Models.Charts
|
||||
/// Flavor text for this song, usually shown after picking the song or during loading.
|
||||
/// </summary>
|
||||
/// <remarks>loading_phrase</remarks>
|
||||
#if NET48
|
||||
public string LoadingPhrase { get; set; }
|
||||
#else
|
||||
public string? LoadingPhrase { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -132,53 +100,33 @@ namespace SabreTools.Models.Charts
|
||||
/// (FoFiX) Hex color to use in the song screen for the cassette.
|
||||
/// </summary>
|
||||
/// <remarks>cassettecolor</remarks>
|
||||
#if NET48
|
||||
public string CassetteColor { get; set; }
|
||||
#else
|
||||
public string? CassetteColor { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (FoFiX) Miscellaneous tags for the chart.
|
||||
/// Only known valid value is `cover`.
|
||||
/// </summary>
|
||||
/// <remarks>tags</remarks>
|
||||
#if NET48
|
||||
public string Tags { get; set; }
|
||||
#else
|
||||
public string? Tags { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (PS) Two timestamps in milliseconds for preview start and end time.
|
||||
/// Example: `55000 85000`
|
||||
/// </summary>
|
||||
/// <remarks>preview</remarks>
|
||||
#if NET48
|
||||
public long[] Preview { get; set; }
|
||||
#else
|
||||
public long[]? Preview { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (CH) Playlist that the song should show up in.
|
||||
/// </summary>
|
||||
/// <remarks>playlist</remarks>
|
||||
#if NET48
|
||||
public string Playlist { get; set; }
|
||||
#else
|
||||
public string? Playlist { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (CH) Sub-playlist that the song should show up in.
|
||||
/// </summary>
|
||||
/// <remarks>sub_playlist</remarks>
|
||||
#if NET48
|
||||
public string SubPlaylist { get; set; }
|
||||
#else
|
||||
public string? SubPlaylist { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (CH) Indicates if this song is a modchart.
|
||||
@@ -350,51 +298,31 @@ namespace SabreTools.Models.Charts
|
||||
/// Specifies a voice type for the singer (either "male" or "female").
|
||||
/// </summary>
|
||||
/// <remarks>vocal_gender</remarks>
|
||||
#if NET48
|
||||
public string VocalGender { get; set; }
|
||||
#else
|
||||
public string? VocalGender { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Specifies a tuning for 17-fret Pro Guitar.
|
||||
/// </summary>
|
||||
/// <remarks>real_guitar_tuning</remarks>
|
||||
#if NET48
|
||||
public string RealGuitarTuning { get; set; }
|
||||
#else
|
||||
public string? RealGuitarTuning { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Specifies a tuning for 22-fret Pro Guitar.
|
||||
/// </summary>
|
||||
/// <remarks>real_guitar_22_tuning</remarks>
|
||||
#if NET48
|
||||
public string RealGuitar22Tuning { get; set; }
|
||||
#else
|
||||
public string? RealGuitar22Tuning { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Specifies a tuning for 17-fret Pro Bass.
|
||||
/// </summary>
|
||||
/// <remarks>real_bass_tuning</remarks>
|
||||
#if NET48
|
||||
public string RealBassTuning { get; set; }
|
||||
#else
|
||||
public string? RealBassTuning { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Specifies a tuning for 22-fret Pro Bass.
|
||||
/// </summary>
|
||||
/// <remarks>real_bass_22_tuning</remarks>
|
||||
#if NET48
|
||||
public string RealBass22Tuning { get; set; }
|
||||
#else
|
||||
public string? RealBass22Tuning { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Specifies the number of lanes for the right hand in Real Keys.
|
||||
@@ -479,11 +407,7 @@ namespace SabreTools.Models.Charts
|
||||
/// Valid values are "none", "half", or "full".
|
||||
/// </summary>
|
||||
/// <remarks>early_hit_window_size</remarks>
|
||||
#if NET48
|
||||
public string EarlyHitWindowSize { get; set; }
|
||||
#else
|
||||
public string? EarlyHitWindowSize { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (CH) Sets whether or not end events in the chart will be respected.
|
||||
@@ -560,31 +484,19 @@ namespace SabreTools.Models.Charts
|
||||
/// Included in either the chart folder or the game the chart was made for, or sourced from this repository of icons.
|
||||
/// </summary>
|
||||
/// <remarks>icon</remarks>
|
||||
#if NET48
|
||||
public string Icon { get; set; }
|
||||
#else
|
||||
public string? Icon { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Name for a background image file.
|
||||
/// </summary>
|
||||
/// <remarks>background</remarks>
|
||||
#if NET48
|
||||
public string Background { get; set; }
|
||||
#else
|
||||
public string? Background { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Name for a background video file.
|
||||
/// </summary>
|
||||
/// <remarks>video</remarks>
|
||||
#if NET48
|
||||
public string Video { get; set; }
|
||||
#else
|
||||
public string? Video { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Name for a background video file.
|
||||
@@ -610,11 +522,7 @@ namespace SabreTools.Models.Charts
|
||||
/// Name for a cover image file.
|
||||
/// </summary>
|
||||
/// <remarks>cover</remarks>
|
||||
#if NET48
|
||||
public string Cover { get; set; }
|
||||
#else
|
||||
public string? Cover { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -624,41 +532,25 @@ namespace SabreTools.Models.Charts
|
||||
/// (PS) Name for banner A.
|
||||
/// </summary>
|
||||
/// <remarks>link_name_a</remarks>
|
||||
#if NET48
|
||||
public string LinkNameA { get; set; }
|
||||
#else
|
||||
public string? LinkNameA { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (PS) Name for banner B.
|
||||
/// </summary>
|
||||
/// <remarks>link_name_b</remarks>
|
||||
#if NET48
|
||||
public string LinkNameB { get; set; }
|
||||
#else
|
||||
public string? LinkNameB { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (PS) Link that clicking banner A will open.
|
||||
/// </summary>
|
||||
/// <remarks>banner_link_a</remarks>
|
||||
#if NET48
|
||||
public string BannerLinkA { get; set; }
|
||||
#else
|
||||
public string? BannerLinkA { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (PS) Link that clicking banner B will open.
|
||||
/// </summary>
|
||||
/// <remarks>banner_link_b</remarks>
|
||||
#if NET48
|
||||
public string BannerLinkB { get; set; }
|
||||
#else
|
||||
public string? BannerLinkB { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -668,21 +560,13 @@ namespace SabreTools.Models.Charts
|
||||
/// (FoFiX) High score data.
|
||||
/// </summary>
|
||||
/// <remarks>scores</remarks>
|
||||
#if NET48
|
||||
public string Scores { get; set; }
|
||||
#else
|
||||
public string? Scores { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (FoFiX) Additional score data.
|
||||
/// </summary>
|
||||
/// <remarks>scores_ext</remarks>
|
||||
#if NET48
|
||||
public string ScoresExt { get; set; }
|
||||
#else
|
||||
public string? ScoresExt { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (FoFiX) Play count.
|
||||
@@ -700,31 +584,19 @@ namespace SabreTools.Models.Charts
|
||||
/// (FoFiX) Career ID for this song.
|
||||
/// </summary>
|
||||
/// <remarks>unlock_id</remarks>
|
||||
#if NET48
|
||||
public string UnlockId { get; set; }
|
||||
#else
|
||||
public string? UnlockId { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (FoFiX) The career ID that must be completed to unlock this song.
|
||||
/// </summary>
|
||||
/// <remarks>unlock_require</remarks>
|
||||
#if NET48
|
||||
public string UnlockRequire { get; set; }
|
||||
#else
|
||||
public string? UnlockRequire { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (FoFiX) Text to display if the song is locked.
|
||||
/// </summary>
|
||||
/// <remarks>unlock_text</remarks>
|
||||
#if NET48
|
||||
public string UnlockText { get; set; }
|
||||
#else
|
||||
public string? UnlockText { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// (FoFiX) Indicates if the song is unlocked.
|
||||
@@ -10,20 +10,12 @@ namespace SabreTools.Models.Charts
|
||||
/// A space-separated list of .ini sections to include in the career.
|
||||
/// </summary>
|
||||
/// <remarks>sections</remarks>
|
||||
#if NET48
|
||||
public string[] SectionList { get; set; }
|
||||
#else
|
||||
public string[]? SectionList { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// `name` - Display name of the tier.
|
||||
/// `unlock_id` - Name used for associating a song with this tier, and for checking unlock requirements.
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public Dictionary<string, (string Name, string UnlockId)> Sections { get; set; }
|
||||
#else
|
||||
public Dictionary<string, (string? Name, string? UnlockId)>? Sections { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -5,20 +5,12 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>name</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public string[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public string[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -5,35 +5,19 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>name</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>description</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Description { get; set; }
|
||||
#else
|
||||
public string? Description { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>default</remarks>
|
||||
#if NET48
|
||||
public string Default { get; set; }
|
||||
#else
|
||||
public string? Default { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public string[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public string[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -5,42 +5,22 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>type, (cpu|audio)</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Type { get; set; }
|
||||
#else
|
||||
public string? Type { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>name</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>flags</remarks>
|
||||
#if NET48
|
||||
public string Flags { get; set; }
|
||||
#else
|
||||
public string? Flags { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>clock, Numeric?</remarks>
|
||||
#if NET48
|
||||
public string Clock { get; set; }
|
||||
#else
|
||||
public string? Clock { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public object[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -4,118 +4,54 @@ namespace SabreTools.Models.ClrMamePro
|
||||
public class ClrMamePro
|
||||
{
|
||||
/// <remarks>name</remarks>
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>description</remarks>
|
||||
#if NET48
|
||||
public string Description { get; set; }
|
||||
#else
|
||||
public string? Description { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>rootdir</remarks>
|
||||
#if NET48
|
||||
public string RootDir { get; set; }
|
||||
#else
|
||||
public string? RootDir { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>category</remarks>
|
||||
#if NET48
|
||||
public string Category { get; set; }
|
||||
#else
|
||||
public string? Category { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>version</remarks>
|
||||
#if NET48
|
||||
public string Version { get; set; }
|
||||
#else
|
||||
public string? Version { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>date</remarks>
|
||||
#if NET48
|
||||
public string Date { get; set; }
|
||||
#else
|
||||
public string? Date { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>author</remarks>
|
||||
#if NET48
|
||||
public string Author { get; set; }
|
||||
#else
|
||||
public string? Author { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>homepage</remarks>
|
||||
#if NET48
|
||||
public string Homepage { get; set; }
|
||||
#else
|
||||
public string? Homepage { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>url</remarks>
|
||||
#if NET48
|
||||
public string Url { get; set; }
|
||||
#else
|
||||
public string? Url { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>comment</remarks>
|
||||
#if NET48
|
||||
public string Comment { get; set; }
|
||||
#else
|
||||
public string? Comment { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>header</remarks>
|
||||
#if NET48
|
||||
public string Header { get; set; }
|
||||
#else
|
||||
public string? Header { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>type</remarks>
|
||||
#if NET48
|
||||
public string Type { get; set; }
|
||||
#else
|
||||
public string? Type { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>forcemerging</remarks>
|
||||
#if NET48
|
||||
public string ForceMerging { get; set; }
|
||||
#else
|
||||
public string? ForceMerging { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>forcezipping</remarks>
|
||||
#if NET48
|
||||
public string ForceZipping { get; set; }
|
||||
#else
|
||||
public string? ForceZipping { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>forcepacking</remarks>
|
||||
#if NET48
|
||||
public string ForcePacking { get; set; }
|
||||
#else
|
||||
public string? ForcePacking { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public string[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public string[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -5,34 +5,18 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>name</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>entry</remarks>
|
||||
#if NET48
|
||||
public string[] Entry { get; set; }
|
||||
#else
|
||||
public string[]? Entry { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>default, (yes|no) "no"</remarks>
|
||||
#if NET48
|
||||
public string Default { get; set; }
|
||||
#else
|
||||
public string? Default { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public object[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -5,55 +5,27 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>name</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>md5</remarks>
|
||||
#if NET48
|
||||
public string MD5 { get; set; }
|
||||
#else
|
||||
public string? MD5 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>sha1</remarks>
|
||||
#if NET48
|
||||
public string SHA1 { get; set; }
|
||||
#else
|
||||
public string? SHA1 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>merge</remarks>
|
||||
#if NET48
|
||||
public string Merge { get; set; }
|
||||
#else
|
||||
public string? Merge { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>status</remarks>
|
||||
#if NET48
|
||||
public string Status { get; set; }
|
||||
#else
|
||||
public string? Status { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>flags</remarks>
|
||||
#if NET48
|
||||
public string Flags { get; set; }
|
||||
#else
|
||||
public string? Flags { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public string[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public string[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -5,48 +5,24 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>status, (good|imperfect|preliminary)</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Status { get; set; }
|
||||
#else
|
||||
public string? Status { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>color, (good|imperfect|preliminary)</remarks>
|
||||
#if NET48
|
||||
public string Color { get; set; }
|
||||
#else
|
||||
public string? Color { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>sound, (good|imperfect|preliminary)</remarks>
|
||||
#if NET48
|
||||
public string Sound { get; set; }
|
||||
#else
|
||||
public string? Sound { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>palettesize, Numeric?</remarks>
|
||||
#if NET48
|
||||
public string PaletteSize { get; set; }
|
||||
#else
|
||||
public string? PaletteSize { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>blit, (plain|dirty)</remarks>
|
||||
#if NET48
|
||||
public string Blit { get; set; }
|
||||
#else
|
||||
public string? Blit { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public object[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -7,168 +7,80 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>name</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>description</remarks>
|
||||
#if NET48
|
||||
public string Description { get; set; }
|
||||
#else
|
||||
public string? Description { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>year</remarks>
|
||||
#if NET48
|
||||
public string Year { get; set; }
|
||||
#else
|
||||
public string? Year { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>manufacturer</remarks>
|
||||
#if NET48
|
||||
public string Manufacturer { get; set; }
|
||||
#else
|
||||
public string? Manufacturer { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>category</remarks>
|
||||
#if NET48
|
||||
public string Category { get; set; }
|
||||
#else
|
||||
public string? Category { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>cloneof</remarks>
|
||||
#if NET48
|
||||
public string CloneOf { get; set; }
|
||||
#else
|
||||
public string? CloneOf { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>romof</remarks>
|
||||
#if NET48
|
||||
public string RomOf { get; set; }
|
||||
#else
|
||||
public string? RomOf { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>sampleof</remarks>
|
||||
#if NET48
|
||||
public string SampleOf { get; set; }
|
||||
#else
|
||||
public string? SampleOf { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>release</remarks>
|
||||
#if NET48
|
||||
public Release[] Release { get; set; }
|
||||
#else
|
||||
public Release[]? Release { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>biosset</remarks>
|
||||
#if NET48
|
||||
public BiosSet[] BiosSet { get; set; }
|
||||
#else
|
||||
public BiosSet[]? BiosSet { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>rom</remarks>
|
||||
#if NET48
|
||||
public Rom[] Rom { get; set; }
|
||||
#else
|
||||
public Rom[]? Rom { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>disk</remarks>
|
||||
#if NET48
|
||||
public Disk[] Disk { get; set; }
|
||||
#else
|
||||
public Disk[]? Disk { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>sample</remarks>
|
||||
#if NET48
|
||||
public Sample[] Sample { get; set; }
|
||||
#else
|
||||
public Sample[]? Sample { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>archive</remarks>
|
||||
#if NET48
|
||||
public Archive[] Archive { get; set; }
|
||||
#else
|
||||
public Archive[]? Archive { get; set; }
|
||||
#endif
|
||||
|
||||
#region Aaru Extensions
|
||||
|
||||
/// <remarks>media, Appears after Disk</remarks>
|
||||
#if NET48
|
||||
public Media[] Media { get; set; }
|
||||
#else
|
||||
public Media[]? Media { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
#region MAME Extensions
|
||||
|
||||
/// <remarks>chip, Appears after Archive</remarks>
|
||||
#if NET48
|
||||
public Chip[] Chip { get; set; }
|
||||
#else
|
||||
public Chip[]? Chip { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>video, Appears after Chip</remarks>
|
||||
#if NET48
|
||||
public Video[] Video { get; set; }
|
||||
#else
|
||||
public Video[]? Video { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>sound, Appears after Video</remarks>
|
||||
#if NET48
|
||||
public Sound Sound { get; set; }
|
||||
#else
|
||||
public Sound? Sound { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>input, Appears after Sound</remarks>
|
||||
#if NET48
|
||||
public Input Input { get; set; }
|
||||
#else
|
||||
public Input? Input { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>dipswitch, Appears after Input</remarks>
|
||||
#if NET48
|
||||
public DipSwitch[] DipSwitch { get; set; }
|
||||
#else
|
||||
public DipSwitch[]? DipSwitch { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>driver, Appears after DipSwitch</remarks>
|
||||
#if NET48
|
||||
public Driver Driver { get; set; }
|
||||
#else
|
||||
public Driver? Driver { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public string[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public string[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -5,56 +5,28 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>players, Numeric/remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Players { get; set; }
|
||||
#else
|
||||
public string? Players { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>control</remarks>
|
||||
#if NET48
|
||||
public string Control { get; set; }
|
||||
#else
|
||||
public string? Control { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>buttons, Numeric</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Buttons { get; set; }
|
||||
#else
|
||||
public string? Buttons { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>coins, Numeric</remarks>
|
||||
#if NET48
|
||||
public string Coins { get; set; }
|
||||
#else
|
||||
public string? Coins { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>tilt, (yes|no) "no"</remarks>
|
||||
#if NET48
|
||||
public string Tilt { get; set; }
|
||||
#else
|
||||
public string? Tilt { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>service, (yes|no) "no"</remarks>
|
||||
#if NET48
|
||||
public string Service { get; set; }
|
||||
#else
|
||||
public string? Service { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public object[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -5,48 +5,24 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>name</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>md5</remarks>
|
||||
#if NET48
|
||||
public string MD5 { get; set; }
|
||||
#else
|
||||
public string? MD5 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>sha1</remarks>
|
||||
#if NET48
|
||||
public string SHA1 { get; set; }
|
||||
#else
|
||||
public string? SHA1 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>sha256</remarks>
|
||||
#if NET48
|
||||
public string SHA256 { get; set; }
|
||||
#else
|
||||
public string? SHA256 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>spamsum</remarks>
|
||||
#if NET48
|
||||
public string SpamSum { get; set; }
|
||||
#else
|
||||
public string? SpamSum { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public string[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public string[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -3,27 +3,15 @@ namespace SabreTools.Models.ClrMamePro
|
||||
public class MetadataFile
|
||||
{
|
||||
/// <remarks>clrmamepro</remarks>
|
||||
#if NET48
|
||||
public ClrMamePro ClrMamePro { get; set; }
|
||||
#else
|
||||
public ClrMamePro? ClrMamePro { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>game, machine, resource, set</remarks>
|
||||
#if NET48
|
||||
public GameBase[] Game { get; set; }
|
||||
#else
|
||||
public GameBase?[]? Game { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public string[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public string[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -5,49 +5,25 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>name</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>region</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Region { get; set; }
|
||||
#else
|
||||
public string? Region { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>language</remarks>
|
||||
#if NET48
|
||||
public string Language { get; set; }
|
||||
#else
|
||||
public string? Language { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>date</remarks>
|
||||
#if NET48
|
||||
public string Date { get; set; }
|
||||
#else
|
||||
public string? Date { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>default</remarks>
|
||||
#if NET48
|
||||
public string Default { get; set; }
|
||||
#else
|
||||
public string? Default { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public string[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public string[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -5,181 +5,93 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>name</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>size, Numeric</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Size { get; set; }
|
||||
#else
|
||||
public string? Size { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>crc</remarks>
|
||||
#if NET48
|
||||
public string CRC { get; set; }
|
||||
#else
|
||||
public string? CRC { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>md5</remarks>
|
||||
#if NET48
|
||||
public string MD5 { get; set; }
|
||||
#else
|
||||
public string? MD5 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>sha1</remarks>
|
||||
#if NET48
|
||||
public string SHA1 { get; set; }
|
||||
#else
|
||||
public string? SHA1 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>merge</remarks>
|
||||
#if NET48
|
||||
public string Merge { get; set; }
|
||||
#else
|
||||
public string? Merge { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>status</remarks>
|
||||
#if NET48
|
||||
public string Status { get; set; }
|
||||
#else
|
||||
public string? Status { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>flags</remarks>
|
||||
#if NET48
|
||||
public string Flags { get; set; }
|
||||
#else
|
||||
public string? Flags { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>date</remarks>
|
||||
#if NET48
|
||||
public string Date { get; set; }
|
||||
#else
|
||||
public string? Date { get; set; }
|
||||
#endif
|
||||
|
||||
#region Hash Extensions
|
||||
|
||||
/// <remarks>sha256; Also in No-Intro spec; Appears after SHA1</remarks>
|
||||
#if NET48
|
||||
public string SHA256 { get; set; }
|
||||
#else
|
||||
public string? SHA256 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>sha384; Appears after SHA256</remarks>
|
||||
#if NET48
|
||||
public string SHA384 { get; set; }
|
||||
#else
|
||||
public string? SHA384 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>sha512; Appears after SHA384</remarks>
|
||||
#if NET48
|
||||
public string SHA512 { get; set; }
|
||||
#else
|
||||
public string? SHA512 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>spamsum; Appears after SHA512</remarks>
|
||||
#if NET48
|
||||
public string SpamSum { get; set; }
|
||||
#else
|
||||
public string? SpamSum { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
#region DiscImgeCreator Extensions
|
||||
|
||||
/// <remarks>xxh3_64; Appears after SpamSum</remarks>
|
||||
#if NET48
|
||||
public string xxHash364 { get; set; }
|
||||
#else
|
||||
public string? xxHash364 { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>xxh3_128; Appears after xxHash364</remarks>
|
||||
#if NET48
|
||||
public string xxHash3128 { get; set; }
|
||||
#else
|
||||
public string? xxHash3128 { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
#region MAME Extensions
|
||||
|
||||
/// <remarks>region; Appears after Status</remarks>
|
||||
#if NET48
|
||||
public string Region { get; set; }
|
||||
#else
|
||||
public string? Region { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>offs; Appears after Flags</remarks>
|
||||
#if NET48
|
||||
public string Offs { get; set; }
|
||||
#else
|
||||
public string? Offs { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
#region No-Intro Extensions
|
||||
|
||||
/// <remarks>serial; Appears after Offs</remarks>
|
||||
#if NET48
|
||||
public string Serial { get; set; }
|
||||
#else
|
||||
public string? Serial { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>header; Appears after Serial</remarks>
|
||||
#if NET48
|
||||
public string Header { get; set; }
|
||||
#else
|
||||
public string? Header { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
#region RomVault Extensions
|
||||
|
||||
/// <remarks>inverted; Boolean; Appears after Date</remarks>
|
||||
#if NET48
|
||||
public string Inverted { get; set; }
|
||||
#else
|
||||
public string? Inverted { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>mia; Boolean; Appears after Inverted</remarks>
|
||||
#if NET48
|
||||
public string MIA { get; set; }
|
||||
#else
|
||||
public string? MIA { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public string[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public string[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -4,108 +4,48 @@ namespace SabreTools.Models.ClrMamePro
|
||||
public class RomVault
|
||||
{
|
||||
/// <remarks>name</remarks>
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>description</remarks>
|
||||
#if NET48
|
||||
public string Description { get; set; }
|
||||
#else
|
||||
public string? Description { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>rootdir</remarks>
|
||||
#if NET48
|
||||
public string RootDir { get; set; }
|
||||
#else
|
||||
public string? RootDir { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>category</remarks>
|
||||
#if NET48
|
||||
public string Category { get; set; }
|
||||
#else
|
||||
public string? Category { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>version</remarks>
|
||||
#if NET48
|
||||
public string Version { get; set; }
|
||||
#else
|
||||
public string? Version { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>date</remarks>
|
||||
#if NET48
|
||||
public string Date { get; set; }
|
||||
#else
|
||||
public string? Date { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>author</remarks>
|
||||
#if NET48
|
||||
public string Author { get; set; }
|
||||
#else
|
||||
public string? Author { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>homepage</remarks>
|
||||
#if NET48
|
||||
public string Homepage { get; set; }
|
||||
#else
|
||||
public string? Homepage { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>url</remarks>
|
||||
#if NET48
|
||||
public string Url { get; set; }
|
||||
#else
|
||||
public string? Url { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>comment</remarks>
|
||||
#if NET48
|
||||
public string Comment { get; set; }
|
||||
#else
|
||||
public string? Comment { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>header</remarks>
|
||||
#if NET48
|
||||
public string Header { get; set; }
|
||||
#else
|
||||
public string? Header { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>type</remarks>
|
||||
#if NET48
|
||||
public string Type { get; set; }
|
||||
#else
|
||||
public string? Type { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>forcemerging</remarks>
|
||||
#if NET48
|
||||
public string ForceMerging { get; set; }
|
||||
#else
|
||||
public string? ForceMerging { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>forcezipping</remarks>
|
||||
#if NET48
|
||||
public string ForceZipping { get; set; }
|
||||
#else
|
||||
public string? ForceZipping { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>forcepacking</remarks>
|
||||
#if NET48
|
||||
public string ForcePacking { get; set; }
|
||||
#else
|
||||
public string? ForcePacking { get; set; }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -5,20 +5,12 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>name</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Name { get; set; }
|
||||
#else
|
||||
public string? Name { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public string[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public string[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -5,20 +5,12 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>channels, Numeric?</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Channels { get; set; }
|
||||
#else
|
||||
public string? Channels { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public object[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -5,63 +5,31 @@ namespace SabreTools.Models.ClrMamePro
|
||||
{
|
||||
/// <remarks>screen, (raster|vector)</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Screen { get; set; }
|
||||
#else
|
||||
public string? Screen { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>orientation, (vertical|horizontal)</remarks>
|
||||
[Required]
|
||||
#if NET48
|
||||
public string Orientation { get; set; }
|
||||
#else
|
||||
public string? Orientation { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>x, Numeric?</remarks>
|
||||
#if NET48
|
||||
public string X { get; set; }
|
||||
#else
|
||||
public string? X { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>y, Numeric?</remarks>
|
||||
#if NET48
|
||||
public string Y { get; set; }
|
||||
#else
|
||||
public string? Y { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>aspectx, Numeric?</remarks>
|
||||
#if NET48
|
||||
public string AspectX { get; set; }
|
||||
#else
|
||||
public string? AspectX { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>aspecty, Numeric?</remarks>
|
||||
#if NET48
|
||||
public string AspectY { get; set; }
|
||||
#else
|
||||
public string? AspectY { get; set; }
|
||||
#endif
|
||||
|
||||
/// <remarks>freq, Numeric?</remarks>
|
||||
#if NET48
|
||||
public string Freq { get; set; }
|
||||
#else
|
||||
public string? Freq { get; set; }
|
||||
#endif
|
||||
|
||||
#region DO NOT USE IN PRODUCTION
|
||||
|
||||
/// <remarks>Should be empty</remarks>
|
||||
#if NET48
|
||||
public object[] ADDITIONAL_ELEMENTS { get; set; }
|
||||
#else
|
||||
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
}
|
||||
22
SabreTools.Models/Compression/LZ/FileHeader.cs
Normal file
22
SabreTools.Models/Compression/LZ/FileHeader.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Models.Compression.LZ
|
||||
{
|
||||
/// <summary>
|
||||
/// Format of first 14 byte of LZ compressed file
|
||||
/// </summary>
|
||||
/// <see href="https://github.com/wine-mirror/wine/blob/master/dlls/kernel32/lzexpand.c"/>
|
||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
|
||||
public sealed class FileHeaader
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
|
||||
public string? Magic;
|
||||
|
||||
public byte CompressionType;
|
||||
|
||||
[MarshalAs(UnmanagedType.U1)]
|
||||
public char LastChar;
|
||||
|
||||
public uint RealLength;
|
||||
}
|
||||
}
|
||||
@@ -7,11 +7,7 @@ namespace SabreTools.Models.Compression.LZ
|
||||
/// <summary>
|
||||
/// Internal backing stream
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public Stream Source { get; set; }
|
||||
#else
|
||||
public Stream? Source { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// The last char of the filename for replacement
|
||||
@@ -36,11 +32,7 @@ namespace SabreTools.Models.Compression.LZ
|
||||
/// <summary>
|
||||
/// The rotating LZ table
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Table { get; set; }
|
||||
#else
|
||||
public byte[]? Table { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// CURrent TABle ENTry
|
||||
@@ -65,11 +57,7 @@ namespace SabreTools.Models.Compression.LZ
|
||||
/// <summary>
|
||||
/// GETLEN bytes
|
||||
/// </summary>
|
||||
#if NET48
|
||||
public byte[] Window { get; set; }
|
||||
#else
|
||||
public byte[]? Window { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Current read
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user