Skip to content

Commit

Permalink
Flags are now properly interpreted as bits, and should work properly …
Browse files Browse the repository at this point in the history
…in files with multiple flags!
  • Loading branch information
threethan committed Oct 21, 2020
1 parent f9c3589 commit 4ad4504
Showing 1 changed file with 22 additions and 5 deletions.
27 changes: 22 additions & 5 deletions XbTool/XbTool/Bdat/BdatTable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,13 @@ public BdatTable(DataBuffer table)
MembersDict = Members.ToDictionary(x => x.Name, x => x);
}

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

public string ReadValue(int itemId, string memberName)
{
BdatMember member = MembersDict[memberName];
Expand All @@ -99,7 +106,11 @@ public string ReadValue(int itemId, string memberName)
}
return outString;
}
if (member.Type == BdatMemberType.Flag) return ((sbyte)Data[valueOffset]).ToString();
if (member.Type == BdatMemberType.Flag)
{
BdatMember flagsMember = Members[member.FlagVarIndex];
return ReadFlag(Data, itemOffset, member, flagsMember);
}
return ReadIndividualValue(member, valueOffset);
}
private int GetTypeBytes (BdatValueType type)
Expand All @@ -113,7 +124,6 @@ private int GetTypeBytes (BdatValueType type)
case BdatValueType.UInt16:
case BdatValueType.Int16:
return 2;
break;
case BdatValueType.Int32:
case BdatValueType.UInt32:
case BdatValueType.String:
Expand Down Expand Up @@ -177,13 +187,20 @@ public void WriteValue(int itemId, string memberName, string value)

if (member.Type == BdatMemberType.Flag)
{
if (value == "0" || value == "1")
if (value == "True" || value == "False")
{
Data.WriteUInt8(byte.Parse(value), valueOffset);
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 1 or 0!");
throw new ArgumentOutOfRangeException(nameof(value), "Flags must be True or False exactly!");
}

WriteIndividualValue(member, valueOffset, value);
Expand Down

0 comments on commit 4ad4504

Please sign in to comment.