ug2ish-handling/mw/developer/ug2ish-handling.py

387 lines
15 KiB
Python
Executable File

#!/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 = """\
game MW
ui_control checkbox new true "New flavor"
ui_text More changes from the original values, makes primarily high-end vehicles a bit more planted.
script scripts\\separate-ai-handling.nfsms
\
"""
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.25
update_field chassis replaceme_top SHOCK_DIGRESSION Rear 0.3
update_field chassis replaceme_top SHOCK_EXT_STIFFNESS Front 70
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 6
update_field chassis replaceme_top SHOCK_VALVING Rear 7
update_field chassis replaceme_top SPRING_PROGRESSION Front 7
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 50
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.5
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
\
"""
propsSuffix = """\
ui_option new
script scripts\\ug2ish-handling-new.nfsms
ui_option new
\
"""
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()