public void ReadFromFile(BinaryReader reader) { unk0 = reader.ReadUInt32(); uint count0 = reader.ReadUInt32(); uint count1 = reader.ReadUInt32(); unk1 = reader.ReadUInt32(); missions = new MissionItem[count0]; for (int i = 0; i < count1; i++) { MissionItem item = new MissionItem(); item.ID.ReadFromFile(reader); item.TextID.ReadFromFile(reader); item.DescriptionID.ReadFromFile(reader); item.IconID = reader.ReadUInt32(); item.CityID = reader.ReadUInt32(); item.Type = (EMissionType)reader.ReadUInt32(); item.MissionID = XBinCoreUtils.ReadStringPtrWithOffset(reader); // Only read checkpoint file if we are running M1: DE... if (gameVersion == GamesEnumerator.MafiaI_DE) { item.CheckPointFile = XBinCoreUtils.ReadStringPtrWithOffset(reader); item.Unknown = reader.ReadUInt32(); } missions[i] = item; } }
public void ReadFromFile(BinaryReader reader) { // XBin files store the count twice. unk0 = reader.ReadUInt32(); uint count0 = reader.ReadUInt32(); uint count1 = reader.ReadUInt32(); Debug.Assert(count0 == count1, "These numbers should be identical."); Items = new LocalisableString[count0]; for (int i = 0; i < count0; i++) { LocalisableString Entry = new LocalisableString(); Entry.Unk0 = reader.ReadUInt32(); Entry.StringID = reader.ReadUInt64(); Entry.Content = XBinCoreUtils.ReadStringPtrWithOffset(reader); Items[i] = Entry; } }
public void ReadFromFile(BinaryReader reader) { unk0 = reader.ReadUInt32(); uint count0 = reader.ReadUInt32(); uint count1 = reader.ReadUInt32(); missions = new MissionItem[count0]; for (int i = 0; i < count1; i++) { MissionItem item = new MissionItem(); item.ID = reader.ReadUInt64(); item.TextID = reader.ReadUInt64(); item.DescriptionID = reader.ReadUInt64(); item.IconID = reader.ReadUInt32(); item.CityID = reader.ReadUInt32(); item.Type = (EMissionType)reader.ReadUInt32(); item.Unknown = reader.ReadUInt32(); item.MissionID = XBinCoreUtils.ReadStringPtrWithOffset(reader); item.CheckPointFile = XBinCoreUtils.ReadStringPtrWithOffset(reader); missions[i] = item; } }
public void ReadFromFile(BinaryReader reader) { unk0 = reader.ReadUInt32(); uint count0 = reader.ReadUInt32(); uint count1 = reader.ReadUInt32(); unk1 = reader.ReadUInt32(); cities = new CitiesTableItem[count0]; for (int i = 0; i < count1; i++) { CitiesTableItem item = new CitiesTableItem(); item.RespawnPlaceOffset = reader.ReadUInt32(); item.RespawnPlaceCount = reader.ReadUInt32(); uint RespawnPlacesCount1 = reader.ReadUInt32(); uint CityAreasOffset = reader.ReadUInt32(); // Maybe CityAreas? item.ID = reader.ReadUInt32(); item.Name = XBinCoreUtils.ReadStringPtrWithOffset(reader); item.MissionLine = XBinCoreUtils.ReadStringPtrWithOffset(reader); item.SDSPrefix = XBinCoreUtils.ReadStringPtrWithOffset(reader); item.TextID.ReadFromFile(reader); item.CarGarageType.ReadFromFile(reader); item.BoatGarageType.ReadFromFile(reader); if (gameVersion == GamesEnumerator.MafiaI_DE) { item.Unk01 = XBinCoreUtils.ReadStringPtrWithOffset(reader); } item.Map = XBinCoreUtils.ReadStringPtrWithOffset(reader); // Content doesn't exist in M1DE.. Unused? if (gameVersion == GamesEnumerator.MafiaIII) { reader.ReadUInt32(); } cities[i] = item; } foreach (var Item in Cities) { Item.RespawnPlaces = new CitiesTableItem.CityRespawnPlace[Item.RespawnPlaceCount]; for (int i = 0; i < Item.RespawnPlaces.Length; i++) { CitiesTableItem.CityRespawnPlace RespawnPlace = new CitiesTableItem.CityRespawnPlace(); RespawnPlace.PosPlayer.ReadFromFile(reader); RespawnPlace.DirPlayer.ReadFromFile(reader); RespawnPlace.RespawnType = (ERespawnPlaceType)reader.ReadInt32(); RespawnPlace.StreamMapPart = XBinCoreUtils.ReadStringPtrWithOffset(reader); Item.RespawnPlaces[i] = RespawnPlace; } uint CityPointOffset = reader.ReadUInt32(); uint CityPointCount0 = reader.ReadUInt32(); uint CityPointCount1 = reader.ReadUInt32(); uint CityPolygonOffset = reader.ReadUInt32(); uint CityPolygonCount0 = reader.ReadUInt32(); uint CityPolygonCount1 = reader.ReadUInt32(); Item.Points = new XBinVector2[CityPointCount0]; for (int x = 0; x < CityPointCount0; x++) { Item.Points[x] = new XBinVector2(); Item.Points[x].ReadFromFile(reader); } Item.Polygons = new CitiesTableItem.CityPolygon[CityPolygonCount0]; for (int x = 0; x < CityPolygonCount0; x++) { uint PolygonPointOffset = reader.ReadUInt32(); uint PolygonPointCount0 = reader.ReadUInt32(); uint PolygonPointCount1 = reader.ReadUInt32(); CitiesTableItem.CityPolygon Polygon = new CitiesTableItem.CityPolygon(); Polygon.Name = XBinCoreUtils.ReadStringPtrWithOffset(reader); Polygon.TextID.ReadFromFile(reader); Polygon.Unk0 = reader.ReadUInt64(); Polygon.Indexes = new ushort[PolygonPointCount0]; for (int z = 0; z < PolygonPointCount0; z++) { Polygon.Indexes[z] = reader.ReadUInt16(); } Item.Polygons[x] = Polygon; } } }
public void ReadFromFile(BinaryReader reader) { unk0 = reader.ReadUInt32(); uint count1 = reader.ReadUInt32(); uint count2 = reader.ReadUInt32(); Lines = new StreamMapLine[count1]; for (int i = 0; i < count1; i++) { StreamMapLine Line = new StreamMapLine(); Line.LineType = (EStreamMapLineType)reader.ReadInt32(); Line.GameID = XBinCoreUtils.ReadStringPtrWithOffset(reader); Line.MissionID = XBinCoreUtils.ReadStringPtrWithOffset(reader); Line.PartID = XBinCoreUtils.ReadStringPtrWithOffset(reader); Line.TableCommandsOffset = reader.ReadInt32(); Line.TableCommandsOffset_DEBUG = (int)(reader.BaseStream.Position + Line.TableCommandsOffset - 4); Line.NumTableCommands0 = reader.ReadInt32(); Line.NumTableCommands1 = reader.ReadInt32(); Line.IsAsync = reader.ReadInt32(); // Could be bAsync. Lines[i] = Line; } for (int i = 0; i < count1; i++) { StreamMapLine Line = Lines[i]; // Debug here. Make sure we are actually at the same offset as the Tables offset in the line. // If not, we will have big problems and undoubtedly fail. //if (Line.NumTableCommands0 > 0) //{ // Debug.Assert(reader.BaseStream.Position == Line.TableCommandsOffset_DEBUG, "We did not reach the Commands Offset"); //} reader.BaseStream.Seek(Line.TableCommandsOffset_DEBUG, SeekOrigin.Begin); // We have to read the declarations uint[] TableCommandOffsets = new uint[Line.NumTableCommands0]; uint[] TableCommandMagics = new uint[Line.NumTableCommands0]; // Create the array Line.TableCommands = new ICommand[Line.NumTableCommands0]; // Iterate and read them for (int z = 0; z < Line.TableCommands.Length; z++) { TableCommandOffsets[z] = reader.ReadUInt32(); uint ActualOffset = (uint)(reader.BaseStream.Position + TableCommandOffsets[z] - 4); TableCommandOffsets[z] = ActualOffset; TableCommandMagics[z] = reader.ReadUInt32(); } // Construct the Command. for (int z = 0; z < Line.TableCommands.Length; z++) { reader.BaseStream.Seek(TableCommandOffsets[z], SeekOrigin.Begin); ICommand Command = Command_Factory.ReadCommand(reader, TableCommandMagics[z]); Line.TableCommands[z] = Command; } } }