#!/usr/bin/env python3 from argparse import ArgumentParser import subprocess import os import json __version__ = "1.0" ld = os.environ.get("LD", "i586-pc-msdosdjgpp-ld") strip = os.environ.get("STRIP", "i586-pc-msdosdjgpp-strip") def get_layer(data, name): for layer in data["layers"]: if layer["name"] == name: return layer raise ValueError("Layer %s not found" % name) def main(): parser = ArgumentParser( description="Tiled JSON Map to .o", epilog="Copyright (C) 2023 Juan J Martinez ", ) parser.add_argument( "--version", action="version", version="%(prog)s " + __version__ ) parser.add_argument("file_json", help="JSON map to convert") parser.add_argument("output", help="object name for the map data") args = parser.parse_args() with open(args.file_json, "rt") as fd: data = json.load(fd) if len(data["tilesets"]) != 1: parser.error("Unsupported number of tilesets %d" % len(data["tilesets"])) tileset = data["tilesets"][0] map_layer = get_layer(data, "Map") out = map(lambda x: x - tileset["firstgid"], map_layer["data"]) # TODO: process map entities tmp = args.output.rstrip(".o") with open(tmp, "wb") as fd: fd.write(bytearray(out)) fd.flush() # create an object file from the binary rc = subprocess.call( [ ld, "-r", "-b", "binary", "-o", args.output, tmp, ] ) os.unlink(tmp) if rc != 0: parser.error("Failed to run %s" % ld) # strip unwanted symbols rc = subprocess.call([strip, "-w", "-K", "*_%s_*" % tmp, args.output]) if rc != 0: parser.error("Failed to run %s" % ld) if __name__ == "__main__": main()