Skip to content

Instantly share code, notes, and snippets.

@NullMember
Last active July 7, 2017 16:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NullMember/967dd2b548d5f33ce43ccce9a6bc742f to your computer and use it in GitHub Desktop.
Save NullMember/967dd2b548d5f33ce43ccce9a6bc742f to your computer and use it in GitHub Desktop.
tilemap2h: Convert tilemap .xml or .tmx map file to cpp header file
from os import remove, close, listdir
from xml.dom.minidom import parse
from shutil import move
import sys
import xml.dom.minidom
def readMap(_file, _tile):
_file.write("uint8_t readMap(uint8_t _x, uint8_t _y){\n")
if _tile == 256:
_file.write("\treturn tilemap[_y][_x];\n}\n")
if _tile == 16:
_file.write("\tif((_x % 2) == 0){\n\t\treturn (tilemap[_y][int(_x / 2)] >> 4) & 0xF;\n\t}\n")
_file.write("\telse if((_x % 2) == 1){\n\t\treturn tilemap[_y][int(_x / 2)] & 0xF;\n\t}\n}\n")
if _tile == 4:
_file.write("\tif((_x % 4) == 0){\n\t\treturn (tilemap[_y][int(_x / 4)] >> 6) & 0b00000011;\n\t}\n")
_file.write("\tif((_x % 4) == 1){\n\t\treturn (tilemap[_y][int(_x / 4)] >> 4) & 0b00000011;\n\t}\n")
_file.write("\tif((_x % 4) == 2){\n\t\treturn (tilemap[_y][int(_x / 4)] >> 2) & 0b00000011;\n\t}\n")
_file.write("\tif((_x % 4) == 3){\n\t\treturn tilemap[_y][int(_x / 4)] & 0b00000011;\n\t}\n}\n")
if _tile == 2:
_file.write("\tfor (uint8_t i = 0; i < 8; i++){\n\t\tif((_x & 8) == i){\n\t\t\treturn (tilemap[_y][int(_x / 8)] >> (7 - i)) & 0b00000001;\n\t\t}\n\t}\n}\n")
if sys.argv[1] == "pyxel":
header = open("tilemap.h", "w")
parse = xml.dom.minidom.parse(sys.argv[3])
tilemap = parse.documentElement
header.write("/*\n\ttilemap2h: Convert tilemap .xml or .tmx map file to cpp header file\n\tAuthor: Malik Enes Safak\n*/\n")
header.write("uint8_t maxMapx = ")
header.write(str(int(tilemap.getAttribute("tileswide")) - 1))
header.write(", maxMapy = ")
header.write(str(int(tilemap.getAttribute("tileshigh")) - 1))
header.write(";\n\n")
header.write("const uint8_t tilemap[")
header.write(tilemap.getAttribute("tileshigh"))
header.write("][")
tiles = tilemap.getElementsByTagName("tile")
if sys.argv[2] == "256":
header.write(tilemap.getAttribute("tileswide"))
header.write("] = {\n{")
for tile in tiles:
_tile = int(tile.getAttribute("tile"))
if _tile < 0:
_tile = 0
if (tile.getAttribute("x") == "0") and (tile.getAttribute("y") != "0"):
header.seek(0, 2)
size=header.tell()
header.truncate(size-2)
header.seek(0, 2)
header.write("},")
header.write("\n")
header.write("{")
header.write(str(_tile))
header.write(", ")
if sys.argv[2] == "16":
if int(int(tilemap.getAttribute("tileswide")) / 2) == int(tilemap.getAttribute("tileswide")) / 2:
header.write(str(int(int(tilemap.getAttribute("tileswide")) / 2)))
else:
header.write(str(int(int(tilemap.getAttribute("tileswide")) / 2) + 1))
header.write("] = {\n{")
temp = 0
counter = 0
for tile in tiles:
_tile = int(tile.getAttribute("tile"))
if _tile < 0:
_tile = 0
if (tile.getAttribute("x") == "0") and (tile.getAttribute("y") != "0"):
if int(int(tilemap.getAttribute("tileswide")) / 2) != int(tilemap.getAttribute("tileswide")) / 2:
header.write(hex(temp))
header.write(", ")
header.seek(0, 2)
size=header.tell()
header.truncate(size-2)
header.seek(0, 2)
header.write("},")
header.write("\n")
header.write("{")
if (counter % 2) == 0:
temp = _tile << 4
if (counter % 2) == 1:
temp = temp | _tile
header.write(hex(temp))
header.write(", ")
counter += 1
if int(int(tilemap.getAttribute("tileswide")) / 2) != int(tilemap.getAttribute("tileswide")) / 2:
header.write(hex(temp))
header.write(", ")
if sys.argv[2] == "4":
if int(int(tilemap.getAttribute("tileswide")) / 4) == int(tilemap.getAttribute("tileswide")) / 4:
header.write(str(int(int(tilemap.getAttribute("tileswide")) / 4)))
else:
header.write(str(int(int(tilemap.getAttribute("tileswide")) / 4) + 1))
header.write("] = {\n{")
temp = 0
counter = 0
for tile in tiles:
_tile = int(tile.getAttribute("tile"))
if _tile < 0:
_tile = 0
if (tile.getAttribute("x") == "0") and (tile.getAttribute("y") != "0"):
if int(int(tilemap.getAttribute("tileswide")) / 4) != int(tilemap.getAttribute("tileswide")) / 4:
header.write(bin(temp))
header.write(", ")
header.seek(0, 2)
size=header.tell()
header.truncate(size-2)
header.seek(0, 2)
header.write("},")
header.write("\n")
header.write("{")
counter = 0
if (counter % 4) == 0:
temp = _tile << 6
if (counter % 4) == 1:
temp = temp | (_tile << 4)
if (counter % 4) == 2:
temp = temp | (_tile << 2)
if (counter % 4) == 3:
temp = temp | _tile
header.write(bin(temp))
header.write(", ")
counter += 1
if int(int(tilemap.getAttribute("tileswide")) / 4) != int(tilemap.getAttribute("tileswide")) / 4:
header.write(bin(temp))
header.write(", ")
if sys.argv[2] == "2":
if int(int(tilemap.getAttribute("tileswide")) / 8) == int(tilemap.getAttribute("tileswide")) / 8:
header.write(str(int(int(tilemap.getAttribute("tileswide")) / 8)))
else:
header.write(str(int(int(tilemap.getAttribute("tileswide")) / 8) + 1))
header.write("] = {\n{")
temp = 0
counter = 0
for tile in tiles:
_tile = int(tile.getAttribute("tile"))
if _tile < 0:
_tile = 0
if (tile.getAttribute("x") == "0") and (tile.getAttribute("y") != "0"):
if int(int(tilemap.getAttribute("tileswide")) / 8) != int(tilemap.getAttribute("tileswide")) / 8:
header.write(bin(temp))
header.write(", ")
header.seek(0, 2)
size=header.tell()
header.truncate(size-2)
header.seek(0, 2)
header.write("},")
header.write("\n")
header.write("{")
counter = 0
if (counter % 8) == 0:
temp = _tile << 7
if (counter % 8) == 1:
temp = temp | (_tile << 6)
if (counter % 8) == 2:
temp = temp | (_tile << 5)
if (counter % 8) == 3:
temp = temp | (_tile << 4)
if (counter % 8) == 4:
temp = temp | (_tile << 3)
if (counter % 8) == 5:
temp = temp | (_tile << 2)
if (counter % 8) == 6:
temp = temp | (_tile << 1)
if (counter % 8) == 7:
temp = temp | _tile
header.write(bin(temp))
header.write(", ")
counter += 1
if int(int(tilemap.getAttribute("tileswide")) / 8) != int(tilemap.getAttribute("tileswide")) / 8:
header.write(bin(temp))
header.write(", ")
header.seek(0, 2)
size=header.tell()
header.truncate(size-2)
header.seek(0, 2)
header.write("}};\n\n")
readMap(header, int(sys.argv[2]))
header.close()
elif sys.argv[1] == "tiled":
header = open("tilemap.h", "w")
parse = xml.dom.minidom.parse(sys.argv[3])
tilemap = parse.documentElement
header.write("/*\n\ttilemap2h: Convert tilemap .xml or .tmx map file to cpp header file\n\tAuthor: Malik Enes Safak\n*/\n")
header.write("const uint8_t tilemap[")
header.write(tilemap.getAttribute("width"))
header.write("][")
header.write(tilemap.getAttribute("height"))
header.write("] = {")
data1 = tilemap.getElementsByTagName('layer')
for data2 in data1:
_data = data2.getElementsByTagName('data')[0]
header.write(_data.childNodes[0].data)
header.close()
header = open("tilemap.h", "r")
temp = open("_tilemap.h", "w")
lastTile = ""
for line in header:
if line.find(",") != -1:
a = line
temp.write("{")
for i in range(0, len(a) - 4):
temp.write(a[i])
lastTile = a[len(a) - 5]
temp.write("},\n")
else:
temp.write(line)
temp.seek(0, 2)
size=temp.tell()
temp.truncate(size-5)
temp.seek(0, 2)
temp.write(lastTile+'0')
temp.write("}};\n\n")
readMap(temp, 256)
header.close()
temp.close()
remove('tilemap.h')
move('_tilemap.h', 'tilemap.h')
elif sys.argv[1] == "-h":
print("tilemap2h: Convert tilemap .xml or .tmx map file to cpp header file\n")
print("First arg = File input type: tiled .tmx or pyxel .xml [tiled, pyxel]\n")
print("Second arg = How many tiles used for map [2, 4, 16, 256] Warning! Only pyxel supported\n")
print("Third arg = Filename of .tmx or .xml file\n")
print("example usage: \'tilemap2h pyxel 4 tilemap.xml\'")
wait = input("PRESS ENTER TO CONTINUE.")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment