/// <summary> /// Write a 32-bit *string-only* pointer value in this position, for an object /// </summary> public void WritePointerString(GMString obj) { if (obj == null) { // This string object doesn't exist, so it will never have a pointer value... Write(0); return; } // Add this location to a list for this string object List <int> pending; if (PendingStringPointerWrites.TryGetValue(obj, out pending)) { pending.Add(Offset); } else { PendingStringPointerWrites.Add(obj, new List <int> { Offset }); } // Placeholder pointer value, will be overwritten in the future Write(0xBADD0660); }
public GMFont(BinaryReader binaryReader, GMWAD w) { Name = new GMString(binaryReader); FontName = new GMString(binaryReader); FontSize = binaryReader.ReadInt32(); Bold = ReadBool(binaryReader); Italic = ReadBool(binaryReader); First = binaryReader.ReadInt32(); Last = binaryReader.ReadInt32(); uint tpag_addr = binaryReader.ReadUInt32(); if (tpag_addr != 0) { long prev_addr = binaryReader.BaseStream.Position; binaryReader.BaseStream.Position = tpag_addr; Texture = new GMTPAGEntry(binaryReader, w); binaryReader.BaseStream.Position = prev_addr; } else { Texture = null; Output.Print($"ERROR!! :: Font {Name} has no texture!"); } ScaleX = binaryReader.ReadSingle(); ScaleY = binaryReader.ReadSingle(); GlyphCount = binaryReader.ReadInt32(); Glyphs = new List <GMFontGlyph>(GlyphCount); for (int g = 0; g < GlyphCount; g++) { var glyph = new GMFontGlyph(binaryReader); Glyphs.Add(glyph); } }
public void Unserialize(GMDataReader reader, int entryCount) { Name = reader.ReadStringPointerObject(); Region = reader.ReadStringPointerObject(); for (uint i = 0; i < entryCount; i++) { Entries.Add(reader.ReadStringPointerObject()); } }
public GMObject(BinaryReader binaryReader, GMWAD w) { Name = new GMString(binaryReader); SpriteIndex = binaryReader.ReadInt32(); Sprite = null; if (SpriteIndex > -1) { Sprite = w.Sprites.Items[SpriteIndex]; } Visible = ReadBool(binaryReader); Solid = ReadBool(binaryReader); Depth = binaryReader.ReadInt32(); Persistent = ReadBool(binaryReader); ParentIndex = binaryReader.ReadInt32(); Parent = null; MaskIndex = binaryReader.ReadInt32(); Mask = null; if (MaskIndex > -1) { Mask = w.Sprites.Items[MaskIndex]; } // It's a list with list with GMGMLEvents................... // yoyo nahooya tak hard blyat? int count = binaryReader.ReadInt32(); Debug.Assert(count == 12); // on PSP it should be 12. Events = new List <List <GMGMLEvent> >(count); long mprev_addr = binaryReader.BaseStream.Position; // Thanks to colinator27 for telling me how that works. for (int i = 0; i < count; i++) { uint e_addr = binaryReader.ReadUInt32(); long prev_addr = binaryReader.BaseStream.Position; binaryReader.BaseStream.Position = e_addr; int count2 = binaryReader.ReadInt32(); List <GMGMLEvent> l = new List <GMGMLEvent>(count2); for (int j = 0; j < count2; j++) { uint e_addr2 = binaryReader.ReadUInt32(); long prev_addr2 = binaryReader.BaseStream.Position; binaryReader.BaseStream.Position = e_addr2; int key = binaryReader.ReadInt32(); // subtype data???? var ev = new GMGMLEvent(binaryReader); ev.Key = key; l.Add(ev); binaryReader.BaseStream.Position = prev_addr2; } binaryReader.BaseStream.Position = prev_addr; Events.Add(l); } binaryReader.BaseStream.Position = mprev_addr; }
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 GMTimeline(BinaryReader binaryReader) { Name = new GMString(binaryReader); MomentCount = binaryReader.ReadInt32(); Moments = new List <GMTimelineMoment>(MomentCount); for (int m = 0; m < MomentCount; m++) { var moment = new GMTimelineMoment(); moment.Point = binaryReader.ReadInt32(); // moment point uint e_addr = binaryReader.ReadUInt32(); // pointer to Event? long prev_addr = binaryReader.BaseStream.Position; // save current pos binaryReader.BaseStream.Position = e_addr; // set pos to Event pointer moment.Event = new GMGMLEvent(binaryReader); // read Event binaryReader.BaseStream.Position = prev_addr; // set pos back Moments.Add(moment); } }
public GMString DefineString(string content) { var list = ((GMChunkSTRG)Chunks["STRG"]).List; foreach (GMString str in list) { if (str.Content == content) { return(str); } } GMString res = new GMString(); res.Content = content; list.Add(res); return(res); }
public GMBackground(BinaryReader binaryReader, GMWAD w) { Name = new GMString(binaryReader); Transparent = ReadBool(binaryReader); Smooth = ReadBool(binaryReader); Preload = ReadBool(binaryReader); uint tpag_addr = binaryReader.ReadUInt32(); if (tpag_addr != 0) { long prev_addr = binaryReader.BaseStream.Position; binaryReader.BaseStream.Position = tpag_addr; Texture = new GMTPAGEntry(binaryReader, w); binaryReader.BaseStream.Position = prev_addr; } else { Texture = null; } }
public GMPath(BinaryReader binaryReader) { Name = new GMString(binaryReader); SmoothKind = ReadBool(binaryReader); Closed = ReadBool(binaryReader); Precision = binaryReader.ReadInt32(); PointsCount = binaryReader.ReadInt32(); if (PointsCount != 0) { Points = new List <GMPathPoint>(PointsCount); for (int p = 0; p < PointsCount; p++) { var point = new GMPathPoint(binaryReader); Points.Add(point); } } else { Points = null; } }
public void Unserialize(GMDataReader reader) { Name = reader.ReadStringPointerObject(); Value = reader.ReadStringPointerObject(); }
public void Unserialize(GMDataReader reader) { Name = reader.ReadStringPointerObject(); TextureItem = reader.ReadPointer <GMTextureItem>(); }
public GMScript(string name, string code) { Name = new GMString(name); Code = new GMString(code); }
public GMScript(BinaryReader binaryReader) { Name = new GMString(binaryReader); Code = new GMString(binaryReader); }
public GMRoom(BinaryReader binaryReader, GMWAD ww) { Name = new GMString(binaryReader); Caption = new GMString(binaryReader); Width = binaryReader.ReadInt32(); Height = binaryReader.ReadInt32(); Speed = binaryReader.ReadInt32(); Persistent = ReadBool(binaryReader); Color = new GMColor(binaryReader.ReadUInt32()); ShowColor = ReadBool(binaryReader); CreationCode = new GMString(binaryReader); EnableViews = ReadBool(binaryReader); var bg_ptr = binaryReader.ReadUInt32(); var bg_prev_addr = binaryReader.BaseStream.Position; binaryReader.BaseStream.Position = bg_ptr; //Read backgrounds here var bg_count = binaryReader.ReadInt32(); Backgrounds = new List <GMRoomBackground>(bg_count); for (int bg = 0; bg < bg_count; bg++) { var bg_bg_ptr = binaryReader.ReadUInt32(); var bg_bg_prev_addr = binaryReader.BaseStream.Position; binaryReader.BaseStream.Position = bg_bg_ptr; Backgrounds.Add(new GMRoomBackground(binaryReader, ww)); binaryReader.BaseStream.Position = bg_bg_prev_addr; } binaryReader.BaseStream.Position = bg_prev_addr; var vi_ptr = binaryReader.ReadUInt32(); var vi_prev_addr = binaryReader.BaseStream.Position; binaryReader.BaseStream.Position = vi_ptr; //Read Views here var vi_count = binaryReader.ReadInt32(); Views = new List <GMRoomView>(vi_count); for (int vi = 0; vi < vi_count; vi++) { var vi_vi_ptr = binaryReader.ReadUInt32(); var vi_vi_prev_addr = binaryReader.BaseStream.Position; binaryReader.BaseStream.Position = vi_vi_ptr; Views.Add(new GMRoomView(binaryReader, ww)); binaryReader.BaseStream.Position = vi_vi_prev_addr; } binaryReader.BaseStream.Position = vi_prev_addr; var in_ptr = binaryReader.ReadUInt32(); var in_prev_addr = binaryReader.BaseStream.Position; binaryReader.BaseStream.Position = in_ptr; //Read Room Instances here var in_count = binaryReader.ReadInt32(); Instances = new List <GMRoomInstance>(in_count); for (int ins = 0; ins < in_count; ins++) { var in_in_ptr = binaryReader.ReadUInt32(); var in_in_prev_addr = binaryReader.BaseStream.Position; binaryReader.BaseStream.Position = in_in_ptr; Instances.Add(new GMRoomInstance(binaryReader, ww)); binaryReader.BaseStream.Position = in_in_prev_addr; } binaryReader.BaseStream.Position = in_prev_addr; var ti_ptr = binaryReader.ReadUInt32(); var ti_prev_addr = binaryReader.BaseStream.Position; binaryReader.BaseStream.Position = ti_ptr; //Read Room Tiles here var ti_count = binaryReader.ReadInt32(); Tiles = new List <GMRoomTile>(ti_count); for (int ti = 0; ti < ti_count; ti++) { var ti_ti_ptr = binaryReader.ReadUInt32(); var ti_ti_prev_addr = binaryReader.BaseStream.Position; binaryReader.BaseStream.Position = ti_ti_ptr; Tiles.Add(new GMRoomTile(binaryReader, ww)); binaryReader.BaseStream.Position = ti_ti_prev_addr; } binaryReader.BaseStream.Position = ti_prev_addr; }
public override void Unserialize(GMDataReader reader) { base.Unserialize(reader); DisableDebug = reader.ReadBoolean(); FormatID = reader.ReadByte(); reader.VersionInfo.FormatID = FormatID; Unknown = reader.ReadInt16(); Filename = reader.ReadStringPointerObject(); Config = reader.ReadStringPointerObject(); LastObjectID = reader.ReadInt32(); LastTileID = reader.ReadInt32(); GameID = reader.ReadInt32(); LegacyGUID = new Guid(reader.ReadBytes(16).Memory.ToArray()); GameName = reader.ReadStringPointerObject(); Major = reader.ReadInt32(); Minor = reader.ReadInt32(); Release = reader.ReadInt32(); Build = reader.ReadInt32(); reader.VersionInfo.SetNumber(Major, Minor, Release, Build); DefaultWindowWidth = reader.ReadInt32(); DefaultWindowHeight = reader.ReadInt32(); Info = (InfoFlags)reader.ReadUInt32(); LicenseCRC32 = reader.ReadInt32(); LicenseMD5 = reader.ReadBytes(16); Timestamp = reader.ReadInt64(); DisplayName = reader.ReadStringPointerObject(); ActiveTargets = reader.ReadInt64(); FunctionClassifications = (FunctionClassification)reader.ReadUInt64(); SteamAppID = reader.ReadInt32(); if (FormatID >= 14) { DebuggerPort = reader.ReadInt32(); } int count = reader.ReadInt32(); RoomOrder = new List <int>(count); for (int i = 0; i < count; i++) { RoomOrder.Add(reader.ReadInt32()); } if (reader.VersionInfo.Major >= 2) { // Begin parsing random UID, and verify it based on original algorithm GMS2_RandomUID = new List <long>(); Random random = new Random((int)(Timestamp & 4294967295L)); long firstRandom = (long)random.Next() << 32 | (long)random.Next(); if (reader.ReadInt64() != firstRandom) { reader.Warnings.Add(new GMWarning("Unexpected random UID", GMWarning.WarningLevel.Info)); } long infoNumber = Timestamp - 1000; ulong temp = (ulong)infoNumber; temp = ((temp << 56 & 18374686479671623680UL) | (temp >> 8 & 71776119061217280UL) | (temp << 32 & 280375465082880UL) | (temp >> 16 & 1095216660480UL) | (temp << 8 & 4278190080UL) | (temp >> 24 & 16711680UL) | (temp >> 16 & 65280UL) | (temp >> 32 & 255UL)); infoNumber = (long)temp; infoNumber ^= firstRandom; infoNumber = ~infoNumber; infoNumber ^= ((long)GameID << 32 | (long)GameID); infoNumber ^= ((long)(DefaultWindowWidth + (int)Info) << 48 | (long)(DefaultWindowHeight + (int)Info) << 32 | (long)(DefaultWindowHeight + (int)Info) << 16 | (long)(DefaultWindowWidth + (int)Info)); infoNumber ^= FormatID; int infoLocation = Math.Abs((int)(Timestamp & 65535L) / 7 + (GameID - DefaultWindowWidth) + RoomOrder.Count) % 4; for (int i = 0; i < 4; i++) { if (i == infoLocation) { long curr = reader.ReadInt64(); GMS2_RandomUID.Add(curr); if (curr != infoNumber) { reader.Warnings.Add(new GMWarning("Unexpected random UID info", GMWarning.WarningLevel.Info)); } } else { int first = reader.ReadInt32(); int second = reader.ReadInt32(); if (first != random.Next()) { reader.Warnings.Add(new GMWarning("Unexpected random UID", GMWarning.WarningLevel.Info)); } if (second != random.Next()) { reader.Warnings.Add(new GMWarning("Unexpected random UID", GMWarning.WarningLevel.Info)); } GMS2_RandomUID.Add((long)(first << 32) | (long)second); } } // Other GMS2-specific data GMS2_FPS = reader.ReadSingle(); GMS2_AllowStatistics = reader.ReadWideBoolean(); GMS2_GameGUID = new Guid(reader.ReadBytes(16).Memory.ToArray()); } }
public override void ReadItem(BinaryReader binaryReader) { var s = new GMString(binaryReader); Output.Print("dump string: " + s.Content); }