Esempio n. 1
0
        /// <summary>
        /// Reads a block of data from the file into the work buffer.
        /// </summary>
        protected int ReadBlock(DataBuffer file)
        {
            file.Mark();
            WorkBuff.Reset();

            int size = file.ReadInt32();

            if ((uint)size > WorkBuff.Length)
            {
                throw new SerializationException(Strings.Error_Serialization_BadBlockSize, (uint)size);
            }

            WorkBuff.Write(file.ReadBytes(size));
            file.Align4();

            Debug.Assert(file.Offset == size + 4);

            WorkBuff.Reset();
            return(size);
        }
Esempio n. 2
0
        /// <summary>
        /// Writes a block of data from the work buffer into the file.
        /// </summary>
        protected int WriteBlock(DataBuffer file)
        {
            file.Mark();

            byte[] data = WorkBuff.GetBytes();
            int    size = data.Length;

            file.Write(size);
            file.Write(data);
            file.Align4();

            Debug.Assert(file.Offset == size + 4);
            CheckSum += file.GetBytesFromMark().Sum(x => x);

            WorkBuff.Reset();

            // game code has a bug where the size of the 'size' itself is not
            // factored in to the total file size, so savefiles are always
            // 4 * numBlocks bytes larger than told by SizeOfGameInBytes
            return(size);
        }
Esempio n. 3
0
        protected override void SaveAllData(DataBuffer file)
        {
            int dataSize = 0;
            int size;
            int numOuterBlocks;

            WorkBuff.Reset();
            CheckSum = 0;
            SimpleVars.SizeOfGameInBytes = DataSize;

            if (FileFormat.IsPS2)
            {
                if (!FileFormat.IsJapanese)
                {
                    SimpleVars.SizeOfGameInBytes += 1;
                }
                WorkBuff.Write(SimpleVars, FileFormat);
                SaveObject(Scripts);
                SaveObject(PlayerPeds);
                SaveObject(Garages);
                SaveObject(Vehicles);
                dataSize += WriteBlock(file);
                SaveObject(Objects);
                SaveObject(Paths);
                SaveObject(Cranes);
                dataSize += WriteBlock(file);
                SaveObject(Pickups);
                SaveObject(PhoneInfo);
                SaveObject(RestartPoints);
                SaveObject(RadarBlips);
                SaveObject(Zones);
                SaveObject(Gangs);
                SaveObject(CarGenerators);
                SaveObject(ParticleObjects);
                SaveObject(AudioScriptObjects);
                SaveObject(PlayerInfo);
                SaveObject(Stats);
                SaveObject(Streaming);
                SaveObject(PedTypeInfo);
                dataSize      += WriteBlock(file);
                numOuterBlocks = NumOuterBlocksPS2;
            }
            else
            {
                SimpleVars.SizeOfGameInBytes += 1;
                WorkBuff.Write(SimpleVars, FileFormat);
                SaveObject(Scripts); dataSize            += WriteBlock(file);
                SaveObject(PlayerPeds); dataSize         += WriteBlock(file);
                SaveObject(Garages); dataSize            += WriteBlock(file);
                SaveObject(Vehicles); dataSize           += WriteBlock(file);
                SaveObject(Objects); dataSize            += WriteBlock(file);
                SaveObject(Paths); dataSize              += WriteBlock(file);
                SaveObject(Cranes); dataSize             += WriteBlock(file);
                SaveObject(Pickups); dataSize            += WriteBlock(file);
                SaveObject(PhoneInfo); dataSize          += WriteBlock(file);
                SaveObject(RestartPoints); dataSize      += WriteBlock(file);
                SaveObject(RadarBlips); dataSize         += WriteBlock(file);
                SaveObject(Zones); dataSize              += WriteBlock(file);
                SaveObject(Gangs); dataSize              += WriteBlock(file);
                SaveObject(CarGenerators); dataSize      += WriteBlock(file);
                SaveObject(ParticleObjects); dataSize    += WriteBlock(file);
                SaveObject(AudioScriptObjects); dataSize += WriteBlock(file);
                SaveObject(PlayerInfo); dataSize         += WriteBlock(file);
                SaveObject(Stats); dataSize              += WriteBlock(file);
                SaveObject(Streaming); dataSize          += WriteBlock(file);
                SaveObject(PedTypeInfo); dataSize        += WriteBlock(file);
                numOuterBlocks = NumOuterBlocks;
            }

            int numPaddingBlocks = 0;

            for (int i = 0; i < MaxNumPaddingBlocks; i++)
            {
                size = (SimpleVars.SizeOfGameInBytes - dataSize - 1) & 0x7FFFFFFC;
                if (size > GetBufferSize())
                {
                    size = GetBufferSize();
                }
                if (size > 4)
                {
                    WorkBuff.Reset();
                    WorkBuff.Pad(size);
                    dataSize += WriteBlock(file);
                    numPaddingBlocks++;
                }
            }

            file.Write(CheckSum);
            if (FileFormat.IsXbox)
            {
                byte[] data = file.GetBytes();
                byte[] sig  = XboxHelper.CalculateGameSaveSignature(XboxTitleKey, data, 0, data.Length - 4);
                file.Write(sig);
            }

            // Size checks
            int expectedDataSize = DataSize;

            if (!(FileFormat.IsPS2 && FileFormat.IsJapanese))
            {
                expectedDataSize += 1;
            }
            expectedDataSize = (expectedDataSize - 1) & 0x7FFFFFFC;
            int expectedFileSize = expectedDataSize + ((numOuterBlocks + numPaddingBlocks) * sizeof(int)) + sizeof(int);

            if (FileFormat.IsXbox)
            {
                expectedFileSize += XboxHelper.SignatureLength;
            }
            Debug.Assert(expectedDataSize == dataSize);
            Debug.Assert(expectedFileSize == file.Length);
            Debug.WriteLine("Save successful!");
        }
Esempio n. 4
0
        protected override void SaveAllData(DataBuffer file)
        {
            int dataSize = 0;
            int size;

            WorkBuff.Reset();
            CheckSum = 0;
            SimpleVars.SizeOfGameInBytes = DataSize + 1;

            WorkBuff.Write(SimpleVars, FileFormat);
            SaveObject(Scripts); dataSize            += WriteBlock(file);
            SaveObject(PedPool); dataSize            += WriteBlock(file);
            SaveObject(Garages); dataSize            += WriteBlock(file);
            SaveObject(GameLogic); dataSize          += WriteBlock(file);
            SaveObject(Vehicles); dataSize           += WriteBlock(file);
            SaveObject(Objects); dataSize            += WriteBlock(file);
            SaveObject(Paths); dataSize              += WriteBlock(file);
            SaveObject(Cranes); dataSize             += WriteBlock(file);
            SaveObject(Pickups); dataSize            += WriteBlock(file);
            SaveObject(PhoneInfo); dataSize          += WriteBlock(file);
            SaveObject(RestartPoints); dataSize      += WriteBlock(file);
            SaveObject(RadarBlips); dataSize         += WriteBlock(file);
            SaveObject(Zones); dataSize              += WriteBlock(file);
            SaveObject(Gangs); dataSize              += WriteBlock(file);
            SaveObject(CarGenerators); dataSize      += WriteBlock(file);
            SaveObject(ParticleObjects); dataSize    += WriteBlock(file);
            SaveObject(AudioScriptObjects); dataSize += WriteBlock(file);
            SaveObject(ScriptPaths); dataSize        += WriteBlock(file);
            SaveObject(PlayerInfo); dataSize         += WriteBlock(file);
            SaveObject(Stats); dataSize              += WriteBlock(file);
            SaveObject(SetPieces); dataSize          += WriteBlock(file);
            SaveObject(Streaming); dataSize          += WriteBlock(file);
            SaveObject(PedTypeInfo); dataSize        += WriteBlock(file);

            int numPaddingBlocks = 0;

            for (int i = 0; i < MaxNumPaddingBlocks; i++)
            {
                size = (SimpleVars.SizeOfGameInBytes - dataSize - 1) & 0x7FFFFFFC;
                if (size > GetBufferSize())
                {
                    size = GetBufferSize();
                }
                if (size > 4)
                {
                    WorkBuff.Reset();
                    WorkBuff.Pad(size);
                    dataSize += WriteBlock(file);
                    numPaddingBlocks++;
                }
            }

            file.Write(CheckSum);

            // Size checks
            int expectedDataSize = DataSize;
            int expectedFileSize = expectedDataSize + ((NumOuterBlocks + numPaddingBlocks) * sizeof(int)) + sizeof(int);

            Debug.Assert(expectedDataSize == dataSize);
            Debug.Assert(expectedFileSize == file.Length);
            Debug.WriteLine("Save successful!");
        }