109 lines
3.6 KiB
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"),
|
|
};
|
|
}
|