Skip to content

Instantly share code, notes, and snippets.

@dorkster
Last active May 3, 2016 15:06
Show Gist options
  • Save dorkster/21ff4511689822824d9c79ec48a6138b to your computer and use it in GitHub Desktop.
Save dorkster/21ff4511689822824d9c79ec48a6138b to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# Usage:
# Run ./update_map_objects.py from base directory containing mods/ and tiled/
# OR
# Run ./update_map_objects.py FILENAME to update a single TXT or TMX file
import os
import sys
import xml.etree.ElementTree as etree
def convertModMap(filename):
temp_filename = "000_TEMPFILE.txt"
section = ""
postponed_line = ""
src = open(filename, 'r')
dest =open(temp_filename, 'w')
for line in src:
write_line = True
if line.startswith("["):
section = line.strip("[]\n\r")
if (section == "event"):
if line.startswith("type="):
write_line = False
event_type = line.lstrip("type=")
dest.write("type=event\n")
postponed_line = "activate=" + event_type
elif (section == "enemy"):
if line.startswith("type="):
write_line = False
event_type = line.lstrip("type=")
dest.write("type=enemy\n")
postponed_line = "category=" + event_type
elif (section == "npc"):
if line.startswith("type="):
write_line = False
event_type = line.lstrip("type=")
dest.write("type=npc\n")
postponed_line = "filename=" + event_type
if postponed_line != "" and line.startswith("location="):
write_line = False
dest.write(line)
dest.write(postponed_line)
postponed_line = ""
if write_line == True:
dest.write(line)
os.rename(temp_filename, filename)
def convertTiledMap(filename):
tree = etree.parse(filename)
root = tree.getroot()
for obj_group in root.iter("objectgroup"):
obj_group_name = obj_group.get("name")
if obj_group_name == "event":
for obj in obj_group.iter("object"):
obj_type = obj.get("type")
if not obj_type:
continue
obj.set("type", "event")
obj_properties = obj.find("properties")
if not obj_properties:
obj_properties = etree.SubElement(obj, "properties")
obj_properties.append(etree.fromstring('<property name="activate" value="' + obj_type + '" />'))
elif obj_group_name == "enemy":
for obj in obj_group.iter("object"):
obj_type = obj.get("type")
if not obj_type:
continue
obj.set("type", "enemy")
obj_properties = obj.find("properties")
if not obj_properties:
obj_properties = etree.SubElement(obj, "properties")
obj_properties.append(etree.fromstring('<property name="category" value="' + obj_type + '" />'))
elif obj_group_name == "npc":
for obj in obj_group.iter("object"):
obj_type = obj.get("type")
if not obj_type:
continue
obj.set("type", "npc")
obj_properties = obj.find("properties")
if not obj_properties:
obj_properties = etree.SubElement(obj, "properties")
obj_properties.append(etree.fromstring('<property name="filename" value="' + obj_type + '" />'))
tree.write(filename)
def main():
cmd_filename = ""
if len(sys.argv) > 1:
cmd_filename = sys.argv[1]
if cmd_filename.endswith(".tmx"):
convertTiledMap(cmd_filename)
elif cmd_filename.endswith(".txt"):
convertModMap(cmd_filename)
elif not cmd_filename:
# scan mods/ and tiled/ for map files
for mod_root, mod_dirs, mod_files in os.walk("mods/"):
if mod_root.endswith("/maps"):
for i in mod_files:
convertModMap(mod_root + "/" + i)
for tiled_root, tiled_dirs, tiled_files in os.walk("tiled/"):
if not tiled_root.endswith("/rules"):
for i in tiled_files:
if i.endswith(".tmx"):
convertTiledMap(tiled_root + "/" + i)
else:
print("Filename specified, but is of invalid extension.")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment