Skip to content

Commit

Permalink
Updated companion application file generation scripts (#14)
Browse files Browse the repository at this point in the history
  • Loading branch information
codeaid committed Jun 27, 2024
2 parents 9cbca04 + 2e98c13 commit d24f850
Show file tree
Hide file tree
Showing 10 changed files with 210 additions and 63 deletions.
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,5 +40,3 @@ next-env.d.ts

# files generated by export:* NPM scripts for the companion app
/.companion
/animals.json
/weapons.json
28 changes: 12 additions & 16 deletions src/scripts/companion/animals.ts
Original file line number Diff line number Diff line change
@@ -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';

Check failure on line 3 in src/scripts/companion/animals.ts

View workflow job for this annotation

GitHub Actions / Install dependencies

Prefer using a top-level type-only import instead of inline type specifiers

type Filtered<T> = T extends `ANIMAL:${infer _}_HEADING` ? T : never;
type AnimalKey = Filtered<TranslationKey>;
export default fauna.map(entry => {
const trophy = trophyRangesMap.get(entry.heading as AnimalKey);

const trophyMap = new Map<AnimalKey, [number, number, number, number]>([
['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 } : {}),
};
});
102 changes: 102 additions & 0 deletions src/scripts/companion/data/animalsTrophyRanges.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import type { TranslationKey } from 'types/i18n';

type Filtered<T> = T extends `ANIMAL:${infer _}_HEADING` ? T : never;
export type AnimalKey = Filtered<TranslationKey>;
type TrophyArray = [number, number, number, number, number];

export const trophyRangesMap = new Map<AnimalKey, TrophyArray | null>([
['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]],
]);
39 changes: 39 additions & 0 deletions src/scripts/companion/data/firearmsMagazineSizes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import type { TranslationKey } from 'types/i18n';

type Filtered<T> = T extends `WEAPON:${infer _}_HEADING` ? T : never;
export type WeaponKey = Filtered<TranslationKey>;

export const magazineSizesMap = new Map<WeaponKey, number>([
['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],
]);
33 changes: 17 additions & 16 deletions src/scripts/companion/firearms.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
import { weapons } from 'config/weapons';
import type { TranslationKey } from 'types/i18n';
import { type WeaponKey, magazineSizesMap } from './data/firearmsMagazineSizes';

Check failure on line 2 in src/scripts/companion/firearms.ts

View workflow job for this annotation

GitHub Actions / Install dependencies

Prefer using a top-level type-only import instead of inline type specifiers

type Filtered<T> = T extends `WEAPON:${infer _}_HEADING` ? T : never;
type WeaponKey = Filtered<TranslationKey>;
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<WeaponKey, number>([
['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,
};
});
4 changes: 3 additions & 1 deletion src/scripts/companion/firearms/calibers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ const set = weapons.reduce(
new Set<TranslationKey | undefined>(),
);

export default [...set]
const extraBowCaliber = 'WEAPON:BOW_00_CALIBER';

export default [...set, extraBowCaliber]
.filter(value => !!value)
.map(translationKey => ({
ID: translationKey,
Expand Down
5 changes: 1 addition & 4 deletions src/scripts/companion/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down
27 changes: 20 additions & 7 deletions src/scripts/companion/reserves/areas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 [
Expand Down
17 changes: 8 additions & 9 deletions src/scripts/companion/reserves/buildings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<MarkerTypeGeneric, number>([
['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],
}));
Expand Down
16 changes: 8 additions & 8 deletions src/scripts/companion/reserves/zones.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit d24f850

Please sign in to comment.