コード例 #1
0
ファイル: GMAction.cs プロジェクト: gm-archive/RussellLib
 public void PostLoad(GMProject proj)
 {
     if (Who > -1)
     {
         WhoObj = proj.Objects[Who];
     }
 }
コード例 #2
0
ファイル: RoomView.cs プロジェクト: gm-archive/RussellLib
        public void Load(ProjectReader reader, GMProject proj)
        {
            int _x, _y, _w, _h;

            Visible    = reader.ReadBoolean();
            _x         = reader.ReadInt32();
            _y         = reader.ReadInt32();
            _w         = reader.ReadInt32();
            _h         = reader.ReadInt32();
            ViewCoords = new Rectangle(_x, _y, _w, _h);
            _x         = reader.ReadInt32();
            _y         = reader.ReadInt32();
            _w         = reader.ReadInt32();
            _h         = reader.ReadInt32();
            PortCoords = new Rectangle(_x, _y, _w, _h);
            BorderHor  = reader.ReadInt32();
            BorderVert = reader.ReadInt32();
            HSpeed     = reader.ReadInt32();
            VSpeed     = reader.ReadInt32();
            ViewObject = null;
            int _objind = reader.ReadInt32();

            if (_objind > -1)
            {
                ViewObject = proj.Objects[_objind];
            }
        }
コード例 #3
0
        /// <summary>
        /// Sets the instances
        /// </summary>
        private GMInstance[] SetInstances()
        {
            // Get regular and block instances
            List <GMareInstance> gmareInstances = new List <GMareInstance>();

            gmareInstances.AddRange(App.Room.Instances.ToArray());

            // Create a game maker instance array
            GMInstance[] instances = new GMInstance[gmareInstances.Count];

            // Set room instances
            for (int i = 0; i < gmareInstances.Count; i++)
            {
                bool     studio = _project.GameMakerVersion == GMVersionType.GameMakerStudio;
                GMObject obj    = studio ? _project.Objects.Find(o => o.Name == gmareInstances[i].ObjectName) :
                                  _project.Objects.Find(o => o.Id == gmareInstances[i].ObjectId);

                // If the object does not exist in the target project, abort
                if (obj == null)
                {
                    string objMessage = studio ? gmareInstances[i].ObjectName : gmareInstances[i].Name + "(Id: " + gmareInstances[i].ObjectId + ")";
                    MessageBox.Show("Could not find the object: " + objMessage + " within the target export project.",
                                    "GMare", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    return(null);
                }

                // Get the sprite for the instance offsets
                GMSprite sprite = studio ? _project.Sprites.Find(s => s.Name == obj.SpriteName) :
                                  _project.Sprites.Find(s => obj.SpriteId == obj.SpriteId);

                // If the sprite does not exist in the target project, abort
                if (sprite == null)
                {
                    string spriteMessage = studio ? obj.SpriteName : obj.SpriteId.ToString();
                    MessageBox.Show("Could not find the sprite: " + spriteMessage + " within the target export project.",
                                    "GMare", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    return(null);
                }

                // Increment project last instance id
                _project.LastInstanceId++;

                // Create a new instance
                instances[i]              = new GMInstance();
                instances[i].Name         = GetUniqueName(false);
                instances[i].CreationCode = (string)gmareInstances[i].CreationCode.Clone();
                instances[i].Id           = _project.LastInstanceId;
                instances[i].ObjectName   = gmareInstances[i].ObjectName;
                instances[i].ObjectId     = gmareInstances[i].ObjectId;
                instances[i].X            = gmareInstances[i].X + sprite.OriginX;
                instances[i].Y            = gmareInstances[i].Y + sprite.OriginY;
                instances[i].ScaleX       = gmareInstances[i].ScaleX == 0 ? 1 : gmareInstances[i].ScaleX;
                instances[i].ScaleY       = gmareInstances[i].ScaleY == 0 ? 1 : gmareInstances[i].ScaleY;
                instances[i].Rotation     = gmareInstances[i].Rotation;
            }

            // Return an array of instances
            return(instances);
        }
コード例 #4
0
        public GMRoomInstance(BinaryReader binaryReader, GMWAD w)
        {
            X = binaryReader.ReadInt32();
            Y = binaryReader.ReadInt32();
            //Object = binaryReader.ReadInt32();
            var obj_id = binaryReader.ReadInt32();

            if (obj_id > -1)
            {
                Object = w.Objects.Items[obj_id];
            }
            Id           = binaryReader.ReadInt32();
            CreationCode = new GMString(binaryReader);
        }
コード例 #5
0
        public static void Object(ProjectWriter writer, GMObject self, GMProject proj)
        {
            writer.Write(self.Name);
            writer.Write(self.Version);

            if (self.Sprite == null)
            {
                writer.Write(-1);
            }
            else
            {
                writer.Write(proj.Sprites.IndexOf(self.Sprite));
            }

            writer.Write(self.Solid);
            writer.Write(self.Visible);
            writer.Write(self.Depth);
            writer.Write(self.Persistent);

            if (self.Parent == null)
            {
                writer.Write(-100);
            }
            else
            {
                writer.Write(proj.Objects.IndexOf(self.Parent));
            }

            if (self.Mask == null)
            {
                writer.Write(-1);
            }
            else
            {
                writer.Write(proj.Sprites.IndexOf(self.Mask));
            }

            writer.Write(self.Events.Count - 1);
            foreach (var ev in self.Events)
            {
                foreach (var inner in ev)
                {
                    writer.Write(inner.Key);
                    inner.Save(writer, proj);
                }
                writer.Write(-1);
            }
        }
コード例 #6
0
        public void Load(ProjectReader reader, GMProject proj)
        {
            int _x, _y, _objind;

            _x       = reader.ReadInt32();
            _y       = reader.ReadInt32();
            Position = new Point(_x, _y);
            Object   = null;
            _objind  = reader.ReadInt32();
            if (_objind > -1)
            {
                Object = proj.Objects[_objind];
            }
            ID           = reader.ReadInt32();
            CreationCode = reader.ReadString();
            IsLocked     = reader.ReadBoolean();
        }
コード例 #7
0
ファイル: GMAction.cs プロジェクト: gm-archive/RussellLib
        public GMAction(ProjectReader reader)
        {
            Version = reader.ReadInt32(); // what?
            if (Version != 440)
            {
                throw new Exception("Invalid Action version, got " + Version);
            }
            LibID         = reader.ReadInt32();
            ID            = reader.ReadInt32();
            Kind          = (ActionType)reader.ReadInt32();
            UseRelative   = reader.ReadBoolean();
            IsQuestion    = reader.ReadBoolean();
            UseApplyTo    = reader.ReadBoolean();
            ExeType       = (ActionExecuteType)reader.ReadInt32();
            Name          = reader.ReadString();
            Code          = reader.ReadString();
            ArgumentCount = reader.ReadInt32();
            int argc = reader.ReadInt32();

            ArgumentTypes = new List <ActionArgType>(argc);
            for (int i = 0; i < argc; i++)
            {
                ArgumentTypes.Add((ActionArgType)reader.ReadInt32());
            }
            Who      = reader.ReadInt32();
            WhoObj   = null;
            Relative = reader.ReadBoolean();
            int argc2 = reader.ReadInt32();

            Arguments = new List <string>(argc2);
            for (int i = 0; i < argc2; i++)
            {
                Arguments.Add(reader.ReadString());
            }
            IsNot = reader.ReadBoolean();
        }
コード例 #8
0
        public GMObject Object;         // GMObject index...???

        public GMRoomView(BinaryReader binaryReader, GMWAD w)
        {
            Visible       = ReadBool(binaryReader);
            ViewCoords    = new int[4];
            ViewCoords[0] = binaryReader.ReadInt32();
            ViewCoords[1] = binaryReader.ReadInt32();
            ViewCoords[2] = binaryReader.ReadInt32();
            ViewCoords[3] = binaryReader.ReadInt32();
            PortCoords    = new int[4];
            PortCoords[0] = binaryReader.ReadInt32();
            PortCoords[1] = binaryReader.ReadInt32();
            PortCoords[2] = binaryReader.ReadInt32();
            PortCoords[3] = binaryReader.ReadInt32();
            HBorder       = binaryReader.ReadInt32();
            VBorder       = binaryReader.ReadInt32();
            HSpeed        = binaryReader.ReadInt32();
            VSpeed        = binaryReader.ReadInt32();
            var obj_ind = binaryReader.ReadInt32();

            if (obj_ind > -1)
            {
                Object = w.Objects.Items[obj_ind];
            }
        }
コード例 #9
0
        public override void ConvertProject(ProjectFile pf)
        {
            var dataAssets = pf.DataHandle.GetChunk <GMChunkOBJT>().List;

            // TODO: use asset refs whenever code is implemented
            GMList <GMCode> dataCode = ((GMChunkCODE)pf.DataHandle.Chunks["CODE"]).List;

            int getCode(string name)
            {
                try
                {
                    return(dataCode.Select((elem, index) => new { elem, index }).First(p => p.elem.Name.Content == name).index);
                }
                catch (InvalidOperationException)
                {
                    return(-1);
                }
            }

            int getObject(string name)
            {
                if (name == null)
                {
                    return(-1);
                }
                if (name == "<undefined>")
                {
                    return(-100);
                }
                return(pf.Objects.FindIndex(name));
            }

            List <GMObject> newList = new List <GMObject>();

            for (int i = 0; i < pf.Objects.Count; i++)
            {
                AssetObject projectAsset = pf.Objects[i].Asset;
                if (projectAsset == null)
                {
                    // This asset was never converted
                    // No need to update IDs since they won't change
                    newList.Add((GMObject)pf.Objects[i].DataAsset);
                    continue;
                }

                GMObject dataAsset = new GMObject()
                {
                    Name                  = pf.DataHandle.DefineString(projectAsset.Name),
                    SpriteID              = pf.Sprites.FindIndex(projectAsset.Sprite),
                    Visible               = projectAsset.Visible,
                    Solid                 = projectAsset.Solid,
                    Depth                 = projectAsset.Depth,
                    Persistent            = projectAsset.Persistent,
                    ParentObjectID        = getObject(projectAsset.ParentObject),
                    MaskSpriteID          = pf.Sprites.FindIndex(projectAsset.MaskSprite),
                    Physics               = projectAsset.Physics,
                    PhysicsSensor         = projectAsset.PhysicsSensor,
                    PhysicsShape          = projectAsset.PhysicsShape,
                    PhysicsDensity        = projectAsset.PhysicsDensity,
                    PhysicsRestitution    = projectAsset.PhysicsRestitution,
                    PhysicsGroup          = projectAsset.PhysicsGroup,
                    PhysicsLinearDamping  = projectAsset.PhysicsLinearDamping,
                    PhysicsAngularDamping = projectAsset.PhysicsAngularDamping,
                    PhysicsVertices       = new List <GMObject.PhysicsVertex>(),
                    PhysicsFriction       = projectAsset.PhysicsFriction,
                    PhysicsAwake          = projectAsset.PhysicsAwake,
                    PhysicsKinematic      = projectAsset.PhysicsKinematic,
                    Events                = new GMUniquePointerList <GMUniquePointerList <GMObject.Event> >()
                };

                foreach (AssetObject.PhysicsVertex v in projectAsset.PhysicsVertices)
                {
                    dataAsset.PhysicsVertices.Add(new GMObject.PhysicsVertex()
                    {
                        X = v.X, Y = v.Y
                    });
                }

                foreach (var events in projectAsset.Events.Values)
                {
                    var newEvents = new GMUniquePointerList <GMObject.Event>();
                    foreach (var ev in events)
                    {
                        GMObject.Event newEv = new GMObject.Event()
                        {
                            Subtype = 0,
                            Actions = new GMUniquePointerList <GMObject.Event.Action>()
                            {
                                new GMObject.Event.Action()
                                {
                                    LibID                                              = 1,
                                    ID                                                 = ev.Actions[0].ID,
                                    Kind                                               = 7,
                                    UseRelative                                        = false,
                                    IsQuestion                                         = false,
                                    UseApplyTo                                         = ev.Actions[0].UseApplyTo,
                                    ExeType                                            = 2,
                                    ActionName                                         = ev.Actions[0].ActionName != null?pf.DataHandle.DefineString(ev.Actions[0].ActionName) : null,
                                                                         CodeID        = getCode(ev.Actions[0].Code),
                                                                         ArgumentCount = ev.Actions[0].ArgumentCount,
                                                                         Who           = -1,
                                                                         Relative      = false,
                                                                         IsNot         = false
                                }
                            }
                        };

                        // Handle subtype
                        switch (ev)
                        {
                        case AssetObject.EventAlarm e:
                            newEv.Subtype = e.AlarmNumber;
                            break;

                        case AssetObject.EventStep e:
                            newEv.Subtype = (int)e.SubtypeStep;
                            break;

                        case AssetObject.EventCollision e:
                            newEv.Subtype = getObject(e.ObjectName);
                            break;

                        case AssetObject.EventKeyboard e:
                            newEv.Subtype = (int)e.SubtypeKey;
                            break;

                        case AssetObject.EventMouse e:
                            newEv.Subtype = (int)e.SubtypeMouse;
                            break;

                        case AssetObject.EventOther e:
                            newEv.Subtype = (int)e.SubtypeOther;
                            break;

                        case AssetObject.EventDraw e:
                            newEv.Subtype = (int)e.SubtypeDraw;
                            break;

                        case AssetObject.EventGesture e:
                            newEv.Subtype = (int)e.SubtypeGesture;
                            break;
                        }
                        newEvents.Add(newEv);
                    }
                    dataAsset.Events.Add(newEvents);
                }

                newList.Add(dataAsset);
            }

            dataAssets.Clear();
            foreach (var obj in newList)
            {
                dataAssets.Add(obj);
            }
        }
コード例 #10
0
        public override void ConvertData(ProjectFile pf, int index)
        {
            // TODO use asset refs eventually
            var dataCode = ((GMChunkCODE)pf.DataHandle.Chunks["CODE"])?.List;

            GMObject asset = (GMObject)pf.Objects[index].DataAsset;

            AssetObject projectAsset = new AssetObject()
            {
                Name         = asset.Name?.Content,
                Sprite       = asset.SpriteID >= 0 ? pf.Sprites[asset.SpriteID].Name : null,
                Visible      = asset.Visible,
                Solid        = asset.Solid,
                Depth        = asset.Depth,
                Persistent   = asset.Persistent,
                ParentObject = asset.ParentObjectID >= 0 ? pf.Objects[asset.ParentObjectID].Name
                                    : (asset.ParentObjectID == -100 ? "<undefined>" : null),
                MaskSprite            = asset.MaskSpriteID >= 0 ? pf.Sprites[asset.MaskSpriteID].Name : null,
                Physics               = asset.Physics,
                PhysicsSensor         = asset.PhysicsSensor,
                PhysicsShape          = asset.PhysicsShape,
                PhysicsDensity        = asset.PhysicsDensity,
                PhysicsRestitution    = asset.PhysicsRestitution,
                PhysicsGroup          = asset.PhysicsGroup,
                PhysicsLinearDamping  = asset.PhysicsLinearDamping,
                PhysicsAngularDamping = asset.PhysicsAngularDamping,
                PhysicsVertices       = new List <AssetObject.PhysicsVertex>(),
                PhysicsFriction       = asset.PhysicsFriction,
                PhysicsAwake          = asset.PhysicsAwake,
                PhysicsKinematic      = asset.PhysicsKinematic,
                Events = new SortedDictionary <AssetObject.EventType, List <AssetObject.Event> >()
            };

            pf.Objects[index].Asset = projectAsset;

            foreach (GMObject.PhysicsVertex v in asset.PhysicsVertices)
            {
                projectAsset.PhysicsVertices.Add(new AssetObject.PhysicsVertex()
                {
                    X = v.X, Y = v.Y
                });
            }
            for (int j = 0; j < asset.Events.Count; j++)
            {
                List <AssetObject.Event> projectEvents = new List <AssetObject.Event>();
                AssetObject.EventType    type          = (AssetObject.EventType)j;
                projectAsset.Events[type] = projectEvents;

                void addActions(GMObject.Event ev, AssetObject.Event newEv)
                {
                    foreach (var ac in ev.Actions)
                    {
                        newEv.Actions.Add(new AssetObject.Action()
                        {
                            Code          = (dataCode == null) ? ac.CodeID.ToString() : dataCode[ac.CodeID].Name.Content,
                            ID            = ac.ID,
                            UseApplyTo    = ac.UseApplyTo,
                            ActionName    = ac.ActionName?.Content,
                            ArgumentCount = ac.ArgumentCount
                        });
                    }
                }

                switch (type)
                {
                case AssetObject.EventType.Alarm:
                    foreach (var ev in asset.Events[j])
                    {
                        var newEv = new AssetObject.EventAlarm()
                        {
                            Actions     = new List <AssetObject.Action>(),
                            AlarmNumber = ev.Subtype
                        };
                        addActions(ev, newEv);
                        projectEvents.Add(newEv);
                    }
                    break;

                case AssetObject.EventType.Step:
                    foreach (var ev in asset.Events[j])
                    {
                        var newEv = new AssetObject.EventStep()
                        {
                            Actions     = new List <AssetObject.Action>(),
                            SubtypeStep = (AssetObject.EventStep.Subtype)ev.Subtype
                        };
                        addActions(ev, newEv);
                        projectEvents.Add(newEv);
                    }
                    break;

                case AssetObject.EventType.Collision:
                    foreach (var ev in asset.Events[j])
                    {
                        var newEv = new AssetObject.EventCollision()
                        {
                            Actions    = new List <AssetObject.Action>(),
                            ObjectName = pf.Objects[ev.Subtype].Name
                        };
                        addActions(ev, newEv);
                        projectEvents.Add(newEv);
                    }
                    break;

                case AssetObject.EventType.Keyboard:
                case AssetObject.EventType.KeyPress:
                case AssetObject.EventType.KeyRelease:
                    foreach (var ev in asset.Events[j])
                    {
                        var newEv = new AssetObject.EventKeyboard()
                        {
                            Actions    = new List <AssetObject.Action>(),
                            SubtypeKey = (AssetObject.EventKeyboard.Subtype)ev.Subtype
                        };
                        addActions(ev, newEv);
                        projectEvents.Add(newEv);
                    }
                    break;

                case AssetObject.EventType.Mouse:
                    foreach (var ev in asset.Events[j])
                    {
                        var newEv = new AssetObject.EventMouse()
                        {
                            Actions      = new List <AssetObject.Action>(),
                            SubtypeMouse = (AssetObject.EventMouse.Subtype)ev.Subtype
                        };
                        addActions(ev, newEv);
                        projectEvents.Add(newEv);
                    }
                    break;

                case AssetObject.EventType.Other:
                    foreach (var ev in asset.Events[j])
                    {
                        var newEv = new AssetObject.EventOther()
                        {
                            Actions      = new List <AssetObject.Action>(),
                            SubtypeOther = (AssetObject.EventOther.Subtype)ev.Subtype
                        };
                        addActions(ev, newEv);
                        projectEvents.Add(newEv);
                    }
                    break;

                case AssetObject.EventType.Draw:
                    foreach (var ev in asset.Events[j])
                    {
                        var newEv = new AssetObject.EventDraw()
                        {
                            Actions     = new List <AssetObject.Action>(),
                            SubtypeDraw = (AssetObject.EventDraw.Subtype)ev.Subtype
                        };
                        addActions(ev, newEv);
                        projectEvents.Add(newEv);
                    }
                    break;

                case AssetObject.EventType.Gesture:
                    foreach (var ev in asset.Events[j])
                    {
                        var newEv = new AssetObject.EventGesture()
                        {
                            Actions        = new List <AssetObject.Action>(),
                            SubtypeGesture = (AssetObject.EventGesture.Subtype)ev.Subtype
                        };
                        addActions(ev, newEv);
                        projectEvents.Add(newEv);
                    }
                    break;

                default:
                    foreach (var ev in asset.Events[j])
                    {
                        var newEv = new AssetObject.EventNormal()
                        {
                            Actions = new List <AssetObject.Action>()
                        };
                        addActions(ev, newEv);
                        projectEvents.Add(newEv);
                    }
                    break;
                }
            }
        }
コード例 #11
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);
            }
        }
コード例 #12
0
        /// <summary>
        /// Reads a Game Maker Studio project file
        /// </summary>
        private void ReadProjectGMS(string file)
        {
            // Set version
            GameMakerVersion = GMVersionType.GameMakerStudio;

            // Path with project file removed
            string folder = file.Remove(file.LastIndexOf("\\"));

            // Set up resource directory strings
            Dictionary <GMResourceType, string> directories = new Dictionary <GMResourceType, string>();

            directories.Add(GMResourceType.Assets, file);
            directories.Add(GMResourceType.DataFiles, file);
            directories.Add(GMResourceType.Configs, file);
            directories.Add(GMResourceType.Constants, file);
            directories.Add(GMResourceType.Hash, file);
            directories.Add(GMResourceType.Backgrounds, folder + "\\" + "background");
            directories.Add(GMResourceType.Objects, folder + "\\" + "objects");
            directories.Add(GMResourceType.Rooms, folder + "\\" + "rooms");
            directories.Add(GMResourceType.Sprites, folder + "\\" + "sprites");
            directories.Add(GMResourceType.Sounds, folder + "\\" + "sound");
            directories.Add(GMResourceType.TimeLines, folder + "\\" + "timelines");
            directories.Add(GMResourceType.Shaders, folder + "\\" + "shaders");
            directories.Add(GMResourceType.Scripts, folder + "\\" + "scripts");
            directories.Add(GMResourceType.Paths, folder + "\\" + "paths");

            // Resource load index
            int index = 0;

            // Iterate through directories
            foreach (KeyValuePair <GMResourceType, string> item in directories)
            {
                // Increment directory index
                index++;

                // If the directory does not exist, continue
                if (Path.GetExtension(item.Value) != ".gmx" && !Directory.Exists(item.Value))
                {
                    continue;
                }

                // Progress changed
                ProgressChanged("Reading " + item.Key.ToString() + "...", index, directories.Count);

                // Load data based on resource type
                switch (item.Key)
                {
                case GMResourceType.Hash: Settings.Hash = ReadHashGMX(item.Value); break;

                case GMResourceType.Assets: ProjectTree = GMNode.ReadTreeGMX(item.Value); Assets = (List <string>)ProjectTree.Tag; break;

                case GMResourceType.DataFiles: DataFiles = GMDataFile.ReadDataFilesGMX(item.Value, out LastDataFileId); break;

                case GMResourceType.Sprites: Sprites = GMSprite.ReadSpritesGMX(item.Value, ref Assets); break;

                //case GMResourceType.Configs: Settings.Configs = GMSettings.GetConfigsGMX(item.Value); break;
                //case GMResourceType.Constants: Settings.Constants = GMSettings.ReadConstantsGMX(item.Value); break;
                case GMResourceType.Backgrounds: Backgrounds = GMBackground.ReadBackgroundsGMX(item.Value, ref Assets); break;

                case GMResourceType.Objects: Objects = GMObject.ReadObjectsGMX(item.Value, ref Assets); break;

                case GMResourceType.Rooms: Rooms = GMRoom.ReadRoomsGMX(item.Value, ref Assets, out LastTileId); break;
                    //case GMResourceType.TimeLines: Timelines = GMTimeline.ReadTimelinesGMX(item.Value, Assets); break;
                    //case GMResourceType.Sounds: Sounds = GMSound.ReadSoundsGMX(item.Value, ref Assets); break;
                    //case GMResourceType.Shaders: Shaders = GMShader.ReadShadersGMX(item.Value, ref Assets); break;
                    //case GMResourceType.Scripts: Scripts = GMScript.ReadScriptsGMX(item.Value, ref Assets); break;
                    //case GMResourceType.Paths: Paths = GMPath.ReadPathsGMX(item.Value, ref Assets); break;
                    //case GMResourceType.TimeLines: Timelines = GMTimeline.ReadTimelinesGMX(item.Value, Assets); break;
                }
            }

            // Retrieve tutorial data
            foreach (GMNode node in ProjectTree.Nodes)
            {
                // If the node is the tutorial state node and it has the nodes we're looking for
                if (node.ResourceType == GMResourceType.TutorialState && node.Nodes != null && node.Nodes.Length == 3)
                {
                    Settings.IsTutorial   = node.Nodes[0].Nodes == null ? Settings.IsTutorial : GMResource.GMXBool(node.Nodes[0].Nodes[0].Name, true);
                    Settings.TutorialName = node.Nodes[1].Nodes == null ? Settings.TutorialName : GMResource.GMXString(node.Nodes[1].Nodes[0].FilePath, "");
                    Settings.TutorialPage = node.Nodes[2].Nodes == null ? Settings.TutorialPage : GMResource.GMXInt(node.Nodes[2].Nodes[0].Name, 0);
                }
            }

            // Progress event
            ProgressChanged("Finished Reading Project.", index, directories.Count);
        }
コード例 #13
0
ファイル: GMUtilities.cs プロジェクト: Smartkin/GMare_Fork
        /// <summary>
        /// Gets a .net tree node from a GM node. Stores original GM node data in tag property.
        /// </summary>
        /// <param name="node">The GM node to convert to treenode.</param>
        /// <returns>A tree node version of the GM node.</returns>
        public static TreeNode GetTreeNodeFromGMNode(GMProject project, GMNode node, List <Image> images)
        {
            // Set-up tree node.
            TreeNode treeNode = new TreeNode();

            treeNode.Text = node.Name;
            treeNode.Tag  = node;

            // If the list does not have the folder graphics, add them.
            if (images != null && images.Count < 2)
            {
                images.Add((Image)GMare.Properties.Resources.file_close.Clone());
                images.Add((Image)GMare.Properties.Resources.file_open.Clone());
                images.Add((Image)GMare.Properties.Resources.instance.Clone());
            }

            switch (node.NodeType)
            {
            // If a child node, get appropriate resource key.
            case GMNodeType.Child:

                // Do action based on object type.
                switch (node.ResourceType)
                {
                // Sprites.
                case GMResourceType.Sprites:

                    // If no images to load, break.
                    if (images == null)
                    {
                        break;
                    }

                    // Get sprite.
                    GMSprite sprite = project.Sprites.Find(delegate(GMSprite s) { return(s.Id == node.Id); });

                    // If a sprite was found.
                    if (sprite != null)
                    {
                        // Get image.
                        Bitmap image = GMUtilities.GetBitmap(sprite.SubImages[0]);

                        // Set transparency if needed.
                        if (sprite.Transparent && sprite.SubImages[0].Compressed)
                        {
                            image.MakeTransparent(image.GetPixel(0, image.Height - 1));
                        }

                        images.Add(image);
                        treeNode.ImageIndex         = images.Count - 1;
                        treeNode.SelectedImageIndex = images.Count - 1;
                    }
                    else
                    {
                        treeNode.ImageIndex         = 2;
                        treeNode.SelectedImageIndex = 2;
                    }

                    break;

                // Objects.
                case GMResourceType.Objects:

                    // If no images to load, break.
                    if (images == null)
                    {
                        break;
                    }

                    // Get the object id, use it to get the sprite id.
                    GMObject obj = project.Objects.Find(delegate(GMObject o) { return(o.Id == node.Id); });
                    GMSprite spt = project.Sprites.Find(delegate(GMSprite s) { return(s.Id == obj.SpriteId); });

                    // If a sprite was found.
                    if (spt != null && spt.SubImages != null && spt.SubImages.Length > 0)
                    {
                        // Get image.
                        Bitmap image = GMUtilities.GetBitmap(spt.SubImages[0]);

                        // Set transparency if needed.
                        if (spt.Transparent && spt.SubImages[0].Compressed)
                        {
                            image.MakeTransparent(image.GetPixel(0, image.Height - 1));
                        }

                        images.Add(image);
                        treeNode.ImageIndex         = images.Count - 1;
                        treeNode.SelectedImageIndex = images.Count - 1;
                    }
                    else
                    {
                        treeNode.ImageIndex         = 2;
                        treeNode.SelectedImageIndex = 2;
                    }

                    break;

                // Rooms.
                case GMResourceType.Rooms:
                    treeNode.ImageKey         = ImageKeyRoom;
                    treeNode.SelectedImageKey = ImageKeyRoomSelected;
                    break;
                }

                break;

            // Folders or parents.
            default:
                treeNode.ImageIndex         = 0;
                treeNode.SelectedImageIndex = 1;
                treeNode.ImageKey           = ImageKeyGroup;
                treeNode.SelectedImageKey   = ImageKeyGroupSelected;
                break;
            }

            // If no child nodes, return the top node.
            if (node.Nodes == null)
            {
                return(treeNode);
            }

            // Iterate through nodes.
            for (int i = 0; i < node.Children; i++)
            {
                // Set the node.
                treeNode.Nodes.Add(GetTreeNodeFromGMNode(project, node.Nodes[i], images));
            }

            // Return a .net tree node.
            return(treeNode);
        }