Ejemplo n.º 1
0
        public XtraListChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            Remnants.Enqueue(input.ReadInt32());

            int xtraCount = input.ReadInt32();

            for (int i = 0; i < xtraCount; i++)
            {
                long xtraEndOffset = input.Position + input.ReadInt32() + 4;

                int  unk2 = input.ReadInt32();
                int  unk3 = input.ReadInt32(); //Flags or just booleans?
                Guid guid = new Guid(input.ReadBytes(16));

                int[] offsets = new int[input.ReadInt16() + 1];
                for (int j = 0; j < offsets.Length; j++)
                {
                    offsets[j] = input.ReadInt32();
                }

                do
                {
                    byte unk4 = input.ReadByte(); // 1 when kind = URL
                    byte kind = input.ReadByte(); // 2 -> Name | 0 -> URL, 5 -> File, x32 ?!? no idea

                    string str = input.ReadString();
                    input.ReadByte();
                }while (input.Position != xtraEndOffset);
            }
        }
Ejemplo n.º 2
0
        public ScriptChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            input.IsBigEndian = true;

            Remnants.Enqueue(input.ReadInt32());
            Remnants.Enqueue(input.ReadInt32());

            input.ReadInt32();
            input.ReadInt32();

            input.ReadInt16();
            ScriptNumber = input.ReadInt16();

            Remnants.Enqueue(input.ReadInt16());
            Remnants.Enqueue(input.ReadBEInt32()); // -1
            Remnants.Enqueue(input.ReadBEInt32()); // 0
            Remnants.Enqueue(input.ReadBEInt32());
            Remnants.Enqueue(input.ReadBEInt32()); // 0

            BehaviourScript = input.ReadInt32();   //enum, Behav=0, Global=2

            Remnants.Enqueue(input.ReadInt32());
            Remnants.Enqueue(input.ReadInt16()); //scriptId

            Remnants.Enqueue(input.ReadBEInt16());

            Pool = new LingoValuePool(this, ref input);
        }
Ejemplo n.º 3
0
        public LingoScriptChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            input.IsBigEndian = true;

            input.ReadInt32();
            input.ReadInt32();

            input.ReadInt32();
            input.ReadInt32();

            input.ReadInt16();
            ScriptNumber = input.ReadInt16();

            Remnants.Enqueue(input.ReadInt16());
            input.ReadBEInt32();
            input.ReadBEInt32();
            Remnants.Enqueue(input.ReadBEInt32());
            input.ReadBEInt32();

            Type = input.ReadInt32(); //TODO: enum, Behav=0, Global=2

            Remnants.Enqueue(input.ReadInt32());
            CastMemberRef = input.ReadInt16();     //scriptId

            Remnants.Enqueue(input.ReadBEInt16()); //factoryNameId?

            Pool = new LingoValuePool(this, ref input);
        }
Ejemplo n.º 4
0
        public override void WriteBodyTo(ShockwaveWriter output)
        {
            const short HEADER_LENGTH = 92;

            output.Write(0);
            output.Write(0);

            output.Write(HEADER_LENGTH + Pool.GetBodySize());
            output.Write(HEADER_LENGTH + Pool.GetBodySize());

            output.Write(HEADER_LENGTH);
            output.Write(ScriptNumber);

            output.Write((short)Remnants.Dequeue());
            output.WriteBE(-1);
            output.WriteBE(0);
            output.WriteBE((int)Remnants.Dequeue());
            output.WriteBE(0);

            output.Write(Type);

            output.Write((int)Remnants.Dequeue());
            output.Write(CastMemberRef);

            output.WriteBE((short)Remnants.Dequeue());

            Pool.WriteTo(output);
        }
Ejemplo n.º 5
0
        public ScriptContextChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            Remnants.Enqueue(input.ReadInt32());
            Remnants.Enqueue(input.ReadInt32());

            Sections = new List <ScriptContextSection>(input.ReadInt32());
            input.ReadInt32();

            short entryOffset = input.ReadInt16();

            input.ReadInt16();

            Remnants.Enqueue(input.ReadInt32()); //0
            Type = input.ReadInt32();            //TODO: Enum
            Remnants.Enqueue(input.ReadInt32());

            NameListChunkId = input.ReadInt32();

            ValidCount  = input.ReadInt16(); //validCount - tremor "length"
            Flags       = input.ReadInt16(); //TODO: 1, 5
            FreeChunkId = input.ReadInt16();

            input.Position = entryOffset;

            for (int i = 0; i < Sections.Capacity; i++)
            {
                Sections.Add(new ScriptContextSection(ref input));
            }
        }
        public override void WriteBodyTo(ShockwaveWriter output)
        {
            const short ENTRY_OFFSET = 48;

            output.Write(0);
            output.Write(0);
            output.Write(Sections.Count);
            output.Write(Sections.Count);

            output.Write(ENTRY_OFFSET);
            output.Write(SECTION_SIZE);

            output.Write(0);
            output.Write(Type);
            output.Write((int)Remnants.Dequeue());

            output.Write(NameChunkId);

            output.Write(ValidCount);
            output.Write(Flags);
            output.Write(FreeChunkId);

            foreach (LingoContextSection section in Sections)
            {
                section.WriteTo(output);
            }
        }
Ejemplo n.º 7
0
        public HFloorItem(HPacket packet)
            : base(packet)
        {
            Id = packet.ReadInt32();
            TypeId = packet.ReadInt32();

            var tile = new HPoint(packet.ReadInt32(), packet.ReadInt32());
            Facing = (HDirection)packet.ReadInt32();

            tile.Z = double.Parse(packet.ReadUTF8(), CultureInfo.InvariantCulture);
            Tile = tile;

            Remnants.Enqueue(packet.ReadUTF8());
            Remnants.Enqueue(packet.ReadInt32());

            Category = packet.ReadInt32();
            Stuff = ReadData(packet, Category);

            SecondsToExpiration = packet.ReadInt32();
            UsagePolicy = packet.ReadInt32();

            OwnerId = packet.ReadInt32();
            if (TypeId < 0)
            {
                Remnants.Enqueue(packet.ReadUTF8());
            }
        }
Ejemplo n.º 8
0
        public override void WriteBodyTo(ShockwaveWriter output)
        {
            const short HEADER_LENGTH = 92;

            output.WriteBigEndian((int)Remnants.Dequeue());
            output.WriteBigEndian((int)Remnants.Dequeue());

            output.WriteBigEndian(HEADER_LENGTH + Pool.GetBodySize());
            output.WriteBigEndian(HEADER_LENGTH + Pool.GetBodySize());

            output.WriteBigEndian(HEADER_LENGTH);
            output.WriteBigEndian(ScriptNumber);

            output.WriteBigEndian((short)Remnants.Dequeue());
            output.Write((int)Remnants.Dequeue());
            output.Write((int)Remnants.Dequeue());
            output.Write((int)Remnants.Dequeue());
            output.Write((int)Remnants.Dequeue());

            output.WriteBigEndian(BehaviourScript);

            output.WriteBigEndian((int)Remnants.Dequeue());
            output.WriteBigEndian((short)Remnants.Dequeue());

            output.Write((short)Remnants.Dequeue());

            Pool.WriteTo(output);
        }
Ejemplo n.º 9
0
        public HItem(HPacket packet)
            : base(packet)
        {
            Remnants.Enqueue(packet.ReadInt32());

            string unknown1 = packet.ReadUTF8();

            Remnants.Enqueue(unknown1);

            Id     = packet.ReadInt32();
            TypeId = packet.ReadInt32();
            Remnants.Enqueue(packet.ReadInt32());

            Category = packet.ReadInt32();
            Stuff    = ReadData(packet, Category);

            IsGroupable = packet.ReadBoolean();
            Remnants.Enqueue(packet.ReadBoolean());
            Remnants.Enqueue(packet.ReadBoolean());
            Remnants.Enqueue(packet.ReadBoolean());
            SecondsToExpiration = packet.ReadInt32();

            HasRentPeriodStarted = packet.ReadBoolean();
            RoomId = packet.ReadInt32();

            if (unknown1 == "S")
            {
                SlotId = packet.ReadUTF8();
                Remnants.Enqueue(packet.ReadInt32());
            }
        }
Ejemplo n.º 10
0
        public ScriptContextChunk(ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            Remnants.Enqueue(input.ReadBigEndian <int>());
            Remnants.Enqueue(input.ReadBigEndian <int>());

            int entryCount = input.ReadBigEndian <int>();

            input.ReadBigEndian <int>();

            short entryOffset = input.ReadBigEndian <short>(); //TODO: Research

            input.ReadBigEndian <short>();

            Remnants.Enqueue(input.ReadBigEndian <int>()); //0
            Type = input.ReadBigEndian <int>();            //TODO: Enum
            Remnants.Enqueue(input.ReadBigEndian <int>());

            NameListChunkId = input.ReadBigEndian <int>();

            Remnants.Enqueue(input.ReadBigEndian <short>()); //validCount
            Remnants.Enqueue(input.ReadBytes(2));            //flags, short?
            Remnants.Enqueue(input.ReadBigEndian <short>()); //freePtr

            input.Position = Header.Offset + entryOffset;

            Sections = new List <ScriptContextSection>(entryCount);
            for (int i = 0; i < entryCount; i++)
            {
                Sections.Add(new ScriptContextSection(input));
            }
        }
Ejemplo n.º 11
0
        public override void WriteBodyTo(ShockwaveWriter output)
        {
            const short ENTRY_OFFSET = 48;

            output.WriteBigEndian((int)Remnants.Dequeue());
            output.WriteBigEndian((int)Remnants.Dequeue());
            output.WriteBigEndian(Sections?.Count ?? 0); //TODO:
            output.WriteBigEndian(Sections?.Count ?? 0); //TODO:

            output.WriteBigEndian(ENTRY_OFFSET);
            output.WriteBigEndian(SECTION_SIZE);

            output.WriteBigEndian((int)Remnants.Dequeue());
            output.WriteBigEndian(Type);
            output.WriteBigEndian((int)Remnants.Dequeue());

            output.WriteBigEndian(NameListChunkId);

            output.WriteBigEndian((short)Remnants.Dequeue());
            output.Write((byte[])Remnants.Dequeue());
            output.WriteBigEndian((short)Remnants.Dequeue());

            foreach (ScriptContextSection section in Sections)
            {
                section.WriteTo(output);
            }
        }
Ejemplo n.º 12
0
        public HEntity(HPacket packet)
            : base(packet)
        {
            Id       = packet.ReadInt32();
            Name     = packet.ReadUTF8();
            Motto    = packet.ReadUTF8();
            FigureId = packet.ReadUTF8();
            Index    = packet.ReadInt32();

            Tile = new HPoint(packet.ReadInt32(), packet.ReadInt32(),
                              double.Parse(packet.ReadUTF8(), CultureInfo.InvariantCulture));

            Remnants.Enqueue(packet.ReadInt32());
            EntityType = packet.ReadInt32();

            switch (EntityType)
            {
            case 1:
            {
                Gender = (HGender)packet.ReadUTF8().ToLower()[0];
                Remnants.Enqueue(packet.ReadInt32());
                Remnants.Enqueue(packet.ReadInt32());
                FavoriteGroup = packet.ReadUTF8();
                Remnants.Enqueue(packet.ReadUTF8());
                Remnants.Enqueue(packet.ReadInt32());
                Remnants.Enqueue(packet.ReadBoolean());
                break;
            }

            case 2:
            {
                Remnants.Enqueue(packet.ReadInt32());
                Remnants.Enqueue(packet.ReadInt32());
                Remnants.Enqueue(packet.ReadUTF8());
                Remnants.Enqueue(packet.ReadInt32());
                Remnants.Enqueue(packet.ReadBoolean());
                Remnants.Enqueue(packet.ReadBoolean());
                Remnants.Enqueue(packet.ReadBoolean());
                Remnants.Enqueue(packet.ReadBoolean());
                Remnants.Enqueue(packet.ReadBoolean());
                Remnants.Enqueue(packet.ReadBoolean());
                Remnants.Enqueue(packet.ReadInt32());
                Remnants.Enqueue(packet.ReadUTF8());
                break;
            }

            case 4:
            {
                Remnants.Enqueue(packet.ReadUTF8());
                Remnants.Enqueue(packet.ReadInt32());
                Remnants.Enqueue(packet.ReadUTF8());
                for (int j = packet.ReadInt32(); j > 0; j--)
                {
                    Remnants.Enqueue(packet.ReadUInt16());
                }
                break;
            }
            }
        }
Ejemplo n.º 13
0
        public override void WriteTo(HPacket packet)
        {
            packet.Write((int)Remnants.Dequeue());

            string unknown1 = (string)Remnants.Dequeue();

            packet.Write(unknown1);
        }
Ejemplo n.º 14
0
        public FavoriteColorsChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            Remnants.Enqueue(input.ReadInt32()); //1
            Remnants.Enqueue(input.ReadInt32()); //1

            for (int i = 0; i < Colors.Length; i++)
            {
                Colors[i] = Color.FromArgb(input.ReadByte(), input.ReadByte(), input.ReadByte());
            }
        }
Ejemplo n.º 15
0
        public override void WriteBodyTo(ShockwaveWriter output)
        {
            output.Write((int)Remnants.Dequeue());
            output.Write((int)Remnants.Dequeue());

            foreach (Color color in Colors)
            {
                output.Write(color.R);
                output.Write(color.G);
                output.Write(color.B);
            }
        }
Ejemplo n.º 16
0
        public override void WriteTo(HPacket packet)
        {
            packet.Write(Index);
            packet.Write(Tile.X);
            packet.Write(Tile.Y);
            packet.Write(Tile.Z.ToString(CultureInfo.InvariantCulture));

            packet.Write((int)HeadFacing);
            packet.Write((int)BodyFacing);

            packet.Write((string)Remnants.Dequeue());
        }
Ejemplo n.º 17
0
 public override void WriteBodyTo(ShockwaveWriter output)
 {
     output.WriteBE(MemoryMapOffsets.Length);
     for (int i = 0; i < MemoryMapOffsets.Length; i++)
     {
         output.WriteBE(MemoryMapOffsets[i]);
     }
     output.WriteBE((int)Version);
     output.WriteBE((short)0);
     output.WriteBE((short)0);
     output.WriteBE(0);
     output.WriteBE((int)Remnants.Dequeue());
 }
Ejemplo n.º 18
0
        public ScoreChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            int totalLength = input.ReadInt32();
            int headerType  = input.ReadInt32(); //-3

            int spritePropertiesOffsetThingy = input.ReadInt32();

            int[] spritePropertyOffsets = new int[input.ReadInt32() + 1];

            int notationOffset           = input.ReadInt32() * sizeof(int) + 12 + spritePropertiesOffsetThingy; //..* 4 *..
            int lastSpritePropertyOffset = input.ReadInt32();

            for (int i = 0; i < spritePropertyOffsets.Length; i++)
            {
                spritePropertyOffsets[i] = input.ReadInt32();
            }

            //notationOffset

            int frameEndOffset = input.ReadInt32();

            Remnants.Enqueue(input.ReadInt32());

            Frames = new Frame[input.ReadInt32()];
            short framesType = input.ReadInt16(); //13, 14

            short channelLength  = input.ReadInt16();
            short lastChannelMax = input.ReadInt16(); //1006
            short lastChannel    = input.ReadInt16();

            for (int i = 0; i < Frames.Length; i++)
            {
                Frames[i] = new Frame(ref input);
            }

            int[] spritePropertyOffsetIndices = new int[input.ReadInt32()];
            for (int i = 0; i < spritePropertyOffsetIndices.Length; i++)
            {
                spritePropertyOffsetIndices[i] = input.ReadInt32();
            }

            SpriteProperties[] spriteProperties = new SpriteProperties[spritePropertyOffsetIndices.Length];
            for (int i = 0; i < spritePropertyOffsetIndices.Length; i++)
            {
                int spritePropertyOffset = spritePropertyOffsets[spritePropertyOffsetIndices[i]];

                input.Position      = notationOffset + spritePropertyOffset;
                spriteProperties[i] = new SpriteProperties(ref input);
            }
        }
Ejemplo n.º 19
0
        public ScoreChunk(ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            int totalLength = input.ReadBigEndian <int>();
            int headerType  = input.ReadBigEndian <int>(); //-3

            int spritePropertiesOffsetThingy = input.ReadBigEndian <int>();

            int[] spritePropertyOffsets = new int[input.ReadBigEndian <int>() + 1];

            int notationOffset           = input.ReadBigEndian <int>() * 4 + 12 + spritePropertiesOffsetThingy;
            int lastSpritePropertyOffset = input.ReadBigEndian <int>();

            for (int i = 0; i < spritePropertyOffsets.Length; i++)
            {
                spritePropertyOffsets[i] = input.ReadBigEndian <int>();
            }

            Debug.Assert(input.Position == (Header.Offset + notationOffset), "What");

            int frameEndOffset = input.ReadBigEndian <int>();

            Remnants.Enqueue(input.ReadBigEndian <int>());

            Frames = new Frame[input.ReadBigEndian <int>()];
            short framesType = input.ReadBigEndian <short>(); //13, 14

            short channelLength  = input.ReadBigEndian <short>();
            short lastChannelMax = input.ReadBigEndian <short>(); //1006
            short lastChannel    = input.ReadBigEndian <short>();

            for (int i = 0; i < Frames.Length; i++)
            {
                Frames[i] = new Frame(input);
            }

            int[] spritePropertyOffsetIndices = new int[input.ReadBigEndian <int>()];
            for (int i = 0; i < spritePropertyOffsetIndices.Length; i++)
            {
                spritePropertyOffsetIndices[i] = input.ReadBigEndian <int>();
            }

            SpriteProperties[] spriteProperties = new SpriteProperties[spritePropertyOffsetIndices.Length];
            for (int i = 0; i < spritePropertyOffsetIndices.Length; i++)
            {
                int spritePropertyOffset = spritePropertyOffsets[spritePropertyOffsetIndices[i]];

                input.Position      = Header.Offset + notationOffset + spritePropertyOffset;
                spriteProperties[i] = new SpriteProperties(input);
            }
        }
Ejemplo n.º 20
0
        public override void WriteBodyTo(ShockwaveWriter output)
        {
            output.Write((byte)0);
            output.Write7BitEncodedInt((int)Remnants.Dequeue());
            //TODO: Wrap dat compressor
            output.Write7BitEncodedInt((int)Remnants.Dequeue());
            output.Write7BitEncodedInt((int)Remnants.Dequeue());

            output.Write7BitEncodedInt(Entries.Length);
            foreach (var entry in Entries)
            {
                entry.WriteTo(output);
            }
        }
Ejemplo n.º 21
0
 public InitialMapChunk(ref ShockwaveReader input, ChunkHeader header)
     : base(header)
 {
     MemoryMapOffsets = new int[input.ReadBEInt32()];
     for (int i = 0; i < MemoryMapOffsets.Length; i++)
     {
         MemoryMapOffsets[i] = input.ReadBEInt32();
     }
     Version = (DirectorVersion)input.ReadBEInt32();
     input.ReadBEInt16();
     input.ReadBEInt16(); //TODO: verify, note: what the hell is going on, how I didn't notice these before
     input.ReadBEInt32();
     Remnants.Enqueue(input.ReadBEInt32());
 }
Ejemplo n.º 22
0
 public override void WriteBodyTo(ShockwaveWriter output)
 {
     output.Write((short)Remnants.Dequeue());
     output.Write(ENTRY_SIZE);
     output.Write(Entries.Length); //TODO: I GUESS
     output.Write(Entries.Length);
     output.Write(LastJunkId);
     output.Write((int)Remnants.Dequeue());
     output.Write(LastFreeId);
     for (int i = 0; i < Entries.Length; i++)
     {
         output.Write(Entries[i]);
     }
 }
Ejemplo n.º 23
0
        public override void WriteBodyTo(ShockwaveWriter output)
        {
            output.Write((int)Type);
            output.Write(Common.GetBodySize()); //TODO:
            output.Write(Properties.GetBodySize());

            output.Write((int)Remnants.Dequeue());
            output.Write((int)Remnants.Dequeue());
            output.Write((int)Remnants.Dequeue());
            output.Write((int)Remnants.Dequeue());
            output.Write((int)Remnants.Dequeue());

            Common.WriteTo(output); //TODO:
            Properties.WriteTo(output);
        }
Ejemplo n.º 24
0
        public override void WriteBodyTo(ShockwaveWriter output)
        {
            output.WriteBigEndian((int)Remnants.Dequeue());
            output.WriteBigEndian((int)Remnants.Dequeue());

            output.WriteBigEndian(Entries.Count);

            output.WriteBigEndian((int)Remnants.Dequeue());
            output.WriteBigEndian((int)Remnants.Dequeue());

            for (int i = 0; i < Entries.Count; i++)
            {
                output.WriteBigEndian(Entries[i]);
            }
        }
Ejemplo n.º 25
0
        public AfterburnerMapChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            input.ReadByte();
            Remnants.Enqueue(input.Read7BitEncodedInt());

            using var deflaterInput = CreateDeflateReader(ref input);
            Remnants.Enqueue(deflaterInput.Read7BitEncodedInt());
            Remnants.Enqueue(deflaterInput.Read7BitEncodedInt());

            Entries = new AfterBurnerMapEntry[deflaterInput.Read7BitEncodedInt()];
            for (int i = 0; i < Entries.Length; i++)
            {
                Entries[i] = new AfterBurnerMapEntry(deflaterInput);
            }
        }
Ejemplo n.º 26
0
        public override void WriteBodyTo(ShockwaveWriter output)
        {
            output.WriteBE(ENTRIES_OFFSET);
            output.WriteBE(ENTRY_SIZE);

            output.WriteBE(Entries.Length); //TODO: I GUESS
            output.WriteBE(Entries.Length);

            output.WriteBE(LastJunkId);
            output.WriteBE((int)Remnants.Dequeue());
            output.WriteBE(LastFreeId);
            foreach (var entry in Entries)
            {
                entry.WriteTo(output);
            }
        }
Ejemplo n.º 27
0
        public CastMemberPropertiesChunk(ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            Type = (CastType)input.ReadBigEndian <int>();
            input.ReadBigEndian <int>();
            int dataLength = input.ReadBigEndian <int>();

            Remnants.Enqueue(input.ReadBigEndian <int>());
            Remnants.Enqueue(input.ReadBigEndian <int>());
            Remnants.Enqueue(input.ReadBigEndian <int>());
            Remnants.Enqueue(input.ReadBigEndian <int>());
            Remnants.Enqueue(input.ReadBigEndian <int>());

            Common     = new CommonMemberProperties(input);
            Properties = ReadTypeProperties(input, dataLength);
        }
Ejemplo n.º 28
0
        public override void WriteBodyTo(ShockwaveWriter output)
        {
            output.Write((int)Remnants.Dequeue());

            output.Write(Height);
            output.Write(Width);
            output.Write((short)Display);
            output.Write(GridColor);

            output.Write((short)Guides.Length);
            output.Write(GuideColor);
            foreach (Guide guide in Guides)
            {
                guide.WriteTo(output);
            }
        }
Ejemplo n.º 29
0
        public SortOrderChunk(ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            Remnants.Enqueue(input.ReadBigEndian <int>());
            Remnants.Enqueue(input.ReadBigEndian <int>());

            Entries = new List <int>(input.ReadBigEndian <int>());

            Remnants.Enqueue(input.ReadBigEndian <int>());
            Remnants.Enqueue(input.ReadBigEndian <int>());

            for (int i = 0; i < Entries.Capacity; i++)
            {
                Entries.Add(input.ReadBigEndian <int>());
            }
        }
Ejemplo n.º 30
0
        public GridChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            Remnants.Enqueue(input.ReadInt32());

            Width     = input.ReadInt16();
            Height    = input.ReadInt16();
            Display   = (GridDisplay)input.ReadInt16();
            GridColor = input.ReadInt16();

            Guides     = new Guide[input.ReadInt16()];
            GuideColor = input.ReadInt16();
            for (int i = 0; i < Guides.Length; i++)
            {
                Guides[i] = new Guide(ref input);
            }
        }