80 lines
1.9 KiB
Plaintext
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
|