2021-11-11 22:16:33 +05:00

284 lines
8.5 KiB
Lua

@name Realistic Engine [Rework] Audi TT
@inputs [Axles]:array [Throttle Clutch GearUp GearDown]:number [FLW FRW RLW RRW]:entity
@outputs [IdleRPM MaxRPM RPM FinalDrive EngineTorque MaxTorque LoadTorque MasterThrottle]:number
@outputs [ClutchRPM ClutchSlip ClutchStiffness ClutchCapacity ClutchMaxTorque ClutchDamping ClutchTorque LastClutchTorque]:number
@outputs [Gear GearRatio GearboxRPM GearboxTorque]:number
@persist [AxlesPowerMap TorqueMap]:array [MasterThrottle FlywheelMass FlywheelRadius FlywheelInertia StartFriction FrictionCoeff LimiterDuration LimiterTime LoadTorque]:number
@persist [ClutchRPM ClutchSlip ClutchStiffness ClutchCapacity ClutchMaxTorque ClutchDamping ClutchTorque LastClutchTorque]:number
@persist [GearRatios]:array [Gear GearRatio]:number
@persist M:number
@inputs [B]:entity
@outputs [LWCorrectingTorque RWCorrectingTorque]
@outputs [AverageRPM]
@persist [LWTq RWTq] [LWAV RWAV]
@persist [LWDampingTq RWDampingTq]
@persist [LWPowerCoeff RWPowerCoeff]
@persist [LWCorrectedTorque RWCorrectedTorque]
@persist UsedCoeff
@persist [Power Coast Preload] LimitTorque UsePowerBias
@persist ViscousCoeff TickInterval
@model models/engines/inline4s.mdl
@trigger none
#include "libs/math"
if (duped()|dupefinished()) { reset() }
if (first()) {
M = 1
# --- ENGINE
IdleRPM = 900
MaxRPM = 7000
FlywheelMass = 4.9
FlywheelRadius = 0.378
StartFriction = -50
FrictionCoeff = 0.02
LimiterDuration = 0.05
TorqueMap = array(
240.29618749947,
251.33093929699,
262.3656910945,
273.40044289202,
284.43519468953,
295.46994648705,
306.50469828456,
317.53945008208,
328.57420187959,
339.60895367711,
350.64370547463,
361.67845727214,
372.71320906966,
383.74796086717,
394.78271266469,
405.8174644622,
416.85221625972,
427.88696805724,
438.92171985475,
449.95647165227,
449.9557104607,
449.95494926913,
449.95418807757,
449.953426886,
449.95266569443,
449.95190450287,
449.9511433113,
449.95038211973,
449.94962092816,
449.9488597366,
449.94809854503,
449.94733735346,
449.9465761619,
449.94581497033,
449.94505377876,
449.9442925872,
449.94353139563,
449.94277020406,
449.94200901249,
449.94124782093,
449.94048662936,
449.93972543779,
449.93896424623,
449.93820305466,
449.93744186309,
449.93668067153,
449.93591947996,
449.93515828839,
449.93439709682,
449.93363590526,
449.93287471369,
449.93211352212,
449.93135233056,
449.93059113899,
449.92982994742,
449.92906875586,
449.92830756429,
449.92754637272,
449.92678518115,
449.92602398959,
449.92526279802,
449.92450160645,
449.92374041489,
449.92297922332,
449.92221803175,
449.92145684019,
449.92069564862,
449.91993445705,
449.91917326548,
449.91841207392,
449.91765088235,
449.91688969078,
449.91612849922,
446.34504740794,
442.77396631665,
439.20288522537,
435.63180413409,
432.06072304281,
428.48964195153,
424.91856086025,
421.34747976897,
417.77639867769,
414.2053175864,
410.63423649512,
407.06315540384,
403.49207431256,
399.92099322128,
396.34991213,
392.77883103872,
389.20774994744,
385.63666885615,
382.06558776487,
378.49450667359,
374.92342558231,
371.35234449103,
367.78126339975,
364.21018230847,
360.63910121719,
357.0680201259,
353.49693903462,
349.92585794334
)
# --- CLUTCH
ClutchStiffness = 22
ClutchCapacity = 1.3
ClutchDamping = 0.5
GearRatios = array(-14.41, 0, 13.45, 8.12, 5.51, 4.16, 3.36, 2.83)
FinalDrive = 1
# --- Differential
Power = 0.1
Coast = 0.05
Preload = 10
UsePowerBias = 10
ViscousCoeff = 0.96
# ---
function void shiftGear(Direction:number) {
local PrevGear = Gear
Gear = clamp(Gear + Direction, -1, GearRatios:count() - 2)
GearRatio = GearRatios[Gear + 2, number]
}
function number remap(Value:number, A1:number, A2:number, B1:number, B2:number) {
return B1 + (B2 - B1) * (Value - A1) / (A2 - A1)
}
function number processAxle(Torque:number, LW:entity, RW:entity) {
local Axle = vec(0,1,0)
# Basic velocity calculations
local LWAV = toRad(LW:angVelVector():y())
local RWAV = toRad(RW:angVelVector():y()) * -1
# RAV = relative angular velocity
local LWRAV = RWAV - LWAV
local RWRAV = LWAV - RWAV
local LWTq = LWRAV * LW:inertia():y()
local RWTq = RWRAV * RW:inertia():y()
# Calculating damping torque
local LWDampingTq = ViscousCoeff * LWTq
local RWDampingTq = ViscousCoeff * RWTq
# Whether use diff power or diff coast
local UsePower = abs(Torque) > UsePowerBias
local UsedCoeff = UsePower ? Power : Coast
local LWPowerCoeff = 0
local RWPowerCoeff = 0
if (LWTq - RWTq > Preload)
{
LWPowerCoeff = UsedCoeff
RWPowerCoeff = 1 + (1 - UsedCoeff)
}
elseif (RWTq - LWTq > Preload)
{
RWPowerCoeff = UsedCoeff
LWPowerCoeff = 1 + (1 - UsedCoeff)
}
else
{
LWPowerCoeff = 1
RWPowerCoeff = 1
}
LWCorrectingTorque = clamp(LWDampingTq * LWPowerCoeff, -LimitTorque, LimitTorque)
RWCorrectingTorque = clamp(RWDampingTq * RWPowerCoeff, -LimitTorque, LimitTorque)
# Calculating final applied torque here
LWCorrectedTorque = LWCorrectingTorque + Torque / 2
RWCorrectedTorque = RWCorrectingTorque + Torque / 2
LW:applyTorque(LWCorrectedTorque * Axle * 52.49)
RW:applyTorque(RWCorrectedTorque * Axle * -1 * 52.49)
return (LW:angVelVector():y() + RW:angVelVector():y() * -1) / 2 / 6
}
MaxTorque = TorqueMap:max() * M
ClutchMaxTorque = 900
GearRatio = GearRatios[Gear + 2, number]
FlywheelInertia = FlywheelMass * FlywheelRadius ^ 2 / 2
EngineAngVel = IdleRPM / 9.5493
LimitTorque = ClutchMaxTorque
RPM = IdleRPM
LimiterTime = 0
runOnTick(1)
}
if ((changed(GearUp) && GearUp) || changed(GearDown) && GearDown) {
shiftGear(GearUp - GearDown)
}
if (tickClk()) {
GearboxTorque = ClutchTorque * GearRatio * FinalDrive
local AxelsRPM = max(processAxle(GearboxTorque / 2, FLW, FRW), processAxle(GearboxTorque / 2, RLW, RRW))
GearboxRPM = AxelsRPM * FinalDrive * GearRatio
ClutchSlip = ((RPM * 0.10472) - (GearboxRPM * 0.10472)) * (GearRatio != 0) / 2
local A = clamp(ClutchSlip * ClutchStiffness * (1 - Clutch), -ClutchMaxTorque, ClutchMaxTorque)
ClutchTorque = interpolate(ClutchTorque, A, ClutchDamping)
local LoadTorque = ClutchTorque
local RPMFraction = clamp((RPM - IdleRPM) / (MaxRPM - IdleRPM), 0, 1)
local Friction = StartFriction - RPM * FrictionCoeff
local MaxInitialTorque = TorqueMap[clamp(floor(RPMFraction * 100), 0, 100) + 1, number] * M - Friction
local IdleFade = clamp(remap(RPM, IdleRPM, IdleRPM + 600, 1, 0), 0, 1)#clamp(0 + (RPM - (IdleRPM + 500)) * (1 - 0) / (IdleRPM - (IdleRPM + 500)), 0, 1)
local IdleFade2 = clamp(remap(RPM, IdleRPM - 300, IdleRPM, 1, 0), 0, 1)
local AdditionalEngineSupply = (IdleFade) * (-Friction / MaxInitialTorque) + IdleFade2
if (RPM >= MaxRPM) {
Throttle = 0
LimiterTime = systime()
} else {
Throttle *= systime() >= LimiterTime + LimiterDuration
}
MasterThrottle = clamp(AdditionalEngineSupply + Throttle, 0, 1)
local RealInitialTorque = MaxInitialTorque * MasterThrottle
EngineTorque = RealInitialTorque + Friction
RPM += (EngineTorque - LoadTorque) / FlywheelInertia * 9.5493 * tickInterval()
RPM = max(RPM, 0)
B:applyTorque(vec(0, -GearboxTorque * 20, 0))
}