Remastering engine
This commit is contained in:
parent
d73f424d7f
commit
902d2d18bb
72
koptilnya/engine/eng_comf_config.txt
Normal file
72
koptilnya/engine/eng_comf_config.txt
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
config = {
|
||||||
|
Name = "Jopa",
|
||||||
|
Engine = {
|
||||||
|
IdleRPM = 900,
|
||||||
|
MaxRPM = 7000,
|
||||||
|
FlywheelMass = 4.9,
|
||||||
|
FlywheelRadius = 0.378,
|
||||||
|
StartFriction = -50,
|
||||||
|
FrictionCoeff = 0.02,
|
||||||
|
LimiterDuration = 0.05,
|
||||||
|
TorqueMap = {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 = {
|
||||||
|
Stiffness = 22,
|
||||||
|
Damping = 0.8,
|
||||||
|
MaxTorque = 600
|
||||||
|
},
|
||||||
|
Gearbox = {
|
||||||
|
Type = "AUTO",
|
||||||
|
ShiftDuration = 0.2,
|
||||||
|
ShiftSmoothness = 0.3,
|
||||||
|
Ratios = {13.45, 8.12, 5.51, 4.16, 3.36, 2.83},
|
||||||
|
Reverse = 14.41
|
||||||
|
},
|
||||||
|
Axles = {{
|
||||||
|
Power = 1,
|
||||||
|
Coast = 1,
|
||||||
|
Preload = 10,
|
||||||
|
UsePowerBias = 10,
|
||||||
|
ViscousCoeff = 0.96,
|
||||||
|
Axle = Vector(1, 0, 0),
|
||||||
|
DistributionCoeff = 0.4,
|
||||||
|
FinalDrive = 1
|
||||||
|
}, {
|
||||||
|
Power = 1,
|
||||||
|
Coast = 1,
|
||||||
|
Preload = 10,
|
||||||
|
UsePowerBias = 10,
|
||||||
|
ViscousCoeff = 0.96,
|
||||||
|
Axle = Vector(1, 0, 0),
|
||||||
|
DistributionCoeff = 0.6,
|
||||||
|
FinalDrive = 1
|
||||||
|
}},
|
||||||
|
Systems = {{
|
||||||
|
Type = "LAUNCH",
|
||||||
|
RPMLimit = 3500
|
||||||
|
}, {
|
||||||
|
Type = "TRACTION",
|
||||||
|
Slip = 1.5
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
return config
|
||||||
0
koptilnya/engine_remastered/builders/gearbox.txt
Normal file
0
koptilnya/engine_remastered/builders/gearbox.txt
Normal file
0
koptilnya/engine_remastered/builders/systems.txt
Normal file
0
koptilnya/engine_remastered/builders/systems.txt
Normal file
75
koptilnya/engine_remastered/configs/sample.txt
Normal file
75
koptilnya/engine_remastered/configs/sample.txt
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
-- @name Sample vehicle config
|
||||||
|
-- @author Koptilnya1337
|
||||||
|
-- @server
|
||||||
|
-- @include /koptilnya/engine_remastered/vehicle.txt
|
||||||
|
require('/koptilnya/engine_remastered/vehicle.txt')
|
||||||
|
|
||||||
|
Vehicle:new({
|
||||||
|
Engine = {
|
||||||
|
IdleRPM = 900,
|
||||||
|
MaxRPM = 7000,
|
||||||
|
FlywheelMass = 4.9,
|
||||||
|
FlywheelRadius = 0.378,
|
||||||
|
StartFriction = -50,
|
||||||
|
FrictionCoeff = 0.02,
|
||||||
|
LimiterDuration = 0.05,
|
||||||
|
TorqueMap = {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 = {
|
||||||
|
Stiffness = 22,
|
||||||
|
Damping = 0.8,
|
||||||
|
MaxTorque = 600
|
||||||
|
},
|
||||||
|
Gearbox = {
|
||||||
|
Type = "AUTO",
|
||||||
|
ShiftDuration = 0.2,
|
||||||
|
ShiftSmoothness = 0.3,
|
||||||
|
Ratios = {13.45, 8.12, 5.51, 4.16, 3.36, 2.83},
|
||||||
|
Reverse = 14.41
|
||||||
|
},
|
||||||
|
Axles = {{
|
||||||
|
Power = 1,
|
||||||
|
Coast = 1,
|
||||||
|
Preload = 10,
|
||||||
|
UsePowerBias = 10,
|
||||||
|
ViscousCoeff = 0.96,
|
||||||
|
Axle = Vector(1, 0, 0),
|
||||||
|
DistributionCoeff = 0.4,
|
||||||
|
FinalDrive = 1
|
||||||
|
}, {
|
||||||
|
Power = 1,
|
||||||
|
Coast = 1,
|
||||||
|
Preload = 10,
|
||||||
|
UsePowerBias = 10,
|
||||||
|
ViscousCoeff = 0.96,
|
||||||
|
Axle = Vector(1, 0, 0),
|
||||||
|
DistributionCoeff = 0.6,
|
||||||
|
FinalDrive = 1
|
||||||
|
}},
|
||||||
|
Systems = {{
|
||||||
|
Type = "LAUNCH",
|
||||||
|
Limit = 3500
|
||||||
|
}, {
|
||||||
|
Type = "TRACTION",
|
||||||
|
Limit = 1.5
|
||||||
|
}}
|
||||||
|
})
|
||||||
86
koptilnya/engine_remastered/engine.txt
Normal file
86
koptilnya/engine_remastered/engine.txt
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
-- @include ./wire_component.txt
|
||||||
|
-- @include /koptilnya/libs/constants.txt
|
||||||
|
require('./wire_component.txt')
|
||||||
|
require('/koptilnya/libs/constants.txt')
|
||||||
|
|
||||||
|
Engine = class('Engine', WireComponent)
|
||||||
|
|
||||||
|
function Engine:initialize(config, clutch)
|
||||||
|
self.idleRPM = config.IdleRPM
|
||||||
|
self.maxRPM = config.MaxRPM
|
||||||
|
|
||||||
|
self.flywheelMass = config.FlywheelMass
|
||||||
|
self.flywheelRadius = config.FlywheelRadius
|
||||||
|
|
||||||
|
self.startFriction = config.StartFriction
|
||||||
|
self.frictionCoeff = config.FrictionCoeff
|
||||||
|
|
||||||
|
self.torque = 0
|
||||||
|
self.rpmFrac = 0
|
||||||
|
self.rpm = self.idleRPM
|
||||||
|
self.friction = 0
|
||||||
|
|
||||||
|
self.limiterDuration = config.LimiterDuration
|
||||||
|
|
||||||
|
self.torqueMap = config.TorqueMap or {}
|
||||||
|
|
||||||
|
self._fwInertia = self.flywheelMass * self.flywheelRadius ^ 2 / 2
|
||||||
|
self._limiterTime = 0
|
||||||
|
|
||||||
|
self._clutch = clutch
|
||||||
|
end
|
||||||
|
|
||||||
|
function Engine:getInputs()
|
||||||
|
return {
|
||||||
|
Throttle = 'number'
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function Engine:getOutputs()
|
||||||
|
return {
|
||||||
|
RPM = 'number',
|
||||||
|
Torque = 'number'
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function Engine:updateOutputs()
|
||||||
|
wire.ports.RPM = self.rpm
|
||||||
|
wire.ports.Torque = self.torque
|
||||||
|
end
|
||||||
|
|
||||||
|
function Engine:getThrottle()
|
||||||
|
return wire.ports.Throttle
|
||||||
|
end
|
||||||
|
|
||||||
|
function Engine:update()
|
||||||
|
local throttle = self:getThrottle()
|
||||||
|
|
||||||
|
self.rpmFrac = math.clamp((self.rpm - self.idleRPM) / (self.maxRPM - self.idleRPM), 0, 1)
|
||||||
|
self.friction = self.startFriction - self.rpm * self.frictionCoeff
|
||||||
|
|
||||||
|
local tqIdx = math.clamp(math.floor(self.rpmFrac * #self.torqueMap), 1, #self.torqueMap)
|
||||||
|
local maxInitialTorque = self.torqueMap[tqIdx] - self.friction
|
||||||
|
|
||||||
|
local idleFadeStart = math.clamp(math.remap(self.rpm, self.idleRPM - 300, self.idleRPM, 1, 0), 0, 1)
|
||||||
|
local idleFadeEnd = math.clamp(math.remap(self.rpm, self.idleRPM, self.idleRPM + 600, 1, 0), 0, 1)
|
||||||
|
|
||||||
|
local additionalEnergySupply = idleFadeEnd * (-self.friction / maxInitialTorque) + idleFadeStart
|
||||||
|
|
||||||
|
if self.rpm > self.maxRPM then
|
||||||
|
throttle = 0
|
||||||
|
self._limiterTime = timer.systime()
|
||||||
|
else
|
||||||
|
throttle = timer.systime() >= self._limiterTime + self.limiterDuration and throttle or 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local masterThrottle = math.clamp(additionalEnergySupply + throttle, 0, 1)
|
||||||
|
|
||||||
|
local realInitialTorque = maxInitialTorque * masterThrottle
|
||||||
|
|
||||||
|
local loadTorque = self._clutch and self._clutch.torque or 0
|
||||||
|
|
||||||
|
self.torque = realInitialTorque + self.friction
|
||||||
|
|
||||||
|
self.rpm = self.rpm + (self.torque - loadTorque) / self._fwInertia * RAD_TO_RPM * TICK_INTERVAL
|
||||||
|
self.rpm = math.max(self.rpm, 0)
|
||||||
|
end
|
||||||
50
koptilnya/engine_remastered/vehicle.txt
Normal file
50
koptilnya/engine_remastered/vehicle.txt
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
-- @include ./engine.txt
|
||||||
|
-- @include /koptilnya/libs/table.txt
|
||||||
|
require('./engine.txt')
|
||||||
|
require('/koptilnya/libs/table.txt')
|
||||||
|
|
||||||
|
Vehicle = class('Vehicle')
|
||||||
|
|
||||||
|
function Vehicle:initialize(config)
|
||||||
|
if config == nil then
|
||||||
|
throw('Vehicle config not provided')
|
||||||
|
end
|
||||||
|
|
||||||
|
-- self.clutch = Clutch:new(config.Clutch)
|
||||||
|
self.engine = Engine:new(config.Engine, self.clutch)
|
||||||
|
-- self.gearbox = GearboxBuilder:create(config.Gearbox, self.clutch)
|
||||||
|
-- self.axles = table.map(config.Axles, function(config)
|
||||||
|
-- return Differential:new(config)
|
||||||
|
-- end)
|
||||||
|
-- self.systems = table.map(config.Systems, function(config)
|
||||||
|
-- return SystemsBuilder:create(config)
|
||||||
|
-- end)
|
||||||
|
|
||||||
|
self.components = {self.engine} -- , self.gearbox, self.clutch}
|
||||||
|
-- self.components = table.add(self.components, self.axles)
|
||||||
|
-- self.components = table.add(self.components, self.systems)
|
||||||
|
|
||||||
|
local inputs = {}
|
||||||
|
local outputs = {}
|
||||||
|
|
||||||
|
for _, comp in ipairs(self.components) do
|
||||||
|
inputs = table.merge(inputs, comp:getInputs())
|
||||||
|
outputs = table.merge(outputs, comp:getOutputs())
|
||||||
|
end
|
||||||
|
|
||||||
|
wire.adjustPorts(inputs, outputs)
|
||||||
|
|
||||||
|
-- for _, ent in self.entities do
|
||||||
|
-- ent:createInputs()
|
||||||
|
-- ent:createOutputs()
|
||||||
|
-- end
|
||||||
|
|
||||||
|
hook.add('tick', 'vehicle_update', function()
|
||||||
|
local outputs = {}
|
||||||
|
|
||||||
|
for _, comp in pairs(self.components) do
|
||||||
|
comp:update()
|
||||||
|
comp:updateOutputs()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
12
koptilnya/engine_remastered/wire_component.txt
Normal file
12
koptilnya/engine_remastered/wire_component.txt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
WireComponent = class('WireComponent')
|
||||||
|
|
||||||
|
function WireComponent:getInputs()
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
|
||||||
|
function WireComponent:getOutputs()
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
|
||||||
|
function WireComponent:updateOutputs()
|
||||||
|
end
|
||||||
@ -34,16 +34,6 @@ function table.deepcopy(orig)
|
|||||||
return copy
|
return copy
|
||||||
end
|
end
|
||||||
|
|
||||||
function table.merge(table1, table2)
|
|
||||||
local newTable = table.deepcopy(table1)
|
|
||||||
|
|
||||||
for k, v in pairs(table2) do
|
|
||||||
newTable[k] = v
|
|
||||||
end
|
|
||||||
|
|
||||||
return newTable
|
|
||||||
end
|
|
||||||
|
|
||||||
function table.contains(tbl, ...)
|
function table.contains(tbl, ...)
|
||||||
local argCount = #arg
|
local argCount = #arg
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user