DOOM's fire algo, in zig, for 256 color terminals w/no dependencies

Update to latest Zig.

Signed-off-by: moderation <michael@sooper.org>

Changed files
+26 -30
src
+5 -3
build.zig
··· 17 17 18 18 const exe = b.addExecutable(.{ 19 19 .name = "DOOM-fire", 20 - .root_source_file = b.path("src/main.zig"), 21 - .target = target, 22 - .optimize = optimize, 20 + .root_module = b.createModule(.{ 21 + .root_source_file = b.path("src/main.zig"), 22 + .target = target, 23 + .optimize = optimize, 24 + }), 23 25 }); 24 26 25 27 //libc linking
+2 -2
build.zig.zon
··· 10 10 11 11 // This is a [Semantic Version](https://semver.org/). 12 12 // In a future version of Zig it will be used for package deduplication. 13 - .version = "0.14.0", 13 + .version = "0.16.0-dev.1364+f0a3df98d", 14 14 15 15 // Together with name, this represents a globally unique package 16 16 // identifier. This field is generated by the Zig toolchain when the ··· 28 28 29 29 // Tracks the earliest Zig version that the package considers to be a 30 30 // supported use case. 31 - .minimum_zig_version = "0.14.0", 31 + .minimum_zig_version = "0.16.0-dev.1364+f0a3df98d", 32 32 33 33 // This field is optional. 34 34 // Each dependency must either provide a `url` and `hash`, or a `path`.
+19 -25
src/main.zig
··· 8 8 9 9 const allocator = std.heap.page_allocator; 10 10 11 - var stdout: std.fs.File.Writer = undefined; 12 - var stdin: std.fs.File.Reader = undefined; 11 + var stdout_file: std.fs.File = undefined; 12 + var stdin_file: std.fs.File = undefined; 13 13 var g_tty_win: win32.HANDLE = undefined; 14 14 15 15 /////////////////////////////////// ··· 117 117 } 118 118 return; 119 119 } else { 120 - const sz = try stdout.write(s); 121 - if (sz == 0) { 122 - return; 123 - } // cauze I c 120 + const sz = try stdout_file.writeAll(s); 121 + _ = sz; // ignore return value 124 122 return; 125 123 } 126 124 } ··· 211 209 212 210 pub fn getTermSzWin() !TermSz { 213 211 //Microsoft Windows Case 214 - var info: win32.CONSOLE_SCREEN_BUFFER_INFO = .{ .dwSize = .{ .X = 0, .Y = 0 }, 215 - .dwCursorPosition = .{.X= 0, .Y= 0}, 216 - .wAttributes= 0, 217 - .srWindow = .{ .Left = 0, .Top = 0, .Right = 0, .Bottom = 0}, 218 - .dwMaximumWindowSize = .{.X = 0, .Y = 0} }; 212 + var info: win32.CONSOLE_SCREEN_BUFFER_INFO = .{ .dwSize = .{ .X = 0, .Y = 0 }, .dwCursorPosition = .{ .X = 0, .Y = 0 }, .wAttributes = 0, .srWindow = .{ .Left = 0, .Top = 0, .Right = 0, .Bottom = 0 }, .dwMaximumWindowSize = .{ .X = 0, .Y = 0 } }; 219 213 220 214 if (0 == win32.GetConsoleScreenBufferInfo(g_tty_win, &info)) switch (std.os.windows.kernel32.GetLastError()) { 221 215 else => |e| return std.os.windows.unexpectedError(e), ··· 231 225 //Linux-MacOS Case 232 226 233 227 //base case - invoked from cmd line 234 - const tty_nix = stdout.context.handle; 228 + const tty_nix = std.fs.File.stdout().handle; 235 229 var winsz = std.c.winsize{ .col = 0, .row = 0, .xpixel = 0, .ypixel = 0 }; 236 230 const rv = std.c.ioctl(tty_nix, TIOCGWINSZ, @intFromPtr(&winsz)); 237 231 const err = std.posix.errno(rv); ··· 338 332 339 333 try emit(color_reset); 340 334 try emit("Press return to continue..."); 341 - var b: u8 = undefined; 342 - b = stdin.readByte() catch undefined; 335 + var buffer: [1]u8 = undefined; 336 + _ = stdin_file.read(buffer[0..]) catch undefined; 337 + const b = buffer[0]; 343 338 344 339 if (b == 'q') { 345 340 //exit cleanly ··· 576 571 try emit(line_clear_to_eol); 577 572 try emit(nl); 578 573 579 - std.time.sleep(10 * std.time.ns_per_ms); 574 + std.posix.nanosleep(0, 10 * std.time.ns_per_ms); 580 575 } 581 576 582 577 //let quote chill for a second 583 - std.time.sleep(1000 * std.time.ns_per_ms); 578 + std.posix.nanosleep(1, 0); 584 579 585 580 //fade out 586 581 fade_idx = fade_len - 1; ··· 598 593 try emit(txt[txt_idx * 2 + 1]); 599 594 try emit(line_clear_to_eol); 600 595 try emit(nl); 601 - std.time.sleep(10 * std.time.ns_per_ms); 596 + std.posix.nanosleep(0, 10 * std.time.ns_per_ms); 602 597 } 603 598 try emit(nl); 604 599 } ··· 631 626 var bs_sz_max: u64 = 0; 632 627 var bs_sz_avg: u64 = 0; 633 628 var bs_frame_tic: u64 = 0; 634 - var t_start: i64 = 0; 635 - var t_now: i64 = 0; 629 + var timer: std.time.Timer = undefined; 636 630 var t_dur: f64 = 0.0; 637 631 var fps: f64 = 0.0; 638 632 ··· 646 640 const bs_sz: u64 = screen_sz + overflow_sz; 647 641 648 642 bs = try allocator.alloc(u8, bs_sz * 2); 649 - t_start = std.time.milliTimestamp(); 643 + timer = try std.time.Timer.start(); 650 644 resetBuf(); 651 645 } 652 646 ··· 668 662 //print buffer to string...can be a decent amount of text! 669 663 pub fn paintBuf() !void { 670 664 try emit(bs[0 .. bs_len - 1]); 671 - t_now = std.time.milliTimestamp(); 665 + const elapsed_ns = timer.read(); 672 666 bs_frame_tic += 1; 673 667 if (bs_sz_min == 0) { 674 668 //first frame ··· 685 679 bs_sz_avg = bs_sz_avg * (bs_frame_tic - 1) / bs_frame_tic + bs_len / bs_frame_tic; 686 680 } 687 681 688 - t_dur = @as(f64, @floatFromInt(t_now - t_start)) / 1000.0; 682 + t_dur = @as(f64, @floatFromInt(elapsed_ns)) / @as(f64, std.time.ns_per_s); 689 683 fps = @as(f64, @floatFromInt(bs_frame_tic)) / t_dur; 690 684 691 685 try emit(fg[0]); 692 - try emitFmt("mem: {s:.2} min / {s:.2} avg / {s:.2} max [ {d:.2} fps ]", .{ std.fmt.fmtIntSizeBin(bs_sz_min), std.fmt.fmtIntSizeBin(bs_sz_avg), std.fmt.fmtIntSizeBin(bs_sz_max), fps }); 686 + try emitFmt("mem: {d} min / {d} avg / {d} max [ {d:.2} fps ]", .{ bs_sz_min, bs_sz_avg, bs_sz_max, fps }); 693 687 } 694 688 695 689 // initBuf(); defer freeBuf(); ··· 835 829 /////////////////////////////////// 836 830 837 831 pub fn main() anyerror!void { 838 - stdout = std.io.getStdOut().writer(); 839 - stdin = std.io.getStdIn().reader(); 832 + stdout_file = std.fs.File.stdout(); 833 + stdin_file = std.fs.File.stdin(); 840 834 841 835 try initTerm(); 842 836 defer complete() catch {};