#!/usr/bin/env python3 """ MIT License Copyright (c) 2023 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ import sys import os oldexcepthook = sys.excepthook def newexcepthook(type,value,traceback): oldexcepthook(type,value,traceback) input("Press ENTER to quit.") sys.excepthook = newexcepthook p = os.path.join pUp = os.path.dirname s = False if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'): s = os.path.realpath(sys.executable) else: s = os.path.realpath(__file__) sp = pUp(s) os.chdir(sp) nfsmsScript = s.replace(sp,pUp(sp),1).rsplit(".",1)[0] + ".nfsms" propsPrefix = """\ """ properties = """\ # Handling: general/separation copy_node rigidbodyspecs cars racers ai_racers update_field pvehicle ai_racers rigidbodyspecs Collection ai_racers # Handling: general/misc update_field rigidbodyspecs racers GRAVITY -9.8128 # Handling: general/suspension update_field rigidbodyspecs racers DRAG_ANGULAR X 200 update_field rigidbodyspecs racers DRAG_ANGULAR Z 1000 update_field rigidbodyspecs racers GROUND_MOMENT_SCALE X 1 update_field rigidbodyspecs racers GROUND_MOMENT_SCALE Z 10 update_field rigidbodyspecs racers GROUND_MOMENT_SCALE W 0 update_field rigidbodyspecs racers GROUND_FRICTION[0] 0 update_field rigidbodyspecs racers GROUND_FRICTION[1] 0 update_field rigidbodyspecs ai_racers GROUND_MOMENT_SCALE X 1 update_field rigidbodyspecs ai_racers GROUND_MOMENT_SCALE Z 10 update_field rigidbodyspecs ai_racers GROUND_MOMENT_SCALE W 0 update_field rigidbodyspecs ai_racers GROUND_FRICTION[0] 0 update_field rigidbodyspecs ai_racers GROUND_FRICTION[1] 0 # Handling: general/tires update_field rigidbodyspecs racers DRAG_ANGULAR Y 0 update_field rigidbodyspecs racers GROUND_MOMENT_SCALE Y 5 update_field rigidbodyspecs ai_racers GROUND_MOMENT_SCALE Y 5 # Handling: replaceme/separation copy_node chassis replaceme ai_replaceme copy_node chassis replaceme_top ai_replaceme_top update_field pvehicle ai_replaceme chassis[0] Collection ai_replaceme update_field pvehicle ai_replaceme chassis[1] Collection ai_replaceme_top copy_node tires replaceme ai_replaceme copy_node tires replaceme_top ai_replaceme_top update_field pvehicle ai_replaceme tires[0] Collection ai_replaceme update_field pvehicle ai_replaceme tires[1] Collection ai_replaceme_top # Handling: replaceme/suspension update_field ecar replaceme BodyDive DegPerG 0 update_field ecar replaceme BodyDive DegPerSec 0 update_field ecar replaceme BodyDive MaxG 0.0 update_field ecar replaceme BodyRoll DegPerG 0.0 update_field ecar replaceme BodyRoll DegPerSec 0 update_field ecar replaceme BodyRoll MaxG 0 update_field ecar replaceme BodySquat DegPerG 0 update_field ecar replaceme BodySquat DegPerSec 0 update_field ecar replaceme BodySquat MaxG 0.0 update_field pvehicle replaceme TENSOR_SCALE X 1.2 update_field pvehicle replaceme TENSOR_SCALE Z 1.0 update_field pvehicle replaceme TENSOR_SCALE W 0.455 update_field chassis replaceme ROLL_CENTER 15 update_field chassis replaceme RIDE_HEIGHT Front 11 update_field chassis replaceme RIDE_HEIGHT Rear 11 update_field chassis replaceme SHOCK_BLOWOUT 0 update_field chassis replaceme SHOCK_DIGRESSION Front 0.15 update_field chassis replaceme SHOCK_DIGRESSION Rear 0.1 update_field chassis replaceme SHOCK_EXT_STIFFNESS Front 37 update_field chassis replaceme SHOCK_EXT_STIFFNESS Rear 38.5 update_field chassis replaceme SHOCK_STIFFNESS Front 5 update_field chassis replaceme SHOCK_STIFFNESS Rear 5 update_field chassis replaceme SHOCK_VALVING Front 5.9 update_field chassis replaceme SHOCK_VALVING Rear 5.1 update_field chassis replaceme SPRING_PROGRESSION Front 5 update_field chassis replaceme SPRING_PROGRESSION Rear 5.65 update_field chassis replaceme SPRING_STIFFNESS Front 74 update_field chassis replaceme SPRING_STIFFNESS Rear 74 update_field chassis replaceme SWAYBAR_STIFFNESS Front 37 update_field chassis replaceme SWAYBAR_STIFFNESS Rear 37 update_field chassis replaceme TRAVEL Front 10000 update_field chassis replaceme TRAVEL Rear 10000 update_field chassis replaceme AERO_COEFFICIENT 0.135 update_field chassis replaceme_top ROLL_CENTER 12 update_field chassis replaceme_top RIDE_HEIGHT Front 11 update_field chassis replaceme_top RIDE_HEIGHT Rear 11 update_field chassis replaceme_top SHOCK_BLOWOUT 0 update_field chassis replaceme_top SHOCK_DIGRESSION Front 0.3 update_field chassis replaceme_top SHOCK_DIGRESSION Rear 0.3 update_field chassis replaceme_top SHOCK_EXT_STIFFNESS Front 65 update_field chassis replaceme_top SHOCK_EXT_STIFFNESS Rear 65 update_field chassis replaceme_top SHOCK_STIFFNESS Front 6.6 update_field chassis replaceme_top SHOCK_STIFFNESS Rear 6.6 update_field chassis replaceme_top SHOCK_VALVING Front 7 update_field chassis replaceme_top SHOCK_VALVING Rear 7 update_field chassis replaceme_top SPRING_PROGRESSION Front 6.2 update_field chassis replaceme_top SPRING_PROGRESSION Rear 6.2 update_field chassis replaceme_top SPRING_STIFFNESS Front 74 update_field chassis replaceme_top SPRING_STIFFNESS Rear 74 update_field chassis replaceme_top SWAYBAR_STIFFNESS Front 59 update_field chassis replaceme_top SWAYBAR_STIFFNESS Rear 59 update_field chassis replaceme_top TRAVEL Front 10000 update_field chassis replaceme_top TRAVEL Rear 10000 update_field chassis replaceme_top AERO_COEFFICIENT 0.135 # Handling: replaceme/tires update_field pvehicle replaceme TENSOR_SCALE Y 1.2 update_field tires replaceme DYNAMIC_GRIP Front 1.6 update_field tires replaceme DYNAMIC_GRIP Rear 1.6 update_field tires replaceme GRIP_SCALE Front 1 update_field tires replaceme GRIP_SCALE Rear 1 update_field tires replaceme STATIC_GRIP Front 12 update_field tires replaceme STATIC_GRIP Rear 12 update_field tires replaceme STEERING 0.65 update_field tires replaceme YAW_SPEED 0.3 update_field tires replaceme YAW_CONTROL[0] 1 update_field tires replaceme YAW_CONTROL[1] 1 update_field tires replaceme YAW_CONTROL[2] 1 update_field tires replaceme YAW_CONTROL[3] 1 update_field tires replaceme_top DYNAMIC_GRIP Front 1.8 update_field tires replaceme_top DYNAMIC_GRIP Rear 1.8 update_field tires replaceme_top GRIP_SCALE Front 1 update_field tires replaceme_top GRIP_SCALE Rear 1 update_field tires replaceme_top STATIC_GRIP Front 12 update_field tires replaceme_top STATIC_GRIP Rear 12 update_field tires replaceme_top STEERING 0.65 update_field tires replaceme_top YAW_SPEED 0.3 update_field tires replaceme_top YAW_CONTROL[0] 1 update_field tires replaceme_top YAW_CONTROL[1] 1 update_field tires replaceme_top YAW_CONTROL[2] 1 update_field tires replaceme_top YAW_CONTROL[3] 1 # new update_field chassis replaceme SHOCK_EXT_STIFFNESS Front 75 update_field chassis replaceme SHOCK_EXT_STIFFNESS Rear 70 update_field chassis replaceme SHOCK_DIGRESSION Front 0.3 update_field chassis replaceme SHOCK_DIGRESSION Rear 0.25 update_field chassis replaceme SHOCK_VALVING Front 6.5 update_field chassis replaceme SHOCK_VALVING Rear 6.5 update_field chassis replaceme SPRING_PROGRESSION Front 8 update_field chassis replaceme SPRING_PROGRESSION Rear 7 update_field chassis replaceme SWAYBAR_STIFFNESS Front 45 update_field chassis replaceme SWAYBAR_STIFFNESS Rear 55 update_field chassis replaceme_top SHOCK_EXT_STIFFNESS Front 70 update_field chassis replaceme_top SHOCK_EXT_STIFFNESS Rear 70 update_field chassis replaceme_top SHOCK_DIGRESSION Front 0.25 update_field chassis replaceme_top SHOCK_DIGRESSION Rear 0.25 update_field chassis replaceme_top SHOCK_VALVING Front 6.5 update_field chassis replaceme_top SHOCK_VALVING Rear 6.5 update_field chassis replaceme_top SPRING_PROGRESSION Front 7 update_field chassis replaceme_top SPRING_PROGRESSION Rear 7 update_field chassis replaceme_top SWAYBAR_STIFFNESS Front 55 update_field chassis replaceme_top SWAYBAR_STIFFNESS Rear 55 # 2 update_field chassis replaceme SHOCK_EXT_STIFFNESS Front 80 update_field chassis replaceme SHOCK_EXT_STIFFNESS Rear 85 update_field chassis replaceme SPRING_STIFFNESS Front 80 update_field chassis replaceme SPRING_STIFFNESS Rear 80 update_field chassis replaceme SHOCK_VALVING Front 7 update_field chassis replaceme SHOCK_VALVING Rear 7 update_field chassis replaceme SWAYBAR_STIFFNESS Front 60 update_field chassis replaceme SWAYBAR_STIFFNESS Rear 60 update_field chassis replaceme_top SHOCK_EXT_STIFFNESS Front 85 update_field chassis replaceme_top SHOCK_EXT_STIFFNESS Rear 85 update_field chassis replaceme_top SPRING_STIFFNESS Front 80 update_field chassis replaceme_top SPRING_STIFFNESS Rear 80 update_field chassis replaceme_top SHOCK_VALVING Front 7 update_field chassis replaceme_top SHOCK_VALVING Rear 7 update_field chassis replaceme_top SWAYBAR_STIFFNESS Front 60 update_field chassis replaceme_top SWAYBAR_STIFFNESS Rear 60 # 3 update_field chassis replaceme SHOCK_EXT_STIFFNESS Front 20 update_field chassis replaceme SHOCK_EXT_STIFFNESS Rear 20 update_field chassis replaceme_top SHOCK_EXT_STIFFNESS Front 20 update_field chassis replaceme_top SHOCK_EXT_STIFFNESS Rear 20 update_field chassis replaceme SHOCK_VALVING Front 70 update_field chassis replaceme SHOCK_VALVING Rear 70 update_field chassis replaceme_top SHOCK_VALVING Front 70 update_field chassis replaceme_top SHOCK_VALVING Rear 70 update_field rigidbodyspecs racers DRAG_ANGULAR X 0 update_field chassis replaceme SHOCK_VALVING Front 140 update_field chassis replaceme SHOCK_VALVING Rear 140 update_field chassis replaceme_top SHOCK_VALVING Front 140 update_field chassis replaceme_top SHOCK_VALVING Rear 140 # pretty darn good update_field chassis replaceme SHOCK_VALVING Front 100 update_field chassis replaceme SHOCK_VALVING Rear 100 update_field chassis replaceme_top SHOCK_VALVING Front 100 update_field chassis replaceme_top SHOCK_VALVING Rear 100 update_field chassis replaceme SPRING_PROGRESSION Front 16 update_field chassis replaceme SPRING_PROGRESSION Rear 16 update_field chassis replaceme_top SPRING_PROGRESSION Front 16 update_field chassis replaceme_top SPRING_PROGRESSION Rear 16 update_field chassis replaceme SHOCK_EXT_STIFFNESS Front 40 update_field chassis replaceme SHOCK_EXT_STIFFNESS Rear 40 update_field chassis replaceme_top SHOCK_EXT_STIFFNESS Front 40 update_field chassis replaceme_top SHOCK_EXT_STIFFNESS Rear 40 # aaaa update_field tires replaceme DYNAMIC_GRIP Front 1.6 update_field tires replaceme DYNAMIC_GRIP Rear 1.6 update_field tires replaceme GRIP_SCALE Front 0.8 update_field tires replaceme GRIP_SCALE Rear 0.8 update_field tires replaceme STATIC_GRIP Front 1.75 update_field tires replaceme STATIC_GRIP Rear 1.75 update_field tires replaceme STEERING 1.0 update_field tires replaceme YAW_SPEED 0.25 update_field tires replaceme YAW_CONTROL[0] 1 update_field tires replaceme YAW_CONTROL[1] 1 update_field tires replaceme YAW_CONTROL[2] 1 update_field tires replaceme YAW_CONTROL[3] 1 update_field tires replaceme_top DYNAMIC_GRIP Front 1.8 update_field tires replaceme_top DYNAMIC_GRIP Rear 1.8 update_field tires replaceme_top GRIP_SCALE Front 1 update_field tires replaceme_top GRIP_SCALE Rear 1 update_field tires replaceme_top STATIC_GRIP Front 3 update_field tires replaceme_top STATIC_GRIP Rear 3 update_field tires replaceme_top STEERING 1.0 update_field tires replaceme_top YAW_SPEED 0.35 update_field tires replaceme_top YAW_CONTROL[0] 1 update_field tires replaceme_top YAW_CONTROL[1] 1 update_field tires replaceme_top YAW_CONTROL[2] 1 update_field tires replaceme_top YAW_CONTROL[3] 1 update_field chassis replaceme SWAYBAR_STIFFNESS Front 0 update_field chassis replaceme SWAYBAR_STIFFNESS Rear 0 update_field chassis replaceme_top SWAYBAR_STIFFNESS Front 0 update_field chassis replaceme_top SWAYBAR_STIFFNESS Rear 0 update_field chassis replaceme_top SPRING_PROGRESSION Front 22 update_field chassis replaceme_top SPRING_PROGRESSION Rear 22 update_field chassis replaceme_top SHOCK_EXT_STIFFNESS Front 80 update_field chassis replaceme_top SHOCK_EXT_STIFFNESS Rear 80 \ """ propsSuffix = """\ """ carlist = ["911gt2","911turbo","997s","a3","a4","bmwm3gtr","bmwm3gtre46","camaro","carreragt","caymans","clio","clk500","cobaltss","corvette","corvettec6r","cts","db9","eclipsegt","elise","fordgt","gallardo","gti","gto","imprezawrx","is300","lancerevo8","monaro","murcielago","mustanggt","punto","rx7","rx8","sl500","sl65","slr","supra","tt","viper"] carlistNoTop = ["911gt2","bmwm3gtr","bmwm3gtre46","camaro","corvettec6r","sl65"] topBias = { "911gt2": 0.8, "911turbo": 0.6, "997s": 0.6, "a3": 0.2, "a4": 0.2, "bmwm3gtr": 1.0, "bmwm3gtre46": 0.4, "camaro": 0.0, "carreragt": 0.9, "caymans": 0.6, "clio": 0.2, "clk500": 0.2, "cobaltss": 0.1, "corvette": 0.4, "corvettec6r": 1.0, "cts": 0.1, "db9": 0.7, "eclipsegt": 0.4, "elise": 0.6, "fordgt": 0.6, "gallardo": 0.6, "gti": 0.2, "gto": 0.1, "imprezawrx": 0.4, "is300": 0.0, "lancerevo8": 0.5, "monaro": 0.1, "murcielago": 0.3, "mustanggt": 0.1, "punto": 0.2, "rx7": 0.3, "rx8": 0.2, "sl500": 0.5, "sl65": 0.4, "slr": 0.6, "supra": 0.3, "tt": 0.3, "viper": 0.4 } nfsmsMods = {} nfsmsModsTop = {} for car in carlist: nfsmsMods[car] = {} nfsmsMods[car]["tires"] = {} nfsmsMods[car]["chassis"] = {} # Grip scale nfsmsMods["elise"]["tires"]["GRIP_SCALE Front"] = 0.7 nfsmsMods["elise"]["tires"]["GRIP_SCALE Rear"] = 0.7 # Ride height scale nfsmsMods["911gt2"]["chassis"]["RIDE_HEIGHT Rear"] = 1.3 nfsmsMods["911gt2"]["chassis"]["RIDE_HEIGHT Front"] = 1.3 nfsmsMods["911turbo"]["chassis"]["RIDE_HEIGHT Rear"] = 1.3 nfsmsMods["911turbo"]["chassis"]["RIDE_HEIGHT Front"] = 1.3 nfsmsMods["997s"]["chassis"]["RIDE_HEIGHT Rear"] = 1.0 nfsmsMods["997s"]["chassis"]["RIDE_HEIGHT Front"] = 1.0 nfsmsMods["a3"]["chassis"]["RIDE_HEIGHT Rear"] = 1.2 nfsmsMods["a3"]["chassis"]["RIDE_HEIGHT Front"] = 1.2 nfsmsMods["a4"]["chassis"]["RIDE_HEIGHT Rear"] = 1.3 nfsmsMods["a4"]["chassis"]["RIDE_HEIGHT Front"] = 1.3 nfsmsMods["bmwm3gtr"]["chassis"]["RIDE_HEIGHT Rear"] = 1.3 nfsmsMods["bmwm3gtr"]["chassis"]["RIDE_HEIGHT Front"] = 1.3 nfsmsMods["bmwm3gtre46"]["chassis"]["RIDE_HEIGHT Rear"] = 1.1 nfsmsMods["bmwm3gtre46"]["chassis"]["RIDE_HEIGHT Front"] = 1.1 nfsmsMods["camaro"]["chassis"]["RIDE_HEIGHT Rear"] = 0.9 nfsmsMods["camaro"]["chassis"]["RIDE_HEIGHT Front"] = 0.9 nfsmsMods["carreragt"]["chassis"]["RIDE_HEIGHT Rear"] = 1.1 nfsmsMods["carreragt"]["chassis"]["RIDE_HEIGHT Front"] = 1.1 nfsmsMods["caymans"]["chassis"]["RIDE_HEIGHT Rear"] = 1.2 nfsmsMods["caymans"]["chassis"]["RIDE_HEIGHT Front"] = 1.2 nfsmsMods["clio"]["chassis"]["RIDE_HEIGHT Rear"] = 1.1 nfsmsMods["clio"]["chassis"]["RIDE_HEIGHT Front"] = 1.1 nfsmsMods["clk500"]["chassis"]["RIDE_HEIGHT Rear"] = 1.1 nfsmsMods["clk500"]["chassis"]["RIDE_HEIGHT Front"] = 1.1 nfsmsMods["cobaltss"]["chassis"]["RIDE_HEIGHT Rear"] = 1.35 nfsmsMods["cobaltss"]["chassis"]["RIDE_HEIGHT Front"] = 1.35 nfsmsMods["corvette"]["chassis"]["RIDE_HEIGHT Rear"] = 1.4 nfsmsMods["corvette"]["chassis"]["RIDE_HEIGHT Front"] = 1.4 nfsmsMods["corvettec6r"]["chassis"]["RIDE_HEIGHT Rear"] = 0.8 nfsmsMods["corvettec6r"]["chassis"]["RIDE_HEIGHT Front"] = 0.8 nfsmsMods["cts"]["chassis"]["RIDE_HEIGHT Rear"] = 0.9 nfsmsMods["cts"]["chassis"]["RIDE_HEIGHT Front"] = 0.9 nfsmsMods["db9"]["chassis"]["RIDE_HEIGHT Rear"] = 0.9 nfsmsMods["db9"]["chassis"]["RIDE_HEIGHT Front"] = 0.9 nfsmsMods["eclipsegt"]["chassis"]["RIDE_HEIGHT Rear"] = 1.3 nfsmsMods["eclipsegt"]["chassis"]["RIDE_HEIGHT Front"] = 1.3 nfsmsMods["elise"]["chassis"]["RIDE_HEIGHT Rear"] = 0.9 nfsmsMods["elise"]["chassis"]["RIDE_HEIGHT Front"] = 0.9 nfsmsMods["fordgt"]["chassis"]["RIDE_HEIGHT Rear"] = 0.8 nfsmsMods["fordgt"]["chassis"]["RIDE_HEIGHT Front"] = 0.8 nfsmsMods["gallardo"]["chassis"]["RIDE_HEIGHT Rear"] = 1.1 nfsmsMods["gallardo"]["chassis"]["RIDE_HEIGHT Front"] = 1.1 nfsmsMods["gti"]["chassis"]["RIDE_HEIGHT Rear"] = 1.3 nfsmsMods["gti"]["chassis"]["RIDE_HEIGHT Front"] = 1.3 nfsmsMods["gto"]["chassis"]["RIDE_HEIGHT Rear"] = 1.3 nfsmsMods["gto"]["chassis"]["RIDE_HEIGHT Front"] = 1.3 nfsmsMods["imprezawrx"]["chassis"]["RIDE_HEIGHT Rear"] = 1.1 nfsmsMods["imprezawrx"]["chassis"]["RIDE_HEIGHT Front"] = 1.1 nfsmsMods["is300"]["chassis"]["RIDE_HEIGHT Rear"] = 1.1 nfsmsMods["is300"]["chassis"]["RIDE_HEIGHT Front"] = 1.1 nfsmsMods["lancerevo8"]["chassis"]["RIDE_HEIGHT Rear"] = 1.1 nfsmsMods["lancerevo8"]["chassis"]["RIDE_HEIGHT Front"] = 1.1 nfsmsMods["monaro"]["chassis"]["RIDE_HEIGHT Rear"] = 1.15 nfsmsMods["monaro"]["chassis"]["RIDE_HEIGHT Front"] = 1.15 nfsmsMods["murcielago"]["chassis"]["RIDE_HEIGHT Rear"] = 0.9 nfsmsMods["murcielago"]["chassis"]["RIDE_HEIGHT Front"] = 0.9 nfsmsMods["mustanggt"]["chassis"]["RIDE_HEIGHT Rear"] = 1.1 nfsmsMods["mustanggt"]["chassis"]["RIDE_HEIGHT Front"] = 1.1 nfsmsMods["punto"]["chassis"]["RIDE_HEIGHT Rear"] = 0.9 nfsmsMods["punto"]["chassis"]["RIDE_HEIGHT Front"] = 0.9 nfsmsMods["rx7"]["chassis"]["RIDE_HEIGHT Rear"] = 1.2 nfsmsMods["rx7"]["chassis"]["RIDE_HEIGHT Front"] = 1.2 nfsmsMods["rx8"]["chassis"]["RIDE_HEIGHT Rear"] = 1.0 nfsmsMods["rx8"]["chassis"]["RIDE_HEIGHT Front"] = 1.0 nfsmsMods["sl500"]["chassis"]["RIDE_HEIGHT Rear"] = 1.0 nfsmsMods["sl500"]["chassis"]["RIDE_HEIGHT Front"] = 1.0 nfsmsMods["sl65"]["chassis"]["RIDE_HEIGHT Rear"] = 1.1 nfsmsMods["sl65"]["chassis"]["RIDE_HEIGHT Front"] = 1.1 nfsmsMods["slr"]["chassis"]["RIDE_HEIGHT Rear"] = 1.1 nfsmsMods["slr"]["chassis"]["RIDE_HEIGHT Front"] = 1.1 nfsmsMods["supra"]["chassis"]["RIDE_HEIGHT Rear"] = 1.0 nfsmsMods["supra"]["chassis"]["RIDE_HEIGHT Front"] = 1.0 nfsmsMods["tt"]["chassis"]["RIDE_HEIGHT Rear"] = 1.3 nfsmsMods["tt"]["chassis"]["RIDE_HEIGHT Front"] = 1.3 nfsmsMods["viper"]["chassis"]["RIDE_HEIGHT Rear"] = 0.85 nfsmsMods["viper"]["chassis"]["RIDE_HEIGHT Front"] = 0.85 def parseUpdate(line): line = line.split(" ",3) line = line + line.pop(3).rsplit(" ",1) return line def getTopValue(lineSplit): rtn = None for line in properties: lineType = line.split(" ",1)[0] if lineType == "update_field": lineSplit2 = parseUpdate(line) if lineSplit2[2] != "replaceme_top": continue if lineSplit2[1] != lineSplit[1]: continue if lineSplit2[3] != lineSplit[3]: continue rtn = lineSplit2[-1] return rtn def main(): global properties properties = properties.split("\n") output = [] for car in carlist: for line in properties: isCarLine = ("replaceme" in line) isTopLine = ("replaceme_top" in line) lineType = line.split(" ",1)[0] if not isCarLine: if line != "" and line in output: continue output.append(line) continue if car in carlistNoTop and isTopLine: continue if lineType == "update_field": lineSplit = parseUpdate(line) if car in nfsmsMods: if lineSplit[1] in nfsmsMods[car]: if lineSplit[3] in nfsmsMods[car][lineSplit[1]]: try: value = float(lineSplit[-1]) except Exception: pass else: value = value * nfsmsMods[car][lineSplit[1]][lineSplit[3]] lineSplit[-1] = str(value) valueTop = getTopValue(lineSplit) if isTopLine == False and car in topBias: try: value = float(lineSplit[-1]) valueTop = float(valueTop) except Exception: pass else: value = value + ((valueTop - value) * topBias[car]) lineSplit[-1] = str(value) line = " ".join(lineSplit) output.append(line.replace("replaceme",car)) file = open(nfsmsScript,"w") file.write(propsPrefix) for line in output: file.write(line + "\n") file.write(propsSuffix) file.close() main()