@pietrovich/wot-utils 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/.env.example +3 -0
  2. package/LICENSE +13 -0
  3. package/README.md +109 -0
  4. package/dist/assets/fonts/pogs/3px.json5 +102 -0
  5. package/dist/assets/fonts/pogs/4px.json5 +436 -0
  6. package/dist/assets/fonts/pogs/numbers-bold.json5 +106 -0
  7. package/dist/assets/fonts/pogs/numbers.json5 +106 -0
  8. package/dist/assets/pogs/README.md +3 -0
  9. package/dist/assets/pogs/sheild.png +0 -0
  10. package/dist/assets/pogs/short-names.json5 +1133 -0
  11. package/dist/assets/pogs/star.png +0 -0
  12. package/dist/assets/pogs/stripe.png +0 -0
  13. package/dist/assets/pogs-fixed/pre-rendered/bg/at.bg.color.png +0 -0
  14. package/dist/assets/pogs-fixed/pre-rendered/bg/ht.bg.color.png +0 -0
  15. package/dist/assets/pogs-fixed/pre-rendered/bg/lt.bg.color.png +0 -0
  16. package/dist/assets/pogs-fixed/pre-rendered/bg/mt.bg.color.png +0 -0
  17. package/dist/assets/pogs-fixed/pre-rendered/bg/td.bg.color.png +0 -0
  18. package/dist/assets/pogs-fixed/pre-rendered/combined-v1/at.png +0 -0
  19. package/dist/assets/pogs-fixed/pre-rendered/combined-v1/at.prem.png +0 -0
  20. package/dist/assets/pogs-fixed/pre-rendered/combined-v1/generic.png +0 -0
  21. package/dist/assets/pogs-fixed/pre-rendered/combined-v1/generic.prem.png +0 -0
  22. package/dist/assets/pogs-fixed/pre-rendered/combined-v1/ht.png +0 -0
  23. package/dist/assets/pogs-fixed/pre-rendered/combined-v1/ht.prem.png +0 -0
  24. package/dist/assets/pogs-fixed/pre-rendered/combined-v1/lt.png +0 -0
  25. package/dist/assets/pogs-fixed/pre-rendered/combined-v1/lt.prem.png +0 -0
  26. package/dist/assets/pogs-fixed/pre-rendered/combined-v1/mt.png +0 -0
  27. package/dist/assets/pogs-fixed/pre-rendered/combined-v1/mt.prem.png +0 -0
  28. package/dist/assets/pogs-fixed/pre-rendered/combined-v1/td.png +0 -0
  29. package/dist/assets/pogs-fixed/pre-rendered/combined-v1/td.prem.png +0 -0
  30. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/at.clear.png +0 -0
  31. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/at.clear.prem.png +0 -0
  32. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/at.png +0 -0
  33. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/at.prem.png +0 -0
  34. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/ht.clear-prem.png +0 -0
  35. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/ht.clear.png +0 -0
  36. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/ht.clear.prem.png +0 -0
  37. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/ht.png +0 -0
  38. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/ht.prem.png +0 -0
  39. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/lt.clear.png +0 -0
  40. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/lt.clear.prem.png +0 -0
  41. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/lt.png +0 -0
  42. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/lt.prem.png +0 -0
  43. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/mt.clear.png +0 -0
  44. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/mt.clear.prem.png +0 -0
  45. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/mt.png +0 -0
  46. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/mt.prem.png +0 -0
  47. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/td.clear.png +0 -0
  48. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/td.clear.prem.png +0 -0
  49. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/td.png +0 -0
  50. package/dist/assets/pogs-fixed/pre-rendered/combined-v2/td.prem.png +0 -0
  51. package/dist/assets/pogs-fixed/pre-rendered/stripes/generic.png +0 -0
  52. package/dist/assets/pogs-fixed/pre-rendered/stripes/ht.png +0 -0
  53. package/dist/assets/pogs-fixed/pre-rendered/stripes/lt.png +0 -0
  54. package/dist/assets/pogs-fixed/pre-rendered/stripes/mt.png +0 -0
  55. package/dist/assets/pogs-fixed/pre-rendered/stripes/spg.png +0 -0
  56. package/dist/assets/pogs-fixed/pre-rendered/stripes/td.png +0 -0
  57. package/dist/index.js +2958 -0
  58. package/package.json +62 -0
  59. package/scripts/bake-color-dmg-fsr-vr-rld.sh +81 -0
  60. package/scripts/bake-pogs-clear.sh +7 -0
  61. package/scripts/bake-pogs-color-dmg-fsr-vr-rld.sh +7 -0
  62. package/scripts/baker-lib.sh +165 -0
  63. package/scripts/extract-atlas-assets.ps1 +120 -0
  64. package/scripts/extract-atlas-assets.sh +116 -0
  65. package/scripts/replace-suffixed-with-base.sh +44 -0
package/.env.example ADDED
@@ -0,0 +1,3 @@
1
+ WG_APP_ID=WG_APP_ID_HERE
2
+ WG_CACHE_DIR=.data/wg/cache
3
+ TOMATO_API_KEY=YOUR_TOMATO_API_KEY_HERE
package/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
2
+ Version 2, December 2004
3
+
4
+ Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
5
+
6
+ Everyone is permitted to copy and distribute verbatim or modified
7
+ copies of this license document, and changing it is allowed as long
8
+ as the name is changed.
9
+
10
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
11
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
12
+
13
+ 0. You just DO WHAT THE FUCK YOU WANT TO.
package/README.md ADDED
@@ -0,0 +1,109 @@
1
+ # pie-wot
2
+
3
+ A CLI toolkit for World of Tanks modders. Fetches live vehicle data from the Wargaming API, manipulates DDS textures and texture atlases, and generates custom icon sets — all from the terminal, no build step required.
4
+
5
+ The long-term goal is to make it trivial to maintain and publish a custom icon set: when new vehicles are added to the game or tank characteristics change, re-running a handful of commands should be enough to produce an updated, publish-ready set. The [PogS icon set](https://github.com/pavelmaca/WoT-PogsIconSet) by @pavelmaca serves as the reference implementation and first supported style.
6
+
7
+ ## Pre-baked ready to use sets
8
+
9
+ If you just want the icons without running the pipeline yourself, pre-baked sets are published periodically at [pietrovich/wot-pogs-like-icon-sets](https://github.com/pietrovich/wot-pogs-like-icon-sets) and kept in sync with game updates.
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ npm install -g @pietrovich/wot-utils
15
+ cp .env.example .env # add your WG_APP_ID
16
+ ```
17
+
18
+ Get a free application ID at [developers.wargaming.net](https://developers.wargaming.net/).
19
+
20
+ > **Node.js ≥ 24** required.
21
+
22
+ ## Uninstall
23
+
24
+ ```bash
25
+ npm uninstall -g @pietrovich/wot-utils
26
+ ```
27
+
28
+ ## Commands
29
+
30
+ ```
31
+ pie-wot vehicle list # list vehicles from the WG encyclopedia (table)
32
+ pie-wot vehicle export # save full vehicle data to JSON
33
+ pie-wot vehicle fetch-icons # download official vehicle icons
34
+ pie-wot vehicle stats # short-name character statistics
35
+ pie-wot vehicle best-config # best module configuration per vehicle
36
+ pie-wot vehicle chars # character distribution in short names
37
+
38
+ pie-wot atlas inspect <map> # list texture names in an atlas XML
39
+ pie-wot atlas pick <map> <img> # extract a single named texture
40
+ pie-wot atlas extract # extract all textures to a directory
41
+ pie-wot atlas pack # pack a directory of PNGs into a texture atlas
42
+
43
+ pie-wot dds decode <file> # decode a DDS texture to PNG
44
+ pie-wot dds encode <file> # encode a PNG to DXT5/BC3 DDS
45
+
46
+ pie-wot icon dump-background # generate per-type background images (PogS style)
47
+ pie-wot icon render <query> # render a vehicle icon: type background + short name label
48
+
49
+ pie-wot font render [font] [text] # render text as PNG using a pixel font
50
+
51
+ pie-wot cache purge # clear the local API response cache
52
+
53
+ pie-wot bake <script> # run a bundled build script (see below)
54
+ ```
55
+
56
+ Vehicle commands accept `--app-id <id>` (overrides `WG_APP_ID`) and `--no-cache`.
57
+
58
+ ### bake
59
+
60
+ Runs a bundled shell script that drives the full icon-bake pipeline. All arguments after the script name are forwarded to the script unchanged.
61
+
62
+ ```bash
63
+ pie-wot bake clear --src ./in/wot-2.3/ --out ./out/clear
64
+ pie-wot bake color --src ./in/wot-2.3/ --out ./out/color
65
+ ```
66
+
67
+ Available scripts:
68
+
69
+ | Name | Description |
70
+ |------|-------------|
71
+ | `clear` | PogS clear variant (no colour background) |
72
+ | `color` | PogS colour variant with DMG/FSR/VR/RLD labels |
73
+
74
+ ## Development
75
+
76
+ ### Running from source
77
+
78
+ No build step needed — `tsx` runs TypeScript directly:
79
+
80
+ ```bash
81
+ npm start -- <command>
82
+ # e.g.
83
+ npm start -- vehicle list
84
+ ```
85
+
86
+ ### LOCAL_DEV
87
+
88
+ The bundled baker scripts (`scripts/`) detect whether the `pie-wot` global binary is available and use it by default. Set `LOCAL_DEV=true` in your `.env` (or environment) to force them to use `npm start` from the local clone instead:
89
+
90
+ ```
91
+ LOCAL_DEV=true
92
+ ```
93
+
94
+ This is useful when iterating on the CLI itself — changes to `src/` take effect immediately without a publish/reinstall cycle.
95
+
96
+ ## How it works
97
+
98
+ API responses are cached locally (SHA-256 keyed, no TTL) so repeated runs don't hammer the Wargaming API. DDS encode/decode uses a trimmed BC1/BC3 codec derived from [photopea/UTEX.js](https://github.com/photopea/UTEX.js). Image compositing uses [sharp](https://sharp.pixelplumbing.com/).
99
+
100
+ ## Credits
101
+
102
+ - Gradient data and assets for the PogS icon style ported from [WoT-PogsIconSet](https://github.com/pavelmaca/WoT-PogsIconSet) by [@pavelmaca](https://github.com/pavelmaca)
103
+ - DDS codec derived from [photopea/UTEX.js](https://github.com/photopea/UTEX.js) by the Photopea team
104
+
105
+ ---
106
+
107
+ GL, HF
108
+
109
+ [![wtfpl-badge-2.png](wtfpl-badge-2.png)](./LICENSE)
@@ -0,0 +1,102 @@
1
+ {
2
+ "version": "1.0",
3
+ "height": 5,
4
+ "name": "pogs font3",
5
+ "glyphs": {
6
+ "0": [
7
+ "XXX",
8
+ "X X",
9
+ "X X",
10
+ "X X",
11
+ "XXX"
12
+ ],
13
+ "1": [
14
+ "XX",
15
+ " X",
16
+ " X",
17
+ " X",
18
+ " X"
19
+ ],
20
+ "2": [
21
+ "XXX",
22
+ " X",
23
+ "XXX",
24
+ "X",
25
+ "XXX"
26
+ ],
27
+ "3": [
28
+ "XXX",
29
+ " X",
30
+ " XX",
31
+ " X",
32
+ "XXX"
33
+ ],
34
+ "4": [
35
+ "X X",
36
+ "X X",
37
+ "XXX",
38
+ " X",
39
+ " X"
40
+ ],
41
+ "5": [
42
+ "XXX",
43
+ "X",
44
+ "XXX",
45
+ " X",
46
+ "XXX"
47
+ ],
48
+ "6": [
49
+ "XXX",
50
+ "X",
51
+ "XXX",
52
+ "X X",
53
+ "XXX"
54
+ ],
55
+ "7": [
56
+ "XXX",
57
+ " X",
58
+ " X",
59
+ " X",
60
+ " X"
61
+ ],
62
+ "8": [
63
+ "XXX",
64
+ "X X",
65
+ "XXX",
66
+ "X X",
67
+ "XXX"
68
+ ],
69
+ "9": [
70
+ "XXX",
71
+ "X X",
72
+ "XXX",
73
+ " X",
74
+ "XXX"
75
+ ],
76
+ "_": [],
77
+ "-": [
78
+ "",
79
+ "",
80
+ "XX"
81
+ ],
82
+ ".": [
83
+ "",
84
+ "",
85
+ "",
86
+ "",
87
+ "X"
88
+ ],
89
+ " ": [],
90
+ " ": [],
91
+ "*": [
92
+ "",
93
+ "",
94
+ "X"
95
+ ],
96
+ "·": [
97
+ "",
98
+ "",
99
+ "X"
100
+ ]
101
+ }
102
+ }
@@ -0,0 +1,436 @@
1
+ {
2
+ "version": "1.0",
3
+ "height": 5,
4
+ "name": "pogs font4",
5
+ "glyphs": {
6
+ "0": [
7
+ "XXXX",
8
+ "X X",
9
+ "X X",
10
+ "X X",
11
+ "XXXX"
12
+ ],
13
+ "1": [
14
+ "XX",
15
+ " X",
16
+ " X",
17
+ " X",
18
+ " X"
19
+ ],
20
+ "2": [
21
+ "XXXX",
22
+ " X",
23
+ "XXXX",
24
+ "X",
25
+ "XXXX"
26
+ ],
27
+ "3": [
28
+ "XXXX",
29
+ " X",
30
+ " XXX",
31
+ " X",
32
+ "XXXX"
33
+ ],
34
+ "4": [
35
+ "X X",
36
+ "X X",
37
+ "XXXX",
38
+ " X",
39
+ " X"
40
+ ],
41
+ "5": [
42
+ "XXXX",
43
+ "X",
44
+ "XXXX",
45
+ " X",
46
+ "XXXX"
47
+ ],
48
+ "6": [
49
+ "XXX",
50
+ "X",
51
+ "XXXX",
52
+ "X X",
53
+ "XXXX"
54
+ ],
55
+ "7": [
56
+ "XXXX",
57
+ " X",
58
+ " X",
59
+ " X",
60
+ " X"
61
+ ],
62
+ "8": [
63
+ "XXXX",
64
+ "X X",
65
+ "XXXX",
66
+ "X X",
67
+ "XXXX"
68
+ ],
69
+ "9": [
70
+ "XXXX",
71
+ "X X",
72
+ "XXXX",
73
+ " X",
74
+ " X"
75
+ ],
76
+ "_": [],
77
+ "-": [
78
+ "",
79
+ "",
80
+ "XXX"
81
+ ],
82
+ "–": [
83
+ "",
84
+ "",
85
+ "XXX"
86
+ ],
87
+ ".": [
88
+ "",
89
+ "",
90
+ "",
91
+ "",
92
+ "X"
93
+ ],
94
+ " ": [" "],
95
+ " ": [" "],
96
+ "a": [
97
+ "XXXX",
98
+ "X X",
99
+ "XXXX",
100
+ "X X",
101
+ "X X"
102
+ ],
103
+ "b": [
104
+ "XXXX",
105
+ "X X",
106
+ "XXXX",
107
+ "X X",
108
+ "XXXX"
109
+ ],
110
+ "c": [
111
+ "XXXX",
112
+ "X",
113
+ "X",
114
+ "X",
115
+ "XXXX"
116
+ ],
117
+ "d": [
118
+ "XXX",
119
+ "X X",
120
+ "X X",
121
+ "X X",
122
+ "XXX"
123
+ ],
124
+ "e": [
125
+ "XXXX",
126
+ "X",
127
+ "XXX",
128
+ "X",
129
+ "XXXX"
130
+ ],
131
+ "f": [
132
+ "XXXX",
133
+ "X",
134
+ "XXX",
135
+ "X",
136
+ "X"
137
+ ],
138
+ "g": [
139
+ "XXXX",
140
+ "X",
141
+ "X XX",
142
+ "X X",
143
+ "XXXX"
144
+ ],
145
+ "h": [
146
+ "X X",
147
+ "X X",
148
+ "XXXX",
149
+ "X X",
150
+ "X X"
151
+ ],
152
+ "i": [
153
+ "X",
154
+ "X",
155
+ "X",
156
+ "X",
157
+ "X"
158
+ ],
159
+ "j": [
160
+ " X",
161
+ " X",
162
+ " X",
163
+ "X X",
164
+ "XXXX"
165
+ ],
166
+ "k": [
167
+ "X X",
168
+ "X X",
169
+ "XX",
170
+ "X X",
171
+ "X X"
172
+ ],
173
+ "l": [
174
+ "X",
175
+ "X",
176
+ "X",
177
+ "X",
178
+ "XXXX"
179
+ ],
180
+ "m": [
181
+ "XXXXX",
182
+ "X X X",
183
+ "X X X",
184
+ "X X X",
185
+ "X X X"
186
+ ],
187
+ "n": [
188
+ "XXXX",
189
+ "X X",
190
+ "X X",
191
+ "X X",
192
+ "X X"
193
+ ],
194
+ "o": [
195
+ "XXXX",
196
+ "X X",
197
+ "X X",
198
+ "X X",
199
+ "XXXX"
200
+ ],
201
+ "p": [
202
+ "XXXX",
203
+ "X X",
204
+ "XXXX",
205
+ "X",
206
+ "X"
207
+ ],
208
+ "q": [
209
+ "XXXXX",
210
+ "X X",
211
+ "X X",
212
+ "X X X",
213
+ "XXXXX",
214
+ " X"
215
+ ],
216
+ "r": [
217
+ "XXXX",
218
+ "X X",
219
+ "XXXX",
220
+ "X X",
221
+ "X X"
222
+ ],
223
+ "s": [
224
+ "XXXX",
225
+ "X",
226
+ "XXXX",
227
+ " X",
228
+ "XXXX"
229
+ ],
230
+ "t": [
231
+ "XXXXX",
232
+ " X",
233
+ " X",
234
+ " X",
235
+ " X"
236
+ ],
237
+ "u": [
238
+ "X X",
239
+ "X X",
240
+ "X X",
241
+ "X X",
242
+ "XXXX"
243
+ ],
244
+ "v": [
245
+ "X X",
246
+ "X X",
247
+ "X X",
248
+ " X X",
249
+ " X"
250
+ ],
251
+ "w": [
252
+ "X X X",
253
+ "X X X",
254
+ "X X X",
255
+ "X X X",
256
+ "XXXXX"
257
+ ],
258
+ "x": [
259
+ "X X",
260
+ " X X",
261
+ " X",
262
+ " X X",
263
+ "X X"
264
+ ],
265
+ "y": [
266
+ "X X",
267
+ " X X",
268
+ " X",
269
+ " X",
270
+ " X"
271
+ ],
272
+ "z": [
273
+ "XXXXX",
274
+ " X",
275
+ " X",
276
+ " X",
277
+ "XXXXX"
278
+ ],
279
+ "(": [
280
+ " X",
281
+ "X",
282
+ "X",
283
+ "X",
284
+ " X"
285
+ ],
286
+ ")": [
287
+ "X",
288
+ " X",
289
+ " X",
290
+ " X",
291
+ "X"
292
+ ],
293
+ "ö": [
294
+ " X X",
295
+ "",
296
+ "XXXX",
297
+ "X X",
298
+ "XXXX"
299
+ ],
300
+ "ä": [
301
+ "X XX",
302
+ " X",
303
+ "XXXX",
304
+ "X X",
305
+ "XXXX"
306
+ ],
307
+ "т": [
308
+ "XXX",
309
+ " X",
310
+ " X",
311
+ " X",
312
+ " X"
313
+ ],
314
+ "а": [
315
+ "XXXX",
316
+ "X X",
317
+ "XXXX",
318
+ "X X",
319
+ "X X"
320
+ ],
321
+ "б": [
322
+ "XXX",
323
+ "X",
324
+ "XXXX",
325
+ "X X",
326
+ "XXXX"
327
+ ],
328
+ "в": [
329
+ "XXX",
330
+ "X X",
331
+ "XXX",
332
+ "X X",
333
+ "XXX"
334
+ ],
335
+ "д": [
336
+ " XX",
337
+ " X X",
338
+ " X X",
339
+ " X X",
340
+ "XXXXX"
341
+ ],
342
+ "і": [
343
+ "X",
344
+ "",
345
+ "X",
346
+ "X",
347
+ "X"
348
+ ],
349
+ "з": [
350
+ "XXXX",
351
+ " X",
352
+ " XX",
353
+ " X",
354
+ "XXXX"
355
+ ],
356
+ "к": [
357
+ "X X",
358
+ "X X",
359
+ "XX",
360
+ "X X",
361
+ "X X"
362
+ ],
363
+ "о": [
364
+ " X",
365
+ "X X",
366
+ "X X",
367
+ "X X",
368
+ " X"
369
+ ],
370
+ "п": [
371
+ "XXX",
372
+ "X X",
373
+ "X X",
374
+ "X X",
375
+ "X X"
376
+ ],
377
+ "р": [
378
+ "XXXX",
379
+ "X X",
380
+ "XXXX",
381
+ "X",
382
+ "X"
383
+ ],
384
+ "/": [
385
+ " X",
386
+ " X",
387
+ " X",
388
+ " X",
389
+ "X"
390
+ ],
391
+ "*": [
392
+ "",
393
+ "",
394
+ "X"
395
+ ],
396
+ "×": [
397
+ "",
398
+ "X X",
399
+ " X",
400
+ "X X"
401
+ ],
402
+ "·": [
403
+ "",
404
+ "",
405
+ "X"
406
+ ],
407
+ "š": [
408
+ "XXXX",
409
+ "X",
410
+ "XXXX",
411
+ " X",
412
+ "XXXX"
413
+ ],
414
+ "á": [
415
+ "XXXX",
416
+ "X X",
417
+ "XXXX",
418
+ "X X",
419
+ "X X"
420
+ ],
421
+ "ô": [
422
+ " XX",
423
+ "",
424
+ "XXXX",
425
+ "X X",
426
+ "XXXX"
427
+ ],
428
+ "ü": [
429
+ " XX",
430
+ "",
431
+ "X X",
432
+ "X X",
433
+ " XXX"
434
+ ]
435
+ }
436
+ }