feat: detect when a player has won the game

ci-dev
LeRoyce Pearson 2024-04-21 01:56:45 -06:00
parent 53be39dcd3
commit 5e7f978e74
1 changed files with 76 additions and 3 deletions

View File

@ -28,6 +28,9 @@ const MENU_ITEMS = [_][]const u8{
"Quit", "Quit",
}; };
var win_count: u32 = 0;
var win_triggered: bool = false;
pub fn init(context: *seizer.Context) !void { pub fn init(context: *seizer.Context) !void {
gpa = context.gpa; gpa = context.gpa;
prng = std.rand.DefaultPrng.init(@bitCast(std.time.timestamp())); prng = std.rand.DefaultPrng.init(@bitCast(std.time.timestamp()));
@ -83,7 +86,7 @@ pub fn init(context: *seizer.Context) !void {
} }
fn resetGame() !void { fn resetGame() !void {
draw_pile.shrinkRetainingCapacity(0); draw_pile.deinit(gpa);
draw_pile_exhausted = false; draw_pile_exhausted = false;
drawn_cards.shrinkRetainingCapacity(0); drawn_cards.shrinkRetainingCapacity(0);
for (&stacks) |*stack| { for (&stacks) |*stack| {
@ -110,6 +113,8 @@ fn resetGame() !void {
try stack.append(gpa, drawn_card); try stack.append(gpa, drawn_card);
} }
} }
win_triggered = false;
} }
fn destroy(window: *seizer.Window) void { fn destroy(window: *seizer.Window) void {
@ -131,6 +136,11 @@ fn destroy(window: *seizer.Window) void {
} }
fn render(window: *seizer.Window) !void { fn render(window: *seizer.Window) !void {
if (haveWon() and !win_triggered) {
win_count += 1;
win_triggered = true;
}
gl.clearColor(0.2, 0.4, 0.2, 1.0); gl.clearColor(0.2, 0.4, 0.2, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT); gl.clear(gl.COLOR_BUFFER_BIT);
@ -146,12 +156,38 @@ fn render(window: *seizer.Window) !void {
card_tilemap.?.tilesheet.tile_size[1] * scale, card_tilemap.?.tilesheet.tile_size[1] * scale,
}; };
const margin = card_tilemap.?.margin * scale; const margin = card_tilemap.?.margin * scale;
const marginf: f32 = @floatFromInt(card_tilemap.?.margin * scale);
const hand_offset = [2]u32{ const hand_offset = [2]u32{
card_tilemap.?.hand_offset[0] * scale, card_tilemap.?.hand_offset[0] * scale,
card_tilemap.?.hand_offset[1] * scale, card_tilemap.?.hand_offset[1] * scale,
}; };
const hand_offsetf = [2]f32{
@floatFromInt(hand_offset[0]),
@floatFromInt(hand_offset[1]),
};
const tile_sizef = [2]f32{ @floatFromInt(tile_size[0]), @floatFromInt(tile_size[1]) }; const tile_sizef = [2]f32{ @floatFromInt(tile_size[0]), @floatFromInt(tile_size[1]) };
const space_taken_by_board = [2]f32{
@floatFromInt(2 * margin + 8 * (margin + tile_size[0])),
@floatFromInt(2 * margin + 5 * (margin + tile_size[1])),
};
const board_offset = [2]f32{
(canvas.window_size[0] - space_taken_by_board[0]) / 2,
(canvas.window_size[1] - space_taken_by_board[1]) / 2,
};
{
_ = canvas.printText(
.{
canvas.window_size[0] - board_offset[0] - marginf - hand_offsetf[0],
board_offset[1] + marginf + hand_offsetf[1],
},
"Win Count: {}",
.{win_count},
.{ .@"align" = .right, .scale = scalef },
);
}
for (&stacks, 0..) |*stack, i| { for (&stacks, 0..) |*stack, i| {
const deck_is_selected = selected_deck != null and selected_deck.? == stack; const deck_is_selected = selected_deck != null and selected_deck.? == stack;
const deck_is_hovered = hovered_deck != null and hovered_deck.? == stack; const deck_is_hovered = hovered_deck != null and hovered_deck.? == stack;
@ -163,9 +199,11 @@ fn render(window: *seizer.Window) !void {
[4]u8{ 0xFF, 0xFF, 0xFF, 0xFF }; [4]u8{ 0xFF, 0xFF, 0xFF, 0xFF };
var pos = [2]f32{ var pos = [2]f32{
@floatFromInt(margin + ((tile_size[0] + margin) * (i + 1))), @floor(@as(f32, @floatFromInt(margin + ((tile_size[0] + margin) * (i + 1))))),
@floatFromInt(margin + margin + tile_size[1]), @floor(@as(f32, @floatFromInt(margin + margin + tile_size[1]))),
}; };
pos[0] += board_offset[0];
pos[1] += board_offset[1];
canvas.rect(pos, tile_sizef, .{ .color = deck_color }); canvas.rect(pos, tile_sizef, .{ .color = deck_color });
for (stack.items, 0..) |card, j| { for (stack.items, 0..) |card, j| {
@ -187,6 +225,26 @@ fn render(window: *seizer.Window) !void {
} }
} }
if (haveWon()) {
const offset =
[2]f32{
2 * marginf + tile_sizef[0],
2 * marginf + tile_sizef[1],
};
_ = canvas.writeText(
.{
board_offset[0] + offset[0] + (space_taken_by_board[0] - offset[0]) / 2,
board_offset[1] + offset[1] + (space_taken_by_board[1] - offset[0]) / 2,
},
"You Win!",
.{
.baseline = .middle,
.@"align" = .center,
.scale = 2 * scalef,
},
);
}
for (&foundations, 0..) |*foundation, i| { for (&foundations, 0..) |*foundation, i| {
const is_hovered = hovered_deck != null and hovered_deck.? == foundation; const is_hovered = hovered_deck != null and hovered_deck.? == foundation;
const color = if (is_hovered) [4]u8{ 0xA0, 0xFF, 0xA0, 0xFF } else [4]u8{ 0xFF, 0xFF, 0xFF, 0xFF }; const color = if (is_hovered) [4]u8{ 0xA0, 0xFF, 0xA0, 0xFF } else [4]u8{ 0xFF, 0xFF, 0xFF, 0xFF };
@ -195,6 +253,8 @@ fn render(window: *seizer.Window) !void {
@floatFromInt(margin), @floatFromInt(margin),
@floatFromInt(margin + ((margin + tile_size[1]) * (i + 1))), @floatFromInt(margin + ((margin + tile_size[1]) * (i + 1))),
}; };
pos[0] += board_offset[0];
pos[1] += board_offset[1];
canvas.rect(pos, tile_sizef, .{ .color = color }); canvas.rect(pos, tile_sizef, .{ .color = color });
for (foundation.items) |card| { for (foundation.items) |card| {
@ -215,6 +275,8 @@ fn render(window: *seizer.Window) !void {
@floatFromInt(margin + margin + tile_size[0]), @floatFromInt(margin + margin + tile_size[0]),
@floatFromInt(margin), @floatFromInt(margin),
}; };
pos[0] += board_offset[0];
pos[1] += board_offset[1];
for (drawn_cards.items, 0..) |card, j| { for (drawn_cards.items, 0..) |card, j| {
const is_selected = deck_is_selected and j >= selected_card; const is_selected = deck_is_selected and j >= selected_card;
const is_hovered = deck_is_hovered and j >= hovered_card; const is_hovered = deck_is_hovered and j >= hovered_card;
@ -239,6 +301,8 @@ fn render(window: *seizer.Window) !void {
const color = if (is_hovered) [4]u8{ 0xA0, 0xFF, 0xA0, 0xFF } else [4]u8{ 0xFF, 0xFF, 0xFF, 0xFF }; const color = if (is_hovered) [4]u8{ 0xA0, 0xFF, 0xA0, 0xFF } else [4]u8{ 0xFF, 0xFF, 0xFF, 0xFF };
var pos = [2]f32{ @floatFromInt(margin), @floatFromInt(margin) }; var pos = [2]f32{ @floatFromInt(margin), @floatFromInt(margin) };
pos[0] += board_offset[0];
pos[1] += board_offset[1];
canvas.rect(pos, tile_sizef, .{ .color = color }); canvas.rect(pos, tile_sizef, .{ .color = color });
for (draw_pile.items) |card| { for (draw_pile.items) |card| {
@ -273,6 +337,15 @@ fn render(window: *seizer.Window) !void {
canvas.end(); canvas.end();
} }
pub fn haveWon() bool {
if (draw_pile.items.len > 0) return false;
if (drawn_cards.items.len > 0) return false;
for (stacks) |stack| {
if (stack.items.len > 0) return false;
}
return true;
}
pub fn makeStandardDeck(allocator: std.mem.Allocator) ![]Card { pub fn makeStandardDeck(allocator: std.mem.Allocator) ![]Card {
var deck = try allocator.alloc(Card, 52); var deck = try allocator.alloc(Card, 52);
errdefer allocator.free(deck); errdefer allocator.free(deck);