Ejemplo n.º 1
0
        internal override void saveCompact(aBinaryWriter writer)
        {
            base.saveCompact(writer);

            if (mTextureCount > 0)
            {
                bloResource.save(mTextures[0], writer);
            }
            else
            {
                bloResource.save(null, writer);
            }
            bloResource.save(mPalette, writer);

            writer.Write8((byte)mBinding);

            byte bits = 0;

            bits  |= (byte)mWrapS;
            bits <<= 1;
            bits  |= (byte)(mRotate90 ? 1 : 0);
            bits <<= 2;
            bits  |= (byte)mMirror;
            writer.Write8(bits);

            writer.WritePadding(4, 0);

            for (int i = 0; i < 4; ++i)
            {
                writer.Write32(mColors[i].rgba);
            }
        }
Ejemplo n.º 2
0
 public static void save(bloResource resource, aBinaryWriter writer)
 {
     if (resource != null)
     {
         resource.save(writer);
     }
     else
     {
         writer.Write8(0);
         writer.Write8(0);
     }
 }
Ejemplo n.º 3
0
        internal virtual void saveCompact(aBinaryWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }

            writer.Write8((byte)(mVisible ? 1 : 0));
            writer.Write8(0);             // padding
            writer.Write32(mName);
            writer.WriteS16((short)mRect.left);
            writer.WriteS16((short)mRect.top);
            writer.WriteS16((short)mRect.width);
            writer.WriteS16((short)mRect.height);
        }
Ejemplo n.º 4
0
        internal override void saveCompact(aBinaryWriter writer)
        {
            base.saveCompact(writer);

            writer.Write16((ushort)mContentRect.left);
            writer.Write16((ushort)mContentRect.top);
            writer.Write16((ushort)mContentRect.width);
            writer.Write16((ushort)mContentRect.height);

            for (int i = 0; i < 4; ++i)
            {
                bloResource.save(mTextures[i].texture, writer);
            }
            bloResource.save(mPalette, writer);

            byte bits = 0;

            for (int i = 0; i < 4; ++i)
            {
                bits <<= 2;
                bits  |= (byte)mTextures[i].mirror;
            }
            writer.Write8(bits);

            for (int i = 0; i < 4; ++i)
            {
                writer.Write32(mTextures[i].color.rgba);
            }

            writer.WritePadding(4, 0);
        }
Ejemplo n.º 5
0
        void WriteWave(Wave wave)
        {
            mWriter.WriteS32(wave.WaveId);
            mWriter.Write8(0xFF);             // unknown
            mWriter.Write8((byte)wave.Format);
            mWriter.Write8((byte)wave.RootKey);
            mWriter.WritePadding(4, 0);
            mWriter.WriteF32(wave.SampleRate);

            mWriter.WriteS32(wave.WaveStart);
            mWriter.WriteS32(wave.WaveSize);

            if (wave.Loop)
            {
                mWriter.WriteS32(-1);
                mWriter.WriteS32(wave.LoopStart);
                mWriter.WriteS32(wave.LoopEnd);
            }
            else
            {
                mWriter.WriteS32(0);
                mWriter.WriteS32(0);
                mWriter.WriteS32(0);
            }

            mWriter.WriteS32(wave.SampleCount);

            if (wave.Loop)
            {
                mWriter.WriteS16((short)wave.HistoryLast);
                mWriter.WriteS16((short)wave.HistoryPenult);
            }
            else
            {
                mWriter.WriteS16(0);
                mWriter.WriteS16(0);
            }

            mWriter.Write32(0);             // runtime (load-flag pointer)
            mWriter.Write32(0x1D8);         // unknown
        }
Ejemplo n.º 6
0
        internal override void saveCompact(aBinaryWriter writer)
        {
            base.saveCompact(writer);

            bloResource.save(mFont, writer);
            writer.Write32(mTopColor.rgba);
            writer.Write32(mBottomColor.rgba);

            byte binding = 0;

            if (mFont != null)
            {
                binding  |= 1;
                binding <<= 2;
            }
            binding  |= (byte)mHBinding;
            binding <<= 2;
            binding  |= (byte)mVBinding;
            writer.Write8(binding);

            if (mFont != null)
            {
                writer.WriteS16((short)mFontSpacing);
                writer.WriteS16((short)mFontLeading);
                writer.Write16((ushort)mFontWidth);
                writer.Write16((ushort)mFontHeight);
            }

            if (mFont != null)
            {
                var strbuffer = mFont.decodeToBytes(mText);
                writer.Write16((ushort)strbuffer.Length);
                writer.Write8s(strbuffer);
            }
            else
            {
                writer.Write16(0);
            }

            writer.WritePadding(4, 0);
        }
Ejemplo n.º 7
0
        public static void Write24(this aBinaryWriter writer, int value)
        {
            var byte1 = (byte)((value >> 16) & 0xFF);
            var byte2 = (byte)((value >> 8) & 0xFF);
            var byte3 = (byte)(value & 0xFF);

            if (writer.Endianness == Endianness.Big)
            {
                writer.Write8(byte1);
                writer.Write8(byte2);
                writer.Write8(byte3);
            }
            else
            {
                writer.Write8(byte3);
                writer.Write8(byte2);
                writer.Write8(byte1);
            }
        }
Ejemplo n.º 8
0
        void WritePdta()
        {
            mWriter.WriteString("LIST");
            mWriter.WriteS32(CalculatePdtaSize());

            mWriter.WriteString("pdta");

            mWriter.WriteString("phdr");
            mWriter.WriteS32(38);
            mWriter.WriteString("EOP");
            for (var i = 0; i < 35; i++)
            {
                mWriter.WriteS8(0);
            }

            mWriter.WriteString("pbag");
            mWriter.WriteS32(4);
            mWriter.WriteS16(0);
            mWriter.WriteS16(0);

            mWriter.WriteString("pmod");
            mWriter.WriteS32(10);
            for (var i = 0; i < 10; i++)
            {
                mWriter.WriteS8(0);
            }

            mWriter.WriteString("pgen");
            mWriter.WriteS32(4);
            mWriter.WriteS32(0);

            mWriter.WriteString("inst");
            mWriter.WriteS32(22);
            mWriter.WriteString("EOI");
            for (var i = 0; i < 19; i++)
            {
                mWriter.WriteS8(0);
            }

            mWriter.WriteString("ibag");
            mWriter.WriteS32(4);
            mWriter.WriteS16(0);
            mWriter.WriteS16(0);

            mWriter.WriteString("imod");
            mWriter.WriteS32(10);
            for (var i = 0; i < 10; i++)
            {
                mWriter.WriteS8(0);
            }

            mWriter.WriteString("igen");
            mWriter.WriteS32(4);
            mWriter.WriteS32(0);

            mWriter.WriteString("shdr");
            mWriter.WriteS32(CalculateShdrSize());
            int runningSampleTotal = 0;

            foreach (var waveGroup in mWaveBank)
            {
                var archiveNoExtension = Path.GetFileNameWithoutExtension(waveGroup.ArchiveFileName);
                if (archiveNoExtension.Length > 14)
                {
                    archiveNoExtension = archiveNoExtension.Substring(0, 14);
                }

                foreach (var wave in waveGroup)
                {
                    var waveFileName = String.Format("{0}_{1:D5}", archiveNoExtension, wave.WaveId);

                    mWriter.WriteString(waveFileName);
                    for (var i = waveFileName.Length; i < 20; i++)
                    {
                        mWriter.WriteS8(0);
                    }

                    mWriter.WriteS32(runningSampleTotal);
                    mWriter.WriteS32(runningSampleTotal + wave.SampleCount);
                    if (wave.Loop)
                    {
                        mWriter.WriteS32(runningSampleTotal + wave.LoopStart);
                        mWriter.WriteS32(runningSampleTotal + wave.LoopEnd);
                    }
                    else
                    {
                        mWriter.WriteS32(runningSampleTotal);
                        mWriter.WriteS32(runningSampleTotal);
                    }
                    runningSampleTotal += wave.SampleCount + 46;
                    mWriter.WriteS32((int)wave.SampleRate);
                    mWriter.Write8((byte)wave.RootKey);
                    mWriter.WriteS8(0);                     // pitch correction
                    mWriter.WriteS16(0);                    // sample link
                    mWriter.WriteS16(1);                    // sample type
                }
            }
            mWriter.WriteString("EOS");
            for (var i = 0; i < 43; i++)
            {
                mWriter.WriteS8(0);
            }
        }
Ejemplo n.º 9
0
        internal override void saveBlo1(aBinaryWriter writer)
        {
            base.saveBlo1(writer);

            byte numparams;

            if (mToColor.rgba != bloColor.cOne)
            {
                numparams = 17;
            }
            else if (mFromColor.rgba != bloColor.cZero)
            {
                numparams = 16;
            }
            else if (mContentTexture != null)
            {
                numparams = 15;
            }
            else
            {
                numparams = 14;
            }

            writer.Write8(numparams);
            writer.Write16((ushort)mContentRect.left);
            writer.Write16((ushort)mContentRect.top);
            writer.Write16((ushort)mContentRect.width);
            writer.Write16((ushort)mContentRect.height);

            for (int i = 0; i < 4; ++i)
            {
                bloResource.save(mTextures[i].texture, writer);
            }
            bloResource.save(mPalette, writer);

            byte bits = 0;

            for (int i = 0; i < 4; ++i)
            {
                bits <<= 2;
                bits  |= (byte)mTextures[i].mirror;
            }
            writer.Write8(bits);

            for (int i = 0; i < 4; ++i)
            {
                writer.Write32(mTextures[i].color.rgba);
            }

            numparams -= 14;

            if (numparams > 0)
            {
                bloResource.save(mContentTexture, writer);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write32(mFromColor.rgba);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write32(mToColor.rgba);
                --numparams;
            }

            writer.WritePadding(4, 0);
        }
Ejemplo n.º 10
0
        internal override void saveBlo1(aBinaryWriter writer)
        {
            base.saveBlo1(writer);

            byte numparams;

            if (mToColor.rgba != bloColor.cOne)
            {
                numparams = 13;
            }
            else if (mFromColor.rgba != bloColor.cZero)
            {
                numparams = 12;
            }
            else if (mConnectParent)
            {
                numparams = 11;
            }
            else
            {
                numparams = 10;
            }

            writer.Write8(numparams);

            bloResource.save(mFont, writer);
            writer.Write32(mTopColor.rgba);
            writer.Write32(mBottomColor.rgba);

            byte binding = 0;

            binding  |= (byte)mHBinding;
            binding <<= 2;
            binding  |= (byte)mVBinding;
            writer.Write8(binding);

            writer.WriteS16((short)mFontSpacing);
            writer.WriteS16((short)mFontLeading);
            writer.Write16((ushort)mFontWidth);
            writer.Write16((ushort)mFontHeight);

            if (mFont != null)
            {
                var strbuffer = mFont.decodeToBytes(mText);
                writer.Write16((ushort)strbuffer.Length);
                writer.Write8s(strbuffer);
            }
            else
            {
                writer.Write16(0);
            }

            numparams -= 10;

            if (numparams > 0)
            {
                writer.Write8((byte)(mConnectParent ? 1 : 0));
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write32(mFromColor.rgba);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write32(mToColor.rgba);
                --numparams;
            }

            writer.WritePadding(4, 0);
        }
Ejemplo n.º 11
0
 public override void Write(aBinaryWriter writer, string value)
 {
     aError.Check<ArgumentException>(value.Length <= Byte.MaxValue, "String value is too long for a BSTR.", "value");
     writer.Write8((byte)value.Length);
     writer.WriteString(value);
 }
Ejemplo n.º 12
0
        internal override void saveBlo1(aBinaryWriter writer)
        {
            base.saveBlo1(writer);

            byte numparams;

            if (mColors[(int)bloTextureBase.BottomRight].rgba != bloColor.cWhite)
            {
                numparams = 11;
            }
            else if (mColors[(int)bloTextureBase.BottomLeft].rgba != bloColor.cWhite)
            {
                numparams = 10;
            }
            else if (mColors[(int)bloTextureBase.TopRight].rgba != bloColor.cWhite)
            {
                numparams = 9;
            }
            else if (mColors[(int)bloTextureBase.TopLeft].rgba != bloColor.cWhite)
            {
                numparams = 8;
            }
            else if (mToColor.rgba != bloColor.cOne)
            {
                numparams = 7;
            }
            else if (mFromColor.rgba != bloColor.cZero)
            {
                numparams = 6;
            }
            else if (mWrapS != bloWrapMode.None || mWrapT != bloWrapMode.None)
            {
                numparams = 5;
            }
            else if (mMirror != 0 || mRotate90)
            {
                numparams = 4;
            }
            else
            {
                numparams = 3;
            }

            writer.Write8(numparams);
            if (mTextureCount > 0)
            {
                bloResource.save(mTextures[0], writer);
            }
            else
            {
                bloResource.save(null, writer);
            }
            bloResource.save(mPalette, writer);
            writer.Write8((byte)mBinding);

            numparams -= 3;

            if (numparams > 0)
            {
                byte bits = (byte)mMirror;
                if (mRotate90)
                {
                    bits |= 4;
                }
                writer.Write8(bits);
                --numparams;
            }

            if (numparams > 0)
            {
                byte bits = 0;
                bits  |= (byte)mWrapS;
                bits <<= 2;
                bits  |= (byte)mWrapT;
                writer.Write8(bits);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write32(mFromColor.rgba);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write32(mToColor.rgba);
                --numparams;
            }

            for (int i = 0; i < 4; ++i)
            {
                if (numparams > 0)
                {
                    writer.Write32(mColors[i].rgba);
                    --numparams;
                }
            }

            writer.WritePadding(4, 0);
        }
Ejemplo n.º 13
0
        public void save(aBinaryWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }
            // calculate entry shit
            var entryOffset = calculateEntryOffset(FieldCount);
            var entrySize   = calculateEntrySize(mFields);

            // write header
            writer.WriteS32(EntryCount);
            writer.WriteS32(FieldCount);
            writer.Write32(entryOffset);
            writer.WriteS32(entrySize);
            // write field LUT
            foreach (var field in mFields)
            {
                writer.Write32(field.hash);
                writer.Write32(field.bitmask);
                writer.Write16(field.start);
                writer.Write8(field.shift);
                writer.Write8((byte)field.type);
            }
            // since the stream is write-only, we must write packed integer fields to an intermediate, R/W buffer
            var buffer = new Dictionary <ushort, uint>(FieldCount);

            for (var entry = 0; entry < EntryCount; ++entry)
            {
                buffer.Clear();
                for (var field = 0; field < FieldCount; ++field)
                {
                    writer.Goto(entryOffset + (entrySize * entry) + mFields[field].start);
                    switch (mFields[field].type)
                    {
                    case jmpValueType.INTEGER: {
                        if (mFields[field].bitmask == 0xFFFFFFFFu)
                        {
                            // field is unpacked; write directly to stream
                            writer.WriteS32(mEntries[entry, field]);
                        }
                        else
                        {
                            // field is packed; write to intermediate buffer
                            if (!buffer.ContainsKey(mFields[field].start))
                            {
                                buffer[mFields[field].start] = 0u;                                         // if there's no key yet, create one
                            }
                            buffer[mFields[field].start] |= ((uint)mEntries[entry, field] << mFields[field].shift) & mFields[field].bitmask;
                        }
                        break;
                    }

                    case jmpValueType.FLOAT: {
                        writer.WriteF32(mEntries[entry, field]);
                        break;
                    }

                    case jmpValueType.STRING: {
                        writer.WriteString <aCSTR>(mEntries[entry, field], 0x20);
                        break;
                    }
                    }
                }
                // flush intermediate buffer
                foreach (var point in buffer)
                {
                    writer.Goto(entryOffset + (entrySize * entry) + point.Key);
                    writer.Write32(point.Value);
                }
            }
        }
Ejemplo n.º 14
0
        internal virtual void saveBlo1(aBinaryWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }

            byte numparams;

            if (!mInheritAlpha)
            {
                numparams = 10;
            }
            else if (mAlpha < 255)
            {
                numparams = 9;
            }
            else if (mAnchor != bloAnchor.TopLeft)
            {
                numparams = 8;
            }
            else if (mAngle != 0.0d)
            {
                numparams = 7;
            }
            else
            {
                numparams = 6;
            }

            writer.Write8(numparams);
            writer.Write8((byte)(mVisible ? 1 : 0));
            writer.Step(2);
            writer.Write32(mName);
            writer.WriteS16((short)mRect.left);
            writer.WriteS16((short)mRect.top);
            writer.WriteS16((short)mRect.width);
            writer.WriteS16((short)mRect.height);

            numparams -= 6;

            if (numparams > 0)
            {
                writer.Write16((ushort)mAngle);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write8((byte)mAnchor);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write8(mAlpha);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write8((byte)(mInheritAlpha ? 1 : 0));
                --numparams;
            }

            writer.WritePadding(4, 0);
        }
Ejemplo n.º 15
0
 public void save(aBinaryWriter writer)
 {
     writer.Write8((byte)mResourceType);
     writer.Write8((byte)mResourcePath.Length);
     writer.WriteString(mResourcePath);
 }