Last active
July 7, 2017 16:38
-
-
Save NullMember/967dd2b548d5f33ce43ccce9a6bc742f to your computer and use it in GitHub Desktop.
tilemap2h: Convert tilemap .xml or .tmx map file to cpp header file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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