Compare commits

..
247 Commits
Author SHA1 Message Date
TrèsAbhi 22f42117df feat: more hot garbage 2025-05-26 18:30:00 -05:00
TrèsAbhi 788edf5bdf feat: more hot garbage 2025-05-26 18:29:29 -05:00
TrèsAbhi d0170d53e4 feat: hot garbage 2025-05-26 14:23:00 -05:00
TrèsAbhi ae5e38139b feat: some set info in meta section 2025-05-25 18:49:00 -05:00
TrèsAbhi e38713f365 feat: meta section wallpapers 2025-05-25 18:08:00 -05:00
TrèsAbhi 5903b8130b feat: some of meta section 2025-05-25 18:03:55 -05:00
TrèsAbhi 179ce62a55 feat: strings 2025-05-25 15:18:22 -05:00
TrèsAbhi a2f1593a0e feat: add accessors 2025-05-24 18:41:03 -05:00
TrèsAbhi 6305db7ad6 feat: update to correct branch 2025-05-24 12:28:57 -05:00
TrèsAbhi 5082e1b82b feat: new protos 2025-05-24 12:24:53 -05:00
TrèsAbhi e7ca8f1b10 feat: remove UAssetAPI 2025-05-23 20:05:08 -05:00
tresabhi 0d8a677ac5 Merge branch 'main' into dev 2025-05-21 13:25:49 -05:00
tresabhi a8dc271e0a feat: update to imported base creators 2025-05-21 13:24:02 -05:00
TrèsAbhi f3d6ba68a7 New Crowdin updates (#154)
* New translations en.json (Ukrainian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Japanese)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Polish)

* New translations en.json (Ukrainian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Japanese)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Polish)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (Ukrainian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Japanese)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Polish)

* New translations en.json (Polish)

* New translations en.json (Russian)

* New translations en.json (Ukrainian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Japanese)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Polish)

* New translations en.json (Japanese)

* New translations en.json (Japanese)

* New translations en.json (Chinese Simplified)
2025-05-20 09:04:31 -05:00
TrèsAbhi e68b27bac4 fix: don't return on bot 2025-05-19 17:39:02 -05:00
tresabhi d49eef7308 feat: update uasset 2025-05-19 12:47:49 -05:00
tresabhi 6e630a91aa Merge branch 'main' of https://github.com/tresabhi/blitzkit 2025-05-19 12:47:37 -05:00
tresabhi 2c66e79daf Merge branch 'preview' 2025-05-19 12:47:32 -05:00
TrèsAbhi 9a94a4e371 Update rating-na.yml 2025-05-18 19:00:33 -05:00
TrèsAbhi b1372c998d Update rating-eu.yml 2025-05-18 18:59:44 -05:00
TrèsAbhi 4ed93cb38f Update rating-asia.yml 2025-05-18 18:59:15 -05:00
TrèsAbhi 4d1b175c07 Update averages.yml 2025-05-18 18:58:37 -05:00
TrèsAbhi ecfedc32ad Update assets.yml 2025-05-18 18:58:01 -05:00
TrèsAbhi 9da514c329 Update assets.yml 2025-05-18 11:38:41 -05:00
tresabhi ee5386c925 fix: secrets 2025-05-18 09:58:38 -05:00
tresabhi 1a90e9312d feat: logs 2025-05-18 09:55:02 -05:00
tresabhi 2c7082fe04 feat: fast assets 2025-05-18 09:54:12 -05:00
tresabhi 518a83ee73 fix: bruh what 2025-05-16 23:03:56 -05:00
tresabhi 25c40bcea2 feat: logs 2025-05-16 22:33:31 -05:00
tresabhi f88ac8daf7 feat: more heuristic formats 2025-05-16 22:23:58 -05:00
tresabhi c4be6b78b6 feat: heuristics 2025-05-16 22:23:34 -05:00
tresabhi 2cfc65a990 feat: migrate tanks 2025-05-16 22:11:01 -05:00
tresabhi a8eb751048 feat: migrate tanks search page 2025-05-16 19:20:29 -05:00
tresabhi f030fd53b1 feat: slugs 2025-05-16 19:14:56 -05:00
tresabhi da506083c9 feat: migrate tier list 2025-05-16 18:15:27 -05:00
tresabhi 8bdc4d9b1b fix: sessio 2025-05-16 18:13:57 -05:00
tresabhi e0718d9ebb fix: migrate performance 2025-05-16 18:12:19 -05:00
tresabhi dbf1718d39 fix: migrate guess 2025-05-16 18:09:33 -05:00
tresabhi 84dd13c0ac feat: rename to path 2025-05-16 18:07:15 -05:00
tresabhi fdecef5f9c feat: migrate gallery 2025-05-16 18:06:04 -05:00
tresabhi 198e800958 feat: remove rybbit 2025-05-16 18:02:08 -05:00
tresabhi 29bb8ada06 feat: reduced navbar shadow 2025-05-16 18:01:10 -05:00
tresabhi 662f116afe fix: move guess components to src/components 2025-05-16 18:00:08 -05:00
tresabhi 02f0c078a5 fix: legacy redirect embed pages 2025-05-16 00:07:43 -05:00
tresabhi 4dd1113b6d feat: migrate embed and fix embed not rendering because of no context 2025-05-16 00:03:47 -05:00
tresabhi e656b83719 feat: migrate compare 2025-05-15 23:54:07 -05:00
tresabhi b90b355f8f feat: migrate urls 2025-05-15 23:44:20 -05:00
tresabhi 165a9cd719 feat: logs 2025-05-15 23:31:26 -05:00
tresabhi 5b8da36fb8 feat: effective and persistent angle 2025-05-15 23:21:01 -05:00
tresabhi bbe682fa73 feat: bigger icons 2025-05-15 23:03:10 -05:00
tresabhi af08df1526 feat: ricochet visualizer shell switcher 2025-05-15 23:02:15 -05:00
tresabhi 47a60adac7 feat: disable reload visualizer 2025-05-15 22:46:17 -05:00
tresabhi 10f3bc0026 fix: compare labels 2025-05-15 22:45:09 -05:00
tresabhi e7da1d582f fix: use pitch angle of transition of 15deg 2025-05-15 22:40:09 -05:00
tresabhi df70816f7e fix: use svh 2025-05-15 22:37:58 -05:00
tresabhi 091364d7f3 Merge branch 'main' into dev 2025-05-15 22:35:42 -05:00
tresabhi 753c06eee8 feat: logs 2025-05-07 20:54:24 -05:00
tresabhi 17713243b5 feat: final stuff 2025-05-07 20:51:52 -05:00
tresabhi 4e4f070368 feat: shinier 2025-05-07 19:43:40 -05:00
tresabhi 4064f163ec feat: remove plug 2025-05-07 19:42:49 -05:00
tresabhi b911f64847 feat: out animation 2025-05-07 19:41:47 -05:00
tresabhi b86b6e09d0 feat: font 2025-05-07 19:32:18 -05:00
tresabhi d2e7a477bb feat: fullscreen 2025-05-07 19:16:10 -05:00
tresabhi f9c182e68c feat: hide guess 2025-05-06 21:30:35 -05:00
tresabhi 7c497ab681 feat: more tintgs 2025-05-06 13:59:41 -05:00
tresabhi c840086c11 feat: tints 2025-05-06 13:56:56 -05:00
tresabhi 8649d09a94 feat: shadow 2025-05-06 13:39:07 -05:00
tresabhi c764564a96 feat: outline title 2025-05-06 13:29:40 -05:00
tresabhi ad8cbb96b7 feat: nerd time 2025-05-05 22:54:39 -05:00
tresabhi b409e26ca5 feat: reveal titles 2025-05-05 21:41:45 -05:00
tresabhi fbbfa5307c feat: skip 2025-05-05 21:22:05 -05:00
tresabhi 4165533838 feat: simplier hiding 2025-05-05 21:05:46 -05:00
tresabhi fb47ab3e64 feat: new auto rotate animation 2025-05-04 22:11:41 -05:00
tresabhi 57971453ad feat: stats 2025-05-04 21:45:38 -05:00
tresabhi c8cb490b48 feat: full logic 2025-05-04 21:39:09 -05:00
tresabhi 232f24181f feat: some guessing mechanics 2025-05-04 21:02:50 -05:00
tresabhi 46441d74d8 feat: some baswork 2025-05-04 13:08:28 -05:00
tresabhi a2274a6f0c idk man 2025-05-04 11:24:33 -05:00
tresabhi 0eb2827e7b Merge branch 'main' into dev 2025-05-02 21:28:54 -05:00
TrèsAbhi 41cb3f8511 Update Party3.astro 2025-05-02 09:32:22 -05:00
tresabhi 9405dccee9 feat: even more robust 2025-04-29 16:36:59 -05:00
tresabhi 83b0c6abc3 feat: persistent shells 2025-04-29 16:23:22 -05:00
tresabhi bf1621001b feat: more glow 2025-04-29 00:11:27 -05:00
tresabhi 8a5a4bf696 feat: glow and shells 2025-04-29 00:10:42 -05:00
tresabhi a99cce07dc feat: background 2025-04-28 17:43:29 -05:00
tresabhi d8c26ba24a feat: begennings of reload visuals 2025-04-28 17:21:42 -05:00
imgbot[bot]andImgBotApp f0b393c48f [ImgBot] Optimize images (#152)
*Total -- 1,028.23kb -> 900.50kb (12.42%)

/packages/website/public/assets/images/3d/grid.png -- 610.88kb -> 490.28kb (19.74%)
/packages/website/public/assets/images/icons/aim-caret.png -- 1.93kb -> 1.84kb (4.6%)
/packages/website/public/assets/images/icons/xp-multiplier.png -- 4.54kb -> 4.43kb (2.28%)
/packages/website/public/assets/images/third-party/wotb-news.png -- 404.33kb -> 397.41kb (1.71%)
/packages/website/public/assets/images/icons/custom-shell.png -- 6.55kb -> 6.54kb (0.18%)

Signed-off-by: ImgBotApp <[email protected]>
Co-authored-by: ImgBotApp <[email protected]>
2025-04-26 13:32:03 -05:00
TrèsAbhi d0d205bb93 New Crowdin updates (#150)
* New translations en.json (Ukrainian)

* New translations en.json (Ukrainian)

* New translations en.json (Russian)

* New translations en.json (Ukrainian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Japanese)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Chinese Simplified)

* New translations en.json (Russian)

* New translations en.json (Ukrainian)

* New translations en.json (Ukrainian)

* New translations en.json (Ukrainian)

* New translations en.json (Ukrainian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Japanese)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Russian)

* New translations en.json (French)
2025-04-26 13:31:52 -05:00
tresabhi aeaf52d3ac feat: darker view range 2025-04-24 22:06:28 -05:00
tresabhi e05358952a feat: stat search 2025-04-24 22:04:33 -05:00
tresabhi c1000e1608 feat: more responsive 2025-04-24 20:54:24 -05:00
tresabhi 46c86c5352 feat: more decimal places for dimensios 2025-04-24 20:37:31 -05:00
tresabhi 507b503560 feat: remove units and make ranks softer 2025-04-24 20:35:58 -05:00
tresabhi 37ca981d33 feat: more responsive 2025-04-24 20:24:12 -05:00
tresabhi efe6d2b1a5 feat: better navbar background 2025-04-24 20:07:17 -05:00
tresabhi 9f79f9c1e8 fix: no draggable images 2025-04-22 22:01:36 -05:00
tresabhi 38b4c62777 feat: new maps 2025-04-22 21:56:39 -05:00
tresabhi df1bc56a4c feat: isolate stat sections 2025-04-22 21:22:26 -05:00
tresabhi c3d2b063bc feat: new ricochet visualizer 2025-04-22 21:10:22 -05:00
tresabhi 1b94748668 feat: start of ricochet visual 2 2025-04-22 16:35:49 -05:00
tresabhi f4f804727f feat: slicker design 2025-04-22 14:42:04 -05:00
tresabhi 3729072594 feat: prettier 2025-04-22 14:36:31 -05:00
tresabhi c174f32e15 feat: view range visualizer 2025-04-22 14:35:34 -05:00
tresabhi 2443ecde2f feat: turretless support 2025-04-22 13:10:01 -05:00
tresabhi 9c027b3dde feat: puncture hole 2025-04-22 01:06:38 -05:00
tresabhi 22d794ac65 feat: animations 2025-04-22 00:50:14 -05:00
tresabhi 35073c184e test 2025-04-21 18:39:28 -05:00
tresabhi 4741406e4a fix: include prisma only in bot 2025-04-21 18:30:35 -05:00
tresabhi 24107433c6 fix: use built prisma 2025-04-21 18:24:19 -05:00
tresabhi 05c6fcfb34 fix: inline 2025-04-21 18:21:12 -05:00
tresabhi be7a16d399 feat: lower contrast 2025-04-21 18:19:05 -05:00
tresabhi c7f781dbb2 feat: ricochet visualizer 2025-04-21 18:09:57 -05:00
tresabhi a66c6ebb27 feat: classic styled components 2025-04-21 17:01:32 -05:00
tresabhi 83aeca2e5e Merge branch 'main' into dev 2025-04-21 16:39:49 -05:00
tresabhi 89a3db05d8 Merge branch 'main' of https://github.com/tresabhi/blitzkit 2025-04-21 16:39:08 -05:00
tresabhi 6050145b16 fix: home page hot tanks 2025-04-21 16:39:06 -05:00
tresabhi 77c78741b3 fix: remove unused type 2025-04-21 16:37:29 -05:00
TrèsAbhi f35670d6a8 Update Party3.astro 2025-04-21 14:36:24 -05:00
tresabhi 3392a57480 feat: rotation visualize 2025-04-20 23:00:08 -05:00
tresabhi ed64ee8228 feat: hull traverse visualizer 2025-04-20 22:51:53 -05:00
tresabhi 4f47d6ce85 Merge branch 'main' into dev 2025-04-20 21:35:06 -05:00
tresabhi 92d56ac086 fix: onPointerDown 2025-04-20 21:34:57 -05:00
tresabhi 671b8b60b9 feat: update prisma with custom output 2025-04-20 21:31:15 -05:00
tresabhi ba5a5245d9 feat: update prisma 2025-04-20 21:27:00 -05:00
tresabhi eee262add7 fix: submodules 2025-04-20 21:18:54 -05:00
tresabhi e5eaf3fd75 fix: submodules 2025-04-20 21:18:02 -05:00
tresabhi 5fdc9044ca fix: hero interactibility 2025-04-20 21:16:50 -05:00
tresabhi 0924a77776 fix: mas width for meta section 2025-04-20 21:13:40 -05:00
tresabhi 1a46e176f5 fix: tankopedia title 2025-04-20 21:11:16 -05:00
tresabhi efb8df9769 feat: logs 2025-04-20 21:00:57 -05:00
tresabhi 04e09b84ff feat: skeleton and proper file extensions 2025-04-20 20:49:54 -05:00
tresabhi b52c107af9 feat: parrelel api 2025-04-19 00:48:29 -05:00
tresabhi c5e6f5e2eb feat: glossary cron 2025-04-19 00:47:28 -05:00
tresabhi 365c68aa4d feat: move popular tanks to cron job 2025-04-18 23:57:04 -05:00
tresabhi ff9ec55da6 feat: increase title gap 2025-04-17 13:06:40 -05:00
tresabhi 2a2994ae69 feat: more responsive 2025-04-17 13:00:53 -05:00
tresabhi e3c6497d29 feat: better meta 2025-04-17 00:23:01 -05:00
tresabhi bdc013b4c8 fix: cleaner clear button 2025-04-16 23:34:30 -05:00
tresabhi e20d65d218 feat: darker 2025-04-16 23:22:12 -05:00
tresabhi 8b726c12d9 fix: invalidate frams on reveal 2025-04-16 23:20:44 -05:00
tresabhi da704e6181 feat: transition skeleton 2025-04-16 23:18:24 -05:00
tresabhi 64d346ccb6 feat: in-hero controls 2025-04-15 16:54:36 -05:00
tresabhi c090ad6492 feat: disturb on tab change and no title select 2025-04-15 16:37:10 -05:00
tresabhi 8b6610151e fix: keys 2025-04-15 16:29:14 -05:00
tresabhi 545b655d4e feat: slicker loading 2025-04-15 00:35:12 -05:00
tresabhi 0e6aa734cb feat: advanced jsxTree 2025-04-15 00:11:49 -05:00
tresabhi 2bef96475c feat: quick controls 2025-04-14 23:56:29 -05:00
tresabhi 45938c875f feat: skeleton search 2025-04-14 23:28:35 -05:00
tresabhi 9d916a588d feat: cooler header 2025-04-14 19:26:41 -05:00
tresabhi f0295079cc feat: quiz input angles animaiton 2025-04-14 18:56:02 -05:00
tresabhi 6d8387fa9d feat: foggy transition 2025-04-14 18:52:49 -05:00
tresabhi 7a18de6650 fix: don't reset camera on tab change 2025-04-14 17:30:51 -05:00
tresabhi cc6c4faa2d feat: migration 2025-04-06 22:57:35 -05:00
TrèsAbhi 4253cd3e1b fix: allow 2025-04-06 22:04:01 -05:00
TrèsAbhi 75cf827082 Update website.yml 2025-04-06 19:59:27 -05:00
TrèsAbhi 73c8807f14 no, no, no, NOW all hail pyogenics i messed up the last time 2025-04-06 16:03:04 -05:00
TrèsAbhi 9fac6dd40d all hail pyogenics 2025-04-06 15:53:23 -05:00
TrèsAbhi c06c338536 fix: add env and remove compressors 2025-04-06 10:48:08 -05:00
TrèsAbhi 9258623931 Update astro.config.mjs 2025-04-06 00:12:01 -05:00
tresabhi 3b02c25973 fix: disable playformCompress 2025-04-05 22:02:26 -05:00
tresabhi f90768d155 fix: env 2025-04-05 17:08:55 -05:00
tresabhi d77bd6a5f9 feat: logs 2025-04-05 16:15:55 -05:00
tresabhi 6836cb327f feat: more images 2025-04-05 16:07:42 -05:00
tresabhi 4373efd0cd feat: move images to blitzkit 2025-04-05 16:00:52 -05:00
tresabhi f13165e77d feat: better ui 2025-04-05 15:09:15 -05:00
tresabhi 8a5b0c1170 fix: gun-specific shell discrimination 2025-04-05 15:09:12 -05:00
tresabhi f16511a72e Merge branch 'main' into dev 2025-04-05 14:57:41 -05:00
TrèsAbhi 76f7ae45ce Update index.astro 2025-04-04 21:27:42 -05:00
TresAbhi ad2aaa7bf8 feat: some sketchy code 2025-04-05 02:07:35 +00:00
TresAbhi 2a4375c718 Merge branch 'main' into preview 2025-04-04 20:26:22 +00:00
tresabhi df0dc4f118 feat: shell filters 2025-04-03 16:33:48 -05:00
tresabhi 92399de5e2 fix: navbar interact 2025-04-03 13:00:23 -05:00
tresabhi 8d9dff8d73 feat: inline 2025-04-03 12:53:54 -05:00
tresabhi f91744f2f0 feat: compressor again 2025-04-03 12:51:24 -05:00
tresabhi e946dfdb69 feat: compressor 2025-04-03 12:48:17 -05:00
tresabhi 6283ddc57a feat: astro seo 2025-04-03 12:45:33 -05:00
tresabhi 2d66e0ab28 fix: missing padding backgrond 2025-04-03 12:34:02 -05:00
tresabhi c3d8f15a2a feat: better robots.txt 2025-04-03 12:23:53 -05:00
tresabhi 21a37ec6cc feat: new nav bar 2025-04-03 12:15:08 -05:00
tresabhi de471400ad feat: partytown 2025-04-03 11:34:57 -05:00
tresabhi 0b16295853 fix: keys 2025-04-03 11:31:31 -05:00
TrèsAbhi 63eea81856 Update stitches.config.ts 2025-04-02 21:55:08 -05:00
tresabhi ba57d61af5 feat: skeleton 2025-04-02 17:59:23 -05:00
tresabhi 3d940f4b47 feat: discord plug 2025-04-02 17:48:51 -05:00
tresabhi 8ef355c574 feat: we don't talk about it 2025-04-02 16:11:09 -05:00
tresabhi 71e1ab1362 aaaaaaaaaaaaaaaa 2025-04-01 19:38:58 -05:00
tresabhi 53dc108356 Merge branch 'main' of https://github.com/tresabhi/blitzkit 2025-04-01 19:38:01 -05:00
tresabhi 57b3218c5a undo cue4 2025-04-01 19:38:00 -05:00
tresabhi 7472e39faf fix: gifs 2025-04-01 19:34:03 -05:00
tresabhi 034417d19f fix: remove cue4 2025-03-31 17:49:23 -05:00
tresabhi 0368e9ceda feat: pink bot 2025-03-31 17:44:08 -05:00
tresabhi 28f365f762 fix: no class list 2025-03-31 17:39:42 -05:00
tresabhi 40a81f6b1b fix: class list 2025-03-31 17:39:01 -05:00
tresabhi 9475d22472 feat: uh hahaha you'll see ... again! 2025-03-31 17:36:40 -05:00
tresabhi 9538a03afb feat: uh hahaha you'll see 2025-03-31 16:54:32 -05:00
tresabhi d5d171bea6 4 2025-03-30 14:37:40 -05:00
tresabhi a9c9a90ac1 fix: disable /auction 2025-03-30 12:53:14 -05:00
tresabhi f7c562f8b6 fix: detect invalid 0-length translations 2025-03-30 12:51:34 -05:00
TrèsAbhi 836cf69f01 New Crowdin updates (#149)
* New translations en.json (Russian)

* New translations en.json (Ukrainian)

* New translations en.json (Spanish)

* New translations en.json (Chinese Simplified)
2025-03-26 14:37:29 -05:00
tresabhi ba17aae706 feat: bump int size 2025-03-25 15:29:41 -05:00
TrèsAbhi 30ca5c053a Update tankNames.ts 2025-03-14 12:14:55 -05:00
tresabhi c36419f5b6 fix: don't include cue4 2025-03-11 10:40:02 -05:00
tresabhi 1879895db2 feat: add 124 support 2025-03-11 10:13:02 -05:00
tresabhi c964e3c8ec feat: google crawler 2025-03-03 17:49:45 -06:00
tresabhi 2ef6d18f82 lol why cue4??? 2025-03-03 16:19:43 -06:00
tresabhi 10b672572b feat: try appending dvpl? 2025-03-03 16:15:58 -06:00
TrèsAbhi 2a4efa8cd2 fix: check for changes for real 2025-03-03 12:29:25 -06:00
TrèsAbhi 5a8435da29 Update Footer.astro 2025-03-03 12:15:05 -06:00
TrèsAbhi 3461349a96 Update Footer.astro 2025-03-03 12:13:06 -06:00
TrèsAbhi 3791e9df12 New Crowdin updates (#147)
* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (Ukrainian)

* New translations en.json (Ukrainian)

* New translations en.json (Portuguese)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (Ukrainian)

* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (Ukrainian)

* New translations en.json (Ukrainian)

* New translations en.json (Japanese)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Portuguese)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Russian)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Russian)
2025-03-03 11:10:15 -06:00
TrèsAbhi b3c36aac93 New Crowdin updates (#146)
* New translations en.json (Polish)

* New translations en.json (Polish)

* New translations en.json (Japanese)

* New translations en.json (Japanese)

* New translations en.json (Japanese)

* New translations en.json (Japanese)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (Ukrainian)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (Spanish)

* New translations en.json (Ukrainian)

* New translations en.json (Ukrainian)

* New translations en.json (Portuguese)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Polish)

* New translations en.json (Polish)

* New translations en.json (Spanish)

* New translations en.json (Japanese)

* New translations en.json (Chinese Simplified)

* New translations en.json (Japanese)

* New translations en.json (Japanese)

* New translations en.json (Ukrainian)

* New translations en.json (Polish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Ukrainian)

* New translations en.json (Ukrainian)

* New translations en.json (Russian)

* New translations en.json (French)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Ukrainian)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (Ukrainian)

* New translations en.json (Ukrainian)

* New translations en.json (Portuguese)

* New translations en.json (Portuguese)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Portuguese)

* New translations en.json (Portuguese)

* New translations en.json (Chinese Simplified)
2025-02-03 11:07:41 -06:00
TrèsAbhi c0895409bc Update index.ts 2025-01-24 11:27:45 -06:00
TrèsAbhi 438b565cbb New Crowdin updates (#145) 2025-01-19 13:00:15 -06:00
tresabhi cf1a82e89b fix: remove default 2025-01-19 12:51:26 -06:00
tresabhi 0506e361b2 feat: more prune 2025-01-19 12:46:57 -06:00
tresabhi d6a1357a82 Merge branch 'main' into dev 2025-01-19 12:41:06 -06:00
tresabhi a5a1dbd51b fix: [Oo] for /debug 2025-01-18 14:16:49 -06:00
tresabhi 5201350e44 fix: [Oo] for /stats 2025-01-18 14:16:26 -06:00
tresabhi 6a84b9d5ae fix: stricter pattern 2025-01-18 14:07:47 -06:00
tresabhi cf04fe21b3 fix: logs 2025-01-18 13:59:14 -06:00
tresabhi 84eb3c2da3 fix: version 2025-01-18 13:49:37 -06:00
tresabhi 22bf2dc1d8 feat: logs 2025-01-18 13:49:18 -06:00
tresabhi b9c339daa7 fix: search keys 2025-01-18 13:47:31 -06:00
tresabhi ef3006cac1 fix: double full stops 2025-01-18 13:42:52 -06:00
TrèsAbhi e482fd40c1 Update applyPatches.ts 2025-01-18 11:41:45 -06:00
TrèsAbhi cc4569966e Update applyPatches.ts 2025-01-18 09:19:38 -06:00
tresabhi 3708a3ced7 fix: handle deleted tanks 2025-01-17 20:29:33 -06:00
tresabhi 0ae59c2fd7 fix: check dir exists 2025-01-17 20:15:09 -06:00
tresabhi 7027f63236 feat: prune 2025-01-17 19:56:46 -06:00
TrèsAbhi 6725e79021 New Crowdin updates (#140) 2025-01-17 19:36:39 -06:00
tresabhi 5ca3cee9da feat: verbose 2025-01-17 19:22:02 -06:00
tresabhi 602a5a1e99 fix: move env 2025-01-17 19:19:45 -06:00
tresabhi bfbf3bdc39 fix: no double dvpl 2025-01-17 19:17:39 -06:00
tresabhi 644686582e fix: icon api 2025-01-17 19:06:07 -06:00
TrèsAbhi 1c00bc81f8 New Crowdin updates (#139)
* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Japanese)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Portuguese)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (Chinese Simplified)
2025-01-17 12:46:05 -06:00
TrèsAbhi ac3b69bec5 Update assets.yml 2025-01-17 12:45:12 -06:00
TrèsAbhi 3e14c943b6 Update assets.yml 2025-01-16 23:05:13 -06:00
TrèsAbhi d33633be2c Update assets.yml 2025-01-16 22:15:24 -06:00
TrèsAbhi 4bf70d02d0 Update Crowdin configuration file 2025-01-16 20:48:29 -06:00
tresabhi 377bcf0e38 fix: env 2025-01-16 20:44:55 -06:00
tresabhi 884b6d4318 fix: run tests even on dev 2025-01-16 20:36:49 -06:00
tresabhi 134566f1d8 feat: hide version... correctly 2025-01-10 12:06:20 -06:00
tresabhi d592a95cae feat: hide on preview 2025-01-10 11:56:00 -06:00
tresabhi 4f74556eb6 feat: hide version 2025-01-10 11:53:14 -06:00
tresabhi 1342f434a3 feat: desc 2025-01-10 11:14:43 -06:00
TrèsAbhi 6110471990 Update index.astro 2025-01-10 11:03:55 -06:00
TrèsAbhi 359eec5209 Update package.json 2025-01-10 10:46:57 -06:00
361 changed files with 16360 additions and 5954 deletions

No files matched your search

+19 -2
View File
@@ -29,7 +29,7 @@ concurrency:
env:
DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
GH_TOKEN: ${{ secrets.ASSET_BOT }}
DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
VIDEOS_SHEET: ${{ secrets.VIDEOS_SHEET }}
@@ -39,6 +39,20 @@ env:
PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }}
PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }}
PUBLIC_ASSET_BRANCH: ${{ github.event.inputs.cdn_branch || secrets.PUBLIC_ASSET_BRANCH }}
WOTB_GLOSSARY_DOMAIN: ${{ secrets.WOTB_GLOSSARY_DOMAIN }}
WOTB_GLOSSARY_PATH: ${{ secrets.WOTB_GLOSSARY_PATH }}
PUBLIC_PROMOTE_OPENTEST: ${{ secrets.PUBLIC_PROMOTE_OPENTEST }}
ALLOW_ROBOTS: true
PUBLIC_GOOGLE_TAG_MANAGER_ID: ${{ secrets.PUBLIC_GOOGLE_TAG_MANAGER_ID }}
PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID: ${{ secrets.PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID }}
PUBLIC_PATREON_CLIENT_ID: ${{ secrets.PUBLIC_PATREON_CLIENT_ID }}
PUBLIC_PATREON_REDIRECT_URI: ${{ secrets.PUBLIC_PATREON_REDIRECT_URI }}
PATREON_CLIENT_SECRET: ${{ secrets.PATREON_CLIENT_SECRET }}
PUBLIC_NITROPAY_ID: ${{ secrets.PUBLIC_NITROPAY_ID }}
PUBLIC_DEBUG_MISSING_I18N: false
PUBLIC_DISCORD_SERVER_ID: ${{ secrets.PUBLIC_DISCORD_SERVER_ID }}
PUBLIC_ASSET_FAST_USER: ${{ secrets.PUBLIC_ASSET_FAST_USER }}
PUBLIC_ASSET_FAST_REPO: ${{ secrets.PUBLIC_ASSET_FAST_REPO }}
jobs:
download_client:
@@ -106,6 +120,9 @@ jobs:
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
token: ${{ secrets.GH_TOKEN }}
- name: Setup bun
uses: oven-sh/setup-bun@v1
@@ -127,7 +144,7 @@ jobs:
- name: Start server and build assets
run: |
bun dev:website &
bun dev:website --verbosepa &
SERVER_PID=$!
bun run build:assets --all-targets --depot --production
+2
View File
@@ -12,6 +12,8 @@ concurrency:
env:
PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }}
PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }}
PUBLIC_ASSET_FAST_USER: ${{ secrets.PUBLIC_ASSET_FAST_USER }}
PUBLIC_ASSET_FAST_REPO: ${{ secrets.PUBLIC_ASSET_FAST_REPO }}
jobs:
build:
+4 -2
View File
@@ -20,6 +20,8 @@ env:
PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }}
PUBLIC_ASSET_BRANCH: ${{ secrets.PUBLIC_ASSET_BRANCH }}
PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }}
PUBLIC_ASSET_FAST_USER: ${{ secrets.PUBLIC_ASSET_FAST_USER }}
PUBLIC_ASSET_FAST_REPO: ${{ secrets.PUBLIC_ASSET_FAST_REPO }}
jobs:
host:
@@ -27,8 +29,8 @@ jobs:
steps:
- uses: oven-sh/setup-bun@v1
# with:
# bun-version: 1.1.33
# with:
# bun-version: 1.1.33
- name: Download release assets
run: |
+2
View File
@@ -25,4 +25,6 @@ jobs:
DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }}
PUBLIC_ASSET_FAST_USER: ${{ secrets.PUBLIC_ASSET_FAST_USER }}
PUBLIC_ASSET_FAST_REPO: ${{ secrets.PUBLIC_ASSET_FAST_REPO }}
run: bun build:ratingleaderboard --region=asia
+2
View File
@@ -25,4 +25,6 @@ jobs:
DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }}
PUBLIC_ASSET_FAST_USER: ${{ secrets.PUBLIC_ASSET_FAST_USER }}
PUBLIC_ASSET_FAST_REPO: ${{ secrets.PUBLIC_ASSET_FAST_REPO }}
run: bun build:ratingleaderboard --region=eu
+2
View File
@@ -25,4 +25,6 @@ jobs:
DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }}
PUBLIC_ASSET_FAST_USER: ${{ secrets.PUBLIC_ASSET_FAST_USER }}
PUBLIC_ASSET_FAST_REPO: ${{ secrets.PUBLIC_ASSET_FAST_REPO }}
run: bun build:ratingleaderboard --region=com
+7 -2
View File
@@ -2,7 +2,6 @@ name: Website
on:
push:
branches: main
workflow_dispatch:
schedule:
@@ -22,11 +21,16 @@ env:
PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }}
PUBLIC_ASSET_BRANCH: ${{ secrets.PUBLIC_ASSET_BRANCH }}
PUBLIC_PROMOTE_OPENTEST: ${{ secrets.PUBLIC_PROMOTE_OPENTEST }}
ALLOW_ROBOTS: true
ALLOW_ROBOTS: 'true'
WOTB_GLOSSARY: ${{ secrets.WOTB_GLOSSARY }}
PUBLIC_GOOGLE_TAG_MANAGER_ID: ${{ secrets.PUBLIC_GOOGLE_TAG_MANAGER_ID }}
PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID: ${{ secrets.PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID }}
GOOGLE_APPLICATION_CREDENTIALS: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}
WOTB_GLOSSARY_DOMAIN: ${{ secrets.WOTB_GLOSSARY_DOMAIN }}
WOTB_GLOSSARY_PATH: ${{ secrets.WOTB_GLOSSARY_PATH }}
PUBLIC_DISCORD_SERVER_ID: ${{ secrets.PUBLIC_DISCORD_SERVER_ID }}
PUBLIC_ASSET_FAST_USER: ${{ secrets.PUBLIC_ASSET_FAST_USER }}
PUBLIC_ASSET_FAST_REPO: ${{ secrets.PUBLIC_ASSET_FAST_REPO }}
jobs:
build:
@@ -53,6 +57,7 @@ jobs:
path: dist/website
deploy-github-pages:
if: ${{ github.ref == 'refs/heads/main' }}
name: Deploy to GitHub Pages
runs-on: ubuntu-latest
needs: build
+3 -2
View File
@@ -22,8 +22,9 @@ depots
public/sitemap*
/firebase.json
target
# packages/core/src/protos/*
# !packages/core/src/protos/*.proto
# *.ts
/.vercel
/.astro
.vercel
/src
/packages/bot/src/prisma
+3
View File
@@ -1,3 +1,6 @@
[submodule "submodules/blitzkit-closed"]
path = submodules/blitzkit-closed
url = https://github.com/tresabhi/blitzkit-closed
[submodule "submodules/CUE4Parse"]
path = submodules/CUE4Parse
url = https://github.com/FabianFG/CUE4Parse
+14
View File
@@ -14,6 +14,7 @@
"applypatches",
"artefacts",
"astrojs",
"astrolib",
"atgm",
"Autoloader",
"Autoreloader",
@@ -32,9 +33,11 @@
"blitzkit",
"blitzrinth",
"blitzstars",
"bufbuild",
"cacheable",
"Callouts",
"Camo",
"Carro",
"CCPAOPTOUT",
"CDON",
"classname",
@@ -42,6 +45,7 @@
"closedkrieg",
"cockroackdb",
"Coef",
"Combattimento",
"cooldown",
"corelations",
"corsproxy",
@@ -53,6 +57,7 @@
"dbid",
"Ddpf",
"Ddsd",
"deadrail",
"debugflags",
"deburr",
"decalmask",
@@ -71,6 +76,7 @@
"dxgi",
"echarts",
"Everytime",
"FABLEGEAR",
"FASTNAME",
"flexdirection",
"FOURCC",
@@ -104,6 +110,7 @@
"Maddoxkkm",
"malum",
"mantlets",
"MECHA",
"metallicness",
"metalness",
"minitelrose",
@@ -130,17 +137,22 @@
"outdir",
"outfile",
"ownedtanks",
"padder",
"partytown",
"PIXELFORMAT",
"playerachievements",
"playerinfo",
"playform",
"pngjs",
"POSITIVEX",
"POSITIVEY",
"POSITIVEZ",
"precompute",
"PROGRESSTON",
"Promisable",
"proto",
"protobuf",
"protoc",
"protos",
"Pyogenics",
"ratingleaderboard",
@@ -181,6 +193,7 @@
"TEXCOORD",
"tresabhi",
"tungstentip",
"Turretless",
"TYPELESS",
"ubjson",
"Unicum",
@@ -195,6 +208,7 @@
"vitepress",
"Vovko",
"wargaming",
"WARHAMMER",
"webp",
"whitespaces",
"WHSS",
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -1,3 +1,3 @@
files:
- source: /packages/core/lang/en.json
- source: /packages/i18n/strings/en.json
translation: /%original_path%/%locale%.json
+7
View File
@@ -0,0 +1,7 @@
# BlitzKit 1.27.1
## Fixes
- Fixed a crash that occurs if tanks are deleted in Blitz and were once available in BlitzKit
- All tank icons are now back
- The tank search once again returns results
+23
View File
@@ -0,0 +1,23 @@
# BlitzKit 1.27.10
This update changes the URLs across the whole website, removing the "tools" prefix and simplifying other aspects too.
## Changes
- Removed "full" tank names
- For example, tanks like the "Carro 45t" had full names like "Carro Combattimento 45t" which remained pretty much unused, so they have been removed
- Reduced the shadow below the navigation bar
- Removed the "tools" prefix from the URLs; here are the paths:
- `/tools/tankopedia` -> `/tanks`
- `/tools/tankopedia/12345` -> `/tanks/tank-name`
- `/tools/compare` -> `/compare`
- `/tools/embed` -> `/embed`
- `/tools/embed/embed-name` -> `/embed/embed-name`
- `/tools/gallery` -> `/gallery`
- `/tools/performance` -> `/performance`
- `/tools/session` -> `/session`
- `/tools/tier-list` -> `/tier-list`
## Technical Features
- The asset mangler now uses http headers and even more heuristics to minimize re-creating unchanged assets
+7
View File
@@ -0,0 +1,7 @@
# BlitzKit 1.27.11
This update affects both the bot and the website.
## Technical Changes
- Added a proper CDN domain to avoid error 429s and any slowdowns
+7
View File
@@ -0,0 +1,7 @@
# BlitzKit 1.27.2
This update only affects the website.
## Fixes
- The new Improved Vertical Stabilizer equipment which only affects the gun depression found on the Type 63 now works
+9
View File
@@ -0,0 +1,9 @@
# BlitzKit 1.27.3
This update only affects the bot.
## Fixes
- Added support for 64-bit IDs allowing users with new accounts to link with BlitzKit
- This comes at the added cost of resetting the links of all other accounts
- Just re-link and you're good to go
+3
View File
@@ -0,0 +1,3 @@
# FreakKit 1.27.4
It has come to our attention that tanks are very harsh objects. To even it out, we made the website a pretty pretty princess <3
+11
View File
@@ -0,0 +1,11 @@
# BlitzKit 1.27.5
This update only affects the bot.
## Changes
- Removed `/auction`
## Fixes
- Fixed a bug that caused `/rating` to disappear
+23
View File
@@ -0,0 +1,23 @@
# BlitzKit 1.27.6
This update only affects the website.
## Features
- Added a promotional card for [the official Discord server](https://discord.gg/nDt7AjGJQH) to the homepage
- Added a better navbar
- The added spaces and padding helps add more room for error when clicking, especially on mobile
- The dropdown menu is now a lost smaller, disposing of the need to scroll at all
- Added shell filters to the tank search
- Reworked the filter buttons and their positions to allow for more space
## Fixes
- Moved most images from imgur to BlitzKit allowing for users in certain countries to load BlitzKit without getting blocked
## Technical Features
- Added Partytown to offload some workload off the main thread, allowing for a more responsive experience
- Reworked `robots.txt` to disallow indexing of BlitzKit variants
- Improved the SEO further for most pages
- Added a few compressor library to speed up load times
+25
View File
@@ -0,0 +1,25 @@
# BlitzKit 1.27.7
![](https://i.imgur.com/qFepOaT.png)
This update only affects the website.
## Features
- Added a new foggy-wireframe transition between tabs to smooth out the jarring jumps
- Added animations pop-in and out animations on a few elements
- The tank name title now shrinks in size as soon as a disturbance is caused
- The shell selector, antagonist switcher, and thicknesses range now ease into frame
- The Tankopedia search page now loads as a skeleton by default before populating with tanks, allowing for the recently viewed tanks to load without cumulative shift
- Something similar was done to the Gallery tool
- Gave the meta section of the website some zest with nation-based backdrops
- The compare tabs in the Tankopedia are now centered
## Fixes
- The camera no longer snaps to the initial position when switching between tabs
## Technical Changes
- Backported some technologies from BlitzKit Reforged; you will not notice any differences in usage
- The popular tanks and gallery indexings have been moved to the asynchronous cron job
+12
View File
@@ -0,0 +1,12 @@
# BlitzKit 1.27.8
![](https://i.imgur.com/WO5MS94.png)
## Features
- The website now uses Inter as the font
- Added a cool new non-disturbed state for the Tankopedia because why not
## Changes
- Removed the Discord plug and language changer from the homepage
+27
View File
@@ -0,0 +1,27 @@
# BlitzKit 1.27.9
BlitzKit's great, but there's far too many numbers. This update adds a few visualizers to help new players understand how things relate numerically.
![](https://i.imgur.com/OV5ak4T.png)
## Features
- Added the turret and hull traverse speed visualizer
- Added the shell ricochet and normalization angles visualizer
- Added the view-range visualizer
- Added a search bar to the Tankopedia characteristics
- Bumped the decimal places for vehicle dimensions and volume
- Made tank ranks softer (the bars beneath the tank characteristics)
- Gave the navigation bar better distinction from the rest of the page
- Increased the number of characteristics rows to 3 on select devices
- Switched to a more contrasting classic style of components across the website (it's subtle, but beautiful)
## Changes
- Removed units
## Fixes
- Clarified a few confusing row labels in the Compare tool
- Made the Tankopedia hero section dynamically smaller on mobile phones to allow scrolling
- Tank ranks no longer reach 0 or go above the number of vehicles in the comparison
+23 -10
View File
@@ -1,12 +1,13 @@
{
"name": "blitzkit",
"name": "@blitzkit",
"private": true,
"version": "1.27.0",
"version": "1.27.11",
"description": "🎉 Tools for everything World of Tanks Blitz",
"type": "module",
"types": "./types.d.ts",
"workspaces": [
"packages/*"
"packages/*",
"submodules/*"
],
"scripts": {
"build:assets": "cd packages/scripts && bun run build:assets",
@@ -35,19 +36,31 @@
"build:protos": "bun packages/scripts/src/protos.ts",
"preview:website": "cd packages/website && bun run preview",
"build:reviews": "cd packages/scripts && bun build:reviews",
"build:ids": "cd packages/scripts && bun build:ids"
"build:ids": "cd packages/scripts && bun build:ids",
"prunestrings": "cd packages/scripts && bun prunestrings"
},
"license": "MIT",
"dependencies": {
"sharp": "^0.33.5",
"lodash-es": "^4.17.21"
"googleapis": "^144.0.0",
"js-yaml": "^4.1.0",
"lodash-es": "^4.17.21",
"protobufjs": "^7.5.2",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"quicklime": "^1.2.0",
"sharp": "^0.33.5"
},
"devDependencies": {
"@astrojs/react": "^4.3.0",
"@types/bun": "latest",
"@types/js-yaml": "^4.0.9",
"@types/lodash-es": "^4.17.12",
"@types/node": "^22.5.4",
"prettier": "^3.3.3",
"prisma": "^6.0.0",
"typescript": "^5.5.4"
"@types/react": "^19.1.5",
"@types/react-dom": "^19.1.5",
"@types/node": "^22.14.1",
"astro": "^5.8.0",
"prettier": "^3.5.3",
"prisma": "^6.6.0",
"typescript": "^5.8.3"
}
}
-1
View File
@@ -9,7 +9,6 @@
"satori": "^0.10.14",
"@resvg/resvg-js": "^2.6.2",
"discord.js": "^14.16.3",
"react": "^18.3.1",
"@radix-ui/colors": "^3.0.0",
"fuzzysort": "^2.0.4",
"bepaint": "^0.1.0-beta.3",
+2 -2
View File
@@ -107,8 +107,8 @@ export const auctionCommand = new Promise<CommandRegistry>((resolve) => {
if (!tank) return '';
const name = `[${tank.name}](<https://blitzkit.app/tools/tankopedia/${
tank.id
const name = `[${tank.name}](<https://blitzkit.app/tanks/${
tank.slug
}>)`;
const next =
data.next_price === null
+1 -1
View File
@@ -17,7 +17,7 @@ export const debugCommand = new Promise<CommandRegistry>((resolve) => {
const list = [
[strings.bot.commands.debug.body.version, packageJSON.version],
[
strings.bot.commands.debug.body.shard,
strings.bot.commands.debug.body.shard.label,
client.shard?.ids[0] ?? strings.bot.commands.debug.body.shard.default,
],
[
+2 -5
View File
@@ -1,11 +1,8 @@
import {
getAccountInfo,
getClanAccountInfo,
linkBlitzAndDiscord,
} from '@blitzkit/core';
import { getAccountInfo, getClanAccountInfo } from '@blitzkit/core';
import { teal } from '@radix-ui/colors';
import { Glow } from '../components/AllStatsOverview/components/HeroStat/components/Glow';
import { CommandWrapper } from '../components/CommandWrapper';
import { linkBlitzAndDiscord } from '../core/db/linkBlitzAndDiscord';
import { addUsernameChoices } from '../core/discord/addUsernameChoices';
import { autocompleteUsername } from '../core/discord/autocompleteUsername';
import { createLocalizedCommand } from '../core/discord/createLocalizedCommand';
+1 -1
View File
@@ -78,7 +78,7 @@ export const ownedTanksCommand = new Promise<CommandRegistry>((resolve) => {
)
.map(
(tank) =>
`[${flags[tank.nation]} ${markdownEscape(unwrap(tank.name))}](<https://blitzkit.app/tools/tankopedia/${tank.id}>)`,
`[${flags[tank.nation]} ${markdownEscape(unwrap(tank.name))}](<https://blitzkit.app/tanks/${tank.slug}>)`,
);
const lines = [title, ...tankList];
@@ -16,8 +16,8 @@ export function CommandWrapper({ children, fat }: CommandWrapperProps) {
gap: 16,
width: '100%',
color: theme.colors.textHighContrast,
backgroundColor: theme.colors.appBackground1,
position: 'relative',
background: theme.colors.appBackground1,
}}
>
{children}
+2 -4
View File
@@ -1,3 +1,4 @@
import { SEARCH_KEYS } from '@blitzkit/core';
import { literals } from '@blitzkit/i18n';
import { Locale } from 'discord.js';
import { go } from 'fuzzysort';
@@ -19,10 +20,7 @@ export async function resolveTankId(
const searchResult = go(
`${tank}`,
await (techTreeOnly ? tankNamesTechTreeOnly : tankNames),
{
keys: ['searchableName', 'searchableNameDeburr', 'camouflages'],
limit: 1,
},
{ keys: SEARCH_KEYS, limit: 1 },
);
if (searchResult.length === 0) {
@@ -8,12 +8,12 @@ export async function filtersToDescription(
{ nation, tier, type, class: tankClass, tank }: StatFilters,
locale: Locale,
) {
const { strings } = translator(locale);
const { strings, bkLocale } = translator(locale);
const awaitedTankDefinitions = await fetchTankDefinitions();
const info: string[] = [];
// TODO: somehow localize tank names?
if (tank) return awaitedTankDefinitions.tanks[tank].name;
if (tank) return awaitedTankDefinitions.tanks[tank].name.locales[bkLocale];
if (nation)
info.push((strings.common.nations as Record<string, string>)[nation]);
if (tier) {
@@ -1,5 +1,6 @@
import { idToRegion, usersDatabase } from '@blitzkit/core';
import { flagUserActivity } from '@blitzkit/core/src/blitzkit/flagUserActivity';
import { idToRegion } from '@blitzkit/core';
import { flagUserActivity } from '../db/flagUserActivity';
import { usersDatabase } from '../db/users';
export async function getBlitzFromDiscord(discordId: bigint) {
const unique = await usersDatabase.discordUser.findUnique({
@@ -8,6 +9,8 @@ export async function getBlitzFromDiscord(discordId: bigint) {
if (unique === null) return null;
await flagUserActivity(unique.blitz_id);
return { id: unique.blitz_id, region: idToRegion(unique.blitz_id) };
const id = Number(unique.blitz_id);
await flagUserActivity(id);
return { id, region: idToRegion(id) };
}
+1 -1
View File
@@ -1,4 +1,4 @@
import { usersDatabase } from '@blitzkit/core';
import { usersDatabase } from '../db/users';
import { client } from '../discord/client';
const EXIT_EVENTS = [
@@ -1,4 +1,4 @@
import { usersDatabase } from '@blitzkit/core';
import { usersDatabase } from './users';
export async function flagUserActivity(blitzId: number) {
await usersDatabase.user.upsert({
@@ -1,5 +1,5 @@
import { usersDatabase } from '@blitzkit/core';
import { flagUserActivity } from './flagUserActivity';
import { usersDatabase } from './users';
export async function linkBlitzAndDiscord(discordId: bigint, blitzId: number) {
await usersDatabase.discordUser.upsert({
@@ -1,3 +1,3 @@
import { PrismaClient } from '@prisma/client';
import { PrismaClient } from '../../prisma';
export const usersDatabase = new PrismaClient();
@@ -1,5 +1,4 @@
import { fetchTankNames, TankType } from '@blitzkit/core';
import { SUPPORTED_LOCALES } from '@blitzkit/i18n';
import { fetchTankNames, SEARCH_KEYS, TankType } from '@blitzkit/core';
import {
ApplicationCommandOptionChoiceData,
AutocompleteInteraction,
@@ -32,16 +31,7 @@ export async function autocompleteTanks(
go(
focusedOption.value,
await (techTreeOnly ? tankNamesTechTreeOnly : tankNames),
{
keys: [
...SUPPORTED_LOCALES.map((locale) => [
`searchableName.{locale}`,
`searchableNameDeburr.{locale}`,
]).flat(),
'camouflages',
],
limit: 10,
},
{ keys: SEARCH_KEYS, limit: 10 },
).map(async (item) => {
let name = unwrap(item.obj.searchableName);
@@ -3,7 +3,8 @@ import { Locale } from 'discord.js';
import { SUPPORTED_LOCALES_DISCORD } from '../localization/strings/constants';
import { translator } from '../localization/translator';
const validNameRegex = /^[-_\p{L}\p{N}\p{sc=Deva}\p{sc=Thai}]{1,32}$/u;
const validNameRegex =
/^[\p{Ll}\p{Lm}\p{Lo}\p{N}\p{sc=Devanagari}\p{sc=Thai}_-]+$/u;
export function localizationObject(
path: (strings: BlitzKitStrings) => string,
@@ -14,7 +15,8 @@ export function localizationObject(
(localizations, locale) => {
const { strings } = translator(locale);
const translation = literalsFunc(path(strings), literals);
const isValid = !strict || validNameRegex.test(translation);
const isValid =
(!strict || validNameRegex.test(translation)) && translation.length > 0;
if (!isValid) {
console.warn(
@@ -12,8 +12,9 @@ export function translator(localeRaw: Locale) {
SUPPORTED_LOCALES_DISCORD.includes(localeRaw)
? localeRaw
: DEFAULT_LOCALE_DISCORD;
const strings = STRINGS[SUPPORTED_LOCALES_DISCORD_MAP_INVERSE[locale]];
const unwrap = unwrapper(SUPPORTED_LOCALES_DISCORD_MAP_INVERSE[locale]);
const bkLocale = SUPPORTED_LOCALES_DISCORD_MAP_INVERSE[locale];
const strings = STRINGS[bkLocale];
const unwrap = unwrapper(bkLocale);
return { locale, strings, unwrap };
return { locale, strings, unwrap, bkLocale };
}
@@ -19,11 +19,11 @@ import { Writeable } from '../../../types/writable';
export async function handleChatInputCommand(
interaction: ChatInputCommandInteraction<CacheType>,
) {
await interaction.deferReply();
const awaitedCommands = await commands;
const registry = awaitedCommands[interaction.commandName];
await interaction.deferReply();
try {
const returnable = await registry.handler(interaction);
@@ -15,7 +15,6 @@ import {
SlashCommandSubcommandsOnlyBuilder,
} from 'discord.js';
import { aboutCommand } from '../../commands/about';
import { auctionCommand } from '../../commands/auction';
import { breakdownCommand } from '../../commands/breakdown';
import { debugCommand } from '../../commands/debug';
import { evolutionCommand } from '../../commands/evolution';
@@ -80,7 +79,7 @@ interface CommandRegistryExplicit extends CommandRegistryBase {
export type CommandRegistry = CommandRegistryImplicit | CommandRegistryExplicit;
export const COMMANDS_RAW: Promise<CommandRegistry>[] = [
auctionCommand,
// auctionCommand,
permissionsCommand,
debugCommand,
aboutCommand,
+8 -1
View File
@@ -45,7 +45,7 @@ const interval = setInterval(async () => {
const usernames = awaitedDiscoveredIdsDefinitions.count;
manager.broadcastEval(
(client, { servers, users, channels, tanks, usernames }) => {
async (client, { servers, users, channels, tanks, usernames }) => {
const bios = [
`Living in ${servers.toLocaleString()} servers`,
`Serving ${users.toLocaleString()} users`,
@@ -62,6 +62,13 @@ const interval = setInterval(async () => {
},
],
});
for (const guild of client.guilds.cache.values()) {
try {
const botMember = await guild.members.fetch(client.user.id);
await botMember.setNickname('BlitzKit');
} catch {}
}
},
{ context: { servers, channels, users, tanks, usernames } },
);
+1 -1
View File
@@ -23,7 +23,7 @@ export const theme = {
spaces: createSpaces(),
colors: {
...createColors(slateDark),
...createColors(mauveDark),
...createColors(slateDarkA, 'alpha'),
...createColors(slate, 'light'),
+8 -1
View File
@@ -1,4 +1,11 @@
{
"extends": "../../tsconfig.json",
"include": ["src/**/*", "../core/src/blitzkit/supportedLocales.ts", "../i18n/src/unwrapper.ts"]
"include": [
"src/**/*",
"../core/src/blitzkit/supportedLocales.ts",
"../i18n/src/unwrapper.ts"
],
"compilerOptions": {
"baseUrl": "../../"
}
}
+2 -1
View File
@@ -4,9 +4,10 @@
"type": "module",
"main": "src/index.ts",
"dependencies": {
"@blitzkit/closed": "workspace:*",
"@octokit/plugin-throttling": "^8.2.0",
"@octokit/rest": "^20.1.1",
"@prisma/client": "^5.19.1",
"@prisma/client": "^6.6.0",
"adm-zip": "^0.5.16",
"crc": "^4.3.2",
"dotenv": "^16.4.5",
@@ -0,0 +1,28 @@
import { CatalogItem } from '@protos/blitz_items';
import { Any } from '@protos/google/protobuf/any';
import { MessageFns } from '../protos';
export class CatalogItemAccessor {
private components: Record<string, Any> = {};
constructor(item: CatalogItem) {
for (const component of item.components) {
if (
component.value === undefined ||
component.value.component === undefined
) {
continue;
}
this.components[component.key] = component.value.component;
}
}
get<Type>(Message: MessageFns<Type>, component: string) {
if (component in this.components) {
return Message.decode(this.components[component].value);
}
throw new Error(`Unknown component: ${component}`);
}
}
+4
View File
@@ -0,0 +1,4 @@
export function entityName(entity: string) {
const [_, ...name] = entity.split('.');
return name.join('.');
}
@@ -1,4 +1,5 @@
import { assertSecret, type BlitzGlossary } from '@blitzkit/core';
import { assertSecret } from '../blitzkit';
import { BlitzGlossary } from '../types';
export async function fetchGlossary(locale: string) {
const response = await fetch(
+4
View File
@@ -1,9 +1,12 @@
export * from './canSplash';
export * from './catalogItemAccessor';
export * from './clans';
export * from './classes';
export * from './constants';
export * from './entityName';
export * from './equipmentPrice';
export * from './fetchBlitz';
export * from './fetchGlossary';
export * from './generateStats';
export * from './getAccountAchievements';
export * from './getAccountInfo';
@@ -17,6 +20,7 @@ export * from './getTankStats';
export * from './idToRegion';
export * from './isOnGoingRatingSeason';
export * from './isValidBlitzId';
export * from './metadataAccessor';
export * from './nations';
export * from './normalizeExtra';
export * from './normalizeIds';
@@ -0,0 +1,38 @@
import { CatalogItem } from '@protos/blitz_items';
import { Metadata } from '@protos/blitz_metadata';
import { CatalogItemAccessor } from './catalogItemAccessor';
export class UnpackedMetadataAccessor {
private items: Record<string, CatalogItemAccessor> = {};
constructor(metadata: Metadata) {
for (const item of metadata.catalog_items) {
if (item.catalog_id in this.items) {
throw new Error(`Duplicate catalog ID: ${item.catalog_id}`);
}
this.items[item.catalog_id] = new CatalogItemAccessor(item);
}
}
get(item: string) {
if (item in this.items) return this.items[item];
throw new Error(`Unknown catalog ID: ${item}`);
}
}
export class DiscreteMetadataAccessor {
constructor(private base: string) {}
async get(item: string) {
const response = await fetch(`${this.base}/${item}.pb`);
if (!response.ok) throw new Error(`Unknown catalog ID: ${item}`);
const buffer = await response.arrayBuffer();
const catalogItem = CatalogItem.decode(new Uint8Array(buffer));
return new CatalogItemAccessor(catalogItem);
}
}
+8 -3
View File
@@ -1,7 +1,12 @@
import { assertSecret } from './assertSecret';
const repo = assertSecret(import.meta.env.PUBLIC_ASSET_REPO);
const branch = assertSecret(import.meta.env.PUBLIC_ASSET_BRANCH);
const fastUser = assertSecret(import.meta.env.PUBLIC_ASSET_FAST_USER);
const fastRepo = assertSecret(import.meta.env.PUBLIC_ASSET_FAST_REPO);
export function asset(path: string) {
return `https://raw.githubusercontent.com/${assertSecret(
import.meta.env.PUBLIC_ASSET_REPO,
)}/${assertSecret(import.meta.env.PUBLIC_ASSET_BRANCH)}/${path}`;
return branch === 'main'
? `https://${fastUser}.github.io/${fastRepo}/${path}`
: `https://raw.githubusercontent.com/${repo}/${branch}/${path}`;
}
+7
View File
@@ -0,0 +1,7 @@
import { fetchPB } from '../protobuf';
import { Gallery } from '../protos';
import { asset } from './asset';
export function fetchGallery() {
return fetchPB(asset('definitions/gallery.pb'), Gallery);
}
+3 -2
View File
@@ -13,7 +13,6 @@ export * from './discoveredIdDefinitions';
export * from './emblemURL';
export * from './equipmentDefinitions';
export * from './eventManager';
// export * from './flagUserActivity';
export * from './gameDefinitions';
export * from './getArchivedLatestSeasonNumber';
// export * from './getArchivedRatingInfo';
@@ -21,7 +20,6 @@ export * from './getArchivedRatingLeaderboard';
// export * from './getArchivedRatingMidnightLeaderboard';
export * from './getTimeDaysAgo';
export * from './isExplosive';
export * from './linkBlitzAndDiscord';
export * from './mapDefinitions';
export * from './modelDefinitions';
export * from './normalizeBoundingBox';
@@ -44,6 +42,9 @@ export * from './unwrapBlitzkitResponse';
export * from './votes';
// export * from './withCORSProxy';
export * from './createDefaultProvisions';
export * from './gallery';
export * from './metaSortTank';
export * from './popularTanks';
export * from './romanize';
export * from './slugify';
export * from './youtubers';
@@ -0,0 +1,7 @@
import { fetchPB } from '../protobuf';
import { PopularTanks } from '../protos';
import { asset } from './asset';
export function fetchPopularTanks() {
return fetchPB(asset('definitions/popular-tanks.pb'), PopularTanks);
}
+16
View File
@@ -0,0 +1,16 @@
import { deburr } from 'lodash-es';
const nonAlphanumericRegex = /[^a-z0-9]/g;
const multipleDashesRegex = /--+/g;
const trailingDashRegex = /-$/g;
const leadingDashRegex = /^-/g;
export function slugify(name: string) {
let slug = deburr(name).toLowerCase();
slug = slug.replaceAll(nonAlphanumericRegex, '-');
slug = slug.replaceAll(multipleDashesRegex, '-');
slug = slug.replaceAll(trailingDashRegex, '');
slug = slug.replaceAll(leadingDashRegex, '');
return slug;
}
+21 -4
View File
@@ -1,3 +1,4 @@
import locales from '@blitzkit/i18n/locales.json' with { type: 'json' };
import { deburr } from 'lodash-es';
import { I18nString } from '../protos';
import { fetchCamouflageDefinitions } from './camouflageDefinitions';
@@ -14,22 +15,38 @@ export async function fetchTankNames() {
tankDefinitionsArray.map(async (tank) => {
const searchableNameDeburr: I18nString = { locales: {} };
Object.entries(tank.name_full ?? tank.name).forEach(([key, value]) => {
Object.entries(tank.name).forEach(([key, value]) => {
searchableNameDeburr.locales[key] = deburr(value);
});
return {
id: tank.id,
name: tank.name,
nameFull: tank.name_full,
searchableName: tank.name_full ?? tank.name,
searchableName: tank.name,
searchableNameDeburr,
camouflages: tank.camouflages
?.map((id) => camouflageDefinitions.camouflages[id]?.name)
?.map((id) =>
locales.supported.map(
({ locale }) =>
camouflageDefinitions.camouflages[id]?.name.locales[locale],
),
)
.flat()
.filter(Boolean)
.map(deburr)
.join(' '),
treeType: tank.type,
};
}),
);
}
export const SEARCH_KEYS = [
...locales.supported
.map(({ locale }) => [
`searchableName.locales.${locale}`,
`searchableNameDeburr.locales.${locale}`,
])
.flat(),
'camouflages',
];
-1
View File
@@ -1 +0,0 @@
export * from './users';
-1
View File
@@ -1,6 +1,5 @@
export * from './blitz';
export * from './blitzkit';
export * from './databases';
export * from './imgur';
export * from './math';
export * from './patreon';
@@ -2,7 +2,7 @@
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: packages/core/src/protos/average_definitions.proto
// source: average_definitions.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
@@ -58,7 +58,7 @@ export interface Samples {
total: number;
}
function createBaseAverageDefinitions(): AverageDefinitions {
export function createBaseAverageDefinitions(): AverageDefinitions {
return { averages: {}, samples: createBaseSamples(), time: 0 };
}
@@ -174,7 +174,7 @@ export const AverageDefinitions: MessageFns<AverageDefinitions> = {
},
};
function createBaseAverageDefinitions_AveragesEntry(): AverageDefinitions_AveragesEntry {
export function createBaseAverageDefinitions_AveragesEntry(): AverageDefinitions_AveragesEntry {
return { key: 0, value: createBaseAverageDefinitionsEntry() };
}
@@ -251,12 +251,12 @@ export const AverageDefinitions_AveragesEntry: MessageFns<AverageDefinitions_Ave
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? AverageDefinitionsEntry.fromPartial(object.value)
: undefined;
: createBaseAverageDefinitionsEntry();
return message;
},
};
function createBaseAverageDefinitionsEntry(): AverageDefinitionsEntry {
export function createBaseAverageDefinitionsEntry(): AverageDefinitionsEntry {
return {
mu: createBaseAverageDefinitionsAllStats(),
sigma: createBaseAverageDefinitionsAllStats(),
@@ -377,7 +377,7 @@ export const AverageDefinitionsEntry: MessageFns<AverageDefinitionsEntry> = {
},
};
function createBaseAverageDefinitionsAllStats(): AverageDefinitionsAllStats {
export function createBaseAverageDefinitionsAllStats(): AverageDefinitionsAllStats {
return {
battles: 0,
capture_points: 0,
@@ -738,7 +738,7 @@ export const AverageDefinitionsAllStats: MessageFns<AverageDefinitionsAllStats>
},
};
function createBaseSamples(): Samples {
export function createBaseSamples(): Samples {
return { d_1: 0, d_7: 0, d_30: 0, d_60: 0, d_90: 0, d_120: 0, total: 0 };
}
@@ -2,7 +2,7 @@ syntax = "proto2";
package blitzkit;
import "packages/core/src/protos/i18n.proto";
import "i18n.proto";
message CamouflageDefinitions {
map<uint32, Camouflage> camouflages = 1;
@@ -2,11 +2,11 @@
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: packages/core/src/protos/camouflage_definitions.proto
// source: camouflage_definitions.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
import { I18nString, createBaseI18nString } from "./i18n";
import { createBaseI18nString, I18nString } from "./i18n";
export const protobufPackage = "blitzkit";
@@ -26,7 +26,7 @@ export interface Camouflage {
tank_name_full?: I18nString | undefined;
}
function createBaseCamouflageDefinitions(): CamouflageDefinitions {
export function createBaseCamouflageDefinitions(): CamouflageDefinitions {
return { camouflages: {} };
}
@@ -108,7 +108,7 @@ export const CamouflageDefinitions: MessageFns<CamouflageDefinitions> = {
},
};
function createBaseCamouflageDefinitions_CamouflagesEntry(): CamouflageDefinitions_CamouflagesEntry {
export function createBaseCamouflageDefinitions_CamouflagesEntry(): CamouflageDefinitions_CamouflagesEntry {
return { key: 0, value: createBaseCamouflage() };
}
@@ -185,12 +185,12 @@ export const CamouflageDefinitions_CamouflagesEntry: MessageFns<CamouflageDefini
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? Camouflage.fromPartial(object.value)
: undefined;
: createBaseCamouflage();
return message;
},
};
function createBaseCamouflage(): Camouflage {
export function createBaseCamouflage(): Camouflage {
return { id: 0, name: createBaseI18nString(), tank_name: undefined, tank_name_full: undefined };
}
@@ -2,7 +2,7 @@ syntax = "proto2";
package blitzkit;
import "packages/core/src/protos/i18n.proto";
import "i18n.proto";
message ConsumableDefinitions {
map<uint32, Consumable> consumables = 1;
@@ -2,23 +2,23 @@
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: packages/core/src/protos/consumable_definitions.proto
// source: consumable_definitions.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
import { I18nString, createBaseI18nString } from "./i18n";
import { createBaseI18nString, I18nString } from "./i18n";
export const protobufPackage = "blitzkit";
export enum ConsumableTankCategoryFilterCategory {
CLIP = 0,
CONSUMABLE_TANK_CATEGORY_FILTER_CATEGORY_CLIP = 0,
}
export function consumableTankCategoryFilterCategoryFromJSON(object: any): ConsumableTankCategoryFilterCategory {
switch (object) {
case 0:
case "CONSUMABLE_TANK_CATEGORY_FILTER_CATEGORY_CLIP":
return ConsumableTankCategoryFilterCategory.CLIP;
return ConsumableTankCategoryFilterCategory.CONSUMABLE_TANK_CATEGORY_FILTER_CATEGORY_CLIP;
default:
throw new globalThis.Error(
"Unrecognized enum value " + object + " for enum ConsumableTankCategoryFilterCategory",
@@ -28,7 +28,7 @@ export function consumableTankCategoryFilterCategoryFromJSON(object: any): Consu
export function consumableTankCategoryFilterCategoryToJSON(object: ConsumableTankCategoryFilterCategory): string {
switch (object) {
case ConsumableTankCategoryFilterCategory.CLIP:
case ConsumableTankCategoryFilterCategory.CONSUMABLE_TANK_CATEGORY_FILTER_CATEGORY_CLIP:
return "CONSUMABLE_TANK_CATEGORY_FILTER_CATEGORY_CLIP";
default:
throw new globalThis.Error(
@@ -82,7 +82,7 @@ export interface ConsumableTankNationFilter {
nations: string[];
}
function createBaseConsumableDefinitions(): ConsumableDefinitions {
export function createBaseConsumableDefinitions(): ConsumableDefinitions {
return { consumables: {} };
}
@@ -164,7 +164,7 @@ export const ConsumableDefinitions: MessageFns<ConsumableDefinitions> = {
},
};
function createBaseConsumableDefinitions_ConsumablesEntry(): ConsumableDefinitions_ConsumablesEntry {
export function createBaseConsumableDefinitions_ConsumablesEntry(): ConsumableDefinitions_ConsumablesEntry {
return { key: 0, value: createBaseConsumable() };
}
@@ -241,12 +241,12 @@ export const ConsumableDefinitions_ConsumablesEntry: MessageFns<ConsumableDefini
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? Consumable.fromPartial(object.value)
: undefined;
: createBaseConsumable();
return message;
},
};
function createBaseConsumable(): Consumable {
export function createBaseConsumable(): Consumable {
return {
id: 0,
name: createBaseI18nString(),
@@ -416,7 +416,7 @@ export const Consumable: MessageFns<Consumable> = {
},
};
function createBaseConsumableTankFilter(): ConsumableTankFilter {
export function createBaseConsumableTankFilter(): ConsumableTankFilter {
return { filter_type: undefined };
}
@@ -564,7 +564,7 @@ export const ConsumableTankFilter: MessageFns<ConsumableTankFilter> = {
},
};
function createBaseConsumableTankTierFilter(): ConsumableTankTierFilter {
export function createBaseConsumableTankTierFilter(): ConsumableTankTierFilter {
return { min: 0, max: 0 };
}
@@ -640,7 +640,7 @@ export const ConsumableTankTierFilter: MessageFns<ConsumableTankTierFilter> = {
},
};
function createBaseConsumableTankIdsFilter(): ConsumableTankIdsFilter {
export function createBaseConsumableTankIdsFilter(): ConsumableTankIdsFilter {
return { ids: [] };
}
@@ -710,7 +710,7 @@ export const ConsumableTankIdsFilter: MessageFns<ConsumableTankIdsFilter> = {
},
};
function createBaseConsumableTankCategoryFilter(): ConsumableTankCategoryFilter {
export function createBaseConsumableTankCategoryFilter(): ConsumableTankCategoryFilter {
return { categories: [] };
}
@@ -784,7 +784,7 @@ export const ConsumableTankCategoryFilter: MessageFns<ConsumableTankCategoryFilt
},
};
function createBaseConsumableTankNationFilter(): ConsumableTankNationFilter {
export function createBaseConsumableTankNationFilter(): ConsumableTankNationFilter {
return { nations: [] };
}
@@ -2,7 +2,7 @@ syntax = "proto2";
package blitzkit;
import "packages/core/src/protos/i18n.proto";
import "i18n.proto";
message EquipmentDefinitions {
map<string, EquipmentPreset> presets = 1;
@@ -2,11 +2,11 @@
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: packages/core/src/protos/equipment_definitions.proto
// source: equipment_definitions.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
import { I18nString, createBaseI18nString } from "./i18n";
import { createBaseI18nString, I18nString } from "./i18n";
export const protobufPackage = "blitzkit";
@@ -39,7 +39,7 @@ export interface EquipmentSlot {
right: number;
}
function createBaseEquipmentDefinitions(): EquipmentDefinitions {
export function createBaseEquipmentDefinitions(): EquipmentDefinitions {
return { presets: {}, equipments: {} };
}
@@ -159,7 +159,7 @@ export const EquipmentDefinitions: MessageFns<EquipmentDefinitions> = {
},
};
function createBaseEquipmentDefinitions_PresetsEntry(): EquipmentDefinitions_PresetsEntry {
export function createBaseEquipmentDefinitions_PresetsEntry(): EquipmentDefinitions_PresetsEntry {
return { key: "", value: createBaseEquipmentPreset() };
}
@@ -236,12 +236,12 @@ export const EquipmentDefinitions_PresetsEntry: MessageFns<EquipmentDefinitions_
message.key = object.key ?? "";
message.value = (object.value !== undefined && object.value !== null)
? EquipmentPreset.fromPartial(object.value)
: undefined;
: createBaseEquipmentPreset();
return message;
},
};
function createBaseEquipmentDefinitions_EquipmentsEntry(): EquipmentDefinitions_EquipmentsEntry {
export function createBaseEquipmentDefinitions_EquipmentsEntry(): EquipmentDefinitions_EquipmentsEntry {
return { key: 0, value: createBaseEquipment() };
}
@@ -318,12 +318,12 @@ export const EquipmentDefinitions_EquipmentsEntry: MessageFns<EquipmentDefinitio
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? Equipment.fromPartial(object.value)
: undefined;
: createBaseEquipment();
return message;
},
};
function createBaseEquipment(): Equipment {
export function createBaseEquipment(): Equipment {
return { name: createBaseI18nString(), description: createBaseI18nString() };
}
@@ -403,7 +403,7 @@ export const Equipment: MessageFns<Equipment> = {
},
};
function createBaseEquipmentPreset(): EquipmentPreset {
export function createBaseEquipmentPreset(): EquipmentPreset {
return { slots: [] };
}
@@ -463,7 +463,7 @@ export const EquipmentPreset: MessageFns<EquipmentPreset> = {
},
};
function createBaseEquipmentSlot(): EquipmentSlot {
export function createBaseEquipmentSlot(): EquipmentSlot {
return { left: 0, right: 0 };
}
+15
View File
@@ -0,0 +1,15 @@
syntax = "proto2";
package blitzkit;
import "i18n.proto";
message Gallery {
repeated Avatar avatars = 1;
}
message Avatar {
required string id = 1;
required I18nString name = 2;
required string extension = 3;
}
+209
View File
@@ -0,0 +1,209 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: gallery.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
import { createBaseI18nString, I18nString } from "./i18n";
export const protobufPackage = "blitzkit";
export interface Gallery {
avatars: Avatar[];
}
export interface Avatar {
id: string;
name: I18nString;
extension: string;
}
export function createBaseGallery(): Gallery {
return { avatars: [] };
}
export const Gallery: MessageFns<Gallery> = {
encode(message: Gallery, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
for (const v of message.avatars) {
Avatar.encode(v!, writer.uint32(10).fork()).join();
}
return writer;
},
decode(input: BinaryReader | Uint8Array, length?: number): Gallery {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseGallery();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
if (tag !== 10) {
break;
}
message.avatars.push(Avatar.decode(reader, reader.uint32()));
continue;
}
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skip(tag & 7);
}
return message;
},
fromJSON(object: any): Gallery {
return {
avatars: globalThis.Array.isArray(object?.avatars) ? object.avatars.map((e: any) => Avatar.fromJSON(e)) : [],
};
},
toJSON(message: Gallery): unknown {
const obj: any = {};
if (message.avatars?.length) {
obj.avatars = message.avatars.map((e) => Avatar.toJSON(e));
}
return obj;
},
create<I extends Exact<DeepPartial<Gallery>, I>>(base?: I): Gallery {
return Gallery.fromPartial(base ?? ({} as any));
},
fromPartial<I extends Exact<DeepPartial<Gallery>, I>>(object: I): Gallery {
const message = createBaseGallery();
message.avatars = object.avatars?.map((e) => Avatar.fromPartial(e)) || [];
return message;
},
};
export function createBaseAvatar(): Avatar {
return { id: "", name: createBaseI18nString(), extension: "" };
}
export const Avatar: MessageFns<Avatar> = {
encode(message: Avatar, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
if (message.id !== "") {
writer.uint32(10).string(message.id);
}
if (message.name !== undefined) {
I18nString.encode(message.name, writer.uint32(18).fork()).join();
}
if (message.extension !== "") {
writer.uint32(26).string(message.extension);
}
return writer;
},
decode(input: BinaryReader | Uint8Array, length?: number): Avatar {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseAvatar();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
if (tag !== 10) {
break;
}
message.id = reader.string();
continue;
}
case 2: {
if (tag !== 18) {
break;
}
message.name = I18nString.decode(reader, reader.uint32());
continue;
}
case 3: {
if (tag !== 26) {
break;
}
message.extension = reader.string();
continue;
}
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skip(tag & 7);
}
return message;
},
fromJSON(object: any): Avatar {
return {
id: globalThis.String(assertSet("Avatar.id", object.id)),
name: I18nString.fromJSON(assertSet("Avatar.name", object.name)),
extension: globalThis.String(assertSet("Avatar.extension", object.extension)),
};
},
toJSON(message: Avatar): unknown {
const obj: any = {};
if (message.id !== "") {
obj.id = message.id;
}
if (message.name !== undefined) {
obj.name = I18nString.toJSON(message.name);
}
if (message.extension !== "") {
obj.extension = message.extension;
}
return obj;
},
create<I extends Exact<DeepPartial<Avatar>, I>>(base?: I): Avatar {
return Avatar.fromPartial(base ?? ({} as any));
},
fromPartial<I extends Exact<DeepPartial<Avatar>, I>>(object: I): Avatar {
const message = createBaseAvatar();
message.id = object.id ?? "";
message.name = (object.name !== undefined && object.name !== null)
? I18nString.fromPartial(object.name)
: createBaseI18nString();
message.extension = object.extension ?? "";
return message;
},
};
type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
export type DeepPartial<T> = T extends Builtin ? T
: T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>>
: T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>>
: T extends { $case: string; value: unknown } ? { $case: T["$case"]; value?: DeepPartial<T["value"]> }
: T extends {} ? { [K in keyof T]?: DeepPartial<T[K]> }
: Partial<T>;
type KeysOfUnion<T> = T extends T ? keyof T : never;
export type Exact<P, I extends P> = P extends Builtin ? P
: P & { [K in keyof P]: Exact<P[K], I[K]> } & { [K in Exclude<keyof I, KeysOfUnion<P>>]: never };
function isSet(value: any): boolean {
return value !== null && value !== undefined;
}
function assertSet<T>(field: string, value: T | undefined): T {
if (!isSet(value)) {
throw new TypeError(`Required field ${field} is not set`);
}
return value as T;
}
export interface MessageFns<T> {
encode(message: T, writer?: BinaryWriter): BinaryWriter;
decode(input: BinaryReader | Uint8Array, length?: number): T;
fromJSON(object: any): T;
toJSON(message: T): unknown;
create<I extends Exact<DeepPartial<T>, I>>(base?: I): T;
fromPartial<I extends Exact<DeepPartial<T>, I>>(object: I): T;
}
@@ -2,7 +2,7 @@ syntax = "proto2";
package blitzkit;
import "packages/core/src/protos/i18n.proto";
import "i18n.proto";
message GameDefinitions {
required string version = 1;
+9 -9
View File
@@ -2,11 +2,11 @@
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: packages/core/src/protos/game_definitions.proto
// source: game_definitions.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
import { I18nString, createBaseI18nString } from "./i18n";
import { createBaseI18nString, I18nString } from "./i18n";
export const protobufPackage = "blitzkit";
@@ -36,7 +36,7 @@ export interface GameModeRole {
consumables: number[];
}
function createBaseGameDefinitions(): GameDefinitions {
export function createBaseGameDefinitions(): GameDefinitions {
return { version: "", nations: [], gameModes: {}, roles: {} };
}
@@ -185,7 +185,7 @@ export const GameDefinitions: MessageFns<GameDefinitions> = {
},
};
function createBaseGameDefinitions_GameModesEntry(): GameDefinitions_GameModesEntry {
export function createBaseGameDefinitions_GameModesEntry(): GameDefinitions_GameModesEntry {
return { key: 0, value: createBaseGameMode() };
}
@@ -260,12 +260,12 @@ export const GameDefinitions_GameModesEntry: MessageFns<GameDefinitions_GameMode
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? GameMode.fromPartial(object.value)
: undefined;
: createBaseGameMode();
return message;
},
};
function createBaseGameDefinitions_RolesEntry(): GameDefinitions_RolesEntry {
export function createBaseGameDefinitions_RolesEntry(): GameDefinitions_RolesEntry {
return { key: 0, value: createBaseGameModeRole() };
}
@@ -338,12 +338,12 @@ export const GameDefinitions_RolesEntry: MessageFns<GameDefinitions_RolesEntry>
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? GameModeRole.fromPartial(object.value)
: undefined;
: createBaseGameModeRole();
return message;
},
};
function createBaseGameMode(): GameMode {
export function createBaseGameMode(): GameMode {
return { name: createBaseI18nString() };
}
@@ -403,7 +403,7 @@ export const GameMode: MessageFns<GameMode> = {
},
};
function createBaseGameModeRole(): GameModeRole {
export function createBaseGameModeRole(): GameModeRole {
return { provisions: [], consumables: [] };
}
+2 -2
View File
@@ -2,7 +2,7 @@
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: packages/core/src/protos/i18n.proto
// source: i18n.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
@@ -97,7 +97,7 @@ export const I18nString: MessageFns<I18nString> = {
},
};
function createBaseI18nString_LocalesEntry(): I18nString_LocalesEntry {
export function createBaseI18nString_LocalesEntry(): I18nString_LocalesEntry {
return { key: "", value: "" };
}
+2
View File
@@ -3,10 +3,12 @@ export * from './average_definitions.ts';
export * from './camouflage_definitions.ts';
export * from './consumable_definitions.ts';
export * from './equipment_definitions.ts';
export * from './gallery.ts';
export * from './game_definitions.ts';
export * from './i18n.ts';
export * from './map_definitions.ts';
export * from './model_definitions.ts';
export * from './popular_tanks.ts';
export * from './provision_definitions.ts';
export * from './rating_leaderboard.ts';
export * from './reviews.ts';
@@ -2,7 +2,7 @@ syntax = "proto2";
package blitzkit;
import "packages/core/src/protos/i18n.proto";
import "i18n.proto";
message MapDefinitions {
map<int32, MapDefinition> maps = 1;
+6 -6
View File
@@ -2,11 +2,11 @@
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: packages/core/src/protos/map_definitions.proto
// source: map_definitions.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
import { I18nString, createBaseI18nString } from "./i18n";
import { createBaseI18nString, I18nString } from "./i18n";
export const protobufPackage = "blitzkit";
@@ -24,7 +24,7 @@ export interface MapDefinition {
name: I18nString;
}
function createBaseMapDefinitions(): MapDefinitions {
export function createBaseMapDefinitions(): MapDefinitions {
return { maps: {} };
}
@@ -103,7 +103,7 @@ export const MapDefinitions: MessageFns<MapDefinitions> = {
},
};
function createBaseMapDefinitions_MapsEntry(): MapDefinitions_MapsEntry {
export function createBaseMapDefinitions_MapsEntry(): MapDefinitions_MapsEntry {
return { key: 0, value: createBaseMapDefinition() };
}
@@ -176,12 +176,12 @@ export const MapDefinitions_MapsEntry: MessageFns<MapDefinitions_MapsEntry> = {
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? MapDefinition.fromPartial(object.value)
: undefined;
: createBaseMapDefinition();
return message;
},
};
function createBaseMapDefinition(): MapDefinition {
export function createBaseMapDefinition(): MapDefinition {
return { id: 0, name: createBaseI18nString() };
}
+22 -22
View File
@@ -2,7 +2,7 @@
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: packages/core/src/protos/model_definitions.proto
// source: model_definitions.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
@@ -110,7 +110,7 @@ export interface PitchLimitsExtrema {
range: number;
}
function createBaseModelDefinitions(): ModelDefinitions {
export function createBaseModelDefinitions(): ModelDefinitions {
return { models: {} };
}
@@ -192,7 +192,7 @@ export const ModelDefinitions: MessageFns<ModelDefinitions> = {
},
};
function createBaseModelDefinitions_ModelsEntry(): ModelDefinitions_ModelsEntry {
export function createBaseModelDefinitions_ModelsEntry(): ModelDefinitions_ModelsEntry {
return { key: 0, value: createBaseModelDefinition() };
}
@@ -265,12 +265,12 @@ export const ModelDefinitions_ModelsEntry: MessageFns<ModelDefinitions_ModelsEnt
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? ModelDefinition.fromPartial(object.value)
: undefined;
: createBaseModelDefinition();
return message;
},
};
function createBaseModelDefinition(): ModelDefinition {
export function createBaseModelDefinition(): ModelDefinition {
return {
armor: createBaseArmor(),
turret_origin: createBaseVector3(),
@@ -472,7 +472,7 @@ export const ModelDefinition: MessageFns<ModelDefinition> = {
},
};
function createBaseModelDefinition_TurretsEntry(): ModelDefinition_TurretsEntry {
export function createBaseModelDefinition_TurretsEntry(): ModelDefinition_TurretsEntry {
return { key: 0, value: createBaseTurretModelDefinition() };
}
@@ -545,12 +545,12 @@ export const ModelDefinition_TurretsEntry: MessageFns<ModelDefinition_TurretsEnt
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? TurretModelDefinition.fromPartial(object.value)
: undefined;
: createBaseTurretModelDefinition();
return message;
},
};
function createBaseModelDefinition_TracksEntry(): ModelDefinition_TracksEntry {
export function createBaseModelDefinition_TracksEntry(): ModelDefinition_TracksEntry {
return { key: 0, value: createBaseTrackModelDefinition() };
}
@@ -623,12 +623,12 @@ export const ModelDefinition_TracksEntry: MessageFns<ModelDefinition_TracksEntry
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? TrackModelDefinition.fromPartial(object.value)
: undefined;
: createBaseTrackModelDefinition();
return message;
},
};
function createBaseArmor(): Armor {
export function createBaseArmor(): Armor {
return { thickness: {}, spaced: [] };
}
@@ -738,7 +738,7 @@ export const Armor: MessageFns<Armor> = {
},
};
function createBaseArmor_ThicknessEntry(): Armor_ThicknessEntry {
export function createBaseArmor_ThicknessEntry(): Armor_ThicknessEntry {
return { key: 0, value: 0 };
}
@@ -814,7 +814,7 @@ export const Armor_ThicknessEntry: MessageFns<Armor_ThicknessEntry> = {
},
};
function createBaseVector3(): Vector3 {
export function createBaseVector3(): Vector3 {
return { x: 0, y: 0, z: 0 };
}
@@ -906,7 +906,7 @@ export const Vector3: MessageFns<Vector3> = {
},
};
function createBaseInitialTurretRotation(): InitialTurretRotation {
export function createBaseInitialTurretRotation(): InitialTurretRotation {
return { yaw: 0, pitch: 0, roll: 0 };
}
@@ -998,7 +998,7 @@ export const InitialTurretRotation: MessageFns<InitialTurretRotation> = {
},
};
function createBaseTurretModelDefinition(): TurretModelDefinition {
export function createBaseTurretModelDefinition(): TurretModelDefinition {
return {
bounding_box: createBaseBoundingBox(),
armor: createBaseArmor(),
@@ -1173,7 +1173,7 @@ export const TurretModelDefinition: MessageFns<TurretModelDefinition> = {
},
};
function createBaseTurretModelDefinition_GunsEntry(): TurretModelDefinition_GunsEntry {
export function createBaseTurretModelDefinition_GunsEntry(): TurretModelDefinition_GunsEntry {
return { key: 0, value: createBaseGunModelDefinition() };
}
@@ -1248,12 +1248,12 @@ export const TurretModelDefinition_GunsEntry: MessageFns<TurretModelDefinition_G
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? GunModelDefinition.fromPartial(object.value)
: undefined;
: createBaseGunModelDefinition();
return message;
},
};
function createBaseYawLimits(): YawLimits {
export function createBaseYawLimits(): YawLimits {
return { min: 0, max: 0 };
}
@@ -1329,7 +1329,7 @@ export const YawLimits: MessageFns<YawLimits> = {
},
};
function createBaseBoundingBox(): BoundingBox {
export function createBaseBoundingBox(): BoundingBox {
return { min: createBaseVector3(), max: createBaseVector3() };
}
@@ -1409,7 +1409,7 @@ export const BoundingBox: MessageFns<BoundingBox> = {
},
};
function createBaseTrackModelDefinition(): TrackModelDefinition {
export function createBaseTrackModelDefinition(): TrackModelDefinition {
return { thickness: 0, origin: createBaseVector3() };
}
@@ -1487,7 +1487,7 @@ export const TrackModelDefinition: MessageFns<TrackModelDefinition> = {
},
};
function createBaseGunModelDefinition(): GunModelDefinition {
export function createBaseGunModelDefinition(): GunModelDefinition {
return { armor: createBaseArmor(), thickness: 0, model_id: 0, pitch: createBasePitchLimits(), mask: undefined };
}
@@ -1615,7 +1615,7 @@ export const GunModelDefinition: MessageFns<GunModelDefinition> = {
},
};
function createBasePitchLimits(): PitchLimits {
export function createBasePitchLimits(): PitchLimits {
return { min: 0, max: 0, front: undefined, back: undefined, transition: undefined };
}
@@ -1743,7 +1743,7 @@ export const PitchLimits: MessageFns<PitchLimits> = {
},
};
function createBasePitchLimitsExtrema(): PitchLimitsExtrema {
export function createBasePitchLimitsExtrema(): PitchLimitsExtrema {
return { min: 0, max: 0, range: 0 };
}
@@ -0,0 +1,12 @@
syntax = "proto2";
package blitzkit;
message PopularTanks {
repeated PopularTank tanks = 1;
}
message PopularTank {
required uint32 id = 1;
required uint32 views = 2; // views in the last 7 days
}
+190
View File
@@ -0,0 +1,190 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: popular_tanks.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
export const protobufPackage = "blitzkit";
export interface PopularTanks {
tanks: PopularTank[];
}
export interface PopularTank {
id: number;
/** views in the last 7 days */
views: number;
}
export function createBasePopularTanks(): PopularTanks {
return { tanks: [] };
}
export const PopularTanks: MessageFns<PopularTanks> = {
encode(message: PopularTanks, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
for (const v of message.tanks) {
PopularTank.encode(v!, writer.uint32(10).fork()).join();
}
return writer;
},
decode(input: BinaryReader | Uint8Array, length?: number): PopularTanks {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBasePopularTanks();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
if (tag !== 10) {
break;
}
message.tanks.push(PopularTank.decode(reader, reader.uint32()));
continue;
}
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skip(tag & 7);
}
return message;
},
fromJSON(object: any): PopularTanks {
return {
tanks: globalThis.Array.isArray(object?.tanks) ? object.tanks.map((e: any) => PopularTank.fromJSON(e)) : [],
};
},
toJSON(message: PopularTanks): unknown {
const obj: any = {};
if (message.tanks?.length) {
obj.tanks = message.tanks.map((e) => PopularTank.toJSON(e));
}
return obj;
},
create<I extends Exact<DeepPartial<PopularTanks>, I>>(base?: I): PopularTanks {
return PopularTanks.fromPartial(base ?? ({} as any));
},
fromPartial<I extends Exact<DeepPartial<PopularTanks>, I>>(object: I): PopularTanks {
const message = createBasePopularTanks();
message.tanks = object.tanks?.map((e) => PopularTank.fromPartial(e)) || [];
return message;
},
};
export function createBasePopularTank(): PopularTank {
return { id: 0, views: 0 };
}
export const PopularTank: MessageFns<PopularTank> = {
encode(message: PopularTank, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
if (message.id !== 0) {
writer.uint32(8).uint32(message.id);
}
if (message.views !== 0) {
writer.uint32(16).uint32(message.views);
}
return writer;
},
decode(input: BinaryReader | Uint8Array, length?: number): PopularTank {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBasePopularTank();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
if (tag !== 8) {
break;
}
message.id = reader.uint32();
continue;
}
case 2: {
if (tag !== 16) {
break;
}
message.views = reader.uint32();
continue;
}
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skip(tag & 7);
}
return message;
},
fromJSON(object: any): PopularTank {
return {
id: globalThis.Number(assertSet("PopularTank.id", object.id)),
views: globalThis.Number(assertSet("PopularTank.views", object.views)),
};
},
toJSON(message: PopularTank): unknown {
const obj: any = {};
if (message.id !== 0) {
obj.id = Math.round(message.id);
}
if (message.views !== 0) {
obj.views = Math.round(message.views);
}
return obj;
},
create<I extends Exact<DeepPartial<PopularTank>, I>>(base?: I): PopularTank {
return PopularTank.fromPartial(base ?? ({} as any));
},
fromPartial<I extends Exact<DeepPartial<PopularTank>, I>>(object: I): PopularTank {
const message = createBasePopularTank();
message.id = object.id ?? 0;
message.views = object.views ?? 0;
return message;
},
};
type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
export type DeepPartial<T> = T extends Builtin ? T
: T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>>
: T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>>
: T extends { $case: string; value: unknown } ? { $case: T["$case"]; value?: DeepPartial<T["value"]> }
: T extends {} ? { [K in keyof T]?: DeepPartial<T[K]> }
: Partial<T>;
type KeysOfUnion<T> = T extends T ? keyof T : never;
export type Exact<P, I extends P> = P extends Builtin ? P
: P & { [K in keyof P]: Exact<P[K], I[K]> } & { [K in Exclude<keyof I, KeysOfUnion<P>>]: never };
function isSet(value: any): boolean {
return value !== null && value !== undefined;
}
function assertSet<T>(field: string, value: T | undefined): T {
if (!isSet(value)) {
throw new TypeError(`Required field ${field} is not set`);
}
return value as T;
}
export interface MessageFns<T> {
encode(message: T, writer?: BinaryWriter): BinaryWriter;
decode(input: BinaryReader | Uint8Array, length?: number): T;
fromJSON(object: any): T;
toJSON(message: T): unknown;
create<I extends Exact<DeepPartial<T>, I>>(base?: I): T;
fromPartial<I extends Exact<DeepPartial<T>, I>>(object: I): T;
}
@@ -2,8 +2,8 @@ syntax = "proto2";
package blitzkit;
import "packages/core/src/protos/consumable_definitions.proto";
import "packages/core/src/protos/i18n.proto";
import "consumable_definitions.proto";
import "i18n.proto";
message ProvisionDefinitions {
map<uint32, Provision> provisions = 1;
@@ -2,12 +2,12 @@
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: packages/core/src/protos/provision_definitions.proto
// source: provision_definitions.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
import { ConsumableTankFilter } from "./consumable_definitions";
import { I18nString, createBaseI18nString } from "./i18n";
import { createBaseI18nString, I18nString } from "./i18n";
export const protobufPackage = "blitzkit";
@@ -29,7 +29,7 @@ export interface Provision {
exclude: ConsumableTankFilter[];
}
function createBaseProvisionDefinitions(): ProvisionDefinitions {
export function createBaseProvisionDefinitions(): ProvisionDefinitions {
return { provisions: {} };
}
@@ -111,7 +111,7 @@ export const ProvisionDefinitions: MessageFns<ProvisionDefinitions> = {
},
};
function createBaseProvisionDefinitions_ProvisionsEntry(): ProvisionDefinitions_ProvisionsEntry {
export function createBaseProvisionDefinitions_ProvisionsEntry(): ProvisionDefinitions_ProvisionsEntry {
return { key: 0, value: createBaseProvision() };
}
@@ -188,12 +188,12 @@ export const ProvisionDefinitions_ProvisionsEntry: MessageFns<ProvisionDefinitio
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? Provision.fromPartial(object.value)
: undefined;
: createBaseProvision();
return message;
},
};
function createBaseProvision(): Provision {
export function createBaseProvision(): Provision {
return { id: 0, name: createBaseI18nString(), crew: undefined, game_mode_exclusive: false, include: [], exclude: [] };
}
@@ -2,7 +2,7 @@
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: packages/core/src/protos/rating_leaderboard.proto
// source: rating_leaderboard.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
@@ -36,7 +36,7 @@ export interface RatingLeaderboardEntryV2 {
kills: number;
}
function createBaseRatingLeaderboard(): RatingLeaderboard {
export function createBaseRatingLeaderboard(): RatingLeaderboard {
return { version: undefined };
}
@@ -121,7 +121,7 @@ export const RatingLeaderboard: MessageFns<RatingLeaderboard> = {
},
};
function createBaseRatingLeaderboardV1(): RatingLeaderboardV1 {
export function createBaseRatingLeaderboardV1(): RatingLeaderboardV1 {
return { entries: [] };
}
@@ -183,7 +183,7 @@ export const RatingLeaderboardV1: MessageFns<RatingLeaderboardV1> = {
},
};
function createBaseRatingLeaderboardEntryV1(): RatingLeaderboardEntryV1 {
export function createBaseRatingLeaderboardEntryV1(): RatingLeaderboardEntryV1 {
return { id: 0, score: 0 };
}
@@ -259,7 +259,7 @@ export const RatingLeaderboardEntryV1: MessageFns<RatingLeaderboardEntryV1> = {
},
};
function createBaseRatingLeaderboardV2(): RatingLeaderboardV2 {
export function createBaseRatingLeaderboardV2(): RatingLeaderboardV2 {
return { entries: [] };
}
@@ -321,7 +321,7 @@ export const RatingLeaderboardV2: MessageFns<RatingLeaderboardV2> = {
},
};
function createBaseRatingLeaderboardEntryV2(): RatingLeaderboardEntryV2 {
export function createBaseRatingLeaderboardEntryV2(): RatingLeaderboardEntryV2 {
return { id: 0, score: 0, battles: 0, wins: 0, survived: 0, damage: 0, kills: 0 };
}
+6 -6
View File
@@ -2,7 +2,7 @@
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: packages/core/src/protos/reviews.proto
// source: reviews.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
@@ -28,7 +28,7 @@ export interface Video {
author: string;
}
function createBaseReviews(): Reviews {
export function createBaseReviews(): Reviews {
return { reviews: {} };
}
@@ -107,7 +107,7 @@ export const Reviews: MessageFns<Reviews> = {
},
};
function createBaseReviews_ReviewsEntry(): Reviews_ReviewsEntry {
export function createBaseReviews_ReviewsEntry(): Reviews_ReviewsEntry {
return { key: 0, value: createBaseReview() };
}
@@ -180,12 +180,12 @@ export const Reviews_ReviewsEntry: MessageFns<Reviews_ReviewsEntry> = {
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? Review.fromPartial(object.value)
: undefined;
: createBaseReview();
return message;
},
};
function createBaseReview(): Review {
export function createBaseReview(): Review {
return { last_updated: 0, videos: [] };
}
@@ -261,7 +261,7 @@ export const Review: MessageFns<Review> = {
},
};
function createBaseVideo(): Video {
export function createBaseVideo(): Video {
return { id: "", author: "" };
}
@@ -2,7 +2,7 @@
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: packages/core/src/protos/skill_definitions.proto
// source: skill_definitions.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
@@ -23,7 +23,7 @@ export interface Skill {
skills: string[];
}
function createBaseSkillDefinitions(): SkillDefinitions {
export function createBaseSkillDefinitions(): SkillDefinitions {
return { classes: {} };
}
@@ -102,7 +102,7 @@ export const SkillDefinitions: MessageFns<SkillDefinitions> = {
},
};
function createBaseSkillDefinitions_ClassesEntry(): SkillDefinitions_ClassesEntry {
export function createBaseSkillDefinitions_ClassesEntry(): SkillDefinitions_ClassesEntry {
return { key: 0, value: createBaseSkill() };
}
@@ -175,12 +175,14 @@ export const SkillDefinitions_ClassesEntry: MessageFns<SkillDefinitions_ClassesE
): SkillDefinitions_ClassesEntry {
const message = createBaseSkillDefinitions_ClassesEntry();
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null) ? Skill.fromPartial(object.value) : undefined;
message.value = (object.value !== undefined && object.value !== null)
? Skill.fromPartial(object.value)
: createBaseSkill();
return message;
},
};
function createBaseSkill(): Skill {
export function createBaseSkill(): Skill {
return { skills: [] };
}
+11 -11
View File
@@ -2,7 +2,7 @@ syntax = "proto2";
package blitzkit;
import "packages/core/src/protos/i18n.proto";
import "i18n.proto";
message TankDefinitions {
map<uint32, TankDefinition> tanks = 1;
@@ -10,16 +10,16 @@ message TankDefinitions {
message TankDefinition {
required uint32 id = 1;
map<uint32, uint32> roles = 2;
required bool fixed_camouflage = 4;
repeated int32 camouflages = 5;
repeated int32 ancestors = 6;
repeated int32 successors = 7;
repeated Crew crew = 8;
required uint32 health = 9;
required string nation = 10;
required I18nString name = 11;
optional I18nString name_full = 12;
required string slug = 2;
map<uint32, uint32> roles = 3;
required bool fixed_camouflage = 5;
repeated int32 camouflages = 6;
repeated int32 ancestors = 7;
repeated int32 successors = 8;
repeated Crew crew = 9;
required uint32 health = 10;
required string nation = 11;
required I18nString name = 12;
required TankType type = 13;
required uint32 max_consumables = 14;
required uint32 max_provisions = 15;
+145 -145
View File
@@ -2,27 +2,27 @@
// versions:
// protoc-gen-ts_proto v2.2.2
// protoc v5.28.2
// source: packages/core/src/protos/tank_definitions.proto
// source: tank_definitions.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
import { I18nString, createBaseI18nString } from "./i18n";
import { createBaseI18nString, I18nString } from "./i18n";
export const protobufPackage = "blitzkit";
export enum TankPriceType {
CREDITS = 0,
GOLD = 1,
TANK_PRICE_TYPE_CREDITS = 0,
TANK_PRICE_TYPE_GOLD = 1,
}
export function tankPriceTypeFromJSON(object: any): TankPriceType {
switch (object) {
case 0:
case "TANK_PRICE_TYPE_CREDITS":
return TankPriceType.CREDITS;
return TankPriceType.TANK_PRICE_TYPE_CREDITS;
case 1:
case "TANK_PRICE_TYPE_GOLD":
return TankPriceType.GOLD;
return TankPriceType.TANK_PRICE_TYPE_GOLD;
default:
throw new globalThis.Error("Unrecognized enum value " + object + " for enum TankPriceType");
}
@@ -30,9 +30,9 @@ export function tankPriceTypeFromJSON(object: any): TankPriceType {
export function tankPriceTypeToJSON(object: TankPriceType): string {
switch (object) {
case TankPriceType.CREDITS:
case TankPriceType.TANK_PRICE_TYPE_CREDITS:
return "TANK_PRICE_TYPE_CREDITS";
case TankPriceType.GOLD:
case TankPriceType.TANK_PRICE_TYPE_GOLD:
return "TANK_PRICE_TYPE_GOLD";
default:
throw new globalThis.Error("Unrecognized enum value " + object + " for enum TankPriceType");
@@ -40,26 +40,26 @@ export function tankPriceTypeToJSON(object: TankPriceType): string {
}
export enum ShellType {
AP = 0,
APCR = 1,
HEAT = 2,
HE = 3,
SHELL_TYPE_AP = 0,
SHELL_TYPE_APCR = 1,
SHELL_TYPE_HEAT = 2,
SHELL_TYPE_HE = 3,
}
export function shellTypeFromJSON(object: any): ShellType {
switch (object) {
case 0:
case "SHELL_TYPE_AP":
return ShellType.AP;
return ShellType.SHELL_TYPE_AP;
case 1:
case "SHELL_TYPE_APCR":
return ShellType.APCR;
return ShellType.SHELL_TYPE_APCR;
case 2:
case "SHELL_TYPE_HEAT":
return ShellType.HEAT;
return ShellType.SHELL_TYPE_HEAT;
case 3:
case "SHELL_TYPE_HE":
return ShellType.HE;
return ShellType.SHELL_TYPE_HE;
default:
throw new globalThis.Error("Unrecognized enum value " + object + " for enum ShellType");
}
@@ -67,13 +67,13 @@ export function shellTypeFromJSON(object: any): ShellType {
export function shellTypeToJSON(object: ShellType): string {
switch (object) {
case ShellType.AP:
case ShellType.SHELL_TYPE_AP:
return "SHELL_TYPE_AP";
case ShellType.APCR:
case ShellType.SHELL_TYPE_APCR:
return "SHELL_TYPE_APCR";
case ShellType.HEAT:
case ShellType.SHELL_TYPE_HEAT:
return "SHELL_TYPE_HEAT";
case ShellType.HE:
case ShellType.SHELL_TYPE_HE:
return "SHELL_TYPE_HE";
default:
throw new globalThis.Error("Unrecognized enum value " + object + " for enum ShellType");
@@ -81,30 +81,30 @@ export function shellTypeToJSON(object: ShellType): string {
}
export enum ModuleType {
VEHICLE = 0,
ENGINE = 1,
TRACKS = 2,
TURRET = 3,
GUN = 4,
MODULE_TYPE_VEHICLE = 0,
MODULE_TYPE_ENGINE = 1,
MODULE_TYPE_TRACKS = 2,
MODULE_TYPE_TURRET = 3,
MODULE_TYPE_GUN = 4,
}
export function moduleTypeFromJSON(object: any): ModuleType {
switch (object) {
case 0:
case "MODULE_TYPE_VEHICLE":
return ModuleType.VEHICLE;
return ModuleType.MODULE_TYPE_VEHICLE;
case 1:
case "MODULE_TYPE_ENGINE":
return ModuleType.ENGINE;
return ModuleType.MODULE_TYPE_ENGINE;
case 2:
case "MODULE_TYPE_TRACKS":
return ModuleType.TRACKS;
return ModuleType.MODULE_TYPE_TRACKS;
case 3:
case "MODULE_TYPE_TURRET":
return ModuleType.TURRET;
return ModuleType.MODULE_TYPE_TURRET;
case 4:
case "MODULE_TYPE_GUN":
return ModuleType.GUN;
return ModuleType.MODULE_TYPE_GUN;
default:
throw new globalThis.Error("Unrecognized enum value " + object + " for enum ModuleType");
}
@@ -112,15 +112,15 @@ export function moduleTypeFromJSON(object: any): ModuleType {
export function moduleTypeToJSON(object: ModuleType): string {
switch (object) {
case ModuleType.VEHICLE:
case ModuleType.MODULE_TYPE_VEHICLE:
return "MODULE_TYPE_VEHICLE";
case ModuleType.ENGINE:
case ModuleType.MODULE_TYPE_ENGINE:
return "MODULE_TYPE_ENGINE";
case ModuleType.TRACKS:
case ModuleType.MODULE_TYPE_TRACKS:
return "MODULE_TYPE_TRACKS";
case ModuleType.TURRET:
case ModuleType.MODULE_TYPE_TURRET:
return "MODULE_TYPE_TURRET";
case ModuleType.GUN:
case ModuleType.MODULE_TYPE_GUN:
return "MODULE_TYPE_GUN";
default:
throw new globalThis.Error("Unrecognized enum value " + object + " for enum ModuleType");
@@ -128,26 +128,26 @@ export function moduleTypeToJSON(object: ModuleType): string {
}
export enum TankClass {
LIGHT = 0,
MEDIUM = 1,
HEAVY = 2,
TANK_DESTROYER = 3,
TANK_CLASS_LIGHT = 0,
TANK_CLASS_MEDIUM = 1,
TANK_CLASS_HEAVY = 2,
TANK_CLASS_TANK_DESTROYER = 3,
}
export function tankClassFromJSON(object: any): TankClass {
switch (object) {
case 0:
case "TANK_CLASS_LIGHT":
return TankClass.LIGHT;
return TankClass.TANK_CLASS_LIGHT;
case 1:
case "TANK_CLASS_MEDIUM":
return TankClass.MEDIUM;
return TankClass.TANK_CLASS_MEDIUM;
case 2:
case "TANK_CLASS_HEAVY":
return TankClass.HEAVY;
return TankClass.TANK_CLASS_HEAVY;
case 3:
case "TANK_CLASS_TANK_DESTROYER":
return TankClass.TANK_DESTROYER;
return TankClass.TANK_CLASS_TANK_DESTROYER;
default:
throw new globalThis.Error("Unrecognized enum value " + object + " for enum TankClass");
}
@@ -155,13 +155,13 @@ export function tankClassFromJSON(object: any): TankClass {
export function tankClassToJSON(object: TankClass): string {
switch (object) {
case TankClass.LIGHT:
case TankClass.TANK_CLASS_LIGHT:
return "TANK_CLASS_LIGHT";
case TankClass.MEDIUM:
case TankClass.TANK_CLASS_MEDIUM:
return "TANK_CLASS_MEDIUM";
case TankClass.HEAVY:
case TankClass.TANK_CLASS_HEAVY:
return "TANK_CLASS_HEAVY";
case TankClass.TANK_DESTROYER:
case TankClass.TANK_CLASS_TANK_DESTROYER:
return "TANK_CLASS_TANK_DESTROYER";
default:
throw new globalThis.Error("Unrecognized enum value " + object + " for enum TankClass");
@@ -169,22 +169,22 @@ export function tankClassToJSON(object: TankClass): string {
}
export enum TankType {
RESEARCHABLE = 0,
PREMIUM = 1,
COLLECTOR = 2,
TANK_TYPE_RESEARCHABLE = 0,
TANK_TYPE_PREMIUM = 1,
TANK_TYPE_COLLECTOR = 2,
}
export function tankTypeFromJSON(object: any): TankType {
switch (object) {
case 0:
case "TANK_TYPE_RESEARCHABLE":
return TankType.RESEARCHABLE;
return TankType.TANK_TYPE_RESEARCHABLE;
case 1:
case "TANK_TYPE_PREMIUM":
return TankType.PREMIUM;
return TankType.TANK_TYPE_PREMIUM;
case 2:
case "TANK_TYPE_COLLECTOR":
return TankType.COLLECTOR;
return TankType.TANK_TYPE_COLLECTOR;
default:
throw new globalThis.Error("Unrecognized enum value " + object + " for enum TankType");
}
@@ -192,11 +192,11 @@ export function tankTypeFromJSON(object: any): TankType {
export function tankTypeToJSON(object: TankType): string {
switch (object) {
case TankType.RESEARCHABLE:
case TankType.TANK_TYPE_RESEARCHABLE:
return "TANK_TYPE_RESEARCHABLE";
case TankType.PREMIUM:
case TankType.TANK_TYPE_PREMIUM:
return "TANK_TYPE_PREMIUM";
case TankType.COLLECTOR:
case TankType.TANK_TYPE_COLLECTOR:
return "TANK_TYPE_COLLECTOR";
default:
throw new globalThis.Error("Unrecognized enum value " + object + " for enum TankType");
@@ -204,30 +204,30 @@ export function tankTypeToJSON(object: TankType): string {
}
export enum CrewType {
COMMANDER = 0,
RADIOMAN = 1,
GUNNER = 2,
DRIVER = 3,
LOADER = 4,
CREW_TYPE_COMMANDER = 0,
CREW_TYPE_RADIOMAN = 1,
CREW_TYPE_GUNNER = 2,
CREW_TYPE_DRIVER = 3,
CREW_TYPE_LOADER = 4,
}
export function crewTypeFromJSON(object: any): CrewType {
switch (object) {
case 0:
case "CREW_TYPE_COMMANDER":
return CrewType.COMMANDER;
return CrewType.CREW_TYPE_COMMANDER;
case 1:
case "CREW_TYPE_RADIOMAN":
return CrewType.RADIOMAN;
return CrewType.CREW_TYPE_RADIOMAN;
case 2:
case "CREW_TYPE_GUNNER":
return CrewType.GUNNER;
return CrewType.CREW_TYPE_GUNNER;
case 3:
case "CREW_TYPE_DRIVER":
return CrewType.DRIVER;
return CrewType.CREW_TYPE_DRIVER;
case 4:
case "CREW_TYPE_LOADER":
return CrewType.LOADER;
return CrewType.CREW_TYPE_LOADER;
default:
throw new globalThis.Error("Unrecognized enum value " + object + " for enum CrewType");
}
@@ -235,15 +235,15 @@ export function crewTypeFromJSON(object: any): CrewType {
export function crewTypeToJSON(object: CrewType): string {
switch (object) {
case CrewType.COMMANDER:
case CrewType.CREW_TYPE_COMMANDER:
return "CREW_TYPE_COMMANDER";
case CrewType.RADIOMAN:
case CrewType.CREW_TYPE_RADIOMAN:
return "CREW_TYPE_RADIOMAN";
case CrewType.GUNNER:
case CrewType.CREW_TYPE_GUNNER:
return "CREW_TYPE_GUNNER";
case CrewType.DRIVER:
case CrewType.CREW_TYPE_DRIVER:
return "CREW_TYPE_DRIVER";
case CrewType.LOADER:
case CrewType.CREW_TYPE_LOADER:
return "CREW_TYPE_LOADER";
default:
throw new globalThis.Error("Unrecognized enum value " + object + " for enum CrewType");
@@ -261,6 +261,7 @@ export interface TankDefinitions_TanksEntry {
export interface TankDefinition {
id: number;
slug: string;
roles: { [key: number]: number };
fixed_camouflage: boolean;
camouflages: number[];
@@ -270,7 +271,6 @@ export interface TankDefinition {
health: number;
nation: string;
name: I18nString;
name_full?: I18nString | undefined;
type: TankType;
max_consumables: number;
max_provisions: number;
@@ -448,7 +448,7 @@ export interface Crew {
substitute: CrewType[];
}
function createBaseTankDefinitions(): TankDefinitions {
export function createBaseTankDefinitions(): TankDefinitions {
return { tanks: {} };
}
@@ -530,7 +530,7 @@ export const TankDefinitions: MessageFns<TankDefinitions> = {
},
};
function createBaseTankDefinitions_TanksEntry(): TankDefinitions_TanksEntry {
export function createBaseTankDefinitions_TanksEntry(): TankDefinitions_TanksEntry {
return { key: 0, value: createBaseTankDefinition() };
}
@@ -603,14 +603,15 @@ export const TankDefinitions_TanksEntry: MessageFns<TankDefinitions_TanksEntry>
message.key = object.key ?? 0;
message.value = (object.value !== undefined && object.value !== null)
? TankDefinition.fromPartial(object.value)
: undefined;
: createBaseTankDefinition();
return message;
},
};
function createBaseTankDefinition(): TankDefinition {
export function createBaseTankDefinition(): TankDefinition {
return {
id: 0,
slug: "",
roles: {},
fixed_camouflage: false,
camouflages: [],
@@ -620,7 +621,6 @@ function createBaseTankDefinition(): TankDefinition {
health: 0,
nation: "",
name: createBaseI18nString(),
name_full: undefined,
type: 0,
max_consumables: 0,
max_provisions: 0,
@@ -648,41 +648,41 @@ export const TankDefinition: MessageFns<TankDefinition> = {
if (message.id !== 0) {
writer.uint32(8).uint32(message.id);
}
if (message.slug !== "") {
writer.uint32(18).string(message.slug);
}
Object.entries(message.roles).forEach(([key, value]) => {
TankDefinition_RolesEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).join();
TankDefinition_RolesEntry.encode({ key: key as any, value }, writer.uint32(26).fork()).join();
});
if (message.fixed_camouflage !== false) {
writer.uint32(32).bool(message.fixed_camouflage);
writer.uint32(40).bool(message.fixed_camouflage);
}
writer.uint32(42).fork();
writer.uint32(50).fork();
for (const v of message.camouflages) {
writer.int32(v);
}
writer.join();
writer.uint32(50).fork();
writer.uint32(58).fork();
for (const v of message.ancestors) {
writer.int32(v);
}
writer.join();
writer.uint32(58).fork();
writer.uint32(66).fork();
for (const v of message.successors) {
writer.int32(v);
}
writer.join();
for (const v of message.crew) {
Crew.encode(v!, writer.uint32(66).fork()).join();
Crew.encode(v!, writer.uint32(74).fork()).join();
}
if (message.health !== 0) {
writer.uint32(72).uint32(message.health);
writer.uint32(80).uint32(message.health);
}
if (message.nation !== "") {
writer.uint32(82).string(message.nation);
writer.uint32(90).string(message.nation);
}
if (message.name !== undefined) {
I18nString.encode(message.name, writer.uint32(90).fork()).join();
}
if (message.name_full !== undefined) {
I18nString.encode(message.name_full, writer.uint32(98).fork()).join();
I18nString.encode(message.name, writer.uint32(98).fork()).join();
}
if (message.type !== 0) {
writer.uint32(104).int32(message.type);
@@ -764,28 +764,36 @@ export const TankDefinition: MessageFns<TankDefinition> = {
break;
}
const entry2 = TankDefinition_RolesEntry.decode(reader, reader.uint32());
if (entry2.value !== undefined) {
message.roles[entry2.key] = entry2.value;
message.slug = reader.string();
continue;
}
case 3: {
if (tag !== 26) {
break;
}
const entry3 = TankDefinition_RolesEntry.decode(reader, reader.uint32());
if (entry3.value !== undefined) {
message.roles[entry3.key] = entry3.value;
}
continue;
}
case 4: {
if (tag !== 32) {
case 5: {
if (tag !== 40) {
break;
}
message.fixed_camouflage = reader.bool();
continue;
}
case 5: {
if (tag === 40) {
case 6: {
if (tag === 48) {
message.camouflages.push(reader.int32());
continue;
}
if (tag === 42) {
if (tag === 50) {
const end2 = reader.uint32() + reader.pos;
while (reader.pos < end2) {
message.camouflages.push(reader.int32());
@@ -796,14 +804,14 @@ export const TankDefinition: MessageFns<TankDefinition> = {
break;
}
case 6: {
if (tag === 48) {
case 7: {
if (tag === 56) {
message.ancestors.push(reader.int32());
continue;
}
if (tag === 50) {
if (tag === 58) {
const end2 = reader.uint32() + reader.pos;
while (reader.pos < end2) {
message.ancestors.push(reader.int32());
@@ -814,14 +822,14 @@ export const TankDefinition: MessageFns<TankDefinition> = {
break;
}
case 7: {
if (tag === 56) {
case 8: {
if (tag === 64) {
message.successors.push(reader.int32());
continue;
}
if (tag === 58) {
if (tag === 66) {
const end2 = reader.uint32() + reader.pos;
while (reader.pos < end2) {
message.successors.push(reader.int32());
@@ -832,36 +840,28 @@ export const TankDefinition: MessageFns<TankDefinition> = {
break;
}
case 8: {
if (tag !== 66) {
case 9: {
if (tag !== 74) {
break;
}
message.crew.push(Crew.decode(reader, reader.uint32()));
continue;
}
case 9: {
if (tag !== 72) {
case 10: {
if (tag !== 80) {
break;
}
message.health = reader.uint32();
continue;
}
case 10: {
if (tag !== 82) {
break;
}
message.nation = reader.string();
continue;
}
case 11: {
if (tag !== 90) {
break;
}
message.name = I18nString.decode(reader, reader.uint32());
message.nation = reader.string();
continue;
}
case 12: {
@@ -869,7 +869,7 @@ export const TankDefinition: MessageFns<TankDefinition> = {
break;
}
message.name_full = I18nString.decode(reader, reader.uint32());
message.name = I18nString.decode(reader, reader.uint32());
continue;
}
case 13: {
@@ -1036,6 +1036,7 @@ export const TankDefinition: MessageFns<TankDefinition> = {
fromJSON(object: any): TankDefinition {
return {
id: globalThis.Number(assertSet("TankDefinition.id", object.id)),
slug: globalThis.String(assertSet("TankDefinition.slug", object.slug)),
roles: isObject(object.roles)
? Object.entries(object.roles).reduce<{ [key: number]: number }>((acc, [key, value]) => {
acc[globalThis.Number(key)] = Number(value);
@@ -1052,11 +1053,12 @@ export const TankDefinition: MessageFns<TankDefinition> = {
successors: globalThis.Array.isArray(object?.successors)
? object.successors.map((e: any) => globalThis.Number(e))
: [],
crew: globalThis.Array.isArray(object?.crew) ? object.crew.map((e: any) => Crew.fromJSON(e)) : [],
crew: globalThis.Array.isArray(object?.crew)
? object.crew.map((e: any) => Crew.fromJSON(e))
: [],
health: globalThis.Number(assertSet("TankDefinition.health", object.health)),
nation: globalThis.String(assertSet("TankDefinition.nation", object.nation)),
name: I18nString.fromJSON(assertSet("TankDefinition.name", object.name)),
name_full: isSet(object.name_full) ? I18nString.fromJSON(object.name_full) : undefined,
type: tankTypeFromJSON(assertSet("TankDefinition.type", object.type)),
max_consumables: globalThis.Number(assertSet("TankDefinition.max_consumables", object.max_consumables)),
max_provisions: globalThis.Number(assertSet("TankDefinition.max_provisions", object.max_provisions)),
@@ -1090,6 +1092,9 @@ export const TankDefinition: MessageFns<TankDefinition> = {
if (message.id !== 0) {
obj.id = Math.round(message.id);
}
if (message.slug !== "") {
obj.slug = message.slug;
}
if (message.roles) {
const entries = Object.entries(message.roles);
if (entries.length > 0) {
@@ -1123,9 +1128,6 @@ export const TankDefinition: MessageFns<TankDefinition> = {
if (message.name !== undefined) {
obj.name = I18nString.toJSON(message.name);
}
if (message.name_full !== undefined) {
obj.name_full = I18nString.toJSON(message.name_full);
}
if (message.type !== 0) {
obj.type = tankTypeToJSON(message.type);
}
@@ -1192,6 +1194,7 @@ export const TankDefinition: MessageFns<TankDefinition> = {
fromPartial<I extends Exact<DeepPartial<TankDefinition>, I>>(object: I): TankDefinition {
const message = createBaseTankDefinition();
message.id = object.id ?? 0;
message.slug = object.slug ?? "";
message.roles = Object.entries(object.roles ?? {}).reduce<{ [key: number]: number }>((acc, [key, value]) => {
if (value !== undefined) {
acc[globalThis.Number(key)] = globalThis.Number(value);
@@ -1208,9 +1211,6 @@ export const TankDefinition: MessageFns<TankDefinition> = {
message.name = (object.name !== undefined && object.name !== null)
? I18nString.fromPartial(object.name)
: createBaseI18nString();
message.name_full = (object.name_full !== undefined && object.name_full !== null)
? I18nString.fromPartial(object.name_full)
: undefined;
message.type = object.type ?? 0;
message.max_consumables = object.max_consumables ?? 0;
message.max_provisions = object.max_provisions ?? 0;
@@ -1238,7 +1238,7 @@ export const TankDefinition: MessageFns<TankDefinition> = {
},
};
function createBaseTankDefinition_RolesEntry(): TankDefinition_RolesEntry {
export function createBaseTankDefinition_RolesEntry(): TankDefinition_RolesEntry {
return { key: 0, value: 0 };
}
@@ -1314,7 +1314,7 @@ export const TankDefinition_RolesEntry: MessageFns<TankDefinition_RolesEntry> =
},
};
function createBaseResearchCost(): ResearchCost {
export function createBaseResearchCost(): ResearchCost {
return { research_cost_type: undefined };
}
@@ -1413,7 +1413,7 @@ export const ResearchCost: MessageFns<ResearchCost> = {
},
};
function createBaseResearchCostSeasonalTokens(): ResearchCostSeasonalTokens {
export function createBaseResearchCostSeasonalTokens(): ResearchCostSeasonalTokens {
return { season: 0, tokens: 0 };
}
@@ -1489,7 +1489,7 @@ export const ResearchCostSeasonalTokens: MessageFns<ResearchCostSeasonalTokens>
},
};
function createBaseTankPrice(): TankPrice {
export function createBaseTankPrice(): TankPrice {
return { type: 0, value: 0 };
}
@@ -1565,7 +1565,7 @@ export const TankPrice: MessageFns<TankPrice> = {
},
};
function createBaseTrackDefinition(): TrackDefinition {
export function createBaseTrackDefinition(): TrackDefinition {
return {
id: 0,
tier: 0,
@@ -1820,7 +1820,7 @@ export const TrackDefinition: MessageFns<TrackDefinition> = {
},
};
function createBaseEngineDefinition(): EngineDefinition {
export function createBaseEngineDefinition(): EngineDefinition {
return {
id: 0,
name: createBaseI18nString(),
@@ -2005,7 +2005,7 @@ export const EngineDefinition: MessageFns<EngineDefinition> = {
},
};
function createBaseTurretDefinition(): TurretDefinition {
export function createBaseTurretDefinition(): TurretDefinition {
return {
id: 0,
health: 0,
@@ -2224,7 +2224,7 @@ export const TurretDefinition: MessageFns<TurretDefinition> = {
},
};
function createBaseGunDefinition(): GunDefinition {
export function createBaseGunDefinition(): GunDefinition {
return { gun_type: undefined };
}
@@ -2344,7 +2344,7 @@ export const GunDefinition: MessageFns<GunDefinition> = {
},
};
function createBaseGunDefinitionRegular(): GunDefinitionRegular {
export function createBaseGunDefinitionRegular(): GunDefinitionRegular {
return { base: createBaseGunDefinitionBase(), extension: createBaseGunDefinitionRegularProperties() };
}
@@ -2424,7 +2424,7 @@ export const GunDefinitionRegular: MessageFns<GunDefinitionRegular> = {
},
};
function createBaseGunDefinitionRegularProperties(): GunDefinitionRegularProperties {
export function createBaseGunDefinitionRegularProperties(): GunDefinitionRegularProperties {
return { reload: 0 };
}
@@ -2484,7 +2484,7 @@ export const GunDefinitionRegularProperties: MessageFns<GunDefinitionRegularProp
},
};
function createBaseGunDefinitionAutoLoader(): GunDefinitionAutoLoader {
export function createBaseGunDefinitionAutoLoader(): GunDefinitionAutoLoader {
return { base: createBaseGunDefinitionBase(), extension: createBaseGunDefinitionAutoLoaderProperties() };
}
@@ -2566,7 +2566,7 @@ export const GunDefinitionAutoLoader: MessageFns<GunDefinitionAutoLoader> = {
},
};
function createBaseGunDefinitionAutoLoaderProperties(): GunDefinitionAutoLoaderProperties {
export function createBaseGunDefinitionAutoLoaderProperties(): GunDefinitionAutoLoaderProperties {
return { clip_reload: 0, intra_clip: 0, shell_count: 0 };
}
@@ -2662,7 +2662,7 @@ export const GunDefinitionAutoLoaderProperties: MessageFns<GunDefinitionAutoLoad
},
};
function createBaseGunDefinitionAutoReloader(): GunDefinitionAutoReloader {
export function createBaseGunDefinitionAutoReloader(): GunDefinitionAutoReloader {
return { base: createBaseGunDefinitionBase(), extension: createBaseGunDefinitionAutoReloaderProperties() };
}
@@ -2744,7 +2744,7 @@ export const GunDefinitionAutoReloader: MessageFns<GunDefinitionAutoReloader> =
},
};
function createBaseGunDefinitionAutoReloaderProperties(): GunDefinitionAutoReloaderProperties {
export function createBaseGunDefinitionAutoReloaderProperties(): GunDefinitionAutoReloaderProperties {
return { shell_reloads: [], intra_clip: 0, shell_count: 0 };
}
@@ -2854,7 +2854,7 @@ export const GunDefinitionAutoReloaderProperties: MessageFns<GunDefinitionAutoRe
},
};
function createBaseGunDefinitionBase(): GunDefinitionBase {
export function createBaseGunDefinitionBase(): GunDefinitionBase {
return {
id: 0,
rotation_speed: 0,
@@ -3164,7 +3164,7 @@ export const GunDefinitionBase: MessageFns<GunDefinitionBase> = {
},
};
function createBaseShellDefinition(): ShellDefinition {
export function createBaseShellDefinition(): ShellDefinition {
return {
id: 0,
name: createBaseI18nString(),
@@ -3434,7 +3434,7 @@ export const ShellDefinition: MessageFns<ShellDefinition> = {
},
};
function createBaseShellPenetration(): ShellPenetration {
export function createBaseShellPenetration(): ShellPenetration {
return { near: 0, far: 0 };
}
@@ -3510,7 +3510,7 @@ export const ShellPenetration: MessageFns<ShellPenetration> = {
},
};
function createBaseUnlock(): Unlock {
export function createBaseUnlock(): Unlock {
return { id: 0, type: 0, cost: createBaseUnlockCost() };
}
@@ -3604,7 +3604,7 @@ export const Unlock: MessageFns<Unlock> = {
},
};
function createBaseUnlockCost(): UnlockCost {
export function createBaseUnlockCost(): UnlockCost {
return { type: "", value: 0 };
}
@@ -3680,7 +3680,7 @@ export const UnlockCost: MessageFns<UnlockCost> = {
},
};
function createBaseCrew(): Crew {
export function createBaseCrew(): Crew {
return { type: 0, count: 0, substitute: [] };
}
+4 -1
View File
@@ -1,4 +1,7 @@
{
"extends": "../../tsconfig.json",
"include": ["src/**/*", "../i18n/src/strings.ts"]
"include": ["src/**/*", "../i18n/src/strings.ts"],
"compilerOptions": {
"baseUrl": "../../"
}
}
+14
View File
@@ -0,0 +1,14 @@
{
"default": "en",
"supported": [
{ "locale": "en" },
{ "locale": "es" },
{ "locale": "fr" },
{ "locale": "ja" },
{ "locale": "pl" },
{ "locale": "pt" },
{ "locale": "ru" },
{ "locale": "uk" },
{ "locale": "zh", "blitz": "zh_Hans_SG" }
]
}
+2 -87
View File
@@ -1,89 +1,8 @@
import { merge } from 'ts-deepmerge';
import en from '../strings/en.json';
import es from '../strings/es.json';
import fr from '../strings/fr.json';
import ja from '../strings/ja.json';
import pl from '../strings/pl.json';
import pt from '../strings/pt.json';
import ru from '../strings/ru.json';
import uk from '../strings/uk.json';
import zh from '../strings/zh.json';
import type en from '../strings/en.json';
export type BlitzKitStrings = typeof en;
const stringsRaw = { en, es, fr, ja, pl, pt, ru, uk, zh };
export const SUPPORTED_LOCALES = Object.keys(stringsRaw) as SupportedLocale[];
export const DEFAULT_LOCALE = SUPPORTED_LOCALES[0];
function redact(string: string) {
const matches = [...string.matchAll(/%s\d+/g)];
const characters = string
.split('')
.map((char) => (char === ' ' ? ' ' : '█')) as string[];
matches.forEach((match) => {
const start = match.index;
const matchText = match[0];
for (let i = 0; i < matchText.length; i++) {
characters[start + i] = matchText[i];
}
});
return characters.join('');
}
function nuke(object: TranslationTree) {
for (const key in object) {
const typedKey = key as keyof typeof object;
if (typeof object[typedKey] === 'string') {
const value = object[typedKey];
object[typedKey] = redact(value as string);
} else nuke(object[typedKey] as TranslationTree);
}
}
const stringsPartial: Partial<Record<SupportedLocale, TranslationTree>> = {};
for (const locale in stringsRaw) {
if (locale === DEFAULT_LOCALE) {
stringsPartial[DEFAULT_LOCALE] = stringsRaw[DEFAULT_LOCALE];
continue;
}
const localeStrings = stringsRaw[locale as SupportedLocale];
stringsPartial[locale as SupportedLocale] = merge(
stringsRaw[DEFAULT_LOCALE],
localeStrings,
);
if (import.meta.env.PUBLIC_DEBUG_MISSING_I18N === 'true') {
nuke(stringsPartial[locale as SupportedLocale]!);
}
}
export const STRINGS = stringsPartial as Record<
SupportedLocale,
BlitzKitStrings
>;
export type SupportedLocale = keyof typeof stringsRaw;
export const SUPPORTED_LOCALE_BLITZ_MAP: Record<SupportedLocale, string> = {
en: 'en',
es: 'es',
fr: 'fr',
ja: 'ja',
pt: 'pt',
ru: 'ru',
uk: 'uk',
zh: 'zh-Hans',
pl: 'pl',
};
export const SUPPORTED_LOCALE_FLAGS: Record<SupportedLocale, string> = {
export const SUPPORTED_LOCALE_FLAGS: Record<string, string> = {
en: '🇺🇸',
es: '🇪🇸',
fr: '🇫🇷',
@@ -94,7 +13,3 @@ export const SUPPORTED_LOCALE_FLAGS: Record<SupportedLocale, string> = {
zh: '🇨🇳',
pl: '🇵🇱',
};
export type TranslationTree = { [key: string]: TranslationNode };
export type TranslationNode = string | TranslationTree;
+2 -2
View File
@@ -1,5 +1,5 @@
import { I18nString } from '@blitzkit/core';
import { DEFAULT_LOCALE } from './strings';
import locales from '../locales.json' with { type: 'json' };
export function unwrapper(locale: string) {
return function (i18nString: I18nString) {
@@ -7,6 +7,6 @@ export function unwrapper(locale: string) {
return i18nString.locales[locale];
}
return i18nString.locales[DEFAULT_LOCALE];
return i18nString.locales[locales.default];
};
}
+140 -24
View File
@@ -6,12 +6,26 @@
},
"common": {
"tiers": {
"0": "Unknown tier",
"1": "I",
"2": "II",
"3": "III",
"4": "IV",
"5": "V",
"6": "VI",
"7": "VII",
"8": "Vintage"
},
"units": {
"m": "%s1m",
"mm": "%s1mm",
"deg": "%s1°",
"hp": "%s1hp",
"x": "x%s1"
"x": "x%s1",
"percentage": "%s1%",
"deg_s": "%s1°/s"
},
"gun_types": {
@@ -84,15 +98,44 @@
},
"nations": {
"ussr": "U.S.S.R.",
"germany": "Germany",
"usa": "U.S.A.",
"china": "China",
"uk": "U.K.",
"france": "France",
"japan": "Japan",
"european": "European Nation",
"other": "Hybrid Nation"
"0": "Unknown nation",
"1": "U.S.S.R.",
"2": "Germany",
"3": "U.S.A.",
"4": "China",
"5": "France",
"6": "U.K.",
"7": "Japan",
"8": "Europe",
"9": "Poland",
"10": "Australia",
"11": "Canada",
"12": "Italy",
"13": "Finland",
"14": "Czech",
"15": "Hybrid Nation",
"16": "GDR",
"17": "Ireland",
"18": "Scotland",
"19": "Sweden",
"20": "Argo Coalition",
"21": "Titan Lab",
"22": "Defender",
"23": "Progresston",
"24": "Wasteland",
"25": "Hunters Moon",
"26": "Cold Front",
"27": "The Explorer",
"28": "Fablegear",
"29": "Outlaws",
"30": "GUP",
"31": "Dune",
"32": "Terminator",
"33": "Warhammer",
"34": "Valkirya Chronicles",
"35": "Mecha",
"36": "TMNT",
"37": "Star Trek"
},
"nations_adjectives": {
@@ -107,6 +150,14 @@
"other": "Hybrid"
},
"tank_class": {
"0": "Unknown Class",
"1": "Heavy",
"2": "Light",
"3": "Medium",
"4": "Tank destroyer"
},
"tank_class_short": {
"-1": "unrecognized",
"0": "Light",
@@ -131,10 +182,10 @@
},
"tree_type": {
"-1": "unrecognized",
"0": "Tech tree",
"1": "Premium",
"2": "Collector"
"0": "Unknown tree type",
"1": "Common",
"2": "Premium",
"3": "Collector"
},
"regions": {
@@ -739,6 +790,11 @@
},
"website": {
"redirect": {
"title": "301: moved permanently",
"body": "This page has moved. Redirecting..."
},
"settings": {
"dev_mode": "Development mode",
"language": "Language"
@@ -756,6 +812,7 @@
},
"tank_search": {
"clear_filters": "Clear filters",
"search_bar_hint": "Search tanks...",
"recent": "Recently viewed",
"select_all": "Select all",
@@ -824,6 +881,12 @@
},
"home": {
"discord": {
"join_short": "Join cool people!",
"join_long": "Join super duper cool people!",
"action": "Discord"
},
"hero": {
"credit": "By %s1 ❤️"
},
@@ -838,8 +901,32 @@
"seo_description": "Tools for everything World of Tanks Blitz"
},
"docs": {
"patches": {
"name": "BlitzKit Changelogs",
"seo_description": "Changelogs for BlitzKit Discord bot and website"
}
},
"tools": {
"guess": {
"name": "Guess the tank",
"button": "Guess away",
"description": "Silhouette mini-game",
"seo_description": "Play a tank guessing game with a silhouette in World of Tanks Blitz",
"search": {
"placeholder": "Type to guess...",
"skip": "Skip",
"guess": "Guess",
"next": "Next",
"no_results": "No results"
},
"stats": "%s1 / %s2 guessed correctly"
},
"tankopedia": {
"search": "Search a stat...",
"name": "Tankopedia",
"button": "Find tanks",
"description": "Blitz tank encyclopedia",
@@ -847,6 +934,32 @@
"tank_seo_title": "%s1 - Tier %s2 %s3 %s4 | %s5 Tankopedia | World of Tanks Blitz (WoTB)",
"tank_seo_description": "%s1 armor, statistics, equipment, provisions, and more. %s2 DPM, %s3hp alpha, %s4mm penetration, %s5kph top speed, %s6hp health.",
"visualizers": {
"rotator": {
"hull": "Hull",
"turret": "Turret",
"hard": "Hard",
"medium": "Medium",
"soft": "Soft",
"effective": "Effective"
},
"ricochet": {
"angle": "Angle",
"normalization": "Normalization",
"effective_angle": "Effective angle",
"armor": "Armor",
"no_ricochet": "Explosive shells don't ricochet"
},
"view_range": {
"camo": "Camo",
"percentage": "%s1%",
"ghost_factory": "Ghost Factory",
"dead_rail": "Dead Rail"
}
},
"sandbox": {
"poses": {
"hull_down": "Hull down",
@@ -924,6 +1037,8 @@
},
"meta": {
"compensation": "Compensation",
"free": "Free",
"back": "Back",
"compare": "Compare",
"swap": {
@@ -937,11 +1052,12 @@
"class": "Class",
"tier": "Tier",
"type": "Type",
"dev_id": "DEV: ID",
"id": "ID",
"purchase": "Purchase price",
"restoration": "Restoration price",
"sale": "Sale price",
"research": "Research XP"
"set": "Set",
"price": "Price"
},
"tech_tree": {
@@ -996,7 +1112,7 @@
"characteristics": {
"title": "Characteristics",
"compare": {
"label": "Compare against",
"label": "Compare",
"class": "Tier %s1 %s2",
"tier": "All of tier %s1",
"all": "All tanks"
@@ -1033,7 +1149,7 @@
"explosionRadius": "Explosion radius",
"shellVelocity": "Shell velocity",
"aimTime": "Aim time",
"dispersion": "Still",
"dispersion": "Dispersion still",
"dispersionMoving": "Moving",
"dispersionHullTraversing": "Hull traversing",
"dispersionTurretTraversing": "Turret traversing",
@@ -1047,28 +1163,28 @@
"gunRearElevation": "Rear elevation",
"azimuthLeft": "Azimuth left",
"azimuthRight": "Azimuth right",
"speedForwards": "Forwards",
"speedForwards": "Speed forwards",
"speedBackwards": "Backwards",
"hardTerrainCoefficient": "Hard",
"hardTerrainCoefficientRaw": "Hard",
"hardTerrainCoefficient": "Terrain coefficient hard",
"hardTerrainCoefficientRaw": "Raw terrain coefficient hard",
"mediumTerrainCoefficient": "Medium",
"mediumTerrainCoefficientRaw": "Medium",
"softTerrainCoefficient": "Soft",
"softTerrainCoefficientRaw": "Soft",
"enginePower": "Engine power",
"powerToWeightRatioHardTerrain": "Hard",
"powerToWeightRatioHardTerrain": "Power to weight ratio hard",
"powerToWeightRatioMediumTerrain": "Medium",
"powerToWeightRatioSoftTerrain": "Soft",
"weight": "Weight",
"turretTraverseSpeed": "Turret traverse speed",
"gunTraverseSpeed": "Gun traverse speed",
"hullTraverseHardTerrain": "Hard",
"hullTraverseHardTerrain": "Hull traverse hard",
"hullTraverseMediumTerrain": "Medium",
"hullTraverseSoftTerrain": "Soft",
"health": "Health",
"fireChance": "Fire chance",
"viewRange": "View range",
"camouflageStill": "Still",
"camouflageStill": "Camouflage still",
"camouflageMoving": "Moving",
"camouflageShootingStill": "Still",
"camouflageShootingMoving": "Moving",
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+2 -1
View File
@@ -10,7 +10,8 @@
"build:reviews": "bun src/reviews.ts",
"build:ids": "bun src/discoverIds.ts",
"build:bot": "bun src/buildBot.ts",
"build:ratingleaderboard": "bun src/buildRatingLeaderboard.ts"
"build:ratingleaderboard": "bun src/buildRatingLeaderboard.ts",
"prunestrings": "bun src/pruneStrings.ts"
},
"dependencies": {
"@blitzkit/core": "workspace:*",
+19 -11
View File
@@ -3,7 +3,7 @@ import { mkdir, writeFile } from 'fs/promises';
import { parse as parsePath } from 'path';
import ProgressBar from 'progress';
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
import { dvp } from '../../../submodules/blitzkit-closed/src/dvp';
import { dvp } from '../../../submodules/blitzkit-closed/src/dava/dvp';
import { readStringDVPL } from '../src/core/blitz/readStringDVPL';
import { DATA } from './buildAssets/constants';
import { readYAMLDVPL } from './core/blitz/readYAMLDVPL';
@@ -45,19 +45,27 @@ while (true) {
files.length,
);
await Promise.all(
files.map(async ({ path, data }) => {
const { dir } = parsePath(path);
for (const { path, data } of files) {
console.log(`Patching "${path}"...`);
const { dir } = parsePath(path);
try {
await mkdir(`${DATA}/${dir}`, { recursive: true });
await writeFile(
`${DATA}/${path}`,
new Uint8Array(writeDVPL(Buffer.from(data))),
);
} catch (error) {
console.warn(`Failed to make directory "${dir}"`);
}
bar.tick();
}),
);
const isDvpl = path.endsWith('.dvpl');
const buffer = Buffer.from(data);
await writeFile(
`${DATA}/${path}${isDvpl ? '' : '.dvpl'}`,
new Uint8Array(isDvpl ? buffer : writeDVPL(buffer)),
);
bar.tick();
}
if ('dynamicContentLocalizationsDir' in data) {
console.log('Found dynamic content localizations; patching...');
Loaded 100 of 361 files, more files were not shown because too many files have changed in this diff. Show more