openclonk/tools/convert_cr_to_oc.py

116 lines
3.7 KiB
Python

#!/usr/bin/python
import os
import re
namere = re.compile("([^=]+)=(.+)");
langre = re.compile("(..):(.+)");
localre = re.compile("local (\w+) ?= ?(.+);");
idre = re.compile("[A-Z0-9_][A-Z0-9_][A-Z0-9_][A-Z0-9_]")
def convertname(root, files, name):
names = {}
r = "\"" + name + "\""
if "Names.txt" in files:
f = open(os.path.join(root, "Names.txt"),"Ur")
for line in f:
m = langre.match(line)
if m:
names[m.group(1)] = m.group(2)
f.close()
os.unlink(os.path.join(root, "Names.txt"))
r = "\"$Name$\""
else:
print root, name
for lang, localname in names.iteritems():
if "StringTbl" + lang + ".txt" in files:
lines = open(os.path.join(root, "StringTbl" + lang + ".txt"),"rb").read().splitlines()
else:
lines = ()
f = open(os.path.join(root, "StringTbl" + lang + ".txt"),"wb")
for line in lines:
f.write(line)
f.write("\r\n")
f.write("Name=" + localname + "\r\n")
return r
def convertactmap(root, files):
lines = open(os.path.join(root, "ActMap.txt"),"rb").read().splitlines()
actmap = "{\r\n"
act = ""
for line in lines:
if line.find("[Action]") > -1:
if act != "":
actmap = actmap + act + "},\r\n"
act = ""
continue
m = namere.match(line)
if m and m.group(1) == "Name":
if idre.match(m.group(2)):
act = "\"" + m.group(2) + "\" = {\r\nPrototype = Action,\r\n"
else:
act = m.group(2) + " = {\r\nPrototype = Action,\r\n"
if m and m.group(1) == "Facet":
facet = m.group(2).split(",")
if len(facet) > 0: act = act + "X = " + facet[0] + ",\r\n"
if len(facet) > 1: act = act + "Y = " + facet[1] + ",\r\n"
if len(facet) > 2: act = act + "Wdt = " + facet[2] + ",\r\n"
if len(facet) > 3: act = act + "Hgt = " + facet[3] + ",\r\n"
if len(facet) > 4: act = act + "OffX = " + facet[4] + ",\r\n"
if len(facet) > 5: act = act + "OffY = " + facet[5] + ",\r\n"
elif m and m.group(1) in ("Directions", "FlipDir", "Length", "Attach", "Delay",
"FacetBase", "FacetTopFace", "FacetTargetStretch", "NoOtherAction",
"ObjectDisabled", "DigFree","EnergyUsage", "Reverse", "Step"):
act = act + m.group(1) + " = " + m.group(2) + ",\r\n"
elif m and m.group(1) == "Procedure":
act = act + m.group(1) + " = DFA_" + m.group(2).strip() + ",\r\n"
elif m and m.group(1) in ("StartCall", "EndCall", "PhaseCall", "AbortCall"):
if m.group(2) != "None":
act = act + m.group(1) + " = \"" + m.group(2).strip() + "\",\r\n"
elif m:
act = act + m.group(1) + " = \"" + m.group(2) + "\",\r\n"
if act != "":
actmap = actmap + act + "}, "
os.unlink(os.path.join(root, "ActMap.txt"))
return actmap + " }"
for root, dirs, files in os.walk('.'):
if not "DefCore.txt" in files:
continue
lines = open(os.path.join(root, "DefCore.txt"),"Ur").read().splitlines()
f = open(os.path.join(root, "DefCore.txt"),"w")
properties = {}
for line in lines:
m = namere.match(line)
if m and m.group(1) == "Name":
properties["Name"] = convertname(root, files, m.group(2))
elif m and m.group(1) == "Collectible":
properties["Collectible"] = m.group(2)
elif m and m.group(1) == "Grab":
properties["Touchable"] = m.group(2)
else:
f.write(line)
f.write("\n")
if "ActMap.txt" in files:
properties["ActMap"] = convertactmap(root, files)
try:
f = open(os.path.join(root, "Script.c"),"r+b")
lines = f.read().splitlines()
except:
lines = ("")
if lines == ("") and properties == {}:
continue
f = open(os.path.join(root, "Script.c"),"wb")
for i, line in enumerate(lines):
m = localre.match(line)
if m:
if properties.get(m.group(1)):
print root, m.group(1), properties.get(m.group(1)), m.group(2)
properties.pop(m.group(1), None)
f.write(line)
f.write("\n")
for prop, value in properties.iteritems():
f.write("local " + prop + " = " + value + ";\n")