diff --git a/src/items.zig b/src/items.zig index 76915066c7..41ec77fb02 100644 --- a/src/items.zig +++ b/src/items.zig @@ -162,6 +162,24 @@ const Modifier = struct { printTooltip: *const fn (outString: *main.List(u8), data: Data) void, loadData: *const fn (zon: ZonElement) Data, priority: f32, + + const Defaults = struct { + pub fn changeProceduralItemParameters(_: *ProceduralItem, _: Data) void {} + pub fn changeBlockDamage(damage: f32, _: main.blocks.Block, _: Data) f32 { + return damage; + } + }; + + inline fn initFromModifierStruct(comptime ModifierStruct: type) VTable { + return comptime .{ + .changeProceduralItemParameters = @ptrCast(if (@hasDecl(ModifierStruct, "changeProceduralItemParameters")) &ModifierStruct.changeProceduralItemParameters else &VTable.Defaults.changeProceduralItemParameters), + .changeBlockDamage = @ptrCast(if (@hasDecl(ModifierStruct, "changeBlockDamage")) &ModifierStruct.changeBlockDamage else &VTable.Defaults.changeBlockDamage), + .combineModifiers = @ptrCast(&ModifierStruct.combineModifiers), + .printTooltip = @ptrCast(&ModifierStruct.printTooltip), + .loadData = @ptrCast(&ModifierStruct.loadData), + .priority = ModifierStruct.priority, + }; + } }; pub fn combineModifiers(a: Modifier, b: Modifier) ?Modifier { @@ -1167,15 +1185,8 @@ pub fn globalInit() void { recipeList = .init(main.worldArena); itemListSize = 0; inline for (@typeInfo(modifierList).@"struct".decls) |decl| { - const ModifierStruct = @field(modifierList, decl.name); - modifiers.put(main.globalArena.allocator, decl.name, &.{ - .changeProceduralItemParameters = @ptrCast(&ModifierStruct.changeProceduralItemParameters), - .changeBlockDamage = @ptrCast(&ModifierStruct.changeBlockDamage), - .combineModifiers = @ptrCast(&ModifierStruct.combineModifiers), - .printTooltip = @ptrCast(&ModifierStruct.printTooltip), - .loadData = @ptrCast(&ModifierStruct.loadData), - .priority = ModifierStruct.priority, - }) catch unreachable; + const ModifierStruct: type = @field(modifierList, decl.name); + modifiers.put(main.globalArena.allocator, decl.name, &Modifier.VTable.initFromModifierStruct(ModifierStruct)) catch unreachable; } inline for (@typeInfo(modifierRestrictionList).@"struct".decls) |decl| { const ModifierRestrictionStruct = @field(modifierRestrictionList, decl.name); diff --git a/src/proceduralItem/modifiers/bad_at.zig b/src/proceduralItem/modifiers/bad_at.zig index fbfe303efd..3acbb38677 100644 --- a/src/proceduralItem/modifiers/bad_at.zig +++ b/src/proceduralItem/modifiers/bad_at.zig @@ -16,8 +16,6 @@ pub fn combineModifiers(data1: Data, data2: Data) ?Data { return .{.strength = 1.0 - 1.0/(1.0 + std.math.hypot(1.0/(1.0 - data1.strength) - 1.0, 1.0/(1.0 - data2.strength) - 1.0)), .tag = data1.tag}; } -pub fn changeProceduralItemParameters(_: *ProceduralItem, _: Data) void {} - pub fn changeBlockDamage(damage: f32, block: main.blocks.Block, data: Data) f32 { for (block.blockTags()) |tag| { if (tag == data.tag) return damage*(1 - data.strength); diff --git a/src/proceduralItem/modifiers/durable.zig b/src/proceduralItem/modifiers/durable.zig index 51ad023ebc..6002cff646 100644 --- a/src/proceduralItem/modifiers/durable.zig +++ b/src/proceduralItem/modifiers/durable.zig @@ -19,10 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.maxDurability *= 1 + data.strength; } -pub fn changeBlockDamage(damage: f32, _: main.blocks.Block, _: Data) f32 { - return damage; -} - pub fn printTooltip(outString: *main.List(u8), data: Data) void { outString.print("#500090**Durable**#808080 *Increases durability by **{d:.0}%", .{data.strength*100}); } diff --git a/src/proceduralItem/modifiers/fragile.zig b/src/proceduralItem/modifiers/fragile.zig index 9094b4864e..2fe3707dc4 100644 --- a/src/proceduralItem/modifiers/fragile.zig +++ b/src/proceduralItem/modifiers/fragile.zig @@ -19,10 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.maxDurability *= 1 - data.strength; } -pub fn changeBlockDamage(damage: f32, _: main.blocks.Block, _: Data) f32 { - return damage; -} - pub fn printTooltip(outString: *main.List(u8), data: Data) void { outString.print("#ccddff**Fragile**#808080 *Decreases durability by **{d:.0}%", .{data.strength*100}); } diff --git a/src/proceduralItem/modifiers/good_at.zig b/src/proceduralItem/modifiers/good_at.zig index ed91647f83..275a8f63da 100644 --- a/src/proceduralItem/modifiers/good_at.zig +++ b/src/proceduralItem/modifiers/good_at.zig @@ -16,8 +16,6 @@ pub fn combineModifiers(data1: Data, data2: Data) ?Data { return .{.strength = std.math.hypot(data1.strength, data2.strength), .tag = data1.tag}; } -pub fn changeProceduralItemParameters(_: *ProceduralItem, _: Data) void {} - pub fn changeBlockDamage(damage: f32, block: main.blocks.Block, data: Data) f32 { for (block.blockTags()) |tag| { if (tag == data.tag) return damage*(1 + data.strength); diff --git a/src/proceduralItem/modifiers/heavy.zig b/src/proceduralItem/modifiers/heavy.zig index fb32fbd755..8a710e6561 100644 --- a/src/proceduralItem/modifiers/heavy.zig +++ b/src/proceduralItem/modifiers/heavy.zig @@ -19,10 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.swingSpeed *= 1 - data.strength; } -pub fn changeBlockDamage(damage: f32, _: main.blocks.Block, _: Data) f32 { - return damage; -} - pub fn printTooltip(outString: *main.List(u8), data: Data) void { outString.print("#ffcc30**Heavy**#808080 *Decreases swing speed by **{d:.0}%", .{data.strength*100}); } diff --git a/src/proceduralItem/modifiers/light.zig b/src/proceduralItem/modifiers/light.zig index 04bd8f8cfe..8684107552 100644 --- a/src/proceduralItem/modifiers/light.zig +++ b/src/proceduralItem/modifiers/light.zig @@ -19,10 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.swingSpeed *= 1 + data.strength; } -pub fn changeBlockDamage(damage: f32, _: main.blocks.Block, _: Data) f32 { - return damage; -} - pub fn printTooltip(outString: *main.List(u8), data: Data) void { outString.print("#9fffde**Light**#808080 *Increases swing speed by **{d:.0}%", .{data.strength*100}); } diff --git a/src/proceduralItem/modifiers/powerful.zig b/src/proceduralItem/modifiers/powerful.zig index fcf02d4258..55fa26b696 100644 --- a/src/proceduralItem/modifiers/powerful.zig +++ b/src/proceduralItem/modifiers/powerful.zig @@ -19,10 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.damage *= 1 + data.strength; } -pub fn changeBlockDamage(damage: f32, _: main.blocks.Block, _: Data) f32 { - return damage; -} - pub fn printTooltip(outString: *main.List(u8), data: Data) void { outString.print("#f84a00**Powerful**#808080 *Increases damage by **{d:.0}%", .{data.strength*100}); } diff --git a/src/proceduralItem/modifiers/single_use.zig b/src/proceduralItem/modifiers/single_use.zig index 6568660ea6..ea32c7d3a2 100644 --- a/src/proceduralItem/modifiers/single_use.zig +++ b/src/proceduralItem/modifiers/single_use.zig @@ -19,10 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.maxDurability = data.strength; } -pub fn changeBlockDamage(damage: f32, _: main.blocks.Block, _: Data) f32 { - return damage; -} - pub fn printTooltip(outString: *main.List(u8), data: Data) void { outString.print("#800000**Single-use**#808080 *Sets durability to **{d:.0}", .{data.strength}); } diff --git a/src/proceduralItem/modifiers/weak.zig b/src/proceduralItem/modifiers/weak.zig index fcfee9d903..c416b9c2ef 100644 --- a/src/proceduralItem/modifiers/weak.zig +++ b/src/proceduralItem/modifiers/weak.zig @@ -19,10 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.damage *= 1 - data.strength; } -pub fn changeBlockDamage(damage: f32, _: main.blocks.Block, _: Data) f32 { - return damage; -} - pub fn printTooltip(outString: *main.List(u8), data: Data) void { outString.print("#fcb5e3**Weak**#808080 *Decreases damage by **{d:.0}%", .{data.strength*100}); }