import { logger } from "./utils.js";
import { mapLoader } from "./data_loaders.js";
import { random, test } from "./random_utils.js";
import Profession from "./models/profession.js";
import ProfessionDatabase from "./db/profession_database.js";
import professionsList from "./data/professions.json" with { type: "json" };
const ranks = await mapLoader("ranks.data");
professionsList
.filter((profession) => profession.ranks)
.forEach((profession) => {
profession.ranks = ranks.get(profession.ranks);
});
export const professionDb = new ProfessionDatabase({ parser: (r) => [new Profession(r)] });
professionDb.add.apply(professionDb, professionsList);
/**
* Looks up a profession from the profession database by name or tags.
*
* @param {Object} [options={}] - Profession lookup options
* @param {string} [options.name] - Profession name to look up (e.g. "Scavenger", "Rancher"). The
* special value "soldier" randomly selects a military branch (Army, Navy, Marine, Air Force).
* @param {string} [options.tags] - Tag expression to filter professions.
* @returns {Profession} A Profession instance matching the given criteria, or null if not found
*/
export function createProfession({ name, tags } = {}) {
if (name && name.toLowerCase() === "soldier") {
name = random(["Air Force", "Marine", "Army", "Navy"]);
}
logger.start("createProfession", { name, tags });
let profession = professionDb.findOne({ name, tags });
return logger.end(profession);
}
export function findRelatedProfession({ name } = {}) {
logger.start("findRelatedProfession", { name });
let prof = professionDb.findOne({ name });
if (prof == null || test(40)) {
return logger.end(prof);
}
const prestige = prof.typeOf("prestige");
return logger.end(professionDb.findOne({ tags: `${prestige} -pre -innate` }));
}
export function getPreProfessions() {
return professionDb
.findAll({ tags: "pre" })
.map((row) => row.names[0])
.concat("Soldier")
.sort();
}
export function getPostProfessions() {
return professionDb
.findAll({ tags: "post" })
.map((row) => row.names[0])
.sort();
}