File indexing completed on 2024-04-14 03:48:58

0001 #!/usr/bin/env python3
0002 # SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
0003 # SPDX-License-Identifier: LGPL-2.0-or-later
0004 
0005 import argparse
0006 import sys
0007 
0008 parser = argparse.ArgumentParser(description='Inspect Tirex Metatiles')
0009 parser.add_argument('metatile', nargs=1, help='Metatile file')
0010 parser.add_argument('--list', help='List table of contents of the given metatile', action='store_true')
0011 parser.add_argument('--extract', nargs=1, type=int, help='Extract the given sub-tile data')
0012 arguments = parser.parse_args()
0013 
0014 tile = open(arguments.metatile[0], 'rb')
0015 tiledata = tile.read()
0016 if not tiledata[0:4] == b'META':
0017     print('Not a metatile file')
0018     sys.exit(1)
0019 
0020 count = int.from_bytes(tiledata[4:8], byteorder='little')
0021 x = int.from_bytes(tiledata[8:12], byteorder='little')
0022 y = int.from_bytes(tiledata[12:16], byteorder='little')
0023 z = int.from_bytes(tiledata[16:20], byteorder='little')
0024 
0025 entries = []
0026 for i in range(count):
0027     offset = int.from_bytes(tiledata[(20+i*8):(24+i*8)], byteorder='little')
0028     size = int.from_bytes(tiledata[(24+i*8):(28+i*8)], byteorder='little')
0029     entries.append((offset, size))
0030 
0031 if arguments.list:
0032     print(f"Count: {count}\nX: {x}\nY: {y}\nZ: {z}\nEntries:")
0033     for i in range(count):
0034         print(f"  {i}: Offset: {entries[i][0]}, Size: {entries[i][1]}")
0035     sys.exit(0)
0036 
0037 if arguments.extract[0] < 0 or arguments.extract[0] > count:
0038     print('Tile index out of range')
0039     sys.exit(1)
0040 
0041 idx = arguments.extract[0]
0042 entry = entries[idx]
0043 sys.stdout.buffer.write(tiledata[entry[0]:(entry[0]+entry[1])])