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 };