74 lines
2.2 KiB
Zig
74 lines
2.2 KiB
Zig
// zig fmt: off
|
|
const std = @import("std");
|
|
const Store = @import("../store.zig");
|
|
const Character = @import("./character.zig");
|
|
const json_utils = @import("../json_utils.zig");
|
|
const DropRate = @import("./drop_rate.zig");
|
|
const EnumStringUtils = @import("../enum_string_utils.zig").EnumStringUtils;
|
|
|
|
const Resource = @This();
|
|
|
|
pub const Skill = enum {
|
|
mining,
|
|
woodcutting,
|
|
fishing,
|
|
alchemy,
|
|
|
|
const Utils = EnumStringUtils(Skill, .{
|
|
.{ "mining" , Skill.mining },
|
|
.{ "woodcutting", Skill.woodcutting },
|
|
.{ "fishing" , Skill.fishing },
|
|
.{ "alchemy" , Skill.alchemy },
|
|
});
|
|
|
|
pub const toString = Utils.toString;
|
|
pub const fromString = Utils.fromString;
|
|
|
|
pub fn toCharacterSkill(self: Skill) Character.Skill {
|
|
return switch (self) {
|
|
.mining => Character.Skill.mining,
|
|
.woodcutting => Character.Skill.woodcutting,
|
|
.fishing => Character.Skill.fishing,
|
|
.alchemy => Character.Skill.alchemy,
|
|
};
|
|
}
|
|
};
|
|
|
|
pub const Name = std.BoundedArray(u8, 32);
|
|
|
|
pub const max_code_size = 32;
|
|
pub const Code = std.BoundedArray(u8, max_code_size);
|
|
|
|
pub const max_drops = 16;
|
|
pub const Drop = DropRate;
|
|
pub const Drops = std.BoundedArray(DropRate, max_drops);
|
|
|
|
name: Name,
|
|
code: Code,
|
|
skill: Skill,
|
|
level: u64,
|
|
drops: Drops,
|
|
|
|
pub fn parse(store: *Store, obj: std.json.ObjectMap) !Resource {
|
|
const name = try json_utils.getStringRequired(obj, "name");
|
|
const code = try json_utils.getStringRequired(obj, "code");
|
|
const level = try json_utils.getPositiveIntegerRequired(obj, "level");
|
|
const skill = try json_utils.getStringRequired(obj, "skill");
|
|
|
|
const drops_array = try json_utils.getArrayRequired(obj, "drops");
|
|
var drops = Drops.init(0) catch unreachable;
|
|
drops.len = @intCast(try DropRate.parseDrops(store, drops_array, &drops.buffer));
|
|
|
|
return Resource{
|
|
.name = try Name.fromSlice(name),
|
|
.code = try Code.fromSlice(code),
|
|
.level = level,
|
|
.skill = Skill.fromString(skill) orelse return error.InvalidSkill,
|
|
.drops = drops
|
|
};
|
|
}
|
|
|
|
pub fn parseAndAppend(store: *Store, obj: std.json.ObjectMap) !Store.Id {
|
|
return store.resources.appendOrUpdate(try parse(store, obj));
|
|
}
|