mirror of
https://github.com/Pax1601/DCSOlympus.git
synced 2025-10-29 16:56:34 +00:00
152 lines
6.8 KiB
Python
152 lines
6.8 KiB
Python
from slpp import slpp as lua
|
|
import sys
|
|
import os
|
|
import json
|
|
import logging
|
|
|
|
SEARCH_FOLDER = sys.argv[1]
|
|
|
|
clsid_conversion = {
|
|
'ExtFuelTankID' : "{EFT_230GAL}" ,
|
|
'InternalFuelTank100' : "{IAFS_ComboPak_100}" ,
|
|
'NURSLauncherID_MK151' : "M261_MK151" ,
|
|
'NURSLauncherID_M229' : "{M261_M229}" ,
|
|
'NURSLauncherID_M257' : "{M261_M257}" ,
|
|
'NURSLauncherID_M274' : "{M261_M274}" ,
|
|
'NURSLauncherID_M282' : "{M261_M282}" ,
|
|
'NURSLauncherID_M433' : "{M261_M151_M433}" ,
|
|
'NURSLauncherID_M151_M274_OUTBOARD' : "{M261_OUTBOARD_AB_M151_E_M274}" ,
|
|
'NURSLauncherID_M151_M257_OUTBOARD' : "{M261_OUTBOARD_AB_M151_E_M257}" ,
|
|
'NURSLauncherID_M274_M151_INBOARD' : "{M261_INBOARD_DE_M151_C_M274}" ,
|
|
'NURSLauncherID_M257_M151_INBOARD' : "{M261_INBOARD_DE_M151_C_M257}" ,
|
|
'HellfireLauncherID_AGM114K_0' : "{M299_EMPTY}" ,
|
|
'HellfireLauncherID_AGM114K_4' : "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}" ,
|
|
'HellfireLauncherID_AGM114K_3_L' : "{M299_3xAGM_114K_OUTBOARD_PORT}" ,
|
|
'HellfireLauncherID_AGM114K_3_R' : "{M299_3xAGM_114K_OUTBOARD_STARBOARD}" ,
|
|
'HellfireLauncherID_AGM114K_2' : "{M299_2xAGM_114K}" ,
|
|
'HellfireLauncherID_AGM114K_1_L' : "{M299_1xAGM_114K_OUTBOARD_PORT}" ,
|
|
'HellfireLauncherID_AGM114K_1_R' : "{M299_1xAGM_114K_OUTBOARD_STARBOARD}" ,
|
|
'HellfireLauncherID_AGM114L_4' : "{M299_4xAGM_114L}" ,
|
|
'HellfireLauncherID_AGM114L_3_L' : "{M299_3xAGM_114L_OUTBOARD_PORT}" ,
|
|
'HellfireLauncherID_AGM114L_3_R' : "{M299_3xAGM_114L_OUTBOARD_STARBOARD}" ,
|
|
'HellfireLauncherID_AGM114L_2' : "{M299_2xAGM_114L}" ,
|
|
'HellfireLauncherID_AGM114L_1_L' : "{M299_1xAGM_114L_OUTBOARD_PORT}" ,
|
|
'HellfireLauncherID_AGM114L_1_R' : "{M299_1xAGM_114L_OUTBOARD_STARBOARD}" ,
|
|
'HellfireLauncherID_AGM114_1K3L_L' : "{M299_1xAGM_114K_3xAGM_114L_PRT}" ,
|
|
'HellfireLauncherID_AGM114_1K3L_R' : "{M299_1xAGM_114K_3xAGM_114L_STRBRD}" ,
|
|
'HellfireLauncherID_AGM114_2K2L' : "{M299_2xAGM_114K_2xAGM_114L}" ,
|
|
'HellfireLauncherID_AGM114_3K1L_R' : "{M299_3xAGM_114K_1xAGM_114L_STRBRD}" ,
|
|
'HellfireLauncherID_AGM114_3K1L_L' : "{M299_3xAGM_114K_1xAGM_114L_PRT}" ,
|
|
}
|
|
|
|
def convert_clsid(clsid):
|
|
if clsid in clsid_conversion:
|
|
return clsid_conversion[clsid]
|
|
else:
|
|
return clsid
|
|
|
|
def dump_lua(data):
|
|
if type(data) is str:
|
|
return f'"{data}"'
|
|
if type(data) in (int, float):
|
|
return f'{data}'
|
|
if type(data) is bool:
|
|
return data and "true" or "false"
|
|
if type(data) is list:
|
|
l = "{"
|
|
l += ",\n ".join([dump_lua(item) for item in data])
|
|
l += "}"
|
|
return l
|
|
if type(data) is dict:
|
|
t = "{"
|
|
t += ",\n ".join([f'[{k}] = {dump_lua(v)}' if type(k) == int else f'["{k}"]={dump_lua(v)}' for k,v in data.items()])
|
|
t += "}"
|
|
return t
|
|
|
|
logging.error(f"Unknown type {type(data)}")
|
|
|
|
filenames = [os.path.join(dp, f) for dp, dn, filenames in os.walk(SEARCH_FOLDER) for f in filenames if os.path.splitext(f)[1] == '.lua']
|
|
|
|
for filename in list(filenames):
|
|
with open(filename, 'r') as f:
|
|
try:
|
|
if f.read().find("unitPayloads") == -1:
|
|
filenames.remove(filename)
|
|
except:
|
|
filenames.remove(filename)
|
|
logging.warning(f"{filename} skipped...")
|
|
pass
|
|
|
|
names = {}
|
|
payloads = {}
|
|
roles = {}
|
|
for filename in filenames:
|
|
with open(os.path.join(os.getcwd(), filename), 'r') as f: # open in readonly mode
|
|
try:
|
|
lines = f.read()
|
|
searchString = "local unitPayloads = {"
|
|
start = lines.find(searchString)
|
|
end = lines.rfind("}")
|
|
tmp = lua.decode(lines[start + len(searchString) - 1: end + 1])
|
|
if type(tmp['payloads']) == dict:
|
|
src = tmp['payloads'].values()
|
|
else:
|
|
src = tmp['payloads']
|
|
|
|
print(f"Processing {filename} with {len(src)} payloads, detected unit name {tmp['unitType']}")
|
|
|
|
names[tmp['unitType']] = []
|
|
roles[tmp['unitType']] = {}
|
|
payloads[tmp['unitType']] = {}
|
|
for payload in src:
|
|
names[tmp['unitType']].append(payload['name'])
|
|
roles[tmp['unitType']][payload['name']] = payload['tasks']
|
|
|
|
# The Tomcats are a bit special
|
|
if (tmp['unitType'] in ["F-14A-95-GR", "F-14A-135-GR", "F-14B"]):
|
|
pylonConversion = {
|
|
"pylon_1A": 1,
|
|
"pylon_1B": 2,
|
|
"pylon_2": 3,
|
|
"pylon_3": 4,
|
|
"pylon_4": 5,
|
|
"pylon_5": 6,
|
|
"pylon_6": 7,
|
|
"pylon_7": 8,
|
|
"pylon_8B": 9,
|
|
"pylon_8A": 10
|
|
}
|
|
if type(payload['pylons']) == dict:
|
|
payloads[tmp['unitType']][payload['name']] = {pylonConversion[payload['pylons'][key]['num']]: {"CLSID" : convert_clsid(payload['pylons'][key]['CLSID'])} for key in payload['pylons']}
|
|
else:
|
|
payloads[tmp['unitType']][payload['name']] = {pylonConversion[payload['pylons'][key]['num']]: {"CLSID" : convert_clsid(payload['pylons'][key]['CLSID'])} for key in range(len(payload['pylons']))}
|
|
else:
|
|
if type(payload['pylons']) == dict:
|
|
payloads[tmp['unitType']][payload['name']] = {payload['pylons'][key]['num']: {"CLSID" : convert_clsid(payload['pylons'][key]['CLSID'])} for key in payload['pylons']}
|
|
else:
|
|
payloads[tmp['unitType']][payload['name']] = {payload['pylons'][key]['num']: {"CLSID" : convert_clsid(payload['pylons'][key]['CLSID'])} for key in range(len(payload['pylons']))}
|
|
except:
|
|
pass
|
|
|
|
with open('payloadRoles.json', 'w') as f:
|
|
json.dump(roles, f, ensure_ascii = False, indent = 2)
|
|
|
|
with open('unitPayloads.lua', 'w') as f:
|
|
f.write("Olympus.unitPayloads = " + dump_lua(payloads))
|
|
|
|
# Iterate over the payloads and accumulate the pylon data
|
|
pylon_usage = {}
|
|
for unitType, unitPayloads in payloads.items():
|
|
pylon_usage[unitType] = {}
|
|
for payloadName, pylons in unitPayloads.items():
|
|
for pylonID, pylonData in pylons.items():
|
|
# Keep track of what CLSIDs are used on each pylon
|
|
clsid = pylonData['CLSID']
|
|
if pylonID not in pylon_usage[unitType]:
|
|
pylon_usage[unitType][pylonID] = []
|
|
if clsid not in pylon_usage[unitType][pylonID]:
|
|
pylon_usage[unitType][pylonID].append(clsid)
|
|
|
|
# Save the pylon usage data to a JSON file
|
|
with open('pylonUsage.json', 'w') as f:
|
|
json.dump(pylon_usage, f, ensure_ascii=False, indent=2) |