108 lines
3.3 KiB
Zig
108 lines
3.3 KiB
Zig
// zig fmt: off
|
|
const std = @import("std");
|
|
const EnumStringUtils = @import("../enum_string_utils.zig").EnumStringUtils;
|
|
const Store = @import("../store.zig");
|
|
const json_utils = @import("../json_utils.zig");
|
|
const Craft = @import("./craft.zig");
|
|
|
|
const Item = @This();
|
|
|
|
pub const Type = enum {
|
|
utility,
|
|
consumable,
|
|
body_armor,
|
|
weapon,
|
|
resource,
|
|
leg_armor,
|
|
helmet,
|
|
boots,
|
|
shield,
|
|
amulet,
|
|
ring,
|
|
artifact,
|
|
currency,
|
|
|
|
const Utils = EnumStringUtils(Type, .{
|
|
.{ "utility" , .consumable },
|
|
.{ "consumable", .consumable },
|
|
.{ "body_armor", .body_armor },
|
|
.{ "weapon" , .weapon },
|
|
.{ "resource" , .resource },
|
|
.{ "leg_armor" , .leg_armor },
|
|
.{ "helmet" , .helmet },
|
|
.{ "boots" , .boots },
|
|
.{ "shield" , .shield },
|
|
.{ "amulet" , .amulet },
|
|
.{ "ring" , .ring },
|
|
.{ "artifact" , .artifact },
|
|
.{ "currency" , .currency },
|
|
});
|
|
|
|
pub const toString = Utils.toString;
|
|
pub const fromString = Utils.fromString;
|
|
};
|
|
|
|
pub const max_code_size = 32;
|
|
pub const Name = std.BoundedArray(u8, 32);
|
|
pub const Code = std.BoundedArray(u8, max_code_size);
|
|
pub const Subtype = std.BoundedArray(u8, 32);
|
|
pub const Description = std.BoundedArray(u8, 128);
|
|
|
|
name: Name,
|
|
code: Code,
|
|
level: u64,
|
|
type: Type,
|
|
subtype: Subtype,
|
|
description: Description,
|
|
craft: ?Craft,
|
|
|
|
pub fn parse(store: *Store, obj: std.json.ObjectMap) !Item {
|
|
const level = json_utils.getInteger(obj, "level") orelse return error.MissingProperty;
|
|
if (level < 1) return error.InvalidLevel;
|
|
|
|
const code = try json_utils.getStringRequired(obj, "code");
|
|
const name = try json_utils.getStringRequired(obj, "name");
|
|
const subtype = try json_utils.getStringRequired(obj, "subtype");
|
|
const description = try json_utils.getStringRequired(obj, "description");
|
|
const item_type = try json_utils.getStringRequired(obj, "type");
|
|
const craft = json_utils.getObject(obj, "craft");
|
|
|
|
return Item{
|
|
.name = try Name.fromSlice(name),
|
|
.code = try Code.fromSlice(code),
|
|
.level = @intCast(level),
|
|
.type = Type.fromString(item_type) orelse return error.InvalidType,
|
|
.subtype = try Subtype.fromSlice(subtype),
|
|
.description = try Description.fromSlice(description),
|
|
.craft = if (craft != null) try Craft.parse(store, craft.?) else null
|
|
};
|
|
}
|
|
|
|
pub fn parseAndAppend(store: *Store, obj: std.json.ObjectMap) !Store.Id {
|
|
return try store.items.appendOrUpdate(try Item.parse(store, obj));
|
|
}
|
|
|
|
pub fn format(
|
|
self: Item,
|
|
comptime fmt: []const u8,
|
|
options: std.fmt.FormatOptions,
|
|
writer: anytype,
|
|
) !void {
|
|
_ = fmt;
|
|
_ = options;
|
|
|
|
try writer.print("{s}{{ ", .{ @typeName(Item) });
|
|
|
|
try writer.print(".name = \"{s}\", ", .{ self.name.slice() });
|
|
try writer.print(".code = \"{s}\", ", .{ self.code.slice() });
|
|
try writer.print(".level = {}, ", .{ self.level });
|
|
try writer.print(".type = {}, ", .{ self.type });
|
|
try writer.print(".subtype = \"{s}\", ", .{ self.subtype.slice() });
|
|
try writer.print(".description = \"{s}\", ", .{ self.description.slice() });
|
|
if (self.craft) |craft| {
|
|
try writer.print(".craft = {}, ", .{ craft });
|
|
}
|
|
|
|
try writer.writeAll("}");
|
|
}
|