mirror of
https://github.com/fairyglade/ly.git
synced 2026-08-06 21:21:58 +00:00
feat: LuaJIT Animations (#1001)
## What are the changes about? TL;DR:  Slaps the entire LuaJIT runtime onto Ly, allowing for the creation of custom dynamic animations like GameOfLife, ColorWave, Doom, etc. This PR adds the [ziglua](https://github.com/natecraddock/ziglua?ref=zig-0.16) dependency for its zig bindings and considerable buildtime config (mainly lua version selection). ### Example <video src="/attachments/3f91cf72-ae24-459c-8ef6-099f71e866fd" title="Screencast_20260519_172320" controls></video> ```lua ly.frame_delay = 5 local timer = 0 local clock = os.clock() local clock_diff = 0 function draw() timer = timer + 1 byte = string.byte(' ') clock_diff = os.clock() - clock clock = os.clock() timer = timer + clock_diff for x = 0, ly.width-1 do for y = 0, ly.height-1 do local xc = 0xFF if x < 255 then xc = ((x + math.floor(timer / 2)) * 3) % 255 else xc = 0 end local yc = 0xFF if y < 255 then yc = ((y) * 3) % 255 else yc = 0 end ly.putCell(byte, xc, bit.bor(xc, yc), x, y) end end end ``` ### The API The API that Ly gives to the user is minimal. A table is globally available, named `ly`, which provides the following: | Member | Purpose | |---------|---------| | `ly.width` & `ly.height` | Respective Width/Height from the `TerminalBuffer` | | `ly.putCell(byte, fg, bg, x, y)` | Literally `Cell.init(byte, fg, bg).put(x, y)`.| | `ly.clock()` | The current real-time, in microseconds. | ### Error Handling On a Lua Error, Ly won't quit but will instead paint the entire background red. The lua error in question can be found in the Ly log file and on-screen. ```log 2026-05-19 16:13:40 [err/Lua] Error (Cannot call draw()): attempt to call a nil value 2026-05-19 11:05:51 [err/Lua] Lua Error: ...dsammyt/programming/probe/ly/scratch/testConfig/test.lua:30: bad argument #1 to 'ipairs' (table expected, got number) ``` ## Pre-requisites - [X] I have tested & confirmed the changes work locally - [X] I have run `zig fmt` throughout my changes Reviewed-on: https://codeberg.org/fairyglade/ly/pulls/1001 Reviewed-by: AnErrupTion <anerruption+codeberg@disroot.org>
This commit is contained in:
18
src/main.zig
18
src/main.zig
@@ -29,6 +29,7 @@ const Doom = @import("animations/Doom.zig");
|
||||
const DurFile = @import("animations/DurFile.zig");
|
||||
const GameOfLife = @import("animations/GameOfLife.zig");
|
||||
const Matrix = @import("animations/Matrix.zig");
|
||||
const Lua = @import("animations/Lua.zig");
|
||||
const auth = @import("auth.zig");
|
||||
const InfoLine = @import("components/InfoLine.zig");
|
||||
const Session = @import("components/Session.zig");
|
||||
@@ -1093,6 +1094,23 @@ pub fn main(init: std.process.Init) !void {
|
||||
);
|
||||
animation = dur.widget();
|
||||
},
|
||||
.lua => {
|
||||
var lua = try Lua.init(
|
||||
state.io,
|
||||
state.allocator,
|
||||
&state.log_file,
|
||||
&state.buffer,
|
||||
state.config.lua_animation_file,
|
||||
state.config.edge_margin,
|
||||
state.config.animation_frame_delay,
|
||||
&state.info_line,
|
||||
state.config.error_fg,
|
||||
state.config.error_bg,
|
||||
state.lang,
|
||||
state.config.full_color,
|
||||
);
|
||||
animation = lua.widget();
|
||||
},
|
||||
}
|
||||
defer if (animation) |a| a.deinit();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user