public LingoContextSection(ref ShockwaveReader input)
 {
     Unknown = input.ReadInt32();
     Id      = input.ReadInt32();
     Flags   = (LingoContextSectionFlags)input.ReadInt16();
     Link    = input.ReadInt16();
 }
Example #2
0
        public ScriptChunk(ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            Remnants.Enqueue(input.ReadBigEndian <int>());
            Remnants.Enqueue(input.ReadBigEndian <int>());

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

            input.ReadBigEndian <short>();
            ScriptNumber = input.ReadBigEndian <short>();

            Remnants.Enqueue(input.ReadBigEndian <short>());
            Remnants.Enqueue(input.ReadInt32());           // -1
            Remnants.Enqueue(input.ReadInt32());           // 0
            Remnants.Enqueue(input.ReadInt32());
            Remnants.Enqueue(input.ReadInt32());           // 0

            BehaviourScript = input.ReadBigEndian <int>(); //enum, Behav=0, Global=2

            Remnants.Enqueue(input.ReadBigEndian <int>());
            Remnants.Enqueue(input.ReadBigEndian <short>()); //scriptId

            Remnants.Enqueue(input.ReadInt16());

            Pool = new LingoValuePool(this, input);
        }
Example #3
0
 public ChunkEntry(ShockwaveReader input)
     : this(new ChunkHeader(input))
 {
     Offset  = input.ReadInt32();
     Flags   = (ChunkEntryFlags)input.ReadInt16();
     Unknown = input.ReadInt16();
     Link    = input.ReadInt32();
 }
Example #4
0
        public InitialMapChunk(ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            MemoryMapOffsets = new int[input.ReadInt32()];
            for (int i = 0; i < MemoryMapOffsets.Length; i++)
            {
                MemoryMapOffsets[i] = input.ReadInt32();
            }

            Version = (DirectorVersion)input.ReadInt32();
        }
Example #5
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());
            }
        }
Example #6
0
        public SpriteProperties(ref ShockwaveReader input)
        {
            StartFrame = input.ReadInt32();
            EndFrame   = input.ReadInt32();

            input.ReadInt32();

            Channel = input.ReadInt32();
            SpritePropertiesOffsetsOffset = input.ReadInt32();

            input.Advance(28);
        }
Example #7
0
        public FileInfoChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            /*
             * def parseSubstrings(self, data, hasHeader=True):
             *  if hasHeader:
             *          ci_offset = read32(data)
             *          unk2 = read32(data) # not int!
             *          unk3 = read32(data) # not int!
             *          entryType = read32(data)
             *          data.seek(ci_offset)
             *  else:
             *          unk2 = 0
             *          unk3 = 0
             *          entryType = 0
             *
             *  count = read16(data) + 1
             *  entries = []
             *  for i in range(count):
             *          entries.append(read32(data))
             *  rawdata = data.read(entries[-1])
             *  assert entries[0] == 0
             *  assert entries[-1] == len(rawdata)
             *
             *  strings = []
             *  for i in range(count-1):
             *          strings.append(rawdata[entries[i]:entries[i+1]])
             *
             *  return (strings, unk2, unk3, entryType)
             *
             *
             * */

            BitField = input.ReadBytes(input.ReadInt32()).ToArray();

            Offsets = new List <int>(input.ReadInt16());

            input.ReadByte();

            for (short i = 0; i < Offsets.Capacity; i++)
            {
                Offsets.Add(input.ReadInt32());
            }

            input.ReadByte();
            CreatedBy = input.ReadString();
            input.ReadByte();
            ModifiedBy = input.ReadString();
            input.ReadByte();
            FilePath = input.ReadString();
        }
Example #8
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));
            }
        }
Example #9
0
        public AssociationTableChunk(ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            input.ReadInt16();
            input.ReadInt16();
            CastEntries   = new List <CastEntry>(input.ReadInt32());
            AssignedCount = input.ReadInt32();

            for (int i = 0; i < CastEntries.Capacity; i++)
            {
                CastEntries.Add(new CastEntry(input));
            }

            //CastEntries.RemoveRange(AssignedCount, TotalCount - AssignedCount);
        }
Example #10
0
 public ChunkHeader(ShockwaveReader input)
     : this(input.ReadReversedString(4))
 {
     Length = (IsVariableLength ?
               input.Read7BitEncodedInt() : input.ReadInt32());
     Offset = input.Position;
 }
Example #11
0
        public BitmapCastProperties(ref ShockwaveReader input)
        {
            int v27 = input.ReadUInt16();

            TotalWidth = v27 & 0x7FFF; //TODO: what does that last bit even do.. some sneaky flag?
            //DIRAPI checks if TotalWidth & 0x8000 == 0

            Rectangle      = input.ReadRect();
            AlphaThreshold = input.ReadByte();
            OLE            = input.ReadBytes(7).ToArray();

            RegistrationPoint = input.ReadPoint();

            Flags = (BitmapFlags)input.ReadByte();

            if (!input.IsDataAvailable)
            {
                return;
            }
            BitDepth = input.ReadByte();

            if (!input.IsDataAvailable)
            {
                return;
            }
            Palette = input.ReadInt32();

            //TODO: PaletteRef or something
            if (!IsSystemPalette)
            {
                Palette &= 0x7FFF;
            }
        }
Example #12
0
        public LingoHandler(ScriptChunk script, ref ShockwaveReader input)
            : this(script)
        {
            NameIndex             = input.ReadInt16();
            HandlerVectorPosition = input.ReadInt16();

            Body        = new LingoHandlerBody(this, input);
            _codeOffset = input.ReadInt32();

            Arguments.Capacity = input.ReadInt16();
            _argumentsOffset   = input.ReadInt32();

            Locals.Capacity = input.ReadInt16();
            _localsOffset   = input.ReadInt32();

            short unk1Length = input.ReadInt16();
            int   unk1Offset = input.ReadInt32();

            int unk2Length = input.ReadInt32();
            int unk2Offset = input.ReadInt16();

            BytesPerLine.Capacity = input.ReadInt16();
            _lineOffset           = input.ReadInt32();

            Body.StackHeight = input.ReadInt32();
        }
 public CastAssociationTableChunk(ref ShockwaveReader input, ChunkHeader header)
     : base(header)
 {
     Members = new int[header.Length / sizeof(int)];
     for (int i = 0; i < Members.Length; i++)
     {
         Members[i] = input.ReadInt32();
     }
 }
Example #14
0
        public StyledTextChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            input.IsBigEndian = true;

            input.ReadInt32();
            int textLength = input.ReadInt32();

            input.ReadInt32();

            Text = input.ReadString(textLength);

            Formattings = new TextFormat[input.ReadInt16()];
            for (int i = 0; i < Formattings.Length; i++)
            {
                Formattings[i] = new TextFormat(ref input);
            }
        }
Example #15
0
 public TextFormat(ref ShockwaveReader input)
 {
     Offset   = input.ReadInt32();
     Height   = input.ReadInt16();
     Ascent   = input.ReadInt16();
     FontId   = input.ReadInt16();
     Slant    = input.ReadBoolean();
     Padding  = input.ReadByte();
     FontSize = input.ReadInt16();
     Color    = input.ReadColor();
 }
Example #16
0
        public CastListEntry(ref ShockwaveReader input)
        {
            Name     = input.ReadString();
            FilePath = input.ReadString();

            PreloadSettings = input.ReadInt16();
            MemberMin       = input.ReadInt16();
            MemberCount     = input.ReadInt16();

            Id = input.ReadInt32();
        }
Example #17
0
        public MovieCastListChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            input.IsBigEndian = true;

            input.ReadInt32();
            Entries = new List <CastListEntry>(input.ReadInt32());
            Remnants.Enqueue(input.ReadInt16());

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

            input.ReadInt32();
            for (int i = 0; i < Entries.Capacity; i++)
            {
                Entries.Add(new CastListEntry(ref input));
            }
        }
        public LingoNameChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            input.IsBigEndian = true;

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

            short nameOffset = input.ReadInt16();

            Names = new List <string>(input.ReadInt16());

            input.Position = nameOffset;

            for (int i = 0; i < Names.Capacity; i++)
            {
                Names.Add(input.ReadString());
            }
        }
        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);
        }
Example #20
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);
            }
        }
Example #21
0
        public MemoryMapChunk(ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            Remnants.Enqueue(input.ReadInt16());
            input.ReadInt16();

            int entryCountMax = input.ReadInt32();
            int entryCount    = input.ReadInt32();

            LastJunkId = input.ReadInt32();
            Remnants.Enqueue(input.ReadInt32());
            LastFreeId = input.ReadInt32();

            Entries = new ChunkEntry[entryCount];
            for (int i = 0; i < Entries.Length; i++)
            {
                var entry = new ChunkEntry(input);
                entry.Header.Id = i;

                Entries[i] = entry;
            }
        }
Example #22
0
        public FileInfoChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            input.IsBigEndian = true;

            //TODO: VList
            BitField = input.ReadBytes(input.ReadInt32()).ToArray();

            Offsets = new List <int>(input.ReadInt16());

            input.ReadByte();

            for (short i = 0; i < Offsets.Capacity; i++)
            {
                Offsets.Add(input.ReadInt32());
            }

            input.ReadByte();
            CreatedBy = input.ReadString();
            input.ReadByte();
            ModifiedBy = input.ReadString();
            input.ReadByte();
            FilePath = input.ReadString();
        }
        public LingoHandler(LingoScriptChunk script, ref ShockwaveReader input)
            : this(script)
        {
            NameIndex             = input.ReadInt16();
            HandlerVectorPosition = input.ReadInt16();

            Body = new LingoHandlerBody(this, ref input);
            int codeOffset = input.ReadInt32();

            Arguments.Capacity = input.ReadInt16();
            int argumentsOffset = input.ReadInt32();

            Locals.Capacity = input.ReadInt16();
            int localsOffset = input.ReadInt32();

            input.ReadInt16(); //offset(?)
            input.ReadInt32(); //length(?)

            input.ReadInt32(); //offset?
            input.ReadInt16(); //length?

            BytesPerLine.Capacity = input.ReadInt16();
            int lineOffset = input.ReadInt32();

            Body.StackHeight = input.ReadInt32();

            int handlerEndOffset = input.Position;

            input.Position = codeOffset;
            input.ReadBytes(Body.Code);

            input.Position = argumentsOffset;
            for (int i = 0; i < Arguments.Capacity; i++)
            {
                Arguments.Add(input.ReadInt16());
            }

            input.Position = localsOffset;
            for (int i = 0; i < Locals.Capacity; i++)
            {
                Locals.Add(input.ReadInt16());
            }

            input.Position = lineOffset;
            for (int i = 0; i < BytesPerLine.Capacity; i++)
            {
                BytesPerLine.Add(input.ReadByte());
            }

            input.Position = handlerEndOffset;
        }
        public CastMemberPropertiesChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            input.IsBigEndian = true;

            Type = (CastType)input.ReadInt32();
            input.ReadInt32();
            int dataLength = input.ReadInt32();

            Remnants.Enqueue(input.ReadInt32()); //TOOD: Why is DIRAPI checking this 24/7 if its a constant(?) 0x14
            Remnants.Enqueue(input.ReadInt32());
            Remnants.Enqueue(input.ReadInt32());
            Remnants.Enqueue(input.ReadInt32());
            Remnants.Enqueue(input.ReadInt32());

            Common     = new CommonMemberProperties(ref input);
            Properties = ReadTypeProperties(ref input, dataLength);
        }
Example #25
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);
            }
        }
Example #26
0
        public CommonMemberProperties(ref ShockwaveReader input)
        {
            int[] propertyOffsets = new int[input.ReadInt16() + 1];
            for (int i = 0; i < propertyOffsets.Length; i++)
            {
                propertyOffsets[i] = input.ReadInt32();
            }

            for (int i = 0; i < propertyOffsets.Length - 1; i++)
            {
                int length = propertyOffsets[i + 1] - propertyOffsets[i];
                if (length < 1)
                {
                    continue;
                }

                ReadProperty(ref input, i, length);
            }
        }
Example #27
0
        public void ReadValue(ref ShockwaveReader input, int dataOffset)
        {
            if (Kind != LiteralKind.Integer)
            {
                input.Position = dataOffset + Offset;

                int length = input.ReadInt32();
                Value = Kind switch
                {
                    LiteralKind.String => input.ReadString(length),
                    LiteralKind.FloatingPoint => input.ReadDouble(),
                    LiteralKind.CompiledJavascript => input.ReadBytes(length).ToArray()
                };
            }
            else
            {
                Value = Offset;
            }
        }
Example #28
0
        public static LingoLiteral Read(ref ShockwaveReader input, LiteralKind entryKind, int entryOffset)
        {
            if (entryKind != LiteralKind.Integer)
            {
                input.Position = entryOffset;

                int    length = input.ReadInt32();
                object value  = entryKind switch
                {
                    LiteralKind.String => input.ReadString(length),
                    LiteralKind.FloatingPoint => input.ReadDouble(),
                    LiteralKind.CompiledJavascript => input.ReadBytes(length).ToArray(),

                    _ => throw new ArgumentException(nameof(Kind))
                };

                return(new LingoLiteral(entryKind, value));
            }
            else
            {
                return(new LingoLiteral(LiteralKind.Integer, entryOffset));
            }
        }
Example #29
0
        public ScoreReferenceChunk(ref ShockwaveReader input, ChunkHeader header)
            : base(header)
        {
            input.ReadInt32();
            input.ReadInt32();

            int entryCount = input.ReadInt32();

            input.ReadInt32();

            input.ReadInt16();
            input.ReadInt16();

            Remnants.Enqueue(input.ReadInt32());

            Entries = new Dictionary <short, int>(entryCount);
            for (int i = 0; i < entryCount; i++)
            {
                Entries.Add(input.ReadInt16(), input.ReadInt32());
            }
        }
Example #30
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);
            }
        }