private void fixSystemLinkToolStripMenuItem_Click(object sender, EventArgs e)
{
int count = 0;
List<int> ids = new List<int>();
for (int x = 0; x < map.IndexHeader.metaCount; x++)
{
switch (map.MetaInfo.TagType[x])
{
case "bipd":
case "bloc":
case "ctrl":
case "jpt!":
case "mach":
case "scen":
case "ssce":
case "vehi":
ids.Add(map.MetaInfo.Ident[x]);
count++;
break;
case "eqip":
case "garb":
case "proj":
ids.Add(map.MetaInfo.Ident[x]);
ids.Add(map.MetaInfo.Ident[x]);
count += 2;
break;
case "weap":
ids.Add(map.MetaInfo.Ident[x]);
ids.Add(map.MetaInfo.Ident[x]);
ids.Add(map.MetaInfo.Ident[x]);
count += 3;
break;
}
}
map.OpenMap(MapTypes.Internal);
Meta m = new Meta(map);
m.ReadMetaFromMap(3, true);
try
{
IFPIO io = IFPHashMap.GetIfp("scnr", map.HaloVersion);
m.headersize = io.headerSize;
m.scanner.ScanWithIFP(ref io);
MetaSplitter metasplit = new MetaSplitter();
metasplit.SplitWithIFP(ref io, ref m, map);
for (int x = 0; x < metasplit.Header.Chunks[0].ChunkResources.Count; x++)
{
// Offset 984 = [SCNR] Predicted Resources
if (metasplit.Header.Chunks[0].ChunkResources[x].offset == 984)
{
MetaSplitter.SplitReflexive reflex =
(MetaSplitter.SplitReflexive)metasplit.Header.Chunks[0].ChunkResources[x];
// count = # of chunks incl. added/removed
// reflex.Chunks.Count = # of chunks listed in Predicted Resources (?)
int diff = count - reflex.Chunks.Count;
// Add/Remove chunks to match the difference
for (int y = 0; y < diff; y++)
{
MetaSplitter.SplitReflexive MetaChunk = new MetaSplitter.SplitReflexive();
MetaChunk.splitReflexiveType = MetaSplitter.SplitReflexive.SplitReflexiveType.Chunk;
MetaChunk.chunksize = 4;
MetaChunk.MS = new MemoryStream(4);
reflex.Chunks.Add(MetaChunk);
}
for (int y = 0; y < reflex.Chunks.Count; y++)
{
BinaryWriter BW = new BinaryWriter(reflex.Chunks[y].MS);
BW.Write(ids[y]);
}
metasplit.Header.Chunks[0].ChunkResources[x] = reflex;
break;
}
}
Meta newmeta = MetaBuilder.BuildMeta(metasplit, map);
map.OpenMap(MapTypes.Internal);
map.ChunkTools.Add(newmeta);
map.CloseMap();
// info.OpenMap(MapTypes.Internal);
// info.BW.BaseStream.Position = m.offset + r.translation;
// for (int x = 0; x < count; x++)
// {
// info.BW.Write(ids[x]);
// }
// info.CloseMap();
map = Map.Refresh(map);
MessageBox.Show("Done");
}
catch (Exception ex)
{
Global.ShowErrorMsg(string.Empty, ex);
}
}