예제 #1
0
        public void AddNewTextObject(bool sameScene)
        {
            //get the last element
            if (textObjectList.Count > 0)
            {
                var LastText = textObjectList[textObjectList.Count - 1];

                //add one to ID and take his group
                int textId    = LastText.id + 1;
                int groupText = LastText.group;

                //if the text is independant
                if (!sameScene)
                {
                    textId    += 0x64;
                    groupText += 1;
                }
                //create the new text object
                textObjectList.Add(new CSBF1TextObject(CGeneric.ConvertIntToByteArray(textId), groupText));
            }
            else
            {
                textObjectList.Add(new CSBF1TextObject(CGeneric.ConvertIntToByteArray(0), 0));
            }
        }
예제 #2
0
        private void WriteListHeader <T>(ref FileStream fs, ref int indexData, List <T> listOfressource) where T : AbsRessource
        {
            for (int index = 0; index < listOfressource.Count(); index++)
            {
                //write size
                fs.Write(CGeneric.ConvertIntToByteArray(listOfressource[index].GetRawData().Length), 0, 4);

                // write index start
                fs.Write(CGeneric.ConvertIntToByteArray(indexData), 0, 4);

                //write name of FIB (BIF Name)
                byte[] nameBIF = System.Text.Encoding.UTF8.GetBytes(listOfressource[index].GetRessourceName());
                fs.Write(nameBIF, 0, nameBIF.Length);

                //fill free space (of name) by 0
                for (int freeSpace = 0; freeSpace < 16 - nameBIF.Length; freeSpace++)
                {
                    fs.WriteByte(0);
                }

                //if data is not pair, add a FF for to be sure it's pair... (because !)
                if (listOfressource[index].GetRawData().Length % 2 == 1)
                {
                    indexData++;
                }

                indexData += listOfressource[index].GetRawData().Length;
            }
        }
예제 #3
0
        public static byte[] GenerateBFF2(byte[] palette, byte[] data, CGeneric.Compression compressionMethod, int sizeX, int sizeY, string bffName)
        {
            //generate header
            //--> determine GreenAlpha and palette size
            byte greenAlphaIndex = 0;

            if (palette.Length > 0)
            {
                greenAlphaIndex = CTextureManager.GetGreenAlphaValueIndex(palette, compressionMethod);
            }
            //make almost random compressed value.. (10)(because not enought information about it)
            //set displayedWidth equal pixel width (because not enought information about it)
            byte[] sizeXB   = CGeneric.ConvertIntToByteArray16bits(sizeX);
            byte[] sizeYB   = CGeneric.ConvertIntToByteArray16bits(sizeY);
            byte[] name     = CGeneric.ConvertStringToByteArray(bffName);
            byte[] nbColors = new byte[0];
            if (palette.Length > 0)
            {
                nbColors = CGeneric.ConvertIntToByteArray(palette.Length / CTextureManager.GetBytePerPixel(compressionMethod));
            }

            byte[] bff2header = SetHeader(compressionMethod, greenAlphaIndex, 0xE, sizeXB, sizeXB, sizeYB, name, nbColors);

            //concatenate header, palette and compressed data
            byte[] finalData = new byte[bff2header.Length + palette.Length + data.Length];
            Array.Copy(bff2header, 0, finalData, 0, bff2header.Length);
            if (palette.Length > 0)
            {
                Array.Copy(palette, 0, finalData, bff2header.Length, palette.Length);
            }

            Array.Copy(data, 0, finalData, bff2header.Length + palette.Length, data.Length);

            return(finalData);
        }
        public CSBF1TextureManagement(int id, int index)
        {
            byte[] newTexture = new byte[28];
            Array.Copy(CGeneric.ConvertIntToByteArray(id), 0, newTexture, 16, 4);
            Array.Copy(CGeneric.ConvertIntToByteArray(-1), 0, newTexture, 20, 4);
            Array.Copy(CGeneric.ConvertIntToByteArray(index), 0, newTexture, 24, 4);

            rawData = newTexture;
            decomposeHeader();
        }
        public byte[] GetRawData()
        {
            int newHeaderDataSize = 28;

            if (this.transparencybit)
            {
                newHeaderDataSize += 4;
            }
            if (this.extra2)
            {
                newHeaderDataSize += 8;
            }

            byte[] newHeaderData = new byte[newHeaderDataSize];

            int flags = 0;

            //set extra bit value
            CGeneric.SetBitInInt(ref flags, 22, this.transparencybit);
            CGeneric.SetBitInInt(ref flags, 26, this.extra2);

            //set unknown bit values
            CGeneric.SetBitInInt(ref flags, 19, this.bit19);
            CGeneric.SetBitInInt(ref flags, 20, this.bit20);
            CGeneric.SetBitInInt(ref flags, 21, this.bit21);
            CGeneric.SetBitInInt(ref flags, 23, this.bit23);
            CGeneric.SetBitInInt(ref flags, 24, this.bit24);
            CGeneric.SetBitInInt(ref flags, 25, this.bit25);
            CGeneric.SetBitInInt(ref flags, 27, this.bit27);
            CGeneric.SetBitInInt(ref flags, 28, this.bit28);
            CGeneric.SetBitInInt(ref flags, 29, this.bit29);
            CGeneric.SetBitInInt(ref flags, 30, this.bit30);
            CGeneric.SetBitInInt(ref flags, 31, this.bit31);
            CGeneric.SetBitInInt(ref flags, 32, this.bit32);

            Array.Copy(CGeneric.ConvertIntToByteArray(flags), 0, newHeaderData, 0, 4);
            Array.Copy(CGeneric.ConvertIntToByteArray(posX), 0, newHeaderData, 4, 4);
            Array.Copy(CGeneric.ConvertIntToByteArray(posY), 0, newHeaderData, 8, 4);

            //copy unknown data
            Array.Copy(rawData, 12, newHeaderData, 12, 16);

            newHeaderData[27] = this.textureIndex;
            if (transparencybit)
            {
                newHeaderData[31] = transparency;
            }
            return(newHeaderData);
        }
예제 #6
0
        public byte[] GetRawData()
        {
            //init
            byte[] res = new byte[0];

            //add the 4 unknown bytes...
            res = res.Concat(CGeneric.GiveMeArray(rawData, 0, 4)).ToArray();

            //title scene length
            res = res.Concat(CGeneric.ConvertIntToByteArray(this.sceneName.Length)).ToArray();

            //scene name
            res = res.Concat(sceneName).ToArray();

            //size dynamicObject
            res = res.Concat(CGeneric.ConvertIntToByteArray(dynamicObjectList.Count)).ToArray();

            //dynamic objectData
            foreach (CSBF1DynamicObject dynObj in dynamicObjectList)
            {
                res = res.Concat(dynObj.GetRawData()).ToArray();
            }

            //size TextObject
            res = res.Concat(CGeneric.ConvertIntToByteArray(textObjectList.Count)).ToArray();

            //TextObject
            foreach (CSBF1TextObject TexObj in textObjectList)
            {
                res = res.Concat(TexObj.GetRawData()).ToArray();
            }

            //Size textureManagement
            res = res.Concat(CGeneric.ConvertIntToByteArray(textureManagementObjectList.Count)).ToArray();

            //TextureManagement
            foreach (CSBF1TextureManagement texManObj in textureManagementObjectList)
            {
                res = res.Concat(texManObj.GetRawData()).ToArray();
            }

            //dont renember why.. but needed
            byte[] test = new byte[] { 0x00, 0x00, 0x00, 0x00 };
            res = res.Concat(test).ToArray();

            return(res);
        }
예제 #7
0
        public void WriteAllData(FileStream fs)
        {
            fs.Position = indexRessourcesStart;

            // write the number of elements
            fs.Write(CGeneric.ConvertIntToByteArray(fibList.Count() + GetHVQMCount() + GetSBFCount() + GetRTFCount()), 0, 4);

            // index of data (for writing header)
            int indexData = (fibList.Count() + GetHVQMCount() + GetSBFCount() + GetRTFCount()) * 24 + 4;

            //write list header (FIB,HVQM,SBF1,RDF1)
            WriteListHeader(ref fs, ref indexData, fibList);
            WriteListHeader(ref fs, ref indexData, hvqmList);
            WriteListHeader(ref fs, ref indexData, sbfList);
            WriteListHeader(ref fs, ref indexData, rdfList);

            //write data associated
            WriteRessourceData(ref fs, fibList);
            WriteRessourceData(ref fs, hvqmList);
            WriteRessourceData(ref fs, sbfList);
            WriteRessourceData(ref fs, rdfList);
        }
예제 #8
0
        public override byte[] GetRawData()
        {
            //return rawData;
            byte[] res = new byte[12 + (bifList.Count * 0x10)];
            Array.Copy(CGeneric.patternSBF1, 0, res, 0, CGeneric.patternSBF1.Length);
            Array.Copy(CGeneric.ConvertIntToByteArray(bifList.Count), 0, res, 4, 4);

            for (int i = 0; i < bifList.Count; i++)
            {
                Array.Copy(bifList[i], 0, res, 8 + i * bifList[0].Length, bifList[0].Length);
            }

            Array.Copy(CGeneric.ConvertIntToByteArray(scenesList.Count), 0, res, res.Length - 4, 4);

            //add each csbf1 scene
            foreach (CSBF1Scene scene in scenesList)
            {
                res = res.Concat(scene.GetRawData()).ToArray();
            }

            this.rawData = res;
            return(res);
        }
예제 #9
0
        //specific format for BFF header
        private static byte[] SetHeader(CGeneric.Compression textureType, byte greenAlphaIndex, byte compressedValue, byte[] displayedWidth, byte[] pixelWidth, byte[] displayHeight, byte[] bffName, byte[] colorCount)
        {
            //fixedsize = 36 + bffName + 1 if bffName size is not pair + 4 for palette color count
            byte[] headerBFF2 = new Byte[36 + bffName.Length + bffName.Length % 2 + colorCount.Length];

            headerBFF2[8] = 0x8;

            //write "BFF2"
            for (int i = 0; i < CGeneric.patternBFF2.Length; i++)
            {
                headerBFF2[12 + i] = CGeneric.patternBFF2[i];
            }

            //decompose the next two bytes in nibbles
            //grab the nibbles of alpha color
            List <byte> alphaColor = CGeneric.ByteToNibble(greenAlphaIndex);

            //write two nibbles for the both bytes..
            headerBFF2[17] = CGeneric.NibbleToByte(2, alphaColor[0]);
            headerBFF2[18] = CGeneric.NibbleToByte(alphaColor[1], compressedValue);

            //write texture type
            headerBFF2[19] = (byte)textureType;

            //write displayed width
            for (int i = 0; i < displayedWidth.Length; i++)
            {
                headerBFF2[20 + i] = displayedWidth[i];
            }

            //write pixel width
            for (int i = 0; i < pixelWidth.Length; i++)
            {
                headerBFF2[22 + i] = pixelWidth[i];
            }

            //write display height
            for (int i = 0; i < displayHeight.Length; i++)
            {
                headerBFF2[26 + i] = displayHeight[i];
            }

            //prepare instruction length (depending of the pixelWidth value)
            double instructionLengthValue = CGeneric.ConvertByteArrayToInt(pixelWidth);

            switch (textureType)
            {
            case CGeneric.Compression.greyscale: instructionLengthValue *= 2; break;

            case CGeneric.Compression.max16Colors: instructionLengthValue /= 2; break;

            case CGeneric.Compression.trueColor16Bits: instructionLengthValue *= 2; break;

            case CGeneric.Compression.trueColor32Bits: instructionLengthValue *= 4; break;
            }

            byte[] instructLength = CGeneric.ConvertIntToByteArray((int)Math.Floor(instructionLengthValue));

            //write instruction length
            for (int i = 0; i < instructLength.Length; i++)
            {
                headerBFF2[28 + i] = instructLength[i];
            }

            //length of file name
            if (bffName.Length % 2 == 0)
            {
                headerBFF2[35] = (byte)bffName.Length;
            }
            else
            {
                headerBFF2[35] = (byte)(bffName.Length + 1);
            }

            //write bff name
            for (int i = 0; i < bffName.Length; i++)
            {
                headerBFF2[36 + i] = bffName[i];
            }

            for (int i = 0; i < colorCount.Length; i++)
            {
                headerBFF2[36 + bffName.Length + bffName.Length % 2 + i] = colorCount[i];
            }


            return(headerBFF2);
        }