public RawDataContainer LoadRawFromFile(string inputFilePath, Meta.Meta meta)
{
RawDataContainer raw = new RawDataContainer();
int x = inputFilePath.LastIndexOf('.');
string temp = inputFilePath.Substring(0, x + 1) + meta.type + "raw";
XmlTextReader xtr = new XmlTextReader(temp + ".xml");
xtr.WhitespaceHandling = WhitespaceHandling.None;
FileStream FS = new FileStream(temp, FileMode.Open);
BinaryReader BR = new BinaryReader(FS);
while (xtr.Read())
{
switch (xtr.NodeType)
{
case XmlNodeType.Element:
if (xtr.Name == "RawData")
{
string oi = xtr.GetAttribute("RawType");
switch (oi)
{
case "Model":
raw = new Model();
break;
case "Bitmap":
raw = new BitmapRaw();
break;
case "Animation":
raw = new Animation();
break;
case "DECR":
raw = new DECR();
break;
case "PRTM":
raw = new PRTM();
break;
case "Weather":
raw = new Weather();
break;
case "Sound":
raw = new Sound();
break;
case "BSP":
raw = new BSPRaw();
break;
}
}
else if (xtr.Name == "RawChunk")
{
RawDataChunk r = new RawDataChunk();
string temps = xtr.GetAttribute("RawDataType");
switch (temps)
{
case "bitm":
r.rawDataType = RawDataType.bitm;
break;
case "bsp1":
r.rawDataType = RawDataType.bsp1;
break;
case "bsp2":
r.rawDataType = RawDataType.bsp2;
break;
case "bsp3":
r.rawDataType = RawDataType.bsp3;
break;
case "bsp4":
r.rawDataType = RawDataType.bsp4;
break;
case "DECR":
r.rawDataType = RawDataType.DECR;
break;
case "jmad":
r.rawDataType = RawDataType.jmad;
break;
case "ltmp":
r.rawDataType = RawDataType.ltmp;
break;
case "mode1":
r.rawDataType = RawDataType.mode1;
break;
case "mode2":
r.rawDataType = RawDataType.mode2;
break;
case "PRTM":
r.rawDataType = RawDataType.PRTM;
break;
case "snd1":
r.rawDataType = RawDataType.snd1;
break;
case "snd2":
r.rawDataType = RawDataType.snd2;
break;
}
r.offset = Convert.ToInt32(xtr.GetAttribute("PointsToOffset"));
r.pointerMetaOffset = Convert.ToInt32(xtr.GetAttribute("PointerMetaOffset"));
r.size = Convert.ToInt32(xtr.GetAttribute("ChunkSize"));
int rawdataspot = Convert.ToInt32(xtr.GetAttribute("RawDataOffset"));
BR.BaseStream.Position = rawdataspot;
r.MS = new MemoryStream(r.size);
r.MS.Write(BR.ReadBytes(r.size), 0, r.size);
raw.rawChunks.Add(r);
}
break;
}
}
BR.Close();
FS.Close();
xtr.Close();
if (meta.type == "snd!")
{
Stream s = File.Open(temp + "layout", FileMode.Open);
#region attempt to convert v1.0.0.0 files to v1.1.0.0 format
{
StreamReader sr = new StreamReader(s);
string convertOldVersion = sr.ReadToEnd();
if (convertOldVersion.Contains("Version=1.0.0.0"))
{
int xx = -1;
while ((xx = convertOldVersion.IndexOf("entity.MetaContainers")) > -1)
{
if (convertOldVersion[xx] == '[')
convertOldVersion = convertOldVersion.Substring(0, xx) +
"HaloMap.H2MetaContainers" +
convertOldVersion.Substring(xx + "entity.MetaContainers".Length);
else
convertOldVersion = convertOldVersion.Substring(0, xx - 1) +
(char)((byte)convertOldVersion[xx - 1] + 3) + // string is 3 bytes longer
"HaloMap.H2MetaContainers" +
convertOldVersion.Substring(xx + "entity.MetaContainers".Length);
}
while ((xx = convertOldVersion.IndexOf("entity.MapTypes")) > -1)
{
convertOldVersion = convertOldVersion.Substring(0, xx - 1) +
(char)((byte)convertOldVersion[xx - 1] + 5) + // string is 5 bytes longer
"HaloMap.Map.MapTypes" +
convertOldVersion.Substring(xx + "entity.MapTypes".Length);
}
// Convert the modified string into a stream
StreamWriter sw = new StreamWriter(s);
sw.BaseStream.Position = 0;
char[] ca = convertOldVersion.ToCharArray();
byte[] ba = Encoding.Default.GetBytes(ca);
sw.BaseStream.Write(ba, 0, ba.Length);
#if DEBUG
// Write an output file for testing
Stream s2 = File.Create(temp + "layout_test");
sw = new StreamWriter(s2);
sw.BaseStream.Write(ba, 0, ba.Length);
s2.Close();
#endif
}
s.Position = 0;
}
#endregion
BinaryFormatter b = new BinaryFormatter();
Sound temps = (Sound)raw;
temps.Permutations = (ugh_.SoundPermutationChunk[])b.Deserialize(s);
meta.raw = temps;
s.Close();
}
return raw;
}