Exemplo n.º 1
0
        /// <summary>
        /// Reads a Game Maker tree node recursively
        /// </summary>
        private static void ReadNodeRecursive(GMNode parent, GMFileReader reader)
        {
            // Iterate through child nodes
            foreach (GMNode node in parent.Nodes)
            {
                // Read node data
                node.NodeType     = (GMNodeType)(reader.ReadGMInt());
                node.ResourceType = (GMResourceType)(reader.ReadGMInt());
                node.Id           = reader.ReadGMInt();
                node.Name         = reader.ReadGMString();
                node.Children     = reader.ReadGMInt();

                // If the node has child nodes
                if (node.Children > 0)
                {
                    // Create a new node array
                    node.Nodes = new GMNode[node.Children];

                    // Iterate through children
                    for (int i = 0; i < node.Children; i++)
                    {
                        // Add new node
                        node.Nodes[i] = new GMNode();
                    }

                    // Read in child nodes recursively
                    ReadNodeRecursive(node, reader);
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Reads game packages from GM file.
        /// </summary>
        public static GMPackage[] ReadPackages(GMFileReader reader)
        {
            // Get version.
            int version = reader.ReadGMInt();

            // Check version
            if (version != 700)
            {
                throw new Exception("Unsupported Extension object version.");
            }

            // Get the number of packages.
            GMPackage[] packages = new GMPackage[reader.ReadGMInt()];

            // Read packages.
            for (int i = 0; i < packages.Length; i++)
            {
                // Create a new package.
                GMPackage package = new GMPackage();

                // Read package name.
                package.Name = reader.ReadGMString();

                // Set package.
                packages[i] = package;
            }

            return(packages);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Reads all data files from GM file reader stream.
        /// </summary>
        public static GMList <GMDataFile> ReadDataFiles(GMFileReader reader)
        {
            // Create a new list of data files.
            GMList <GMDataFile> dataFiles = new GMList <GMDataFile>();

            // Amount of data file ids.
            int num = reader.ReadGMInt();

            // Iterate through data files.
            for (int i = 0; i < num; i++)
            {
                // If the data file at index does not exists, continue.
                if (reader.ReadGMBool() == false)
                {
                    dataFiles.LastId++;
                    continue;
                }

                // Create a new data file object.
                GMDataFile dataFile = new GMDataFile();

                // Set data file id.
                dataFile.Id = i;

                // Read data file data.
                dataFile.Name = reader.ReadGMString();

                // Get version.
                int version = reader.ReadGMInt();

                // Check version.
                if (version != 440)
                {
                    throw new Exception("Unsupported Data File object version.");
                }

                // Read data file data.
                dataFile.FileName = reader.ReadGMString();

                // If data file exists, read it in.
                if (reader.ReadGMBool())
                {
                    dataFile.Data = reader.ReadGMBytes(reader.ReadGMInt());
                }

                // Read data file data.
                dataFile.ExportMode      = (ExportType)(reader.ReadGMInt());
                dataFile.OverwriteFile   = reader.ReadGMBool();
                dataFile.FreeDataMemory  = reader.ReadGMBool();
                dataFile.RemoveAtGameEnd = reader.ReadGMBool();

                // Add data file.
                dataFiles.Add(dataFile);
            }

            // Return data files.
            return(dataFiles);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Reads game information from GM file.
        /// </summary>
        public static GMGameInformation ReadGameInformation(GMFileReader reader)
        {
            // Get version.
            int version = reader.ReadGMInt();

            // Check version.
            if (version != 430 && version != 600 && version != 620 && version != 800)
            {
                throw new Exception("Unsupported Pre-Game Information object version.");
            }

            // Create new game information.
            GMGameInformation gameInfo = new GMGameInformation();

            // If version is 8.0, start inflate.
            if (version == 800)
            {
                reader.Decompress();
            }

            // Read game information data.
            gameInfo.BackgroundColor = reader.ReadGMInt();
            gameInfo.MimicGameWindow = reader.ReadGMBool();

            // Check version.
            if (version > 430)
            {
                // Read game information data.
                gameInfo.FormCaption = reader.ReadGMString();
                gameInfo.X           = reader.ReadGMInt();
                gameInfo.Y           = reader.ReadGMInt();
                gameInfo.Width       = reader.ReadGMInt();
                gameInfo.Height      = reader.ReadGMInt();
                gameInfo.ShowBorder  = reader.ReadGMBool();
                gameInfo.AllowResize = reader.ReadGMBool();
                gameInfo.AlwaysOnTop = reader.ReadGMBool();
                gameInfo.PauseGame   = reader.ReadGMBool();
            }

            // If version is 8.0, get last changed.
            if (version == 800)
            {
                gameInfo.LastChanged = reader.ReadGMDouble();
            }

            // Read game information data.
            gameInfo.Information = reader.ReadGMString();

            // End object inflate.
            reader.EndDecompress();

            // Return game information object.
            return(gameInfo);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Reads all the libraries in a GM file reader stream.
        /// </summary>
        public static GMList <GMLibrary> ReadLibraries(GMFileReader reader)
        {
            // Create a new list of libraries.
            GMList <GMLibrary> libraries = new GMList <GMLibrary>();

            // Get number of libraries.
            int num = reader.ReadGMInt();

            // Read libraries.
            for (int j = 0; j < num; j++)
            {
                // Create a new library.
                GMLibrary library = new GMLibrary();

                // Read the library code.
                library.Code = reader.ReadGMString();

                // Add the library.
                libraries.Add(library);
            }

            // Return libraries.
            return(libraries);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Reads timelines from GM file.
        /// </summary>
        public static GMList <GMTimeline> ReadTimelines(GMFileReader reader)
        {
            // Get version.
            int version = reader.ReadGMInt();

            // Check version.
            if (version != 500 && version != 800)
            {
                throw new Exception("Unsupported Pre-Timeline object version.");
            }

            // Create a new timeline list.
            GMList <GMTimeline> timelines = new GMList <GMTimeline>();

            // Amount of timeline ids.
            int num = reader.ReadGMInt();

            // Iterate through timelines
            for (int i = 0; i < num; i++)
            {
                // If version is 8.0, start inflate.
                if (version == 800)
                {
                    reader.Decompress();
                }

                // If the timeline at index does not exists, continue.
                if (reader.ReadGMBool() == false)
                {
                    timelines.LastId++;
                    reader.EndDecompress();
                    continue;
                }

                // Create a new timeline object.
                GMTimeline timeline = new GMTimeline();

                // Set timeline id.
                timeline.Id = i;

                // Read timeline data.
                timeline.Name = reader.ReadGMString();

                // If version is 8.0, get last changed.
                if (version == 800)
                {
                    timeline.LastChanged = reader.ReadGMDouble();
                }

                // Get version.
                int version2 = reader.ReadGMInt();

                // Check version.
                if (version2 != 500)
                {
                    throw new Exception("Unsupported Timeline object version.");
                }

                // Get number of timeline moments.
                timeline.Moments = new GMMoment[reader.ReadGMInt()];

                // Iterate through moments.
                for (int j = 0; j < timeline.Moments.Length; j++)
                {
                    // Create a new timeline moment object.
                    GMMoment moment = new GMMoment();

                    // Moment step number
                    moment.StepIndex = reader.ReadGMInt();

                    // Read moment actions.
                    moment.Actions = GMAction.ReadActions(reader);

                    // Add moment to timeline.
                    timeline.Moments[j] = moment;
                }

                // End object inflate.
                reader.EndDecompress();

                // Add timeline.
                timelines.Add(timeline);
            }

            // Return timelines.
            return(timelines);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Reads sprites from Game Maker project file.
        /// </summary>
        public static GMList <GMSprite> ReadSprites(GMFileReader reader)
        {
            // Get version
            int version = reader.ReadGMInt();

            // Check version
            if (version != 400 && version != 800)
            {
                throw new Exception("Unsupported Pre-Sprite object version.");
            }

            // Create a new list of sprites
            GMList <GMSprite> sprites = new GMList <GMSprite>();

            // Amount of sprite ids
            int num = reader.ReadGMInt();

            // Iterate through sprites
            for (int i = 0; i < num; i++)
            {
                // If version is 8.0, start inflate
                if (version == 800)
                {
                    reader.Decompress();
                }

                // If the sprite at index does not exists, continue
                if (reader.ReadGMBool() == false)
                {
                    sprites.LastId++;
                    reader.EndDecompress();
                    continue;
                }

                // Create a new sprite object
                GMSprite sprite = new GMSprite();

                // Set sprite id
                sprite.Id = i;

                // Read sprite data
                sprite.Name = reader.ReadGMString();

                // If version is 8.0, get last changed
                if (version == 800)
                {
                    sprite.LastChanged = reader.ReadGMDouble();
                }

                // Get version
                version = reader.ReadGMInt();

                // Check version
                if (version != 400 && version != 542 && version != 800)
                {
                    throw new Exception("Unsupported Sprite object version.");
                }

                // If less than version 8.0
                if (version < 800)
                {
                    // Read sprite data
                    sprite.Width             = reader.ReadGMInt();
                    sprite.Height            = reader.ReadGMInt();
                    sprite.BoundingBoxLeft   = reader.ReadGMInt();
                    sprite.BoundingBoxRight  = reader.ReadGMInt();
                    sprite.BoundingBoxBottom = reader.ReadGMInt();
                    sprite.BoundingBoxTop    = reader.ReadGMInt();
                    sprite.Transparent       = reader.ReadGMBool();

                    // Check version
                    if (version > 400)
                    {
                        // Read sprite data
                        sprite.SmoothEdges = reader.ReadGMBool();
                        sprite.Preload     = reader.ReadGMBool();
                    }

                    // Read sprite data
                    sprite.BoundingBoxMode = reader.ReadGMInt();
                    sprite.Precise         = reader.ReadGMBool();

                    // Check version
                    if (version == 400)
                    {
                        // Read sprtie data
                        sprite.UseVideoMemory = reader.ReadGMBool();
                        sprite.LoadOnlyOnUse  = reader.ReadGMBool();
                    }

                    // Read sprite data
                    sprite.OriginX = reader.ReadGMInt();
                    sprite.OriginY = reader.ReadGMInt();

                    // Sprite number of sub images
                    sprite.SubImages = new GMImage[reader.ReadGMInt()];

                    // Iterate through sub-images
                    for (int j = 0; j < sprite.SubImages.Length; j++)
                    {
                        // If the sub-image at index does not exists, continue
                        if (reader.ReadGMInt() == -1)
                        {
                            continue;
                        }

                        // Create a new image object
                        GMImage image = new GMImage();

                        // Get size of image data
                        int size = reader.ReadGMInt();

                        // Get image data
                        image.Data = reader.ReadGMBytes(size);

                        // Insert compressed image data
                        sprite.SubImages[j] = image;
                    }
                }
                else
                {
                    // Read sprite data
                    sprite.OriginX = reader.ReadGMInt();
                    sprite.OriginY = reader.ReadGMInt();

                    // Sprite number of sub images
                    sprite.SubImages = new GMImage[reader.ReadGMInt()];

                    // Iterate through sub-images
                    for (int j = 0; j < sprite.SubImages.Length; j++)
                    {
                        // Get version.
                        version = reader.ReadGMInt();

                        // Check version
                        if (version != 800)
                        {
                            throw new Exception("Unsupported Sprite object version.");
                        }

                        // Get width and height of image
                        int width  = reader.ReadGMInt();
                        int height = reader.ReadGMInt();

                        // If the sprite size is not zero
                        if (width != 0 && height != 0)
                        {
                            // Create a new image object
                            GMImage image = new GMImage();
                            image.Compressed = false;

                            // Set image data
                            image.Width  = width;
                            image.Height = height;

                            // Get size of image data
                            int size = reader.ReadGMInt();

                            // Get image data
                            image.Data = reader.ReadGMBytes(size);

                            // Insert compressed image data
                            sprite.SubImages[j] = image;
                        }
                    }

                    // Read sprite data
                    sprite.ShapeMode                 = reader.ReadGMInt();
                    sprite.AlphaTolerance            = reader.ReadGMInt();
                    sprite.UseSeperateCollisionMasks = reader.ReadGMBool();
                    sprite.BoundingBoxMode           = reader.ReadGMInt();
                    sprite.BoundingBoxLeft           = reader.ReadGMInt();
                    sprite.BoundingBoxRight          = reader.ReadGMInt();
                    sprite.BoundingBoxBottom         = reader.ReadGMInt();
                    sprite.BoundingBoxTop            = reader.ReadGMInt();
                }

                // End object inflate
                reader.EndDecompress();

                // Add sprite
                sprites.Add(sprite);
            }

            // Return sprites
            return(sprites);
        }
Exemplo n.º 8
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);
            }
        }
Exemplo n.º 9
0
        /// <summary>
        /// Reads all sounds from Game Maker project file stream.
        /// </summary>
        public static GMList <GMSound> ReadSounds(GMFileReader reader)
        {
            // Get version.
            int version = reader.ReadGMInt();

            // Check version.
            if (version != 400 && version != 800)
            {
                throw new Exception("Unsupported Pre-Sound object version.");
            }

            // Create a new sound list.
            GMList <GMSound> sounds = new GMList <GMSound>();

            // Amount of sound ids.
            int num = reader.ReadGMInt();

            // Iterate through sounds.
            for (int i = 0; i < num; i++)
            {
                // If version is 8.0, start inflate.
                if (version == 800)
                {
                    reader.Decompress();
                }

                // If the sound at index does not exists, continue.
                if (reader.ReadGMBool() == false)
                {
                    sounds.LastId++;
                    reader.EndDecompress();
                    continue;
                }

                // Create sound object.
                GMSound sound = new GMSound();

                // Set sound id.
                sound.Id = i;

                // Read sound data.
                sound.Name = reader.ReadGMString();

                // If version is 8.0, get last changed.
                if (version == 800)
                {
                    sound.LastChanged = reader.ReadGMDouble();
                }

                // Get version.
                version = reader.ReadGMInt();

                // Check version.
                if (version != 440 && version != 600 && version != 800)
                {
                    throw new Exception("Unsupported Sound object version.");
                }

                // Check version.
                if (version == 440)
                {
                    sound.Kind = reader.ReadGMInt();
                }
                else
                {
                    // Read sound data.
                    sound.Type = reader.ReadGMInt();
                }

                // Read sound data.
                sound.FileType = reader.ReadGMString();

                // Check version.
                if (version == 440)
                {
                    // If sound data exists, read it.
                    if ((int)sound.Kind != -1)
                    {
                        sound.Data = reader.ReadGMBytes(reader.ReadGMInt());
                    }

                    // Read sound data.
                    sound.AllowSoundEffects = reader.ReadGMBool();
                    sound.Buffers           = reader.ReadGMInt();
                    sound.LoadOnlyOnUse     = reader.ReadGMBool();
                }
                else
                {
                    // Read sound data.
                    sound.FileName = reader.ReadGMString();

                    // If sound data exists, read it.
                    if (reader.ReadGMBool() == true)
                    {
                        sound.Data = reader.ReadGMBytes(reader.ReadGMInt());
                    }

                    // Read sound data.
                    sound.Effects = reader.ReadGMInt();
                    sound.Volume  = reader.ReadGMDouble();
                    sound.Pan     = reader.ReadGMDouble();
                    sound.Preload = reader.ReadGMBool();
                }

                // End object inflate.
                reader.EndDecompress();

                // Add sound.
                sounds.Add(sound);
            }

            // Return sounds.
            return(sounds);
        }
Exemplo n.º 10
0
        /// <summary>
        /// Reads all fonts from a GM file reader stream.
        /// </summary>
        public static GMList <GMFont> ReadFonts(int version, GMFileReader reader)
        {
            // Create a new list of fonts.
            GMList <GMFont> fonts = new GMList <GMFont>();

            // Amount of font ids.
            int num = reader.ReadGMInt();

            // Iterate through fonts.
            for (int i = 0; i < num; i++)
            {
                // If version is 8.0, start inflate.
                if (version == 800)
                {
                    reader.Decompress();
                }

                // If the font at index does not exists, continue.
                if (reader.ReadGMBool() == false)
                {
                    fonts.LastId++;
                    reader.EndDecompress();
                    continue;
                }

                // Create a new font object.
                GMFont font = new GMFont();

                // Set font id.
                font.Id = i;

                // Read font data.
                font.Name = reader.ReadGMString();

                // If version is 8.0, get last changed.
                if (version == 800)
                {
                    font.LastChanged = reader.ReadGMDouble();
                }

                // Get version.
                version = reader.ReadGMInt();

                // Check version.
                if (version != 540 && version != 800)
                {
                    throw new Exception("Unsupported Font object version.");
                }

                // Read font data.
                font.FontName          = reader.ReadGMString();
                font.Size              = reader.ReadGMInt();
                font.Bold              = reader.ReadGMBool();
                font.Italic            = reader.ReadGMBool();
                font.CharacterRangeMin = reader.ReadGMShort();
                font.CharacterSet      = reader.ReadGMByte();
                font.AntiAliasing      = reader.ReadGMByte();
                font.CharacterRangeMax = reader.ReadGMInt();

                // End object inflate.
                reader.EndDecompress();

                // Add font.
                fonts.Add(font);
            }

            // Return fonts.
            return(fonts);
        }
Exemplo n.º 11
0
        /// <summary>
        /// Reads an object Tree from a GM file reader stream
        /// </summary>
        public static GMNode ReadTree(string name, GMFileReader reader)
        {
            // Get version
            int version = reader.ReadGMInt();

            // Check version
            if (version != 500 && version != 540 && version != 700)
            {
                throw new Exception("Unsupported Project Tree object version.");
            }

            // Room execution Order
            reader.ReadGMBytes(reader.ReadGMInt() * 4);

            // Set the number of main resource nodes
            int rootNum = (version > 540) ? 12 : 11;

            // Create a project node
            GMNode projectTree = new GMNode();

            projectTree.Nodes    = new GMNode[rootNum];
            projectTree.Name     = name;
            projectTree.NodeType = GMNodeType.Parent;
            projectTree.Children = projectTree.Nodes.Length;

            // Iterate through Game Maker project root nodes
            for (int i = 0; i < rootNum; i++)
            {
                // Create new node
                GMNode node = new GMNode();

                // Read node data
                node.NodeType     = (GMNodeType)(reader.ReadGMInt());
                node.ResourceType = (GMResourceType)(reader.ReadGMInt());
                node.Id           = reader.ReadGMInt();
                node.Name         = reader.ReadGMString();
                node.Children     = reader.ReadGMInt();

                // If there is at least one child node
                if (node.Children > 0)
                {
                    // Create a new node array
                    node.Nodes = new GMNode[node.Children];

                    // Iterate through children
                    for (int j = 0; j < node.Children; j++)
                    {
                        // Add new node
                        node.Nodes[j] = new GMNode();
                    }

                    // Read in child nodes recursively
                    ReadNodeRecursive(node, reader);
                }

                // Add new main node
                projectTree.Nodes[i] = node;
            }

            // Return project tree
            return(projectTree);
        }
Exemplo n.º 12
0
        /// <summary>
        /// Reads all backgrounds from a GM file reader
        /// </summary>
        public static GMList <GMBackground> ReadBackgrounds(GMFileReader reader)
        {
            // Get version
            int version = reader.ReadGMInt();

            // Check version
            if (version != 400 && version != 800)
            {
                throw new Exception("Unsupported Pre-Background object version.");
            }

            // Create a new list of backgrounds
            GMList <GMBackground> backgrounds = new GMList <GMBackground>();

            // Amount of background ids
            int num = reader.ReadGMInt();

            // Iterate through backgrounds
            for (int i = 0; i < num; i++)
            {
                // If version is 8.0, start inflate
                if (version == 800)
                {
                    reader.Decompress();
                }

                // If the background at index does not exists, continue
                if (reader.ReadGMBool() == false)
                {
                    backgrounds.LastId++;
                    reader.EndDecompress();
                    continue;
                }

                // Create a new background object
                GMBackground background = new GMBackground();

                // Set background id
                background.Id = i;

                // Get background data
                background.Name = reader.ReadGMString();

                // If version is 8.0, get last changed
                if (version == 800)
                {
                    background.LastChanged = reader.ReadGMDouble();
                }

                // Get version
                version = reader.ReadGMInt();

                // Check version
                if (version != 400 && version != 543 && version != 710)
                {
                    throw new Exception("Unsupported Background object version.");
                }

                // If version is less than 7.1
                if (version < 710)
                {
                    // Background data
                    background.Width       = reader.ReadGMInt();
                    background.Height      = reader.ReadGMInt();
                    background.Transparent = reader.ReadGMBool();

                    // Check version
                    if (version > 400)
                    {
                        // Read background data
                        background.SmoothEdges          = reader.ReadGMBool();
                        background.Preload              = reader.ReadGMBool();
                        background.UseAsTileSet         = reader.ReadGMBool();
                        background.TileWidth            = reader.ReadGMInt();
                        background.TileHeight           = reader.ReadGMInt();
                        background.HorizontalOffset     = reader.ReadGMInt();
                        background.VerticalOffset       = reader.ReadGMInt();
                        background.HorizontalSeperation = reader.ReadGMInt();
                        background.VerticalSeperation   = reader.ReadGMInt();
                    }
                    else
                    {
                        // Read background data
                        background.UseVideoMemory = reader.ReadGMBool();
                        background.LoadOnlyOnUse  = reader.ReadGMBool();
                    }

                    // If image data exists
                    if (reader.ReadGMBool())
                    {
                        // If pixel data does not exist
                        if (reader.ReadGMInt() == -1)
                        {
                            continue;
                        }

                        // Create a new image
                        GMImage image = new GMImage();

                        // Set image data
                        image.Width  = background.Width;
                        image.Height = background.Height;

                        // Get size of image data
                        int size = reader.ReadGMInt();

                        // Get compressed image data
                        image.Data = reader.ReadGMBytes(size);

                        // Set background image
                        background.Image = image;
                    }
                }
                else
                {
                    // Get background data
                    background.UseAsTileSet         = reader.ReadGMBool();
                    background.TileWidth            = reader.ReadGMInt();
                    background.TileHeight           = reader.ReadGMInt();
                    background.HorizontalOffset     = reader.ReadGMInt();
                    background.VerticalOffset       = reader.ReadGMInt();
                    background.HorizontalSeperation = reader.ReadGMInt();
                    background.VerticalSeperation   = reader.ReadGMInt();

                    // Get version
                    version = reader.ReadGMInt();

                    // Check version
                    if (version != 800)
                    {
                        throw new Exception("Unsupported Background object version.");
                    }

                    // Get image data
                    background.Width  = reader.ReadGMInt();
                    background.Height = reader.ReadGMInt();

                    // If the sprite size is not zero
                    if (background.Width != 0 && background.Height != 0)
                    {
                        // Create a new image object
                        GMImage image = new GMImage();
                        image.Compressed = false;

                        // Set image data
                        image.Width  = background.Width;
                        image.Height = background.Height;

                        // Get size of image data
                        int size = reader.ReadGMInt();

                        // Get image data
                        image.Data = reader.ReadGMBytes(size);

                        // Insert compressed image data
                        background.Image = image;
                    }
                }

                // End object inflate
                reader.EndDecompress();

                // Add background
                backgrounds.Add(background);
            }

            // Return backgrounds
            return(backgrounds);
        }
Exemplo n.º 13
0
        /// <summary>
        /// Reads all actions from a GM file reader stream.
        /// </summary>
        public static GMAction[] ReadActions(GMFileReader reader)
        {
            // Get version.
            int version = reader.ReadGMInt();

            // Check version.
            if (version != 400)
            {
                throw new Exception("Unsupported Pre-Action object version.");
            }

            // Create an array of actions.
            GMAction[] actions = new GMAction[reader.ReadGMInt()];

            // Iterate through actions.
            for (int i = 0; i < actions.Length; i++)
            {
                // Create new action
                actions[i] = new GMAction();

                // Get version.
                version = reader.ReadGMInt();

                // Check version.
                if (version != 440)
                {
                    throw new Exception("Unsupported Action object version.");
                }

                // Get action properties.
                actions[i].LibraryId     = reader.ReadGMInt();
                actions[i].ActionId      = reader.ReadGMInt();
                actions[i].ActionKind    = reader.ReadGMInt();
                actions[i].AllowRelative = reader.ReadGMBool();
                actions[i].Question      = reader.ReadGMBool();
                actions[i].CanApplyTo    = reader.ReadGMBool();
                actions[i].ExecuteMode   = reader.ReadGMInt();

                // If the execute mode is a prefabbed function.
                if (actions[i].ExecuteMode == (int)ExecutionType.Function)
                {
                    actions[i].ExecuteCode = reader.ReadGMString();
                }
                else
                {
                    reader.ReadGMBytes(reader.ReadGMInt());
                }

                // If the execute mode is a script.
                if (actions[i].ExecuteMode == (int)ExecutionType.Code)
                {
                    actions[i].ExecuteCode = reader.ReadGMString();
                }
                else
                {
                    reader.ReadGMBytes(reader.ReadGMInt());
                }

                // Create an array of arguments.
                actions[i].Arguments = new GMArgument[reader.ReadGMInt()];

                // Number of argument types.
                int[] argTypes = new int[reader.ReadGMInt()];

                // Iterate through argument types
                for (int j = 0; j < argTypes.Length; j++)
                {
                    // Read in argument type.
                    argTypes[j] = reader.ReadGMInt();
                }

                // Read action data.
                actions[i].AppliesTo = reader.ReadGMInt();
                actions[i].Relative  = reader.ReadGMBool();

                // Get actual number of arguments, most likely 8.
                int argsNum = reader.ReadGMInt();

                // Iterate through argument types.
                for (int k = 0; k < argsNum; k++)
                {
                    // If the index is greater than or equal to the number of arguments, continue.
                    if (k >= actions[i].Arguments.Length)
                    {
                        reader.ReadGMBytes(reader.ReadGMInt());
                        continue;
                    }

                    // Create a new argument object.
                    actions[i].Arguments[k] = new GMArgument();

                    // Set what kind of argument.
                    actions[i].Arguments[k].Type = argTypes[k];

                    // Resource value.
                    actions[i].Arguments[k].Value = reader.ReadGMString();
                }

                // If not checkbox has been checked.
                actions[i].Not = reader.ReadGMBool();
            }

            // Return action object.
            return(actions);
        }
Exemplo n.º 14
0
        /// <summary>
        /// Reads all paths from a GM file reader stream.
        /// </summary>
        public static GMList <GMPath> ReadPaths(GMFileReader reader)
        {
            // Get version.
            int version = reader.ReadGMInt();

            // Check version.
            if (version != 420 && version != 800)
            {
                throw new Exception("Unsupported Pre-Path object version.");
            }

            // Create a new list of paths.
            GMList <GMPath> paths = new GMList <GMPath>();

            // Amount of path indexes.
            int num = reader.ReadGMInt();

            // Iterate through paths.
            for (int i = 0; i < num; i++)
            {
                // If version is 8.0, start inflate.
                if (version == 800)
                {
                    reader.Decompress();
                }

                // If the path at index does not exists, continue.
                if (reader.ReadGMBool() == false)
                {
                    paths.LastId++;
                    reader.EndDecompress();
                    continue;
                }

                // Create a new path object.
                GMPath path = new GMPath();

                // Set path id.
                path.Id = i;

                // Read path data.
                path.Name = reader.ReadGMString();

                // If version is 8.0, get last changed.
                if (version == 800)
                {
                    path.LastChanged = reader.ReadGMDouble();
                }

                // Get version.
                int version2 = reader.ReadGMInt();

                // Check version.
                if (version2 != 420 && version2 != 530)
                {
                    throw new Exception("Unsupported Path object version.");
                }

                // Check version.
                if (version2 > 420)
                {
                    // Read path data.
                    path.Smooth    = reader.ReadGMBool();
                    path.Closed    = reader.ReadGMBool();
                    path.Precision = reader.ReadGMInt();
                    path.RoomId    = reader.ReadGMInt();
                    path.SnapX     = reader.ReadGMInt();
                    path.SnapY     = reader.ReadGMInt();
                }
                else
                {
                    // Read path data.
                    path.Smooth         = reader.ReadGMBool();
                    path.ActionAtTheEnd = (ActionAtTheEnd)reader.ReadGMInt();
                    reader.ReadGMBytes(4);
                }

                // Number of path points.
                path.Points = new GMPoint[reader.ReadGMInt()];

                // Iterate through path points.
                for (int j = 0; j < path.Points.Length; j++)
                {
                    // Create a new point.
                    GMPoint point = new GMPoint();

                    // Read point data.
                    point.X     = reader.ReadGMDouble();
                    point.Y     = reader.ReadGMDouble();
                    point.Speed = reader.ReadGMDouble();

                    // Set point.
                    path.Points[j] = point;
                }

                // End object inflate.
                reader.EndDecompress();

                // Add path.
                paths.Add(path);
            }

            // Return paths.
            return(paths);
        }
Exemplo n.º 15
0
        /// <summary>
        /// Reads all scripts from a GM file reader stream.
        /// </summary>
        public static GMList <GMScript> ReadScripts(GMFileReader reader)
        {
            // Get version.
            int version = reader.ReadGMInt();

            // Check version.
            if (version != 400 && version != 800)
            {
                throw new Exception("Unsupported Pre-Script object version.");
            }

            // Create a new list of scripts.
            GMList <GMScript> scripts = new GMList <GMScript>();

            // Amount of script ids.
            int num = reader.ReadGMInt();

            // Iterate through scripts.
            for (int i = 0; i < num; i++)
            {
                // If version is 8.0, start inflate.
                if (version == 800)
                {
                    reader.Decompress();
                }

                // If the script at index does not exists, continue.
                if (reader.ReadGMBool() == false)
                {
                    scripts.LastId++;
                    reader.EndDecompress();
                    continue;
                }

                // Create a new script object.
                GMScript script = new GMScript();

                // Set script id.
                script.Id = i;

                // Read script data.
                script.Name = reader.ReadGMString();

                // If version is 8.0, get last changed.
                if (version == 800)
                {
                    script.LastChanged = reader.ReadGMDouble();
                }

                // Get version.
                version = reader.ReadGMInt();

                // Check version.
                if (version != 400 && version != 800)
                {
                    throw new Exception("Unsupported Script object version.");
                }

                // Read script data.
                script.Code = reader.ReadGMString();

                // End object inflate.
                reader.EndDecompress();

                // Add script.
                scripts.Add(script);
            }

            // Return scripts.
            return(scripts);
        }
Exemplo n.º 16
0
        /// <summary>
        /// Reads all triggers from GM file reader stream.
        /// </summary>
        public static GMList <GMTrigger> ReadTriggers(GMFileReader reader)
        {
            // Get version.
            int version = reader.ReadGMInt();

            // Check version.
            if (version != 800)
            {
                throw new Exception("Unsupported Pre-Trigger object version.");
            }

            // Create a new trigger list.
            GMList <GMTrigger> triggers = new GMList <GMTrigger>();

            // Amount of trigger ids.
            int num = reader.ReadGMInt();

            // Iterate through triggers.
            for (int i = 0; i < num; i++)
            {
                // Start inflate.
                reader.Decompress();

                // If the trigger at index does not exists, continue.
                if (reader.ReadGMBool() == false)
                {
                    triggers.LastId++;
                    reader.EndDecompress();
                    continue;
                }

                // Get version.
                version = reader.ReadGMInt();

                // Check version.
                if (version != 800)
                {
                    throw new Exception("Unsupported trigger object version.");
                }

                // Create a new trigger.
                GMTrigger trigger = new GMTrigger();

                // Read trigger data.
                trigger.Name      = reader.ReadGMString();
                trigger.Condition = reader.ReadGMString();
                trigger.Moment    = (MomentType)reader.ReadGMInt();
                trigger.Constant  = reader.ReadGMString();

                // End object inflate.
                reader.EndDecompress();

                // Add trigger.
                triggers.Add(trigger);
            }

            // Get last changed.
            GMTrigger.TriggerLastChanged = reader.ReadGMDouble();

            // Return triggers.
            return(triggers);
        }
Exemplo n.º 17
0
        /// <summary>
        /// Reads objects from GM file
        /// </summary>
        public static GMList <GMObject> ReadObjects(GMFileReader reader)
        {
            // Get version
            int version = reader.ReadGMInt();

            // Check version
            if (version != 400 && version != 800)
            {
                throw new Exception("Unsupported Pre-Object object version.");
            }

            // The number of objects
            GMList <GMObject> objects = new GMList <GMObject>();

            // Amount of object ids
            int num = reader.ReadGMInt();

            // Iterate through objects
            for (int i = 0; i < num; i++)
            {
                // If version is 8.0, start inflate
                if (version == 800)
                {
                    reader.Decompress();
                }

                // If the object at index does not exists, continue
                if (reader.ReadGMBool() == false)
                {
                    objects.LastId++;
                    reader.EndDecompress();
                    continue;
                }

                // Create a new script object
                GMObject obj = new GMObject();

                // Set script id
                obj.Id = i;

                // Read script data.
                obj.Name = reader.ReadGMString();

                // If version is 8.0, get last changed
                if (version == 800)
                {
                    obj.LastChanged = reader.ReadGMDouble();
                }

                // Get version
                int version2 = reader.ReadGMInt();

                // Check version
                if (version2 != 430)
                {
                    throw new Exception("Unsupported Object object version.");
                }

                // Read object data
                obj.SpriteId   = reader.ReadGMInt();
                obj.Solid      = reader.ReadGMBool();
                obj.Visible    = reader.ReadGMBool();
                obj.Depth      = reader.ReadGMInt();
                obj.Persistent = reader.ReadGMBool();
                obj.Parent     = reader.ReadGMInt();
                obj.Mask       = reader.ReadGMInt();

                // Skip data
                reader.ReadGMBytes(4);

                // The amount of main event types
                int amount = 11;

                // If version 8.0, there are 12 main event types
                if (version == 800)
                {
                    amount = 12;
                }

                // Iterate through events
                for (int j = 0; j < amount; j++)
                {
                    // Not done processing
                    bool done = false;

                    // While not done processing events
                    while (!done)
                    {
                        // Check for event
                        int eventNum = reader.ReadGMInt();

                        // If the event exists
                        if (eventNum != -1)
                        {
                            // Create new event
                            GMEvent ev = new GMEvent();

                            // Set type of event
                            ev.MainType = j;

                            // If a collision type of event set other object id
                            if (ev.MainType == (int)EventType.Collision)
                            {
                                ev.OtherId = eventNum;
                            }
                            else
                            {
                                ev.SubType = eventNum;
                            }

                            // Read event actions
                            ev.Actions = GMAction.ReadActions(reader);

                            // Add new event
                            obj.Events[j].Add(ev);
                        }
                        else
                        {
                            done = true;
                        }
                    }
                }

                // End object inflate
                reader.EndDecompress();

                // Add object to list
                objects.Add(obj);
            }

            // Return objects
            return(objects);
        }