{"version":3,"file":"index-53846226.js","sources":["../../../app/frontend/lib/explorer/data/src/sdk/utils.ts","../../../app/frontend/lib/explorer/data/src/lib/utils/items.ts","../../../app/frontend/lib/explorer/data/src/sdk/index.ts"],"sourcesContent":["import { Get } from \".\";\nimport type { CivAbbr, CivSlug, CivConfig } from \"../types/civs\";\nimport { CIVILIZATION_BY_SLUG } from \"../types/civs\";\nimport { Item, ItemType, Modifier, UnifiedItem } from \"../types/items\";\n\nexport { CivSlug, CivAbbr };\nexport type ItemGroup = UnifiedItem;\n\ntype NumberKeys = { [K in keyof T]: T[K] extends number ? K : never }[keyof T];\nexport type ItemSlug = `${\"units\" | \"buildings\" | \"technologies\" | \"upgrades\" | \"abilities\"}/${string}`;\n\nexport function getAbbr(civ: CivAbbr | CivSlug | CivConfig): CivAbbr {\n if (typeof civ === \"string\") return civ.length == 2 ? civ : CIVILIZATION_BY_SLUG[civ];\n return civ.abbr;\n}\n\nexport function getSlug(civ: CivAbbr | CivSlug | CivConfig): CivSlug {\n if (typeof civ === \"string\") return civ.length == 2 ? civ : CIVILIZATION_BY_SLUG[civ];\n return civ.slug;\n}\n\nexport function getAllValuesForProperty(item: ItemGroup, property: P): T[P][] {\n return item.variations.reduce((acc, variation) => (variation[property] ? [...acc, variation[property]] : acc), [] as T[P][]);\n}\n\nexport class ItemList extends Array> {\n where(args: { civilization?: CivSlug | CivAbbr; age?: 1 | 2 | 3 | 4; producedAt?: string; affects?: ItemGroup | ItemSlug | ItemType }) {\n return new ItemList(\n ...this.reduce((list, x) => {\n const variations = x.variations.filter((v) => {\n if (args.age && v.age > args.age) return false;\n if (args.producedAt && !v.producedBy.includes(args.producedAt)) return false;\n if (args.civilization && !v.civs.includes(getAbbr(args.civilization))) return false;\n if (args.affects && \"effects\" in v) {\n const effects = v.effects as Modifier[];\n const maybeGroupedItem = typeof args.affects === \"string\" ? Get(args.affects) : args.affects;\n if (!maybeGroupedItem) return false;\n const affectedItem = \"variations\" in maybeGroupedItem ? maybeGroupedItem.variations[0] : maybeGroupedItem;\n\n return effects.some((e) => {\n const matcher = e.select!;\n const matchesId = matcher.id?.includes(affectedItem.id) || matcher.id?.includes((affectedItem as Item).baseId);\n const matchesClass = matcher.class?.some((cl) => cl?.every((c) => affectedItem.classes.includes(c)));\n return matchesId || matchesClass;\n });\n }\n return true;\n });\n if (variations.length > 0) list.push({ ...x, variations });\n return list;\n }, [] as ItemGroup[])\n );\n }\n\n order(...keys: NumberKeys[]) {\n const sorted = new ItemList(...this).sort((a, b) => b.civs.length - a.civs.length);\n for (const key of keys) {\n sorted.sort((a, b) => Math.min(...(getAllValuesForProperty(a, key) as unknown[] as number[])) - Math.min(...(getAllValuesForProperty(b, key) as unknown[] as number[])));\n }\n return sorted;\n }\n\n get(id: string | number) {\n if (typeof id === \"number\") return this.find((x) => x.variations.some((v) => v.pbgid === id));\n return this.find((x) => x.id === id);\n }\n}\n","import { Item, ItemId, UnifiedItem } from \"../../types/items\";\nimport { uniqueArray } from \"./array\";\n\nexport function unifyItems(items: Item[]): UnifiedItem[] {\n return Object.values(\n items.reduce((acc, item) => {\n const id = item.baseId;\n if (!acc[id])\n acc[id] = {\n id: id,\n name: item.name,\n type: item.type,\n civs: item.civs,\n unique: item.unique,\n displayClasses: item.displayClasses ?? [],\n classes: item.classes,\n minAge: item.age,\n icon: item.icon,\n description: item.description,\n variations: [item],\n };\n else {\n if (item.name.length < acc[id].name.length) acc[id].name = item.name;\n acc[id].variations.push(item);\n acc[id].civs = uniqueArray([...acc[id].civs, ...item.civs]).sort();\n acc[id].classes = uniqueArray([...acc[id].classes, ...item.classes]);\n acc[id].displayClasses = uniqueArray([...acc[id].displayClasses, ...(item.displayClasses ?? [])]);\n acc[id].minAge = Math.min(acc[id].minAge, item.age);\n acc[id].unique = acc[id].unique;\n }\n\n return acc;\n }, {} as Record)\n );\n}\n\nexport type Optimized = UnifiedItem & {\n shared: Record>;\n variations: Partial[];\n};\n\nexport function optimizeItems(items: UnifiedItem[]): Optimized[] {\n // const unified = unifyItems(items);\n\n return items.map((item) => {\n if (item.variations.length <= 1) return { ...item, shared: {} as Optimized };\n let ageBase = [] as Partial[];\n let optimizedVariations: Partial[] = []; // = item.variations.map((variation) => ({ ...variation } as Partial))\n for (const age of [1, 2, 3, 4]) {\n const ageId = `${item.id}-${age}`;\n let ageVariations: Partial[] = item.variations.filter((v) => v.id == ageId) ?? [];\n if (ageVariations.length == 0) continue;\n const { common, variations } = optimizeItemValues(ageVariations);\n common.id = ageId;\n ageBase.push(common);\n optimizedVariations.push(...variations);\n }\n\n const { common, variations } = optimizeItemValues(ageBase, ageBase.length > 1 ? [\"weapons\", \"armor\", \"name\"] : []);\n const shared = {};\n\n for (const variation of variations) if (Object.entries(variation).filter(([k, v]) => !!v && k != \"id\").length > 1) shared[variation.id as string] = variation;\n\n return {\n ...item,\n ...common,\n shared,\n variations: optimizedVariations,\n } as any;\n }) as Optimized[];\n}\n\nfunction optimizeItemValues(items: Partial[], ignoreKeys: string[] = []): { common: Partial; variations: Partial[] } {\n let common: Partial = {};\n let variations: Partial[] = items.map((v) => ({ ...v } as Partial));\n for (const key of Object.keys(items[0])) {\n if ([\"pbgid\", \"id\", \"attribName\", \"civs\", ...ignoreKeys].includes(key)) continue;\n // for each key, compare all variation values, and take the one that is most common as base value\n // for all variations, remove the value from the optimized variation if it is the same as the base value\n // if the value is an object, compare using JSON stringify\n // in all other cases compare with a simple ===\n\n const usage = new Map();\n const comparableValues = variations.map((variation) => [JSON.stringify(variation[key]), variation[key]]);\n for (const [key] of comparableValues) usage.set(key, (usage.get(key) ?? 0) + 1);\n\n const [mostCommonKey] = [...usage.entries()].sort((a, b) => b[1] - a[1])[0];\n const mostCommonValue = comparableValues.find(([key]) => key === mostCommonKey)![1];\n\n comparableValues.forEach(([ckey], i) => {\n if (ckey === mostCommonKey) variations[i][key] = undefined;\n });\n\n common[key] = mostCommonValue;\n }\n\n return {\n common,\n variations,\n };\n}\n\nexport function optimizedToUnified(items: Optimized[]): UnifiedItem[] {\n return items.map((item) => {\n const variations = item.variations.map((variation) => Object.assign({}, item, item.shared[variation.id as string], variation, { shared: undefined, variations: undefined }));\n return {\n ...item,\n variations,\n };\n });\n}\n","import { ItemList, getAbbr, CivAbbr, CivSlug, ItemSlug } from \"./utils\";\nimport allUnits from \"../../units/all-optimized.json\";\nimport allBuildings from \"../../buildings/all-optimized.json\";\nimport allTechnologies from \"../../technologies/all-optimized.json\";\nimport allUpgrades from \"../../upgrades/all-optimized.json\";\nimport allAbilities from \"../../abilities/all-optimized.json\";\nimport { Building, Technology, Unit, Upgrade, Ability } from \"../types/items\";\nimport { CivInfo, CivConfig } from \"../types/civs\";\nimport { Optimized, optimizedToUnified } from \"../lib/utils/items\";\n\nimport ab from \"../../civilizations/abbasid.json\";\nimport ay from \"../../civilizations/ayyubids.json\";\nimport by from \"../../civilizations/byzantines.json\";\nimport ch from \"../../civilizations/chinese.json\";\nimport de from \"../../civilizations/delhi.json\";\nimport en from \"../../civilizations/english.json\";\nimport fr from \"../../civilizations/french.json\";\nimport hr from \"../../civilizations/hre.json\";\nimport ja from \"../../civilizations/japanese.json\";\nimport je from \"../../civilizations/jeannedarc.json\";\nimport ma from \"../../civilizations/malians.json\";\nimport mo from \"../../civilizations/mongols.json\";\nimport od from \"../../civilizations/orderofthedragon.json\";\nimport ot from \"../../civilizations/ottomans.json\";\nimport ru from \"../../civilizations/rus.json\";\nimport zx from \"../../civilizations/zhuxi.json\";\n\nconst units = new ItemList(...optimizedToUnified(allUnits.data as unknown as Optimized[]));\nconst buildings = new ItemList(...optimizedToUnified(allBuildings.data as unknown as Optimized[]));\nconst technologies = new ItemList(...optimizedToUnified(allTechnologies.data as unknown as Optimized[]));\nconst upgrades = new ItemList(...optimizedToUnified(allUpgrades.data as unknown as Optimized[]));\nconst abilities = new ItemList(...optimizedToUnified(allAbilities.data as unknown as Optimized[]));\n\nconst civilizations: Record & { Get: typeof GetCiv; list: CivInfo[] } = {\n ab,\n ay,\n by,\n ch,\n de,\n en,\n fr,\n hr,\n ja,\n je,\n ma,\n mo,\n od,\n ot,\n ru,\n zx,\n Get: GetCiv,\n list: [ab, ay, by, ch, de, en, fr, hr, ja, je, ma, mo, od, ot, ru, zx],\n};\n\nfunction GetCiv(slug: CivSlug | CivAbbr | CivConfig) {\n if (typeof slug !== \"string\") slug = slug.abbr;\n const items = {\n units: units.where({ civilization: slug }),\n buildings: buildings.where({ civilization: slug }),\n technologies: technologies.where({ civilization: slug }),\n upgrades: upgrades.where({ civilization: slug }),\n abilities: abilities.where({ civilization: slug }),\n };\n return {\n info: civilizations[getAbbr(slug)],\n ...items,\n Get: (id: number | ItemSlug) => Get(id, items),\n };\n}\n\nfunction Get(id: number | ItemSlug, data = { units, buildings, technologies, upgrades, abilities }) {\n if (typeof id === \"number\") {\n return data.units.get(id) || data.buildings.get(id) || data.technologies.get(id) || data.upgrades.get(id) || data.abilities.get(id);\n }\n\n const [type, slug] = id.split(\"/\");\n if (type == \"units\") return data.units.get(slug);\n if (type == \"buildings\") return data.buildings.get(slug);\n if (type == \"technologies\") return data.technologies.get(slug);\n if (type == \"upgrades\") return data.upgrades.get(slug);\n if (type == \"abilities\") return data.abilities.get(slug);\n}\n\nexport { Get, civilizations, units, buildings, technologies, upgrades, abilities };\n\nconst Data = { Get, civilizations, units, buildings, technologies, upgrades, abilities };\n"],"names":["getAbbr","civ","CIVILIZATION_BY_SLUG","getAllValuesForProperty","item","property","acc","variation","ItemList","args","list","x","variations","v","effects","maybeGroupedItem","Get","affectedItem","e","matcher","matchesId","_a","_b","matchesClass","_c","cl","c","keys","sorted","a","b","key","id","optimizedToUnified","items","units","allUnits","buildings","allBuildings","technologies","allTechnologies","upgrades","allUpgrades","abilities","allAbilities","civilizations","ab","ay","by","ch","de","en","fr","hr","ja","je","ma","mo","od","ot","ru","zx","GetCiv","slug","data","type"],"mappings":"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"}