From 310a4aff5526f58df25417cb0e06257f311ac6e0 Mon Sep 17 00:00:00 2001 From: Rokas Puzonas Date: Sat, 20 Dec 2025 15:32:58 +0200 Subject: [PATCH] add finale section --- src/game.zig | 118 ++++++++++++++++++++++++++++++++++++++++++----- src/graphics.zig | 14 ++++-- 2 files changed, 117 insertions(+), 15 deletions(-) diff --git a/src/game.zig b/src/game.zig index 79a61ed..52eac17 100644 --- a/src/game.zig +++ b/src/game.zig @@ -55,6 +55,8 @@ pub const Level = struct { } }; +const key = "XXXXX-XXXXX-XXXXX"; + gpa: Allocator, canvas_size: Vec2, @@ -74,6 +76,10 @@ timers: Timer.List = .empty, level_exit_transition: ?Timer.Id = null, level_enter_transition: ?Timer.Id = null, +finale: bool = false, +finale_timer: ?Timer.Id = null, +finale_counter: u32 = 0, + pub fn init(gpa: Allocator) !Game { var self = Game{ .gpa = gpa, @@ -334,20 +340,14 @@ fn hasStaricaseAt(self: *Game, position: Vec2) bool { return false; } -pub fn tick(self: *Game, input: Input) !void { +pub fn tickLevel(self: *Game, input: Input) !void { const bg_color = rgb_hex("#222323").?; - Gfx.drawRectangle(.init(0, 0), .init(self.canvas_size.x, self.canvas_size.y), bg_color); - if (self.show_grid) { - self.drawGrid(.init(1, 1), rgb(20, 20, 20), 0.1); - } - if (input.restart) { try self.restartLevel(); } self.level.timers.now += input.dt; - self.timers.now += input.dt; var cover_opacity: f32 = 0; var can_move = true; @@ -359,12 +359,17 @@ pub fn tick(self: *Game, input: Input) !void { if (self.timers.finished(timer)) { self.current_level += 1; - try self.restartLevel(); - self.level_exit_transition = null; + if (self.current_level == self.levels.items.len) { + self.finale = true; + return; + } else { + try self.restartLevel(); + self.level_exit_transition = null; - self.level_enter_transition = try self.timers.start(self.gpa, .{ - .duration = 1 - }); + self.level_enter_transition = try self.timers.start(self.gpa, .{ + .duration = 1 + }); + } } } @@ -440,6 +445,91 @@ pub fn tick(self: *Game, input: Input) !void { } } +pub fn tickFinale(self: *Game) !void { + const color = rgb(200, 200, 200); + + const Line = struct { + pos: Vec2, + font: Gfx.Font, + text: []const u8, + }; + + const lines = [5]Line{ + .{ + .pos = Vec2.init(1, 1), + .font = Gfx.Font.default, + .text = "Congratulations scientist" + }, + .{ + .pos = Vec2.init(1, 2), + .font = Gfx.Font.default, + .text = "You have passed the entrance exam" + }, + .{ + .pos = Vec2.init(1, 3), + .font = Gfx.Font.default, + .text = "Here is your entry code" + }, + .{ + .pos = Vec2.init(1, 5), + .font = Gfx.Font.bold, + .text = key + }, + .{ + .pos = Vec2.init(1, 7), + .font = Gfx.Font.default, + .text = "I'll meet you at the lab" + } + }; + + if (self.finale_timer == null) { + if (self.finale_counter < lines.len) { + self.finale_timer = try self.timers.start(self.gpa, .{ + .duration = 2, + }); + } + } + + if (self.finale_timer) |timer| { + if (self.timers.finished(timer)) { + self.finale_timer = null; + self.finale_counter += 1; + } + } + + for (0..self.finale_counter) |i| { + const line = lines[i]; + try Gfx.drawText(self.gpa, line.pos, line.font, color, line.text); + } + + if (self.finale_counter < lines.len) { + var opacity: f32 = 0; + if (self.finale_timer) |timer| { + opacity = self.timers.percent_passed(timer); + } + + const line = lines[self.finale_counter]; + try Gfx.drawText(self.gpa, line.pos, line.font, color.multiply(Vec4.init(1, 1, 1, opacity)), line.text); + } +} + +pub fn tick(self: *Game, input: Input) !void { + const bg_color = rgb_hex("#222323").?; + + Gfx.drawRectangle(.init(0, 0), .init(self.canvas_size.x, self.canvas_size.y), bg_color); + if (self.show_grid) { + self.drawGrid(.init(1, 1), rgb(20, 20, 20), 0.1); + } + + self.timers.now += input.dt; + + if (self.finale) { + try self.tickFinale(); + } else { + try self.tickLevel(input); + } +} + pub fn debug(self: *Game) !void { if (!imgui.beginWindow(.{ .name = "Debug", @@ -457,4 +547,8 @@ pub fn debug(self: *Game) !void { if (imgui.button("Skip level")) { try self.nextLevel(); } + + if (imgui.button("Finale")) { + self.finale = true; + } } diff --git a/src/graphics.zig b/src/graphics.zig index 2eea637..e54a824 100644 --- a/src/graphics.zig +++ b/src/graphics.zig @@ -294,7 +294,12 @@ pub const Font = struct { pub const default = Font{ .variant = .regular, - .size = 16, + .size = 64, + }; + + pub const bold = Font{ + .variant = .bold, + .size = 64, }; pub fn setAsCurrent(self: Font) void { @@ -320,10 +325,13 @@ pub const Font = struct { ); c.fonsSetColor(fs, fons_color); + pushTransform(.init(0, 0), 1.0/64.0); + defer popTransform(); + _ = c.fonsDrawText( fs, - pos.x, - pos.y, + pos.x*64, + pos.y*64, text.ptr, text.ptr + text.len );