From 3c61d2164d4f2f3bc94f0d83e20dcd1e95562760 Mon Sep 17 00:00:00 2001 From: Rokas Puzonas Date: Sun, 19 Jul 2026 06:50:20 +0300 Subject: [PATCH] add fire animation --- assets/fire/1.png | Bin 0 -> 2684 bytes assets/fire/2.png | Bin 0 -> 4885 bytes assets/fire/3.png | Bin 0 -> 4461 bytes assets/fire/4.png | Bin 0 -> 2891 bytes assets/fire/5.png | Bin 0 -> 5472 bytes build.zig | 5 +- src/app.zig | 433 ++++++++++++++++++++++++++++++++-------------- 7 files changed, 306 insertions(+), 132 deletions(-) create mode 100644 assets/fire/1.png create mode 100644 assets/fire/2.png create mode 100644 assets/fire/3.png create mode 100644 assets/fire/4.png create mode 100644 assets/fire/5.png diff --git a/assets/fire/1.png b/assets/fire/1.png new file mode 100644 index 0000000000000000000000000000000000000000..f75fe5d854c65c3d17d58c4ca64d90b22aca10f0 GIT binary patch literal 2684 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 BFOvWO literal 0 HcmV?d00001 diff --git a/assets/fire/3.png b/assets/fire/3.png new file mode 100644 index 0000000000000000000000000000000000000000..a56e994e9ece106d04c2a4eeac8ae2a7f50eab55 GIT binary patch literal 4461 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 literal 0 HcmV?d00001 diff --git a/assets/fire/4.png b/assets/fire/4.png new file mode 100644 index 0000000000000000000000000000000000000000..4eed33b3c64dbd3b2b7b0f1c7217d4a93001627e GIT binary patch literal 2891 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 literal 0 HcmV?d00001 diff --git a/assets/fire/5.png b/assets/fire/5.png new file mode 100644 index 0000000000000000000000000000000000000000..1b8abb7083b470e199494220884e2690dcb6f43c GIT binary patch literal 5472 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 animation.frame_duration) { + e.animation_timer -= animation.frame_duration; + e.animation_index += 1; + } + + e.animation_index = e.animation_index % @as(u32, @intCast(animation.frames.len)); + const sprite = animation.frames[e.animation_index]; + + var rect = e.animation_rect; + if (e.animation_flip) { + rect.pos.x += rect.size.x; + rect.size.x *= -1; + } + + Gfx.drawSprite(sprite, e.pos.add(rect.pos), rect.size, .white); + } +} + pub fn frame(self: *App, plt: Platform.Frame) !void { const input = plt.input; _ = input; // autofix @@ -1655,6 +1755,17 @@ pub fn frame(self: *App, plt: Platform.Frame) !void { } } + { + var minion_iter = self.initEntityIteratorByType(.minion); + while (minion_iter.next()) |minion_id| { + const minion = self.entities.getAssumeExists(minion_id); + + if (minion.minion_state == .wander and minion.target_entity != null) { + self.unsetEntityTarget(minion_id); + } + } + } + { // Ensure that `target_entity` and `targeted_by_entity` don't point to dead entities var entity_iter = self.entities.iterator(); while (entity_iter.next()) |entity_id| { @@ -1722,6 +1833,27 @@ pub fn frame(self: *App, plt: Platform.Frame) !void { } } + { // Each burn station will assign itself to the nearest minion that has wood + var burn_station_iter = self.initEntityIteratorByType(.burn_station); + while (burn_station_iter.next()) |burn_station_id| { + const burn_station = self.entities.getAssumeExists(burn_station_id); + if (burn_station.targeted_by_entity != null) { + continue; + } + + var minion_iter = self.initNearestEntityIter(.minion, burn_station.pos, plt.arena); + while (try minion_iter.next()) |minion_id| { + const minion = self.entities.getAssumeExists(minion_id); + const state = minion.minion_state; + if (state == .wander and minion.minion_carried_wood_len == self.upgrades.minion_carry_capacity) { + self.setEntityTarget(minion_id, burn_station_id); + minion.minion_state = .goto_burn_station; + break; + } + } + } + } + { // Each tree entity will assign itself to the nearest minion that isn't busy var tree_iter = self.initEntityIteratorByType(.tree); while (tree_iter.next()) |tree_id| { @@ -1786,51 +1918,79 @@ pub fn frame(self: *App, plt: Platform.Frame) !void { } } - { // Each burn station will assign itself to the nearest minion that has wood - var burn_station_iter = self.initEntityIteratorByType(.burn_station); - while (burn_station_iter.next()) |burn_station_id| { - const burn_station = self.entities.getAssumeExists(burn_station_id); - if (burn_station.targeted_by_entity != null) { - continue; + { // Clear acceleration + var entity_iter = self.entities.iterator(); + while (entity_iter.next()) |id| { + const e = self.entities.getAssumeExists(id); + + if (e.flags.has_kinematics) { + e.acc = .init(0, 0); + } + } + } + + { // Minion logic & animations + var minion_iter = self.initEntityIteratorByType(.minion); + while (minion_iter.next()) |minion_id| { + const minion = self.entities.getAssumeExists(minion_id); + + try self.minionLogic(plt, minion_id); + + if (minion.acc.x > 0) { + minion.minion_animation = .walk; + minion.minion_animation_dir = .right; + } else if (minion.acc.x < 0) { + minion.minion_animation = .walk; + minion.minion_animation_dir = .left; + } else { + minion.minion_animation = .idle; + minion.minion_animation_dir = .down; } - var minion_iter = self.initNearestEntityIter(.minion, burn_station.pos, plt.arena); - while (try minion_iter.next()) |minion_id| { - const minion = self.entities.getAssumeExists(minion_id); - const state = minion.minion_state; - if (state == .wander and minion.minion_carried_wood_len == self.upgrades.minion_carry_capacity) { - self.setEntityTarget(minion_id, burn_station_id); - minion.minion_state = .goto_burn_station; - break; + const animations = switch (minion.minion_animation) { + .idle => self.idle_animations, + .walk => self.walk_animations, + .death => self.death_animations + }; + + minion.animation_flip = false; + minion.animation = switch (minion.minion_animation_dir) { + .right => animations.right, + .up => animations.up, + .down => animations.down, + .left => blk: { + minion.animation_flip = true; + break :blk animations.right; + } + }; + } + } + + { // Apply kinamatics + var entity_iter = self.entities.iterator(); + while (entity_iter.next()) |id| { + const e = self.entities.getAssumeExists(id); + + if (e.flags.has_kinematics) { + e.vel = e.vel.add(e.acc.multiplyScalar(dt)); + e.pos = e.pos.add(e.vel.multiplyScalar(dt)); + + e.pos.y = @min(e.pos.y, 0); + } + + if (e.type == .minion) { + const stats = self.upgrades.minion_walk; + e.vel = e.vel.limitLength(stats.max_velocity); + + if (0 <= stats.friction and stats.friction <= 1) { + const friction_force = std.math.pow(f32, 1 - stats.friction, dt); + e.vel = e.vel.multiplyScalar(friction_force); } } } } - { - var minion_iter = self.entities.iterator(); - while (minion_iter.next()) |minion_id| { - const minion = self.entities.getAssumeExists(minion_id); - if (minion.type != .minion) { - continue; - } - - try self.minionLogic(plt, minion_id); - - if (minion.acc.x > 0) { - minion.animation = .walk; - minion.animation_dir = .right; - } else if (minion.acc.x < 0) { - minion.animation = .walk; - minion.animation_dir = .left; - } else { - minion.animation = .idle; - minion.animation_dir = .down; - } - } - } - - { + { // Wood position follow var wood_iter = self.initEntityIteratorByType(.wood); while (wood_iter.next()) |wood_id| { const wood = self.entities.getAssumeExists(wood_id); @@ -1895,86 +2055,97 @@ pub fn frame(self: *App, plt: Platform.Frame) !void { } } - const character_size = Vec2.init(96, 96); - { - var entity_iter = self.entities.iterator(); - while (entity_iter.next()) |id| { - const e = self.entities.getAssumeExists(id); - - if (e.flags.has_kinematics) { - e.vel = e.vel.add(e.acc.multiplyScalar(dt)); - e.pos = e.pos.add(e.vel.multiplyScalar(dt)); - - e.pos.y = @min(e.pos.y, 0); - - e.acc = .init(0, 0); - } - - if (e.type == .minion) { - const stats = self.upgrades.minion_walk; - e.vel = e.vel.limitLength(stats.max_velocity); - - if (0 <= stats.friction and stats.friction <= 1) { - const friction_force = std.math.pow(f32, 1 - stats.friction, dt); - e.vel = e.vel.multiplyScalar(friction_force); - } - } - - if (e.flags.has_animation) { - const animations = switch (e.animation) { - .idle => self.idle_animations, - .walk => self.walk_animations, - .death => self.death_animations - }; - var flip_animation = false; - const animation = switch (e.animation_dir) { - .right => animations.right, - .up => animations.up, - .down => animations.down, - .left => blk: { - flip_animation = true; - break :blk animations.right; - } - }; - - e.animation_timer += plt.dt; - while (e.animation_timer >= animation.frame_duration) { - e.animation_timer -= animation.frame_duration; - e.animation_index += 1; - } - - e.animation_index = e.animation_index % @as(u32, @intCast(animation.frames.len)); - const sprite = animation.frames[e.animation_index]; - - var size = character_size; - var pos = e.pos; - pos.y -= character_size.y*0.7; - if (flip_animation) { - size.x *= -1; - pos.x += character_size.x/2; - } else { - pos.x -= character_size.x/2; - } - - Gfx.drawSprite(sprite, pos, size, .white); - - if (e.type == .minion and e.minion_state == .burn_wood and e.minion_throw_cooldown > 0) { - Gfx.drawRectangle(e.pos.sub(.init(5, 65)), .init(10, 10), .rgb(200, 20, 20)); - } - } - - if (e.type == .burn_station) { - Gfx.drawRectangle(e.pos.sub(.init(5, 5)), .init(10, 10), .rgb(200, 20, 20)); - } - } - } - { // Draw eternal flame var eternal_flame_iter = self.initEntityIteratorByType(.eternal_flame); while (eternal_flame_iter.next()) |id| { const eternal_flame = self.entities.getAssumeExists(id); - Gfx.drawRectangle(eternal_flame.pos.sub(.init(10, 50)), .init(30, 50), .rgb(150, 30, 20)); + { // Draw holder + Gfx.transformPush(); + defer Gfx.transformPop(); + Gfx.transformTranslate(eternal_flame.pos); + Gfx.transformScale(terrain_tile_size); + Gfx.transformTranslate(.init(-1.5, -1)); + + Gfx.drawSprite( + self.terrain_sheet.get(118, 90), + .init(0, 0), + .init(1, 1), + .white + ); + Gfx.drawSprite( + self.terrain_sheet.get(119, 90), + .init(1, 0), + .init(1, 1), + .white + ); + Gfx.drawSprite( + self.terrain_sheet.get(120, 90), + .init(2, 0), + .init(1, 1), + .white + ); + } + + switch (eternal_flame.eternal_flame_size) { + .small => { + const flame_size = Vec2.init(16, 32).multiplyScalar(4); + eternal_flame.animation = self.fire1_animation; + eternal_flame.animation_rect = .init(-flame_size.x/2, -flame_size.y, flame_size.x, flame_size.y); + }, + .medium => { + const flame_size = Vec2.init(32, 48).multiplyScalar(4); + eternal_flame.animation = self.fire2_animation; + eternal_flame.animation_rect = .init(-flame_size.x/2, -flame_size.y, flame_size.x, flame_size.y); + }, + .large => { + const flame_size = Vec2.init(32, 48).multiplyScalar(4); + eternal_flame.animation = self.fire5_animation; + eternal_flame.animation_rect = .init(-flame_size.x/2, -flame_size.y, flame_size.x, flame_size.y); + } + } + + self.drawEntityAnimation(eternal_flame, plt.dt); + } + } + + { + var entity_iter = self.entities.iterator(); + while (entity_iter.next()) |id| { + const e = self.entities.getAssumeExists(id); + + if (e.type != .eternal_flame) { + self.drawEntityAnimation(e, plt.dt); + } + + if (e.type == .minion and e.minion_state == .burn_wood and e.minion_throw_cooldown > 0) { + Gfx.drawRectangle(e.pos.sub(.init(5, 65)), .init(10, 10), .rgb(200, 20, 20)); + } + + if (e.type == .burn_station) { + Gfx.drawSprite( + self.terrain_sheet.get(123, 81), + e.pos.sub(.init(terrain_tile_size.x/2, terrain_tile_size.y)), + terrain_tile_size, + .white + ); + } + + if (e.type == .minion and self.show_minion_state) { + Gfx.drawText(self.font, .{ + .height = 16, + .text = try std.fmt.allocPrint(plt.arena, "{}", .{e.minion_state}), + .pos = e.pos.add(.init(0, 20)), + }); + } + } + } + + { // Draw eternal flame stats + var eternal_flame_iter = self.initEntityIteratorByType(.eternal_flame); + while (eternal_flame_iter.next()) |id| { + const eternal_flame = self.entities.getAssumeExists(id); + Gfx.drawText(self.font, .{ .text = try std.fmt.allocPrint(plt.arena, "Stack: {}", .{self.countEternalFlameStackSize()}), .pos = eternal_flame.pos.sub(.init(10, 80)),