diff --git a/src/items.zig b/src/items.zig index 78dceffc..3c5435bb 100644 --- a/src/items.zig +++ b/src/items.zig @@ -81,6 +81,24 @@ const Material = struct { // MARK: Material inline else => |field| return @field(self, @tagName(field)), } } + + pub fn printTooltip(self: Material, outString: *main.List(u8)) void { + if(self.modifiers.len == 0) { + outString.appendSlice("§#808080Material\n"); + } + for(self.modifiers) |modifier| { + if(modifier.restriction.vTable == modifierRestrictions.get("always") orelse unreachable) { + modifier.printTooltip(outString); + outString.appendSlice("\n"); + } else { + outString.appendSlice("§#808080if "); + modifier.restriction.printTooltip(outString); + outString.appendSlice("\n "); + modifier.printTooltip(outString); + outString.appendSlice("\n"); + } + } + } }; pub const ModifierRestriction = struct { @@ -90,6 +108,7 @@ pub const ModifierRestriction = struct { pub const VTable = struct { satisfied: *const fn(data: *anyopaque, tool: *const Tool, x: i32, y: i32) bool, loadFromZon: *const fn(allocator: NeverFailingAllocator, zon: ZonElement) *anyopaque, + printTooltip: *const fn(data: *anyopaque, outString: *main.List(u8)) void, }; pub fn satisfied(self: ModifierRestriction, tool: *const Tool, x: i32, y: i32) bool { @@ -107,6 +126,10 @@ pub const ModifierRestriction = struct { .data = vTable.loadFromZon(allocator, zon), }; } + + pub fn printTooltip(self: ModifierRestriction, outString: *main.List(u8)) void { + self.vTable.printTooltip(self.data, outString); + } }; const Modifier = struct { @@ -209,6 +232,7 @@ pub const BaseItem = struct { // MARK: BaseItem id: []const u8, name: []const u8, tags: []const Tag, + tooltip: []const u8, stackSize: u16, material: ?Material, @@ -251,6 +275,25 @@ pub const BaseItem = struct { // MARK: BaseItem }; self.texture = null; self.foodValue = zon.get(f32, "food", 0); + + var tooltip: main.List(u8) = .init(allocator); + tooltip.appendSlice(self.name); + tooltip.append('\n'); + if(self.material) |mat| { + mat.printTooltip(&tooltip); + } + if(self.tags.len != 0) { + tooltip.appendSlice("§#808080"); + for(self.tags, 0..) |tag, i| { + if(i != 0) tooltip.append(' '); + tooltip.append('.'); + tooltip.appendSlice(tag.getName()); + } + } + if(tooltip.items[tooltip.items.len - 1] == '\n') { + _ = tooltip.swapRemove(tooltip.items.len - 1); + } + self.tooltip = tooltip.toOwnedSlice(); } fn hashCode(self: BaseItem) u32 { @@ -279,7 +322,7 @@ pub const BaseItem = struct { // MARK: BaseItem } fn getTooltip(self: BaseItem) []const u8 { - return self.name; + return self.tooltip; } pub fn hasTag(self: *const BaseItem, tag: Tag) bool { @@ -1059,6 +1102,7 @@ pub fn globalInit() void { modifierRestrictions.put(decl.name, &.{ .satisfied = comptime main.utils.castFunctionSelfToAnyopaque(ModifierRestrictionStruct.satisfied), .loadFromZon = comptime main.utils.castFunctionReturnToAnyopaque(ModifierRestrictionStruct.loadFromZon), + .printTooltip = comptime main.utils.castFunctionSelfToAnyopaque(ModifierRestrictionStruct.printTooltip), }) catch unreachable; } Inventory.Sync.ClientSide.init(); diff --git a/src/tool/modifiers/restrictions/always.zig b/src/tool/modifiers/restrictions/always.zig index 9c096a17..54ab38e9 100644 --- a/src/tool/modifiers/restrictions/always.zig +++ b/src/tool/modifiers/restrictions/always.zig @@ -12,3 +12,7 @@ pub fn satisfied(_: *const anyopaque, _: *const Tool, _: i32, _: i32) bool { pub fn loadFromZon(_: NeverFailingAllocator, _: ZonElement) *const anyopaque { return undefined; } + +pub fn printTooltip(_: *const anyopaque, outString: *main.List(u8)) void { + outString.appendSlice("always"); +} diff --git a/src/tool/modifiers/restrictions/and.zig b/src/tool/modifiers/restrictions/and.zig index 89deade5..ddfd8a28 100644 --- a/src/tool/modifiers/restrictions/and.zig +++ b/src/tool/modifiers/restrictions/and.zig @@ -26,3 +26,12 @@ pub fn loadFromZon(allocator: NeverFailingAllocator, zon: ZonElement) *const And } return result; } + +pub fn printTooltip(self: *const And, outString: *main.List(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/tool/modifiers/restrictions/encased.zig b/src/tool/modifiers/restrictions/encased.zig index 5cd42db7..7dffff89 100644 --- a/src/tool/modifiers/restrictions/encased.zig +++ b/src/tool/modifiers/restrictions/encased.zig @@ -29,3 +29,7 @@ pub fn loadFromZon(allocator: NeverFailingAllocator, zon: ZonElement) *const Enc }; return result; } + +pub fn printTooltip(self: *const Encased, outString: *main.List(u8)) void { + outString.writer().print("encased in {} .{s}", .{self.amount, self.tag.getName()}) catch unreachable; +} diff --git a/src/tool/modifiers/restrictions/not.zig b/src/tool/modifiers/restrictions/not.zig index 27e7cd1a..fe469cbc 100644 --- a/src/tool/modifiers/restrictions/not.zig +++ b/src/tool/modifiers/restrictions/not.zig @@ -21,3 +21,8 @@ pub fn loadFromZon(allocator: NeverFailingAllocator, zon: ZonElement) *const Not }; return result; } + +pub fn printTooltip(self: *const Not, outString: *main.List(u8)) void { + outString.appendSlice("not "); + self.child.printTooltip(outString); +} diff --git a/src/tool/modifiers/restrictions/or.zig b/src/tool/modifiers/restrictions/or.zig index 8e2f8903..5c0133ff 100644 --- a/src/tool/modifiers/restrictions/or.zig +++ b/src/tool/modifiers/restrictions/or.zig @@ -26,3 +26,12 @@ pub fn loadFromZon(allocator: NeverFailingAllocator, zon: ZonElement) *const Or } return result; } + +pub fn printTooltip(self: *const Or, outString: *main.List(u8)) void { + outString.append('('); + for(self.children, 0..) |child, i| { + if(i != 0) outString.appendSlice(" or "); + child.printTooltip(outString); + } + outString.append(')'); +}