zhexu14 5af4e56f30
Add hit points to unit yamls.
This PR:

- Introduces a new member of UnitType, hit_points, which is an abstract
representation of the durability of a unit, and loads it in from the
YAML files in the various subclasses (Ship, Ground etc).
- Adds scripts for populating/updating the unit YAML files with hit
point data from DCS. This script also gets the data for static objects,
but I'll leave the plugging in of static object data into Liberation for
another PR.
- Updates the unit YAML files by running the above scripts.

I did toy with the idea of adding this data to the unit definitions in
pydcs via an export from DCS, but it would be a more involved change,
since the current pydcs export script runs in the Hooks Lua environment
in DCS and AFAICT the hit points (via Unit.getLife()) is run in the
mission scripting environment.
2024-01-04 00:49:33 -08:00

57 lines
1.7 KiB
Python

import csv
import os
import yaml
def update_yaml(file: str, hit_points: int) -> None:
with open(file, "r") as f:
data = f.readlines()
# strip trailing whitespace
while not len(data[-1]) and len(data) > 0:
data = data[0:-1]
# append trailing newline
if data[-1][-1] != "\n":
data[-1] += "\n"
# update, ignore existing hit_points settings
found = False
key = "hit_points"
for line in data:
if line[0 : len(key) + 1] == f"{key}:":
line = f"{key}: {hit_points}\n"
found = True
if not found:
data.append(f"{key}: {hit_points}\n")
with open(file, "w") as f:
f.writelines(data)
if __name__ == "__main__":
hit_points_file = os.path.join(os.path.dirname(__file__), "hit_points_data.csv")
resources_path = os.path.join(os.path.dirname(__file__), "..", "..", "resources")
resource_type_paths = {
"ship": "units\\ships",
"helicopter": "units\\aircraft",
"plane": "units\\aircraft",
"vehicle": "units\\ground_units",
}
with open(hit_points_file, "r") as file:
reader = csv.DictReader(file, fieldnames=["type", "name", "hit_points"])
for line in reader:
if line["type"] not in resource_type_paths:
continue
yaml_file = os.path.join(
resources_path,
resource_type_paths[line["type"]],
f"{line['name']}.yaml",
)
if not os.path.exists(yaml_file):
print(f"Skipping {line['name']} as YAML file could not be found")
continue
update_yaml(yaml_file, int(float(line["hit_points"])))