Skip to content

Commit ef9496b

Browse files
committed
Added script to generate [build]_abilities.csv file from balance data exports.
1 parent d46a21e commit ef9496b

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed

generate_abilities.py

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

0 commit comments

Comments
 (0)