artificer/api/schemas/equipment.zig

109 lines
3.6 KiB
Zig

// zig fmt: off
const std = @import("std");
const json_utils = @import("../json_utils.zig");
const Store = @import("../store.zig");
const Item = @import("./item.zig");
const Equipment = @This();
pub const UtilitySlot = struct {
id: Store.Id,
quantity: u64,
fn parse(store: *Store, obj: std.json.ObjectMap, name: []const u8, quantity: []const u8) !?UtilitySlot {
const item_code = try json_utils.getStringRequired(obj, name);
if (item_code.len == 0) {
return null;
}
return UtilitySlot{
.id = try store.items.getOrReserveId(item_code),
.quantity = try json_utils.getPositiveIntegerRequired(obj, quantity),
};
}
};
pub const Slot = enum {
weapon,
shield,
helmet,
body_armor,
leg_armor,
boots,
ring1,
ring2,
amulet,
artifact1,
artifact2,
utility1,
utility2,
fn name(self: Slot) []const u8 {
return switch (self) {
.weapon => "weapon",
.shield => "shield",
.helmet => "helmet",
.body_armor => "body_armor",
.leg_armor => "leg_armor",
.boots => "boots",
.ring1 => "ring1",
.ring2 => "ring2",
.amulet => "amulet",
.artifact1 => "artifact1",
.artifact2 => "artifact2",
.utility1 => "utility1",
.utility2 => "utility2",
};
}
};
weapon: ?Store.Id,
shield: ?Store.Id,
helmet: ?Store.Id,
body_armor: ?Store.Id,
leg_armor: ?Store.Id,
boots: ?Store.Id,
ring1: ?Store.Id,
ring2: ?Store.Id,
amulet: ?Store.Id,
artifact1: ?Store.Id,
artifact2: ?Store.Id,
artifact3: ?Store.Id,
utility1: ?UtilitySlot,
utility2: ?UtilitySlot,
pub fn parse(store: *Store, obj: std.json.ObjectMap) !Equipment {
const weapon = try json_utils.getStringRequired(obj, "weapon_slot");
const shield = try json_utils.getStringRequired(obj, "shield_slot");
const helmet = try json_utils.getStringRequired(obj, "helmet_slot");
const body_armor = try json_utils.getStringRequired(obj, "body_armor_slot");
const leg_armor = try json_utils.getStringRequired(obj, "leg_armor_slot");
const boots = try json_utils.getStringRequired(obj, "boots_slot");
const ring1 = try json_utils.getStringRequired(obj, "ring1_slot");
const ring2 = try json_utils.getStringRequired(obj, "ring2_slot");
const amulet = try json_utils.getStringRequired(obj, "amulet_slot");
const artifact1 = try json_utils.getStringRequired(obj, "artifact1_slot");
const artifact2 = try json_utils.getStringRequired(obj, "artifact2_slot");
const artifact3 = try json_utils.getStringRequired(obj, "artifact3_slot");
return Equipment{
.weapon = try store.items.getOrReserveId(weapon),
.shield = try store.items.getOrReserveId(shield),
.helmet = try store.items.getOrReserveId(helmet),
.body_armor = try store.items.getOrReserveId(body_armor),
.leg_armor = try store.items.getOrReserveId(leg_armor),
.boots = try store.items.getOrReserveId(boots),
.ring1 = try store.items.getOrReserveId(ring1),
.ring2 = try store.items.getOrReserveId(ring2),
.amulet = try store.items.getOrReserveId(amulet),
.artifact1 = try store.items.getOrReserveId(artifact1),
.artifact2 = try store.items.getOrReserveId(artifact2),
.artifact3 = try store.items.getOrReserveId(artifact3),
.utility1 = try UtilitySlot.parse(store, obj, "utility1_slot", "utility1_slot_quantity"),
.utility2 = try UtilitySlot.parse(store, obj, "utility2_slot", "utility2_slot_quantity"),
};
}