From 88d3e46d6ca5ad970752bab5215a31855ba8a967 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sun, 19 Jul 2026 20:50:52 -0700 Subject: [PATCH 1/3] added functionality --- src/items.zig | 36 +++++++++----- src/proceduralItem/modifiers/bad_at.zig | 4 +- src/proceduralItem/modifiers/durable.zig | 4 +- src/proceduralItem/modifiers/fragile.zig | 4 +- src/proceduralItem/modifiers/good_at.zig | 4 +- src/proceduralItem/modifiers/heavy.zig | 4 +- src/proceduralItem/modifiers/light.zig | 4 +- src/proceduralItem/modifiers/powerful.zig | 4 +- .../modifiers/restrictions/_list.zig | 1 + .../modifiers/restrictions/always.zig | 10 +++- .../modifiers/restrictions/and.zig | 20 ++++++-- .../modifiers/restrictions/encased.zig | 18 +++++-- .../modifiers/restrictions/for_each.zig | 47 +++++++++++++++++++ .../modifiers/restrictions/not.zig | 11 ++++- .../modifiers/restrictions/or.zig | 20 ++++++-- src/proceduralItem/modifiers/single_use.zig | 4 +- src/proceduralItem/modifiers/weak.zig | 4 +- 17 files changed, 155 insertions(+), 44 deletions(-) create mode 100644 src/proceduralItem/modifiers/restrictions/for_each.zig diff --git a/src/items.zig b/src/items.zig index 0984f13239..dd02e26290 100644 --- a/src/items.zig +++ b/src/items.zig @@ -78,6 +78,7 @@ const Material = struct { // MARK: Material .vTable = vTable, .data = vTable.loadData(item), .restriction = ModifierRestriction.loadFromZon(allocator, item.getChild("restriction")), + .restrictionPower = 0, }; } } @@ -118,17 +119,24 @@ const Material = struct { // MARK: Material } }; +pub const ModifierRestrictionOutput = struct { + ifSatisfied: bool, + totalItemsChecked: usize, + totalCountedItems: usize, + modifierPower: f32, +}; + pub const ModifierRestriction = struct { vTable: *const VTable, data: *anyopaque, pub const VTable = struct { - satisfied: *const fn (data: *anyopaque, proceduralItem: *const ProceduralItem, x: i32, y: i32) bool, + satisfied: *const fn (data: *anyopaque, proceduralItem: *const ProceduralItem, x: i32, y: i32) ModifierRestrictionOutput, loadFromZon: *const fn (allocator: NeverFailingAllocator, zon: ZonElement) *anyopaque, printTooltip: *const fn (data: *anyopaque, outString: *main.ListManaged(u8)) void, }; - pub fn satisfied(self: ModifierRestriction, proceduralItem: *const ProceduralItem, x: i32, y: i32) bool { + pub fn satisfied(self: ModifierRestriction, proceduralItem: *const ProceduralItem, x: i32, y: i32) ModifierRestrictionOutput { return self.vTable.satisfied(self.data, proceduralItem, x, y); } @@ -153,19 +161,20 @@ const Modifier = struct { data: VTable.Data, restriction: ModifierRestriction, vTable: *const VTable, + restrictionPower: f32, pub const VTable = struct { const Data = packed struct(u128) { pad: u128 }; combineModifiers: *const fn (data1: Data, data2: Data) ?Data, - changeProceduralItemParameters: *const fn (proceduralItem: *ProceduralItem, data: Data) void, - changeBlockDamage: *const fn (damage: f32, block: Block, data: Data) f32, + changeProceduralItemParameters: *const fn (proceduralItem: *ProceduralItem, data: Data, restrictionPower: f32) void, + changeBlockDamage: *const fn (damage: f32, block: Block, data: Data, restrictionPower: f32) f32, printTooltip: *const fn (outString: *main.ListManaged(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, _: Block, _: Data) f32 { + pub fn changeProceduralItemParameters(_: *ProceduralItem, _: Data, _: f32) void {} + pub fn changeBlockDamage(damage: f32, _: Block, _: Data, _: f32) f32 { return damage; } }; @@ -188,15 +197,16 @@ const Modifier = struct { .data = a.vTable.combineModifiers(a.data, b.data) orelse return null, .vTable = a.vTable, .restriction = undefined, + .restrictionPower = std.math.hypot(a.restrictionPower, b.restrictionPower), }; } pub fn changeProceduralItemParameters(self: Modifier, proceduralItem: *ProceduralItem) void { - self.vTable.changeProceduralItemParameters(proceduralItem, self.data); + self.vTable.changeProceduralItemParameters(proceduralItem, self.data, self.restrictionPower); } pub fn changeBlockDamage(self: Modifier, damage: f32, block: Block) f32 { - return self.vTable.changeBlockDamage(damage, block, self.data); + return self.vTable.changeBlockDamage(damage, block, self.data, self.restrictionPower); } pub fn printTooltip(self: Modifier, outString: *main.ListManaged(u8)) void { @@ -484,15 +494,17 @@ const ProceduralItemPhysics = struct { // MARK: ProceduralItemPhysics if (proceduralItem.getProperty(.swingSpeed) < 1) proceduralItem.setProperty(.swingSpeed, 1/(2 - proceduralItem.getProperty(.swingSpeed))); for (0..25) |i| { const material = (proceduralItem.craftingGrid[i] orelse continue).material() orelse continue; - outer: for (material.modifiers) |newMod| { - if (!newMod.restriction.satisfied(proceduralItem, @intCast(i%5), @intCast(i/5))) continue; + outer: for (material.modifiers) |*newMod| { + const checkedRestrictionValues = newMod.restriction.satisfied(proceduralItem, @intCast(i%5), @intCast(i/5)); + if (!checkedRestrictionValues.ifSatisfied) continue; for (tempModifiers.items) |*oldMod| { if (oldMod.vTable == newMod.vTable) { - oldMod.* = oldMod.combineModifiers(newMod) orelse continue; + oldMod.* = oldMod.combineModifiers(newMod.*) orelse continue; continue :outer; } } - tempModifiers.append(main.stackAllocator, newMod); + newMod.restrictionPower = checkedRestrictionValues.modifierPower; + tempModifiers.append(main.stackAllocator, newMod.*); } } std.sort.insertion(Modifier, tempModifiers.items, {}, struct { diff --git a/src/proceduralItem/modifiers/bad_at.zig b/src/proceduralItem/modifiers/bad_at.zig index 2d47a9e440..1addf5e288 100644 --- a/src/proceduralItem/modifiers/bad_at.zig +++ b/src/proceduralItem/modifiers/bad_at.zig @@ -16,9 +16,9 @@ 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 changeBlockDamage(damage: f32, block: main.blocks.Block, data: Data) f32 { +pub fn changeBlockDamage(damage: f32, block: main.blocks.Block, data: Data, restrictionPower: f32) f32 { for (block.tags()) |tag| { - if (tag == data.tag) return damage*(1 - data.strength); + if (tag == data.tag) return damage*(1 - @min(data.strength*restrictionPower, 0)); } return damage; } diff --git a/src/proceduralItem/modifiers/durable.zig b/src/proceduralItem/modifiers/durable.zig index a491af6a55..60c741676c 100644 --- a/src/proceduralItem/modifiers/durable.zig +++ b/src/proceduralItem/modifiers/durable.zig @@ -15,8 +15,8 @@ pub fn combineModifiers(data1: Data, data2: Data) ?Data { return .{.strength = std.math.hypot(data1.strength, data2.strength)}; } -pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data) void { - proceduralItem.setProperty(.maxDurability, proceduralItem.getProperty(.maxDurability)*(1 + data.strength)); +pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data, restrictionPower: f32) void { + proceduralItem.setProperty(.maxDurability, proceduralItem.getProperty(.maxDurability)*(1 + data.strength*restrictionPower)); } pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { diff --git a/src/proceduralItem/modifiers/fragile.zig b/src/proceduralItem/modifiers/fragile.zig index 2450f40109..2654014457 100644 --- a/src/proceduralItem/modifiers/fragile.zig +++ b/src/proceduralItem/modifiers/fragile.zig @@ -15,8 +15,8 @@ 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))}; } -pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data) void { - proceduralItem.setProperty(.maxDurability, proceduralItem.getProperty(.maxDurability)*(1 - data.strength)); +pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data, restrictionPower: f32) void { + proceduralItem.setProperty(.maxDurability, proceduralItem.getProperty(.maxDurability)*(1 - @min(data.strength*restrictionPower, 0))); } pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { diff --git a/src/proceduralItem/modifiers/good_at.zig b/src/proceduralItem/modifiers/good_at.zig index a47b969d06..9928620411 100644 --- a/src/proceduralItem/modifiers/good_at.zig +++ b/src/proceduralItem/modifiers/good_at.zig @@ -16,9 +16,9 @@ pub fn combineModifiers(data1: Data, data2: Data) ?Data { return .{.strength = std.math.hypot(data1.strength, data2.strength), .tag = data1.tag}; } -pub fn changeBlockDamage(damage: f32, block: main.blocks.Block, data: Data) f32 { +pub fn changeBlockDamage(damage: f32, block: main.blocks.Block, data: Data, restrictionPower: f32) f32 { for (block.tags()) |tag| { - if (tag == data.tag) return damage*(1 + data.strength); + if (tag == data.tag) return damage*(1 + data.strength*restrictionPower); } return damage; } diff --git a/src/proceduralItem/modifiers/heavy.zig b/src/proceduralItem/modifiers/heavy.zig index 033a12cb46..0b1c330d99 100644 --- a/src/proceduralItem/modifiers/heavy.zig +++ b/src/proceduralItem/modifiers/heavy.zig @@ -15,8 +15,8 @@ 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))}; } -pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data) void { - proceduralItem.setProperty(.swingSpeed, proceduralItem.getProperty(.swingSpeed)*(1 - data.strength)); +pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data, restrictionPower: f32) void { + proceduralItem.setProperty(.swingSpeed, proceduralItem.getProperty(.swingSpeed)*(1 - @min(data.strength*restrictionPower, 0))); } pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { diff --git a/src/proceduralItem/modifiers/light.zig b/src/proceduralItem/modifiers/light.zig index 319e0bc787..b3e9abd92f 100644 --- a/src/proceduralItem/modifiers/light.zig +++ b/src/proceduralItem/modifiers/light.zig @@ -15,8 +15,8 @@ pub fn combineModifiers(data1: Data, data2: Data) ?Data { return .{.strength = std.math.hypot(data1.strength, data2.strength)}; } -pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data) void { - proceduralItem.setProperty(.swingSpeed, proceduralItem.getProperty(.swingSpeed)*(1 + data.strength)); +pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data, restrictionPower: f32) void { + proceduralItem.setProperty(.swingSpeed, proceduralItem.getProperty(.swingSpeed)*(1 + data.strength*restrictionPower)); } pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { diff --git a/src/proceduralItem/modifiers/powerful.zig b/src/proceduralItem/modifiers/powerful.zig index 96b5330356..ddb71748f1 100644 --- a/src/proceduralItem/modifiers/powerful.zig +++ b/src/proceduralItem/modifiers/powerful.zig @@ -15,8 +15,8 @@ pub fn combineModifiers(data1: Data, data2: Data) ?Data { return .{.strength = std.math.hypot(data1.strength, data2.strength)}; } -pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data) void { - proceduralItem.setProperty(.damage, proceduralItem.getProperty(.damage)*(1 + data.strength)); +pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data, restrictionPower: f32) void { + proceduralItem.setProperty(.damage, proceduralItem.getProperty(.damage)*(1 + data.strength*restrictionPower)); } pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { diff --git a/src/proceduralItem/modifiers/restrictions/_list.zig b/src/proceduralItem/modifiers/restrictions/_list.zig index c77fcf13aa..05514b3db1 100644 --- a/src/proceduralItem/modifiers/restrictions/_list.zig +++ b/src/proceduralItem/modifiers/restrictions/_list.zig @@ -3,3 +3,4 @@ pub const @"and" = @import("and.zig"); pub const encased = @import("encased.zig"); pub const not = @import("not.zig"); pub const @"or" = @import("or.zig"); +pub const for_each = @import("for_each.zig"); diff --git a/src/proceduralItem/modifiers/restrictions/always.zig b/src/proceduralItem/modifiers/restrictions/always.zig index 11a9b8cd36..b8b879f4dd 100644 --- a/src/proceduralItem/modifiers/restrictions/always.zig +++ b/src/proceduralItem/modifiers/restrictions/always.zig @@ -4,9 +4,15 @@ const main = @import("main"); const NeverFailingAllocator = main.heap.NeverFailingAllocator; const ProceduralItem = main.items.ProceduralItem; const ZonElement = main.ZonElement; +const ModifierRestrictionOutput = main.items.ModifierRestrictionOutput; -pub fn satisfied(_: *const anyopaque, _: *const ProceduralItem, _: i32, _: i32) bool { - return true; +pub fn satisfied(_: *const anyopaque, _: *const ProceduralItem, _: i32, _: i32) ModifierRestrictionOutput { + return .{ + .ifSatisfied = true, + .totalItemsChecked = 0, + .totalCountedItems = 0, + .modifierPower = 1, + }; } pub fn loadFromZon(_: NeverFailingAllocator, _: ZonElement) *const anyopaque { diff --git a/src/proceduralItem/modifiers/restrictions/and.zig b/src/proceduralItem/modifiers/restrictions/and.zig index e74c9cfefb..2c9e97ef80 100644 --- a/src/proceduralItem/modifiers/restrictions/and.zig +++ b/src/proceduralItem/modifiers/restrictions/and.zig @@ -5,16 +5,30 @@ const NeverFailingAllocator = main.heap.NeverFailingAllocator; const ModifierRestriction = main.items.ModifierRestriction; const ProceduralItem = main.items.ProceduralItem; const ZonElement = main.ZonElement; +const ModifierRestrictionOutput = main.items.ModifierRestrictionOutput; const And = struct { children: []ModifierRestriction, }; -pub fn satisfied(self: *const And, proceduralItem: *const ProceduralItem, x: i32, y: i32) bool { +pub fn satisfied(self: *const And, proceduralItem: *const ProceduralItem, x: i32, y: i32) ModifierRestrictionOutput { + var combinedIsSatisfied = true; + var combinedtotalCountedItems: usize = 0; + var combinedTotalItemsChecked: usize = 0; + var combinedModifierPower: f32 = 0; for (self.children) |child| { - if (!child.satisfied(proceduralItem, x, y)) return false; + const childValues: ModifierRestrictionOutput = child.satisfied(proceduralItem, x, y); + if (!childValues.ifSatisfied) combinedIsSatisfied = false; + combinedtotalCountedItems += childValues.totalCountedItems; + combinedTotalItemsChecked += childValues.totalItemsChecked; + combinedModifierPower = std.math.hypot(combinedModifierPower, childValues.modifierPower); } - return true; + return .{ + .ifSatisfied = combinedIsSatisfied, + .totalItemsChecked = combinedTotalItemsChecked, + .totalCountedItems = combinedtotalCountedItems, + .modifierPower = combinedModifierPower, + }; } pub fn loadFromZon(allocator: NeverFailingAllocator, zon: ZonElement) *const And { diff --git a/src/proceduralItem/modifiers/restrictions/encased.zig b/src/proceduralItem/modifiers/restrictions/encased.zig index 48894e6613..27980e5732 100644 --- a/src/proceduralItem/modifiers/restrictions/encased.zig +++ b/src/proceduralItem/modifiers/restrictions/encased.zig @@ -5,20 +5,26 @@ const NeverFailingAllocator = main.heap.NeverFailingAllocator; const ModifierRestriction = main.items.ModifierRestriction; const ProceduralItem = main.items.ProceduralItem; const ZonElement = main.ZonElement; +const ModifierRestrictionOutput = main.items.ModifierRestrictionOutput; const Encased = struct { tag: main.Tag, amount: usize, }; -pub fn satisfied(self: *const Encased, proceduralItem: *const ProceduralItem, x: i32, y: i32) bool { +pub fn satisfied(self: *const Encased, proceduralItem: *const ProceduralItem, x: i32, y: i32) ModifierRestrictionOutput { var count: usize = 0; for ([_]i32{-1, 0, 1}) |dx| { for ([_]i32{-1, 0, 1}) |dy| { if ((proceduralItem.getItemAt(x + dx, y + dy) orelse continue).hasTag(self.tag)) count += 1; } } - return count >= self.amount; + return .{ + .ifSatisfied = count >= self.amount, + .totalItemsChecked = count, + .totalCountedItems = 9, + .modifierPower = 1, + }; } pub fn loadFromZon(allocator: NeverFailingAllocator, zon: ZonElement) *const Encased { @@ -28,11 +34,15 @@ pub fn loadFromZon(allocator: NeverFailingAllocator, zon: ZonElement) *const Enc std.log.err("Missing tag field for encased restriction.", .{}); break :blk "not specified"; }), - .amount = zon.get(usize, "amount") orelse 8, + .amount = zon.get(usize, "amount") orelse 0, }; return result; } pub fn printTooltip(self: *const Encased, outString: *main.ListManaged(u8)) void { - outString.print("encased in {} .{s}", .{self.amount, self.tag.getName()}); + if (self.amount == 0) { + outString.print("encased in .{s}", .{self.tag.getName()}); + } else { + outString.print("encased in {} .{s}", .{self.amount, self.tag.getName()}); + } } diff --git a/src/proceduralItem/modifiers/restrictions/for_each.zig b/src/proceduralItem/modifiers/restrictions/for_each.zig new file mode 100644 index 0000000000..85c988c00a --- /dev/null +++ b/src/proceduralItem/modifiers/restrictions/for_each.zig @@ -0,0 +1,47 @@ +const std = @import("std"); + +const main = @import("main"); +const NeverFailingAllocator = main.heap.NeverFailingAllocator; +const ModifierRestriction = main.items.ModifierRestriction; +const ProceduralItem = main.items.ProceduralItem; +const ZonElement = main.ZonElement; +const ModifierRestrictionOutput = main.items.ModifierRestrictionOutput; + +const And = struct { + child: ModifierRestriction, +}; + +pub fn satisfied(self: *const And, proceduralItem: *const ProceduralItem, x: i32, y: i32) ModifierRestrictionOutput { + const childValues = self.child.satisfied(proceduralItem, x, y); + const loopCount = childValues.totalCountedItems; + var combinedModifierPower: f32 = 0; + for (0..loopCount) |i| { + _ = i; + combinedModifierPower = std.math.hypot(combinedModifierPower, 1); + } + return .{ + .ifSatisfied = childValues.ifSatisfied, + .totalItemsChecked = childValues.totalItemsChecked, + .totalCountedItems = childValues.totalCountedItems, + .modifierPower = combinedModifierPower, + }; +} + +pub fn loadFromZon(allocator: NeverFailingAllocator, zon: ZonElement) *const And { + const result = allocator.create(And); + const childrenZon = zon.getChild("children").toSlice(); + result.children = allocator.alloc(ModifierRestriction, childrenZon.len); + for (result.children, childrenZon) |*child, childZon| { + child.* = ModifierRestriction.loadFromZon(allocator, childZon); + } + return result; +} + +pub fn printTooltip(self: *const And, outString: *main.ListManaged(u8)) void { + outString.append('('); + for (self.children, 0..) |child, i| { + if (i != 0) outString.appendSlice(" and "); + child.printTooltip(outString); + } + outString.append(')'); +} diff --git a/src/proceduralItem/modifiers/restrictions/not.zig b/src/proceduralItem/modifiers/restrictions/not.zig index 7827f09cbd..a22019f206 100644 --- a/src/proceduralItem/modifiers/restrictions/not.zig +++ b/src/proceduralItem/modifiers/restrictions/not.zig @@ -5,13 +5,20 @@ const NeverFailingAllocator = main.heap.NeverFailingAllocator; const ModifierRestriction = main.items.ModifierRestriction; const ProceduralItem = main.items.ProceduralItem; const ZonElement = main.ZonElement; +const ModifierRestrictionOutput = main.items.ModifierRestrictionOutput; const Not = struct { child: ModifierRestriction, }; -pub fn satisfied(self: *const Not, proceduralItem: *const ProceduralItem, x: i32, y: i32) bool { - return !self.child.satisfied(proceduralItem, x, y); +pub fn satisfied(self: *const Not, proceduralItem: *const ProceduralItem, x: i32, y: i32) ModifierRestrictionOutput { + const childValues = self.child.satisfied(proceduralItem, x, y); + return .{ + .ifSatisfied = !childValues.ifSatisfied, + .totalItemsChecked = childValues.totalItemsChecked, + .totalCountedItems = childValues.totalItemsChecked - childValues.totalCountedItems, + .modifierPower = childValues.modifierPower, + }; } pub fn loadFromZon(allocator: NeverFailingAllocator, zon: ZonElement) *const Not { diff --git a/src/proceduralItem/modifiers/restrictions/or.zig b/src/proceduralItem/modifiers/restrictions/or.zig index d7ea7e2e96..e2e5c1e734 100644 --- a/src/proceduralItem/modifiers/restrictions/or.zig +++ b/src/proceduralItem/modifiers/restrictions/or.zig @@ -5,16 +5,30 @@ const NeverFailingAllocator = main.heap.NeverFailingAllocator; const ModifierRestriction = main.items.ModifierRestriction; const ProceduralItem = main.items.ProceduralItem; const ZonElement = main.ZonElement; +const ModifierRestrictionOutput = main.items.ModifierRestrictionOutput; const Or = struct { children: []ModifierRestriction, }; -pub fn satisfied(self: *const Or, proceduralItem: *const ProceduralItem, x: i32, y: i32) bool { +pub fn satisfied(self: *const Or, proceduralItem: *const ProceduralItem, x: i32, y: i32) ModifierRestrictionOutput { + var combinedIsSatisfied = false; + var combinedtotalCountedItems: usize = 0; + var combinedTotalItemsChecked: usize = 0; + var combinedModifierPower: f32 = 0; for (self.children) |child| { - if (child.satisfied(proceduralItem, x, y)) return true; + const childValues: ModifierRestrictionOutput = child.satisfied(proceduralItem, x, y); + if (childValues.ifSatisfied) combinedIsSatisfied = true; + combinedtotalCountedItems += childValues.totalCountedItems; + combinedTotalItemsChecked += childValues.totalItemsChecked; + combinedModifierPower = std.math.hypot(combinedModifierPower, childValues.modifierPower); } - return false; + return .{ + .ifSatisfied = combinedIsSatisfied, + .totalItemsChecked = combinedTotalItemsChecked, + .totalCountedItems = combinedtotalCountedItems, + .modifierPower = combinedModifierPower, + }; } pub fn loadFromZon(allocator: NeverFailingAllocator, zon: ZonElement) *const Or { diff --git a/src/proceduralItem/modifiers/single_use.zig b/src/proceduralItem/modifiers/single_use.zig index d82cedeaf1..9e708ff15b 100644 --- a/src/proceduralItem/modifiers/single_use.zig +++ b/src/proceduralItem/modifiers/single_use.zig @@ -15,8 +15,8 @@ pub fn combineModifiers(data1: Data, data2: Data) ?Data { return .{.strength = @min(data1.strength, data2.strength)}; } -pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data) void { - proceduralItem.setProperty(.maxDurability, data.strength); +pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data, restrictionPower: f32) void { + proceduralItem.setProperty(.maxDurability, data.strength*restrictionPower); } pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { diff --git a/src/proceduralItem/modifiers/weak.zig b/src/proceduralItem/modifiers/weak.zig index 6290f5aa22..a52a0d9c45 100644 --- a/src/proceduralItem/modifiers/weak.zig +++ b/src/proceduralItem/modifiers/weak.zig @@ -15,8 +15,8 @@ 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))}; } -pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data) void { - proceduralItem.setProperty(.damage, proceduralItem.getProperty(.damage)*(1 - data.strength)); +pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data, restrictionPower: f32) void { + proceduralItem.setProperty(.damage, proceduralItem.getProperty(.damage)*(1 - @min(data.strength*restrictionPower, 0))); } pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { From bb50a680df891f860b6209443d81dcd9128a1fa8 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sun, 19 Jul 2026 21:21:33 -0700 Subject: [PATCH 2/3] use this version for testing --- assets/cubyz/blocks/diamond_ore.zig.zon | 9 ++++-- src/items.zig | 11 ++++++-- src/proceduralItem/modifiers/durable.zig | 4 +-- src/proceduralItem/modifiers/fragile.zig | 4 +-- src/proceduralItem/modifiers/good_at.zig | 4 +-- src/proceduralItem/modifiers/heavy.zig | 4 +-- src/proceduralItem/modifiers/light.zig | 4 +-- src/proceduralItem/modifiers/powerful.zig | 4 +-- .../modifiers/restrictions/encased.zig | 4 +-- .../modifiers/restrictions/for_each.zig | 28 ++++++++----------- src/proceduralItem/modifiers/single_use.zig | 4 +-- src/proceduralItem/modifiers/weak.zig | 4 +-- 12 files changed, 44 insertions(+), 40 deletions(-) diff --git a/assets/cubyz/blocks/diamond_ore.zig.zon b/assets/cubyz/blocks/diamond_ore.zig.zon index 8d9c98208a..4744928c37 100644 --- a/assets/cubyz/blocks/diamond_ore.zig.zon +++ b/assets/cubyz/blocks/diamond_ore.zig.zon @@ -42,9 +42,12 @@ .id = "powerful", .strength = 0.5, .restriction = .{ - .id = .encased, - .tag = .precious, - .amount = 4, + .id = .for_each, + .child = .{ + .id = .encased, + .tag = .precious, + .amount = 4, + }, }, }, }, diff --git a/src/items.zig b/src/items.zig index dd02e26290..b3b13a52c2 100644 --- a/src/items.zig +++ b/src/items.zig @@ -78,7 +78,7 @@ const Material = struct { // MARK: Material .vTable = vTable, .data = vTable.loadData(item), .restriction = ModifierRestriction.loadFromZon(allocator, item.getChild("restriction")), - .restrictionPower = 0, + .restrictionPower = 1, }; } } @@ -108,6 +108,11 @@ const Material = struct { // MARK: Material if (modifier.restriction.vTable == modifierRestrictions.get("always").?) { modifier.printTooltip(outString); outString.appendSlice("\n"); + } else if (modifier.restriction.vTable == modifierRestrictions.get("for_each").?) { + modifier.restriction.printTooltip(outString); + outString.appendSlice("\n "); + modifier.printTooltip(outString); + outString.appendSlice("\n"); } else { outString.appendSlice("ยง#808080if "); modifier.restriction.printTooltip(outString); @@ -168,7 +173,7 @@ const Modifier = struct { combineModifiers: *const fn (data1: Data, data2: Data) ?Data, changeProceduralItemParameters: *const fn (proceduralItem: *ProceduralItem, data: Data, restrictionPower: f32) void, changeBlockDamage: *const fn (damage: f32, block: Block, data: Data, restrictionPower: f32) f32, - printTooltip: *const fn (outString: *main.ListManaged(u8), data: Data) void, + printTooltip: *const fn (outString: *main.ListManaged(u8), data: Data, restrictionPower: f32) void, loadData: *const fn (zon: ZonElement) Data, priority: f32, @@ -210,7 +215,7 @@ const Modifier = struct { } pub fn printTooltip(self: Modifier, outString: *main.ListManaged(u8)) void { - self.vTable.printTooltip(outString, self.data); + self.vTable.printTooltip(outString, self.data, self.restrictionPower); } }; diff --git a/src/proceduralItem/modifiers/durable.zig b/src/proceduralItem/modifiers/durable.zig index 60c741676c..58d3eeb7ad 100644 --- a/src/proceduralItem/modifiers/durable.zig +++ b/src/proceduralItem/modifiers/durable.zig @@ -19,6 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.setProperty(.maxDurability, proceduralItem.getProperty(.maxDurability)*(1 + data.strength*restrictionPower)); } -pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { - outString.print("#500090**Durable**#808080 *Increases durability by **{d:.0}%", .{data.strength*100}); +pub fn printTooltip(outString: *main.ListManaged(u8), data: Data, restrictionPower: f32) void { + outString.print("#500090**Durable**#808080 *Increases durability by **{d:.0}%", .{data.strength*100*restrictionPower}); } diff --git a/src/proceduralItem/modifiers/fragile.zig b/src/proceduralItem/modifiers/fragile.zig index 2654014457..ea3b047235 100644 --- a/src/proceduralItem/modifiers/fragile.zig +++ b/src/proceduralItem/modifiers/fragile.zig @@ -19,6 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.setProperty(.maxDurability, proceduralItem.getProperty(.maxDurability)*(1 - @min(data.strength*restrictionPower, 0))); } -pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { - outString.print("#ccddff**Fragile**#808080 *Decreases durability by **{d:.0}%", .{data.strength*100}); +pub fn printTooltip(outString: *main.ListManaged(u8), data: Data, restrictionPower: f32) void { + outString.print("#ccddff**Fragile**#808080 *Decreases durability by **{d:.0}%", .{@min(data.strength*100*restrictionPower, 100)}); } diff --git a/src/proceduralItem/modifiers/good_at.zig b/src/proceduralItem/modifiers/good_at.zig index 9928620411..e6a06d1ce1 100644 --- a/src/proceduralItem/modifiers/good_at.zig +++ b/src/proceduralItem/modifiers/good_at.zig @@ -23,6 +23,6 @@ pub fn changeBlockDamage(damage: f32, block: main.blocks.Block, data: Data, rest return damage; } -pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { - outString.print("#80ff40**Good at**#808080 *Increases damage by **{d:.0}%** on \n***#80ff40{s}#808080*** blocks", .{data.strength*100, data.tag.getName()}); +pub fn printTooltip(outString: *main.ListManaged(u8), data: Data, restrictionPower: f32) void { + outString.print("#80ff40**Good at**#808080 *Increases damage by **{d:.0}%** on \n***#80ff40{s}#808080*** blocks", .{data.strength*100*restrictionPower, data.tag.getName()}); } diff --git a/src/proceduralItem/modifiers/heavy.zig b/src/proceduralItem/modifiers/heavy.zig index 0b1c330d99..232ed15958 100644 --- a/src/proceduralItem/modifiers/heavy.zig +++ b/src/proceduralItem/modifiers/heavy.zig @@ -19,6 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.setProperty(.swingSpeed, proceduralItem.getProperty(.swingSpeed)*(1 - @min(data.strength*restrictionPower, 0))); } -pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { - outString.print("#ffcc30**Heavy**#808080 *Decreases swing speed by **{d:.0}%", .{data.strength*100}); +pub fn printTooltip(outString: *main.ListManaged(u8), data: Data, restrictionPower: f32) void { + outString.print("#ffcc30**Heavy**#808080 *Decreases swing speed by **{d:.0}%", .{@min(data.strength*100*restrictionPower, 100)}); } diff --git a/src/proceduralItem/modifiers/light.zig b/src/proceduralItem/modifiers/light.zig index b3e9abd92f..932dfb6f56 100644 --- a/src/proceduralItem/modifiers/light.zig +++ b/src/proceduralItem/modifiers/light.zig @@ -19,6 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.setProperty(.swingSpeed, proceduralItem.getProperty(.swingSpeed)*(1 + data.strength*restrictionPower)); } -pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { - outString.print("#9fffde**Light**#808080 *Increases swing speed by **{d:.0}%", .{data.strength*100}); +pub fn printTooltip(outString: *main.ListManaged(u8), data: Data, restrictionPower: f32) void { + outString.print("#9fffde**Light**#808080 *Increases swing speed by **{d:.0}%", .{data.strength*100*restrictionPower}); } diff --git a/src/proceduralItem/modifiers/powerful.zig b/src/proceduralItem/modifiers/powerful.zig index ddb71748f1..364c720173 100644 --- a/src/proceduralItem/modifiers/powerful.zig +++ b/src/proceduralItem/modifiers/powerful.zig @@ -19,6 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.setProperty(.damage, proceduralItem.getProperty(.damage)*(1 + data.strength*restrictionPower)); } -pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { - outString.print("#f84a00**Powerful**#808080 *Increases damage by **{d:.0}%", .{data.strength*100}); +pub fn printTooltip(outString: *main.ListManaged(u8), data: Data, restrictionPower: f32) void { + outString.print("#f84a00**Powerful**#808080 *Increases damage by **{d:.0}%", .{data.strength*100*restrictionPower}); } diff --git a/src/proceduralItem/modifiers/restrictions/encased.zig b/src/proceduralItem/modifiers/restrictions/encased.zig index 27980e5732..33de84f38b 100644 --- a/src/proceduralItem/modifiers/restrictions/encased.zig +++ b/src/proceduralItem/modifiers/restrictions/encased.zig @@ -21,8 +21,8 @@ pub fn satisfied(self: *const Encased, proceduralItem: *const ProceduralItem, x: } return .{ .ifSatisfied = count >= self.amount, - .totalItemsChecked = count, - .totalCountedItems = 9, + .totalItemsChecked = 9, + .totalCountedItems = count, .modifierPower = 1, }; } diff --git a/src/proceduralItem/modifiers/restrictions/for_each.zig b/src/proceduralItem/modifiers/restrictions/for_each.zig index 85c988c00a..bedbe6f694 100644 --- a/src/proceduralItem/modifiers/restrictions/for_each.zig +++ b/src/proceduralItem/modifiers/restrictions/for_each.zig @@ -7,18 +7,20 @@ const ProceduralItem = main.items.ProceduralItem; const ZonElement = main.ZonElement; const ModifierRestrictionOutput = main.items.ModifierRestrictionOutput; -const And = struct { +const ForEach = struct { child: ModifierRestriction, }; -pub fn satisfied(self: *const And, proceduralItem: *const ProceduralItem, x: i32, y: i32) ModifierRestrictionOutput { +pub fn satisfied(self: *const ForEach, proceduralItem: *const ProceduralItem, x: i32, y: i32) ModifierRestrictionOutput { const childValues = self.child.satisfied(proceduralItem, x, y); const loopCount = childValues.totalCountedItems; var combinedModifierPower: f32 = 0; + std.log.debug("loop count {}", .{loopCount}); for (0..loopCount) |i| { _ = i; combinedModifierPower = std.math.hypot(combinedModifierPower, 1); } + std.log.debug("restrictionPower {}", .{combinedModifierPower}); return .{ .ifSatisfied = childValues.ifSatisfied, .totalItemsChecked = childValues.totalItemsChecked, @@ -27,21 +29,15 @@ pub fn satisfied(self: *const And, proceduralItem: *const ProceduralItem, x: i32 }; } -pub fn loadFromZon(allocator: NeverFailingAllocator, zon: ZonElement) *const And { - const result = allocator.create(And); - const childrenZon = zon.getChild("children").toSlice(); - result.children = allocator.alloc(ModifierRestriction, childrenZon.len); - for (result.children, childrenZon) |*child, childZon| { - child.* = ModifierRestriction.loadFromZon(allocator, childZon); - } +pub fn loadFromZon(allocator: NeverFailingAllocator, zon: ZonElement) *const ForEach { + const result = allocator.create(ForEach); + result.* = .{ + .child = ModifierRestriction.loadFromZon(allocator, zon.getChild("child")), + }; return result; } -pub fn printTooltip(self: *const And, outString: *main.ListManaged(u8)) void { - outString.append('('); - for (self.children, 0..) |child, i| { - if (i != 0) outString.appendSlice(" and "); - child.printTooltip(outString); - } - outString.append(')'); +pub fn printTooltip(self: *const ForEach, outString: *main.ListManaged(u8)) void { + outString.appendSlice("for each "); + self.child.printTooltip(outString); } diff --git a/src/proceduralItem/modifiers/single_use.zig b/src/proceduralItem/modifiers/single_use.zig index 9e708ff15b..7a7351c14f 100644 --- a/src/proceduralItem/modifiers/single_use.zig +++ b/src/proceduralItem/modifiers/single_use.zig @@ -19,6 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.setProperty(.maxDurability, data.strength*restrictionPower); } -pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { - outString.print("#800000**Single-use**#808080 *Sets durability to **{d:.0}", .{data.strength}); +pub fn printTooltip(outString: *main.ListManaged(u8), data: Data, restrictionPower: f32) void { + outString.print("#800000**Single-use**#808080 *Sets durability to **{d:.0}", .{data.strength*restrictionPower}); } diff --git a/src/proceduralItem/modifiers/weak.zig b/src/proceduralItem/modifiers/weak.zig index a52a0d9c45..5bef25a8bd 100644 --- a/src/proceduralItem/modifiers/weak.zig +++ b/src/proceduralItem/modifiers/weak.zig @@ -19,6 +19,6 @@ pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Dat proceduralItem.setProperty(.damage, proceduralItem.getProperty(.damage)*(1 - @min(data.strength*restrictionPower, 0))); } -pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { - outString.print("#fcb5e3**Weak**#808080 *Decreases damage by **{d:.0}%", .{data.strength*100}); +pub fn printTooltip(outString: *main.ListManaged(u8), data: Data, restrictionPower: f32) void { + outString.print("#fcb5e3**Weak**#808080 *Decreases damage by **{d:.0}%", .{@min(data.strength*100*restrictionPower, 100)}); } From 7e4606c83b58661b2854b8f33ecb6a26e7276436 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sun, 19 Jul 2026 21:32:56 -0700 Subject: [PATCH 3/3] formatting --- src/proceduralItem/modifiers/restrictions/always.zig | 4 ++-- src/proceduralItem/modifiers/restrictions/and.zig | 6 +++--- src/proceduralItem/modifiers/restrictions/encased.zig | 6 +++--- src/proceduralItem/modifiers/restrictions/for_each.zig | 6 +++--- src/proceduralItem/modifiers/restrictions/not.zig | 6 +++--- src/proceduralItem/modifiers/restrictions/or.zig | 6 +++--- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/proceduralItem/modifiers/restrictions/always.zig b/src/proceduralItem/modifiers/restrictions/always.zig index b8b879f4dd..941d718627 100644 --- a/src/proceduralItem/modifiers/restrictions/always.zig +++ b/src/proceduralItem/modifiers/restrictions/always.zig @@ -8,9 +8,9 @@ const ModifierRestrictionOutput = main.items.ModifierRestrictionOutput; pub fn satisfied(_: *const anyopaque, _: *const ProceduralItem, _: i32, _: i32) ModifierRestrictionOutput { return .{ - .ifSatisfied = true, + .ifSatisfied = true, .totalItemsChecked = 0, - .totalCountedItems = 0, + .totalCountedItems = 0, .modifierPower = 1, }; } diff --git a/src/proceduralItem/modifiers/restrictions/and.zig b/src/proceduralItem/modifiers/restrictions/and.zig index 2c9e97ef80..e4153933c6 100644 --- a/src/proceduralItem/modifiers/restrictions/and.zig +++ b/src/proceduralItem/modifiers/restrictions/and.zig @@ -24,9 +24,9 @@ pub fn satisfied(self: *const And, proceduralItem: *const ProceduralItem, x: i32 combinedModifierPower = std.math.hypot(combinedModifierPower, childValues.modifierPower); } return .{ - .ifSatisfied = combinedIsSatisfied, - .totalItemsChecked = combinedTotalItemsChecked, - .totalCountedItems = combinedtotalCountedItems, + .ifSatisfied = combinedIsSatisfied, + .totalItemsChecked = combinedTotalItemsChecked, + .totalCountedItems = combinedtotalCountedItems, .modifierPower = combinedModifierPower, }; } diff --git a/src/proceduralItem/modifiers/restrictions/encased.zig b/src/proceduralItem/modifiers/restrictions/encased.zig index 33de84f38b..c5382586fa 100644 --- a/src/proceduralItem/modifiers/restrictions/encased.zig +++ b/src/proceduralItem/modifiers/restrictions/encased.zig @@ -20,9 +20,9 @@ pub fn satisfied(self: *const Encased, proceduralItem: *const ProceduralItem, x: } } return .{ - .ifSatisfied = count >= self.amount, - .totalItemsChecked = 9, - .totalCountedItems = count, + .ifSatisfied = count >= self.amount, + .totalItemsChecked = 9, + .totalCountedItems = count, .modifierPower = 1, }; } diff --git a/src/proceduralItem/modifiers/restrictions/for_each.zig b/src/proceduralItem/modifiers/restrictions/for_each.zig index bedbe6f694..01c01c4036 100644 --- a/src/proceduralItem/modifiers/restrictions/for_each.zig +++ b/src/proceduralItem/modifiers/restrictions/for_each.zig @@ -22,9 +22,9 @@ pub fn satisfied(self: *const ForEach, proceduralItem: *const ProceduralItem, x: } std.log.debug("restrictionPower {}", .{combinedModifierPower}); return .{ - .ifSatisfied = childValues.ifSatisfied, - .totalItemsChecked = childValues.totalItemsChecked, - .totalCountedItems = childValues.totalCountedItems, + .ifSatisfied = childValues.ifSatisfied, + .totalItemsChecked = childValues.totalItemsChecked, + .totalCountedItems = childValues.totalCountedItems, .modifierPower = combinedModifierPower, }; } diff --git a/src/proceduralItem/modifiers/restrictions/not.zig b/src/proceduralItem/modifiers/restrictions/not.zig index a22019f206..7f9100cbc1 100644 --- a/src/proceduralItem/modifiers/restrictions/not.zig +++ b/src/proceduralItem/modifiers/restrictions/not.zig @@ -14,9 +14,9 @@ const Not = struct { pub fn satisfied(self: *const Not, proceduralItem: *const ProceduralItem, x: i32, y: i32) ModifierRestrictionOutput { const childValues = self.child.satisfied(proceduralItem, x, y); return .{ - .ifSatisfied = !childValues.ifSatisfied, - .totalItemsChecked = childValues.totalItemsChecked, - .totalCountedItems = childValues.totalItemsChecked - childValues.totalCountedItems, + .ifSatisfied = !childValues.ifSatisfied, + .totalItemsChecked = childValues.totalItemsChecked, + .totalCountedItems = childValues.totalItemsChecked - childValues.totalCountedItems, .modifierPower = childValues.modifierPower, }; } diff --git a/src/proceduralItem/modifiers/restrictions/or.zig b/src/proceduralItem/modifiers/restrictions/or.zig index e2e5c1e734..a7585f9367 100644 --- a/src/proceduralItem/modifiers/restrictions/or.zig +++ b/src/proceduralItem/modifiers/restrictions/or.zig @@ -24,9 +24,9 @@ pub fn satisfied(self: *const Or, proceduralItem: *const ProceduralItem, x: i32, combinedModifierPower = std.math.hypot(combinedModifierPower, childValues.modifierPower); } return .{ - .ifSatisfied = combinedIsSatisfied, - .totalItemsChecked = combinedTotalItemsChecked, - .totalCountedItems = combinedtotalCountedItems, + .ifSatisfied = combinedIsSatisfied, + .totalItemsChecked = combinedTotalItemsChecked, + .totalCountedItems = combinedtotalCountedItems, .modifierPower = combinedModifierPower, }; }