Esempio n. 1
0
        public static byte[] Compress(ByteArrayStream target)
        {
            if (target.Address != 0)
            {
                throw new ArgumentException($"{nameof(target)} address must be 0");
            }
            if (target.Size % 2 != 0)
            {
                throw new ArgumentException($"size is wrong ({target.Size.ToString("x2")}), {nameof(target)} needs to be in 2 byte chunks (words)");
            }

            var output = new List <byte>(target.Size / 2);

            while (!target.AtEnd)
            {
                var low  = target.Byte();
                var high = target.Byte();

                if ((low & 0x07) != low)
                {
                    throw new Exception($"{nameof(low)} byte should be lower three bits only. value: ${low.ToString("x2")}  address: ${(target.Address - 2).ToString("x2")}");
                }
                if ((high & 0x07) != low)
                {
                    throw new Exception($"{nameof(high)} byte should be lower three bits only. value: ${high.ToString("x2")}  address: ${(target.Address - 1).ToString("x2")}");
                }

                var data = (byte)(low + (high << 4));
                output.Add(data);
            }

            return(output.ToArray());
        }
        public static byte[] Compress(ByteArrayStream target)
        {
            if (target.Address != 0)
            {
                throw new ArgumentException($"{nameof(target)} address must be 0");
            }
            if (target.Size % 0x20 != 0)
            {
                throw new ArgumentException($"size is wrong ({target.Size.ToString("x2")}), {nameof(target)} needs to be in full $20 byte chunks");
            }

            var output = new List <byte>(target.Size * 3 / 4);

            while (!target.AtEnd)
            {
                output.Add(target.Byte());

                if ((target.Address % 0x20) >= 0x10)
                {
                    var zero = target.Byte();

                    if (zero != 0)
                    {
                        throw new Exception($"byte should be zero. value: ${zero.ToString("x2")}  address: ${(target.Address - 1).ToString("x4")}");
                    }
                }
            }

            return(output.ToArray());
        }
Esempio n. 3
0
    public void FileDownloadItem()
    {
        var fileId     = GenerateFileId();
        var readStream = new ByteArrayStream(128 * 1024);

        var client = new Client(KTestHost, KTestPort);

        client.Connect();

        client.BeginTransaction(fileId);
        client.Upload(FileType.Asset, readStream);
        client.EndTransaction();
        Thread.Sleep(50); // give the server a little time to finish the transaction

        var targetFile   = Path.GetTempFileName();
        var downloadItem = new FileDownloadItem(fileId, FileType.Asset, targetFile);

        var       mre = new ManualResetEvent(false);
        Exception err = null;

        client.DownloadFinished += (sender, args) =>
        {
            try
            {
                Assert.AreEqual(DownloadResult.Success, args.Result);
                Assert.AreEqual(args.DownloadItem.Id, fileId);
                Assert.IsTrue(File.Exists(targetFile));

                var fileBytes = File.ReadAllBytes(targetFile);
                Assert.IsTrue(Util.ByteArraysAreEqual(readStream.BackingBuffer, fileBytes));
            }
            catch (Exception e)
            {
                err = e;
            }
            finally
            {
                if (File.Exists(targetFile))
                {
                    File.Delete(targetFile);
                }

                mre.Set();
            }
        };

        client.QueueDownload(downloadItem);
        Assert.IsTrue(mre.WaitOne(2000));

        if (err != null)
        {
            throw err;
        }
    }
Esempio n. 4
0
        public MetaTileDefinition(ByteArrayStream source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            TopLeft     = new BGMapEntry(source.Word());
            TopRight    = new BGMapEntry(source.Word());
            BottomLeft  = new BGMapEntry(source.Word());
            BottomRight = new BGMapEntry(source.Word());
        }
Esempio n. 5
0
        public static string AttemptTranslate(ByteArrayStream stream, int depthLeft = 2)
        {
            var code = stream.Byte();

            if (code >= 0x80)
            {
                return(BasicTable.Lookup(code));
            }

            if (code < 0x30)
            {
                if (code == 0x01)
                {
                    return($"{{windowbreak}}");
                }
                if (code == 0x05)
                {
                    return($"{{05:{stream.Byte().ToString("x2")}}}");
                }
                if (code == 0x1b)
                {
                    return($"{{swapspeaker:{stream.Byte().ToString("x2")}}}");
                }
                if (code == 0x1d)
                {
                    return($"{{character:{CharacterNames.GetString(stream.Byte())}}}");
                }
                if (code == 0x1e)
                {
                    return($"{{item:{ItemNames.GetString(stream.Byte())}}}");
                }
                if (code == 0x1f)
                {
                    return($"{{location:{LocationNames.GetString(stream.Byte())}}}");
                }
                //if (code == 0x2f) {
                //	return $"{{if:{stream.Byte().ToString("x2")} {stream.Byte().ToString("x2")} {stream.Byte().ToString("x2")}}}";
                //}


                return($"{{{code.ToString("x2")}}}");
            }

            if (depthLeft == 0)
            {
                return($"{{{code.ToString("x2")}}}");
            }

            //var text = string.Join("", LookupBytes(code).Select(x => AttemptTranslate(x, depthLeft - 1)));
            var text = AttemptTranslateLine(LookupBytes(code), depthLeft - 1);

            return(text);
        }
Esempio n. 6
0
        public static byte[] Decompress(ByteArrayStream source, int compressedSize)
        {
            var output = new List <byte>(compressedSize * 2);

            for (int i = 0; i < compressedSize; i++)
            {
                var data = source.Byte();
                output.Add((byte)(data & 0x07));
                output.Add((byte)((data >> 4) & 0x07));
            }

            return(output.ToArray());
        }
Esempio n. 7
0
        public bool Open(string filename, out PlayerData playerData)
        {
            playerData = null;

            if (String.IsNullOrEmpty(filename))
            {
                return(false);
            }

            using (var stream = new ByteArrayStream(File.ReadAllBytes(filename)))
            {
                return(OpenFromByteArrayStream(stream, out playerData));
            }
        }
Esempio n. 8
0
        public static string AttemptTranslateLine(ByteArrayStream stream)
        {
            var line = new List <string>();

            while (stream.ByteAt(0) != BasicTable.EndOfString)
            {
                line.Add(AttemptTranslate(stream));
            }

            var text = string.Join("", line);

            stream.Byte();

            return(text);
        }
Esempio n. 9
0
    public void UploadDownloadOne()
    {
        var fileId     = GenerateFileId();
        var readStream = new ByteArrayStream(16 * 1024);

        var client = new Client(KTestHost, KTestPort);

        client.Connect();

        client.BeginTransaction(fileId);
        client.Upload(FileType.Asset, readStream);
        client.EndTransaction();
        Thread.Sleep(50); // give the server a little time to finish the transaction

        var downloadItem = new TestDownloadItem(fileId, FileType.Asset);

        client.QueueDownload(downloadItem);

        Exception err = null;
        var       mre = new ManualResetEvent(false);

        client.DownloadFinished += (sender, args) =>
        {
            try
            {
                Assert.AreEqual(0, args.DownloadQueueLength);
                Assert.AreEqual(DownloadResult.Success, args.Result);
                Assert.AreEqual(fileId, args.DownloadItem.Id);
            }
            catch (Exception e)
            {
                err = e;
            }
            finally
            {
                mre.Set();
            }
        };

        Assert.IsTrue(mre.WaitOne(2000));

        if (err != null)
        {
            throw err;
        }

        Assert.IsTrue(Util.ByteArraysAreEqual(readStream.BackingBuffer, downloadItem.Bytes));
    }
Esempio n. 10
0
    public void TransactionIsolation()
    {
        var fileId     = GenerateFileId();
        var readStream = new ByteArrayStream(16 * 1024);

        var client = new Client(KTestHost, KTestPort);

        client.Connect();

        Assert.Throws <TransactionIsolationException>(() => client.Upload(FileType.Asset, readStream));
        Assert.Throws <TransactionIsolationException>(() => client.EndTransaction());

        // Back-to-back begin transactions are allowed
        client.BeginTransaction(fileId);
        Assert.DoesNotThrow(() => client.BeginTransaction(fileId));
    }
Esempio n. 11
0
        public static byte[] Decompress(ByteArrayStream source, int outputSize)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            var          output   = new ByteArrayStream(outputSize);
            var          work     = new ByteRingBuffer(RingSize, StartWriteAddress);
            Queue <bool> commands = source.Byte().ToBooleanQueue();

            while (output.HasSpace)
            {
                if (commands.Count == 0)
                {
                    commands = source.Byte().ToBooleanQueue();
                }

                if (commands.Dequeue())
                {
                    var b = source.Byte();

                    work.Byte(b);
                    output.Byte(b);
                }
                else
                {
                    var d1 = source.Byte();
                    var d2 = source.Byte();

                    var address    = d1 + ((d2 << 2) & 0x0300);
                    var counter    = (d2 & 0x3f) + 3;
                    var copySource = work.Branch(address);

                    while (output.HasSpace && (counter != 0))
                    {
                        var copy = copySource.Byte();
                        counter--;

                        work.Byte(copy);
                        output.Byte(copy);
                    }
                }
            }

            return(output.Buffer);
        }
Esempio n. 12
0
        public static ObjectSchemaTemplateInfo FromBinary(Byte[] Bytes)
        {
            XElement x;

            using (ByteArrayStream s = new ByteArrayStream(Bytes))
            {
                using (var sr = Txt.CreateTextReader(s.AsNewReading(), TextEncoding.Default, true))
                {
                    x = TreeFile.ReadFile(sr);
                }
            }

            XmlSerializer xs = new XmlSerializer();
            var           t  = xs.Read <ObjectSchemaTemplate>(x);
            var           ti = new ObjectSchemaTemplateInfo(t);

            return(ti);
        }
Esempio n. 13
0
        static List <string> FindInRom(byte[] searchTerm, int dataOffset, int dataLength)
        {
            var spots =
                new ByteArrayStream(Rom.ROM)
                .FindAll(searchTerm)
                .Select(x => new {
                Address     = x.Address + Rom.AddressOffset,
                DataAddress = x.Address + Rom.AddressOffset + dataOffset,
                Data        = x.GetBytes(dataLength, x.Address + dataOffset)
            });

            var lines =
                spots
                .Select(x =>
                        $"{x.Address.ToString("x6", CultureInfo.InvariantCulture)} -- {x.DataAddress.ToString("x6", CultureInfo.InvariantCulture)} -- {string.Join(" ", x.Data.Select(y => y.ToString("x2", CultureInfo.InvariantCulture)))}"
                        );

            return(lines.ToList());
        }
Esempio n. 14
0
        public static string AttemptTranslateLine(byte[] input, int depthLeft = 3)
        {
            var line   = new List <string>();
            var stream = new ByteArrayStream(input);

            while (!stream.AtEnd)
            {
                line.Add(AttemptTranslate(stream, depthLeft));
            }

            var text = string.Join("", line);

            if (!stream.AtEnd)
            {
                stream.Byte();
            }

            return(text);
        }
        public static byte[] Decompress(ByteArrayStream source, int compressedSize)
        {
            if (compressedSize % 0x18 != 0)
            {
                throw new ArgumentException($"{nameof(compressedSize)} is wrong ({compressedSize.ToString("x2")}), {nameof(source)} needs to be in full $18 byte chunks");
            }

            var output = new List <byte>(compressedSize * 4 / 3);

            for (int i = 0; i < compressedSize; i++)
            {
                output.Add(source.Byte());

                // skip a byte in destination
                if ((i % 0x18) >= 0x10)
                {
                    output.Add(0);
                }
            }

            return(output.ToArray());
        }
        private static ScriptGraphNode CreateNode(ScriptNodeData data)
        {
            ScriptGraphNode node;
            ByteArrayStream stream = new ByteArrayStream(data.serialData);

            switch (data.type)
            {
            case NodeType.Root:
            {
                node = new RootNode();
            }
            break;

            case NodeType.Message:
            {
                node = new MessageNode();
                var temp = node as MessageNode;
                temp.text = stream.ReadString();
            }
            break;

            case NodeType.Branch:
            {
                node = new BranchNode();
                var temp = node as BranchNode;
                temp.flag = stream.ReadBool();
            }
            break;

            case NodeType.None:
            default:
                node = null;
                break;
            }

            SetCommonData(node, data);

            return(node);
        }
Esempio n. 17
0
    public void ResetDownloadFinishedEventHandler()
    {
        var fileId     = GenerateFileId();
        var readStream = new ByteArrayStream(16 * 1024);

        var client = new Client(KTestHost, KTestPort);

        client.Connect();

        client.BeginTransaction(fileId);
        client.Upload(FileType.Asset, readStream);
        client.EndTransaction();
        Thread.Sleep(50);

        var downloadItem = new TestDownloadItem(fileId, FileType.Asset);

        // Add two listeners that will assert if called
        client.DownloadFinished += (sender, args) => { Debug.Assert(false); };
        client.DownloadFinished += (sender, args) => { Debug.Assert(false); };

        // Clear the listeners so they will not be called
        client.ResetDownloadFinishedEventHandler();

        client.QueueDownload(downloadItem);

        var mre = new ManualResetEvent(false);

        ThreadPool.QueueUserWorkItem(state =>
        {
            while (client.DownloadQueueLength > 0)
            {
                Thread.Sleep(0);
            }

            mre.Set();
        });

        Assert.IsTrue(mre.WaitOne(2000));
    }
        public static (byte[] comp, byte[] decomp) DecompressFull(ByteArrayStream source, int outputSize)
        {
            var startAddress     = source.Address;
            var dataSourceOffset = source.Word();
            var dataSource       = source.Branch(source.Address + dataSourceOffset);

            var output = new ByteArrayStream(outputSize);

            byte command;

            while ((command = source.Byte()) != 0x00)
            {
                if ((command & 0x0f) != 0)
                {
                    var length = command & 0x0f;
                    dataSource.CopyTo(output, length);
                }

                if ((command & 0xf0) != 0)
                {
                    var length = ((command & 0xf0) >> 4) + 2;

                    var address = output.Address - source.Byte() - 1;
                    if (address < 0)
                    {
                        throw new IndexOutOfRangeException($"{nameof(address)} cannot be less than 0");
                    }

                    output.Branch(address).CopyTo(output, length);
                }
            }

            var comp   = source.GetBytes(dataSource.Address - startAddress, startAddress);
            var decomp = output.GetBytes(output.Address, 0);

            return(comp, decomp);
        }
        public static ScriptNodeData Serialize(ScriptGraphNode node)
        {
            ScriptNodeData data = new ScriptNodeData();

            data.id     = node.id;
            data.type   = node.Type;
            data.outIds = node.outIds.ToArray();
            data.rect   = node.GetPosition();

            ByteArrayStream stream = new ByteArrayStream();

            switch (node.Type)
            {
            case NodeType.Root:
                break;

            case NodeType.Message:
                Serialize(node as MessageNode, ref stream);
                break;

            case NodeType.Branch:
                Serialize(node as BranchNode, ref stream);
                break;

            case NodeType.None:
            default:
            {
                Debug.LogError("Invalid Node Type :" + node.Type.ToString());
            }
            break;
            }

            data.serialData = stream.GetBuffer();

            return(data);
        }
Esempio n. 20
0
        public static void Go()
        {
            var rom = FFMQ.Game.Rom;
            //0B81A5 $AD $91 $0E     LDA $0E91 [010E91] = $0D        A:400D X:182E Y:0080 S:1FC8 D:0000 DB:01 P:nvMxdizc V:30  H:166
            var start = 0x0d;             // byte

            start *= 2;

            Console.WriteLine($"{nameof(start)} == {start.ToString("x2")}");
            //0B81AF $BF $3B $AF $07 LDA $07AF3B,X[07AF55] = $0234  A: 001A X:001A Y:0080 S: 1FC8 D:0000 DB: 01 P: nvmxdizc V:30  H: 192
            var lookup_07af3b = rom.GetStream(0x07af3b);
            var offset        = lookup_07af3b.WordAt(start);

            Console.WriteLine($"{nameof(offset)} == {offset.ToString("x4")}");

            //0B81BC $BF $13 $B0 $07 LDA $07B013,X[07B247] = $07    A: 0234 X: 0234 Y: 0000 S: 1FC8 D:0000 DB: 01 P: nvMxdiZc V:30  H: 229
            //0B81C0 $99 $10 $19     STA $1910,Y[011910] = $00      A: 0207 X: 0234 Y: 0000 S: 1FC8 D:0000 DB: 01 P: nvMxdizc V:30  H: 239
            //0B81C3 $E8 INX                             A: 0207 X: 0234 Y: 0000 S: 1FC8 D:0000 DB: 01 P: nvMxdizc V:30  H: 249
            //0B81C4 $C8 INY                             A: 0207 X: 0235 Y: 0000 S: 1FC8 D:0000 DB: 01 P: nvMxdizc V:30  H: 252
            //0B81C5 $C0 $07 $00     CPY #$0007                      A:0207 X:0235 Y:0001 S:1FC8 D:0000 DB:01 P:nvMxdizc V:30  H:256
            var optionsLookup = rom.GetStream(0x07b013);

            // $1910 - $1916
            // $1910 is index into tilemap data
            // $1911 is index into bg tile graphics data
            // $1912 is index into color palettes
            var options = optionsLookup.GetBytesAt(7, offset);

            Console.WriteLine($"{nameof(options)} == {options.ToHexString()}");



            //; multiply(lower six bits of $1910) * 3
            //0b850e sep #$20
            //0b8510 lda $1910
            //0b8513 and #$3f
            //0b8515 sta $4202
            //0b8518 lda #$03
            //0b851a sta $4203

            //; get multiply result
            //0b8526 ldx $4216

            var mapDataOffsetIndex = (options[0] & 0x3f) * 3;

            Console.WriteLine($"{nameof(mapDataOffsetIndex)} == {mapDataOffsetIndex.ToString("x4")}");

            var mapDataOffsetLookup = rom.GetStream(0x0b8735);


            //; store source data lookup address, long, at $0900 => value at $0b8735,x
            //0b8529 rep #$20
            //0b852b lda $0b8735,x
            //0b852f sta $0900
            //0b8532 sep #$20
            //0b8534 lda $0b8737,x
            //0b8538 sta $0902

            var mapDataOffset = mapDataOffsetLookup.LongAt(mapDataOffsetIndex);

            Console.WriteLine($"{nameof(mapDataOffset)} == {mapDataOffset.ToString("x4")}");

            // $1000 seems to be the largest map, but using $2000 for now
            var(tilemapcomp, tilemapdecomp) = SimpleTailWindowCompression.DecompressFull(rom.GetStream(mapDataOffset), 0x2000);


            Utilities.WriteBytesToFile(tilemapcomp, @"c:\working\ffmq\~go! -- comp.txt");
            Utilities.WriteBytesToFile(tilemapdecomp, @"c:\working\ffmq\~go! -- decomp.txt");



            // $19b7
            var bgGraphicsOffsetsIndex = options[1] * 0x0a;
            var lookup_0b8cd9          = rom.GetStream(0x0b8cd9);

            // $1918 - $1921
            // $1918 is ???
            // $1919 is color data index to
            // $191a to $1921 are bg tile graphics offsets
            var x1918 = lookup_0b8cd9.GetBytesAt(0x0a, bgGraphicsOffsetsIndex);



            // TODO: clean up data access, this is awkward
            // bgTileIndexes is $191a to $1921
            var bgTileIndexes          = new ByteArrayStream(x1918, 2);
            var bgTileData             = rom.GetStream(0x058c80);
            var bgTilePaletteIndexData = rom.GetStream(0x05f280);

            var bgTileSets = new List <BgTileSetEntry>();

            while (!bgTileIndexes.AtEnd)
            {
                var bgTileIndex = bgTileIndexes.Byte();

                // $300 is $20 tiles of $18 bytes
                var tileDataAddressOffset = 0x300 * bgTileIndex;
                var tileData = ExpandSecondHalfWithZeros.Decompress(bgTileData.GetBytes(0x300, tileDataAddressOffset));

                // $10 is $20 tiles, each a nibble
                var paletteAddress = 0x10 * bgTileIndex;
                var palette        = ExpandNibblesMasked.Decompress(bgTilePaletteIndexData.GetBytes(0x10, paletteAddress));

                bgTileSets.Add(new BgTileSetEntry {
                    TileDataAddress     = bgTileData.Address + tileDataAddressOffset,
                    PaletteIndexAddress = bgTilePaletteIndexData.Address + paletteAddress,
                    TileData            = tileData,
                    PaletteIndex        = palette
                });
            }



            Console.ReadKey();
        }
 public static byte[] Decompress(ByteArrayStream source, int outputSize)
 {
     var(comp, decomp) = DecompressFull(source, outputSize);
     return(decomp);
 }
Esempio n. 22
0
        private void saveJF3D(OpenGLModel model, IOStream os)
        {
            baos = new ByteArrayStream();
            tmp  = new byte[8];
            int size;

            writeuint32(MAGIC);
            writeuint32(VERSION);
            writeuint32(ID_MODEL);
            size = 0;
            int tcnt = model.textures.Size();

            for (int a = 0; a < tcnt; a++)
            {
                size += model.textures.Get(a).Length + 1;
            }
            writeuint32(size);
            writeuint32(tcnt);
            for (int a = 0; a < tcnt; a++)
            {
                writeString(model.textures.Get(a));
            }
            for (int o = 0; o < model.ol.Size(); o++)
            {
                OpenGLObject obj = model.ol.Get(o);
                writeuint32(ID_OBJECT);
                int vcnt = obj.GetVertexCount() * 3;
                int pcnt = obj.GetPolyCount();
                size = obj.GetName().Length + 1 + 4 + (4 * 3) + (4 + (vcnt * 4)) + (4 + (pcnt * 4));
                writeuint32(size);
                writeString(obj.GetName());
                writeuint32(obj.GetType());
                writefloat(obj.GetOrigin().x);
                writefloat(obj.GetOrigin().y);
                writefloat(obj.GetOrigin().z);
                writeuint32(vcnt / 3);
                float[] xyz = obj.GetVertexBuffer();
                for (int a = 0; a < vcnt; a++)
                {
                    writefloat(xyz[a]);
                }
                switch (obj.GetType())
                {
                case GL_TRIANGLES:
                    writeuint32(pcnt / 3);
                    break;

                case GL_QUADS:
                    writeuint32(pcnt / 4);
                    break;
                }
                int[] pts = obj.GetPolyBuffer();
                for (int a = 0; a < pcnt; a++)
                {
                    writeuint32(pts[a]);
                }
                int maps = obj.GetUVMaps().Size();
                if (maps == 0)
                {
                    Console.WriteLine("GL_JF3D:Warning:No UVMaps found for object:" + obj.GetName());
                }
                for (int m = 0; m < maps; m++)
                {
                    OpenGLUVMap map = obj.GetUVMaps().Get(m);
                    writeuint32(ID_UVMAP);
                    int uvcnt = map.GetUVCount() * 2;
                    size = map.GetName().Length + 1 + 4 + (4 + (uvcnt * 4));
                    writeuint32(size);
                    writeString(map.GetName());
                    writeuint32(map.GetTextureIndex());
                    writeuint32(uvcnt / 2);
                    float[] uv = map.GetBuffer();
                    for (int a = 0; a < uvcnt; a++)
                    {
                        writefloat(uv[a]);
                    }
                }
            }
            os.Write(baos.GetData().ToArray());
        }
Esempio n. 23
0
        public bool Save(string filename, PlayerData playerData)
        {
            ByteArrayStream stream = new ByteArrayStream();

            stream.WriteString("PTFF", 4);

            byte version = playerData.Version;

            stream.WriteByte(version);

            stream.WriteByte(0); // ??

            stream.WriteUShort(playerData.TickPerMinute);
            stream.WriteFloat(playerData.Tempo);

            UInt16 trackCount = playerData.Tracks.Count;

            stream.WriteUShort(trackCount);
            stream.writeUInt(playerData.HeaderEndTick);
            stream.WriteFloat(playerData.TrackDuration);

            ushort insCount = (ushort)(playerData.Instruments.Count - 1);

            stream.WriteUShort(insCount);

            for (int i = 0, l = playerData.Instruments.Count; i < l; i++)
            {
                InstrumentData ins = playerData.Instruments[i];
                if (ins != null && ins.InsNum != 0)
                {
                    if (version == 1)
                    {
                        stream.WriteUShort(ins.InsNum);
                        stream.WriteUShort(0);
                    }
                    else
                    {
                        stream.WriteByte((byte)ins.InsNum);
                        stream.WriteByte(0);
                    }

                    stream.WriteString(ins.Name, 0x40);
                }
            }

            int eventSize = version == 1 ? 0x10 : 0x0B;

            foreach (TrackData track in playerData.Tracks)
            {
                stream.writeUInt(EZTR);

                int eventsCount = track.Events.Count();
                int endTick     = 0;
                if (eventsCount > 0)
                {
                    endTick = track.Events.Max(evnt => evnt.Tick);
                }

                uint blockSize = (uint)(eventsCount * eventSize);

                stream.WriteString("", 0x02); // unknown

                stream.WriteString(track.TrackName, 0x40);

                stream.writeInt(endTick);
                stream.writeUInt(blockSize);

                if (version == 1)
                {
                    stream.WriteUShort(0); // Unknown
                }

                foreach (EventData evnt in track.Events)
                {
                    stream.writeInt(evnt.Tick);
                    stream.WriteByte((byte)evnt.EventType);

                    switch (evnt.EventType)
                    {
                    case EventType.Volume:
                    {
                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }

                        stream.WriteByte(evnt.Volume);
                        stream.WriteByte(0);

                        stream.WriteByte(0);
                        stream.WriteByte(0);

                        stream.WriteByte(0);
                        stream.WriteByte(0);

                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }
                    }
                    break;

                    case EventType.Note:
                    {
                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }

                        ushort insno = 0;

                        if (evnt.Instrument != null)
                        {
                            insno = evnt.Instrument.InsNum;
                        }

                        if (version == 1)
                        {
                            stream.WriteUShort(insno);
                        }
                        else
                        {
                            stream.WriteByte((byte)insno);
                        }

                        stream.WriteByte(evnt.Vel);
                        stream.WriteByte(evnt.Pan);

                        stream.WriteByte(evnt.Attribute);
                        stream.WriteUShort(evnt.Duration);

                        if (version == 1)
                        {
                            stream.WriteByte(0);
                        }
                    }
                    break;

                    case EventType.Tempo:

                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }

                        stream.Write(BitConverter.GetBytes(evnt.Tempo));

                        stream.WriteByte(0);
                        stream.WriteByte(0);

                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }

                        break;

                    case EventType.Beat:

                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }

                        stream.WriteUShort(evnt.Beat);

                        stream.WriteByte(0);
                        stream.WriteByte(0);

                        stream.WriteByte(0);
                        stream.WriteByte(0);

                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }

                        break;

                    default:
                    {
                    }
                    break;
                    }
                }
            }

            byte[] ptffData = stream.GetData();

            int sizeIn = ptffData.Count();

            if (m_settingsDialog.EncryptFile /*playerData.Encrypted*/)
            {
                ptffData = EncryptDataOnline(ptffData);
                if (ptffData == null || sizeIn != ptffData.Count())
                {
                    return(false);
                }
            }

            File.WriteAllBytes(filename, ptffData);

            return(true);
        }
Esempio n. 24
0
        public static Dictionary <String, TableVal> LoadPartialData(Schema s, String[] DataDirs, Firefly.Mapping.Binary.BinarySerializer bs)
        {
            var Entities = s.Types.Where(t => t.OnEntity).Select(t => t.Entity).ToList();
            var DuplicatedCollectionNames = Entities.GroupBy(e => e.CollectionName).Where(g => g.Count() > 1).Select(g => g.Key).ToList();

            if (DuplicatedCollectionNames.Count > 0)
            {
                throw new InvalidOperationException("DuplicatedCollectionNames: {0}".Formats(String.Join(" ", DuplicatedCollectionNames)));
            }
            var CollectionNameToEntity = Entities.ToDictionary(e => e.CollectionName, StringComparer.OrdinalIgnoreCase);
            var EntityNameToEntity     = Entities.ToDictionary(e => e.Name, StringComparer.OrdinalIgnoreCase);

            var SchemaHash = s.Hash();

            var Files = new Dictionary <String, Byte[]>();

            foreach (var DataDirOrMemoryDatabaseFile in DataDirs)
            {
                foreach (var f in Directory.GetFiles(DataDirOrMemoryDatabaseFile, "*.tree", SearchOption.AllDirectories).OrderBy(ff => ff, StringComparer.OrdinalIgnoreCase))
                {
                    Files.Add(f, File.ReadAllBytes(f));
                }
            }
            var Forests = Files.AsParallel().Select(p =>
            {
                using (var bas = new ByteArrayStream(p.Value))
                {
                    using (var sr = Txt.CreateTextReader(bas.AsNewReading(), Firefly.TextEncoding.TextEncoding.Default))
                    {
                        return(TreeFile.ReadDirect(sr, p.Key, new TreeFormatParseSetting(), new TreeFormatEvaluateSetting()).Value.Nodes);
                    }
                }
            }).ToList();

            var Tables = new Dictionary <String, List <Node> >();

            foreach (var Forest in Forests)
            {
                foreach (var n in Forest)
                {
                    if (!n.OnStem)
                    {
                        continue;
                    }
                    var Name = n.Stem.Name;
                    if (CollectionNameToEntity.ContainsKey(Name))
                    {
                        Name = CollectionNameToEntity[Name].Name;
                    }
                    if (!Tables.ContainsKey(Name))
                    {
                        Tables.Add(Name, new List <Node>());
                    }
                    var t = Tables[Name];
                    t.AddRange(n.Stem.Children);
                }
            }

            var rvts        = new RelationValueTreeSerializer(s);
            var TableValues = new Dictionary <String, TableVal>(StringComparer.OrdinalIgnoreCase);

            foreach (var p in Tables)
            {
                var EntityName = p.Key;
                var e          = EntityNameToEntity[EntityName];
                var tv         = rvts.ReadTable(p.Value, e);
                TableValues.Add(EntityName, tv);
            }

            return(TableValues);
        }
        public static byte[] Compress(ByteArrayStream target)
        {
            var commands = new List <byte>();
            var data     = new List <byte>();
            var copyData = 0;

            while (!target.AtEnd)
            {
                var term       = target.GetBytes(0x11);
                var copyOutput = 0;
                var copyOffset = -1;

                while (term.Length >= 3)
                {
                    var(found, address) = target.FindLastInWindow(term, target.Address - 256, target.Address + term.Length - 1);

                    if (found)
                    {
                        copyOutput = term.Length - 2;
                        copyOffset = target.Address - address - 1;
                        break;
                    }

                    term = target.GetBytes(term.Length - 1);
                }

                if (copyOutput == 0)
                {
                    if (copyData == 0xf)
                    {
                        commands.Add((byte)copyData);
                        copyData = 1;
                    }
                    else
                    {
                        copyData++;
                    }
                    data.Add(target.Byte());
                }
                else
                {
                    commands.Add((byte)((copyOutput << 4) + copyData));
                    commands.Add((byte)copyOffset);
                    copyData        = 0;
                    target.Address += term.Length;
                }
            }

            // Add last copy data command
            if (copyData != 0)
            {
                commands.Add((byte)copyData);
            }

            // Add terminating command
            commands.Add(0);

            var output = new ByteArrayStream(commands.Count + data.Count + 2);

            var dataOffset = commands.Count;

            if (dataOffset > 0xffff)
            {
                throw new Exception($"{nameof(dataOffset)} cannot be larger than 0xffff. {nameof(commands)} is too large");
            }

            output.Word((ushort)dataOffset);
            output.Write(commands);
            output.Write(data);

            return(output.Buffer);
        }
 private static void Serialize(BranchNode node, ref ByteArrayStream stream)
 {
     stream.WriteBool(node.flag);
 }
Esempio n. 27
0
        /// <summary>
        /// Deserialize a message from the stream.
        /// </summary>
        /// <param name="networkClient">The network client to deserialize the message from.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>The message that was deserialized.</returns>
        public async Task <IMessage> DeserializeAsync(INetworkClient networkClient, CancellationToken cancellationToken = default(CancellationToken))
        {
            var stream = new ByteArrayStream(await networkClient.ReadDotBlockAsync(cancellationToken).ConfigureAwait(false));

            return(new TextMessage(stream));
        }
Esempio n. 28
0
        private bool OpenFromByteArrayStream(ByteArrayStream stream, out PlayerData playerData)
        {
            playerData = null;

            if (stream == null)
            {
                return(false);
            }

            playerData = new PlayerData();

            var instruments = playerData.Instruments;
            var tracks      = playerData.Tracks;
            var sign        = stream.ReadUInt(); // zero??
            var num         = stream.ReadUInt();
            var pos         = stream.ReadUInt();

            stream.Seek(num);

            var insCnt        = stream.ReadUShort();
            var trackCnt      = (byte)stream.ReadUShort();
            var tickPerMinute = stream.ReadUShort();
            var tempo         = stream.ReadFloat();
            var tick1         = stream.ReadUInt();

            playerData.HeaderEndTick = tick1;
            var playTime = stream.ReadFloat();
            var endTick  = stream.ReadUInt();

            stream.ReadUInt();

            playerData.Encrypted     = true;
            playerData.Version       = 1;
            playerData.TrackDuration = playTime;
            playerData.TickPerMinute = tickPerMinute;
            playerData.Tempo         = tempo;
            playerData.HeaderEndTick = endTick;

            stream.Seek(8);

            instruments.Add(new InstrumentData()
            {
                InsNum = 0,
                Name   = "none"
            });

            for (int i = 0; i < insCnt; i++)
            {
                ushort insNo = stream.ReadUShort();
                stream.Skip(1);
                string oggName = stream.ReadString(0x40);

                if (m_settingsDialog.RenameInst)
                {
                    oggName = oggName.Replace(".wav", ".ogg");
                }

                instruments.Add(new InstrumentData()
                {
                    InsNum = insNo,
                    Name   = oggName,
                });
            }

            for (byte trackIdx = 0; (int)trackIdx < (int)trackCnt; ++trackIdx)
            {
                stream.Skip(2);
                var trackName = stream.ReadString(0x40);
                stream.Skip(4);

                var track = new TrackData(trackIdx)
                {
                    TrackName = trackName,
                };

                tracks.AddTrack(track);

                var eventsCount = (ushort)stream.ReadUInt();
                for (ushort index = 0; (int)index < (int)eventsCount; ++index)
                {
                    uint tick      = stream.ReadUInt();
                    byte eventCode = stream.ReadByte();

                    switch (eventCode)
                    {
                    case 1:
                    {         // Note
                        var insNo     = stream.ReadUShort();
                        var vel       = stream.ReadByte();
                        var pan       = stream.ReadByte();
                        var attribute = stream.ReadByte();
                        var duration  = stream.ReadUShort();
                        stream.Skip(1);


                        InstrumentData inst =
                            playerData.Instruments.SingleOrDefault(ins => ins.InsNum == insNo);

                        EventData newEvent = new EventData()
                        {
                            TrackId    = trackIdx,
                            Tick       = (int)tick,
                            Attribute  = attribute,
                            Duration   = duration,
                            EventType  = EventType.Note,
                            Instrument = inst,
                            Vel        = vel,
                            Pan        = pan
                        };

                        track.AddEvent(newEvent);
                    }
                    break;

                    case 2:
                    {
                        var volume = stream.ReadByte();
                        stream.Skip(7);

                        var newEvent = new EventData()
                        {
                            TrackId   = trackIdx,
                            Tick      = (int)tick,
                            EventType = EventType.Volume,
                            Volume    = volume
                        };

                        track.AddEvent(newEvent);
                    }
                    break;

                    case 3:
                    {
                        var tempo2 = stream.ReadFloat();
                        stream.Skip(4);

                        var newEvent = new EventData()
                        {
                            TrackId   = trackIdx,
                            Tick      = (int)tick,
                            EventType = EventType.Tempo,
                            Tempo     = tempo2
                        };

                        track.AddEvent(newEvent);
                    }
                    break;

                    case 4:
                        stream.Skip(8);
                        break;

                    default:
                        throw new Exception("Failed to read op");
                    }
                }
            }

            return(true);
        }
Esempio n. 29
0
 public VideoFramesFileWriter([NotNull] string fileName, bool compress, long baseTime = 0, int bufferSize = 2048) : base(fileName, bufferSize, baseTime)
 {
     _compress        = compress;
     _byteArrayStream = compress ? new ByteArrayStream(1 << 20) : null;
 }
 private static void Serialize(MessageNode node, ref ByteArrayStream stream)
 {
     stream.WriteString(node.text);
 }