diff --git a/build.zig.zon b/build.zig.zon index 7c29a61..c146c9d 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -16,8 +16,8 @@ // internet connectivity. .dependencies = .{ .seizer = .{ - .url = "https://github.com/leroycep/seizer/archive/c66b5e5f1148a1f6ce37560ed1b8bc883520541e.tar.gz", - .hash = "122051972ed81522b6d1a8e1306f0cd3848a81180781794dce80fefcf1e42dc00d30", + .url = "https://github.com/leroycep/seizer/archive/8fbc262657f505a11505d12eb277ff5736821769.tar.gz", + .hash = "1220b6df5a68c8c918d92befcfbe379010c7ddbe25fded0a2e103c4514012ad48b97", }, }, .paths = .{ diff --git a/src/main.zig b/src/main.zig index ea78f1b..9a2788d 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,7 +1,10 @@ pub const main = seizer.main; +const APPNAME = "seizer-solitaire"; + var gpa: std.mem.Allocator = undefined; var prng: std.rand.DefaultPrng = undefined; +var context_global: *seizer.Context = undefined; var window_global: seizer.Window = undefined; var canvas: seizer.Canvas = undefined; var card_tilemap: ?DeckSprites = null; @@ -35,6 +38,8 @@ var win_count: u32 = 0; var win_triggered: bool = false; pub fn init(context: *seizer.Context) !void { + context_global = context; + gpa = context.gpa; prng = std.rand.DefaultPrng.init(@bitCast(std.time.timestamp())); @@ -106,6 +111,7 @@ pub fn init(context: *seizer.Context) !void { .on_event = toggleMenu, .default_bindings = &.{ .{ .gamepad = .start }, + .{ .keyboard = .esc }, }, }); try context.addButtonInput(.{ @@ -113,50 +119,35 @@ pub fn init(context: *seizer.Context) !void { .on_event = undo, .default_bindings = &.{ .{ .gamepad = .x }, + .{ .keyboard = .a }, }, }); - win_count = try loadWinCount(gpa); + const read_buffer = try gpa.alloc(u8, @sizeOf(u32)); + context.readFile(.{ + .appname = APPNAME, + .path = "win_count.bin", + .buffer = read_buffer, + .callback = onWinCountRead, + .userdata = read_buffer.ptr, + }); } -fn loadWinCount(allocator: std.mem.Allocator) !u32 { - if (builtin.target.os.tag == .wasi) return 0; +fn onWinCountRead(userdata: ?*anyopaque, result: seizer.Context.FileError![]const u8) void { + const buffer: *[4]u8 = @ptrCast(userdata); + defer gpa.free(buffer); - const app_data_dir_path = try std.fs.getAppDataDir(allocator, "seizer-solitaire"); - defer allocator.free(app_data_dir_path); - - var app_data_dir = try std.fs.cwd().makeOpenPath(app_data_dir_path, .{}); - defer app_data_dir.close(); - - var win_count_file = try app_data_dir.createFile("win_count.bin", .{ .read = true, .truncate = false }); - defer win_count_file.close(); - - var buffer: [4]u8 = undefined; - const bytes_read = try win_count_file.preadAll(&buffer, 0); - if (bytes_read < buffer.len) { - std.mem.writeInt(u32, &buffer, 0, .little); - try win_count_file.pwriteAll(&buffer, 0); - return 0; - } else { - return std.mem.readInt(u32, &buffer, .little); - } + if (result) |bytes| { + if (bytes.len >= @sizeOf(@TypeOf(win_count))) { + win_count = std.mem.readInt(u32, bytes[0..4], .little); + } + } else |_| {} } -fn saveWinCount(allocator: std.mem.Allocator, count: u32) !void { - if (builtin.target.os.tag == .wasi) return; - - const app_data_dir_path = try std.fs.getAppDataDir(allocator, "seizer-solitaire"); - defer allocator.free(app_data_dir_path); - - var app_data_dir = try std.fs.cwd().makeOpenPath(app_data_dir_path, .{}); - defer app_data_dir.close(); - - var win_count_file = try app_data_dir.createFile("win_count.bin", .{ .read = true, .truncate = false }); - defer win_count_file.close(); - - var buffer: [4]u8 = undefined; - std.mem.writeInt(u32, &buffer, count, .little); - try win_count_file.pwriteAll(&buffer, 0); +fn onWinCountWritten(userdata: ?*anyopaque, result: seizer.Context.FileError!void) void { + const buffer: *u32 = @ptrCast(@alignCast(userdata)); + defer gpa.destroy(buffer); + _ = result catch {}; } fn resetGame() !void { @@ -226,7 +217,15 @@ fn render(window: seizer.Window) !void { if (haveWon() and !win_triggered) { win_count += 1; - try saveWinCount(gpa, win_count); + const win_count_write_buffer = try gpa.create(u32); + std.mem.writeInt(u32, std.mem.asBytes(win_count_write_buffer), win_count, .little); + context_global.writeFile(.{ + .appname = APPNAME, + .path = "win_count.bin", + .data = std.mem.asBytes(win_count_write_buffer), + .callback = onWinCountWritten, + .userdata = win_count_write_buffer, + }); resetHistory(); win_triggered = true;