From 398630d51ed4ca8f0a5fd7daec74259d5885a86c Mon Sep 17 00:00:00 2001 From: walterroach <37820425+walterroach@users.noreply.github.com> Date: Thu, 12 Nov 2020 21:51:54 -0600 Subject: [PATCH] initial tooling --- .../mizdata/caucasus/caucusus_frontline.miz | Bin 0 -> 7464 bytes resources/tools/generate_frontlines.py | 74 ++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 resources/mizdata/caucasus/caucusus_frontline.miz create mode 100644 resources/tools/generate_frontlines.py diff --git a/resources/mizdata/caucasus/caucusus_frontline.miz b/resources/mizdata/caucasus/caucusus_frontline.miz new file mode 100644 index 0000000000000000000000000000000000000000..06fa3d506365b3130aeabb35c4b5b8050e9f9123 GIT binary patch literal 7464 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 literal 0 HcmV?d00001 diff --git a/resources/tools/generate_frontlines.py b/resources/tools/generate_frontlines.py new file mode 100644 index 00000000..c1346bc9 --- /dev/null +++ b/resources/tools/generate_frontlines.py @@ -0,0 +1,74 @@ +from __future__ import annotations + +import json +import argparse +from pathlib import Path +from typing import List, Tuple, Union, Dict + +from dcs.terrain import Caucasus, PersianGulf, Syria, Nevada, Normandy, TheChannel +from dcs import Mission + +Terrain = Union[Caucasus, PersianGulf, Syria, Nevada, Normandy, TheChannel] + +SAVE_PATH = Path("resources/frontlines") + +def validate_miz(file_path: Path) -> bool: + return bool(file_path.suffix == ".miz" and file_path.exists()) + +def validate_airports(airports: Tuple[int], terrain: Terrain): + for airport in airports: + if terrain.airport_by_id(airport) is None: + print(f"Cannot load airport for invalid id {airport}") + +def load_files(files) -> List[Mission]: + missions = [] + for file in files: + if validate_miz(file): + mission = Mission() + mission.load_file(file) + missions.append(mission) + else: + print(f"Error: {file} doesn't look like a valid mission file.") + return missions + +def create_frontline_dict(mission: Mission) -> Dict[str, Dict]: + frontline_dict = {} + for group in mission.country("USA").vehicle_group: + groupname = str(group.name).replace(group.name.id, "").replace(":","") + control_points = groupname.split("|") + frontline_dict[groupname] = { + "points": [(i.position.x, i.position.y) for i in group.points], + "start_cp": int(control_points[0]) + } + return frontline_dict + +def process_missions(missions: List[Mission]) -> None: + for mission in missions: + frontline_dict = create_frontline_dict(mission) + write_json(frontline_dict, mission.terrain.name.lower()) + +def write_json(frontline_dict: Dict[str, Dict], terrain_name: str) -> None: + with open(SAVE_PATH.joinpath(terrain_name + ".json"), "w") as file: + json.dump(frontline_dict, file) + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Process a miz file to create json descriptions of multi-segment frontlines" + ) + parser.add_argument( + "files", + metavar="N", + type=Path, + nargs="+", + help="A list of space separated .miz files to extract frontlines from", + ) + + args = parser.parse_args() + missions = load_files(args.files) + process_missions(missions) + # frontline_dict = create_frontline_dict(missions[0]) + + print("Done") + + +