Moon Logic 2
Adds programmable Lua combinator. Based on Sandboxed LuaCombinator and LuaCombinator2 mods.
Description
Important: This mod should probably cause desyncs in multiplayer games Mod code uses things which are likely to desync mp games, and I only test singleplayer, so it's highly unlikely that it will "just work" in mp.
Important: Declaring custom functions is not supported. Due to how savegame serialization works in Factorio, custom functions declared with the function keyword will cause game saves to fail.
Description
Adds Moon Logic Combinator that runs Lua code that can read red/green wire signal inputs and set outputs.
Based on other LuaCombinator mods, but instead of adding more complexity and features, mostly removes them to keep it simple and clean. I.e. no syntax highlighting, code formatting, binding to factorio events, etc.
General principle is that it's not a replacement for Vim/Emacs or some IDE, but just a window where you paste some Lua code/logic or type/edit a couple of lines. And not a mod development framework either - only a combinator to convert circuit network inputs to outputs, nothing more.
Mostly created because I like using such Lua combinators myself, and all other mods for them seemed to be broken and abandoned atm. Fixing/maintaining these is much easier without few thousand lines of extra complexity in there.
"Moon Logic" Combinator is because it's programmed in Lua - "moon" in portugese (as Lua itself originates in Brazil).
Mod Options
Startup Mod Settings:
- Red Wire Label - Lua environment name for in-game "red" circuit network values. Changes all labels in the GUIs as well.
- Green Wire Label - same as Red Wire Label, but for the other wire color.
These can be useful when playing with other mods that change colors, for labels to match those. Note that red/green input tables are always available in the environment too, for better code/snippet compability.
- GUI Signals Update Interval
Interval in game ticks (60 ticks = 1 second at 1x game speed) between updating signal table in the UI. Only relevant when main combinator UI window is actually open. Default is 1 - update signal side-window on every tick. Note that with higher interval values, signals flapping on/off synced to it will be impossible to notice there.
- Enable Code Editing History
Toggles between smooth and pleasant editing or undo/redo buttons on top working for all non-saved code changes. If you don't use these buttons to undo minor changes (they still keep history of saved changes), be sure to uncheck this.
UI hotkeys can also be customized in the Settings - Controls game menu.
There is an optional hotkey (Ctrl-E) for opening these combinators from anywhere on the map, which kinda breaks basic game mechanics in a way similar to various "Long Reach" mods, but can be useful if code breaks too often and is hard to reach for debugging all the time.
Lua Code
Lua is a very simple and easy-to-use programming language, which fits entirely on a couple pages. This mod allows using it to script factorio circuit network logic directly from within the game.
-- Trivial one-liner examples:
- Set constant output signal value:
out.wood = 1
- Simple arithmetic on an input:
out.wood = red.wood * 5
- Ever-increasing output counter:
out.wood = out.wood + 1
- Update counter once per second (see game tick):
delay, out.wood = 60, out.wood + 1
- +1 counter every tick while signal-W input is non-zero:
delay, irq, out.wood = 2^30, 'signal-W', out.wood + 1
- Different value on each output wire:
out['red/wood'], out['green/wood'] = -3, 10
Click in-game "Quick Reference" button in combinator window for a full list of all special values and APIs there, default hotkeys and other general info.
-- Control any number of things at once:
local our_train = 17 -- hover over train to find out its ID number
local train_loaded, train_unloaded -- locals get forgotten between runs
if red['signal-T'] == our_train then
if not var.inbound_manifest_checked then
-- Emit alarm signal for underloaded train arrival while it's on station
-- Note how outputs persist until they are changed/reset
out['signal-info'] = red['sulfur'] < 100 or red['solid-fuel'] < 200
var.inbound_manifest_checked = true
end
out['signal-black'] = red.coal < 500 -- load coal
out['signal-grey'] = red.barrel < 20 -- load barrels
train_loaded =
not (out['signal-black'] or out['signal-grey']) -- cargo limit
or (var.coal == red.coal and var.barrels == red.barrel) -- no change since last check
var.coal, var.barrels = red.coal, red.barrel -- remember for the next check
local inbound_cargo = red['sulfur'] + red['solid-fuel']
train_unloaded = inbound_cargo ~= var.inbound_cargo -- that's "not equals" in Lua
var.inbound_cargo = inbound_cargo
out['signal-check'] = train_loaded and train_unloaded -- HONK!
if out['signal-check']
then var.inbound_manifest_checked = false end -- reset for the next arrival
delay = 2 * 60 -- check on cargo loading every other second
else
out = {} -- keep inserters idle and environment clean
delay = 20 * 60 -- check for next train every 20s
irq = 'signal-T' -- any train on station will interrupt the delay
irq_min_interval = delay -- to sleep when other train triggers that irq signal
end
As comments in the code might suggest already, it's a train station automation example.
-- Toy example - 7-segment digit display for a ticking 0-9 counter:
local digit_segments = { -Ratings & reviews
Sign in to leave a rating or comment.