Skip to content

Commit 08e8b5b

Browse files
authored
Moving companion application files to the main branch (#15)
2 parents 9cbca04 + 54ee472 commit 08e8b5b

File tree

10 files changed

+212
-63
lines changed

10 files changed

+212
-63
lines changed

.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,3 @@ next-env.d.ts
4040

4141
# files generated by export:* NPM scripts for the companion app
4242
/.companion
43-
/animals.json
44-
/weapons.json

src/scripts/companion/animals.ts

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
import { fauna } from 'config/animals';
22
import en from 'locales';
3-
import type { TranslationKey } from 'types/i18n';
3+
import type { AnimalKey } from './data/animalsTrophyRanges';
4+
import { trophyRangesMap } from './data/animalsTrophyRanges';
45

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

8-
const trophyMap = new Map<AnimalKey, [number, number, number, number]>([
9-
['ANIMAL:ALCES_AMERICANUS_HEADING', [284, 361, 411, 459]],
10-
// To be populated with the remaining entries...
11-
]);
12-
13-
export default fauna.map(entry => ({
14-
ID: entry.heading,
15-
LATIN: en[entry.latin],
16-
MIN: entry.hitEnergy[0],
17-
MAX: entry.hitEnergy[1],
18-
TIER: entry.tier,
19-
TROPHY: trophyMap.get(entry.heading as AnimalKey) ?? [],
20-
}));
9+
return {
10+
ID: entry.heading,
11+
LATIN: en[entry.latin],
12+
MIN: entry.hitEnergy[0],
13+
MAX: entry.hitEnergy[1],
14+
TIER: entry.tier,
15+
...(trophy !== null ? { TROPHY: trophy } : {}),
16+
};
17+
});
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import type { TranslationKey } from 'types/i18n';
2+
3+
type Filtered<T> = T extends `ANIMAL:${infer _}_HEADING` ? T : never;
4+
export type AnimalKey = Filtered<TranslationKey>;
5+
type TrophyArray = [number, number, number, number, number];
6+
7+
export const trophyRangesMap = new Map<AnimalKey, TrophyArray | null>([
8+
['ANIMAL:ALCES_AMERICANUS_HEADING' as AnimalKey, [100, 284, 361, 411, 459]],
9+
[
10+
'ANIMAL:ALCES_AMERICANUS_GIGAS_HEADING' as AnimalKey,
11+
[100, 285, 362, 412, 460],
12+
],
13+
['ANIMAL:ANAS_PLATYRHYNCHOS_HEADING' as AnimalKey, [180, 300, 359, 409, 460]],
14+
['ANIMAL:ANSER_ANSER_HEADING' as AnimalKey, [164, 295, 358, 407, 450]],
15+
['ANIMAL:ANSER_ROSSII_HEADING' as AnimalKey, [180, 268, 339, 395, 446]],
16+
['ANIMAL:AYTHYA_AFFINIS_HEADING' as AnimalKey, [164, 319, 377, 419, 456]],
17+
[
18+
'ANIMAL:BISON_BISON_ATHABASCAE_HEADING' as AnimalKey,
19+
[100, 309, 371, 418, 458],
20+
],
21+
['ANIMAL:CANIS_AUREUS_HEADING' as AnimalKey, [360, 412, 443, 465, 483]],
22+
['ANIMAL:CANIS_LUPUS_HEADING' as AnimalKey, [336, 400, 436, 461, 483]],
23+
[
24+
'ANIMAL:CAPREOLUS_CAPREOLUS_HEADING' as AnimalKey,
25+
[164, 297, 368, 423, 466],
26+
],
27+
['ANIMAL:CERVUS_CANADENSIS_HEADING' as AnimalKey, [100, 284, 356, 408, 459]],
28+
[
29+
'ANIMAL:CERVUS_CANADENSIS_ROOSEVELTI_HEADING' as AnimalKey,
30+
[146, 285, 357, 409, 460],
31+
],
32+
['ANIMAL:CERVUS_ELAPHUS_HEADING' as AnimalKey, [100, 259, 339, 399, 459]],
33+
['ANIMAL:DAMA_DAMA_HEADING' as AnimalKey, [100, 284, 356, 408, 459]],
34+
['ANIMAL:LEPUS_AMERICANUS_HEADING' as AnimalKey, [326, 394, 429, 465, 485]],
35+
['ANIMAL:LEPUS_EUROPAEUS_HEADING' as AnimalKey, [80, 237, 331, 394, 458]],
36+
[
37+
'ANIMAL:MELANITTA_PERSPICILLATA_HEADING' as AnimalKey,
38+
[180, 345, 402, 439, 469],
39+
],
40+
['ANIMAL:MELES_MELES_HEADING' as AnimalKey, [274, 362, 404, 435, 467]],
41+
[
42+
'ANIMAL:ODOCOILEUS_HEMIONUS_HEADING' as AnimalKey,
43+
[100, 264, 339, 399, 459],
44+
],
45+
[
46+
'ANIMAL:ODOCOILEUS_HEMIONUS_SITKENSIS_HEADING' as AnimalKey,
47+
[118, 212, 327, 403, 464],
48+
],
49+
[
50+
'ANIMAL:ODOCOILEUS_VIRGINIANUS_HEADING' as AnimalKey,
51+
[118, 283, 350, 417, 460],
52+
],
53+
[
54+
'ANIMAL:OREAMNOS_AMERICANUS_HEADING' as AnimalKey,
55+
[260, 350, 396, 430, 464],
56+
],
57+
['ANIMAL:OVIS_CANADENSIS_HEADING' as AnimalKey, [229, 330, 388, 417, 460]],
58+
['ANIMAL:OVIS_MUSIMON_HEADING' as AnimalKey, [253, 335, 380, 421, 470]],
59+
[
60+
'ANIMAL:PHASIANUS_COLCHICUS_HEADING' as AnimalKey,
61+
[100, 329, 384, 429, 459],
62+
],
63+
[
64+
'ANIMAL:RANGIFER_TARANDUS_GROENLANDICUS_HEADING' as AnimalKey,
65+
[100, 255, 350, 423, 460],
66+
],
67+
[
68+
'ANIMAL:RUPICAPRA_RUPICAPRA_HEADING' as AnimalKey,
69+
[263, 355, 400, 437, 465],
70+
],
71+
['ANIMAL:SUS_SCROFA_HEADING' as AnimalKey, [243, 342, 391, 426, 463]],
72+
['ANIMAL:TAXIDEA_TAXUS_HEADING' as AnimalKey, [212, 315, 370, 415, 460]],
73+
['ANIMAL:URSUS_AMERICANUS_HEADING' as AnimalKey, [100, 409, 437, 457, 477]],
74+
['ANIMAL:URSUS_ARCTOS_HEADING' as AnimalKey, [280, 362, 405, 435, 467]],
75+
[
76+
'ANIMAL:URSUS_ARCTOS_MIDDENDORFFI_HEADING' as AnimalKey,
77+
[280, 340, 390, 426, 462],
78+
],
79+
['ANIMAL:VULPES_VULPES_HEADING' as AnimalKey, [296, 386, 430, 459, 483]],
80+
['ANIMAL:SAMBAR_DEER_HEADING' as AnimalKey, [100, 260, 340, 400, 460]],
81+
['ANIMAL:EGYPTIAN_GOOSE_HEADING' as AnimalKey, [199, 312, 370, 415, 456]],
82+
['ANIMAL:EUROPEAN_RABBIT_HEADING' as AnimalKey, [80, 237, 331, 394, 458]],
83+
[
84+
'ANIMAL:HELMETED_GUINEAFOWL_HEADING' as AnimalKey,
85+
[190, 313, 375, 422, 469],
86+
],
87+
['ANIMAL:HONEY_BADGER_HEADING' as AnimalKey, [379, 422, 451, 474, 488]],
88+
['ANIMAL:SIKA_DEER_HEADING' as AnimalKey, [118, 212, 327, 403, 464]],
89+
['ANIMAL:HIMALAYAN_TAHR_HEADING' as AnimalKey, [263, 355, 400, 437, 465]],
90+
['ANIMAL:FERAL_GOAT_HEADING' as AnimalKey, [260, 350, 396, 430, 464]],
91+
['ANIMAL:FERAL_PIG_HEADING' as AnimalKey, [243, 342, 391, 426, 463]],
92+
['ANIMAL:RED_STAG_HEADING' as AnimalKey, [100, 260, 340, 400, 460]],
93+
['ANIMAL:CAPE_BUFFALO_HEADING' as AnimalKey, [280, 363, 406, 438, 470]],
94+
['ANIMAL:SPRINGBOK_HEADING' as AnimalKey, [267, 327, 379, 419, 458]],
95+
['ANIMAL:SPOTTED_HYENA_HEADING' as AnimalKey, [373, 422, 448, 468, 487]],
96+
['ANIMAL:BLACK_WILDEBEEST_HEADING' as AnimalKey, [267, 355, 399, 435, 466]],
97+
['ANIMAL:BLUE_WILDEBEEST_HEADING' as AnimalKey, [290, 370, 410, 441, 470]],
98+
['ANIMAL:COMMON_WARTHOG_HEADING' as AnimalKey, [111, 256, 330, 387, 441]],
99+
['ANIMAL:GREATER_KUDU_HEADING' as AnimalKey, [210, 330, 390, 440, 472]],
100+
['ANIMAL:LION_HEADING' as AnimalKey, [380, 422, 447, 466, 488]],
101+
['ANIMAL:GEMSBOK_HEADING' as AnimalKey, [210, 319, 375, 418, 458]],
102+
]);
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import type { TranslationKey } from 'types/i18n';
2+
3+
type Filtered<T> = T extends `WEAPON:${infer _}_HEADING` ? T : never;
4+
export type WeaponKey = Filtered<TranslationKey>;
5+
6+
export const magazineSizesMap = new Map<WeaponKey, number>([
7+
['WEAPON:CROSSBOW_01_HEADING', 1],
8+
['WEAPON:CROSSBOW_02_HEADING', 1],
9+
['WEAPON:CROSSBOW_03_HEADING', 1],
10+
['WEAPON:CROSSBOW_04_HEADING', 1],
11+
['WEAPON:BOW_01_HEADING', 1],
12+
['WEAPON:BOW_02_HEADING', 1],
13+
['WEAPON:BOW_03_HEADING', 1],
14+
['WEAPON:BOW_04_HEADING', 1],
15+
['WEAPON:RIFLE_BOLT_01_HEADING', 4],
16+
['WEAPON:RIFLE_BOLT_02_HEADING', 4],
17+
['WEAPON:RIFLE_BOLT_04_HEADING', 4],
18+
['WEAPON:RIFLE_BOLT_05_HEADING', 5],
19+
['WEAPON:RIFLE_BOLT_06_HEADING', 4],
20+
['WEAPON:RIFLE_BOLT_06_02_HEADING', 4],
21+
['WEAPON:RIFLE_BOLT_07_HEADING', 3],
22+
['WEAPON:RIFLE_BOLT_08_HEADING', 5],
23+
['WEAPON:RIFLE_BOLT_09_HEADING', 3],
24+
['WEAPON:RIFLE_BOLT_09_FULLSTOCK_01_HEADING', 4],
25+
['WEAPON:RIFLE_BOLT_11_HEADING', 3],
26+
['WEAPON:RIFLE_BOLT_12_HEADING', 3],
27+
['WEAPON:RIFLE_BOLT_14_HEADING', 5],
28+
['WEAPON:RIFLE_BOLT_17_HEADING', 10],
29+
['WEAPON:RIFLE_BOLT_19_HEADING', 4],
30+
['WEAPON:RIFLE_LEVER_01_HEADING', 6],
31+
['WEAPON:RIFLE_PUMP_01_HEADING', 4],
32+
['WEAPON:RIFLE_SEMI_01_HEADING', 10],
33+
['WEAPON:SHOTGUN_BREAK_01_HEADING', 2],
34+
['WEAPON:SHOTGUN_BREAK_02_HEADING', 2],
35+
['WEAPON:SHOTGUN_BREAK_03_HEADING', 2],
36+
['WEAPON:SHOTGUN_PUMP_01_HEADING', 4],
37+
['WEAPON:SHOTGUN_SEMI_01_HEADING', 4],
38+
['WEAPON:SHOTGUN_SEMI_02_HEADING', 3],
39+
]);

src/scripts/companion/firearms.ts

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
import { weapons } from 'config/weapons';
2-
import type { TranslationKey } from 'types/i18n';
2+
import type { WeaponKey } from './data/firearmsMagazineSizes';
3+
import { magazineSizesMap } from './data/firearmsMagazineSizes';
34

4-
type Filtered<T> = T extends `WEAPON:${infer _}_HEADING` ? T : never;
5-
type WeaponKey = Filtered<TranslationKey>;
5+
export default weapons.map(entry => {
6+
const caliber = entry.heading.startsWith('WEAPON:BOW')
7+
? 'WEAPON:BOW_00_CALIBER'
8+
: entry.caliber;
9+
const magazineSize = magazineSizesMap.get(entry.heading as WeaponKey) ?? -1;
610

7-
const magSizeMap = new Map<WeaponKey, number>([
8-
['WEAPON:CROSSBOW_03_HEADING', 1],
9-
// To be populated with the remaining entries...
10-
]);
11-
12-
export default weapons.map(entry => ({
13-
ID: entry.heading,
14-
ACTION: entry.action,
15-
CALIBER: entry.caliber,
16-
ENERGY: entry.hitEnergy,
17-
MAG: magSizeMap.get(entry.heading as WeaponKey) ?? -1,
18-
TIER: entry.tier,
19-
}));
11+
return {
12+
ID: entry.heading,
13+
ACTION: entry.action,
14+
CALIBER: caliber,
15+
...(entry.hitEnergy.every(value => value === 0)
16+
? {}
17+
: { ENERGY: entry.hitEnergy }),
18+
MAG: magazineSize,
19+
TIER: entry.tier,
20+
};
21+
});

src/scripts/companion/firearms/calibers.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ const set = weapons.reduce(
77
new Set<TranslationKey | undefined>(),
88
);
99

10-
export default [...set]
10+
const extraBowCaliber = 'WEAPON:BOW_00_CALIBER';
11+
12+
export default [...set, extraBowCaliber]
1113
.filter(value => !!value)
1214
.map(translationKey => ({
1315
ID: translationKey,

src/scripts/companion/index.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ import process from 'process';
66
const outputDir = path.join(process.cwd(), '.companion');
77

88
const writeFile = (name: string, data: unknown) =>
9-
fs.writeFileSync(
10-
path.join(outputDir, name),
11-
JSON.stringify(data, undefined, 2),
12-
);
9+
fs.writeFileSync(path.join(outputDir, name), JSON.stringify(data));
1310

1411
// Ensure output directory exists before proceeding
1512
if (!fs.existsSync(outputDir)) {

src/scripts/companion/reserves/areas.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,27 @@ import { mapLabels as newZealandLabels } from 'config/new-zealand';
66
import { mapLabels as transylvaniaLabels } from 'config/transylvania';
77
import type { MapLabelOptions, MapType } from 'types/cartography';
88

9+
type Coords = [number, number];
10+
11+
const clampCoords = (coords: Coords): Coords => {
12+
const clampedX = coords[0] < 0.1 ? 0.1 : coords[0] > 0.9 ? 0.9 : coords[0];
13+
const clampedY =
14+
coords[1] < 0.05 ? 0.05 : coords[1] > 0.95 ? 0.95 : coords[1];
15+
return [clampedX, clampedY];
16+
};
17+
918
const createOutput = (labels: MapLabelOptions[], mapType: MapType) =>
10-
labels.map(label => ({
11-
ID: label.name,
12-
RESERVE: mapTypeTranslationMap.get(mapType),
13-
HABITAT: label.habitat,
14-
X: label.coords[0],
15-
Y: label.coords[1],
16-
}));
19+
labels.map(label => {
20+
const [clampedX, clampedY] = clampCoords(label.coords as Coords);
21+
22+
return {
23+
ID: label.name,
24+
RESERVE: mapTypeTranslationMap.get(mapType),
25+
HABITAT: label.habitat,
26+
X: clampedX,
27+
Y: clampedY,
28+
};
29+
});
1730

1831
// eslint-disable-next-line import/no-anonymous-default-export
1932
export default [

src/scripts/companion/reserves/buildings.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,20 @@ import { genericMarkers as transylvaniaLabels } from 'config/transylvania';
1010
import type { MapType } from 'types/cartography';
1111
import type { MarkerOptionsGeneric, MarkerTypeGeneric } from 'types/markers';
1212

13-
const validTypes: MarkerTypeGeneric[] = ['camp', 'hunting stand', 'lodge'];
14-
15-
const typeMap = new Map<MarkerTypeGeneric, number>([
16-
['lodge', 0],
17-
['camp', 1],
18-
['hunting stand', 2],
19-
]);
13+
const validTypes: MarkerTypeGeneric[] = [
14+
'camp',
15+
'hunting stand',
16+
'lodge',
17+
'cabin',
18+
];
2019

2120
const createOutput = (markers: MarkerOptionsGeneric[], mapType: MapType) =>
2221
markers
2322
.filter(marker => validTypes.includes(marker.type))
2423
.map(marker => ({
25-
ID: genericMarkerTranslationMap.get(marker.type),
24+
ID: marker.id,
25+
BUILDING: genericMarkerTranslationMap.get(marker.type),
2626
RESERVE: mapTypeTranslationMap.get(mapType),
27-
TYPE: typeMap.get(marker.type),
2827
X: marker.coords[0],
2928
Y: marker.coords[1],
3029
}));

src/scripts/companion/reserves/zones.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,17 @@ const getAnimalTranslationKey = (type: MarkerTypeAnimal) =>
2323

2424
const createOutput = (markers: MarkerOptionsAnimal[], mapType: MapType) =>
2525
markers.map(marker => ({
26-
ID: getAnimalTranslationKey(marker.type),
26+
ID: marker.id,
27+
ANIMAL: getAnimalTranslationKey(marker.type),
2728
RESERVE: mapTypeTranslationMap.get(mapType),
2829
X: marker.coords[0],
2930
Y: marker.coords[1],
30-
ZONES: [
31-
[...marker.eat, ...marker.drink, ...marker.sleep].map(zone => ({
32-
TYPE: zoneMap.get(zone.type),
33-
X: zone.coords[0],
34-
Y: zone.coords[1],
35-
})),
36-
],
31+
ZONES: [...marker.eat, ...marker.drink, ...marker.sleep].map(zone => ({
32+
ID: zone.id,
33+
TYPE: zoneMap.get(zone.type),
34+
X: zone.coords[0],
35+
Y: zone.coords[1],
36+
})),
3737
}));
3838

3939
// eslint-disable-next-line import/no-anonymous-default-export

0 commit comments

Comments
 (0)