Start adding skeleton for Part mapping

This commit is contained in:
Matt Nadareski
2024-03-12 14:34:52 -04:00
parent f2ccda2205
commit 05b0461515

View File

@@ -2,6 +2,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using SabreTools.Core; using SabreTools.Core;
using SabreTools.Core.Tools; using SabreTools.Core.Tools;
using SabreTools.DatItems.Formats;
namespace SabreTools.DatFiles namespace SabreTools.DatFiles
{ {
@@ -227,9 +228,9 @@ namespace SabreTools.DatFiles
} }
// Create mapping dictionaries for the Parts, DataAreas, and DiskAreas associated with this machine // Create mapping dictionaries for the Parts, DataAreas, and DiskAreas associated with this machine
Dictionary<string, Models.Metadata.Part> partMapping = []; Dictionary<Models.Metadata.Part, Models.Metadata.DatItem> partMappings = [];
Dictionary<(string, string), Models.Metadata.DataArea> dataAreaMapping = []; Dictionary<(Models.Metadata.Part, Models.Metadata.DataArea), Models.Metadata.Rom> dataAreaMapping = [];
Dictionary<(string, string), Models.Metadata.DiskArea> diskAreaMapping = []; Dictionary<(Models.Metadata.Part, Models.Metadata.DiskArea), Models.Metadata.Disk> diskAreaMapping = [];
// Loop through and convert the items to respective lists // Loop through and convert the items to respective lists
for (int index = 0; index < items.Count; index++) for (int index = 0; index < items.Count; index++)
@@ -292,7 +293,7 @@ namespace SabreTools.DatFiles
{ {
var partItem = dipSwitchItem.Read<DatItems.Formats.Part>(DatItems.Formats.DipSwitch.PartKey); var partItem = dipSwitchItem.Read<DatItems.Formats.Part>(DatItems.Formats.DipSwitch.PartKey);
if (partItem != null) if (partItem != null)
partMapping[partItem.GetName()!] = partItem.GetInternalClone(); partMappings[partItem.GetInternalClone()] = dipSwitchItem;
} }
break; break;
@@ -308,11 +309,11 @@ namespace SabreTools.DatFiles
{ {
var partItem = diskItem.Read<DatItems.Formats.Part>(DatItems.Formats.Disk.PartKey); var partItem = diskItem.Read<DatItems.Formats.Part>(DatItems.Formats.Disk.PartKey);
if (partItem != null) if (partItem != null)
partMapping[partItem.GetName()!] = partItem.GetInternalClone(); partMappings[partItem.GetInternalClone()] = diskItem;
var diskAreaItem = diskItem.Read<DatItems.Formats.DiskArea>(DatItems.Formats.Disk.DiskAreaKey); var diskAreaItem = diskItem.Read<DatItems.Formats.DiskArea>(DatItems.Formats.Disk.DiskAreaKey);
if (diskAreaItem != null) if (diskAreaItem != null)
diskAreaMapping[(partItem!.GetName()!, diskAreaItem.GetName()!)] = diskAreaItem.GetInternalClone(); diskAreaMapping[(partItem!.GetInternalClone(), diskAreaItem.GetInternalClone())] = diskItem;
} }
break; break;
case DatItems.Formats.Display display: case DatItems.Formats.Display display:
@@ -345,6 +346,20 @@ namespace SabreTools.DatFiles
EnsureMachineKey<Models.Metadata.Media?>(machine, Models.Metadata.Machine.MediaKey); EnsureMachineKey<Models.Metadata.Media?>(machine, Models.Metadata.Machine.MediaKey);
AppendToMachineKey(machine, Models.Metadata.Machine.MediaKey, mediaItem); AppendToMachineKey(machine, Models.Metadata.Machine.MediaKey, mediaItem);
break; break;
case DatItems.Formats.PartFeature partFeature:
var partFeatureItem = partFeature.GetInternalClone();
EnsureMachineKey<Models.Metadata.Feature?>(machine, Models.Metadata.Machine.FeatureKey);
AppendToMachineKey(machine, Models.Metadata.Machine.FeatureKey, partFeatureItem);
// Add Part mapping
bool partFeatureContainsPart = partFeatureItem.ContainsKey(DatItems.Formats.PartFeature.PartKey);
if (partFeatureContainsPart)
{
var partItem = partFeatureItem.Read<DatItems.Formats.Part>(DatItems.Formats.PartFeature.PartKey);
if (partItem != null)
partMappings[partItem.GetInternalClone()] = partFeatureItem;
}
break;
case DatItems.Formats.Port port: case DatItems.Formats.Port port:
var portItem = ProcessItem(port); var portItem = ProcessItem(port);
EnsureMachineKey<Models.Metadata.Port?>(machine, Models.Metadata.Machine.PortKey); EnsureMachineKey<Models.Metadata.Port?>(machine, Models.Metadata.Machine.PortKey);
@@ -372,11 +387,11 @@ namespace SabreTools.DatFiles
{ {
var partItem = romItem.Read<DatItems.Formats.Part>(DatItems.Formats.Rom.PartKey); var partItem = romItem.Read<DatItems.Formats.Part>(DatItems.Formats.Rom.PartKey);
if (partItem != null) if (partItem != null)
partMapping[partItem.GetName()!] = partItem.GetInternalClone(); partMappings[partItem.GetInternalClone()] = romItem;
var dataAreaItem = romItem.Read<DatItems.Formats.DataArea>(DatItems.Formats.Rom.DataAreaKey); var dataAreaItem = romItem.Read<DatItems.Formats.DataArea>(DatItems.Formats.Rom.DataAreaKey);
if (dataAreaItem != null) if (dataAreaItem != null)
dataAreaMapping[(partItem!.GetName()!, dataAreaItem.GetName()!)] = dataAreaItem.GetInternalClone(); dataAreaMapping[(partItem!.GetInternalClone(), dataAreaItem.GetInternalClone())] = romItem;
} }
break; break;
case DatItems.Formats.Sample sample: case DatItems.Formats.Sample sample:
@@ -407,6 +422,47 @@ namespace SabreTools.DatFiles
} }
} }
// Handle Part, DiskItem, and DatItem mappings, if they exist
if (partMappings.Any())
{
// TODO: How do we aggregate the parts?
//
// One Part can contain multiple DataArea, DiskArea, DipSwitch, Feature (PartFeature)
// One DataArea can contain multiple Rom
// One DiskArea can contain multiple Disk
//
// If there is a DataArea mapping for the item, then we must have a Rom
// If there is a DiskArea mapping for the item, then we must have a Disk
// If neither exists, either it's either a DipSwitch or a Feature (PartFeature)
//
// If there's no DataArea mapping for a Rom, don't include it at all
// If there's no DiskArea mapping for a Disk, don't include it at all
// Create a collection to hold the inverted Parts
Dictionary<string, Part> partItems = [];
// Loop through the Part mappings
foreach (var partMapping in partMappings)
{
// If the item has a DataArea mapping
// If the item has a DiskArea mapping
// Add the nested items to the Part
// Aggregate in the part items dictionary based on Part name
}
// Assign the part array to the machine
machine[Models.Metadata.Machine.PartKey] = partItems.Values.ToArray();
}
// Add the machine to the list // Add the machine to the list
machines.Add(machine); machines.Add(machine);
} }