Files
BarotraumaLuaProjects/INSTRUCTION.MD

5.1 KiB
Raw Blame History

Это проект микропрограмм для контроллеров которые интерпретируют lua. У этих контроллеров 32 входных и 32 выходных пина. Каждая программа занимается получением сигналов из inp[] и преедачей в вывод out[].

Контроллеры работают в игре barotrauma. Входы и выходы могут быть integer или string. Также есть необычный составной тип это цвет. Задаётся как rgb в строку вида 255,255,255

Вот сниппеты кода с примерами программ:


-- SPDX-FileCopyrightText: 2023 Matheus Izvekov <mizvekov@gmail.com>
-- SPDX-License-Identifier: ISC

-- Autoclosing door controller wiring instructions:
-- in1: connect to door state out.
-- in2: connect to motion sensor, detecting doorway obstruction.
-- in3..6: connect to emergency sensors
--         (ex. water and fire detectors on both sides of the door).
-- out1: door set_state input.

local lastClosedTime

inp = {}
function upd()
    local isClosed = inp[1] ~= 1
    local isDoorwayObstructed = inp[2] ~= 0
    local hasEmergency = false
    for i = 3, 6 do hasEmergency = hasEmergency or inp[i] == 1 end
    table.clear(inp)

    if hasEmergency then
        if isClosed then
            lastClosedTime = time()
            return
        end
        if isDoorwayObstructed then return end
        if lastClosedTime == nil or time() - lastClosedTime >= 4 then
            lastClosedTime = nil
            out[1] = 0
        end
    elseif lastClosedTime ~= nil then
        lastClosedTime = nil
        out[1] = 1
    end
end
-- The body of the script is executed once per component load / source code change.
-- Use it to setup the component, define functions and do any other expensive one time computations.

-- Example: Define one state that will persist across frames.
-- These can effectively replace a memory component, but note they are not saved across rounds.
local somestate = 999

-- Create a new function.
local function foo(a, b)
    return a + 10 ^ b
end

-- Define how signal inputs will be handled.
-- In the below example, inputs will be simply stored in a table.
inp = {}
-- You can alternatively define 'inp' as a function that
-- takes a pin and a value as inputs.
-- Eg. function inp(pin, val)

-- Create a function that will be called every frame.
function upd(deltaTime)
    -- deltaTime is the time in seconds since the last frame.
    -- If you need the absolute time, you can use the `time()` function instead.

    -- Compute a value based on inputs.
    local x = inp[1] * foo(inp[2], inp[3])

    -- Produce an output.
    out[1] = inp[3] / x
    -- Note that `out` is not a table, you cannot read the outputs back.

    -- Also note that `out` can be set from the `inp` callback, if defined.
    -- This for example allows you to mimic the behavior of certain vanilla
    -- components which produce outputs outside of frame updates, such as
    -- the memory and signalcheck components.

    -- After you are done using the inputs, you can optionally
    -- clear them back to nil:
    table.clear(inp)
    -- That allows you to detect that a pin has not received any signal
    -- since the last frame.
    -- For example, that can be used to detect a wire has been disconnected.

    -- Otherwise, not clearing them means it will contain the last values received,
    -- which is good enough for most cases.
end

-- ADVANCED FUNCTIONALITY
-- You can check the current game mode.
-- Possible values: 'server', 'client', 'single'.
if mode == 'client' then
    -- In a multiplayer game, the server and clients will be each
    -- running the scripts independently.
    -- Rarely, you will need to keep the clients synchronized to the server.
    -- MicroLua leaves how exactly to perform this synchronization up to you.
    -- It just provides the means for the server to send a string to the clients.

    -- Define a function that will allow the clients to
    -- receive a message from the server:
    function recv(msg)
        print('message received from server: ', msg)
    end
    -- A message then can be sent from the server to this callback, by using
    -- the `send(msg)` function.

    -- Note: As said previously, synchronization will rarely be needed at all.
    --       For example, most devices that initiate a signal, such as buttons
    --       and other components that react to character action, are already
    --       synchronized themselves.
    --       Use synchronization for long lived state in your program, which
    --       is likely to not converge in the short term.
end

if mode == 'server' then
    -- Send a message from the server to the clients.
    send'hello world'

    -- `send` is only available on 'server' mode.
    -- Normally you would perform this sending in the `upd` callback somehow.
end

Также можно обрабатывать в событийном режиме, не каждый кадр

function inp(pin, val)
    print("pin:" .. pin .. " value: ".. val)
end