1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-05-05 09:51:04 +03:00
EDMarketConnector/coriolis-update-files.py
David Sangrey 65273742d0
[#1775] Retire Usage of Assert
Removes assert statements from EDMC non-test code, paving the way to enable -OO code.
2025-04-27 21:58:01 -04:00

98 lines
3.8 KiB
Python
Executable File

#!/usr/bin/env python3
"""
coriolis-update-files.py - Build ship and module databases from https://github.com/EDCD/coriolis-data/.
Copyright (c) EDCD, All Rights Reserved
Licensed under the GNU General Public License.
See LICENSE file.
This script also utilizes the file outfitting.csv. Due to how collate.py
both reads and writes to this file, a local copy in the root of the
project structure is used for this purpose. If you want to utilize the
FDevIDs/ version of the file, copy it over the local one.
"""
import json
import subprocess
import sys
import outfitting
from edmc_data import coriolis_ship_map, ship_name_map
if __name__ == "__main__": # noqa: C901
def add(modules, name, attributes) -> None:
"""Add the given module to the modules dict."""
if name in modules and modules[name] != attributes:
raise ValueError(f'{name}: {modules.get(name)} != {attributes}')
if name in modules:
raise ValueError(f'{name} already exists in modules')
modules[name] = attributes
try:
# Regenerate coriolis-data distribution
subprocess.check_call('npm install', cwd='coriolis-data', shell=True, stdout=sys.stdout, stderr=sys.stderr)
except NotADirectoryError:
sys.exit("Coriolis-Data Directory not found! Have you set up your submodules? \n"
"https://github.com/EDCD/EDMarketConnector/wiki/Running-from-source#obtain-a-copy-of-the-application-source") # noqa: E501
file_path = 'coriolis-data/dist/index.json'
with open(file_path) as file:
data = json.load(file)
# Symbolic name from in-game name
reverse_ship_map = {v: k for k, v in list(ship_name_map.items())}
bulkheads = list(outfitting.armour_map.keys())
ships = {}
modules = {}
# Ship and armour masses
for m in list(data['Ships'].values()):
name = coriolis_ship_map.get(m['properties']['name'], str(m['properties']['name']))
if name not in reverse_ship_map:
raise ValueError(f'Unknown ship: {name}')
ships[name] = {'hullMass': m['properties']['hullMass'],
'reserveFuelCapacity': m['properties']['reserveFuelCapacity']}
for i, bulkhead in enumerate(bulkheads):
modules['_'.join([reverse_ship_map[name], 'armour', bulkhead])] = {'mass': m['bulkheads'][i]['mass']}
ships = {k: ships[k] for k in sorted(ships)}
with open("ships.json", "w") as ships_file:
json.dump(ships, ships_file, indent=4)
# Module masses
for cat in list(data['Modules'].values()):
for grp, mlist in list(cat.items()):
for m in mlist:
if 'symbol' not in m:
raise ValueError(f'No symbol in {m}')
key = str(m['symbol'].lower())
if grp == 'fsd':
modules[key] = {
'mass': m['mass'],
'optmass': m['optmass'],
'maxfuel': m['maxfuel'],
'fuelmul': m['fuelmul'],
'fuelpower': m['fuelpower'],
}
elif grp == 'gfsb':
modules[key] = {
'mass': m['mass'],
'jumpboost': m['jumpboost'],
}
else:
modules[key] = {'mass': m.get('mass', 0)} # Some modules don't have mass
# Pre 3.3 modules
add(modules, 'int_stellarbodydiscoveryscanner_standard', {'mass': 2})
add(modules, 'int_stellarbodydiscoveryscanner_intermediate', {'mass': 2})
add(modules, 'int_stellarbodydiscoveryscanner_advanced', {'mass': 2})
modules = {k: modules[k] for k in sorted(modules)}
with open("modules.json", "w") as modules_file:
json.dump(modules, modules_file, indent=4)