public void PostLoad(GMProject proj) { if (Who > -1) { WhoObj = proj.Objects[Who]; } }
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]; } }
/// <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); }
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); }
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); } }
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(); }
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(); }
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]; } }
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); } }
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; } } }
/// <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); } }
/// <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); }
/// <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); }