From d1370b955f9a86c82f92d7368237ed96318de330 Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Sat, 19 Jul 2025 09:29:12 -0700 Subject: Allocate data from a stack allocator --- tools/mkasset.py | 53 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 17 deletions(-) (limited to 'tools/mkasset.py') diff --git a/tools/mkasset.py b/tools/mkasset.py index fd2ead7..ae27ead 100644 --- a/tools/mkasset.py +++ b/tools/mkasset.py @@ -51,10 +51,15 @@ def convert_tsx(input_filepath, output_filepath): print(f"Max width: {max_tile_width}") print(f"Max height: {max_tile_height}") + pixels = [] # List of byte arrays + pixels_offset = 0 + with open(output_filepath, 'bw') as output: + # Write the header. output.write(ctypes.c_uint16(tile_count)) - output.write(ctypes.c_uint16(max_tile_width)) - output.write(ctypes.c_uint16(max_tile_height)) + # output.write(ctypes.c_uint16(max_tile_width)) + # output.write(ctypes.c_uint16(max_tile_height)) + output.write(ctypes.c_uint16(0)) # Pad. num_tile = 0 for tile in root: @@ -72,12 +77,23 @@ def convert_tsx(input_filepath, output_filepath): tile_height = int(image.attrib["height"]) tile_path = image.attrib["source"] - output.write(ctypes.c_uint16(tile_width)) - output.write(ctypes.c_uint16(tile_height)) + assert (tile_width > 0) + assert (tile_height > 0) + tile_pixels_offset = pixels_offset with Image.open(tile_path) as im: bytes = im.convert('RGBA').tobytes() - output.write(bytes) + pixels.append(bytes) + pixels_offset += len(bytes) + + # Write the tile. + output.write(ctypes.c_uint16(tile_width)) + output.write(ctypes.c_uint16(tile_height)) + output.write(ctypes.c_uint32(tile_pixels_offset)) + + # Write the pixel data. + for bytes in pixels: + output.write(bytes) def convert_tmx(input_filepath, output_filepath): @@ -96,23 +112,27 @@ def convert_tmx(input_filepath, output_filepath): print(f"Tile width: {base_tile_width}") print(f"Tile height: {base_tile_height}") - with open(output_filepath, 'bw') as output: - output.write(ctypes.c_uint16(map_width)) - output.write(ctypes.c_uint16(map_height)) - output.write(ctypes.c_uint16(base_tile_width)) - output.write(ctypes.c_uint16(base_tile_height)) - output.write(ctypes.c_uint16(num_layers)) - - tileset_path = None + tileset_path = None + with open(output_filepath, 'bw') as output: for child in root: if child.tag == "tileset": + assert (not tileset_path) # Only supporting one tile set per map right now. + tileset = child tileset_path = tileset.attrib["source"] print(f"Tile set: {tileset_path}") tileset_path = tileset_path.replace("tsx", "ts") + + # Write the header. + output.write(to_char_array(tileset_path, MAX_PATH_LENGTH)) + output.write(ctypes.c_uint16(map_width)) + output.write(ctypes.c_uint16(map_height)) + output.write(ctypes.c_uint16(base_tile_width)) + output.write(ctypes.c_uint16(base_tile_height)) + output.write(ctypes.c_uint16(num_layers)) elif child.tag == "layer": layer = child layer_id = int(layer.attrib["id"]) @@ -123,9 +143,6 @@ def convert_tmx(input_filepath, output_filepath): print(f"Width: {layer_width}") print(f"Height: {layer_height}") - assert (tileset_path) - output.write(to_char_array(tileset_path, MAX_PATH_LENGTH)) - # Assume the layer's dimensions matches the map's. assert (layer_width == map_width) assert (layer_height == map_height) @@ -139,7 +156,9 @@ def convert_tmx(input_filepath, output_filepath): for row in rows: tile_ids = [x.strip() for x in row.split(',') if x] for tile_id in tile_ids: - output.write(ctypes.c_uint16(int(tile_id))) + # TODO: We need to handle 'firsgid' in TMX files. + # For now, assume it's 1 and do -1 to make the tiles 0-based. + output.write(ctypes.c_uint16(int(tile_id) - 1)) def get_num_cols(image, sprite_width): -- cgit v1.2.3