Пример #1
0
        public void Persist(StatePersister reader)
        {
            reader.PersistVersion(2);

            reader.PersistAsciiString(ref _mapPath1);
            reader.PersistAsciiString(ref _mapPath2);
            reader.PersistEnum(ref _gameType);

            var mapSize = reader.BeginSegment("EmbeddedMap");

            if (reader.SageGame >= SageGame.Bfme)
            {
                var unknown4 = 0u;
                reader.PersistUInt32(ref unknown4);

                var unknown5 = 0u;
                reader.PersistUInt32(ref unknown5);

                mapSize -= 8;
            }

            var game = reader.Game;

            // TODO: Delete this temporary map when ending the game.
            var mapPathInSaveFolder = Path.Combine(
                game.ContentManager.UserDataFileSystem.RootDirectory,
                _mapPath1);
            var saveFolder = Path.GetDirectoryName(mapPathInSaveFolder);

            if (!Directory.Exists(saveFolder))
            {
                Directory.CreateDirectory(saveFolder);
            }

            var mapBytes = (reader.Mode == StatePersistMode.Read)
                ? new byte[mapSize]
                : File.ReadAllBytes(mapPathInSaveFolder);

            reader.PersistSpan(mapBytes);

            if (reader.Mode == StatePersistMode.Read)
            {
                File.WriteAllBytes(mapPathInSaveFolder, mapBytes);
            }

            reader.EndSegment();

            reader.PersistUInt32(ref reader.Game.GameLogic.NextObjectId);
            reader.PersistUInt32(ref reader.Game.GameClient.NextDrawableId);

            if (reader.SageGame >= SageGame.Bfme)
            {
                var unknown6 = false;
                reader.PersistBoolean(ref unknown6);
            }

            if (reader.Mode == StatePersistMode.Read)
            {
                if (_gameType == GameType.Skirmish)
                {
                    game.SkirmishManager = new LocalSkirmishManager(game);

                    reader.PersistObject(game.SkirmishManager.Settings, "SkirmishGameSettings");

                    game.SkirmishManager.Settings.MapName = _mapPath1;

                    game.SkirmishManager.HandleStartButtonClickAsync().Wait();

                    game.SkirmishManager.StartGame();
                }
                else
                {
                    game.StartSinglePlayerGame(_mapPath1);
                }

                game.PartitionCellManager.OnNewGame();
            }
            else
            {
                if (_gameType == GameType.Skirmish)
                {
                    reader.PersistObject(game.SkirmishManager.Settings, "SkirmishGameSettings");
                }
            }
        }