Esempio n. 1
0
        public string ReadValue(int itemId, string memberName)
        {
            BdatMember member      = MembersDict[memberName];
            int        itemIndex   = itemId - BaseId;
            int        itemOffset  = ItemTableOffset + itemIndex * ItemSize;
            int        valueOffset = itemOffset + member.MemberPos;

            if (member.Type == BdatMemberType.Array) //return "Array";
            {
                String outString = "";
                //Set data length by type
                int bytes = GetTypeBytes(member.ValType);
                //Add each item
                for (int i = 0; i < member.ArrayCount; i++)
                {
                    outString = string.Concat(outString, ReadIndividualValue(member, valueOffset + i * bytes).ToString());
                    if (i < member.ArrayCount - 1)
                    {
                        outString = string.Concat(outString, ":");
                    }
                }
                return(outString);
            }
            if (member.Type == BdatMemberType.Flag)
            {
                BdatMember flagsMember = Members[member.FlagVarIndex];
                return(ReadFlag(Data, itemOffset, member, flagsMember));
            }
            return(ReadIndividualValue(member, valueOffset));
        }
Esempio n. 2
0
        private static string ReadFlag(DataBuffer table, int itemOffset, BdatMember member, BdatMember flagsMember)
        {
            uint flags = table[itemOffset + flagsMember.MemberPos];

            return(((flags & member.FlagMask) != 0).ToString());
            //return (Convert.ToString(flags, 2).PadLeft(8, '0') + " & "+ Convert.ToString(member.FlagMask, 2).PadLeft(8,'0') + " -> " + ((flags & member.FlagMask) != 0).ToString());
        }
Esempio n. 3
0
        public void WriteValue(int itemId, string memberName, string value)
        {
            BdatMember member      = MembersDict[memberName];
            int        itemIndex   = itemId - BaseId;
            int        itemOffset  = ItemTableOffset + itemIndex * ItemSize;
            int        valueOffset = itemOffset + member.MemberPos;

            if (member.Type != BdatMemberType.Scalar)
            {
                return;
            }

            switch (member.ValType)
            {
            case BdatValueType.UInt8:
                Data.WriteUInt8(byte.Parse(value), valueOffset);
                break;

            case BdatValueType.UInt16:
                Data.WriteUInt16(ushort.Parse(value), valueOffset);
                break;

            case BdatValueType.UInt32:
                Data.WriteUInt32(uint.Parse(value), valueOffset);
                break;

            case BdatValueType.Int8:
                Data.WriteInt8(sbyte.Parse(value), valueOffset);
                break;

            case BdatValueType.Int16:
                Data.WriteInt16(short.Parse(value), valueOffset);
                break;

            case BdatValueType.Int32:
                Data.WriteInt32(int.Parse(value), valueOffset);
                break;

            case BdatValueType.FP32:
                Data.WriteSingle(float.Parse(value), valueOffset);
                break;

            case BdatValueType.String:
                int    offset    = Data.ReadInt32(valueOffset);
                string oldValue  = Data.ReadUTF8Z(offset);
                int    oldLength = Encoding.UTF8.GetByteCount(oldValue);
                int    length    = Encoding.UTF8.GetByteCount(value);
                if (length > oldLength)
                {
                    throw new ArgumentOutOfRangeException(nameof(value), "String is too long");
                }
                Data.WriteUTF8Z(value, offset);
                break;

            default:
                throw new IndexOutOfRangeException();
            }
        }
Esempio n. 4
0
        public string ReadString(int itemId, string memberName)
        {
            BdatMember member      = MembersDict[memberName];
            int        itemIndex   = itemId - BaseId;
            int        itemOffset  = ItemTableOffset + itemIndex * ItemSize;
            int        valueOffset = itemOffset + member.MemberPos;

            if (member.Type != BdatMemberType.Scalar)
            {
                throw new NotImplementedException();
            }
            return(ReadStringValue(valueOffset, member.ValType));
        }
Esempio n. 5
0
        public string ReadValue(int itemId, string memberName)
        {
            BdatMember member      = MembersDict[memberName];
            int        itemIndex   = itemId - BaseId;
            int        itemOffset  = ItemTableOffset + itemIndex * ItemSize;
            int        valueOffset = itemOffset + member.MemberPos;

            if (member.Type == BdatMemberType.Array)
            {
                return("Array");
            }
            if (member.Type == BdatMemberType.Flag)
            {
                return("Flag");
            }
            switch (member.ValType)
            {
            case BdatValueType.UInt8:
                return(Data[valueOffset].ToString());

            case BdatValueType.UInt16:
                return(Data.ReadUInt16(valueOffset).ToString());

            case BdatValueType.UInt32:
                return(Data.ReadUInt32(valueOffset).ToString());

            case BdatValueType.Int8:
                return(((sbyte)Data[valueOffset]).ToString());

            case BdatValueType.Int16:
                return(Data.ReadInt16(valueOffset).ToString());

            case BdatValueType.Int32:
                return(Data.ReadInt32(valueOffset).ToString());

            case BdatValueType.String:
                return(Data.ReadUTF8Z(Data.ReadInt32(valueOffset)));

            case BdatValueType.FP32:
                if (Data.Game == Game.XBX)
                {
                    uint value = Data.ReadUInt32(valueOffset);
                    return(((float)(value * (1 / 4096.0))).ToString("R"));
                }
                return(Data.ReadSingle(valueOffset).ToString("R"));

            default:
                throw new IndexOutOfRangeException();
            }
        }
Esempio n. 6
0
        private void WriteIndividualValue(BdatMember member, int valueOffset, string value)
        {
            switch (member.ValType)
            {
            case BdatValueType.UInt8:
                Data.WriteUInt8(byte.Parse(value), valueOffset);
                break;

            case BdatValueType.UInt16:
                Data.WriteUInt16(ushort.Parse(value), valueOffset);
                break;

            case BdatValueType.UInt32:
                Data.WriteUInt32(uint.Parse(value), valueOffset);
                break;

            case BdatValueType.Int8:
                Data.WriteInt8(sbyte.Parse(value), valueOffset);
                break;

            case BdatValueType.Int16:
                Data.WriteInt16(short.Parse(value), valueOffset);
                break;

            case BdatValueType.Int32:
                Data.WriteInt32(int.Parse(value), valueOffset);
                break;

            case BdatValueType.FP32:
                Data.WriteSingle(float.Parse(value), valueOffset);
                break;

            case BdatValueType.String:
                int    offset    = Data.ReadInt32(valueOffset);
                string oldValue  = Data.ReadUTF8Z(offset);
                int    oldLength = Encoding.UTF8.GetByteCount(oldValue);
                int    length    = Encoding.UTF8.GetByteCount(value);
                if (length > oldLength)
                {
                    throw new ArgumentOutOfRangeException(nameof(value), "String is too long! Must be shorter or equal to previous.");
                }
                Data.WriteUTF8Z(value, offset);
                break;

            default:
                throw new IndexOutOfRangeException();
            }
        }
Esempio n. 7
0
        public static BdatMember[] ReadTableMembers(DataBuffer file)
        {
            int memberTableOffset = file.ReadUInt16(32);
            int memberCount       = file.ReadUInt16(34);
            var members           = new BdatMember[memberCount];
            var usedNames         = new HashSet <string>();

            for (int i = 0; i < memberCount; i++)
            {
                int memberOffset = memberTableOffset + i * 6;
                var member       = new BdatMember(file, memberOffset, usedNames);
                members[i] = member;
            }

            return(members);
        }
Esempio n. 8
0
        public void PrependMember(BdatMember newMember)
        {
            foreach (BdatMember member in Members.Where(x => x.Type == BdatMemberType.Flag))
            {
                member.FlagVarIndex++;
            }

            MembersDict.Add(newMember.Name, newMember);

            var newMemberArray = new BdatMember[Members.Length + 1];

            newMemberArray[0] = newMember;
            Array.Copy(Members, 0, newMemberArray, 1, Members.Length);

            Members = newMemberArray;
        }
Esempio n. 9
0
        public void WriteValue(int itemId, string memberName, string value)
        {
            BdatMember member      = MembersDict[memberName];
            int        itemIndex   = itemId - BaseId;
            int        itemOffset  = ItemTableOffset + itemIndex * ItemSize;
            int        valueOffset = itemOffset + member.MemberPos;

            if (member.Type == BdatMemberType.Array)
            {
                int      i           = 0;
                int      bytes       = GetTypeBytes(member.ValType);
                string[] array_items = value.Split(':');
                foreach (String array_item in array_items)
                {
                    WriteIndividualValue(member, valueOffset + i * bytes, array_item);
                    i++;
                }
            }

            if (member.Type == BdatMemberType.Flag)
            {
                if (value == "True" || value == "False")
                {
                    BdatMember flagsMember = Members[member.FlagVarIndex];
                    uint       flags       = Data[itemOffset + flagsMember.MemberPos];
                    uint       newVal      = 0;
                    if (value == "True")
                    {
                        newVal = flags | member.FlagMask;
                    }
                    else
                    {
                        newVal = flags ^ (flags & member.FlagMask);
                    }
                    Data.WriteUInt8(Convert.ToByte(newVal), itemOffset + flagsMember.MemberPos);
                    return;
                }
                else
                {
                    throw new ArgumentOutOfRangeException(nameof(value), "Flags must be True or False exactly!");
                }
            }

            WriteIndividualValue(member, valueOffset, value);
        }
Esempio n. 10
0
        public static BdatMember[] ReadTableMembersFromHash(DataBuffer file)
        {
            int hashTableOffset = file.ReadUInt16(10);
            int hashTableLength = file.ReadUInt16(12);

            var members   = new List <BdatMember>();
            var usedNames = new HashSet <string>();

            for (int i = 0; i < hashTableLength; i++)
            {
                int nextChain = file.ReadUInt16(hashTableOffset + i * 2);
                while (nextChain != 0)
                {
                    var member = new BdatMember(file, nextChain, usedNames);
                    members.Add(member);
                    nextChain = file.ReadUInt16(nextChain + 2);
                }
            }

            return(members.OrderBy(x => x.MemberPos).ToArray());
        }
Esempio n. 11
0
        private string ReadIndividualValue(BdatMember member, int valueOffset)
        //Custom, only used for arrays.
        {
            switch (member.ValType)
            {
            case BdatValueType.UInt8:
                return(Data[valueOffset].ToString());

            case BdatValueType.UInt16:
                return(Data.ReadUInt16(valueOffset).ToString());

            case BdatValueType.UInt32:
                return(Data.ReadUInt32(valueOffset).ToString());

            case BdatValueType.Int8:
                return(((sbyte)Data[valueOffset]).ToString());

            case BdatValueType.Int16:
                return(Data.ReadInt16(valueOffset).ToString());

            case BdatValueType.Int32:
                return(Data.ReadInt32(valueOffset).ToString());

            case BdatValueType.String:
                return(Data.ReadUTF8Z(Data.ReadInt32(valueOffset)));

            case BdatValueType.FP32:
                if (Data.Game == Game.XBX)
                {
                    uint value = Data.ReadUInt32(valueOffset);
                    return(((float)(value * (1 / 4096.0))).ToString("R"));
                }
                return(Data.ReadSingle(valueOffset).ToString("R"));

            default:
                throw new IndexOutOfRangeException();
            }
        }