From 57825e9534ccd88ecb84229bb9ba68ef0c1cd576 Mon Sep 17 00:00:00 2001 From: geemili Date: Sun, 21 Apr 2024 01:04:51 -0600 Subject: [PATCH] feat: add menu to start new game or quit --- build.zig.zon | 4 +- src/assets.zig | 2 +- src/main.zig | 105 +++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 96 insertions(+), 15 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index 2e6d880..18fd426 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -16,8 +16,8 @@ // internet connectivity. .dependencies = .{ .seizer = .{ - .url = "https://github.com/leroycep/seizer/archive/d425db26fbbf5a99faa70ea07fb7d2b028f690d1.tar.gz", - .hash = "1220250791e125cf4d342020eb3af65c36a8b971559ae9ffafc187c0cb116ee3d6e2", + .url = "https://github.com/leroycep/seizer/archive/2be76fb909fc487da4983a487d0695fc749f714a.tar.gz", + .hash = "12207072224809e8a8d2c1342b5e14db5b6fbb1fbbd7f5c6410d71d3708c9241261e", }, }, .paths = .{ diff --git a/src/assets.zig b/src/assets.zig index 5ebbcf5..b2a145e 100644 --- a/src/assets.zig +++ b/src/assets.zig @@ -385,7 +385,7 @@ pub fn loadSolitaireCards(gpa: std.mem.Allocator) !DeckSprites { .blank = 13, .back = 27, .margin = 4, - .hand_offset = .{ 13, 12 }, + .hand_offset = .{ 10, 12 }, }; } diff --git a/src/main.zig b/src/main.zig index 368581e..8806a72 100644 --- a/src/main.zig +++ b/src/main.zig @@ -2,6 +2,7 @@ pub const main = seizer.main; var gpa: std.mem.Allocator = undefined; var prng: std.rand.DefaultPrng = undefined; +var window_global: *seizer.Window = undefined; var canvas: seizer.Canvas = undefined; var card_tilemap: ?DeckSprites = null; @@ -19,11 +20,19 @@ var hovered_card: usize = 0; var selected_deck: ?*std.ArrayListUnmanaged(Card) = null; var selected_card: usize = 0; +var show_menu: bool = false; +var menu_item_selected: u32 = 0; +const MENU_ITEMS = [_][]const u8{ + "Continue", + "New Game", + "Quit", +}; + pub fn init(context: *seizer.Context) !void { gpa = context.gpa; prng = std.rand.DefaultPrng.init(@bitCast(std.time.timestamp())); - _ = try context.createWindow(.{ + window_global = try context.createWindow(.{ .title = "Seizer Solitaire", .on_render = render, .on_destroy = destroy, @@ -34,15 +43,7 @@ pub fn init(context: *seizer.Context) !void { card_tilemap = try assets.loadSolitaireCards(context.gpa); - draw_pile = std.ArrayListUnmanaged(Card).fromOwnedSlice(try makeStandardDeck(gpa)); - prng.random().shuffle(Card, draw_pile.items); - - for (&stacks, 0..) |*stack, i| { - for (0..i + 1) |_| { - const drawn_card = draw_pile.pop(); - try stack.append(gpa, drawn_card); - } - } + try resetGame(); try context.addButtonInput(.{ .title = "move_up", @@ -74,6 +75,41 @@ pub fn init(context: *seizer.Context) !void { .on_event = deselect, .default_bindings = &.{.b}, }); + try context.addButtonInput(.{ + .title = "toggle_menu", + .on_event = toggleMenu, + .default_bindings = &.{.start}, + }); +} + +fn resetGame() !void { + draw_pile.shrinkRetainingCapacity(0); + draw_pile_exhausted = false; + drawn_cards.shrinkRetainingCapacity(0); + for (&stacks) |*stack| { + stack.shrinkRetainingCapacity(0); + } + for (&foundations) |*foundation| { + foundation.shrinkRetainingCapacity(0); + } + + last_hovered_stack = 0; + last_hovered_foundation = 0; + hovered_deck = null; + hovered_card = 0; + + selected_deck = null; + selected_card = 0; + + draw_pile = std.ArrayListUnmanaged(Card).fromOwnedSlice(try makeStandardDeck(gpa)); + prng.random().shuffle(Card, draw_pile.items); + + for (&stacks, 0..) |*stack, i| { + for (0..i + 1) |_| { + const drawn_card = draw_pile.pop(); + try stack.append(gpa, drawn_card); + } + } } fn destroy(window: *seizer.Window) void { @@ -212,6 +248,25 @@ fn render(window: *seizer.Window) !void { } } + if (show_menu) { + canvas.rect( + .{ canvas.window_size[0] / 3, canvas.window_size[1] / 3 }, + .{ canvas.window_size[0] / 3, canvas.window_size[1] / 3 }, + .{ .color = .{ 0, 0, 0, 0xFF } }, + ); + const x: f32 = canvas.window_size[0] / 2; + var y: f32 = canvas.window_size[1] / 3 + (canvas.font.lineHeight * scalef); + for (MENU_ITEMS, 0..) |menu_item, i| { + if (i == menu_item_selected) { + const size = canvas.printText(.{ x, y }, "> {s} <", .{menu_item}, .{ .@"align" = .center, .scale = scalef }); + y += size[1]; + } else { + const size = canvas.writeText(.{ x, y }, menu_item, .{ .@"align" = .center, .scale = scalef }); + y += size[1]; + } + } + } + canvas.end(); } @@ -235,12 +290,25 @@ pub fn makeStandardDeck(allocator: std.mem.Allocator) ![]Card { pub fn deselect(pressed: bool) !void { if (!pressed) return; + if (show_menu) return; selected_deck = null; selected_card = 0; } pub fn doSelectOrPlace(pressed: bool) !void { if (!pressed) return; + if (show_menu) { + const menu_item = MENU_ITEMS[menu_item_selected]; + if (std.mem.eql(u8, menu_item, "Continue")) { + show_menu = false; + } else if (std.mem.eql(u8, menu_item, "New Game")) { + try resetGame(); + show_menu = false; + } else if (std.mem.eql(u8, menu_item, "Quit")) { + window_global.setShouldClose(true); + } + return; + } if (selected_deck == null) { if (hovered_deck == &draw_pile and !draw_pile_exhausted) { drawn_cards.ensureUnusedCapacity(gpa, 3) catch return; @@ -346,6 +414,7 @@ pub fn doSelectOrPlace(pressed: bool) !void { pub fn moveLeft(pressed: bool) !void { if (!pressed) return; + if (show_menu) return; if (hovered_deck == null) { hovered_deck = &draw_pile; hovered_card = 0; @@ -378,6 +447,7 @@ pub fn moveLeft(pressed: bool) !void { pub fn moveRight(pressed: bool) !void { if (!pressed) return; + if (show_menu) return; if (hovered_deck == null) { hovered_deck = &draw_pile; hovered_card = 0; @@ -411,7 +481,10 @@ pub fn moveRight(pressed: bool) !void { pub fn moveUp(pressed: bool) !void { if (!pressed) return; - if (hovered_deck == null) { + if (show_menu) { + if (menu_item_selected == 0) menu_item_selected = MENU_ITEMS.len; + menu_item_selected -= 1; + } else if (hovered_deck == null) { hovered_deck = &draw_pile; hovered_card = 0; } else if (hovered_deck == &draw_pile) { @@ -452,7 +525,10 @@ pub fn moveUp(pressed: bool) !void { pub fn moveDown(pressed: bool) !void { if (!pressed) return; - if (hovered_deck == null) { + if (show_menu) { + menu_item_selected += 1; + menu_item_selected %= MENU_ITEMS.len; + } else if (hovered_deck == null) { hovered_deck = &draw_pile; hovered_card = 0; } else if (hovered_deck == &draw_pile) { @@ -491,6 +567,11 @@ pub fn moveDown(pressed: bool) !void { } } +pub fn toggleMenu(pressed: bool) !void { + if (!pressed) return; + show_menu = !show_menu; +} + pub fn indexOfTopOfStack(cards: []Card) usize { if (cards.len < 2) return 0;