2022-01-24 20:28:12 +05:00

80 lines
1.9 KiB
Plaintext

-- @include /koptilnya/libs/wire_component.txt
-- @include ./steering_axle.txt
-- @include /koptilnya/libs/table.txt
require('/koptilnya/libs/wire_component.txt')
require('./steering_axle.txt')
require('/koptilnya/libs/table.txt')
Steering = class('Steering', WireComponent)
function Steering:initialize(options)
options = options or {}
self.axles = {}
self.steer = 0
self.sensitivity = options.Sensitivity or 1
for key, axle in ipairs(options.Axles) do
axle.Order = key
axle.Base = wire.ports.Base
table.insert(self.axles, SteeringAxle:new(axle))
end
self:_adjustPorts()
hook.add('tick', 'update', function()
self:update()
end)
end
function Steering:_adjustPorts()
local inputs = {}
local outputs = {}
inputs = table.merge(inputs, self:getInputs())
outputs = table.merge(outputs, self:getOutputs())
for _, axle in ipairs(self.axles) do
inputs = table.merge(inputs, axle:getInputs())
outputs = table.merge(outputs, axle:getOutputs())
end
wire.adjustPorts(inputs, outputs)
end
function Steering:getInputs()
return {
TargetSteer = 'number',
Base = 'entity'
}
end
function Steering:getOutputs()
return {
Steer = 'number'
}
end
function Steering:updateOutputs()
-- local totalSteeringAngle = table.reduce(self.slaves, function(steer, slave)
-- return steer + slave.direction * slave.steeringAngle / (slave.lock ~= 0 and slave.lock or 1)
-- end, 0)
-- local steerableSlaves = table.filter(self.slaves, function(slave)
-- return slave.lock ~= 0
-- end)
-- wire.ports.Steer = totalSteeringAngle / #steerableSlaves
end
function Steering:update()
self.steer = wire.ports.TargetSteer * self.sensitivity
self:updateOutputs()
for _, axle in ipairs(self.axles) do
axle.steer = self.steer
axle:update()
axle:updateOutputs()
end
end