Exemple #1
0
        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;
            }
        }
Exemple #2
0
        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;
                }
            }
        }
Exemple #5
0
        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;
                }
            }
        }