Exemple #1
0
        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);
        }
    }
Exemple #2
0
        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);
            }
        }