feat: web: write win count to disk
parent
812caef88a
commit
e157502750
|
@ -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 = .{
|
||||
|
|
73
src/main.zig
73
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;
|
||||
|
|
Loading…
Reference in New Issue