2025-05-16 07:11:48 +06:00

92 lines
2.1 KiB
Lua

--@include ./powertrain_component.txt
--@include /koptilnya/libs/constants.txt
local PowertrainComponent = require('./powertrain_component.txt')
require('/koptilnya/libs/constants.txt')
---@class ClutchConfig: PowertrainComponentConfig
---@field SlipTorque? number
---@class Clutch: PowertrainComponent
---@field slipTorque number
local Clutch = class('Clutch', PowertrainComponent)
---@private
---@param vehicle KPTLVehicle
---@param name string
---@param config ClutchConfig
function Clutch:initialize(vehicle, name, config)
PowertrainComponent.initialize(self, vehicle, name, config)
if CLIENT then
return
end
self.wireInputs = {
Clutch = 'number',
}
self.wireOutputs = {
Clutch_Torque = 'number',
}
self.inertia = config.Inertia or 0.1
self.slipTorque = config.SlipTorque or 1000
end
---@return nil
function Clutch:updateWireOutputs()
PowertrainComponent.updateWireOutputs(self)
wire.ports.Clutch_Torque = self.torque
end
---@return number
function Clutch:getPress()
return 1 - wire.ports.Clutch
end
---@return number
function Clutch:queryInertia()
if self.output == nil then
return self.inertia
end
return self.inertia + self.output:queryInertia() * self:getPress()
end
---@param angularVelocity number
---@return number
function Clutch:queryAngularVelocity(angularVelocity)
self.angularVelocity = angularVelocity
if self.output == nil then
return angularVelocity
end
local outputW = self.output:queryAngularVelocity(angularVelocity) * self:getPress()
local inputW = angularVelocity * (1 - self:getPress())
return outputW + inputW
end
---@param torque number
---@param inertia number
---@return number
function Clutch:forwardStep(torque, inertia)
if self.output == nil then
return torque
end
local press = self:getPress()
self.torque = math.clamp(torque, -self.slipTorque, self.slipTorque)
self.torque = self.torque * (1 - (1 - math.pow(press, 0.3)))
local returnTorque = self.output:forwardStep(self.torque, inertia * press + self.inertia) * press
return math.clamp(returnTorque, -self.slipTorque, self.slipTorque)
end
return Clutch