/// <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);
        }
Example #2
0
        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());
     }
 }
Example #4
0
        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;
        }
Example #5
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);
        }
Example #6
0
 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);
     }
 }
Example #7
0
        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);
        }
Example #8
0
        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;
            }
        }
Example #9
0
 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;
     }
 }
Example #10
0
 public void Unserialize(GMDataReader reader)
 {
     Name  = reader.ReadStringPointerObject();
     Value = reader.ReadStringPointerObject();
 }
Example #11
0
 public void Unserialize(GMDataReader reader)
 {
     Name        = reader.ReadStringPointerObject();
     TextureItem = reader.ReadPointer <GMTextureItem>();
 }
Example #12
0
 public GMScript(string name, string code)
 {
     Name = new GMString(name);
     Code = new GMString(code);
 }
Example #13
0
 public GMScript(BinaryReader binaryReader)
 {
     Name = new GMString(binaryReader);
     Code = new GMString(binaryReader);
 }
Example #14
0
        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());
            }
        }
Example #16
0
        public override void ReadItem(BinaryReader binaryReader)
        {
            var s = new GMString(binaryReader);

            Output.Print("dump string: " + s.Content);
        }