From 515baf9e3dabba787a723b2a02d28229cc225b55 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sat, 18 Jul 2026 20:18:24 -0700 Subject: [PATCH 1/6] almost complete --- src/items.zig | 20 ++++++++++++++++ src/proceduralItem/modifiers/far_reaching.zig | 24 +++++++++++++++++++ src/proceduralItem/modifiers/short.zig | 24 +++++++++++++++++++ src/renderer.zig | 14 ++++++++++- 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/proceduralItem/modifiers/far_reaching.zig create mode 100644 src/proceduralItem/modifiers/short.zig diff --git a/src/items.zig b/src/items.zig index 8fe590f816..ca6f0f063a 100644 --- a/src/items.zig +++ b/src/items.zig @@ -159,6 +159,7 @@ const Modifier = struct { 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, + changeBlockRange: *const fn (data: Data) struct {f32, f32}, printTooltip: *const fn (outString: *main.ListManaged(u8), data: Data) void, loadData: *const fn (zon: ZonElement) Data, priority: f32, @@ -168,12 +169,16 @@ const Modifier = struct { pub fn changeBlockDamage(damage: f32, _: Block, _: Data) f32 { return damage; } + pub fn changeBlockRange(_: f32) struct {f32, f32} { + return .{0, 1}; // returns a flat 0 and a mult of 1 + } }; 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), + .changeBlockRange = @ptrCast(if (@hasDecl(ModifierStruct, "changeBlockRange")) &ModifierStruct.changeBlockRange else &VTable.Defaults.changeBlockRange), .combineModifiers = @ptrCast(&ModifierStruct.combineModifiers), .printTooltip = @ptrCast(&ModifierStruct.printTooltip), .loadData = @ptrCast(&ModifierStruct.loadData), @@ -199,6 +204,10 @@ const Modifier = struct { return self.vTable.changeBlockDamage(damage, block, self.data); } + pub fn changeBlockRange(self: Modifier) struct {f32, f32} { + return self.vTable.changeBlockRange(self.data); + } + pub fn printTooltip(self: Modifier, outString: *main.ListManaged(u8)) void { self.vTable.printTooltip(outString, self.data); } @@ -916,6 +925,17 @@ pub const ProceduralItem = struct { // MARK: ProceduralItem return main.game.Player.defaultBlockDamage; } + pub fn getBlockRange(self: *ProceduralItem) struct {f32, f32} { + var flatRange: f32 = 0; + var multRange: f32 = 1; + for (self.modifiers) |modifier| { + const flatRangeDiff, const multRangeDiff = modifier.changeBlockRange(); + flatRange += flatRangeDiff; + multRange = multRange*multRangeDiff; + } + return .{flatRange, multRange}; + } + pub fn onUseReturnBroken(self: *ProceduralItem) bool { self.durability -|= 1; return self.durability == 0; diff --git a/src/proceduralItem/modifiers/far_reaching.zig b/src/proceduralItem/modifiers/far_reaching.zig new file mode 100644 index 0000000000..6290f5aa22 --- /dev/null +++ b/src/proceduralItem/modifiers/far_reaching.zig @@ -0,0 +1,24 @@ +const std = @import("std"); + +const main = @import("main"); +const ProceduralItem = main.items.ProceduralItem; + +pub const Data = packed struct(u128) { strength: f32, pad: u96 = undefined }; + +pub const priority = 1; + +pub fn loadData(zon: main.ZonElement) Data { + return .{.strength = std.math.clamp(zon.get(f32, "strength") orelse 0, 0, 1)}; +} + +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 printTooltip(outString: *main.ListManaged(u8), data: Data) void { + outString.print("#fcb5e3**Weak**#808080 *Decreases damage by **{d:.0}%", .{data.strength*100}); +} diff --git a/src/proceduralItem/modifiers/short.zig b/src/proceduralItem/modifiers/short.zig new file mode 100644 index 0000000000..6290f5aa22 --- /dev/null +++ b/src/proceduralItem/modifiers/short.zig @@ -0,0 +1,24 @@ +const std = @import("std"); + +const main = @import("main"); +const ProceduralItem = main.items.ProceduralItem; + +pub const Data = packed struct(u128) { strength: f32, pad: u96 = undefined }; + +pub const priority = 1; + +pub fn loadData(zon: main.ZonElement) Data { + return .{.strength = std.math.clamp(zon.get(f32, "strength") orelse 0, 0, 1)}; +} + +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 printTooltip(outString: *main.ListManaged(u8), data: Data) void { + outString.print("#fcb5e3**Weak**#808080 *Decreases damage by **{d:.0}%", .{data.strength*100}); +} diff --git a/src/renderer.zig b/src/renderer.zig index d9e33f3b80..6410927ff1 100644 --- a/src/renderer.zig +++ b/src/renderer.zig @@ -914,13 +914,25 @@ pub const MeshSelection = struct { // MARK: MeshSelection var selectionNormal: Vec3f = undefined; var lastPos: Vec3d = undefined; var lastDir: Vec3f = undefined; + fn getSelectRange(baseRange: f64, heldItem: main.items.Item) f64 { + var flatRange: f32 = 1; + var multRange: f32 = 0; + if (heldItem == .proceduralItem) { + const flatRangeDiff, const multRangeDiff = heldItem.proceduralItem.getBlockRange(); + flatRange += flatRangeDiff; + multRange = multRange*multRangeDiff; + } + const range: f64 = (baseRange + flatRange)*multRange; + return range; + } pub fn select(pos: Vec3d, _dir: Vec3f, item: main.items.Item) void { lastPos = pos; const dir: Vec3d = @floatCast(_dir); lastDir = _dir; // Test blocks: - const closestDistance: f64 = 6.0; // selection now limited + const defaultClosestDistance: f64 = 6.0; // selection now limited + const closestDistance: f64 = getSelectRange(defaultClosestDistance, item); // selection now limited // Implementation of "A Fast Voxel Traversal Algorithm for Ray Tracing" http://www.cse.yorku.ca/~amana/research/grid.pdf const step: Vec3i = std.math.sign(dir); const invDir = @as(Vec3d, @splat(1))/dir; From a4901c7f169e864a1f3e49b196d59735c7beab20 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sat, 18 Jul 2026 20:28:37 -0700 Subject: [PATCH 2/6] finished the modifiers --- src/proceduralItem/modifiers/far_reaching.zig | 23 +++++++++++++------ src/proceduralItem/modifiers/short.zig | 23 +++++++++++++------ 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/proceduralItem/modifiers/far_reaching.zig b/src/proceduralItem/modifiers/far_reaching.zig index 6290f5aa22..1387516f87 100644 --- a/src/proceduralItem/modifiers/far_reaching.zig +++ b/src/proceduralItem/modifiers/far_reaching.zig @@ -3,22 +3,31 @@ const std = @import("std"); const main = @import("main"); const ProceduralItem = main.items.ProceduralItem; -pub const Data = packed struct(u128) { strength: f32, pad: u96 = undefined }; +pub const Data = packed struct(u128) { multStrength: f32, flatStrength: f32, pad: u64 = undefined }; pub const priority = 1; pub fn loadData(zon: main.ZonElement) Data { - return .{.strength = std.math.clamp(zon.get(f32, "strength") orelse 0, 0, 1)}; + return .{ + .multStrength = @max(0, zon.get(f32, "multStrength") orelse 0), + .flatStrength = @max(0, zon.get(f32, "flatStrength") orelse 0), + }; } 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))}; + return .{ + .multStrength = std.math.hypot(data1.multStrength, data2.multStrength), + .flatStrength = std.math.hypot(data1.flatStrength, data2.flatStrength), + }; } -pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data) void { - proceduralItem.setProperty(.damage, proceduralItem.getProperty(.damage)*(1 - data.strength)); -} +pub fn changeBlockRange(data: Data) struct {f32, f32} { + return .{data.flatStrength, data.multStrength}; + } pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { - outString.print("#fcb5e3**Weak**#808080 *Decreases damage by **{d:.0}%", .{data.strength*100}); + if (data.multStrength != 0 and data.flatStrength != 0) outString.print("#00f870**Far Reaching**#808080 *Increases range by **{d:.0}%** and **+{d:.0}**", .{data.multStrength*100, data.flatStrength}); + if (data.multStrength != 0 and data.flatStrength == 0) outString.print("#00f870**Far Reaching**#808080 *Increases range by **{d:.0}%**", .{data.multStrength*100}); + if (data.multStrength == 0 and data.flatStrength != 0) outString.print("#00f870**Far Reaching**#808080 *Increases range by **+{d:.0}**", .{data.flatStrength}); + if (data.multStrength == 0 and data.flatStrength == 0) outString.print("#ff0000**Far Reaching did not find any multStrength and Flatstrength**", .{}); } diff --git a/src/proceduralItem/modifiers/short.zig b/src/proceduralItem/modifiers/short.zig index 6290f5aa22..7c1ef8b8a6 100644 --- a/src/proceduralItem/modifiers/short.zig +++ b/src/proceduralItem/modifiers/short.zig @@ -3,22 +3,31 @@ const std = @import("std"); const main = @import("main"); const ProceduralItem = main.items.ProceduralItem; -pub const Data = packed struct(u128) { strength: f32, pad: u96 = undefined }; +pub const Data = packed struct(u128) { multStrength: f32, flatStrength: f32, pad: u64 = undefined }; pub const priority = 1; pub fn loadData(zon: main.ZonElement) Data { - return .{.strength = std.math.clamp(zon.get(f32, "strength") orelse 0, 0, 1)}; + return .{ + .multStrength = @max(0, zon.get(f32, "multStrength") orelse 0), + .flatStrength = @max(0, zon.get(f32, "flatStrength") orelse 0), + }; } 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))}; + return .{ + .multStrength = std.math.hypot(data1.multStrength, data2.multStrength), + .flatStrength = std.math.hypot(data1.flatStrength, data2.flatStrength), + }; } -pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data) void { - proceduralItem.setProperty(.damage, proceduralItem.getProperty(.damage)*(1 - data.strength)); -} +pub fn changeBlockRange(data: Data) struct {f32, f32} { + return .{data.flatStrength, data.multStrength}; + } pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { - outString.print("#fcb5e3**Weak**#808080 *Decreases damage by **{d:.0}%", .{data.strength*100}); + if (data.multStrength != 0 and data.flatStrength != 0) outString.print("#f80088**Short**#808080 *Decreases range by **{d:.0}%** and **+{d:.0}**", .{data.multStrength*100, data.flatStrength}); + if (data.multStrength != 0 and data.flatStrength == 0) outString.print("#f80088**Short**#808080 *Decreases range by **{d:.0}%**", .{data.multStrength*100}); + if (data.multStrength == 0 and data.flatStrength != 0) outString.print("#f80088**Short**#808080 *Decreases range by **+{d:.0}**", .{data.flatStrength}); + if (data.multStrength == 0 and data.flatStrength == 0) outString.print("#ff0000**Short did not find any multStrength and Flatstrength**", .{}); } From abad732374178817861c2433cff81ba9edd606e5 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sat, 18 Jul 2026 20:30:22 -0700 Subject: [PATCH 3/6] formatting --- src/proceduralItem/modifiers/far_reaching.zig | 4 ++-- src/proceduralItem/modifiers/short.zig | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/proceduralItem/modifiers/far_reaching.zig b/src/proceduralItem/modifiers/far_reaching.zig index 1387516f87..58b5cfc047 100644 --- a/src/proceduralItem/modifiers/far_reaching.zig +++ b/src/proceduralItem/modifiers/far_reaching.zig @@ -22,8 +22,8 @@ pub fn combineModifiers(data1: Data, data2: Data) ?Data { } pub fn changeBlockRange(data: Data) struct {f32, f32} { - return .{data.flatStrength, data.multStrength}; - } + return .{data.flatStrength, data.multStrength}; +} pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { if (data.multStrength != 0 and data.flatStrength != 0) outString.print("#00f870**Far Reaching**#808080 *Increases range by **{d:.0}%** and **+{d:.0}**", .{data.multStrength*100, data.flatStrength}); diff --git a/src/proceduralItem/modifiers/short.zig b/src/proceduralItem/modifiers/short.zig index 7c1ef8b8a6..28aae0e6d7 100644 --- a/src/proceduralItem/modifiers/short.zig +++ b/src/proceduralItem/modifiers/short.zig @@ -22,8 +22,8 @@ pub fn combineModifiers(data1: Data, data2: Data) ?Data { } pub fn changeBlockRange(data: Data) struct {f32, f32} { - return .{data.flatStrength, data.multStrength}; - } + return .{data.flatStrength, data.multStrength}; +} pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { if (data.multStrength != 0 and data.flatStrength != 0) outString.print("#f80088**Short**#808080 *Decreases range by **{d:.0}%** and **+{d:.0}**", .{data.multStrength*100, data.flatStrength}); From b2203ca692e79551b743adee967406c96e338833 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sat, 18 Jul 2026 20:32:53 -0700 Subject: [PATCH 4/6] formatting --- src/proceduralItem/modifiers/far_reaching.zig | 2 +- src/proceduralItem/modifiers/short.zig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/proceduralItem/modifiers/far_reaching.zig b/src/proceduralItem/modifiers/far_reaching.zig index 58b5cfc047..6baaeff793 100644 --- a/src/proceduralItem/modifiers/far_reaching.zig +++ b/src/proceduralItem/modifiers/far_reaching.zig @@ -21,7 +21,7 @@ pub fn combineModifiers(data1: Data, data2: Data) ?Data { }; } -pub fn changeBlockRange(data: Data) struct {f32, f32} { +pub fn changeBlockRange(data: Data) struct { f32, f32 } { return .{data.flatStrength, data.multStrength}; } diff --git a/src/proceduralItem/modifiers/short.zig b/src/proceduralItem/modifiers/short.zig index 28aae0e6d7..5f3d75d03a 100644 --- a/src/proceduralItem/modifiers/short.zig +++ b/src/proceduralItem/modifiers/short.zig @@ -21,7 +21,7 @@ pub fn combineModifiers(data1: Data, data2: Data) ?Data { }; } -pub fn changeBlockRange(data: Data) struct {f32, f32} { +pub fn changeBlockRange(data: Data) struct { f32, f32 } { return .{data.flatStrength, data.multStrength}; } From 70170e96d27e23d6edf96f29c16c00ac686a7601 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sat, 18 Jul 2026 20:34:01 -0700 Subject: [PATCH 5/6] formatting --- src/items.zig | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/items.zig b/src/items.zig index ca6f0f063a..f3be8e796c 100644 --- a/src/items.zig +++ b/src/items.zig @@ -159,7 +159,7 @@ const Modifier = struct { 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, - changeBlockRange: *const fn (data: Data) struct {f32, f32}, + changeBlockRange: *const fn (data: Data) struct { f32, f32 }, printTooltip: *const fn (outString: *main.ListManaged(u8), data: Data) void, loadData: *const fn (zon: ZonElement) Data, priority: f32, @@ -169,7 +169,7 @@ const Modifier = struct { pub fn changeBlockDamage(damage: f32, _: Block, _: Data) f32 { return damage; } - pub fn changeBlockRange(_: f32) struct {f32, f32} { + pub fn changeBlockRange(_: f32) struct { f32, f32 } { return .{0, 1}; // returns a flat 0 and a mult of 1 } }; @@ -204,7 +204,7 @@ const Modifier = struct { return self.vTable.changeBlockDamage(damage, block, self.data); } - pub fn changeBlockRange(self: Modifier) struct {f32, f32} { + pub fn changeBlockRange(self: Modifier) struct { f32, f32 } { return self.vTable.changeBlockRange(self.data); } @@ -925,7 +925,7 @@ pub const ProceduralItem = struct { // MARK: ProceduralItem return main.game.Player.defaultBlockDamage; } - pub fn getBlockRange(self: *ProceduralItem) struct {f32, f32} { + pub fn getBlockRange(self: *ProceduralItem) struct { f32, f32 } { var flatRange: f32 = 0; var multRange: f32 = 1; for (self.modifiers) |modifier| { From 4484ed31aa82e23fbc88d38edcfa1c99241952cf Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Mon, 20 Jul 2026 16:36:09 -0700 Subject: [PATCH 6/6] small tweaks --- src/proceduralItem/modifiers/_list.zig | 8 +++++--- .../modifiers/{far_reaching.zig => long.zig} | 0 2 files changed, 5 insertions(+), 3 deletions(-) rename src/proceduralItem/modifiers/{far_reaching.zig => long.zig} (100%) diff --git a/src/proceduralItem/modifiers/_list.zig b/src/proceduralItem/modifiers/_list.zig index 2d05043d6f..0734ac8d4d 100644 --- a/src/proceduralItem/modifiers/_list.zig +++ b/src/proceduralItem/modifiers/_list.zig @@ -1,9 +1,11 @@ -pub const bad_at = @import("bad_at.zig"); pub const durable = @import("durable.zig"); pub const fragile = @import("fragile.zig"); +pub const single_use = @import("single_use.zig"); pub const good_at = @import("good_at.zig"); -pub const heavy = @import("heavy.zig"); +pub const bad_at = @import("bad_at.zig"); pub const light = @import("light.zig"); +pub const heavy = @import("heavy.zig"); pub const powerful = @import("powerful.zig"); -pub const single_use = @import("single_use.zig"); pub const weak = @import("weak.zig"); +pub const long = @import("long.zig"); +pub const short = @import("short.zig"); \ No newline at end of file diff --git a/src/proceduralItem/modifiers/far_reaching.zig b/src/proceduralItem/modifiers/long.zig similarity index 100% rename from src/proceduralItem/modifiers/far_reaching.zig rename to src/proceduralItem/modifiers/long.zig