示例#1
0
        public static void SaveToPrj2OnlyObjects(Stream stream, Level level, IEnumerable <ObjectInstance> objects)
        {
            using (var chunkIO = new ChunkWriter(Prj2Chunks.MagicNumber, stream, ChunkWriter.Compression.None))
            {
                // Index objects
                var objectInstanceLookup = new Dictionary <ObjectInstance, int>();
                foreach (ObjectInstance objectInstance in objects)
                {
                    objectInstanceLookup.Add(objectInstance, objectInstanceLookup.Count);
                }

                // Write settings
                LevelSettings settingsToSave = new LevelSettings();
                Room.CopyDependentLevelSettingsArgs copyInstance = new Room.CopyDependentLevelSettingsArgs(null, settingsToSave, level.Settings, false);
                foreach (ObjectInstance instance in objects)
                {
                    instance.CopyDependentLevelSettings(copyInstance);
                }
                LevelSettingsIds levelSettingIds = WriteLevelSettings(chunkIO, settingsToSave);

                // Write objects
                WriteObjects(chunkIO, objects, new Dictionary <Room, int>(), levelSettingIds, objectInstanceLookup);
                chunkIO.WriteChunkEnd();
            }
        }
示例#2
0
        public static void SaveToPrj2(Stream stream, Level level, Filter filter = null)
        {
            _level = level;

            using (var chunkIO = new ChunkWriter(Prj2Chunks.MagicNumber, stream, ChunkWriter.Compression.None))
            {
                // Index rooms
                var rooms = new Dictionary <Room, int>();
                for (int i = 0; i < level.Rooms.Length; ++i)
                {
                    if (level.Rooms[i] != null && (filter?.RoomPredicate(level.Rooms[i]) ?? true))
                    {
                        rooms.Add(level.Rooms[i], i);
                    }
                }

                LevelSettings settingsToSave = level.Settings;
                if (filter != null && filter.FilterLevelSettings)
                {
                    settingsToSave = new LevelSettings();
                    var copyInstance = new Room.CopyDependentLevelSettingsArgs(null, settingsToSave, level.Settings, false);
                    foreach (Room room in rooms.Keys)
                    {
                        room.CopyDependentLevelSettings(copyInstance);
                    }
                }

                // Write settings
                LevelSettingsIds levelSettingIds = WriteLevelSettings(chunkIO, settingsToSave);

                // Write rooms
                WriteRooms(chunkIO, rooms, levelSettingIds);
                chunkIO.WriteChunkEnd();
            }
        }
示例#3
0
        public override void CopyDependentLevelSettings(Room.CopyDependentLevelSettingsArgs args)
        {
            base.CopyDependentLevelSettings(args);
            if (args.UnifyData)
            {
                foreach (ImportedGeometry importedGeometry in args.DestinationLevelSettings.ImportedGeometries)
                {
                    if (importedGeometry.Info.Equals(Model.Info))
                    {
                        Model = importedGeometry;
                        return;
                    }
                }

                // Add imported geometry
                args.DestinationLevelSettings.ImportedGeometries.Add(Model);
            }
            else
            {
                if (args.DestinationLevelSettings.ImportedGeometries.Contains(Model))
                {
                    return;
                }
                args.DestinationLevelSettings.ImportedGeometries.Add(Model);
            }
        }
示例#4
0
        public void MergeFrom(Level otherLevel, bool unifyData, Action <LevelSettings> applyLevelSettings = null)
        {
            IReadOnlyList <ObjectInstance> oldObjects = Rooms.Where(room => room != null).SelectMany(room => room.AnyObjects).ToList();
            IReadOnlyList <Room>           otherRooms = otherLevel.Rooms.Where(room => room != null).ToList();

            // Merge rooms
            for (int i = 0; i < otherRooms.Count; ++i)
            {
                try
                {
                    AssignRoomToFree(otherRooms[i]);
                }
                catch
                { // If we fail, roll back the changes...
                    while (i > 0)
                    {
                        DeleteRoomWithAlternate(otherRooms[--i]);
                    }
                    throw;
                }
            }

            // Merge dependencies like imported geometries, textures (and wads in the future?)
            LevelSettings newSettings = applyLevelSettings == null ? Settings : Settings.Clone();

            newSettings.Textures           = Settings.Textures.ToList(); // Make sure the same references are used.
            newSettings.ImportedGeometries = Settings.ImportedGeometries.ToList();
            var copyInstance = new Room.CopyDependentLevelSettingsArgs(oldObjects, newSettings, otherLevel.Settings, unifyData);

            foreach (Room room in otherRooms)
            {
                room.CopyDependentLevelSettings(copyInstance);
            }
            applyLevelSettings?.Invoke(newSettings);
            GlobalScriptingIdsTable.MergeFrom(otherLevel.GlobalScriptingIdsTable, @object => @object.ScriptId = null);
            foreach (Room room in otherRooms)
            {
                room.Level = this;
            }
        }
示例#5
0
 public virtual void CopyDependentLevelSettings(Room.CopyDependentLevelSettingsArgs args)
 {
 }
示例#6
0
 public override void CopyDependentLevelSettings(Room.CopyDependentLevelSettingsArgs args)
 {
     base.CopyDependentLevelSettings(args);
     Sequence = args.ReassociateFlyBySequence(Sequence);
 }