create_profession.js

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();
}