/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }