Fix alignemnt bug & set cleanup
This commit is contained in:
		| @@ -184,7 +184,7 @@ def parse_item(data: bytes) -> tuple[bytes, Item]: | |||||||
|         sockets_end = itembase_end |         sockets_end = itembase_end | ||||||
|  |  | ||||||
|     item, enchantments_end = parse_enchantments(bits[sockets_end:], item) |     item, enchantments_end = parse_enchantments(bits[sockets_end:], item) | ||||||
|     enchantments_end += itembase_end |     enchantments_end += sockets_end | ||||||
|  |  | ||||||
|     extended_byte_size = int((enchantments_end + 7) / 8) |     extended_byte_size = int((enchantments_end + 7) / 8) | ||||||
|  |  | ||||||
| @@ -294,6 +294,7 @@ def parse_affix(bits: bitarray) -> tuple[int | None, int]: | |||||||
| def parse_runeword(bits: bitarray) -> tuple[int, int]: | def parse_runeword(bits: bitarray) -> tuple[int, int]: | ||||||
|     id = ba2int(bits[0:12]) |     id = ba2int(bits[0:12]) | ||||||
|     # + 4 unknown bits |     # + 4 unknown bits | ||||||
|  |     # FIXME: Could this be the same field that set has? I.e. extra enchantment lists | ||||||
|     return id, 16 |     return id, 16 | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -342,22 +343,8 @@ def parse_enchantments(bits: bitarray, item: Item) -> tuple[Item, int]: | |||||||
|     ptr = 0 |     ptr = 0 | ||||||
|     if item.quality == Quality.SET: |     if item.quality == Quality.SET: | ||||||
|         val = ba2int(bits[0:5]) |         val = ba2int(bits[0:5]) | ||||||
|         # credit to https://github.com/nokka/d2s/blob/426ae713940b7474a5f7872f16dddb02ced8a241/item.go#L1139 |         # FIXME: how exactly this value works is unconfirmed | ||||||
|         # for table |         num_lists = 1 + val.bit_count() | ||||||
|         table = { |  | ||||||
|             0: 0, |  | ||||||
|             1: 1, |  | ||||||
|             2: 1, |  | ||||||
|             3: 2, |  | ||||||
|             4: 1, |  | ||||||
|             6: 2, |  | ||||||
|             7: 3, |  | ||||||
|             10: 2, |  | ||||||
|             12: 2, |  | ||||||
|             15: 4, |  | ||||||
|             31: 5, |  | ||||||
|         } |  | ||||||
|         num_lists = 1 + table[val] |  | ||||||
|         ptr += 5 |         ptr += 5 | ||||||
|     elif item.is_runeword: |     elif item.is_runeword: | ||||||
|         # Runewords have one empty dummy list of only 0x1ff followed by the runeword stats |         # Runewords have one empty dummy list of only 0x1ff followed by the runeword stats | ||||||
|   | |||||||
| @@ -205,3 +205,12 @@ class ParseItemTest(unittest.TestCase): | |||||||
|         data, item = parse_item(data) |         data, item = parse_item(data) | ||||||
|         self.assertEqual(data, b"") |         self.assertEqual(data, b"") | ||||||
|         self.assertEqual(item.stats[6].id, 140)  # Extra Blood special stat |         self.assertEqual(item.stats[6].id, 140)  # Extra Blood special stat | ||||||
|  |  | ||||||
|  |     def test_byte_alignment(self): | ||||||
|  |         # Fix for issue involving e.g. Natalya's Shadow | ||||||
|  |         data = bytes.fromhex( | ||||||
|  |             "100880000500148a1be03d81e1ae0510a00f0986001f4cd1229c9b2f5e3100c286fc07" | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |         data, _ = parse_item(data) | ||||||
|  |         self.assertEqual(data, b"") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user