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(); } }
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(); } }
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); } }
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; } }
public virtual void CopyDependentLevelSettings(Room.CopyDependentLevelSettingsArgs args) { }
public override void CopyDependentLevelSettings(Room.CopyDependentLevelSettingsArgs args) { base.CopyDependentLevelSettings(args); Sequence = args.ReassociateFlyBySequence(Sequence); }