Skip to content

Commit 508fca1

Browse files
committed
Introduce auto-generated GameXpInfo
1 parent e0391b4 commit 508fca1

File tree

6 files changed

+269
-3
lines changed

6 files changed

+269
-3
lines changed

build/generate_xp_info.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { writeFile } from "fs/promises";
2+
import { GameXpInfo } from "../src/games/info";
3+
import { Game } from "../src/games/data";
4+
import { getGameMetainfo } from "../src/index";
5+
6+
(async () => {
7+
// Ensure order consistency between runs
8+
const xpInfo: Partial<typeof GameXpInfo> = Object.values(Game).reduce(
9+
(xpInfo, game) => {
10+
return { ...xpInfo, [game]: {} };
11+
},
12+
{}
13+
);
14+
15+
await Promise.all(
16+
Object.values(Game).map(async game => {
17+
// The `/game/meta/ground` endpoint returns an error
18+
if (game === Game.GroundWars) {
19+
xpInfo[game] = {
20+
increment: 150,
21+
max: 20
22+
};
23+
return;
24+
}
25+
26+
const metaInfo = await getGameMetainfo(game);
27+
28+
// The Bridge has its own level XP scaling.
29+
const increment =
30+
game === Game.Bridge
31+
? 0
32+
: parseInt(Object.keys(metaInfo.experienceToLevel)[1]);
33+
const maxLevel = Object.keys(metaInfo.experienceToLevel).length;
34+
35+
let incrementCap;
36+
if (game !== Game.Bridge) {
37+
let previousDiff = increment;
38+
39+
for (let level = 2; level < maxLevel; level++) {
40+
const diff =
41+
parseInt(Object.keys(metaInfo.experienceToLevel)[level]) -
42+
parseInt(Object.keys(metaInfo.experienceToLevel)[level - 1]);
43+
if (diff === previousDiff) {
44+
incrementCap = level;
45+
break;
46+
}
47+
previousDiff = diff;
48+
}
49+
}
50+
51+
xpInfo[game] = {
52+
increment: increment,
53+
increment_cap: incrementCap,
54+
max: maxLevel,
55+
max_prestige: metaInfo.allowPrestiging
56+
? metaInfo.maxPrestige
57+
: undefined
58+
};
59+
})
60+
);
61+
62+
await writeFile(
63+
"src/games/xp_info.json",
64+
JSON.stringify(xpInfo, undefined, "\t"),
65+
"utf-8"
66+
);
67+
})();
68+

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",
77
"scripts": {
8-
"build": "tsc",
8+
"generate_xp_info": "ts-node build/generate_xp_info",
9+
"build": "pnpm run generate_xp_info && tsc",
910
"lint": "eslint src"
1011
},
1112
"keywords": [
@@ -23,10 +24,12 @@
2324
},
2425
"homepage": "https://github.com/Paroxity/hive-tools-wrapper",
2526
"devDependencies": {
27+
"@types/node": "^20.12.5",
2628
"@typescript-eslint/eslint-plugin": "^7.3.1",
2729
"@typescript-eslint/parser": "^7.3.1",
2830
"eslint": "^8.57.0",
2931
"prettier": "^3.2.5",
32+
"ts-node": "^10.9.2",
3033
"typescript": "^5.4.2"
3134
}
3235
}

pnpm-lock.yaml

Lines changed: 117 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/games/info.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Game } from "./data";
2+
import _GameXpInfo from "./xp_info.json";
23

34
export const GameInfo: Record<
45
Game,
@@ -169,9 +170,20 @@ export const GameInfo: Record<
169170
year: 2024,
170171
month: 3
171172
}
172-
},
173+
}
173174
};
174175

176+
//@ts-ignore `xp_info.json` will be missing newly added games prior to regenerating the file
177+
export const GameXpInfo: Record<
178+
Game,
179+
{
180+
increment: number;
181+
increment_cap?: number;
182+
max: number;
183+
max_prestige?: number;
184+
}
185+
> = _GameXpInfo;
186+
175187
export type GameMetainfo = {
176188
name: string;
177189
shortName: string;

0 commit comments

Comments
 (0)