|
|
- import argparse
- import pathlib
- import sys
-
- from PIL import Image
-
- GREEN = (0, 255, 0)
- RED = (255, 0, 0)
-
-
- def generate_coll_map(in_path: str, out_path: str) -> None:
- png = Image.open(in_path).convert("RGB")
- assert png.height % 8 == 0 and png.width % 8 == 0
-
- out_bytes = []
- bits = []
-
- for y in range(png.height // 8):
- for x in range(png.width // 8):
- pixel = png.getpixel((x * 8, y * 8))
-
- bit = None
- if pixel == RED:
- bit = 1
- elif pixel == GREEN:
- bit = 0
- else:
- print(f"unsupported pixel in collision map {pixel}", file=sys.stderr)
- return
-
- bits.append(bit)
- if len(bits) == 8:
- byte = sum([bit << i for i, bit in enumerate(bits)])
- out_bytes.append(byte)
- bits = []
-
- lines = []
- for line_no in range(0, len(out_bytes), 16):
- line = out_bytes[line_no : line_no + 16]
- lines.append(" DB " + ", ".join(["$%02X" % b for b in line]))
-
- section = pathlib.Path(in_path).name.replace("_coll.png", "")
- all_lines = "\n".join(lines)
-
- with open(out_path, "wb") as outf:
- outf.write(
- f"""SECTION "{section.upper()} MAP", ROM0
-
- ; Values are provided in tiles
- DEF {section}_width EQU {png.width // 8}
- DEF {section}_height EQU {png.height // 8}
-
- {section}_collision_map::
- {all_lines}
- """.encode(
- "utf-8"
- )
- )
-
-
- def main() -> None:
- parser = argparse.ArgumentParser("generate_coll_map")
- parser.add_argument("-o", "--output", required=True)
- parser.add_argument("png")
-
- args = parser.parse_args()
- generate_coll_map(args.png, args.output)
-
-
- if __name__ == "__main__":
- main()
|