2021-12-11 17:36:34 +05:00

80 lines
1.9 KiB
Plaintext

-- @include /koptilnya/libs/wire_component.txt
-- @include ./slave.txt
-- @include /koptilnya/libs/table.txt
require('/koptilnya/libs/wire_component.txt')
require('./slave.txt')
require('/koptilnya/libs/table.txt')
Steering = class('Steering', WireComponent)
function Steering:initialize(options)
options = options or {}
self.slaves = {}
self.steer = 0
self.sensitivity = options.Sensitivity or 1
for key, slave in ipairs(options.Slaves) do
slave.Order = key
slave.Base = wire.ports.Base
table.insert(self.slaves, Slave:new(slave))
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 _, slave in ipairs(self.slaves) do
inputs = table.merge(inputs, slave:getInputs())
outputs = table.merge(outputs, slave: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 _, slave in ipairs(self.slaves) do
slave.steer = self.steer
slave:update()
slave:updateOutputs()
end
end