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)); } }
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; } }
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); }
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); }
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); }
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); }
//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); }