Example #1
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);
        }
Example #2
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);
        }