/// <summary> /// Writes data files from Game Maker project. /// </summary> private void WriteDataFiles(GMList<GMDataFile> dataFiles, GMVersionType version) { // If the version is greater than 5.3, return. if (version > GMVersionType.GameMaker53) return; // Write version. WriteInt(440); // Write amount of script ids. WriteInt(dataFiles.LastId + 1); // Iterate through data files. for (int i = 0; i < dataFiles.LastId + 1; i++) { // Try to get the resource by the current id. GMDataFile dataFile = dataFiles.Find(delegate(GMDataFile d) { return d.Id == i; }); // If the script at current id does not exists, continue. if (dataFile == null) { // No object exists at this id. WriteBool(false); continue; } else WriteBool(true); // Write data file name. WriteString(dataFile.Name); // Write version. WriteInt(440); // Write data file data. WriteString(dataFile.FileName); // If data file exists. if (dataFile.Data != null) { // Data exists. WriteBool(true); // Write the size of the data file. WriteInt(dataFile.Data.Length); // Write data file data. WriteBytes(dataFile.Data); } else // Data does not exist. WriteBool(false); // Write data file data. WriteInt((int)dataFile.ExportMode); WriteBool(dataFile.OverwriteFile); WriteBool(dataFile.FreeDataMemory); WriteBool(dataFile.RemoveAtGameEnd); } }
private Stream _writer = null; // The base underlining write stream. #endregion Fields #region Methods /// <summary> /// Writes a Game Maker project to disk. /// </summary> /// <param name="filePath">The file path to write the project.</param> /// <param name="project">The project object to write.</param> /// <param name="version">The target Game Maker version.</param> public void WriteGMProject(string filePath, GMProject project, GMVersionType version) { // Create a new stream encoder. using (_writer = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { // Write GM identifier. WriteInt(1234321); // Write version. WriteInt((int)version); // Write reserved bytes. if ((int)version < 600) WriteEmpty(4); // If target version is GM7, start Game Maker 7 project file encryption. if (version == GMVersionType.GameMaker70) { // Create random numbers. Random rand = new Random(); byte[] bytes = null; // Get game id bytes. The first byte is not encrypted. byte[] id = BitConverter.GetBytes(project.Settings.GameIdentifier); // Bill and Fred, psssttt they like each other ;). int bill = rand.Next() % 3000 + 123; int fred = rand.Next() % 3000 + 231; // Write trash and treasure. WriteInt(bill); WriteInt(fred); // Write junk integers. while (bill-- > 0) { bytes = BitConverter.GetBytes((int)(rand.Next() % 3000)); _writer.Write(bytes, 0, bytes.Length); } // Set the seed and swap table. int seed = rand.Next() % 25600 + 3328; bytes = BitConverter.GetBytes((int)seed); _writer.Write(bytes, 0, bytes.Length); // Write junk integers. while (fred-- > 0) { bytes = BitConverter.GetBytes((int)(rand.Next() % 3000)); _writer.Write(bytes, 0, bytes.Length); } // Write first byte of game id (Not encrypted). WriteByte(id[0]); // Set the seed for encryption. SetSeed(seed); // Write rest of game id bytes, encrypted. WriteByte(id[1]); WriteByte(id[2]); WriteByte(id[3]); } else // Write game id. WriteInt(project.Settings.GameIdentifier); // Write empty bytes. WriteEmpty(16); // Write project objects. WriteSettings(project.Settings, version); // If the version is greater than 7.0. if (version > GMVersionType.GameMaker70) { // Read triggers and constants. WriteTriggers(project.Triggers, version); WriteConstants(project.Settings.Constants, version); } WriteSounds(project.Sounds, version); WriteSprites(project.Sprites, version); WriteBackgrounds(project.Backgrounds, version); WritePaths(project.Paths, version); WriteScripts(project.Scripts, version); WriteDataFiles(project.DataFiles, version); WriteFonts(project.Fonts, version); WriteTimelines(project.Timelines, version); WriteObjects(project.Objects, version); WriteRooms(project.Rooms, version); // Write last ids for instances and tiles. WriteInt(project.LastInstanceId); WriteInt(project.LastTileId); // Write version. if (version < GMVersionType.GameMaker60) WriteInt(430); else if (version == GMVersionType.GameMaker60) WriteInt(600); else if (version == GMVersionType.GameMaker70) WriteInt(620); else if (version == GMVersionType.GameMaker80) WriteInt(800); // Check version. if (version < GMVersionType.GameMaker70) WriteGameInformation(project.GameInformation, version); else { // Write includes. WriteIncludes(project.Settings.Includes, version); // Write packages. WritePackages(project.Packages.ToArray(), version); // Write version. if (version == GMVersionType.GameMaker70) WriteInt(600); else if (version == GMVersionType.GameMaker80) WriteInt(800); // Write game information. WriteGameInformation(project.GameInformation, version); } // Write version. WriteInt(500); // Write the amount of libraries. WriteInt(project.Libraries.Count); // Iterate throught libraries. for (int j = 0; j < project.Libraries.Count; j++) { // Write the library code. WriteString(project.Libraries[j].Code); } // Write project tree. WriteTree(project.ProjectTree, version); } }
/// <summary> /// Writes a Game Maker project to disk. /// </summary> /// <param name="path">The path where the project should be written to.</param> /// <param name="project">The project that is to be written.</param> /// <param name="version">The target version for the write.</param> public static void WriteGMProject(string path, GMProject project, GMVersionType version) { GMProjectWriter writer = new GMProjectWriter(); writer.WriteGMProject(path, project, version); }
/// <summary> /// Writes Game Maker project constants. /// </summary> private void WriteConstants(GMConstant[] constants, GMVersionType version) { // Write version number. WriteInt((int)version); // Write amount of constants. WriteInt(constants.Length); // Iterate through constants. for (int i = 0; i < constants.Length; i++) { // Write constant data. WriteString(constants[i].Name); WriteString(constants[i].Value); } // Write last changed. WriteDouble(GMConstant.LastChanged); }
/// <summary> /// Writes packages from Game Maker project. /// </summary> private void WritePackages(GMPackage[] packages, GMVersionType version) { // Write version number. WriteInt(700); // Write the number of packages. WriteInt(packages.Length); // Iterate through packages. for (int i = 0; i < packages.Length; i++) { // Write package name. WriteString(packages[i].Name); } }
/// <summary> /// Reads a Game Maker Studio project file /// </summary> private void ReadProjectGMS(string file) { // Set version GameMakerVersion = GMVersionType.GameMakerStudio; // Path with project file removed string folder = file.Remove(file.LastIndexOf("\\")); // Set up resource directory strings Dictionary <GMResourceType, string> directories = new Dictionary <GMResourceType, string>(); directories.Add(GMResourceType.Assets, file); directories.Add(GMResourceType.DataFiles, file); directories.Add(GMResourceType.Configs, file); directories.Add(GMResourceType.Constants, file); directories.Add(GMResourceType.Hash, file); directories.Add(GMResourceType.Backgrounds, folder + "\\" + "background"); directories.Add(GMResourceType.Objects, folder + "\\" + "objects"); directories.Add(GMResourceType.Rooms, folder + "\\" + "rooms"); directories.Add(GMResourceType.Sprites, folder + "\\" + "sprites"); directories.Add(GMResourceType.Sounds, folder + "\\" + "sound"); directories.Add(GMResourceType.TimeLines, folder + "\\" + "timelines"); directories.Add(GMResourceType.Shaders, folder + "\\" + "shaders"); directories.Add(GMResourceType.Scripts, folder + "\\" + "scripts"); directories.Add(GMResourceType.Paths, folder + "\\" + "paths"); // Resource load index int index = 0; // Iterate through directories foreach (KeyValuePair <GMResourceType, string> item in directories) { // Increment directory index index++; // If the directory does not exist, continue if (Path.GetExtension(item.Value) != ".gmx" && !Directory.Exists(item.Value)) { continue; } // Progress changed ProgressChanged("Reading " + item.Key.ToString() + "...", index, directories.Count); // Load data based on resource type switch (item.Key) { case GMResourceType.Hash: Settings.Hash = ReadHashGMX(item.Value); break; case GMResourceType.Assets: ProjectTree = GMNode.ReadTreeGMX(item.Value); Assets = (List <string>)ProjectTree.Tag; break; case GMResourceType.DataFiles: DataFiles = GMDataFile.ReadDataFilesGMX(item.Value, out LastDataFileId); break; case GMResourceType.Sprites: Sprites = GMSprite.ReadSpritesGMX(item.Value, ref Assets); break; //case GMResourceType.Configs: Settings.Configs = GMSettings.GetConfigsGMX(item.Value); break; //case GMResourceType.Constants: Settings.Constants = GMSettings.ReadConstantsGMX(item.Value); break; case GMResourceType.Backgrounds: Backgrounds = GMBackground.ReadBackgroundsGMX(item.Value, ref Assets); break; case GMResourceType.Objects: Objects = GMObject.ReadObjectsGMX(item.Value, ref Assets); break; case GMResourceType.Rooms: Rooms = GMRoom.ReadRoomsGMX(item.Value, ref Assets, out LastTileId); break; //case GMResourceType.TimeLines: Timelines = GMTimeline.ReadTimelinesGMX(item.Value, Assets); break; //case GMResourceType.Sounds: Sounds = GMSound.ReadSoundsGMX(item.Value, ref Assets); break; //case GMResourceType.Shaders: Shaders = GMShader.ReadShadersGMX(item.Value, ref Assets); break; //case GMResourceType.Scripts: Scripts = GMScript.ReadScriptsGMX(item.Value, ref Assets); break; //case GMResourceType.Paths: Paths = GMPath.ReadPathsGMX(item.Value, ref Assets); break; //case GMResourceType.TimeLines: Timelines = GMTimeline.ReadTimelinesGMX(item.Value, Assets); break; } } // Retrieve tutorial data foreach (GMNode node in ProjectTree.Nodes) { // If the node is the tutorial state node and it has the nodes we're looking for if (node.ResourceType == GMResourceType.TutorialState && node.Nodes != null && node.Nodes.Length == 3) { Settings.IsTutorial = node.Nodes[0].Nodes == null ? Settings.IsTutorial : GMResource.GMXBool(node.Nodes[0].Nodes[0].Name, true); Settings.TutorialName = node.Nodes[1].Nodes == null ? Settings.TutorialName : GMResource.GMXString(node.Nodes[1].Nodes[0].FilePath, ""); Settings.TutorialPage = node.Nodes[2].Nodes == null ? Settings.TutorialPage : GMResource.GMXInt(node.Nodes[2].Nodes[0].Name, 0); } } // Progress event ProgressChanged("Finished Reading Project.", index, directories.Count); }
/// <summary> /// Writes timelines from Game Maker project. /// </summary> private void WriteTimelines(GMList<GMTimeline> timelines, GMVersionType version) { // Write version number. if (version < GMVersionType.GameMaker80) WriteInt(500); else WriteInt(800); // Write the amount of timeline ids. WriteInt(timelines.LastId + 1); // Iterate through timelines. for (int i = 0; i < timelines.LastId + 1; i++) { // If version is 8.0, compress. if (version == GMVersionType.GameMaker80) Compress(); // Try to get the resource with the current id. GMTimeline timeline = timelines.Find(delegate(GMTimeline t) { return t.Id == i; }); // If the resource at index does not exist, continue. if (timeline == null) { // No object exists at this id. WriteBool(false); EndCompress(); continue; } else WriteBool(true); // Write timeline name. WriteString(timeline.Name); // If version is 8.0, write last changed. if (version == GMVersionType.GameMaker80) WriteDouble(timeline.LastChanged); // Write version. WriteInt(500); // If there are moments to write. if (timeline.Moments != null) { // Write number of timeline moments. WriteInt(timeline.Moments.Length); // Iterate through moments. for (int j = 0; j < timeline.Moments.Length; j++) { // Write moment step number. WriteInt(timeline.Moments[j].StepIndex); // Write moment actions. WriteActions(timeline.Moments[j].Actions, version); } } else // There are no moments. WriteInt(0); // End object compression. EndCompress(); } }
/// <summary> /// Writes includes from Game Maker project. /// </summary> private void WriteIncludes(GMInclude[] includes, GMVersionType version) { // Write the amount of includes. WriteInt(includes.Length); // Iterate through includes. for (int i = 0; i < includes.Length; i++) { // If version is 8.0, write last changed. if (version == GMVersionType.GameMaker80) WriteDouble(includes[i].LastChanged); // Write version number. if (version < GMVersionType.GameMaker80) WriteInt(620); else WriteInt(800); // Write include data. WriteString(includes[i].FileName); WriteString(includes[i].FilePath); WriteBool(includes[i].OriginalFileChosen); WriteInt(includes[i].OriginalFileSize); WriteBool(includes[i].StoreInEditableGMKFile); // If the include file will be stored within the executable, write data. if (includes[i].StoreInEditableGMKFile == true) WriteBytes(includes[i].Data); // Write include data. WriteInt((int)includes[i].ExportMode); WriteInt(includes[i].FolderToExport); WriteBool(includes[i].OverwriteIfExists); WriteBool(includes[i].FreeMemoryAfterExport); WriteBool(includes[i].RemoveAtGameEnd); } }
/// <summary> /// Writes sounds from Game Maker project. /// </summary> /// <param name="sounds">Sounds array to write.</param> /// <param name="version">Target Game Maker file version to write.</param> private void WriteSounds(GMList<GMSound> sounds, GMVersionType version) { // Write version number. if (version < GMVersionType.GameMaker80) WriteInt(400); else WriteInt(800); // Write number of sound ids. WriteInt(sounds.LastId + 1); // Iterate through sound ids. for (int i = 0; i < sounds.LastId + 1; i++) { // If version is 8.0, compress. if (version == GMVersionType.GameMaker80) Compress(); // Try to get the resource by the current id. GMSound sound = sounds.Find(delegate(GMSound s) { return s.Id == i; }); // If the sound with the current id does not exist, continue. if (sound == null) { // No object exists at this id. WriteBool(false); EndCompress(); continue; } else WriteBool(true); // Write sound data. WriteString(sound.Name); // If version is 8.0, write last changed. if (version == GMVersionType.GameMaker80) WriteDouble(sound.LastChanged); // Write version number. if (version < GMVersionType.GameMaker60) { WriteInt(440); WriteInt((int)sound.Kind); } else if (version == GMVersionType.GameMaker80) { WriteInt(800); WriteInt((int)sound.Type); } else { WriteInt(600); WriteInt((int)sound.Type); } // Write sound data. WriteString(sound.FileType); // Versions less than 6.0, have different sound data. if (version < GMVersionType.GameMaker60) { // If sound data exists, read it. if (sound.Kind != SoundKind.None) { // Write sound data. WriteInt(sound.Data.Length); WriteBytes(sound.Data); } // Write sound data. WriteBool(sound.AllowSoundEffects); WriteInt(sound.Buffers); WriteBool(sound.Preload); } else { // Write sound data. WriteString(sound.FileName); // If sound data exists, write it. if (sound.Data != null) { // Write sound data. WriteBool(true); WriteInt(sound.Data.Length); WriteBytes(sound.Data); } else WriteBool(false); // Write sound data. WriteInt(sound.Effects); WriteDouble(sound.Volume); WriteDouble(sound.Pan); WriteBool(sound.Preload); } // End compression. EndCompress(); } }
/// <summary> /// Writes sprites from Game Maker project. /// </summary> private void WriteSprites(GMList<GMSprite> sprites, GMVersionType version) { // Write version number. if (version < GMVersionType.GameMaker80) WriteInt(400); else WriteInt(800); // Write number of sprite ids. WriteInt(sprites.LastId + 1); // Iterate through sprites. for (int i = 0; i < sprites.LastId + 1; i++) { // If version is 8.0, compress. if (version == GMVersionType.GameMaker80) Compress(); // Try to get the resource by the current id. GMSprite sprite = sprites.Find(delegate(GMSprite s) { return s.Id == i; }); // If the sprite with the current id does not exist, continue. if (sprite == null) { // No object exists at this id. WriteBool(false); EndCompress(); continue; } else WriteBool(true); // Write sprite data. WriteString(sprite.Name); // If version is 8.0, write last changed. if (version == GMVersionType.GameMaker80) WriteDouble(sprite.LastChanged); // Write version number. if (version < GMVersionType.GameMaker60) WriteInt(400); else if (version == GMVersionType.GameMaker70 || version == GMVersionType.GameMaker60) WriteInt(542); else if (version == GMVersionType.GameMaker80) WriteInt(800); if (version < GMVersionType.GameMaker80) { // Write sprite data WriteInt(sprite.Width); WriteInt(sprite.Height); WriteInt(sprite.BoundingBoxLeft); WriteInt(sprite.BoundingBoxRight); WriteInt(sprite.BoundingBoxBottom); WriteInt(sprite.BoundingBoxTop); WriteBool(sprite.Transparent); // Check version. if (version > GMVersionType.GameMaker53) { // Write sprite data. WriteBool(sprite.SmoothEdges); WriteBool(sprite.Preload); } // Write sprite data. WriteInt((int)sprite.BoundingBoxMode); WriteBool(sprite.Precise); // Check version. if (version < GMVersionType.GameMaker60) { // Write sprite data. WriteBool(sprite.UseVideoMemory); WriteBool(sprite.LoadOnlyOnUse); } // Write sprite data. WriteInt(sprite.OriginX); WriteInt(sprite.OriginY); // If there are sub-images to write. if (sprite.SubImages != null) { // Write number of sub images. WriteInt(sprite.SubImages.Length); // Iterate through sub-images. for (int j = 0; j < sprite.SubImages.Length; j++) { // If the sub-image at index does not exists, continue. if (sprite.SubImages[j] == null) { // No object exists at this id. WriteInt(-1); continue; } else // There's image data. WriteInt(10); // Write size of image data. WriteInt(sprite.SubImages[j].Data.Length); // Write image data. WriteBytes(sprite.SubImages[j].Data); } } else // There are no sub-images to write. WriteInt(0); } else // Game Maker 8.0. { // Write sprite data. WriteInt(sprite.OriginX); WriteInt(sprite.OriginY); // Sprite number of sub images. WriteInt(sprite.SubImages.Length); // Iterate through sub-images. for (int j = 0; j < sprite.SubImages.Length; j++) { // Write version. WriteInt(800); // Write width and height of image. WriteInt(sprite.SubImages[j].Width); WriteInt(sprite.SubImages[j].Height); // If the image data is not size zero. if (sprite.SubImages[j].Width != 0 && sprite.SubImages[j].Height != 0) { WriteInt(sprite.SubImages[j].Data.Length); WriteBytes(sprite.SubImages[j].Data); } } // Write sprite data. WriteInt((int)sprite.ShapeMode); WriteInt(sprite.AlphaTolerance); WriteBool(sprite.UseSeperateCollisionMasks); WriteInt((int)sprite.BoundingBoxMode); WriteInt(sprite.BoundingBoxLeft); WriteInt(sprite.BoundingBoxRight); WriteInt(sprite.BoundingBoxBottom); WriteInt(sprite.BoundingBoxTop); } // End compression. EndCompress(); } }
/// <summary> /// Writes Game Maker project settings. /// </summary> /// <param name="settings">Settings object to write.</param> /// <param name="version">Target Game Maker file version to write.</param> private void WriteSettings(GMSettings settings, GMVersionType version) { // Write version number. if (version != GMVersionType.GameMaker70) WriteInt((int)version); else WriteInt(702); // If version is GM8, start compressing. if (version == GMVersionType.GameMaker80) Compress(); // Write settings data WriteBool(settings.StartFullscreen); // Versions greater than 5.3 support interpolation. if (version > GMVersionType.GameMaker53) WriteBool(settings.Interpolate); // Write settings data. WriteBool(settings.DontDrawBorder); WriteBool(settings.DisplayCursor); // Versions greater than 5.3 support the below variables. if (version > GMVersionType.GameMaker53) { // Write settings data. WriteInt(settings.Scaling); WriteBool(settings.AllowWindowResize); WriteBool(settings.AlwaysOnTop); WriteInt(settings.ColorOutsideRoom); } else { // Write settings data. WriteInt(settings.ScaleInWindowedMode); WriteInt(settings.ScaleInFullScreenMode); WriteBool(settings.ScaleOnHardwareSupport); } // Write settings data. WriteBool(settings.SetResolution); // Versions greater than 5.3 support the below variables. if (version > GMVersionType.GameMaker53) { // Write settings data. WriteInt((int)settings.ColorDepth2); WriteInt((int)settings.Resolution2); WriteInt((int)settings.Frequency2); } else { // Write settings data. WriteInt((int)settings.ColorDepth1); WriteBool(settings.UseExclusiveGraphicsMode); WriteInt((int)settings.Resolution1); WriteInt((int)settings.Frequency1); WriteBool(settings.UseSynchronization); WriteBool(settings.DisplayCaptionInFullScreenMode); } // Write settings data. WriteBool(settings.DontShowButtons); // Versions greater than 5.3 support screen synchronization. if (version > GMVersionType.GameMaker53) WriteBool(settings.UseSynchronization); // Versions greater than 7.0 support disabling the screensaver, and power saving options. if (version > GMVersionType.GameMaker70) WriteBool(settings.DisableScreensaver); // Write settings. WriteBool(settings.LetF4SwitchFullscreen); WriteBool(settings.LetF1ShowGameInfo); WriteBool(settings.LetEscEndGame); WriteBool(settings.LetF5SaveF6Load); // Write empty bytes. if (version < GMVersionType.GameMaker60) WriteEmpty(8); // Versions greater than 6.0, treat close as esc, F9 screenshot. if (version > GMVersionType.GameMaker60) { // Write settings data. WriteBool(settings.LetF9TakeScreenShot); WriteBool(settings.TreatCloseButtonAsESC); } // Versions greater than 5.1 support game priority. if (version > GMVersionType.GameMaker51) WriteInt((int)settings.GamePriority); // Write settings data. WriteBool(settings.FreezeOnLoseFocus); WriteInt((int)settings.LoadBarMode); // If the loadbar type is a custom loadbar. if (settings.LoadBarMode == LoadProgressBarType.Custom) { // If version greater than 7.0. if (version > GMVersionType.GameMaker70) { // If a back loadbar image exists. if (settings.BackLoadBarImage != null) { // Write that there is a back load bar image. WriteBool(true); // Write size of image data. WriteInt(settings.BackLoadBarImage.Length); // Write back loadbar image data. WriteBytes(settings.BackLoadBarImage); } else // No back load bar image. WriteBool(false); // If a front loadbar image exists. if (settings.FrontLoadBarImage != null) { // Write that there is a front load bar image. WriteBool(true); // Write size of image data. WriteInt(settings.FrontLoadBarImage.Length); // Write front loadbar image data. WriteBytes(settings.FrontLoadBarImage); } else // No front load bar image. WriteBool(false); } else { // If a back loadbar image exists. if (settings.BackLoadBarImage != null) { // Write that there is a back load bar image. WriteInt(10); // Write size of image data. WriteInt(settings.BackLoadBarImage.Length); // Write back loadbar image data. WriteBytes(settings.BackLoadBarImage); } else // No back load bar image. WriteInt(-1); // If a front loadbar image exists. if (settings.FrontLoadBarImage != null) { // Write that there is a front load bar image. WriteInt(10); // Write size of image data. WriteInt(settings.FrontLoadBarImage.Length); // Write front loadbar image data. WriteBytes(settings.FrontLoadBarImage); } else // No front load bar image. WriteInt(-1); } } // Write settings data. WriteBool(settings.ShowCustomLoadImage); // If a custom load image must be shown. if (settings.ShowCustomLoadImage == true) { // If version is greater than 7.0. if (version > GMVersionType.GameMaker70) { // If a custom load image is present if (settings.LoadingImage != null) { // Write that there is a custom load image. WriteBool(true); // Write size of image data. WriteInt(settings.LoadingImage.Length); // Write custom load image data WriteBytes(settings.LoadingImage); } else // No custom load image. WriteBool(false); } else { // If a custom load image is present if (settings.LoadingImage != null) { // Write that there is a custom load image. WriteInt(10); // Write size of image data. WriteInt(settings.LoadingImage.Length); // Write custom load image data WriteBytes(settings.LoadingImage); } else // No custom load image. WriteInt(-1); } } // Versions greater than 5.0 support loading image alpha. if (version > GMVersionType.GameMaker50) { // Write settings data. WriteBool(settings.ImagePartiallyTransparent); WriteInt(settings.LoadImageAlpha); WriteBool(settings.ScaleProgressBar); } // Write size of icon image data. WriteInt(settings.GameIcon.Length); // Write settings data. WriteBytes(settings.GameIcon); WriteBool(settings.DisplayErrors); WriteBool(settings.WriteToLog); WriteBool(settings.AbortOnError); WriteBool(settings.TreatUninitializedAsZero); WriteString(settings.Author); // Versions greater than 6.0 use a string for the version data. if (version > GMVersionType.GameMaker60) WriteString(settings.Version); else WriteInt(Convert.ToInt32(settings.Version)); // Write settings data. WriteDouble(settings.ProjectLastChanged); WriteString(settings.Information); // Versions greater than 5.2 support constants. Versions greater than 7.0 write constants elsewhere. if (version > GMVersionType.GameMaker52 && version < GMVersionType.GameMaker80) { // If there are constants to write. if (settings.Constants != null) { // Write the amount of constants. WriteInt(settings.Constants.Length); // Iterate through constants. for (int i = 0; i < settings.Constants.Length; i++) { // Write constant data. WriteString(settings.Constants[i].Name); WriteString(settings.Constants[i].Value); } } else // There are no constants to write. WriteInt(0); } // If version is greater than 6.0, write build data, else write includes. if (version > GMVersionType.GameMaker60) { // Write build information. WriteInt(settings.Major); WriteInt(settings.Minor); WriteInt(settings.Release); WriteInt(settings.Build); WriteString(settings.Company); WriteString(settings.Product); WriteString(settings.Copyright); WriteString(settings.Description); // If the version is greater than 7.0, write last time global settings were changed. if (version > GMVersionType.GameMaker70) WriteDouble(settings.SettingsLastChanged); } else if (version > GMVersionType.GameMaker53) { // If there are include files to write. if (settings.Includes != null) { // Number of include files. WriteInt(settings.Includes.Length); // Iterate through include files. for (int i = 0; i < settings.Includes.Length; i++) { // Write include file data. WriteString(settings.Includes[i].FileName); } } else // There are no includes to write. WriteInt(0); // Write settings data. WriteInt(settings.IncludeFolder); WriteBool(settings.OverwriteExisting); WriteBool(settings.RemoveAtGameEnd); } // Write compressed data. EndCompress(); }
/// <summary> /// Writes scripts from Game Maker project. /// </summary> private void WriteScripts(GMList<GMScript> scripts, GMVersionType version) { // Write version number. if (version < GMVersionType.GameMaker80) WriteInt(400); else WriteInt(800); // Write amount of script ids. WriteInt(scripts.LastId + 1); // Iterate through scripts. for (int i = 0; i < scripts.LastId + 1; i++) { // If version is 8.0, compress. if (version == GMVersionType.GameMaker80) Compress(); // Try to get the resource by the current id. GMScript script = scripts.Find(delegate(GMScript s) { return s.Id == i; }); // If the script at the current id does not exist, continue. if (script == null) { // No object exists at this id. WriteBool(false); EndCompress(); continue; } else WriteBool(true); // Write script name. WriteString(script.Name); // If version is 8.0, write last changed. if (version == GMVersionType.GameMaker80) WriteDouble(script.LastChanged); // Write version. if (version == GMVersionType.GameMaker80) WriteInt(800); else WriteInt(400); // Write script data. WriteString(script.Code); // End compression. EndCompress(); } }
/// <summary> /// Writes rooms from Game Maker project. /// </summary> private void WriteRooms(GMList<GMRoom> rooms, GMVersionType version) { // Write version number. if (version < GMVersionType.GameMaker80) WriteInt(420); else WriteInt(800); // Write the amount of room ids. WriteInt(rooms.LastId + 1); // Iterate through rooms. for (int i = 0; i < rooms.LastId + 1; i++) { // If version is 8.0, compress. if (version == GMVersionType.GameMaker80) Compress(); // Try to get the resource with the current id. GMRoom room = rooms.Find(delegate(GMRoom r) { return r.Id == i; }); // If the resource at index does not exist, continue. if (room == null) { // No object exists at this id. WriteBool(false); EndCompress(); continue; } else WriteBool(true); // Write room name. WriteString(room.Name); // If version is 8.0, write last changed. if (version == GMVersionType.GameMaker80) WriteDouble(room.LastChanged); // Write version. switch (version) { case GMVersionType.GameMaker50: WriteInt(500); break; case GMVersionType.GameMaker51: WriteInt(500); break; case GMVersionType.GameMaker52: WriteInt(520); break; case GMVersionType.GameMaker53: WriteInt(520); break; case GMVersionType.GameMaker60: WriteInt(541); break; case GMVersionType.GameMaker70: WriteInt(541); break; case GMVersionType.GameMaker80: WriteInt(541); break; } // Write room data. WriteString(room.Caption); WriteInt(room.Width); WriteInt(room.Height); WriteInt(room.SnapY); WriteInt(room.SnapX); // Versions greater than 5.1 support isometric grid. if (version > GMVersionType.GameMaker51) WriteBool(room.IsometricGrid); WriteInt(room.Speed); WriteBool(room.Persistent); WriteInt(room.BackgroundColor); WriteBool(room.DrawBackgroundColor); WriteString(room.CreationCode); // Write the amount of room parallaxes. WriteInt(8); // Iterate through parallaxs. for (int j = 0; j < room.Parallaxes.Length; j++) { // Write room parallax data. WriteBool(room.Parallaxes[j].Visible); WriteBool(room.Parallaxes[j].Foreground); WriteInt(room.Parallaxes[j].BackgroundId); WriteInt(room.Parallaxes[j].X); WriteInt(room.Parallaxes[j].Y); WriteBool(room.Parallaxes[j].TileHorizontally); WriteBool(room.Parallaxes[j].TileVertically); WriteInt(room.Parallaxes[j].HorizontalSpeed); WriteInt(room.Parallaxes[j].VerticalSpeed); // Versions greater than 5.1 support parallax stretching. if (version > GMVersionType.GameMaker51) WriteBool(room.Parallaxes[j].Stretch); } // Write room data. WriteBool(room.EnableViews); // Write the amount of room views. WriteInt(8); // Iterate through views for (int k = 0; k < room.Views.Length; k++) { // Write room view data. WriteBool(room.Views[k].Visible); WriteInt(room.Views[k].ViewX); WriteInt(room.Views[k].ViewY); WriteInt(room.Views[k].ViewWidth); WriteInt(room.Views[k].ViewHeight); WriteInt(room.Views[k].PortX); WriteInt(room.Views[k].PortY); // Versions greater than 5.3 support port dimensions. if (version > GMVersionType.GameMaker53) { // Write room view data. WriteInt(room.Views[k].PortWidth); WriteInt(room.Views[k].PortHeight); } // Write room view data. WriteInt(room.Views[k].HorizontalBorder); WriteInt(room.Views[k].VerticalBorder); WriteInt(room.Views[k].HorizontalSpeed); WriteInt(room.Views[k].VerticalSpeed); WriteInt(room.Views[k].ObjectToFollow); } // If there are instances to write. if (room.Instances != null) { // Write the amount of instances. WriteInt(room.Instances.Length); // Iterate through room instances. for (int l = 0; l < room.Instances.Length; l++) { // Write room instance data. WriteInt(room.Instances[l].X); WriteInt(room.Instances[l].Y); WriteInt(room.Instances[l].ObjectId); WriteInt(room.Instances[l].Id); // Versions greater than 5.1 support creation code and instance locking. if (version > GMVersionType.GameMaker51) { WriteString(room.Instances[l].CreationCode); WriteBool(room.Instances[l].Locked); } // Write empty reserved bytes. if (version < GMVersionType.GameMaker52) WriteEmpty(8); } } else // Write no instances. WriteInt(0); // If there are tiles to write. if (room.Tiles != null) { // Write the amount of room tiles. WriteInt(room.Tiles.Length); // Iterate through room tiles. for (int m = 0; m < room.Tiles.Length; m++) { // Write room tile data. WriteInt(room.Tiles[m].X); WriteInt(room.Tiles[m].Y); WriteInt(room.Tiles[m].BackgroundId); WriteInt(room.Tiles[m].BackgroundX); WriteInt(room.Tiles[m].BackgroundY); WriteInt(room.Tiles[m].Width); WriteInt(room.Tiles[m].Height); WriteInt(room.Tiles[m].Depth); WriteInt(room.Tiles[m].Id); // Versions greater than 5.1 support tile locking. if (version > GMVersionType.GameMaker51) WriteBool(room.Tiles[m].Locked); } } else // Write no tiles. WriteInt(0); // Write room data. WriteBool(room.RememberWindowSize); WriteInt(room.EditorWidth); WriteInt(room.EditorHeight); WriteBool(room.ShowGrid); WriteBool(room.ShowObjects); WriteBool(room.ShowTiles); WriteBool(room.ShowBackgrounds); WriteBool(room.ShowForegrounds); WriteBool(room.ShowViews); WriteBool(room.DeleteUnderlyingObjects); WriteBool(room.DeleteUnderlyingTiles); // Versions greater than 5.3 don't support tile settings. if (version > GMVersionType.GameMaker53) { // Write room data. WriteInt((int)room.CurrentTab); WriteInt(room.ScrollBarX); WriteInt(room.ScrollBarY); } else { // Write room data. WriteInt(room.TileWidth); WriteInt(room.TileHeight); WriteInt(room.TileHorizontalSeperation); WriteInt(room.TileVerticalSeperation); WriteInt(room.TileHorizontalOffset); WriteInt(room.TileVerticalOffset); WriteInt((int)room.CurrentTab); WriteInt(room.ScrollBarX); WriteInt(room.ScrollBarY); } // End object compression. EndCompress(); } }
/// <summary> /// Writes fonts from Game Maker project. /// </summary> private void WriteFonts(GMList<GMFont> fonts, GMVersionType version) { // If the version is before Game Maker 6, return. if (version < GMVersionType.GameMaker60) return; // Write version number. if (version < GMVersionType.GameMaker80) WriteInt(540); else WriteInt(800); // Amount of font ids. WriteInt(fonts.LastId + 1); // Iterate through fonts. for (int i = 0; i < fonts.LastId + 1; i++) { // If version is 8.0, compress. if (version == GMVersionType.GameMaker80) Compress(); // Try to get the resource with the current id. GMFont font = fonts.Find(delegate(GMFont f) { return f.Id == i; }); // If the resource at index does not exist, continue. if (font == null) { // No object exists at this id. WriteBool(false); EndCompress(); continue; } else WriteBool(true); // Write font name. WriteString(font.Name); // If version is 8.0, write last changed. if (version == GMVersionType.GameMaker80) WriteDouble(font.LastChanged); // Write version. if (version == GMVersionType.GameMaker80) WriteInt(800); else WriteInt(540); // Write font data. WriteString(font.FontName); WriteInt(font.Size); WriteBool(font.Bold); WriteBool(font.Italic); WriteInt(font.CharacterRangeMin); WriteInt(font.CharacterRangeMax); // End object compression. EndCompress(); } }
/// <summary> /// Writes object tree from Game Maker project. /// </summary> private void WriteTree(GMNode rootNode, GMVersionType version) { // Write version number. if (version < GMVersionType.GameMaker60) WriteInt(500); else if (version == GMVersionType.GameMaker60) WriteInt(540); else if (version >= GMVersionType.GameMaker70) WriteInt(700); // Write room execution Order. WriteInt(0); // Set the number of main resource nodes. int rootNum = (version > GMVersionType.GameMaker60) ? 12 : 11; // Iterate through Game Maker project root nodes for (int i = 0; i < rootNum; i++) { // Write child nodes recursively. WriteNodeRecursive(rootNode.Nodes[i]); } }
/// <summary> /// Writes game information from Game Maker project. /// </summary> private void WriteGameInformation(GMGameInformation gameInfo, GMVersionType version) { // If version is 8.0, compress. if (version == GMVersionType.GameMaker80) Compress(); // Write game information data. WriteInt(gameInfo.BackgroundColor); WriteBool(gameInfo.MimicGameWindow); // Versions greater than 5.3, support the following data. if (version > GMVersionType.GameMaker53) { // Write game information data. WriteString(gameInfo.FormCaption); WriteInt(gameInfo.X); WriteInt(gameInfo.Y); WriteInt(gameInfo.Width); WriteInt(gameInfo.Height); WriteBool(gameInfo.ShowBorder); WriteBool(gameInfo.AllowResize); WriteBool(gameInfo.AlwaysOnTop); WriteBool(gameInfo.PauseGame); } // If version is 8.0, write last changed. if (version == GMVersionType.GameMaker80) WriteDouble(gameInfo.LastChanged); // Write game information data. WriteString(gameInfo.Information); // End object compression. EndCompress(); }
/// <summary> /// Writes Game Maker project triggers. /// </summary> private void WriteTriggers(GMList<GMTrigger> triggers, GMVersionType version) { // Write version number. WriteInt((int)version); // Write amount of triggers. WriteInt(triggers.LastId + 1); // Iterate through triggers. for (int i = 0; i < triggers.LastId + 1; i++) { // Start compress. Compress(); // Try to get the resource by the current id. GMTrigger trigger = triggers.Find(delegate(GMTrigger t) { return t.Id == i; }); // If the sound with the current id does not exist, continue. if (trigger == null) { // No object exists at this id. WriteBool(false); EndCompress(); continue; } else WriteBool(true); // Write version number. WriteInt((int)version); // Write trigger data. WriteString(trigger.Name); WriteString(trigger.Condition); WriteInt((int)trigger.Moment); WriteString(trigger.Constant); // End compress. EndCompress(); } // Write last changed. WriteDouble(GMTrigger.TriggerLastChanged); }
/// <summary> /// Writes objects from Game Maker project. /// </summary> private void WriteObjects(GMList<GMObject> objects, GMVersionType version) { // Write version number. if (version < GMVersionType.GameMaker80) WriteInt(400); else WriteInt(800); // Write the amount of object ids. WriteInt(objects.LastId + 1); // Iterate through objects for (int i = 0; i < objects.LastId + 1; i++) { // If version is 8.0, compress. if (version == GMVersionType.GameMaker80) Compress(); // Try to get the resource with the current id. GMObject obj = objects.Find(delegate(GMObject o) { return o.Id == i; }); // If the resource at index does not exist, continue. if (obj == null) { // No object exists at this id. WriteBool(false); EndCompress(); continue; } else WriteBool(true); // Write object name. WriteString(obj.Name); // If version is 8.0, write last changed. if (version == GMVersionType.GameMaker80) WriteDouble(obj.LastChanged); // Write version. WriteInt(430); // Write object data. WriteInt(obj.SpriteId); WriteBool(obj.Solid); WriteBool(obj.Visible); WriteInt(obj.Depth); WriteBool(obj.Persistent); WriteInt(obj.Parent); WriteInt(obj.Mask); // The amount of main event types. int amount = 11; // If version is 8.0. if (version == GMVersionType.GameMaker80) { // 12 main events. amount = 12; // Write int. WriteInt(11); } else // Write int. WriteInt(10); // Iterate through event types. for (int j = 0; j < amount; j++) { // Iterate through object events. foreach (GMEvent ev in obj.Events[j]) { // If the event has actions in it, write the actions. if (ev.Actions != null) { // Check if the event's type is a collision event, set other's id. if (ev.MainType == EventType.Collision) WriteInt(ev.OtherId); else WriteInt(ev.SubType); // Write the event actions. WriteActions(ev.Actions, version); } } // End of event. WriteInt(-1); } // End object compression. EndCompress(); } }
/// <summary> /// Writes actions from Game Maker project. /// </summary> private void WriteActions(GMAction[] actions, GMVersionType version) { // Write version. WriteInt(400); // Write the amount of actions. WriteInt(actions.Length); // Iterate through actions. for (int i = 0; i < actions.Length; i++) { // Write version. WriteInt(440); // Write action properties. WriteInt(actions[i].LibraryId); WriteInt(actions[i].ActionId); WriteInt((int)actions[i].ActionKind); WriteBool(actions[i].AllowRelative); WriteBool(actions[i].Question); WriteBool(actions[i].CanApplyTo); WriteInt((int)actions[i].ExecuteMode); // If the execute mode is a prefabbed function. if (actions[i].ExecuteMode == ExecutionType.Function) WriteString(actions[i].ExecuteCode); else WriteInt(0); // If the execute mode is a script. if (actions[i].ExecuteMode == ExecutionType.Code) WriteString(actions[i].ExecuteCode); else WriteInt(0); // Write the amount of arguments. WriteInt(actions[i].Arguments.Length); // Write the amount of argument types. WriteInt(8); // Iterate through argument types for (int j = 0; j < 8; j++) { // If the index is less than the actual arguments, write the type, else empty. if (j < actions[i].Arguments.Length) WriteInt((int)actions[i].Arguments[j].Type); else WriteInt(0); } // Write action data. WriteInt(actions[i].AppliesTo); WriteBool(actions[i].Relative); // Write the amount of actual arguments. WriteInt(8); // Iterate through arguments. for (int k = 0; k < 8; k++) { // If the index is greater than or equal to the number of arguments, continue. if (k >= actions[i].Arguments.Length) { WriteInt(1); WriteEmpty(1); continue; } // Write resource value. WriteString(actions[i].Arguments[k].Value); } // If not checkbox has been checked. WriteBool(actions[i].Not); } }
/// <summary> /// Writes paths from Game Maker project. /// </summary> private void WritePaths(GMList<GMPath> paths, GMVersionType version) { // Write version number. if (version < GMVersionType.GameMaker80) WriteInt(420); else WriteInt(800); // Amount of path ids. WriteInt(paths.LastId + 1); // Iterate through paths. for (int i = 0; i < paths.LastId + 1; i++) { // If version is 8.0, compress. if (version == GMVersionType.GameMaker80) Compress(); // Try to get the resource by the current id. GMPath path = paths.Find(delegate(GMPath p) { return p.Id == i; }); // If the path at index does not exists, continue. if (path == null) { // No object exists at this id. WriteBool(false); EndCompress(); continue; } else WriteBool(true); // Write path data. WriteString(path.Name); // If version is 8.0, write last changed. if (version == GMVersionType.GameMaker80) WriteDouble(path.LastChanged); // Write version. if (version < GMVersionType.GameMaker53) WriteInt(420); else WriteInt(530); // Versions greater than 5.2, support the following variables. if (version > GMVersionType.GameMaker52) { // Write path data. WriteBool(path.Smooth); WriteBool(path.Closed); WriteInt(path.Precision); WriteInt(path.RoomId); WriteInt(path.SnapX); WriteInt(path.SnapY); } else { // Write path data. WriteBool(path.Smooth); WriteInt((int)path.ActionAtTheEnd); WriteEmpty(4); } // If there are points to write. if (path.Points != null) { // Write number of points. WriteInt(path.Points.Length); // Iterate through path points. for (int j = 0; j < path.Points.Length; j++) { // Write point data. WriteDouble(path.Points[j].X); WriteDouble(path.Points[j].Y); WriteDouble(path.Points[j].Speed); } } else // There are no points to write. WriteInt(0); // End compression. EndCompress(); } }
/// <summary> /// Writes backgrounds from Game Maker project. /// </summary> private void WriteBackgrounds(GMList<GMBackground> backgrounds, GMVersionType version) { // Write version number. if (version < GMVersionType.GameMaker80) WriteInt(400); else WriteInt(800); // Amount of background ids. WriteInt(backgrounds.LastId + 1); // Iterate through backgrounds. for (int i = 0; i < backgrounds.LastId + 1; i++) { // If version is 8.0, compress. if (version == GMVersionType.GameMaker80) Compress(); // Try to get the resource by the current id. GMBackground background = backgrounds.Find(delegate(GMBackground b) { return b.Id == i; }); // If the background at index does not exists, continue. if (background == null) { // No object exists at this id. WriteBool(false); EndCompress(); continue; } else WriteBool(true); // Get background data. WriteString(background.Name); // If version is 8.0, write last changed. if (version == GMVersionType.GameMaker80) WriteDouble(background.LastChanged); // Write version number. if (version < GMVersionType.GameMaker60) WriteInt(400); else if (version == GMVersionType.GameMaker60 || version == GMVersionType.GameMaker70) WriteInt(543); else if (version == GMVersionType.GameMaker80) WriteInt(710); // If version is less than GM 8.0. if (version < GMVersionType.GameMaker80) { // Write background data WriteInt(background.Width); WriteInt(background.Height); WriteBool(background.Transparent); // Check version. if (version > GMVersionType.GameMaker53) { // Write background data. WriteBool(background.SmoothEdges); WriteBool(background.Preload); WriteBool(background.UseAsTileSet); WriteInt(background.TileWidth); WriteInt(background.TileHeight); WriteInt(background.HorizontalOffset); WriteInt(background.VerticalOffset); WriteInt(background.HorizontalSeperation); WriteInt(background.VerticalSeperation); } else { // Write background data. WriteBool(background.UseVideoMemory); WriteBool(background.LoadOnlyOnUse); } // If image data does not exist. if (background.Image != null) { // There is image data, write flags. WriteBool(true); WriteInt(10); // Write size of image data. WriteInt(background.Image.Data.Length); // Write image data. WriteBytes(background.Image.Data); } // No image data exist. else WriteBool(false); } else // GM 8.0. { // Write background data. WriteBool(background.UseAsTileSet); WriteInt(background.TileWidth); WriteInt(background.TileHeight); WriteInt(background.HorizontalOffset); WriteInt(background.VerticalOffset); WriteInt(background.HorizontalSeperation); WriteInt(background.VerticalSeperation); // Write version. WriteInt(800); // Write background data. WriteInt(background.Width); WriteInt(background.Height); // If the sprite size is not zero, write image data. if (background.Width != 0 && background.Height != 0) { WriteInt(background.Image.Data.Length); WriteBytes(background.Image.Data); } } // End compression. EndCompress(); } }
/// <summary> /// Reads a Game Maker project file /// </summary> public void ReadProject(string file) { // If the file does not exist, throw exception if (File.Exists(file) == false) { throw new Exception("The Game Maker project file does not exist."); } // Get file extension string ext = file.Substring(file.LastIndexOf('.')).ToLower(); // If a GMS project file if (ext == ".gmx") { // Read in the project as a Game Maker Studio project and return ReadProjectGMS(file); return; } // Get file size FileInfo info = new FileInfo(file); long length = info.Length; // Create a new GM file reader using (GMFileReader reader = new GMFileReader(new FileStream(file, FileMode.Open, FileAccess.Read))) { // Progress event ProgressChanged("Starting project read...", reader.BaseStream.Position, length); // Read the magic number int id = reader.ReadGMInt(); // If the magic number was incorrect, not a Game Maker project file if (id != 1234321) { throw new Exception("Not a valid Game Maker project file."); } // Get Game Maker project file version int version = reader.ReadGMInt(); // Check version switch (version) { case 500: this.GameMakerVersion = GMVersionType.GameMaker50; break; case 510: this.GameMakerVersion = GMVersionType.GameMaker51; break; case 520: this.GameMakerVersion = GMVersionType.GameMaker52; break; case 530: this.GameMakerVersion = GMVersionType.GameMaker53; break; case 600: this.GameMakerVersion = GMVersionType.GameMaker60; break; case 701: this.GameMakerVersion = GMVersionType.GameMaker70; break; case 800: this.GameMakerVersion = GMVersionType.GameMaker80; break; case 810: this.GameMakerVersion = GMVersionType.GameMaker81; break; } // Skip over reserved bytes if (version < 600) { reader.ReadGMBytes(4); } // Game Maker 7 project file encryption if (version == 701) { // Bill and Fred, psssttt they like each other ;) int bill = reader.ReadGMInt(); int fred = reader.ReadGMInt(); // Skip bytes to treasure. reader.ReadGMBytes(bill * 4); // Get the seed for swap table int seed = reader.ReadGMInt(); // Skip bytes to get out of the junk yard reader.ReadGMBytes(fred * 4); // Read first byte of Game id (Not encrypted) byte b = reader.ReadByte(); // Set the seed reader.SetSeed(seed); // Read game id id = reader.ReadGMInt(b); } else // Read game id normally { id = reader.ReadGMInt(); } // Skip unknown bytes reader.ReadGMBytes(16); // Read settings ProgressChanged("Reading Settings...", reader.BaseStream.Position, length); // Read main project objects this.Settings = GMSettings.ReadSettings(reader); this.Settings.GameIdentifier = id; // If the version is greater than Game Maker 7.0 if (version > 701) { // Read triggers and constants. this.Triggers = GMTrigger.ReadTriggers(reader); this.Settings.Constants = GMConstant.ReadConstants(reader); } // Read sounds ProgressChanged("Reading Sounds...", reader.BaseStream.Position, length); this.Sounds = GMSound.ReadSounds(reader); // Read sprites ProgressChanged("Reading Sprites...", reader.BaseStream.Position, length); this.Sprites = GMSprite.ReadSprites(reader); // Read backgrounds ProgressChanged("Reading Backgrounds...", reader.BaseStream.Position, length); this.Backgrounds = GMBackground.ReadBackgrounds(reader); // Read paths ProgressChanged("Reading Paths...", reader.BaseStream.Position, length); this.Paths = GMPath.ReadPaths(reader); // Read scripts ProgressChanged("Reading Scripts...", reader.BaseStream.Position, length); this.Scripts = GMScript.ReadScripts(reader); // Get version int version2 = reader.ReadGMInt(); // Check version if (version2 != 440 && version2 != 540 && version2 != 800) { throw new Exception("Unsupported Pre-Font/Pre-Data File object version."); } // If version is old, read data files else, read fonts. if (version2 == 440) { // Read data files ProgressChanged("Reading Data Files...", reader.BaseStream.Position, length); this.DataFiles = GMDataFile.ReadDataFiles(reader); } else { // Read fonts ProgressChanged("Reading Fonts...", reader.BaseStream.Position, length); this.Fonts = GMFont.ReadFonts(version2, reader); } // Read timelines ProgressChanged("Reading Timelines...", reader.BaseStream.Position, length); this.Timelines = GMTimeline.ReadTimelines(reader); // Read objects ProgressChanged("Reading Objects...", reader.BaseStream.Position, length); this.Objects = GMObject.ReadObjects(reader); // Read rooms ProgressChanged("Reading Rooms...", reader.BaseStream.Position, length); this.Rooms = GMRoom.ReadRooms(this.Objects, reader); // Read last ids for instances and tiles this.LastInstanceId = reader.ReadGMInt(); this.LastTileId = reader.ReadGMInt(); // If the version is above 6.1, read include files and packages if (version >= 700) { // Read includes ProgressChanged("Reading Includes...", reader.BaseStream.Position, length); this.Settings.Includes = GMInclude.ReadIncludes(reader); // Read packages ProgressChanged("Reading Packages...", reader.BaseStream.Position, length); this.Packages.AddRange(GMPackage.ReadPackages(reader)); } // Read game information ProgressChanged("Reading Game Information...", reader.BaseStream.Position, length); this.GameInformation = GMGameInformation.ReadGameInformation(reader); // Get version version = reader.ReadGMInt(); // Check version if (version != 500) { throw new Exception("Unsupported Post-Game Information object version."); } // Read libraries ProgressChanged("Reading Libraries...", reader.BaseStream.Position, length); this.Libraries = GMLibrary.ReadLibraries(reader); // Read project tree ProgressChanged("Reading Project Tree...", reader.BaseStream.Position, length); this.ProjectTree = GMNode.ReadTree(file.Substring(file.LastIndexOf(@"\") + 1), reader); // Progress event ProgressChanged("Finished Reading Project.", reader.BaseStream.Position, length); } }