public static byte[] Convert(byte[] bytesIn, IDriveType type, HeadUnit hu) { if (bytesIn.Length < 1) { return new byte[] { } } ; var bytesOut = new byte[bytesIn.Length]; for (int i = 0; i < bytesIn.Length; i++) { // Only first 131072 bytes (128KB) are inverted if (type == IDriveType.BR29 || type == IDriveType.BR34 || type == IDriveType.BR48) { if (i < 0x20000) { bytesOut[i] = (byte)(~bytesIn[i]); } else { bytesOut[i] = bytesIn[i]; } } // Last 3 bytes are not inverted else if (type == IDriveType.BR25 || type == IDriveType.BR4) { if (bytesIn.Length - i > 3) { bytesOut[i] = (byte)(~bytesIn[i]); } else if (hu != HeadUnit.CIC) { bytesOut[i] = bytesIn[i]; } // Not for CIC else { bytesOut[i] = (byte)(~bytesIn[i]); } } // Last byte is not inverted else if (type == IDriveType.BR28 || type == IDriveType.BR30) { if (bytesIn.Length - i > 1) { bytesOut[i] = (byte)(~bytesIn[i]); } else { bytesOut[i] = bytesIn[i]; } } else { bytesOut[i] = (byte)(~bytesIn[i]); } } return(bytesOut); } }
public ItemUnitParamFile(string inFilename, byte[] rawData, byte[] subHeader, int[] ptrs, int baseAddr) { filename = inFilename; header = subHeader; MemoryStream inStream = new MemoryStream(rawData); BinaryReader inReader = new BinaryReader(inStream); inStream.Seek(8, SeekOrigin.Begin); int headerLoc = inReader.ReadInt32(); inStream.Seek(headerLoc, SeekOrigin.Begin); int[] listLocs = new int[4]; int[] indexLocs = new int[4]; short[] indexCounts = new short[4]; short[] listCounts = new short[4]; byte[][] indexes = new byte[4][]; for (int i = 0; i < 4; i++) { inStream.Seek(headerLoc + 12 * i, SeekOrigin.Begin); listLocs[i] = inReader.ReadInt32() - baseAddr; indexLocs[i] = inReader.ReadInt32() - baseAddr; indexCounts[i] = inReader.ReadInt16(); listCounts[i] = inReader.ReadInt16(); if (indexCounts[i] != 0) { inStream.Seek(indexLocs[i], SeekOrigin.Begin); indexes[i] = inReader.ReadBytes(indexCounts[i]); } } int headLoopCounter = Math.Max(indexCounts[0], listCounts[0]); headUnits = new List <HeadUnit>(headLoopCounter); for (int i = 0; i < headLoopCounter; i++) { int currentIndex = i; if (indexCounts[0] != 0) { currentIndex = indexes[0][i]; } HeadUnit tempUnit = new HeadUnit(); if (currentIndex != 0xFF) { inStream.Seek(listLocs[0] + 12 * currentIndex, SeekOrigin.Begin); tempUnit.valid = true; tempUnit.unitRank = inReader.ReadByte(); tempUnit.armorRank = inReader.ReadByte(); tempUnit.manufacturer = inReader.ReadByte(); tempUnit.setId = inReader.ReadByte(); tempUnit.tpMod = inReader.ReadInt16(); tempUnit.mstMod = inReader.ReadInt16(); tempUnit.rangeMod = inReader.ReadByte(); tempUnit.ppMod = inReader.ReadByte(); tempUnit.techSpd1 = inReader.ReadByte(); tempUnit.techSpd2 = inReader.ReadByte(); } else { tempUnit.valid = false; } headUnits.Insert(i, tempUnit); } int armLoopCounter = Math.Max(indexCounts[1], listCounts[1]); armUnits = new List <ArmUnit>(armLoopCounter); for (int i = 0; i < armLoopCounter; i++) { int currentIndex = i; if (indexCounts[1] != 0) { currentIndex = indexes[1][i]; } ArmUnit tempUnit = new ArmUnit(); if (currentIndex != 0xFF) { inStream.Seek(listLocs[1] + 16 * currentIndex, SeekOrigin.Begin); tempUnit.valid = true; tempUnit.unitRank = inReader.ReadByte(); tempUnit.armorRank = inReader.ReadByte(); tempUnit.manufacturer = inReader.ReadByte(); tempUnit.setId = inReader.ReadByte(); tempUnit.atpMod = inReader.ReadInt16(); tempUnit.ataMod = inReader.ReadInt16(); tempUnit.autoDamageLevel = inReader.ReadByte(); tempUnit.strikeRangeMod = inReader.ReadByte(); tempUnit.strikePpMod = inReader.ReadByte(); tempUnit.strikeSpd = inReader.ReadByte(); tempUnit.firearmRangeMod = inReader.ReadByte(); tempUnit.firearmPpMod = inReader.ReadByte(); tempUnit.firearmSpd = inReader.ReadByte(); tempUnit.unknownByte = inReader.ReadByte(); } else { tempUnit.valid = false; } armUnits.Insert(i, tempUnit); } int bodyLoopCounter = Math.Max(indexCounts[2], listCounts[2]); bodyUnits = new List <BodyUnit>(bodyLoopCounter); for (int i = 0; i < bodyLoopCounter; i++) { int currentIndex = i; if (indexCounts[2] != 0) { currentIndex = indexes[2][i]; } BodyUnit tempUnit = new BodyUnit(); if (currentIndex != 0xFF) { inStream.Seek(listLocs[2] + 12 * currentIndex, SeekOrigin.Begin); tempUnit.valid = true; tempUnit.unitRank = inReader.ReadByte(); tempUnit.armorRank = inReader.ReadByte(); tempUnit.manufacturer = inReader.ReadByte(); tempUnit.setId = inReader.ReadByte(); tempUnit.dfpMod = inReader.ReadInt16(); tempUnit.evpMod = inReader.ReadInt16(); tempUnit.elementResist = inReader.ReadByte(); tempUnit.resists1 = inReader.ReadByte(); tempUnit.resists2 = inReader.ReadByte(); tempUnit.resists3 = inReader.ReadByte(); } else { tempUnit.valid = false; } bodyUnits.Insert(i, tempUnit); } int extraLoopCounter = Math.Max(indexCounts[3], listCounts[3]); extraUnits = new List <ExtraUnit>(extraLoopCounter); for (int i = 0; i < extraLoopCounter; i++) { int currentIndex = i; if (indexCounts[3] != 0) { currentIndex = indexes[3][i]; } ExtraUnit tempUnit = new ExtraUnit(); if (currentIndex != 0xFF) { inStream.Seek(listLocs[3] + 12 * currentIndex, SeekOrigin.Begin); tempUnit.valid = true; tempUnit.unitRank = inReader.ReadByte(); tempUnit.armorRank = inReader.ReadByte(); tempUnit.manufacturer = inReader.ReadByte(); tempUnit.setId = inReader.ReadByte(); tempUnit.staMod1 = inReader.ReadInt16(); tempUnit.staMod2 = inReader.ReadInt16(); tempUnit.autoRecoveryLevel = inReader.ReadByte(); tempUnit.ppRegen = inReader.ReadByte(); tempUnit.suvId = inReader.ReadByte(); tempUnit.visualEffect = inReader.ReadByte(); } else { tempUnit.valid = false; } extraUnits.Insert(i, tempUnit); } }