예제 #1
0
        /// <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);
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
 /// <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);
 }
예제 #4
0
        /// <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);
        }
예제 #5
0
        /// <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);
            }
        }
예제 #6
0
        /// <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);
        }
예제 #7
0
        /// <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();
            }
        }
예제 #8
0
        /// <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);
            }
        }
예제 #9
0
        /// <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();
            }
        }
예제 #10
0
        /// <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();
            }
        }
예제 #11
0
        /// <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();
        }
예제 #12
0
        /// <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();
            }
        }
예제 #13
0
        /// <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();
            }
        }
예제 #14
0
        /// <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();
            }
        }
예제 #15
0
        /// <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]);
            }
        }
예제 #16
0
        /// <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();
        }
예제 #17
0
        /// <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);
        }
예제 #18
0
        /// <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();
            }
        }
예제 #19
0
        /// <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);
            }
        }
예제 #20
0
        /// <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();
            }
        }
예제 #21
0
        /// <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();
            }
        }
예제 #22
0
        /// <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);
            }
        }
예제 #23
0
        /// <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);
        }