1.44mb-gamejam

submission for the 1.44mb game jam - https://2pgarcade.com/contest-144mb.html
git clone git://brookjeynes.dev/bjeynes/1.44mb-gamejam.git
Log | Files | Refs

upgrade.zig (2010B)


      1 const Player = @import("./player.zig");
      2 
      3 pub const UpgradeId = enum(u8) {
      4     max_health,
      5     movement_speed,
      6     bullet_speed,
      7     fire_rate,
      8     regen,
      9 
     10     pub const count = @typeInfo(UpgradeId).@"enum".fields.len;
     11 };
     12 
     13 const Meta = struct {
     14     name: []const u8,
     15     base: f32,
     16     per_level: f32,
     17     max_level: u8,
     18     cost: u8,
     19 };
     20 
     21 pub const meta: [UpgradeId.count]Meta = .{
     22     .{ .name = "health", .base = 255, .per_level = 50, .max_level = 10, .cost = 5 },
     23     .{ .name = "speed", .base = 140, .per_level = 10, .max_level = 10, .cost = 5 },
     24     .{ .name = "bullet spd", .base = 300, .per_level = 20, .max_level = 10, .cost = 5 },
     25     .{ .name = "fire rate", .base = 0.4, .per_level = -0.02, .max_level = 10, .cost = 5 },
     26     .{ .name = "regen", .base = 50, .per_level = 10, .max_level = 10, .cost = 5 },
     27 };
     28 
     29 pub const Upgrades = struct {
     30     levels: [UpgradeId.count]u8,
     31 
     32     pub fn level(self: Upgrades, comptime id: UpgradeId) u8 {
     33         return self.levels[@intFromEnum(id)];
     34     }
     35 
     36     pub fn maxed(self: Upgrades, comptime id: UpgradeId) bool {
     37         return self.level(id) >= meta[@intFromEnum(id)].max_level;
     38     }
     39 
     40     pub fn stat(self: Upgrades, comptime id: UpgradeId) f32 {
     41         const m = meta[@intFromEnum(id)];
     42         return m.base + m.per_level * @as(f32, @floatFromInt(self.level(id)));
     43     }
     44 
     45     pub fn cost(self: Upgrades, comptime id: UpgradeId) u8 {
     46         return meta[@intFromEnum(id)].cost * (self.level(id) + 1);
     47     }
     48 
     49     pub fn upgrade(self: *Upgrades, comptime id: UpgradeId) bool {
     50         if (self.maxed(id)) return false;
     51         self.levels[@intFromEnum(id)] += 1;
     52         return true;
     53     }
     54 
     55     pub fn apply(self: Upgrades, player: *Player) void {
     56         player.max_health = self.stat(.max_health);
     57         player.movement_speed = self.stat(.movement_speed);
     58         player.bullet_speed = self.stat(.bullet_speed);
     59         player.health_regen_amount = self.stat(.regen);
     60         player.bullet_pool.fire_timer = .{ .duration = self.stat(.fire_rate) };
     61     }
     62 };