3
import xml.dom.minidom as dom
9
struct_fmt = "<H BBHBBBB 8B8B8b8b8b8b8H bbBBBB"
11
def pack_weapon(dict):
14
l.append(dict['drain'])
15
l.append(dict['shotRepeat'])
16
l.append(dict['multi'])
17
l.append(dict['weapAni'])
23
tmp = dict['patterns']
25
l.append(tmp[j]['attack'])
27
l.append(tmp[j]['del'])
29
l.append(tmp[j]['sx'])
31
l.append(tmp[j]['sy'])
33
l.append(tmp[j]['bx'])
35
l.append(tmp[j]['by'])
37
l.append(tmp[j]['sg'])
39
l.append(dict['acceleration'])
40
l.append(dict['accelerationx'])
41
l.append(dict['circleSize'])
42
l.append(dict['sound'])
43
l.append(dict['trail'])
44
l.append(dict['shipBlastFilter'])
46
return struct.pack(struct_fmt, *l)
48
def unpack_weapon(str):
49
tup = struct.unpack(struct_fmt, str)
52
dict['drain'] = tup[0]
53
dict['shotRepeat'] = tup[1]
54
dict['multi'] = tup[2]
55
dict['weapAni'] = tup[3]
63
tmp = [{} for j in xrange(8)]
65
tmp[j]['attack'] = tup[i]
68
tmp[j]['del'] = tup[i]
85
dict['patterns'] = tmp
87
dict['acceleration'] = tup[i]
88
dict['accelerationx'] = tup[i+1]
89
dict['circleSize'] = tup[i+2]
90
dict['sound'] = tup[i+3]
91
dict['trail'] = tup[i+4]
92
dict['shipBlastFilter'] = tup[i+5]
96
def DOMToDict(doc, weap_node):
99
for i in weap_node.childNodes:
100
if i.nodeType != i.ELEMENT_NODE:
103
if i.hasAttribute("value"):
104
dict[i.tagName] = int(i.getAttribute("value"))
105
elif i.tagName == "patterns":
106
dict['patterns'] = [{} for el in xrange(8)]
108
for j in i.childNodes:
109
if j.nodeType != i.ELEMENT_NODE:
112
attrs = [j.attributes.item(i) for i in xrange(j.attributes.length)]
114
dict['patterns'][index][i.name] = int(i.nodeValue)
119
def dictToDOM(doc, root, dict, index=None):
120
entry = doc.createElement("weapon")
122
entry.setAttribute("index", "%04X" % (index,))
127
node = doc.createElement(i)
128
if isinstance(dict[i], list):
133
n = doc.createElement("entry")
135
n.setAttribute(i, str(j[i]))
138
node.setAttribute("value", str(dict[i]))
139
entry.appendChild(node)
141
root.appendChild(entry)
143
def toXML(hdt, output):
144
doc = dom.getDOMImplementation().createDocument(None, "TyrianHDT", None)
149
print "%s couldn't be opened for reading." % (hdt,)
153
outf = file(output, "w")
155
print "%s couldn't be opened for writing." % (outf,)
158
f.seek(struct.unpack("<i", f.read(4))[0])
162
sys.stdout.write("Converting weapons")
165
for i in xrange(WEAP_NUM+1):
166
tmp = f.read(struct.calcsize(struct_fmt))
167
shot = unpack_weapon(tmp)
168
dictToDOM(doc, doc.documentElement, shot, index)
171
sys.stdout.write(".")
174
sys.stdout.write("Done!\n")
175
sys.stdout.write("Writing XML...")
177
doc.writexml(outf, addindent="\t", newl="\n")
178
sys.stdout.write("Done!\n")
180
def toHDT(input, hdt):
184
print "%s couldn't be opened for reading." % (input,)
188
outf = file(hdt, "r+b")
190
print "%s couldn't be opened for writing." % (hdt,)
193
outf.seek(struct.unpack("<i", outf.read(4))[0])
196
sys.stdout.write("Reading XML...")
199
sys.stdout.write("Done!\n")
201
sys.stdout.write("Writing weapons")
203
for i in doc.documentElement.childNodes:
204
if i.nodeType != i.ELEMENT_NODE:
207
shot = DOMToDict(doc, i)
208
str = pack_weapon(shot)
212
sys.stdout.write(".")
215
sys.stdout.write("Done!\n")
218
print "Usage: weapons.py toxml path/to/tyrian.hdt output.xml"
219
print " weapons.py tohdt input.xml path/to/tyrian.hdt"
222
##############################
224
if __name__ == "__main__":
225
if len(sys.argv) != 4:
228
if sys.argv[1] == "toxml":
229
toXML(sys.argv[2], sys.argv[3])
230
elif sys.argv[1] == "tohdt":
231
toHDT(sys.argv[2], sys.argv[3])