@@ -155,47 +155,98 @@ def generate_build_data(balance_data_path):
155
155
sorted_units = collections .OrderedDict (sorted (units .items (), key = lambda x : int (x [0 ])))
156
156
sorted_abilities = collections .OrderedDict (sorted (abilities .items (), key = lambda x : int (x [0 ])))
157
157
158
- unit_lookup = [[ unit_name , unit_name ] for _ , unit_name in sorted_units .items ()]
158
+ unit_lookup = dict (( unit_name , unit_name ) for _ , unit_name in sorted_units .items ())
159
159
160
160
return sorted_units , sorted_abilities , unit_lookup , ability_lookup
161
161
162
162
163
+ def combine_lookups (old_unit_lookup , old_ability_lookup , new_unit_lookup , new_ability_lookup ):
164
+ unit_lookup = collections .OrderedDict (old_unit_lookup )
165
+ ability_lookup = collections .OrderedDict (old_ability_lookup )
166
+
167
+ # Just straightforwardly add any missing units
168
+ unit_lookup .update (new_unit_lookup )
169
+
170
+ # When merging old and new ability lookups, prefer to overwrite old cell data with new cell data when merging rows
171
+ # in the case of a key clash, but preserve old cell data if cell is empty in new ability lookup table
172
+ for ability_name , commands in new_ability_lookup .items ():
173
+ if ability_name not in ability_lookup :
174
+ ability_lookup [ability_name ] = commands
175
+ else :
176
+ for i , command in enumerate (commands ):
177
+ # Pad potential gaps with empty commands
178
+ while len (ability_lookup [ability_name ]) <= i :
179
+ ability_lookup [ability_name ].append ("" )
180
+
181
+ if command != "" :
182
+ ability_lookup [ability_name ][i ] = command
183
+
184
+ return unit_lookup , ability_lookup
185
+
186
+
163
187
def main ():
164
- parser = argparse .ArgumentParser (description = 'Generate [BUILD_VERSION]_abilities.csv, [BUILD_VERSION]_units.csv,'
165
- ' ability_lookup.csv and unit_lookup.csv files from exported balance'
166
- ' data.' )
188
+ parser = argparse .ArgumentParser (description = 'Generate and install new [BUILD_VERSION]_abilities.csv, '
189
+ '[BUILD_VERSION]_units.csv, and update ability_lookup.csv and '
190
+ 'unit_lookup.csv files with any new units and ability commands.' )
191
+ parser .add_argument ('expansion' , metavar = 'EXPANSION' , type = str , choices = ['WoL' , 'HotS' , 'LotV' ],
192
+ help = 'the expansion level of the balance data export, one of \' WoL\' , \' HotS\' , or \' LotV\' ' )
167
193
parser .add_argument ('build_version' , metavar = 'BUILD_VERSION' , type = int ,
168
194
help = 'the build version of the balance data export' )
169
195
parser .add_argument ('balance_data_path' , metavar = 'BALANCE_DATA_PATH' , type = str ,
170
196
help = 'the path to the balance data export' )
197
+ parser .add_argument ('project_path' , metavar = 'SC2READER_PROJECT_PATH' , type = str ,
198
+ help = 'the path to the root of the sc2reader project directory' )
171
199
172
200
args = parser .parse_args ()
173
201
174
- units , abilities , unit_lookup , ability_lookup = generate_build_data (args .balance_data_path )
202
+ units , abilities , new_unit_lookup , new_ability_lookup = generate_build_data (args .balance_data_path )
175
203
176
204
if not units or not abilities :
177
205
parser .print_help ()
178
206
print ("\n " )
179
207
180
208
raise ValueError ("No balance data found at provided balance data path." )
181
209
182
- with open ('{}_units.csv' .format (args .build_version ), 'w' , newline = '' ) as csvfile :
183
- csv_writer = csv .writer (csvfile , delimiter = ',' , lineterminator = os .linesep )
210
+ unit_lookup_path = os .path .join (args .project_path , 'sc2reader' , 'data' , 'unit_lookup.csv' )
211
+ with open (unit_lookup_path , 'r' ) as file :
212
+ csv_reader = csv .reader (file , delimiter = ',' , lineterminator = os .linesep )
213
+ old_unit_lookup = collections .OrderedDict ([(row [0 ], row [1 ]) for row in csv_reader if len (row ) > 1 ])
214
+
215
+ ability_lookup_path = os .path .join (args .project_path , 'sc2reader' , 'data' , 'ability_lookup.csv' )
216
+ with open (ability_lookup_path , 'r' ) as file :
217
+ csv_reader = csv .reader (file , delimiter = ',' , lineterminator = os .linesep )
218
+ old_ability_lookup = collections .OrderedDict ([(row [0 ], row [1 :]) for row in csv_reader if len (row ) > 0 ])
219
+
220
+ if not old_unit_lookup or not old_ability_lookup :
221
+ parser .print_help ()
222
+ print ("\n " )
223
+
224
+ raise ValueError ("Could not find existing unit or ability lookups. Is the sc2reader project path correct?" )
225
+
226
+ unit_lookup , ability_lookup = combine_lookups (
227
+ old_unit_lookup , old_ability_lookup , new_unit_lookup , new_ability_lookup )
228
+
229
+ units_file_path = os .path .join (
230
+ args .project_path , 'sc2reader' , 'data' , args .expansion , '{}_units.csv' .format (args .build_version ))
231
+ with open (units_file_path , 'w' ) as file :
232
+ csv_writer = csv .writer (file , delimiter = ',' , lineterminator = os .linesep )
184
233
for unit_index , unit_name in units .items ():
185
234
csv_writer .writerow ([unit_index , unit_name ])
186
235
187
- with open ('{}_abilities.csv' .format (args .build_version ), 'w' , newline = '' ) as csvfile :
188
- csv_writer = csv .writer (csvfile , delimiter = ',' , lineterminator = os .linesep )
236
+ abilities_file_path = os .path .join (
237
+ args .project_path , 'sc2reader' , 'data' , args .expansion , '{}_abilities.csv' .format (args .build_version ))
238
+ with open (abilities_file_path , 'w' ) as file :
239
+ csv_writer = csv .writer (file , delimiter = ',' , lineterminator = os .linesep )
189
240
for ability_index , ability_name in abilities .items ():
190
241
csv_writer .writerow ([ability_index , ability_name ])
191
242
192
- with open ('unit_lookup.csv' . format ( args . build_version ) , 'w' , newline = '' ) as csvfile :
193
- csv_writer = csv .writer (csvfile , delimiter = ',' , lineterminator = os .linesep )
194
- for lookup_entry in unit_lookup :
195
- csv_writer .writerow (lookup_entry )
243
+ with open (unit_lookup_path , 'w' ) as file :
244
+ csv_writer = csv .writer (file , delimiter = ',' , lineterminator = os .linesep )
245
+ for entry in unit_lookup . items () :
246
+ csv_writer .writerow (list ( entry ) )
196
247
197
- with open ('ability_lookup.csv' . format ( args . build_version ) , 'w' , newline = '' ) as csvfile :
198
- csv_writer = csv .writer (csvfile , delimiter = ',' , lineterminator = os .linesep )
248
+ with open (ability_lookup_path , 'w' ) as file :
249
+ csv_writer = csv .writer (file , delimiter = ',' , lineterminator = os .linesep )
199
250
for ability_name , commands in ability_lookup .items ():
200
251
csv_writer .writerow ([ability_name ] + commands )
201
252
0 commit comments