mirror of
https://github.com/SabreTools/SabreTools.Serialization.git
synced 2026-02-04 05:36:12 +00:00
Compare commits
169 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2776928946 | ||
|
|
8cc87c6540 | ||
|
|
3c212022aa | ||
|
|
511c4d09e5 | ||
|
|
d7eba27dc5 | ||
|
|
09370618ca | ||
|
|
2197167088 | ||
|
|
b527635fe7 | ||
|
|
695309bc32 | ||
|
|
97b2f68ec7 | ||
|
|
593044dbf3 | ||
|
|
1fcf44fb8d | ||
|
|
a2a472baf9 | ||
|
|
b5b4a50d94 | ||
|
|
f1b5464052 | ||
|
|
2c0224db22 | ||
|
|
1e78eecb40 | ||
|
|
3626faea60 | ||
|
|
a0177f1174 | ||
|
|
db5fe4a2cd | ||
|
|
5716143168 | ||
|
|
2a59b23149 | ||
|
|
bdbec4ed02 | ||
|
|
25193f1805 | ||
|
|
4840c816a2 | ||
|
|
d0a8e3770b | ||
|
|
1cf3d50864 | ||
|
|
d1b98f7d6d | ||
|
|
4bc87ff812 | ||
|
|
e1df11b360 | ||
|
|
34606a4f04 | ||
|
|
c4c5fc4bf6 | ||
|
|
cd87ce5373 | ||
|
|
90fc16b888 | ||
|
|
c2d0b71d22 | ||
|
|
e54473682c | ||
|
|
1c8d64d98c | ||
|
|
a19437f42f | ||
|
|
855e2f2c77 | ||
|
|
bd3cf88123 | ||
|
|
e4578ad3fc | ||
|
|
39e56ef864 | ||
|
|
51b77da760 | ||
|
|
4b83219a9b | ||
|
|
3ed07dd299 | ||
|
|
bb7daed7f6 | ||
|
|
0c84c47752 | ||
|
|
c18a185474 | ||
|
|
8ff66b04d8 | ||
|
|
94d6556e04 | ||
|
|
6d960265e4 | ||
|
|
cf4ca76e10 | ||
|
|
c7760e9903 | ||
|
|
d51bedceb6 | ||
|
|
125dc021d5 | ||
|
|
5bce481648 | ||
|
|
20153f62cf | ||
|
|
e302dfccf1 | ||
|
|
594b841490 | ||
|
|
40c354f79f | ||
|
|
b77959f300 | ||
|
|
59d6026a2b | ||
|
|
14226d1270 | ||
|
|
955f4da708 | ||
|
|
700b0359ea | ||
|
|
fe95b894d7 | ||
|
|
38a2712a8f | ||
|
|
d1ea091574 | ||
|
|
6bc812fc2f | ||
|
|
61b89fbd72 | ||
|
|
a2c065bdf2 | ||
|
|
88479f674b | ||
|
|
5edbacde74 | ||
|
|
67fc51224b | ||
|
|
101f3294b4 | ||
|
|
6c5622f732 | ||
|
|
f2a6fe1445 | ||
|
|
b0b593443f | ||
|
|
9b05185add | ||
|
|
17316da536 | ||
|
|
f3ca4dd989 | ||
|
|
e2b7bdac8c | ||
|
|
f86f6dc438 | ||
|
|
2bac0ed505 | ||
|
|
ae4078bb7f | ||
|
|
afaffbd9a2 | ||
|
|
b878e59e2e | ||
|
|
4bb3f625dd | ||
|
|
b7978cafa5 | ||
|
|
17f376c76f | ||
|
|
2774fdf158 | ||
|
|
11081efcb0 | ||
|
|
1b412c3027 | ||
|
|
73ec66e627 | ||
|
|
4ae4cd80b1 | ||
|
|
6eb27c66fc | ||
|
|
f96fd17fd3 | ||
|
|
c255a2494d | ||
|
|
86a9846300 | ||
|
|
db877d253c | ||
|
|
0acf1e3b08 | ||
|
|
362ed3a9b6 | ||
|
|
758878a229 | ||
|
|
ffb6dfc333 | ||
|
|
66da74e00a | ||
|
|
d41a0045cb | ||
|
|
b65629ba0e | ||
|
|
9518e6d1a0 | ||
|
|
4f374ee885 | ||
|
|
afa239056e | ||
|
|
886825af11 | ||
|
|
198de925aa | ||
|
|
3f7b71e9a5 | ||
|
|
95baaf8603 | ||
|
|
3673264bab | ||
|
|
64fb5a6b63 | ||
|
|
e9c959ccdb | ||
|
|
4b7487e92e | ||
|
|
52dbcffd8e | ||
|
|
24ae354bc2 | ||
|
|
b30b91fd91 | ||
|
|
efb63afc74 | ||
|
|
16706f7169 | ||
|
|
d7c32676b5 | ||
|
|
c8c45446bc | ||
|
|
f4de2e27d7 | ||
|
|
970fcbd93b | ||
|
|
57d1cd7f1e | ||
|
|
522fc372fa | ||
|
|
7141690fcb | ||
|
|
c7d9177e68 | ||
|
|
00b3ea40d9 | ||
|
|
c9afe939dc | ||
|
|
4171ae6516 | ||
|
|
35a42c49d5 | ||
|
|
e4dbf56b49 | ||
|
|
76eeb10c47 | ||
|
|
9fa73ad54f | ||
|
|
6034a4fd06 | ||
|
|
9d15310b04 | ||
|
|
f04ec3e465 | ||
|
|
0071e7a462 | ||
|
|
d697461cc2 | ||
|
|
517ff00a0f | ||
|
|
d06017c045 | ||
|
|
1b819d96a5 | ||
|
|
ad2bfc31bc | ||
|
|
66b4f12fb3 | ||
|
|
40de2575bb | ||
|
|
be4a95fe91 | ||
|
|
c685b5e679 | ||
|
|
99baeba735 | ||
|
|
bc6b6d39da | ||
|
|
2bb814e170 | ||
|
|
3bf78c78e3 | ||
|
|
e38ecaec4c | ||
|
|
af40c78b56 | ||
|
|
12b206f9fa | ||
|
|
2cc51ba089 | ||
|
|
52f0846d5d | ||
|
|
3fa8848e77 | ||
|
|
41276e3d7e | ||
|
|
4cef93c95e | ||
|
|
cdd999ee03 | ||
|
|
4f253323db | ||
|
|
351f749e20 | ||
|
|
1e83fc4b9a | ||
|
|
c532bd1063 | ||
|
|
e4631a8176 |
8
.github/workflows/build_nupkg.yml
vendored
8
.github/workflows/build_nupkg.yml
vendored
@@ -16,10 +16,16 @@ jobs:
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 8.0.x
|
||||
dotnet-version: 9.0.x
|
||||
|
||||
- name: Restore dependencies
|
||||
run: dotnet restore
|
||||
|
||||
- name: Build library
|
||||
run: dotnet build
|
||||
|
||||
- name: Run tests
|
||||
run: dotnet test
|
||||
|
||||
- name: Pack
|
||||
run: dotnet pack
|
||||
|
||||
55
.github/workflows/build_test.yml
vendored
Normal file
55
.github/workflows/build_test.yml
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
name: Build InfoPrint
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
project: [InfoPrint]
|
||||
runtime: [win-x86, win-x64, win-arm64, linux-x64, linux-arm64, osx-x64]
|
||||
framework: [net9.0] #[net20, net35, net40, net452, net472, net48, netcoreapp3.1, net5.0, net6.0, net7.0, net8.0, net9.0]
|
||||
conf: [Debug] #[Release, Debug]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 9.0.x
|
||||
|
||||
- name: Restore dependencies
|
||||
run: dotnet restore
|
||||
|
||||
- name: Build
|
||||
run: dotnet publish ${{ matrix.project }}/${{ matrix.project }}.csproj -f ${{ matrix.framework }} -r ${{ matrix.runtime }} -c ${{ matrix.conf == 'Release' && 'Release -p:DebugType=None -p:DebugSymbols=false' || 'Debug'}} --self-contained true --version-suffix ${{ github.sha }} ${{ (startsWith(matrix.framework, 'net5') || startsWith(matrix.framework, 'net6') || startsWith(matrix.framework, 'net7') || startsWith(matrix.framework, 'net8') || startsWith(matrix.framework, 'net9')) && '-p:PublishSingleFile=true' || ''}}
|
||||
|
||||
- name: Archive build
|
||||
run: |
|
||||
cd ${{ matrix.project }}/bin/Debug/${{ matrix.framework }}/${{ matrix.runtime }}/publish/
|
||||
zip -r ${{ github.workspace }}/${{ matrix.project }}_${{ matrix.framework }}_${{ matrix.runtime }}_${{ matrix.conf }}.zip ./
|
||||
|
||||
- name: Upload build
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.project }}_${{ matrix.framework }}_${{ matrix.runtime }}_${{ matrix.conf }}
|
||||
path: ${{ matrix.project }}_${{ matrix.framework }}_${{ matrix.runtime }}_${{ matrix.conf }}.zip
|
||||
|
||||
- name: Upload to rolling
|
||||
uses: ncipollo/release-action@v1.14.0
|
||||
with:
|
||||
allowUpdates: True
|
||||
artifacts: ${{ matrix.project }}_${{ matrix.framework }}_${{ matrix.runtime }}_${{ matrix.conf }}.zip
|
||||
body: 'Last built commit: ${{ github.sha }}'
|
||||
name: 'Rolling Release'
|
||||
prerelease: True
|
||||
replacesArtifacts: True
|
||||
tag: "rolling"
|
||||
updateOnlyUnreleased: True
|
||||
7
.github/workflows/check_pr.yml
vendored
7
.github/workflows/check_pr.yml
vendored
@@ -11,7 +11,10 @@ jobs:
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 8.0.x
|
||||
dotnet-version: 9.0.x
|
||||
|
||||
- name: Build
|
||||
run: dotnet build
|
||||
run: dotnet build
|
||||
|
||||
- name: Run tests
|
||||
run: dotnet test
|
||||
328
.gitignore
vendored
328
.gitignore
vendored
@@ -1,15 +1,7 @@
|
||||
*.swp
|
||||
*.*~
|
||||
project.lock.json
|
||||
.DS_Store
|
||||
*.pyc
|
||||
nupkg/
|
||||
|
||||
# Visual Studio Code
|
||||
.vscode
|
||||
|
||||
# Rider
|
||||
.idea
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
@@ -17,6 +9,9 @@ nupkg/
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
@@ -24,15 +19,312 @@ nupkg/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
build/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Oo]ut/
|
||||
msbuild.log
|
||||
msbuild.err
|
||||
msbuild.wrn
|
||||
[Ll]og/
|
||||
|
||||
# Visual Studio 2015
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
**/Properties/launchSettings.json
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_i.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# JetBrains Rider
|
||||
.idea/
|
||||
*.sln.iml
|
||||
|
||||
# CodeRush
|
||||
.cr/
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
28
.vscode/launch.json
vendored
Normal file
28
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
// Use IntelliSense to find out which attributes exist for C# debugging
|
||||
// Use hover for the description of the existing attributes
|
||||
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": ".NET Core Launch (InfoPrint)",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build",
|
||||
// If you have changed target frameworks, make sure to update the program path.
|
||||
"program": "${workspaceFolder}/InfoPrint/bin/Debug/net9.0/InfoPrint.dll",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}",
|
||||
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false,
|
||||
"justMyCode": false
|
||||
},
|
||||
{
|
||||
"name": ".NET Core Attach",
|
||||
"type": "coreclr",
|
||||
"request": "attach",
|
||||
"processId": "${command:pickProcess}"
|
||||
}
|
||||
]
|
||||
}
|
||||
24
.vscode/tasks.json
vendored
Normal file
24
.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||
// for the documentation about the tasks.json format
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "build",
|
||||
"command": "dotnet",
|
||||
"type": "shell",
|
||||
"args": [
|
||||
"build",
|
||||
// Ask dotnet build to generate full paths for file names.
|
||||
"/property:GenerateFullPaths=true",
|
||||
// Do not generate summary otherwise it leads to duplicate errors in Problems panel
|
||||
"/consoleloggerparameters:NoSummary"
|
||||
],
|
||||
"group": "build",
|
||||
"presentation": {
|
||||
"reveal": "silent"
|
||||
},
|
||||
"problemMatcher": "$msCompile"
|
||||
}
|
||||
]
|
||||
}
|
||||
33
InfoPrint/InfoPrint.csproj
Normal file
33
InfoPrint/InfoPrint.csproj
Normal file
@@ -0,0 +1,33 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
|
||||
<OutputType>Exe</OutputType>
|
||||
<CheckEolTargetFramework>false</CheckEolTargetFramework>
|
||||
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<Version>1.7.4</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Support All Frameworks -->
|
||||
<PropertyGroup Condition="$(TargetFramework.StartsWith(`net2`)) OR $(TargetFramework.StartsWith(`net3`)) OR $(TargetFramework.StartsWith(`net4`))">
|
||||
<RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="$(TargetFramework.StartsWith(`netcoreapp`)) OR $(TargetFramework.StartsWith(`net5`))">
|
||||
<RuntimeIdentifiers>win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64</RuntimeIdentifiers>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="$(TargetFramework.StartsWith(`net6`)) OR $(TargetFramework.StartsWith(`net7`)) OR $(TargetFramework.StartsWith(`net8`)) OR $(TargetFramework.StartsWith(`net9`))">
|
||||
<RuntimeIdentifiers>win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64;osx-arm64</RuntimeIdentifiers>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="$(RuntimeIdentifier.StartsWith(`osx-arm`))">
|
||||
<TargetFrameworks>net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\SabreTools.Serialization\SabreTools.Serialization.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
119
InfoPrint/Options.cs
Normal file
119
InfoPrint/Options.cs
Normal file
@@ -0,0 +1,119 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace InfoPrint
|
||||
{
|
||||
/// <summary>
|
||||
/// Set of options for the test executable
|
||||
/// </summary>
|
||||
internal sealed class Options
|
||||
{
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
/// Enable debug output for relevant operations
|
||||
/// </summary>
|
||||
public bool Debug { get; private set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// Set of input paths to use for operations
|
||||
/// </summary>
|
||||
public List<string> InputPaths { get; private set; } = [];
|
||||
|
||||
#if NETCOREAPP3_1_OR_GREATER
|
||||
/// <summary>
|
||||
/// Enable JSON output
|
||||
/// </summary>
|
||||
public bool Json { get; private set; } = false;
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Parse commandline arguments into an Options object
|
||||
/// </summary>
|
||||
public static Options? ParseOptions(string[] args)
|
||||
{
|
||||
// If we have invalid arguments
|
||||
if (args == null || args.Length == 0)
|
||||
return null;
|
||||
|
||||
// Create an Options object
|
||||
var options = new Options();
|
||||
|
||||
// Parse the features
|
||||
int index = 0;
|
||||
for (; index < args.Length; index++)
|
||||
{
|
||||
string arg = args[index];
|
||||
bool featureFound = false;
|
||||
switch (arg)
|
||||
{
|
||||
case "-?":
|
||||
case "-h":
|
||||
case "--help":
|
||||
return null;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// If the flag wasn't a feature
|
||||
if (!featureFound)
|
||||
break;
|
||||
}
|
||||
|
||||
// Parse the options and paths
|
||||
for (; index < args.Length; index++)
|
||||
{
|
||||
string arg = args[index];
|
||||
switch (arg)
|
||||
{
|
||||
case "-d":
|
||||
case "--debug":
|
||||
options.Debug = true;
|
||||
break;
|
||||
|
||||
case "-j":
|
||||
case "--json":
|
||||
#if NET6_0_OR_GREATER
|
||||
options.Json = true;
|
||||
#else
|
||||
Console.WriteLine("JSON output not available in .NET Framework");
|
||||
#endif
|
||||
break;
|
||||
|
||||
default:
|
||||
options.InputPaths.Add(arg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Validate we have any input paths to work on
|
||||
if (options.InputPaths.Count == 0)
|
||||
{
|
||||
Console.WriteLine("At least one path is required!");
|
||||
return null;
|
||||
}
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Display help text
|
||||
/// </summary>
|
||||
public static void DisplayHelp()
|
||||
{
|
||||
Console.WriteLine("Information Printing Program");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("infoprint.exe <options> file|directory ...");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("Options:");
|
||||
Console.WriteLine("-?, -h, --help Display this help text and quit");
|
||||
Console.WriteLine("-d, --debug Enable debug mode");
|
||||
#if NET6_0_OR_GREATER
|
||||
Console.WriteLine("-j, --json Print info as JSON");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
132
InfoPrint/Program.cs
Normal file
132
InfoPrint/Program.cs
Normal file
@@ -0,0 +1,132 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.Serialization;
|
||||
using SabreTools.Serialization.Wrappers;
|
||||
|
||||
namespace InfoPrint
|
||||
{
|
||||
public static class Program
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
// Get the options from the arguments
|
||||
var options = Options.ParseOptions(args);
|
||||
|
||||
// If we have an invalid state
|
||||
if (options == null)
|
||||
{
|
||||
Options.DisplayHelp();
|
||||
return;
|
||||
}
|
||||
|
||||
// Loop through the input paths
|
||||
foreach (string inputPath in options.InputPaths)
|
||||
{
|
||||
#if NETFRAMEWORK
|
||||
PrintPathInfo(inputPath, false, options.Debug);
|
||||
#else
|
||||
PrintPathInfo(inputPath, options.Json, options.Debug);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wrapper to print information for a single path
|
||||
/// </summary>
|
||||
/// <param name="path">File or directory path</param>
|
||||
/// <param name="json">Enable JSON output, if supported</param>
|
||||
/// <param name="debug">Enable debug output</param>
|
||||
private static void PrintPathInfo(string path, bool json, bool debug)
|
||||
{
|
||||
Console.WriteLine($"Checking possible path: {path}");
|
||||
|
||||
// Check if the file or directory exists
|
||||
if (File.Exists(path))
|
||||
{
|
||||
PrintFileInfo(path, json, debug);
|
||||
}
|
||||
else if (Directory.Exists(path))
|
||||
{
|
||||
foreach (string file in IOExtensions.SafeEnumerateFiles(path, "*", SearchOption.AllDirectories))
|
||||
{
|
||||
PrintFileInfo(file, json, debug);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine($"{path} does not exist, skipping...");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Print information for a single file, if possible
|
||||
/// </summary>
|
||||
private static void PrintFileInfo(string file, bool json, bool debug)
|
||||
{
|
||||
Console.WriteLine($"Attempting to print info for {file}");
|
||||
|
||||
try
|
||||
{
|
||||
using Stream stream = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
|
||||
|
||||
// Read the first 8 bytes
|
||||
byte[]? magic = stream.ReadBytes(8);
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
// Get the file type
|
||||
string extension = Path.GetExtension(file).TrimStart('.');
|
||||
WrapperType ft = WrapperFactory.GetFileType(magic ?? [], extension);
|
||||
|
||||
// Print out the file format
|
||||
Console.WriteLine($"File format found: {ft}");
|
||||
|
||||
// Setup the wrapper to print
|
||||
var wrapper = WrapperFactory.CreateWrapper(ft, stream);
|
||||
|
||||
// If we don't have a wrapper
|
||||
if (wrapper == null)
|
||||
{
|
||||
Console.WriteLine($"Either {ft} is not supported or something went wrong during parsing!");
|
||||
Console.WriteLine();
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the base info output name
|
||||
string filenameBase = $"info-{DateTime.Now:yyyy-MM-dd_HHmmss.ffff}";
|
||||
|
||||
#if NET6_0_OR_GREATER
|
||||
// If we have the JSON flag
|
||||
if (json)
|
||||
{
|
||||
// Create the output data
|
||||
string serializedData = wrapper.ExportJSON();
|
||||
Console.WriteLine(serializedData);
|
||||
|
||||
// Write the output data
|
||||
using var jsw = new StreamWriter(File.OpenWrite($"{filenameBase}.json"));
|
||||
jsw.WriteLine(serializedData);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Create the output data
|
||||
var builder = wrapper.ExportStringBuilder();
|
||||
if (builder == null)
|
||||
{
|
||||
Console.WriteLine("No item information could be generated");
|
||||
return;
|
||||
}
|
||||
|
||||
// Write the output data
|
||||
Console.WriteLine(builder);
|
||||
using var sw = new StreamWriter(File.OpenWrite($"{filenameBase}.txt"));
|
||||
sw.WriteLine(builder.ToString());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(debug ? ex : "[Exception opening file, please try again]");
|
||||
Console.WriteLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
17
README.MD
17
README.MD
@@ -4,9 +4,15 @@ This library comprises of serializers that both read and write from files and st
|
||||
|
||||
Find the link to the Nuget package [here](https://www.nuget.org/packages/SabreTools.Serialization).
|
||||
|
||||
## Releases
|
||||
|
||||
For the most recent stable build, download the latest release here: [Releases Page](https://github.com/SabreTools/SabreTools.Serialization/releases)
|
||||
|
||||
For the latest WIP build here: [Rolling Release](https://github.com/SabreTools/SabreTools.Serialization/releases/tag/rolling)
|
||||
|
||||
## Interfaces
|
||||
|
||||
Below is a table representing the various interfaces that are implemented within this library.
|
||||
Below is a table representing the various conversion interfaces that are implemented within this library.
|
||||
|
||||
| Interface Name | Source Type | Destination Type |
|
||||
| --- | --- | --- |
|
||||
@@ -19,7 +25,13 @@ Below is a table representing the various interfaces that are implemented within
|
||||
| `IStreamSerializer` | Model | `Stream?` |
|
||||
| `IStringDeserializer` | `string?` representation | Model |
|
||||
| `IStringSerializer` | Model | `string?` representation |
|
||||
| `IWrapper` | N/A | N/A |
|
||||
|
||||
Below is a table representing the various non-conversion interfaces that are implemented within this library.
|
||||
|
||||
| Interface Name | Purpose |
|
||||
| --- | --- |
|
||||
| `IPrinter` | Provides a formatted output for a model |
|
||||
| `IWrapper` / `IWrapper<T>` | Wraps a model or set of models to provide additional functionality |
|
||||
|
||||
## Namespaces
|
||||
|
||||
@@ -29,5 +41,6 @@ Below is a table of all namespaces within the library and what they represent
|
||||
| --- | --- |
|
||||
| `SabreTools.Serialization.CrossModel` | Convert between models; mainly used for metadata files converting to and from a common, `Dictionary`-based model |
|
||||
| `SabreTools.Serialization.Deserializers` | Convert from external sources to models |
|
||||
| `SabreTools.Serialization.Printers` | Export model information in a formatted manner |
|
||||
| `SabreTools.Serialization.Serializers` | Convert from models to external sources |
|
||||
| `SabreTools.Serialization.Wrappers` | Classes that wrap serialization and models to allow for including extension properties |
|
||||
|
||||
313
SabreTools.Serialization.Test/MetadataDeserializationTests.cs
Normal file
313
SabreTools.Serialization.Test/MetadataDeserializationTests.cs
Normal file
@@ -0,0 +1,313 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using SabreTools.Hashing;
|
||||
using SabreTools.Serialization.Deserializers;
|
||||
using Xunit;
|
||||
|
||||
namespace SabreTools.Serialization.Test
|
||||
{
|
||||
/// <remarks>
|
||||
/// Filenames that end in `-files` are real examples.
|
||||
/// All other files are artificial and may not fully represent real examples.
|
||||
/// </remarks>
|
||||
public class MetadataDeserializationTests
|
||||
{
|
||||
[Theory]
|
||||
[InlineData("test-archivedotorg-files1.xml", 22)]
|
||||
[InlineData("test-archivedotorg-files2.xml", 13)]
|
||||
[InlineData("test-archivedotorg-files3.xml", 21)]
|
||||
[InlineData("test-archivedotorg-files4.xml", 19)]
|
||||
[InlineData("test-archivedotorg-files5.xml", 1390)]
|
||||
public void ArchiveDotOrgDeserializeTest(string path, long count)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = ArchiveDotOrg.DeserializeFile(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat?.File);
|
||||
Assert.Equal(count, dat.File.Length);
|
||||
|
||||
// Validate we're not missing any attributes or elements
|
||||
foreach (var file in dat.File)
|
||||
{
|
||||
Assert.NotNull(file);
|
||||
}
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("test-attractmode-files.txt", 11)]
|
||||
public void AttractModeDeserializeTest(string path, long count)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = AttractMode.DeserializeFile(filename);
|
||||
|
||||
// Validate texpected: he values
|
||||
Assert.NotNull(dat?.Row);
|
||||
Assert.Equal(count, dat.Row.Length);
|
||||
|
||||
// Validate we're not missing any attributes or elements
|
||||
foreach (var file in dat.Row)
|
||||
{
|
||||
Assert.NotNull(file);
|
||||
}
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("test-cmp-files1.dat", 59, true)]
|
||||
[InlineData("test-cmp-files2.dat", 312, false)]
|
||||
public void ClrMameProDeserializeTest(string path, long count, bool expectHeader)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = ClrMamePro.DeserializeFile(filename, quotes: true);
|
||||
|
||||
// Validate the values
|
||||
if (expectHeader)
|
||||
Assert.NotNull(dat?.ClrMamePro);
|
||||
else
|
||||
Assert.Null(dat?.ClrMamePro);
|
||||
|
||||
Assert.NotNull(dat?.Game);
|
||||
Assert.Equal(count, dat.Game.Length);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("test-doscenter-files1.dat.gz", 34965)]
|
||||
[InlineData("test-doscenter-files2.dat.gz", 7189)]
|
||||
public void DosCenterDeserializeTest(string path, long count)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = DosCenter.DeserializeFile(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat?.DosCenter);
|
||||
|
||||
Assert.NotNull(dat?.Game);
|
||||
Assert.Equal(count, dat.Game.Length);
|
||||
|
||||
foreach (var game in dat.Game)
|
||||
{
|
||||
Assert.NotNull(game.File);
|
||||
}
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("test-smdb-files.txt", 6113)]
|
||||
public void EverdriveSMDBDeserializeTest(string path, long count)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = EverdriveSMDB.DeserializeFile(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat?.Row);
|
||||
Assert.Equal(count, dat.Row.Length);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("test-sfv-files.sfv", HashType.CRC32, 100)]
|
||||
[InlineData("test-md5-files.md5", HashType.MD5, 100)]
|
||||
[InlineData("test-sha1-files.sha1", HashType.SHA1, 100)]
|
||||
[InlineData("test-sha256.sha256", HashType.SHA256, 1)]
|
||||
[InlineData("test-sha384.sha384", HashType.SHA384, 1)]
|
||||
[InlineData("test-sha512.sha512", HashType.SHA512, 1)]
|
||||
[InlineData("test-spamsum.spamsum", HashType.SpamSum, 1)]
|
||||
public void HashfileDeserializeTest(string path, HashType hash, long count)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = Hashfile.DeserializeFile(filename, hash);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat);
|
||||
|
||||
switch (hash)
|
||||
{
|
||||
case HashType.CRC32:
|
||||
Assert.NotNull(dat.SFV);
|
||||
Assert.Equal(count, dat.SFV.Length);
|
||||
break;
|
||||
case HashType.MD5:
|
||||
Assert.NotNull(dat.MD5);
|
||||
Assert.Equal(count, dat.MD5.Length);
|
||||
break;
|
||||
case HashType.SHA1:
|
||||
Assert.NotNull(dat.SHA1);
|
||||
Assert.Equal(count, dat.SHA1.Length);
|
||||
break;
|
||||
case HashType.SHA256:
|
||||
Assert.NotNull(dat.SHA256);
|
||||
Assert.Equal(count, dat.SHA256.Length);
|
||||
break;
|
||||
case HashType.SHA384:
|
||||
Assert.NotNull(dat.SHA384);
|
||||
Assert.Equal(count, dat.SHA384.Length);
|
||||
break;
|
||||
case HashType.SHA512:
|
||||
Assert.NotNull(dat.SHA512);
|
||||
Assert.Equal(count, dat.SHA512.Length);
|
||||
break;
|
||||
case HashType.SpamSum:
|
||||
Assert.NotNull(dat.SpamSum);
|
||||
Assert.Equal(count, dat.SpamSum.Length);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(hash));
|
||||
}
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("test-listrom-files.txt.gz", 45861)]
|
||||
public void ListromDeserializeTest(string path, long count)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = Listrom.DeserializeFile(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat?.Set);
|
||||
Assert.Equal(count, dat.Set.Length);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("test-listxml-files1.xml.gz", 45861)]
|
||||
[InlineData("test-listxml-files2.xml", 3998)]
|
||||
public void ListxmlDeserializeTest(string path, long count)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = Listxml.DeserializeFile(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat?.Game);
|
||||
Assert.Equal(count, dat.Game.Length);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("test-logiqx-files1.xml.gz", 45875)]
|
||||
[InlineData("test-logiqx-files2.xml", 761)]
|
||||
public void LogiqxDeserializeTest(string path, long count)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = Logiqx.DeserializeFile(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat?.Game);
|
||||
Assert.Equal(count, dat.Game.Length);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("test-offlinelist-files.xml", 6750)]
|
||||
public void OfflineListDeserializeTest(string path, long count)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = OfflineList.DeserializeFile(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat?.Games?.Game);
|
||||
Assert.Equal(count, dat.Games.Game.Length);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("test-openmsx-files.xml", 2550)]
|
||||
public void OpenMSXDeserializeTest(string path, long count)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = OpenMSX.DeserializeFile(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat);
|
||||
Assert.NotNull(dat.Software);
|
||||
Assert.Equal(count, dat.Software.Length);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("test-romcenter-files.dat", 901)]
|
||||
public void RomCenterDeserializeTest(string path, long count)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = RomCenter.DeserializeFile(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat?.Games?.Rom);
|
||||
Assert.Equal(count, dat.Games.Rom.Length);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("test-csv-files1.csv", ',', 2)]
|
||||
[InlineData("test-csv-files2.csv", ',', 2)]
|
||||
[InlineData("test-ssv-files1.ssv", ';', 2)]
|
||||
[InlineData("test-ssv-files2.ssv", ';', 2)]
|
||||
[InlineData("test-tsv-files1.tsv", '\t', 2)]
|
||||
[InlineData("test-tsv-files2.tsv", '\t', 2)]
|
||||
public void SeparatedValueDeserializeTest(string path, char delim, long count)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = SeparatedValue.DeserializeFile(filename, delim);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat?.Row);
|
||||
Assert.Equal(count, dat.Row.Length);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("test-softwarelist-files1.xml", 4531)]
|
||||
[InlineData("test-softwarelist-files2.xml", 2797)]
|
||||
[InlineData("test-softwarelist-files3.xml", 274)]
|
||||
public void SoftwareListDeserializeTest(string path, long count)
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = GetTestFilePath(path);
|
||||
|
||||
// Deserialize the file
|
||||
var dat = SoftwareList.DeserializeFile(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat);
|
||||
Assert.NotNull(dat.Software);
|
||||
Assert.Equal(count, dat.Software.Length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the path to the test file
|
||||
/// </summary>
|
||||
private static string GetTestFilePath(string path)
|
||||
{
|
||||
return Path.Combine(Environment.CurrentDirectory, "TestData", path);
|
||||
}
|
||||
}
|
||||
}
|
||||
91
SabreTools.Serialization.Test/MetadataSerializationTests.cs
Normal file
91
SabreTools.Serialization.Test/MetadataSerializationTests.cs
Normal file
@@ -0,0 +1,91 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Security.Cryptography;
|
||||
using SabreTools.Serialization.Serializers;
|
||||
using Xunit;
|
||||
|
||||
namespace SabreTools.Serialization.Test
|
||||
{
|
||||
public class MetadataSerializationTests
|
||||
{
|
||||
[Fact]
|
||||
public void OpenMSXSeserializeTest()
|
||||
{
|
||||
// Create the object for serialization
|
||||
var dat = GenerateOpenMSX();
|
||||
|
||||
// Deserialize the file
|
||||
var stream = OpenMSX.SerializeStream(dat) as MemoryStream;
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(stream);
|
||||
byte[] hash = SHA1.HashData(stream.GetBuffer());
|
||||
string hashstr = BitConverter.ToString(hash).Replace("-", string.Empty);
|
||||
Assert.Equal("CCBFAAB56BAAF6BE56A85918055784A615379659", hashstr);
|
||||
}
|
||||
|
||||
#region Payload Generators
|
||||
|
||||
/// <summary>
|
||||
/// Generate a consistent OpenMSX SoftwareDb for testing
|
||||
/// </summary>
|
||||
private static Models.OpenMSX.SoftwareDb GenerateOpenMSX()
|
||||
{
|
||||
var original = new Models.OpenMSX.Original
|
||||
{
|
||||
Value = "false",
|
||||
Content = "Original Name",
|
||||
};
|
||||
|
||||
var rom = new Models.OpenMSX.Rom
|
||||
{
|
||||
Start = "0x0000",
|
||||
Type = "Game",
|
||||
Hash = "da39a3ee5e6b4b0d3255bfef95601890afd80709",
|
||||
Remark = "Comment",
|
||||
};
|
||||
|
||||
var megaRom = new Models.OpenMSX.MegaRom
|
||||
{
|
||||
Start = "0x1000",
|
||||
Type = "Software",
|
||||
Hash = "da39a3ee5e6b4b0d3255bfef95601890afd80709",
|
||||
Remark = "Comment",
|
||||
};
|
||||
|
||||
var sccPlusCart = new Models.OpenMSX.SCCPlusCart
|
||||
{
|
||||
Start = "0x2000",
|
||||
Type = "Utility",
|
||||
Hash = "da39a3ee5e6b4b0d3255bfef95601890afd80709",
|
||||
Remark = "Comment",
|
||||
};
|
||||
|
||||
var dump = new Models.OpenMSX.Dump[]
|
||||
{
|
||||
new() { Original = original, Rom = rom },
|
||||
new() { Rom = megaRom },
|
||||
new() { Rom = sccPlusCart },
|
||||
};
|
||||
|
||||
var software = new Models.OpenMSX.Software
|
||||
{
|
||||
Title = "Software Title",
|
||||
GenMSXID = "00000", // Not required
|
||||
System = "MSX 2",
|
||||
Company = "Imaginary Company, Inc.",
|
||||
Year = "19xx",
|
||||
Country = "Imaginaria",
|
||||
Dump = dump,
|
||||
};
|
||||
|
||||
return new Models.OpenMSX.SoftwareDb
|
||||
{
|
||||
Timestamp = "1234567890",
|
||||
Software = [software],
|
||||
};
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0;net8.0;net9.0</TargetFrameworks>
|
||||
<IsPackable>false</IsPackable>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\SabreTools.Serialization\SabreTools.Serialization.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="TestData\*" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="TestData\*">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.2">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
|
||||
<PackageReference Include="SabreTools.Models" Version="1.5.1" />
|
||||
<PackageReference Include="xunit" Version="2.9.2" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,228 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!--
|
||||
Source: https://ia902607.us.archive.org/4/items/adventuresofsher00doylrich/adventuresofsher00doylrich_files.xml
|
||||
-->
|
||||
<files>
|
||||
<file name="__ia_thumb.jpg" source="original">
|
||||
<mtime>1657820174</mtime>
|
||||
<size>23393</size>
|
||||
<md5>33ca910055358d18e116ea66a0abdf04</md5>
|
||||
<crc32>aad0f2dc</crc32>
|
||||
<sha1>fc6d673ef7fbe974bba88b8275c737eeb20b5ba8</sha1>
|
||||
<format>Item Tile</format>
|
||||
<rotation>0</rotation>
|
||||
</file>
|
||||
<file name="_cloth_detection.log" source="derivative">
|
||||
<cloth_cover_detection_module_version>1.2</cloth_cover_detection_module_version>
|
||||
<format>Cloth Cover Detection Log</format>
|
||||
<original>scandata.zip</original>
|
||||
<mtime>1682523106</mtime>
|
||||
<size>717</size>
|
||||
<md5>3ed8a80448263ebfad242b8fa5a1a18d</md5>
|
||||
<crc32>d886dce1</crc32>
|
||||
<sha1>4f8d103cf07c29e1d3bb8273870f1daca4a89f26</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich.djvu" source="derivative">
|
||||
<format>DjVu</format>
|
||||
<original>adventuresofsher00doylrich_djvu.xml</original>
|
||||
<mtime>1288609616</mtime>
|
||||
<size>11176526</size>
|
||||
<md5>52ccad905110bc7f3c0fe032ef744fa1</md5>
|
||||
<crc32>91973508</crc32>
|
||||
<sha1>aa5214400b60e3b68f5eaa9733e10af4bcfe4e8d</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich.gif" source="derivative">
|
||||
<format>Animated GIF</format>
|
||||
<original>adventuresofsher00doylrich_jp2.zip</original>
|
||||
<mtime>1288593173</mtime>
|
||||
<size>334379</size>
|
||||
<md5>4d56403c12771ed7e396f6187d95502d</md5>
|
||||
<crc32>1a8585c1</crc32>
|
||||
<sha1>6062155959dd69f279a489b3761afa0a1638173d</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich.pdf" source="derivative">
|
||||
<pdf_module_version>0.0.22</pdf_module_version>
|
||||
<format>Text PDF</format>
|
||||
<original>adventuresofsher00doylrich_page_numbers.json</original>
|
||||
<mtime>1682525473</mtime>
|
||||
<size>26126569</size>
|
||||
<md5>98ad55b9989671f823228055bfbca465</md5>
|
||||
<crc32>cdc5f40d</crc32>
|
||||
<sha1>e358dd22e04f7efcd4dfc8a6c2d714a0e0a8297c</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_archive.torrent" source="metadata">
|
||||
<btih>4b5bbf39f9e489f66e0c70a9ac45af495b31a2ba</btih>
|
||||
<mtime>1688944719</mtime>
|
||||
<size>17197</size>
|
||||
<md5>91aa4822d1552ef8bd08b27b14d8af4d</md5>
|
||||
<crc32>10a3d397</crc32>
|
||||
<sha1>9f5d4b652ac6903e218c8ff8e854482ab3d31b99</sha1>
|
||||
<format>Archive BitTorrent</format>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_chocr.html.gz" source="derivative">
|
||||
<ocr>tesseract 5.3.0-3-g9920</ocr>
|
||||
<ocr_parameters>lang-eng;two-pass-disabled;pass-dpi-disabled;autonomous-mode-disabled;binarisation-method-otsu</ocr_parameters>
|
||||
<ocr_module_version>0.0.21</ocr_module_version>
|
||||
<ocr_detected_script>Latin</ocr_detected_script>
|
||||
<ocr_detected_script_conf>0.8867</ocr_detected_script_conf>
|
||||
<ocr_detected_lang>en</ocr_detected_lang>
|
||||
<ocr_detected_lang_conf>1.0000</ocr_detected_lang_conf>
|
||||
<format>chOCR</format>
|
||||
<original>adventuresofsher00doylrich_jp2.zip</original>
|
||||
<mtime>1682523054</mtime>
|
||||
<size>8326755</size>
|
||||
<md5>cda085dadcc74ca4bbeb768b69e7b28b</md5>
|
||||
<crc32>faa3bbc1</crc32>
|
||||
<sha1>0ceffd2d58757e30ccfcc84ff6805093e32607b3</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_dc.xml" source="original">
|
||||
<format>Dublin Core</format>
|
||||
<mtime>1682518166</mtime>
|
||||
<size>1712</size>
|
||||
<md5>bb3294746c4d5bb8102f8426454b26fb</md5>
|
||||
<crc32>7c20c9c9</crc32>
|
||||
<sha1>2bc134939b5f044396c56af740ad55029978859e</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_djvu.txt" source="derivative">
|
||||
<format>DjVuTXT</format>
|
||||
<original>adventuresofsher00doylrich_djvu.xml</original>
|
||||
<mtime>1682523254</mtime>
|
||||
<size>613882</size>
|
||||
<md5>022b57b4017bbd8e6564c6e0968ad063</md5>
|
||||
<crc32>2828f839</crc32>
|
||||
<sha1>1535e2f509fc3a81c377d2b7270d21a95af71d65</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_djvu.xml" source="derivative">
|
||||
<format>Djvu XML</format>
|
||||
<original>adventuresofsher00doylrich_hocr.html</original>
|
||||
<mtime>1682523185</mtime>
|
||||
<size>8593952</size>
|
||||
<md5>6faee3cd4ba7b3eaca3a2f5f4e8414f6</md5>
|
||||
<crc32>51713c61</crc32>
|
||||
<sha1>16dc73c2bdce4705c37d86a798d83fb780929928</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_files.xml" source="original">
|
||||
<format>Metadata</format>
|
||||
<md5>f39ff302a7965a1a077f3c4962f5d2e9</md5>
|
||||
<summation>md5</summation>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_hocr.html" source="derivative">
|
||||
<hocr_char_to_word_module_version>1.1.0</hocr_char_to_word_module_version>
|
||||
<hocr_char_to_word_hocr_version>1.1.15</hocr_char_to_word_hocr_version>
|
||||
<ocr_parameters>lang-eng;two-pass-disabled;pass-dpi-disabled;autonomous-mode-disabled;binarisation-method-otsu</ocr_parameters>
|
||||
<ocr_module_version>0.0.21</ocr_module_version>
|
||||
<ocr_detected_script>Latin</ocr_detected_script>
|
||||
<ocr_detected_script_conf>0.8867</ocr_detected_script_conf>
|
||||
<ocr_detected_lang>en</ocr_detected_lang>
|
||||
<ocr_detected_lang_conf>1.0000</ocr_detected_lang_conf>
|
||||
<format>hOCR</format>
|
||||
<original>adventuresofsher00doylrich_chocr.html.gz</original>
|
||||
<mtime>1682523150</mtime>
|
||||
<size>15785810</size>
|
||||
<md5>afbb8a9c1e6c25b3755fa6345153b13d</md5>
|
||||
<crc32>e79c31fd</crc32>
|
||||
<sha1>8b7cd7fd2010544783277f502c4103310dc2e2c4</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_hocr_pageindex.json.gz" source="derivative">
|
||||
<hocr_pageindex_module_version>1.0.0</hocr_pageindex_module_version>
|
||||
<hocr_pageindex_hocr_version>1.1.15</hocr_pageindex_hocr_version>
|
||||
<format>OCR Page Index</format>
|
||||
<original>adventuresofsher00doylrich_hocr.html</original>
|
||||
<mtime>1682523219</mtime>
|
||||
<size>4232</size>
|
||||
<md5>aec425c66ef34149cff679b8998c2a36</md5>
|
||||
<crc32>9a6e2f76</crc32>
|
||||
<sha1>cc91c1eb055652ab6c9de878c6b54e8b95bddad1</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_hocr_searchtext.txt.gz" source="derivative">
|
||||
<hocr_fts_text_module_version>1.1.0</hocr_fts_text_module_version>
|
||||
<hocr_fts_text_hocr_version>1.1.15</hocr_fts_text_hocr_version>
|
||||
<word_conf_0_10>531</word_conf_0_10>
|
||||
<word_conf_11_20>242</word_conf_11_20>
|
||||
<word_conf_21_30>298</word_conf_21_30>
|
||||
<word_conf_31_40>321</word_conf_31_40>
|
||||
<word_conf_41_50>389</word_conf_41_50>
|
||||
<word_conf_51_60>450</word_conf_51_60>
|
||||
<word_conf_61_70>671</word_conf_61_70>
|
||||
<word_conf_71_80>1059</word_conf_71_80>
|
||||
<word_conf_81_90>3102</word_conf_81_90>
|
||||
<word_conf_91_100>103350</word_conf_91_100>
|
||||
<format>OCR Search Text</format>
|
||||
<original>adventuresofsher00doylrich_hocr.html</original>
|
||||
<mtime>1682523242</mtime>
|
||||
<size>224594</size>
|
||||
<md5>2e1011def53909a247f73af66420e0c3</md5>
|
||||
<crc32>32dddf59</crc32>
|
||||
<sha1>f303467ce8f109a1d9cf49f2038c9a1d43e3c63e</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_jp2.zip" source="derivative">
|
||||
<format>Single Page Processed JP2 ZIP</format>
|
||||
<original>adventuresofsher00doylrich_raw_jp2.zip</original>
|
||||
<mtime>1288593129</mtime>
|
||||
<size>203319748</size>
|
||||
<md5>2acbe6b61d35d8bd093127f0cef724c9</md5>
|
||||
<crc32>66bcf599</crc32>
|
||||
<sha1>a8801760eec5442176281584bd6242868f81cde5</sha1>
|
||||
<filecount>364</filecount>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_marc.xml" source="original">
|
||||
<format>MARC</format>
|
||||
<md5>e951175fb1ee03c706ab6ee34754a92c</md5>
|
||||
<mtime>1682518056</mtime>
|
||||
<size>7679</size>
|
||||
<crc32>3538b620</crc32>
|
||||
<sha1>8fd493fa0971c2f7c2fdb1d84e0ec4234b878ff4</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_meta.xml" source="original">
|
||||
<format>Metadata</format>
|
||||
<mtime>1682525557</mtime>
|
||||
<size>3790</size>
|
||||
<md5>e98cb44acdb4e4f070fddb8b1f328d93</md5>
|
||||
<crc32>04ee4346</crc32>
|
||||
<sha1>c687fc00d20b516b0cf19225296e984cbfe7c315</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_metasource.xml" source="original">
|
||||
<format>MARC Source</format>
|
||||
<md5>7099c2013db04ef8a7277386ce74de54</md5>
|
||||
<mtime>1682518056</mtime>
|
||||
<size>527</size>
|
||||
<crc32>6fa5d977</crc32>
|
||||
<sha1>34ed3e366ed809a1a39a265373b9cf5b8cc06f0c</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_page_numbers.json" source="derivative">
|
||||
<format>Page Numbers JSON</format>
|
||||
<original>adventuresofsher00doylrich_djvu.xml</original>
|
||||
<mtime>1682523259</mtime>
|
||||
<size>67337</size>
|
||||
<md5>f9179733924fa4566f0e9a05c8c276dd</md5>
|
||||
<crc32>2bd8369f</crc32>
|
||||
<sha1>e4104152caa990c72f986eb63c660239f0111feb</sha1>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_raw_jp2.zip" source="original">
|
||||
<format>Single Page Raw JP2 ZIP</format>
|
||||
<md5>d2a1137d4f8fed61be945f878444923b</md5>
|
||||
<mtime>1204986411</mtime>
|
||||
<size>370667543</size>
|
||||
<crc32>12eda51c</crc32>
|
||||
<sha1>402b01b5a734ae4f857991c0977ba629a8606932</sha1>
|
||||
<filecount>364</filecount>
|
||||
</file>
|
||||
<file name="adventuresofsher00doylrich_reviews.xml" source="original">
|
||||
<mtime>1688944715</mtime>
|
||||
<size>9412</size>
|
||||
<md5>ff0c9653a7aa865ea01e032e8b657736</md5>
|
||||
<crc32>7634dbbc</crc32>
|
||||
<sha1>f93a8206d6836f08c19dd023eb552bed2106cad9</sha1>
|
||||
<format>Metadata</format>
|
||||
</file>
|
||||
<file name="scandata.zip" source="original">
|
||||
<format>Scribe Scandata ZIP</format>
|
||||
<md5>506fdf9aa054fbc7e9e2577d05d5e7cf</md5>
|
||||
<mtime>1682523105</mtime>
|
||||
<size>55175976</size>
|
||||
<crc32>232ce248</crc32>
|
||||
<sha1>9adf53bc1b8e7be5afe3526d2ab64f9696058488</sha1>
|
||||
<filecount>11</filecount>
|
||||
</file>
|
||||
</files>
|
||||
@@ -0,0 +1,119 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<files>
|
||||
<file name="I have grown so used to you - J. Frank Hopkins.gif" source="derivative">
|
||||
<format>Animated GIF</format>
|
||||
<original>I have grown so used to you - J. Frank Hopkins.mp4</original>
|
||||
<mtime>1446681646</mtime>
|
||||
<size>83293</size>
|
||||
<md5>d60eddbc1d9915dc3a49889890c172d1</md5>
|
||||
<crc32>30fe3c3e</crc32>
|
||||
<sha1>80f7f6b523965b9dc4f997a775d03aab7f6dfcfb</sha1>
|
||||
</file>
|
||||
<file name="I have grown so used to you - J. Frank Hopkins.mp4" source="original">
|
||||
<mtime>1446681528</mtime>
|
||||
<size>69339907</size>
|
||||
<md5>867ad802b751623b409eb833a15d0b80</md5>
|
||||
<crc32>dbc81bfe</crc32>
|
||||
<sha1>5e860bdb6cad0b7f974ebe9ea391e26f4cd8c714</sha1>
|
||||
<format>MPEG4</format>
|
||||
<length>140.42</length>
|
||||
<height>720</height>
|
||||
<width>1280</width>
|
||||
</file>
|
||||
<file name="I have grown so used to you - J. Frank Hopkins.ogv" source="derivative">
|
||||
<format>Ogg Video</format>
|
||||
<original>I have grown so used to you - J. Frank Hopkins.mp4</original>
|
||||
<mtime>1446682043</mtime>
|
||||
<size>10548875</size>
|
||||
<md5>9a9dc6524b8ca0be68d1b0c3e9b2d0b2</md5>
|
||||
<crc32>5a17284d</crc32>
|
||||
<sha1>36b7e06adf4cf4f8fc159dba380dae9e632e410a</sha1>
|
||||
<length>140.42</length>
|
||||
<height>300</height>
|
||||
<width>533</width>
|
||||
</file>
|
||||
<file name="IHaveGrownSoUsedToYouJ.FrankHopkins.thumbs/I have grown so used to you - J. Frank Hopkins_000001.jpg" source="derivative">
|
||||
<format>Thumbnail</format>
|
||||
<original>I have grown so used to you - J. Frank Hopkins.mp4</original>
|
||||
<mtime>1446681658</mtime>
|
||||
<size>8382</size>
|
||||
<md5>dbb3838f9e348938ffabf8570809bd1b</md5>
|
||||
<crc32>ca0b9e96</crc32>
|
||||
<sha1>1efa60020eb9b0441256d00d51c1ef208cb50047</sha1>
|
||||
</file>
|
||||
<file name="IHaveGrownSoUsedToYouJ.FrankHopkins.thumbs/I have grown so used to you - J. Frank Hopkins_000045.jpg" source="derivative">
|
||||
<format>Thumbnail</format>
|
||||
<original>I have grown so used to you - J. Frank Hopkins.mp4</original>
|
||||
<mtime>1446681676</mtime>
|
||||
<size>8244</size>
|
||||
<md5>295c4e5fe1b56e0438008c60d28213b7</md5>
|
||||
<crc32>441108d4</crc32>
|
||||
<sha1>388801815d2aa0fa98c4a75589f73faeb958071f</sha1>
|
||||
</file>
|
||||
<file name="IHaveGrownSoUsedToYouJ.FrankHopkins.thumbs/I have grown so used to you - J. Frank Hopkins_000075.jpg" source="derivative">
|
||||
<format>Thumbnail</format>
|
||||
<original>I have grown so used to you - J. Frank Hopkins.mp4</original>
|
||||
<mtime>1446681693</mtime>
|
||||
<size>8321</size>
|
||||
<md5>94a0c9ae786011773c29be2bb844bd70</md5>
|
||||
<crc32>f09fea6a</crc32>
|
||||
<sha1>439476ad109f2f1edd0b85c2c04b5c6dfdfe0bce</sha1>
|
||||
</file>
|
||||
<file name="IHaveGrownSoUsedToYouJ.FrankHopkins.thumbs/I have grown so used to you - J. Frank Hopkins_000105.jpg" source="derivative">
|
||||
<format>Thumbnail</format>
|
||||
<original>I have grown so used to you - J. Frank Hopkins.mp4</original>
|
||||
<mtime>1446681710</mtime>
|
||||
<size>8342</size>
|
||||
<md5>a284cbd6a9288e29b7b03118c6658816</md5>
|
||||
<crc32>62785a42</crc32>
|
||||
<sha1>44dd6f1df0c681f410076035bc7b8b3bae81bff4</sha1>
|
||||
</file>
|
||||
<file name="IHaveGrownSoUsedToYouJ.FrankHopkins.thumbs/I have grown so used to you - J. Frank Hopkins_000135.jpg" source="derivative">
|
||||
<format>Thumbnail</format>
|
||||
<original>I have grown so used to you - J. Frank Hopkins.mp4</original>
|
||||
<mtime>1446681726</mtime>
|
||||
<size>8586</size>
|
||||
<md5>0f0d08441fc414794063b7e07d5d0947</md5>
|
||||
<crc32>dc6e44cf</crc32>
|
||||
<sha1>cfac85033a4d0a45cc1a5c8ffd2fb37263ecfa8e</sha1>
|
||||
</file>
|
||||
<file name="IHaveGrownSoUsedToYouJ.FrankHopkins_archive.torrent" source="metadata">
|
||||
<btih>65d70d3788efdc9fba994ac2abf4a82c3f3d3864</btih>
|
||||
<mtime>1688963806</mtime>
|
||||
<size>5514</size>
|
||||
<md5>5279f6df87259e51a00ef537cc91ce9b</md5>
|
||||
<crc32>eedeca57</crc32>
|
||||
<sha1>26830f2b391cd8ed60f5d793d87016a0f1496bdc</sha1>
|
||||
<format>Archive BitTorrent</format>
|
||||
</file>
|
||||
<file name="IHaveGrownSoUsedToYouJ.FrankHopkins_files.xml" source="original">
|
||||
<format>Metadata</format>
|
||||
<md5>954d2f3d58262e80c87a2f623a59200e</md5>
|
||||
<summation>md5</summation>
|
||||
</file>
|
||||
<file name="IHaveGrownSoUsedToYouJ.FrankHopkins_meta.sqlite" source="original">
|
||||
<mtime>1446681548</mtime>
|
||||
<size>12288</size>
|
||||
<md5>1da7d006f8f27b4fc9a1fd74941095cf</md5>
|
||||
<crc32>1308a8d9</crc32>
|
||||
<sha1>f31849351ed620108d7f3bb4af5aa5e40b4cdb7b</sha1>
|
||||
<format>Metadata</format>
|
||||
</file>
|
||||
<file name="IHaveGrownSoUsedToYouJ.FrankHopkins_meta.xml" source="original">
|
||||
<mtime>1682350692</mtime>
|
||||
<size>1161</size>
|
||||
<format>Metadata</format>
|
||||
<md5>740d1aa686af09659361ce8c10b6fcfe</md5>
|
||||
<crc32>3d03262a</crc32>
|
||||
<sha1>9272d98773615f94040f799d2341ba45c13d6218</sha1>
|
||||
</file>
|
||||
<file name="__ia_thumb.jpg" source="original">
|
||||
<mtime>1656366463</mtime>
|
||||
<size>9378</size>
|
||||
<md5>34dd181b0af401cfc3205b503ab63f48</md5>
|
||||
<crc32>72e288dc</crc32>
|
||||
<sha1>6bafe89be5f45e68eb641ae3aca960baa759bfe5</sha1>
|
||||
<format>Item Tile</format>
|
||||
<rotation>0</rotation>
|
||||
</file>
|
||||
</files>
|
||||
@@ -0,0 +1,215 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<files>
|
||||
<file name="78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a.jpg" source="derivative">
|
||||
<format>JPEG</format>
|
||||
<original>78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a.tif</original>
|
||||
<mtime>1501911616</mtime>
|
||||
<size>1326621</size>
|
||||
<md5>b50a8cc01a720df337cebbcb69e1cddf</md5>
|
||||
<crc32>b50088ba</crc32>
|
||||
<sha1>672d2922dff5a0954558b97d13301394870a6cc5</sha1>
|
||||
</file>
|
||||
<file name="78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a.tif" source="original">
|
||||
<mtime>1501911368</mtime>
|
||||
<size>37016416</size>
|
||||
<md5>77176ab4e12418558aefa6f4b709737a</md5>
|
||||
<crc32>3bbd199a</crc32>
|
||||
<sha1>64beda28ffd02a67b4c69e33e4b18a808b63453e</sha1>
|
||||
<format>TIFF</format>
|
||||
<matrix_number>69660BB</matrix_number>
|
||||
<collection-catalog-number>GBIA0011964A</collection-catalog-number>
|
||||
<publisher>Decca</publisher>
|
||||
</file>
|
||||
<file name="78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a.zip" source="original">
|
||||
<mtime>1684102561</mtime>
|
||||
<size>575486142</size>
|
||||
<md5>bd7f9d1d873b870c8b83f8b82ee6c503</md5>
|
||||
<crc32>d1186398</crc32>
|
||||
<sha1>1405bf17b31c0f25652399e820faa001922930a2</sha1>
|
||||
<format>ZIP</format>
|
||||
<filecount>9</filecount>
|
||||
</file>
|
||||
<file name="78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a_archive.torrent" source="metadata">
|
||||
<btih>2abc74cbab976a03ca6afdcffb9fecfbf19c6f70</btih>
|
||||
<mtime>1688008658</mtime>
|
||||
<size>31306</size>
|
||||
<md5>6cc1a4bac4d031f48ffe313a39ffc65f</md5>
|
||||
<crc32>fddb76db</crc32>
|
||||
<sha1>3c880e5814be545914d7a1a61239bfe821505b7c</sha1>
|
||||
<format>Archive BitTorrent</format>
|
||||
</file>
|
||||
<file name="78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a_files.xml" source="original">
|
||||
<format>Metadata</format>
|
||||
<md5>7bc8555ee3daef91f32efcfe143cf29b</md5>
|
||||
<summation>md5</summation>
|
||||
</file>
|
||||
<file name="78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a_itemimage.jpg" source="original">
|
||||
<mtime>1501911384</mtime>
|
||||
<size>335881</size>
|
||||
<md5>929d45f445e54b72d511a663e7324b86</md5>
|
||||
<crc32>5266d154</crc32>
|
||||
<sha1>f01dfce276cb1ca73148b964b290ee92063ea4b2</sha1>
|
||||
<format>Item Image</format>
|
||||
<rotation>0</rotation>
|
||||
<matrix_number>69660BB</matrix_number>
|
||||
<collection-catalog-number>GBIA0011964A</collection-catalog-number>
|
||||
<publisher>Decca</publisher>
|
||||
</file>
|
||||
<file name="78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a_meta.sqlite" source="original">
|
||||
<mtime>1684102571</mtime>
|
||||
<size>72704</size>
|
||||
<format>Metadata</format>
|
||||
<md5>38976e41f16009ed5e00723fabc9a4e6</md5>
|
||||
<crc32>0e30e5ef</crc32>
|
||||
<sha1>2bcad0eb21e2f77b54883d736faefa33f3cf787e</sha1>
|
||||
</file>
|
||||
<file name="78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a_meta.xml" source="original">
|
||||
<mtime>1688008490</mtime>
|
||||
<size>2917</size>
|
||||
<format>Metadata</format>
|
||||
<md5>c5326c9a2198274fc206032da9301193</md5>
|
||||
<crc32>ca42acd0</crc32>
|
||||
<sha1>6eac8fecd728dafabef951da785ed2200d351dea</sha1>
|
||||
</file>
|
||||
<file name="78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a_reviews.xml" source="original">
|
||||
<mtime>1659982866</mtime>
|
||||
<size>948</size>
|
||||
<md5>b67e874d814cf6988e2beb6b243ddc17</md5>
|
||||
<crc32>73b94665</crc32>
|
||||
<sha1>74a01e64dd82da073163f5f457525ab3b84e7497</sha1>
|
||||
<format>Metadata</format>
|
||||
</file>
|
||||
<file name="78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a_roles.json" source="original">
|
||||
<mtime>1501911433</mtime>
|
||||
<size>80</size>
|
||||
<md5>bd244561b4d7c40c7bdd2d71a401829d</md5>
|
||||
<crc32>e2515f39</crc32>
|
||||
<sha1>93eccc18266c503b84dd47840c41baf2b0a361a5</sha1>
|
||||
<format>JSON</format>
|
||||
<matrix_number>69660BB</matrix_number>
|
||||
<collection-catalog-number>GBIA0011964A</collection-catalog-number>
|
||||
<publisher>Decca</publisher>
|
||||
</file>
|
||||
<file name="78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a_thumb.jpg" source="derivative">
|
||||
<format>JPEG Thumb</format>
|
||||
<original>78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a.tif</original>
|
||||
<mtime>1501911615</mtime>
|
||||
<size>9138</size>
|
||||
<md5>952296a31ff7efd183e2b74cf253640a</md5>
|
||||
<crc32>b616ba9c</crc32>
|
||||
<sha1>153f229b49cd4434605f3739576586bf5d7c9582</sha1>
|
||||
</file>
|
||||
<file name="I Don_t Want to Set the World on Fire - Ink Spots-restored.afpk" source="derivative">
|
||||
<format>Columbia Peaks</format>
|
||||
<original>I Don_t Want to Set the World on Fire - Ink Spots-restored.flac</original>
|
||||
<mtime>1599685667</mtime>
|
||||
<size>29912</size>
|
||||
<md5>5383c38733d9e66b747ec8102ddd0a75</md5>
|
||||
<crc32>3bb2ece6</crc32>
|
||||
<sha1>64bce8d6decac71824583cf12853d3e2c97d0206</sha1>
|
||||
</file>
|
||||
<file name="I Don_t Want to Set the World on Fire - Ink Spots-restored.asr.srt" source="derivative">
|
||||
<format>SubRip</format>
|
||||
<original>I Don_t Want to Set the World on Fire - Ink Spots-restored.asr.vtt</original>
|
||||
<mtime>1688008632</mtime>
|
||||
<size>1973</size>
|
||||
<md5>63a556629e33cc233dba249218af648b</md5>
|
||||
<crc32>477180f5</crc32>
|
||||
<sha1>d82d685af20ce28d21ab1eaa2a5efbf1bf354261</sha1>
|
||||
</file>
|
||||
<file name="I Don_t Want to Set the World on Fire - Ink Spots-restored.asr.vtt" source="derivative">
|
||||
<format>Web Video Text Tracks</format>
|
||||
<original>I Don_t Want to Set the World on Fire - Ink Spots-restored_intermediate_asr.json</original>
|
||||
<mtime>1688008577</mtime>
|
||||
<size>1925</size>
|
||||
<md5>c1b6808ac66b1fb89b6bf1517f6e9ed1</md5>
|
||||
<crc32>349354b8</crc32>
|
||||
<sha1>5fe6aa67644046ab07d61ce3644d388f575649e9</sha1>
|
||||
</file>
|
||||
<file name="I Don_t Want to Set the World on Fire - Ink Spots-restored.flac" source="original">
|
||||
<mtime>1599685214</mtime>
|
||||
<size>48528837</size>
|
||||
<md5>2a2ab6af18cdad6f572bb634c4155a44</md5>
|
||||
<crc32>c1996233</crc32>
|
||||
<sha1>5cb6761e6e24c5545006dd127ce5e44483707982</sha1>
|
||||
<format>24bit Flac</format>
|
||||
<track>02</track>
|
||||
<length>184.55</length>
|
||||
<height>0</height>
|
||||
<width>0</width>
|
||||
<title>I Don't Want to Set the World on Fire (restored)</title>
|
||||
<creator>Durham</creator>
|
||||
<album>I Don't Want to Set the World on Fire</album>
|
||||
<artist>Ink Spots;Seiler;Marcus;Benjemen;Durham</artist>
|
||||
<comment>https://archive.org/details/78_i-dont-want-to-set-the-world-on-fire_ink-spots-seiler-marcus-benjemen-durham_gbia0011964a/I+Don%27t+Want+to+Set+the+World+on+Fire+-+Ink+Spots.flac\</comment>
|
||||
</file>
|
||||
<file name="I Don_t Want to Set the World on Fire - Ink Spots-restored.mp3" source="derivative">
|
||||
<creator>Ink Spots;Seiler;Marcus;Benjemen;Durham</creator>
|
||||
<title>I Don't Want to Set the World on Fire (restored)</title>
|
||||
<track>02</track>
|
||||
<album>I Don't Want to Set the World on Fire</album>
|
||||
<bitrate>125</bitrate>
|
||||
<format>VBR MP3</format>
|
||||
<original>I Don_t Want to Set the World on Fire - Ink Spots-restored.flac</original>
|
||||
<mtime>1599685494</mtime>
|
||||
<size>2996749</size>
|
||||
<md5>dc56351ccd39b09ced0a130fdcd8b2fc</md5>
|
||||
<crc32>38e842b0</crc32>
|
||||
<sha1>3e37080b5abde1be08f20072ca6fcd3f387dca15</sha1>
|
||||
<length>184.58</length>
|
||||
<height>640</height>
|
||||
<width>640</width>
|
||||
</file>
|
||||
<file name="I Don_t Want to Set the World on Fire - Ink Spots-restored.png" source="derivative">
|
||||
<format>PNG</format>
|
||||
<original>I Don_t Want to Set the World on Fire - Ink Spots-restored.flac</original>
|
||||
<mtime>1599685521</mtime>
|
||||
<size>35307</size>
|
||||
<md5>4bc62df3610dde296218e9782bf9cab1</md5>
|
||||
<crc32>ab0f45cf</crc32>
|
||||
<sha1>c3e0ce23e6990e1deabec942ff71e3178cf18310</sha1>
|
||||
</file>
|
||||
<file name="I Don_t Want to Set the World on Fire - Ink Spots-restored_intermediate_asr.json" source="derivative">
|
||||
<format>Intermediate ASR JSON</format>
|
||||
<original>I Don_t Want to Set the World on Fire - Ink Spots-restored_whisper_asr.json</original>
|
||||
<mtime>1688008526</mtime>
|
||||
<size>2672</size>
|
||||
<md5>5bdd50eff7abadfe6a7d764c20dc35d9</md5>
|
||||
<crc32>78a58328</crc32>
|
||||
<sha1>044c53e7cef9fd1536c484c71aa3e75b1306be3c</sha1>
|
||||
</file>
|
||||
<file name="I Don_t Want to Set the World on Fire - Ink Spots-restored_spectrogram.png" source="derivative">
|
||||
<format>Spectrogram</format>
|
||||
<original>I Don_t Want to Set the World on Fire - Ink Spots-restored.flac</original>
|
||||
<mtime>1599685546</mtime>
|
||||
<size>116769</size>
|
||||
<md5>2ea631450681b8d955a9fcf669891d4a</md5>
|
||||
<crc32>e32c035a</crc32>
|
||||
<sha1>fcb550c1596a93528802646f072cd1b19c1b139b</sha1>
|
||||
</file>
|
||||
<file name="I Don_t Want to Set the World on Fire - Ink Spots-restored_whisper_asr.json" source="derivative">
|
||||
<whisper_asr_module_version>20230611.01</whisper_asr_module_version>
|
||||
<whisper_version>20230314</whisper_version>
|
||||
<whisper_model_name>small.en</whisper_model_name>
|
||||
<whisper_model_hash>sha256:f953ad0fd29cacd07d5a9eda5624af0f6bcf2258be67c92b79389873d91e0872</whisper_model_hash>
|
||||
<asr_detected_lang>en</asr_detected_lang>
|
||||
<asr_detected_lang_conf>0.85381597280502</asr_detected_lang_conf>
|
||||
<asr_transcribed_lang>en</asr_transcribed_lang>
|
||||
<format>Whisper ASR JSON</format>
|
||||
<original>I Don_t Want to Set the World on Fire - Ink Spots-restored.mp3</original>
|
||||
<mtime>1688008489</mtime>
|
||||
<size>28875</size>
|
||||
<md5>3b7a44eb35530253c8f22e55542a9eed</md5>
|
||||
<crc32>c800afa0</crc32>
|
||||
<sha1>770e390e635b714058d148b06a92fffd3181e2ba</sha1>
|
||||
</file>
|
||||
<file name="__ia_thumb.jpg" source="original">
|
||||
<mtime>1634652950</mtime>
|
||||
<size>12863</size>
|
||||
<md5>bde829c30a7951d22eb88ad4c33f866c</md5>
|
||||
<crc32>e2abeb1a</crc32>
|
||||
<sha1>ac449c1db692c6c8e5af636012da5d275c000a4d</sha1>
|
||||
<format>Item Tile</format>
|
||||
<rotation>0</rotation>
|
||||
</file>
|
||||
</files>
|
||||
@@ -0,0 +1,195 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<files>
|
||||
<file name="__ia_thumb.jpg" source="original">
|
||||
<mtime>1688105563</mtime>
|
||||
<size>19642</size>
|
||||
<md5>2dc43777ab13cabd2324e25d8c69a790</md5>
|
||||
<crc32>e7f10d45</crc32>
|
||||
<sha1>1ed3cb724f1470cbb5056169fc731c642e36fc1b</sha1>
|
||||
<format>Item Tile</format>
|
||||
<rotation>0</rotation>
|
||||
</file>
|
||||
<file name="header/header_0000.jp2" source="original">
|
||||
<mtime>1686986524</mtime>
|
||||
<size>12013083</size>
|
||||
<md5>5928785725ea03932b3fd496d3f4c75e</md5>
|
||||
<crc32>53f8e9a7</crc32>
|
||||
<sha1>3af69d2c09d993d0f7bc81b7a2edfdd1f9b8446d</sha1>
|
||||
<format>JPEG 2000</format>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42.pdf" source="derivative">
|
||||
<pdf_module_version>0.0.23</pdf_module_version>
|
||||
<format>Text PDF</format>
|
||||
<original>per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_page_numbers.json</original>
|
||||
<mtime>1688105470</mtime>
|
||||
<size>98013235</size>
|
||||
<md5>8c206bd0aaf82698b3d502b233c6c2f8</md5>
|
||||
<crc32>ac64d257</crc32>
|
||||
<sha1>e6b7dfbde34f6a494f7795cd0edcb5676a8c37da</sha1>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_archive.torrent" source="metadata">
|
||||
<btih>bf04ea0f7c2dca19cf748e529611f497e6cba150</btih>
|
||||
<mtime>1688105603</mtime>
|
||||
<size>21259</size>
|
||||
<md5>0a3685a7ab0a0d0f9fdb4b913d31f8fd</md5>
|
||||
<crc32>70eb691b</crc32>
|
||||
<sha1>413c499bc001947b82030585c855958693cd2f78</sha1>
|
||||
<format>Archive BitTorrent</format>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_chocr.html.gz" source="derivative">
|
||||
<ocr>tesseract 5.3.0-3-g9920</ocr>
|
||||
<ocr_parameters>lang-eng;two-pass-disabled;pass-dpi-disabled;autonomous-mode-disabled;binarisation-method-otsu</ocr_parameters>
|
||||
<ocr_module_version>0.0.21</ocr_module_version>
|
||||
<ocr_detected_script>Latin</ocr_detected_script>
|
||||
<ocr_detected_script_conf>0.7458</ocr_detected_script_conf>
|
||||
<ocr_detected_lang>en</ocr_detected_lang>
|
||||
<ocr_detected_lang_conf>1.0000</ocr_detected_lang_conf>
|
||||
<format>chOCR</format>
|
||||
<original>per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_jp2.zip</original>
|
||||
<mtime>1688102450</mtime>
|
||||
<size>11484860</size>
|
||||
<md5>8fcb1864fd839ef3dcc6039b669b8f36</md5>
|
||||
<crc32>87f7f712</crc32>
|
||||
<sha1>15abc19f5cf46ccc4e8f1a5796ce6302869bffe5</sha1>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_djvu.txt" source="derivative">
|
||||
<format>DjVuTXT</format>
|
||||
<original>per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_djvu.xml</original>
|
||||
<mtime>1688103469</mtime>
|
||||
<size>759494</size>
|
||||
<md5>febe8a4594d3ef07af32f3fbed4d2764</md5>
|
||||
<crc32>98136b35</crc32>
|
||||
<sha1>5fe48b18f19568906680f8dd4936ec81ec143f9e</sha1>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_djvu.xml" source="derivative">
|
||||
<format>Djvu XML</format>
|
||||
<original>per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_hocr.html</original>
|
||||
<mtime>1688103134</mtime>
|
||||
<size>10726635</size>
|
||||
<md5>e06813d99e1adf8d6fff350899b5f846</md5>
|
||||
<crc32>35fd1344</crc32>
|
||||
<sha1>418da8f3cd5a9f6aac998ee5f0fa68a828aa78a8</sha1>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_files.xml" source="original">
|
||||
<format>Metadata</format>
|
||||
<md5>640a9c2fe776c10777911979bc04994a</md5>
|
||||
<summation>md5</summation>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_frame-md.json" source="original">
|
||||
<mtime>1686986516</mtime>
|
||||
<size>224</size>
|
||||
<md5>0f68d8e584bd1aea80a889525a00b547</md5>
|
||||
<crc32>2e83a589</crc32>
|
||||
<sha1>7fe89fdd2aa69246f30c34c73e57814f62154994</sha1>
|
||||
<format>JSON</format>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_hocr.html" source="derivative">
|
||||
<hocr_char_to_word_module_version>1.1.0</hocr_char_to_word_module_version>
|
||||
<hocr_char_to_word_hocr_version>1.1.15</hocr_char_to_word_hocr_version>
|
||||
<ocr_parameters>lang-eng;two-pass-disabled;pass-dpi-disabled;autonomous-mode-disabled;binarisation-method-otsu</ocr_parameters>
|
||||
<ocr_module_version>0.0.21</ocr_module_version>
|
||||
<ocr_detected_script>Latin</ocr_detected_script>
|
||||
<ocr_detected_script_conf>0.7458</ocr_detected_script_conf>
|
||||
<ocr_detected_lang>en</ocr_detected_lang>
|
||||
<ocr_detected_lang_conf>1.0000</ocr_detected_lang_conf>
|
||||
<format>hOCR</format>
|
||||
<original>per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_chocr.html.gz</original>
|
||||
<mtime>1688102642</mtime>
|
||||
<size>20717059</size>
|
||||
<md5>2313d8cbe745bf4994b86be8f09b241b</md5>
|
||||
<crc32>e3b89eb2</crc32>
|
||||
<sha1>b5d6e6d025dca7315307aee1032e3470eb797ac4</sha1>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_hocr_pageindex.json.gz" source="derivative">
|
||||
<hocr_pageindex_module_version>1.0.0</hocr_pageindex_module_version>
|
||||
<hocr_pageindex_hocr_version>1.1.15</hocr_pageindex_hocr_version>
|
||||
<format>OCR Page Index</format>
|
||||
<original>per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_hocr.html</original>
|
||||
<mtime>1688103151</mtime>
|
||||
<size>203</size>
|
||||
<md5>aaf29479ec4d752ab5011ef1629a1de0</md5>
|
||||
<crc32>de6755b7</crc32>
|
||||
<sha1>d71e9705a5f1abb4eadcd920b06a961bf0eb293c</sha1>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_hocr_searchtext.txt.gz" source="derivative">
|
||||
<hocr_fts_text_module_version>1.1.0</hocr_fts_text_module_version>
|
||||
<hocr_fts_text_hocr_version>1.1.15</hocr_fts_text_hocr_version>
|
||||
<word_conf_0_10>5195</word_conf_0_10>
|
||||
<word_conf_11_20>2390</word_conf_11_20>
|
||||
<word_conf_21_30>3139</word_conf_21_30>
|
||||
<word_conf_31_40>3258</word_conf_31_40>
|
||||
<word_conf_41_50>3191</word_conf_41_50>
|
||||
<word_conf_51_60>3213</word_conf_51_60>
|
||||
<word_conf_61_70>3776</word_conf_61_70>
|
||||
<word_conf_71_80>5252</word_conf_71_80>
|
||||
<word_conf_81_90>13153</word_conf_81_90>
|
||||
<word_conf_91_100>85216</word_conf_91_100>
|
||||
<format>OCR Search Text</format>
|
||||
<original>per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_hocr.html</original>
|
||||
<mtime>1688103216</mtime>
|
||||
<size>309695</size>
|
||||
<md5>3d209f772e41f56191cb37ac04f8965a</md5>
|
||||
<crc32>ea3470ec</crc32>
|
||||
<sha1>c425dbfdf9900a6f1cb594e4e4403333c2ef4f36</sha1>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_itemimage.png" source="original">
|
||||
<mtime>1686986511</mtime>
|
||||
<size>33159468</size>
|
||||
<md5>5e8e1ffe981317426081234ade24073e</md5>
|
||||
<crc32>b8456619</crc32>
|
||||
<sha1>2ffdc308b639959bbd13ddadbab8f8d4b847fbba</sha1>
|
||||
<format>Item Image</format>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_jp2.zip" source="original">
|
||||
<mtime>1686986495</mtime>
|
||||
<size>231100229</size>
|
||||
<md5>eac76d5be19d38caee6cdcee2b9ff936</md5>
|
||||
<crc32>c2ce4d1c</crc32>
|
||||
<sha1>858120c8724f345b206961abe508291565816b7d</sha1>
|
||||
<preview-image>n0</preview-image>
|
||||
<format>Single Page Processed JP2 ZIP</format>
|
||||
<filecount>13</filecount>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_meta.sqlite" source="original">
|
||||
<mtime>1686986699</mtime>
|
||||
<size>40960</size>
|
||||
<md5>385dd15968e9ce2a38ac48a2838e8c48</md5>
|
||||
<crc32>192d70cb</crc32>
|
||||
<sha1>09ab56c0b9b3eff6b0725364a4fd070705b80d2e</sha1>
|
||||
<format>Metadata</format>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_meta.xml" source="original">
|
||||
<mtime>1688105483</mtime>
|
||||
<size>3028</size>
|
||||
<md5>5ff8508ae78bdb3bbe56ab9de53b43bb</md5>
|
||||
<crc32>1b81e6e4</crc32>
|
||||
<sha1>30cc20a8cd9a9d726408f795b0fcc3db73459185</sha1>
|
||||
<format>Metadata</format>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_page_numbers.json" source="derivative">
|
||||
<format>Page Numbers JSON</format>
|
||||
<original>per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_djvu.xml</original>
|
||||
<mtime>1688103557</mtime>
|
||||
<size>2277</size>
|
||||
<md5>a1bc72e8504b217ccd46c678745982f4</md5>
|
||||
<crc32>634b90ea</crc32>
|
||||
<sha1>680343d1c42c0732cdc9c8b8c355e5985aab5d6a</sha1>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_rotations.json" source="original">
|
||||
<mtime>1686986519</mtime>
|
||||
<size>1334</size>
|
||||
<md5>37f40a3e763cda634832781f6f1d6775</md5>
|
||||
<crc32>328b653d</crc32>
|
||||
<sha1>f43ce2a767ee70f0c2cb2e004891f699213e27a1</sha1>
|
||||
<format>JSON</format>
|
||||
</file>
|
||||
<file name="per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_scandata.xml" source="derivative">
|
||||
<format>Scandata</format>
|
||||
<original>per_chicago-daily-tribune_the-chicago-daily-tribun_1883-04-13_42_djvu.xml</original>
|
||||
<mtime>1688103552</mtime>
|
||||
<size>4478</size>
|
||||
<md5>cfc96ac86bda784dd477131a9ce78d85</md5>
|
||||
<crc32>35d000b3</crc32>
|
||||
<sha1>45d344b009d902373579fd8939a1730b70a10ae4</sha1>
|
||||
</file>
|
||||
</files>
|
||||
11812
SabreTools.Serialization.Test/TestData/test-archivedotorg-files5.xml
Normal file
11812
SabreTools.Serialization.Test/TestData/test-archivedotorg-files5.xml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,12 @@
|
||||
#Romname;Title;Emulator;Cloneof;Year;Manufacturer;Category;Players;Rotation;Control;Status;DisplayCount;DisplayType;AltRomname;AltTitle;Extra;Buttons;Favourite;Tags;PlayedCount;PlayedTime;FileIsAvailable
|
||||
005;005;advmame;;1981;Sega;Maze / Shooter Small;2P alt;270;joystick (4-way),joystick (4-way);imperfect;1;raster;;;;1;;;0;;1
|
||||
alpine;Alpine Ski (set 1);advmame;;1982;Taito Corporation;Sports / Skiing;2P alt;270;joystick (2-way),joystick (2-way);good;1;raster;;;;1;;;0;;1
|
||||
amidar;Amidar;advmame;;1982;Konami;Maze / Outline;2P alt;90;joystick (4-way),joystick (4-way);good;1;raster;;;;1;;;0;;1
|
||||
anteater;Anteater;advmame;;1982;Tago Electronics;Maze / Collect;2P alt;90;joystick (4-way);good;1;raster;;;;1;;;0;;1
|
||||
armorcar;Armored Car (set 1);advmame;;1981;Stern Electronics;Maze / Collect;2P alt;90;joystick (4-way),joystick (4-way);good;1;raster;;;;2;;;0;;1
|
||||
assault;Assault (Rev B);advmame;;1988;Namco;Shooter / Driving;1P;90;double joystick (4-way),double joystick (4-way);good;1;raster;;;;1;;;0;;1
|
||||
astrob;Astro Blaster (version 3);advmame;;1981;Sega;Shooter / Gallery;2P alt;270;joystick (2-way),joystick (2-way);imperfect;1;raster;;;;2;;;0;;1
|
||||
astrof;Astro Fighter (set 1);advmame;;1979;Data East;Shooter / Gallery;2P alt;90;joystick (2-way),joystick (2-way);imperfect;1;raster;;;;1;;;0;;1
|
||||
attckufo;Attack UFO;advmame;;1980;Ryoto Electric Co.;Shooter / Gallery;2P alt;270;joystick (2-way),joystick (2-way);good;1;raster;;;;1;;;0;;1
|
||||
bagman;Bagman;advmame;;1982;Valadon Automation;Platform / Run Jump;2P alt;270;joystick (4-way),joystick (4-way);good;1;raster;;;;1;;;0;;1
|
||||
ballbomb;Balloon Bomber;advmame;;1980;Taito;Shooter / Gallery;2P alt;270;joystick (2-way),joystick (2-way);imperfect;1;raster;;;;1;;;0;;1
|
||||
887
SabreTools.Serialization.Test/TestData/test-cmp-files1.dat
Normal file
887
SabreTools.Serialization.Test/TestData/test-cmp-files1.dat
Normal file
@@ -0,0 +1,887 @@
|
||||
clrmamepro (
|
||||
name "Other Emulated Arcade Games"
|
||||
description "Other Emulated Arcade Games (20030817)"
|
||||
category "Arcade"
|
||||
version "20030817"
|
||||
author "#RomManager"
|
||||
)
|
||||
|
||||
# Some sets in this dat are partial because only the sound is emulated.
|
||||
# They're included here because I don't have the infos for the other roms of the set
|
||||
# Please contact me if you have found such informations, or complete romsets for them.
|
||||
|
||||
game (
|
||||
name bm1stmix
|
||||
description "Beatmania [DJMAME 08-07-2003]"
|
||||
year 1997
|
||||
manufacturer "Konami"
|
||||
rom ( name 753jaa03.19a size 524288 crc 0xf2b2bce8 sha1 61d31b111f35e7dde89965fa43ba627c12aff11c )
|
||||
rom ( name 753jaa04.20a size 524288 crc 0x85a18f9d sha1 ecd0ab4f53e882b00176dacad5fac35345fbea66 )
|
||||
rom ( name 753jaa05.22a size 524288 crc 0x749b1e87 sha1 1c771c19f152ae95171e4fd51da561ba4ec5ea87 )
|
||||
rom ( name 753jaa06.24a size 524288 crc 0x6d86b0fd sha1 74a255dbb1c83131717ea1fe335f12aef81d9fcc )
|
||||
rom ( name 753jaa07.22d size 524288 crc 0xf03ab5d8 sha1 2ad902547908208714855aa0f2b7ed493452ee5f )
|
||||
rom ( name 753jaa08.23d size 524288 crc 0x6559f0c8 sha1 0d6ec4bdc22c02cb9fb8de36b0a8f7a6c983440e )
|
||||
rom ( name 753jaa09.25d size 524288 crc 0xb50c3dbb sha1 6022ea249aad0793b2279699e68087b4bc9b4ef1 )
|
||||
rom ( name 753jaa10.27d size 524288 crc 0x391f4bfd sha1 791c9889ea3ce639bbfb87934a1cad9aa3c9ccde )
|
||||
rom ( name 753jab01.6a size 524288 crc 0x25bf8629 sha1 2be73f9dd25cae415c6443f221cc7d38d5555ae5 )
|
||||
rom ( name 753jab02.8a size 524288 crc 0x6ab951de sha1 a724ede03b74e9422c120fcc263e2ebcc3a3e110 )
|
||||
disk ( name 753jaa11.chd md5 260c9b72f4a03055e3abad61c6225324 )
|
||||
)
|
||||
|
||||
game (
|
||||
name bm2ndmix
|
||||
description "Beatmania 2nd MIX (Rev.B) [DJMAME 08-07-2003]"
|
||||
year 1998
|
||||
manufacturer "Konami"
|
||||
rom ( name 853jaa03.19a size 524288 crc 0x1462ed23 sha1 fdfda3060c8d367ac2e8e43dedaba8ab9012cc77 )
|
||||
rom ( name 853jaa04.20a size 524288 crc 0x98c9b331 sha1 51f24b3c3773c53ff492ed9bad17c9867fd94e28 )
|
||||
rom ( name 853jaa05.22a size 524288 crc 0x0da3fef9 sha1 f9ef24144c00c054ecc4650bb79e74c57c6d6b3c )
|
||||
rom ( name 853jaa06.24a size 524288 crc 0x6a66978c sha1 460178a6f35e554a157742d77ed5ea6989fbcee1 )
|
||||
rom ( name 853jaa07.22d size 524288 crc 0x728c0010 sha1 18888b402e0b7ccf63c7b3cb644673df1746dba7 )
|
||||
rom ( name 853jaa08.23d size 524288 crc 0x926fc37c sha1 f251cba56ca201f0e748112462116cff218b66da )
|
||||
rom ( name 853jaa09.25d size 524288 crc 0x8584e21e sha1 3d1ca6de00f9ac07bbe7cd1e67093cca7bf484bb )
|
||||
rom ( name 853jaa10.27d size 524288 crc 0x9cb92d98 sha1 6ace4492ba0b5a8f94a9e7b4f7126b31c6254637 )
|
||||
rom ( name 853jab01.6a size 524288 crc 0xc8df72c0 sha1 6793b587ba0611bc3da8c4955d6a87e47a19a223 )
|
||||
rom ( name 853jab02.8a size 524288 crc 0xbf6ace08 sha1 29d3fdf1c73a73a0a66fa5a4c4ac3f293cb82e37 )
|
||||
disk ( name 853jaa11.chd md5 37281741b748bea7dfa711a956649d1e )
|
||||
)
|
||||
|
||||
game (
|
||||
name bm2ndmxa
|
||||
description "Beatmania 2nd MIX (Rev.A) [DJMAME 08-07-2003]"
|
||||
year 1998
|
||||
manufacturer "Konami"
|
||||
cloneof bm2ndmix
|
||||
romof bm2ndmix
|
||||
rom ( name 853jaa01.6a size 524288 crc 0x4f0bf5d0 sha1 4793bb411e85f2191eb703a170c16cf163ea79e7 )
|
||||
rom ( name 853jaa02.8a size 524288 crc 0xe323925b sha1 1f9f52a7ab6359b617e87f8b3d7ac4269885c621 )
|
||||
rom ( name 853jaa03.19a size 524288 crc 0x1462ed23 sha1 fdfda3060c8d367ac2e8e43dedaba8ab9012cc77 )
|
||||
rom ( name 853jaa04.20a size 524288 crc 0x98c9b331 sha1 51f24b3c3773c53ff492ed9bad17c9867fd94e28 )
|
||||
rom ( name 853jaa05.22a size 524288 crc 0x0da3fef9 sha1 f9ef24144c00c054ecc4650bb79e74c57c6d6b3c )
|
||||
rom ( name 853jaa06.24a size 524288 crc 0x6a66978c sha1 460178a6f35e554a157742d77ed5ea6989fbcee1 )
|
||||
rom ( name 853jaa07.22d size 524288 crc 0x728c0010 sha1 18888b402e0b7ccf63c7b3cb644673df1746dba7 )
|
||||
rom ( name 853jaa08.23d size 524288 crc 0x926fc37c sha1 f251cba56ca201f0e748112462116cff218b66da )
|
||||
rom ( name 853jaa09.25d size 524288 crc 0x8584e21e sha1 3d1ca6de00f9ac07bbe7cd1e67093cca7bf484bb )
|
||||
rom ( name 853jaa10.27d size 524288 crc 0x9cb92d98 sha1 6ace4492ba0b5a8f94a9e7b4f7126b31c6254637 )
|
||||
disk ( name 853jaa11.chd md5 37281741b748bea7dfa711a956649d1e )
|
||||
)
|
||||
|
||||
game (
|
||||
name bm3rdmix
|
||||
description "Beatmania 3rd MIX (Rev.B) [DJMAME 08-07-2003]"
|
||||
year 1998
|
||||
manufacturer "Konami"
|
||||
rom ( name 825jaa03.19a size 524288 crc 0xecd62652 sha1 bceab4052dce2c843358f0a98aacc6e1124e3068 )
|
||||
rom ( name 825jaa04.20a size 524288 crc 0x437a576f sha1 f30fd15d4f0d776e9b29ccfcd6e26861fb42e51a )
|
||||
rom ( name 825jaa05.22a size 524288 crc 0x9f9a3369 sha1 d8b20127336af89b9e886289fb4f5a2e0db65f9b )
|
||||
rom ( name 825jaa06.24a size 524288 crc 0xe7a3991a sha1 6c8cb481e721428e1365f784e97bb6f6d421ed5a )
|
||||
rom ( name 825jab01.6a size 524288 crc 0x934fdcb2 sha1 b88bada065b5464c579039c2e403c061e6eeb356 )
|
||||
rom ( name 825jab02.8a size 524288 crc 0x6012c488 sha1 df32db41942c2fe2b2aa7439900372e22ea54c3c )
|
||||
rom ( name 825jab07.22d size 524288 crc 0x1a515c82 sha1 a0c908d449aa45cb3a90a42c97429f10873e884b )
|
||||
rom ( name 825jab08.23d size 524288 crc 0x82731b07 sha1 c0d391fcd94c6b2225fca338c0c5db5d35e2d8bc )
|
||||
rom ( name 825jab09.25d size 524288 crc 0x1407ba5d sha1 e7a0d190326589f4d94e83cb7c85dd4e91f4efad )
|
||||
rom ( name 825jab10.27d size 524288 crc 0x2afd0a10 sha1 1b8b868ac5720bb1b376f4eb8952efb190257bda )
|
||||
)
|
||||
|
||||
game (
|
||||
name bm3rdmxa
|
||||
description "Beatmania 3rd MIX (Rev.A) [DJMAME 08-07-2003]"
|
||||
year 1998
|
||||
manufacturer "Konami"
|
||||
cloneof bm3rdmix
|
||||
romof bm3rdmix
|
||||
rom ( name 825jaa01.6a size 524288 crc 0xcf7494a5 sha1 994df0644817f44d135a16f04d8dae9ec73e3728 )
|
||||
rom ( name 825jaa02.8a size 524288 crc 0x5f787fe2 sha1 5944da21141802d96594cf77880682e97d014ca1 )
|
||||
rom ( name 825jaa03.19a size 524288 crc 0xecd62652 sha1 bceab4052dce2c843358f0a98aacc6e1124e3068 )
|
||||
rom ( name 825jaa04.20a size 524288 crc 0x437a576f sha1 f30fd15d4f0d776e9b29ccfcd6e26861fb42e51a )
|
||||
rom ( name 825jaa05.22a size 524288 crc 0x9f9a3369 sha1 d8b20127336af89b9e886289fb4f5a2e0db65f9b )
|
||||
rom ( name 825jaa06.24a size 524288 crc 0xe7a3991a sha1 6c8cb481e721428e1365f784e97bb6f6d421ed5a )
|
||||
rom ( name 825jaa07.22d size 524288 crc 0xa96cf46c sha1 c8540b452dcb15f5873ca629fa62657a5a3bb02c )
|
||||
rom ( name 825jaa08.23d size 524288 crc 0x06d56c3b sha1 19cd15ab0869773e6a16b1cad48c53bec2f60b0b )
|
||||
rom ( name 825jaa09.25d size 524288 crc 0xd3e65669 sha1 51abf452da60794fa47c05d11c08b203dde563ff )
|
||||
rom ( name 825jaa10.27d size 524288 crc 0x44d184f3 sha1 28f3ec33a29164a6531f53db071272ccf015f66d )
|
||||
disk ( name 825jaa11.chd md5 3276e3ed57f1a6d9a18365054b0439ba )
|
||||
)
|
||||
|
||||
game (
|
||||
name bm4thmix
|
||||
description "Beatmania 4th MIX [DJMAME 08-07-2003]"
|
||||
year 1999
|
||||
manufacturer "Konami"
|
||||
rom ( name 847jaa01.6a size 524288 crc 0x81138a1b sha1 ebe211126f871e541881e1670f56d50b058dead3 )
|
||||
rom ( name 847jaa02.8a size 524288 crc 0x4eeb0010 sha1 942303dfb19a4a78dd74ad24576031760553a661 )
|
||||
rom ( name 847jaa03.19a size 524288 crc 0xf447d140 sha1 cc15b80419940d127a77765508f877421ed86ee2 )
|
||||
rom ( name 847jaa04.20a size 524288 crc 0xedc3e286 sha1 341b1dc6ee1562b1ddf235a66ac96b94c482b67c )
|
||||
rom ( name 847jaa05.22a size 524288 crc 0xda165b5e sha1 e46110590e6ab89b55f6abfbf6c53c99d28a75a9 )
|
||||
rom ( name 847jaa06.24a size 524288 crc 0x8bfc2f28 sha1 f8869867945d63d9f34b6228d95c5a61b193eed2 )
|
||||
rom ( name 847jab07.22d size 524288 crc 0xc159e7c4 sha1 96af0c29b2f1fef494b2223179862d16f26bb33f )
|
||||
rom ( name 847jab08.23d size 524288 crc 0x8ff084d6 sha1 50cff8c701e33f2630925c1a9ae4351076912acd )
|
||||
rom ( name 847jab09.25d size 524288 crc 0x2e4ac9fe sha1 bbd4c6e0c82fc0be88f851e901e5853b6bcf775f )
|
||||
rom ( name 847jab10.27d size 524288 crc 0xc78516f5 sha1 1adf5805c808dc55de14a9a9b20c3d2cf7bf414d )
|
||||
disk ( name 847jaa11.chd md5 47cb5c1b856aa11cf38f0c7ea4a7d1c3 )
|
||||
)
|
||||
|
||||
game (
|
||||
name bm5thmix
|
||||
description "Beatmania 5th MIX [DJMAME 08-07-2003]"
|
||||
year 1999
|
||||
manufacturer "Konami"
|
||||
rom ( name 981jaa01.6a size 524288 crc 0x03bbe7e3 sha1 7d4ec3bc7719a3f1b81df309b5c74afaffde42ba )
|
||||
rom ( name 981jaa02.8a size 524288 crc 0xf4e59923 sha1 a4983435e3f2243ea9ccc2fd5439d86c30b6f604 )
|
||||
rom ( name 981jaa03.19a size 524288 crc 0x8b7e6d72 sha1 d470377e20e4d4935af5e57d081ce24dd9ea5793 )
|
||||
rom ( name 981jaa04.20a size 524288 crc 0x5139988a sha1 2b1eb97dcbfbe6bba1352a02cf0036e9a721ab39 )
|
||||
rom ( name 981jaa05.22a size 524288 crc 0xf370fdb9 sha1 3a2bbdda984f2630e8ae505a8db259d9162e07a3 )
|
||||
rom ( name 981jaa06.24a size 524288 crc 0xda6e3813 sha1 9163bd2cfb0a32798e797c7b4eea21e28772a206 )
|
||||
rom ( name 981jaa07.22d size 524288 crc 0xf6c72998 sha1 e78af5b515b224c534f47abd6477dd97dc521b0d )
|
||||
rom ( name 981jaa08.23d size 524288 crc 0xaa4ff682 sha1 3750e1e81b7c1a4fb419076171f20e4c36b1c544 )
|
||||
rom ( name 981jaa09.25d size 524288 crc 0xd96d4e1c sha1 379aa4e82cd06490645f54dab1724c827108735d )
|
||||
rom ( name 981jaa10.27d size 524288 crc 0x06bee0e4 sha1 6eea8614cb01e7079393b9976b6fd6a52c14e3c0 )
|
||||
disk ( name 981jaa11.chd md5 0058bbdcb5db054adff1c4148ef4211e )
|
||||
)
|
||||
|
||||
game (
|
||||
name bm6thmix
|
||||
description "Beatmania 6th MIX [DJMAME 08-07-2003]"
|
||||
year 2001
|
||||
manufacturer "Konami"
|
||||
rom ( name a21jaa01.6a size 524288 crc 0x6d7ccbe3 sha1 633c69c14dfd70866664b94095fa5f21087428d8 )
|
||||
rom ( name a21jaa02.8a size 524288 crc 0xf10076fa sha1 ab9f3e75a36fdaccec411afd77f588f040db139d )
|
||||
rom ( name a21jaa03.19a size 524288 crc 0xca806266 sha1 6b5f9d5089a992347745ab6af4dadaac4e3b0742 )
|
||||
rom ( name a21jaa04.20a size 524288 crc 0x71124e79 sha1 d9fd8f662ac9c29daf25acd310fd0f27051dea0b )
|
||||
rom ( name a21jaa05.22a size 524288 crc 0x818e34e6 sha1 8a9093b92392a065d0cf94d56195a6f3ca611044 )
|
||||
rom ( name a21jaa06.24a size 524288 crc 0x36f2043b sha1 d2846cc10173662029da7c5d686cf89299be2be5 )
|
||||
rom ( name a21jaa07.22d size 524288 crc 0x841d83e1 sha1 c85962abcc955e8f11138e03002b16afd3791f0a )
|
||||
rom ( name a21jaa08.23d size 524288 crc 0x4e561919 sha1 4b91560d9ba367c848d784db760f042d5d76e003 )
|
||||
rom ( name a21jaa09.25d size 524288 crc 0x181e6f70 sha1 82c7ca3068ace9a66b614ead4b90ea6fe4017d51 )
|
||||
rom ( name a21jaa10.27d size 524288 crc 0x1ac33595 sha1 3173bb8dc420487c4d427e779444a98aad37d51e )
|
||||
disk ( name a21jaa11.chd md5 e50ff33d5b9eb179265ff6cd7824824e )
|
||||
)
|
||||
|
||||
game (
|
||||
name bm7thmix
|
||||
description "Beatmania 7th MIX [DJMAME 08-07-2003]"
|
||||
year 2001
|
||||
manufacturer "Konami"
|
||||
rom ( name b07jaa03.19a size 524288 crc 0x3e30af3f sha1 f092c4156bc7d0a0309171fd1e00a6d4c33cb08f )
|
||||
rom ( name b07jaa04.20a size 524288 crc 0x190a4a83 sha1 f7ae2d3ccd98f99fdae61c1a2145f993c4064ebd )
|
||||
rom ( name b07jaa05.22a size 524288 crc 0x415a6363 sha1 b3edbcd293006c3738a10680ecfa66e105028786 )
|
||||
rom ( name b07jaa06.24a size 524288 crc 0x46c59a43 sha1 ba58432bf7df394b5c633e63bcf2321bc320f023 )
|
||||
rom ( name b07jaa07.22d size 524288 crc 0xb2908dc7 sha1 22e36afef9a03681928d37a8ffe50078d04525ce )
|
||||
rom ( name b07jaa08.23d size 524288 crc 0xcbbefecf sha1 ed1347d1a8fd59677e4290b8cd568ddf505a7265 )
|
||||
rom ( name b07jaa09.25d size 524288 crc 0x2530cedb sha1 94b38b4fe198b26a2ff4d99d2cb28a0f935fe940 )
|
||||
rom ( name b07jaa10.27d size 524288 crc 0x6b75ba9c sha1 aee922adc3bc0296ae6e08e461b20a9e5e72a2df )
|
||||
rom ( name b07jab01.6a size 524288 crc 0x433d0074 sha1 5a9709ce200cbff340063469956d1c55a46810d9 )
|
||||
rom ( name b07jab02.8a size 524288 crc 0x794773af sha1 c823deb077f6515d7701de84d324c3d367719819 )
|
||||
disk ( name b07jab11.chd md5 0e9440787ca69567792095085e2a3619 )
|
||||
)
|
||||
|
||||
game (
|
||||
name bmclubmx
|
||||
description "Beatmania Club MIX [DJMAME 08-07-2003]"
|
||||
year 2000
|
||||
manufacturer "Konami"
|
||||
rom ( name 993jaa01.6a size 524288 crc 0xb314af94 sha1 6448554e1d565ee1558d13f484b5fa0018ac3667 )
|
||||
rom ( name 993jaa02.8a size 524288 crc 0x0aa9f16a sha1 508d41e141997ba07443c4ab98454cec515d731c )
|
||||
rom ( name 993jaa03.19a size 524288 crc 0x00394778 sha1 3631a42ed0c8ee572e7faafdaacce9fc2b372d25 )
|
||||
rom ( name 993jaa04.20a size 524288 crc 0x2522f3b0 sha1 1ab8618b732f1402fc7bfb141630873d4c706d34 )
|
||||
rom ( name 993jaa05.22a size 524288 crc 0x4e340947 sha1 a0a7f3b222a292b07bc5c7acd61547ea2bdbad43 )
|
||||
rom ( name 993jaa06.24a size 524288 crc 0xc0a711d6 sha1 ab581c5215c4db6dbf58b47f54834fe81e8a569b )
|
||||
rom ( name 993jaa07.22d size 524288 crc 0x4fc588cf sha1 00fb73002b6b5ae414eef320169e379b94ee33a1 )
|
||||
rom ( name 993jaa08.23d size 524288 crc 0xb6c88e9e sha1 e3b76e782b9507dad2bdb9de1a34d125f6100cc8 )
|
||||
rom ( name 993jaa09.25d size 524288 crc 0xe1a172dd sha1 42e850c055dc5bfccf6b6989f9f3a945fce13006 )
|
||||
rom ( name 993jaa10.27d size 524288 crc 0x9d113a2d sha1 eee94a5f7015c49aa630b8df0c8e9d137d238811 )
|
||||
disk ( name 993jaa11.chd md5 e26eb62d7cf3357585f5066da6063143 )
|
||||
)
|
||||
|
||||
game (
|
||||
name bmcompm2
|
||||
description "Beatmania complete MIX 2 [DJMAME 08-07-2003]"
|
||||
year 2000
|
||||
manufacturer "Konami"
|
||||
rom ( name 988jaa01.6a size 524288 flags nodump sha1 - )
|
||||
rom ( name 988jaa02.8a size 524288 flags nodump sha1 - )
|
||||
rom ( name 988jaa03.19a size 524288 flags nodump sha1 - )
|
||||
rom ( name 988jaa04.20a size 524288 flags nodump sha1 - )
|
||||
rom ( name 988jaa05.22a size 524288 flags nodump sha1 - )
|
||||
rom ( name 988jaa06.24a size 524288 flags nodump sha1 - )
|
||||
rom ( name 988jaa07.22d size 524288 flags nodump sha1 - )
|
||||
rom ( name 988jaa08.23d size 524288 flags nodump sha1 - )
|
||||
rom ( name 988jaa09.25d size 524288 flags nodump sha1 - )
|
||||
rom ( name 988jaa10.27d size 524288 flags nodump sha1 - )
|
||||
disk ( name 988jaa11.chd md5 cc21d58d6bee58f1c4baf08f345fe2c5 )
|
||||
)
|
||||
|
||||
game (
|
||||
name bmcompmx
|
||||
description "Beatmania complete MIX [DJMAME 08-07-2003]"
|
||||
year 1999
|
||||
manufacturer "Konami"
|
||||
rom ( name 858jaa03.19a size 524288 crc 0x8559f457 sha1 133092994087864a6c29e9d51dcdbef2e2c2a123 )
|
||||
rom ( name 858jaa04.20a size 524288 crc 0x770824d3 sha1 5c21bc39f8128957d76be85bc178c96976987f5f )
|
||||
rom ( name 858jaa05.22a size 524288 crc 0x9ce769da sha1 1fe2999f786effdd5e3e74475e8431393eb9403d )
|
||||
rom ( name 858jaa06.24a size 524288 crc 0x0cde6584 sha1 fb58d2b4f58144b71703431740c0381bb583f581 )
|
||||
rom ( name 858jaa07.22d size 524288 crc 0x7d183f46 sha1 7a1b0ccb0407b787af709bdf038d886727199e4e )
|
||||
rom ( name 858jaa08.23d size 524288 crc 0xc731dc8f sha1 1a937d76c02711b7f73743c9999456d4408ad284 )
|
||||
rom ( name 858jaa09.25d size 524288 crc 0x0b4ad843 sha1 c01e15053dd1975dc68db9f4e6da47062d8f9b54 )
|
||||
rom ( name 858jaa10.27d size 524288 crc 0x00b124ee sha1 435d28a327c2707833a8ddfe841104df65ffa3f8 )
|
||||
rom ( name 858jab01.6a size 524288 crc 0x92841eb5 sha1 3a9d90a9c4b16cb7118aed2cadd3ab32919efa96 )
|
||||
rom ( name 858jab02.8a size 524288 crc 0x7b19969c sha1 3545acabbf53bacc5afa72a3c5af3cd648bc2ae1 )
|
||||
disk ( name 858jaa11.chd md5 e7b26f6f03f807a32b2e5e291324d582 )
|
||||
)
|
||||
|
||||
game (
|
||||
name bmcorerm
|
||||
description "Beatmania CORE REMIX [DJMAME 08-07-2003]"
|
||||
year 2000
|
||||
manufacturer "Konami"
|
||||
rom ( name a05jaa01.6a size 524288 crc 0xcd6f1fc5 sha1 237cbc17a693efb6bffffd6afb24f0944c29330c )
|
||||
rom ( name a05jaa02.8a size 524288 crc 0xfe07785e sha1 14c652008cb509b5206fb515aad7dfe36a6fe6f4 )
|
||||
rom ( name a05jaa03.19a size 524288 crc 0x8b88932a sha1 df20f8323adb02d07b835da98f4a29b3142175c9 )
|
||||
rom ( name a05jaa04.20a size 524288 crc 0xcc72629f sha1 f95d06f409c7d6422d66a55c0452eb3feafc6ef0 )
|
||||
rom ( name a05jaa05.22a size 524288 crc 0xe241b22b sha1 941a76f6ac821e0984057ec7df7862b12fa657b8 )
|
||||
rom ( name a05jaa06.24a size 524288 crc 0x77eb08a3 sha1 fd339aaec06916abfc928e850e33480707b5450d )
|
||||
rom ( name a05jaa07.22d size 524288 crc 0x4d79646d sha1 5f1237bbd3cb09b27babf1c5359ef6c0d80ae3a9 )
|
||||
rom ( name a05jaa08.23d size 524288 crc 0xf067494f sha1 ef031b5501556c1aa047a51604a44551b35a8b99 )
|
||||
rom ( name a05jaa09.25d size 524288 crc 0x1504d62c sha1 3c31c6625bc089235a96fe21021239f2d0c0f6e1 )
|
||||
rom ( name a05jaa10.27d size 524288 crc 0x99d75c36 sha1 9599420863aa0a9492d3caeb03f8ac5fd4c3cdb2 )
|
||||
disk ( name a05jaa11.chd md5 180f7b1b2145fab2d2ba717780f2ca26 )
|
||||
)
|
||||
|
||||
game (
|
||||
name bmfinal
|
||||
description "Beatmania THE FINAL [DJMAME 08-07-2003]"
|
||||
year 2002
|
||||
manufacturer "Konami"
|
||||
rom ( name c01jaa01.6a size 524288 crc 0xa64eeff7 sha1 377eee1f41e3072f9154a7c17ec4c4f3fb63ea4a )
|
||||
rom ( name c01jaa02.8a size 524288 crc 0x599bdac5 sha1 f85aff020c92fcd3c2a42036615226b54e5bee98 )
|
||||
rom ( name c01jaa03.19a size 524288 crc 0x1c9c6eb7 sha1 bd1a9d8ed78095328817f599f52d9d34e09e9275 )
|
||||
rom ( name c01jaa04.20a size 524288 crc 0x4e5aa665 sha1 22f3888a29497ff0a801cce620ca0373268e5cd9 )
|
||||
rom ( name c01jaa05.22a size 524288 crc 0x37dab217 sha1 66b07c36e7749a4c9d9dfaca633958a4922c4562 )
|
||||
rom ( name c01jaa06.24a size 524288 crc 0xd35c6818 sha1 ce608603ea3662f8cda5cf958a676d64a0f74645 )
|
||||
rom ( name c01jaa07.22d size 524288 crc 0x3e70f506 sha1 d3cd0b48383bf2514b7f47fade8549ea8e3c5555 )
|
||||
rom ( name c01jaa08.23d size 524288 crc 0x535e6065 sha1 131f7eec4179145781bbd23474202f4eaf9cefd0 )
|
||||
rom ( name c01jaa09.25d size 524288 crc 0x45cf93b1 sha1 7c5082bcd1fe15761a0a965e25dda121904ff1bd )
|
||||
rom ( name c01jaa10.27d size 524288 crc 0xc9927749 sha1 c2644877bda483e241381265e723ea8ab8357761 )
|
||||
disk ( name c01jaa11.chd md5 8bb7e6b6bc63cac8a4f2997307c25748 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "boogwing"
|
||||
description "Boogie Wings / The Great Ragtime Show [sound only] [M1 v0.7.2]"
|
||||
year "1992"
|
||||
manufacturer "Data East Corporation"
|
||||
rom ( name kn06.18p size 65536 crc 0x3e8bc4e1 md5 96598bfa19b4c6a3d0820d37610f106c sha1 7e4c357afefa47b8f101727e06485eb9ebae635d )
|
||||
rom ( name mbd-09.16p size 524288 crc 0xf44f2f87 md5 aec9026003daf08468f59570b2449140 sha1 d941520bdfc9e6d88c45462bc1f697c18f33498e )
|
||||
rom ( name mbd-10.17p size 524288 crc 0xf159f76a md5 aaee9f2c53cf7551ed9155ef6a58b6d9 sha1 0b1ea69fecdd151e2b1fa96a21eade492499691d )
|
||||
)
|
||||
|
||||
game (
|
||||
name "bubbletr"
|
||||
description "Bubble Trouble [sound only] [M1 v0.7.2]"
|
||||
year "1992"
|
||||
manufacturer "Namco"
|
||||
rom ( name "btl-snd0.bin" size 131072 crc 46a5c625 )
|
||||
rom ( name "btl-voi1.bin" size 524288 crc 08b3a089 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "densdeg2"
|
||||
description "Densya De Go! 2 [sound only] [M1 v0.7.2]"
|
||||
year "1998"
|
||||
manufacturer "Taito"
|
||||
rom ( name e52-23.034 size 2097152 crc 0xebe2dcef md5 e6104313948f853a8ecd1bd18ec72d92 sha1 16ae41e0f3bb242cbc2922f53cacbd99961a3f97 )
|
||||
rom ( name e52-24.035 size 2097152 crc 0xa9a678da md5 921b4c8a36ecd14eb7f01e4d0b88fcfa sha1 b980ae644ef0312acd63b017028af9bf2b084c29 )
|
||||
rom ( name e52-29.030 size 262144 crc 0x6010162a md5 b04a28cbac20ae12113fb7c35f4ed6f8 sha1 f14920b26887f5387b3e261b63573d850195982a )
|
||||
rom ( name e52-30.031 size 262144 crc 0x2881af4a md5 a18886c09fbdbf48e4d3de482f6bdf32 sha1 5918f6508b3cd3bef3751e3bda2a48152569c1cd )
|
||||
)
|
||||
|
||||
game (
|
||||
name "densdego"
|
||||
description "Densya De Go! [sound only] [M1 v0.7.2]"
|
||||
year "1997"
|
||||
manufacturer "Taito"
|
||||
rom ( name e35-19.034 size 2097152 crc 0xebe2dcef md5 e6104313948f853a8ecd1bd18ec72d92 sha1 16ae41e0f3bb242cbc2922f53cacbd99961a3f97 )
|
||||
rom ( name e35-20.035 size 2097152 crc 0xa1d4b30d md5 9caf73184e7f0009c29dabcb3bbe864c sha1 e02f613b93d3b3ee1eb23f5b7f62c5448ed3966d )
|
||||
rom ( name e35-25.030 size 262144 crc 0x8104de13 md5 a64d6ce68282462ce06a10707980cf52 sha1 e518fbaf91704cf5cb8ffbb4833e3adba8c18658 )
|
||||
rom ( name e35-26.031 size 262144 crc 0x61821cc9 md5 ace8158a5f29774f78d2ac32f3fcc187 sha1 87cd5bd3bb22c9f4ca4b6d96f75434d48418321b )
|
||||
)
|
||||
|
||||
game (
|
||||
name "gprider"
|
||||
description "GP Rider [sound only] [M1 v0.7.2]"
|
||||
year "1990"
|
||||
manufacturer "Sega"
|
||||
rom ( name epr13388.bin size 65536 crc 0x706581e4 md5 47c13b07b33f483aca9c78eae5af3d26 sha1 51c9dbf2bf0d6b8826de24cd33596f5c95136870 )
|
||||
rom ( name opr13389.bin size 131072 crc 0x4e4c758e md5 62000b02dad71e40dd424e8ab6fc997c sha1 181750dfcdd6d5b28b063c980c251991163d9474 )
|
||||
rom ( name opr13390.bin size 131072 crc 0x8c93cd05 md5 26da18d369f44f581bda80fb30a0a299 sha1 bb08094abac6c104eddf14f634e9791f03122946 )
|
||||
rom ( name opr13391.bin size 131072 crc 0x8c30c867 md5 809395811c011076730078b05769f14e sha1 0d735291b1311890938f8a1143fae6af9feb2a69 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "gt97"
|
||||
description "Golden Tee Golf '97 [sound only] [M1 v0.7.2]"
|
||||
year "1997"
|
||||
manufacturer "Incredible Technologies"
|
||||
rom ( name gt97_s1.bin size 524288 crc 0x9fc8d818 md5 678cb578d23cbf72deec43b26665029b sha1 61c0bf2807b1ca8db123cc236f83543b6b33ac0b )
|
||||
rom ( name gt97nr.u88 size 131072 crc 0x2cee9e98 md5 ffb07e422db94a602fb965e01593ba68 sha1 02edac7abab2335c1cd824d1d9b26aa32238a2de )
|
||||
rom ( name gt97s0.bin size 1048576 crc 0xf4c9eebb md5 2ea87cf31d960a786d3a6bfae00a1e05 sha1 7e765fb894706b30c1bbd4353e921e7a456cf521 )
|
||||
)
|
||||
|
||||
game (
|
||||
name hmcompm2
|
||||
description "Hiphopmania complete MIX 2 [DJMAME 08-07-2003]"
|
||||
year 2000
|
||||
manufacturer "Konami"
|
||||
cloneof bmcompm2
|
||||
romof bmcompm2
|
||||
rom ( name 988uaa01.6a size 524288 crc 0x5e5cc6c0 sha1 0e7cd601d4543715cbc9f65e6fd48837179c962a )
|
||||
rom ( name 988uaa02.8a size 524288 crc 0xe262984a sha1 f47662e40f91f2addb1a4b649923c1d0ee017341 )
|
||||
rom ( name 988uaa03.19a size 524288 crc 0xd0f204c8 sha1 866baac5a6d301d5b9cf0c14e9937ee5f435db77 )
|
||||
rom ( name 988uaa04.20a size 524288 crc 0x74c6b3ed sha1 7d9b064bab3f29fc6435f6430c71208abbf9d861 )
|
||||
rom ( name 988uaa05.22a size 524288 crc 0x6b9321cb sha1 449e5f85288a8c6724658050fa9521c7454a1e46 )
|
||||
rom ( name 988uaa06.24a size 524288 crc 0xda6e0c1e sha1 4ef37db6c872bccff8c27fc53cccc0b269c7aee4 )
|
||||
rom ( name 988uaa07.22d size 524288 crc 0x9217870d sha1 d0536a8a929c41b49cdd053205165bfb8150e0c5 )
|
||||
rom ( name 988uaa08.23d size 524288 crc 0x77777e59 sha1 33b5508b961a04b82c9967a3326af6bbd838b85e )
|
||||
rom ( name 988uaa09.25d size 524288 crc 0xc2ad6810 sha1 706388c5acf6718297fd90e10f8a673463a0893b )
|
||||
rom ( name 988uaa10.27d size 524288 crc 0xdab0f3c9 sha1 6fd899e753e32f60262c54ab8553c686c7ef28de )
|
||||
disk ( name 988jaa11.chd md5 cc21d58d6bee58f1c4baf08f345fe2c5 )
|
||||
)
|
||||
|
||||
game (
|
||||
name hmcompmx
|
||||
description "Hiphopmania complete MIX [DJMAME 08-07-2003]"
|
||||
year 1999
|
||||
manufacturer "Konami"
|
||||
cloneof bmcompmx
|
||||
romof bmcompmx
|
||||
rom ( name 858uaa03.19a size 524288 crc 0x52b51a5e sha1 9f01e2fcbe5a9d7f80b377c5e10f18da2c9dcc8e )
|
||||
rom ( name 858uaa04.20a size 524288 crc 0xa336cee9 sha1 0e62c0c38d86868c909b4c1790fbb7ecb2de137d )
|
||||
rom ( name 858uaa05.22a size 524288 crc 0x2e14cf83 sha1 799b2162f7b11678d1d260f7e1eb841abda55a60 )
|
||||
rom ( name 858uaa06.24a size 524288 crc 0x2be07788 sha1 5cc2408f907ca6156efdcbb2c10a30e9b81797f8 )
|
||||
rom ( name 858uaa07.22d size 524288 crc 0x9d7c8ea0 sha1 5ef773ade7ab12a5dc10484e8b7711c9d76fe2a1 )
|
||||
rom ( name 858uaa08.23d size 524288 crc 0xf21c3f45 sha1 1d7ff2c4161605b382d07900142093192aa93a48 )
|
||||
rom ( name 858uaa09.25d size 524288 crc 0x99519886 sha1 664f6bd953201a6e2fc123cb8b3facf72766107d )
|
||||
rom ( name 858uaa10.27d size 524288 crc 0x20aa7145 sha1 eeff87eb9a9864985d751f45e843ee6e73db8cfd )
|
||||
rom ( name 858uab01.6a size 524288 crc 0xf9c16675 sha1 f2b50a3544f43af6fd987256a8bd4125b95749ef )
|
||||
rom ( name 858uab02.8a size 524288 crc 0x4e8f1e78 sha1 88d654de4377b584ff8a5e1f8bc81ffb293ec8a5 )
|
||||
disk ( name 858jaa11.chd md5 e7b26f6f03f807a32b2e5e291324d582 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "pdrift"
|
||||
description "Power Drift [sound only] [M1 v0.7.2]"
|
||||
year "1988"
|
||||
manufacturer "Sega"
|
||||
rom ( name 11754.bin size 524288 crc 0xebeb8484 md5 3a60a2abd9de0fa5fdc827c6fe0aa5a5 sha1 269f33cb1a9be126bada858e25291385d48686a2 )
|
||||
rom ( name 11755.bin size 131072 crc 0x6ab0646e md5 6c87b5256270bab377fed3b33484223f sha1 1a02466e617644e0d7b0311297b2bd128829ba4e )
|
||||
)
|
||||
|
||||
game (
|
||||
name popn1
|
||||
description "Pop'n Music 1 [DJMAME 08-07-2003]"
|
||||
year 1998
|
||||
manufacturer "Konami"
|
||||
rom ( name 803jaa01.6a size 524288 flags baddump crc 0xb5b5a6c1 sha1 45f57e7b3ca201355f0e0e9f607c3ad031eaf7f8 )
|
||||
rom ( name 803jaa02.8a size 524288 flags baddump crc 0x27460aec sha1 e803553f643f982c59ed7485580b1b49cd9a9b9c )
|
||||
rom ( name 803jaa03.19a size 524288 crc 0xd80315f6 sha1 070ea8d00aeecce1e357be5a9c434ef46f57a7e9 )
|
||||
rom ( name 803jaa04.20a size 524288 crc 0xf7b9ac82 sha1 898fbe229a3fdea5988d46359d030c3ec35eaafd )
|
||||
rom ( name 803jaa05.22a size 524288 flags baddump crc 0x2902f6df sha1 658ccae9a67196a310bd69870c350058d2911feb )
|
||||
rom ( name 803jaa06.24a size 524288 flags baddump crc 0x508f326a sha1 a55c17f88b5856a754f00a6e32b6f60685a88bec )
|
||||
rom ( name 803jaa07.22d size 524288 crc 0xb9c12071 sha1 8f67965d5c8e7c9bfac528a77a9e7c8e0d8b17c8 )
|
||||
rom ( name 803jaa08.23d size 524288 crc 0xa263f819 sha1 b479a215282212e9253e4085640c0638a4036e31 )
|
||||
rom ( name 803jaa09.25d size 524288 crc 0x0b8f22fa sha1 21df493dbe50520a784dc2a141de638926ea4be4 )
|
||||
rom ( name 803jaa10.27d size 524288 crc 0x094c5cbc sha1 603417f2ca197731ccccbce9117bec8fcd2e8fa3 )
|
||||
disk ( name 803jaa11.chd md5 54a8ac87857d81740621c622e27736d7 )
|
||||
)
|
||||
|
||||
game (
|
||||
name popn2
|
||||
description "Pop'n Music 2 [DJMAME 08-07-2003]"
|
||||
year 1998
|
||||
manufacturer "Konami"
|
||||
rom ( name 831jaa01.6a size 524288 crc 0xaabe8689 sha1 18e74c81710228c91ab9eb554b63d9bd69b93ec8 )
|
||||
rom ( name 831jaa02.8a size 524288 crc 0xd6214cac sha1 d51d277e9b5d0233d1c6bdfec40c32587f84b31a )
|
||||
rom ( name 831jaa03.19a size 524288 crc 0xa07aeb72 sha1 4d957c15d1b989e955249c34b0aa5679fb3e4fbf )
|
||||
rom ( name 831jaa04.20a size 524288 crc 0x9277d1d2 sha1 6946845973f0ce15db383032343f6852873698eb )
|
||||
rom ( name 831jaa05.22a size 524288 crc 0xf3b63033 sha1 c3c6de0d8c749ddf4926040637f03b11c2a21b99 )
|
||||
rom ( name 831jaa06.24a size 524288 crc 0x43564e9c sha1 54b792b8aaf22876f9eb806e31b86af4b354bcf6 )
|
||||
rom ( name 831jaa07.22d size 524288 crc 0x25af75f5 sha1 c150514a3bc6f3f88a5b98ef0db5440e2c5fec2d )
|
||||
rom ( name 831jaa08.23d size 524288 crc 0x3b1b5629 sha1 95b6bed5c5218a3bfb10996cd9af31bd7e08c1c4 )
|
||||
rom ( name 831jaa09.25d size 524288 crc 0xae7838d2 sha1 4f8a6793065c6c1eb08161f65b1d6246987bf47e )
|
||||
rom ( name 831jaa10.27d size 524288 crc 0x85173cb6 sha1 bc4d86bf4654a9a0a58e624f77090854950f3993 )
|
||||
)
|
||||
|
||||
game (
|
||||
name popn3
|
||||
description "Pop'n Music 3 [DJMAME 08-07-2003]"
|
||||
year 1999
|
||||
manufacturer "Konami"
|
||||
rom ( name 980jaa01.6a size 524288 crc 0xffd37d2c sha1 2a62ccfdb77a10356dbf08d6daa84faa3ff5d93a )
|
||||
rom ( name 980jaa02.8a size 524288 crc 0x00b15e1b sha1 7725b244b2964952e52a266aff697a8632830c97 )
|
||||
rom ( name 980jaa03.19a size 524288 crc 0x3674ba5b sha1 8741a43b099936c5f8add33d487b511c1ee8d21b )
|
||||
rom ( name 980jaa04.20a size 524288 crc 0x32e8ca33 sha1 5aab1cb334e57667e146516125574f4f14676104 )
|
||||
rom ( name 980jaa05.22a size 524288 crc 0xd31072e4 sha1 c23c0e21fb22fe82b9a76d28bf2896dfec6bdc9b )
|
||||
rom ( name 980jaa06.24a size 524288 crc 0xd2bbcf36 sha1 4f44c5d8df5dabf2956bdf33739a97b0645b5a5d )
|
||||
rom ( name 980jaa07.22d size 524288 crc 0x770732d0 sha1 f4330952d1e54658077e315ebd3cfd35e267219c )
|
||||
rom ( name 980jaa08.23d size 524288 crc 0x64ba3895 sha1 3e4654c970d6fffe46b4e1097c1a6cda196ec92a )
|
||||
rom ( name 980jaa09.25d size 524288 crc 0x1cb4d84e sha1 9669585c6a2825aeae6e47dd03458624b4c44721 )
|
||||
rom ( name 980jaa10.27d size 524288 crc 0x7776b87e sha1 662b7cd7cb4fb8f8bab240ef543bf9a593e23a03 )
|
||||
disk ( name 980jaa11.chd md5 6e5cc17a6bc75cac0256192cc700215c )
|
||||
)
|
||||
|
||||
game (
|
||||
name popnstex
|
||||
description "Pop'n Stage EX [DJMAME 08-07-2003]"
|
||||
year 1999
|
||||
manufacturer "Konami"
|
||||
rom ( name 970jba01.6a size 524288 crc 0x8fa0c957 sha1 12d1d6f15e19955c663ebdfcb16d5f6d209c0f76 )
|
||||
rom ( name 970jba02.8a size 524288 crc 0x7adb00a0 sha1 70a86897ab6cbc3f34be51f7f078644de697e331 )
|
||||
rom ( name 970jba03.19a size 524288 crc 0xe5d15d3c sha1 bdbd3c59e3377e071b199eea6cfb2ad84d37e971 )
|
||||
rom ( name 970jba04.20a size 524288 crc 0x687f9beb sha1 6baac0aa2db3af9e34469b1719ccff3643fd85f7 )
|
||||
rom ( name 970jba05.22a size 524288 crc 0x3bedc09c sha1 d0806bb54a3e620a987d61c6a5f04a2e1fc613a8 )
|
||||
rom ( name 970jba06.24a size 524288 crc 0x1673a771 sha1 2768434f1c94543f69d40165e68d325ae5d553cd )
|
||||
rom ( name 970jba07.22d size 524288 crc 0x6fd06bdb sha1 1dc621923e0871d2d5171753f5ddb97786ab12bd )
|
||||
rom ( name 970jba08.23d size 524288 crc 0x28256891 sha1 2069f52d596acbf355f205bb8d69cefc4cce3542 )
|
||||
rom ( name 970jba09.25d size 524288 crc 0x5d2bda52 sha1 d03c135ac04437b54e4d267ae168fe7ebb9e5b65 )
|
||||
rom ( name 970jba10.27d size 524288 crc 0xedc4a245 sha1 30bbd7bf0299a064119c535abb9be69d725aa130 )
|
||||
disk ( name 970jba11.chd md5 1616905838fdb2b521d53499c6c2a7a4 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "puzloop2"
|
||||
description "Puzz Loop 2 [sound only] [M1 v0.7.2]"
|
||||
year "2001"
|
||||
manufacturer "Mitchell"
|
||||
rom ( name "pl2.s5" size 4194304 crc 43c5ff97 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "raidendx"
|
||||
description "Raiden DX [sound only] [M1 v0.7.2]"
|
||||
year "1994"
|
||||
manufacturer "Seibu Kaihatsu"
|
||||
rom ( name dx-5.bin size 65536 crc 0x8c46857a md5 b9eb64c2121be006a4f58128a6c268a4 sha1 8b269cb20adf960ba4eb594d8add7739dbc9a837 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "rushhero"
|
||||
description "Rushing Heroes [sound only] [M1 v0.7.2]"
|
||||
year "1997"
|
||||
manufacturer "Konami"
|
||||
rom ( name 605a06.9m size 131072 crc 0x9ca03dce md5 916ea18a9c3d6003c00d2e72c2e04757 sha1 008106e864d8390d7ae8645a2fe06d0eaaa746e0 )
|
||||
rom ( name 605a07.7m size 131072 crc 0x3116a8b0 md5 e6de6f5e9147ce5b968764ada1fd34ba sha1 f0899d7027464d9aad45ffa6a464288a51a80dc1 )
|
||||
rom ( name 605a23.7r size 4194304 crc 0x992c4751 md5 2888bcb6eeda141c41c86054e6db0eb1 sha1 18ecfc21138f9dc62f0658750808bbef649510f7 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "scudrace"
|
||||
description "Scud Race [sound only] [M1 v0.7.2]"
|
||||
year "1996"
|
||||
manufacturer "Sega"
|
||||
rom ( name "epr19612.2" size 131072 crc 13978fd4 )
|
||||
rom ( name "mp19603.57" size 2097152 crc b1b1765f )
|
||||
rom ( name "mp19604.58" size 2097152 crc 6ac85b49 )
|
||||
rom ( name "mp19605.59" size 2097152 crc bec891eb )
|
||||
rom ( name "mp19606.60" size 2097152 crc adad46b2 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "sfchamp"
|
||||
description "Super Football Champ [sound only] [M1 v0.7.2]"
|
||||
year "1996"
|
||||
manufacturer "Taito"
|
||||
rom ( name e18-01.15 size 2097152 crc 0xdbd1408c md5 58d6559780ecc033dc71a765054eb1f5 sha1 ef81064f2f95e5ae25eb1f10d1e78f27f9e294f5 )
|
||||
rom ( name e18-09.22 size 131072 crc 0xbb5a5319 md5 bacad16dbed046e34cd62e7a4ce63512 sha1 0bb700cafc157d3af663cc9bebb8167487ff2852 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "stcc"
|
||||
description "Sega Touring Car Championship [sound only] [M1 v0.7.2]"
|
||||
year "1996"
|
||||
manufacturer "Sega"
|
||||
rom ( name "sega-tc.u32" size 2097152 crc 643059fa )
|
||||
rom ( name "sega-tc.u34" size 2097152 crc ae798313 )
|
||||
)
|
||||
|
||||
game (
|
||||
name lastrsrt
|
||||
description "Last Resort [sound only] [Hoot]"
|
||||
year 1992
|
||||
manufacturer "SNK"
|
||||
rom ( name n046001a.1f8 size 524288 crc 0x0722da38 md5 d2a6b5a0ab580b2e86d36cc1f168867b sha1 66a9b463d5277908b3a01c03de82b3de9118f2cb )
|
||||
rom ( name n046001a.1fc size 524288 crc 0x670ce3ec md5 463fceb184c774dc37bac50dc338fe21 sha1 9004aa85d4a9b0ecf9cf9357b073ed55a98fdb02 )
|
||||
rom ( name n046001b.1f8 size 524288 crc 0x2e39462b md5 c65ad0b3fa6bad8a3ad74639f77c4b31 sha1 b0a9b1a3377bf0369f3020192505c46ca52927d6 )
|
||||
rom ( name n046001b.1fc size 524288 crc 0x7944754f md5 a1738cd090a4dea0c0687a5cb1d76b4c sha1 d42a46c5127c6c62041ebffb0007af8a24abd360 )
|
||||
)
|
||||
|
||||
game (
|
||||
name spmonaco
|
||||
description "Super Monaco Gp [sound only] [Hoot]"
|
||||
year 1989
|
||||
manufacturer "Sega"
|
||||
rom ( name epr12436.bin size 65536 crc 0x16ec5f0a md5 21f47e64f22dc8445bbc2db6c36fc8f9 sha1 307b7388b5c36fd4bc2a61f7941db44858e03c5c )
|
||||
rom ( name epr12437.bin size 131072 crc 0xa1c7e712 md5 8518b8cf65ece64c367bbba09f47ad3b sha1 fa7fa8c39690ae5dab8b28af5aeed5ffae2cd6de )
|
||||
rom ( name epr12438.bin size 131072 crc 0x6573d46b md5 7bd05a490afc0d0a859ba9ae97fffbfd sha1 c4a4a0ea35250eff28a5bfd5e9cd372f52fd1308 )
|
||||
rom ( name epr12439.bin size 131072 crc 0x13bf6de5 md5 34d527b465c27a6c1f801a3e2f8fb526 sha1 92228a05ec33d606491a1da98c4989f69cddbb49 )
|
||||
)
|
||||
|
||||
game (
|
||||
name wrunsuzu
|
||||
description "Winning Run Suzuka GP (Uininguran GP) [sound only] [Hoot]"
|
||||
year 1989
|
||||
manufacturer "Namco"
|
||||
rom ( name wrt-snd0.bin size 131072 crc 0xde04b794 md5 3293c0b7c029b6a49c5bc32ff4f8a1b2 sha1 191f4d79ac2375d7060f3d83ec753185e92f28ea )
|
||||
rom ( name wrt-voi1.bin size 524288 crc 0x7dcccb31 md5 f3b0d763eef197c1004be3ca32ea6833 sha1 4441b37691434b13eae5dee2d04dc12a56b04d2a )
|
||||
rom ( name wrt-voi3.bin size 524288 crc 0xa198141c md5 cd863e4c258e219d8b5e69064ab8e362 sha1 b4ca352e6aedd9d7a7e5e39e840f1d3a7145900e )
|
||||
)
|
||||
|
||||
game (
|
||||
name skytargt
|
||||
description "Sky Target [sound only] [Nebula Jukebox v2.5]"
|
||||
year 1995
|
||||
manufacturer "Sega"
|
||||
rom ( name ep18408.30 size 524288 crc 0x6deb9657 md5 8c3cd35e61722d25067dfe32fabed26a sha1 30e1894432a0765c64b93dd5ca7ca17ef58ac6c0 )
|
||||
rom ( name mp18421.37 size 2097152 crc 0x00522390 md5 4a1a5c94a8a6d0b81f02a76cb3460739 sha1 5dbbf2ba008adad36929fcecb7c2c1e5ffd12618 )
|
||||
rom ( name mp18422.36 size 2097152 crc 0xb4f3cea6 md5 1bee68cccc18ec8a281eba782d39f7ae sha1 49669be09e10dfae7fddce0fc4e415466cb29566 )
|
||||
rom ( name mp18423.32 size 2097152 crc 0xc356d765 md5 c19e9fef787087c44347cca46768721c sha1 ae69c9d4e333579d826178d2863156dc784aedef )
|
||||
rom ( name mp18424.31 size 2097152 crc 0x590a4338 md5 b5346e9b6c8da6bc7e5b5f625d05991a sha1 826f167d7a4f5d30466b2f75f0123187c29c2d69 )
|
||||
)
|
||||
|
||||
game (
|
||||
name ki2_l11
|
||||
description "Killer Instinct 2 (ROMs L1.1) [U64emu 3.05]"
|
||||
year 1996
|
||||
manufacturer "Nintendo/Rareware/Midway"
|
||||
rom ( name ki2-l11.u98 size 524288 crc 0x0cb8de1e md5 6b4899050567a6dc193dd29ad8a963f5 sha1 fe447f4b1d29b524f57c5ba1890652ef6afff88a )
|
||||
)
|
||||
|
||||
game (
|
||||
name ki_l15d
|
||||
description "Killer Instinct (ROM L1.5d) [U64emu 3.05]"
|
||||
year 1994
|
||||
manufacturer "Nintendo/Rareware/Midway"
|
||||
rom ( name u98-l15d size 524288 crc 0x7b65ca3d md5 6a63e4bbdef8ea9f0d26f7244341ca08 sha1 607394d4ba1713f38c2cb5159303cace9cde991e )
|
||||
)
|
||||
|
||||
game (
|
||||
name anteater
|
||||
description "Anteater [YAAME v0.3]"
|
||||
year 1982
|
||||
manufacturer "[Stern] (Tago license)"
|
||||
rom ( name ra6-5f2 size 2048 crc 0x1e2824b1 md5 a9cac2cad1c5b4e67c743568e6cc807e sha1 9527937db618505181f4d5a22bc532977a767232 )
|
||||
rom ( name ra6-5h2 size 2048 crc 0x784319b3 md5 0b0b1cb67098bbb68c6325a938ddbe68 sha1 0c3612a428d0906b07b35782cc0f84fda13aab73 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "bace"
|
||||
description "Balloon Ace (PacMan HW) [ESMame 0.69u3]"
|
||||
year "2003"
|
||||
manufacturer "D.Widel"
|
||||
rom ( name "5e" size 4096 crc 6da99c7b )
|
||||
rom ( name "5f" size 4096 crc b81cdc64 )
|
||||
rom ( name "boot1" size 4096 crc 8b60ff7c )
|
||||
rom ( name "boot2" size 4096 crc 25d8361a )
|
||||
rom ( name "boot3" size 4096 crc fc38d994 )
|
||||
rom ( name "boot4" size 4096 crc 5853f341 )
|
||||
rom ( name "boot5" size 4096 crc f154670a )
|
||||
rom ( name "boot6" size 4096 crc f154670a )
|
||||
)
|
||||
|
||||
game (
|
||||
name "dderby"
|
||||
description "Death Derby (PacMan HW) [ESMame 0.69u3]"
|
||||
year "2003"
|
||||
manufacturer "D.Widel"
|
||||
rom ( name "5e" size 4096 crc 7e2c0a53 )
|
||||
rom ( name "5f" size 4096 crc cb2dd072 )
|
||||
rom ( name "boot1" size 4096 crc 6f373bd4 )
|
||||
rom ( name "boot2" size 4096 crc 2fbf16bf )
|
||||
rom ( name "boot3" size 4096 crc 6e16cd16 )
|
||||
rom ( name "boot4" size 4096 crc f7e09874 )
|
||||
rom ( name "boot5" size 4096 crc f154670a )
|
||||
rom ( name "boot6" size 4096 crc f154670a )
|
||||
)
|
||||
|
||||
game (
|
||||
name "mineswp"
|
||||
description "Mine Sweeper (Dottori Kun hardware) [ESMame 0.69u3]"
|
||||
year "1998"
|
||||
manufacturer "J-Rom"
|
||||
rom ( name "14479a.mpr" size 16384 crc 1cece483 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "vantris"
|
||||
description "Vantris (Vanguard hardware) [ESMame 0.69u3]"
|
||||
year "1998"
|
||||
manufacturer "N.Kehrer"
|
||||
rom ( name "sk4_ic13.bin" size 4096 crc 1176fdb0 )
|
||||
rom ( name "sk5_ic50.bin" size 2048 crc bdd86279 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "airco22b"
|
||||
description "Air Combat 22 [MAME 0.70u4]"
|
||||
year "1995"
|
||||
manufacturer "Namco"
|
||||
rom ( name "acs1ccrl.3d" size 2097152 crc 07088ba1 )
|
||||
rom ( name "acs1cg0.8d" size 2097152 crc 1f31343e )
|
||||
rom ( name "acs1cg1.10d" size 2097152 crc ccd5481d )
|
||||
rom ( name "acs1cg2.12d" size 2097152 crc 14e5d0d2 )
|
||||
rom ( name "acs1cg3.13d" size 2097152 crc 1a7bcc16 )
|
||||
rom ( name "acs1cg4.14d" size 2097152 crc 1920b7fb )
|
||||
rom ( name "acs1cg5.16d" size 2097152 crc 3dd109b7 )
|
||||
rom ( name "acs1cg6.18d" size 2097152 crc ec71c8a3 )
|
||||
rom ( name "acs1cg7.19d" size 2097152 crc 82271757 )
|
||||
rom ( name "acs1data.8k" size 524288 crc 33824bc9 )
|
||||
rom ( name "acs1scg0.12l" size 2097152 crc e5235404 )
|
||||
rom ( name "acs1scg1.10l" size 2097152 crc 828e91e7 )
|
||||
rom ( name "acs1verb.1" size 1048576 crc 062c4f61 )
|
||||
rom ( name "acs1verb.2" size 1048576 crc 8ae69711 )
|
||||
rom ( name "acs1verb.3" size 1048576 crc 71738e67 )
|
||||
rom ( name "acs1verb.4" size 1048576 crc 3b193add )
|
||||
rom ( name "acs1wav0.1" size 4194304 crc 52fb9762 )
|
||||
rom ( name "acs1wav1.2" size 4194304 crc b568dca2 )
|
||||
rom ( name "asc1ccrh.1d" size 524288 crc 62936af6 )
|
||||
rom ( name "asc1ptl0.18k" size 524288 crc bd5896c7 )
|
||||
rom ( name "asc1ptl1.16k" size 524288 crc e583b975 )
|
||||
rom ( name "asc1ptl2.15k" size 524288 crc 802d737a )
|
||||
rom ( name "asc1ptl3.14k" size 524288 crc fe556ecb )
|
||||
rom ( name "asc1ptm0.18j" size 524288 crc 949b6c58 )
|
||||
rom ( name "asc1ptm1.16j" size 524288 crc 8b2b99d9 )
|
||||
rom ( name "asc1ptm2.15j" size 524288 crc f1515080 )
|
||||
rom ( name "asc1ptm3.14j" size 524288 crc e364f4aa )
|
||||
rom ( name "asc1ptu0.18f" size 524288 crc 746b3084 )
|
||||
rom ( name "asc1ptu1.16f" size 524288 crc b44f1d3b )
|
||||
rom ( name "asc1ptu2.15f" size 524288 crc fdd2d778 )
|
||||
rom ( name "asc1ptu3.14f" size 524288 crc 38b425d4 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "alpinerd"
|
||||
description "Alpine Racer Ver. D [MAME 0.70u4]"
|
||||
year "1995"
|
||||
manufacturer "Namco"
|
||||
rom ( name "ar1datab.8k" size 524288 crc c26306f8 )
|
||||
rom ( name "ar1wavea.2l" size 2097152 crc dbf64562 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "cybrcomm"
|
||||
description "Cyber Commando (Japan) [MAME 0.70u4]"
|
||||
year "1995"
|
||||
manufacturer "Namco"
|
||||
rom ( name "cy1data.6r" size 131072 crc 10d0005b )
|
||||
rom ( name "cy1eeprm.9e" size 8192 crc 4e1d294b )
|
||||
rom ( name "cy1prgll.4d" size 524288 crc b3eab156 )
|
||||
rom ( name "cy1prglm.2d" size 524288 crc 884a5b0e )
|
||||
rom ( name "cy1prgum.8d" size 524288 crc c9c4a921 )
|
||||
rom ( name "cy1prguu.6d" size 524288 crc 5f22975b )
|
||||
rom ( name "cy1wav0.10r" size 1048576 crc c6f366a2 )
|
||||
rom ( name "cy1wav1.10p" size 1048576 crc f30b5e37 )
|
||||
rom ( name "cy1wav2.10n" size 1048576 crc b98c1ca6 )
|
||||
rom ( name "cy1wav3.10l" size 1048576 crc 43dbac19 )
|
||||
rom ( name "cyc1ccrh.2c" size 524288 crc 8c4090b8 )
|
||||
rom ( name "cyc1ccrl.1c" size 1048576 crc 1a0dc5f0 )
|
||||
rom ( name "cyc1cg0.1a" size 2097152 crc e839b9bd )
|
||||
rom ( name "cyc1cg1.2a" size 2097152 crc 7d13993f )
|
||||
rom ( name "cyc1cg2.3a" size 2097152 crc 7c464566 )
|
||||
rom ( name "cyc1cg3.5a" size 2097152 crc 2222e16f )
|
||||
rom ( name "cyc1ptl0.5b" size 524288 crc d91de03d )
|
||||
rom ( name "cyc1ptl1.4b" size 524288 crc e5b98021 )
|
||||
rom ( name "cyc1ptl2.3b" size 524288 crc 7ba786c6 )
|
||||
rom ( name "cyc1ptm0.5c" size 524288 crc d454b5c6 )
|
||||
rom ( name "cyc1ptm1.4c" size 524288 crc 74fdf8cc )
|
||||
rom ( name "cyc1ptm2.3c" size 524288 crc b9c99a45 )
|
||||
rom ( name "cyc1ptu0.5d" size 524288 crc 4d40897f )
|
||||
rom ( name "cyc1ptu1.4d" size 524288 crc 3bdaeeeb )
|
||||
rom ( name "cyc1ptu2.3d" size 524288 crc a0e73674 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "cybrcycc"
|
||||
description "Cyber Cycles Ver. C (CB2Ver.C) [MAME 0.70u4]"
|
||||
year "1995"
|
||||
manufacturer "Namco"
|
||||
rom ( name "cb1ccrh.1d" size 524288 crc 86124b93 )
|
||||
rom ( name "cb1ccrl.3d" size 2097152 crc 2f171c48 )
|
||||
rom ( name "cb1cg0.12b" size 2097152 crc 762a47a0 )
|
||||
rom ( name "cb1cg1.10d" size 2097152 crc df92c3e6 )
|
||||
rom ( name "cb1cg2.12d" size 2097152 crc 07bc508e )
|
||||
rom ( name "cb1cg3.13d" size 2097152 crc 50c86dea )
|
||||
rom ( name "cb1cg4.14d" size 2097152 crc e93b8894 )
|
||||
rom ( name "cb1cg5.16d" size 2097152 crc 9ee610a1 )
|
||||
rom ( name "cb1cg6.18a" size 2097152 crc ddc3b5cc )
|
||||
rom ( name "cb1datab.8k" size 524288 crc e2404221 )
|
||||
rom ( name "cb1ptrl0.18k" size 524288 crc f1393a03 )
|
||||
rom ( name "cb1ptrl1.16k" size 524288 crc 2ad51de7 )
|
||||
rom ( name "cb1ptrl2.15k" size 524288 crc 78f77c0d )
|
||||
rom ( name "cb1ptrl3.14k" size 524288 crc 804bfb4a )
|
||||
rom ( name "cb1ptrm0.18j" size 524288 crc f4eece49 )
|
||||
rom ( name "cb1ptrm1.16j" size 524288 crc 5f3cbd7d )
|
||||
rom ( name "cb1ptrm2.15j" size 524288 crc 02c7e4af )
|
||||
rom ( name "cb1ptrm3.14j" size 524288 crc ace3123b )
|
||||
rom ( name "cb1ptru0.18f" size 524288 crc 58d35341 )
|
||||
rom ( name "cb1ptru1.16f" size 524288 crc f4d005b0 )
|
||||
rom ( name "cb1ptru2.15f" size 524288 crc 68ffcd50 )
|
||||
rom ( name "cb1ptru3.14f" size 524288 crc d89c1c2b )
|
||||
rom ( name "cb1scg0.12f" size 2097152 crc 7aaca90d )
|
||||
rom ( name "cb1wavea.2l" size 4194304 crc b79a624d )
|
||||
rom ( name "cb1waveb.1l" size 2097152 crc 33bf08f6 )
|
||||
rom ( name "cb2ver-c.1" size 1048576 crc a8e07a14 )
|
||||
rom ( name "cb2ver-c.2" size 1048576 crc 054c504f )
|
||||
rom ( name "cb2ver-c.3" size 1048576 crc 47e6306c )
|
||||
rom ( name "cb2ver-c.4" size 1048576 crc 398426e4 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "raveracw"
|
||||
description "Rave Racer (World) [MAME 0.70u4]"
|
||||
year "1995"
|
||||
manufacturer "Namco"
|
||||
rom ( name "rv1data.6r" size 524288 crc d358ec20 )
|
||||
rom ( name "rv1wav0.10r" size 1048576 crc 5aef8143 )
|
||||
rom ( name "rv1wav1.10p" size 1048576 crc 9ed9e6b3 )
|
||||
rom ( name "rv1wav2.10n" size 1048576 crc 5af9dc83 )
|
||||
rom ( name "rv1wav3.10l" size 1048576 crc ffb9ad75 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "ridger2j"
|
||||
description "Ridge Racer 2 (Japan) [MAME 0.70u4]"
|
||||
year "1994"
|
||||
manufacturer "Namco"
|
||||
rom ( name "rrs1data.bin" size 524288 crc b7063aa8 )
|
||||
rom ( name "rrs1wav0.bin" size 1048576 crc 99d11a2d )
|
||||
rom ( name "rrs1wav1.bin" size 1048576 crc ad28444a )
|
||||
rom ( name "rrs1wav2.bin" size 1048576 crc 6f0d4619 )
|
||||
rom ( name "rrs1wav3.bin" size 1048576 crc 106e761f )
|
||||
)
|
||||
|
||||
game (
|
||||
name "ridgeraj"
|
||||
description "Ridge Racer (Japan [MAME 0.70u4])"
|
||||
year "1993"
|
||||
manufacturer "Namco"
|
||||
rom ( name "rr1-data.bin" size 524288 crc 18f5f748 )
|
||||
rom ( name "rr1-wav.0" size 1048576 crc a8e85bde )
|
||||
rom ( name "rr1-wav.1" size 1048576 crc 35f47c8e )
|
||||
rom ( name "rr1-wav.2" size 1048576 crc 3244cb59 )
|
||||
rom ( name "rr1-wav.3" size 1048576 crc c4cda1a7 )
|
||||
)
|
||||
|
||||
game (
|
||||
name "timecris"
|
||||
description "Time Crisis [MAME 0.70u4]"
|
||||
year "1995"
|
||||
manufacturer "Namco"
|
||||
rom ( name "ts2ver-a.1" size 2097152 crc d57eb74b )
|
||||
rom ( name "ts2ver-a.2" size 2097152 crc 671588af )
|
||||
)
|
||||
|
||||
game (
|
||||
name "victlapw"
|
||||
description "Ace Driver: Victory Lap (World) [MAME 0.70u4]"
|
||||
year "1996"
|
||||
manufacturer "Namco"
|
||||
rom ( name "adv1data.6r" size 524288 crc 10eecdb4 )
|
||||
rom ( name "adv1wav0.10r" size 1048576 crc f07b2d9d )
|
||||
rom ( name "adv1wav1.10p" size 1048576 crc 737f3c7a )
|
||||
rom ( name "adv1wav2.10n" size 1048576 crc c1a5ca5e )
|
||||
rom ( name "adv1wav3.10l" size 1048576 crc fc6b8004 )
|
||||
)
|
||||
|
||||
game (
|
||||
name 8ballact
|
||||
description "Eight Ball Action (DK conversion) [MAME 0.72u1]"
|
||||
year 1984
|
||||
manufacturer "Seatongrove Ltd (Magic Eletronics USA licence)"
|
||||
rom ( name 8b-dk.3n size 2048 crc 0x44830867 sha1 29d34792b9193edcdac427367c360d6f01e1e094 )
|
||||
rom ( name 8b.2e size 256 crc 0xc7379a12 sha1 e128e7d7c71ec61b934651c29648d0d2fc69e306 )
|
||||
rom ( name 8b.2f size 256 crc 0x116612b4 sha1 9a7c5329f211b13d5a757fdac761d7096d78b65a )
|
||||
rom ( name 8b.2n size 256 crc 0x30586988 sha1 a9c246fd01cb3ff371ad33b55d5b2fe4898c4d1b )
|
||||
)
|
||||
|
||||
game (
|
||||
name 8ballat2
|
||||
description "Eight Ball Action (DKJr conversion) [MAME 0.72u1]"
|
||||
year 1984
|
||||
manufacturer "Seatongrove Ltd (Magic Eletronics USA licence)"
|
||||
rom ( name 8b-jr.3h size 4096 crc 0x7f5c19fa sha1 9cde134137ee8e34bb745a72e67981c581561428 )
|
||||
rom ( name 8b-jr.3n size 4096 crc 0x9ec0edac sha1 ffa1ae2236995527d72917c45be337f642134cf8 )
|
||||
rom ( name 8b-jr.3p size 4096 crc 0x2978a88b sha1 15c21a3b3fb879996c13ce56791828e170c771d1 )
|
||||
rom ( name 8b-jr.5b size 8192 crc 0x579cd634 sha1 93d81539459f7198d8cbf05b3e66a40466aee2d9 )
|
||||
rom ( name 8b-jr.5c size 8192 crc 0x9bccbe93 sha1 dec4e1d41e1df36359f205bf090c4290311e4141 )
|
||||
)
|
||||
|
||||
game (
|
||||
name asurabld
|
||||
description "Asura Blade (Japan) [MAME 0.72u1]"
|
||||
year 1998
|
||||
manufacturer "Fuuki"
|
||||
rom ( name bg1012.u22 size 4194304 crc 0xd717a0a1 sha1 007df309dc0650ca07e077b983a2b05730349d0b )
|
||||
rom ( name bg1113.u23 size 4194304 crc 0x94338267 sha1 7848bc57cb0eac216100a508763451eb57a0a082 )
|
||||
rom ( name bg2022.u25 size 4194304 crc 0xee312cd3 sha1 2ef9d51928d80375daf8e6b204bb66a8b9cbaee7 )
|
||||
rom ( name bg2123.u24 size 4194304 crc 0x4acfc469 sha1 a98d06b967ebb3fa3b4c8aa3d7a05063ec981fb2 )
|
||||
rom ( name map.u5 size 2097152 crc 0xe681155e sha1 458845b9c86df72685d92d0d4052aacc2fa7d1bd )
|
||||
rom ( name pcm.u6 size 4194304 crc 0xac72225a sha1 8d16399ed34ac5bd69dbf43b2de2b0db9ac1c610 )
|
||||
rom ( name pgm0.u4 size 524288 crc 0x68615497 sha1 de93751f151f195a863dc6fe83b6e7ed8f99430a )
|
||||
rom ( name pgm1.u3 size 524288 crc 0x35104452 sha1 03cfd81429f8a945d5419c9750925bfa997d0607 )
|
||||
rom ( name pgm2.u2 size 524288 crc 0x16b656ca sha1 5ffb551ce7dec462d3896f0fed693454496894bc )
|
||||
rom ( name pgm3.u1 size 524288 crc 0x053e9758 sha1 c2754d3f0c607c81c8fa33b667b576eb0474fd0b )
|
||||
rom ( name sp23.u14 size 4194304 crc 0x7df492eb sha1 30b88a3cd025ffc8c28fef06e0784755be37ef8e )
|
||||
rom ( name sp45.u15 size 4194304 crc 0x1890f42a sha1 22254fe38fd83f4602a25e1ccba32df16edaf3f9 )
|
||||
rom ( name sp67.u16 size 4194304 crc 0xa48f1ef0 sha1 bf8787f293793291a503af662d3738c007654726 )
|
||||
rom ( name sp89.u17 size 4194304 crc 0x6b024362 sha1 8be5cc3c7306d28b75acd970bb3be6d3c9825367 )
|
||||
rom ( name spab.u18 size 4194304 crc 0x803d2d8c sha1 25df30689e576a0620656c721d92bcc3fbd84844 )
|
||||
rom ( name spcd.u19 size 4194304 crc 0x42e5c26e sha1 b68875d353bdc5d49113bbac02fd83508bce66a5 )
|
||||
rom ( name srom.u7 size 524288 crc 0xbb1deb89 sha1 b1c70abddc0b9a88beb69a592376ff69a7e091eb )
|
||||
)
|
||||
|
||||
game (
|
||||
name gaia
|
||||
description "Gaia Crusaders [MAME 0.72u1]"
|
||||
year 1999
|
||||
manufacturer "Noise Factory"
|
||||
rom ( name bg1.989 size 4194304 crc 0x013a693d sha1 2cc5be6f47c13febed942e1c3167946efedc5f9b )
|
||||
rom ( name bg2.995 size 4194304 crc 0x783cc62f sha1 8b6e4212688b53be5ecc29ff2d41fd43e7d0a420 )
|
||||
rom ( name bg3.998 size 4194304 crc 0xbcd61d1c sha1 660a3b02a8c39e1117b00d0ad06f73221fef4ce8 )
|
||||
rom ( name obj1.736 size 4194304 crc 0xf4f84e5d sha1 8f445dd7a5c8a996939c211e5aec5742121a6e7e )
|
||||
rom ( name obj2.738 size 4194304 crc 0x15c2a9ce sha1 631eb2968395be86ef2403733e7d4ec769a013b9 )
|
||||
rom ( name prg1.127 size 524288 crc 0x47b904b2 sha1 58b9b55f59cf00f70b690a0371096e86f4d723c2 )
|
||||
rom ( name prg2.128 size 524288 crc 0x469b7794 sha1 502f855c51005a866900b19c3a0a170d9ea02392 )
|
||||
rom ( name snd1.447 size 4194304 crc 0x92770a52 sha1 81f6835e1b45eb0f367e4586fdda92466f02edb9 )
|
||||
rom ( name snd2.454 size 4194304 crc 0x329ae1cf sha1 0c5e5074a5d8f4fb85ab4893bc953f192dcb301a )
|
||||
rom ( name snd3.455 size 4194304 crc 0x4048d64e sha1 5e4ec6d37e70484e2fcd04188385e79ef0b53026 )
|
||||
)
|
||||
|
||||
game (
|
||||
name strtheat
|
||||
description "Street Heat - Cardinal Amusements [MAME 0.72u1]"
|
||||
year 1985
|
||||
manufacturer "Epos Corporation"
|
||||
rom ( name 2716.3h size 2048 crc 0x4cd17174 sha1 5ed9b5275b0779d1ca05d6e62d3ad8a682ebde37 )
|
||||
rom ( name 2716.3n size 2048 crc 0x29e57678 sha1 cbbb980c44c7f5c45d5f0b85209658f53b7ba4a7 )
|
||||
rom ( name 2716.3p size 2048 crc 0x31171146 sha1 e26b22e73b528810b566b2b9f6d81e2d7856523d )
|
||||
rom ( name 2716.7c size 2048 crc 0xa8238e9c sha1 947bbe48ce1c705ef974e37b138929f1c846ed79 )
|
||||
rom ( name 2716.7d size 2048 crc 0x71202138 sha1 b4edc77ed2844ef46aee4a492282e4785bdb7224 )
|
||||
rom ( name 2716.7e size 2048 crc 0xdc7785ac sha1 4ccb3f9f938fd1d9bd20f1601a16a2780c84588b )
|
||||
rom ( name 2716.7f size 2048 crc 0xede71d86 sha1 0bce1b1d4180173537685a08055ce44b9dedc76a )
|
||||
rom ( name 2764.u2 size 8192 crc 0x8d3e82c3 sha1 ec26fb1c6015721da1f61eca76a4b3390d8dcc76 )
|
||||
rom ( name 2764.u3 size 8192 crc 0xf0759e76 sha1 e086f02d1861269194c4cd2ada71696b48ed1a1d )
|
||||
rom ( name 82s129.2e size 256 crc 0x1311ba28 sha1 d9b5bc07c8943d83592833e8b1c2ff57e4accb55 )
|
||||
rom ( name 82s129.2f size 256 crc 0x18d90d4f sha1 b956fd652dcc5eb50eaec8729762d19cfd475bc7 )
|
||||
rom ( name 82s129.2n size 256 crc 0xa515d59b sha1 930616c4bcd819c2a4432a6619a8c6da74f3e8c5 )
|
||||
)
|
||||
|
||||
game (
|
||||
name wc90t
|
||||
description "Tecmo World Cup '90 (trackball) [MAME 0.72u1]"
|
||||
year 1989
|
||||
manufacturer "Tecmo"
|
||||
rom ( name wc90a-1.bin size 32768 crc 0xb6f51a68 sha1 - )
|
||||
rom ( name wc90a-2.bin size 65536 crc 0xc50f2a98 sha1 - )
|
||||
rom ( name wc90a-3.bin size 65536 crc 0x8c7a9542 sha1 - )
|
||||
)
|
||||
|
||||
|
||||
10410
SabreTools.Serialization.Test/TestData/test-cmp-files2.dat
Normal file
10410
SabreTools.Serialization.Test/TestData/test-cmp-files2.dat
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,3 @@
|
||||
File Name,Internal Name,Description,Game Name,Game Description,Type,Rom Name,Disk Name,Size,CRC,MD5,SHA1,SHA256,Nodump
|
||||
Original DatFile Name.xml,Original DatFile Name,Original DatFile,Game,A cool game,Rom,file.bin,,12345,0,d41d8cd98f00b204e9800998ecf8427e,da39a3ee5e6b4b0d3255bfef95601890afd80709,ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad,No
|
||||
Original DatFile Name.xml,Original DatFile Name,Original DatFile,Game,A cool game,Disk,,file.chd,,,,da39a3ee5e6b4b0d3255bfef95601890afd80709,,No
|
||||
|
@@ -0,0 +1,3 @@
|
||||
File Name,Internal Name,Description,Game Name,Game Description,Type,Rom Name,Disk Name,Size,CRC,MD5,SHA1,SHA256,SHA384,SHA512,SpamSum,Nodump
|
||||
Original DatFile Name.xml,Original DatFile Name,Original DatFile,Game,A cool game,Rom,file.bin,,12345,0,d41d8cd98f00b204e9800998ecf8427e,da39a3ee5e6b4b0d3255bfef95601890afd80709,ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad,cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7,ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f,QXX,No
|
||||
Original DatFile Name.xml,Original DatFile Name,Original DatFile,Game,A cool game,Disk,,file.chd,,,,da39a3ee5e6b4b0d3255bfef95601890afd80709,,,,,No
|
||||
|
Binary file not shown.
Binary file not shown.
BIN
SabreTools.Serialization.Test/TestData/test-listrom-files.txt.gz
Normal file
BIN
SabreTools.Serialization.Test/TestData/test-listrom-files.txt.gz
Normal file
Binary file not shown.
Binary file not shown.
283688
SabreTools.Serialization.Test/TestData/test-listxml-files2.xml
Normal file
283688
SabreTools.Serialization.Test/TestData/test-listxml-files2.xml
Normal file
File diff suppressed because it is too large
Load Diff
BIN
SabreTools.Serialization.Test/TestData/test-logiqx-files1.xml.gz
Normal file
BIN
SabreTools.Serialization.Test/TestData/test-logiqx-files1.xml.gz
Normal file
Binary file not shown.
3066
SabreTools.Serialization.Test/TestData/test-logiqx-files2.xml
Normal file
3066
SabreTools.Serialization.Test/TestData/test-logiqx-files2.xml
Normal file
File diff suppressed because it is too large
Load Diff
100
SabreTools.Serialization.Test/TestData/test-md5-files.md5
Normal file
100
SabreTools.Serialization.Test/TestData/test-md5-files.md5
Normal file
@@ -0,0 +1,100 @@
|
||||
d660d7258e04b3de83248f488c58e47c *Barney Bear Goes to School (USA) (Track 01).bin
|
||||
ddcca5e6b1d05442505a935f1444c82d *Barney Bear Goes to School (USA) (Track 02).bin
|
||||
52fb246984bd4bab51571454d9501904 *Barney Bear Goes to School (USA) (Track 03).bin
|
||||
48e8a5b4813a942f1251aa9d013af83c *Barney Bear Goes to School (USA) (Track 04).bin
|
||||
b8b04a48f1dae3ff2994a7a15143f924 *Barney Bear Goes to School (USA) (Track 05).bin
|
||||
7dfdb3a6718188c6230eef6c003b0a66 *Barney Bear Goes to School (USA) (Track 06).bin
|
||||
43dbf6509b694673c625c550d1583ab6 *Barney Bear Goes to School (USA) (Track 07).bin
|
||||
870b67155c66d389833f7bdb4c226b78 *Barney Bear Goes to School (USA) (Track 08).bin
|
||||
2146f79948f95394cd7bc8a92d8ffed3 *Barney Bear Goes to School (USA) (Track 09).bin
|
||||
a95d931d28de5639e51d3ad02cdcaa0d *Barney Bear Goes to School (USA) (Track 10).bin
|
||||
710b0c91d19db1e23eb0dff53c7e5b52 *Barney Bear Goes to School (USA) (Track 11).bin
|
||||
92ce9aa1f3f1b6ed9be3dd601c2ff51d *Barney Bear Goes to School (USA) (Track 12).bin
|
||||
83746c04b76586218074c2098d97e4ec *Barney Bear Goes to School (USA) (Track 13).bin
|
||||
ced4ec11d8c1be2e1148803f19cd1f42 *Barney Bear Goes to School (USA) (Track 14).bin
|
||||
09060e33785a50292eba201b0762de43 *Barney Bear Goes to School (USA) (Track 15).bin
|
||||
5018feddca5aa792e78a3ab0faecfcce *Barney Bear Goes to School (USA) (Track 16).bin
|
||||
fabea432e2ec97f7920388877d3b2c96 *Barney Bear Goes to School (USA) (Track 17).bin
|
||||
04e1ca138b7682022d44815771f7d610 *Barney Bear Goes to School (USA) (Track 18).bin
|
||||
3724b24f0f3db4e6dc5bf3719fd96159 *Barney Bear Goes to School (USA) (Track 19).bin
|
||||
712529d5c03be26bc61018e2a6d62231 *Barney Bear Goes to School (USA) (Track 20).bin
|
||||
416183742a8ec7c08595695a1d36f49e *Barney Bear Goes to School (USA) (Track 21).bin
|
||||
3fdee94ba5e0d7e4a474f2a016d38d16 *Barney Bear Goes to School (USA) (Track 22).bin
|
||||
3213aad3d108d80d1d530eca243877f3 *Barney Bear Goes to School (USA) (Track 23).bin
|
||||
dc646e0e23fcc0112dda6dee7fc94048 *Barney Bear Goes to School (USA) (Track 24).bin
|
||||
d49d329b62d952e14bd5629b103cc5b1 *Barney Bear Goes to School (USA) (Track 25).bin
|
||||
a4c765c36e20e37993aedfaeed3b9dea *Barney Bear Goes to School (USA) (Track 26).bin
|
||||
81a413c1524ad483650317036b3d9687 *Barney Bear Goes to School (USA) (Track 27).bin
|
||||
f0291a33a245df7c38c0cea1ee4df9cc *Barney Bear Goes to School (USA) (Track 28).bin
|
||||
0db6fe455ecc9b1fbeb55a85358d58a9 *Barney Bear Goes to School (USA) (Track 29).bin
|
||||
f57d4d0cca4e1a1dbbc6d34dac28aee3 *Barney Bear Goes to School (USA) (Track 30).bin
|
||||
18b018bb693b22530fa1e087a79bf2da *Barney Bear Goes to School (USA) (Track 31).bin
|
||||
1bccdfc3c0f7bc0bf63b75c703d2849d *Barney Bear Goes to School (USA) (Track 32).bin
|
||||
d13b18473053b6f93a931acdef2ac9ff *Barney Bear Goes to School (USA) (Track 33).bin
|
||||
f106712d1ebb1c07fa2408efff0cbe53 *Barney Bear Goes to School (USA) (Track 34).bin
|
||||
13aea576e33afc7923d0ab977d2470b5 *Barney Bear Goes to School (USA) (Track 35).bin
|
||||
c1392dbb1c8e820f80c447ebb50ca10f *Barney Bear Goes to School (USA) (Track 36).bin
|
||||
83923ea897d5284536257c85e9d468c4 *Barney Bear Goes to School (USA) (Track 37).bin
|
||||
416d19d1a4471c06a6fab9cafd270541 *Barney Bear Goes to School (USA) (Track 38).bin
|
||||
de980b883d382e7159848f2264d11905 *Barney Bear Goes to School (USA) (Track 39).bin
|
||||
7f01aabfae9776414f4029798921f3f1 *Barney Bear Goes to School (USA) (Track 40).bin
|
||||
43cfd6bb7f9f4e5add2b1119f78d4569 *Barney Bear Goes to School (USA) (Track 41).bin
|
||||
59ca076d2fdc665f701e7467a3d2b180 *Barney Bear Goes to School (USA) (Track 42).bin
|
||||
88ec47b4e372a1bfc9eb5b63a3ef2353 *Barney Bear Goes to School (USA) (Track 43).bin
|
||||
a14c7b0d159dd11f65fb82c8c7299938 *Barney Bear Goes to School (USA) (Track 44).bin
|
||||
9381f3af88a86a453167a6079a17c1aa *Barney Bear Goes to School (USA) (Track 45).bin
|
||||
7d607ede892bb6f012467cfc07fab285 *Barney Bear Goes to School (USA) (Track 46).bin
|
||||
f737f25818598092c3c483732ac2ca8f *Barney Bear Goes to School (USA) (Track 47).bin
|
||||
3454bf5eac48968e920d78e083be5aab *Barney Bear Goes to School (USA) (Track 48).bin
|
||||
f20cf6292d3dd47d77efa1102e43e530 *Barney Bear Goes to School (USA) (Track 49).bin
|
||||
c5616328576e7b94cc54f3a39d035caf *Barney Bear Goes to School (USA) (Track 50).bin
|
||||
4c8a8712674e4c8a98f00a5dee8053d8 *Barney Bear Goes to School (USA) (Track 51).bin
|
||||
861e523b14ae06b1acfd0ae37654eedb *Barney Bear Goes to School (USA) (Track 52).bin
|
||||
c0023a8fe8cf1683277c8fd61552eec5 *Barney Bear Goes to School (USA) (Track 53).bin
|
||||
4551ef330c5a5e8ebabd3dc7367d0997 *Barney Bear Goes to School (USA) (Track 54).bin
|
||||
6a1b8cab8ffc7f8ba0e398d06d6d6a3c *Barney Bear Goes to School (USA) (Track 55).bin
|
||||
5da6fcdc3f19652cecd96bd45211f0b3 *Barney Bear Goes to School (USA) (Track 56).bin
|
||||
5d56d449922dac2fb60888bcc8b65e84 *Barney Bear Goes to School (USA) (Track 57).bin
|
||||
1cb6a16bfb96ddbff6981df77597ea5a *Barney Bear Goes to School (USA) (Track 58).bin
|
||||
fee45f55442782a1d97c06c4caea3b94 *Barney Bear Goes to School (USA) (Track 59).bin
|
||||
1012b41b1077cb5ab2d687049c229b1a *Barney Bear Goes to School (USA) (Track 60).bin
|
||||
6ac86f3c17074d42a9f098d8ff957e25 *Barney Bear Goes to School (USA) (Track 61).bin
|
||||
0aadb961334bec4cace74b17c40d24aa *Barney Bear Goes to School (USA) (Track 62).bin
|
||||
aa3616d2742a44dd8cbeada00657607d *Barney Bear Goes to School (USA) (Track 63).bin
|
||||
3c9a490073e319936bae51981132c955 *Barney Bear Goes to School (USA) (Track 64).bin
|
||||
7e698663d98466bd2000a882bbe5b8cb *Barney Bear Goes to School (USA) (Track 65).bin
|
||||
18f8511fe266d9538ade3216ea1661c5 *Barney Bear Goes to School (USA) (Track 66).bin
|
||||
b9f7c67c8581229fad348445f50c6371 *Barney Bear Goes to School (USA) (Track 67).bin
|
||||
70b9006b57fa5ee625259694f8cb47a0 *Barney Bear Goes to School (USA) (Track 68).bin
|
||||
01f3ec3d63c80e274887699198e75606 *Barney Bear Goes to School (USA) (Track 69).bin
|
||||
7752af3ad4a3b8cea680e4b7e1bfeb4d *Barney Bear Goes to School (USA) (Track 70).bin
|
||||
bdef9ebec16c0cea78d2f4fecd48e688 *Barney Bear Goes to School (USA) (Track 71).bin
|
||||
c8f3323905f892a046c979916fae514b *Barney Bear Goes to School (USA) (Track 72).bin
|
||||
0a30fcd90e2839119e93ed7136a07097 *Barney Bear Goes to School (USA) (Track 73).bin
|
||||
3a3edb3674bd30f7a61dc806b7562bf9 *Barney Bear Goes to School (USA) (Track 74).bin
|
||||
9014a8d1a3356b01dccd95fa460bc785 *Barney Bear Goes to School (USA) (Track 75).bin
|
||||
d0e58f8d6a734b20777f244edc1a45c7 *Barney Bear Goes to School (USA) (Track 76).bin
|
||||
e4619f010e4af80f7a8770fb8b223cf7 *Barney Bear Goes to School (USA) (Track 77).bin
|
||||
1215b28b90fec2fc1fddc6fbe3a63e87 *Barney Bear Goes to School (USA) (Track 78).bin
|
||||
1c855c082e2185d7566681d63db741dc *Barney Bear Goes to School (USA) (Track 79).bin
|
||||
fddaab4f57e73c36dc1af52fc66bd58d *Barney Bear Goes to School (USA) (Track 80).bin
|
||||
14dfd6e66c6754ea546b23c3e56d0a75 *Barney Bear Goes to School (USA) (Track 81).bin
|
||||
44b0379a2278f84f7e7015ed8bf79c54 *Barney Bear Goes to School (USA) (Track 82).bin
|
||||
8089a558e9808640820fe624a32b3f8a *Barney Bear Goes to School (USA) (Track 83).bin
|
||||
e862789c432b7e851d552e75e922716c *Barney Bear Goes to School (USA) (Track 84).bin
|
||||
f7f27620f89bd7c7e19fd2d5a94e82c1 *Barney Bear Goes to School (USA) (Track 85).bin
|
||||
2829f242300b36fc233c8eff72000c4a *Barney Bear Goes to School (USA) (Track 86).bin
|
||||
342875d61f152a7da7d9143ebd0d767c *Barney Bear Goes to School (USA) (Track 87).bin
|
||||
351f42129a3ca0212923c924ab028399 *Barney Bear Goes to School (USA) (Track 88).bin
|
||||
f0ab189b06da969784133ca81a51454e *Barney Bear Goes to School (USA) (Track 89).bin
|
||||
e6ee817f6712a8150fa793baa1333796 *Barney Bear Goes to School (USA) (Track 90).bin
|
||||
2a74a5b6b3a1225a4ff9b4b824fe5fe0 *Barney Bear Goes to School (USA) (Track 91).bin
|
||||
c2c9ef8ce916c8bfd9cfad5da61c8bb3 *Barney Bear Goes to School (USA) (Track 92).bin
|
||||
1dab7e75dcee645759988fba5c5017cc *Barney Bear Goes to School (USA) (Track 93).bin
|
||||
3a1abd4966bdc662bc9d9d51f6338942 *Barney Bear Goes to School (USA) (Track 94).bin
|
||||
bd8e3e04f133b41b84fd5b84c13997b6 *Barney Bear Goes to School (USA) (Track 95).bin
|
||||
fef61422100cc1a282250efb79a85292 *Barney Bear Goes to School (USA) (Track 96).bin
|
||||
d087996d7f1e9856ddf833a697d2ea0b *Barney Bear Goes to School (USA) (Track 97).bin
|
||||
781edf7bd5b6be3ae60a8f0198120f15 *Barney Bear Goes to School (USA) (Track 98).bin
|
||||
bc206671819ac2b5b13e906fd27b89fd *Barney Bear Goes to School (USA) (Track 99).bin
|
||||
37d1e3bf7439af1ac2d986150f525fc6 *Barney Bear Goes to School (USA).cue
|
||||
121575
SabreTools.Serialization.Test/TestData/test-offlinelist-files.xml
Normal file
121575
SabreTools.Serialization.Test/TestData/test-offlinelist-files.xml
Normal file
File diff suppressed because it is too large
Load Diff
26452
SabreTools.Serialization.Test/TestData/test-openmsx-files.xml
Normal file
26452
SabreTools.Serialization.Test/TestData/test-openmsx-files.xml
Normal file
File diff suppressed because it is too large
Load Diff
911
SabreTools.Serialization.Test/TestData/test-romcenter-files.dat
Normal file
911
SabreTools.Serialization.Test/TestData/test-romcenter-files.dat
Normal file
@@ -0,0 +1,911 @@
|
||||
[CREDITS]
|
||||
Author=ElSemi
|
||||
Version=Jukebox v2.9
|
||||
Comment=Autogenerated by Jukebox
|
||||
[DAT]
|
||||
Version=2.00
|
||||
[EMULATOR]
|
||||
refname=Jukebox
|
||||
version=Jukebox v2.9
|
||||
[GAMES]
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬ep20225.15¬4ABC6B59¬131072¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬ep20226.16¬43E05B3A¬131072¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬ep20223.13¬61B1BE98¬131072¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬ep20224.14¬EB2D7DBF¬131072¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20233.11¬3E079A3B¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20234.12¬58BDE826¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20231.9¬B3393E93¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20232.10¬DA4A2E11¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20229.7¬CDEC7BF4¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20230.8¬A166FA87¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20227.5¬1277686E¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20228.6¬49CB5568¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20236.29¬8DE9A3C2¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20235.30¬78FA11EF¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20249.31¬DC24F13D¬131072¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20250.32¬91B735D3¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20251.33¬703A947B¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20252.34¬8F48F375¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20253.35¬CA6AA17C¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20244.17¬9D2A8660¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20240.21¬51615908¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20243.18¬48671F7C¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20239.22¬6CD8D8A5¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20242.19¬E7F86AC7¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20238.23¬0A480C7C¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20241.20¬51974B98¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20237.24¬89B5D8B6¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20247.27¬00B0417D¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20245.25¬36490A08¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20248.28¬0ACE6BEF¬2097152¬¬¬
|
||||
¬bel¬Behind the Enemy Lines¬bel¬Behind the Enemy Lines¬mp20246.26¬250D6CA1¬2097152¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬bucky¬Bucky O'Hare¬173ea.b01¬7785AC8A¬262144¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬bucky¬Bucky O'Hare¬173ea.b02¬9B45F122¬262144¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬bucky¬Bucky O'Hare¬t5¬CD724026¬131072¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬bucky¬Bucky O'Hare¬t6¬7DD54D6F¬131072¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬bucky¬Bucky O'Hare¬173.a07¬4CDAEE71¬262144¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬bucky¬Bucky O'Hare¬173a08.b6¬DCDDED95¬2097152¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬bucky¬Bucky O'Hare¬173a09.a6¬C93697C4¬2097152¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬bucky¬Bucky O'Hare¬173a06.t10¬6541A34F¬1048576¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬bucky¬Bucky O'Hare¬173a05.t8¬D14333B4¬1048576¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬bucky¬Bucky O'Hare¬173a18.a10¬4CF85439¬2097152¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬bucky¬Bucky O'Hare¬173a12.b10¬0FC2AD24¬2097152¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬bucky¬Bucky O'Hare¬173a11.a8¬B0D747C4¬2097152¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬bucky¬Bucky O'Hare¬173a10.b8¬42FB0A0C¬2097152¬¬¬
|
||||
¬moo¬C.O.W. Boys of Moo Mesa¬moo¬C.O.W. Boys of Moo Mesa¬151b01¬FB2FA298¬262144¬¬¬
|
||||
¬moo¬C.O.W. Boys of Moo Mesa¬moo¬C.O.W. Boys of Moo Mesa¬151b02¬3D9F4D59¬262144¬¬¬
|
||||
¬moo¬C.O.W. Boys of Moo Mesa¬moo¬C.O.W. Boys of Moo Mesa¬151a03¬C896D3EA¬262144¬¬¬
|
||||
¬moo¬C.O.W. Boys of Moo Mesa¬moo¬C.O.W. Boys of Moo Mesa¬151a04¬3B24706A¬262144¬¬¬
|
||||
¬moo¬C.O.W. Boys of Moo Mesa¬moo¬C.O.W. Boys of Moo Mesa¬151a07¬CDE247FC¬262144¬¬¬
|
||||
¬moo¬C.O.W. Boys of Moo Mesa¬moo¬C.O.W. Boys of Moo Mesa¬151a08¬962251D7¬2097152¬¬¬
|
||||
¬moo¬C.O.W. Boys of Moo Mesa¬moo¬C.O.W. Boys of Moo Mesa¬151a06¬38DBCAC1¬1048576¬¬¬
|
||||
¬moo¬C.O.W. Boys of Moo Mesa¬moo¬C.O.W. Boys of Moo Mesa¬151a05¬BC616249¬1048576¬¬¬
|
||||
¬moo¬C.O.W. Boys of Moo Mesa¬moo¬C.O.W. Boys of Moo Mesa¬151a13¬4771F525¬2097152¬¬¬
|
||||
¬moo¬C.O.W. Boys of Moo Mesa¬moo¬C.O.W. Boys of Moo Mesa¬151a12¬4978555F¬2097152¬¬¬
|
||||
¬moo¬C.O.W. Boys of Moo Mesa¬moo¬C.O.W. Boys of Moo Mesa¬151a11¬E7F49225¬2097152¬¬¬
|
||||
¬moo¬C.O.W. Boys of Moo Mesa¬moo¬C.O.W. Boys of Moo Mesa¬151a10¬376C64F1¬2097152¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16722a.epr¬48B94318¬131072¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16723a.epr¬8AF8B32D¬131072¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16528.mpr¬9CE591F6¬2097152¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16529.mpr¬F7095EAF¬2097152¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16808.mpr¬44F1F5A0¬2097152¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16809.mpr¬37A2DD12¬2097152¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16724a.epr¬469F10FD¬524288¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16725a.epr¬BA0DF8DB¬524288¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16724a.epr¬469F10FD¬524288¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16725a.epr¬BA0DF8DB¬524288¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16720.epr¬8E73CFFD¬131072¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16721.epr¬1BB3B7B7¬131072¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16491.mpr¬89920903¬2097152¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16492.mpr¬459E701B¬2097152¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16493.mpr¬9990DB15¬2097152¬¬¬
|
||||
¬daytona¬Daytona USA¬daytona¬Daytona USA¬16494.mpr¬600E1D6C¬2097152¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬e19310aa.12¬06486F7A¬524288¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬e19311aa.13¬1BE62912¬524288¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19318.11¬AB431BFE¬4194304¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19319.12¬C5CB694D¬4194304¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19316.9¬2D2D1B1A¬4194304¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19317.10¬96B17BCF¬4194304¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19314.7¬A8D963FB¬4194304¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19315.8¬90AE5682¬4194304¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19312.5¬1DCEDB10¬2097152¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19313.6¬8C63055E¬2097152¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬ep19328.30¬400BDBFB¬524288¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19329.31¬8FD2708A¬2097152¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19330.32¬0C69787D¬2097152¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19331.33¬C18EA0B8¬2097152¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19332.34¬2877F96F¬2097152¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19322.17¬D0E6ECF0¬4194304¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19325.21¬7CBE432D¬4194304¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19323.18¬453D3F4A¬4194304¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19326.22¬B976DA02¬4194304¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19324.19¬D972201F¬4194304¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19327.23¬6A75634C¬4194304¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19321.27¬9C49E845¬4194304¬¬¬
|
||||
¬doa¬Dead or Alive¬doa¬Dead or Alive¬mp19320.25¬190C017F¬4194304¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬epr16976.12¬D036DFF0¬131072¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬epr16977.13¬E91194BD¬131072¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬epr16970.14¬4EA12D1F¬131072¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬epr16971.15¬D630B220¬131072¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬mpr16974.10¬2AB491C5¬2097152¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬mpr16975.11¬E24FE7D3¬2097152¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬mpr16972.8¬23E53748¬2097152¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬mpr16973.9¬77D6F509¬2097152¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬epr16978.6¬38B3E574¬524288¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬epr16979.7¬C314EB8B¬524288¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬epr16985.7¬8C4D9056¬131072¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬mpr16986.32¬559612F9¬2097152¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬mpr16988.4¬BC705875¬2097152¬¬¬
|
||||
¬desert¬Desert Tank¬desert¬Desert Tank¬mpr16989.5¬1B616B31¬2097152¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬ep19833a.15¬D99ED1B2¬524288¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬ep19834a.16¬24192BB1¬524288¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬ep19831a.13¬0527EA40¬524288¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬ep19832a.14¬2F380A40¬524288¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19841.11¬989309AF¬4194304¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19842.12¬EEC54070¬4194304¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19839.9¬D5A74CF4¬4194304¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19840.10¬45704E95¬4194304¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19837.7¬C02187D9¬4194304¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19838.8¬546B61CD¬4194304¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19835.5¬A3B0A37C¬4194304¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19836.6¬D70A32AA¬4194304¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬ep19849.31¬B0D5BFF0¬524288¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19880.32¬E1FD27BF¬2097152¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19850.33¬DC644077¬2097152¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19851.34¬CFDA4EFD¬2097152¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19853.35¬CFC64857¬2097152¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19843.17¬019BC583¬4194304¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19845.21¬2D23E73A¬4194304¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19844.18¬150198D6¬4194304¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19846.22¬FE53CD17¬4194304¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19848.27¬4C0526B7¬4194304¬¬¬
|
||||
¬dynabb¬Dynamite Baseball¬dynabb¬Dynamite Baseball¬mp19847.25¬FE55EDBD¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬ep20930.12¬B8FC8FF7¬524288¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬ep20931.13¬89D13F88¬524288¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬ep20932.14¬618A68BF¬524288¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬ep20933.15¬13ABE49C¬524288¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20797.10¬87BAB1E4¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20798.11¬40DD752B¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20795.8¬0EF85E12¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20796.9¬870139CB¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20793.6¬42EA08F8¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20794.7¬8E5CD1DB¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20791.4¬4883D0DF¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20792.5¬47BECFA2¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬ep20811.30¬A154B83E¬524288¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20812.31¬695B6088¬2097152¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20813.32¬1908679C¬2097152¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20814.36¬E8EBC74C¬2097152¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20815.37¬1B5AAAE4¬2097152¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20799.16¬424571BF¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20803.20¬61A8AD52¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20800.17¬3C2EE808¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20804.21¬03B35CB8¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20801.18¬C6914173¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20805.22¬F6605EDE¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20802.19¬D11B5267¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20806.23¬0C942073¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20809.25¬3B7B4622¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20807.24¬1241E0F2¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20810.27¬838A10A7¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynamcop¬Dynamite Cop¬mp20808.26¬706BD495¬4194304¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Ep18606d.15¬7334DE7D¬131072¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Ep18607d.16¬700D2ADE¬131072¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Ep18604d.13¬704FDFCF¬131072¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Ep18605d.14¬7DDDF81F¬131072¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18614.11¬0EBC899F¬4194304¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18615.12¬018ABDB7¬4194304¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18612.9¬1F174CD1¬4194304¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18613.10¬F057CDF2¬4194304¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Ep18610d.7¬A1871703¬524288¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Ep18611d.8¬39A75FEE¬524288¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Ep18608d.5¬5BC11881¬524288¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Ep18609d.6¬CD426035¬524288¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18622.29¬C74D99E3¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18623.30¬746AE931¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Ep18628.31¬AA7DD79F¬524288¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18629.32¬5D0006CC¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18630.33¬9D405615¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18631.34¬9DAE5B45¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18632.35¬39DA6805¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18616.17¬15A239BE¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18619.21¬9D5E8E2B¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18617.18¬A62CAB7D¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18620.22¬4D432AFD¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18618.19¬ADAB589F¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18621.23¬F5EEAA95¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18626.27¬9DF0A961¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18624.25¬1D74433E¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18627.28¬946175A0¬2097152¬¬¬
|
||||
¬fvipers¬Fighting Vipers¬fvipers¬Fighting Vipers¬Mp18625.26¬182FD572¬2097152¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬ep18988a.15¬F63F1AD2¬524288¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬ep18989a.16¬C1C84D65¬524288¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18974.11¬E29ECAFF¬4194304¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18975.12¬D8187582¬4194304¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18976.9¬C95C15EB¬4194304¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18977.10¬DB8F5B6F¬4194304¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18986.29¬04820F7B¬4194304¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18987.30¬2419367F¬4194304¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬ep18990.31¬02B1B0D1¬524288¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18978.32¬0F78B3E3¬4194304¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18979.34¬F13EA36F¬4194304¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18980.17¬22345534¬4194304¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18981.21¬2544A33D¬4194304¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18982.18¬D0A92B2A¬4194304¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18983.22¬1B4AF982¬4194304¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18985.27¬AD6166E3¬4194304¬¬¬
|
||||
¬gunblade¬GunBlade NY¬gunblade¬GunBlade NY¬mp18984.25¬756F6F37¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬ep19696.15¬03DA5623¬524288¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬ep19697.16¬A9722D87¬524288¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬ep19694.13¬E85CA1A3¬524288¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬ep19695.14¬CD52B461¬524288¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19704.11¬AA80DBB0¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19705.12¬F906843B¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19702.9¬FC8AA3B7¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19703.10¬208D993D¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19700.7¬0558CFD3¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19701.8¬224A8929¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬ep19698.5¬E7A7B6EA¬524288¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬ep19699.6¬8160B3D9¬524288¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬ep19707.29¬384FD133¬524288¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬ep19706.30¬1277531C¬524288¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬ep19720.31¬B367D21D¬524288¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19721.32¬F5D8FA9A¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19722.34¬A56FA539¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19715.17¬3FF7DDA7¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19711.21¬080D13F1¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19714.18¬3E55AB49¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19710.22¬80DF1036¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19713.19¬4D092CD3¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19709.23¬D08937BF¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19712.20¬41577943¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19708.24¬5CB790F2¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19718.27¬A9DE5924¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19716.25¬45C7DCCE¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19719.28¬838F8343¬4194304¬¬¬
|
||||
¬hotd¬House of the Dead¬hotd¬House of the Dead¬mp19717.26¬393E440B¬4194304¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬ep18254a.15¬AD0F1FC5¬524288¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬ep18255a.16¬784DAAB8¬524288¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18237.11¬37E4255A¬4194304¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18238.12¬BF837BAC¬4194304¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18239.9¬9A2DB86E¬4194304¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18240.10¬AB46A35F¬4194304¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬ep18389.7¬D22EA019¬524288¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬ep18390.8¬38E796E5¬524288¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬ep18249.29¬A399F023¬524288¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬ep18250.30¬7479AD52¬524288¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬ep18391.31¬79579B72¬262144¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18241.32¬3A380AE1¬2097152¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18242.33¬1CC3DEAE¬2097152¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18243.34¬A00A0053¬2097152¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18244.35¬BFA75BEB¬2097152¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18233.17¬48A024D3¬4194304¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18234.21¬1178BFC8¬4194304¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18235.18¬E7D70D59¬4194304¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18236.22¬6CA29E0E¬4194304¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18232.27¬F962347D¬4194304¬¬¬
|
||||
¬indy500¬Indianapolis 500¬indy500¬Indianapolis 500¬mp18231.25¬673D5338¬4194304¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbrxa¬Last Bronx (Japan, Rev A)¬ep19046a.15¬75BE7B7A¬524288¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbrxa¬Last Bronx (Japan, Rev A)¬ep19047a.16¬1F5541E2¬524288¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbrxa¬Last Bronx (Japan, Rev A)¬mp19050.11¬E6AF2B61¬4194304¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbrxa¬Last Bronx (Japan, Rev A)¬mp19051.12¬14B88961¬4194304¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbrxa¬Last Bronx (Japan, Rev A)¬mp19048.9¬02180215¬4194304¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbrxa¬Last Bronx (Japan, Rev A)¬mp19049.10¬DB7EECD6¬4194304¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbrxa¬Last Bronx (Japan, Rev A)¬mp19056.31¬22A22918¬524288¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbrxa¬Last Bronx (Japan, Rev A)¬mp19057.32¬64809438¬4194304¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbrxa¬Last Bronx (Japan, Rev A)¬mp19058.34¬E237C11C¬4194304¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbrxa¬Last Bronx (Japan, Rev A)¬mp19052.17¬D7F27216¬4194304¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbrxa¬Last Bronx (Japan, Rev A)¬mp19053.21¬1F328465¬4194304¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbrxa¬Last Bronx (Japan, Rev A)¬mp19055.27¬85A57D49¬2097152¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbrxa¬Last Bronx (Japan, Rev A)¬mp19054.25¬05366277¬2097152¬¬¬
|
||||
¬lostwrld¬Lost World¬lostwrld¬Lost World¬19940.21¬B06FFE5F¬524288¬¬¬
|
||||
¬lostwrld¬Lost World¬lostwrld¬Lost World¬mp19934.22¬C7D8E194¬4194304¬¬¬
|
||||
¬lostwrld¬Lost World¬lostwrld¬Lost World¬mp19935.24¬91C1B618¬4194304¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18822.bin¬C7B3E45A¬131072¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18823.bin¬6B0C1DFB¬131072¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18824.bin¬352BB817¬131072¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18825.bin¬F88B036C¬131072¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18751.bin¬773AD43D¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18752.bin¬4DA3719E¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18749.bin¬C3FE0EEA¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18750.bin¬40B55494¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18747.bin¬F2ECAC6F¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18748.bin¬7815D634¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18862.bin¬9ADC3A30¬524288¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18863.bin¬603742E9¬524288¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18761.bin¬4E39EC05¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18762.bin¬4AB165D8¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬ep18826.30¬ED9FE4C1¬262144¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬mp18827.31¬58D78CA1¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬mp18764.32¬0DC6A860¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬mp18765.36¬CA4A803C¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬mp18766.37¬10F3C932¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18753.bin¬33DDAA0D¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18756.bin¬E1678C59¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18754.bin¬09AABDE5¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18757.bin¬25FC92E9¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18755.bin¬FD1FA53C¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18758.bin¬1B5473D0¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18759.bin¬89D7927D¬2097152¬¬¬
|
||||
¬manxtt¬ManxTT¬manxtt¬ManxTT¬18760.bin¬4E3A4A89¬2097152¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬ep21281.pr0¬293EAD5D¬524288¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬ep21282.pr1¬ED0E7B9E¬524288¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21262.da0¬AA71353E¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21263.da1¬D55D4509¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬ep21276.sd0¬8F415BC3¬524288¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21277.sd1¬BFBA0FF6¬2097152¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21278.sd2¬27E18E08¬2097152¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21279.sd3¬3A8DCF68¬2097152¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21280.sd4¬AA548124¬2097152¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21264.tp0¬6B35204D¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21268.tp1¬16CE2147¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21265.tp2¬F061E639¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21269.tp3¬8C06255E¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21266.tp4¬F9C32021¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21270.tp5¬B61F81C3¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21267.tp6¬C42CC938¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21271.tp7¬A5325C75¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21272.tx0¬DD605C21¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21274.tx1¬F045E3D1¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21273.tx2¬722EC8A2¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkids¬Pilot Kids¬mp21275.tx3¬C4870B7C¬4194304¬¬¬
|
||||
¬scudrace¬Scud Race¬scudrace¬Scud Race¬epr19692.21¬A94F5521¬524288¬¬¬
|
||||
¬scudrace¬Scud Race¬scudrace¬Scud Race¬epr19612.2¬13978FD4¬131072¬¬¬
|
||||
¬scudrace¬Scud Race¬scudrace¬Scud Race¬mpr19670.22¬BD31CC06¬4194304¬¬¬
|
||||
¬scudrace¬Scud Race¬scudrace¬Scud Race¬mpr19671.24¬8E8526AB¬4194304¬¬¬
|
||||
¬scudrace¬Scud Race¬scudrace¬Scud Race¬mpr19603.57¬B1B1765F¬2097152¬¬¬
|
||||
¬scudrace¬Scud Race¬scudrace¬Scud Race¬mpr19604.58¬6AC85B49¬2097152¬¬¬
|
||||
¬scudrace¬Scud Race¬scudrace¬Scud Race¬mpr19605.59¬BEC891EB¬2097152¬¬¬
|
||||
¬scudrace¬Scud Race¬scudrace¬Scud Race¬mpr19606.60¬ADAD46B2¬2097152¬¬¬
|
||||
¬srally2¬Sega Rally 2¬srally2¬Sega Rally 2¬epr20636.bin¬7139EBF8¬524288¬¬¬
|
||||
¬srally2¬Sega Rally 2¬srally2¬Sega Rally 2¬epr20641.bin¬C9B82035¬131072¬¬¬
|
||||
¬srally2¬Sega Rally 2¬srally2¬Sega Rally 2¬mpr20614.bin¬A3930E4A¬4194304¬¬¬
|
||||
¬srally2¬Sega Rally 2¬srally2¬Sega Rally 2¬mpr20615.bin¬62E8A94A¬4194304¬¬¬
|
||||
¬srally2¬Sega Rally 2¬srally2¬Sega Rally 2¬mpr20637.bin¬D66E8A02¬4194304¬¬¬
|
||||
¬srally2¬Sega Rally 2¬srally2¬Sega Rally 2¬mpr20638.bin¬D1513382¬4194304¬¬¬
|
||||
¬srally2¬Sega Rally 2¬srally2¬Sega Rally 2¬mpr20639.bin¬F6603B7B¬4194304¬¬¬
|
||||
¬srally2¬Sega Rally 2¬srally2¬Sega Rally 2¬mpr20640.bin¬9EEA07B7¬4194304¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬17888.bin¬00000000¬524288¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬17889.bin¬00000000¬524288¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬17746.bin¬00000000¬2097152¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬17747.bin¬00000000¬2097152¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬17744.bin¬00000000¬2097152¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬17745.bin¬00000000¬2097152¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬17884.bin¬00000000¬2097152¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬17885.bin¬00000000¬2097152¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬17754.bin¬81A84F67¬2097152¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬17755.bin¬2A6E7DA4¬2097152¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬ep17890.30¬5BAC3FA1¬262144¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬mp17856.31¬7725F111¬2097152¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬mp17857.32¬1616E649¬2097152¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬mp17886.33¬54A72923¬2097152¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyc¬Sega Rally Championship¬mp17887.34¬38C31FDD¬2097152¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬ep19272a.15¬20CEDD05¬524288¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬ep19273a.16¬1B0AB4D6¬524288¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19257.11¬AC28EE24¬4194304¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19258.12¬F5BA7D78¬4194304¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬ep19270.9¬7BD1D04E¬524288¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬ep19271.10¬D2D74F85¬524288¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19255.29¬D78BF030¬2097152¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19256.30¬CB2B2D9E¬2097152¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬ep19274.31¬2DCC08AE¬131072¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬ep19275.2s¬EE809D3F¬131072¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬ep18643a.7¬B5E048EC¬131072¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19259.32¬4D55DBFC¬4194304¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19261.34¬B88878FF¬4194304¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19262.57s¬922AED7A¬2097152¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19263.58s¬A256F4CD¬2097152¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19264.59s¬B6C51D0F¬2097152¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19265.60s¬7D98700A¬2097152¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19251.17¬E06FF7BA¬4194304¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19252.21¬68509993¬4194304¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬ep19266.18¬41464EE2¬524288¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬ep19267.22¬780F994D¬524288¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19254.27¬1EC49C02¬2097152¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬mp19253.25¬41BA79FB¬2097152¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬ep19269.28¬01881121¬524288¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stcc¬Sega Touring Car Championship¬ep19268.26¬BC4E081C¬524288¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Ep18406.12¬FDE9C00A¬524288¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Ep18407.13¬35F8B529¬524288¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18415.10¬D7A1BBD7¬4194304¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18416.11¬B77C9243¬4194304¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18417.8¬A0D03F63¬4194304¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18418.9¬C7A6F97F¬4194304¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Ep18404.6¬F1407EC4¬524288¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Ep18405.7¬00B40F9E¬524288¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18420.28¬92B87817¬2097152¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18419.29¬74542D87¬2097152¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Ep18408.30¬6DEB9657¬524288¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18424.31¬590A4338¬2097152¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18423.32¬C356D765¬2097152¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18422.36¬B4F3CEA6¬2097152¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18421.37¬00522390¬2097152¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18413.16¬1C4D416C¬4194304¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18409.20¬666037EF¬4194304¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18414.17¬858885BA¬4194304¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18410.21¬B821A695¬4194304¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18411.24¬9C2DC40C¬4194304¬¬¬
|
||||
¬skytargt¬Sky Target¬skytargt¬Sky Target¬Mp18412.25¬4DB52F8B¬4194304¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬ep19001.15¬9B088511¬524288¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬ep19002.16¬46F510DA¬524288¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19007.11¬8B8FF751¬4194304¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19008.12¬A94654F5¬4194304¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19005.9¬98CD1127¬4194304¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19006.10¬E79F0A26¬4194304¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19015.29¬C74D99E3¬2097152¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19016.30¬746AE931¬2097152¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬ep19003.7¬63BAE5C5¬524288¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬ep19004.8¬C10C9F39¬524288¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬ep19021.31¬0B9F7583¬524288¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19022.32¬4381869B¬2097152¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19023.33¬07C67F88¬2097152¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19024.34¬15FF76D3¬2097152¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19025.35¬6AD8FB70¬2097152¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19009.17¬FD410350¬4194304¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19012.21¬9BB7B5B6¬4194304¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19010.18¬6FD94187¬4194304¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19013.22¬9E232FE5¬4194304¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19019.27¬59121896¬4194304¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19017.25¬7B298379¬4194304¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19020.28¬9540DBA0¬4194304¬¬¬
|
||||
¬schamp¬Sonic Championship¬schamp¬Sonic Championship¬mp19018.26¬3B7E7A12¬4194304¬¬¬
|
||||
¬sgt24h¬Super GT 24h¬sgt24h¬Super GT 24h¬ep19155.15¬593952FD¬524288¬¬¬
|
||||
¬sgt24h¬Super GT 24h¬sgt24h¬Super GT 24h¬ep19156.16¬A91FC4EE¬524288¬¬¬
|
||||
¬sgt24h¬Super GT 24h¬sgt24h¬Super GT 24h¬mp19146.11¬D66B5B0F¬4194304¬¬¬
|
||||
¬sgt24h¬Super GT 24h¬sgt24h¬Super GT 24h¬mp19147.12¬D5558F48¬4194304¬¬¬
|
||||
¬sgt24h¬Super GT 24h¬sgt24h¬Super GT 24h¬mp19148.9¬A14C86DB¬4194304¬¬¬
|
||||
¬sgt24h¬Super GT 24h¬sgt24h¬Super GT 24h¬mp19149.10¬94EF5849¬4194304¬¬¬
|
||||
¬sgt24h¬Super GT 24h¬sgt24h¬Super GT 24h¬ep18643a.7¬B5E048EC¬131072¬¬¬
|
||||
¬sgt24h¬Super GT 24h¬sgt24h¬Super GT 24h¬ep19157.31¬8FFEA0CF¬524288¬¬¬
|
||||
¬sgt24h¬Super GT 24h¬sgt24h¬Super GT 24h¬mp19154.32¬7CD9E679¬4194304¬¬¬
|
||||
¬sgt24h¬Super GT 24h¬sgt24h¬Super GT 24h¬mp19150.17¬E0AD870E¬4194304¬¬¬
|
||||
¬sgt24h¬Super GT 24h¬sgt24h¬Super GT 24h¬mp19151.21¬E2A1B125¬4194304¬¬¬
|
||||
¬sgt24h¬Super GT 24h¬sgt24h¬Super GT 24h¬mp19153.27¬136ADFD0¬2097152¬¬¬
|
||||
¬sgt24h¬Super GT 24h¬sgt24h¬Super GT 24h¬mp19152.25¬363769A2¬2097152¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬ep19755a.15¬B80633B9¬524288¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬ep19756a.16¬472046A2¬524288¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19735.11¬8E509266¬4194304¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19736.12¬094E0A0D¬4194304¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19737.9¬281A7DDE¬4194304¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19738.10¬F688327E¬4194304¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19743.29¬D41A41BF¬2097152¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19744.30¬84F203BF¬2097152¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19759.31¬573530F2¬524288¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19760.2s¬2E41CA15¬131072¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19745.32¬7082A0AF¬4194304¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19746.34¬657B5977¬4194304¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19747.18s¬6E895AAA¬4194304¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19748.20s¬FCD74DE3¬4194304¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19749.22s¬842CA1EB¬4194304¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19750.24s¬CD95D0BF¬4194304¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19741.17¬111A6E29¬2097152¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19742.21¬28510AFF¬2097152¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19740.27¬B20F508B¬4194304¬¬¬
|
||||
¬topskatr¬Top Skater¬topskatr¬Top Skater¬mp19739.25¬8120CFD8¬4194304¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬ep17166b.12¬A5647C59¬131072¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬ep17167b.13¬F5DDE26A¬131072¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬ep17160a.14¬267F3242¬131072¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬ep17161a.15¬F7126876¬131072¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬mp17164.10¬AC5FC501¬2097152¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬mp17165.11¬82296D00¬2097152¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬mp17162.8¬60DDD41E¬2097152¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬mp17163.9¬8C1F9DC8¬2097152¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬ep17168a.6¬59091A37¬524288¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬ep17169a.7¬0495808D¬524288¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬ep17170.7¬06A38AE2¬131072¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬ep17171.8¬B5E436F8¬131072¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬mp17172.32¬AB22CAC3¬1048576¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬mp17173.33¬3CB4005C¬1048576¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬mp17174.4¬A50369CC¬2097152¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬mp17175.5¬9136D43C¬2097152¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬mp17159.16¬E218727D¬2097152¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬mp17156.20¬C4F4AABF¬2097152¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬mp17157.24¬CF31E33D¬2097152¬¬¬
|
||||
¬vcop¬Virtua Cop¬vcop¬Virtua Cop¬mp17158.25¬1108D1EC¬2097152¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18524.bin¬1858988B¬524288¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18525.bin¬0C13DF3F¬524288¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18518.bin¬7842951B¬524288¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18519.bin¬31A30EDC¬524288¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18516.bin¬A3928FF0¬2097152¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18517.bin¬4BD73DA4¬2097152¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18514.bin¬791283C5¬2097152¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18515.bin¬6BA1FFEC¬2097152¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18522.bin¬61D18536¬2097152¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18523.bin¬61D08DC4¬2097152¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18520.bin¬1D4EC5E8¬524288¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18521.bin¬B8B3781C¬524288¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬ep18530.30¬AC9C8357¬524288¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬mp18429.31¬F76715B1¬2097152¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬mp18428.32¬287A2F9A¬2097152¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬mp18427.33¬E6A49314¬2097152¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬mp18426.34¬6516D9B5¬2097152¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18510.bin¬083F5186¬2097152¬¬¬
|
||||
¬vcop2¬Virtua Cop 2¬vcop2¬Virtua Cop 2¬18513.bin¬777A3633¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17568.b¬5D966BBF¬131072¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17569.b¬0B8C1CCC¬131072¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17562.b¬B778D4EB¬131072¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17563.b¬A05C15F6¬131072¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17560¬D1389864¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17561¬B98D0101¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17558¬4B15F5A6¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17559¬D3264DE6¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17566¬FB41EF98¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17567¬C3396922¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17564¬D8062489¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17565¬0517C6E9¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17574.30¬4D4C3A55¬524288¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17573.31¬E43557FE¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17572.32¬4FEBECC8¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17571.33¬D22DC8CA¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17570.34¬BCCD324B¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17554¬27896D82¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17548¬C95FACC2¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17555¬4DF2810B¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17549¬E0BCE0E6¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17556¬41A47616¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17550¬C36FF3F5¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17552¬E91E7427¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17553¬5DA1C5D3¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17546¬042A194B¬2097152¬¬¬
|
||||
¬vf2¬Virtua Fighter 2¬vf2¬Virtua Fighter 2¬mp17547¬BE940431¬2097152¬¬¬
|
||||
¬vf3¬Virtua Fighter 3¬vf3¬Virtua Fighter 3¬ep19231.21¬B416FE96¬524288¬¬¬
|
||||
¬vf3¬Virtua Fighter 3¬vf3¬Virtua Fighter 3¬mpr19209.22¬3715E38C¬4194304¬¬¬
|
||||
¬vf3¬Virtua Fighter 3¬vf3¬Virtua Fighter 3¬mpr19210.24¬C03D6502¬4194304¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬ep18068.15¬74A47795¬131072¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬ep18069.16¬F6C3FCBF¬131072¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬ep18066.13¬E774229E¬131072¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬ep18067.14¬7DFD950C¬131072¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬mp18055.11¬5ABA9FC0¬2097152¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬mp18056.12¬017F0C55¬2097152¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬mp18053.9¬46C770C8¬2097152¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬mp18054.10¬437AF66E¬2097152¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬ep18070.7¬F52E4DB5¬524288¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬ep18071.8¬1BE63A7D¬524288¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬ep18072.31¬73EABB58¬131072¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬mp18063.32¬B74D7C8A¬2097152¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬mp18064.33¬783B9910¬2097152¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬mp18065.34¬046B55FE¬2097152¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬mp18057.17¬890D8806¬2097152¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬mp18059.21¬C5CDF534¬2097152¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬mp18058.18¬D4CBDF7C¬2097152¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬mp18060.22¬93D5C95F¬2097152¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬mp18062.27¬126E7DE3¬2097152¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstriker¬Virtua Striker¬mp18061.25¬C37F1C67¬2097152¬¬¬
|
||||
¬vs2¬Virtua Striker 2¬vs2¬Virtua Striker 2¬epr19807.bin¬9641CBAF¬524288¬¬¬
|
||||
¬vs2¬Virtua Striker 2¬vs2¬Virtua Striker 2¬mpr19785.bin¬E7D190E3¬4194304¬¬¬
|
||||
¬vs2¬Virtua Striker 2¬vs2¬Virtua Striker 2¬mpr19786.bin¬B08D889B¬4194304¬¬¬
|
||||
¬vs298¬Virtua Striker 2 '98¬vs298¬Virtua Striker 2 '98¬epr20921.bin¬30F032A7¬524288¬¬¬
|
||||
¬vs298¬Virtua Striker 2 '98¬vs298¬Virtua Striker 2 '98¬mpr20903.bin¬E343E131¬4194304¬¬¬
|
||||
¬vs298¬Virtua Striker 2 '98¬vs298¬Virtua Striker 2 '98¬mpr20904.bin¬21A91B84¬4194304¬¬¬
|
||||
¬vs299¬Virtua Striker 2 '99¬vs299¬Virtua Striker 2 '99¬epr21539.bin¬A1D3E00E¬524288¬¬¬
|
||||
¬vs299¬Virtua Striker 2 '99¬vs299¬Virtua Striker 2 '99¬mpr21513.bin¬CCA1CC00¬4194304¬¬¬
|
||||
¬vs299¬Virtua Striker 2 '99¬vs299¬Virtua Striker 2 '99¬mpr21514.bin¬6CEDD292¬4194304¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬ep18664b.15¬27D0172C¬524288¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬ep18665b.16¬2F0142EE¬524288¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬ep18666.13¬66EDB432¬524288¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬ep18667.14¬B593D31F¬524288¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18648.11¬2EDBE489¬4194304¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18649.12¬E68C5AA6¬4194304¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18650.9¬89A855B9¬4194304¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18651.10¬F4C23107¬4194304¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18662.29¬A33D3335¬2097152¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18663.30¬EA74A641¬2097152¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬ep18643a.7¬B5E048EC¬131072¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬ep18670.31¬3E715F76¬524288¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18652.32¬037EEE53¬4194304¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18653.34¬9EC3E7BF¬4194304¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18654.17¬6A0CAF29¬4194304¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18655.21¬A4293E78¬4194304¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18656.18¬B4F51E76¬4194304¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18657.22¬A9BE4674¬4194304¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18660.27¬E53663E5¬2097152¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18658.25¬3D0FCD01¬2097152¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18661.28¬52B50410¬2097152¬¬¬
|
||||
¬von¬Virtual ON¬von¬Virtual ON¬mp18659.26¬27AA8AE2¬2097152¬¬¬
|
||||
¬von2¬Virtual ON 2¬von2¬Virtual ON 2¬SROM0-4M.U21¬FA084DE5¬524288¬¬¬
|
||||
¬von2¬Virtual ON 2¬von2¬Virtual ON 2¬SROM1-32.U22¬977EB6A4¬4194304¬¬¬
|
||||
¬von2¬Virtual ON 2¬von2¬Virtual ON 2¬SROM3-32.U24¬0EFC0CA8¬4194304¬¬¬
|
||||
¬von2¬Virtual ON 2¬von2¬Virtual ON 2¬SROM2.U23¬89F21281¬2097152¬¬¬
|
||||
¬von2¬Virtual ON 2¬von2¬Virtual ON 2¬SROM4.U25¬B7C1BEBF¬2097152¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zerogun¬Zero Gunner¬ep20439.15¬10125381¬524288¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zerogun¬Zero Gunner¬ep20440.16¬CE872747¬524288¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zerogun¬Zero Gunner¬mp20296.11¬072D8A5E¬4194304¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zerogun¬Zero Gunner¬mp20297.12¬BA6A825B¬4194304¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zerogun¬Zero Gunner¬mp20294.9¬A0BD1474¬4194304¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zerogun¬Zero Gunner¬mp20295.10¬C548CCED¬4194304¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zerogun¬Zero Gunner¬ep20302.31¬44FF50D2¬524288¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zerogun¬Zero Gunner¬mp20303.32¬C040973F¬2097152¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zerogun¬Zero Gunner¬mp20304.33¬6DECFE83¬2097152¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zerogun¬Zero Gunner¬mp20298.17¬8AB782FC¬4194304¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zerogun¬Zero Gunner¬mp20299.21¬90E20CDB¬4194304¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zerogun¬Zero Gunner¬mp20301.27¬52010FB2¬2097152¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zerogun¬Zero Gunner¬mp20300.25¬6F042792¬2097152¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬buckyua¬Bucky O'Hare (US)¬q5¬DCAECCA0¬262144¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬buckyua¬Bucky O'Hare (US)¬q6¬E3C856A6¬262144¬¬¬
|
||||
¬bucky¬Bucky O'Hare¬buckyua¬Bucky O'Hare (US)¬t5¬CD724026¬131072¬bucky¬t5¬
|
||||
¬bucky¬Bucky O'Hare¬buckyua¬Bucky O'Hare (US)¬t6¬7DD54D6F¬131072¬bucky¬t6¬
|
||||
¬bucky¬Bucky O'Hare¬buckyua¬Bucky O'Hare (US)¬173.a07¬4CDAEE71¬262144¬bucky¬173.a07¬
|
||||
¬bucky¬Bucky O'Hare¬buckyua¬Bucky O'Hare (US)¬173a08.b6¬DCDDED95¬2097152¬bucky¬173a08.b6¬
|
||||
¬bucky¬Bucky O'Hare¬buckyua¬Bucky O'Hare (US)¬173a09.a6¬C93697C4¬2097152¬bucky¬173a09.a6¬
|
||||
¬bucky¬Bucky O'Hare¬buckyua¬Bucky O'Hare (US)¬173a06.t10¬6541A34F¬1048576¬bucky¬173a06.t10¬
|
||||
¬bucky¬Bucky O'Hare¬buckyua¬Bucky O'Hare (US)¬173a05.t8¬D14333B4¬1048576¬bucky¬173a05.t8¬
|
||||
¬bucky¬Bucky O'Hare¬buckyua¬Bucky O'Hare (US)¬173a18.a10¬4CF85439¬2097152¬bucky¬173a18.a10¬
|
||||
¬bucky¬Bucky O'Hare¬buckyua¬Bucky O'Hare (US)¬173a12.b10¬0FC2AD24¬2097152¬bucky¬173a12.b10¬
|
||||
¬bucky¬Bucky O'Hare¬buckyua¬Bucky O'Hare (US)¬173a11.a8¬B0D747C4¬2097152¬bucky¬173a11.a8¬
|
||||
¬bucky¬Bucky O'Hare¬buckyua¬Bucky O'Hare (US)¬173a10.b8¬42FB0A0C¬2097152¬bucky¬173a10.b8¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬turbo_a¬AEC6857A¬131072¬¬¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬turbo_b¬CB657EDC¬131072¬¬¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16528.mpr¬9CE591F6¬2097152¬daytona¬16528.mpr¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16529.mpr¬F7095EAF¬2097152¬daytona¬16529.mpr¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16808.mpr¬44F1F5A0¬2097152¬daytona¬16808.mpr¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16809.mpr¬37A2DD12¬2097152¬daytona¬16809.mpr¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16724a.epr¬469F10FD¬524288¬daytona¬16724a.epr¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16725a.epr¬BA0DF8DB¬524288¬daytona¬16725a.epr¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16724a.epr¬469F10FD¬524288¬daytona¬16724a.epr¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16725a.epr¬BA0DF8DB¬524288¬daytona¬16725a.epr¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16720.epr¬8E73CFFD¬131072¬daytona¬16720.epr¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16721.epr¬1BB3B7B7¬131072¬daytona¬16721.epr¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16491.mpr¬89920903¬2097152¬daytona¬16491.mpr¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16492.mpr¬459E701B¬2097152¬daytona¬16492.mpr¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16493.mpr¬9990DB15¬2097152¬daytona¬16493.mpr¬
|
||||
¬daytona¬Daytona USA¬daytntus¬Daytona USA Turbo¬16494.mpr¬600E1D6C¬2097152¬daytona¬16494.mpr¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬maxx.12¬604EF2D9¬131072¬¬¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬maxx.13¬7D319970¬131072¬¬¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬maxx.14¬2DEBFCE0¬131072¬¬¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16528.mpr¬9CE591F6¬2097152¬¬¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16529.mpr¬F7095EAF¬2097152¬¬¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16808.mpr¬44F1F5A0¬2097152¬¬¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16809.mpr¬37A2DD12¬2097152¬¬¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16724a.epr¬469F10FD¬524288¬¬¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16725a.epr¬BA0DF8DB¬524288¬¬¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16724a.epr¬469F10FD¬524288¬¬¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16725a.epr¬BA0DF8DB¬524288¬¬¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16720.epr¬8E73CFFD¬131072¬daytona¬16720.epr¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16721.epr¬1BB3B7B7¬131072¬daytona¬16721.epr¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16491.mpr¬89920903¬2097152¬daytona¬16491.mpr¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16492.mpr¬459E701B¬2097152¬daytona¬16492.mpr¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16493.mpr¬9990DB15¬2097152¬daytona¬16493.mpr¬
|
||||
¬daytona¬Daytona USA¬daytnmax¬Daytona USA to the Maxx¬16494.mpr¬600E1D6C¬2097152¬daytona¬16494.mpr¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬ep19379b.15¬8A10A944¬524288¬¬¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬ep19380b.16¬766C1EC8¬524288¬¬¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19318.11¬AB431BFE¬4194304¬doa¬mp19318.11¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19319.12¬C5CB694D¬4194304¬doa¬mp19319.12¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19316.9¬2D2D1B1A¬4194304¬doa¬mp19316.9¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19317.10¬96B17BCF¬4194304¬doa¬mp19317.10¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19314.7¬A8D963FB¬4194304¬doa¬mp19314.7¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19315.8¬90AE5682¬4194304¬doa¬mp19315.8¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19312.5¬1DCEDB10¬2097152¬doa¬mp19312.5¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19313.6¬8C63055E¬2097152¬doa¬mp19313.6¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬ep19328.30¬400BDBFB¬524288¬doa¬ep19328.30¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19329.31¬8FD2708A¬2097152¬doa¬mp19329.31¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19330.32¬0C69787D¬2097152¬doa¬mp19330.32¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19331.33¬C18EA0B8¬2097152¬doa¬mp19331.33¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19332.34¬2877F96F¬2097152¬doa¬mp19332.34¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19322.17¬D0E6ECF0¬4194304¬doa¬mp19322.17¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19325.21¬7CBE432D¬4194304¬doa¬mp19325.21¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19323.18¬453D3F4A¬4194304¬doa¬mp19323.18¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19326.22¬B976DA02¬4194304¬doa¬mp19326.22¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19324.19¬D972201F¬4194304¬doa¬mp19324.19¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19327.23¬6A75634C¬4194304¬doa¬mp19327.23¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19321.27¬9C49E845¬4194304¬doa¬mp19321.27¬
|
||||
¬doa¬Dead or Alive¬doab¬Dead or Alive (Model 2B)¬mp19320.25¬190C017F¬4194304¬doa¬mp19320.25¬
|
||||
¬dragwld2¬Dragon World 2¬dragwld2¬Dragon World 2¬pgm_bios.rom¬E42B166E¬131072¬pgmbios¬pgm_bios.rom¬
|
||||
¬dragwld2¬Dragon World 2¬dragwld2¬Dragon World 2¬V-100C.u2¬67467981¬524288¬¬¬
|
||||
¬dragwld2¬Dragon World 2¬dragwld2¬Dragon World 2¬pgm_m01s.rom¬45AE7159¬2097152¬pgmbios¬pgm_m01s.rom¬
|
||||
¬dragwld2¬Dragon World 2¬dragwld2¬Dragon World 2¬pgm_t01s.rom¬1A7123A0¬2097152¬pgmbios¬pgm_t01s.rom¬
|
||||
¬dragwld2¬Dragon World 2¬dragwld2¬Dragon World 2¬pgmt0200.u7¬B0F6534D¬4194304¬¬¬
|
||||
¬dragwld2¬Dragon World 2¬dragwld2¬Dragon World 2¬pgmb0200.u9¬932D0F13¬4194304¬¬¬
|
||||
¬dragwld2¬Dragon World 2¬dragwld2¬Dragon World 2¬pgma0200.u5¬13B95069¬4194304¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬progrom0.15¬29B142F2¬524288¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬progrom1.16¬C495912E¬524288¬¬¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬ep20932.14¬618A68BF¬524288¬dynamcop¬ep20932.14¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬ep20933.15¬13ABE49C¬524288¬dynamcop¬ep20933.15¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20797.10¬87BAB1E4¬4194304¬dynamcop¬mp20797.10¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20798.11¬40DD752B¬4194304¬dynamcop¬mp20798.11¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20795.8¬0EF85E12¬4194304¬dynamcop¬mp20795.8¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20796.9¬870139CB¬4194304¬dynamcop¬mp20796.9¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20793.6¬42EA08F8¬4194304¬dynamcop¬mp20793.6¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20794.7¬8E5CD1DB¬4194304¬dynamcop¬mp20794.7¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20791.4¬4883D0DF¬4194304¬dynamcop¬mp20791.4¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20792.5¬47BECFA2¬4194304¬dynamcop¬mp20792.5¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬ep20811.30¬A154B83E¬524288¬dynamcop¬ep20811.30¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20812.31¬695B6088¬2097152¬dynamcop¬mp20812.31¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20813.32¬1908679C¬2097152¬dynamcop¬mp20813.32¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20814.36¬E8EBC74C¬2097152¬dynamcop¬mp20814.36¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20815.37¬1B5AAAE4¬2097152¬dynamcop¬mp20815.37¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20799.16¬424571BF¬4194304¬dynamcop¬mp20799.16¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20803.20¬61A8AD52¬4194304¬dynamcop¬mp20803.20¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20800.17¬3C2EE808¬4194304¬dynamcop¬mp20800.17¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20804.21¬03B35CB8¬4194304¬dynamcop¬mp20804.21¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20801.18¬C6914173¬4194304¬dynamcop¬mp20801.18¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20805.22¬F6605EDE¬4194304¬dynamcop¬mp20805.22¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20802.19¬D11B5267¬4194304¬dynamcop¬mp20802.19¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20806.23¬0C942073¬4194304¬dynamcop¬mp20806.23¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20809.25¬3B7B4622¬4194304¬dynamcop¬mp20809.25¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20807.24¬1241E0F2¬4194304¬dynamcop¬mp20807.24¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20810.27¬838A10A7¬4194304¬dynamcop¬mp20810.27¬
|
||||
¬dynamcop¬Dynamite Cop¬dynmcopb¬Dynamite Cop (Model 2B)¬mp20808.26¬706BD495¬4194304¬dynamcop¬mp20808.26¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov115¬Knights of Valour (Rev 115)¬pgm_bios.rom¬E42B166E¬131072¬kov¬pgm_bios.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov115¬Knights of Valour (Rev 115)¬p0600.115¬527A2924¬4194304¬¬¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov115¬Knights of Valour (Rev 115)¬pgm_m01s.rom¬45AE7159¬2097152¬kov¬pgm_m01s.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov115¬Knights of Valour (Rev 115)¬m0600.rom¬3ADA4FD6¬4194304¬kov¬m0600.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov115¬Knights of Valour (Rev 115)¬pgm_t01s.rom¬1A7123A0¬2097152¬kov¬pgm_t01s.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov115¬Knights of Valour (Rev 115)¬t0600.rom¬4ACC1AD6¬8388608¬kov¬t0600.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov115¬Knights of Valour (Rev 115)¬b0600.rom¬7D3CD059¬8388608¬kov¬b0600.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov115¬Knights of Valour (Rev 115)¬b0601.rom¬A0BB1C2F¬4194304¬kov¬b0601.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov115¬Knights of Valour (Rev 115)¬a0600.rom¬D8167834¬8388608¬kov¬a0600.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov115¬Knights of Valour (Rev 115)¬a0601.rom¬FF7A4373¬8388608¬kov¬a0601.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov115¬Knights of Valour (Rev 115)¬a0602.rom¬E7A32959¬8388608¬kov¬a0602.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov115¬Knights of Valour (Rev 115)¬a0613.rom¬EC31ABDA¬4194304¬kov¬a0613.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov¬Knights of Valour (Rev 117)¬pgm_bios.rom¬E42B166E¬131072¬pgmbios¬pgm_bios.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov¬Knights of Valour (Rev 117)¬p0600.rom¬C4D19FE6¬4194304¬¬¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov¬Knights of Valour (Rev 117)¬pgm_m01s.rom¬45AE7159¬2097152¬pgmbios¬pgm_m01s.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov¬Knights of Valour (Rev 117)¬m0600.rom¬3ADA4FD6¬4194304¬¬¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov¬Knights of Valour (Rev 117)¬pgm_t01s.rom¬1A7123A0¬2097152¬pgmbios¬pgm_t01s.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov¬Knights of Valour (Rev 117)¬t0600.rom¬4ACC1AD6¬8388608¬¬¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov¬Knights of Valour (Rev 117)¬b0600.rom¬7D3CD059¬8388608¬¬¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov¬Knights of Valour (Rev 117)¬b0601.rom¬A0BB1C2F¬4194304¬¬¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov¬Knights of Valour (Rev 117)¬a0600.rom¬D8167834¬8388608¬¬¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov¬Knights of Valour (Rev 117)¬a0601.rom¬FF7A4373¬8388608¬¬¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov¬Knights of Valour (Rev 117)¬a0602.rom¬E7A32959¬8388608¬¬¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kov¬Knights of Valour (Rev 117)¬a0613.rom¬EC31ABDA¬4194304¬¬¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kovplus¬Knights of Valour Plus (Rev 119)¬pgm_bios.rom¬E42B166E¬131072¬kov¬pgm_bios.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kovplus¬Knights of Valour Plus (Rev 119)¬p0600.119¬E4B0875D¬4194304¬¬¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kovplus¬Knights of Valour Plus (Rev 119)¬pgm_m01s.rom¬45AE7159¬2097152¬kov¬pgm_m01s.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kovplus¬Knights of Valour Plus (Rev 119)¬m0600.rom¬3ADA4FD6¬4194304¬kov¬m0600.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kovplus¬Knights of Valour Plus (Rev 119)¬pgm_t01s.rom¬1A7123A0¬2097152¬kov¬pgm_t01s.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kovplus¬Knights of Valour Plus (Rev 119)¬t0600.rom¬4ACC1AD6¬8388608¬kov¬t0600.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kovplus¬Knights of Valour Plus (Rev 119)¬b0600.rom¬7D3CD059¬8388608¬kov¬b0600.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kovplus¬Knights of Valour Plus (Rev 119)¬b0601.rom¬A0BB1C2F¬4194304¬kov¬b0601.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kovplus¬Knights of Valour Plus (Rev 119)¬a0600.rom¬D8167834¬8388608¬kov¬a0600.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kovplus¬Knights of Valour Plus (Rev 119)¬a0601.rom¬FF7A4373¬8388608¬kov¬a0601.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kovplus¬Knights of Valour Plus (Rev 119)¬a0602.rom¬E7A32959¬8388608¬kov¬a0602.rom¬
|
||||
¬kov¬Knights of Valour (Rev 117)¬kovplus¬Knights of Valour Plus (Rev 119)¬a0613.rom¬EC31ABDA¬4194304¬kov¬a0613.rom¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbexp¬Last Bronx (Export, Rev A)¬ep19061a.15¬C0AEBAB2¬524288¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbexp¬Last Bronx (Export, Rev A)¬ep19062a.16¬CDF597E8¬524288¬¬¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbexp¬Last Bronx (Export, Rev A)¬mp19050.11¬E6AF2B61¬4194304¬lastbrxa¬mp19050.11¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbexp¬Last Bronx (Export, Rev A)¬mp19051.12¬14B88961¬4194304¬lastbrxa¬mp19051.12¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbexp¬Last Bronx (Export, Rev A)¬mp19048.9¬02180215¬4194304¬lastbrxa¬mp19048.9¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbexp¬Last Bronx (Export, Rev A)¬mp19049.10¬DB7EECD6¬4194304¬lastbrxa¬mp19049.10¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbexp¬Last Bronx (Export, Rev A)¬mp19056.31¬22A22918¬524288¬lastbrxa¬mp19056.31¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbexp¬Last Bronx (Export, Rev A)¬mp19057.32¬64809438¬4194304¬lastbrxa¬mp19057.32¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbexp¬Last Bronx (Export, Rev A)¬mp19058.34¬E237C11C¬4194304¬lastbrxa¬mp19058.34¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbexp¬Last Bronx (Export, Rev A)¬mp19052.17¬D7F27216¬4194304¬lastbrxa¬mp19052.17¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbexp¬Last Bronx (Export, Rev A)¬mp19053.21¬1F328465¬4194304¬lastbrxa¬mp19053.21¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbexp¬Last Bronx (Export, Rev A)¬mp19055.27¬85A57D49¬2097152¬lastbrxa¬mp19055.27¬
|
||||
¬lastbrxa¬Last Bronx (Japan, Rev A)¬lastbexp¬Last Bronx (Export, Rev A)¬mp19054.25¬05366277¬2097152¬lastbrxa¬mp19054.25¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬pgm_bios.rom¬E42B166E¬131072¬orlegend¬pgm_bios.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬p0101.160¬B24F0C1E¬2097152¬¬¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬pgm_m01s.rom¬45AE7159¬2097152¬orlegend¬pgm_m01s.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬m0100.rom¬E5C36C83¬2097152¬orlegend¬m0100.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬pgm_t01s.rom¬1A7123A0¬2097152¬orlegend¬pgm_t01s.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬t0100.rom¬61425E1E¬4194304¬orlegend¬t0100.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬b0100.rom¬69D2E48C¬4194304¬orlegend¬b0100.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬b0101.rom¬0D587BF3¬4194304¬orlegend¬b0101.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬b0102.rom¬43823C1E¬4194304¬orlegend¬b0102.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬a0100.rom¬8B3BD88A¬4194304¬orlegend¬a0100.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬a0101.rom¬3B9E9644¬4194304¬orlegend¬a0101.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬a0102.rom¬069E2C38¬4194304¬orlegend¬a0102.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬a0103.rom¬4460A3FD¬4194304¬orlegend¬a0103.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬a0104.rom¬5F8ABB56¬4194304¬orlegend¬a0104.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegndc¬Oriental Legend (Rev 112 Chinese)¬a0105.rom¬A17A7147¬4194304¬orlegend¬a0105.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬pgm_bios.rom¬E42B166E¬131072¬orlegend¬pgm_bios.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬p0102.rom¬4D0F6CC5¬2097152¬¬¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬pgm_m01s.rom¬45AE7159¬2097152¬orlegend¬pgm_m01s.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬m0100.rom¬E5C36C83¬2097152¬orlegend¬m0100.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬pgm_t01s.rom¬1A7123A0¬2097152¬orlegend¬pgm_t01s.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬t0100.rom¬61425E1E¬4194304¬orlegend¬t0100.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬b0100.rom¬69D2E48C¬4194304¬orlegend¬b0100.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬b0101.rom¬0D587BF3¬4194304¬orlegend¬b0101.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬b0102.rom¬43823C1E¬4194304¬orlegend¬b0102.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬a0100.rom¬8B3BD88A¬4194304¬orlegend¬a0100.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬a0101.rom¬3B9E9644¬4194304¬orlegend¬a0101.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬a0102.rom¬069E2C38¬4194304¬orlegend¬a0102.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬a0103.rom¬4460A3FD¬4194304¬orlegend¬a0103.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬a0104.rom¬5F8ABB56¬4194304¬orlegend¬a0104.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegnde¬Oriental Legend (Rev 112)¬a0105.rom¬A17A7147¬4194304¬orlegend¬a0105.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬pgm_bios.rom¬E42B166E¬131072¬pgmbios¬pgm_bios.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬p0103.rom¬D5E93543¬2097152¬¬¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬pgm_m01s.rom¬45AE7159¬2097152¬pgmbios¬pgm_m01s.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬m0100.rom¬E5C36C83¬2097152¬¬¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬pgm_t01s.rom¬1A7123A0¬2097152¬pgmbios¬pgm_t01s.rom¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬t0100.rom¬61425E1E¬4194304¬¬¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬b0100.rom¬69D2E48C¬4194304¬¬¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬b0101.rom¬0D587BF3¬4194304¬¬¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬b0102.rom¬43823C1E¬4194304¬¬¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬a0100.rom¬8B3BD88A¬4194304¬¬¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬a0101.rom¬3B9E9644¬4194304¬¬¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬a0102.rom¬069E2C38¬4194304¬¬¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬a0103.rom¬4460A3FD¬4194304¬¬¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬a0104.rom¬5F8ABB56¬4194304¬¬¬
|
||||
¬orlegend¬Oriental Legend (Rev 126)¬orlegend¬Oriental Legend (Rev 126)¬a0105.rom¬A17A7147¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬ep21285a.15¬BDDE5B41¬524288¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬ep21286a.16¬C8092E0E¬524288¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21262.da0¬AA71353E¬4194304¬pltkids¬mp21262.da0¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21263.da1¬D55D4509¬4194304¬pltkids¬mp21263.da1¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬ep21276.sd0¬8F415BC3¬524288¬pltkids¬ep21276.sd0¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21277.sd1¬BFBA0FF6¬2097152¬pltkids¬mp21277.sd1¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21278.sd2¬27E18E08¬2097152¬pltkids¬mp21278.sd2¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21279.sd3¬3A8DCF68¬2097152¬pltkids¬mp21279.sd3¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21280.sd4¬AA548124¬2097152¬pltkids¬mp21280.sd4¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21264.tp0¬6B35204D¬4194304¬pltkids¬mp21264.tp0¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21268.tp1¬16CE2147¬4194304¬pltkids¬mp21268.tp1¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21265.tp2¬F061E639¬4194304¬pltkids¬mp21265.tp2¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21269.tp3¬8C06255E¬4194304¬pltkids¬mp21269.tp3¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21266.tp4¬F9C32021¬4194304¬pltkids¬mp21266.tp4¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21270.tp5¬B61F81C3¬4194304¬pltkids¬mp21270.tp5¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21267.tp6¬C42CC938¬4194304¬pltkids¬mp21267.tp6¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21271.tp7¬A5325C75¬4194304¬pltkids¬mp21271.tp7¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21274.tx1¬F045E3D1¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21272.tx0¬DD605C21¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21275.tx3¬C4870B7C¬4194304¬¬¬
|
||||
¬pltkids¬Pilot Kids¬pltkidsb¬Pilot Kids (Rev A,Model 2B)¬mp21273.tx2¬722EC8A2¬4194304¬¬¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬ic12.bin¬00000000¬524288¬srallyc¬17888.bin¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬ic13.bin¬00000000¬524288¬srallyc¬17889.bin¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬17746.bin¬00000000¬2097152¬srallyc¬17746.bin¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬17747.bin¬00000000¬2097152¬srallyc¬17747.bin¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬17744.bin¬00000000¬2097152¬srallyc¬17744.bin¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬17745.bin¬00000000¬2097152¬srallyc¬17745.bin¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬17884.bin¬00000000¬2097152¬srallyc¬17884.bin¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬17885.bin¬00000000¬2097152¬srallyc¬17885.bin¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬17754.bin¬81A84F67¬2097152¬srallyc¬17754.bin¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬17755.bin¬2A6E7DA4¬2097152¬srallyc¬17755.bin¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬ep17890.30¬5BAC3FA1¬262144¬srallyc¬ep17890.30¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬mp17856.31¬7725F111¬2097152¬srallyc¬mp17856.31¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬mp17857.32¬1616E649¬2097152¬srallyc¬mp17857.32¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬mp17886.33¬54A72923¬2097152¬srallyc¬mp17886.33¬
|
||||
¬srallyc¬Sega Rally Championship¬srallyp¬Sega Rally Pro Drivin¬mp17887.34¬38C31FDD¬2097152¬srallyc¬mp17887.34¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬SEGA-TC.U15¬EFDFB625¬524288¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬SEGA-TC.U16¬61A357D9¬524288¬¬¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬mp19257.11¬AC28EE24¬4194304¬stcc¬mp19257.11¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬mp19258.12¬F5BA7D78¬4194304¬stcc¬mp19258.12¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬ep19270.9¬7BD1D04E¬524288¬stcc¬ep19270.9¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬ep19271.10¬D2D74F85¬524288¬stcc¬ep19271.10¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬mp19255.29¬D78BF030¬2097152¬stcc¬mp19255.29¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬mp19256.30¬CB2B2D9E¬2097152¬stcc¬mp19256.30¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬ep19274.31¬2DCC08AE¬131072¬stcc¬ep19274.31¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬mp19259.32¬4D55DBFC¬4194304¬stcc¬mp19259.32¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬mp19261.34¬B88878FF¬4194304¬stcc¬mp19261.34¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬mp19251.17¬E06FF7BA¬4194304¬stcc¬mp19251.17¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬mp19252.21¬68509993¬4194304¬stcc¬mp19252.21¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬ep19266.18¬41464EE2¬524288¬stcc¬ep19266.18¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬ep19267.22¬780F994D¬524288¬stcc¬ep19267.22¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬mp19254.27¬1EC49C02¬2097152¬stcc¬mp19254.27¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬mp19253.25¬41BA79FB¬2097152¬stcc¬mp19253.25¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬ep19269.28¬01881121¬524288¬stcc¬ep19269.28¬
|
||||
¬stcc¬Sega Touring Car Championship¬stccb¬Sega Touring Car Championship (Rev B)¬ep19268.26¬BC4E081C¬524288¬stcc¬ep19268.26¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬ep18068a.15¬AFC69B54¬131072¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬ep18069a.16¬0243250C¬131072¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬ep18066a.13¬E658B33A¬131072¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬ep18067a.14¬49E94047¬131072¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬mp18055.11¬5ABA9FC0¬2097152¬vstriker¬mp18055.11¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬mp18056.12¬017F0C55¬2097152¬vstriker¬mp18056.12¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬mp18053.9¬46C770C8¬2097152¬vstriker¬mp18053.9¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬mp18054.10¬437AF66E¬2097152¬vstriker¬mp18054.10¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬ep18070a.7¬1961E2FC¬524288¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬ep18071a.8¬B2492DCA¬524288¬¬¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬ep18072.31¬73EABB58¬131072¬vstriker¬ep18072.31¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬mp18063.32¬B74D7C8A¬2097152¬vstriker¬mp18063.32¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬mp18064.33¬783B9910¬2097152¬vstriker¬mp18064.33¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬mp18065.34¬046B55FE¬2097152¬vstriker¬mp18065.34¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬mp18057.17¬890D8806¬2097152¬vstriker¬mp18057.17¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬mp18059.21¬C5CDF534¬2097152¬vstriker¬mp18059.21¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬mp18058.18¬D4CBDF7C¬2097152¬vstriker¬mp18058.18¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬mp18060.22¬93D5C95F¬2097152¬vstriker¬mp18060.22¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬mp18062.27¬126E7DE3¬2097152¬vstriker¬mp18062.27¬
|
||||
¬vstriker¬Virtua Striker¬vstrikra¬Virtua Striker (Rev A)¬mp18061.25¬C37F1C67¬2097152¬vstriker¬mp18061.25¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬vo-prog0.usa¬6499CC59¬524288¬¬¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬vo-prog1.usa¬0053B10F¬524288¬¬¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬ep18666.13¬66EDB432¬524288¬von¬ep18666.13¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬ep18667.14¬B593D31F¬524288¬von¬ep18667.14¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18648.11¬2EDBE489¬4194304¬von¬mp18648.11¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18649.12¬E68C5AA6¬4194304¬von¬mp18649.12¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18650.9¬89A855B9¬4194304¬von¬mp18650.9¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18651.10¬F4C23107¬4194304¬von¬mp18651.10¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18662.29¬A33D3335¬2097152¬von¬mp18662.29¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18663.30¬EA74A641¬2097152¬von¬mp18663.30¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬ep18643a.7¬B5E048EC¬131072¬von¬ep18643a.7¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬ep18670.31¬3E715F76¬524288¬von¬ep18670.31¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18652.32¬037EEE53¬4194304¬von¬mp18652.32¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18653.34¬9EC3E7BF¬4194304¬von¬mp18653.34¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18654.17¬6A0CAF29¬4194304¬von¬mp18654.17¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18655.21¬A4293E78¬4194304¬von¬mp18655.21¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18656.18¬B4F51E76¬4194304¬von¬mp18656.18¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18657.22¬A9BE4674¬4194304¬von¬mp18657.22¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18660.27¬E53663E5¬2097152¬von¬mp18660.27¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18658.25¬3D0FCD01¬2097152¬von¬mp18658.25¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18661.28¬52B50410¬2097152¬von¬mp18661.28¬
|
||||
¬von¬Virtual ON¬vonusa¬Virtual ON (USA)¬mp18659.26¬27AA8AE2¬2097152¬von¬mp18659.26¬
|
||||
¬zerogun¬Zero Gunner¬zeroguna¬Zero Gunner (Model 2A)¬ep20437¬FAD30CC0¬524288¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zeroguna¬Zero Gunner (Model 2A)¬ep20438¬CA364408¬524288¬¬¬
|
||||
¬zerogun¬Zero Gunner¬zeroguna¬Zero Gunner (Model 2A)¬mp20296.11¬072D8A5E¬4194304¬zerogun¬mp20296.11¬
|
||||
¬zerogun¬Zero Gunner¬zeroguna¬Zero Gunner (Model 2A)¬mp20297.12¬BA6A825B¬4194304¬zerogun¬mp20297.12¬
|
||||
¬zerogun¬Zero Gunner¬zeroguna¬Zero Gunner (Model 2A)¬mp20294.9¬A0BD1474¬4194304¬zerogun¬mp20294.9¬
|
||||
¬zerogun¬Zero Gunner¬zeroguna¬Zero Gunner (Model 2A)¬mp20295.10¬C548CCED¬4194304¬zerogun¬mp20295.10¬
|
||||
¬zerogun¬Zero Gunner¬zeroguna¬Zero Gunner (Model 2A)¬ep20302.31¬44FF50D2¬524288¬zerogun¬ep20302.31¬
|
||||
¬zerogun¬Zero Gunner¬zeroguna¬Zero Gunner (Model 2A)¬mp20303.32¬C040973F¬2097152¬zerogun¬mp20303.32¬
|
||||
¬zerogun¬Zero Gunner¬zeroguna¬Zero Gunner (Model 2A)¬mp20304.33¬6DECFE83¬2097152¬zerogun¬mp20304.33¬
|
||||
¬zerogun¬Zero Gunner¬zeroguna¬Zero Gunner (Model 2A)¬mp20298.17¬8AB782FC¬4194304¬zerogun¬mp20298.17¬
|
||||
¬zerogun¬Zero Gunner¬zeroguna¬Zero Gunner (Model 2A)¬mp20299.21¬90E20CDB¬4194304¬zerogun¬mp20299.21¬
|
||||
¬zerogun¬Zero Gunner¬zeroguna¬Zero Gunner (Model 2A)¬mp20301.27¬52010FB2¬2097152¬zerogun¬mp20301.27¬
|
||||
¬zerogun¬Zero Gunner¬zeroguna¬Zero Gunner (Model 2A)¬mp20300.25¬6F042792¬2097152¬zerogun¬mp20300.25¬
|
||||
100
SabreTools.Serialization.Test/TestData/test-sfv-files.sfv
Normal file
100
SabreTools.Serialization.Test/TestData/test-sfv-files.sfv
Normal file
@@ -0,0 +1,100 @@
|
||||
Barney Bear Goes to School (USA) (Track 01).bin c2b0380c
|
||||
Barney Bear Goes to School (USA) (Track 02).bin c5a453dc
|
||||
Barney Bear Goes to School (USA) (Track 03).bin ace9996c
|
||||
Barney Bear Goes to School (USA) (Track 04).bin 6f40b0b0
|
||||
Barney Bear Goes to School (USA) (Track 05).bin 8ac376dc
|
||||
Barney Bear Goes to School (USA) (Track 06).bin c645a24b
|
||||
Barney Bear Goes to School (USA) (Track 07).bin d94cf99c
|
||||
Barney Bear Goes to School (USA) (Track 08).bin cbbd68c0
|
||||
Barney Bear Goes to School (USA) (Track 09).bin f0fc14c8
|
||||
Barney Bear Goes to School (USA) (Track 10).bin acf0a9a5
|
||||
Barney Bear Goes to School (USA) (Track 11).bin 5b331b57
|
||||
Barney Bear Goes to School (USA) (Track 12).bin b9b64ec0
|
||||
Barney Bear Goes to School (USA) (Track 13).bin d6851dee
|
||||
Barney Bear Goes to School (USA) (Track 14).bin 037889d2
|
||||
Barney Bear Goes to School (USA) (Track 15).bin f3d32cea
|
||||
Barney Bear Goes to School (USA) (Track 16).bin 3ccd6a90
|
||||
Barney Bear Goes to School (USA) (Track 17).bin feeb7b3e
|
||||
Barney Bear Goes to School (USA) (Track 18).bin 9400c912
|
||||
Barney Bear Goes to School (USA) (Track 19).bin 31b6478a
|
||||
Barney Bear Goes to School (USA) (Track 20).bin ed18d3d0
|
||||
Barney Bear Goes to School (USA) (Track 21).bin 6aca0fd9
|
||||
Barney Bear Goes to School (USA) (Track 22).bin 1f4c00d4
|
||||
Barney Bear Goes to School (USA) (Track 23).bin ce9c3836
|
||||
Barney Bear Goes to School (USA) (Track 24).bin 14a52799
|
||||
Barney Bear Goes to School (USA) (Track 25).bin b8735a03
|
||||
Barney Bear Goes to School (USA) (Track 26).bin f489cd1f
|
||||
Barney Bear Goes to School (USA) (Track 27).bin bbb1166b
|
||||
Barney Bear Goes to School (USA) (Track 28).bin 991e15c5
|
||||
Barney Bear Goes to School (USA) (Track 29).bin 7649e2b4
|
||||
Barney Bear Goes to School (USA) (Track 30).bin 6902b486
|
||||
Barney Bear Goes to School (USA) (Track 31).bin f154b6a4
|
||||
Barney Bear Goes to School (USA) (Track 32).bin 58dbf520
|
||||
Barney Bear Goes to School (USA) (Track 33).bin 8ff80802
|
||||
Barney Bear Goes to School (USA) (Track 34).bin 8b54c487
|
||||
Barney Bear Goes to School (USA) (Track 35).bin c8de569a
|
||||
Barney Bear Goes to School (USA) (Track 36).bin 7cdecfde
|
||||
Barney Bear Goes to School (USA) (Track 37).bin 601727ad
|
||||
Barney Bear Goes to School (USA) (Track 38).bin 807f518e
|
||||
Barney Bear Goes to School (USA) (Track 39).bin e5048ba4
|
||||
Barney Bear Goes to School (USA) (Track 40).bin de2bcb80
|
||||
Barney Bear Goes to School (USA) (Track 41).bin 9025a637
|
||||
Barney Bear Goes to School (USA) (Track 42).bin df40bb50
|
||||
Barney Bear Goes to School (USA) (Track 43).bin 01f0c4b3
|
||||
Barney Bear Goes to School (USA) (Track 44).bin 8b4242b2
|
||||
Barney Bear Goes to School (USA) (Track 45).bin 7876d09b
|
||||
Barney Bear Goes to School (USA) (Track 46).bin 9428abad
|
||||
Barney Bear Goes to School (USA) (Track 47).bin 9d893258
|
||||
Barney Bear Goes to School (USA) (Track 48).bin 51aac16b
|
||||
Barney Bear Goes to School (USA) (Track 49).bin 362fa379
|
||||
Barney Bear Goes to School (USA) (Track 50).bin e4d8ecaa
|
||||
Barney Bear Goes to School (USA) (Track 51).bin f08992b3
|
||||
Barney Bear Goes to School (USA) (Track 52).bin 3c8d4367
|
||||
Barney Bear Goes to School (USA) (Track 53).bin 87954cbc
|
||||
Barney Bear Goes to School (USA) (Track 54).bin ec086f32
|
||||
Barney Bear Goes to School (USA) (Track 55).bin c394fa0f
|
||||
Barney Bear Goes to School (USA) (Track 56).bin 3ad4671d
|
||||
Barney Bear Goes to School (USA) (Track 57).bin 333cacef
|
||||
Barney Bear Goes to School (USA) (Track 58).bin cbfcb5d7
|
||||
Barney Bear Goes to School (USA) (Track 59).bin 504777c6
|
||||
Barney Bear Goes to School (USA) (Track 60).bin 1fa823d3
|
||||
Barney Bear Goes to School (USA) (Track 61).bin 24ee30bb
|
||||
Barney Bear Goes to School (USA) (Track 62).bin 660b6ef0
|
||||
Barney Bear Goes to School (USA) (Track 63).bin f666dcd5
|
||||
Barney Bear Goes to School (USA) (Track 64).bin e32633c6
|
||||
Barney Bear Goes to School (USA) (Track 65).bin 2188de3b
|
||||
Barney Bear Goes to School (USA) (Track 66).bin f91dd564
|
||||
Barney Bear Goes to School (USA) (Track 67).bin 37bf5c5b
|
||||
Barney Bear Goes to School (USA) (Track 68).bin 668ed023
|
||||
Barney Bear Goes to School (USA) (Track 69).bin 5518673c
|
||||
Barney Bear Goes to School (USA) (Track 70).bin e439b914
|
||||
Barney Bear Goes to School (USA) (Track 71).bin 56ee347d
|
||||
Barney Bear Goes to School (USA) (Track 72).bin 4be41c59
|
||||
Barney Bear Goes to School (USA) (Track 73).bin 5a115f81
|
||||
Barney Bear Goes to School (USA) (Track 74).bin 11634540
|
||||
Barney Bear Goes to School (USA) (Track 75).bin 476bb94b
|
||||
Barney Bear Goes to School (USA) (Track 76).bin 6826e507
|
||||
Barney Bear Goes to School (USA) (Track 77).bin 305f858f
|
||||
Barney Bear Goes to School (USA) (Track 78).bin 08502ef6
|
||||
Barney Bear Goes to School (USA) (Track 79).bin a8aa910e
|
||||
Barney Bear Goes to School (USA) (Track 80).bin e02d0ab2
|
||||
Barney Bear Goes to School (USA) (Track 81).bin d49c10fa
|
||||
Barney Bear Goes to School (USA) (Track 82).bin 068d3b79
|
||||
Barney Bear Goes to School (USA) (Track 83).bin 1e893985
|
||||
Barney Bear Goes to School (USA) (Track 84).bin f4a1fa93
|
||||
Barney Bear Goes to School (USA) (Track 85).bin 4602f294
|
||||
Barney Bear Goes to School (USA) (Track 86).bin 5a128907
|
||||
Barney Bear Goes to School (USA) (Track 87).bin f07cd311
|
||||
Barney Bear Goes to School (USA) (Track 88).bin f05e95f7
|
||||
Barney Bear Goes to School (USA) (Track 89).bin 4a349918
|
||||
Barney Bear Goes to School (USA) (Track 90).bin 86946adb
|
||||
Barney Bear Goes to School (USA) (Track 91).bin 8cb842ec
|
||||
Barney Bear Goes to School (USA) (Track 92).bin 25a06f44
|
||||
Barney Bear Goes to School (USA) (Track 93).bin 103f23af
|
||||
Barney Bear Goes to School (USA) (Track 94).bin 37ab546f
|
||||
Barney Bear Goes to School (USA) (Track 95).bin 96f61b43
|
||||
Barney Bear Goes to School (USA) (Track 96).bin 3cf5c0a6
|
||||
Barney Bear Goes to School (USA) (Track 97).bin 3f9148ea
|
||||
Barney Bear Goes to School (USA) (Track 98).bin 4fd7ddae
|
||||
Barney Bear Goes to School (USA) (Track 99).bin fab012e6
|
||||
Barney Bear Goes to School (USA).cue ac37e95b
|
||||
100
SabreTools.Serialization.Test/TestData/test-sha1-files.sha1
Normal file
100
SabreTools.Serialization.Test/TestData/test-sha1-files.sha1
Normal file
@@ -0,0 +1,100 @@
|
||||
552497c13fc47fa14a7b626bf6b01de6020e091a *Barney Bear Goes to School (USA) (Track 01).bin
|
||||
d2bbb8e2d902bab9d2326c358da0f89076ba86ac *Barney Bear Goes to School (USA) (Track 02).bin
|
||||
14c9d68301fd1116bf929d26119cf34c03889af3 *Barney Bear Goes to School (USA) (Track 03).bin
|
||||
3d494d1975bd89a10e1f17dc5ac0a1f5827c32f2 *Barney Bear Goes to School (USA) (Track 04).bin
|
||||
c80bae6ba28fc9e7c45ef3228903c0b3b06d384f *Barney Bear Goes to School (USA) (Track 05).bin
|
||||
059bcbad79f1d3455f3bc75befebaad9ad3f9324 *Barney Bear Goes to School (USA) (Track 06).bin
|
||||
7960707b46957df2cabb8fa154bf033e31580b2c *Barney Bear Goes to School (USA) (Track 07).bin
|
||||
452e78d923ac63e02b0b165a1e1c986734ebba61 *Barney Bear Goes to School (USA) (Track 08).bin
|
||||
cf189c32133d62df96c3ce0a36288113da823aa7 *Barney Bear Goes to School (USA) (Track 09).bin
|
||||
a1434029702c0b353d8306c7e9950819ba5267db *Barney Bear Goes to School (USA) (Track 10).bin
|
||||
ce4fc5f66808d0fe367e68f880431498f6b478fb *Barney Bear Goes to School (USA) (Track 11).bin
|
||||
3e80a154316a345fb127ca37ba6b8b72c750e4e6 *Barney Bear Goes to School (USA) (Track 12).bin
|
||||
50ff9c0f8e9b0a87e5b36e2ecc0f3f1508784675 *Barney Bear Goes to School (USA) (Track 13).bin
|
||||
0762ef8f6905f45acf8c4ae4054ab60a6cf7c073 *Barney Bear Goes to School (USA) (Track 14).bin
|
||||
ad67f5ca5844d75c592fad8f12336d3133a183b4 *Barney Bear Goes to School (USA) (Track 15).bin
|
||||
0920f59fd541026fe4d0d795bc7b6c57a36ad91f *Barney Bear Goes to School (USA) (Track 16).bin
|
||||
3309dab66316e075faf4893f55ff0798ae2f88cc *Barney Bear Goes to School (USA) (Track 17).bin
|
||||
3c69e6c6973218c427eb1a1e9a345f68e6b49fc6 *Barney Bear Goes to School (USA) (Track 18).bin
|
||||
4f5cf49b310c832252127b12cc2b0df229180359 *Barney Bear Goes to School (USA) (Track 19).bin
|
||||
7ab59b64684c10884fcf6c9ecc043dc7a5153841 *Barney Bear Goes to School (USA) (Track 20).bin
|
||||
3a278ff89146499e6a7e7e25909305d1cfa5fb80 *Barney Bear Goes to School (USA) (Track 21).bin
|
||||
0b92f885a17fc0553927f9fa0cacf1da6b6b7b39 *Barney Bear Goes to School (USA) (Track 22).bin
|
||||
8669634838d19a7032e8526e038bd399bfdf9b57 *Barney Bear Goes to School (USA) (Track 23).bin
|
||||
6912d94ded87afb74bcca87806f3f72bf4702b9d *Barney Bear Goes to School (USA) (Track 24).bin
|
||||
9ed5776b573c700ab26c32a459a0fd1a00485328 *Barney Bear Goes to School (USA) (Track 25).bin
|
||||
9efdff891f55eca95a02b348d66c35980ad968de *Barney Bear Goes to School (USA) (Track 26).bin
|
||||
d2a421fd7018b6eed013cbe61b8ee2070eb2aceb *Barney Bear Goes to School (USA) (Track 27).bin
|
||||
90442878e2556a87b57c321641e708e8ad93a471 *Barney Bear Goes to School (USA) (Track 28).bin
|
||||
e2fda0b201b406190a1917ed7efd00e79d272efb *Barney Bear Goes to School (USA) (Track 29).bin
|
||||
76cb82eb26e66fa432e268fe43911fc708cbb6ee *Barney Bear Goes to School (USA) (Track 30).bin
|
||||
b69ef59ca3a9826c4137c59a5eb30f3e305f9b30 *Barney Bear Goes to School (USA) (Track 31).bin
|
||||
2bde2c5a8f0d74c6bd083dd1cb5377be2070524d *Barney Bear Goes to School (USA) (Track 32).bin
|
||||
54d4a3f7869786899393d4fb67fbe03e40626330 *Barney Bear Goes to School (USA) (Track 33).bin
|
||||
9e52d519d4579ebac2d3da9c5ce0669eddb19cfe *Barney Bear Goes to School (USA) (Track 34).bin
|
||||
ee811b8c5f8f60e3398148a79d195ae2848d8e4c *Barney Bear Goes to School (USA) (Track 35).bin
|
||||
e27350c280c69b7c11bd44267a539073fb0b77fc *Barney Bear Goes to School (USA) (Track 36).bin
|
||||
d5089422ddfce443abf69ec23befb210c9062077 *Barney Bear Goes to School (USA) (Track 37).bin
|
||||
835924566f39f4d8c64094d1ed863937917e0707 *Barney Bear Goes to School (USA) (Track 38).bin
|
||||
4abf1743a011b3183f0b057ebeccc163fa0f3045 *Barney Bear Goes to School (USA) (Track 39).bin
|
||||
c150b686dda96233048b0f1d29ccea071daf9f01 *Barney Bear Goes to School (USA) (Track 40).bin
|
||||
640d9918d448bce59be2e1ef52e5b82587613b23 *Barney Bear Goes to School (USA) (Track 41).bin
|
||||
ce62fdb5a9f32b9292b787ac51e04d7498f11964 *Barney Bear Goes to School (USA) (Track 42).bin
|
||||
23d147665661a130d1f073467cf6f6f0704f4d7b *Barney Bear Goes to School (USA) (Track 43).bin
|
||||
6b4349b5279a92f428e349abebce438cd965810c *Barney Bear Goes to School (USA) (Track 44).bin
|
||||
85b3d934c062498f3090538d6da6a3c63d089508 *Barney Bear Goes to School (USA) (Track 45).bin
|
||||
302edc1ad287fa0df75b4c86307ac747f8df4a24 *Barney Bear Goes to School (USA) (Track 46).bin
|
||||
2de127469e98e4fa7bfe00bbb882007fcdb12856 *Barney Bear Goes to School (USA) (Track 47).bin
|
||||
e6b1ae9d4e5f281afe8b6c3defed0431dcb99b91 *Barney Bear Goes to School (USA) (Track 48).bin
|
||||
893cb6ade428f689b38a125d275379bf31aee8d3 *Barney Bear Goes to School (USA) (Track 49).bin
|
||||
8358d5170b00b4d09c56b8a28c828ebba1d5adf7 *Barney Bear Goes to School (USA) (Track 50).bin
|
||||
2b423bf03c9c49dc0be0175c8c3299012d364200 *Barney Bear Goes to School (USA) (Track 51).bin
|
||||
12a6097937de5d869b27d7a8238da8340f438ade *Barney Bear Goes to School (USA) (Track 52).bin
|
||||
84698a6f846de2a779a81a8b93cbbcbc9036a8dc *Barney Bear Goes to School (USA) (Track 53).bin
|
||||
4061e1f7258a0c87cb23336e4f64cbaf4cdd254d *Barney Bear Goes to School (USA) (Track 54).bin
|
||||
cc8f53b24f138fc21a23b019a437368289a4c265 *Barney Bear Goes to School (USA) (Track 55).bin
|
||||
7b763ba759342e15eb2ccc4d98acbc01cca3ca39 *Barney Bear Goes to School (USA) (Track 56).bin
|
||||
f630af7d1e49a95ab428bdb74126f81b62730912 *Barney Bear Goes to School (USA) (Track 57).bin
|
||||
17e48a7e1a32b85977eb7b8ad4fae85d8c42bf86 *Barney Bear Goes to School (USA) (Track 58).bin
|
||||
10d5b198c8499ebfd41d68eb6c8de18b2e69e65f *Barney Bear Goes to School (USA) (Track 59).bin
|
||||
47185af038c1d83ab89317010050afa512bc2886 *Barney Bear Goes to School (USA) (Track 60).bin
|
||||
f5bd27601429f2f716e65ab2f897d5197717ede8 *Barney Bear Goes to School (USA) (Track 61).bin
|
||||
199f76e7ed30f85009e05a5525b23f0e89995a91 *Barney Bear Goes to School (USA) (Track 62).bin
|
||||
0cab20ff575958d3c81728c90c891e10f715e0af *Barney Bear Goes to School (USA) (Track 63).bin
|
||||
e335f003aea9e9e813cf5e426bc72f07ec768b17 *Barney Bear Goes to School (USA) (Track 64).bin
|
||||
e99995125809473a9a3bfcefcec7e4da1d4f797b *Barney Bear Goes to School (USA) (Track 65).bin
|
||||
97afb5a41008b20e1bcccdac76936f49d9a749eb *Barney Bear Goes to School (USA) (Track 66).bin
|
||||
53be03dfca426ac80378b10d0e36a33e9c11d776 *Barney Bear Goes to School (USA) (Track 67).bin
|
||||
3d9a3eaa86603918ebe477ae28bacfc304fe5425 *Barney Bear Goes to School (USA) (Track 68).bin
|
||||
9da2fdf58468db4b780b57c5b2076e481d7698ed *Barney Bear Goes to School (USA) (Track 69).bin
|
||||
5e2855cf17f0d2030ea88aa95ce23caa210a3510 *Barney Bear Goes to School (USA) (Track 70).bin
|
||||
d3b7ac10d5ad278d395c0728d93d83e731f93967 *Barney Bear Goes to School (USA) (Track 71).bin
|
||||
06af05085066a2d57fdf0bfd1426567e740372c7 *Barney Bear Goes to School (USA) (Track 72).bin
|
||||
52149d8d53a03d0cee85cc4e4df1b82e5ac88e10 *Barney Bear Goes to School (USA) (Track 73).bin
|
||||
85f6ad48de39dfbc87aa4fa46ba016984aa8c679 *Barney Bear Goes to School (USA) (Track 74).bin
|
||||
a2791067722c9b0f3da80ed06b264498dd98ff15 *Barney Bear Goes to School (USA) (Track 75).bin
|
||||
c7313b864bc7d8577bfb9f51fc3c78d21f531816 *Barney Bear Goes to School (USA) (Track 76).bin
|
||||
4213b728f776ce2c9794249f0e606e374d8360a9 *Barney Bear Goes to School (USA) (Track 77).bin
|
||||
c820dff0bb7701b713e23349b0fd7f7ab4665fdd *Barney Bear Goes to School (USA) (Track 78).bin
|
||||
3d9e1093945b295cb55cad9677670596f662795d *Barney Bear Goes to School (USA) (Track 79).bin
|
||||
ae9a1f294ef937e5d55a879a1902aa8977363c14 *Barney Bear Goes to School (USA) (Track 80).bin
|
||||
0d2590dfa441e56044b2a10a43a9db970874030f *Barney Bear Goes to School (USA) (Track 81).bin
|
||||
d60d6f2e180d66167eaf33263939b7955f86d5f5 *Barney Bear Goes to School (USA) (Track 82).bin
|
||||
15cbcf935c605fdb99052b5d21733eeb77ddd72b *Barney Bear Goes to School (USA) (Track 83).bin
|
||||
001f27aebd72128158b2d5b7a48d8f713dde7c95 *Barney Bear Goes to School (USA) (Track 84).bin
|
||||
2a67600411c22a58f721b3da5a289957f9f52f65 *Barney Bear Goes to School (USA) (Track 85).bin
|
||||
4e42e0e0adb78d3917bc38b5101e7a973d7238b6 *Barney Bear Goes to School (USA) (Track 86).bin
|
||||
4a190ced3513bfce98e3c93dbdb774ecf8b1d6aa *Barney Bear Goes to School (USA) (Track 87).bin
|
||||
2325d30fe9ce608a5c6982c7c02185e6f97fab63 *Barney Bear Goes to School (USA) (Track 88).bin
|
||||
7fc6e6263f54c245770ddb9a541e323036f67d2c *Barney Bear Goes to School (USA) (Track 89).bin
|
||||
b3e79071a649e2492a9f7937e062ad57454858a1 *Barney Bear Goes to School (USA) (Track 90).bin
|
||||
c2eab8f35e746dfd9335dfd67203dfeccb458de5 *Barney Bear Goes to School (USA) (Track 91).bin
|
||||
6da8c81d445b0190ba0c11ef44dc181b48981eb3 *Barney Bear Goes to School (USA) (Track 92).bin
|
||||
58c0f25bdc479a7c7ab63324fa8e5257aee4ec30 *Barney Bear Goes to School (USA) (Track 93).bin
|
||||
ff55b21f3931d8f2a7685a207a95088445eb31cd *Barney Bear Goes to School (USA) (Track 94).bin
|
||||
78497cb64ca43645e14a21129329982e7138f802 *Barney Bear Goes to School (USA) (Track 95).bin
|
||||
6df2447ce0fd01e7db56a23942c0ae72200f3a97 *Barney Bear Goes to School (USA) (Track 96).bin
|
||||
13134fa895412372ba243b161965c978e23f6fd2 *Barney Bear Goes to School (USA) (Track 97).bin
|
||||
360703189c7756f774ac4c26d4f381ae1d1b5b07 *Barney Bear Goes to School (USA) (Track 98).bin
|
||||
43b2ab2a65d451f0527c1572f1308430148c96e3 *Barney Bear Goes to School (USA) (Track 99).bin
|
||||
48d2d7269050249dc7a2e5881177778359a6345b *Barney Bear Goes to School (USA).cue
|
||||
@@ -0,0 +1 @@
|
||||
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad rom.bin
|
||||
@@ -0,0 +1 @@
|
||||
cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7 rom.bin
|
||||
@@ -0,0 +1 @@
|
||||
ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f rom.bin
|
||||
6113
SabreTools.Serialization.Test/TestData/test-smdb-files.txt
Normal file
6113
SabreTools.Serialization.Test/TestData/test-smdb-files.txt
Normal file
File diff suppressed because it is too large
Load Diff
88108
SabreTools.Serialization.Test/TestData/test-softwarelist-files1.xml
Normal file
88108
SabreTools.Serialization.Test/TestData/test-softwarelist-files1.xml
Normal file
File diff suppressed because it is too large
Load Diff
69933
SabreTools.Serialization.Test/TestData/test-softwarelist-files2.xml
Normal file
69933
SabreTools.Serialization.Test/TestData/test-softwarelist-files2.xml
Normal file
File diff suppressed because it is too large
Load Diff
11445
SabreTools.Serialization.Test/TestData/test-softwarelist-files3.xml
Normal file
11445
SabreTools.Serialization.Test/TestData/test-softwarelist-files3.xml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
||||
QXX rom.bin
|
||||
@@ -0,0 +1,3 @@
|
||||
File Name;Internal Name;Description;Game Name;Game Description;Type;Rom Name;Disk Name;Size;CRC;MD5;SHA1;SHA256;Nodump
|
||||
Original DatFile Name.xml;Original DatFile Name;Original DatFile;Game;A cool game;Rom;file.bin;;12345;0;d41d8cd98f00b204e9800998ecf8427e;da39a3ee5e6b4b0d3255bfef95601890afd80709;ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad;No
|
||||
Original DatFile Name.xml;Original DatFile Name;Original DatFile;Game;A cool game;Disk;;file.chd;;;;da39a3ee5e6b4b0d3255bfef95601890afd80709;;No
|
||||
@@ -0,0 +1,3 @@
|
||||
File Name;Internal Name;Description;Game Name;Game Description;Type;Rom Name;Disk Name;Size;CRC;MD5;SHA1;SHA256;SHA384;SHA512;SpamSum;Nodump
|
||||
Original DatFile Name.xml;Original DatFile Name;Original DatFile;Game;A cool game;Rom;file.bin;;12345;0;d41d8cd98f00b204e9800998ecf8427e;da39a3ee5e6b4b0d3255bfef95601890afd80709;ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad;cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7;ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f;QXX;No
|
||||
Original DatFile Name.xml;Original DatFile Name;Original DatFile;Game;A cool game;Disk;;file.chd;;;;da39a3ee5e6b4b0d3255bfef95601890afd80709;;;;;No
|
||||
@@ -0,0 +1,3 @@
|
||||
File Name Internal Name Description Game Name Game Description Type Rom Name Disk Name Size CRC MD5 SHA1 SHA256 Nodump
|
||||
Original DatFile Name.xml Original DatFile Name Original DatFile Game A cool game Rom file.bin 12345 0 d41d8cd98f00b204e9800998ecf8427e da39a3ee5e6b4b0d3255bfef95601890afd80709 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad No
|
||||
Original DatFile Name.xml Original DatFile Name Original DatFile Game A cool game Disk file.chd da39a3ee5e6b4b0d3255bfef95601890afd80709 No
|
||||
|
@@ -0,0 +1,3 @@
|
||||
File Name Internal Name Description Game Name Game Description Type Rom Name Disk Name Size CRC MD5 SHA1 SHA256 SHA384 SHA512 SpamSum Nodump
|
||||
Original DatFile Name.xml Original DatFile Name Original DatFile Game A cool game Rom file.bin 12345 0 d41d8cd98f00b204e9800998ecf8427e da39a3ee5e6b4b0d3255bfef95601890afd80709 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7 ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f QXX No
|
||||
Original DatFile Name.xml Original DatFile Name Original DatFile Game A cool game Disk file.chd da39a3ee5e6b4b0d3255bfef95601890afd80709 No
|
||||
|
@@ -5,7 +5,9 @@ VisualStudioVersion = 17.0.31903.59
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Serialization", "SabreTools.Serialization\SabreTools.Serialization.csproj", "{5B688801-5F36-483E-B2E8-F219BA5923A2}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "Test\Test.csproj", "{F3DEE31A-4726-464C-A90C-C19D78F51898}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InfoPrint", "InfoPrint\InfoPrint.csproj", "{F3DEE31A-4726-464C-A90C-C19D78F51898}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Serialization.Test", "SabreTools.Serialization.Test\SabreTools.Serialization.Test.csproj", "{B8A04C5E-A14F-4842-9035-2F6871A1DA10}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@@ -24,5 +26,9 @@ Global
|
||||
{F3DEE31A-4726-464C-A90C-C19D78F51898}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F3DEE31A-4726-464C-A90C-C19D78F51898}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{F3DEE31A-4726-464C-A90C-C19D78F51898}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B8A04C5E-A14F-4842-9035-2F6871A1DA10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B8A04C5E-A14F-4842-9035-2F6871A1DA10}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B8A04C5E-A14F-4842-9035-2F6871A1DA10}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B8A04C5E-A14F-4842-9035-2F6871A1DA10}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.ArchiveDotOrg;
|
||||
using System.Collections.Generic;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
@@ -16,14 +15,13 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var files = new Models.ArchiveDotOrg.Files();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
var items = new List<Models.ArchiveDotOrg.File>();
|
||||
foreach (var machine in machines ?? [])
|
||||
{
|
||||
files.File = machines
|
||||
.Where(m => m != null)
|
||||
.SelectMany(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
items.AddRange(ConvertFromInternalModel(machine));
|
||||
}
|
||||
|
||||
files.File = [.. items];
|
||||
return files;
|
||||
}
|
||||
|
||||
@@ -36,9 +34,7 @@ namespace SabreTools.Serialization.CrossModel
|
||||
if (roms == null)
|
||||
return [];
|
||||
|
||||
return roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel).ToArray();
|
||||
return Array.ConvertAll(roms, ConvertFromInternalModel);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
@@ -16,13 +16,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
|
||||
};
|
||||
|
||||
if (item?.File != null && item.File.Any())
|
||||
if (item?.File != null && item.File.Length > 0)
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.File
|
||||
.Where(f => f != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.Where(m => m != null)
|
||||
.ToArray();
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey]
|
||||
= Array.ConvertAll(item.File, ConvertMachineToInternalModel);
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using SabreTools.Models.AttractMode;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,14 +17,13 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var metadataFile = header != null ? ConvertHeaderFromInternalModel(header) : new MetadataFile();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
var items = new List<Row>();
|
||||
foreach (var machine in machines ?? [])
|
||||
{
|
||||
metadataFile.Row = machines
|
||||
.Where(m => m != null)
|
||||
.SelectMany(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
items.AddRange(ConvertMachineFromInternalModel(machine));
|
||||
}
|
||||
|
||||
metadataFile.Row = [.. items];
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
@@ -46,13 +45,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
private static Row[] ConvertMachineFromInternalModel(Models.Metadata.Machine item)
|
||||
{
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms == null || !roms.Any())
|
||||
if (roms == null || roms.Length == 0)
|
||||
return [];
|
||||
|
||||
return roms
|
||||
.Where(r => r != null)
|
||||
.Select(rom => ConvertFromInternalModel(rom, item))
|
||||
.ToArray();
|
||||
return Array.ConvertAll(roms, r => ConvertFromInternalModel(r, item));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.AttractMode;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,13 +17,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(obj),
|
||||
};
|
||||
|
||||
if (obj?.Row != null && obj.Row.Any())
|
||||
if (obj?.Row != null && obj.Row.Length > 0)
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Row
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.Where(m => m != null)
|
||||
.ToArray();
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey]
|
||||
= Array.ConvertAll(obj.Row, ConvertMachineToInternalModel);
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.ClrMamePro;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -22,12 +22,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
metadataFile.ClrMamePro = ConvertHeaderFromInternalModel(header);
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
if (machines != null && machines.Length > 0)
|
||||
{
|
||||
metadataFile.Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(machine => ConvertMachineFromInternalModel(machine, game))
|
||||
.ToArray();
|
||||
metadataFile.Game
|
||||
= Array.ConvertAll(machines, m => ConvertMachineFromInternalModel(m));
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
@@ -76,85 +74,40 @@ namespace SabreTools.Serialization.CrossModel
|
||||
gameBase.SampleOf = item.ReadString(Models.Metadata.Machine.SampleOfKey);
|
||||
|
||||
var releases = item.Read<Models.Metadata.Release[]>(Models.Metadata.Machine.ReleaseKey);
|
||||
if (releases != null && releases.Any())
|
||||
{
|
||||
gameBase.Release = releases
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (releases != null && releases.Length > 0)
|
||||
gameBase.Release = Array.ConvertAll(releases, ConvertFromInternalModel);
|
||||
|
||||
var biosSets = item.Read<Models.Metadata.BiosSet[]>(Models.Metadata.Machine.BiosSetKey);
|
||||
if (biosSets != null && biosSets.Any())
|
||||
{
|
||||
gameBase.BiosSet = biosSets
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (biosSets != null && biosSets.Length > 0)
|
||||
gameBase.BiosSet = Array.ConvertAll(biosSets, ConvertFromInternalModel);
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
{
|
||||
gameBase.Rom = roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (roms != null && roms.Length > 0)
|
||||
gameBase.Rom = Array.ConvertAll(roms, ConvertFromInternalModel);
|
||||
|
||||
var disks = item.Read<Models.Metadata.Disk[]>(Models.Metadata.Machine.DiskKey);
|
||||
if (disks != null && disks.Any())
|
||||
{
|
||||
gameBase.Disk = disks
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (disks != null && disks.Length > 0)
|
||||
gameBase.Disk = Array.ConvertAll(disks, ConvertFromInternalModel);
|
||||
|
||||
var medias = item.Read<Models.Metadata.Media[]>(Models.Metadata.Machine.MediaKey);
|
||||
if (medias != null && medias.Any())
|
||||
{
|
||||
gameBase.Media = medias
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (medias != null && medias.Length > 0)
|
||||
gameBase.Media = Array.ConvertAll(medias, ConvertFromInternalModel);
|
||||
|
||||
var samples = item.Read<Models.Metadata.Sample[]>(Models.Metadata.Machine.SampleKey);
|
||||
if (samples != null && samples.Any())
|
||||
{
|
||||
gameBase.Sample = samples
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (samples != null && samples.Length > 0)
|
||||
gameBase.Sample = Array.ConvertAll(samples, ConvertFromInternalModel);
|
||||
|
||||
var archives = item.Read<Models.Metadata.Archive[]>(Models.Metadata.Machine.ArchiveKey);
|
||||
if (archives != null && archives.Any())
|
||||
{
|
||||
gameBase.Archive = archives
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (archives != null && archives.Length > 0)
|
||||
gameBase.Archive = Array.ConvertAll(archives, ConvertFromInternalModel);
|
||||
|
||||
var chips = item.Read<Models.Metadata.Chip[]>(Models.Metadata.Machine.ChipKey);
|
||||
if (chips != null && chips.Any())
|
||||
{
|
||||
gameBase.Chip = chips
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (chips != null && chips.Length > 0)
|
||||
gameBase.Chip = Array.ConvertAll(chips, ConvertFromInternalModel);
|
||||
|
||||
var videos = item.Read<Models.Metadata.Video[]>(Models.Metadata.Machine.VideoKey);
|
||||
if (videos != null && videos.Any())
|
||||
{
|
||||
gameBase.Video = videos
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (videos != null && videos.Length > 0)
|
||||
gameBase.Video = Array.ConvertAll(videos, ConvertFromInternalModel);
|
||||
|
||||
var sound = item.Read<Models.Metadata.Sound>(Models.Metadata.Machine.SoundKey);
|
||||
if (sound != null)
|
||||
@@ -165,13 +118,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
gameBase.Input = ConvertFromInternalModel(input);
|
||||
|
||||
var dipSwitches = item.Read<Models.Metadata.DipSwitch[]>(Models.Metadata.Machine.DipSwitchKey);
|
||||
if (dipSwitches != null && dipSwitches.Any())
|
||||
{
|
||||
gameBase.DipSwitch = dipSwitches
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (dipSwitches != null && dipSwitches.Length > 0)
|
||||
gameBase.DipSwitch = Array.ConvertAll(dipSwitches, ConvertFromInternalModel);
|
||||
|
||||
var driver = item.Read<Models.Metadata.Driver>(Models.Metadata.Machine.DriverKey);
|
||||
if (driver != null)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.ClrMamePro;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,13 +17,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
if (obj?.ClrMamePro != null)
|
||||
metadataFile[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(obj.ClrMamePro);
|
||||
|
||||
if (obj?.Game != null && obj.Game.Any())
|
||||
if (obj?.Game != null && obj.Game.Length > 0)
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Game
|
||||
.Where(g => g != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.Where(m => m != null)
|
||||
.ToArray();
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey]
|
||||
= Array.ConvertAll(obj.Game, ConvertMachineToInternalModel);
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
@@ -75,76 +72,58 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.Machine.SampleOfKey] = item.SampleOf,
|
||||
};
|
||||
|
||||
if (item.Release != null && item.Release.Any())
|
||||
if (item.Release != null && item.Release.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.ReleaseKey] = item.Release
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.ReleaseKey]
|
||||
= Array.ConvertAll(item.Release, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.BiosSet != null && item.BiosSet.Any())
|
||||
if (item.BiosSet != null && item.BiosSet.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.BiosSetKey] = item.BiosSet
|
||||
.Where(b => b != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.BiosSetKey]
|
||||
= Array.ConvertAll(item.BiosSet, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Rom != null && item.Rom.Any())
|
||||
if (item.Rom != null && item.Rom.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.RomKey] = item.Rom
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.RomKey]
|
||||
= Array.ConvertAll(item.Rom, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Disk != null && item.Disk.Any())
|
||||
if (item.Disk != null && item.Disk.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.DiskKey] = item.Disk
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.DiskKey]
|
||||
= Array.ConvertAll(item.Disk, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Media != null && item.Media.Any())
|
||||
if (item.Media != null && item.Media.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.MediaKey] = item.Media
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.MediaKey]
|
||||
= Array.ConvertAll(item.Media, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Sample != null && item.Sample.Any())
|
||||
if (item.Sample != null && item.Sample.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.SampleKey] = item.Sample
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.SampleKey]
|
||||
= Array.ConvertAll(item.Sample, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Archive != null && item.Archive.Any())
|
||||
if (item.Archive != null && item.Archive.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.ArchiveKey] = item.Archive
|
||||
.Where(a => a != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.ArchiveKey]
|
||||
= Array.ConvertAll(item.Archive, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Chip != null && item.Chip.Any())
|
||||
if (item.Chip != null && item.Chip.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.ChipKey] = item.Chip
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.ChipKey]
|
||||
= Array.ConvertAll(item.Chip, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Video != null)
|
||||
{
|
||||
machine[Models.Metadata.Machine.VideoKey] = item.Video
|
||||
.Where(v => v != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.VideoKey]
|
||||
= Array.ConvertAll(item.Video, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Sound != null)
|
||||
@@ -153,12 +132,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
if (item.Input != null)
|
||||
machine[Models.Metadata.Machine.InputKey] = ConvertToInternalModel(item.Input);
|
||||
|
||||
if (item.DipSwitch != null && item.DipSwitch.Any())
|
||||
if (item.DipSwitch != null && item.DipSwitch.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.DipSwitchKey] = item.DipSwitch
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.DipSwitchKey]
|
||||
= Array.ConvertAll(item.DipSwitch, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Driver != null)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.DosCenter;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -19,13 +19,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
metadataFile.DosCenter = ConvertHeaderFromInternalModel(header);
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
metadataFile.Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (machines != null && machines.Length > 0)
|
||||
metadataFile.Game = Array.ConvertAll(machines, ConvertMachineFromInternalModel);
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
@@ -59,13 +54,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
};
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
{
|
||||
game.File = roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (roms != null && roms.Length > 0)
|
||||
game.File = Array.ConvertAll(roms, ConvertFromInternalModel);
|
||||
|
||||
return game;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.DosCenter;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,12 +17,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
if (obj?.DosCenter != null)
|
||||
metadataFile[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(obj.DosCenter);
|
||||
|
||||
if (obj?.Game != null && obj.Game.Any())
|
||||
if (obj?.Game != null && obj.Game.Length > 0)
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Game
|
||||
.Where(g => g != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey]
|
||||
= Array.ConvertAll(obj.Game, ConvertMachineToInternalModel);
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
@@ -56,12 +54,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.Machine.NameKey] = item.Name,
|
||||
};
|
||||
|
||||
if (item.File != null && item.File.Any())
|
||||
if (item.File != null && item.File.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.RomKey] = item.File
|
||||
.Where(f => f != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.RomKey]
|
||||
= Array.ConvertAll(item.File, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
return machine;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using SabreTools.Models.EverdriveSMDB;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -16,13 +16,13 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var metadataFile = new MetadataFile();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
metadataFile.Row = machines
|
||||
.Where(m => m != null)
|
||||
.SelectMany(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
var items = new List<Row>();
|
||||
foreach (var machine in machines ?? [])
|
||||
{
|
||||
items.AddRange(ConvertMachineFromInternalModel(machine));
|
||||
}
|
||||
|
||||
metadataFile.Row = [.. items];
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
@@ -33,13 +33,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
private static Row[] ConvertMachineFromInternalModel(Models.Metadata.Machine item)
|
||||
{
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms == null || !roms.Any())
|
||||
if (roms == null || roms.Length == 0)
|
||||
return [];
|
||||
|
||||
return roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
return Array.ConvertAll(roms, ConvertFromInternalModel);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.EverdriveSMDB;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,12 +17,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(),
|
||||
};
|
||||
|
||||
if (obj?.Row != null && obj.Row.Any())
|
||||
if (obj?.Row != null && obj.Row.Length > 0)
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Row
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey]
|
||||
= Array.ConvertAll(obj.Row, ConvertMachineToInternalModel);
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SabreTools.Hashing;
|
||||
using SabreTools.Models.Hashfile;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
@@ -18,12 +18,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
return null;
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines == null || !machines.Any())
|
||||
if (machines == null || machines.Length == 0)
|
||||
return null;
|
||||
|
||||
var hashfiles = machines
|
||||
.Where(m => m != null)
|
||||
.Select(machine => ConvertMachineFromInternalModel(machine, hash));
|
||||
var hashfiles = Array.ConvertAll(machines, m => ConvertMachineFromInternalModel(m, hash));
|
||||
|
||||
var sfvs = new List<SFV>();
|
||||
var md5s = new List<MD5>();
|
||||
@@ -35,38 +33,38 @@ namespace SabreTools.Serialization.CrossModel
|
||||
|
||||
foreach (var hashfile in hashfiles)
|
||||
{
|
||||
if (hashfile.SFV != null && hashfile.SFV.Any())
|
||||
if (hashfile.SFV != null && hashfile.SFV.Length > 0)
|
||||
sfvs.AddRange(hashfile.SFV);
|
||||
if (hashfile.MD5 != null && hashfile.MD5.Any())
|
||||
if (hashfile.MD5 != null && hashfile.MD5.Length > 0)
|
||||
md5s.AddRange(hashfile.MD5);
|
||||
if (hashfile.SHA1 != null && hashfile.SHA1.Any())
|
||||
if (hashfile.SHA1 != null && hashfile.SHA1.Length > 0)
|
||||
sha1s.AddRange(hashfile.SHA1);
|
||||
if (hashfile.SHA256 != null && hashfile.SHA256.Any())
|
||||
if (hashfile.SHA256 != null && hashfile.SHA256.Length > 0)
|
||||
sha256s.AddRange(hashfile.SHA256);
|
||||
if (hashfile.SHA384 != null && hashfile.SHA384.Any())
|
||||
if (hashfile.SHA384 != null && hashfile.SHA384.Length > 0)
|
||||
sha384s.AddRange(hashfile.SHA384);
|
||||
if (hashfile.SHA512 != null && hashfile.SHA512.Any())
|
||||
if (hashfile.SHA512 != null && hashfile.SHA512.Length > 0)
|
||||
sha512s.AddRange(hashfile.SHA512);
|
||||
if (hashfile.SpamSum != null && hashfile.SpamSum.Any())
|
||||
if (hashfile.SpamSum != null && hashfile.SpamSum.Length > 0)
|
||||
spamsums.AddRange(hashfile.SpamSum);
|
||||
}
|
||||
|
||||
var hashfileItem = new Models.Hashfile.Hashfile();
|
||||
|
||||
if (sfvs.Any())
|
||||
hashfileItem.SFV = sfvs.ToArray();
|
||||
if (md5s.Any())
|
||||
hashfileItem.MD5 = md5s.ToArray();
|
||||
if (sha1s.Any())
|
||||
hashfileItem.SHA1 = sha1s.ToArray();
|
||||
if (sha256s.Any())
|
||||
hashfileItem.SHA256 = sha256s.ToArray();
|
||||
if (sha384s.Any())
|
||||
hashfileItem.SHA384 = sha384s.ToArray();
|
||||
if (sha512s.Any())
|
||||
hashfileItem.SHA512 = sha512s.ToArray();
|
||||
if (spamsums.Any())
|
||||
hashfileItem.SpamSum = spamsums.ToArray();
|
||||
if (sfvs.Count > 0)
|
||||
hashfileItem.SFV = [.. sfvs];
|
||||
if (md5s.Count > 0)
|
||||
hashfileItem.MD5 = [.. md5s];
|
||||
if (sha1s.Count > 0)
|
||||
hashfileItem.SHA1 = [.. sha1s];
|
||||
if (sha256s.Count > 0)
|
||||
hashfileItem.SHA256 = [.. sha256s];
|
||||
if (sha384s.Count > 0)
|
||||
hashfileItem.SHA384 = [.. sha384s];
|
||||
if (sha512s.Count > 0)
|
||||
hashfileItem.SHA512 = [.. sha512s];
|
||||
if (spamsums.Count > 0)
|
||||
hashfileItem.SpamSum = [.. spamsums];
|
||||
|
||||
return hashfileItem;
|
||||
}
|
||||
@@ -80,13 +78,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
return null;
|
||||
|
||||
var machines = item.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
return machines
|
||||
.Where(m => m != null)
|
||||
.Select(machine => ConvertMachineFromInternalModel(machine, hash))
|
||||
.ToArray();
|
||||
}
|
||||
if (machines != null && machines.Length > 0)
|
||||
return Array.ConvertAll(machines, m => ConvertMachineFromInternalModel(m, hash));
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -102,47 +95,26 @@ namespace SabreTools.Serialization.CrossModel
|
||||
|
||||
return new Models.Hashfile.Hashfile
|
||||
{
|
||||
SFV = hash == HashType.CRC32 || hash == HashType.CRC32_ISO || hash == HashType.CRC32_Naive || hash == HashType.CRC32_Optimized || hash == HashType.CRC32_Parallel
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToSFV)
|
||||
.ToArray()
|
||||
SFV = hash == HashType.CRC32
|
||||
? Array.ConvertAll(roms, ConvertToSFV)
|
||||
: null,
|
||||
MD5 = hash == HashType.MD5
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToMD5)
|
||||
.ToArray()
|
||||
? Array.ConvertAll(roms, ConvertToMD5)
|
||||
: null,
|
||||
SHA1 = hash == HashType.SHA1
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToSHA1)
|
||||
.ToArray()
|
||||
? Array.ConvertAll(roms, ConvertToSHA1)
|
||||
: null,
|
||||
SHA256 = hash == HashType.SHA256
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToSHA256)
|
||||
.ToArray()
|
||||
? Array.ConvertAll(roms, ConvertToSHA256)
|
||||
: null,
|
||||
SHA384 = hash == HashType.SHA384
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToSHA384)
|
||||
.ToArray()
|
||||
? Array.ConvertAll(roms, ConvertToSHA384)
|
||||
: null,
|
||||
SHA512 = hash == HashType.SHA512
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToSHA512)
|
||||
.ToArray()
|
||||
? Array.ConvertAll(roms, ConvertToSHA512)
|
||||
: null,
|
||||
SpamSum = hash == HashType.SpamSum
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToSpamSum)
|
||||
.ToArray()
|
||||
? Array.ConvertAll(roms, ConvertToSpamSum)
|
||||
: null,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.Hashfile;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -42,20 +42,20 @@ namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
var machine = new Models.Metadata.Machine();
|
||||
|
||||
if (item.SFV != null && item.SFV.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.SFV.Select(ConvertToInternalModel).ToArray();
|
||||
else if (item.MD5 != null && item.MD5.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.MD5.Select(ConvertToInternalModel).ToArray();
|
||||
else if (item.SHA1 != null && item.SHA1.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.SHA1.Select(ConvertToInternalModel).ToArray();
|
||||
else if (item.SHA256 != null && item.SHA256.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.SHA256.Select(ConvertToInternalModel).ToArray();
|
||||
else if (item.SHA384 != null && item.SHA384.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.SHA384.Select(ConvertToInternalModel).ToArray();
|
||||
else if (item.SHA512 != null && item.SHA512.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.SHA512.Select(ConvertToInternalModel).ToArray();
|
||||
else if (item.SpamSum != null && item.SpamSum.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.SpamSum.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.SFV != null && item.SFV.Length > 0)
|
||||
machine[Models.Metadata.Machine.RomKey] = Array.ConvertAll(item.SFV, ConvertToInternalModel);
|
||||
else if (item.MD5 != null && item.MD5.Length > 0)
|
||||
machine[Models.Metadata.Machine.RomKey] = Array.ConvertAll(item.MD5, ConvertToInternalModel);
|
||||
else if (item.SHA1 != null && item.SHA1.Length > 0)
|
||||
machine[Models.Metadata.Machine.RomKey] = Array.ConvertAll(item.SHA1, ConvertToInternalModel);
|
||||
else if (item.SHA256 != null && item.SHA256.Length > 0)
|
||||
machine[Models.Metadata.Machine.RomKey] = Array.ConvertAll(item.SHA256, ConvertToInternalModel);
|
||||
else if (item.SHA384 != null && item.SHA384.Length > 0)
|
||||
machine[Models.Metadata.Machine.RomKey] = Array.ConvertAll(item.SHA384, ConvertToInternalModel);
|
||||
else if (item.SHA512 != null && item.SHA512.Length > 0)
|
||||
machine[Models.Metadata.Machine.RomKey] = Array.ConvertAll(item.SHA512, ConvertToInternalModel);
|
||||
else if (item.SpamSum != null && item.SpamSum.Length > 0)
|
||||
machine[Models.Metadata.Machine.RomKey] = Array.ConvertAll(item.SpamSum, ConvertToInternalModel);
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.Listrom;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -16,13 +16,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var metadataFile = new MetadataFile();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
metadataFile.Set = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (machines != null && machines.Length > 0)
|
||||
metadataFile.Set = Array.ConvertAll(machines, ConvertMachineFromInternalModel);
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
@@ -43,14 +38,14 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null)
|
||||
{
|
||||
rowItems.AddRange(roms.Where(r => r != null).Select(ConvertFromInternalModel));
|
||||
rowItems.AddRange(Array.ConvertAll(roms, ConvertFromInternalModel));
|
||||
}
|
||||
|
||||
var disks = item.Read<Models.Metadata.Disk[]>(Models.Metadata.Machine.DiskKey);
|
||||
if (disks != null)
|
||||
rowItems.AddRange(disks.Where(d => d != null).Select(ConvertFromInternalModel));
|
||||
rowItems.AddRange(Array.ConvertAll(disks, ConvertFromInternalModel));
|
||||
|
||||
set.Row = rowItems.ToArray();
|
||||
set.Row = [.. rowItems];
|
||||
return set;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.Listrom;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -18,12 +18,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(),
|
||||
};
|
||||
|
||||
if (obj?.Set != null && obj.Set.Any())
|
||||
if (obj?.Set != null && obj.Set.Length > 0)
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Set
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey]
|
||||
= Array.ConvertAll(obj.Set, ConvertMachineToInternalModel);
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
@@ -57,16 +55,21 @@ namespace SabreTools.Serialization.CrossModel
|
||||
machine[Models.Metadata.Machine.NameKey] = item.Driver;
|
||||
}
|
||||
|
||||
if (item.Row != null && item.Row.Any())
|
||||
if (item.Row != null && item.Row.Length > 0)
|
||||
{
|
||||
var datItems = new List<Models.Metadata.DatItem>();
|
||||
var disks = new List<Models.Metadata.Disk>();
|
||||
var roms = new List<Models.Metadata.Rom>();
|
||||
foreach (var file in item.Row)
|
||||
{
|
||||
datItems.Add(ConvertToInternalModel(file));
|
||||
var datItem = ConvertToInternalModel(file);
|
||||
if (datItem is Models.Metadata.Disk disk)
|
||||
disks.Add(disk);
|
||||
else if (datItem is Models.Metadata.Rom rom)
|
||||
roms.Add(rom);
|
||||
}
|
||||
|
||||
machine[Models.Metadata.Machine.DiskKey] = datItems.Where(i => i.ReadString(Models.Metadata.DatItem.TypeKey) == "disk").Select(d => d as Models.Metadata.Disk).ToArray();
|
||||
machine[Models.Metadata.Machine.RomKey] = datItems.Where(i => i.ReadString(Models.Metadata.DatItem.TypeKey) == "rom").Select(d => d as Models.Metadata.Rom).ToArray();
|
||||
machine[Models.Metadata.Machine.DiskKey] = disks.ToArray();
|
||||
machine[Models.Metadata.Machine.RomKey] = roms.ToArray();
|
||||
}
|
||||
|
||||
return machine;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.Listxml;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -16,13 +16,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var mame = header != null ? ConvertMameFromInternalModel(header) : new Mame();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
mame.Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (machines != null && machines.Length > 0)
|
||||
mame.Game = Array.ConvertAll(machines, ConvertMachineFromInternalModel);
|
||||
|
||||
return mame;
|
||||
}
|
||||
@@ -39,13 +34,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var mame = header != null ? ConvertMameFromInternalModel(header) : new Mame();
|
||||
|
||||
var machines = item.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
mame.Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (machines != null && machines.Length > 0)
|
||||
mame.Game = Array.ConvertAll(machines, ConvertMachineFromInternalModel);
|
||||
|
||||
return mame;
|
||||
}
|
||||
@@ -88,76 +78,36 @@ namespace SabreTools.Serialization.CrossModel
|
||||
};
|
||||
|
||||
var biosSets = item.Read<Models.Metadata.BiosSet[]>(Models.Metadata.Machine.BiosSetKey);
|
||||
if (biosSets != null && biosSets.Any())
|
||||
{
|
||||
machine.BiosSet = biosSets
|
||||
.Where(b => b != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (biosSets != null && biosSets.Length > 0)
|
||||
machine.BiosSet = Array.ConvertAll(biosSets, ConvertFromInternalModel);
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
{
|
||||
machine.Rom = roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (roms != null && roms.Length > 0)
|
||||
machine.Rom = Array.ConvertAll(roms, ConvertFromInternalModel);
|
||||
|
||||
var disks = item.Read<Models.Metadata.Disk[]>(Models.Metadata.Machine.DiskKey);
|
||||
if (disks != null && disks.Any())
|
||||
{
|
||||
machine.Disk = disks
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (disks != null && disks.Length > 0)
|
||||
machine.Disk = Array.ConvertAll(disks, ConvertFromInternalModel);
|
||||
|
||||
var deviceRefs = item.Read<Models.Metadata.DeviceRef[]>(Models.Metadata.Machine.DeviceRefKey);
|
||||
if (deviceRefs != null && deviceRefs.Any())
|
||||
{
|
||||
machine.DeviceRef = deviceRefs
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (deviceRefs != null && deviceRefs.Length > 0)
|
||||
machine.DeviceRef = Array.ConvertAll(deviceRefs, ConvertFromInternalModel);
|
||||
|
||||
var samples = item.Read<Models.Metadata.Sample[]>(Models.Metadata.Machine.SampleKey);
|
||||
if (samples != null && samples.Any())
|
||||
{
|
||||
machine.Sample = samples
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (samples != null && samples.Length > 0)
|
||||
machine.Sample = Array.ConvertAll(samples, ConvertFromInternalModel);
|
||||
|
||||
var chips = item.Read<Models.Metadata.Chip[]>(Models.Metadata.Machine.ChipKey);
|
||||
if (chips != null && chips.Any())
|
||||
{
|
||||
machine.Chip = chips
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (chips != null && chips.Length > 0)
|
||||
machine.Chip = Array.ConvertAll(chips, ConvertFromInternalModel);
|
||||
|
||||
var displays = item.Read<Models.Metadata.Display[]>(Models.Metadata.Machine.DisplayKey);
|
||||
if (displays != null && displays.Any())
|
||||
{
|
||||
machine.Display = displays
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (displays != null && displays.Length > 0)
|
||||
machine.Display = Array.ConvertAll(displays, ConvertFromInternalModel);
|
||||
|
||||
var videos = item.Read<Models.Metadata.Video[]>(Models.Metadata.Machine.VideoKey);
|
||||
if (videos != null && videos.Any())
|
||||
{
|
||||
machine.Video = videos
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (videos != null && videos.Length > 0)
|
||||
machine.Video = Array.ConvertAll(videos, ConvertFromInternalModel);
|
||||
|
||||
var sound = item.Read<Models.Metadata.Sound>(Models.Metadata.Machine.SoundKey);
|
||||
if (sound != null)
|
||||
@@ -168,89 +118,44 @@ namespace SabreTools.Serialization.CrossModel
|
||||
machine.Input = ConvertFromInternalModel(input);
|
||||
|
||||
var dipSwitches = item.Read<Models.Metadata.DipSwitch[]>(Models.Metadata.Machine.DipSwitchKey);
|
||||
if (dipSwitches != null && dipSwitches.Any())
|
||||
{
|
||||
machine.DipSwitch = dipSwitches
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (dipSwitches != null && dipSwitches.Length > 0)
|
||||
machine.DipSwitch = Array.ConvertAll(dipSwitches, ConvertFromInternalModel);
|
||||
|
||||
var configurations = item.Read<Models.Metadata.Configuration[]>(Models.Metadata.Machine.ConfigurationKey);
|
||||
if (configurations != null && configurations.Any())
|
||||
{
|
||||
machine.Configuration = configurations
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (configurations != null && configurations.Length > 0)
|
||||
machine.Configuration = Array.ConvertAll(configurations, ConvertFromInternalModel);
|
||||
|
||||
var ports = item.Read<Models.Metadata.Port[]>(Models.Metadata.Machine.PortKey);
|
||||
if (ports != null && ports.Any())
|
||||
{
|
||||
machine.Port = ports
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (ports != null && ports.Length > 0)
|
||||
machine.Port = Array.ConvertAll(ports, ConvertFromInternalModel);
|
||||
|
||||
var adjusters = item.Read<Models.Metadata.Adjuster[]>(Models.Metadata.Machine.AdjusterKey);
|
||||
if (adjusters != null && adjusters.Any())
|
||||
{
|
||||
machine.Adjuster = adjusters
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (adjusters != null && adjusters.Length > 0)
|
||||
machine.Adjuster = Array.ConvertAll(adjusters, ConvertFromInternalModel);
|
||||
|
||||
var driver = item.Read<Models.Metadata.Driver>(Models.Metadata.Machine.DriverKey);
|
||||
if (driver != null)
|
||||
machine.Driver = ConvertFromInternalModel(driver);
|
||||
|
||||
var features = item.Read<Models.Metadata.Feature[]>(Models.Metadata.Machine.FeatureKey);
|
||||
if (features != null && features.Any())
|
||||
{
|
||||
machine.Feature = features
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (features != null && features.Length > 0)
|
||||
machine.Feature = Array.ConvertAll(features, ConvertFromInternalModel);
|
||||
|
||||
var devices = item.Read<Models.Metadata.Device[]>(Models.Metadata.Machine.DeviceKey);
|
||||
if (devices != null && devices.Any())
|
||||
{
|
||||
machine.Device = devices
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (devices != null && devices.Length > 0)
|
||||
machine.Device = Array.ConvertAll(devices, ConvertFromInternalModel);
|
||||
|
||||
var slots = item.Read<Models.Metadata.Slot[]>(Models.Metadata.Machine.SlotKey);
|
||||
if (slots != null && slots.Any())
|
||||
{
|
||||
machine.Slot = slots
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (slots != null && slots.Length > 0)
|
||||
machine.Slot = Array.ConvertAll(slots, ConvertFromInternalModel);
|
||||
|
||||
var softwareLists = item.Read<Models.Metadata.SoftwareList[]>(Models.Metadata.Machine.SoftwareListKey);
|
||||
if (softwareLists != null && softwareLists.Any())
|
||||
{
|
||||
machine.SoftwareList = softwareLists
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (softwareLists != null && softwareLists.Length > 0)
|
||||
machine.SoftwareList = Array.ConvertAll(softwareLists, ConvertFromInternalModel);
|
||||
|
||||
var ramOptions = item.Read<Models.Metadata.RamOption[]>(Models.Metadata.Machine.RamOptionKey);
|
||||
if (ramOptions != null && ramOptions.Any())
|
||||
{
|
||||
machine.RamOption = ramOptions
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (ramOptions != null && ramOptions.Length > 0)
|
||||
machine.RamOption = Array.ConvertAll(ramOptions, ConvertFromInternalModel);
|
||||
|
||||
return machine;
|
||||
}
|
||||
@@ -347,22 +252,12 @@ namespace SabreTools.Serialization.CrossModel
|
||||
configuration.Condition = ConvertFromInternalModel(condition);
|
||||
|
||||
var confLocations = item.Read<Models.Metadata.ConfLocation[]>(Models.Metadata.Configuration.ConfLocationKey);
|
||||
if (confLocations != null && confLocations.Any())
|
||||
{
|
||||
configuration.ConfLocation = confLocations
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (confLocations != null && confLocations.Length > 0)
|
||||
configuration.ConfLocation = Array.ConvertAll(confLocations, ConvertFromInternalModel);
|
||||
|
||||
var confSettings = item.Read<Models.Metadata.ConfSetting[]>(Models.Metadata.Configuration.ConfSettingKey);
|
||||
if (confSettings != null && confSettings.Any())
|
||||
{
|
||||
configuration.ConfSetting = confSettings
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (confSettings != null && confSettings.Length > 0)
|
||||
configuration.ConfSetting = Array.ConvertAll(confSettings, ConvertFromInternalModel);
|
||||
|
||||
return configuration;
|
||||
}
|
||||
@@ -442,13 +337,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
device.Instance = ConvertFromInternalModel(instance);
|
||||
|
||||
var extensions = item.Read<Models.Metadata.Extension[]>(Models.Metadata.Device.ExtensionKey);
|
||||
if (extensions != null && extensions.Any())
|
||||
{
|
||||
device.Extension = extensions
|
||||
.Where(e => e != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (extensions != null && extensions.Length > 0)
|
||||
device.Extension = Array.ConvertAll(extensions, ConvertFromInternalModel);
|
||||
|
||||
return device;
|
||||
}
|
||||
@@ -496,22 +386,12 @@ namespace SabreTools.Serialization.CrossModel
|
||||
dipSwitch.Condition = ConvertFromInternalModel(condition);
|
||||
|
||||
var dipLocations = item.Read<Models.Metadata.DipLocation[]>(Models.Metadata.DipSwitch.DipLocationKey);
|
||||
if (dipLocations != null && dipLocations.Any())
|
||||
{
|
||||
dipSwitch.DipLocation = dipLocations
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (dipLocations != null && dipLocations.Length > 0)
|
||||
dipSwitch.DipLocation = Array.ConvertAll(dipLocations, ConvertFromInternalModel);
|
||||
|
||||
var dipValues = item.Read<Models.Metadata.DipValue[]>(Models.Metadata.DipSwitch.DipValueKey);
|
||||
if (dipValues != null && dipValues.Any())
|
||||
{
|
||||
dipSwitch.DipValue = dipValues
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (dipValues != null && dipValues.Length > 0)
|
||||
dipSwitch.DipValue = Array.ConvertAll(dipValues, ConvertFromInternalModel);
|
||||
|
||||
return dipSwitch;
|
||||
}
|
||||
@@ -644,13 +524,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
};
|
||||
|
||||
var controls = item.Read<Models.Metadata.Control[]>(Models.Metadata.Input.ControlKey);
|
||||
if (controls != null && controls.Any())
|
||||
{
|
||||
input.Control = controls
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (controls != null && controls.Length > 0)
|
||||
input.Control = Array.ConvertAll(controls, ConvertFromInternalModel);
|
||||
|
||||
return input;
|
||||
}
|
||||
@@ -679,13 +554,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
};
|
||||
|
||||
var analogs = item.Read<Models.Metadata.Analog[]>(Models.Metadata.Port.AnalogKey);
|
||||
if (analogs != null && analogs.Any())
|
||||
{
|
||||
port.Analog = analogs
|
||||
.Where(a => a != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (analogs != null && analogs.Length > 0)
|
||||
port.Analog = Array.ConvertAll(analogs, ConvertFromInternalModel);
|
||||
|
||||
return port;
|
||||
}
|
||||
@@ -750,13 +620,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
};
|
||||
|
||||
var slotOptions = item.Read<Models.Metadata.SlotOption[]>(Models.Metadata.Slot.SlotOptionKey);
|
||||
if (slotOptions != null && slotOptions.Any())
|
||||
{
|
||||
slot.SlotOption = slotOptions
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (slotOptions != null && slotOptions.Length > 0)
|
||||
slot.SlotOption = Array.ConvertAll(slotOptions, ConvertFromInternalModel);
|
||||
|
||||
return slot;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.Listxml;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,12 +17,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
|
||||
};
|
||||
|
||||
if (item?.Game != null && item.Game.Any())
|
||||
if (item?.Game != null && item.Game.Length > 0)
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.Game
|
||||
.Where(g => g != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey]
|
||||
= Array.ConvertAll(item.Game, ConvertMachineToInternalModel);
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
@@ -64,68 +62,52 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.Machine.HistoryKey] = item.History,
|
||||
};
|
||||
|
||||
if (item.BiosSet != null && item.BiosSet.Any())
|
||||
if (item.BiosSet != null && item.BiosSet.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.BiosSetKey] = item.BiosSet
|
||||
.Where(b => b != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.BiosSetKey]
|
||||
= Array.ConvertAll(item.BiosSet, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Rom != null && item.Rom.Any())
|
||||
if (item.Rom != null && item.Rom.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.RomKey] = item.Rom
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.RomKey]
|
||||
= Array.ConvertAll(item.Rom, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Disk != null && item.Disk.Any())
|
||||
if (item.Disk != null && item.Disk.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.DiskKey] = item.Disk
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.DiskKey]
|
||||
= Array.ConvertAll(item.Disk, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.DeviceRef != null && item.DeviceRef.Any())
|
||||
if (item.DeviceRef != null && item.DeviceRef.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.DeviceRefKey] = item.DeviceRef
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.DeviceRefKey]
|
||||
= Array.ConvertAll(item.DeviceRef, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Sample != null && item.Sample.Any())
|
||||
if (item.Sample != null && item.Sample.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.SampleKey] = item.Sample
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.SampleKey]
|
||||
= Array.ConvertAll(item.Sample, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Chip != null && item.Chip.Any())
|
||||
if (item.Chip != null && item.Chip.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.ChipKey] = item.Chip
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.ChipKey]
|
||||
= Array.ConvertAll(item.Chip, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Display != null && item.Display.Any())
|
||||
if (item.Display != null && item.Display.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.DisplayKey] = item.Display
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.DisplayKey]
|
||||
= Array.ConvertAll(item.Display, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Video != null && item.Video.Any())
|
||||
if (item.Video != null && item.Video.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.VideoKey] = item.Video
|
||||
.Where(v => v != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.VideoKey]
|
||||
= Array.ConvertAll(item.Video, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Sound != null)
|
||||
@@ -134,79 +116,61 @@ namespace SabreTools.Serialization.CrossModel
|
||||
if (item.Input != null)
|
||||
machine[Models.Metadata.Machine.InputKey] = ConvertToInternalModel(item.Input);
|
||||
|
||||
if (item.DipSwitch != null && item.DipSwitch.Any())
|
||||
if (item.DipSwitch != null && item.DipSwitch.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.DipSwitchKey] = item.DipSwitch
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.DipSwitchKey]
|
||||
= Array.ConvertAll(item.DipSwitch, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Configuration != null && item.Configuration.Any())
|
||||
if (item.Configuration != null && item.Configuration.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.ConfigurationKey] = item.Configuration
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.ConfigurationKey]
|
||||
= Array.ConvertAll(item.Configuration, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Port != null && item.Port.Any())
|
||||
if (item.Port != null && item.Port.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.PortKey] = item.Port
|
||||
.Where(p => p != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.PortKey]
|
||||
= Array.ConvertAll(item.Port, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Adjuster != null && item.Adjuster.Any())
|
||||
if (item.Adjuster != null && item.Adjuster.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.AdjusterKey] = item.Adjuster
|
||||
.Where(a => a != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.AdjusterKey]
|
||||
= Array.ConvertAll(item.Adjuster, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Driver != null)
|
||||
machine[Models.Metadata.Machine.DriverKey] = ConvertToInternalModel(item.Driver);
|
||||
|
||||
if (item.Feature != null && item.Feature.Any())
|
||||
if (item.Feature != null && item.Feature.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.FeatureKey] = item.Feature
|
||||
.Where(f => f != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.FeatureKey]
|
||||
= Array.ConvertAll(item.Feature, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Device != null && item.Device.Any())
|
||||
if (item.Device != null && item.Device.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.DeviceKey] = item.Device
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.DeviceKey]
|
||||
= Array.ConvertAll(item.Device, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.Slot != null && item.Slot.Any())
|
||||
if (item.Slot != null && item.Slot.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.SlotKey] = item.Slot
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.SlotKey]
|
||||
= Array.ConvertAll(item.Slot, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.SoftwareList != null && item.SoftwareList.Any())
|
||||
if (item.SoftwareList != null && item.SoftwareList.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.SoftwareListKey] = item.SoftwareList
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.SoftwareListKey]
|
||||
= Array.ConvertAll(item.SoftwareList, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.RamOption != null && item.RamOption.Any())
|
||||
if (item.RamOption != null && item.RamOption.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.RamOptionKey] = item.RamOption
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.RamOptionKey]
|
||||
= Array.ConvertAll(item.RamOption, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
return machine;
|
||||
@@ -301,20 +265,16 @@ namespace SabreTools.Serialization.CrossModel
|
||||
if (item.Condition != null)
|
||||
configuration[Models.Metadata.Configuration.ConditionKey] = ConvertToInternalModel(item.Condition);
|
||||
|
||||
if (item.ConfLocation != null && item.ConfLocation.Any())
|
||||
if (item.ConfLocation != null && item.ConfLocation.Length > 0)
|
||||
{
|
||||
configuration[Models.Metadata.Configuration.ConfLocationKey] = item.ConfLocation
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
configuration[Models.Metadata.Configuration.ConfLocationKey]
|
||||
= Array.ConvertAll(item.ConfLocation, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.ConfSetting != null && item.ConfSetting.Any())
|
||||
if (item.ConfSetting != null && item.ConfSetting.Length > 0)
|
||||
{
|
||||
configuration[Models.Metadata.Configuration.ConfSettingKey] = item.ConfSetting
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
configuration[Models.Metadata.Configuration.ConfSettingKey]
|
||||
= Array.ConvertAll(item.ConfSetting, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
return configuration;
|
||||
@@ -392,12 +352,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
if (item.Instance != null)
|
||||
device[Models.Metadata.Device.InstanceKey] = ConvertToInternalModel(item.Instance);
|
||||
|
||||
if (item.Extension != null && item.Extension.Any())
|
||||
if (item.Extension != null && item.Extension.Length > 0)
|
||||
{
|
||||
device[Models.Metadata.Device.ExtensionKey] = item.Extension
|
||||
.Where(e => e != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
device[Models.Metadata.Device.ExtensionKey]
|
||||
= Array.ConvertAll(item.Extension, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
return device;
|
||||
@@ -444,20 +402,16 @@ namespace SabreTools.Serialization.CrossModel
|
||||
if (item.Condition != null)
|
||||
dipSwitch[Models.Metadata.DipSwitch.ConditionKey] = ConvertToInternalModel(item.Condition);
|
||||
|
||||
if (item.DipLocation != null && item.DipLocation.Any())
|
||||
if (item.DipLocation != null && item.DipLocation.Length > 0)
|
||||
{
|
||||
dipSwitch[Models.Metadata.DipSwitch.DipLocationKey] = item.DipLocation
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
dipSwitch[Models.Metadata.DipSwitch.DipLocationKey]
|
||||
= Array.ConvertAll(item.DipLocation, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
if (item.DipValue != null && item.DipValue.Any())
|
||||
if (item.DipValue != null && item.DipValue.Length > 0)
|
||||
{
|
||||
dipSwitch[Models.Metadata.DipSwitch.DipValueKey] = item.DipValue
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
dipSwitch[Models.Metadata.DipSwitch.DipValueKey]
|
||||
= Array.ConvertAll(item.DipValue, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
return dipSwitch;
|
||||
@@ -589,12 +543,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.Input.CoinsKey] = item.Coins,
|
||||
};
|
||||
|
||||
if (item.Control != null && item.Control.Any())
|
||||
if (item.Control != null && item.Control.Length > 0)
|
||||
{
|
||||
input[Models.Metadata.Input.ControlKey] = item.Control
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
input[Models.Metadata.Input.ControlKey]
|
||||
= Array.ConvertAll(item.Control, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
return input;
|
||||
@@ -623,12 +575,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.Port.TagKey] = item.Tag,
|
||||
};
|
||||
|
||||
if (item.Analog != null && item.Analog.Any())
|
||||
if (item.Analog != null && item.Analog.Length > 0)
|
||||
{
|
||||
port[Models.Metadata.Port.AnalogKey] = item.Analog
|
||||
.Where(a => a != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
port[Models.Metadata.Port.AnalogKey]
|
||||
= Array.ConvertAll(item.Analog, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
return port;
|
||||
@@ -693,12 +643,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.Slot.NameKey] = item.Name,
|
||||
};
|
||||
|
||||
if (item.SlotOption != null && item.SlotOption.Any())
|
||||
if (item.SlotOption != null && item.SlotOption.Length > 0)
|
||||
{
|
||||
slot[Models.Metadata.Slot.SlotOptionKey] = item.SlotOption
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
slot[Models.Metadata.Slot.SlotOptionKey]
|
||||
= Array.ConvertAll(item.SlotOption, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
return slot;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.Logiqx;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -28,13 +28,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
|
||||
// TODO: Handle Dir items - Currently need to be generated from the machines
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
datafile.Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(machine => ConvertMachineFromInternalModel(machine, game))
|
||||
.ToArray();
|
||||
}
|
||||
if (machines != null && machines.Length > 0)
|
||||
datafile.Game = Array.ConvertAll(machines, m => ConvertMachineFromInternalModel(m, game));
|
||||
|
||||
return datafile;
|
||||
}
|
||||
@@ -130,89 +125,44 @@ namespace SabreTools.Serialization.CrossModel
|
||||
gameBase.Trurip = trurip;
|
||||
|
||||
var releases = item.Read<Models.Metadata.Release[]>(Models.Metadata.Machine.ReleaseKey);
|
||||
if (releases != null && releases.Any())
|
||||
{
|
||||
gameBase.Release = releases
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (releases != null && releases.Length > 0)
|
||||
gameBase.Release = Array.ConvertAll(releases, ConvertFromInternalModel);
|
||||
|
||||
var biosSets = item.Read<Models.Metadata.BiosSet[]>(Models.Metadata.Machine.BiosSetKey);
|
||||
if (biosSets != null && biosSets.Any())
|
||||
{
|
||||
gameBase.BiosSet = biosSets
|
||||
.Where(b => b != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (biosSets != null && biosSets.Length > 0)
|
||||
gameBase.BiosSet = Array.ConvertAll(biosSets, ConvertFromInternalModel);
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
{
|
||||
gameBase.Rom = roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (roms != null && roms.Length > 0)
|
||||
gameBase.Rom = Array.ConvertAll(roms, ConvertFromInternalModel);
|
||||
|
||||
var disks = item.Read<Models.Metadata.Disk[]>(Models.Metadata.Machine.DiskKey);
|
||||
if (disks != null && disks.Any())
|
||||
{
|
||||
gameBase.Disk = disks
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (disks != null && disks.Length > 0)
|
||||
gameBase.Disk = Array.ConvertAll(disks, ConvertFromInternalModel);
|
||||
|
||||
var medias = item.Read<Models.Metadata.Media[]>(Models.Metadata.Machine.MediaKey);
|
||||
if (medias != null && medias.Any())
|
||||
{
|
||||
gameBase.Media = medias
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (medias != null && medias.Length > 0)
|
||||
gameBase.Media = Array.ConvertAll(medias, ConvertFromInternalModel);
|
||||
|
||||
var deviceRefs = item.Read<Models.Metadata.DeviceRef[]>(Models.Metadata.Machine.DeviceRefKey);
|
||||
if (deviceRefs != null && deviceRefs.Any())
|
||||
{
|
||||
gameBase.DeviceRef = deviceRefs
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (deviceRefs != null && deviceRefs.Length > 0)
|
||||
gameBase.DeviceRef = Array.ConvertAll(deviceRefs, ConvertFromInternalModel);
|
||||
|
||||
var samples = item.Read<Models.Metadata.Sample[]>(Models.Metadata.Machine.SampleKey);
|
||||
if (samples != null && samples.Any())
|
||||
{
|
||||
gameBase.Sample = samples
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (samples != null && samples.Length > 0)
|
||||
gameBase.Sample = Array.ConvertAll(samples, ConvertFromInternalModel);
|
||||
|
||||
var archives = item.Read<Models.Metadata.Archive[]>(Models.Metadata.Machine.ArchiveKey);
|
||||
if (archives != null && archives.Any())
|
||||
{
|
||||
gameBase.Archive = archives
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (archives != null && archives.Length > 0)
|
||||
gameBase.Archive = Array.ConvertAll(archives, ConvertFromInternalModel);
|
||||
|
||||
var driver = item.Read<Models.Metadata.Driver>(Models.Metadata.Machine.DriverKey);
|
||||
if (driver != null)
|
||||
gameBase.Driver = ConvertFromInternalModel(driver);
|
||||
|
||||
var softwareLists = item.Read<Models.Metadata.SoftwareList[]>(Models.Metadata.Machine.SoftwareListKey);
|
||||
if (softwareLists != null && softwareLists.Any())
|
||||
{
|
||||
gameBase.SoftwareList = softwareLists
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (softwareLists != null && softwareLists.Length > 0)
|
||||
gameBase.SoftwareList = Array.ConvertAll(softwareLists, ConvertFromInternalModel);
|
||||
|
||||
return gameBase;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.Logiqx;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -20,21 +19,15 @@ namespace SabreTools.Serialization.CrossModel
|
||||
|
||||
var machines = new List<Models.Metadata.Machine>();
|
||||
|
||||
if (item.Game != null && item.Game.Any())
|
||||
if (item.Game != null && item.Game.Length > 0)
|
||||
machines.AddRange(Array.ConvertAll(item.Game, ConvertMachineToInternalModel));
|
||||
|
||||
foreach (var dir in item.Dir ?? [])
|
||||
{
|
||||
machines.AddRange(item.Game
|
||||
.Where(g => g != null)
|
||||
.Select(ConvertMachineToInternalModel));
|
||||
machines.AddRange(ConvertDirToInternalModel(dir));
|
||||
}
|
||||
|
||||
if (item.Dir != null && item.Dir.Any())
|
||||
{
|
||||
machines.AddRange(item.Dir
|
||||
.Where(d => d != null)
|
||||
.SelectMany(ConvertDirToInternalModel));
|
||||
}
|
||||
|
||||
if (machines.Any())
|
||||
if (machines.Count > 0)
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = machines.ToArray();
|
||||
|
||||
return metadataFile;
|
||||
@@ -103,18 +96,15 @@ namespace SabreTools.Serialization.CrossModel
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine[] ConvertDirToInternalModel(Dir item)
|
||||
{
|
||||
if (item.Game == null || !item.Game.Any())
|
||||
if (item.Game == null || item.Game.Length == 0)
|
||||
return [];
|
||||
|
||||
return item.Game
|
||||
.Where(g => g != null)
|
||||
.Select(game =>
|
||||
return Array.ConvertAll(item.Game, g =>
|
||||
{
|
||||
var machine = ConvertMachineToInternalModel(game);
|
||||
var machine = ConvertMachineToInternalModel(g);
|
||||
machine[Models.Metadata.Machine.DirNameKey] = item.Name;
|
||||
return machine;
|
||||
})
|
||||
.ToArray();
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -146,35 +136,35 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.Machine.TruripKey] = item.Trurip,
|
||||
};
|
||||
|
||||
if (item.Release != null && item.Release.Any())
|
||||
machine[Models.Metadata.Machine.ReleaseKey] = item.Release.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.Release != null && item.Release.Length > 0)
|
||||
machine[Models.Metadata.Machine.ReleaseKey] = Array.ConvertAll(item.Release, ConvertToInternalModel);
|
||||
|
||||
if (item.BiosSet != null && item.BiosSet.Any())
|
||||
machine[Models.Metadata.Machine.BiosSetKey] = item.BiosSet.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.BiosSet != null && item.BiosSet.Length > 0)
|
||||
machine[Models.Metadata.Machine.BiosSetKey] = Array.ConvertAll(item.BiosSet, ConvertToInternalModel);
|
||||
|
||||
if (item.Rom != null && item.Rom.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.Rom.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.Rom != null && item.Rom.Length > 0)
|
||||
machine[Models.Metadata.Machine.RomKey] = Array.ConvertAll(item.Rom, ConvertToInternalModel);
|
||||
|
||||
if (item.Disk != null && item.Disk.Any())
|
||||
machine[Models.Metadata.Machine.DiskKey] = item.Disk.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.Disk != null && item.Disk.Length > 0)
|
||||
machine[Models.Metadata.Machine.DiskKey] = Array.ConvertAll(item.Disk, ConvertToInternalModel);
|
||||
|
||||
if (item.Media != null && item.Media.Any())
|
||||
machine[Models.Metadata.Machine.MediaKey] = item.Media.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.Media != null && item.Media.Length > 0)
|
||||
machine[Models.Metadata.Machine.MediaKey] = Array.ConvertAll(item.Media, ConvertToInternalModel);
|
||||
|
||||
if (item.DeviceRef != null && item.DeviceRef.Any())
|
||||
machine[Models.Metadata.Machine.DeviceRefKey] = item.DeviceRef.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.DeviceRef != null && item.DeviceRef.Length > 0)
|
||||
machine[Models.Metadata.Machine.DeviceRefKey] = Array.ConvertAll(item.DeviceRef, ConvertToInternalModel);
|
||||
|
||||
if (item.Sample != null && item.Sample.Any())
|
||||
machine[Models.Metadata.Machine.SampleKey] = item.Sample.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.Sample != null && item.Sample.Length > 0)
|
||||
machine[Models.Metadata.Machine.SampleKey] = Array.ConvertAll(item.Sample, ConvertToInternalModel);
|
||||
|
||||
if (item.Archive != null && item.Archive.Any())
|
||||
machine[Models.Metadata.Machine.ArchiveKey] = item.Archive.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.Archive != null && item.Archive.Length > 0)
|
||||
machine[Models.Metadata.Machine.ArchiveKey] = Array.ConvertAll(item.Archive, ConvertToInternalModel);
|
||||
|
||||
if (item.Driver != null)
|
||||
machine[Models.Metadata.Machine.DriverKey] = ConvertToInternalModel(item.Driver);
|
||||
|
||||
if (item.SoftwareList != null && item.SoftwareList.Any())
|
||||
machine[Models.Metadata.Machine.SoftwareListKey] = item.SoftwareList.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.SoftwareList != null && item.SoftwareList.Length > 0)
|
||||
machine[Models.Metadata.Machine.SoftwareListKey] = Array.ConvertAll(item.SoftwareList, ConvertToInternalModel);
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
@@ -15,13 +15,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var m1 = header != null ? ConvertM1FromInternalModel(header) : new Models.Listxml.M1();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
m1.Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(Listxml.ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (machines != null && machines.Length > 0)
|
||||
m1.Game = Array.ConvertAll(machines, Listxml.ConvertMachineFromInternalModel);
|
||||
|
||||
return m1;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
@@ -16,12 +16,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
|
||||
};
|
||||
|
||||
if (item?.Game != null && item.Game.Any())
|
||||
if (item?.Game != null && item.Game.Length > 0)
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.Game
|
||||
.Where(g => g != null)
|
||||
.Select(Listxml.ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey]
|
||||
= Array.ConvertAll(item.Game, Listxml.ConvertMachineToInternalModel);
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.OfflineList;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -16,14 +16,11 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var dat = header != null ? ConvertHeaderFromInternalModel(header) : new Dat();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
if (machines != null && machines.Length > 0)
|
||||
{
|
||||
dat.Games = new Games
|
||||
{
|
||||
Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray()
|
||||
Game = Array.ConvertAll(machines, ConvertMachineFromInternalModel),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -101,17 +98,12 @@ namespace SabreTools.Serialization.CrossModel
|
||||
};
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
if (roms != null && roms.Length > 0)
|
||||
{
|
||||
game.RomSize = roms
|
||||
.Select(rom => rom.ReadString(Models.Metadata.Rom.SizeKey))
|
||||
.FirstOrDefault(s => s != null);
|
||||
|
||||
var romCRCs = roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
var romSizes = Array.ConvertAll(roms, r => r.ReadLong(Models.Metadata.Rom.SizeKey) ?? -1);
|
||||
game.RomSize = Array.Find(romSizes, s => s > -1).ToString();
|
||||
|
||||
var romCRCs = Array.ConvertAll(roms, ConvertFromInternalModel);;
|
||||
game.Files = new Models.OfflineList.Files { RomCRC = romCRCs };
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.OfflineList;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,12 +17,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
|
||||
};
|
||||
|
||||
if (item?.Games?.Game != null && item.Games.Game.Any())
|
||||
if (item?.Games?.Game != null && item.Games.Game.Length > 0)
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.Games.Game
|
||||
.Where(g => g != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey]
|
||||
= Array.ConvertAll(item.Games.Game, ConvertMachineToInternalModel);
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
@@ -82,17 +80,15 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.Machine.DuplicateIDKey] = item.DuplicateID,
|
||||
};
|
||||
|
||||
if (item.Files?.RomCRC != null && item.Files.RomCRC.Any())
|
||||
if (item.Files?.RomCRC != null && item.Files.RomCRC.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.RomKey] = item.Files.RomCRC
|
||||
.Where(r => r != null)
|
||||
.Select(romCRC =>
|
||||
{
|
||||
var rom = ConvertToInternalModel(romCRC);
|
||||
rom[Models.Metadata.Rom.SizeKey] = item.RomSize;
|
||||
return rom;
|
||||
})
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.RomKey]
|
||||
= Array.ConvertAll(item.Files.RomCRC, romCRC =>
|
||||
{
|
||||
var rom = ConvertToInternalModel(romCRC);
|
||||
rom[Models.Metadata.Rom.SizeKey] = item.RomSize;
|
||||
return rom;
|
||||
});
|
||||
}
|
||||
|
||||
return machine;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.OpenMSX;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -16,13 +16,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var softwareDb = header != null ? ConvertHeaderFromInternalModel(header) : new SoftwareDb();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
softwareDb.Software = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (machines != null && machines.Length > 0)
|
||||
softwareDb.Software = Array.ConvertAll(machines, ConvertMachineFromInternalModel);
|
||||
|
||||
return softwareDb;
|
||||
}
|
||||
@@ -55,13 +50,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
};
|
||||
|
||||
var dumps = item.Read<Models.Metadata.Dump[]>(Models.Metadata.Machine.DumpKey);
|
||||
if (dumps != null && dumps.Any())
|
||||
{
|
||||
game.Dump = dumps
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (dumps != null && dumps.Length > 0)
|
||||
game.Dump = Array.ConvertAll(dumps, ConvertFromInternalModel);
|
||||
|
||||
return game;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.OpenMSX;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,12 +17,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
|
||||
};
|
||||
|
||||
if (item?.Software != null && item.Software.Any())
|
||||
if (item?.Software != null && item.Software.Length > 0)
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.Software
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey]
|
||||
= Array.ConvertAll(item.Software, ConvertMachineToInternalModel);
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
@@ -55,12 +53,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.Machine.CountryKey] = item.Country,
|
||||
};
|
||||
|
||||
if (item.Dump != null && item.Dump.Any())
|
||||
if (item.Dump != null && item.Dump.Length > 0)
|
||||
{
|
||||
machine[Models.Metadata.Machine.DumpKey] = item.Dump
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
machine[Models.Metadata.Machine.DumpKey]
|
||||
= Array.ConvertAll(item.Dump, ConvertToInternalModel);
|
||||
}
|
||||
|
||||
return machine;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using SabreTools.Models.RomCenter;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,17 +17,13 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var metadataFile = header != null ? ConvertHeaderFromInternalModel(header) : new MetadataFile();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
var items = new List<Rom>();
|
||||
foreach (var machine in machines ?? [])
|
||||
{
|
||||
metadataFile.Games = new Games
|
||||
{
|
||||
Rom = machines
|
||||
.Where(m => m != null)
|
||||
.SelectMany(ConvertMachineFromInternalModel)
|
||||
.ToArray()
|
||||
};
|
||||
items.AddRange(ConvertMachineFromInternalModel(machine));
|
||||
}
|
||||
|
||||
metadataFile.Games = new Games { Rom = [.. items] };
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
@@ -93,10 +89,7 @@ namespace SabreTools.Serialization.CrossModel
|
||||
if (roms == null)
|
||||
return [];
|
||||
|
||||
return roms
|
||||
.Where(r => r != null)
|
||||
.Select(rom => ConvertFromInternalModel(rom, item))
|
||||
.ToArray();
|
||||
return Array.ConvertAll(roms, r => ConvertFromInternalModel(r, item));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.RomCenter;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,11 +17,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(obj),
|
||||
};
|
||||
|
||||
if (obj?.Games?.Rom != null && obj.Games.Rom.Any())
|
||||
if (obj?.Games?.Rom != null && obj.Games.Rom.Length > 0)
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Games.Rom
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertMachineToInternalModel).ToArray();
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey]
|
||||
= Array.ConvertAll(obj.Games.Rom, ConvertMachineToInternalModel);
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.SeparatedValue;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,14 +17,13 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var metadataFile = header != null ? ConvertHeaderFromInternalModel(header) : new MetadataFile();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
var items = new List<Row>();
|
||||
foreach (var machine in machines ?? [])
|
||||
{
|
||||
metadataFile.Row = machines
|
||||
.Where(m => m != null)
|
||||
.SelectMany(m => ConvertMachineFromInternalModel(m, header))
|
||||
.ToArray();
|
||||
items.AddRange(ConvertMachineFromInternalModel(machine, header));
|
||||
}
|
||||
|
||||
metadataFile.Row = [.. items];
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
@@ -48,27 +47,24 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var rowItems = new List<Row>();
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
if (roms != null && roms.Length > 0)
|
||||
{
|
||||
rowItems.AddRange(roms
|
||||
.Where(r => r != null)
|
||||
.Select(rom => ConvertFromInternalModel(rom, item, header)));
|
||||
rowItems.AddRange(
|
||||
Array.ConvertAll(roms, r => ConvertFromInternalModel(r, item, header)));
|
||||
}
|
||||
|
||||
var disks = item.Read<Models.Metadata.Disk[]>(Models.Metadata.Machine.DiskKey);
|
||||
if (disks != null && disks.Any())
|
||||
if (disks != null && disks.Length > 0)
|
||||
{
|
||||
rowItems.AddRange(disks
|
||||
.Where(d => d != null)
|
||||
.Select(disk => ConvertFromInternalModel(disk, item, header)));
|
||||
rowItems.AddRange(
|
||||
Array.ConvertAll(disks, d => ConvertFromInternalModel(d, item, header)));
|
||||
}
|
||||
|
||||
var media = item.Read<Models.Metadata.Media[]>(Models.Metadata.Machine.MediaKey);
|
||||
if (media != null && media.Any())
|
||||
if (media != null && media.Length > 0)
|
||||
{
|
||||
rowItems.AddRange(media
|
||||
.Where(m => m != null)
|
||||
.Select(medium => ConvertFromInternalModel(medium, item, header)));
|
||||
rowItems.AddRange(
|
||||
Array.ConvertAll(media, m => ConvertFromInternalModel(m, item, header)));
|
||||
}
|
||||
|
||||
return rowItems.ToArray();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.SeparatedValue;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,8 +17,11 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(obj),
|
||||
};
|
||||
|
||||
if (obj?.Row != null && obj.Row.Any())
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Row.Select(ConvertMachineToInternalModel).ToArray();
|
||||
if (obj?.Row != null && obj.Row.Length > 0)
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey]
|
||||
= Array.ConvertAll(obj.Row, ConvertMachineToInternalModel);
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
@@ -33,7 +36,7 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.Header.HeaderKey] = item.Header,
|
||||
};
|
||||
|
||||
if (item.Row != null && item.Row.Any())
|
||||
if (item.Row != null && item.Row.Length > 0)
|
||||
{
|
||||
var first = item.Row[0];
|
||||
//header[Models.Metadata.Header.FileNameKey] = first.FileName; // Not possible to map
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.SoftwareList;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -16,13 +16,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
var metadataFile = header != null ? ConvertHeaderFromInternalModel(header) : new Models.SoftwareList.SoftwareList();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
metadataFile.Software = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (machines != null && machines.Length > 0)
|
||||
metadataFile.Software = Array.ConvertAll(machines, ConvertMachineFromInternalModel);
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
@@ -58,31 +53,16 @@ namespace SabreTools.Serialization.CrossModel
|
||||
};
|
||||
|
||||
var infos = item.Read<Models.Metadata.Info[]>(Models.Metadata.Machine.InfoKey);
|
||||
if (infos != null && infos.Any())
|
||||
{
|
||||
software.Info = infos
|
||||
.Where(i => i != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (infos != null && infos.Length > 0)
|
||||
software.Info = Array.ConvertAll(infos, ConvertFromInternalModel);
|
||||
|
||||
var sharedFeats = item.Read<Models.Metadata.SharedFeat[]>(Models.Metadata.Machine.SharedFeatKey);
|
||||
if (sharedFeats != null && sharedFeats.Any())
|
||||
{
|
||||
software.SharedFeat = sharedFeats
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (sharedFeats != null && sharedFeats.Length > 0)
|
||||
software.SharedFeat = Array.ConvertAll(sharedFeats, ConvertFromInternalModel);
|
||||
|
||||
var parts = item.Read<Models.Metadata.Part[]>(Models.Metadata.Machine.PartKey);
|
||||
if (parts != null && parts.Any())
|
||||
{
|
||||
software.Part = parts
|
||||
.Where(p => p != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (parts != null && parts.Length > 0)
|
||||
software.Part = Array.ConvertAll(parts, ConvertFromInternalModel);
|
||||
|
||||
return software;
|
||||
}
|
||||
@@ -101,13 +81,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
};
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.DataArea.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
{
|
||||
dataArea.Rom = roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (roms != null && roms.Length > 0)
|
||||
dataArea.Rom = Array.ConvertAll(roms,ConvertFromInternalModel);
|
||||
|
||||
return dataArea;
|
||||
}
|
||||
@@ -125,13 +100,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
};
|
||||
|
||||
var dipValues = item.Read<Models.Metadata.DipValue[]>(Models.Metadata.DipSwitch.DipValueKey);
|
||||
if (dipValues != null && dipValues.Any())
|
||||
{
|
||||
dipSwitch.DipValue = dipValues
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (dipValues != null && dipValues.Length > 0)
|
||||
dipSwitch.DipValue = Array.ConvertAll(dipValues, ConvertFromInternalModel);
|
||||
|
||||
return dipSwitch;
|
||||
}
|
||||
@@ -177,13 +147,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
};
|
||||
|
||||
var disks = item.Read<Models.Metadata.Disk[]>(Models.Metadata.DiskArea.DiskKey);
|
||||
if (disks != null && disks.Any())
|
||||
{
|
||||
diskArea.Disk = disks
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (disks != null && disks.Length > 0)
|
||||
diskArea.Disk = Array.ConvertAll(disks, ConvertFromInternalModel);
|
||||
|
||||
return diskArea;
|
||||
}
|
||||
@@ -226,40 +191,20 @@ namespace SabreTools.Serialization.CrossModel
|
||||
};
|
||||
|
||||
var features = item.Read<Models.Metadata.Feature[]>(Models.Metadata.Part.FeatureKey);
|
||||
if (features != null && features.Any())
|
||||
{
|
||||
part.Feature = features
|
||||
.Where(f => f != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (features != null && features.Length > 0)
|
||||
part.Feature = Array.ConvertAll(features, ConvertFromInternalModel);
|
||||
|
||||
var dataAreas = item.Read<Models.Metadata.DataArea[]>(Models.Metadata.Part.DataAreaKey);
|
||||
if (dataAreas != null && dataAreas.Any())
|
||||
{
|
||||
part.DataArea = dataAreas
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (dataAreas != null && dataAreas.Length > 0)
|
||||
part.DataArea = Array.ConvertAll(dataAreas, ConvertFromInternalModel);
|
||||
|
||||
var diskAreas = item.Read<Models.Metadata.DiskArea[]>(Models.Metadata.Part.DiskAreaKey);
|
||||
if (diskAreas != null && diskAreas.Any())
|
||||
{
|
||||
part.DiskArea = diskAreas
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (diskAreas != null && diskAreas.Length > 0)
|
||||
part.DiskArea = Array.ConvertAll(diskAreas, ConvertFromInternalModel);
|
||||
|
||||
var dipSwitches = item.Read<Models.Metadata.DipSwitch[]>(Models.Metadata.Part.DipSwitchKey);
|
||||
if (dipSwitches != null && dipSwitches.Any())
|
||||
{
|
||||
part.DipSwitch = dipSwitches
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
if (dipSwitches != null && dipSwitches.Length > 0)
|
||||
part.DipSwitch = Array.ConvertAll(dipSwitches, ConvertFromInternalModel);
|
||||
|
||||
return part;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SabreTools.Models.SoftwareList;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,12 +17,10 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
|
||||
};
|
||||
|
||||
if (item?.Software != null && item.Software.Any())
|
||||
if (item?.Software != null && item.Software.Length > 0)
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.Software
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey]
|
||||
= Array.ConvertAll(item.Software, ConvertMachineToInternalModel);
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
@@ -58,14 +56,14 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.Machine.NotesKey] = item.Notes,
|
||||
};
|
||||
|
||||
if (item.Info != null && item.Info.Any())
|
||||
machine[Models.Metadata.Machine.InfoKey] = item.Info.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.Info != null && item.Info.Length > 0)
|
||||
machine[Models.Metadata.Machine.InfoKey] = Array.ConvertAll(item.Info, ConvertToInternalModel);
|
||||
|
||||
if (item.SharedFeat != null && item.SharedFeat.Any())
|
||||
machine[Models.Metadata.Machine.SharedFeatKey] = item.SharedFeat.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.SharedFeat != null && item.SharedFeat.Length > 0)
|
||||
machine[Models.Metadata.Machine.SharedFeatKey] = Array.ConvertAll(item.SharedFeat, ConvertToInternalModel);
|
||||
|
||||
if (item.Part != null && item.Part.Any())
|
||||
machine[Models.Metadata.Machine.PartKey] = item.Part.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.Part != null && item.Part.Length > 0)
|
||||
machine[Models.Metadata.Machine.PartKey] = Array.ConvertAll(item.Part, ConvertToInternalModel);
|
||||
|
||||
return machine;
|
||||
}
|
||||
@@ -83,8 +81,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.DataArea.EndiannessKey] = item.Endianness,
|
||||
};
|
||||
|
||||
if (item.Rom != null && item.Rom.Any())
|
||||
dataArea[Models.Metadata.DataArea.RomKey] = item.Rom.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.Rom != null && item.Rom.Length > 0)
|
||||
dataArea[Models.Metadata.DataArea.RomKey] = Array.ConvertAll(item.Rom, ConvertToInternalModel);
|
||||
|
||||
return dataArea;
|
||||
}
|
||||
@@ -101,8 +99,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.DipSwitch.MaskKey] = item.Mask,
|
||||
};
|
||||
|
||||
if (item.DipValue != null && item.DipValue.Any())
|
||||
dipSwitch[Models.Metadata.DipSwitch.DipValueKey] = item.DipValue.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.DipValue != null && item.DipValue.Length > 0)
|
||||
dipSwitch[Models.Metadata.DipSwitch.DipValueKey] = Array.ConvertAll(item.DipValue, ConvertToInternalModel);
|
||||
|
||||
return dipSwitch;
|
||||
}
|
||||
@@ -147,8 +145,8 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.DiskArea.NameKey] = item.Name,
|
||||
};
|
||||
|
||||
if (item.Disk != null && item.Disk.Any())
|
||||
diskArea[Models.Metadata.DiskArea.DiskKey] = item.Disk.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.Disk != null && item.Disk.Length > 0)
|
||||
diskArea[Models.Metadata.DiskArea.DiskKey] = Array.ConvertAll(item.Disk, ConvertToInternalModel);
|
||||
|
||||
return diskArea;
|
||||
}
|
||||
@@ -190,17 +188,17 @@ namespace SabreTools.Serialization.CrossModel
|
||||
[Models.Metadata.Part.InterfaceKey] = item.Interface,
|
||||
};
|
||||
|
||||
if (item.Feature != null && item.Feature.Any())
|
||||
part[Models.Metadata.Part.FeatureKey] = item.Feature.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.Feature != null && item.Feature.Length > 0)
|
||||
part[Models.Metadata.Part.FeatureKey] = Array.ConvertAll(item.Feature, ConvertToInternalModel);
|
||||
|
||||
if (item.DataArea != null && item.DataArea.Any())
|
||||
part[Models.Metadata.Part.DataAreaKey] = item.DataArea.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.DataArea != null && item.DataArea.Length > 0)
|
||||
part[Models.Metadata.Part.DataAreaKey] = Array.ConvertAll(item.DataArea, ConvertToInternalModel);
|
||||
|
||||
if (item.DiskArea != null && item.DiskArea.Any())
|
||||
part[Models.Metadata.Part.DiskAreaKey] = item.DiskArea.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.DiskArea != null && item.DiskArea.Length > 0)
|
||||
part[Models.Metadata.Part.DiskAreaKey] = Array.ConvertAll(item.DiskArea, ConvertToInternalModel);
|
||||
|
||||
if (item.DipSwitch != null && item.DipSwitch.Any())
|
||||
part[Models.Metadata.Part.DipSwitchKey] = item.DipSwitch.Select(ConvertToInternalModel).ToArray();
|
||||
if (item.DipSwitch != null && item.DipSwitch.Length > 0)
|
||||
part[Models.Metadata.Part.DipSwitchKey] = Array.ConvertAll(item.DipSwitch, ConvertToInternalModel);
|
||||
|
||||
return part;
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
}
|
||||
|
||||
// Set the records
|
||||
mediaKeyBlock.Records = records.ToArray();
|
||||
mediaKeyBlock.Records = [.. records];
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -164,7 +164,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
}
|
||||
|
||||
// Set the subset differences
|
||||
record.SubsetDifferences = subsetDifferences.ToArray();
|
||||
record.SubsetDifferences = [.. subsetDifferences];
|
||||
|
||||
// If there's any data left, discard it
|
||||
if (data.Position < initialOffset + length)
|
||||
@@ -205,7 +205,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
}
|
||||
|
||||
// Set the media keys
|
||||
record.MediaKeyData = mediaKeys.ToArray();
|
||||
record.MediaKeyData = [.. mediaKeys];
|
||||
|
||||
return record;
|
||||
}
|
||||
@@ -243,7 +243,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
}
|
||||
|
||||
// Set the offsets
|
||||
record.Offsets = offsets.ToArray();
|
||||
record.Offsets = [.. offsets];
|
||||
|
||||
return record;
|
||||
}
|
||||
@@ -322,7 +322,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
}
|
||||
|
||||
// Set the signature blocks
|
||||
record.SignatureBlocks = blocks.ToArray();
|
||||
record.SignatureBlocks = [.. blocks];
|
||||
|
||||
// If there's any data left, discard it
|
||||
if (data.Position < initialOffset + length)
|
||||
@@ -383,7 +383,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
}
|
||||
|
||||
// Set the signature blocks
|
||||
record.SignatureBlocks = blocks.ToArray();
|
||||
record.SignatureBlocks = [.. blocks];
|
||||
|
||||
// If there's any data left, discard it
|
||||
if (data.Position < initialOffset + length)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using SabreTools.IO.Readers;
|
||||
using SabreTools.Models.AttractMode;
|
||||
@@ -38,7 +37,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (!reader.ReadHeader() || reader.HeaderValues == null)
|
||||
return null;
|
||||
|
||||
dat.Header = reader.HeaderValues.ToArray();
|
||||
dat.Header = [.. reader.HeaderValues];
|
||||
|
||||
// Loop through the rows and parse out values
|
||||
var rows = new List<Row>();
|
||||
@@ -72,10 +71,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
Extra = reader.Line[15],
|
||||
Buttons = reader.Line[16],
|
||||
};
|
||||
|
||||
// If we have additional fields
|
||||
if (reader.Line.Count > HeaderWithoutRomnameCount)
|
||||
row.ADDITIONAL_ELEMENTS = reader.Line.Skip(HeaderWithoutRomnameCount).ToArray();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -99,17 +94,13 @@ namespace SabreTools.Serialization.Deserializers
|
||||
Extra = reader.Line[15],
|
||||
Buttons = reader.Line[16],
|
||||
};
|
||||
|
||||
// If we have additional fields
|
||||
if (reader.Line.Count > HeaderWithRomnameCount)
|
||||
row.ADDITIONAL_ELEMENTS = reader.Line.Skip(HeaderWithRomnameCount).ToArray();
|
||||
}
|
||||
|
||||
rows.Add(row);
|
||||
}
|
||||
|
||||
// Assign the rows to the Dat and return
|
||||
dat.Row = rows.ToArray();
|
||||
dat.Row = [.. rows];
|
||||
return dat;
|
||||
}
|
||||
|
||||
|
||||
@@ -70,20 +70,13 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <returns>Filled header on success, null on error</returns>
|
||||
private static Header? ParseHeader(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
Header header = new Header();
|
||||
var header = data.ReadType<Header>();
|
||||
|
||||
byte[]? magic = data.ReadBytes(4);
|
||||
if (magic == null)
|
||||
if (header == null)
|
||||
return null;
|
||||
|
||||
header.Magic = Encoding.ASCII.GetString(magic);
|
||||
if (header.Magic != SignatureString)
|
||||
return null;
|
||||
|
||||
header.Version = data.ReadInt32();
|
||||
header.Files = data.ReadInt32();
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
@@ -92,10 +85,10 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled file entry on success, null on error</returns>
|
||||
private static FileEntry ParseFileEntry(Stream data)
|
||||
private static FileEntry? ParseFileEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
FileEntry fileEntry = new FileEntry();
|
||||
var fileEntry = new FileEntry();
|
||||
|
||||
fileEntry.NameSize = data.ReadInt32();
|
||||
if (fileEntry.NameSize > 0)
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.Models.BSP;
|
||||
@@ -47,6 +46,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
for (int i = 0; i < HL_BSP_LUMP_COUNT; i++)
|
||||
{
|
||||
var lump = ParseLump(data);
|
||||
if (lump == null)
|
||||
return null;
|
||||
|
||||
file.Lumps[i] = lump;
|
||||
}
|
||||
|
||||
@@ -102,13 +104,13 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Level header on success, null on error</returns>
|
||||
/// <remarks>Only recognized versions are 29 and 30</remarks>
|
||||
private static Header? ParseHeader(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
Header header = new Header();
|
||||
var header = data.ReadType<Header>();
|
||||
|
||||
// Only recognized versions are 29 and 30
|
||||
header.Version = data.ReadUInt32();
|
||||
if (header == null)
|
||||
return null;
|
||||
if (header.Version != 29 && header.Version != 30)
|
||||
return null;
|
||||
|
||||
@@ -120,15 +122,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled lump on success, null on error</returns>
|
||||
private static Lump ParseLump(Stream data)
|
||||
private static Lump? ParseLump(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
Lump lump = new Lump();
|
||||
|
||||
lump.Offset = data.ReadUInt32();
|
||||
lump.Length = data.ReadUInt32();
|
||||
|
||||
return lump;
|
||||
return data.ReadType<Lump>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -139,7 +135,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
private static TextureHeader ParseTextureHeader(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
TextureHeader textureHeader = new TextureHeader();
|
||||
var textureHeader = new TextureHeader();
|
||||
|
||||
textureHeader.TextureCount = data.ReadUInt32();
|
||||
|
||||
@@ -166,11 +162,11 @@ namespace SabreTools.Serialization.Deserializers
|
||||
private static Texture ParseTexture(Stream data, uint mipmap = 0)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
Texture texture = new Texture();
|
||||
var texture = new Texture();
|
||||
|
||||
byte[]? name = data.ReadBytes(16)?.TakeWhile(c => c != '\0')?.ToArray();
|
||||
byte[]? name = data.ReadBytes(16);
|
||||
if (name != null)
|
||||
texture.Name = Encoding.ASCII.GetString(name);
|
||||
texture.Name = Encoding.ASCII.GetString(name).TrimEnd('\0');
|
||||
texture.Width = data.ReadUInt32();
|
||||
texture.Height = data.ReadUInt32();
|
||||
texture.Offsets = new uint[4];
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
@@ -17,6 +15,11 @@ namespace SabreTools.Serialization.Deserializers
|
||||
IFileDeserializer<TModel>,
|
||||
IStreamDeserializer<TModel>
|
||||
{
|
||||
/// <summary>
|
||||
/// Indicates if compressed files should be decompressed before processing
|
||||
/// </summary>
|
||||
protected virtual bool SkipCompression => false;
|
||||
|
||||
#region IByteDeserializer
|
||||
|
||||
/// <inheritdoc/>
|
||||
@@ -42,7 +45,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <inheritdoc/>
|
||||
public virtual TModel? Deserialize(string? path)
|
||||
{
|
||||
using var stream = PathProcessor.OpenStream(path);
|
||||
using var stream = PathProcessor.OpenStream(path, SkipCompression);
|
||||
return DeserializeStream(stream);
|
||||
}
|
||||
|
||||
@@ -98,32 +101,61 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <returns>Deserializer of the requested type, null on error</returns>
|
||||
private static TDeserializer? GetType<TDeserializer>()
|
||||
{
|
||||
var assembly = Assembly.GetExecutingAssembly();
|
||||
if (assembly == null)
|
||||
// If the deserializer type is invalid
|
||||
string? deserializerName = typeof(TDeserializer)?.Name;
|
||||
if (deserializerName == null)
|
||||
return default;
|
||||
|
||||
// If not all types can be loaded, use the ones that could be
|
||||
List<Type> assemblyTypes = [];
|
||||
try
|
||||
{
|
||||
assemblyTypes = assembly.GetTypes().ToList<Type>();
|
||||
}
|
||||
catch (ReflectionTypeLoadException rtle)
|
||||
{
|
||||
assemblyTypes = rtle.Types.Where(t => t != null)!.ToList<Type>();
|
||||
}
|
||||
// If the deserializer has no generic arguments
|
||||
var genericArgs = typeof(TDeserializer).GetGenericArguments();
|
||||
if (genericArgs.Length == 0)
|
||||
return default;
|
||||
|
||||
// Loop through all types
|
||||
foreach (Type type in assemblyTypes)
|
||||
// Loop through all loaded assemblies
|
||||
Type modelType = genericArgs[0];
|
||||
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
|
||||
{
|
||||
// If the type isn't a class or doesn't implement the interface
|
||||
if (!type.IsClass || type.GetInterface(typeof(TDeserializer).Name) == null)
|
||||
continue;
|
||||
// If the assembly is invalid
|
||||
if (assembly == null)
|
||||
return default;
|
||||
|
||||
// Try to create a concrete instance of the type
|
||||
var instance = (TDeserializer?)Activator.CreateInstance(type);
|
||||
if (instance != null)
|
||||
return instance;
|
||||
// If not all types can be loaded, use the ones that could be
|
||||
Type?[] assemblyTypes = [];
|
||||
try
|
||||
{
|
||||
assemblyTypes = assembly.GetTypes();
|
||||
}
|
||||
catch (ReflectionTypeLoadException rtle)
|
||||
{
|
||||
assemblyTypes = rtle.Types ?? [];
|
||||
}
|
||||
|
||||
// Loop through all types
|
||||
foreach (Type? type in assemblyTypes)
|
||||
{
|
||||
// If the type is invalid
|
||||
if (type == null)
|
||||
continue;
|
||||
|
||||
// If the type isn't a class
|
||||
if (!type.IsClass)
|
||||
continue;
|
||||
|
||||
// If the type doesn't implement the interface
|
||||
var interfaceType = type.GetInterface(deserializerName);
|
||||
if (interfaceType == null)
|
||||
continue;
|
||||
|
||||
// If the interface doesn't use the correct type parameter
|
||||
var genericTypes = interfaceType.GetGenericArguments();
|
||||
if (genericTypes.Length != 1 || genericTypes[0] != modelType)
|
||||
continue;
|
||||
|
||||
// Try to create a concrete instance of the type
|
||||
var instance = (TDeserializer?)Activator.CreateInstance(type);
|
||||
if (instance != null)
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
|
||||
return default;
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
#region DIFAT Sector Numbers
|
||||
|
||||
// Create a DIFAT sector table
|
||||
var difatSectors = new List<SectorNumber?>();
|
||||
var difatSectors = new List<SectorNumber>();
|
||||
|
||||
// Add the sectors from the header
|
||||
if (fileHeader.DIFAT != null)
|
||||
@@ -77,14 +77,14 @@ namespace SabreTools.Serialization.Deserializers
|
||||
}
|
||||
|
||||
// Assign the DIFAT sectors table
|
||||
binary.DIFATSectorNumbers = difatSectors.ToArray();
|
||||
binary.DIFATSectorNumbers = [.. difatSectors];
|
||||
|
||||
#endregion
|
||||
|
||||
#region FAT Sector Numbers
|
||||
|
||||
// Create a FAT sector table
|
||||
var fatSectors = new List<SectorNumber?>();
|
||||
var fatSectors = new List<SectorNumber>();
|
||||
|
||||
// Loop through and add the FAT sectors
|
||||
currentSector = binary.DIFATSectorNumbers[0];
|
||||
@@ -115,14 +115,14 @@ namespace SabreTools.Serialization.Deserializers
|
||||
}
|
||||
|
||||
// Assign the FAT sectors table
|
||||
binary.FATSectorNumbers = fatSectors.ToArray();
|
||||
binary.FATSectorNumbers = [.. fatSectors];
|
||||
|
||||
#endregion
|
||||
|
||||
#region Mini FAT Sector Numbers
|
||||
|
||||
// Create a mini FAT sector table
|
||||
var miniFatSectors = new List<SectorNumber?>();
|
||||
var miniFatSectors = new List<SectorNumber>();
|
||||
|
||||
// Loop through and add the mini FAT sectors
|
||||
currentSector = (SectorNumber)fileHeader.FirstMiniFATSectorLocation;
|
||||
@@ -153,7 +153,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
}
|
||||
|
||||
// Assign the mini FAT sectors table
|
||||
binary.MiniFATSectorNumbers = miniFatSectors.ToArray();
|
||||
binary.MiniFATSectorNumbers = [.. miniFatSectors];
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -219,7 +219,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
}
|
||||
|
||||
// Assign the Directory sectors table
|
||||
binary.DirectoryEntries = directorySectors.ToArray();
|
||||
binary.DirectoryEntries = [.. directorySectors];
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -233,49 +233,23 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <returns>Filled file header on success, null on error</returns>
|
||||
private static FileHeader? ParseFileHeader(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
FileHeader header = new FileHeader();
|
||||
var header = data.ReadType<FileHeader>();
|
||||
|
||||
header.Signature = data.ReadUInt64();
|
||||
if (header == null)
|
||||
return null;
|
||||
if (header.Signature != SignatureUInt64)
|
||||
return null;
|
||||
|
||||
header.CLSID = data.ReadGuid();
|
||||
header.MinorVersion = data.ReadUInt16();
|
||||
header.MajorVersion = data.ReadUInt16();
|
||||
header.ByteOrder = data.ReadUInt16();
|
||||
if (header.ByteOrder != 0xFFFE)
|
||||
return null;
|
||||
|
||||
header.SectorShift = data.ReadUInt16();
|
||||
if (header.MajorVersion == 3 && header.SectorShift != 0x0009)
|
||||
return null;
|
||||
else if (header.MajorVersion == 4 && header.SectorShift != 0x000C)
|
||||
return null;
|
||||
|
||||
header.MiniSectorShift = data.ReadUInt16();
|
||||
header.Reserved = data.ReadBytes(6);
|
||||
header.NumberOfDirectorySectors = data.ReadUInt32();
|
||||
if (header.MajorVersion == 3 && header.NumberOfDirectorySectors != 0)
|
||||
return null;
|
||||
|
||||
header.NumberOfFATSectors = data.ReadUInt32();
|
||||
header.FirstDirectorySectorLocation = data.ReadUInt32();
|
||||
header.TransactionSignatureNumber = data.ReadUInt32();
|
||||
header.MiniStreamCutoffSize = data.ReadUInt32();
|
||||
if (header.MiniStreamCutoffSize != 0x00001000)
|
||||
return null;
|
||||
|
||||
header.FirstMiniFATSectorLocation = data.ReadUInt32();
|
||||
header.NumberOfMiniFATSectors = data.ReadUInt32();
|
||||
header.FirstDIFATSectorLocation = data.ReadUInt32();
|
||||
header.NumberOfDIFATSectors = data.ReadUInt32();
|
||||
header.DIFAT = new SectorNumber?[109];
|
||||
for (int i = 0; i < header.DIFAT.Length; i++)
|
||||
{
|
||||
header.DIFAT[i] = (SectorNumber)data.ReadUInt32();
|
||||
}
|
||||
|
||||
// Skip rest of sector for version 4
|
||||
if (header.MajorVersion == 4)
|
||||
_ = data.ReadBytes(3584);
|
||||
@@ -289,11 +263,11 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <param name="sectorShift">Sector shift from the header</param>
|
||||
/// <returns>Filled sector full of sector numbers on success, null on error</returns>
|
||||
private static SectorNumber?[] ParseSectorNumbers(Stream data, ushort sectorShift)
|
||||
private static SectorNumber[] ParseSectorNumbers(Stream data, ushort sectorShift)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
int sectorCount = (int)(Math.Pow(2, sectorShift) / sizeof(uint));
|
||||
var sectorNumbers = new SectorNumber?[sectorCount];
|
||||
var sectorNumbers = new SectorNumber[sectorCount];
|
||||
|
||||
for (int i = 0; i < sectorNumbers.Length; i++)
|
||||
{
|
||||
@@ -315,7 +289,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
// TODO: Use marshalling here instead of building
|
||||
const int directoryEntrySize = 64 + 2 + 1 + 1 + 4 + 4 + 4 + 16 + 4 + 8 + 8 + 4 + 8;
|
||||
int sectorCount = (int)(Math.Pow(2, sectorShift) / directoryEntrySize);
|
||||
DirectoryEntry[] directoryEntries = new DirectoryEntry[sectorCount];
|
||||
var directoryEntries = new DirectoryEntry[sectorCount];
|
||||
|
||||
for (int i = 0; i < directoryEntries.Length; i++)
|
||||
{
|
||||
@@ -335,26 +309,17 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <param name="majorVersion">Major version from the header</param>
|
||||
/// <returns>Filled directory entry on success, null on error</returns>
|
||||
private static DirectoryEntry ParseDirectoryEntry(Stream data, ushort majorVersion)
|
||||
private static DirectoryEntry? ParseDirectoryEntry(Stream data, ushort majorVersion)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
DirectoryEntry directoryEntry = new DirectoryEntry();
|
||||
var directoryEntry = data.ReadType<DirectoryEntry>();
|
||||
|
||||
byte[]? name = data.ReadBytes(64);
|
||||
if (name != null)
|
||||
directoryEntry.Name = Encoding.Unicode.GetString(name).TrimEnd('\0');
|
||||
directoryEntry.NameLength = data.ReadUInt16();
|
||||
directoryEntry.ObjectType = (ObjectType)data.ReadByteValue();
|
||||
directoryEntry.ColorFlag = (ColorFlag)data.ReadByteValue();
|
||||
directoryEntry.LeftSiblingID = (StreamID)data.ReadUInt32();
|
||||
directoryEntry.RightSiblingID = (StreamID)data.ReadUInt32();
|
||||
directoryEntry.ChildID = (StreamID)data.ReadUInt32();
|
||||
directoryEntry.CLSID = data.ReadGuid();
|
||||
directoryEntry.StateBits = data.ReadUInt32();
|
||||
directoryEntry.CreationTime = data.ReadUInt64();
|
||||
directoryEntry.ModifiedTime = data.ReadUInt64();
|
||||
directoryEntry.StartingSectorLocation = data.ReadUInt32();
|
||||
directoryEntry.StreamSize = data.ReadUInt64();
|
||||
if (directoryEntry == null)
|
||||
return null;
|
||||
|
||||
// TEMPORARY FIX FOR ASCII -> UNICODE
|
||||
directoryEntry.Name = Encoding.Unicode.GetString(Encoding.ASCII.GetBytes(directoryEntry.Name!));
|
||||
|
||||
// Handle version 3 entries
|
||||
if (majorVersion == 3)
|
||||
directoryEntry.StreamSize &= 0x0000FFFF;
|
||||
|
||||
|
||||
253
SabreTools.Serialization/Deserializers/CHD.cs
Normal file
253
SabreTools.Serialization/Deserializers/CHD.cs
Normal file
@@ -0,0 +1,253 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.Models.CHD;
|
||||
|
||||
namespace SabreTools.Serialization.Deserializers
|
||||
{
|
||||
// TODO: Expand this to full CHD files eventually
|
||||
public class CHD : BaseBinaryDeserializer<Header>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override Header? Deserialize(Stream? data)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (data.Position < 0 || data.Position >= data.Length)
|
||||
return null;
|
||||
|
||||
// Cache the current offset
|
||||
int initialOffset = (int)data.Position;
|
||||
|
||||
// Determine the header version
|
||||
uint version = GetVersion(data);
|
||||
|
||||
// Read and return the current CHD
|
||||
return version switch
|
||||
{
|
||||
1 => ParseHeaderV1(data),
|
||||
2 => ParseHeaderV2(data),
|
||||
3 => ParseHeaderV3(data),
|
||||
4 => ParseHeaderV4(data),
|
||||
5 => ParseHeaderV5(data),
|
||||
_ => null,
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the matching CHD version, if possible
|
||||
/// </summary>
|
||||
/// <returns>Matching version, 0 if none</returns>
|
||||
private static uint GetVersion(Stream data)
|
||||
{
|
||||
// Read the header values
|
||||
byte[] tagBytes = data.ReadBytes(8);
|
||||
string tag = Encoding.ASCII.GetString(tagBytes);
|
||||
uint length = data.ReadUInt32BigEndian();
|
||||
uint version = data.ReadUInt32BigEndian();
|
||||
|
||||
// Seek back to start
|
||||
data.SeekIfPossible();
|
||||
|
||||
// Check the signature
|
||||
if (!string.Equals(tag, Constants.SignatureString, StringComparison.Ordinal))
|
||||
return 0;
|
||||
|
||||
// Match the version to header length
|
||||
#if NET472_OR_GREATER || NETCOREAPP
|
||||
return (version, length) switch
|
||||
{
|
||||
(1, Constants.HeaderV1Size) => version,
|
||||
(2, Constants.HeaderV2Size) => version,
|
||||
(3, Constants.HeaderV3Size) => version,
|
||||
(4, Constants.HeaderV4Size) => version,
|
||||
(5, Constants.HeaderV5Size) => version,
|
||||
_ => 0,
|
||||
};
|
||||
#else
|
||||
return version switch
|
||||
{
|
||||
1 => length == Constants.HeaderV1Size ? version : 0,
|
||||
2 => length == Constants.HeaderV2Size ? version : 0,
|
||||
3 => length == Constants.HeaderV3Size ? version : 0,
|
||||
4 => length == Constants.HeaderV4Size ? version : 0,
|
||||
5 => length == Constants.HeaderV5Size ? version : 0,
|
||||
_ => 0,
|
||||
};
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse a Stream into a V1 header
|
||||
/// </summary>
|
||||
private static HeaderV1? ParseHeaderV1(Stream data)
|
||||
{
|
||||
var header = new HeaderV1();
|
||||
|
||||
byte[] tagBytes = data.ReadBytes(8);
|
||||
header.Tag = Encoding.ASCII.GetString(tagBytes);
|
||||
if (header.Tag != Constants.SignatureString)
|
||||
return null;
|
||||
|
||||
header.Length = data.ReadUInt32BigEndian();
|
||||
if (header.Length != Constants.HeaderV1Size)
|
||||
return null;
|
||||
|
||||
header.Version = data.ReadUInt32BigEndian();
|
||||
header.Flags = (Flags)data.ReadUInt32BigEndian();
|
||||
header.Compression = (CompressionType)data.ReadUInt32BigEndian();
|
||||
if (header.Compression > CompressionType.CHDCOMPRESSION_ZLIB)
|
||||
return null;
|
||||
|
||||
header.HunkSize = data.ReadUInt32BigEndian();
|
||||
header.TotalHunks = data.ReadUInt32BigEndian();
|
||||
header.Cylinders = data.ReadUInt32BigEndian();
|
||||
header.Heads = data.ReadUInt32BigEndian();
|
||||
header.Sectors = data.ReadUInt32BigEndian();
|
||||
header.MD5 = data.ReadBytes(16);
|
||||
header.ParentMD5 = data.ReadBytes(16);
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse a Stream into a V2 header
|
||||
/// </summary>
|
||||
private static HeaderV2? ParseHeaderV2(Stream data)
|
||||
{
|
||||
var header = new HeaderV2();
|
||||
|
||||
byte[] tagBytes = data.ReadBytes(8);
|
||||
header.Tag = Encoding.ASCII.GetString(tagBytes);
|
||||
if (header.Tag != Constants.SignatureString)
|
||||
return null;
|
||||
|
||||
header.Length = data.ReadUInt32BigEndian();
|
||||
if (header.Length != Constants.HeaderV2Size)
|
||||
return null;
|
||||
|
||||
header.Version = data.ReadUInt32BigEndian();
|
||||
header.Flags = (Flags)data.ReadUInt32BigEndian();
|
||||
header.Compression = (CompressionType)data.ReadUInt32BigEndian();
|
||||
if (header.Compression > CompressionType.CHDCOMPRESSION_ZLIB)
|
||||
return null;
|
||||
|
||||
header.HunkSize = data.ReadUInt32BigEndian();
|
||||
header.TotalHunks = data.ReadUInt32BigEndian();
|
||||
header.Cylinders = data.ReadUInt32BigEndian();
|
||||
header.Heads = data.ReadUInt32BigEndian();
|
||||
header.Sectors = data.ReadUInt32BigEndian();
|
||||
header.MD5 = data.ReadBytes(16);
|
||||
header.ParentMD5 = data.ReadBytes(16);
|
||||
header.BytesPerSector = data.ReadUInt32BigEndian();
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse a Stream into a V3 header
|
||||
/// </summary>
|
||||
private static HeaderV3? ParseHeaderV3(Stream data)
|
||||
{
|
||||
var header = new HeaderV3();
|
||||
|
||||
byte[] tagBytes = data.ReadBytes(8);
|
||||
header.Tag = Encoding.ASCII.GetString(tagBytes);
|
||||
if (header.Tag != Constants.SignatureString)
|
||||
return null;
|
||||
|
||||
header.Length = data.ReadUInt32BigEndian();
|
||||
if (header.Length != Constants.HeaderV3Size)
|
||||
return null;
|
||||
|
||||
header.Version = data.ReadUInt32BigEndian();
|
||||
header.Flags = (Flags)data.ReadUInt32BigEndian();
|
||||
header.Compression = (CompressionType)data.ReadUInt32BigEndian();
|
||||
if (header.Compression > CompressionType.CHDCOMPRESSION_ZLIB_PLUS)
|
||||
return null;
|
||||
|
||||
header.TotalHunks = data.ReadUInt32BigEndian();
|
||||
header.LogicalBytes = data.ReadUInt64BigEndian();
|
||||
header.MetaOffset = data.ReadUInt64BigEndian();
|
||||
header.MD5 = data.ReadBytes(16);
|
||||
header.ParentMD5 = data.ReadBytes(16);
|
||||
header.HunkBytes = data.ReadUInt32BigEndian();
|
||||
header.SHA1 = data.ReadBytes(20);
|
||||
header.ParentSHA1 = data.ReadBytes(20);
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse a Stream into a V4 header
|
||||
/// </summary>
|
||||
private static HeaderV4? ParseHeaderV4(Stream data)
|
||||
{
|
||||
var header = new HeaderV4();
|
||||
|
||||
byte[] tagBytes = data.ReadBytes(8);
|
||||
header.Tag = Encoding.ASCII.GetString(tagBytes);
|
||||
if (header.Tag != Constants.SignatureString)
|
||||
return null;
|
||||
|
||||
header.Length = data.ReadUInt32BigEndian();
|
||||
if (header.Length != Constants.HeaderV4Size)
|
||||
return null;
|
||||
|
||||
header.Version = data.ReadUInt32BigEndian();
|
||||
header.Flags = (Flags)data.ReadUInt32BigEndian();
|
||||
header.Compression = (CompressionType)data.ReadUInt32BigEndian();
|
||||
if (header.Compression > CompressionType.CHDCOMPRESSION_AV)
|
||||
return null;
|
||||
|
||||
header.TotalHunks = data.ReadUInt32BigEndian();
|
||||
header.LogicalBytes = data.ReadUInt64BigEndian();
|
||||
header.MetaOffset = data.ReadUInt64BigEndian();
|
||||
header.HunkBytes = data.ReadUInt32BigEndian();
|
||||
header.SHA1 = data.ReadBytes(20);
|
||||
header.ParentSHA1 = data.ReadBytes(20);
|
||||
header.RawSHA1 = data.ReadBytes(20);
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse a Stream into a V5 header
|
||||
/// </summary>
|
||||
private static HeaderV5? ParseHeaderV5(Stream data)
|
||||
{
|
||||
var header = new HeaderV5();
|
||||
|
||||
byte[] tagBytes = data.ReadBytes(8);
|
||||
header.Tag = Encoding.ASCII.GetString(tagBytes);
|
||||
if (header.Tag != Constants.SignatureString)
|
||||
return null;
|
||||
|
||||
header.Length = data.ReadUInt32BigEndian();
|
||||
if (header.Length != Constants.HeaderV5Size)
|
||||
return null;
|
||||
|
||||
header.Version = data.ReadUInt32BigEndian();
|
||||
header.Compressors = new CodecType[4];
|
||||
for (int i = 0; i < header.Compressors.Length; i++)
|
||||
{
|
||||
header.Compressors[i] = (CodecType)data.ReadUInt32BigEndian();
|
||||
}
|
||||
|
||||
header.LogicalBytes = data.ReadUInt64BigEndian();
|
||||
header.MapOffset = data.ReadUInt64BigEndian();
|
||||
header.MetaOffset = data.ReadUInt64BigEndian();
|
||||
header.HunkBytes = data.ReadUInt32BigEndian();
|
||||
header.UnitBytes = data.ReadUInt32BigEndian();
|
||||
header.RawSHA1 = data.ReadBytes(20);
|
||||
header.SHA1 = data.ReadBytes(20);
|
||||
header.ParentSHA1 = data.ReadBytes(20);
|
||||
|
||||
return header;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -145,22 +145,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled CIA header on success, null on error</returns>
|
||||
private static CIAHeader ParseCIAHeader(Stream data)
|
||||
public static CIAHeader? ParseCIAHeader(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
CIAHeader ciaHeader = new CIAHeader();
|
||||
|
||||
ciaHeader.HeaderSize = data.ReadUInt32();
|
||||
ciaHeader.Type = data.ReadUInt16();
|
||||
ciaHeader.Version = data.ReadUInt16();
|
||||
ciaHeader.CertificateChainSize = data.ReadUInt32();
|
||||
ciaHeader.TicketSize = data.ReadUInt32();
|
||||
ciaHeader.TMDFileSize = data.ReadUInt32();
|
||||
ciaHeader.MetaSize = data.ReadUInt32();
|
||||
ciaHeader.ContentSize = data.ReadUInt64();
|
||||
ciaHeader.ContentIndex = data.ReadBytes(0x2000);
|
||||
|
||||
return ciaHeader;
|
||||
return data.ReadType<CIAHeader>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -168,7 +155,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled certificate on success, null on error</returns>
|
||||
private static Certificate? ParseCertificate(Stream data)
|
||||
public static Certificate? ParseCertificate(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
Certificate certificate = new Certificate();
|
||||
@@ -244,7 +231,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <param name="fromCdn">Indicates if the ticket is from CDN</param>
|
||||
/// <returns>Filled ticket on success, null on error</returns>
|
||||
private static Ticket? ParseTicket(Stream data, bool fromCdn = false)
|
||||
public static Ticket? ParseTicket(Stream data, bool fromCdn = false)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
Ticket ticket = new Ticket();
|
||||
@@ -349,10 +336,10 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <param name="fromCdn">Indicates if the ticket is from CDN</param>
|
||||
/// <returns>Filled title metadata on success, null on error</returns>
|
||||
private static TitleMetadata? ParseTitleMetadata(Stream data, bool fromCdn = false)
|
||||
public static TitleMetadata? ParseTitleMetadata(Stream data, bool fromCdn = false)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
TitleMetadata titleMetadata = new TitleMetadata();
|
||||
var titleMetadata = new TitleMetadata();
|
||||
|
||||
titleMetadata.SignatureType = (SignatureType)data.ReadUInt32();
|
||||
switch (titleMetadata.SignatureType)
|
||||
@@ -420,11 +407,19 @@ namespace SabreTools.Serialization.Deserializers
|
||||
titleMetadata.ContentInfoRecords = new ContentInfoRecord[64];
|
||||
for (int i = 0; i < 64; i++)
|
||||
{
|
||||
var contentInfoRecord = ParseContentInfoRecord(data);
|
||||
if (contentInfoRecord == null)
|
||||
return null;
|
||||
|
||||
titleMetadata.ContentInfoRecords[i] = ParseContentInfoRecord(data);
|
||||
}
|
||||
titleMetadata.ContentChunkRecords = new ContentChunkRecord[titleMetadata.ContentCount];
|
||||
for (int i = 0; i < titleMetadata.ContentCount; i++)
|
||||
{
|
||||
var contentChunkRecord = ParseContentChunkRecord(data);
|
||||
if (contentChunkRecord == null)
|
||||
return null;
|
||||
|
||||
titleMetadata.ContentChunkRecords[i] = ParseContentChunkRecord(data);
|
||||
}
|
||||
|
||||
@@ -450,16 +445,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled content info record on success, null on error</returns>
|
||||
private static ContentInfoRecord ParseContentInfoRecord(Stream data)
|
||||
public static ContentInfoRecord? ParseContentInfoRecord(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
ContentInfoRecord contentInfoRecord = new ContentInfoRecord();
|
||||
|
||||
contentInfoRecord.ContentIndexOffset = data.ReadUInt16();
|
||||
contentInfoRecord.ContentCommandCount = data.ReadUInt16();
|
||||
contentInfoRecord.UnhashedContentRecordsSHA256Hash = data.ReadBytes(0x20);
|
||||
|
||||
return contentInfoRecord;
|
||||
return data.ReadType<ContentInfoRecord>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -467,18 +455,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled content chunk record on success, null on error</returns>
|
||||
private static ContentChunkRecord ParseContentChunkRecord(Stream data)
|
||||
public static ContentChunkRecord? ParseContentChunkRecord(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
ContentChunkRecord contentChunkRecord = new ContentChunkRecord();
|
||||
|
||||
contentChunkRecord.ContentId = data.ReadUInt32();
|
||||
contentChunkRecord.ContentIndex = (ContentIndex)data.ReadUInt16();
|
||||
contentChunkRecord.ContentType = (TMDContentType)data.ReadUInt16();
|
||||
contentChunkRecord.ContentSize = data.ReadUInt64();
|
||||
contentChunkRecord.SHA256Hash = data.ReadBytes(0x20);
|
||||
|
||||
return contentChunkRecord;
|
||||
return data.ReadType<ContentChunkRecord>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -486,18 +465,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled meta data on success, null on error</returns>
|
||||
private static MetaData ParseMetaData(Stream data)
|
||||
public static MetaData? ParseMetaData(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
MetaData metaData = new MetaData();
|
||||
|
||||
metaData.TitleIDDependencyList = data.ReadBytes(0x180);
|
||||
metaData.Reserved1 = data.ReadBytes(0x180);
|
||||
metaData.CoreVersion = data.ReadUInt32();
|
||||
metaData.Reserved2 = data.ReadBytes(0xFC);
|
||||
metaData.IconData = data.ReadBytes(0x36C0);
|
||||
|
||||
return metaData;
|
||||
return data.ReadType<MetaData>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -70,7 +70,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
var deserializer = new ClrMamePro();
|
||||
return deserializer.Deserialize(data, quotes);
|
||||
}
|
||||
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override MetadataFile? Deserialize(Stream? data)
|
||||
=> Deserialize(data, true);
|
||||
@@ -102,9 +102,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
var videos = new List<Video>();
|
||||
var dipSwitches = new List<DipSwitch>();
|
||||
|
||||
var additional = new List<string>();
|
||||
var headerAdditional = new List<string>();
|
||||
var gameAdditional = new List<string>();
|
||||
while (!reader.EndOfStream)
|
||||
{
|
||||
// If we have no next line
|
||||
@@ -120,12 +117,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case CmpRowType.EndTopLevel:
|
||||
switch (lastTopLevel)
|
||||
{
|
||||
case "doscenter":
|
||||
if (dat.ClrMamePro != null)
|
||||
dat.ClrMamePro.ADDITIONAL_ELEMENTS = [.. headerAdditional];
|
||||
|
||||
headerAdditional.Clear();
|
||||
break;
|
||||
case "game":
|
||||
case "machine":
|
||||
case "resource":
|
||||
@@ -142,7 +133,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
game.Chip = [.. chips];
|
||||
game.Video = [.. videos];
|
||||
game.DipSwitch = [.. dipSwitches];
|
||||
game.ADDITIONAL_ELEMENTS = [.. gameAdditional];
|
||||
|
||||
games.Add(game);
|
||||
game = null;
|
||||
@@ -158,10 +148,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
chips.Clear();
|
||||
videos.Clear();
|
||||
dipSwitches.Clear();
|
||||
gameAdditional.Clear();
|
||||
break;
|
||||
default:
|
||||
// No-op
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
@@ -188,10 +174,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "set":
|
||||
game = new Set();
|
||||
break;
|
||||
default:
|
||||
if (reader.CurrentLine != null)
|
||||
additional.Add(reader.CurrentLine);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -249,10 +231,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "forcepacking":
|
||||
dat.ClrMamePro.ForcePacking = reader.Standalone?.Value;
|
||||
break;
|
||||
default:
|
||||
if (reader.CurrentLine != null)
|
||||
headerAdditional.Add(reader.CurrentLine);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -303,14 +281,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
var sample = new Sample
|
||||
{
|
||||
Name = reader.Standalone?.Value ?? string.Empty,
|
||||
ADDITIONAL_ELEMENTS = [],
|
||||
};
|
||||
samples.Add(sample);
|
||||
break;
|
||||
default:
|
||||
if (reader.CurrentLine != null)
|
||||
gameAdditional.Add(reader.CurrentLine);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -391,22 +364,13 @@ namespace SabreTools.Serialization.Deserializers
|
||||
game.Driver = driver;
|
||||
break;
|
||||
default:
|
||||
if (reader.CurrentLine != null)
|
||||
gameAdditional.Add(reader.CurrentLine);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
if (reader.CurrentLine != null)
|
||||
additional.Add(reader.CurrentLine);
|
||||
}
|
||||
}
|
||||
|
||||
// Add extra pieces and return
|
||||
dat.Game = [.. games];
|
||||
dat.ADDITIONAL_ELEMENTS = [.. additional];
|
||||
return dat;
|
||||
}
|
||||
|
||||
@@ -447,7 +411,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
}
|
||||
}
|
||||
|
||||
release.ADDITIONAL_ELEMENTS = [.. itemAdditional];
|
||||
return release;
|
||||
}
|
||||
|
||||
@@ -461,7 +424,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Internal == null)
|
||||
return null;
|
||||
|
||||
var itemAdditional = new List<string>();
|
||||
var biosset = new BiosSet();
|
||||
foreach (var kvp in reader.Internal)
|
||||
{
|
||||
@@ -476,13 +438,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "default":
|
||||
biosset.Default = kvp.Value;
|
||||
break;
|
||||
default:
|
||||
itemAdditional.Add($"{kvp.Key}: {kvp.Value}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
biosset.ADDITIONAL_ELEMENTS = [.. itemAdditional];
|
||||
return biosset;
|
||||
}
|
||||
|
||||
@@ -496,7 +454,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Internal == null)
|
||||
return null;
|
||||
|
||||
var itemAdditional = new List<string>();
|
||||
var rom = new Rom();
|
||||
foreach (var kvp in reader.Internal)
|
||||
{
|
||||
@@ -565,13 +522,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "mia":
|
||||
rom.MIA = kvp.Value;
|
||||
break;
|
||||
default:
|
||||
itemAdditional.Add($"{kvp.Key}: {kvp.Value}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
rom.ADDITIONAL_ELEMENTS = [.. itemAdditional];
|
||||
return rom;
|
||||
}
|
||||
|
||||
@@ -585,7 +538,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Internal == null)
|
||||
return null;
|
||||
|
||||
var itemAdditional = new List<string>();
|
||||
var disk = new Disk();
|
||||
foreach (var kvp in reader.Internal)
|
||||
{
|
||||
@@ -609,13 +561,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "flags":
|
||||
disk.Flags = kvp.Value;
|
||||
break;
|
||||
default:
|
||||
itemAdditional.Add($"{kvp.Key}: {kvp.Value}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
disk.ADDITIONAL_ELEMENTS = [.. itemAdditional];
|
||||
return disk;
|
||||
}
|
||||
|
||||
@@ -629,7 +577,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Internal == null)
|
||||
return null;
|
||||
|
||||
var itemAdditional = new List<string>();
|
||||
var media = new Media();
|
||||
foreach (var kvp in reader.Internal)
|
||||
{
|
||||
@@ -650,13 +597,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "spamsum":
|
||||
media.SpamSum = kvp.Value;
|
||||
break;
|
||||
default:
|
||||
itemAdditional.Add($"{kvp.Key}: {kvp.Value}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
media.ADDITIONAL_ELEMENTS = [.. itemAdditional];
|
||||
return media;
|
||||
}
|
||||
|
||||
@@ -670,7 +613,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Internal == null)
|
||||
return null;
|
||||
|
||||
var itemAdditional = new List<string>();
|
||||
var sample = new Sample();
|
||||
foreach (var kvp in reader.Internal)
|
||||
{
|
||||
@@ -679,13 +621,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "name":
|
||||
sample.Name = kvp.Value;
|
||||
break;
|
||||
default:
|
||||
itemAdditional.Add($"{kvp.Key}: {kvp.Value}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
sample.ADDITIONAL_ELEMENTS = [.. itemAdditional];
|
||||
return sample;
|
||||
}
|
||||
|
||||
@@ -699,7 +637,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Internal == null)
|
||||
return null;
|
||||
|
||||
var itemAdditional = new List<string>();
|
||||
var archive = new Archive();
|
||||
foreach (var kvp in reader.Internal)
|
||||
{
|
||||
@@ -708,13 +645,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "name":
|
||||
archive.Name = kvp.Value;
|
||||
break;
|
||||
default:
|
||||
itemAdditional.Add($"{kvp.Key}: {kvp.Value}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
archive.ADDITIONAL_ELEMENTS = [.. itemAdditional];
|
||||
return archive;
|
||||
}
|
||||
|
||||
@@ -728,7 +661,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Internal == null)
|
||||
return null;
|
||||
|
||||
var itemAdditional = new List<string>();
|
||||
var chip = new Chip();
|
||||
foreach (var kvp in reader.Internal)
|
||||
{
|
||||
@@ -746,13 +678,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "clock":
|
||||
chip.Clock = kvp.Value;
|
||||
break;
|
||||
default:
|
||||
itemAdditional.Add($"{kvp.Key}: {kvp.Value}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
chip.ADDITIONAL_ELEMENTS = itemAdditional.ToArray();
|
||||
return chip;
|
||||
}
|
||||
|
||||
@@ -766,7 +694,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Internal == null)
|
||||
return null;
|
||||
|
||||
var itemAdditional = new List<string>();
|
||||
var video = new Video();
|
||||
foreach (var kvp in reader.Internal)
|
||||
{
|
||||
@@ -793,13 +720,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "freq":
|
||||
video.Freq = kvp.Value;
|
||||
break;
|
||||
default:
|
||||
itemAdditional.Add($"{kvp.Key}: {kvp.Value}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
video.ADDITIONAL_ELEMENTS = itemAdditional.ToArray();
|
||||
return video;
|
||||
}
|
||||
|
||||
@@ -813,7 +736,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Internal == null)
|
||||
return null;
|
||||
|
||||
var itemAdditional = new List<string>();
|
||||
var sound = new Sound();
|
||||
foreach (var kvp in reader.Internal)
|
||||
{
|
||||
@@ -822,13 +744,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "channels":
|
||||
sound.Channels = kvp.Value;
|
||||
break;
|
||||
default:
|
||||
itemAdditional.Add($"{kvp.Key}: {kvp.Value}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
sound.ADDITIONAL_ELEMENTS = itemAdditional.ToArray();
|
||||
return sound;
|
||||
}
|
||||
|
||||
@@ -842,7 +760,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Internal == null)
|
||||
return null;
|
||||
|
||||
var itemAdditional = new List<string>();
|
||||
var input = new Input();
|
||||
foreach (var kvp in reader.Internal)
|
||||
{
|
||||
@@ -866,13 +783,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "service":
|
||||
input.Service = kvp.Value;
|
||||
break;
|
||||
default:
|
||||
itemAdditional.Add($"{kvp.Key}: {kvp.Value}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
input.ADDITIONAL_ELEMENTS = itemAdditional.ToArray();
|
||||
return input;
|
||||
}
|
||||
|
||||
@@ -886,7 +799,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Internal == null)
|
||||
return null;
|
||||
|
||||
var itemAdditional = new List<string>();
|
||||
var dipswitch = new DipSwitch();
|
||||
var entries = new List<string>();
|
||||
foreach (var kvp in reader.Internal)
|
||||
@@ -902,14 +814,10 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "default":
|
||||
dipswitch.Default = kvp.Value;
|
||||
break;
|
||||
default:
|
||||
itemAdditional.Add($"{kvp.Key}: {kvp.Value}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
dipswitch.Entry = [.. entries];
|
||||
dipswitch.ADDITIONAL_ELEMENTS = itemAdditional.ToArray();
|
||||
return dipswitch;
|
||||
}
|
||||
|
||||
@@ -923,7 +831,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Internal == null)
|
||||
return null;
|
||||
|
||||
var itemAdditional = new List<string>();
|
||||
var driver = new Driver();
|
||||
foreach (var kvp in reader.Internal)
|
||||
{
|
||||
@@ -944,13 +851,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "blit":
|
||||
driver.Blit = kvp.Value;
|
||||
break;
|
||||
default:
|
||||
itemAdditional.Add($"{kvp.Key}: {kvp.Value}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
driver.ADDITIONAL_ELEMENTS = itemAdditional.ToArray();
|
||||
return driver;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.Models.CueSheets;
|
||||
@@ -44,11 +43,13 @@ namespace SabreTools.Serialization.Deserializers
|
||||
continue;
|
||||
|
||||
// http://stackoverflow.com/questions/554013/regular-expression-to-split-on-spaces-unless-in-quotes
|
||||
string[] splitLine = Regex
|
||||
.Matches(line, @"[^\s""]+|""[^""]*""")
|
||||
.Cast<Match>()
|
||||
.Select(m => m.Groups[0].Value)
|
||||
.ToArray();
|
||||
var matchCol = Regex.Matches(line, @"[^\s""]+|""[^""]*""");
|
||||
var splitLine = new List<string>();
|
||||
foreach (Match? match in matchCol)
|
||||
{
|
||||
if (match != null)
|
||||
splitLine.Add(match.Groups[0].Value);
|
||||
}
|
||||
|
||||
switch (splitLine[0])
|
||||
{
|
||||
@@ -59,7 +60,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read MCN
|
||||
case "CATALOG":
|
||||
if (splitLine.Length < 2)
|
||||
if (splitLine.Count < 2)
|
||||
throw new FormatException($"CATALOG line malformed: {line}");
|
||||
|
||||
cueSheet.Catalog = splitLine[1].Trim('"');
|
||||
@@ -67,7 +68,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read external CD-Text file path
|
||||
case "CDTEXTFILE":
|
||||
if (splitLine.Length < 2)
|
||||
if (splitLine.Count < 2)
|
||||
throw new FormatException($"CDTEXTFILE line malformed: {line}");
|
||||
|
||||
cueSheet.CdTextFile = splitLine[1].Trim('"');
|
||||
@@ -75,7 +76,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read CD-Text enhanced performer
|
||||
case "PERFORMER":
|
||||
if (splitLine.Length < 2)
|
||||
if (splitLine.Count < 2)
|
||||
throw new FormatException($"PERFORMER line malformed: {line}");
|
||||
|
||||
cueSheet.Performer = splitLine[1].Trim('"');
|
||||
@@ -83,7 +84,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read CD-Text enhanced songwriter
|
||||
case "SONGWRITER":
|
||||
if (splitLine.Length < 2)
|
||||
if (splitLine.Count < 2)
|
||||
throw new FormatException($"SONGWRITER line malformed: {line}");
|
||||
|
||||
cueSheet.Songwriter = splitLine[1].Trim('"');
|
||||
@@ -91,7 +92,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read CD-Text enhanced title
|
||||
case "TITLE":
|
||||
if (splitLine.Length < 2)
|
||||
if (splitLine.Count < 2)
|
||||
throw new FormatException($"TITLE line malformed: {line}");
|
||||
|
||||
cueSheet.Title = splitLine[1].Trim('"');
|
||||
@@ -99,7 +100,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read file information
|
||||
case "FILE":
|
||||
if (splitLine.Length < 3)
|
||||
if (splitLine.Count < 3)
|
||||
throw new FormatException($"FILE line malformed: {line}");
|
||||
|
||||
var file = CreateCueFile(splitLine[1], splitLine[2], data, out lastLine);
|
||||
@@ -152,11 +153,13 @@ namespace SabreTools.Serialization.Deserializers
|
||||
continue;
|
||||
|
||||
// http://stackoverflow.com/questions/554013/regular-expression-to-split-on-spaces-unless-in-quotes
|
||||
string[] splitLine = Regex
|
||||
.Matches(line, @"[^\s""]+|""[^""]*""")
|
||||
.Cast<Match>()
|
||||
.Select(m => m.Groups[0].Value)
|
||||
.ToArray();
|
||||
var matchCol = Regex.Matches(line, @"[^\s""]+|""[^""]*""");
|
||||
var splitLine = new List<string>();
|
||||
foreach (Match? match in matchCol)
|
||||
{
|
||||
if (match != null)
|
||||
splitLine.Add(match.Groups[0].Value);
|
||||
}
|
||||
|
||||
switch (splitLine[0])
|
||||
{
|
||||
@@ -167,7 +170,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read track information
|
||||
case "TRACK":
|
||||
if (splitLine.Length < 3)
|
||||
if (splitLine.Count < 3)
|
||||
throw new FormatException($"TRACK line malformed: {line}");
|
||||
|
||||
var track = CreateCueTrack(splitLine[1], splitLine[2], data, out lastLine);
|
||||
@@ -237,12 +240,13 @@ namespace SabreTools.Serialization.Deserializers
|
||||
continue;
|
||||
|
||||
// http://stackoverflow.com/questions/554013/regular-expression-to-split-on-spaces-unless-in-quotes
|
||||
string[] splitLine = Regex
|
||||
.Matches(line, @"[^\s""]+|""[^""]*""")
|
||||
.Cast<Match>()
|
||||
.Select(m => m.Groups[0].Value)
|
||||
.ToArray();
|
||||
|
||||
var matchCol = Regex.Matches(line, @"[^\s""]+|""[^""]*""");
|
||||
var splitLine = new List<string>();
|
||||
foreach (Match? match in matchCol)
|
||||
{
|
||||
if (match != null)
|
||||
splitLine.Add(match.Groups[0].Value);
|
||||
}
|
||||
switch (splitLine[0])
|
||||
{
|
||||
// Read comments
|
||||
@@ -252,15 +256,15 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read flag information
|
||||
case "FLAGS":
|
||||
if (splitLine.Length < 2)
|
||||
if (splitLine.Count < 2)
|
||||
throw new FormatException($"FLAGS line malformed: {line}");
|
||||
|
||||
cueTrack.Flags = GetFlags(splitLine);
|
||||
cueTrack.Flags = GetFlags([.. splitLine]);
|
||||
break;
|
||||
|
||||
// Read International Standard Recording Code
|
||||
case "ISRC":
|
||||
if (splitLine.Length < 2)
|
||||
if (splitLine.Count < 2)
|
||||
throw new FormatException($"ISRC line malformed: {line}");
|
||||
|
||||
cueTrack.ISRC = splitLine[1].Trim('"');
|
||||
@@ -268,7 +272,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read CD-Text enhanced performer
|
||||
case "PERFORMER":
|
||||
if (splitLine.Length < 2)
|
||||
if (splitLine.Count < 2)
|
||||
throw new FormatException($"PERFORMER line malformed: {line}");
|
||||
|
||||
cueTrack.Performer = splitLine[1].Trim('"');
|
||||
@@ -276,7 +280,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read CD-Text enhanced songwriter
|
||||
case "SONGWRITER":
|
||||
if (splitLine.Length < 2)
|
||||
if (splitLine.Count < 2)
|
||||
throw new FormatException($"SONGWRITER line malformed: {line}");
|
||||
|
||||
cueTrack.Songwriter = splitLine[1].Trim('"');
|
||||
@@ -284,7 +288,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read CD-Text enhanced title
|
||||
case "TITLE":
|
||||
if (splitLine.Length < 2)
|
||||
if (splitLine.Count < 2)
|
||||
throw new FormatException($"TITLE line malformed: {line}");
|
||||
|
||||
cueTrack.Title = splitLine[1].Trim('"');
|
||||
@@ -292,7 +296,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read pregap information
|
||||
case "PREGAP":
|
||||
if (splitLine.Length < 2)
|
||||
if (splitLine.Count < 2)
|
||||
throw new FormatException($"PREGAP line malformed: {line}");
|
||||
|
||||
var pregap = CreatePreGap(splitLine[1]);
|
||||
@@ -304,7 +308,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read index information
|
||||
case "INDEX":
|
||||
if (splitLine.Length < 3)
|
||||
if (splitLine.Count < 3)
|
||||
throw new FormatException($"INDEX line malformed: {line}");
|
||||
|
||||
var index = CreateCueIndex(splitLine[1], splitLine[2]);
|
||||
@@ -316,7 +320,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read postgap information
|
||||
case "POSTGAP":
|
||||
if (splitLine.Length < 2)
|
||||
if (splitLine.Count < 2)
|
||||
throw new FormatException($"POSTGAP line malformed: {line}");
|
||||
|
||||
var postgap = CreatePostGap(splitLine[1]);
|
||||
@@ -356,7 +360,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
throw new ArgumentException("Length was null or whitespace");
|
||||
|
||||
// Ignore lines that don't contain the correct information
|
||||
if (length!.Length != 8 || length.Count(c => c == ':') != 2)
|
||||
if (length!.Length != 8)
|
||||
throw new FormatException($"Length was not in a recognized format: {length}");
|
||||
|
||||
// Split the line
|
||||
@@ -413,7 +417,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
throw new ArgumentException("Start time was null or whitespace");
|
||||
|
||||
// Ignore lines that don't contain the correct information
|
||||
if (startTime!.Length != 8 || startTime.Count(c => c == ':') != 2)
|
||||
if (startTime!.Length != 8)
|
||||
throw new FormatException($"Start time was not in a recognized format: {startTime}");
|
||||
|
||||
// Split the line
|
||||
@@ -464,7 +468,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
throw new ArgumentException("Length was null or whitespace");
|
||||
|
||||
// Ignore lines that don't contain the correct information
|
||||
if (length!.Length != 8 || length.Count(c => c == ':') != 2)
|
||||
if (length!.Length != 8)
|
||||
throw new FormatException($"Length was not in a recognized format: {length}");
|
||||
|
||||
// Split the line
|
||||
|
||||
@@ -26,9 +26,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
var games = new List<Game>();
|
||||
var files = new List<Models.DosCenter.File>();
|
||||
|
||||
var additional = new List<string>();
|
||||
var headerAdditional = new List<string>();
|
||||
var gameAdditional = new List<string>();
|
||||
while (!reader.EndOfStream)
|
||||
{
|
||||
// If we have no next line
|
||||
@@ -44,26 +41,15 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case CmpRowType.EndTopLevel:
|
||||
switch (lastTopLevel)
|
||||
{
|
||||
case "doscenter":
|
||||
if (dat.DosCenter != null)
|
||||
dat.DosCenter.ADDITIONAL_ELEMENTS = headerAdditional.ToArray();
|
||||
|
||||
headerAdditional.Clear();
|
||||
break;
|
||||
case "game":
|
||||
if (game != null)
|
||||
{
|
||||
game.File = files.ToArray();
|
||||
game.ADDITIONAL_ELEMENTS = gameAdditional.ToArray();
|
||||
game.File = [.. files];
|
||||
games.Add(game);
|
||||
}
|
||||
|
||||
game = null;
|
||||
files.Clear();
|
||||
gameAdditional.Clear();
|
||||
break;
|
||||
default:
|
||||
// No-op
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
@@ -81,10 +67,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "game":
|
||||
game = new Game();
|
||||
break;
|
||||
default:
|
||||
if (reader.CurrentLine != null)
|
||||
additional.Add(reader.CurrentLine);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,10 +99,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "comment:":
|
||||
dat.DosCenter.Comment = reader.Standalone?.Value;
|
||||
break;
|
||||
default:
|
||||
if (reader.CurrentLine != null)
|
||||
headerAdditional.Add(item: reader.CurrentLine);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,10 +113,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "name":
|
||||
game.Name = reader.Standalone?.Value;
|
||||
break;
|
||||
default:
|
||||
if (reader.CurrentLine != null)
|
||||
gameAdditional.Add(item: reader.CurrentLine);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,28 +121,17 @@ namespace SabreTools.Serialization.Deserializers
|
||||
{
|
||||
// If we have an unknown type, log it
|
||||
if (reader.InternalName != "file")
|
||||
{
|
||||
if (reader.CurrentLine != null)
|
||||
gameAdditional.Add(reader.CurrentLine);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Create the file and add to the list
|
||||
var file = CreateFile(reader);
|
||||
if (file != null)
|
||||
files.Add(file);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
if (reader.CurrentLine != null)
|
||||
additional.Add(item: reader.CurrentLine);
|
||||
}
|
||||
}
|
||||
|
||||
// Add extra pieces and return
|
||||
dat.Game = games.ToArray();
|
||||
dat.ADDITIONAL_ELEMENTS = additional.ToArray();
|
||||
dat.Game = [.. games];
|
||||
return dat;
|
||||
}
|
||||
|
||||
@@ -182,7 +145,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Internal == null)
|
||||
return null;
|
||||
|
||||
var itemAdditional = new List<string>();
|
||||
var file = new Models.DosCenter.File();
|
||||
foreach (var kvp in reader.Internal)
|
||||
{
|
||||
@@ -200,14 +162,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
case "date":
|
||||
file.Date = kvp.Value;
|
||||
break;
|
||||
default:
|
||||
if (reader.CurrentLine != null)
|
||||
itemAdditional.Add(item: reader.CurrentLine);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
file.ADDITIONAL_ELEMENTS = itemAdditional.ToArray();
|
||||
return file;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using SabreTools.IO.Readers;
|
||||
using SabreTools.Models.EverdriveSMDB;
|
||||
@@ -47,15 +46,11 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (reader.Line.Count > 5)
|
||||
row.Size = reader.Line[5];
|
||||
|
||||
// If we have additional fields
|
||||
if (reader.Line.Count > 6)
|
||||
row.ADDITIONAL_ELEMENTS = reader.Line.Skip(5).ToArray();
|
||||
|
||||
rows.Add(row);
|
||||
}
|
||||
|
||||
// Assign the rows to the Dat and return
|
||||
dat.Row = rows.ToArray();
|
||||
dat.Row = [.. rows];
|
||||
return dat;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,6 +58,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
for (int i = 0; i < blockEntryHeader.BlockCount; i++)
|
||||
{
|
||||
var blockEntry = ParseBlockEntry(data);
|
||||
if (blockEntry == null)
|
||||
return null;
|
||||
|
||||
file.BlockEntries[i] = blockEntry;
|
||||
}
|
||||
|
||||
@@ -84,6 +87,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
for (int i = 0; i < fragmentationMapHeader.BlockCount; i++)
|
||||
{
|
||||
var fragmentationMap = ParseFragmentationMap(data);
|
||||
if (fragmentationMap == null)
|
||||
return null;
|
||||
|
||||
file.FragmentationMaps[i] = fragmentationMap;
|
||||
}
|
||||
|
||||
@@ -115,6 +121,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
for (int i = 0; i < file.BlockEntryMapHeader.BlockCount; i++)
|
||||
{
|
||||
var blockEntryMap = ParseBlockEntryMap(data);
|
||||
if (blockEntryMap == null)
|
||||
return null;
|
||||
|
||||
file.BlockEntryMaps[i] = blockEntryMap;
|
||||
}
|
||||
}
|
||||
@@ -145,6 +154,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
for (int i = 0; i < directoryHeader.ItemCount; i++)
|
||||
{
|
||||
var directoryEntry = ParseDirectoryEntry(data);
|
||||
if (directoryEntry == null)
|
||||
return null;
|
||||
|
||||
file.DirectoryEntries[i] = directoryEntry;
|
||||
}
|
||||
|
||||
@@ -167,7 +179,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
while (data.Position < directoryNamesEnd)
|
||||
{
|
||||
long nameOffset = data.Position - directoryNamesStart;
|
||||
string? directoryName = data.ReadString(Encoding.ASCII);
|
||||
string? directoryName = data.ReadNullTerminatedAnsiString();
|
||||
if (data.Position > directoryNamesEnd)
|
||||
{
|
||||
data.Seek(-directoryName?.Length ?? 0, SeekOrigin.Current);
|
||||
@@ -180,13 +192,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
file.DirectoryNames[nameOffset] = directoryName;
|
||||
}
|
||||
|
||||
// Loop and assign to entries
|
||||
foreach (var directoryEntry in file.DirectoryEntries)
|
||||
{
|
||||
if (directoryEntry != null)
|
||||
directoryEntry.Name = file.DirectoryNames[directoryEntry.NameOffset];
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -200,6 +205,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
for (int i = 0; i < directoryHeader.Info1Count; i++)
|
||||
{
|
||||
var directoryInfo1Entry = ParseDirectoryInfo1Entry(data);
|
||||
if (directoryInfo1Entry == null)
|
||||
return null;
|
||||
|
||||
file.DirectoryInfo1Entries[i] = directoryInfo1Entry;
|
||||
}
|
||||
|
||||
@@ -214,6 +222,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
for (int i = 0; i < directoryHeader.ItemCount; i++)
|
||||
{
|
||||
var directoryInfo2Entry = ParseDirectoryInfo2Entry(data);
|
||||
if (directoryInfo2Entry == null)
|
||||
return null;
|
||||
|
||||
file.DirectoryInfo2Entries[i] = directoryInfo2Entry;
|
||||
}
|
||||
|
||||
@@ -228,6 +239,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
for (int i = 0; i < directoryHeader.CopyCount; i++)
|
||||
{
|
||||
var directoryCopyEntry = ParseDirectoryCopyEntry(data);
|
||||
if (directoryCopyEntry == null)
|
||||
return null;
|
||||
|
||||
file.DirectoryCopyEntries[i] = directoryCopyEntry;
|
||||
}
|
||||
|
||||
@@ -242,6 +256,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
for (int i = 0; i < directoryHeader.LocalCount; i++)
|
||||
{
|
||||
var directoryLocalEntry = ParseDirectoryLocalEntry(data);
|
||||
if (directoryLocalEntry == null)
|
||||
return null;
|
||||
|
||||
file.DirectoryLocalEntries[i] = directoryLocalEntry;
|
||||
}
|
||||
|
||||
@@ -274,6 +291,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
for (int i = 0; i < directoryHeader.ItemCount; i++)
|
||||
{
|
||||
var directoryMapEntry = ParseDirectoryMapEntry(data);
|
||||
if (directoryMapEntry == null)
|
||||
return null;
|
||||
|
||||
file.DirectoryMapEntries[i] = directoryMapEntry;
|
||||
}
|
||||
|
||||
@@ -315,6 +335,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
for (int i = 0; i < checksumMapHeader.ItemCount; i++)
|
||||
{
|
||||
var checksumMapEntry = ParseChecksumMapEntry(data);
|
||||
if (checksumMapEntry == null)
|
||||
return null;
|
||||
|
||||
file.ChecksumMapEntries[i] = checksumMapEntry;
|
||||
}
|
||||
|
||||
@@ -329,6 +352,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
for (int i = 0; i < checksumMapHeader.ChecksumCount; i++)
|
||||
{
|
||||
var checksumEntry = ParseChecksumEntry(data);
|
||||
if (checksumEntry == null)
|
||||
return null;
|
||||
|
||||
file.ChecksumEntries[i] = checksumEntry;
|
||||
}
|
||||
|
||||
@@ -359,30 +385,17 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <returns>Filled Half-Life Game Cache on success, null on error</returns>
|
||||
private static Header? ParseHeader(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
Header header = new Header();
|
||||
var header = data.ReadType<Header>();
|
||||
|
||||
header.Dummy0 = data.ReadUInt32();
|
||||
if (header == null)
|
||||
return null;
|
||||
if (header.Dummy0 != 0x00000001)
|
||||
return null;
|
||||
|
||||
header.MajorVersion = data.ReadUInt32();
|
||||
if (header.MajorVersion != 0x00000001)
|
||||
return null;
|
||||
|
||||
header.MinorVersion = data.ReadUInt32();
|
||||
if (header.MinorVersion != 3 && header.MinorVersion != 5 && header.MinorVersion != 6)
|
||||
return null;
|
||||
|
||||
header.CacheID = data.ReadUInt32();
|
||||
header.LastVersionPlayed = data.ReadUInt32();
|
||||
header.Dummy1 = data.ReadUInt32();
|
||||
header.Dummy2 = data.ReadUInt32();
|
||||
header.FileSize = data.ReadUInt32();
|
||||
header.BlockSize = data.ReadUInt32();
|
||||
header.BlockCount = data.ReadUInt32();
|
||||
header.Dummy3 = data.ReadUInt32();
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
@@ -391,21 +404,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache block entry header on success, null on error</returns>
|
||||
private static BlockEntryHeader ParseBlockEntryHeader(Stream data)
|
||||
private static BlockEntryHeader? ParseBlockEntryHeader(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
BlockEntryHeader blockEntryHeader = new BlockEntryHeader();
|
||||
|
||||
blockEntryHeader.BlockCount = data.ReadUInt32();
|
||||
blockEntryHeader.BlocksUsed = data.ReadUInt32();
|
||||
blockEntryHeader.Dummy0 = data.ReadUInt32();
|
||||
blockEntryHeader.Dummy1 = data.ReadUInt32();
|
||||
blockEntryHeader.Dummy2 = data.ReadUInt32();
|
||||
blockEntryHeader.Dummy3 = data.ReadUInt32();
|
||||
blockEntryHeader.Dummy4 = data.ReadUInt32();
|
||||
blockEntryHeader.Checksum = data.ReadUInt32();
|
||||
|
||||
return blockEntryHeader;
|
||||
return data.ReadType<BlockEntryHeader>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -413,20 +414,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache block entry on success, null on error</returns>
|
||||
private static BlockEntry ParseBlockEntry(Stream data)
|
||||
private static BlockEntry? ParseBlockEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
BlockEntry blockEntry = new BlockEntry();
|
||||
|
||||
blockEntry.EntryFlags = data.ReadUInt32();
|
||||
blockEntry.FileDataOffset = data.ReadUInt32();
|
||||
blockEntry.FileDataSize = data.ReadUInt32();
|
||||
blockEntry.FirstDataBlockIndex = data.ReadUInt32();
|
||||
blockEntry.NextBlockEntryIndex = data.ReadUInt32();
|
||||
blockEntry.PreviousBlockEntryIndex = data.ReadUInt32();
|
||||
blockEntry.DirectoryIndex = data.ReadUInt32();
|
||||
|
||||
return blockEntry;
|
||||
return data.ReadType<BlockEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -434,17 +424,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache fragmentation map header on success, null on error</returns>
|
||||
private static FragmentationMapHeader ParseFragmentationMapHeader(Stream data)
|
||||
private static FragmentationMapHeader? ParseFragmentationMapHeader(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
FragmentationMapHeader fragmentationMapHeader = new FragmentationMapHeader();
|
||||
|
||||
fragmentationMapHeader.BlockCount = data.ReadUInt32();
|
||||
fragmentationMapHeader.FirstUnusedEntry = data.ReadUInt32();
|
||||
fragmentationMapHeader.Terminator = data.ReadUInt32();
|
||||
fragmentationMapHeader.Checksum = data.ReadUInt32();
|
||||
|
||||
return fragmentationMapHeader;
|
||||
return data.ReadType<FragmentationMapHeader>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -452,14 +434,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache fragmentation map on success, null on error</returns>
|
||||
private static FragmentationMap ParseFragmentationMap(Stream data)
|
||||
private static FragmentationMap? ParseFragmentationMap(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
FragmentationMap fragmentationMap = new FragmentationMap();
|
||||
|
||||
fragmentationMap.NextDataBlockIndex = data.ReadUInt32();
|
||||
|
||||
return fragmentationMap;
|
||||
return data.ReadType<FragmentationMap>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -467,18 +444,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache block entry map header on success, null on error</returns>
|
||||
private static BlockEntryMapHeader ParseBlockEntryMapHeader(Stream data)
|
||||
private static BlockEntryMapHeader? ParseBlockEntryMapHeader(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
BlockEntryMapHeader blockEntryMapHeader = new BlockEntryMapHeader();
|
||||
|
||||
blockEntryMapHeader.BlockCount = data.ReadUInt32();
|
||||
blockEntryMapHeader.FirstBlockEntryIndex = data.ReadUInt32();
|
||||
blockEntryMapHeader.LastBlockEntryIndex = data.ReadUInt32();
|
||||
blockEntryMapHeader.Dummy0 = data.ReadUInt32();
|
||||
blockEntryMapHeader.Checksum = data.ReadUInt32();
|
||||
|
||||
return blockEntryMapHeader;
|
||||
return data.ReadType<BlockEntryMapHeader>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -486,15 +454,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache block entry map on success, null on error</returns>
|
||||
private static BlockEntryMap ParseBlockEntryMap(Stream data)
|
||||
private static BlockEntryMap? ParseBlockEntryMap(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
BlockEntryMap blockEntryMap = new BlockEntryMap();
|
||||
|
||||
blockEntryMap.PreviousBlockEntryIndex = data.ReadUInt32();
|
||||
blockEntryMap.NextBlockEntryIndex = data.ReadUInt32();
|
||||
|
||||
return blockEntryMap;
|
||||
return data.ReadType<BlockEntryMap>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -502,27 +464,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache directory header on success, null on error</returns>
|
||||
private static DirectoryHeader ParseDirectoryHeader(Stream data)
|
||||
private static DirectoryHeader? ParseDirectoryHeader(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
DirectoryHeader directoryHeader = new DirectoryHeader();
|
||||
|
||||
directoryHeader.Dummy0 = data.ReadUInt32();
|
||||
directoryHeader.CacheID = data.ReadUInt32();
|
||||
directoryHeader.LastVersionPlayed = data.ReadUInt32();
|
||||
directoryHeader.ItemCount = data.ReadUInt32();
|
||||
directoryHeader.FileCount = data.ReadUInt32();
|
||||
directoryHeader.Dummy1 = data.ReadUInt32();
|
||||
directoryHeader.DirectorySize = data.ReadUInt32();
|
||||
directoryHeader.NameSize = data.ReadUInt32();
|
||||
directoryHeader.Info1Count = data.ReadUInt32();
|
||||
directoryHeader.CopyCount = data.ReadUInt32();
|
||||
directoryHeader.LocalCount = data.ReadUInt32();
|
||||
directoryHeader.Dummy2 = data.ReadUInt32();
|
||||
directoryHeader.Dummy3 = data.ReadUInt32();
|
||||
directoryHeader.Checksum = data.ReadUInt32();
|
||||
|
||||
return directoryHeader;
|
||||
return data.ReadType<DirectoryHeader>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -530,20 +474,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache directory entry on success, null on error</returns>
|
||||
private static DirectoryEntry ParseDirectoryEntry(Stream data)
|
||||
private static DirectoryEntry? ParseDirectoryEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
DirectoryEntry directoryEntry = new DirectoryEntry();
|
||||
|
||||
directoryEntry.NameOffset = data.ReadUInt32();
|
||||
directoryEntry.ItemSize = data.ReadUInt32();
|
||||
directoryEntry.ChecksumIndex = data.ReadUInt32();
|
||||
directoryEntry.DirectoryFlags = (HL_GCF_FLAG)data.ReadUInt32();
|
||||
directoryEntry.ParentIndex = data.ReadUInt32();
|
||||
directoryEntry.NextIndex = data.ReadUInt32();
|
||||
directoryEntry.FirstIndex = data.ReadUInt32();
|
||||
|
||||
return directoryEntry;
|
||||
return data.ReadType<DirectoryEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -551,14 +484,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache directory info 1 entry on success, null on error</returns>
|
||||
private static DirectoryInfo1Entry ParseDirectoryInfo1Entry(Stream data)
|
||||
private static DirectoryInfo1Entry? ParseDirectoryInfo1Entry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
DirectoryInfo1Entry directoryInfo1Entry = new DirectoryInfo1Entry();
|
||||
|
||||
directoryInfo1Entry.Dummy0 = data.ReadUInt32();
|
||||
|
||||
return directoryInfo1Entry;
|
||||
return data.ReadType<DirectoryInfo1Entry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -566,14 +494,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache directory info 2 entry on success, null on error</returns>
|
||||
private static DirectoryInfo2Entry ParseDirectoryInfo2Entry(Stream data)
|
||||
private static DirectoryInfo2Entry? ParseDirectoryInfo2Entry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
DirectoryInfo2Entry directoryInfo2Entry = new DirectoryInfo2Entry();
|
||||
|
||||
directoryInfo2Entry.Dummy0 = data.ReadUInt32();
|
||||
|
||||
return directoryInfo2Entry;
|
||||
return data.ReadType<DirectoryInfo2Entry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -581,14 +504,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache directory copy entry on success, null on error</returns>
|
||||
private static DirectoryCopyEntry ParseDirectoryCopyEntry(Stream data)
|
||||
private static DirectoryCopyEntry? ParseDirectoryCopyEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
DirectoryCopyEntry directoryCopyEntry = new DirectoryCopyEntry();
|
||||
|
||||
directoryCopyEntry.DirectoryIndex = data.ReadUInt32();
|
||||
|
||||
return directoryCopyEntry;
|
||||
return data.ReadType<DirectoryCopyEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -596,14 +514,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache directory local entry on success, null on error</returns>
|
||||
private static DirectoryLocalEntry ParseDirectoryLocalEntry(Stream data)
|
||||
private static DirectoryLocalEntry? ParseDirectoryLocalEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
DirectoryLocalEntry directoryLocalEntry = new DirectoryLocalEntry();
|
||||
|
||||
directoryLocalEntry.DirectoryIndex = data.ReadUInt32();
|
||||
|
||||
return directoryLocalEntry;
|
||||
return data.ReadType<DirectoryLocalEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -613,14 +526,12 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <returns>Filled Half-Life Game Cache directory map header on success, null on error</returns>
|
||||
private static DirectoryMapHeader? ParseDirectoryMapHeader(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
DirectoryMapHeader directoryMapHeader = new DirectoryMapHeader();
|
||||
var directoryMapHeader = data.ReadType<DirectoryMapHeader>();
|
||||
|
||||
directoryMapHeader.Dummy0 = data.ReadUInt32();
|
||||
if (directoryMapHeader == null)
|
||||
return null;
|
||||
if (directoryMapHeader.Dummy0 != 0x00000001)
|
||||
return null;
|
||||
|
||||
directoryMapHeader.Dummy1 = data.ReadUInt32();
|
||||
if (directoryMapHeader.Dummy1 != 0x00000000)
|
||||
return null;
|
||||
|
||||
@@ -632,14 +543,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache directory map entry on success, null on error</returns>
|
||||
private static DirectoryMapEntry ParseDirectoryMapEntry(Stream data)
|
||||
private static DirectoryMapEntry? ParseDirectoryMapEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
DirectoryMapEntry directoryMapEntry = new DirectoryMapEntry();
|
||||
|
||||
directoryMapEntry.FirstBlockIndex = data.ReadUInt32();
|
||||
|
||||
return directoryMapEntry;
|
||||
return data.ReadType<DirectoryMapEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -649,15 +555,13 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <returns>Filled Half-Life Game Cache checksum header on success, null on error</returns>
|
||||
private static ChecksumHeader? ParseChecksumHeader(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
ChecksumHeader checksumHeader = new ChecksumHeader();
|
||||
var checksumHeader = data.ReadType<ChecksumHeader>();
|
||||
|
||||
checksumHeader.Dummy0 = data.ReadUInt32();
|
||||
if (checksumHeader == null)
|
||||
return null;
|
||||
if (checksumHeader.Dummy0 != 0x00000001)
|
||||
return null;
|
||||
|
||||
checksumHeader.ChecksumSize = data.ReadUInt32();
|
||||
|
||||
return checksumHeader;
|
||||
}
|
||||
|
||||
@@ -668,20 +572,15 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <returns>Filled Half-Life Game Cache checksum map header on success, null on error</returns>
|
||||
private static ChecksumMapHeader? ParseChecksumMapHeader(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
ChecksumMapHeader checksumMapHeader = new ChecksumMapHeader();
|
||||
var checksumMapHeader = data.ReadType<ChecksumMapHeader>();
|
||||
|
||||
checksumMapHeader.Dummy0 = data.ReadUInt32();
|
||||
if (checksumMapHeader == null)
|
||||
return null;
|
||||
if (checksumMapHeader.Dummy0 != 0x14893721)
|
||||
return null;
|
||||
|
||||
checksumMapHeader.Dummy1 = data.ReadUInt32();
|
||||
if (checksumMapHeader.Dummy1 != 0x00000001)
|
||||
return null;
|
||||
|
||||
checksumMapHeader.ItemCount = data.ReadUInt32();
|
||||
checksumMapHeader.ChecksumCount = data.ReadUInt32();
|
||||
|
||||
return checksumMapHeader;
|
||||
}
|
||||
|
||||
@@ -690,15 +589,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache checksum map entry on success, null on error</returns>
|
||||
private static ChecksumMapEntry ParseChecksumMapEntry(Stream data)
|
||||
private static ChecksumMapEntry? ParseChecksumMapEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
ChecksumMapEntry checksumMapEntry = new ChecksumMapEntry();
|
||||
|
||||
checksumMapEntry.ChecksumCount = data.ReadUInt32();
|
||||
checksumMapEntry.FirstChecksumIndex = data.ReadUInt32();
|
||||
|
||||
return checksumMapEntry;
|
||||
return data.ReadType<ChecksumMapEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -706,14 +599,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Half-Life Game Cache checksum entry on success, null on error</returns>
|
||||
private static ChecksumEntry ParseChecksumEntry(Stream data)
|
||||
private static ChecksumEntry? ParseChecksumEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
ChecksumEntry checksumEntry = new ChecksumEntry();
|
||||
|
||||
checksumEntry.Checksum = data.ReadUInt32();
|
||||
|
||||
return checksumEntry;
|
||||
return data.ReadType<ChecksumEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -722,10 +610,10 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <param name="minorVersion">Minor version field from the header</param>
|
||||
/// <returns>Filled Half-Life Game Cache data block header on success, null on error</returns>
|
||||
private static DataBlockHeader ParseDataBlockHeader(Stream data, uint minorVersion)
|
||||
private static DataBlockHeader? ParseDataBlockHeader(Stream data, uint minorVersion)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
DataBlockHeader dataBlockHeader = new DataBlockHeader();
|
||||
var dataBlockHeader = new DataBlockHeader();
|
||||
|
||||
// In version 3 the DataBlockHeader is missing the LastVersionPlayed field.
|
||||
if (minorVersion >= 5)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using SabreTools.Hashing;
|
||||
using SabreTools.Models.Hashfile;
|
||||
|
||||
@@ -60,7 +59,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
using var stream = PathProcessor.OpenStream(path);
|
||||
return DeserializeStream(stream, hash);
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region IStreamDeserializer
|
||||
@@ -71,7 +70,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
var deserializer = new Hashfile();
|
||||
return deserializer.Deserialize(data, hash);
|
||||
}
|
||||
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override Models.Hashfile.Hashfile? Deserialize(Stream? data)
|
||||
=> Deserialize(data, HashType.CRC32);
|
||||
@@ -86,19 +85,22 @@ namespace SabreTools.Serialization.Deserializers
|
||||
// Setup the reader and output
|
||||
var reader = new StreamReader(data);
|
||||
var dat = new Models.Hashfile.Hashfile();
|
||||
var additional = new List<string>();
|
||||
|
||||
// Create lists for each hash type
|
||||
var sfvList = new List<SFV>();
|
||||
var md5List = new List<MD5>();
|
||||
var sha1List = new List<SHA1>();
|
||||
var sha256List = new List<SHA256>();
|
||||
var sha384List = new List<SHA384>();
|
||||
var sha512List = new List<SHA512>();
|
||||
var spamsumList = new List<SpamSum>();
|
||||
|
||||
// Loop through the rows and parse out values
|
||||
var hashes = new List<object>();
|
||||
while (!reader.EndOfStream)
|
||||
{
|
||||
// Read and split the line
|
||||
string? line = reader.ReadLine();
|
||||
#if NETFRAMEWORK || NETCOREAPP3_1
|
||||
string[]? lineParts = line?.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
#else
|
||||
string[]? lineParts = line?.Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
||||
#endif
|
||||
string[]? lineParts = line?.Split([' '], StringSplitOptions.RemoveEmptyEntries);
|
||||
if (lineParts == null)
|
||||
continue;
|
||||
|
||||
@@ -106,93 +108,60 @@ namespace SabreTools.Serialization.Deserializers
|
||||
switch (hash)
|
||||
{
|
||||
case HashType.CRC32:
|
||||
case HashType.CRC32_ISO:
|
||||
case HashType.CRC32_Naive:
|
||||
case HashType.CRC32_Optimized:
|
||||
case HashType.CRC32_Parallel:
|
||||
var sfv = new SFV
|
||||
{
|
||||
#if NETFRAMEWORK
|
||||
File = string.Join(" ", lineParts.Take(lineParts.Length - 1).ToArray()),
|
||||
File = string.Join(" ", lineParts, 0, lineParts.Length - 1),
|
||||
Hash = lineParts[lineParts.Length - 1],
|
||||
#else
|
||||
File = string.Join(" ", lineParts[..^1]),
|
||||
Hash = lineParts[^1],
|
||||
#endif
|
||||
};
|
||||
hashes.Add(sfv);
|
||||
sfvList.Add(sfv);
|
||||
break;
|
||||
case HashType.MD5:
|
||||
var md5 = new MD5
|
||||
{
|
||||
Hash = lineParts[0],
|
||||
#if NETFRAMEWORK
|
||||
File = string.Join(" ", lineParts.Skip(1).ToArray()),
|
||||
#else
|
||||
File = string.Join(" ", lineParts[1..]),
|
||||
#endif
|
||||
File = string.Join(" ", lineParts, 1, lineParts.Length - 1),
|
||||
};
|
||||
hashes.Add(md5);
|
||||
md5List.Add(md5);
|
||||
break;
|
||||
case HashType.SHA1:
|
||||
var sha1 = new SHA1
|
||||
{
|
||||
Hash = lineParts[0],
|
||||
#if NETFRAMEWORK
|
||||
File = string.Join(" ", lineParts.Skip(1).ToArray()),
|
||||
#else
|
||||
File = string.Join(" ", lineParts[1..]),
|
||||
#endif
|
||||
File = string.Join(" ", lineParts, 1, lineParts.Length - 1),
|
||||
};
|
||||
hashes.Add(sha1);
|
||||
sha1List.Add(sha1);
|
||||
break;
|
||||
case HashType.SHA256:
|
||||
var sha256 = new SHA256
|
||||
{
|
||||
Hash = lineParts[0],
|
||||
#if NETFRAMEWORK
|
||||
File = string.Join(" ", lineParts.Skip(1).ToArray()),
|
||||
#else
|
||||
File = string.Join(" ", lineParts[1..]),
|
||||
#endif
|
||||
File = string.Join(" ", lineParts, 1, lineParts.Length - 1),
|
||||
};
|
||||
hashes.Add(sha256);
|
||||
sha256List.Add(sha256);
|
||||
break;
|
||||
case HashType.SHA384:
|
||||
var sha384 = new SHA384
|
||||
{
|
||||
Hash = lineParts[0],
|
||||
#if NETFRAMEWORK
|
||||
File = string.Join(" ", lineParts.Skip(1).ToArray()),
|
||||
#else
|
||||
File = string.Join(" ", lineParts[1..]),
|
||||
#endif
|
||||
File = string.Join(" ", lineParts, 1, lineParts.Length - 1),
|
||||
};
|
||||
hashes.Add(sha384);
|
||||
sha384List.Add(sha384);
|
||||
break;
|
||||
case HashType.SHA512:
|
||||
var sha512 = new SHA512
|
||||
{
|
||||
Hash = lineParts[0],
|
||||
#if NETFRAMEWORK
|
||||
File = string.Join(" ", lineParts.Skip(1).ToArray()),
|
||||
#else
|
||||
File = string.Join(" ", lineParts[1..]),
|
||||
#endif
|
||||
File = string.Join(" ", lineParts, 1, lineParts.Length - 1),
|
||||
};
|
||||
hashes.Add(sha512);
|
||||
sha512List.Add(sha512);
|
||||
break;
|
||||
case HashType.SpamSum:
|
||||
var spamSum = new SpamSum
|
||||
{
|
||||
Hash = lineParts[0],
|
||||
#if NETFRAMEWORK
|
||||
File = string.Join(" ", lineParts.Skip(1).ToArray()),
|
||||
#else
|
||||
File = string.Join(" ", lineParts[1..]),
|
||||
#endif
|
||||
File = string.Join(" ", lineParts, 1, lineParts.Length - 1),
|
||||
};
|
||||
hashes.Add(spamSum);
|
||||
spamsumList.Add(spamSum);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -201,32 +170,28 @@ namespace SabreTools.Serialization.Deserializers
|
||||
switch (hash)
|
||||
{
|
||||
case HashType.CRC32:
|
||||
case HashType.CRC32_ISO:
|
||||
case HashType.CRC32_Naive:
|
||||
case HashType.CRC32_Optimized:
|
||||
case HashType.CRC32_Parallel:
|
||||
dat.SFV = hashes.Cast<SFV>().ToArray();
|
||||
dat.SFV = [.. sfvList];
|
||||
break;
|
||||
case HashType.MD5:
|
||||
dat.MD5 = hashes.Cast<MD5>().ToArray();
|
||||
dat.MD5 = [.. md5List];
|
||||
break;
|
||||
case HashType.SHA1:
|
||||
dat.SHA1 = hashes.Cast<SHA1>().ToArray();
|
||||
dat.SHA1 = [.. sha1List];
|
||||
break;
|
||||
case HashType.SHA256:
|
||||
dat.SHA256 = hashes.Cast<SHA256>().ToArray();
|
||||
dat.SHA256 = [.. sha256List];
|
||||
break;
|
||||
case HashType.SHA384:
|
||||
dat.SHA384 = hashes.Cast<SHA384>().ToArray();
|
||||
dat.SHA384 = [.. sha384List];
|
||||
break;
|
||||
case HashType.SHA512:
|
||||
dat.SHA512 = hashes.Cast<SHA512>().ToArray();
|
||||
dat.SHA512 = [.. sha512List];
|
||||
break;
|
||||
case HashType.SpamSum:
|
||||
dat.SpamSum = hashes.Cast<SpamSum>().ToArray();
|
||||
dat.SpamSum = [.. spamsumList];
|
||||
break;
|
||||
}
|
||||
dat.ADDITIONAL_ELEMENTS = [.. additional];
|
||||
|
||||
return dat;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
// Cache the current offset
|
||||
int initialOffset = (int)data.Position;
|
||||
|
||||
// Create a new media key block to fill
|
||||
// Create a new IRD to fill
|
||||
var ird = new Models.IRD.File();
|
||||
|
||||
ird.Magic = data.ReadBytes(4);
|
||||
|
||||
141
SabreTools.Serialization/Deserializers/InstallShieldArchiveV3.cs
Normal file
141
SabreTools.Serialization/Deserializers/InstallShieldArchiveV3.cs
Normal file
@@ -0,0 +1,141 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.Models.InstallShieldArchiveV3;
|
||||
|
||||
namespace SabreTools.Serialization.Deserializers
|
||||
{
|
||||
public class InstallShieldArchiveV3 : BaseBinaryDeserializer<Archive>
|
||||
{
|
||||
public override Archive? Deserialize(Stream? data)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (data.Position < 0 || data.Position >= data.Length)
|
||||
return null;
|
||||
|
||||
// Cache the current offset
|
||||
int initialOffset = (int)data.Position;
|
||||
|
||||
// Create a new archive to fill
|
||||
var archive = new Archive();
|
||||
|
||||
#region Header
|
||||
|
||||
// Try to parse the header
|
||||
var header = ParseHeader(data);
|
||||
if (header == null)
|
||||
return null;
|
||||
|
||||
// Set the archive header
|
||||
archive.Header = header;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Directories
|
||||
|
||||
// Get the directories offset
|
||||
uint directoriesOffset = header.TocAddress;
|
||||
if (directoriesOffset < 0 || directoriesOffset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Seek to the directories
|
||||
data.Seek(directoriesOffset, SeekOrigin.Begin);
|
||||
|
||||
// Try to parse the directories
|
||||
var directories = new List<Models.InstallShieldArchiveV3.Directory>();
|
||||
for (int i = 0; i < header.DirCount; i++)
|
||||
{
|
||||
var directory = ParseDirectory(data);
|
||||
if (directory?.Name == null)
|
||||
return null;
|
||||
|
||||
directories.Add(directory);
|
||||
data.Seek(directory.ChunkSize - directory.Name.Length - 6, SeekOrigin.Current);
|
||||
}
|
||||
|
||||
// Set the directories
|
||||
archive.Directories = [.. directories];
|
||||
|
||||
#endregion
|
||||
|
||||
#region Files
|
||||
|
||||
// Try to parse the files
|
||||
var files = new List<Models.InstallShieldArchiveV3.File>();
|
||||
for (int i = 0; i < archive.Directories.Length; i++)
|
||||
{
|
||||
var directory = archive.Directories[i];
|
||||
for (int j = 0; j < directory.FileCount; j++)
|
||||
{
|
||||
var file = ParseFile(data);
|
||||
if (file?.Name == null)
|
||||
return null;
|
||||
|
||||
files.Add(file);
|
||||
data.Seek(file.ChunkSize - file.Name.Length - 30, SeekOrigin.Current);
|
||||
}
|
||||
}
|
||||
|
||||
// Set the files
|
||||
archive.Files = [.. files];
|
||||
|
||||
#endregion
|
||||
|
||||
return archive;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse a Stream into a header
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled header on success, null on error</returns>
|
||||
public static Header? ParseHeader(Stream data)
|
||||
{
|
||||
var header = data.ReadType<Header>();
|
||||
|
||||
if (header == null)
|
||||
return null;
|
||||
if (header.Signature1 != 0x8C655D13) // TODO: Move constant to Models
|
||||
return null;
|
||||
if (header.TocAddress >= data.Length)
|
||||
return null;
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse a Stream into a directory
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled directory on success, null on error</returns>
|
||||
public static Models.InstallShieldArchiveV3.Directory? ParseDirectory(Stream data)
|
||||
{
|
||||
var directory = new Models.InstallShieldArchiveV3.Directory();
|
||||
|
||||
directory.FileCount = data.ReadUInt16();
|
||||
directory.ChunkSize = data.ReadUInt16();
|
||||
|
||||
// TODO: Is there any equivilent automatic type for UInt16-prefixed ANSI?
|
||||
ushort nameLength = data.ReadUInt16();
|
||||
byte[] nameBytes = data.ReadBytes(nameLength);
|
||||
directory.Name = Encoding.ASCII.GetString(nameBytes);
|
||||
|
||||
return directory;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse a Stream into a file
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled file on success, null on error</returns>
|
||||
public static Models.InstallShieldArchiveV3.File? ParseFile(Stream data)
|
||||
{
|
||||
return data.ReadType<Models.InstallShieldArchiveV3.File>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.Models.InstallShieldCabinet;
|
||||
using static SabreTools.Models.InstallShieldCabinet.Constants;
|
||||
@@ -333,23 +333,15 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled common header on success, null on error</returns>
|
||||
private static CommonHeader? ParseCommonHeader(Stream data)
|
||||
public static CommonHeader? ParseCommonHeader(Stream data)
|
||||
{
|
||||
CommonHeader commonHeader = new CommonHeader();
|
||||
var commonHeader = data.ReadType<CommonHeader>();
|
||||
|
||||
byte[]? signature = data.ReadBytes(4);
|
||||
if (signature == null)
|
||||
if (commonHeader == null)
|
||||
return null;
|
||||
|
||||
commonHeader.Signature = Encoding.ASCII.GetString(signature);
|
||||
if (commonHeader.Signature != SignatureString)
|
||||
return null;
|
||||
|
||||
commonHeader.Version = data.ReadUInt32();
|
||||
commonHeader.VolumeInfo = data.ReadUInt32();
|
||||
commonHeader.DescriptorOffset = data.ReadUInt32();
|
||||
commonHeader.DescriptorSize = data.ReadUInt32();
|
||||
|
||||
return commonHeader;
|
||||
}
|
||||
|
||||
@@ -359,7 +351,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <param name="majorVersion">Major version of the cabinet</param>
|
||||
/// <returns>Filled volume header on success, null on error</returns>
|
||||
private static VolumeHeader ParseVolumeHeader(Stream data, int majorVersion)
|
||||
public static VolumeHeader ParseVolumeHeader(Stream data, int majorVersion)
|
||||
{
|
||||
VolumeHeader volumeHeader = new VolumeHeader();
|
||||
|
||||
@@ -406,46 +398,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled descriptor on success, null on error</returns>
|
||||
private static Descriptor ParseDescriptor(Stream data)
|
||||
public static Descriptor? ParseDescriptor(Stream data)
|
||||
{
|
||||
Descriptor descriptor = new Descriptor();
|
||||
|
||||
descriptor.StringsOffset = data.ReadUInt32();
|
||||
descriptor.Reserved0 = data.ReadBytes(4);
|
||||
descriptor.ComponentListOffset = data.ReadUInt32();
|
||||
descriptor.FileTableOffset = data.ReadUInt32();
|
||||
descriptor.Reserved1 = data.ReadBytes(4);
|
||||
descriptor.FileTableSize = data.ReadUInt32();
|
||||
descriptor.FileTableSize2 = data.ReadUInt32();
|
||||
descriptor.DirectoryCount = data.ReadUInt16();
|
||||
descriptor.Reserved2 = data.ReadBytes(4);
|
||||
descriptor.Reserved3 = data.ReadBytes(2);
|
||||
descriptor.Reserved4 = data.ReadBytes(4);
|
||||
descriptor.FileCount = data.ReadUInt32();
|
||||
descriptor.FileTableOffset2 = data.ReadUInt32();
|
||||
descriptor.ComponentTableInfoCount = data.ReadUInt16();
|
||||
descriptor.ComponentTableOffset = data.ReadUInt32();
|
||||
descriptor.Reserved5 = data.ReadBytes(4);
|
||||
descriptor.Reserved6 = data.ReadBytes(4);
|
||||
|
||||
descriptor.FileGroupOffsets = new uint[MAX_FILE_GROUP_COUNT];
|
||||
for (int i = 0; i < descriptor.FileGroupOffsets.Length; i++)
|
||||
{
|
||||
descriptor.FileGroupOffsets[i] = data.ReadUInt32();
|
||||
}
|
||||
|
||||
descriptor.ComponentOffsets = new uint[MAX_COMPONENT_COUNT];
|
||||
for (int i = 0; i < descriptor.ComponentOffsets.Length; i++)
|
||||
{
|
||||
descriptor.ComponentOffsets[i] = data.ReadUInt32();
|
||||
}
|
||||
|
||||
descriptor.SetupTypesOffset = data.ReadUInt32();
|
||||
descriptor.SetupTableOffset = data.ReadUInt32();
|
||||
descriptor.Reserved7 = data.ReadBytes(4);
|
||||
descriptor.Reserved8 = data.ReadBytes(4);
|
||||
|
||||
return descriptor;
|
||||
return data.ReadType<Descriptor>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -455,9 +410,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <param name="majorVersion">Major version of the cabinet</param>
|
||||
/// <param name="descriptorOffset">Offset of the cabinet descriptor</param>
|
||||
/// <returns>Filled offset list on success, null on error</returns>
|
||||
private static OffsetList ParseOffsetList(Stream data, int majorVersion, uint descriptorOffset)
|
||||
public static OffsetList ParseOffsetList(Stream data, int majorVersion, uint descriptorOffset)
|
||||
{
|
||||
OffsetList offsetList = new OffsetList();
|
||||
var offsetList = new OffsetList();
|
||||
|
||||
offsetList.NameOffset = data.ReadUInt32();
|
||||
offsetList.DescriptorOffset = data.ReadUInt32();
|
||||
@@ -471,9 +426,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read the string
|
||||
if (majorVersion >= 17)
|
||||
offsetList.Name = data.ReadString(Encoding.Unicode);
|
||||
offsetList.Name = data.ReadNullTerminatedUnicodeString();
|
||||
else
|
||||
offsetList.Name = data.ReadString(Encoding.ASCII);
|
||||
offsetList.Name = data.ReadNullTerminatedAnsiString();
|
||||
|
||||
// Seek back to the correct offset
|
||||
data.Seek(currentOffset, SeekOrigin.Begin);
|
||||
@@ -488,19 +443,14 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <param name="majorVersion">Major version of the cabinet</param>
|
||||
/// <param name="descriptorOffset">Offset of the cabinet descriptor</param>
|
||||
/// <returns>Filled file group on success, null on error</returns>
|
||||
private static FileGroup ParseFileGroup(Stream data, int majorVersion, uint descriptorOffset)
|
||||
public static FileGroup ParseFileGroup(Stream data, int majorVersion, uint descriptorOffset)
|
||||
{
|
||||
FileGroup fileGroup = new FileGroup();
|
||||
var fileGroup = new FileGroup();
|
||||
|
||||
fileGroup.NameOffset = data.ReadUInt32();
|
||||
|
||||
fileGroup.ExpandedSize = data.ReadUInt32();
|
||||
fileGroup.Reserved0 = data.ReadBytes(4);
|
||||
fileGroup.CompressedSize = data.ReadUInt32();
|
||||
fileGroup.Reserved1 = data.ReadBytes(4);
|
||||
fileGroup.Reserved2 = data.ReadBytes(2);
|
||||
fileGroup.Attribute1 = data.ReadUInt16();
|
||||
fileGroup.Attribute2 = data.ReadUInt16();
|
||||
fileGroup.Attributes = (FileGroupAttributes)data.ReadUInt16();
|
||||
|
||||
// TODO: Figure out what data lives in this area for V5 and below
|
||||
if (majorVersion <= 5)
|
||||
@@ -508,19 +458,19 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
fileGroup.FirstFile = data.ReadUInt32();
|
||||
fileGroup.LastFile = data.ReadUInt32();
|
||||
fileGroup.UnknownOffset = data.ReadUInt32();
|
||||
fileGroup.Var4Offset = data.ReadUInt32();
|
||||
fileGroup.Var1Offset = data.ReadUInt32();
|
||||
fileGroup.UnknownStringOffset = data.ReadUInt32();
|
||||
fileGroup.OperatingSystemOffset = data.ReadUInt32();
|
||||
fileGroup.LanguageOffset = data.ReadUInt32();
|
||||
fileGroup.HTTPLocationOffset = data.ReadUInt32();
|
||||
fileGroup.FTPLocationOffset = data.ReadUInt32();
|
||||
fileGroup.MiscOffset = data.ReadUInt32();
|
||||
fileGroup.Var2Offset = data.ReadUInt32();
|
||||
fileGroup.TargetDirectoryOffset = data.ReadUInt32();
|
||||
fileGroup.Reserved3 = data.ReadBytes(2);
|
||||
fileGroup.Reserved4 = data.ReadBytes(2);
|
||||
fileGroup.Reserved5 = data.ReadBytes(2);
|
||||
fileGroup.Reserved6 = data.ReadBytes(2);
|
||||
fileGroup.Reserved7 = data.ReadBytes(2);
|
||||
fileGroup.OverwriteFlags = (FileGroupFlags)data.ReadUInt32();
|
||||
fileGroup.Reserved = new uint[4];
|
||||
for (int i = 0; i < fileGroup.Reserved.Length; i++)
|
||||
{
|
||||
fileGroup.Reserved[i] = data.ReadUInt32();
|
||||
}
|
||||
|
||||
// Cache the current position
|
||||
long currentPosition = data.Position;
|
||||
@@ -533,9 +483,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read the string
|
||||
if (majorVersion >= 17)
|
||||
fileGroup.Name = data.ReadString(Encoding.Unicode);
|
||||
fileGroup.Name = data.ReadNullTerminatedUnicodeString();
|
||||
else
|
||||
fileGroup.Name = data.ReadString(Encoding.ASCII);
|
||||
fileGroup.Name = data.ReadNullTerminatedAnsiString();
|
||||
}
|
||||
|
||||
// Seek back to the correct offset
|
||||
@@ -551,22 +501,26 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <param name="majorVersion">Major version of the cabinet</param>
|
||||
/// <param name="descriptorOffset">Offset of the cabinet descriptor</param>
|
||||
/// <returns>Filled component on success, null on error</returns>
|
||||
private static Component ParseComponent(Stream data, int majorVersion, uint descriptorOffset)
|
||||
public static Component ParseComponent(Stream data, int majorVersion, uint descriptorOffset)
|
||||
{
|
||||
Component component = new Component();
|
||||
var component = new Component();
|
||||
|
||||
component.IdentifierOffset = data.ReadUInt32();
|
||||
component.DescriptorOffset = data.ReadUInt32();
|
||||
component.DisplayNameOffset = data.ReadUInt32();
|
||||
component.Reserved0 = data.ReadBytes(2);
|
||||
component.ReservedOffset0 = data.ReadUInt32();
|
||||
component.ReservedOffset1 = data.ReadUInt32();
|
||||
component.Status = (ComponentStatus)data.ReadUInt16();
|
||||
component.PasswordOffset = data.ReadUInt32();
|
||||
component.MiscOffset = data.ReadUInt32();
|
||||
component.ComponentIndex = data.ReadUInt16();
|
||||
component.NameOffset = data.ReadUInt32();
|
||||
component.ReservedOffset2 = data.ReadUInt32();
|
||||
component.ReservedOffset3 = data.ReadUInt32();
|
||||
component.ReservedOffset4 = data.ReadUInt32();
|
||||
component.Reserved1 = data.ReadBytes(32);
|
||||
component.CDRomFolderOffset = data.ReadUInt32();
|
||||
component.HTTPLocationOffset = data.ReadUInt32();
|
||||
component.FTPLocationOffset = data.ReadUInt32();
|
||||
component.Guid = new Guid[2];
|
||||
for (int i = 0; i < component.Guid.Length; i++)
|
||||
{
|
||||
component.Guid[i] = data.ReadGuid();
|
||||
}
|
||||
component.CLSIDOffset = data.ReadUInt32();
|
||||
component.Reserved2 = data.ReadBytes(28);
|
||||
component.Reserved3 = data.ReadBytes(majorVersion <= 5 ? 2 : 1);
|
||||
@@ -579,10 +533,10 @@ namespace SabreTools.Serialization.Deserializers
|
||||
component.SubComponentsCount = data.ReadUInt16();
|
||||
component.SubComponentsOffset = data.ReadUInt32();
|
||||
component.NextComponentOffset = data.ReadUInt32();
|
||||
component.ReservedOffset5 = data.ReadUInt32();
|
||||
component.ReservedOffset6 = data.ReadUInt32();
|
||||
component.ReservedOffset7 = data.ReadUInt32();
|
||||
component.ReservedOffset8 = data.ReadUInt32();
|
||||
component.OnInstallingOffset = data.ReadUInt32();
|
||||
component.OnInstalledOffset = data.ReadUInt32();
|
||||
component.OnUninstallingOffset = data.ReadUInt32();
|
||||
component.OnUninstalledOffset = data.ReadUInt32();
|
||||
|
||||
// Cache the current position
|
||||
long currentPosition = data.Position;
|
||||
@@ -595,9 +549,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read the string
|
||||
if (majorVersion >= 17)
|
||||
component.Identifier = data.ReadString(Encoding.Unicode);
|
||||
component.Identifier = data.ReadNullTerminatedUnicodeString();
|
||||
else
|
||||
component.Identifier = data.ReadString(Encoding.ASCII);
|
||||
component.Identifier = data.ReadNullTerminatedAnsiString();
|
||||
}
|
||||
|
||||
// Read the display name, if possible
|
||||
@@ -608,9 +562,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read the string
|
||||
if (majorVersion >= 17)
|
||||
component.DisplayName = data.ReadString(Encoding.Unicode);
|
||||
component.DisplayName = data.ReadNullTerminatedUnicodeString();
|
||||
else
|
||||
component.DisplayName = data.ReadString(Encoding.ASCII);
|
||||
component.DisplayName = data.ReadNullTerminatedAnsiString();
|
||||
}
|
||||
|
||||
// Read the name, if possible
|
||||
@@ -621,9 +575,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read the string
|
||||
if (majorVersion >= 17)
|
||||
component.Name = data.ReadString(Encoding.Unicode);
|
||||
component.Name = data.ReadNullTerminatedUnicodeString();
|
||||
else
|
||||
component.Name = data.ReadString(Encoding.ASCII);
|
||||
component.Name = data.ReadNullTerminatedAnsiString();
|
||||
}
|
||||
|
||||
// Read the CLSID, if possible
|
||||
@@ -656,9 +610,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
data.Seek(nameOffset + descriptorOffset, SeekOrigin.Begin);
|
||||
|
||||
if (majorVersion >= 17)
|
||||
component.FileGroupNames[j] = data.ReadString(Encoding.Unicode) ?? string.Empty;
|
||||
component.FileGroupNames[j] = data.ReadNullTerminatedUnicodeString() ?? string.Empty;
|
||||
else
|
||||
component.FileGroupNames[j] = data.ReadString(Encoding.ASCII) ?? string.Empty;
|
||||
component.FileGroupNames[j] = data.ReadNullTerminatedAnsiString() ?? string.Empty;
|
||||
|
||||
// Seek back to the original position
|
||||
data.Seek(preNameOffset, SeekOrigin.Begin);
|
||||
@@ -677,13 +631,13 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <param name="majorVersion">Major version of the cabinet</param>
|
||||
/// <returns>Filled directory name on success, null on error</returns>
|
||||
private static string? ParseDirectoryName(Stream data, int majorVersion)
|
||||
public static string? ParseDirectoryName(Stream data, int majorVersion)
|
||||
{
|
||||
// Read the string
|
||||
if (majorVersion >= 17)
|
||||
return data.ReadString(Encoding.Unicode);
|
||||
return data.ReadNullTerminatedUnicodeString();
|
||||
else
|
||||
return data.ReadString(Encoding.ASCII);
|
||||
return data.ReadNullTerminatedAnsiString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -693,7 +647,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <param name="majorVersion">Major version of the cabinet</param>
|
||||
/// <param name="descriptorOffset">Offset of the cabinet descriptor</param>
|
||||
/// <returns>Filled file descriptor on success, null on error</returns>
|
||||
private static FileDescriptor ParseFileDescriptor(Stream data, int majorVersion, uint descriptorOffset)
|
||||
public static FileDescriptor ParseFileDescriptor(Stream data, int majorVersion, uint descriptorOffset)
|
||||
{
|
||||
FileDescriptor fileDescriptor = new FileDescriptor();
|
||||
|
||||
@@ -740,9 +694,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
// Read the string
|
||||
if (majorVersion >= 17)
|
||||
fileDescriptor.Name = data.ReadString(Encoding.Unicode);
|
||||
fileDescriptor.Name = data.ReadNullTerminatedUnicodeString();
|
||||
else
|
||||
fileDescriptor.Name = data.ReadString(Encoding.ASCII);
|
||||
fileDescriptor.Name = data.ReadNullTerminatedAnsiString();
|
||||
}
|
||||
|
||||
// Seek back to the correct offset
|
||||
@@ -757,7 +711,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// Get the major version of the cabinet
|
||||
/// </summary>
|
||||
/// <remarks>This should live in the wrapper but is needed during parsing</remarks>
|
||||
private static int GetMajorVersion(CommonHeader commonHeader)
|
||||
public static int GetMajorVersion(CommonHeader commonHeader)
|
||||
{
|
||||
uint majorVersion = commonHeader.Version;
|
||||
if (majorVersion >> 24 == 1)
|
||||
|
||||
@@ -425,63 +425,13 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <returns>Filled information block on success, null on error</returns>
|
||||
public static InformationBlock? ParseInformationBlock(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
var informationBlock = new InformationBlock();
|
||||
var informationBlock = data.ReadType<InformationBlock>();
|
||||
|
||||
byte[]? magic = data.ReadBytes(2);
|
||||
if (magic == null)
|
||||
if (informationBlock == null)
|
||||
return null;
|
||||
|
||||
informationBlock.Signature = Encoding.ASCII.GetString(magic);
|
||||
if (informationBlock.Signature != LESignatureString && informationBlock.Signature != LXSignatureString)
|
||||
return null;
|
||||
|
||||
informationBlock.ByteOrder = (ByteOrder)data.ReadByteValue();
|
||||
informationBlock.WordOrder = (WordOrder)data.ReadByteValue();
|
||||
informationBlock.ExecutableFormatLevel = data.ReadUInt32();
|
||||
informationBlock.CPUType = (CPUType)data.ReadUInt16();
|
||||
informationBlock.ModuleOS = (OperatingSystem)data.ReadUInt16();
|
||||
informationBlock.ModuleVersion = data.ReadUInt32();
|
||||
informationBlock.ModuleTypeFlags = (ModuleFlags)data.ReadUInt32();
|
||||
informationBlock.ModuleNumberPages = data.ReadUInt32();
|
||||
informationBlock.InitialObjectCS = data.ReadUInt32();
|
||||
informationBlock.InitialEIP = data.ReadUInt32();
|
||||
informationBlock.InitialObjectSS = data.ReadUInt32();
|
||||
informationBlock.InitialESP = data.ReadUInt32();
|
||||
informationBlock.MemoryPageSize = data.ReadUInt32();
|
||||
informationBlock.BytesOnLastPage = data.ReadUInt32();
|
||||
informationBlock.FixupSectionSize = data.ReadUInt32();
|
||||
informationBlock.FixupSectionChecksum = data.ReadUInt32();
|
||||
informationBlock.LoaderSectionSize = data.ReadUInt32();
|
||||
informationBlock.LoaderSectionChecksum = data.ReadUInt32();
|
||||
informationBlock.ObjectTableOffset = data.ReadUInt32();
|
||||
informationBlock.ObjectTableCount = data.ReadUInt32();
|
||||
informationBlock.ObjectPageMapOffset = data.ReadUInt32();
|
||||
informationBlock.ObjectIterateDataMapOffset = data.ReadUInt32();
|
||||
informationBlock.ResourceTableOffset = data.ReadUInt32();
|
||||
informationBlock.ResourceTableCount = data.ReadUInt32();
|
||||
informationBlock.ResidentNamesTableOffset = data.ReadUInt32();
|
||||
informationBlock.EntryTableOffset = data.ReadUInt32();
|
||||
informationBlock.ModuleDirectivesTableOffset = data.ReadUInt32();
|
||||
informationBlock.ModuleDirectivesCount = data.ReadUInt32();
|
||||
informationBlock.FixupPageTableOffset = data.ReadUInt32();
|
||||
informationBlock.FixupRecordTableOffset = data.ReadUInt32();
|
||||
informationBlock.ImportedModulesNameTableOffset = data.ReadUInt32();
|
||||
informationBlock.ImportedModulesCount = data.ReadUInt32();
|
||||
informationBlock.ImportProcedureNameTableOffset = data.ReadUInt32();
|
||||
informationBlock.PerPageChecksumTableOffset = data.ReadUInt32();
|
||||
informationBlock.DataPagesOffset = data.ReadUInt32();
|
||||
informationBlock.PreloadPageCount = data.ReadUInt32();
|
||||
informationBlock.NonResidentNamesTableOffset = data.ReadUInt32();
|
||||
informationBlock.NonResidentNamesTableLength = data.ReadUInt32();
|
||||
informationBlock.NonResidentNamesTableChecksum = data.ReadUInt32();
|
||||
informationBlock.AutomaticDataObject = data.ReadUInt32();
|
||||
informationBlock.DebugInformationOffset = data.ReadUInt32();
|
||||
informationBlock.DebugInformationLength = data.ReadUInt32();
|
||||
informationBlock.PreloadInstancePagesNumber = data.ReadUInt32();
|
||||
informationBlock.DemandInstancePagesNumber = data.ReadUInt32();
|
||||
informationBlock.ExtraHeapAllocation = data.ReadUInt32();
|
||||
|
||||
return informationBlock;
|
||||
}
|
||||
|
||||
@@ -490,19 +440,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled object table entry on success, null on error</returns>
|
||||
public static ObjectTableEntry ParseObjectTableEntry(Stream data)
|
||||
public static ObjectTableEntry? ParseObjectTableEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
var entry = new ObjectTableEntry();
|
||||
|
||||
entry.VirtualSegmentSize = data.ReadUInt32();
|
||||
entry.RelocationBaseAddress = data.ReadUInt32();
|
||||
entry.ObjectFlags = (ObjectFlags)data.ReadUInt16();
|
||||
entry.PageTableIndex = data.ReadUInt32();
|
||||
entry.PageTableEntries = data.ReadUInt32();
|
||||
entry.Reserved = data.ReadUInt32();
|
||||
|
||||
return entry;
|
||||
return data.ReadType<ObjectTableEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -510,16 +450,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled object page map entry on success, null on error</returns>
|
||||
public static ObjectPageMapEntry ParseObjectPageMapEntry(Stream data)
|
||||
public static ObjectPageMapEntry? ParseObjectPageMapEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
var entry = new ObjectPageMapEntry();
|
||||
|
||||
entry.PageDataOffset = data.ReadUInt32();
|
||||
entry.DataSize = data.ReadUInt16();
|
||||
entry.Flags = (ObjectPageFlags)data.ReadUInt16();
|
||||
|
||||
return entry;
|
||||
return data.ReadType<ObjectPageMapEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -527,18 +460,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled resource table entry on success, null on error</returns>
|
||||
public static ResourceTableEntry ParseResourceTableEntry(Stream data)
|
||||
public static ResourceTableEntry? ParseResourceTableEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
var entry = new ResourceTableEntry();
|
||||
|
||||
entry.TypeID = (ResourceTableEntryType)data.ReadUInt32();
|
||||
entry.NameID = data.ReadUInt16();
|
||||
entry.ResourceSize = data.ReadUInt32();
|
||||
entry.ObjectNumber = data.ReadUInt16();
|
||||
entry.Offset = data.ReadUInt32();
|
||||
|
||||
return entry;
|
||||
return data.ReadType<ResourceTableEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -552,7 +476,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
var entry = new ResidentNamesTableEntry();
|
||||
|
||||
entry.Length = data.ReadByteValue();
|
||||
if (entry.Length > 0)
|
||||
if (entry.Length > 0 && data.Position + entry.Length <= data.Length)
|
||||
{
|
||||
byte[]? name = data.ReadBytes(entry.Length);
|
||||
if (name != null)
|
||||
@@ -631,16 +555,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled module format directives table entry on success, null on error</returns>
|
||||
public static ModuleFormatDirectivesTableEntry ParseModuleFormatDirectivesTableEntry(Stream data)
|
||||
public static ModuleFormatDirectivesTableEntry? ParseModuleFormatDirectivesTableEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
var entry = new ModuleFormatDirectivesTableEntry();
|
||||
|
||||
entry.DirectiveNumber = (DirectiveNumber)data.ReadUInt16();
|
||||
entry.DirectiveDataLength = data.ReadUInt16();
|
||||
entry.DirectiveDataOffset = data.ReadUInt32();
|
||||
|
||||
return entry;
|
||||
return data.ReadType<ModuleFormatDirectivesTableEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -648,20 +565,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled verify record directive table entry on success, null on error</returns>
|
||||
public static VerifyRecordDirectiveTableEntry ParseVerifyRecordDirectiveTableEntry(Stream data)
|
||||
public static VerifyRecordDirectiveTableEntry? ParseVerifyRecordDirectiveTableEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
var entry = new VerifyRecordDirectiveTableEntry();
|
||||
|
||||
entry.EntryCount = data.ReadUInt16();
|
||||
entry.OrdinalIndex = data.ReadUInt16();
|
||||
entry.Version = data.ReadUInt16();
|
||||
entry.ObjectEntriesCount = data.ReadUInt16();
|
||||
entry.ObjectNumberInModule = data.ReadUInt16();
|
||||
entry.ObjectLoadBaseAddress = data.ReadUInt16();
|
||||
entry.ObjectVirtualAddressSize = data.ReadUInt16();
|
||||
|
||||
return entry;
|
||||
return data.ReadType<VerifyRecordDirectiveTableEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -669,14 +575,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled fix-up page table entry on success, null on error</returns>
|
||||
public static FixupPageTableEntry ParseFixupPageTableEntry(Stream data)
|
||||
public static FixupPageTableEntry? ParseFixupPageTableEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
var entry = new FixupPageTableEntry();
|
||||
|
||||
entry.Offset = data.ReadUInt32();
|
||||
|
||||
return entry;
|
||||
return data.ReadType<FixupPageTableEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -909,7 +810,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
var entry = new ImportModuleNameTableEntry();
|
||||
|
||||
entry.Length = data.ReadByteValue();
|
||||
if (entry.Length > 0)
|
||||
if (entry.Length > 0 && data.Position + entry.Length <= data.Length)
|
||||
{
|
||||
byte[]? name = data.ReadBytes(entry.Length);
|
||||
if (name != null)
|
||||
@@ -930,7 +831,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
var entry = new ImportModuleProcedureNameTableEntry();
|
||||
|
||||
entry.Length = data.ReadByteValue();
|
||||
if (entry.Length > 0)
|
||||
if (entry.Length > 0 && data.Position + entry.Length <= data.Length)
|
||||
{
|
||||
byte[]? name = data.ReadBytes(entry.Length);
|
||||
if (name != null)
|
||||
@@ -945,14 +846,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled per-page checksum table entry on success, null on error</returns>
|
||||
public static PerPageChecksumTableEntry ParsePerPageChecksumTableEntry(Stream data)
|
||||
public static PerPageChecksumTableEntry? ParsePerPageChecksumTableEntry(Stream data)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
var entry = new PerPageChecksumTableEntry();
|
||||
|
||||
entry.Checksum = data.ReadUInt32();
|
||||
|
||||
return entry;
|
||||
return data.ReadType<PerPageChecksumTableEntry>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -966,7 +862,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
var entry = new NonResidentNamesTableEntry();
|
||||
|
||||
entry.Length = data.ReadByteValue();
|
||||
if (entry.Length > 0)
|
||||
if (entry.Length > 0 && data.Position + entry.Length <= data.Length)
|
||||
{
|
||||
byte[]? name = data.ReadBytes(entry.Length);
|
||||
if (name != null)
|
||||
|
||||
@@ -23,7 +23,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
var sets = new List<Set>();
|
||||
var rows = new List<Row>();
|
||||
|
||||
var additional = new List<string>();
|
||||
while (!reader.EndOfStream)
|
||||
{
|
||||
// Read the line and don't split yet
|
||||
@@ -33,7 +32,7 @@ namespace SabreTools.Serialization.Deserializers
|
||||
// If we have a set to process
|
||||
if (set != null)
|
||||
{
|
||||
set.Row = rows.ToArray();
|
||||
set.Row = [.. rows];
|
||||
sets.Add(set);
|
||||
set = null;
|
||||
rows.Clear();
|
||||
@@ -215,7 +214,6 @@ namespace SabreTools.Serialization.Deserializers
|
||||
|
||||
default:
|
||||
row = null;
|
||||
additional.Add(line);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -226,15 +224,14 @@ namespace SabreTools.Serialization.Deserializers
|
||||
// If we have a set to process
|
||||
if (set != null)
|
||||
{
|
||||
set.Row = rows.ToArray();
|
||||
set.Row = [.. rows];
|
||||
sets.Add(set);
|
||||
set = null;
|
||||
rows.Clear();
|
||||
}
|
||||
|
||||
// Add extra pieces and return
|
||||
dat.Set = sets.ToArray();
|
||||
dat.ADDITIONAL_ELEMENTS = additional.ToArray();
|
||||
dat.Set = [.. sets];
|
||||
return dat;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,20 +126,31 @@ namespace SabreTools.Serialization.Deserializers
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <param name="count">Number of relocation table entries to read</param>
|
||||
/// <returns>Filled relocation table on success, null on error</returns>
|
||||
private static RelocationEntry[] ParseRelocationTable(Stream data, int count)
|
||||
private static RelocationEntry[]? ParseRelocationTable(Stream data, int count)
|
||||
{
|
||||
// TODO: Use marshalling here instead of building
|
||||
var relocationTable = new RelocationEntry[count];
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
var entry = new RelocationEntry();
|
||||
entry.Offset = data.ReadUInt16();
|
||||
entry.Segment = data.ReadUInt16();
|
||||
var entry = ParseRelocationEntry(data);
|
||||
if (entry == null)
|
||||
return null;
|
||||
|
||||
relocationTable[i] = entry;
|
||||
}
|
||||
|
||||
return relocationTable;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse a Stream into a relocation table entry
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled relocation table entry on success, null on error</returns>
|
||||
public static RelocationEntry? ParseRelocationEntry(Stream data)
|
||||
{
|
||||
return data.ReadType<RelocationEntry>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -138,8 +138,8 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (header.Flags.HasFlag(HeaderFlags.PREV_CABINET))
|
||||
#endif
|
||||
{
|
||||
header.CabinetPrev = data.ReadString(Encoding.ASCII);
|
||||
header.DiskPrev = data.ReadString(Encoding.ASCII);
|
||||
header.CabinetPrev = data.ReadNullTerminatedAnsiString();
|
||||
header.DiskPrev = data.ReadNullTerminatedAnsiString();
|
||||
}
|
||||
|
||||
#if NET20 || NET35
|
||||
@@ -148,8 +148,8 @@ namespace SabreTools.Serialization.Deserializers
|
||||
if (header.Flags.HasFlag(HeaderFlags.NEXT_CABINET))
|
||||
#endif
|
||||
{
|
||||
header.CabinetNext = data.ReadString(Encoding.ASCII);
|
||||
header.DiskNext = data.ReadString(Encoding.ASCII);
|
||||
header.CabinetNext = data.ReadNullTerminatedAnsiString();
|
||||
header.DiskNext = data.ReadNullTerminatedAnsiString();
|
||||
}
|
||||
|
||||
return header;
|
||||
@@ -234,9 +234,9 @@ namespace SabreTools.Serialization.Deserializers
|
||||
#else
|
||||
if (file.Attributes.HasFlag(Models.MicrosoftCabinet.FileAttributes.NAME_IS_UTF))
|
||||
#endif
|
||||
file.Name = data.ReadString(Encoding.Unicode);
|
||||
file.Name = data.ReadNullTerminatedUnicodeString();
|
||||
else
|
||||
file.Name = data.ReadString(Encoding.ASCII);
|
||||
file.Name = data.ReadNullTerminatedAnsiString();
|
||||
|
||||
return file;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user