Skip to content

Commit e89e0fc

Browse files
authored
Merge pull request #22 from frugs/master
Added script to generate [build]_abilities.csv file from balance data…
2 parents d46a21e + b9e4628 commit e89e0fc

File tree

1 file changed

+102
-0
lines changed

1 file changed

+102
-0
lines changed

generate_build_data.py

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import argparse
2+
import collections
3+
import csv
4+
import glob
5+
import os
6+
import xml.etree.ElementTree
7+
8+
9+
def generate_build_data(balance_data_path):
10+
abilities = {}
11+
units = {}
12+
13+
for xml_file_path in glob.glob(os.path.join(balance_data_path, "*.xml")):
14+
tree = xml.etree.ElementTree.parse(xml_file_path)
15+
root = tree.getroot()
16+
17+
for ability_element in root.findall("./abilities/ability"):
18+
if ability_element.get("index") and ability_element.get("id"):
19+
abilities[ability_element.get("index")] = ability_element.get("id")
20+
21+
unit_name = root.get("id")
22+
23+
meta_element = root.find("./meta")
24+
25+
if unit_name and meta_element is not None and meta_element.get("index"):
26+
units[meta_element.get("index")] = unit_name
27+
28+
build_unit_element = root.find("./builds/unit")
29+
if build_unit_element is not None:
30+
build_ability_index = build_unit_element.get("ability")
31+
32+
if unit_name == "SCV":
33+
build_ability_name = "TerranBuild"
34+
elif unit_name == "Probe":
35+
build_ability_name = "ProtossBuild"
36+
elif unit_name == "Drone":
37+
build_ability_name = "ZergBuild"
38+
else:
39+
build_ability_name = "{}Build".format(unit_name)
40+
41+
if build_ability_index:
42+
abilities[build_ability_index] = build_ability_name
43+
44+
train_unit_elements = root.findall("./trains/unit")
45+
if train_unit_elements:
46+
train_ability_index = train_unit_elements[0].get("ability")
47+
48+
if train_ability_index:
49+
abilities[train_ability_index] = "{}Train".format(unit_name)
50+
51+
# Handle cases where a unit can train other units using multiple ability indices.
52+
# The Nexus is currently the only known example.
53+
for element in train_unit_elements[1:]:
54+
element_ability_index = element.get("ability")
55+
trained_unit_name = element.get("id")
56+
57+
if element_ability_index != train_ability_index and trained_unit_name:
58+
train_ability_index = element_ability_index
59+
60+
abilities[train_ability_index] = "{}Train{}".format(unit_name, trained_unit_name)
61+
62+
research_upgrade_element = root.find("./researches/upgrade")
63+
if research_upgrade_element is not None:
64+
research_ability_index = research_upgrade_element.get("ability")
65+
research_ability_name = "{}Research".format(unit_name)
66+
67+
abilities[research_ability_index] = research_ability_name
68+
69+
sorted_abilities = collections.OrderedDict(sorted(abilities.items(), key=lambda x: int(x[0])))
70+
sorted_units = collections.OrderedDict(sorted(units.items(), key=lambda x: int(x[0])))
71+
72+
return sorted_units, sorted_abilities
73+
74+
75+
def main():
76+
parser = argparse.ArgumentParser(description='Generate [BUILD_VERSION]_abilities.csv and [BUILD_VERSION]_units.csv'
77+
' files from exported balance data.')
78+
parser.add_argument('build_version', metavar='BUILD_VERSION', type=int,
79+
help='the build version of the balance data export')
80+
parser.add_argument('balance_data_path', metavar='BALANCE_DATA_PATH', type=str,
81+
help='the path to the balance data export')
82+
83+
args = parser.parse_args()
84+
85+
units, abilities = generate_build_data(args.balance_data_path)
86+
87+
if not units or not abilities:
88+
raise ValueError("No balance data found at provided balance data path.")
89+
90+
with open('{}_units.csv'.format(args.build_version), 'w', newline='') as csvfile:
91+
csv_writer = csv.writer(csvfile, delimiter=',')
92+
for unit_index, unit_name in units.items():
93+
csv_writer.writerow([unit_index, unit_name])
94+
95+
with open('{}_abilities.csv'.format(args.build_version), 'w', newline='') as csvfile:
96+
csv_writer = csv.writer(csvfile, delimiter=',')
97+
for ability_index, ability_name in abilities.items():
98+
csv_writer.writerow([ability_index, ability_name])
99+
100+
101+
if __name__ == "__main__":
102+
main()

0 commit comments

Comments
 (0)