coh-content-db 2.0.0-rc.10 → 2.0.0-rc.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/build.yml +3 -1
- package/CHANGELOG.md +2 -1
- package/dist/coh-content-db.d.ts +10 -15
- package/dist/coh-content-db.js +74 -74
- package/dist/coh-content-db.js.map +1 -1
- package/dist/coh-content-db.mjs +74 -74
- package/dist/coh-content-db.mjs.map +1 -1
- package/package.json +1 -1
- package/src/main/db/badge-index.ts +9 -6
- package/src/main/db/badge-search-options.ts +5 -9
- package/src/main/db/badge.ts +15 -16
- package/src/test/db/badge-index.test.ts +36 -8
- package/src/test/db/badge.test.ts +15 -3
- package/src/test/db/coh-content-database.test.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coh-content-db.js","sources":["../src/main/api/alignment.ts","../src/main/api/badge-requirement-type.ts","../src/main/api/badge-type.ts","../src/main/api/enhancement-category.ts","../src/main/api/mission-type.ts","../src/main/api/morality.ts","../src/main/api/sex.ts","../src/main/db/alignment-list.ts","../src/main/db/alternates.ts","../src/main/db/key.ts","../src/main/db/archetype.ts","../src/main/util.ts","../src/main/db/badge-requirement.ts","../src/main/db/morality-list.ts","../src/main/db/badge.ts","../src/main/db/abstract-index.ts","../src/main/db/badge-index.ts","../src/main/db/bundle-header.ts","../src/main/db/zone.ts","../src/main/db/contact.ts","../src/main/db/mission.ts","../src/main/db/coh-content-database.ts","../src/main/db/location.ts"],"sourcesContent":["export const ALIGNMENT = ['hero', 'villain', 'praetorian'] as const\nexport type Alignment = typeof ALIGNMENT[number]\nexport type AlignmentExtended = Alignment\n /**\n * The alignments available for Primal Earth characters - Hero and Villain.\n */\n | 'primal'\n /**\n * All the alignments.\n */\n | 'all'\n\nconst ALIGNMENT_ORDER = Object.fromEntries(ALIGNMENT.map((x, index) => [x, index]))\n\nexport function compareAlignment(a?: Alignment, b?: Alignment): number {\n const orderA = a ? ALIGNMENT_ORDER[a] : -1\n const orderB = b ? ALIGNMENT_ORDER[b] : -1\n return orderA - orderB\n}\n","export const BADGE_REQUIREMENT_TYPE = [\n /**\n * Collect a badge.\n */\n 'badge',\n /**\n * Craft an invention.\n */\n 'invention',\n /**\n * Some invention badges require you to build x of two different invention levels, 'plus one of either level'.\n */\n 'invention-plus-one',\n /**\n * Visit a location.\n */\n 'location',\n /**\n * Click on a monument.\n */\n 'monument',\n /**\n * Complete a mission.\n */\n 'mission',\n /**\n * Complete an arbitrary task.\n */\n 'task',\n] as const\n\nexport type BadgeRequirementType = typeof BADGE_REQUIREMENT_TYPE[number]\n","export const BADGE_TYPE = [\n 'exploration',\n 'history',\n 'accomplishment',\n 'achievement',\n 'accolade',\n 'gladiator',\n 'veteran',\n 'pvp',\n 'invention',\n 'defeat',\n 'event',\n 'ouroboros',\n 'consignment',\n 'day-job',\n 'architect-entertainment',\n] as const\n\nexport type BadgeType = typeof BADGE_TYPE[number]\n","export const ENHANCEMENT_CATEGORY = [\n 'defense-debuff',\n 'to-hit-debuff',\n 'taunt',\n 'confuse',\n 'healing',\n 'defense-buff',\n 'resist-damage',\n 'intangibility',\n 'sleep',\n 'slow',\n 'hold',\n 'stun',\n 'immobilize',\n 'fear',\n 'endurance-modification',\n 'endurance-reduction',\n 'recharge-reduction',\n 'interrupt-duration',\n 'accuracy',\n 'to-hit-buff',\n 'damage',\n 'knockback',\n 'run-speed',\n 'jump',\n 'fly-speed',\n 'range',\n] as const\n\nexport type EnhancementCategory = typeof ENHANCEMENT_CATEGORY[number]\n","export const MISSION_TYPE = ['story-arc', 'mission', 'task-force', 'strike-force', 'trial', 'personal-story'] as const\nexport type MissionType = typeof MISSION_TYPE[number]\n","export const MORALITY = ['hero', 'vigilante', 'villain', 'rogue', 'resistance', 'loyalist'] as const\nexport type Morality = typeof MORALITY[number]\nexport type MoralityExtended = Morality\n /**\n * Any of the Primal Earth moralities - Hero, Vigilante, Villain, Rogue.\n */\n | 'primal'\n /**\n * Either of the Praetorian Earth moralities - Resistance or Loyalist.\n */\n | 'praetorian'\n /**\n * The moralities that roll up to the Hero {@link Alignment} - Hero and Vigilante.\n */\n | 'heroic'\n /**\n * The moralities that roll up to the Villain {@link Alignment} - Villain and Rogue.\n */\n | 'villainous'\n /**\n * Moralities with access to Paragon City - Hero, Vigilante and Rogue.\n */\n | 'paragon-city-access'\n /**\n * Moralities with access to the Rogue Isles - Villain, Rogue and Vigilante.\n */\n | 'rogue-isles-access'\n /**\n * All the moralities.\n */\n | 'all'\n","export const SEX = ['M', 'F'] as const\nexport type Sex = typeof SEX[number]\n\nconst SEX_ORDER = Object.fromEntries(SEX.map((x, index) => [x, index]))\n\nexport function compareSex(a?: Sex, b?: Sex): number {\n const orderA = a ? SEX_ORDER[a] : -1\n const orderB = b ? SEX_ORDER[b] : -1\n return orderA - orderB\n}\n","import { ALIGNMENT, Alignment, AlignmentExtended } from '../api/alignment'\n\nexport class AlignmentList {\n readonly #items: Set<Alignment>\n\n readonly hero: boolean\n readonly villain: boolean\n readonly praetorian: boolean\n\n readonly primal: boolean\n readonly all: boolean\n\n constructor(items?: AlignmentExtended[]) {\n const set = new Set(items ?? [...ALIGNMENT])\n this.hero = set.has('hero') || set.has('primal') || set.has('all')\n this.villain = set.has('villain') || set.has('primal') || set.has('all')\n this.praetorian = set.has('praetorian') || set.has('all')\n\n this.primal = this.hero && this.villain\n this.all = this.hero && this.villain && this.praetorian\n\n this.#items = new Set()\n if (this.hero) this.#items.add('hero')\n if (this.villain) this.#items.add('villain')\n if (this.praetorian) this.#items.add('praetorian')\n }\n\n get items(): Alignment[] {\n return [...this.#items]\n }\n\n has(alignment?: AlignmentExtended): boolean {\n switch (alignment) {\n case 'hero': {\n return this.hero\n }\n case 'villain': {\n return this.villain\n }\n case 'praetorian': {\n return this.praetorian\n }\n case 'primal' : {\n return this.primal\n }\n case 'all': {\n return this.all\n }\n default: {\n return false\n }\n }\n }\n}\n","import { AlternateData } from '../api/alternate-data'\nimport { compareSex, Sex } from '../api/sex'\nimport { Alignment, compareAlignment } from '../api/alignment'\n\nexport class Alternates<T> {\n readonly #sortedValues: AlternateData<T>[] = []\n\n /**\n * Create an alternate set from either a list of categorized values, or a single value when there are no alternates.\n * @param value List of alternates, or a single value.\n */\n constructor(value: AlternateData<T>[] | T) {\n if (Array.isArray(value)) {\n this.#sortedValues = value.sort()\n this.#sortedValues.sort((a, b) => this.#compareAlternates(a, b))\n } else {\n this.#sortedValues = [{ value }]\n }\n }\n\n getValue(alignment?: Alignment, sex?: Sex): T | undefined {\n for (let index = this.#sortedValues.length; index--;) {\n const entry = this.#sortedValues[index]\n if ((entry.alignment === undefined || entry.alignment === alignment)\n && (entry.sex === undefined || entry.sex === sex)\n ) return entry.value\n }\n\n return this.default?.value\n }\n\n /**\n * Get the default value for this list of alternates, the value with the highest priority and lowest specificity.\n */\n get default(): AlternateData<T> | undefined {\n return this.#sortedValues[0]\n }\n\n /**\n * Get the list of alternates sorted in canonical order (alignment then sex, low to high specificity).\n */\n get canonical(): AlternateData<T>[] {\n return this.#sortedValues\n }\n\n /**\n * Create a joined string from the alternate values in canonical order.\n * @param separator Separator to use. Default is ' / '\n */\n toString(separator: string): string {\n return this.canonical.map(x => x.value).join(separator)\n }\n\n #compareAlternates(a: AlternateData<T>, b: AlternateData<T>): number {\n const aSpecificity = (a.alignment ? 2 : 0) + (a.sex ? 1 : 0)\n const bSpecificity = (b.alignment ? 2 : 0) + (b.sex ? 1 : 0)\n if (aSpecificity !== bSpecificity) return aSpecificity - bSpecificity // Order first by least-specific\n\n const alignmentComparison = compareAlignment(a.alignment, b.alignment) // Next by alignment\n if (alignmentComparison !== 0) return alignmentComparison\n\n const sexComparison = compareSex(a.sex, b.sex) // Last by sex\n if (sexComparison !== 0) return sexComparison\n\n return String(a.value).localeCompare(String(b.value))\n }\n}\n","const INVALID_KEY_PATTERN = /[^a-z0-9-]/\n\nexport class Key {\n readonly #value: string\n\n constructor(value: string) {\n this.#validateKey(value)\n this.#value = value\n }\n\n get value(): string {\n return this.#value\n }\n\n #validateKey(key: string): void {\n if (INVALID_KEY_PATTERN.test(key)) throw new Error(`Invalid key: [${key}]; Keys can only contain lowercase characters, numbers and dashes.`)\n }\n}\n","import { Key } from './key'\nimport { ArchetypeData } from '../api/archetype-data'\n\nexport class Archetype {\n readonly key: string\n readonly name: string\n readonly description?: string\n\n constructor(data: ArchetypeData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.description = data.description\n }\n}\n","import { BadgeData } from './api/badge-data'\nimport { Badge } from './db/badge'\nimport { ZoneData } from './api/zone-data'\nimport { Zone } from './db/zone'\nimport { Contact } from './db/contact'\nimport { ContactData } from './api/contact-data'\nimport { Mission } from './db/mission'\nimport { MissionData } from './api/mission-data'\n\n/**\n * Returns the URI of the given badge that can be used in {@link MarkdownString} fields.\n *\n * URI format: `badge://<key>`\n *\n * @param target The badge or badge key to target.\n */\nexport function badgeUri(target: string | Badge | BadgeData): string {\n const key = typeof target === 'string' ? target : target.key\n return `badge://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given badge.\n *\n * Link format: `[<key>](badge://<key>)`\n *\n * @param target The {@link Badge} or badge key to target.\n */\nexport function badgeLink(target: string | Badge | BadgeData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${badgeUri(target)})`\n}\n\n/**\n * Returns the URI of the given contact that can be used in {@link MarkdownString} fields.\n *\n * URI format: `contact://<key>`\n *\n * @param target The {@link Contact} or contact key to target.\n */\nexport function contactUri(target: string | Contact | ContactData): string {\n const key = typeof target === 'string' ? target : target.key\n return `contact://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given contact.\n *\n * Link format: `[<key>](contact://<key>)`\n *\n * @param target The {@link Contact} or contact key to target.\n */\nexport function contactLink(target: string | Contact | ContactData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${contactUri(target)})`\n}\n\n/**\n * Returns the URI of the given mission that can be used in {@link MarkdownString} fields.\n *\n * URI format: `mission://<key>`\n *\n * @param target The {@link Mission} or mission key to target.\n */\nexport function missionUri(target: string | Mission | MissionData): string {\n const key = typeof target === 'string' ? target : target.key\n return `mission://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given mission.\n *\n * Link format: `[<key>](mission://<key>)`\n *\n * @param target The {@link Mission} or mission key to target.\n */\nexport function missionLink(target: string | Mission | MissionData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${missionUri(target)})`\n}\n\n/**\n * Returns the URI of the given zone that can be used in {@link MarkdownString} fields.\n *\n * URI format: `zone://<key>`\n *\n * @param target The {@link Zone} or zone key to target.\n */\nexport function zoneUri(target: string | Zone | ZoneData): string {\n const key = typeof target === 'string' ? target : target.key\n return `zone://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given zone.\n *\n * Link format: `[<key>](zone://<key>)`\n *\n * @param target The {@link Zone} or zone key to target.\n */\nexport function zoneLink(target: string | Zone | ZoneData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${zoneUri(target)})`\n}\n\n/**\n * For fields that accept either an array of values or a single value, coalesces the value to an array.\n *\n * Arrays are returned as-is.\n * Single values are returned as a single-value array.\n * Undefined values are returned as undefined.\n *\n * @param value The value to coalesce.\n */\nexport function coalesceToArray<T>(value?: T | T[]): T[] | undefined {\n if (!value) return undefined\n return Array.isArray(value) ? value as T[] : [value]\n}\n","import { BadgeRequirementData } from '../api/badge-requirement-data'\nimport { BadgeRequirementType } from '../api/badge-requirement-type'\nimport { EnhancementCategory } from '../api/enhancement-category'\nimport { Key } from './key'\nimport { MarkdownString } from '../api/markdown-string'\nimport { Link } from '../api/link'\nimport { Location } from './location'\nimport { coalesceToArray } from '../util'\n\nexport class BadgeRequirement {\n /**\n * Unique key used to reference this badge requirement.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The requirement type.\n */\n readonly type: BadgeRequirementType\n\n /**\n * If the requirement involves a location, where it is.\n */\n readonly location?: Location[]\n\n /**\n * If the requirement involves a badge, the badge key.\n */\n readonly badgeKey?: string\n\n /**\n * If the requirement involves a mission, the mission key.\n */\n readonly missionKey?: string\n\n /**\n * If the requirement involves a monument, the text that is displayed thereon.\n */\n readonly monumentText?: string\n\n /**\n * If the requirement involves crafting an invention, the Level of the invention required.\n */\n readonly inventionLevel?: number\n\n /**\n * If the requirement involves crafting an invention, the types of enhancements that will qualify.\n */\n readonly inventionTypes?: EnhancementCategory[]\n\n /**\n * Number of times the task needs to be repeated.\n */\n readonly count?: number\n\n /**\n * Additional information about the requirement.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: BadgeRequirementData) {\n this.key = new Key(data.key).value\n this.type = data.type\n this.location = coalesceToArray(data.location)\n this.badgeKey = data.badgeKey\n this.missionKey = data.missionKey\n this.monumentText = data.monumentText\n this.inventionLevel = data.inventionLevel\n this.inventionTypes = data.inventionTypes\n this.count = data.count\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { MORALITY, Morality, MoralityExtended } from '../api/morality'\n\nexport class MoralityList {\n readonly #items: Set<Morality>\n\n readonly hero: boolean\n readonly vigilante: boolean\n readonly villain: boolean\n readonly rogue: boolean\n readonly resistance: boolean\n readonly loyalist: boolean\n\n readonly primal: boolean\n readonly praetorian: boolean\n readonly heroic: boolean\n readonly villainous: boolean\n readonly paragonCityAccess: boolean\n readonly rogueIslesAccess: boolean\n\n readonly all: boolean\n\n constructor(items?: MoralityExtended[]) {\n const set = new Set(items ?? [...MORALITY])\n this.hero = set.has('hero') || set.has('primal') || set.has('heroic') || set.has('paragon-city-access') || set.has('all')\n this.vigilante = set.has('vigilante') || set.has('primal') || set.has('heroic') || set.has('paragon-city-access') || set.has('rogue-isles-access') || set.has('all')\n this.villain = set.has('villain') || set.has('primal') || set.has('villainous') || set.has('rogue-isles-access') || set.has('all')\n this.rogue = set.has('rogue') || set.has('primal') || set.has('villainous') || set.has('paragon-city-access') || set.has('rogue-isles-access') || set.has('all')\n this.resistance = set.has('resistance') || set.has('praetorian') || set.has('all')\n this.loyalist = set.has('loyalist') || set.has('praetorian') || set.has('all')\n\n this.primal = this.hero && this.vigilante && this.villain && this.rogue\n this.praetorian = this.loyalist && this.resistance\n this.heroic = this.hero && this.vigilante\n this.villainous = this.villain && this.rogue\n this.paragonCityAccess = this.heroic && this.rogue\n this.rogueIslesAccess = this.villainous && this.vigilante\n\n this.all = this.primal && this.praetorian\n\n this.#items = new Set()\n if (this.hero) this.#items.add('hero')\n if (this.vigilante) this.#items.add('vigilante')\n if (this.villain) this.#items.add('villain')\n if (this.rogue) this.#items.add('rogue')\n if (this.resistance) this.#items.add('resistance')\n if (this.loyalist) this.#items.add('loyalist')\n }\n\n get items(): Morality[] {\n return [...this.#items]\n }\n\n has(morality?: MoralityExtended): boolean {\n switch (morality) {\n case 'hero': {\n return this.hero\n }\n case 'vigilante': {\n return this.vigilante\n }\n case 'villain': {\n return this.villain\n }\n case 'rogue': {\n return this.rogue\n }\n case 'resistance': {\n return this.resistance\n }\n case 'loyalist': {\n return this.loyalist\n }\n case 'primal' : {\n return this.primal\n }\n case 'praetorian': {\n return this.praetorian\n }\n case 'heroic': {\n return this.hero\n }\n case 'paragon-city-access': {\n return this.paragonCityAccess\n }\n case 'rogue-isles-access': {\n return this.rogueIslesAccess\n }\n case 'villainous': {\n return this.villainous\n }\n case 'all': {\n return this.all\n }\n default: {\n return false\n }\n }\n }\n}\n","import { BadgeType } from '../api/badge-type'\nimport { Link } from '../api/link'\nimport { BadgeData } from '../api/badge-data'\nimport { BadgeRequirement } from './badge-requirement'\nimport { Key } from './key'\nimport { Alternates } from './alternates'\nimport { MarkdownString } from '../api/markdown-string'\nimport { coalesceToArray } from '../util'\nimport { MoralityList } from './morality-list'\n\nexport class Badge {\n readonly #requirementsIndex: Record<string, BadgeRequirement> = {}\n readonly #zoneKeys = new Set<string>()\n\n /**\n * The database key for this badge.\n */\n readonly key: string\n\n /**\n * The type of badge.\n */\n readonly type: BadgeType\n\n /**\n * The name of this badge.\n *\n * May vary by character sex or alignment.\n */\n readonly name: Alternates<string>\n\n /**\n * The character moralities that this badge is available to.\n */\n readonly morality: MoralityList\n\n /**\n * The badge text as it appears in-game. May vary by character sex or alignment.\n */\n readonly badgeText: Alternates<MarkdownString>\n\n /**\n * Short description of how to acquire the badge. Detailed instructions will be in the notes field.\n */\n readonly acquisition?: MarkdownString\n\n /**\n * Absolute URL to this badge's icon.\n *\n * May vary by character sex or alignment.\n */\n readonly icon: Alternates<string>\n\n /**\n * Freeform notes or tips about the badge.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * The id used with the in-game `/settitle` command to apply the badge.\n * The first value is the id for primal characters and the (optional) second number is the id for praetorian characters.\n */\n readonly setTitleId?: [number, number?]\n\n /**\n * A description of the effect the badge will have, such as a buff or granting a temporary power.\n */\n readonly effect?: MarkdownString\n\n /**\n * Represents the requirements for badges with multiple fulfillment steps, such as visiting monuments for history badges, completing missions, or collecting other badges.\n */\n readonly requirements?: BadgeRequirement[]\n\n /**\n * Some badges are not included in the badge total count... such as Flames of Prometheus, which can be removed by redeeming it for a Notice of the Well.\n */\n readonly ignoreInTotals: boolean\n\n constructor(badgeData: BadgeData) {\n this.key = new Key(badgeData.key).value\n this.type = badgeData.type\n this.name = new Alternates(badgeData.name)\n this.morality = new MoralityList(coalesceToArray(badgeData.morality))\n this.badgeText = new Alternates(badgeData.badgeText ?? [])\n this.acquisition = badgeData.acquisition\n this.icon = new Alternates(badgeData.icon ?? [])\n this.notes = badgeData.notes\n this.links = badgeData.links ?? []\n this.effect = badgeData.effect\n this.setTitleId = badgeData.setTitleId\n this.ignoreInTotals = badgeData.ignoreInTotals ?? false\n\n this.requirements = badgeData.requirements?.map((requirementData) => {\n if (this.#requirementsIndex[requirementData.key]) throw new Error(`Duplicate badge requirement key [${badgeData.key}:${requirementData.key}]`)\n const requirement = new BadgeRequirement(requirementData)\n this.#requirementsIndex[requirement.key] = requirement\n if (requirement.location) for (const location of requirement.location) {\n if (location.zoneKey) this.#zoneKeys.add(location.zoneKey)\n }\n return requirement\n })\n }\n\n getRequirement(key: string): BadgeRequirement {\n const result = this.#requirementsIndex[key]\n if (result === undefined) throw new Error(`Unknown badge requirement key [${key}]`)\n return result\n }\n\n /**\n * Return a list of all the zone keys referenced by this badge.\n */\n get zoneKeys(): string[] {\n return [...this.#zoneKeys]\n }\n\n /**\n * The zone key if this badge relates to a single zone.\n */\n get zoneKey(): string | undefined {\n return this.#zoneKeys.size === 1 ? this.#zoneKeys.values().next().value : undefined\n }\n}\n\nexport function compareByDefaultName(a?: Badge, b?: Badge): number {\n const aName = a?.name.default?.value\n const bName = b?.name.default?.value\n if (!aName && !bName) return 0\n if (!aName) return 1\n if (!bName) return -1\n return aName.localeCompare(bName)\n}\n\nexport function compareByZoneKey(a?: Badge, b?: Badge): number {\n const aZone = a?.zoneKey\n const bZone = b?.zoneKey\n if (!aZone && !bZone) return 0\n if (!aZone) return 1\n if (!bZone) return -1\n return aZone.localeCompare(bZone)\n}\n","type KeysOfType<T, V> = { [P in keyof T]: T[P] extends V ? P : never }[keyof T]\n\nexport class AbstractIndex<T> {\n protected _values: T[] = []\n protected _hashTable: Record<string, T> = {}\n\n /**\n * Create a new index.\n * @param keyField The field of the values that will act as the key.\n * @param values Values to index.\n */\n constructor(keyField: KeysOfType<T, string>, values: T[] | undefined) {\n this._values = values ?? []\n this._hashTable = {}\n for (const value of this.values) {\n const key = value[keyField] as string\n if (this._hashTable[key] !== undefined) throw new Error(`Duplicate key [${key}]`)\n this._hashTable[key] = value\n }\n }\n\n /**\n * Return all indexed values\n */\n get values(): T[] {\n return this._values\n }\n\n /**\n * Get a value from the index\n * @param key Key string\n */\n get(key: string | undefined): T | undefined {\n if (!key) return undefined\n return this._hashTable[key]\n }\n}\n","import { Badge, compareByDefaultName, compareByZoneKey } from './badge'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { Paged } from './paged'\nimport { AbstractIndex } from './abstract-index'\n\nexport class BadgeIndex extends AbstractIndex<Badge> {\n constructor(values: Badge[] | undefined) {\n super('key', values)\n }\n\n search(options?: BadgeSearchOptions): Paged<Badge> {\n const filtered = (options?.query || options?.filter)\n ? this._values.filter(badge => this.#satisfiesQueryPredicate(badge, options?.query) && this.#satisfiesFilterPredicate(badge, options?.filter))\n : this._values\n\n const totalPages = options?.pageSize ? Math.ceil(filtered.length / (options?.pageSize)) : 1\n const page = Math.max(1, Math.min(totalPages, options?.page ?? 1))\n const paged = options?.pageSize ? filtered.slice((page - 1) * options.pageSize, page * options?.pageSize) : filtered\n\n const sorted = this.#sort(paged, options?.sort)\n\n return {\n items: sorted,\n page: page,\n pageSize: options?.pageSize,\n totalItems: filtered.length,\n totalPages: totalPages,\n }\n }\n\n #satisfiesQueryPredicate(badge: Badge, query?: BadgeSearchOptions['query']): boolean {\n const queryString = query?.str?.toLowerCase() ?? ''\n return !!(((query?.on?.name ?? true) && badge.name.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (query?.on?.badgeText && badge.badgeText.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (query?.on?.acquisition && badge.acquisition?.toLowerCase().includes(queryString))\n || (query?.on?.effect && badge.effect?.toLowerCase().includes(queryString))\n || (query?.on?.notes && badge.notes?.toLowerCase().includes(queryString))\n || (query?.on?.setTitle && (badge.setTitleId?.some(x => x?.toString().includes(queryString)))))\n }\n\n #satisfiesFilterPredicate(badge: Badge, filter?: BadgeSearchOptions['filter']): boolean {\n return (!filter?.type || badge.type === filter.type)\n && (!filter?.zoneKey || badge.zoneKey === filter.zoneKey)\n && (!filter?.morality || badge.morality.has(filter.morality))\n }\n\n #sort(badges: Badge[], sort?: BadgeSearchOptions['sort']): Badge[] {\n if (!sort) return badges\n const ascending = sort.dir !== 'desc'\n\n if (sort.by === 'badge-name') return badges.sort((a, b) => ascending ? compareByDefaultName(a, b) : compareByDefaultName(b, a))\n\n if (sort.by === 'zone-key') return badges.sort((a, b) => ascending ? compareByZoneKey(a, b) : compareByZoneKey(b, a))\n\n return sort.dir === 'desc' ? badges.reverse() : badges\n }\n}\n","import { Link } from '../api/link'\nimport { MarkdownString } from '../api/markdown-string'\nimport { BundleHeaderData } from '../api/bundle-header-data'\n\nexport class BundleHeader {\n /**\n * Name of the content bundle.\n */\n readonly name?: string\n\n /**\n * Description of the fork.\n */\n readonly description?: MarkdownString\n\n /**\n * Url for the repository where the bundle is maintained.\n */\n readonly repositoryUrl?: string\n\n /**\n * Url for the location of the changelog.\n */\n readonly changelogUrl?: string\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links?: Link[]\n\n /**\n * The current version of the data package.\n */\n readonly version?: string\n\n constructor(data: BundleHeaderData | undefined) {\n this.name = data?.name\n this.description = data?.description\n this.repositoryUrl = data?.repositoryUrl\n this.changelogUrl = data?.changelogUrl\n this.links = data?.links ?? []\n this.version = data?.version\n }\n}\n","import { Link } from '../api/link'\nimport { ZoneData } from '../api/zone-data'\nimport { Key } from './key'\n\nexport class Zone {\n /**\n * Unique key used to reference this zone.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of the zone as it appears in-game.\n */\n readonly name: string\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: ZoneData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.links = data.links ?? []\n }\n}\n","import { Link } from '../api/link'\nimport { Key } from './key'\nimport { MarkdownString } from '../api/markdown-string'\nimport { ContactData } from '../api/contact-data'\nimport { Location } from './location'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util'\n\nexport class Contact {\n /**\n * Unique key used to reference this contact.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of this contact.\n */\n readonly name: string\n\n /**\n * The contact's title.\n */\n readonly title?: string\n\n /**\n * The character moralities that this contact will interact with.\n */\n readonly morality?: MoralityList\n\n /**\n * The location of this contact.\n */\n readonly location?: Location\n\n /**\n * The level range this contact will offer missions for.\n */\n readonly levelRange?: [number, number?]\n\n /**\n * Freeform notes or tips about the contact.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: ContactData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.title = data.title\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.location = data.location\n this.levelRange = data.levelRange\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { MissionType } from '../api/mission-type'\nimport { MarkdownString } from '../api/markdown-string'\nimport { Link } from '../api/link'\nimport { MissionData } from '../api/mission-data'\nimport { Key } from './key'\nimport { coalesceToArray } from '../util'\nimport { MoralityList } from './morality-list'\n\nexport class Mission {\n /**\n * Unique key used to reference this mission.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of the mission as it appears from the contact.\n *\n * The name may be different when viewed in Ouroboros as a Flashback.\n */\n readonly name: string\n\n /**\n * The type of mission... Story arc, task force, trial, etc.\n */\n readonly type: MissionType\n\n /**\n * The character moralities that may accept the mission.\n */\n readonly morality: MoralityList\n\n /**\n * The keys of any contacts that provide this mission.\n */\n readonly contactKeys?: string[]\n\n /**\n * The level range this mission is available for.\n */\n readonly levelRange?: [number, number?]\n\n /**\n * Freeform notes or tips about the mission.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * If the mission is available in Ouroboros as a Flashback.\n */\n readonly flashback?: {\n\n /**\n * The id of the mission as seen in the Flashback menu, i.e. '14.01'.\n */\n readonly id: string\n\n /**\n * The level range this mission appears under as a Flashback. Leave undefined if the same as the base mission.\n */\n readonly levelRange?: [number, number?]\n\n /**\n * The name as it appears in the Flashback list. Leave undefined if the same as the base mission.\n */\n readonly name?: string\n\n /**\n * The character moralities that the mission will appear for in the Flashback list. Leave undefined if the same as the base mission.\n */\n readonly morality?: MoralityList\n\n /**\n * Freeform notes or tips about the Flashback version of the mission.\n */\n readonly notes?: MarkdownString\n }\n\n constructor(data: MissionData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.type = data.type\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.contactKeys = coalesceToArray(data.contactKeys)\n this.levelRange = data.levelRange\n this.notes = data.notes\n this.links = data.links ?? []\n this.flashback = createFlashback(data)\n }\n}\n\nfunction createFlashback(data: MissionData): Mission['flashback'] {\n if (!data.flashback) return undefined\n return {\n id: data.flashback.id,\n levelRange: data.flashback.levelRange ?? data.levelRange,\n name: data.flashback.name ?? data.name,\n morality: new MoralityList(coalesceToArray(data.flashback.morality ?? data.morality)),\n notes: data.flashback.notes,\n }\n}\n","import { BundleData } from '../api/bundle-data'\nimport { Archetype } from './archetype'\nimport { Zone } from './zone'\nimport { Badge } from './badge'\nimport { BundleHeader } from './bundle-header'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { Paged } from './paged'\nimport { Contact } from './contact'\nimport { Mission } from './mission'\nimport { AbstractIndex } from './abstract-index'\nimport { BadgeIndex } from './badge-index'\n\nexport class CohContentDatabase {\n readonly #archetypeIndex\n readonly #zoneIndex\n readonly #contactIndex\n readonly #missionIndex\n readonly #badgeIndex\n\n readonly #header: BundleHeader\n readonly #servers: string[]\n\n /**\n * Create a db instance from the given content bundle.\n * @param bundle The bundle to load.\n */\n constructor(bundle: BundleData) {\n this.#header = new BundleHeader(bundle.header)\n this.#servers = bundle.servers ?? []\n\n this.#archetypeIndex = new AbstractIndex<Archetype>('key', bundle.archetypes?.map(x => new Archetype(x)))\n this.#zoneIndex = new AbstractIndex<Zone>('key', bundle.zones?.map(x => new Zone(x)))\n this.#contactIndex = new AbstractIndex<Contact>('key', bundle.contacts?.map(x => new Contact(x)))\n this.#missionIndex = new AbstractIndex<Mission>('key', bundle.missions?.map(x => new Mission(x)))\n this.#badgeIndex = new BadgeIndex(bundle.badges?.map(x => new Badge(x)))\n }\n\n /**\n * Header information about the content bundle.\n */\n get header(): BundleHeader {\n return this.#header\n }\n\n /**\n * List of the game server names.\n *\n * Torchbearer, Excelsior, etc.\n */\n get servers(): string[] {\n return this.#servers\n }\n\n /**\n * List of archetypes.\n */\n get archetypes(): Archetype[] {\n return this.#archetypeIndex.values\n }\n\n /**\n * Get archetype by key.\n * @param key The key.\n */\n getArchetype(key: string | undefined): Archetype | undefined {\n return this.#archetypeIndex.get(key)\n }\n\n /**\n * List of game zones.\n */\n get zones(): Zone[] {\n return this.#zoneIndex.values\n }\n\n /**\n * Get zone by key.\n * @param key The key.\n */\n getZone(key: string | undefined): Zone | undefined {\n return this.#zoneIndex.get(key)\n }\n\n /**\n * List of contacts.\n */\n get contacts(): Contact[] {\n return this.#contactIndex.values\n }\n\n /**\n * Get contact by key.\n * @param key The key.\n */\n getContact(key: string | undefined): Contact | undefined {\n return this.#contactIndex.get(key)\n }\n\n /**\n * List of missions.\n */\n get missions(): Mission[] {\n return this.#missionIndex.values\n }\n\n /**\n * Get mission by key.\n * @param key The key.\n */\n getMission(key: string | undefined): Mission | undefined {\n return this.#missionIndex.get(key)\n }\n\n /**\n * List of badges.\n */\n get badges(): Badge[] {\n return this.#badgeIndex.values\n }\n\n /**\n * Get badge by key.\n * @param key The key.\n */\n getBadge(key: string | undefined): Badge | undefined {\n return this.#badgeIndex.get(key)\n }\n\n /**\n * Search, sort and filter the badge list.\n * This is a fairly brute-forced approach and will not be as performant as loading the badge data into a traditional\n * database engine, but is sufficient for most operations.\n * @param options {@link BadgeSearchOptions}\n */\n searchBadges(options?: BadgeSearchOptions): Paged<Badge> {\n return this.#badgeIndex.search(options)\n }\n}\n","import { Coords, LocationData, LocationIcon } from '../api/location-data'\n\nexport class Location {\n /**\n * Key of the {@link Zone} that the location references.\n */\n readonly zoneKey?: string\n\n /**\n * In-game `/loc` coordinates of the location.\n */\n readonly coords?: Coords\n\n /**\n * The type of icon to use if the location appears on a map. (Typically the Vidiot map icon).\n */\n readonly icon?: LocationIcon\n\n /**\n * The text that should appear in the location icon. (Typically a number or symbol from the Vidiot map).\n */\n readonly iconText?: string\n\n constructor(data: LocationData) {\n this.zoneKey = data.zoneKey\n this.coords = data.coords\n this.icon = data.icon\n this.iconText = data.iconText\n }\n}\n"],"names":["_items","__privateAdd","__publicField","__privateSet","__privateGet","__privateMethod"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"coh-content-db.js","sources":["../src/main/api/alignment.ts","../src/main/api/badge-requirement-type.ts","../src/main/api/badge-type.ts","../src/main/api/enhancement-category.ts","../src/main/api/mission-type.ts","../src/main/api/morality.ts","../src/main/api/sex.ts","../src/main/db/alignment-list.ts","../src/main/db/alternates.ts","../src/main/db/key.ts","../src/main/db/archetype.ts","../src/main/util.ts","../src/main/db/badge-requirement.ts","../src/main/db/morality-list.ts","../src/main/db/abstract-index.ts","../src/main/db/badge.ts","../src/main/db/badge-index.ts","../src/main/db/bundle-header.ts","../src/main/db/zone.ts","../src/main/db/contact.ts","../src/main/db/mission.ts","../src/main/db/coh-content-database.ts","../src/main/db/location.ts"],"sourcesContent":["export const ALIGNMENT = ['hero', 'villain', 'praetorian'] as const\nexport type Alignment = typeof ALIGNMENT[number]\nexport type AlignmentExtended = Alignment\n /**\n * The alignments available for Primal Earth characters - Hero and Villain.\n */\n | 'primal'\n /**\n * All the alignments.\n */\n | 'all'\n\nconst ALIGNMENT_ORDER = Object.fromEntries(ALIGNMENT.map((x, index) => [x, index]))\n\nexport function compareAlignment(a?: Alignment, b?: Alignment): number {\n const orderA = a ? ALIGNMENT_ORDER[a] : -1\n const orderB = b ? ALIGNMENT_ORDER[b] : -1\n return orderA - orderB\n}\n","export const BADGE_REQUIREMENT_TYPE = [\n /**\n * Collect a badge.\n */\n 'badge',\n /**\n * Craft an invention.\n */\n 'invention',\n /**\n * Some invention badges require you to build x of two different invention levels, 'plus one of either level'.\n */\n 'invention-plus-one',\n /**\n * Visit a location.\n */\n 'location',\n /**\n * Click on a monument.\n */\n 'monument',\n /**\n * Complete a mission.\n */\n 'mission',\n /**\n * Complete an arbitrary task.\n */\n 'task',\n] as const\n\nexport type BadgeRequirementType = typeof BADGE_REQUIREMENT_TYPE[number]\n","export const BADGE_TYPE = [\n 'exploration',\n 'history',\n 'accomplishment',\n 'achievement',\n 'accolade',\n 'gladiator',\n 'veteran',\n 'pvp',\n 'invention',\n 'defeat',\n 'event',\n 'ouroboros',\n 'consignment',\n 'day-job',\n 'architect-entertainment',\n] as const\n\nexport type BadgeType = typeof BADGE_TYPE[number]\n","export const ENHANCEMENT_CATEGORY = [\n 'defense-debuff',\n 'to-hit-debuff',\n 'taunt',\n 'confuse',\n 'healing',\n 'defense-buff',\n 'resist-damage',\n 'intangibility',\n 'sleep',\n 'slow',\n 'hold',\n 'stun',\n 'immobilize',\n 'fear',\n 'endurance-modification',\n 'endurance-reduction',\n 'recharge-reduction',\n 'interrupt-duration',\n 'accuracy',\n 'to-hit-buff',\n 'damage',\n 'knockback',\n 'run-speed',\n 'jump',\n 'fly-speed',\n 'range',\n] as const\n\nexport type EnhancementCategory = typeof ENHANCEMENT_CATEGORY[number]\n","export const MISSION_TYPE = ['story-arc', 'mission', 'task-force', 'strike-force', 'trial', 'personal-story'] as const\nexport type MissionType = typeof MISSION_TYPE[number]\n","export const MORALITY = ['hero', 'vigilante', 'villain', 'rogue', 'resistance', 'loyalist'] as const\nexport type Morality = typeof MORALITY[number]\nexport type MoralityExtended = Morality\n /**\n * Any of the Primal Earth moralities - Hero, Vigilante, Villain, Rogue.\n */\n | 'primal'\n /**\n * Either of the Praetorian Earth moralities - Resistance or Loyalist.\n */\n | 'praetorian'\n /**\n * The moralities that roll up to the Hero {@link Alignment} - Hero and Vigilante.\n */\n | 'heroic'\n /**\n * The moralities that roll up to the Villain {@link Alignment} - Villain and Rogue.\n */\n | 'villainous'\n /**\n * Moralities with access to Paragon City - Hero, Vigilante and Rogue.\n */\n | 'paragon-city-access'\n /**\n * Moralities with access to the Rogue Isles - Villain, Rogue and Vigilante.\n */\n | 'rogue-isles-access'\n /**\n * All the moralities.\n */\n | 'all'\n","export const SEX = ['M', 'F'] as const\nexport type Sex = typeof SEX[number]\n\nconst SEX_ORDER = Object.fromEntries(SEX.map((x, index) => [x, index]))\n\nexport function compareSex(a?: Sex, b?: Sex): number {\n const orderA = a ? SEX_ORDER[a] : -1\n const orderB = b ? SEX_ORDER[b] : -1\n return orderA - orderB\n}\n","import { ALIGNMENT, Alignment, AlignmentExtended } from '../api/alignment'\n\nexport class AlignmentList {\n readonly #items: Set<Alignment>\n\n readonly hero: boolean\n readonly villain: boolean\n readonly praetorian: boolean\n\n readonly primal: boolean\n readonly all: boolean\n\n constructor(items?: AlignmentExtended[]) {\n const set = new Set(items ?? [...ALIGNMENT])\n this.hero = set.has('hero') || set.has('primal') || set.has('all')\n this.villain = set.has('villain') || set.has('primal') || set.has('all')\n this.praetorian = set.has('praetorian') || set.has('all')\n\n this.primal = this.hero && this.villain\n this.all = this.hero && this.villain && this.praetorian\n\n this.#items = new Set()\n if (this.hero) this.#items.add('hero')\n if (this.villain) this.#items.add('villain')\n if (this.praetorian) this.#items.add('praetorian')\n }\n\n get items(): Alignment[] {\n return [...this.#items]\n }\n\n has(alignment?: AlignmentExtended): boolean {\n switch (alignment) {\n case 'hero': {\n return this.hero\n }\n case 'villain': {\n return this.villain\n }\n case 'praetorian': {\n return this.praetorian\n }\n case 'primal' : {\n return this.primal\n }\n case 'all': {\n return this.all\n }\n default: {\n return false\n }\n }\n }\n}\n","import { AlternateData } from '../api/alternate-data'\nimport { compareSex, Sex } from '../api/sex'\nimport { Alignment, compareAlignment } from '../api/alignment'\n\nexport class Alternates<T> {\n readonly #sortedValues: AlternateData<T>[] = []\n\n /**\n * Create an alternate set from either a list of categorized values, or a single value when there are no alternates.\n * @param value List of alternates, or a single value.\n */\n constructor(value: AlternateData<T>[] | T) {\n if (Array.isArray(value)) {\n this.#sortedValues = value.sort()\n this.#sortedValues.sort((a, b) => this.#compareAlternates(a, b))\n } else {\n this.#sortedValues = [{ value }]\n }\n }\n\n getValue(alignment?: Alignment, sex?: Sex): T | undefined {\n for (let index = this.#sortedValues.length; index--;) {\n const entry = this.#sortedValues[index]\n if ((entry.alignment === undefined || entry.alignment === alignment)\n && (entry.sex === undefined || entry.sex === sex)\n ) return entry.value\n }\n\n return this.default?.value\n }\n\n /**\n * Get the default value for this list of alternates, the value with the highest priority and lowest specificity.\n */\n get default(): AlternateData<T> | undefined {\n return this.#sortedValues[0]\n }\n\n /**\n * Get the list of alternates sorted in canonical order (alignment then sex, low to high specificity).\n */\n get canonical(): AlternateData<T>[] {\n return this.#sortedValues\n }\n\n /**\n * Create a joined string from the alternate values in canonical order.\n * @param separator Separator to use. Default is ' / '\n */\n toString(separator: string): string {\n return this.canonical.map(x => x.value).join(separator)\n }\n\n #compareAlternates(a: AlternateData<T>, b: AlternateData<T>): number {\n const aSpecificity = (a.alignment ? 2 : 0) + (a.sex ? 1 : 0)\n const bSpecificity = (b.alignment ? 2 : 0) + (b.sex ? 1 : 0)\n if (aSpecificity !== bSpecificity) return aSpecificity - bSpecificity // Order first by least-specific\n\n const alignmentComparison = compareAlignment(a.alignment, b.alignment) // Next by alignment\n if (alignmentComparison !== 0) return alignmentComparison\n\n const sexComparison = compareSex(a.sex, b.sex) // Last by sex\n if (sexComparison !== 0) return sexComparison\n\n return String(a.value).localeCompare(String(b.value))\n }\n}\n","const INVALID_KEY_PATTERN = /[^a-z0-9-]/\n\nexport class Key {\n readonly #value: string\n\n constructor(value: string) {\n this.#validateKey(value)\n this.#value = value\n }\n\n get value(): string {\n return this.#value\n }\n\n #validateKey(key: string): void {\n if (INVALID_KEY_PATTERN.test(key)) throw new Error(`Invalid key: [${key}]; Keys can only contain lowercase characters, numbers and dashes.`)\n }\n}\n","import { Key } from './key'\nimport { ArchetypeData } from '../api/archetype-data'\n\nexport class Archetype {\n readonly key: string\n readonly name: string\n readonly description?: string\n\n constructor(data: ArchetypeData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.description = data.description\n }\n}\n","import { BadgeData } from './api/badge-data'\nimport { Badge } from './db/badge'\nimport { ZoneData } from './api/zone-data'\nimport { Zone } from './db/zone'\nimport { Contact } from './db/contact'\nimport { ContactData } from './api/contact-data'\nimport { Mission } from './db/mission'\nimport { MissionData } from './api/mission-data'\n\n/**\n * Returns the URI of the given badge that can be used in {@link MarkdownString} fields.\n *\n * URI format: `badge://<key>`\n *\n * @param target The badge or badge key to target.\n */\nexport function badgeUri(target: string | Badge | BadgeData): string {\n const key = typeof target === 'string' ? target : target.key\n return `badge://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given badge.\n *\n * Link format: `[<key>](badge://<key>)`\n *\n * @param target The {@link Badge} or badge key to target.\n */\nexport function badgeLink(target: string | Badge | BadgeData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${badgeUri(target)})`\n}\n\n/**\n * Returns the URI of the given contact that can be used in {@link MarkdownString} fields.\n *\n * URI format: `contact://<key>`\n *\n * @param target The {@link Contact} or contact key to target.\n */\nexport function contactUri(target: string | Contact | ContactData): string {\n const key = typeof target === 'string' ? target : target.key\n return `contact://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given contact.\n *\n * Link format: `[<key>](contact://<key>)`\n *\n * @param target The {@link Contact} or contact key to target.\n */\nexport function contactLink(target: string | Contact | ContactData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${contactUri(target)})`\n}\n\n/**\n * Returns the URI of the given mission that can be used in {@link MarkdownString} fields.\n *\n * URI format: `mission://<key>`\n *\n * @param target The {@link Mission} or mission key to target.\n */\nexport function missionUri(target: string | Mission | MissionData): string {\n const key = typeof target === 'string' ? target : target.key\n return `mission://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given mission.\n *\n * Link format: `[<key>](mission://<key>)`\n *\n * @param target The {@link Mission} or mission key to target.\n */\nexport function missionLink(target: string | Mission | MissionData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${missionUri(target)})`\n}\n\n/**\n * Returns the URI of the given zone that can be used in {@link MarkdownString} fields.\n *\n * URI format: `zone://<key>`\n *\n * @param target The {@link Zone} or zone key to target.\n */\nexport function zoneUri(target: string | Zone | ZoneData): string {\n const key = typeof target === 'string' ? target : target.key\n return `zone://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given zone.\n *\n * Link format: `[<key>](zone://<key>)`\n *\n * @param target The {@link Zone} or zone key to target.\n */\nexport function zoneLink(target: string | Zone | ZoneData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${zoneUri(target)})`\n}\n\n/**\n * For fields that accept either an array of values or a single value, coalesces the value to an array.\n *\n * Arrays are returned as-is.\n * Single values are returned as a single-value array.\n * Undefined values are returned as undefined.\n *\n * @param value The value to coalesce.\n */\nexport function coalesceToArray<T>(value?: T | T[]): T[] | undefined {\n if (!value) return undefined\n return Array.isArray(value) ? value as T[] : [value]\n}\n","import { BadgeRequirementData } from '../api/badge-requirement-data'\nimport { BadgeRequirementType } from '../api/badge-requirement-type'\nimport { EnhancementCategory } from '../api/enhancement-category'\nimport { Key } from './key'\nimport { MarkdownString } from '../api/markdown-string'\nimport { Link } from '../api/link'\nimport { Location } from './location'\nimport { coalesceToArray } from '../util'\n\nexport class BadgeRequirement {\n /**\n * Unique key used to reference this badge requirement.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The requirement type.\n */\n readonly type: BadgeRequirementType\n\n /**\n * If the requirement involves a location, where it is.\n */\n readonly location?: Location[]\n\n /**\n * If the requirement involves a badge, the badge key.\n */\n readonly badgeKey?: string\n\n /**\n * If the requirement involves a mission, the mission key.\n */\n readonly missionKey?: string\n\n /**\n * If the requirement involves a monument, the text that is displayed thereon.\n */\n readonly monumentText?: string\n\n /**\n * If the requirement involves crafting an invention, the Level of the invention required.\n */\n readonly inventionLevel?: number\n\n /**\n * If the requirement involves crafting an invention, the types of enhancements that will qualify.\n */\n readonly inventionTypes?: EnhancementCategory[]\n\n /**\n * Number of times the task needs to be repeated.\n */\n readonly count?: number\n\n /**\n * Additional information about the requirement.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: BadgeRequirementData) {\n this.key = new Key(data.key).value\n this.type = data.type\n this.location = coalesceToArray(data.location)\n this.badgeKey = data.badgeKey\n this.missionKey = data.missionKey\n this.monumentText = data.monumentText\n this.inventionLevel = data.inventionLevel\n this.inventionTypes = data.inventionTypes\n this.count = data.count\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { MORALITY, Morality, MoralityExtended } from '../api/morality'\n\nexport class MoralityList {\n readonly #items: Set<Morality>\n\n readonly hero: boolean\n readonly vigilante: boolean\n readonly villain: boolean\n readonly rogue: boolean\n readonly resistance: boolean\n readonly loyalist: boolean\n\n readonly primal: boolean\n readonly praetorian: boolean\n readonly heroic: boolean\n readonly villainous: boolean\n readonly paragonCityAccess: boolean\n readonly rogueIslesAccess: boolean\n\n readonly all: boolean\n\n constructor(items?: MoralityExtended[]) {\n const set = new Set(items ?? [...MORALITY])\n this.hero = set.has('hero') || set.has('primal') || set.has('heroic') || set.has('paragon-city-access') || set.has('all')\n this.vigilante = set.has('vigilante') || set.has('primal') || set.has('heroic') || set.has('paragon-city-access') || set.has('rogue-isles-access') || set.has('all')\n this.villain = set.has('villain') || set.has('primal') || set.has('villainous') || set.has('rogue-isles-access') || set.has('all')\n this.rogue = set.has('rogue') || set.has('primal') || set.has('villainous') || set.has('paragon-city-access') || set.has('rogue-isles-access') || set.has('all')\n this.resistance = set.has('resistance') || set.has('praetorian') || set.has('all')\n this.loyalist = set.has('loyalist') || set.has('praetorian') || set.has('all')\n\n this.primal = this.hero && this.vigilante && this.villain && this.rogue\n this.praetorian = this.loyalist && this.resistance\n this.heroic = this.hero && this.vigilante\n this.villainous = this.villain && this.rogue\n this.paragonCityAccess = this.heroic && this.rogue\n this.rogueIslesAccess = this.villainous && this.vigilante\n\n this.all = this.primal && this.praetorian\n\n this.#items = new Set()\n if (this.hero) this.#items.add('hero')\n if (this.vigilante) this.#items.add('vigilante')\n if (this.villain) this.#items.add('villain')\n if (this.rogue) this.#items.add('rogue')\n if (this.resistance) this.#items.add('resistance')\n if (this.loyalist) this.#items.add('loyalist')\n }\n\n get items(): Morality[] {\n return [...this.#items]\n }\n\n has(morality?: MoralityExtended): boolean {\n switch (morality) {\n case 'hero': {\n return this.hero\n }\n case 'vigilante': {\n return this.vigilante\n }\n case 'villain': {\n return this.villain\n }\n case 'rogue': {\n return this.rogue\n }\n case 'resistance': {\n return this.resistance\n }\n case 'loyalist': {\n return this.loyalist\n }\n case 'primal' : {\n return this.primal\n }\n case 'praetorian': {\n return this.praetorian\n }\n case 'heroic': {\n return this.hero\n }\n case 'paragon-city-access': {\n return this.paragonCityAccess\n }\n case 'rogue-isles-access': {\n return this.rogueIslesAccess\n }\n case 'villainous': {\n return this.villainous\n }\n case 'all': {\n return this.all\n }\n default: {\n return false\n }\n }\n }\n}\n","type KeysOfType<T, V> = { [P in keyof T]: T[P] extends V ? P : never }[keyof T]\n\nexport class AbstractIndex<T> {\n protected _values: T[] = []\n protected _hashTable: Record<string, T> = {}\n\n /**\n * Create a new index.\n * @param keyField The field of the values that will act as the key.\n * @param values Values to index.\n */\n constructor(keyField: KeysOfType<T, string>, values: T[] | undefined) {\n this._values = values ?? []\n this._hashTable = {}\n for (const value of this.values) {\n const key = value[keyField] as string\n if (this._hashTable[key] !== undefined) throw new Error(`Duplicate key [${key}]`)\n this._hashTable[key] = value\n }\n }\n\n /**\n * Return all indexed values\n */\n get values(): T[] {\n return this._values\n }\n\n /**\n * Get a value from the index\n * @param key Key string\n */\n get(key: string | undefined): T | undefined {\n if (!key) return undefined\n return this._hashTable[key]\n }\n}\n","import { BadgeType } from '../api/badge-type'\nimport { Link } from '../api/link'\nimport { BadgeData } from '../api/badge-data'\nimport { BadgeRequirement } from './badge-requirement'\nimport { Key } from './key'\nimport { Alternates } from './alternates'\nimport { MarkdownString } from '../api/markdown-string'\nimport { coalesceToArray } from '../util'\nimport { MoralityList } from './morality-list'\nimport { AbstractIndex } from './abstract-index'\n\nexport class Badge {\n readonly #requirementsIndex: AbstractIndex<BadgeRequirement>\n readonly #zoneKeys = new Set<string>()\n\n /**\n * The database key for this badge.\n */\n readonly key: string\n\n /**\n * The type of badge.\n */\n readonly type: BadgeType\n\n /**\n * The name of this badge.\n *\n * May vary by character sex or alignment.\n */\n readonly name: Alternates<string>\n\n /**\n * The character moralities that this badge is available to.\n */\n readonly morality: MoralityList\n\n /**\n * The badge text as it appears in-game. May vary by character sex or alignment.\n */\n readonly badgeText: Alternates<MarkdownString>\n\n /**\n * Short description of how to acquire the badge. Detailed instructions will be in the notes field.\n */\n readonly acquisition?: MarkdownString\n\n /**\n * Absolute URL to this badge's icon.\n *\n * May vary by character sex or alignment.\n */\n readonly icon: Alternates<string>\n\n /**\n * Freeform notes or tips about the badge.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * The id used with the in-game `/settitle` command to apply the badge.\n * The first value is the id for primal characters and the (optional) second number is the id for praetorian characters.\n */\n readonly setTitleId?: [number, number?]\n\n /**\n * A description of the effect the badge will have, such as a buff or granting a temporary power.\n */\n readonly effect?: MarkdownString\n\n /**\n * Some badges are not included in the badge total count... such as Flames of Prometheus, which can be removed by redeeming it for a Notice of the Well.\n */\n readonly ignoreInTotals: boolean\n\n constructor(badgeData: BadgeData) {\n this.key = new Key(badgeData.key).value\n this.type = badgeData.type\n this.name = new Alternates(badgeData.name)\n this.morality = new MoralityList(coalesceToArray(badgeData.morality))\n this.badgeText = new Alternates(badgeData.badgeText ?? [])\n this.acquisition = badgeData.acquisition\n this.icon = new Alternates(badgeData.icon ?? [])\n this.notes = badgeData.notes\n this.links = badgeData.links ?? []\n this.effect = badgeData.effect\n this.setTitleId = badgeData.setTitleId\n this.ignoreInTotals = badgeData.ignoreInTotals ?? false\n\n this.#requirementsIndex = new AbstractIndex<BadgeRequirement>('key', badgeData.requirements?.map(x => new BadgeRequirement(x)))\n\n for (const requirement of this.#requirementsIndex.values) {\n if (requirement.location) for (const location of requirement.location) {\n if (location.zoneKey) this.#zoneKeys.add(location.zoneKey)\n }\n }\n }\n\n /**\n * Represents the requirements for badges with multiple fulfillment steps, such as visiting monuments for history badges, completing missions, or collecting other badges.\n */\n get requirements(): BadgeRequirement[] {\n return this.#requirementsIndex.values\n }\n\n getRequirement(key: string): BadgeRequirement | undefined {\n return this.#requirementsIndex.get(key)\n }\n\n /**\n * Return a list of all the zone keys referenced by this badge.\n */\n get zoneKeys(): string[] {\n return [...this.#zoneKeys]\n }\n\n /**\n * The zone key if this badge relates to a single zone.\n */\n get zoneKey(): string | undefined {\n return this.#zoneKeys.size === 1 ? this.#zoneKeys.values().next().value : undefined\n }\n}\n\nexport function compareByDefaultName(a?: Badge, b?: Badge): number {\n const aName = a?.name.default?.value\n const bName = b?.name.default?.value\n if (!aName && !bName) return 0\n if (!aName) return 1\n if (!bName) return -1\n return aName.localeCompare(bName)\n}\n\nexport function compareByZoneKey(a?: Badge, b?: Badge): number {\n const aZone = a?.zoneKey\n const bZone = b?.zoneKey\n if (!aZone && !bZone) return 0\n if (!aZone) return 1\n if (!bZone) return -1\n return aZone.localeCompare(bZone)\n}\n","import { Badge, compareByDefaultName, compareByZoneKey } from './badge'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { Paged } from './paged'\nimport { AbstractIndex } from './abstract-index'\n\nexport class BadgeIndex extends AbstractIndex<Badge> {\n constructor(values: Badge[] | undefined) {\n super('key', values)\n }\n\n search(options?: BadgeSearchOptions): Paged<Badge> {\n const filtered = (options?.query || options?.filter)\n ? this._values.filter(badge => this.#satisfiesQueryPredicate(badge, options?.query) && this.#satisfiesFilterPredicate(badge, options?.filter))\n : this._values\n\n const totalPages = options?.pageSize ? Math.ceil(filtered.length / (options?.pageSize)) : 1\n const page = Math.max(1, Math.min(totalPages, options?.page ?? 1))\n const paged = options?.pageSize ? filtered.slice((page - 1) * options.pageSize, page * options?.pageSize) : filtered\n\n const sorted = this.#sort(paged, options?.sort)\n\n return {\n items: sorted,\n page: page,\n pageSize: options?.pageSize,\n totalItems: filtered.length,\n totalPages: totalPages,\n }\n }\n\n #satisfiesQueryPredicate(badge: Badge, query?: BadgeSearchOptions['query']): boolean {\n const queryString = query?.str?.toLowerCase() ?? ''\n const fields = query?.fields ? new Set(query?.fields) : new Set(['name']) // Default to name if not provided\n if (fields.size === 0) return true\n\n return !!((fields.has('name') && badge.name.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (fields.has('badge-text') && badge.badgeText.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (fields.has('acquisition') && badge.acquisition?.toLowerCase().includes(queryString))\n || (fields.has('effect') && badge.effect?.toLowerCase().includes(queryString))\n || (fields.has('notes') && badge.notes?.toLowerCase().includes(queryString))\n || (fields.has('set-title-id') && (badge.setTitleId?.some(x => x?.toString().includes(queryString)))))\n }\n\n #satisfiesFilterPredicate(badge: Badge, filter?: BadgeSearchOptions['filter']): boolean {\n return (!filter?.type || badge.type === filter.type)\n && (!filter?.zoneKey || badge.zoneKey === filter.zoneKey)\n && (!filter?.morality || badge.morality.has(filter.morality))\n }\n\n #sort(badges: Badge[], sort?: BadgeSearchOptions['sort']): Badge[] {\n if (!sort) return badges\n const ascending = sort.dir !== 'desc'\n\n if (sort.by === 'badge-name') return badges.sort((a, b) => ascending ? compareByDefaultName(a, b) : compareByDefaultName(b, a))\n\n if (sort.by === 'zone-key') return badges.sort((a, b) => ascending ? compareByZoneKey(a, b) : compareByZoneKey(b, a))\n\n return sort.dir === 'desc' ? badges.reverse() : badges\n }\n}\n","import { Link } from '../api/link'\nimport { MarkdownString } from '../api/markdown-string'\nimport { BundleHeaderData } from '../api/bundle-header-data'\n\nexport class BundleHeader {\n /**\n * Name of the content bundle.\n */\n readonly name?: string\n\n /**\n * Description of the fork.\n */\n readonly description?: MarkdownString\n\n /**\n * Url for the repository where the bundle is maintained.\n */\n readonly repositoryUrl?: string\n\n /**\n * Url for the location of the changelog.\n */\n readonly changelogUrl?: string\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links?: Link[]\n\n /**\n * The current version of the data package.\n */\n readonly version?: string\n\n constructor(data: BundleHeaderData | undefined) {\n this.name = data?.name\n this.description = data?.description\n this.repositoryUrl = data?.repositoryUrl\n this.changelogUrl = data?.changelogUrl\n this.links = data?.links ?? []\n this.version = data?.version\n }\n}\n","import { Link } from '../api/link'\nimport { ZoneData } from '../api/zone-data'\nimport { Key } from './key'\n\nexport class Zone {\n /**\n * Unique key used to reference this zone.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of the zone as it appears in-game.\n */\n readonly name: string\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: ZoneData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.links = data.links ?? []\n }\n}\n","import { Link } from '../api/link'\nimport { Key } from './key'\nimport { MarkdownString } from '../api/markdown-string'\nimport { ContactData } from '../api/contact-data'\nimport { Location } from './location'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util'\n\nexport class Contact {\n /**\n * Unique key used to reference this contact.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of this contact.\n */\n readonly name: string\n\n /**\n * The contact's title.\n */\n readonly title?: string\n\n /**\n * The character moralities that this contact will interact with.\n */\n readonly morality?: MoralityList\n\n /**\n * The location of this contact.\n */\n readonly location?: Location\n\n /**\n * The level range this contact will offer missions for.\n */\n readonly levelRange?: [number, number?]\n\n /**\n * Freeform notes or tips about the contact.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: ContactData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.title = data.title\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.location = data.location\n this.levelRange = data.levelRange\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { MissionType } from '../api/mission-type'\nimport { MarkdownString } from '../api/markdown-string'\nimport { Link } from '../api/link'\nimport { MissionData } from '../api/mission-data'\nimport { Key } from './key'\nimport { coalesceToArray } from '../util'\nimport { MoralityList } from './morality-list'\n\nexport class Mission {\n /**\n * Unique key used to reference this mission.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of the mission as it appears from the contact.\n *\n * The name may be different when viewed in Ouroboros as a Flashback.\n */\n readonly name: string\n\n /**\n * The type of mission... Story arc, task force, trial, etc.\n */\n readonly type: MissionType\n\n /**\n * The character moralities that may accept the mission.\n */\n readonly morality: MoralityList\n\n /**\n * The keys of any contacts that provide this mission.\n */\n readonly contactKeys?: string[]\n\n /**\n * The level range this mission is available for.\n */\n readonly levelRange?: [number, number?]\n\n /**\n * Freeform notes or tips about the mission.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * If the mission is available in Ouroboros as a Flashback.\n */\n readonly flashback?: {\n\n /**\n * The id of the mission as seen in the Flashback menu, i.e. '14.01'.\n */\n readonly id: string\n\n /**\n * The level range this mission appears under as a Flashback. Leave undefined if the same as the base mission.\n */\n readonly levelRange?: [number, number?]\n\n /**\n * The name as it appears in the Flashback list. Leave undefined if the same as the base mission.\n */\n readonly name?: string\n\n /**\n * The character moralities that the mission will appear for in the Flashback list. Leave undefined if the same as the base mission.\n */\n readonly morality?: MoralityList\n\n /**\n * Freeform notes or tips about the Flashback version of the mission.\n */\n readonly notes?: MarkdownString\n }\n\n constructor(data: MissionData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.type = data.type\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.contactKeys = coalesceToArray(data.contactKeys)\n this.levelRange = data.levelRange\n this.notes = data.notes\n this.links = data.links ?? []\n this.flashback = createFlashback(data)\n }\n}\n\nfunction createFlashback(data: MissionData): Mission['flashback'] {\n if (!data.flashback) return undefined\n return {\n id: data.flashback.id,\n levelRange: data.flashback.levelRange ?? data.levelRange,\n name: data.flashback.name ?? data.name,\n morality: new MoralityList(coalesceToArray(data.flashback.morality ?? data.morality)),\n notes: data.flashback.notes,\n }\n}\n","import { BundleData } from '../api/bundle-data'\nimport { Archetype } from './archetype'\nimport { Zone } from './zone'\nimport { Badge } from './badge'\nimport { BundleHeader } from './bundle-header'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { Paged } from './paged'\nimport { Contact } from './contact'\nimport { Mission } from './mission'\nimport { AbstractIndex } from './abstract-index'\nimport { BadgeIndex } from './badge-index'\n\nexport class CohContentDatabase {\n readonly #archetypeIndex\n readonly #zoneIndex\n readonly #contactIndex\n readonly #missionIndex\n readonly #badgeIndex\n\n readonly #header: BundleHeader\n readonly #servers: string[]\n\n /**\n * Create a db instance from the given content bundle.\n * @param bundle The bundle to load.\n */\n constructor(bundle: BundleData) {\n this.#header = new BundleHeader(bundle.header)\n this.#servers = bundle.servers ?? []\n\n this.#archetypeIndex = new AbstractIndex<Archetype>('key', bundle.archetypes?.map(x => new Archetype(x)))\n this.#zoneIndex = new AbstractIndex<Zone>('key', bundle.zones?.map(x => new Zone(x)))\n this.#contactIndex = new AbstractIndex<Contact>('key', bundle.contacts?.map(x => new Contact(x)))\n this.#missionIndex = new AbstractIndex<Mission>('key', bundle.missions?.map(x => new Mission(x)))\n this.#badgeIndex = new BadgeIndex(bundle.badges?.map(x => new Badge(x)))\n }\n\n /**\n * Header information about the content bundle.\n */\n get header(): BundleHeader {\n return this.#header\n }\n\n /**\n * List of the game server names.\n *\n * Torchbearer, Excelsior, etc.\n */\n get servers(): string[] {\n return this.#servers\n }\n\n /**\n * List of archetypes.\n */\n get archetypes(): Archetype[] {\n return this.#archetypeIndex.values\n }\n\n /**\n * Get archetype by key.\n * @param key The key.\n */\n getArchetype(key: string | undefined): Archetype | undefined {\n return this.#archetypeIndex.get(key)\n }\n\n /**\n * List of game zones.\n */\n get zones(): Zone[] {\n return this.#zoneIndex.values\n }\n\n /**\n * Get zone by key.\n * @param key The key.\n */\n getZone(key: string | undefined): Zone | undefined {\n return this.#zoneIndex.get(key)\n }\n\n /**\n * List of contacts.\n */\n get contacts(): Contact[] {\n return this.#contactIndex.values\n }\n\n /**\n * Get contact by key.\n * @param key The key.\n */\n getContact(key: string | undefined): Contact | undefined {\n return this.#contactIndex.get(key)\n }\n\n /**\n * List of missions.\n */\n get missions(): Mission[] {\n return this.#missionIndex.values\n }\n\n /**\n * Get mission by key.\n * @param key The key.\n */\n getMission(key: string | undefined): Mission | undefined {\n return this.#missionIndex.get(key)\n }\n\n /**\n * List of badges.\n */\n get badges(): Badge[] {\n return this.#badgeIndex.values\n }\n\n /**\n * Get badge by key.\n * @param key The key.\n */\n getBadge(key: string | undefined): Badge | undefined {\n return this.#badgeIndex.get(key)\n }\n\n /**\n * Search, sort and filter the badge list.\n * This is a fairly brute-forced approach and will not be as performant as loading the badge data into a traditional\n * database engine, but is sufficient for most operations.\n * @param options {@link BadgeSearchOptions}\n */\n searchBadges(options?: BadgeSearchOptions): Paged<Badge> {\n return this.#badgeIndex.search(options)\n }\n}\n","import { Coords, LocationData, LocationIcon } from '../api/location-data'\n\nexport class Location {\n /**\n * Key of the {@link Zone} that the location references.\n */\n readonly zoneKey?: string\n\n /**\n * In-game `/loc` coordinates of the location.\n */\n readonly coords?: Coords\n\n /**\n * The type of icon to use if the location appears on a map. (Typically the Vidiot map icon).\n */\n readonly icon?: LocationIcon\n\n /**\n * The text that should appear in the location icon. (Typically a number or symbol from the Vidiot map).\n */\n readonly iconText?: string\n\n constructor(data: LocationData) {\n this.zoneKey = data.zoneKey\n this.coords = data.coords\n this.icon = data.icon\n this.iconText = data.iconText\n }\n}\n"],"names":["_items","__privateAdd","__publicField","__privateSet","__privateGet","__privateMethod"],"mappings":"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"}
|
package/dist/coh-content-db.mjs
CHANGED
|
@@ -105,7 +105,7 @@ var __publicField$a = (obj, key, value) => __defNormalProp$a(obj, typeof key !==
|
|
|
105
105
|
var __accessCheck$6 = (obj, member, msg) => member.has(obj) || __typeError$6("Cannot " + msg);
|
|
106
106
|
var __privateGet$5 = (obj, member, getter) => (__accessCheck$6(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
107
107
|
var __privateAdd$6 = (obj, member, value) => member.has(obj) ? __typeError$6("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
108
|
-
var __privateSet$
|
|
108
|
+
var __privateSet$5 = (obj, member, value, setter) => (__accessCheck$6(obj, member, "write to private field"), member.set(obj, value), value);
|
|
109
109
|
var _items$1;
|
|
110
110
|
class AlignmentList {
|
|
111
111
|
constructor(items) {
|
|
@@ -121,7 +121,7 @@ class AlignmentList {
|
|
|
121
121
|
this.praetorian = set.has("praetorian") || set.has("all");
|
|
122
122
|
this.primal = this.hero && this.villain;
|
|
123
123
|
this.all = this.hero && this.villain && this.praetorian;
|
|
124
|
-
__privateSet$
|
|
124
|
+
__privateSet$5(this, _items$1, /* @__PURE__ */ new Set());
|
|
125
125
|
if (this.hero) __privateGet$5(this, _items$1).add("hero");
|
|
126
126
|
if (this.villain) __privateGet$5(this, _items$1).add("villain");
|
|
127
127
|
if (this.praetorian) __privateGet$5(this, _items$1).add("praetorian");
|
|
@@ -160,7 +160,7 @@ var __typeError$5 = (msg) => {
|
|
|
160
160
|
var __accessCheck$5 = (obj, member, msg) => member.has(obj) || __typeError$5("Cannot " + msg);
|
|
161
161
|
var __privateGet$4 = (obj, member, getter) => (__accessCheck$5(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
162
162
|
var __privateAdd$5 = (obj, member, value) => member.has(obj) ? __typeError$5("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
163
|
-
var __privateSet$
|
|
163
|
+
var __privateSet$4 = (obj, member, value, setter) => (__accessCheck$5(obj, member, "write to private field"), member.set(obj, value), value);
|
|
164
164
|
var __privateMethod$2 = (obj, member, method) => (__accessCheck$5(obj, member, "access private method"), method);
|
|
165
165
|
var _sortedValues, _Alternates_instances, compareAlternates_fn;
|
|
166
166
|
class Alternates {
|
|
@@ -172,10 +172,10 @@ class Alternates {
|
|
|
172
172
|
__privateAdd$5(this, _Alternates_instances);
|
|
173
173
|
__privateAdd$5(this, _sortedValues, []);
|
|
174
174
|
if (Array.isArray(value)) {
|
|
175
|
-
__privateSet$
|
|
175
|
+
__privateSet$4(this, _sortedValues, value.sort());
|
|
176
176
|
__privateGet$4(this, _sortedValues).sort((a, b) => __privateMethod$2(this, _Alternates_instances, compareAlternates_fn).call(this, a, b));
|
|
177
177
|
} else {
|
|
178
|
-
__privateSet$
|
|
178
|
+
__privateSet$4(this, _sortedValues, [{ value }]);
|
|
179
179
|
}
|
|
180
180
|
}
|
|
181
181
|
getValue(alignment, sex) {
|
|
@@ -224,7 +224,7 @@ var __typeError$4 = (msg) => {
|
|
|
224
224
|
var __accessCheck$4 = (obj, member, msg) => member.has(obj) || __typeError$4("Cannot " + msg);
|
|
225
225
|
var __privateGet$3 = (obj, member, getter) => (__accessCheck$4(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
226
226
|
var __privateAdd$4 = (obj, member, value) => member.has(obj) ? __typeError$4("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
227
|
-
var __privateSet$
|
|
227
|
+
var __privateSet$3 = (obj, member, value, setter) => (__accessCheck$4(obj, member, "write to private field"), member.set(obj, value), value);
|
|
228
228
|
var __privateMethod$1 = (obj, member, method) => (__accessCheck$4(obj, member, "access private method"), method);
|
|
229
229
|
var _value, _Key_instances, validateKey_fn;
|
|
230
230
|
const INVALID_KEY_PATTERN = /[^a-z0-9-]/;
|
|
@@ -233,7 +233,7 @@ class Key {
|
|
|
233
233
|
__privateAdd$4(this, _Key_instances);
|
|
234
234
|
__privateAdd$4(this, _value);
|
|
235
235
|
__privateMethod$1(this, _Key_instances, validateKey_fn).call(this, value);
|
|
236
|
-
__privateSet$
|
|
236
|
+
__privateSet$3(this, _value, value);
|
|
237
237
|
}
|
|
238
238
|
get value() {
|
|
239
239
|
return __privateGet$3(this, _value);
|
|
@@ -370,7 +370,7 @@ var __publicField$7 = (obj, key, value) => __defNormalProp$7(obj, typeof key !==
|
|
|
370
370
|
var __accessCheck$3 = (obj, member, msg) => member.has(obj) || __typeError$3("Cannot " + msg);
|
|
371
371
|
var __privateGet$2 = (obj, member, getter) => (__accessCheck$3(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
372
372
|
var __privateAdd$3 = (obj, member, value) => member.has(obj) ? __typeError$3("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
373
|
-
var __privateSet$
|
|
373
|
+
var __privateSet$2 = (obj, member, value, setter) => (__accessCheck$3(obj, member, "write to private field"), member.set(obj, value), value);
|
|
374
374
|
var _items;
|
|
375
375
|
class MoralityList {
|
|
376
376
|
constructor(items) {
|
|
@@ -402,7 +402,7 @@ class MoralityList {
|
|
|
402
402
|
this.paragonCityAccess = this.heroic && this.rogue;
|
|
403
403
|
this.rogueIslesAccess = this.villainous && this.vigilante;
|
|
404
404
|
this.all = this.primal && this.praetorian;
|
|
405
|
-
__privateSet$
|
|
405
|
+
__privateSet$2(this, _items, /* @__PURE__ */ new Set());
|
|
406
406
|
if (this.hero) __privateGet$2(this, _items).add("hero");
|
|
407
407
|
if (this.vigilante) __privateGet$2(this, _items).add("vigilante");
|
|
408
408
|
if (this.villain) __privateGet$2(this, _items).add("villain");
|
|
@@ -463,76 +463,109 @@ class MoralityList {
|
|
|
463
463
|
_items = new WeakMap();
|
|
464
464
|
|
|
465
465
|
var __defProp$6 = Object.defineProperty;
|
|
466
|
+
var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
467
|
+
var __publicField$6 = (obj, key, value) => __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
468
|
+
class AbstractIndex {
|
|
469
|
+
/**
|
|
470
|
+
* Create a new index.
|
|
471
|
+
* @param keyField The field of the values that will act as the key.
|
|
472
|
+
* @param values Values to index.
|
|
473
|
+
*/
|
|
474
|
+
constructor(keyField, values) {
|
|
475
|
+
__publicField$6(this, "_values", []);
|
|
476
|
+
__publicField$6(this, "_hashTable", {});
|
|
477
|
+
this._values = values ?? [];
|
|
478
|
+
this._hashTable = {};
|
|
479
|
+
for (const value of this.values) {
|
|
480
|
+
const key = value[keyField];
|
|
481
|
+
if (this._hashTable[key] !== void 0) throw new Error(`Duplicate key [${key}]`);
|
|
482
|
+
this._hashTable[key] = value;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Return all indexed values
|
|
487
|
+
*/
|
|
488
|
+
get values() {
|
|
489
|
+
return this._values;
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Get a value from the index
|
|
493
|
+
* @param key Key string
|
|
494
|
+
*/
|
|
495
|
+
get(key) {
|
|
496
|
+
if (!key) return void 0;
|
|
497
|
+
return this._hashTable[key];
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
var __defProp$5 = Object.defineProperty;
|
|
466
502
|
var __typeError$2 = (msg) => {
|
|
467
503
|
throw TypeError(msg);
|
|
468
504
|
};
|
|
469
|
-
var __defNormalProp$
|
|
470
|
-
var __publicField$
|
|
505
|
+
var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
506
|
+
var __publicField$5 = (obj, key, value) => __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
471
507
|
var __accessCheck$2 = (obj, member, msg) => member.has(obj) || __typeError$2("Cannot " + msg);
|
|
472
508
|
var __privateGet$1 = (obj, member, getter) => (__accessCheck$2(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
473
509
|
var __privateAdd$2 = (obj, member, value) => member.has(obj) ? __typeError$2("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
510
|
+
var __privateSet$1 = (obj, member, value, setter) => (__accessCheck$2(obj, member, "write to private field"), member.set(obj, value), value);
|
|
474
511
|
var _requirementsIndex, _zoneKeys;
|
|
475
512
|
class Badge {
|
|
476
513
|
constructor(badgeData) {
|
|
477
|
-
__privateAdd$2(this, _requirementsIndex
|
|
514
|
+
__privateAdd$2(this, _requirementsIndex);
|
|
478
515
|
__privateAdd$2(this, _zoneKeys, /* @__PURE__ */ new Set());
|
|
479
516
|
/**
|
|
480
517
|
* The database key for this badge.
|
|
481
518
|
*/
|
|
482
|
-
__publicField$
|
|
519
|
+
__publicField$5(this, "key");
|
|
483
520
|
/**
|
|
484
521
|
* The type of badge.
|
|
485
522
|
*/
|
|
486
|
-
__publicField$
|
|
523
|
+
__publicField$5(this, "type");
|
|
487
524
|
/**
|
|
488
525
|
* The name of this badge.
|
|
489
526
|
*
|
|
490
527
|
* May vary by character sex or alignment.
|
|
491
528
|
*/
|
|
492
|
-
__publicField$
|
|
529
|
+
__publicField$5(this, "name");
|
|
493
530
|
/**
|
|
494
531
|
* The character moralities that this badge is available to.
|
|
495
532
|
*/
|
|
496
|
-
__publicField$
|
|
533
|
+
__publicField$5(this, "morality");
|
|
497
534
|
/**
|
|
498
535
|
* The badge text as it appears in-game. May vary by character sex or alignment.
|
|
499
536
|
*/
|
|
500
|
-
__publicField$
|
|
537
|
+
__publicField$5(this, "badgeText");
|
|
501
538
|
/**
|
|
502
539
|
* Short description of how to acquire the badge. Detailed instructions will be in the notes field.
|
|
503
540
|
*/
|
|
504
|
-
__publicField$
|
|
541
|
+
__publicField$5(this, "acquisition");
|
|
505
542
|
/**
|
|
506
543
|
* Absolute URL to this badge's icon.
|
|
507
544
|
*
|
|
508
545
|
* May vary by character sex or alignment.
|
|
509
546
|
*/
|
|
510
|
-
__publicField$
|
|
547
|
+
__publicField$5(this, "icon");
|
|
511
548
|
/**
|
|
512
549
|
* Freeform notes or tips about the badge.
|
|
513
550
|
*/
|
|
514
|
-
__publicField$
|
|
551
|
+
__publicField$5(this, "notes");
|
|
515
552
|
/**
|
|
516
553
|
* List of external links. Wiki, forums, etc.
|
|
517
554
|
*/
|
|
518
|
-
__publicField$
|
|
555
|
+
__publicField$5(this, "links");
|
|
519
556
|
/**
|
|
520
557
|
* The id used with the in-game `/settitle` command to apply the badge.
|
|
521
558
|
* The first value is the id for primal characters and the (optional) second number is the id for praetorian characters.
|
|
522
559
|
*/
|
|
523
|
-
__publicField$
|
|
560
|
+
__publicField$5(this, "setTitleId");
|
|
524
561
|
/**
|
|
525
562
|
* A description of the effect the badge will have, such as a buff or granting a temporary power.
|
|
526
563
|
*/
|
|
527
|
-
__publicField$
|
|
528
|
-
/**
|
|
529
|
-
* Represents the requirements for badges with multiple fulfillment steps, such as visiting monuments for history badges, completing missions, or collecting other badges.
|
|
530
|
-
*/
|
|
531
|
-
__publicField$6(this, "requirements");
|
|
564
|
+
__publicField$5(this, "effect");
|
|
532
565
|
/**
|
|
533
566
|
* Some badges are not included in the badge total count... such as Flames of Prometheus, which can be removed by redeeming it for a Notice of the Well.
|
|
534
567
|
*/
|
|
535
|
-
__publicField$
|
|
568
|
+
__publicField$5(this, "ignoreInTotals");
|
|
536
569
|
this.key = new Key(badgeData.key).value;
|
|
537
570
|
this.type = badgeData.type;
|
|
538
571
|
this.name = new Alternates(badgeData.name);
|
|
@@ -545,20 +578,21 @@ class Badge {
|
|
|
545
578
|
this.effect = badgeData.effect;
|
|
546
579
|
this.setTitleId = badgeData.setTitleId;
|
|
547
580
|
this.ignoreInTotals = badgeData.ignoreInTotals ?? false;
|
|
548
|
-
this
|
|
549
|
-
|
|
550
|
-
const requirement = new BadgeRequirement(requirementData);
|
|
551
|
-
__privateGet$1(this, _requirementsIndex)[requirement.key] = requirement;
|
|
581
|
+
__privateSet$1(this, _requirementsIndex, new AbstractIndex("key", badgeData.requirements?.map((x) => new BadgeRequirement(x))));
|
|
582
|
+
for (const requirement of __privateGet$1(this, _requirementsIndex).values) {
|
|
552
583
|
if (requirement.location) for (const location of requirement.location) {
|
|
553
584
|
if (location.zoneKey) __privateGet$1(this, _zoneKeys).add(location.zoneKey);
|
|
554
585
|
}
|
|
555
|
-
|
|
556
|
-
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Represents the requirements for badges with multiple fulfillment steps, such as visiting monuments for history badges, completing missions, or collecting other badges.
|
|
590
|
+
*/
|
|
591
|
+
get requirements() {
|
|
592
|
+
return __privateGet$1(this, _requirementsIndex).values;
|
|
557
593
|
}
|
|
558
594
|
getRequirement(key) {
|
|
559
|
-
|
|
560
|
-
if (result === void 0) throw new Error(`Unknown badge requirement key [${key}]`);
|
|
561
|
-
return result;
|
|
595
|
+
return __privateGet$1(this, _requirementsIndex).get(key);
|
|
562
596
|
}
|
|
563
597
|
/**
|
|
564
598
|
* Return a list of all the zone keys referenced by this badge.
|
|
@@ -592,42 +626,6 @@ function compareByZoneKey(a, b) {
|
|
|
592
626
|
return aZone.localeCompare(bZone);
|
|
593
627
|
}
|
|
594
628
|
|
|
595
|
-
var __defProp$5 = Object.defineProperty;
|
|
596
|
-
var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
597
|
-
var __publicField$5 = (obj, key, value) => __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
598
|
-
class AbstractIndex {
|
|
599
|
-
/**
|
|
600
|
-
* Create a new index.
|
|
601
|
-
* @param keyField The field of the values that will act as the key.
|
|
602
|
-
* @param values Values to index.
|
|
603
|
-
*/
|
|
604
|
-
constructor(keyField, values) {
|
|
605
|
-
__publicField$5(this, "_values", []);
|
|
606
|
-
__publicField$5(this, "_hashTable", {});
|
|
607
|
-
this._values = values ?? [];
|
|
608
|
-
this._hashTable = {};
|
|
609
|
-
for (const value of this.values) {
|
|
610
|
-
const key = value[keyField];
|
|
611
|
-
if (this._hashTable[key] !== void 0) throw new Error(`Duplicate key [${key}]`);
|
|
612
|
-
this._hashTable[key] = value;
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
|
-
/**
|
|
616
|
-
* Return all indexed values
|
|
617
|
-
*/
|
|
618
|
-
get values() {
|
|
619
|
-
return this._values;
|
|
620
|
-
}
|
|
621
|
-
/**
|
|
622
|
-
* Get a value from the index
|
|
623
|
-
* @param key Key string
|
|
624
|
-
*/
|
|
625
|
-
get(key) {
|
|
626
|
-
if (!key) return void 0;
|
|
627
|
-
return this._hashTable[key];
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
|
|
631
629
|
var __typeError$1 = (msg) => {
|
|
632
630
|
throw TypeError(msg);
|
|
633
631
|
};
|
|
@@ -658,7 +656,9 @@ class BadgeIndex extends AbstractIndex {
|
|
|
658
656
|
_BadgeIndex_instances = new WeakSet();
|
|
659
657
|
satisfiesQueryPredicate_fn = function(badge, query) {
|
|
660
658
|
const queryString = query?.str?.toLowerCase() ?? "";
|
|
661
|
-
|
|
659
|
+
const fields = query?.fields ? new Set(query?.fields) : /* @__PURE__ */ new Set(["name"]);
|
|
660
|
+
if (fields.size === 0) return true;
|
|
661
|
+
return !!(fields.has("name") && badge.name.canonical.some((x) => x.value.toLowerCase().includes(queryString)) || fields.has("badge-text") && badge.badgeText.canonical.some((x) => x.value.toLowerCase().includes(queryString)) || fields.has("acquisition") && badge.acquisition?.toLowerCase().includes(queryString) || fields.has("effect") && badge.effect?.toLowerCase().includes(queryString) || fields.has("notes") && badge.notes?.toLowerCase().includes(queryString) || fields.has("set-title-id") && badge.setTitleId?.some((x) => x?.toString().includes(queryString)));
|
|
662
662
|
};
|
|
663
663
|
satisfiesFilterPredicate_fn = function(badge, filter) {
|
|
664
664
|
return (!filter?.type || badge.type === filter.type) && (!filter?.zoneKey || badge.zoneKey === filter.zoneKey) && (!filter?.morality || badge.morality.has(filter.morality));
|