Exemplo n.º 1
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.º 2
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.º 3
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.º 4
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.º 5
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.º 6
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.º 7
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.º 8
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.º 9
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.º 10
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.º 11
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.º 12
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);
        }