diff --git a/.gitignore b/.gitignore index e753953c..435fd322 100644 --- a/.gitignore +++ b/.gitignore @@ -40,5 +40,3 @@ next-env.d.ts # files generated by export:* NPM scripts for the companion app /.companion -/animals.json -/weapons.json diff --git a/src/scripts/companion/animals.ts b/src/scripts/companion/animals.ts index 6a8fea04..ecbf14cc 100644 --- a/src/scripts/companion/animals.ts +++ b/src/scripts/companion/animals.ts @@ -1,20 +1,16 @@ import { fauna } from 'config/animals'; import en from 'locales'; -import type { TranslationKey } from 'types/i18n'; +import { type AnimalKey, trophyRangesMap } from './data/animalsTrophyRanges'; -type Filtered = T extends `ANIMAL:${infer _}_HEADING` ? T : never; -type AnimalKey = Filtered; +export default fauna.map(entry => { + const trophy = trophyRangesMap.get(entry.heading as AnimalKey); -const trophyMap = new Map([ - ['ANIMAL:ALCES_AMERICANUS_HEADING', [284, 361, 411, 459]], - // To be populated with the remaining entries... -]); - -export default fauna.map(entry => ({ - ID: entry.heading, - LATIN: en[entry.latin], - MIN: entry.hitEnergy[0], - MAX: entry.hitEnergy[1], - TIER: entry.tier, - TROPHY: trophyMap.get(entry.heading as AnimalKey) ?? [], -})); + return { + ID: entry.heading, + LATIN: en[entry.latin], + MIN: entry.hitEnergy[0], + MAX: entry.hitEnergy[1], + TIER: entry.tier, + ...(trophy !== null ? { TROPHY: trophy } : {}), + }; +}); diff --git a/src/scripts/companion/data/animalsTrophyRanges.ts b/src/scripts/companion/data/animalsTrophyRanges.ts new file mode 100644 index 00000000..451fc703 --- /dev/null +++ b/src/scripts/companion/data/animalsTrophyRanges.ts @@ -0,0 +1,102 @@ +import type { TranslationKey } from 'types/i18n'; + +type Filtered = T extends `ANIMAL:${infer _}_HEADING` ? T : never; +export type AnimalKey = Filtered; +type TrophyArray = [number, number, number, number, number]; + +export const trophyRangesMap = new Map([ + ['ANIMAL:ALCES_AMERICANUS_HEADING' as AnimalKey, [100, 284, 361, 411, 459]], + [ + 'ANIMAL:ALCES_AMERICANUS_GIGAS_HEADING' as AnimalKey, + [100, 285, 362, 412, 460], + ], + ['ANIMAL:ANAS_PLATYRHYNCHOS_HEADING' as AnimalKey, [180, 300, 359, 409, 460]], + ['ANIMAL:ANSER_ANSER_HEADING' as AnimalKey, [164, 295, 358, 407, 450]], + ['ANIMAL:ANSER_ROSSII_HEADING' as AnimalKey, [180, 268, 339, 395, 446]], + ['ANIMAL:AYTHYA_AFFINIS_HEADING' as AnimalKey, [164, 319, 377, 419, 456]], + [ + 'ANIMAL:BISON_BISON_ATHABASCAE_HEADING' as AnimalKey, + [100, 309, 371, 418, 458], + ], + ['ANIMAL:CANIS_AUREUS_HEADING' as AnimalKey, [360, 412, 443, 465, 483]], + ['ANIMAL:CANIS_LUPUS_HEADING' as AnimalKey, [336, 400, 436, 461, 483]], + [ + 'ANIMAL:CAPREOLUS_CAPREOLUS_HEADING' as AnimalKey, + [164, 297, 368, 423, 466], + ], + ['ANIMAL:CERVUS_CANADENSIS_HEADING' as AnimalKey, [100, 284, 356, 408, 459]], + [ + 'ANIMAL:CERVUS_CANADENSIS_ROOSEVELTI_HEADING' as AnimalKey, + [146, 285, 357, 409, 460], + ], + ['ANIMAL:CERVUS_ELAPHUS_HEADING' as AnimalKey, [100, 259, 339, 399, 459]], + ['ANIMAL:DAMA_DAMA_HEADING' as AnimalKey, [100, 284, 356, 408, 459]], + ['ANIMAL:LEPUS_AMERICANUS_HEADING' as AnimalKey, [326, 394, 429, 465, 485]], + ['ANIMAL:LEPUS_EUROPAEUS_HEADING' as AnimalKey, [80, 237, 331, 394, 458]], + [ + 'ANIMAL:MELANITTA_PERSPICILLATA_HEADING' as AnimalKey, + [180, 345, 402, 439, 469], + ], + ['ANIMAL:MELES_MELES_HEADING' as AnimalKey, [274, 362, 404, 435, 467]], + [ + 'ANIMAL:ODOCOILEUS_HEMIONUS_HEADING' as AnimalKey, + [100, 264, 339, 399, 459], + ], + [ + 'ANIMAL:ODOCOILEUS_HEMIONUS_SITKENSIS_HEADING' as AnimalKey, + [118, 212, 327, 403, 464], + ], + [ + 'ANIMAL:ODOCOILEUS_VIRGINIANUS_HEADING' as AnimalKey, + [118, 283, 350, 417, 460], + ], + [ + 'ANIMAL:OREAMNOS_AMERICANUS_HEADING' as AnimalKey, + [260, 350, 396, 430, 464], + ], + ['ANIMAL:OVIS_CANADENSIS_HEADING' as AnimalKey, [229, 330, 388, 417, 460]], + ['ANIMAL:OVIS_MUSIMON_HEADING' as AnimalKey, [253, 335, 380, 421, 470]], + [ + 'ANIMAL:PHASIANUS_COLCHICUS_HEADING' as AnimalKey, + [100, 329, 384, 429, 459], + ], + [ + 'ANIMAL:RANGIFER_TARANDUS_GROENLANDICUS_HEADING' as AnimalKey, + [100, 255, 350, 423, 460], + ], + [ + 'ANIMAL:RUPICAPRA_RUPICAPRA_HEADING' as AnimalKey, + [263, 355, 400, 437, 465], + ], + ['ANIMAL:SUS_SCROFA_HEADING' as AnimalKey, [243, 342, 391, 426, 463]], + ['ANIMAL:TAXIDEA_TAXUS_HEADING' as AnimalKey, [212, 315, 370, 415, 460]], + ['ANIMAL:URSUS_AMERICANUS_HEADING' as AnimalKey, [100, 409, 437, 457, 477]], + ['ANIMAL:URSUS_ARCTOS_HEADING' as AnimalKey, [280, 362, 405, 435, 467]], + [ + 'ANIMAL:URSUS_ARCTOS_MIDDENDORFFI_HEADING' as AnimalKey, + [280, 340, 390, 426, 462], + ], + ['ANIMAL:VULPES_VULPES_HEADING' as AnimalKey, [296, 386, 430, 459, 483]], + ['ANIMAL:SAMBAR_DEER_HEADING' as AnimalKey, [100, 260, 340, 400, 460]], + ['ANIMAL:EGYPTIAN_GOOSE_HEADING' as AnimalKey, [199, 312, 370, 415, 456]], + ['ANIMAL:EUROPEAN_RABBIT_HEADING' as AnimalKey, [80, 237, 331, 394, 458]], + [ + 'ANIMAL:HELMETED_GUINEAFOWL_HEADING' as AnimalKey, + [190, 313, 375, 422, 469], + ], + ['ANIMAL:HONEY_BADGER_HEADING' as AnimalKey, [379, 422, 451, 474, 488]], + ['ANIMAL:SIKA_DEER_HEADING' as AnimalKey, [118, 212, 327, 403, 464]], + ['ANIMAL:HIMALAYAN_TAHR_HEADING' as AnimalKey, [263, 355, 400, 437, 465]], + ['ANIMAL:FERAL_GOAT_HEADING' as AnimalKey, [260, 350, 396, 430, 464]], + ['ANIMAL:FERAL_PIG_HEADING' as AnimalKey, [243, 342, 391, 426, 463]], + ['ANIMAL:RED_STAG_HEADING' as AnimalKey, [100, 260, 340, 400, 460]], + ['ANIMAL:CAPE_BUFFALO_HEADING' as AnimalKey, [280, 363, 406, 438, 470]], + ['ANIMAL:SPRINGBOK_HEADING' as AnimalKey, [267, 327, 379, 419, 458]], + ['ANIMAL:SPOTTED_HYENA_HEADING' as AnimalKey, [373, 422, 448, 468, 487]], + ['ANIMAL:BLACK_WILDEBEEST_HEADING' as AnimalKey, [267, 355, 399, 435, 466]], + ['ANIMAL:BLUE_WILDEBEEST_HEADING' as AnimalKey, [290, 370, 410, 441, 470]], + ['ANIMAL:COMMON_WARTHOG_HEADING' as AnimalKey, [111, 256, 330, 387, 441]], + ['ANIMAL:GREATER_KUDU_HEADING' as AnimalKey, [210, 330, 390, 440, 472]], + ['ANIMAL:LION_HEADING' as AnimalKey, [380, 422, 447, 466, 488]], + ['ANIMAL:GEMSBOK_HEADING' as AnimalKey, [210, 319, 375, 418, 458]], +]); diff --git a/src/scripts/companion/data/firearmsMagazineSizes.ts b/src/scripts/companion/data/firearmsMagazineSizes.ts new file mode 100644 index 00000000..c6f38421 --- /dev/null +++ b/src/scripts/companion/data/firearmsMagazineSizes.ts @@ -0,0 +1,39 @@ +import type { TranslationKey } from 'types/i18n'; + +type Filtered = T extends `WEAPON:${infer _}_HEADING` ? T : never; +export type WeaponKey = Filtered; + +export const magazineSizesMap = new Map([ + ['WEAPON:CROSSBOW_01_HEADING', 1], + ['WEAPON:CROSSBOW_02_HEADING', 1], + ['WEAPON:CROSSBOW_03_HEADING', 1], + ['WEAPON:CROSSBOW_04_HEADING', 1], + ['WEAPON:BOW_01_HEADING', 1], + ['WEAPON:BOW_02_HEADING', 1], + ['WEAPON:BOW_03_HEADING', 1], + ['WEAPON:BOW_04_HEADING', 1], + ['WEAPON:RIFLE_BOLT_01_HEADING', 4], + ['WEAPON:RIFLE_BOLT_02_HEADING', 4], + ['WEAPON:RIFLE_BOLT_04_HEADING', 4], + ['WEAPON:RIFLE_BOLT_05_HEADING', 5], + ['WEAPON:RIFLE_BOLT_06_HEADING', 4], + ['WEAPON:RIFLE_BOLT_06_02_HEADING', 4], + ['WEAPON:RIFLE_BOLT_07_HEADING', 3], + ['WEAPON:RIFLE_BOLT_08_HEADING', 5], + ['WEAPON:RIFLE_BOLT_09_HEADING', 3], + ['WEAPON:RIFLE_BOLT_09_FULLSTOCK_01_HEADING', 4], + ['WEAPON:RIFLE_BOLT_11_HEADING', 3], + ['WEAPON:RIFLE_BOLT_12_HEADING', 3], + ['WEAPON:RIFLE_BOLT_14_HEADING', 5], + ['WEAPON:RIFLE_BOLT_17_HEADING', 10], + ['WEAPON:RIFLE_BOLT_19_HEADING', 4], + ['WEAPON:RIFLE_LEVER_01_HEADING', 6], + ['WEAPON:RIFLE_PUMP_01_HEADING', 4], + ['WEAPON:RIFLE_SEMI_01_HEADING', 10], + ['WEAPON:SHOTGUN_BREAK_01_HEADING', 2], + ['WEAPON:SHOTGUN_BREAK_02_HEADING', 2], + ['WEAPON:SHOTGUN_BREAK_03_HEADING', 2], + ['WEAPON:SHOTGUN_PUMP_01_HEADING', 4], + ['WEAPON:SHOTGUN_SEMI_01_HEADING', 4], + ['WEAPON:SHOTGUN_SEMI_02_HEADING', 3], +]); diff --git a/src/scripts/companion/firearms.ts b/src/scripts/companion/firearms.ts index a809123d..7f2bd255 100644 --- a/src/scripts/companion/firearms.ts +++ b/src/scripts/companion/firearms.ts @@ -1,19 +1,20 @@ import { weapons } from 'config/weapons'; -import type { TranslationKey } from 'types/i18n'; +import { type WeaponKey, magazineSizesMap } from './data/firearmsMagazineSizes'; -type Filtered = T extends `WEAPON:${infer _}_HEADING` ? T : never; -type WeaponKey = Filtered; +export default weapons.map(entry => { + const caliber = entry.heading.startsWith('WEAPON:BOW') + ? 'WEAPON:BOW_00_CALIBER' + : entry.caliber; + const magazineSize = magazineSizesMap.get(entry.heading as WeaponKey) ?? -1; -const magSizeMap = new Map([ - ['WEAPON:CROSSBOW_03_HEADING', 1], - // To be populated with the remaining entries... -]); - -export default weapons.map(entry => ({ - ID: entry.heading, - ACTION: entry.action, - CALIBER: entry.caliber, - ENERGY: entry.hitEnergy, - MAG: magSizeMap.get(entry.heading as WeaponKey) ?? -1, - TIER: entry.tier, -})); + return { + ID: entry.heading, + ACTION: entry.action, + CALIBER: caliber, + ...(entry.hitEnergy.every(value => value === 0) + ? {} + : { ENERGY: entry.hitEnergy }), + MAG: magazineSize, + TIER: entry.tier, + }; +}); diff --git a/src/scripts/companion/firearms/calibers.ts b/src/scripts/companion/firearms/calibers.ts index a96d892f..b6e02241 100644 --- a/src/scripts/companion/firearms/calibers.ts +++ b/src/scripts/companion/firearms/calibers.ts @@ -7,7 +7,9 @@ const set = weapons.reduce( new Set(), ); -export default [...set] +const extraBowCaliber = 'WEAPON:BOW_00_CALIBER'; + +export default [...set, extraBowCaliber] .filter(value => !!value) .map(translationKey => ({ ID: translationKey, diff --git a/src/scripts/companion/index.ts b/src/scripts/companion/index.ts index a9c56eac..8c2f6401 100644 --- a/src/scripts/companion/index.ts +++ b/src/scripts/companion/index.ts @@ -6,10 +6,7 @@ import process from 'process'; const outputDir = path.join(process.cwd(), '.companion'); const writeFile = (name: string, data: unknown) => - fs.writeFileSync( - path.join(outputDir, name), - JSON.stringify(data, undefined, 2), - ); + fs.writeFileSync(path.join(outputDir, name), JSON.stringify(data)); // Ensure output directory exists before proceeding if (!fs.existsSync(outputDir)) { diff --git a/src/scripts/companion/reserves/areas.ts b/src/scripts/companion/reserves/areas.ts index b623baaf..c754a427 100644 --- a/src/scripts/companion/reserves/areas.ts +++ b/src/scripts/companion/reserves/areas.ts @@ -6,14 +6,27 @@ import { mapLabels as newZealandLabels } from 'config/new-zealand'; import { mapLabels as transylvaniaLabels } from 'config/transylvania'; import type { MapLabelOptions, MapType } from 'types/cartography'; +type Coords = [number, number]; + +const clampCoords = (coords: Coords): Coords => { + const clampedX = coords[0] < 0.1 ? 0.1 : coords[0] > 0.9 ? 0.9 : coords[0]; + const clampedY = + coords[1] < 0.05 ? 0.05 : coords[1] > 0.95 ? 0.95 : coords[1]; + return [clampedX, clampedY]; +}; + const createOutput = (labels: MapLabelOptions[], mapType: MapType) => - labels.map(label => ({ - ID: label.name, - RESERVE: mapTypeTranslationMap.get(mapType), - HABITAT: label.habitat, - X: label.coords[0], - Y: label.coords[1], - })); + labels.map(label => { + const [clampedX, clampedY] = clampCoords(label.coords as Coords); + + return { + ID: label.name, + RESERVE: mapTypeTranslationMap.get(mapType), + HABITAT: label.habitat, + X: clampedX, + Y: clampedY, + }; + }); // eslint-disable-next-line import/no-anonymous-default-export export default [ diff --git a/src/scripts/companion/reserves/buildings.ts b/src/scripts/companion/reserves/buildings.ts index 9fdab558..e61633cc 100644 --- a/src/scripts/companion/reserves/buildings.ts +++ b/src/scripts/companion/reserves/buildings.ts @@ -10,21 +10,20 @@ import { genericMarkers as transylvaniaLabels } from 'config/transylvania'; import type { MapType } from 'types/cartography'; import type { MarkerOptionsGeneric, MarkerTypeGeneric } from 'types/markers'; -const validTypes: MarkerTypeGeneric[] = ['camp', 'hunting stand', 'lodge']; - -const typeMap = new Map([ - ['lodge', 0], - ['camp', 1], - ['hunting stand', 2], -]); +const validTypes: MarkerTypeGeneric[] = [ + 'camp', + 'hunting stand', + 'lodge', + 'cabin', +]; const createOutput = (markers: MarkerOptionsGeneric[], mapType: MapType) => markers .filter(marker => validTypes.includes(marker.type)) .map(marker => ({ - ID: genericMarkerTranslationMap.get(marker.type), + ID: marker.id, + BUILDING: genericMarkerTranslationMap.get(marker.type), RESERVE: mapTypeTranslationMap.get(mapType), - TYPE: typeMap.get(marker.type), X: marker.coords[0], Y: marker.coords[1], })); diff --git a/src/scripts/companion/reserves/zones.ts b/src/scripts/companion/reserves/zones.ts index edefbc55..d917a33c 100644 --- a/src/scripts/companion/reserves/zones.ts +++ b/src/scripts/companion/reserves/zones.ts @@ -23,17 +23,17 @@ const getAnimalTranslationKey = (type: MarkerTypeAnimal) => const createOutput = (markers: MarkerOptionsAnimal[], mapType: MapType) => markers.map(marker => ({ - ID: getAnimalTranslationKey(marker.type), + ID: marker.id, + ANIMAL: getAnimalTranslationKey(marker.type), RESERVE: mapTypeTranslationMap.get(mapType), X: marker.coords[0], Y: marker.coords[1], - ZONES: [ - [...marker.eat, ...marker.drink, ...marker.sleep].map(zone => ({ - TYPE: zoneMap.get(zone.type), - X: zone.coords[0], - Y: zone.coords[1], - })), - ], + ZONES: [...marker.eat, ...marker.drink, ...marker.sleep].map(zone => ({ + ID: zone.id, + TYPE: zoneMap.get(zone.type), + X: zone.coords[0], + Y: zone.coords[1], + })), })); // eslint-disable-next-line import/no-anonymous-default-export