Compare commits

..
1098 Commits
Author SHA1 Message Date
TrèsAbhi d041b353c9 feat: logs 2024-04-23 10:25:59 -05:00
TrèsAbhi 77575168a0 feat: better message 2024-04-23 10:24:00 -05:00
TrèsAbhi 051997d2d3 feat: kit 3 2024-04-23 10:19:32 -05:00
TrèsAbhi e53bdd8e19 fix: core 2024-04-23 09:57:59 -05:00
TrèsAbhi 4013192faa feat: kit 2 2024-04-23 09:51:32 -05:00
TrèsAbhi 3da009f859 feat: kit 2024-04-23 09:42:08 -05:00
TrèsAbhi 2a5888c033 feat: hero 2024-04-22 12:51:46 -05:00
TrèsAbhi ded98d78d4 fix: link 2024-04-22 12:48:07 -05:00
TrèsAbhi f4b231de10 fix: more paths 2024-04-22 12:46:47 -05:00
TrèsAbhi 9fda3c6861 fix: videos 2024-04-22 12:46:15 -05:00
TrèsAbhi d3f58d9cda Merge pull request #111 from tresabhi/dev-rinth 2024-04-22 12:43:26 -05:00
TrèsAbhi 3ef793a776 fix: rinth package 2024-04-22 12:43:23 -05:00
TrèsAbhi 13a901c839 Merge branch 'main' into dev-rinth 2024-04-22 12:43:22 -05:00
TrèsAbhi 5ede2324b3 Update Party3.tsx 2024-04-22 12:27:43 -05:00
TrèsAbhi 4e8f1a4a71 fix: ? 2024-04-22 10:27:46 -05:00
TrèsAbhi eae9cbf971 feat: stop excessive tank armor and model name spam 2024-04-22 10:07:23 -05:00
TrèsAbhi 0eac25f1c8 Merge pull request #108 from tresabhi/imgbot 2024-04-22 10:01:36 -05:00
TrèsAbhi c281e9b66f feat: cumulative video indexing 2024-04-22 09:38:00 -05:00
TrèsAbhi eb7fc62e00 Merge pull request #110 from tresabhi/main 2024-04-22 09:09:54 -05:00
TrèsAbhi d5f83c444e feat; gap 2024-04-21 19:45:47 -05:00
TrèsAbhi c890bfa8bd feat: move up 2024-04-21 19:41:42 -05:00
TrèsAbhi 9ead3eb627 feat: automatic videos 2024-04-21 19:40:38 -05:00
TrèsAbhi b8db78c328 fix: secrets 2024-04-21 18:26:15 -05:00
TrèsAbhi 8b65b94851 feat: force 2024-04-21 18:01:02 -05:00
TrèsAbhi 9da723ed31 feat: logs 2024-04-21 17:40:04 -05:00
TrèsAbhi 2f48dbc25c feat: more shell properties 2024-04-21 17:39:24 -05:00
TrèsAbhi 730d6f2bb8 feat: logs 2024-04-21 17:25:35 -05:00
TrèsAbhi 335ae4493f fix: render normal armor 2024-04-21 17:16:25 -05:00
TrèsAbhi eb83039967 feat: include lower part of barrel 2024-04-21 17:15:23 -05:00
TrèsAbhi 6e91810565 fix: select all rows 2024-04-21 17:05:35 -05:00
TrèsAbhi a55c259205 feat: videos automation 2024-04-21 17:05:07 -05:00
TrèsAbhi b5188331bd feat: remove textual reference 2024-04-21 12:17:33 -05:00
TrèsAbhi 2b354770c7 fix: fragment key 2024-04-21 11:16:46 -05:00
TrèsAbhi 11e4009303 fix: skill keys 2024-04-21 11:13:32 -05:00
TrèsAbhi 9bce5e5d75 fix: duplicate keys 2024-04-21 11:12:52 -05:00
TrèsAbhi 8e8d68a5b5 fix: antagonist bar keys 2024-04-21 11:10:44 -05:00
TrèsAbhi 2c6fcdf21f fix: navbar menu key 2024-04-21 11:09:53 -05:00
TrèsAbhi abb72fb674 fix: jsx tree node uuids 2024-04-21 11:09:24 -05:00
TrèsAbhi b805c2e3b4 fix: video key 2024-04-21 11:07:19 -05:00
TrèsAbhi 7e6aa41ebb fix: no undefined clipping planes 2024-04-21 11:06:40 -05:00
TrèsAbhi a2cfbda932 feat: start work of text 2024-04-21 11:05:42 -05:00
TrèsAbhi 0b222be6ef Merge pull request #109 from tresabhi/main 2024-04-21 10:50:25 -05:00
TrèsAbhi 1548813a21 feat: horizontal ad 2024-04-21 10:41:51 -05:00
TrèsAbhi c615284d87 feat: re-enable adsense 2024-04-21 10:37:44 -05:00
TrèsAbhi 6a48638171 fix: use client 2024-04-21 10:26:08 -05:00
TrèsAbhi 0b4829abd3 fix: use use effect 2024-04-21 10:25:43 -05:00
TrèsAbhi 57cd3aae50 feat: pub ads 2024-04-21 10:21:52 -05:00
TrèsAbhi 6298d6230f Update ads.txt 2024-04-21 09:13:56 -05:00
TrèsAbhi df7a5bb8a0 fix: fullscreen card 2024-04-20 21:40:41 -05:00
TrèsAbhi dd41cac3ac feat: videos 2024-04-20 21:01:28 -05:00
TrèsAbhi f17b275aa7 feat: add blitzkrieg name to older logs 2024-04-20 12:09:23 -05:00
TrèsAbhi 4a04f8a8f3 feat: generalized asset repo 2024-04-20 12:08:43 -05:00
TrèsAbhi 0f7d682782 feat: logos 2024-04-20 12:07:20 -05:00
TrèsAbhi 14cecdebe3 feat: reset asset name to krieg temporarily 2024-04-20 12:02:33 -05:00
TrèsAbhi c2b936c925 feat: rename to blitzrinth 2024-04-20 12:00:48 -05:00
TrèsAbhi 0fd17d9c96 feat: logs 2024-04-20 11:50:16 -05:00
TrèsAbhi b0645c39a0 fix: high end consumables increase 2024-04-20 11:45:41 -05:00
TrèsAbhi 1d947399ab fix: intra-clip for auto loaders 2024-04-20 11:43:15 -05:00
TrèsAbhi 659dddbe8e feat: aggressive donate button 2024-04-20 11:40:10 -05:00
TrèsAbhi a5c1223f7d feat: simpler footer 2024-04-20 11:20:52 -05:00
TrèsAbhi dc084f8d34 feat: compare button 2024-04-19 10:08:00 -05:00
TrèsAbhi 44b5907435 feat: tankopedia button 2024-04-19 09:59:21 -05:00
ImgBotApp 052fbec628 [ImgBot] Optimize images
*Total -- 6,696.66kb -> 4,836.70kb (27.77%)

/public/assets/banners/discord.png -- 1,632.36kb -> 921.18kb (43.57%)
/public/assets/banners/compare.png -- 2,571.28kb -> 1,799.75kb (30.01%)
/docs/public/assets/images/hero.png -- 183.03kb -> 147.76kb (19.27%)
/public/assets/banners/statistics.png -- 2,309.99kb -> 1,968.00kb (14.8%)

Signed-off-by: ImgBotApp <[email protected]>
2024-04-19 14:37:54 +00:00
TrèsAbhi 23d8c54366 feat: super duper secret map 2024-04-19 09:26:53 -05:00
TrèsAbhi dd88d42884 feat: logs 2024-04-19 09:17:22 -05:00
TrèsAbhi ed676f73b2 feat: og descs 2024-04-19 09:14:22 -05:00
TrèsAbhi adb0a9af64 fix: title 2024-04-19 09:11:36 -05:00
TrèsAbhi ccded1b2f8 feat: hide statistics 2024-04-19 09:10:33 -05:00
TrèsAbhi 89d43b4791 feat: better titles 2024-04-19 09:09:12 -05:00
TrèsAbhi 2226ac9852 feat: gutted some navbar features 2024-04-19 09:03:45 -05:00
TrèsAbhi 29bace875e fix: remove commit 2024-04-18 20:27:48 -05:00
TrèsAbhi 04107c10b7 feat: hamburger meny 2024-04-18 20:26:35 -05:00
TrèsAbhi 0a1e823ce4 feat: first developer mode enabling 2024-04-18 19:16:30 -05:00
TrèsAbhi c656d31618 feat: a few settings 2024-04-18 19:11:50 -05:00
TrèsAbhi 7eda4825ea feat: more navbar buttons 2024-04-18 18:42:57 -05:00
TrèsAbhi 60f0eb9a3c feat: tankopedia title 2024-04-18 18:29:29 -05:00
TrèsAbhi ce5c9f4afa feat: page exclusive titles 2024-04-18 18:28:46 -05:00
TrèsAbhi e834d31d92 feat: use lz4js types instead of home brewed 2024-04-18 18:23:23 -05:00
TrèsAbhi b679393b8a Merge branch 'main' into dev 2024-04-17 10:16:31 -05:00
TrèsAbhi eb5f79228b fix: bring back test tanks button 2024-04-17 09:52:15 -05:00
TrèsAbhi 6082576b60 feat: start of a meny 2024-04-17 09:50:46 -05:00
TrèsAbhi 92e9073939 things 2024-04-17 09:31:47 -05:00
TrèsAbhi d6669a84d6 Update index.ts 2024-04-17 08:34:20 -05:00
TrèsAbhi 0c4debe327 Update index.ts 2024-04-17 08:18:56 -05:00
TrèsAbhi 9f41bab28a feat: disabled stats 2024-04-16 22:13:21 -05:00
TrèsAbhi b906b42998 feat: search bar 2024-04-16 22:12:51 -05:00
TrèsAbhi 728a11efa4 feat: reduced gap 2024-04-16 22:06:24 -05:00
TrèsAbhi c35916c291 feat: colors 2024-04-16 22:05:36 -05:00
TrèsAbhi 2fd2e93f55 feat: shadows 2024-04-16 21:58:08 -05:00
TrèsAbhi b566d5982c feat: better icons 2024-04-16 21:49:30 -05:00
TrèsAbhi bef43e9ae6 feat: tank icons 2024-04-16 19:36:49 -05:00
TrèsAbhi e6404d5c77 feat: better spacing 2024-04-16 19:07:06 -05:00
TrèsAbhi f4d58015f5 feat: somethings 2024-04-16 19:03:37 -05:00
TrèsAbhi cd77d24dc6 feat: statistics 2024-04-16 18:51:20 -05:00
TrèsAbhi e25a3cd868 feat: title 2024-04-16 13:53:01 -05:00
TrèsAbhi 68923fe800 feat: icons 2024-04-16 13:49:33 -05:00
TrèsAbhi ccc6ddd5c9 Merge branch 'main' of https://github.com/tresabhi/blitzkrieg 2024-04-16 13:45:33 -05:00
TrèsAbhi 1c28b33da3 Merge branch 'dev' of https://github.com/tresabhi/blitzkrieg into dev 2024-04-16 13:45:18 -05:00
TrèsAbhi 900337f3ce feat: log 2024-04-16 13:45:17 -05:00
TrèsAbhi fae9f8bded feat: time in manifest 2024-04-16 13:45:03 -05:00
TrèsAbhi a0d78f89ff fix: remove logo on small screens 2024-04-16 13:45:03 -05:00
TrèsAbhi 6853d63bbb feat: change to utc 2024-04-16 13:45:03 -05:00
TrèsAbhi 2b27954a3b fix: max dpm on double shot auto reloaders 2024-04-16 13:45:03 -05:00
TrèsAbhi 7aa0b65d1d feat: null handling 2024-04-16 13:45:03 -05:00
TrèsAbhi 3e7a73c528 feat: cleaner fetch blitz func 2024-04-16 13:45:02 -05:00
TrèsAbhi 076785a9ad feat: more efficient 2024-04-16 13:45:02 -05:00
TrèsAbhi 74828e3c45 feat: rts 2024-04-16 13:45:02 -05:00
TrèsAbhi 310640c1ec feat: base work 2024-04-16 13:45:02 -05:00
TrèsAbhi c49c56fba3 Merge pull request #107 from tresabhi/dev 2024-04-16 13:44:16 -05:00
TrèsAbhi cc744f6154 Merge branch 'main' into dev 2024-04-16 13:44:09 -05:00
TrèsAbhi 93bf4a4742 Dev (#106) 2024-04-16 13:43:44 -05:00
TrèsAbhi badeb588dd feat: time in manifest 2024-04-16 09:42:48 -05:00
TrèsAbhi 5876bf35b4 fix: remove logo on small screens 2024-04-16 09:35:10 -05:00
TrèsAbhi 73903114c9 feat: change to utc 2024-04-16 09:28:01 -05:00
TrèsAbhi b29f7ca7f5 fix: max dpm on double shot auto reloaders 2024-04-16 09:24:28 -05:00
TrèsAbhi 9d715c23e5 redacted 2024-04-16 09:18:12 -05:00
TrèsAbhi 4ff5f7cdeb feat: null handling 2024-04-15 13:25:35 -05:00
TrèsAbhi dccfe3d652 feat: cleaner fetch blitz func 2024-04-15 13:19:25 -05:00
TrèsAbhi d780d32291 feat: more efficient 2024-04-15 09:27:59 -05:00
TrèsAbhi ebbdbc53a4 feat: rts 2024-04-13 22:13:57 -05:00
TrèsAbhi 9bc1635680 feat: base work 2024-04-13 18:20:49 -05:00
TrèsAbhi d7d19a0b50 Merge branch 'main' of https://github.com/tresabhi/blitzkrieg 2024-04-13 10:43:20 -05:00
TrèsAbhi 1b6845abf8 fix: grammar 2024-04-13 10:43:09 -05:00
TrèsAbhi 545ee70cd0 feat: logs 2 2024-04-13 10:42:31 -05:00
TrèsAbhi c92729d0e0 feat: logs 2024-04-13 10:42:17 -05:00
TrèsAbhi 71c3b5d2ef feat: undefined mask handling 2024-04-13 10:38:13 -05:00
TrèsAbhi 7372075ba3 fix: remove duplicate mantlets 2024-04-13 10:36:13 -05:00
TrèsAbhi f119b06dd8 fix: grammar 2024-04-12 09:24:15 -05:00
TrèsAbhi e23a440508 feat: logs 2024-04-12 09:23:34 -05:00
TrèsAbhi 6a9fa08500 fix: /research tank icon alignment 2024-04-12 09:17:05 -05:00
TrèsAbhi 8e86e81e91 fix: max probisions 2024-04-10 19:35:28 -05:00
TrèsAbhi 8b359e220a feat: more icon gap 2024-04-10 17:04:33 -05:00
TrèsAbhi 690bc5dbb5 feat: wrapping controls 2024-04-10 16:57:38 -05:00
TrèsAbhi d6e96e17ad feat: spall liner 2024-04-10 16:54:16 -05:00
TrèsAbhi ab26b346e6 feat: lenient psa 2024-04-10 16:29:12 -05:00
TrèsAbhi f02db6ef0b fix: clipping hero stat description 2024-04-10 16:19:24 -05:00
TrèsAbhi 55ba2525d1 fix: query ignorance on filter change 2024-04-10 16:13:39 -05:00
TrèsAbhi ea07d2646d feat: name draggable 2024-04-10 16:10:34 -05:00
TrèsAbhi ca111510f6 feat: remove caret icons 2024-04-10 16:05:30 -05:00
TrèsAbhi 519558dd28 fix: drag on mobile 2024-04-10 16:04:50 -05:00
TrèsAbhi c4d1e305f6 feat: grabbing cursor 2024-04-10 09:41:55 -05:00
TrèsAbhi 59772afb04 feat: drag and drop 2024-04-10 09:40:52 -05:00
TrèsAbhi 8c9dcfa551 feat: change name to just compare 2024-04-10 09:03:56 -05:00
TrèsAbhi 8bbf03a128 feat: version 2024-04-09 16:55:09 -05:00
TrèsAbhi 519fba84dc feat: ordered asset building 2024-04-09 16:03:07 -05:00
TrèsAbhi e7e74f706e feat: more provisions 2024-04-09 10:51:12 -05:00
TrèsAbhi 12e2793c92 feat: dynamic armor 2024-04-09 10:39:26 -05:00
TrèsAbhi 69040dc453 feat: reactive armor 2024-04-09 10:35:32 -05:00
TrèsAbhi 511151e101 feat: shells 2024-04-09 10:23:10 -05:00
TrèsAbhi 7fc993c2eb feat: shells 2024-04-09 10:04:43 -05:00
TrèsAbhi 030ca744e9 fix: correct shell count 2024-04-09 10:03:30 -05:00
TrèsAbhi 74756ab7bf feat: crew actions 2024-04-09 09:56:31 -05:00
TrèsAbhi e9a61d579d fix: update stats with crew skills 2024-04-09 09:51:22 -05:00
TrèsAbhi 7c3cad2c7d feat: crew button and missing traverse stats 2024-04-09 09:47:57 -05:00
TrèsAbhi 5f39ba55f6 feat: skip bot definitions 2024-04-08 22:04:50 -05:00
TrèsAbhi 2bfd8286a4 feat: cleanup 2024-04-08 21:50:29 -05:00
TrèsAbhi f3421b6f70 fix: types 2024-04-08 21:44:52 -05:00
TrèsAbhi abbbf11b3d feat: adsense 2024-04-08 21:43:47 -05:00
TrèsAbhi 797f5a90d2 feat: watermark 2 2024-04-08 21:24:24 -05:00
TrèsAbhi 818d13fade feat: watermark 2024-04-08 21:17:59 -05:00
TrèsAbhi 129d7c9688 feat: skills title 2024-04-08 19:26:49 -05:00
TrèsAbhi 28407b0f05 feat: universal crew skills 2024-04-08 19:24:49 -05:00
TrèsAbhi 8a9d72d0e6 feat: order 2024-04-08 19:12:29 -05:00
TrèsAbhi f98a4c7caa fix: button popover order 2024-04-08 19:10:02 -05:00
TrèsAbhi 92b329a0fb feat: module quick buttons 2024-04-08 19:04:07 -05:00
TrèsAbhi f3d32a4e63 feat: module swapping 2024-04-08 19:01:31 -05:00
TrèsAbhi 0e73d79c9c feat: trimmed module icons 2024-04-08 09:23:26 -05:00
TrèsAbhi 526b5785b7 feat: modules button 2024-04-08 09:22:27 -05:00
TrèsAbhi 02129feb25 fix: NaN deltas 2024-04-08 09:13:14 -05:00
TrèsAbhi 0a38c164a4 fix: removed debug console logs 2024-04-06 22:01:52 -05:00
TrèsAbhi 2e0d52e30e feat: enter to select first tank 2024-04-06 22:00:40 -05:00
TrèsAbhi 6d48f9fe7f idk 2024-04-06 21:40:21 -05:00
TrèsAbhi aba52c9968 feat: consistent icons 2024-04-06 20:35:30 -05:00
TrèsAbhi b96b9fd574 fix: damage decimals 2024-04-06 20:29:36 -05:00
TrèsAbhi fe4ee8b611 feat: more compact 2024-04-06 19:40:40 -05:00
TrèsAbhi 94558393d9 feat: consumables 2024-04-06 19:37:57 -05:00
TrèsAbhi db1e4af20c feat: clear provisions button 2024-04-06 19:19:46 -05:00
TrèsAbhi be20173acd feat: missing provisions 2024-04-06 19:16:16 -05:00
TrèsAbhi d90a70ed2a fix: max selected 2024-04-06 19:09:37 -05:00
TrèsAbhi 85d699dbfc feat: provisions 2024-04-06 19:04:57 -05:00
TrèsAbhi 5d0fe8726b feat: provision buttons 2024-04-06 18:55:34 -05:00
TrèsAbhi 850308b2ac feat: provision assignment 2024-04-06 18:37:21 -05:00
TrèsAbhi 88a85ef152 feat: rename to absolute 2024-04-06 18:30:36 -05:00
TrèsAbhi 8160935081 feat: better control layout 2024-04-06 18:28:16 -05:00
TrèsAbhi c057e295d2 feat: discard sorting on mutate 2024-04-06 18:19:45 -05:00
TrèsAbhi 28d0c26268 feat: change to clear 2024-04-06 17:55:39 -05:00
TrèsAbhi 52cb73a575 feat: gray sort buttons 2024-04-06 17:54:50 -05:00
TrèsAbhi 9f244452da feat: max tank name size 2024-04-06 17:53:22 -05:00
TrèsAbhi d46d948c66 feat: sort 2024-04-06 17:46:30 -05:00
TrèsAbhi 11b99ef211 feat: better compact search chunking 2024-04-06 17:28:45 -05:00
TrèsAbhi 85d350a912 feat: less CLS loader 2024-04-06 17:21:38 -05:00
TrèsAbhi 145bc84fb1 feat: no player selected 2024-04-06 13:18:17 -05:00
TrèsAbhi b7486022eb feat: cleaner home page 2024-04-06 13:12:07 -05:00
TrèsAbhi eadb4bb7b1 fix: no padding in embeds 2024-04-06 13:06:48 -05:00
TrèsAbhi 79723157d2 feat: ghost equipment buttons 2024-04-06 13:03:36 -05:00
TrèsAbhi 4214ff0de5 feat: trash button functionality 2024-04-06 12:51:52 -05:00
TrèsAbhi f516c9275e feat: flex 1 pages 2024-04-06 12:49:38 -05:00
TrèsAbhi f0b905593c feat: better loading spinners 2024-04-06 12:43:54 -05:00
TrèsAbhi 11440bc654 feat: non nested spans 2024-04-06 12:37:50 -05:00
TrèsAbhi 2dab957a05 fix: scroll padding 2024-04-06 12:28:29 -05:00
TrèsAbhi 60f3951e7a feat: remove scrollbar 2 2024-04-06 12:23:08 -05:00
TrèsAbhi 4f03788f15 feat: remove scrollbar 2024-04-06 12:22:56 -05:00
TrèsAbhi 17f4435a30 feat: isolated footer 2024-04-06 12:10:54 -05:00
TrèsAbhi 04e42c929c feat: blitz version 2024-04-06 11:15:39 -05:00
TrèsAbhi 4ba45b8fd8 feat: game definitions 2024-04-06 11:14:07 -05:00
TrèsAbhi 0ece1f4b18 feat: no tanks selected message 2024-04-06 10:57:02 -05:00
TrèsAbhi 49d3e1d1c2 feat: select all option 2024-04-06 10:36:07 -05:00
TrèsAbhi 184ca522dd feat: proper keying 2024-04-06 10:17:48 -05:00
TrèsAbhi 9f07d910b8 feat: generalized equipment matrix manager 2024-04-06 10:06:59 -05:00
TrèsAbhi ac3f2ea93a feat: themed equipment preview 2024-04-06 09:52:28 -05:00
TrèsAbhi a77ff1a638 fix: pen 0 decimals 2024-04-06 09:51:16 -05:00
TrèsAbhi 96d802a09f feat: more compact icons 2024-04-05 17:55:07 -05:00
TrèsAbhi 1babd66649 feat: loop icon 2024-04-05 17:53:56 -05:00
TrèsAbhi 2f2996a40c feat: equipment popover 2024-04-05 17:52:41 -05:00
TrèsAbhi 9d1e059ea5 feat: solid backgrounds 2024-04-05 17:44:31 -05:00
TrèsAbhi 48603b918f feat: equipment preview 2024-04-05 17:40:14 -05:00
TrèsAbhi c1253e8121 feat: equipment matrix visual start 2024-04-05 17:28:58 -05:00
TrèsAbhi ecc029402e feat: percentage 2024-04-05 14:05:15 -05:00
TrèsAbhi 1b88773e28 feat: nominal deltas 2024-04-05 13:59:30 -05:00
TrèsAbhi cf419a9ebb feat: better titles 2024-04-05 13:40:18 -05:00
TrèsAbhi 8565d75747 feat: double gain 2024-04-05 09:51:22 -05:00
TrèsAbhi 186ea8b458 feat: round 2024-04-05 09:38:48 -05:00
TrèsAbhi 4292081df6 feat: stronger colors 2024-04-05 09:35:55 -05:00
TrèsAbhi 4b54b61c35 feat: gradient interpolation 2024-04-05 09:35:03 -05:00
TrèsAbhi 5d098c46fa feat: titles 2024-04-05 09:31:21 -05:00
TrèsAbhi 7575f4581c feat: decimal shorthand 2024-04-05 09:20:07 -05:00
TrèsAbhi 4669fa6ec5 feat: significant change colors 2024-04-05 09:13:13 -05:00
TrèsAbhi 49294d1906 feat: volume 2024-04-05 09:07:29 -05:00
TrèsAbhi 3eee946978 feat: split volume 2024-04-05 09:06:44 -05:00
TrèsAbhi 7fff1c9737 feat: volume 2024-04-04 22:23:06 -05:00
TrèsAbhi 5b4c3119dd feat: average shell reload 2024-04-04 22:17:36 -05:00
TrèsAbhi 0a41ee15ed feat: lower is better 2024-04-04 22:15:33 -05:00
TrèsAbhi ad57d284bb feat: more stats 3 2024-04-04 22:14:30 -05:00
TrèsAbhi b929e9449d feat: more stats 2 2024-04-04 21:56:00 -05:00
TrèsAbhi 948ea0bb8d fix: types 2024-04-04 21:17:40 -05:00
TrèsAbhi c1b1b8d304 feat: more stats 2024-04-04 19:14:22 -05:00
TrèsAbhi 3bc5a6d740 fix: some bugs 2024-04-04 18:56:51 -05:00
TrèsAbhi d25da724e1 feat: some button functionality 2024-04-04 16:14:01 -05:00
TrèsAbhi 753804b8cf feat: some more stats 2 2024-04-04 15:52:05 -05:00
TrèsAbhi 096122d43c feat: some more stats 2024-04-04 15:47:27 -05:00
TrèsAbhi 3448427de0 feat: reintroduced links 2024-04-04 15:35:27 -05:00
TrèsAbhi d8bbd02715 feat: center aline 2024-04-04 13:51:39 -05:00
TrèsAbhi f696c5f3c9 feat: some stats 2024-04-04 13:51:07 -05:00
TrèsAbhi bd412cdaa2 feat: generalized tank stats 2024-04-04 13:16:12 -05:00
TrèsAbhi 913411275b feat: better header alignemnt 2024-04-04 11:05:56 -05:00
TrèsAbhi 17ff8e0819 feat: better sizing 2024-04-04 11:04:27 -05:00
TrèsAbhi b5fdc4d5cf feat: add functionality 2024-04-04 10:46:48 -05:00
TrèsAbhi 59c5d95aff feat: compare page 2024-04-04 10:21:37 -05:00
TrèsAbhi 16babbad90 feat: og tool icon 2024-04-04 10:18:04 -05:00
TrèsAbhi a9dc9e7ebd feat: cleaner tool shadows 2024-04-04 10:16:47 -05:00
TrèsAbhi 52e8df560e feat: added tank compare link 2024-04-04 10:15:01 -05:00
TrèsAbhi 87259ad515 feat: robots 2024-04-03 22:57:28 -05:00
TrèsAbhi c96655a6c0 feat: xml 2024-04-03 22:47:10 -05:00
TrèsAbhi 43894567b8 / 2024-04-03 22:37:38 -05:00
TrèsAbhi 76a952a8e6 fix: change to tests 2024-04-03 22:28:12 -05:00
TrèsAbhi e2efe428a2 feat: use require 2024-04-03 22:24:01 -05:00
TrèsAbhi 887cec2dd4 feat: use fs 2024-04-03 22:22:13 -05:00
TrèsAbhi 04ad48bd33 feat: use proper write file 2024-04-03 22:20:30 -05:00
TrèsAbhi 3613f5d13b feat: log 2024-04-03 22:18:41 -05:00
TrèsAbhi 3362e3b091 feat: js next config 2024-04-03 22:16:16 -05:00
TrèsAbhi 3322fa97d4 feat: ts next config 2024-04-03 22:14:55 -05:00
TrèsAbhi 1dc7748a04 feat: use script 2024-04-03 22:08:22 -05:00
TrèsAbhi 6176b3b0d8 feat: use sync 2024-04-03 22:04:36 -05:00
TrèsAbhi 81c2af08c6 fix: build sitemap before build 2024-04-03 22:02:02 -05:00
TrèsAbhi 2d83519f93 Merge branch 'dev' of https://github.com/tresabhi/blitzkrieg into dev 2024-04-03 21:58:49 -05:00
TrèsAbhi 869c1f0def feat: sitemap 2024-04-03 21:58:38 -05:00
TrèsAbhi 7a64fb8176 feat: preview image 2024-04-03 21:58:38 -05:00
TrèsAbhi 9256244286 fix: remove title from svg 2024-04-03 21:58:38 -05:00
TrèsAbhi 85e54e4a07 fix: build db 2 2024-04-03 21:58:38 -05:00
TrèsAbhi 8075dc8d9f fix: build db 2024-04-03 21:58:38 -05:00
TrèsAbhi 57dced109a feat: page descriptions 2024-04-03 21:58:38 -05:00
TrèsAbhi dd19d5b979 feat: gen prisma (#105) 2024-04-03 21:57:39 -05:00
TrèsAbhi 68d3fe6805 feat: sitemap 2024-04-03 21:56:20 -05:00
TrèsAbhi 70f7698466 feat: preview image 2024-04-03 19:48:28 -05:00
TrèsAbhi 26a5fdea0e fix: remove title from svg 2024-04-03 19:34:32 -05:00
TrèsAbhi 367bd1386b fix: build db 2 2024-04-03 19:31:10 -05:00
TrèsAbhi fac773a8f8 fix: build db 2024-04-03 19:28:25 -05:00
TrèsAbhi 6bd8b7d42f feat: page descriptions 2024-04-03 19:27:24 -05:00
TrèsAbhi 7093662130 feat: gen prisma 2024-04-03 15:34:39 -05:00
TrèsAbhi 4062e56b4c feat: migrated to new db 2024-04-03 15:19:48 -05:00
TrèsAbhi 0885e7e68a feat: logs 2024-04-02 10:37:39 -05:00
TrèsAbhi 3cfa837682 Merge branch 'main' of https://github.com/tresabhi/blitzkrieg into dev 2024-04-02 10:26:31 -05:00
TrèsAbhi 1982604878 fix: some more floating component removals 2024-04-02 10:21:51 -05:00
TrèsAbhi 9ef6eea4a9 fix: remove useless tooltips 2024-04-02 10:10:15 -05:00
TrèsAbhi 78e6b2696c fix: word tolerant pitch and yaw 2024-04-02 10:04:54 -05:00
TrèsAbhi 40b6f30092 fix: synced armor states 2 2024-04-02 10:02:21 -05:00
TrèsAbhi de2d9a1a3e fix: synced armor states 2024-04-02 09:52:46 -05:00
TrèsAbhi b7ad12c698 Create ads.txt 2024-04-02 08:24:37 -05:00
TrèsAbhi 886c2aa1d1 fix: access document on client 2 2024-04-01 22:02:15 -05:00
TrèsAbhi 9818c9868a fix: access document on client 2024-04-01 22:00:38 -05:00
TrèsAbhi 31055f1d66 fix: use link for big tank search 2024-04-01 21:57:54 -05:00
TrèsAbhi 6cef753053 feat: donation icons 2024-04-01 21:46:17 -05:00
TrèsAbhi 5b889f8483 feat: more accessible full screen mode 2024-04-01 21:33:47 -05:00
TrèsAbhi d0d905ccfb feat: better antagonist bar 2024-04-01 19:30:06 -05:00
TrèsAbhi 9a91a8bb13 fix: excessive antagonist bar gap 2024-04-01 19:17:59 -05:00
TrèsAbhi c12cc9b8c5 feat: length sorting 2024-04-01 19:12:59 -05:00
TrèsAbhi fdbfd0bc10 feat: rename size to volume 2024-04-01 19:10:42 -05:00
TrèsAbhi 286b178218 feat: some cleanup 2024-04-01 19:09:21 -05:00
TrèsAbhi 54e012f736 feat: dropdown modules 2024-04-01 19:05:55 -05:00
TrèsAbhi cc6de50de6 feat: upgrade to radix 3.0 2024-04-01 18:36:14 -05:00
TrèsAbhi 194e5fceca feat: crew training info 2024-04-01 09:31:02 -05:00
TrèsAbhi 879a5d534c feat: consumable info 2024-04-01 09:27:54 -05:00
TrèsAbhi 29aaf60da0 feat: cleaner info 2024-04-01 09:24:12 -05:00
TrèsAbhi 3c8f8b49e4 feat: condensed 2 2024-03-31 22:32:43 -05:00
TrèsAbhi 0b88f71f26 feat: condensed 2024-03-31 22:27:11 -05:00
TrèsAbhi 65e239a22b feat: hide module actions on no upgrades 2024-03-31 22:16:29 -05:00
TrèsAbhi 7727e64931 feat: quick actions 2024-03-31 22:14:14 -05:00
TrèsAbhi 7b0465322d feat: special skills 2024-03-31 19:27:37 -05:00
TrèsAbhi 099e5eb228 feat: skill stats 2024-03-31 19:17:30 -05:00
TrèsAbhi eaff26c8d9 feat: crew skills ui 2024-03-31 18:49:17 -05:00
TrèsAbhi d79129df91 feat: skill definitions 2024-03-31 18:24:19 -05:00
TrèsAbhi b363c76639 feat: crew skill icons 2024-03-31 18:17:48 -05:00
TrèsAbhi 034429cd47 Merge branch 'main' of https://github.com/tresabhi/blitzkrieg 2024-03-31 17:48:30 -05:00
TrèsAbhi 57867317cc fix: missing info 2024-03-31 17:48:15 -05:00
TrèsAbhi c2e314b193 feat: log 2024-03-31 17:48:01 -05:00
TrèsAbhi 9d2af1de13 fix: quick equipments 2024-03-31 17:45:22 -05:00
TrèsAbhi 232823566b fix: missing info 2024-03-30 12:48:17 -05:00
TrèsAbhi 958f0f2a52 fix: log version 2024-03-30 12:44:46 -05:00
TrèsAbhi b34fef2147 feat: logs 2024-03-30 12:44:34 -05:00
TrèsAbhi fe661124fa Merge branch 'dev' of https://github.com/tresabhi/blitzkrieg into dev 2024-03-30 12:39:19 -05:00
TrèsAbhi 457dcbcad5 fix: 0 battle handling 2024-03-30 12:38:53 -05:00
TrèsAbhi c18ee70eba fix: /rating use midnight leaderboard 2024-03-30 12:38:53 -05:00
TrèsAbhi 095ffc3d6a fix: sync on click inspector 2024-03-30 12:38:53 -05:00
TrèsAbhi e8b91648b1 fix: click through post inputs 2024-03-30 12:38:53 -05:00
TrèsAbhi 1b43f6ba99 fix: use final thickness 2024-03-30 12:38:53 -05:00
TrèsAbhi fc5360363c fix: uniform inv proj mat 2024-03-30 12:38:53 -05:00
TrèsAbhi 47b3c3029e fix: more accurate HE 2024-03-30 12:38:53 -05:00
TrèsAbhi dea7f34ca3 fix: use normal proj mat 2024-03-30 12:38:53 -05:00
TrèsAbhi 1e5026ea4a fix: persistent equipment 2024-03-30 12:38:53 -05:00
TrèsAbhi 98f568ff6a fix: use three js inverse view proj 2024-03-30 12:38:53 -05:00
TrèsAbhi 10a6f8371d fix: 0 battle handling 2024-03-30 12:33:17 -05:00
TrèsAbhi 0933aa6615 fix: /rating use midnight leaderboard 2024-03-30 12:32:48 -05:00
TrèsAbhi 746592418d Update cd-rating-latest.yml 2024-03-30 12:22:20 -05:00
TrèsAbhi e2404b063c fix: sync on click inspector 2024-03-30 12:14:49 -05:00
TrèsAbhi bae1301556 fix: click through post inputs 2024-03-30 12:13:47 -05:00
TrèsAbhi c2de4952ad fix: use final thickness 2024-03-30 11:34:39 -05:00
TrèsAbhi cce61d8075 fix: uniform inv proj mat 2024-03-30 11:31:44 -05:00
TrèsAbhi 34a0388f45 fix: more accurate HE 2024-03-30 11:28:34 -05:00
TrèsAbhi 9d62965fc3 fix: use normal proj mat 2024-03-30 10:39:58 -05:00
TrèsAbhi 892434e28f fix: persistent equipment 2024-03-30 10:30:30 -05:00
TrèsAbhi 2597fe4bcd fix: use three js inverse view proj 2024-03-30 10:23:23 -05:00
TrèsAbhi f85b4b36bd fix: async exec 2024-03-29 16:45:17 -05:00
TrèsAbhi f777dafefc feat: generated list 2024-03-29 16:42:56 -05:00
TrèsAbhi 6ef65ccea3 fix: don't install fixed sharp twice 2024-03-29 16:40:07 -05:00
TrèsAbhi 974b27a313 fix: production flag 2024-03-29 16:38:51 -05:00
TrèsAbhi 5124d8abcd Merge branch 'dev' of https://github.com/tresabhi/blitzkrieg into dev 2024-03-29 16:33:15 -05:00
TrèsAbhi 849bd356c0 feat: logs 2024-03-29 16:33:13 -05:00
TrèsAbhi 6406486441 New Crowdin updates (#104) 2024-03-28 10:33:46 -05:00
TrèsAbhi 2993ada2e5 fix: always absolute deltas 2024-03-28 10:33:05 -05:00
TrèsAbhi f083c18dd0 feat: more optimal fetching 2024-03-28 10:31:36 -05:00
TrèsAbhi c7021c5689 feat: finalized 2024-03-28 10:27:33 -05:00
TrèsAbhi 815369805a fix: null rating type safety 2024-03-25 21:11:04 -05:00
TrèsAbhi d8feb5c3a8 fix: null rating type safety 2024-03-25 19:22:21 -05:00
TrèsAbhi cb101da8a8 fix: types 2024-03-25 18:43:23 -05:00
TrèsAbhi 71481f5971 feat: renaming 2024-03-25 18:22:37 -05:00
TrèsAbhi 817796ed3c feat: full command 2024-03-25 18:12:33 -05:00
TrèsAbhi ebb7618f2d feat: hero stat 2024-03-25 18:00:07 -05:00
TrèsAbhi 9717f153cd New Crowdin updates (#103) 2024-03-25 10:20:01 -05:00
TrèsAbhi afa0cfaeef feat: start on final design 2024-03-24 22:06:48 -05:00
TrèsAbhi 298b89b227 feat: new rating stat style 2024-03-21 22:32:01 -05:00
TrèsAbhi 3b94034767 feat: change ratings path to rating 2024-03-21 16:44:47 -05:00
TrèsAbhi 444b4c21af feat: sitemao 2024-03-21 16:29:59 -05:00
TrèsAbhi 3e9c828781 New Crowdin updates (#102) 2024-03-21 14:19:41 -05:00
TrèsAbhi ca3a1fbe3f feat: ratings stats 2024-03-20 20:40:01 -05:00
TrèsAbhi 5f28b541e3 feat: started work on rating stats 2024-03-20 18:03:00 -05:00
TrèsAbhi 18edd349f2 fix: only exclude root test files 2024-03-20 17:37:56 -05:00
TrèsAbhi f7c6a065c1 feat: renamed /ratings to /ratings-leaderboard 2024-03-20 17:33:21 -05:00
TrèsAbhi 91d48eeadd feat: remove reward section 2024-03-20 17:04:59 -05:00
TrèsAbhi 21bafa1b7b feat: added more stats 2024-03-20 16:58:43 -05:00
TrèsAbhi 38af2f2817 feat: extended ratings stats 2024-03-19 18:21:56 -05:00
TrèsAbhi 8faa1143e9 fix: only build assets on push to main 2024-03-18 18:13:34 -05:00
TrèsAbhi 8f34ebbca4 feat: grouped ratings workflows 2024-03-18 18:12:55 -05:00
TrèsAbhi 1c03701e17 feat: ratings leaderboard disk format 2024-03-18 18:06:45 -05:00
TrèsAbhi c8edd16eb3 feat: logs 2024-03-18 16:47:53 -05:00
TrèsAbhi b96ff2e239 New Crowdin updates (#101) 2024-03-18 16:36:55 -05:00
TrèsAbhi a575da3005 fix: move script to head 2024-03-18 10:09:46 -05:00
TrèsAbhi 3ca2dece3e feat: google analytics 2024-03-18 10:02:09 -05:00
TrèsAbhi 191d6133b2 feat: togglable spaced armor 2024-03-17 22:11:56 -05:00
TrèsAbhi b15e73e3a8 Update build.ts 2024-03-17 21:53:09 -05:00
TrèsAbhi 9a6b8ab979 Update cd-host.yml 2024-03-17 21:51:48 -05:00
TrèsAbhi 87786d41a7 feat: logs 2024-03-17 21:48:23 -05:00
TrèsAbhi ee7ffe7bc8 feat: include sharp in build 2024-03-17 21:45:55 -05:00
TrèsAbhi 379a33375d feat: better totals 2024-03-17 21:40:21 -05:00
TrèsAbhi bd3f5dea05 feat: optimized png cache 2024-03-17 21:23:57 -05:00
TrèsAbhi 146d36234e New Crowdin updates (#99) 2024-03-17 21:19:24 -05:00
TrèsAbhi f3edcb8077 Update cd-assets.yml 2024-03-17 20:17:11 -05:00
TrèsAbhi 9e492015ff feat: jpg texture files 2024-03-16 15:34:48 -05:00
TrèsAbhi d2977182d9 fix: grammer 2024-03-16 15:24:25 -05:00
TrèsAbhi 7d2d65bab8 fix: install sharp 2024-03-16 15:18:23 -05:00
TrèsAbhi 415c3bd066 fix: fixed sharp 2024-03-16 15:15:34 -05:00
TrèsAbhi 990ab1520c Merge pull request #100 from tresabhi/dev 2024-03-16 15:12:54 -05:00
TrèsAbhi 81cb1afeff fix: types 2024-03-16 15:12:47 -05:00
TrèsAbhi dba5a0a2cd feat: logs 2024-03-16 15:10:55 -05:00
TrèsAbhi 04cd205fee feat: preview servers 2024-03-16 15:07:05 -05:00
TrèsAbhi ec93d8e9ab feat: better words 2024-03-16 10:41:25 -05:00
TrèsAbhi 56321d9e33 feat: simplified owned tanks command 2024-03-16 00:06:44 -05:00
TrèsAbhi d39ab43e74 feat: error handling for /research 2024-03-15 21:50:19 -05:00
TrèsAbhi 787d3ae6ea feat: functionality and icons 2024-03-15 12:28:29 -05:00
TrèsAbhi 035f751bf1 feat: remove protobuf 2024-03-15 10:47:05 -05:00
TrèsAbhi 43442ac829 feat: start of protobuf 2024-03-15 00:21:58 -05:00
TrèsAbhi da02a089b9 feat: xp definitions 2024-03-14 23:31:50 -05:00
TrèsAbhi 476d8e804a feat: some ui 2024-03-14 17:31:11 -05:00
TrèsAbhi 43e1d53d39 feat: resolving lines 2024-03-14 16:43:28 -05:00
TrèsAbhi 5372068830 feat: added trees 2024-03-13 23:23:06 -05:00
TrèsAbhi 025cec3687 Merge pull request #98 from tresabhi/main 2024-03-13 20:30:50 -05:00
TrèsAbhi c47c629a83 Merge pull request #95 from tresabhi/l10n 2024-03-13 20:30:09 -05:00
TrèsAbhi 2b7907f8f7 fix: use main 2024-03-13 20:29:28 -05:00
TrèsAbhi 903d4e4d95 fix: multiple equipments 2024-03-13 18:50:08 -05:00
TrèsAbhi 8857b2baae feat: production ready 2024-03-13 18:36:48 -05:00
TrèsAbhi f7bbb17f66 Merge pull request #96 from tresabhi/1.16.4 2024-03-13 18:28:59 -05:00
TrèsAbhi f407ffe4bb feat: ignore script types 2024-03-13 18:25:13 -05:00
TrèsAbhi 791a09daae feat: simplified imports 2024-03-13 18:15:13 -05:00
TrèsAbhi 9592c0b55f feat: logs 2024-03-13 18:00:25 -05:00
TrèsAbhi d9a34dc60e fix: use no-store 2024-03-13 17:52:06 -05:00
TrèsAbhi 30e4e4e9b3 fix: autoreloader dpm by crew stats 2024-03-13 17:46:48 -05:00
TrèsAbhi bd3ea9a8ec fix: crew stats for auto reloader dpm 2024-03-13 17:42:19 -05:00
TrèsAbhi 8131b69422 fix: use WOTB_DLC_CDN 2024-03-13 17:35:40 -05:00
TrèsAbhi 340d9c2666 feat: nicer layer penetration indices 2024-03-13 17:34:29 -05:00
TrèsAbhi 2a169fac34 fix: more accurate splash mechanics 2024-03-13 17:15:22 -05:00
TrèsAbhi 4819100ec6 feat: sharp-based texture manipulation 2024-03-13 17:00:40 -05:00
TrèsAbhi f39a94cbe0 fix: us depot 2024-03-13 16:52:52 -05:00
TrèsAbhi e61598f768 Update cd-assets.yml 2024-03-13 14:14:14 -05:00
TrèsAbhi 04ee3a0a44 fix: use correct gh token 2024-03-13 13:30:08 -05:00
TrèsAbhi 8fa613f1e2 fix: use github token 2024-03-13 13:29:14 -05:00
TrèsAbhi bdc240df08 feat: push on any 2024-03-13 13:27:15 -05:00
TrèsAbhi 7169e0d91a New translations en-us.json (Spanish) 2024-03-13 05:37:55 -05:00
TrèsAbhi 889ed7e191 feat: verbose 2024-03-13 00:22:54 -05:00
TrèsAbhi 1fb8dac805 feat: smarter host 2024-03-13 00:19:33 -05:00
TrèsAbhi 9f71ac68b9 feat: patches 2024-03-13 00:17:30 -05:00
TrèsAbhi c1f3517a79 Merge pull request #97 from tresabhi/main 2024-03-12 23:39:24 -05:00
TrèsAbhi adb0af0f18 Delete docs/changelogs/1.16.2 copy.md 2024-03-12 23:39:06 -05:00
TrèsAbhi f79f1ffdc3 feat: organize files 2024-03-12 23:36:56 -05:00
TrèsAbhi 1c9b7463fc New translations en-us.json (Croatian (disambiguation)) 2024-03-12 23:04:08 -05:00
TrèsAbhi 80741d66fc New translations en-us.json (Spanish) 2024-03-12 23:04:07 -05:00
TrèsAbhi f02fb00e8c fix: space after plus 2024-03-12 22:50:08 -05:00
TrèsAbhi 3d353cc3cf feat: updated workflow action versions 2024-03-12 22:48:41 -05:00
TrèsAbhi c54ceb944e Merge pull request #94 from tresabhi/1.16.3 2024-03-12 22:43:51 -05:00
TrèsAbhi 37a2ba3566 feat: docs 2024-03-12 18:07:32 -05:00
TrèsAbhi caff7bb6d0 feat: improved vertical stablizer model compat 2024-03-12 18:00:00 -05:00
TrèsAbhi 01c491aee0 feat: 1 more decimal in pitch and yaw 2024-03-12 17:40:58 -05:00
TrèsAbhi fd408d6777 fix: use initial gun pitches correctly 2024-03-12 17:39:46 -05:00
TrèsAbhi 6d1ed1e56e fix: reveals a few hidden values 2024-03-12 17:09:21 -05:00
TrèsAbhi 46f9d605f7 fix: intra clip spelling 2024-03-12 16:53:42 -05:00
TrèsAbhi a65ea42b81 Update cd-ratings-na.yml 2024-03-12 13:22:03 -05:00
TrèsAbhi 40f8c6a915 Update cd-ratings-eu.yml 2024-03-12 13:21:19 -05:00
TrèsAbhi 4678359f36 Update cd-ratings-asia.yml 2024-03-12 13:20:58 -05:00
TrèsAbhi f91bd63646 whooped 2024-03-10 12:50:25 -05:00
TrèsAbhi c1872262f5 huh 2024-03-10 12:29:04 -05:00
TrèsAbhi 082e112758 Update constants.ts 2024-03-10 10:54:27 -05:00
TrèsAbhi 4cb7d50eb5 Update cd-assets.yml 2024-03-10 10:53:34 -05:00
TrèsAbhi 8c050add23 my butt 2024-03-09 23:33:14 -06:00
TrèsAbhi 2610697d86 wee ooo wee oo 2024-03-09 23:04:09 -06:00
TrèsAbhi 64f1de37ad help me 2024-03-09 22:50:55 -06:00
TrèsAbhi 58f6862279 aaaaaaaaaaaaaaaaaaaaaa 2024-03-09 22:46:21 -06:00
TrèsAbhi b47f6fdb32 i dunno xd 2024-03-09 22:42:03 -06:00
TrèsAbhi ce5a53d0ff i dunno 2024-03-09 22:39:04 -06:00
TrèsAbhi 6ee1fa13d3 fix: use require 2024-03-09 22:15:22 -06:00
TrèsAbhi 196f780bb3 Merge pull request #93 from tresabhi/1.16.2 2024-03-09 21:54:58 -06:00
TrèsAbhi 088d5a2941 Merge pull request #92 from tresabhi/l10n_1.16.2 2024-03-09 21:22:36 -06:00
TrèsAbhi 47abdaed6f feat: changelogs 2024-03-09 20:56:22 -06:00
TrèsAbhi 30f6055a69 New translations en-us.json (Croatian (disambiguation)) 2024-03-09 20:51:33 -06:00
TrèsAbhi 9d4b750dfd New translations en-us.json (Spanish) 2024-03-09 14:55:24 -06:00
TrèsAbhi d1308bc625 New translations en-us.json (Spanish) 2024-03-09 13:37:08 -06:00
TrèsAbhi db40256bb4 New translations en-us.json (Croatian (disambiguation)) 2024-03-09 12:10:50 -06:00
TrèsAbhi 70f1ebadfc New translations en-us.json (Spanish) 2024-03-09 12:10:49 -06:00
TrèsAbhi 43adaf85f5 fix: typos 2024-03-09 12:10:44 -06:00
TrèsAbhi 8d5e78a510 feat: button translations 2024-03-09 12:05:28 -06:00
TrèsAbhi 9d6d893373 feat: removed preview commands 2024-03-09 12:02:17 -06:00
TrèsAbhi 9840982aa2 feat: more strings 2024-03-09 12:01:41 -06:00
TrèsAbhi 8e216ebe46 fix: tighter numerical tank name inference 2024-03-09 11:50:47 -06:00
TrèsAbhi 889ae39e3b feat: user error strings 2024-03-09 11:48:35 -06:00
TrèsAbhi 265eff98bf fix: change name to rad 2024-03-09 11:31:45 -06:00
TrèsAbhi ef7d1dcfb3 Merge pull request #91 from tresabhi/l10n_1.16.2 2024-03-09 11:30:44 -06:00
TrèsAbhi 607ebc0025 New translations en-us.json (Croatian (disambiguation)) 2024-03-09 10:47:33 -06:00
TrèsAbhi 0f0bc9569d New translations en-us.json (Spanish) 2024-03-09 10:47:32 -06:00
TrèsAbhi 169e892678 New translations en-us.json (Spanish) 2024-03-09 09:37:16 -06:00
TrèsAbhi fe249e2704 New translations en-us.json (Croatian (disambiguation)) 2024-03-09 07:21:28 -06:00
TrèsAbhi b8be5d5e38 New translations en-us.json (Spanish) 2024-03-09 05:11:15 -06:00
TrèsAbhi 77d6c93b90 New translations en-us.json (Croatian (disambiguation)) 2024-03-08 20:43:31 -06:00
TrèsAbhi 4fedaf1cea feat: removed search tanks 2024-03-08 20:43:30 -06:00
TrèsAbhi b2220f885e New translations en-us.json (Spanish) 2024-03-08 20:43:30 -06:00
TrèsAbhi 3181f9c4e7 feat: removed player acheivements 2024-03-08 20:32:06 -06:00
TrèsAbhi 153d0d326d New translations en-us.json (Croatian (disambiguation)) 2024-03-08 20:29:58 -06:00
TrèsAbhi 7f9b349de6 New translations en-us.json (Spanish) 2024-03-08 20:29:58 -06:00
TrèsAbhi b3a50f2b27 feat: more command locales 2024-03-08 20:29:35 -06:00
TrèsAbhi fb49628375 New translations en-us.json (Croatian (disambiguation)) 2024-03-08 10:57:50 -06:00
TrèsAbhi 394a74c3a0 New translations en-us.json (Croatian) 2024-03-08 10:50:09 -06:00
TrèsAbhi 370bf826c0 New translations en-us.json (Spanish) 2024-03-08 10:08:12 -06:00
TrèsAbhi 38ca1499e2 Update en-US.json 2024-03-08 10:07:57 -06:00
TrèsAbhi 2deced699b New translations en-us.json (Spanish) 2024-03-08 10:05:16 -06:00
TrèsAbhi 6405af7ec7 Update en-US.json 2024-03-08 10:05:03 -06:00
TrèsAbhi fa2bdfca12 New translations en-us.json (Spanish) 2024-03-08 10:04:04 -06:00
TrèsAbhi 872e7ce704 Update en-US.json 2024-03-08 10:03:49 -06:00
TrèsAbhi 110d3c1007 New translations en-us.json (Spanish) 2024-03-08 10:02:56 -06:00
TrèsAbhi 7a27b70c29 Update en-US.json 2024-03-08 10:02:30 -06:00
TrèsAbhi 2ffe5a137c New translations en-us.json (Spanish) 2024-03-07 22:45:56 -06:00
TrèsAbhi bf0246ec26 feat: rename 2024-03-07 21:38:38 -06:00
TrèsAbhi b71feca802 Merge pull request #89 from tresabhi/l10n_1.16.2 2024-03-07 21:37:58 -06:00
TrèsAbhi da1fbeeca4 New translations en-us.json (Spanish) 2024-03-07 21:37:14 -06:00
TrèsAbhi 53174db351 feat: rename tank types to tank classes 2024-03-07 18:30:02 -06:00
TrèsAbhi 19d2ad4cb2 New translations en-us.json (Spanish) 2024-03-07 18:29:53 -06:00
TrèsAbhi 3325536bbc feat: random localizations 2024-03-07 18:27:05 -06:00
TrèsAbhi 4220177b02 New translations en-us.json (Spanish) 2024-03-07 18:27:00 -06:00
TrèsAbhi 796aca21cf feat: breakdown locale 2024-03-07 17:02:37 -06:00
TrèsAbhi 3510768786 New translations en-us.json (Spanish) 2024-03-07 15:13:37 -06:00
TrèsAbhi 6197642d5e Merge pull request #88 from tresabhi/l10n_1.16.2 2024-03-07 13:49:52 -06:00
TrèsAbhi b60f8bfd57 feat: filter strings 2024-03-07 13:49:38 -06:00
TrèsAbhi 9437d16908 New translations en-us.json (Spanish) 2024-03-07 13:49:36 -06:00
TrèsAbhi de9077e0d2 New translations en-us.json (Spanish) 2024-03-06 20:44:06 -06:00
TrèsAbhi 4a6e946809 New translations en-us.json (Spanish) 2024-03-06 19:30:57 -06:00
TrèsAbhi 935c578ef6 Update en-US.json 2024-03-06 19:30:47 -06:00
TrèsAbhi 0e06ff52ba New translations en-us.json (Spanish) 2024-03-06 17:44:42 -06:00
TrèsAbhi fa4590d8f6 Merge pull request #87 from tresabhi/l10n_1.16.2 2024-03-06 17:41:02 -06:00
TrèsAbhi 5620b118f4 feat: some full stats locale 2024-03-06 17:41:05 -06:00
TrèsAbhi d53b31ca40 New translations en-us.json (Spanish) 2024-03-06 17:40:53 -06:00
TrèsAbhi a4a5d53f66 New translations en-us.json (Spanish) 2024-03-06 17:39:44 -06:00
TrèsAbhi 9f4c8c9088 feat: inactive command localization 2024-03-06 17:19:00 -06:00
TrèsAbhi 472172c504 New translations en-us.json (Spanish) 2024-03-06 17:18:51 -06:00
TrèsAbhi bc08656806 New translations en-us.json (Spanish) 2024-03-06 17:13:57 -06:00
TrèsAbhi bd6f1f3570 feat: no data translations 2024-03-06 16:26:36 -06:00
TrèsAbhi 716b446272 fix: remove refresh button if not enough permissions 2024-03-06 16:19:29 -06:00
TrèsAbhi 96a9e5b938 feat: filter localizations 2024-03-06 16:11:08 -06:00
TrèsAbhi 83e31e6352 New translations en-us.json (Spanish) 2024-03-06 16:11:07 -06:00
TrèsAbhi 49d0dbe86d feat: simpler command types 2024-03-06 15:38:53 -06:00
TrèsAbhi e141a7ca3f New translations en-us.json (Spanish) 2024-03-06 15:35:14 -06:00
TrèsAbhi adad668157 feat: some period translations 2024-03-06 15:34:10 -06:00
TrèsAbhi 267f23cad8 fix: use dot in /link 2024-03-06 09:53:28 -06:00
TrèsAbhi f605801555 feat: better titlebar 2024-03-06 09:52:09 -06:00
TrèsAbhi 19e81ff78a Merge pull request #86 from tresabhi/l10n_1.16.2 2024-03-05 21:15:33 -06:00
TrèsAbhi 9232a95e00 New translations en-us.json (Spanish) 2024-03-05 12:32:21 -06:00
TrèsAbhi 6dcef6b199 feat: default shard localew 2024-03-05 11:00:53 -06:00
TrèsAbhi e355bd10b1 feat: debug command 2024-03-05 10:58:41 -06:00
TrèsAbhi ceb4ed52c0 New translations en-us.json (Spanish) 2024-03-05 10:58:35 -06:00
TrèsAbhi 227750efad New translations en-us.json (Spanish) 2024-03-05 10:51:17 -06:00
TrèsAbhi 8a76558f01 feat: period subcommands 2024-03-05 10:51:14 -06:00
TrèsAbhi db7c865c76 feat: partially translated /about 2024-03-05 09:59:46 -06:00
TrèsAbhi 8e35e0d6d9 Merge pull request #85 from tresabhi/l10n_1.16.2 2024-03-05 09:47:53 -06:00
TrèsAbhi c9d50f39b5 New translations en-us.json (Spanish) 2024-03-05 09:47:34 -06:00
TrèsAbhi 77ac893a7c feat: es fix 2024-03-05 09:30:20 -06:00
TrèsAbhi ac60a436f1 feat: started implementation of translations 2024-03-04 10:33:02 -06:00
TrèsAbhi 2ba9f0f4c8 Merge pull request #83 from tresabhi/l10n_1.16.2
New Crowdin updates
2024-03-04 08:18:52 -06:00
TrèsAbhi 47c3aa4842 New translations en-us.json (Spanish) 2024-03-04 05:42:48 -06:00
TrèsAbhi d2edf4b89d New translations en-us.json (Spanish) 2024-03-04 02:54:51 -06:00
TrèsAbhi 11a0c246dc feat: error tolerant command registeration 2024-03-03 22:21:06 -06:00
TrèsAbhi cba93b3d55 feat: translate funcs 2024-03-03 22:13:22 -06:00
TrèsAbhi fa9b6c6d97 Merge pull request #82 from tresabhi/l10n_1.16.2 2024-03-03 21:47:33 -06:00
TrèsAbhi bef48eca62 New translations en-us.json (Japanese) 2024-03-03 21:44:38 -06:00
TrèsAbhi e42ff03c4b New translations en-us.json (Spanish) 2024-03-03 21:44:38 -06:00
TrèsAbhi ec628e4a0d fix: rename to en us 2024-03-03 21:42:08 -06:00
TrèsAbhi 8865a48936 feat: base lang 2024-03-03 21:41:12 -06:00
TrèsAbhi d3a9c3bd95 Create crowdin.yml 2024-03-03 20:24:31 -06:00
TrèsAbhi 90bff59af3 feat: more muted colors 2024-03-03 17:59:39 -06:00
TrèsAbhi 9efe9860ae feat: static grid 2024-03-03 17:42:53 -06:00
TrèsAbhi f6a418499b feat: direct depot 2024-03-03 16:08:29 -06:00
TrèsAbhi 66740bcb8d feat: vocab 2024-03-03 15:58:21 -06:00
TrèsAbhi 035e257926 feat: add closedkrieg 2024-03-01 22:54:03 -06:00
TrèsAbhi e63549158b feat: use glsl 3 2024-03-01 10:27:11 -06:00
TrèsAbhi 7fb64e690f Merge pull request #81 from tresabhi/1.16.1 2024-02-29 16:05:48 -06:00
TrèsAbhi 54798c30b1 feat: changelogs 2024-02-29 16:05:43 -06:00
TrèsAbhi 4c0f7b61e4 fix: reset shot after tank change 2024-02-29 15:58:17 -06:00
TrèsAbhi 206ac373d2 fix: cos domain 2024-02-29 15:54:15 -06:00
TrèsAbhi c626e84f7d feat: no depth read core tracer 2024-02-29 15:38:57 -06:00
TrèsAbhi 90ec5fa80b fix: a few issues 2024-02-29 15:37:04 -06:00
TrèsAbhi d496b46b6f fix: post mid point tracer 2024-02-29 15:30:53 -06:00
TrèsAbhi 7af1fdcf6b feat: animation 2024-02-29 13:17:41 -06:00
TrèsAbhi 199e156e53 feat: more accurate HE 2024-02-29 12:42:15 -06:00
TrèsAbhi f5578ee788 feat: damage 2024-02-29 12:02:14 -06:00
TrèsAbhi c0a3628b3b feat: list 2024-02-29 11:16:00 -06:00
TrèsAbhi fa8922e0a6 feat: he mechanics 2024-02-29 10:40:36 -06:00
TrèsAbhi bf6991ce06 feat: proper ricochet visuals 2024-02-29 10:30:48 -06:00
TrèsAbhi 7f49245f15 feat: more progress 2024-02-28 23:06:37 -06:00
TrèsAbhi f55313e0cd feat: shot display 2024-02-28 22:29:21 -06:00
TrèsAbhi 69c388f243 feat: starting work on on-click armor 2024-02-28 17:41:59 -06:00
TrèsAbhi 35788657a8 fix: remove default tab 2024-02-28 14:59:19 -06:00
TrèsAbhi d531698867 feat: calibrated shells 2024-02-27 18:13:26 -06:00
TrèsAbhi cc4177bf14 feat: enhanced armor 2024-02-27 18:08:50 -06:00
TrèsAbhi d377067441 feat: remove unused code 2024-02-27 17:57:59 -06:00
TrèsAbhi b2f026c212 fix: persist settings 2024-02-27 17:56:01 -06:00
TrèsAbhi 07cdb0788c feat: opaque mode 2024-02-27 17:44:18 -06:00
TrèsAbhi 01f919ddd3 feat: wireframe mode 2024-02-27 17:39:01 -06:00
TrèsAbhi 4b1fda9680 feat: green penetration 2024-02-27 17:36:05 -06:00
TrèsAbhi 79d03233ae feat: he shells 2024-02-27 17:21:41 -06:00
TrèsAbhi 522b40aff1 feat: heat shells 2024-02-27 17:15:24 -06:00
TrèsAbhi 06c878dd2c feat: some cleaning up 2024-02-27 15:34:12 -06:00
TrèsAbhi f5c589373d feat: finalize ap 2024-02-27 13:50:15 -06:00
TrèsAbhi 2689568650 feat: core armor 2024-02-27 11:52:36 -06:00
TrèsAbhi fabf649608 feat: spaced armor finish 2024-02-27 11:02:14 -06:00
TrèsAbhi 080af86e1b feat: shaders 2024-02-27 10:31:49 -06:00
TrèsAbhi e5b58cd5ff fix: format 2024-02-27 09:31:22 -06:00
TrèsAbhi 3500389628 feat: something 2024-02-27 09:29:12 -06:00
TrèsAbhi 1129f0d60b Update layout.tsx 2024-02-27 08:00:16 -06:00
TrèsAbhi b3a6a47a6a feat: start of new engine 2024-02-26 13:29:05 -06:00
TrèsAbhi bdb3844bcc Merge pull request #80 from tresabhi/main 2024-02-26 09:02:28 -06:00
TrèsAbhi f0bb25efc1 Update layout.tsx 2024-02-26 08:45:37 -06:00
TrèsAbhi bfd23db3ff fix: no crons 2024-02-25 20:18:00 -06:00
TrèsAbhi 9c63177f03 fix: all tank icons 2024-02-25 16:09:57 -06:00
TrèsAbhi 24b4e32f50 Merge pull request #79 from tresabhi/1.16.0 2024-02-25 16:01:59 -06:00
TrèsAbhi 2e7bde8861 feat: hide errors 2024-02-25 14:34:06 -06:00
TrèsAbhi 56c626e8a1 fix: remove id lock 2024-02-25 11:57:27 -06:00
TrèsAbhi c12eb9f68a feat: better skyline 2024-02-24 19:34:52 -06:00
TrèsAbhi 8bc94e7c10 feat: donate button 2024-02-24 19:34:02 -06:00
TrèsAbhi e8e6161911 feat: default equipment rammer 2024-02-24 18:49:14 -06:00
TrèsAbhi d4f6b1a003 fix: devkrieg 2024-02-23 18:19:23 -06:00
TrèsAbhi 6cafbc1ffe feat: docs 2024-02-23 18:18:56 -06:00
TrèsAbhi b3336289e8 feat: anylitics 2024-02-23 18:17:17 -06:00
TrèsAbhi 3b92b43cb3 feat: nightly assets 2024-02-23 18:15:46 -06:00
TrèsAbhi 2f3dca8f4c feat: changelogs 2024-02-23 18:07:11 -06:00
TrèsAbhi 0c76f76a5b fix: action branches 2024-02-23 17:07:31 -06:00
TrèsAbhi d37e0390fb fix: ratings command username feild 2024-02-23 17:00:21 -06:00
TrèsAbhi a185dbe644 fix: undefined style 2024-02-23 16:51:04 -06:00
TrèsAbhi 5b9fb1ea00 fix: remove google domain verification file 2024-02-23 16:44:10 -06:00
TrèsAbhi 5106b7c97d fix: version 2024-02-23 16:43:48 -06:00
TrèsAbhi d88cb02d94 fix: a drew redundancies 2024-02-23 16:36:11 -06:00
TrèsAbhi 7fd128ac49 fix: re-enable tankopdia 2024-02-23 16:06:50 -06:00
TrèsAbhi a637dca083 Merge branch 'main' into dev 2024-02-23 16:05:46 -06:00
TrèsAbhi 23a33c7722 Merge branch 'main' into dev 2024-02-23 16:05:29 -06:00
TrèsAbhi 918a0d73b9 fix: ignore yarn 2024-02-23 15:57:50 -06:00
TrèsAbhi ca9f991bcb fix: rename to pushTankopediaPath 2024-02-23 15:54:51 -06:00
TrèsAbhi 2e9388d3c7 fix: no propogation on hull 2024-02-23 15:52:09 -06:00
TrèsAbhi 383196bdd3 feat: clean url handling 2024-02-22 22:07:09 -06:00
TrèsAbhi e69e66f5f7 feat: 8 day dev cooldown 2024-02-22 21:58:03 -06:00
TrèsAbhi b9c5c3c931 feat: better fullscreen 2024-02-22 19:04:44 -06:00
TrèsAbhi edb9104d77 fix: correct yaw mutation call 2024-02-22 18:44:32 -06:00
TrèsAbhi e0feb45f48 fix: no cam pos reset on tank swap 2024-02-22 18:43:10 -06:00
TrèsAbhi bc211822aa fix: armor mesh rotation dysync 2024-02-22 18:36:21 -06:00
TrèsAbhi e33ae0f81b feat: more accurate angle calculation in fragment shader 2024-02-22 18:14:59 -06:00
TrèsAbhi 8467fb98d6 fix: no page memo 2024-02-22 18:11:06 -06:00
TrèsAbhi 62cb2c7217 fix: ricochet penetration as a sphere 2024-02-22 17:57:11 -06:00
TrèsAbhi f2331261cf fix: penetration loss text on ricochet 2024-02-22 17:52:37 -06:00
TrèsAbhi 26ae7bcbdf fix: remove shot after module change 2024-02-22 17:49:05 -06:00
TrèsAbhi 291b93b7d7 fix: use antagonist calibrated shells 2024-02-22 17:47:12 -06:00
TrèsAbhi 73fccbb2bb fix: external modules not contributong to spaced armor detph buffer 2024-02-22 17:28:53 -06:00
TrèsAbhi 7e92f8ac50 feat: united duel data 2024-02-22 16:41:42 -06:00
TrèsAbhi da767213cb fix: don't update armor highlighting on protagonist shell switch 2024-02-22 13:07:13 -06:00
TrèsAbhi d81eddba44 fix: no suspense on shell switching 2024-02-22 12:55:38 -06:00
TrèsAbhi 83599539b5 fix: canvas blocking tabs 2024-02-22 12:43:50 -06:00
TrèsAbhi c145aa9499 feat: few preset provisions and equipments 2024-02-22 12:37:17 -06:00
TrèsAbhi ffeaba6a18 fix: shrink canvas 2024-02-22 12:23:56 -06:00
TrèsAbhi c68df74943 fix: use new model format 2024-02-22 12:20:29 -06:00
TrèsAbhi 1c3e98678f feat: fixed camo 2024-02-22 10:56:45 -06:00
TrèsAbhi b1a1e07f7d fix: something 2024-02-21 13:32:51 -06:00
TrèsAbhi 46f8c72bef feat: only run on main and dev 2024-02-21 13:01:16 -06:00
TrèsAbhi a4f2902365 fix: use ecoding 2024-02-21 12:51:39 -06:00
TrèsAbhi bcda936585 fix: undef handling 2024-02-21 10:12:19 -06:00
TrèsAbhi c16a5f1701 feat: conditional prodiction dep 2024-02-21 09:54:58 -06:00
TrèsAbhi 569f803ab2 Update index.ts 2024-02-21 08:35:01 -06:00
TrèsAbhi 7bd797cb3a Update tankModels.ts 2024-02-21 08:07:27 -06:00
TrèsAbhi 1e875540fc Update tankModels.ts 2024-02-21 07:45:48 -06:00
TrèsAbhi bcde6907c8 feat: improved tools 2024-02-20 22:36:18 -06:00
TrèsAbhi a19c772bba fix: use betakrieg 2024-02-20 22:23:11 -06:00
TrèsAbhi 24ca684db3 feat: experimental warning 2024-02-20 22:10:59 -06:00
TrèsAbhi 6fd8b83d39 fix: proper undefined handling 2024-02-20 21:52:34 -06:00
TrèsAbhi 3ecc87431a feat: concurrency 2024-02-20 21:27:04 -06:00
TrèsAbhi 082e41bd76 fix: gh_token 2024-02-20 13:23:30 -06:00
TrèsAbhi 6f0bfa6b22 feat: print error on blob fail 2024-02-20 12:55:51 -06:00
TrèsAbhi bcb8669898 fix: discord token 2024-02-20 11:52:49 -06:00
TrèsAbhi 4bdb4f47fa feat: fixed sharp 2024-02-20 11:38:50 -06:00
TrèsAbhi a51cbc51de feat: proper lod0 handling 2024-02-20 11:21:01 -06:00
TrèsAbhi 060d00ccc4 fix: ignore engines 2024-02-20 10:14:02 -06:00
TrèsAbhi 1ddc51f6c7 fix: ps syntax 2024-02-20 10:01:35 -06:00
TrèsAbhi b222cbe41c feat: call build script 2024-02-20 09:51:11 -06:00
TrèsAbhi 53b4c0db69 feat: snitch2 2024-02-19 21:52:00 -06:00
TrèsAbhi ebaef28f06 feat: snitch 2024-02-19 21:36:06 -06:00
TrèsAbhi 0948b52957 feat: use cache 2024-02-19 21:30:04 -06:00
TrèsAbhi bc51c59fe1 feat: cache 2024-02-19 21:26:56 -06:00
TrèsAbhi 17a3d45e92 fix: = 2024-02-19 21:19:05 -06:00
TrèsAbhi 2fd8416887 feat: login 2024-02-19 21:14:34 -06:00
TrèsAbhi 46f11af717 feat: windows 2024-02-19 21:10:13 -06:00
TrèsAbhi c0670e9025 feat: run 2024-02-19 21:02:46 -06:00
TrèsAbhi bc9cc4ba2a fix: --add 2024-02-19 21:01:17 -06:00
TrèsAbhi 38ee4c6f12 fix: relative dir 2024-02-19 20:59:14 -06:00
TrèsAbhi 72aa528db2 fix: chmod 2024-02-19 20:58:34 -06:00
TrèsAbhi 5d63b8c239 feat: run 2024-02-19 20:44:44 -06:00
TrèsAbhi f78c1ea75f feat: linux dist 2024-02-19 20:42:30 -06:00
TrèsAbhi 38989689f5 fix: await 2024-02-19 20:37:34 -06:00
TrèsAbhi 1e5094f3ff feat: lock file 2024-02-19 20:36:12 -06:00
TrèsAbhi 067178e94d feat: depot 2024-02-19 20:32:12 -06:00
TrèsAbhi 58002958bf feat: move ammo types to fire 2024-02-19 19:05:49 -06:00
TrèsAbhi ca030688cb feat: things? 2024-02-19 18:45:43 -06:00
TrèsAbhi b883f5b9e2 Update package.json 2024-02-19 08:19:19 -06:00
TrèsAbhi 85f815c538 Delete yarn.lock 2024-02-19 08:09:39 -06:00
TrèsAbhi b2ddd5f286 Update package.json 2024-02-19 08:05:44 -06:00
TrèsAbhi 11bbcc7993 feat: async commit 2024-02-18 19:11:41 -06:00
TrèsAbhi 70f7b862e3 feat: wireframe armor viewer 2024-02-18 16:56:52 -06:00
TrèsAbhi 544eb92a6b feat: improved ventlation 2024-02-18 16:33:29 -06:00
TrèsAbhi 7a123b68db fix: disable crew on non-tech trees 2024-02-18 16:26:26 -06:00
TrèsAbhi b89925e86b feat: removed night 2024-02-18 16:23:10 -06:00
TrèsAbhi fc1f3cdb55 fix: remove pbr badge 2024-02-18 16:19:25 -06:00
TrèsAbhi 19717aeb79 feat: better environment ui 2024-02-18 16:18:56 -06:00
TrèsAbhi 60a115b7d8 feat: more accurate models 2024-02-18 16:17:00 -06:00
TrèsAbhi bc85b354a0 feat: new lighting 2024-02-17 10:52:21 -06:00
TrèsAbhi 1b611fa7c4 feat: removed banner 2024-02-17 10:43:34 -06:00
TrèsAbhi 34ba3ffdde feat: better cropped icons 2024-02-17 10:36:00 -06:00
TrèsAbhi af4d2dbfd0 feat: reactive wide format 2024-02-17 10:23:43 -06:00
TrèsAbhi 0b12f65949 feat: synx quick equipment 2024-02-17 10:20:43 -06:00
TrèsAbhi b8beb6e8be fix: draug moment 2024-02-17 10:05:56 -06:00
TrèsAbhi 09ba8663e6 feat: stat parity 2024-02-17 09:57:52 -06:00
TrèsAbhi b7558c33da feat: rest of provisions 2024-02-16 23:12:53 -06:00
TrèsAbhi 9174f3c9d0 fix: use non-compounding percentages 2024-02-16 23:08:20 -06:00
TrèsAbhi 2c8c04387b feat: crew basics 2024-02-16 21:07:48 -06:00
TrèsAbhi b1e5502b04 fix: clear on fire 2024-02-16 10:25:51 -06:00
TrèsAbhi ddf2c2b2ac fix: dpm using adrelaine and tungesten 2024-02-16 10:25:15 -06:00
TrèsAbhi 2a70602f7e feat: crew 2024-02-16 10:20:20 -06:00
TrèsAbhi c128d8ab0c fix: division by 0 2024-02-16 10:00:09 -06:00
TrèsAbhi 0e57c37296 fix: use gun list for dispersion fallback 2024-02-16 09:48:57 -06:00
TrèsAbhi e0c0ec6fc3 fix: 0 decimals 2024-02-16 09:48:27 -06:00
TrèsAbhi 31bb92c089 feat: camouflage bonus 2024-02-13 20:45:43 -06:00
TrèsAbhi 417385f231 feat: consumables 2024-02-13 19:46:34 -06:00
TrèsAbhi 62bfab0960 feat: smaller icons 2024-02-13 09:42:30 -06:00
TrèsAbhi 809f807da8 feat: consumable timings 2024-02-13 09:40:00 -06:00
TrèsAbhi 8f098d435a fix: penetration deltas 2024-02-12 19:27:50 -06:00
TrèsAbhi 574b1eec92 feat: code split module buttons 2024-02-12 19:24:34 -06:00
TrèsAbhi 7bd8629706 Add files via upload 2024-02-12 09:52:37 -06:00
TrèsAbhi 9d7c60e92d feat: consumables 2024-02-11 14:55:21 -06:00
TrèsAbhi 12cf05cb50 fix: engine accel now affects all engine powers 2024-02-11 14:28:27 -06:00
TrèsAbhi acd7162aa1 fix: ton unit name 2024-02-11 14:25:17 -06:00
TrèsAbhi efbb8376ef fix: caliberated shells now affects stats once again 2024-02-11 14:24:26 -06:00
TrèsAbhi bc4fa60f67 fix: camo net now affects all stats 2024-02-11 14:21:51 -06:00
TrèsAbhi f13b0f2255 feat: center aligned icons 2024-02-11 14:17:41 -06:00
TrèsAbhi 4ea8615fb5 feat: track directions 2024-02-10 00:08:42 -06:00
TrèsAbhi 7877eaa89b feat: named sorting 2024-02-10 00:04:43 -06:00
TrèsAbhi a8a50ac948 feat: move fire to first 2024-02-09 23:44:38 -06:00
TrèsAbhi 4206286c21 feat: remove max count 2024-02-09 23:43:30 -06:00
TrèsAbhi eec9a4c9e6 feat: smaller compact search 2024-02-09 23:37:22 -06:00
TrèsAbhi 469ffa145a feat: brighter flags 2024-02-09 23:36:04 -06:00
TrèsAbhi e1fdab42c0 fix: default listing 2024-02-09 23:35:24 -06:00
TrèsAbhi 39238a6491 fix: shortform dpm 2024-02-09 23:32:52 -06:00
TrèsAbhi fdc662fedf feat: change order 2024-02-09 23:30:40 -06:00
TrèsAbhi 9d805f63d5 fix: use dynamic shells 2024-02-09 23:28:36 -06:00
TrèsAbhi 68273ea295 feat: simplified shell stats 2024-02-09 23:27:47 -06:00
TrèsAbhi def5e4fa4f feat: render tank iamge above shadow 2024-02-09 19:48:33 -06:00
TrèsAbhi f3b1240990 feat: duller flags 2024-02-09 19:47:26 -06:00
TrèsAbhi 8c25037cb8 fix: default order 2024-02-09 19:43:02 -06:00
TrèsAbhi 31936d6e6c feat: equipments 2024-02-09 19:29:54 -06:00
TrèsAbhi cc622ef189 feat: sticky stats 2024-02-09 18:51:28 -06:00
TrèsAbhi 6ef0448d9f feat: deltas 2024-02-09 18:47:53 -06:00
TrèsAbhi 01dc3137d8 feat: begenning or equipment 2024-02-09 18:25:23 -06:00
TrèsAbhi 543e963d1d feat: titles 2024-02-09 18:09:36 -06:00
TrèsAbhi c12a66eeab fix: remove yarn downgrade file 2024-02-09 16:39:01 -06:00
TrèsAbhi a9f2ba776a fix: filter reset 2024-02-09 16:04:09 -06:00
TrèsAbhi e7525006b5 feat: sort options 2024-02-09 16:01:06 -06:00
TrèsAbhi ded71bf4f9 fix: downgrade to yarn 1 2024-02-09 11:05:37 -06:00
TrèsAbhi 1b9cf8b604 fix: remove shot when swithcing shells 2024-02-08 11:26:12 -06:00
TrèsAbhi 01e7353ef4 feat: rest of the stats 2024-02-08 11:18:43 -06:00
TrèsAbhi 73294af296 fix: track click 2024-02-08 11:11:20 -06:00
TrèsAbhi c3dc844167 feat: track tiers 2024-02-08 11:09:33 -06:00
TrèsAbhi 1eaa276b76 feat: tracks 2024-02-08 11:08:22 -06:00
TrèsAbhi 2b37e08f19 feat: more data 2024-02-08 10:58:03 -06:00
TrèsAbhi de52b525fb feat: speed 2024-02-07 21:31:04 -06:00
TrèsAbhi 8c39b6e3df feat: dispersion stats 2024-02-07 21:18:07 -06:00
TrèsAbhi 75c6bf2b68 fix: remove unnesesary use effect 2024-02-07 20:39:11 -06:00
TrèsAbhi 0308a10690 fix: merge 2024-02-07 15:16:48 -06:00
TrèsAbhi eab8bac68c fix: order 2024-02-07 14:56:42 -06:00
TrèsAbhi 19783ccbd6 Update page.tsx 2024-02-07 14:22:30 -06:00
TrèsAbhi 10799e52ce feat: remove logging vars 2024-02-07 13:45:51 -06:00
TrèsAbhi 92bb4af5ec fix: test 2024-02-07 13:40:14 -06:00
TrèsAbhi 846c2a4962 fix: something 2024-02-07 13:32:23 -06:00
TrèsAbhi 84300389f9 feat: future proof 2024-02-07 13:12:44 -06:00
TrèsAbhi cb2846a256 feat: switch to array buffer 2024-02-07 10:34:13 -06:00
TrèsAbhi 9cfa2357b0 feat: rename to cdon 2024-02-07 10:02:00 -06:00
TrèsAbhi eaa67ba1fe fix: use and 2024-02-06 18:29:12 -06:00
TrèsAbhi d8a5f57787 feat: changelogs 2024-02-06 18:26:15 -06:00
TrèsAbhi 13651650ab fix: delta by time 2024-02-06 18:24:29 -06:00
TrèsAbhi 901f1bfe42 feat: ricochet repenetration 2024-02-06 17:57:20 -06:00
TrèsAbhi 8bb5032ee4 feat: environment options 2024-02-06 15:35:48 -06:00
TrèsAbhi bf59d127f9 feat: move some filters 2024-02-06 15:18:18 -06:00
TrèsAbhi 4fb0aa3936 feat: simpler filter ui 2024-02-06 15:10:54 -06:00
TrèsAbhi ed8a1c2f57 fix: no fallback on state change 2024-02-06 15:01:03 -06:00
TrèsAbhi 059358cff4 feat: put other in end 2024-02-06 13:34:23 -06:00
TrèsAbhi 939acad30c feat: compact search 2024-02-06 13:28:05 -06:00
TrèsAbhi 4d09b3deb1 feat: sort order 2024-02-06 13:18:39 -06:00
TrèsAbhi a5c4dad3d4 feat: remove tank card hover animation 2024-02-06 13:10:28 -06:00
TrèsAbhi 2cb5e4e173 fix: gun type names 2024-02-06 13:07:01 -06:00
TrèsAbhi 708bcab2f3 fix: apply fast string comrpession 2024-02-05 18:33:17 -06:00
TrèsAbhi 2de077a3ab feat: utf8 2024-02-05 18:06:18 -06:00
TrèsAbhi 63084d1855 feat: deploy new compression 2024-02-05 17:30:30 -06:00
TrèsAbhi 1575b803c0 feat: more compression 2024-02-05 13:33:23 -06:00
TrèsAbhi afe041f969 feat: speed definitions 2024-02-05 12:57:03 -06:00
TrèsAbhi 9644692084 Merge pull request #65 from tresabhi/1.15.12 2024-02-05 09:35:56 -06:00
TrèsAbhi b52c3c6c68 feat: updates 2024-02-05 09:36:03 -06:00
TrèsAbhi 0260fc6fbc yup 2024-02-04 21:59:45 -06:00
TrèsAbhi 73bd76bcdb huhuh 2024-02-04 21:47:11 -06:00
TrèsAbhi 2960f85671 asdads 2024-02-04 21:45:57 -06:00
TrèsAbhi 34c742555d fix: docs 2024-02-04 21:41:58 -06:00
TrèsAbhi 3b1066fade feat: more compression ig 2024-02-04 21:40:40 -06:00
TrèsAbhi 6753cedd33 feat: complete bkon 2024-02-04 21:10:44 -06:00
TrèsAbhi 2951ccdad5 feat: write stream 2024-02-04 18:48:39 -06:00
TrèsAbhi 93e405c370 feat: read stream 2024-02-04 17:55:48 -06:00
TrèsAbhi 016fe1c3d3 fix: move dev names 2024-02-04 11:58:49 -06:00
TrèsAbhi c816f7a923 feat: centered shot display text 2024-02-04 11:23:39 -06:00
TrèsAbhi 43b6453fcb feat: bkon read 2024-02-04 11:06:26 -06:00
TrèsAbhi 559fb30da9 feat: game filter parity 2024-02-03 16:44:10 -06:00
TrèsAbhi 273ab97d3f fix: ugh 2024-02-03 16:33:33 -06:00
TrèsAbhi fcac511a28 feat: gun rotation speed 2024-02-03 16:28:33 -06:00
TrèsAbhi b811be4284 feat: more values batch 1 2024-02-03 15:54:21 -06:00
TrèsAbhi 1a19e56523 feat: pbr badge 2024-02-03 15:13:19 -06:00
TrèsAbhi e5a235ba41 feat: more credits 2024-02-03 14:54:26 -06:00
TrèsAbhi 1448584f2f feat: no bold discirminoatr 2024-02-03 14:52:07 -06:00
TrèsAbhi 4433855047 feat: dpm docs 2024-02-03 14:50:35 -06:00
TrèsAbhi 02f63ee5f0 fix: full width stats 2024-02-03 13:49:29 -06:00
TrèsAbhi 36f0299e51 fix: heat ricochet 2024-02-03 13:30:38 -06:00
TrèsAbhi 170056cc55 fix: no user select for on canvas elements 2024-02-03 12:47:37 -06:00
TrèsAbhi a212d2142c fix: compare remaining penetration with 0 2024-02-03 12:22:52 -06:00
TrèsAbhi d89575b25d feat: he based gaps 2024-02-03 12:16:33 -06:00
TrèsAbhi 8f9306a3db fix: on click use equipment 2024-02-03 11:51:19 -06:00
TrèsAbhi 5f9e631011 fix: scale by PI/2 2024-02-02 23:29:10 -06:00
TrèsAbhi b290c88c1d fix: use two calibers rule on spaced armor 2024-02-02 23:21:12 -06:00
TrèsAbhi 2e888525c6 feat: cleaner 1 layer penetration 2024-02-02 23:10:43 -06:00
TrèsAbhi d54c08dc4e feat: no duplicate armor peices 2024-02-02 23:07:58 -06:00
TrèsAbhi 821076ae59 fix: spaced and external swapped 2024-02-02 23:01:26 -06:00
TrèsAbhi 13e11e4e09 feat: remove shot on tank switch 2024-02-02 18:17:53 -06:00
TrèsAbhi 0ab53a7825 feat: apply quaternion rotation 2024-02-02 18:10:43 -06:00
TrèsAbhi 15cb472189 feat: allow thicker lines to depth read 2024-02-02 17:53:13 -06:00
TrèsAbhi 39a6e2c38e feat: more thickness 2024-02-02 17:50:48 -06:00
TrèsAbhi 7c6c0a2b81 feat: trace lines 2024-02-02 17:48:18 -06:00
TrèsAbhi 3c63323814 feat: ricochet angle 2024-02-02 17:41:18 -06:00
TrèsAbhi 44f00e042e feat: no angled value for external 2024-02-02 17:03:49 -06:00
TrèsAbhi 3a99205194 feat: layering 2024-02-02 16:59:59 -06:00
TrèsAbhi c2e550e33d feat: on click display 2024-02-02 16:08:41 -06:00
TrèsAbhi b01a03c6ce feat: basic click functionality 2024-02-02 10:31:40 -06:00
TrèsAbhi 0251bfc842 fix: misc map 2024-02-02 09:46:24 -06:00
TrèsAbhi 89d4cadb61 feat: optimal shell index 2024-02-01 13:09:57 -06:00
TrèsAbhi e33fdffd99 feat: advanced dpm 2024-02-01 13:05:09 -06:00
TrèsAbhi 082996b152 feat: show environment 2024-02-01 12:28:56 -06:00
TrèsAbhi e9c3953085 feat: stats organization 2024-02-01 12:06:13 -06:00
TrèsAbhi 9f2ced6bfd feat: new layout 2024-02-01 11:52:48 -06:00
TrèsAbhi 281549add3 yeah 2024-01-29 19:30:45 -06:00
TrèsAbhi 91945a3b27 feat: brighyer ambinent lgihts 2024-01-29 19:25:34 -06:00
TrèsAbhi 162c7c9e59 feat: remove build prefix 2024-01-29 17:14:51 -06:00
TrèsAbhi ba46a2b801 you know 2024-01-29 16:50:58 -06:00
TrèsAbhi 13af8688a3 feat: more birhgt 2024-01-29 16:33:27 -06:00
TrèsAbhi fcf7c5c056 eh 2024-01-29 16:18:06 -06:00
TrèsAbhi ab8c52bb75 you know... the usual 2024-01-29 16:05:12 -06:00
TrèsAbhi 08d4e301d2 fix: warehouse 2024-01-29 15:53:47 -06:00
TrèsAbhi 428a0bbad5 feat: closer tank models 2024-01-29 15:27:21 -06:00
TrèsAbhi 4da4cf5259 feat: size 2024-01-28 20:56:49 -06:00
TrèsAbhi 72a24b2770 feat: bounding boxes 2024-01-28 20:45:50 -06:00
TrèsAbhi 9141f3d63f feat: camo and view range 2024-01-28 19:32:12 -06:00
TrèsAbhi c34edbd3ac feat: fire chance 2024-01-28 19:06:38 -06:00
TrèsAbhi eea2024549 feat: some stas 2024-01-27 19:06:02 -06:00
TrèsAbhi ee74c5ea5b feat: order 2024-01-27 18:21:35 -06:00
TrèsAbhi 158ceca599 feat: small screen compatibility 2024-01-27 18:01:51 -06:00
TrèsAbhi b8f3c3eece feat: change tank functionality 2024-01-27 17:48:32 -06:00
TrèsAbhi e835498e59 feat: no flags 2024-01-27 17:36:29 -06:00
TrèsAbhi 0250546ab5 feat: sides 2024-01-27 17:19:10 -06:00
TrèsAbhi f820d05082 feat: sticky sandbox 2024-01-27 13:53:19 -06:00
TrèsAbhi 9ba239caf0 feat: undo 2024-01-26 23:29:35 -06:00
TrèsAbhi 51a59fe2d4 feat: load model button 2024-01-26 23:28:17 -06:00
TrèsAbhi 6753d8a073 feat: i forgot 2024-01-26 23:14:54 -06:00
TrèsAbhi 46719cd32a feat: collapse 2024-01-26 23:09:53 -06:00
TrèsAbhi 47b8f75447 feat: no right align 2024-01-26 23:04:06 -06:00
TrèsAbhi ea68c8e82c feat: more responsive 2024-01-26 22:44:15 -06:00
TrèsAbhi 8d1745d47e feat: test stats 2024-01-26 22:33:32 -06:00
TrèsAbhi aa93ae6918 feat: better tool titles 2024-01-26 21:34:40 -06:00
TrèsAbhi 66cb197b53 feat: crew 2024-01-26 21:31:59 -06:00
TrèsAbhi 94cf7ebea8 Merge branch '1.16.0' of https://github.com/tresabhi/blitzkrieg into 1.16.0 2024-01-26 12:58:42 -06:00
TrèsAbhi 5405da365b feat: generalized include check 2024-01-26 12:58:41 -06:00
TrèsAbhi a0df425115 fix: oops 2024-01-26 07:38:42 -06:00
TrèsAbhi 62cf1265f8 fix: no negative index 2024-01-26 07:36:08 -06:00
TrèsAbhi ba7e772e56 feat: 113 2024-01-25 13:55:05 -06:00
TrèsAbhi 8f8c91e0b0 feat: provision filtering 2024-01-25 13:51:30 -06:00
TrèsAbhi 5bbe93bcec feat: provisions 2024-01-25 13:10:20 -06:00
TrèsAbhi 561b59d235 feat: camouflage 2024-01-25 12:45:13 -06:00
TrèsAbhi 38870ca3f7 feat: code split 2024-01-25 12:27:24 -06:00
TrèsAbhi cbe7b42fb8 feat: consumable max 2024-01-25 12:20:34 -06:00
TrèsAbhi ad1ad80026 feat: consumable buttons 2024-01-25 11:50:43 -06:00
TrèsAbhi a6c3ac36ef feat: removed shell incides 2024-01-25 10:44:37 -06:00
TrèsAbhi a9e88f6943 feat: shell numbers 2024-01-24 16:15:23 -06:00
TrèsAbhi 77ac1453f3 fix: high precision depth map 2024-01-24 16:05:59 -06:00
TrèsAbhi e094267223 feat: min/max zoom distances 2024-01-24 15:28:14 -06:00
TrèsAbhi b03589f6f0 fix: missing external modules 2024-01-24 14:57:37 -06:00
TrèsAbhi 3486dde8c1 feat: corrected texture resolutions 2024-01-24 14:52:06 -06:00
TrèsAbhi c08bf359f5 feat: downgrade to three 159 2024-01-24 10:31:06 -06:00
TrèsAbhi 002d0d4bc0 fix: missing turrets 2024-01-23 13:37:32 -06:00
TrèsAbhi 7db02aa579 fix: green penetration reactivity 2024-01-23 13:14:43 -06:00
TrèsAbhi b47e6436e7 fix: removed z-fighting 2024-01-22 19:38:45 -06:00
TrèsAbhi 7b6e291a0a feat: simplified shaders 2024-01-22 19:14:24 -06:00
TrèsAbhi b8f6394d94 feat: optimized shell switching 2024-01-22 18:14:09 -06:00
TrèsAbhi 0b5c2e42fb feat: isolated duel 2024-01-22 18:04:13 -06:00
TrèsAbhi fce5f19100 feat: cleaner quick equipment buttons 2024-01-22 17:06:06 -06:00
TrèsAbhi 05ad24c8f5 feat: gun to 0 0 on default 2024-01-22 16:55:09 -06:00
TrèsAbhi 5295aa37be feat: hull origins 2024-01-22 16:54:07 -06:00
TrèsAbhi 3e12d6bb9d fix: all loaders inside 2024-01-22 16:04:06 -06:00
TrèsAbhi 019514b699 feat: loading number 2024-01-22 15:50:41 -06:00
TrèsAbhi a32ee2a344 feat: non-pbr tank lighting and model cache 2024-01-22 15:42:49 -06:00
TrèsAbhi ea480aa365 feat: update versions 2024-01-22 15:27:45 -06:00
TrèsAbhi d70a980058 feat: depot dodnloader node js 2024-01-22 13:40:37 -06:00
TrèsAbhi 3157bc5e1b idk 2024-01-22 10:40:13 -06:00
TrèsAbhi e72b703ab2 uhhhhhhhhh 2024-01-22 10:36:46 -06:00
TrèsAbhi c1f3c0dc6b asgakgkuashlkgskljgashghsa;lgh;lsd 2024-01-22 10:36:20 -06:00
TrèsAbhi 30f7db1bc2 feat: asset workflow 2024-01-22 10:30:33 -06:00
TrèsAbhi 07a147a043 feat: document undef check 2024-01-21 22:11:23 -06:00
TrèsAbhi 9488602f5b feat: ea and cs 2024-01-21 22:11:01 -06:00
TrèsAbhi a0c9895122 fix: window undefined check 2024-01-21 21:06:12 -06:00
TrèsAbhi 86353dc1cf fix: no gray buttons on no gid 2024-01-21 18:13:53 -06:00
TrèsAbhi 5168fb4098 feat: use dev definitions on localhost 2024-01-21 17:57:40 -06:00
TrèsAbhi c04192e15e feat: full name search 2024-01-21 16:28:26 -06:00
TrèsAbhi 638c2c73da feat: full names and better default names 2024-01-21 16:23:44 -06:00
TrèsAbhi f368769068 feat: full names and better default names 2024-01-21 16:03:38 -06:00
TrèsAbhi 9f347fa1f2 feat: less boxy 2024-01-21 11:09:02 -06:00
TrèsAbhi b44f897528 feat: antagonist selector filters 2024-01-21 11:06:40 -06:00
TrèsAbhi efd1a80ee1 feat: penetration listing 2024-01-21 10:37:26 -06:00
TrèsAbhi a70100c835 feat: persistant tankopedia 2024-01-21 10:34:52 -06:00
TrèsAbhi f51e365ec4 feat: gun up in face hug 2024-01-21 10:20:48 -06:00
TrèsAbhi a5e0f33f02 fix: external module color precision error 2024-01-21 10:14:42 -06:00
TrèsAbhi dc85b49f9c feat: vercel dev 2024-01-21 00:13:02 -06:00
TrèsAbhi 72c90b3e92 feat: vercel dev 2024-01-21 00:10:59 -06:00
TrèsAbhi df566709c8 feat: vercel dev 2024-01-21 00:07:26 -06:00
TrèsAbhi 3617e11792 feat: commit concurrency 2024-01-21 00:01:32 -06:00
TrèsAbhi b243b12d1c feat: i am sleepy 2024-01-20 23:45:45 -06:00
TrèsAbhi d0d28baee0 feat: safer unknown component handling 2024-01-20 23:20:00 -06:00
TrèsAbhi 001b0c356f fix: missing comma 2024-01-20 22:55:38 -06:00
TrèsAbhi 4984c522ba feat: dev use dev branch 2024-01-20 22:46:21 -06:00
TrèsAbhi be64934eb4 feat: optimized blobs 2024-01-20 22:45:25 -06:00
TrèsAbhi 7669c2d76b feat: optimized assets 2024-01-20 22:11:56 -06:00
TrèsAbhi 00244846cb feat: use dev branch for dev activities 2024-01-20 21:35:36 -06:00
TrèsAbhi 480fda34ce feat: move poses 2024-01-20 16:59:18 -06:00
TrèsAbhi 103c1b4338 feat: fixed he-based rounds behind spaced armor 2024-01-20 16:31:20 -06:00
TrèsAbhi 2acee91524 fix: remainging pen going negative 2024-01-20 15:24:20 -06:00
TrèsAbhi 6f42e2835c feat: oops, now it's correct 2024-01-20 15:22:03 -06:00
TrèsAbhi e724069cbd feat: correct he calculations 2024-01-20 15:21:30 -06:00
TrèsAbhi 417858f21a feat: split tutorial bots 2024-01-20 13:43:03 -06:00
TrèsAbhi a362301515 feat: r5g6b5a0 format compatibility 2024-01-20 13:27:56 -06:00
TrèsAbhi 86fd714923 fix: spaced armor bleeding 2024-01-20 12:08:30 -06:00
TrèsAbhi 871b746cce fix: no external module spaced armor occlusion 2024-01-20 12:01:05 -06:00
TrèsAbhi d12440f60a feat: downgraded sharp 2024-01-20 11:46:26 -06:00
TrèsAbhi 4bb78b2532 feat: downgraded sharp 2024-01-20 11:43:57 -06:00
TrèsAbhi 3cd23cd718 fix: min penetration chance 0 2024-01-19 23:33:27 -06:00
TrèsAbhi 59abda933f feat: auto poser 2024-01-19 22:46:10 -06:00
TrèsAbhi 47f5f86da1 feat: yaw and pitch 2024-01-19 22:08:05 -06:00
TrèsAbhi 369ba08780 fix: tank icons dir 2024-01-17 12:39:02 -06:00
TrèsAbhi 0692933148 feat: optimized tank icon building 2024-01-17 12:31:07 -06:00
TrèsAbhi 26852981ba feat: consistent filters 2024-01-17 12:25:53 -06:00
TrèsAbhi 8199bd550d fix: unified max thicknesses 2024-01-17 12:06:22 -06:00
TrèsAbhi c56eaa258d feat: consumable icons 2024-01-17 11:34:27 -06:00
TrèsAbhi d4e8ec125f feat: consumable definitions 2024-01-16 21:49:15 -06:00
TrèsAbhi 3e3ed35fb0 feat: better auto ricochet check for spaced armor 2024-01-16 20:17:19 -06:00
TrèsAbhi 3530e8d0f0 feat: equipment ui 2024-01-16 17:47:41 -06:00
TrèsAbhi a1f6bbdf1f feat: equipment icons 2024-01-16 17:31:20 -06:00
TrèsAbhi b053018958 feat: equipment definitions 2024-01-16 17:19:46 -06:00
TrèsAbhi 5adc69977b feat: equipment icons 2024-01-16 16:58:00 -06:00
TrèsAbhi a741cc305a feat: updated contributors 2024-01-16 14:46:08 -06:00
TrèsAbhi 96f5ad8b96 fix: no control lock on removed hull yaw 2024-01-16 14:28:47 -06:00
TrèsAbhi 18dbb658ff feat: sun lighting 2024-01-16 14:20:43 -06:00
TrèsAbhi 512134162d feat: fullscreen disabling on old browsers 2024-01-16 14:09:19 -06:00
TrèsAbhi 7e1949ccc7 fix: search result selection 2024-01-16 14:07:29 -06:00
TrèsAbhi db0c4a1d71 feat: new search results 2024-01-16 14:02:50 -06:00
TrèsAbhi 1c64305678 feat: isolated model hooks 2024-01-16 13:16:06 -06:00
TrèsAbhi 95b8532660 feat: moved hooks to src 2024-01-16 13:10:06 -06:00
TrèsAbhi 9b3c7451b7 fix: armor highlighting desync 2024-01-16 12:34:00 -06:00
TrèsAbhi 1911508552 fix: typo 2024-01-16 12:26:15 -06:00
TrèsAbhi f5ac301c7e feat: green penetration mode 2024-01-16 12:22:17 -06:00
TrèsAbhi e37b91c2e3 feat: spaced armor auto-ricochet 2024-01-16 12:10:28 -06:00
TrèsAbhi 0a92dc0d2d fix: bleeding spaced armor 2024-01-16 12:06:39 -06:00
TrèsAbhi 754b16af10 fix: focused element disallow shell switch 2024-01-16 11:19:43 -06:00
TrèsAbhi b434bc4c78 lllll 2024-01-16 10:29:55 -06:00
TrèsAbhi dba2e2f170 huh? 2024-01-16 10:25:26 -06:00
TrèsAbhi 312077a74a adbaskdb 2024-01-16 10:22:26 -06:00
TrèsAbhi 817d77a437 ??? 2024-01-16 10:19:52 -06:00
TrèsAbhi 13b85e7164 ugh 2024-01-16 10:16:29 -06:00
TrèsAbhi 352e174af2 fix: removed deprecated build methods 2024-01-16 10:13:38 -06:00
TrèsAbhi aadcaedae5 feat: removed spaced armor visuals 2024-01-16 10:08:28 -06:00
TrèsAbhi 40c69382a1 fix: no outfile testing 2024-01-16 09:56:21 -06:00
TrèsAbhi 8f4ea5f2fd feat: spaced armor thickness 2024-01-16 09:52:30 -06:00
TrèsAbhi a11975adec fix: spaced armor layering 2024-01-16 09:24:12 -06:00
TrèsAbhi 578f6f4d0f feat: accurate external module thickness 2024-01-16 09:05:07 -06:00
TrèsAbhi ae267adf27 feat: external module thickness 2024-01-16 08:40:27 -06:00
TrèsAbhi c76fc97922 fix: spaced armor highlitging 2024-01-15 21:58:03 -06:00
TrèsAbhi 730ad56677 feat: explosive shells under spaced armor 2024-01-15 21:55:09 -06:00
TrèsAbhi 80b161b9fc feat: 3CR exception mask 2024-01-15 18:01:48 -06:00
TrèsAbhi 66016dedf0 feat: simplified duel state 2024-01-15 15:02:04 -06:00
TrèsAbhi 7314f1d9b1 feat: calmer lighting 2024-01-15 11:19:44 -06:00
TrèsAbhi 605edd547d fix: update on input 2024-01-13 18:50:13 -06:00
TrèsAbhi 864c29933a fix: armor desync 2024-01-13 18:49:03 -06:00
TrèsAbhi ff15a37e10 feat: optimized tank extration by a little 2024-01-13 18:40:28 -06:00
TrèsAbhi 237f676af8 feat: async updates 2024-01-13 18:24:04 -06:00
TrèsAbhi 5e0e80e965 feat: increased lighting brightness 2024-01-13 16:51:16 -06:00
TrèsAbhi 586cd84349 feat: optimized state handling x2 2024-01-13 16:48:20 -06:00
TrèsAbhi 230b2df5fd feat: optimized state handling 2024-01-13 13:44:27 -06:00
TrèsAbhi 033d361cea feat: updated module selection buttons 2024-01-13 13:17:48 -06:00
TrèsAbhi dbbde066f8 feat: uhhh I forgot 2024-01-13 13:11:01 -06:00
TrèsAbhi 785e9650e5 feat: swap tanks 2024-01-12 20:55:42 -06:00
TrèsAbhi 0b697a94bd feat: small tank icon 2024-01-12 20:42:10 -06:00
TrèsAbhi 163c41f568 feat: more precise controls 2024-01-12 20:22:53 -06:00
TrèsAbhi 0582339332 fix: negative hard joint handling... correctly this time 2024-01-12 20:20:51 -06:00
TrèsAbhi 062e6e9626 fix: negative hard joint handling 2024-01-12 19:58:02 -06:00
TrèsAbhi 6dfb727fa2 feat: splash transition 2024-01-12 14:57:46 -06:00
TrèsAbhi d469f990f6 feat: more advanced armor highlighting 2024-01-12 13:57:32 -06:00
TrèsAbhi 909474d4cb fix: no null return before hook 2024-01-11 21:44:44 -06:00
TrèsAbhi c9eee14b21 feat: no splash zones 2024-01-11 21:30:34 -06:00
TrèsAbhi 7fe35243db heat: enhanced heat 2024-01-11 20:45:12 -06:00
TrèsAbhi 647c9240a5 feat: spaced armor in space caught shell 2024-01-11 12:53:19 -06:00
TrèsAbhi fe0fdc0964 feat: opaque he 2024-01-11 12:31:45 -06:00
TrèsAbhi 9dc4483d70 feat: he start 2024-01-11 12:15:24 -06:00
TrèsAbhi 9ed2b79a4b feat: ricochet incapable shells 2024-01-11 12:04:01 -06:00
TrèsAbhi 28a9f9a849 Merge branch '1.16.0' of https://github.com/tresabhi/blitzkrieg into 1.16.0 2024-01-11 11:45:39 -06:00
TrèsAbhi 5044a5be48 fix: 3 caliber auto ricochet 2024-01-11 11:45:38 -06:00
TrèsAbhi c4053b9ba8 feat: naaahhhhh 2024-01-10 22:10:44 -06:00
TrèsAbhi 53c00258ac feat: purple spaced armor 2024-01-10 22:08:03 -06:00
TrèsAbhi 99123b733d fix: hide on rotate 2024-01-10 19:27:58 -06:00
TrèsAbhi 92c81d60db feat: spaced armor toggle 2024-01-10 19:08:23 -06:00
TrèsAbhi 9218eb09d6 feat: spaced armor 2024-01-10 19:04:04 -06:00
TrèsAbhi cae4836e17 feat: france 2024-01-10 18:14:55 -06:00
TrèsAbhi 172b410d82 feat: key press shell switching 2024-01-10 18:01:33 -06:00
TrèsAbhi 371dcad568 feat: shell swapping 2024-01-10 17:57:41 -06:00
TrèsAbhi 32ee10445d feat: penetration 2024-01-10 17:36:11 -06:00
TrèsAbhi f9d0659bd4 feat: opaque amror 2024-01-10 17:29:49 -06:00
TrèsAbhi f6b4bb3923 feat: no armor unload 2024-01-10 16:25:59 -06:00
TrèsAbhi 9ccd183607 fix: discard no armor thickness meshes 2024-01-10 16:22:42 -06:00
TrèsAbhi 5e06a606ef fix: darker lime color 2024-01-10 15:41:55 -06:00
TrèsAbhi 2f6b186ea8 feat: hide armor when rotating 2024-01-10 15:39:18 -06:00
TrèsAbhi dd8875e951 feat: armor gradient 2024-01-10 15:27:14 -06:00
TrèsAbhi 232fc3140c feat: all armor rules... I think? 2024-01-10 14:56:33 -06:00
TrèsAbhi 8e6d2b9873 feat: some armor rules 2024-01-10 14:25:48 -06:00
TrèsAbhi 6239a72bce feat: tank armor position stateful 2024-01-10 13:22:55 -06:00
TrèsAbhi 9e0c4ddb9a feat: isolated tank model 2024-01-10 13:00:37 -06:00
TrèsAbhi 4a6b5e3aa9 feat: custom shaders 2024-01-09 22:31:34 -06:00
TrèsAbhi a7d8f08522 feat: armor display 2024-01-09 18:35:42 -06:00
TrèsAbhi 6aa4686c30 feat: moved to blitzkrieg assets 2024-01-09 13:36:33 -06:00
TrèsAbhi f9ccb06d1f feat: armor chunking 2024-01-09 13:07:27 -06:00
TrèsAbhi 1f378137f1 fix: backwards vertex format 2024-01-08 19:13:54 -06:00
TrèsAbhi 7235291e69 feat: started work on armor extraction 2024-01-08 18:34:04 -06:00
TrèsAbhi 1f39ecefe4 feat: code split build assets 2024-01-07 20:07:45 -06:00
TrèsAbhi 5a25f335cd feat: colored search results 2024-01-07 19:41:37 -06:00
TrèsAbhi 88a6ab2d95 feat: prot and anta 2024-01-07 13:13:27 -06:00
TrèsAbhi 5208cf8678 feat: code split 2024-01-06 18:17:04 -06:00
TrèsAbhi 857cba902a feat: settings basework 2024-01-06 17:59:31 -06:00
TrèsAbhi 6753a72d97 feat: better ui sizing 2024-01-06 17:56:12 -06:00
TrèsAbhi 14fb62bda4 feat: pitch and yaw limits for inputs 2024-01-06 13:21:11 -06:00
TrèsAbhi 21122c620b feat: sky lighting 2024-01-05 15:22:00 -06:00
TrèsAbhi cb6ce4f183 feat: unified loader 2024-01-05 15:01:45 -06:00
TrèsAbhi 884531700b feat: better lighting 2024-01-05 14:28:25 -06:00
TrèsAbhi 6ca9e637dc feat: loading bar 2024-01-04 13:37:36 -06:00
TrèsAbhi 0a4e696bc1 feat: code split 2024-01-04 13:06:40 -06:00
TrèsAbhi 2cf0bda352 fix: no accessor overrides 2024-01-04 12:11:36 -06:00
TrèsAbhi 35d03c9e21 fix: streak lod 2024-01-03 19:18:31 -06:00
TrèsAbhi c10060decc feat: initial turret rotation 2024-01-03 18:52:22 -06:00
TrèsAbhi d408df8b4c feat: generalized prevent default 2024-01-03 18:28:02 -06:00
TrèsAbhi b3ecb1e9b9 feat: track turning 2024-01-03 14:15:34 -06:00
TrèsAbhi 9306773b5b fix: no text selection on drag 2024-01-03 14:07:19 -06:00
TrèsAbhi 1245fab7ae fix: next gun/turret selection 2024-01-03 14:05:06 -06:00
TrèsAbhi a6e8dd6632 feat: pitch limits 2024-01-03 13:50:36 -06:00
TrèsAbhi 56d8392f12 feat: code split containers 2024-01-03 13:07:45 -06:00
TrèsAbhi 39e4bce254 feat: hide grid when looking at bottom 2024-01-03 12:35:10 -06:00
TrèsAbhi b745ad2fa7 feat: controls 2024-01-03 12:21:30 -06:00
TrèsAbhi ff66d99fc6 feat: remove controls 2024-01-03 11:56:37 -06:00
TrèsAbhi f15bee34fb feat: cleaned code 2024-01-02 21:10:04 -06:00
TrèsAbhi 60164cfb78 feat: model definitions 2024-01-02 20:17:10 -06:00
TrèsAbhi d543e42268 feat: gun limits 2024-01-02 14:50:46 -06:00
TrèsAbhi 9bd26ef3bf feat: gun pitch 2024-01-02 14:07:40 -06:00
TrèsAbhi 0d5b2aedc7 feat: better alignment 2024-01-02 13:55:41 -06:00
TrèsAbhi 3ea872c6a4 feat: improved lighting and grid 2024-01-02 13:31:34 -06:00
TrèsAbhi e65582a432 feat: simpler turret rotation 2024-01-01 21:24:54 -06:00
TrèsAbhi 88cc37a6af feat: hull rotation 2024-01-01 21:17:22 -06:00
TrèsAbhi b40b7b2472 feat: inputs 2024-01-01 21:03:27 -06:00
TrèsAbhi 73f7e84192 feat: turret rotation 2024-01-01 20:45:23 -06:00
TrèsAbhi c9d5b46ae8 feat: omition 2024-01-01 15:16:28 -06:00
TrèsAbhi d4e16048e9 feat: module hot swapping 2024-01-01 14:48:46 -06:00
TrèsAbhi a1c80c3d27 feat: mesh occlusion base work 2024-01-01 14:00:41 -06:00
TrèsAbhi 8b10f2cc4a feat: models 2023-12-31 20:47:21 -06:00
TrèsAbhi 28dde23115 feat: gun & turret origins 2023-12-31 19:26:08 -06:00
TrèsAbhi b433129354 feat: mesh omit 2023-12-30 13:02:47 -06:00
TrèsAbhi 7e0fb82905 fix: vec4 tangents 2023-12-30 12:43:46 -06:00
TrèsAbhi 75bacd5586 fix: first max float 32 mesh 2023-12-30 11:45:44 -06:00
TrèsAbhi 21daf9f3bb fix: little endian pvr 2023-12-30 11:44:42 -06:00
TrèsAbhi fa625dc887 fix: bc1 alpha check 2023-12-29 19:59:01 -06:00
TrèsAbhi 376b3f04e5 feat: pvr parser 2023-12-29 19:56:50 -06:00
TrèsAbhi 12ee9d381d feat: more game parity x2 2023-12-29 13:01:45 -06:00
TrèsAbhi b90938108a feat: more game parity 2023-12-29 12:41:21 -06:00
TrèsAbhi 7b136e61a1 feat: texture mutation 2023-12-28 20:58:18 -06:00
TrèsAbhi 0f9f15b268 feat: normalized alpha 2023-12-28 18:36:28 -06:00
TrèsAbhi fdd8aac017 fix: i hate ai copilots doing binary 2023-12-28 17:55:47 -06:00
TrèsAbhi ce4f7a55b6 fix: a few bit swaps 2023-12-28 13:46:22 -06:00
TrèsAbhi def75da1d8 feat: generalization x3 2023-12-28 13:11:52 -06:00
TrèsAbhi 2b81c71c5a feat: generalization x2 2023-12-28 12:54:46 -06:00
TrèsAbhi 436a519db8 feat: generalization 2023-12-28 12:24:09 -06:00
TrèsAbhi c624136dc7 feat: more bc versions 2023-12-27 18:54:03 -06:00
TrèsAbhi cd546b274f feat: dds stream 2023-12-26 20:02:01 -06:00
TrèsAbhi 2f650af0f7 feat: more prog 2023-12-26 13:35:07 -06:00
TrèsAbhi 4ffb7cac7c feat: dds decompression 2023-12-25 20:50:19 -06:00
TrèsAbhi 6361b09129 feat: dds stream 2023-12-25 16:49:40 -06:00
TrèsAbhi cb87a3067c feat: code split streams 2023-12-25 12:37:37 -06:00
TrèsAbhi 510eebd2f4 feat: stride mis-match management 2023-12-25 11:21:39 -06:00
TrèsAbhi 15a8e53e22 feat: rename to attribute 2023-12-24 19:02:47 -06:00
TrèsAbhi 99fb44633e feat: lod distance based model loading 2023-12-24 18:38:13 -06:00
TrèsAbhi 9a8c0399be feat: more pbr polish 2023-12-23 19:23:47 -06:00
TrèsAbhi 818a6b38cb feat: moved to scpg stream 2023-12-23 14:28:29 -06:00
TrèsAbhi d60a102c0d feat: pbr 2023-12-22 15:59:06 -06:00
TrèsAbhi 0627f678ea feat: use PVRTexToolCLI 2023-12-20 14:39:32 -06:00
TrèsAbhi 4ad10deb00 feat: texturing 2023-12-19 20:11:37 -06:00
TrèsAbhi f61725a021 feat: attempting textures 2023-12-19 14:32:08 -06:00
TrèsAbhi 6d2bb7b131 feat: glb convertion 2023-12-18 17:49:07 -06:00
TrèsAbhi 9db43db3cf feat: sc2 typings 2023-12-18 16:28:15 -06:00
TrèsAbhi 7a22ce5af5 feat: more definition data 2023-12-17 20:47:33 -06:00
TrèsAbhi 68239351b5 Merge pull request #60 from tresabhi/main 2023-12-15 22:01:40 -06:00
TrèsAbhi 2aefe3f9e3 feat: integrated tank definitions 2023-12-14 22:19:01 -06:00
TrèsAbhi adb0bb2e69 feat: versus tank lookup 2023-12-13 12:47:31 -06:00
TrèsAbhi b1a59aa871 Merge pull request #59 from tresabhi/main 2023-12-13 12:09:11 -06:00
477 changed files with 26354 additions and 7801 deletions

No files matched your search

+67
View File
@@ -0,0 +1,67 @@
name: CD Build Assets
on:
push:
branches: main
workflow_dispatch:
schedule:
- cron: '0 2 * * *'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: windows-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
token: ${{ secrets.GH_TOKEN }}
- name: Use node
uses: actions/setup-node@v4
with:
node-version: 18
cache: 'npm'
- name: Install Yarn
run: npm install --location=global yarn
- name: Use node_modules cache
uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
- name: Install dependencies
run: yarn
- name: Add fixed sharp
run: yarn add [email protected] --ignore-engines
- name: Setup DepotDownloader
run: yarn setup:depotdownloader
- name: Run DepotDownloader
run: ./temp/depotDownloader/DepotDownloader.exe -app 444200 -username ${{ secrets.DEPOT_DOWNLOADER_USERNAME }} -password "${{ secrets.DEPOT_DOWNLOADER_PASSWORD }}"
- name: Apply patches
run: |
$env:GH_TOKEN = "${{ secrets.GH_TOKEN }}"
$env:DISCORD_TOKEN = "${{ secrets.DISCORD_TOKEN }}"
$env:DATABASE_URL = "${{ secrets.DATABASE_URL }}"
$env:WOTB_DLC_CDN = "${{ secrets.WOTB_DLC_CDN }}"
yarn setup:patches --depot
- name: Build assets
run: |
$env:GH_TOKEN = "${{ secrets.GH_TOKEN }}"
$env:DISCORD_TOKEN = "${{ secrets.DISCORD_TOKEN }}"
$env:DATABASE_URL = "${{ secrets.DATABASE_URL }}"
$env:VIDEOS_SHEET = "${{ secrets.VIDEOS_SHEET }}"
$env:GOOGLE_APPLICATION_CREDENTIALS = "${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}"
yarn build:assets --all-targets --depot ${{ github.ref == 'refs/heads/main' && '--production' || '' }}
+3 -3
View File
@@ -18,10 +18,10 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Use node
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 18
cache: 'npm'
@@ -54,7 +54,7 @@ jobs:
uses: actions/deploy-pages@v1
- name: Archive build
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: dist
path: docs/.vitepress/dist
+7 -3
View File
@@ -1,9 +1,13 @@
name: CD Host
on:
push:
branches: main
schedule:
- cron: '0 */5 * * *'
workflow_dispatch:
release:
types: [created, published, released, edited]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
@@ -15,13 +19,13 @@ jobs:
steps:
- name: Use node
uses: actions/setup-node@v2
uses: actions/setup-node@v4
with:
node-version: 18
- name: Download release assets
run: |
DOWNLOAD_URL=$(curl -s https://api.github.com/repos/tresabhi/blitzkrieg/releases/latest \
DOWNLOAD_URL=$(curl -s https://api.github.com/repos/tresabhi/blitzkit/releases/latest \
| grep "browser_download_url.*bot.zip" \
| cut -d : -f 2,3 \
| tr -d \")
@@ -29,4 +33,4 @@ jobs:
unzip bot.zip
- name: Run bot
run: NODE_ENV=production GH_TOKEN=${{ secrets.GH_TOKEN }} DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} DISCORD_BLITZ_DB=${{ secrets.DISCORD_BLITZ_DB }} node --enable-source-maps index.cjs
run: NODE_ENV=production GH_TOKEN=${{ secrets.GH_TOKEN }} DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} DATABASE_URL=${{ secrets.DATABASE_URL }} node --enable-source-maps index.cjs
@@ -1,11 +1,7 @@
name: CD Ratings Asia
# latest: '0 0 * * *'
# asia midnight: '0 17 * * *'
name: CD Rating Asia
on:
schedule:
- cron: '0 0 * * *'
- cron: '0 17 * * *'
jobs:
@@ -14,10 +10,10 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Use node
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 18
cache: 'npm'
@@ -35,4 +31,4 @@ jobs:
run: yarn
- name: Generate leaderboard
run: GH_TOKEN=${{ secrets.GH_TOKEN }} DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} yarn publish:ratingsleaderboard --region=asia --target=${{ github.event.schedule == '0 0 * * *' && 'latest' || 'midnight' }}
run: GH_TOKEN=${{ secrets.GH_TOKEN }} DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} DATABASE_URL=${{ secrets.DATABASE_URL }} yarn publish:ratingleaderboard --region=asia --target=midnight --production
@@ -1,11 +1,7 @@
name: CD Ratings Europe
# latest: '0 0 * * *'
# eu midnight: '0 23 * * *'
name: CD Rating Europe
on:
schedule:
- cron: '0 0 * * *'
- cron: '0 23 * * *'
jobs:
@@ -14,10 +10,10 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Use node
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 18
cache: 'npm'
@@ -35,4 +31,4 @@ jobs:
run: yarn
- name: Generate leaderboard
run: GH_TOKEN=${{ secrets.GH_TOKEN }} DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} yarn publish:ratingsleaderboard --region=eu --target=${{ github.event.schedule == '0 0 * * *' && 'latest' || 'midnight' }}
run: GH_TOKEN=${{ secrets.GH_TOKEN }} DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} DATABASE_URL=${{ secrets.DATABASE_URL }} yarn publish:ratingleaderboard --region=eu --target=midnight --production
@@ -1,6 +1,8 @@
name: CI Version
name: CD Rating Latest
on: push
on:
schedule:
- cron: '0 0 * * *'
jobs:
host:
@@ -8,10 +10,10 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Use node
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 18
cache: 'npm'
@@ -28,5 +30,5 @@ jobs:
- name: Install dependencies
run: yarn
- name: Generate leaderboard
run: yarn lint:version
- name: Generate all leaderboards
run: GH_TOKEN=${{ secrets.GH_TOKEN }} DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} DATABASE_URL=${{ secrets.DATABASE_URL }} yarn publish:ratingleaderboard --region=na,asia,eu --target=latest --production
@@ -1,11 +1,7 @@
name: CD Ratings North America
# latest: '0 0 * * *'
# na midnight: '0 5 * * *'
name: CD Rating North America
on:
schedule:
- cron: '0 0 * * *'
- cron: '0 5 * * *'
jobs:
@@ -14,10 +10,10 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Use node
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 18
cache: 'npm'
@@ -35,4 +31,4 @@ jobs:
run: yarn
- name: Generate leaderboard
run: GH_TOKEN=${{ secrets.GH_TOKEN }} DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} yarn publish:ratingsleaderboard --region=na --target=${{ github.event.schedule == '0 0 * * *' && 'latest' || 'midnight' }}
run: GH_TOKEN=${{ secrets.GH_TOKEN }} DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} DATABASE_URL=${{ secrets.DATABASE_URL }} yarn publish:ratingleaderboard --region=na --target=midnight --production
+7 -4
View File
@@ -13,10 +13,10 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Use node
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 18
cache: 'npm'
@@ -33,11 +33,14 @@ jobs:
- name: Install dependencies
run: yarn
- name: Build Prisma
run: yarn prisma generate
- name: Build
run: yarn build:bot
run: yarn build:bot --production
- name: Archive build
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: bot
path: dist/bot
+3 -3
View File
@@ -13,10 +13,10 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Use node
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 18
cache: 'npm'
@@ -37,7 +37,7 @@ jobs:
run: yarn build:docs
- name: Archive build
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: docs
path: dist/docs
+3 -3
View File
@@ -13,10 +13,10 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Use node
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 18
cache: 'npm'
@@ -37,7 +37,7 @@ jobs:
run: yarn build:website
- name: Archive build
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: website
path: dist/website
+7 -2
View File
@@ -8,10 +8,15 @@ dist/
dist.*
yarn-error.log
/test.*
test.*
/docs/.vitepress/dist
/docs/.vitepress/cache
servers.csv
.next/
tsconfig.tsbuildinfo
temp/
temp/
/.yarn
/.VSCodeCounter
/.yarn
depots
public/sitemap*
/firebase.json
+3
View File
@@ -0,0 +1,3 @@
[submodule "submodules/blitzkit-closed"]
path = submodules/blitzkit-closed
url = https://github.com/tresabhi/blitzkit-closed
+96 -3
View File
@@ -3,80 +3,173 @@
"AABBOX",
"Abhi",
"accountinfo",
"adsense",
"aeson",
"alphatest",
"APAC",
"apcr",
"applypatches",
"artefacts",
"atgm",
"AYUV",
"bbox",
"bepaint",
"betakrieg",
"BINORMAL",
"Binormals",
"BKRL",
"BKRTS",
"BKRTSMANIFEST",
"bkwd",
"blitzkit",
"blitzrinth",
"blitzstars",
"Camo",
"CDON",
"classname",
"cleandist",
"closedkrieg",
"cockroackdb",
"Coef",
"cooldown",
"corsproxy",
"CUBEMAP",
"CUBETEXCOORD",
"customperiod",
"datasource",
"Ddpf",
"Ddsd",
"debugflags",
"deburr",
"decalmask",
"defence",
"degressive",
"devkrieg",
"diacriticless",
"donotremove",
"drei",
"Droodles",
"dvpd",
"dvpl",
"DVPLCRC",
"dvpm",
"dxgi",
"Everytime",
"FASTNAME",
"FOURCC",
"fsformat",
"Fullscreen",
"fullstats",
"fuzzysort",
"gamemode",
"glsl",
"GLTF",
"haha",
"highp",
"iife",
"immer",
"Inclusivity",
"JOINTINDEX",
"JOINTWEIGHT",
"kranvagn",
"krieg",
"Leaderboard",
"leaderboards",
"lerp",
"LINEARSIZE",
"loadouts",
"loddist",
"lods",
"mantlets",
"metallicness",
"minitelrose",
"Minotauro",
"MIPMAPCOUNT",
"mišek",
"modeltransform",
"MURICA",
"NEGATIVEX",
"NEGATIVEY",
"NEGATIVEZ",
"nmatname",
"noout",
"normalmap",
"Oopsy",
"OPTML",
"outdir",
"outfile",
"ownedtanks",
"PIXELFORMAT",
"playerachievements",
"playerinfo",
"pngjs",
"POSITIVEX",
"POSITIVEY",
"POSITIVEZ",
"Promisable",
"ratingsleaderboard",
"ratingsplot",
"Pyogenics",
"ratingleaderboard",
"raycaster",
"researchable",
"Resvg",
"rizz",
"roboto",
"rtsc",
"RTSM",
"SCPG",
"scroller",
"searchclans",
"searchplayers",
"searchtanks",
"SHAREDEXP",
"SKLLD",
"Smri",
"Specularity",
"SSAO",
"startcase",
"statsfull",
"steamapps",
"Stringifying",
"struct",
"structs",
"strvk",
"subnation",
"Synx",
"tankaverages",
"Tankerch",
"tankmen",
"tankopedia",
"tankopedias",
"tankstats",
"texconv",
"TEXCOORD",
"tresabhi",
"tungstentip",
"TYPELESS",
"ubjson",
"Unicum",
"UNLOCALIZED",
"UNORM",
"Unregistering",
"vickers",
"vitepress",
"Vovko",
"wargaming",
"webp",
"whitespaces",
"winrate",
"wireframe",
"Woah",
"WOTB",
"wotblitz",
"xffn",
"xkdkw",
"XMLDVPL",
"YAMLDVPL",
"youtubers",
"zustand"
],
"deno.enable": false,
"deno.unstable": false
"deno.unstable": false,
"cSpell.enableFiletypes": ["glsl"]
}
+7 -7
View File
@@ -1,4 +1,4 @@
# Blitzkrieg
# BlitzKit
[![built with Codeium](https://codeium.com/badges/main)](https://codeium.com)
@@ -6,18 +6,18 @@ Tools for everything World of Tanks Blitz
## Invite the bot
Go to [application directory for Blitzkrieg](https://discord.com/application-directory/1097673957865443370) and click "Add to Server." Voila! You're ready to go.
Go to [application directory for BlitzKit](https://discord.com/application-directory/1097673957865443370) and click "Add to Server." Voila! You're ready to go.
![Blitzkrieg application directory](https://i.imgur.com/JlEA0J1.png)
![BlitzKit application directory](https://i.imgur.com/JlEA0J1.png)
## Visit the website
### https://blitz-krieg.vercel.app/
### https://blitzkit.vercel.app/
![Blitzkrieg website](https://i.imgur.com/eRIZe5P.png)
![BlitzKit website](https://i.imgur.com/oLVIx2n.png)
## Visit the documentation website
### https://tresabhi.github.io/blitzkrieg/
### https://tresabhi.github.io/blitzkit/
![Blitzkrieg documentation website](https://i.imgur.com/TOt5fMx.png)
![BlitzKit documentation website](https://i.imgur.com/TOt5fMx.png)
+3
View File
@@ -0,0 +1,3 @@
files:
- source: /src/lang/en-US.json
translation: /src/lang/%locale%.json
+3 -3
View File
@@ -5,9 +5,9 @@ import { defineConfig } from 'vitepress';
import { getSidebar } from 'vitepress-plugin-auto-sidebar';
export default defineConfig({
title: 'blitzkrieg',
title: 'BlitzKit',
description: '🎉 All-in-one Discord bot for everything World of Tanks Blitz',
base: '/blitzkrieg/',
base: '/blitzkit/',
outDir: '../dist/docs',
themeConfig: {
@@ -33,7 +33,7 @@ export default defineConfig({
],
socialLinks: [
{ icon: 'github', link: 'https://github.com/tresabhi/blitzkrieg' },
{ icon: 'github', link: 'https://github.com/tresabhi/blitzkit' },
],
},
});
+8
View File
@@ -0,0 +1,8 @@
# Blitzkrieg 1.15.12
Sometimes embeds need love too.
## Changes
- Session embeds are now translucent by default
- Session embed titles are now the username of the player by default
+7
View File
@@ -0,0 +1,7 @@
# Blitzkrieg 1.15.13
I have run out of things to say here. This patch fixes like 1 thing haha.
# Technical Fixes
- Tank deltas are now filtered by last battle time
+72
View File
@@ -0,0 +1,72 @@
# Blitzkrieg 1.16.0
This version introduces the long awaited (and desperately needed) Blitzkrieg Tankopedia.
## Credits
- [Pyogenics](https://github.com/pyogenics): technical documentation on WoTB 3d models
- [aeson](https://discord.gg/WHdER7ZPAD): human encyclopedia on WoTB file layout
- [\[OPTML\]](https://discord.gg/Su8w9KtEVE), [\_34](https://www.twitch.tv/34wotb), [Droodles_YT](https://www.youtube.com/@DroodlesBlitz): Tankopedia beta-testing
- Minitelrose, ChickenMan7777: external module exceptions
## Features
- Added Tankopedia
- Check out the tool here: https://blitz-krieg.vercel.app/tools/tankopedia
- The root page features a search engine for efficiently finding tanks
- Search bar: lets you search tanks via it's name
- Sort: lets you sort tanks by their statistics and generic things like names and tiers
- Reset button (trash icon): resets all filters and sorts
- Test tanks: lets you control wether you want to include test tanks
- Tree type filter: filters tech tree, premium, and collector tanks
- Nations: filters tanks by nation
- Tank type filter: filters tanks by tank designation
- Tier filter: filters tanks by tier
- The search result itself displays the national flag, tier, type, image, and name of the tank
- Clicking on the tank redirects you to the tank's page
- Tankopedia page
- Tank sandbox: the first thing you'll see is a 3D model of the tank
- On slim mobile devices, click "Load model" to reveal it
- Model tab
- This model has all PBR features and is identical to the one in the game
- You can click and drag the turret to rotate it
- You can do the same with the gun but with the added control of elevating and depressing it
- Armor tab
- Shows red where the tank (the protagonist) cannot be penetrated
- You can switch the shells that the shooter (the antagonist) shoots
- By default, the antagonist tank is the same as the protagonist
- You can change antagonists using the antagonist bar
- Searching through antagonists is identical to the root search page
- You may also swap the protagonist and antagonist using the swap button
- Click on the tank's armor anywhere to get intimate details about it
- Shows spaced armor, gaps between layers of armor, ricochets, penetration losses over events, thickness, angled thicknesses, and angles
- View button (eye icon): allows you to pose the tank in a few preset configurations
- Sandbox settings
- Green penetration: shows the penetrable parts of the tank as green instead of using transparency
- Show grid: shows a grid under the tank
- View environment: shows the lighting environment around the tank
- Lighting: preset lighting environments
- Wireframe: displays armor as vertices instead of faces
- Fullscreen button: toggles fullscreen
- Note that some functionalities are disabled in fullscreen
- Modules: switch around modules to view it change live in the 3D model and affect stats
- Provisions, equipments, miscellaneous, and consumables also affect stats
- Stats
- As you switch around the configurations of the tank, the change in stats are displayed using green and red arrows with delta numbers
- Statistics also display their units
- Fire section
- This deals with statistics relating to the firepower of the tank
- You can switch shells that the stats are based on using the buttons to the right of the title
- You can also view the penetration loss over distance using the slider if available under the penetration section
- Statistics for maneuverability, survivability, and crew training are also displayed
## Changes
- Navigation bar
- Added credit to myself along with the logo and moved the whole thing to the left side
- Added a link to the discord icon to the right
- Removed polka dots from the background
## Fixes
- The `/ratings` command once again has the username field as an optional parameter
+28
View File
@@ -0,0 +1,28 @@
# Blitzkrieg 1.16.1
Armor sandbox gains 25% rendering speed and 40% memory efficiency with added accuracy and features.
## Features
- Multiple layers of spaced armors are now calculated properly by the visual armor highlighting
- Added opaque mode to view armor highlighting without any transparency
- Added breakdown on layers of armor penetrated
- Penetration of each layer is shown represented by a color and an index
- Green: penetration
- Red: blocked
- Yellow: ricochet
- This also shows layers encountered after a ricochet
## Fixes
- Accuracy now doesn't drop the further the shot is placed from the origin
- HE shells no longer loose penetration like how HEAT shells do when traveling between layers of armor
- Persistent settings are now merged in the correct order making them truly persistent now
- Enhanced armor and calibrated shells are now properly synced from the get go
## Technical Changes
- Spaced armor and external module scenes have been merged
- They now use additive blending
- Colors are now normalized by the penetration value instead of maximum armor plate thickness
- Shell normalization now doesn't violate arccosine's domain
+36
View File
@@ -0,0 +1,36 @@
# Blitzkrieg 1.16.2
¡Hola desde el mundo del español!
## Features
- Added translations for Spanish to the bot
- Your language will be inferred automatically from your Discord settings
- Any untranslated languages and words we forgot to translate will be left in English
- If you have your language set to Spanish and see English in any places, please let us know on [the official Discord server](https://discord.gg/nDt7AjGJQH)
- All `/about` commands except for `commands` remain in English
- Tank names are still in English
- The website remains unchanged
- The title bar (featured as the big text on top of most commands) has now been made more compact
## Changes
- "Tank type" is now called "tank class"
- Removed `/player-achievements` and `search-tanks`
- They will be reintroduced in the future in a far better way
- Also removed a `SKLLD` server exclusive `/eligible` command
- This will be generalized for all clans in the future
## Fixes
- Fixed the red glowing floor underneath the tank sandbox
- This has been replaced with a static image
- The refresh button is now properly removed when lacking permissions
- Tank names that start with a number are now properly inferred from command inputs
## Technical Changes
- Command registration is now error tolerant meaning that if a single command fails to initiate, it will be discarded until the next restart
- We are currently looking into how we can allow the command to retry registration after a fixed amount of time
- Due to the implications of the code added which can be very easily exploited by hackers, a single file has been added to the repository as a closed source submodule and will remain closed unless a third party open-source implementation is made public
- Removed preview commands
+21
View File
@@ -0,0 +1,21 @@
# Blitzkrieg 1.16.3
Further polishing and corrections for the Tankopedia.
## Features
- Added a few more stats to view for the Tankopedia
- Added the count of shells in the magazine for auto-reloaders
- The optimal shell index was moved below this stats
- Shell reloads for auto-reloaders now abide crew stats
- Intra-clip is now also shown for auto-reloaders
- Added 1 more decimal place worth of precision when viewing and changing gun pitch and yaw
## Fixes
- "Inter-clip" is now correctly spelled as "intra-clip"
- Tanks with initial gun pitches (like the Minotauro) are now handled correctly
- The stats now reflect the fact that the gun is naturally pitched downwards
- The view model now compensates for the natural pitch
- Tanks with the improved vertical stabilizer equipment are now handled correctly
- The view model now allows you to pitch the gun further as intended when the equipment is on
+19
View File
@@ -0,0 +1,19 @@
# Blitzkrieg 1.16.4
A few issues here and there addressed for good measure.
## Changes
- Armor layer penetration indices are now much more compact.
## Fixes
- Reverted splash mechanics changes from `1.16.1` as it made them less accurate.
- Auto-reloaders now report their DPM stats correctly with crew training.
## Technical Changes
- All files in the project were reviewed and constant exports were isolated.
- The downloaded game in the workflow now also includes the latest patches.
- Asset building now uses sharp under the hood which should in theory be faster.
- Fetching CDON LZ4 files now uses `no-store` instead of `no-cache`
+13
View File
@@ -0,0 +1,13 @@
# Blitzkrieg 1.17.0
A preview command and a touchup.
## Features
- Added `/research` in preview only accessible in the official Discord server.
- More details will be posted when the command is made public.
## Changes
- `/owned-tanks` now returns a simple text message listing all the tanks instead of an image.
- This is meant to improve the readability and ease of copying.
+8
View File
@@ -0,0 +1,8 @@
# Blitzkrieg 1.17.1
Some stability fixes.
## Technical Changes
- `sharp` is now included in the build instead of having being installed before runtime.
- Png converter cache is now more memory efficient.
+13
View File
@@ -0,0 +1,13 @@
# Blitzkrieg 1.17.2
Introducing the new `/research` command!
## Features
- Added the `/research` command
- Type in the name of a tech tree tank you desire to research and this command will list all the expenses in researching all tanks in that line
- The starting tank is inferred automatically by the tanks you own
- This may be a bit inaccurate because of the lack of accurate information Wargaming provides about owned tanks
- You are also manually provide a starting tank and a user to see the progress on a line for
- Replaced Vercel Analytics (which collapsed under the insane amount of traffic on the website) with Google Analytics
- Spaced armor can now be toggled in the Tankopedia armor sandbox
+19
View File
@@ -0,0 +1,19 @@
# Blitzkrieg 1.18.0
Introducing the new `/rating` command!
## Features
- `/rating` command
- Features statistics on today's performance in ratings
- The included stats are battles, winrate, damage, survival, and kills
- This command also features the score, rank, and league you are at plus the reward you'll get if you are high enough on the leaderboard
- `/ratings`, the old leaderboard command, has been renamed `/rating-leaderboard`
- Reward icons have been removed from the leaderboard
## Technical Changes
- Rating leaderboards are now built in a more action-efficient manner.
- This version also introduces the BKRL (Blitzkrieg rating leaderboard) file format which is an efficient way to store entire leaderboards of regions to disk (1 MB per 40,000 users).
- Latest archival actions now build all regions at once in a single action.
- The sharp module is now included in the build.
+11
View File
@@ -0,0 +1,11 @@
# Blitzkrieg 1.18.1
HE gets more accurate and say goodbye to NaNaNaNaNaN.
## Fixes
- Armor highlighting now works on Apple MacBooks
- Applied equipments now persist after switching shells
- The bottom of the tank sandbox panel can now be interacted with as it was previously blocked by an invisible layer
- `/rating` now uses the midnight leaderboard instead of the absolute latest one
- 0-battle stats are now hidden
+7
View File
@@ -0,0 +1,7 @@
# Blitzkrieg 1.18.2
Redefining how micro a micro-path is.
## Fixes
- The pitch and yaw controls, along with the quick equipment buttons, can once again be interacted with
+29
View File
@@ -0,0 +1,29 @@
# Blitzkrieg 1.18.3
Making Tankopedia more pleasing to use. This update only affects the website.
## Features
- Added crew skills
- Added quick actions
- For example, crew skills have the "clear" and "maximize" actions and equipment simply has a "clear" action
- Added info buttons
- Beside the titles of a few sections, a new info buttons have been added for extended descriptions
- Tank configurations have been condensed thanks to a new layout that works well on most screen sizes
- The Tankopedia now takes advantage of wider screens than before; hence, getting rid of the useless whitespaces on the sides
- Tank modules are now neatly wrapped into dropdown menus
- Sorting tanks by "size" has been renamed to "volume" and length has been added as a new option
- The antagonist (the shooting tank) bar has been shrunk to only fit the its contents
- Fullscreen mode now features all the missing dropdowns and options that were previously hidden
- Added icons for donations on Patreon and Ko-fi in the navigation bar
- Tank search now uses regular links allowing for things like opening in new tabs, copying links, etc.
## Fixes
- Armor highlighting once again works properly even after switching around tank modules
- Inputting invalid numbers into the pitch and yaw fields is now handled correctly
- Removed unnecessary tooltips that didn't show up anyway due to Radix UI 3
## Technical Changes
- Upgraded to Radix UI 3
+23
View File
@@ -0,0 +1,23 @@
# Blitzkrieg 1.19.0
Introducing the Blitzkrieg Compare tool!
## Features
- Added Compare
- Allows you to compare multiple tanks
- Shows deltas in the form of differences between values or percentages
- All stats from the Tankopedia are available here
- [CLS](https://web.dev/articles/cls) was reduced due to the new loading screens
- Clicking enter when searching for tanks now selects the first result
- The first tank name is also displayed in the search input
## Changes
- Removed the donation banner instead for a little note in the footer
- The footer now shows the version of Blitzkrieg and the version of WoTB its running on
- Removed frosted glass effect from most components apart from the navigation bar for performance reasons (I am looking at you, Apple!)
## Fixes
- Tank search is now not ignored when changing filters
+11
View File
@@ -0,0 +1,11 @@
# Blitzkrieg 1.19.1
A minor-major fix to the armor sandbox. This update only affects the website.
## Fixes
- Guns are now clipped properly allowing some tanks like the 252U and T34's mantlets to be penetrable (usually with premium shells) as they are in-game
| Before | After |
| ------------------------------------------ | ----------------------------------------- |
| ![before](https://i.imgur.com/wB0kuk0.png) | ![after](https://i.imgur.com/vxp8wB0.png) |
+6
View File
@@ -0,0 +1,6 @@
# Blitzkrieg 1.19.2
## Fixes
- Maximum DPM for double shot auto-reloaders is now calculate correctly with intra-clip in mind
- Blitzkrieg logo is now removed on lower resolutions to allow for other buttons to fit in the title bar of the Tankopedia
+13
View File
@@ -0,0 +1,13 @@
# Blitzkrieg 1.19.3
Google rizz. This version only affects the website.
## Features
- The titles and descriptions of the Tankopedia tank pages are now more informative
- Added a settings page
- Added a hamburger menu to the navigation bar
## Fixes
- Tank icons in URL previews are now presented properly
+18
View File
@@ -0,0 +1,18 @@
# Blitzkrieg 1.19.4
I genuinely have no idea how these bugs sneaked in here. This update only affects the website.
## Features
- Added a button in Compare which links to the corresponding Tankopedia page
- Added a button in Tankopedia that links to the corresponding Compare page
- If the two tanks (the shooter and the one of which armor is displayed) in the Tankopedia are different, they will be both added by default in the Compare page
- Simplified the footer and added a link to my website and the credits page
- Added an aggressive donate button right at the top of the home page
## Fixes
Thanks to mišek for these bug reports!
- The intra-clip time is now displayed for auto-loaders
- High End Consumables now increase the duration of consumables correctly instead of decreasing it
+19
View File
@@ -0,0 +1,19 @@
# Blitzkrieg 1.19.5
The tankopedia, now more helpful than ever! This update only affects the website.
## Features
- The Tankopedia pages for tanks now include videos from YouTubers
- The selection of tanks that have videos is very small currently but you can help expand it by dropping suggestions on [the official Discord server](https://discord.gg/nDt7AjGJQH)
- Added shell normalization and ricochet angles to the Tankopedia and Compare
## Fixes
- Removed undefined clipping planes
- Added proper keying to all JSX tree nodes, navbar menu items, antagonist bar shells, skill rows and fragments of tank stats in the Tankopedia
- The second half of barrels for tanks like the T-100 LT are now properly included
## Technical Features
- The list of videos is fetched transpiled from a Google Sheets spreadsheet into a CSV file in the asset repository
+3
View File
@@ -0,0 +1,3 @@
# BlitzKit 1.19.6
Renamed Blitzkrieg to BlitzKit.
+45
View File
@@ -0,0 +1,45 @@
# Blitzkit Rating Leaderboard
A straightforward way of storing the entire World of Tanks Blitz rating leaderboard to disk.
```cpp
primary BlitzkitRatingLeaderboard {
utf8"BKRL" magic;
Header header;
primary Body<header> body;
}
Header {
uint16 version; // always 1
Format format;
uint32 count;
}
Format enum<uint8> {
Base,
Superset1,
}
Body<Header header> match<header.format> {
Base {
primary {
uint32 id;
uint16 score;
}[header.count] entries;
};
Superset1 {
primary {
uint32 id;
uint16 score;
uint32 battles;
uint32 wins;
uint32 survived;
uint32 damage;
uint32 kills;
}[header.count] entries;
};
}
```
+99
View File
@@ -0,0 +1,99 @@
# Cedilla Object Notation
1. JSON compressed as CDON, written directly to disk (a direct 50% reduction).
2. CDON further compressed with LZ4 (a clean 90% reduction).
3. The raw JSON file as fetched from a random data source.
4. CDON decompressed once again to JSON. Note that this file is a little larger than the original JSON file as it contains a lot more decimal places due to float precision (this shouldn't affect the size in memory).
![an image of file sizes](https://i.imgur.com/AHJiFpq.png)
FS stands for "Fast String".
```cpp
primary CedillaObjectNotation {
utf8"CDON" magic;
Header header;
primary Body<header.fsFormat> body;
}
Header {
uint16 version; // always 1
FSFormat fsFormat;
StringTable<fsFormat> stringTable;
}
FSFormat enum<uint8> {
Format8,
Format16,
Format32,
}
FSPrimitive<FSFormat fsFormat> match(fsFormat) {
Format8: uint8;
Format16: uint16;
Format32: uint32;
}
StringTable<FSFormat fsFormat> {
FSPrimitive<fsFormat> count;
String[count] strings;
}
Body<FSFormat fsFormat> {
primary Value<fsFormat> object;
}
ValueType enum<uint8> {
Null,
Boolean,
Uint8,
Uint16,
Uint32,
Uint64,
Int8,
Int16,
Int32,
Int64,
Float32,
Float64,
String,
FS,
Array,
Object,
}
String {
uint32 length;
primary utf8<length> value;
}
StringValue Value & { (ValueType.String | ValueType.FS) type }
Value<FSFormat fsFormat> {
ValueType type;
match<type> {
Boolean: { uint8 value; }
Uint8: { uint8 value; }
Uint16: { uint16 value; }
Uint32: { uint32 value; }
Uint64: { uint64 value; }
Int8: { int8 value; }
Int16: { int16 value; }
Int32: { int32 value; }
Int64: { int64 value; }
Float32: { float32 value; }
Float64: { float64 value; }
String: { String value; }
FS: { FSPrimitive<fsFormat> index; }
Array: {
uint32 count;
Value[count] values;
}
Object: {
uint32 count;
StringValue[count] keys;
Value[count] values;
}
}
}
```
-5
View File
@@ -1,5 +0,0 @@
# Creators
- **TrèsAbhi** `@tresabhi`: Creator and main programmer
- **Prince_NA** `@prince_na`: Game advisor & tester
- **Vovko**: Technical advisor
+16
View File
@@ -0,0 +1,16 @@
# Team
- TrèsAbhi: creator & programmer
# Contributors
- Prince_NA: general game advisor and tester
- S0AP: bot verification and initial advertizement platform
- Vovko: discord bot rendering pipeline
- Maddox: game file decompression
- Pyogenics: tank model parsing
- Aeson: game files layout
- Minitelrose, ChickenMan7777: 3-caliber rule edge cases
- \_34, HisRoyalFatness, Synx, xkdkw: embed UX
- [OPTML], Aeson, \_34, Droodles: beta testing Tankopedia
- [OPTML], Droodles: beta testing Compare
+17
View File
@@ -0,0 +1,17 @@
# Damage Per Minute (DPM)
The damage per minute of a tank is the average damage that can be dealt in that tank with the first shell (usually AP) in 60 seconds.
## Regular and Auto Loaders
The damage per minute for these types of guns are calculated by allowing the gun to shoot as soon as the shell is loaded (and in the case of auto loaders, the clip is dumped as fast as the inter-clip time will allow).
## Auto Reloaders
These types of guns have 3 DPM values.
- Damage per minute: calculated if you were to treat the shells like a normal auto loader where you dump all shells, wait for all shells to reload, and repeat.
- Maximum: some tanks gain DPM the deeper they go into the clip and others maintain a higher DPM the less shells used. The "maximum" DPM is calculated if you were to treat the gun as a single-shot regular gun with the shell with the lowest reload. The shell with the highest DPM is listed as "Optimal shell index."
- Effective: this is the maximum DPM tacked on with dumping the remaining shells at the beginning or the end of the 60 seconds.
- If "Optimal shell index" is 1, the clip must be dumped first then used as a single shot.
- If "Optimal shell index" is any other number, the gun should be treated as a single shot then dumped for the highest effective DPM.
+3 -3
View File
@@ -4,7 +4,7 @@
## Bot
Blitzkrieg is available as a Discord bot and can be [installed very easily](/guide/invite).
BlitzKit is available as a Discord bot and can be [installed very easily](/guide/invite).
- Track statistics
- Find inactive players in a clan
@@ -15,8 +15,8 @@ Blitzkrieg is available as a Discord bot and can be [installed very easily](/gui
## Website
Provides a bunch of very helpful tools; https://blitz-krieg.vercel.app/
Provides a bunch of very helpful tools; https://blitzkit.vercel.app/
- Session tracker
- Ratings leaderboard
- Rating leaderboard
- Way more to come
+1 -1
View File
@@ -1,3 +1,3 @@
# Inviting the Bot
Go to [application directory for Blitzkrieg](https://discord.com/application-directory/1097673957865443370) and click "Add to Server." Voila! You're ready to go.
Go to [application directory for BlitzKit](https://discord.com/application-directory/1097673957865443370) and click "Add to Server." Voila! You're ready to go.
+71
View File
@@ -0,0 +1,71 @@
# BlitzKit Regular Tank Stats
A straightforward way of storing the entire World of Tanks Blitz tank statistics for players to disk.
## Manifest `manifest.rtsm`
```cpp
primary RegularTankStatisticsManifest {
utf8"RTSM" magic;
Header header;
primary Body body;
}
Header {
uint16 version; // always 1
}
Body {
uint32 time;
uint8 base;
}
```
## Chunk `*.rtsc`
```cpp
primary RegularTankStatisticsChunk {
utf8"RTSC" magic;
Header header;
primary Body body<header.playerCount>;
}
Header {
uint16 version; // always 1
uint32 playerCount;
}
Body<uint32 playerCount> {
Player[playerCount] players;
}
Player {
uint32 id;
uint16 tankCount;
Tank[tankCount] tanks;
}
Tank {
uint32 id;
uint32 battleLifeTime;
uint32 lastBattleTime;
uint8 markOfMastery;
uint32 battles;
uint32 capturePoints;
uint32 damageDealt;
uint32 damageReceived;
uint32 droppedCapturePoints;
uint32 frags;
uint32 frags8p;
uint32 hits;
uint32 losses;
uint8 maxFrags;
uint16 maxXp;
uint32 shots;
uint32 spotted;
uint32 survivedBattles;
uint32 winAndSurvived;
uint32 wins;
uint32 xp;
}
```
+4 -4
View File
@@ -3,12 +3,12 @@
layout: home
hero:
name: 'blitzkrieg'
name: 'BlitzKit'
text: Everything Blitz, right in Discord
tagline: All-in-one Discord bot for everything World of Tanks Blitz
image:
src: '/assets/images/hero.png'
alt: 'blitzkrieg'
alt: 'blitzkit'
actions:
- theme: brand
text: Add to Discord Server
@@ -20,11 +20,11 @@ hero:
features:
- title: Clean and Efficient UI
icon: 🚀
details: Blitzkrieg is where concise meets efficient. Get the information you need in the way you want.
details: BlitzKit is where concise meets efficient. Get the information you need in the way you want.
- title: Endless Possibilities
icon: 🛠
details: With endless ways to customize the output, it's guaranteed that you'll always get the information you need.
- title: Easy to Use
icon: 💻
details: Leveraging Discord's, Blitz Stars', and Wargaming's powerful APIS, Blitzkrieg does all the hard work for you.
details: Leveraging Discord's, Blitz Stars', and Wargaming's powerful APIS, Blitzkit does all the hard work for you.
---
+4 -8
View File
@@ -1,22 +1,18 @@
# Blitzkrieg Privacy Policy
# BlitzKit Privacy Policy
Blitzkrieg collects little to no data. Regardless, here is an exhaustive list of Blitzkrieg's data collection practices.
BlitzKit collects little to no data. Regardless, here is an exhaustive list of BlitzKit's data collection practices.
## Logs
All Blitzkrieg logs are available to the public as an effort for open source transparency. A history of all logs [can be found on GitHub](https://github.com/tresabhi/blitzkrieg/actions/workflows/host.yml). All logs expire automatically and are permanently deleted after 30 days. However, anyone may chose to save a local copy of the logs which is not tracked by GitHub.
All BlitzKit logs are available to the public as an effort for open source transparency. A history of all logs [can be found on GitHub](https://github.com/tresabhi/blitzkit/actions/workflows/host.yml). All logs expire automatically and are permanently deleted after 30 days. However, anyone may chose to save a local copy of the logs which is not tracked by GitHub.
## Commands
Everytime a command a command is used, the command name and parameters provided is logged. Any identifying information like manually provided in-game usernames are also recorded.
## Errors
Everytime an error occurs, a detailed stack trace, scope of the error, and the error message is logged both in the GitHub logs and in the public channel [#🔲︱blitzkrieg-logs](https://discord.com/channels/734786591205359697/880650462540476416) in [the official Discord server](https://discord.gg/nDt7AjGJQH).
## Databases
No databases are used by Blitzkrieg meaning that no data is collected outside of what has already been mentioned above. This is no permanent state.
No databases are used by BlitzKit meaning that no data is collected outside of what has already been mentioned above. This is no permanent state.
## 3rd Party
+3 -3
View File
@@ -1,12 +1,12 @@
# Blitzkrieg Terms of Service
# BlitzKit Terms of Service
## About
Blitzkrieg is a multi-function Discord bot that serves users with needs specific to the game World of Tanks Blitz.
BlitzKit is a multi-function Discord bot that serves users with needs specific to the game World of Tanks Blitz.
## License
Blitzkrieg is licensed under the MIT License.
BlitzKit is licensed under the MIT License.
## 3rd Party
Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 KiB

After

Width:  |  Height:  |  Size: 35 KiB

+9 -1
View File
@@ -4,7 +4,15 @@ const withVanillaExtract = createVanillaExtractPlugin({ tests: /\.css$/ });
/** @type {import('next').NextConfig} */
const nextConfig = {
...withVanillaExtract(),
...withVanillaExtract({
webpack: (config) => {
config.module.rules.push({
test: /\.glsl$/,
type: 'asset/source',
});
return config;
},
}),
distDir: 'dist/website',
reactStrictMode: false,
+38 -23
View File
@@ -1,43 +1,48 @@
{
"name": "blitzkrieg",
"version": "1.15.11",
"name": "blitzkit",
"version": "1.19.6",
"description": "🎉 Tools for everything World of Tanks Blitz",
"main": "src/server.ts",
"type": "module",
"scripts": {
"build:bot": "vite-node --script scripts/build",
"build:website": "next build",
"build:db": "prisma generate",
"build:bot": "vite-node --script scripts/build --production",
"build:website": "yarn build:db && yarn build:sitemap && next build",
"build:sitemap": "vite-node --script scripts/sitemap",
"build:docs": "vitepress build docs",
"build:ratingsleaderboard": "vite-node --script scripts/buildRatingsLeaderboard",
"build:assets": "vite-node --script scripts/buildAssets",
"build:test": "vite-node --script scripts/buildTest",
"build:ratingsplot": "vite-node --script scripts/buildRatingsPlot",
"dev:bot": "yarn build:bot && yarn start:bot",
"build:ratingleaderboard": "vite-node --script scripts/buildRatingLeaderboard",
"build:assets": "vite-node --max_old_space_size=16384 --script scripts/buildAssets/index",
"test": "vite-node --script scripts/test",
"dev:bot": "vite-node --script scripts/build && yarn start:bot",
"dev:docs": "vitepress dev docs",
"dev:website": "next dev",
"start:bot": "node --enable-source-maps dist/bot/index.cjs",
"start:website": "next start",
"host:docs": "vitepress preview docs",
"publish:ratingsleaderboard": "vite-node --script scripts/buildRatingsLeaderboard --publish",
"zip": "zip -r dist.zip dist",
"publish:ratingleaderboard": "vite-node --script scripts/buildRatingLeaderboard --publish",
"setup:patches": "vite-node --script scripts/applyPatches",
"lint": "npx tsc",
"lint:website": "next lint",
"format": "prettier --write \"**/*.@(json|js|jsx|css|md|ts|tsx|html|xml|yml|gltf)\"",
"lint:version": "vite-node --script scripts/checkVersionMissMatch",
"knip": "knip",
"update": "yarn upgrade --latest"
"update": "yarn upgrade --latest",
"setup:depotdownloader": "vite-node --script scripts/setupDepotDownloader",
"tunnel": "cloudflared tunnel --url http://localhost:3000"
},
"license": "MIT",
"dependencies": {
"@gltf-transform/core": "^3.9.0",
"@octokit/plugin-throttling": "^8.1.3",
"@octokit/rest": "^20.0.1",
"@prisma/client": "^5.4.1",
"@radix-ui/colors": "^3.0.0-rc.4",
"@radix-ui/colors": "^3.0.0",
"@radix-ui/react-icons": "^1.3.0",
"@radix-ui/themes": "^2.0.1",
"@react-three/drei": "^9.90.1",
"@react-three/fiber": "^8.15.12",
"@radix-ui/themes": "^3.0.1",
"@react-three/drei": "^9.93.0",
"@react-three/fiber": "^8.15.14",
"@resvg/resvg-js": "^2.4.1",
"@types/three": "^0.160.0",
"@vanilla-extract/css": "^1.13.0",
"bepaint": "^0.1.0-beta.3",
"decompress": "^4.2.1",
@@ -47,17 +52,24 @@
"express": "^4.18.2",
"false": "^0.0.4",
"fuzzysort": "^2.0.4",
"googleapis": "^134.0.0",
"immer": "^10.0.2",
"js-yaml": "^4.1.0",
"lodash": "^4.17.21",
"lz4js": "^0.2.0",
"markdown-escape": "^2.0.0",
"next": "^14.0.3",
"next": "^14.1.0",
"parse-dds": "^1.2.1",
"postprocessing": "^6.34.1",
"react": "^18.2.0",
"react-device-detect": "^2.2.3",
"react-dom": "^18.2.0",
"react-fuzzysort": "^1.0.1",
"satori": "^0.10.8",
"sharp": "^0.33.0",
"three": "^0.159.0",
"react-promise-suspense": "^0.3.4",
"satori": "^0.10.13",
"sharp": "0.33.1",
"three": "0.159.0",
"three-stdlib": "^2.29.4",
"vite-node": "^0.34.5",
"vitepress": "^1.0.0-rc.20",
"vitepress-plugin-auto-sidebar": "^1.1.0",
@@ -66,16 +78,18 @@
},
"devDependencies": {
"@total-typescript/ts-reset": "^0.5.1",
"@types/decompress": "^4.2.6",
"@types/decompress": "^4.2.7",
"@types/escape-html": "^1.0.2",
"@types/express": "^4.17.18",
"@types/js-yaml": "^4.0.8",
"@types/lodash": "^4.14.199",
"@types/lz4": "^0.6.4",
"@types/lz4js": "^0.2.1",
"@types/markdown-escape": "^1.1.0",
"@types/node": "^20.6.5",
"@types/parse-dds": "^1.0.3",
"@types/pngjs": "^6.0.4",
"@types/react": "^18.2.22",
"@types/three": "^0.159.0",
"@vanilla-extract/next-plugin": "^2.3.1",
"compare-versions": "^6.1.0",
"crc": "^4.3.2",
@@ -85,5 +99,6 @@
"prettier": "^3.0.3",
"prisma": "^5.4.1",
"typescript": "^5.2.2"
}
},
"packageManager": "[email protected]"
}
@@ -1,8 +0,0 @@
-- CreateTable
CREATE TABLE "discord_blitz" (
"discord" INT8 NOT NULL,
"region" STRING NOT NULL,
"blitz" INT4 NOT NULL,
CONSTRAINT "discord_blitz_pkey" PRIMARY KEY ("discord")
);
-3
View File
@@ -1,3 +0,0 @@
# Please do not edit this file manually
# It should be added in your version-control system (i.e. Git)
provider = "cockroachdb"
+7 -3
View File
@@ -4,11 +4,15 @@ generator client {
datasource db {
provider = "cockroachdb"
url = env("DISCORD_BLITZ_DB")
url = env("DATABASE_URL")
}
model discord_blitz {
model Users {
blitz Int @id
last_used DateTime? @default(now())
}
model DiscordUsers {
discord BigInt @id
region String
blitz Int
}
+3
View File
@@ -0,0 +1,3 @@
google.com, pub-1289406790225052, DIRECT, f08c47fec0942fa0
appnexus.com, 14163, RESELLER
pubcenter.microsoft.com, 253617120, DIRECT
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 921 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

File renamed without changes.
File renamed without changes.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

+7
View File
@@ -0,0 +1,7 @@
User-agent: *
Allow: /
Host: https://blitzkit.vercel.app
Sitemap: https://blitzkit.vercel.app/sitemap.txt
Sitemap: https://blitzkit.vercel.app/sitemap.xml
+48
View File
@@ -0,0 +1,48 @@
import { mkdir, writeFile } from 'fs/promises';
import { parse as parsePath } from 'path';
import { parse as parseYaml } from 'yaml';
import { readStringDVPL } from '../src/core/blitz/readStringDVPL';
import { writeDVPL } from '../src/core/blitz/writeDVPL';
import { secrets } from '../src/core/blitzkit/secrets';
import { dvp } from '../submodules/closedkrieg/src/dvp';
import { DATA } from './buildAssets/constants';
const versionTextFile = await readStringDVPL(`${DATA}/version.txt.dvpl`);
const currentVersion = versionTextFile
.split(' ')[0]
.split('.')
.slice(0, 3)
.join('.');
console.log(`Installing patches for ${currentVersion}...`);
let patchIndex = 1;
while (true) {
const response = await fetch(
`${secrets.WOTB_DLC_CDN}/dlc/s${currentVersion}_${patchIndex}.yaml`,
);
if (response.status === 200) {
console.log(`Applying patch ${patchIndex}...`);
const data = parseYaml(await response.text());
const dvpm = await fetch(`${secrets.WOTB_DLC_CDN}/dlc/${data.dx11}`).then(
(response) => response.arrayBuffer(),
);
const dvpd = await fetch(
`${secrets.WOTB_DLC_CDN}/dlc/${data.dx11.replace('.dvpm', '.dvpd')}`,
).then((response) => response.arrayBuffer());
const files = await dvp(dvpm, dvpd);
await Promise.all(
files.map(async ({ path, data }) => {
const { dir } = parsePath(path);
await mkdir(`${DATA}/${dir}`, { recursive: true });
await writeFile(`${DATA}/${path}.dvpl`, writeDVPL(Buffer.from(data)));
}),
);
patchIndex++;
} else break;
}
+20 -3
View File
@@ -1,7 +1,13 @@
import { exec } from 'child_process';
import { build } from 'esbuild';
import { cp, readdir } from 'fs/promises';
import { argv } from 'process';
import { promisify } from 'util';
readdir('src/workers').then((workers) => {
const execPromise = promisify(exec);
const isProduction = argv.includes('--production');
await readdir('src/workers').then((workers) => {
const files = [
'bot',
'index',
@@ -25,6 +31,7 @@ readdir('src/workers').then((workers) => {
'.js': '.cjs',
},
external: ['sharp'],
bundle: true,
sourcemap: true,
minifyIdentifiers: false, // causes goofy errors
@@ -36,9 +43,19 @@ readdir('src/workers').then((workers) => {
});
// copy schema.prisma
cp('prisma/schema.prisma', 'dist/bot/schema.prisma');
readdir('node_modules/prisma').then((files) =>
await cp('prisma/schema.prisma', 'dist/bot/schema.prisma');
await readdir('node_modules/prisma').then((files) =>
files
.filter((file) => file.endsWith('.node'))
.map((file) => cp(`node_modules/prisma/${file}`, `dist/bot/${file}`)),
);
if (isProduction) {
// install fixed sharp
console.log('Installing fixed sharp...');
await execPromise('yarn init -y && yarn add [email protected] --ignore-engines', {
cwd: 'dist/bot',
});
}
console.log('Generated:', await readdir('dist/bot'));
-544
View File
@@ -1,544 +0,0 @@
import { config } from 'dotenv';
import { existsSync } from 'fs';
import { mkdir, readdir, rm } from 'fs/promises';
import { argv } from 'process';
import sharp from 'sharp';
import { TankType } from '../src/components/Tanks';
import { NATION_IDS } from '../src/constants/nations';
import { SCPGStream } from '../src/core/blitz/SCPGStream';
import { readBase64DVPL } from '../src/core/blitz/readBase64DVPL';
import { readDVPLFile } from '../src/core/blitz/readDVPLFile';
import { readStringDVPL } from '../src/core/blitz/readStringDVPL';
import { readXMLDVPL } from '../src/core/blitz/readXMLDVPL';
import { readYAMLDVPL } from '../src/core/blitz/readYAMLDVPL';
import { toUniqueId } from '../src/core/blitz/toUniqueId';
import commitMultipleFiles, {
FileChange,
} from '../src/core/blitzkrieg/commitMultipleFiles';
import { BlitzkriegGunDefinitions } from '../src/core/blitzkrieg/definitions/guns';
import {
BlitzkriegShellDefinitions,
ShellType,
} from '../src/core/blitzkrieg/definitions/shells';
import {
BlitzkriegTankDefinitions,
Tier,
} from '../src/core/blitzkrieg/definitions/tanks';
import { BlitzkriegTurretDefinitions } from '../src/core/blitzkrieg/definitions/turrets';
config();
// WARNING! MOST OF THESE TYPES ARE NOT EXHAUSTIVE!
interface VehicleDefinitionList {
[key: string]: {
id: number;
userString: string;
shortUserString?: string;
description: string;
price: number | { gold: ''; '#text': number };
sellPrice?: { gold: ''; '#text': number };
enrichmentPermanentCost: number;
notInShop?: boolean;
tags: string;
level: number;
combatRole?: Record<string, string>;
configurationModes: string;
};
}
interface TurretDefinitionsList {
nextAvailableId: number;
ids: Record<string, number>;
}
interface GunDefinitionsList {
nextAvailableId: number;
ids: Record<string, number>;
shared: {
[key: string]: {
userString: string;
tags: string;
level: number;
pitchLimits: string;
burst?: { count: number; rate: number };
clip?: { count: number; rate: number };
shots: {
[key: string]: {
speed: number;
piercingPower: string;
};
};
};
};
}
type ShellKind =
| 'ARMOR_PIERCING'
| 'ARMOR_PIERCING_CR'
| 'HIGH_EXPLOSIVE'
| 'HOLLOW_CHARGE';
type ShellDefinitionsList = Record<
string,
{
id: number;
userString: string;
icon: string;
kind: ShellKind;
caliber: number;
damage: { armor: number; devices: number };
normalizationAngle: number;
ricochetAngle: number;
}
> & {
icons: Record<string, string>;
};
interface VehicleDefinitions {
turrets0: {
[key: string]: {
userString: number;
level: number;
yawLimits: string | string[];
guns: {
[key: string]: {
maxAmmo: number;
pitchLimits?: string | string[];
};
};
};
};
}
interface Strings {
[key: string]: string;
}
type BlitzTankType = 'AT-SPG' | 'lightTank' | 'mediumTank' | 'heavyTank';
interface TankParameters {
resourcesPath: {
smallIconPath: string;
bigIconPath: string;
blitzModelPath: string;
};
}
const blitzTankTypeToBlitzkrieg: Record<BlitzTankType, TankType> = {
'AT-SPG': 'tank_destroyer',
lightTank: 'light',
mediumTank: 'medium',
heavyTank: 'heavy',
};
const blitzShellKindToBLitzkrieg: Record<ShellKind, ShellType> = {
ARMOR_PIERCING: 'ap',
ARMOR_PIERCING_CR: 'ap_cr',
HIGH_EXPLOSIVE: 'he',
HOLLOW_CHARGE: 'hc',
};
const DATA =
'C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz/Data';
const LANGUAGE = 'en';
const DOI = {
vehicleDefinitions: 'XML/item_defs/vehicles',
strings: 'Strings',
tankParameters: '3d/Tanks/Parameters',
smallIcons: 'Gfx/UI/BattleScreenHUD/SmallTankIcons',
bigIcons: 'Gfx/UI/BigTankIcons',
flags: 'Gfx/Lobby/flags',
'3d': '3d',
bigShellIcons: 'Gfx/Shared/tank-supply/ammunition/big',
};
const allTargets = argv.includes('--all-targets');
const targets = argv
.find((argument) => argument.startsWith('--target'))
?.split('=')[1]
.split(',');
if (!targets && !allTargets) throw new Error('No target(s) specified');
if (allTargets || targets?.includes('definitions')) {
console.log('Building tank definitions...');
const tankDefinitions: BlitzkriegTankDefinitions = {};
const turretDefinitions: BlitzkriegTurretDefinitions = {};
const gunDefinitions: BlitzkriegGunDefinitions = {};
const shellDefinitions: BlitzkriegShellDefinitions = {};
const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then(
(nations) => nations.filter((nation) => nation !== 'common'),
);
const strings = await readYAMLDVPL<Strings>(
`${DATA}/${DOI.strings}/${LANGUAGE}.yaml.dvpl`,
);
await Promise.all(
nations.map(async (nation) => {
const tankList = await readXMLDVPL<{ root: VehicleDefinitionList }>(
`${DATA}/${DOI.vehicleDefinitions}/${nation}/list.xml.dvpl`,
);
const turretList = await readXMLDVPL<{
root: TurretDefinitionsList;
}>(
`${DATA}/${DOI.vehicleDefinitions}/${nation}/components/turrets.xml.dvpl`,
);
const gunList = await readXMLDVPL<{
root: GunDefinitionsList;
}>(
`${DATA}/${DOI.vehicleDefinitions}/${nation}/components/guns.xml.dvpl`,
);
const shellList = await readXMLDVPL<{
root: ShellDefinitionsList;
}>(
`${DATA}/${DOI.vehicleDefinitions}/${nation}/components/shells.xml.dvpl`,
);
for (const tankKey in tankList.root) {
const tank = tankList.root[tankKey];
const tankDefinition = await readXMLDVPL<{ root: VehicleDefinitions }>(
`${DATA}/${DOI.vehicleDefinitions}/${nation}/${tankKey}.xml.dvpl`,
);
const tankId = toUniqueId(nation, tank.id);
const tankTags = tank.tags.split(' ');
const tankTurrets = Object.keys(tankDefinition.root.turrets0).map(
(turretKey) => {
const turret = tankDefinition.root.turrets0[turretKey];
const turretId = toUniqueId(nation, turretList.root.ids[turretKey]);
const turretGuns = Object.keys(turret.guns).map((gunKey) => {
const turretGunEntry = turret.guns[gunKey];
const gunId = toUniqueId(nation, gunList.root.ids[gunKey]);
const gun = gunList.root.shared[gunKey];
const pitchLimitsRaw =
turretGunEntry.pitchLimits ?? gun.pitchLimits;
const gunShells = Object.keys(gun.shots).map((shellKey) => {
const turretShellEntry = gun.shots[shellKey];
const shell = shellList.root[shellKey];
const shellId = toUniqueId(nation, shell.id);
shellDefinitions[shellId] = {
id: shellId,
name:
strings[shell.userString] ?? shellKey.replaceAll('_', ' '),
speed: turretShellEntry.speed,
damage: {
armor: shell.damage.armor,
devices: shell.damage.devices,
},
caliber: shell.caliber,
normalization: shell.normalizationAngle,
ricochet: shell.ricochetAngle,
type: blitzShellKindToBLitzkrieg[shell.kind],
icon: shell.icon,
};
return shellId;
});
gunDefinitions[gunId] = {
id: gunId,
pitch: (typeof pitchLimitsRaw === 'string'
? pitchLimitsRaw
: pitchLimitsRaw.at(-1)!
)
.split(' ')
.map(Number) as [number, number],
name: strings[gun.userString] ?? gunKey.replaceAll('_', ' '),
tier: gun.level as Tier,
shells: gunShells,
};
return gunId;
});
turretDefinitions[turretId] = {
id: turretId,
name:
strings[turret.userString] ??
turretKey
.replaceAll('_', ' ')
.replace(/^(Turret ([0-9] )?)+/, ''),
tier: turret.level as Tier,
yaw: (typeof turret.yawLimits === 'string'
? turret.yawLimits
: turret.yawLimits.at(-1)!
)
.split(' ')
.map(Number) as [number, number],
guns: turretGuns,
};
return turretId;
},
);
tankDefinitions[tankId] = {
id: tankId,
name:
(tank.shortUserString
? strings[tank.shortUserString]
: undefined) ??
strings[tank.userString] ??
tankKey.replaceAll('_', ' '),
nation,
tree_type: (tank.sellPrice ? 'gold' in tank.sellPrice : false)
? 'collector'
: (typeof tank.price === 'number' ? false : 'gold' in tank.price)
? 'premium'
: 'researchable',
tier: tank.level as Tier,
type: blitzTankTypeToBlitzkrieg[tankTags[0] as BlitzTankType],
testing: tankTags.includes('testTank') ? true : undefined,
turrets: tankTurrets,
};
}
}),
);
console.log('Committing tank definitions...');
await commitMultipleFiles(
'tresabhi',
'blitzkrieg-assets',
'main',
'definitions',
[
{
content: JSON.stringify(tankDefinitions),
encoding: 'utf-8',
path: 'definitions/tanks.json',
},
{
content: JSON.stringify(turretDefinitions),
encoding: 'utf-8',
path: 'definitions/turrets.json',
},
{
content: JSON.stringify(gunDefinitions),
encoding: 'utf-8',
path: 'definitions/guns.json',
},
{
content: JSON.stringify(shellDefinitions),
encoding: 'utf-8',
path: 'definitions/shells.json',
},
],
true,
);
}
if (
allTargets ||
targets?.includes('bigTankIcons') ||
targets?.includes('smallTankIcons')
) {
console.log('Building tank icons...');
const changes: FileChange[] = [];
const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then(
(nations) => nations.filter((nation) => nation !== 'common'),
);
await Promise.all(
nations.map(async (nation) => {
const tanks = await readXMLDVPL<{ root: VehicleDefinitionList }>(
`${DATA}/${DOI.vehicleDefinitions}/${nation}/list.xml.dvpl`,
);
for (const tankIndex in tanks.root) {
const tank = tanks.root[tankIndex];
const nationVehicleId = tank.id;
const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1;
const parameters = await readYAMLDVPL<TankParameters>(
`${DATA}/${DOI.tankParameters}/${nation}/${tankIndex}.yaml.dvpl`,
);
const small = `${DATA}/${parameters.resourcesPath.smallIconPath
.replace(/~res:\//, '')
.replace(/\..+/, '')}.packed.webp.dvpl`;
const big = `${DATA}/${parameters.resourcesPath.bigIconPath
.replace(/~res:\//, '')
.replace(/\..+/, '')}.packed.webp.dvpl`;
if (allTargets || targets?.includes('bigTankIcons')) {
changes.push({
content: await readBase64DVPL(big),
encoding: 'base64',
path: `icons/big/${id}.webp`,
});
}
if (allTargets || targets?.includes('smallTankIcons')) {
changes.push({
content: await readBase64DVPL(small),
encoding: 'base64',
path: `icons/small/${id}.webp`,
});
}
}
}),
);
console.log('Committing tank icons...');
await commitMultipleFiles(
'tresabhi',
'blitzkrieg-assets',
'main',
'tank icons',
changes,
true,
);
}
if (allTargets || targets?.includes('scratchedFlags')) {
console.log('Building scratched flags...');
const flags = await readdir(`${DATA}/${DOI.flags}`);
console.log('Committing scratched flags...');
commitMultipleFiles(
'tresabhi',
'blitzkrieg-assets',
'main',
'scratched flags',
await Promise.all(
flags
.filter(
(flag) =>
flag.startsWith('flag_tutor-tank_') &&
!flag.endsWith('@2x.packed.webp.dvpl'),
)
.map(async (flag) => {
const content = await readBase64DVPL(`${DATA}/${DOI.flags}/${flag}`);
const name = flag.match(/flag_tutor-tank_(.+)\.packed\.webp/)![1];
return {
content,
encoding: 'base64',
path: `flags/scratched/${name}.webp`,
} satisfies FileChange;
}),
),
true,
);
}
if (allTargets || targets?.includes('circleFlags')) {
const flags = await readdir(`${DATA}/${DOI.flags}`);
commitMultipleFiles(
'tresabhi',
'blitzkrieg-assets',
'main',
'circle flags',
await Promise.all(
flags
.filter(
(flag) =>
flag.startsWith('flag_profile-stat_') &&
!flag.endsWith('@2x.packed.webp.dvpl'),
)
.map(async (flag) => {
const content = await readBase64DVPL(`${DATA}/${DOI.flags}/${flag}`);
const name = flag.match(/flag_profile-stat_(.+)\.packed\.webp/)![1];
return {
content,
encoding: 'base64',
path: `flags/circle/${name}.webp`,
} satisfies FileChange;
}),
),
true,
);
}
if (allTargets || targets?.includes('tankModels')) {
console.log('Building tank models...');
if (existsSync('dist/assets/models')) {
await rm('dist/assets/models', { recursive: true });
}
await mkdir('dist/assets/models', { recursive: true });
const changes: FileChange[] = [];
const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then(
(nations) => nations.filter((nation) => nation !== 'common'),
);
await Promise.all(
nations.map(async (nation) => {
const tanks = await readXMLDVPL<{ root: VehicleDefinitionList }>(
`${DATA}/${DOI.vehicleDefinitions}/${nation}/list.xml.dvpl`,
);
for (const tankIndex in tanks.root) {
const tank = tanks.root[tankIndex];
const nationVehicleId = tank.id;
const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1;
// if (id !== 897) continue;
console.log(`Building model ${id} @ ${nation}/${tankIndex}`);
const parameters = await readYAMLDVPL<TankParameters>(
`${DATA}/${DOI.tankParameters}/${nation}/${tankIndex}.yaml.dvpl`,
);
const sc2Path = parameters.resourcesPath.blitzModelPath;
const scgPath = parameters.resourcesPath.blitzModelPath.replace(
/\.sc2$/,
'.scg',
);
const sc2Stream = await SCPGStream.fromDVPLFile(
`${DATA}/${DOI['3d']}/${sc2Path}.dvpl`,
);
const scgStream = await SCPGStream.fromDVPLFile(
`${DATA}/${DOI['3d']}/${scgPath}.dvpl`,
);
const sc2 = sc2Stream.consumeSC2();
const scg = scgStream.consumeSCG();
}
}),
);
}
if (allTargets || targets?.includes('shellIcons')) {
console.log('Building shell icons...');
const image = sharp(
await readDVPLFile(
`${DATA}/${DOI.bigShellIcons}/texture0.packed.webp.dvpl`,
),
);
const changes = await Promise.all(
(await readdir(`${DATA}/${DOI.bigShellIcons}`))
.filter((file) => file.endsWith('_l.txt.dvpl'))
.map(async (file) => {
const name = file.match(/(.+)_l\.txt\.dvpl/)![1];
const sizes = (
await readStringDVPL(`${DATA}/${DOI.bigShellIcons}/${file}`)
)
.split('\n')[4]
.split(' ')
.map(Number);
return {
content: (
await image
.clone()
.extract({
left: sizes[0],
top: sizes[1],
width: sizes[2],
height: sizes[3],
})
.toBuffer()
).toString('base64'),
encoding: 'base64',
path: `shells/${name}.webp`,
} satisfies FileChange;
}),
);
console.log('Committing shell icons...');
commitMultipleFiles(
'tresabhi',
'blitzkrieg-assets',
'main',
'shell icons',
changes,
true,
);
}
+48
View File
@@ -0,0 +1,48 @@
import { readdir } from 'fs/promises';
import sharp from 'sharp';
import { readDVPLFile } from '../../src/core/blitz/readDVPLFile';
import { readStringDVPL } from '../../src/core/blitz/readStringDVPL';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA, POI } from './constants';
export async function boosterIcons(production: boolean) {
const boosterFiles = (await readdir(`${DATA}/${POI.boosterIcons}`)).filter(
(file) => !file.endsWith('@2x.txt.dvpl') && !file.startsWith('texture0'),
);
const image = sharp(
await readDVPLFile(`${DATA}/${POI.boosterIcons}/texture0.packed.webp.dvpl`),
);
const changes: FileChange[] = [];
await Promise.all(
boosterFiles.map(async (file) => {
const name = file.match(/booster_(.+).txt.dvpl/)![1];
const sizes = (
await readStringDVPL(`${DATA}/${POI.boosterIcons}/${file}`)
)
.split('\n')[4]
.split(' ')
.map(Number);
const content = (
await image
.clone()
.extract({
left: sizes[0],
top: sizes[1],
width: sizes[2],
height: sizes[3],
})
.toBuffer()
).toString('base64');
changes.push({
path: `icons/boosters/${name}.webp`,
content,
encoding: 'base64',
});
}),
);
await commitAssets('booster icons', changes, production);
}
+20
View File
@@ -0,0 +1,20 @@
import { readDVPLFile } from '../../src/core/blitz/readDVPLFile';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA, POI } from './constants';
export async function camouflageIcons(production: boolean) {
console.log('Building camouflage icons...');
const content = await readDVPLFile(
`${DATA}/${POI.defaultCamoIcon.replace('.webp', '.packed.webp.dvpl')}`,
).then((content) => content.toString('base64'));
const changes: FileChange[] = [
{
content,
encoding: 'base64',
path: 'icons/camo.webp',
},
];
await commitAssets('camo icons', changes, production);
}
+29
View File
@@ -0,0 +1,29 @@
import { readdir } from 'fs/promises';
import { readBase64DVPL } from '../../src/core/blitz/readBase64DVPL';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA, POI } from './constants';
export async function circleFlags(production: boolean) {
const flags = await readdir(`${DATA}/${POI.flags}`);
const changes = await Promise.all(
flags
.filter(
(flag) =>
flag.startsWith('flag_profile-stat_') &&
!flag.endsWith('@2x.packed.webp.dvpl'),
)
.map(async (flag) => {
const content = await readBase64DVPL(`${DATA}/${POI.flags}/${flag}`);
const name = flag.match(/flag_profile-stat_(.+)\.packed\.webp/)![1];
return {
content,
encoding: 'base64',
path: `flags/circle/${name}.webp`,
} satisfies FileChange;
}),
);
await commitAssets('circle flags', changes, production);
}
+40
View File
@@ -0,0 +1,40 @@
import { readdir } from 'fs/promises';
import { argv } from 'process';
const isDepot = argv.includes('--depot');
export const WOTB_WIN32_DEPOT = 444202;
export const DATA = isDepot
? await (async () => {
const [installationVersion] = await readdir(`depots/${WOTB_WIN32_DEPOT}`);
return `depots/${WOTB_WIN32_DEPOT}/${installationVersion}/Data`;
})()
: 'C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz/Data';
export const POI = {
vehicleDefinitions: 'XML/item_defs/vehicles',
strings: 'Strings',
cachedStrings: 'https://stufficons.wgcdn.co/localizations/en.yaml',
tankParameters: '3d/Tanks/Parameters',
smallIcons: 'Gfx/UI/BattleScreenHUD/SmallTankIcons',
bigIcons: 'Gfx/UI/BigTankIcons',
flags: 'Gfx/Lobby/flags',
'3d': '3d',
bigShellIcons: 'Gfx/Shared/tank-supply/ammunition/big',
moduleIcons: 'Gfx/UI/ModulesTechTree',
collisionMeshes: '3d/Tanks/CollisionMeshes',
optionalDevices: 'XML/item_defs/vehicles/common/optional_devices.xml',
optionalDeviceSlots:
'XML/item_defs/vehicles/common/optional_device_slots.xml',
optionalDeviceImageMappings:
'UI/Screens3/Lobby/Inventory/OptionalDevices/OptionalDevicesItemImage.style.yaml',
optionalDevicesImage:
'Gfx/UI/InventoryIcons/Big/OptionalDevices/texture0.packed.webp',
consumablesCommon: 'XML/item_defs/vehicles/common/consumables/common.xml',
consumableIcons: 'Gfx/UI/InventoryIcons/Big/Consumables',
provisionIcons: 'Gfx/UI/InventoryIcons/Big/Provisions',
equipmentItemImageMappings:
'UI/Screens3/Lobby/Inventory/Equipment/EquipmentItemImage.style.yaml',
provisionsCommon: 'XML/item_defs/vehicles/common/provisions/common.xml',
defaultCamoIcon: 'Gfx/UI/Hangar/IconCamouflage.webp',
boosterIcons: 'Gfx/Shared/boosters',
} as const;
@@ -0,0 +1,164 @@
import sharp from 'sharp';
import { readDVPLFile } from '../../src/core/blitz/readDVPLFile';
import { readStringDVPL } from '../../src/core/blitz/readStringDVPL';
import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL';
import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA, POI } from './constants';
import { ConsumablesCommon, ProvisionsCommon } from './definitions';
interface Mappings {
Header: { version: number };
StyleSheets: {
selectors: string[];
properties: { 'bg-sprite': string };
}[];
}
export async function consumableProvisionIcons(production: boolean) {
console.log('Building consumable and provision icons...');
const changes: FileChange[] = [];
const consumablesTexture = sharp(
await readDVPLFile(
`${DATA}/${POI.consumableIcons}/texture0.packed.webp.dvpl`,
),
);
const provisionsTexture = sharp(
await readDVPLFile(
`${DATA}/${POI.provisionIcons}/texture0.packed.webp.dvpl`,
),
);
const equipmentItemImageMappings = await readYAMLDVPL<Mappings>(
`${DATA}/${POI.equipmentItemImageMappings}.dvpl`,
);
const consumablesCommon = await readXMLDVPL<{
root: ConsumablesCommon;
}>(`${DATA}/${POI.consumablesCommon}.dvpl`);
const provisionsCommon = await readXMLDVPL<{
root: ProvisionsCommon;
}>(`${DATA}/${POI.provisionsCommon}.dvpl`);
const styleSheets = Object.values(equipmentItemImageMappings.StyleSheets);
await Promise.all(
Object.values(consumablesCommon.root).map(async (consumable) => {
const styleSheet = styleSheets.find((styleSheet) =>
styleSheet.selectors.includes(
`.equipment_item.${consumable.icon} * .equipment-img`,
),
);
if (!styleSheet) {
console.warn(
`No style sheet found for consumable ${consumable.icon}; skipping...`,
);
return;
}
const configPath = styleSheet.properties['bg-sprite']
.replace('~res:/', '')
.replace('.psd', '')
.replace('.txt', '');
if (configPath.startsWith('Gfx/Shared')) {
const image = sharp(
await readDVPLFile(`${DATA}/${configPath}.packed.webp.dvpl`),
);
const content = (
await image.trim({ threshold: 100 }).toBuffer()
).toString('base64');
changes.push({
path: `icons/consumables/${consumable.id}.webp`,
encoding: 'base64',
content,
});
} else {
const sizes = (await readStringDVPL(`${DATA}/${configPath}.txt.dvpl`))
.split('\n')[4]
.split(' ')
.map(Number);
const content = (
await consumablesTexture
.clone()
.extract({
left: sizes[0],
top: sizes[1],
width: sizes[2],
height: sizes[3],
})
.toBuffer()
).toString('base64');
changes.push({
path: `icons/consumables/${consumable.id}.webp`,
encoding: 'base64',
content,
});
}
}),
);
await Promise.all(
Object.values(provisionsCommon.root).map(async (provision) => {
const styleSheet = styleSheets.find((styleSheet) =>
styleSheet.selectors.includes(
`.equipment_item.${provision.icon} * .equipment-img`,
),
);
if (!styleSheet) {
console.warn(
`No style sheet found for provision ${provision.icon}; skipping...`,
);
return;
}
const configPath = styleSheet.properties['bg-sprite']
.replace('~res:/', '')
.replace('.psd', '')
.replace('.txt', '');
if (configPath.startsWith('Gfx/Shared')) {
const image = sharp(
await readDVPLFile(`${DATA}/${configPath}.packed.webp.dvpl`),
);
const content = (
await image.trim({ threshold: 100 }).toBuffer()
).toString('base64');
changes.push({
path: `icons/provisions/${provision.id}.webp`,
encoding: 'base64',
content,
});
} else {
const sizes = (await readStringDVPL(`${DATA}/${configPath}.txt.dvpl`))
.split('\n')[4]
.split(' ')
.map(Number);
const content = (
await provisionsTexture
.clone()
.extract({
left: sizes[0],
top: sizes[1],
width: sizes[2],
height: sizes[3],
})
.toBuffer()
).toString('base64');
changes.push({
path: `icons/provisions/${provision.id}.webp`,
encoding: 'base64',
content,
});
}
}),
);
await commitAssets('consumable and provision icons', changes, production);
}
+39
View File
@@ -0,0 +1,39 @@
import sharp from 'sharp';
import { readDVPLFile } from '../../src/core/blitz/readDVPLFile';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA } from './constants';
const ICONS = [
['currency_silver_m.packed.webp', 'silver'],
['currency_premium_xl.packed.webp', 'premium'],
['currency_gold_m.packed.webp', 'gold'],
['currency_free-xp_xl.packed.webp', 'free-xp'],
['currency_elite-xp_xl.packed.webp', 'elite-xp'],
['currency_crew-xp_xl.packed.webp', 'crew-xp'],
['currency_battle-xp_xl.packed.webp', 'xp'],
];
export async function currencies(production: boolean) {
console.log('Building currency icons...');
const changes = await Promise.all(
ICONS.map(async ([file, name]) => {
const content = (
await sharp(
await readDVPLFile(`${DATA}/Gfx/Lobby/currency/${file}.dvpl`),
)
.trim()
.toBuffer()
).toString('base64');
return {
content,
encoding: 'base64',
path: `icons/currencies/${name}.webp`,
} satisfies FileChange;
}),
);
await commitAssets('currency icons', changes, production);
}
File diff suppressed because it is too large. Load diff
+93
View File
@@ -0,0 +1,93 @@
import sharp from 'sharp';
import { readDVPLFile } from '../../src/core/blitz/readDVPLFile';
import { readStringDVPL } from '../../src/core/blitz/readStringDVPL';
import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL';
import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA, POI } from './constants';
import { OptionalDevices } from './definitions';
interface Mappings {
Header: { version: number };
StyleSheets: {
selectors: string[];
properties: { 'bg-sprite': string };
}[];
}
export async function equipmentIcons(production: boolean) {
console.log('Building equipment icons...');
const changes: FileChange[] = [];
const optionalDevices = await readXMLDVPL<{ root: OptionalDevices }>(
`${DATA}/${POI.optionalDevices}.dvpl`,
);
const mappings = await readYAMLDVPL<Mappings>(
`${DATA}/${POI.optionalDeviceImageMappings}.dvpl`,
);
const image = sharp(
await readDVPLFile(`${DATA}/${POI.optionalDevicesImage}.dvpl`),
);
await Promise.all(
Object.entries(optionalDevices.root).map(
async ([optionalDeviceKey, optionalDevice]) => {
if (optionalDeviceKey === 'nextAvailableId') return;
const mapping = mappings.StyleSheets.find((mapping) =>
mapping.selectors.includes(
`.optional_device_item.${optionalDevice.icon} #Img`,
),
);
if (!mapping) {
console.warn(
`No mapping found for ${optionalDevice.icon}; skipping...`,
);
return;
}
const configPathRaw = mapping.properties['bg-sprite'];
const configPath = configPathRaw.replace('~res:/', '');
if (configPath.startsWith('Gfx/Lobby')) {
const configPathWebp = configPath.replace('.txt', '');
const image = sharp(
await readDVPLFile(`${DATA}/${configPathWebp}.packed.webp.dvpl`),
);
const content = (await image.trim().toBuffer()).toString('base64');
changes.push({
path: `icons/equipment/${optionalDevice.id}.webp`,
encoding: 'base64',
content,
});
} else {
const config = await readStringDVPL(`${DATA}/${configPath}.dvpl`);
const sizes = config.split('\n')[4].split(' ').map(Number);
const content = (
await image
.clone()
.extract({
left: sizes[0],
top: sizes[1],
width: sizes[2],
height: sizes[3],
})
.toBuffer()
).toString('base64');
changes.push({
path: `icons/equipment/${optionalDevice.id}.webp`,
encoding: 'base64',
content,
});
}
},
),
);
await commitAssets('equipment icons', changes, production);
}
+51
View File
@@ -0,0 +1,51 @@
import { config } from 'dotenv';
import { argv } from 'process';
config();
const allTargets = argv.includes('--all-targets');
const targets = argv
.find((argument) => argument.startsWith('--target'))
?.split('=')[1]
.split(',');
const production = argv.includes('--production');
import { boosterIcons } from './boosterIcons';
import { camouflageIcons } from './camouflageIcons';
import { circleFlags } from './circleFlags';
import { consumableProvisionIcons } from './consumableProvisionIcons';
import { currencies } from './currencies';
import { definitions } from './definitions';
import { equipmentIcons } from './equipmentIcons';
import { moduleIcons } from './moduleIcons';
import { scratchedFlags } from './scratchedFlags';
import { shellIcons } from './shellIcons';
import { skillIcons } from './skillIcons';
import { tankArmors } from './tankArmors';
import { tankIcons } from './tankIcons';
import { tankModels } from './tankModels';
import { videos } from './videos';
if (!targets && !allTargets) throw new Error('No target(s) specified');
const methods = [
definitions,
videos,
scratchedFlags,
currencies,
skillIcons,
circleFlags,
shellIcons,
moduleIcons,
equipmentIcons,
consumableProvisionIcons,
camouflageIcons,
boosterIcons,
tankIcons,
tankArmors,
tankModels,
];
for (const method of methods) {
if (allTargets || targets?.includes(method.name)) await method(production);
}
+35
View File
@@ -0,0 +1,35 @@
import { readdir } from 'fs/promises';
import sharp from 'sharp';
import { readDVPLFile } from '../../src/core/blitz/readDVPLFile';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA, POI } from './constants';
export async function moduleIcons(production: boolean) {
console.log('Building module icons...');
const changes = await Promise.all(
(await readdir(`${DATA}/${POI.moduleIcons}`))
.filter(
(file) =>
!file.endsWith('@2x.packed.webp.dvpl') && file.startsWith('vehicle'),
)
.map(async (file) => {
const nameRaw = file.match(/vehicle(.+)\.packed\.webp\.dvpl/)![1];
const name = nameRaw[0].toLowerCase() + nameRaw.slice(1);
const content = (
await sharp(await readDVPLFile(`${DATA}/${POI.moduleIcons}/${file}`))
.trim()
.toBuffer()
).toString('base64');
return {
content,
path: `icons/modules/${name}.webp`,
encoding: 'base64',
} satisfies FileChange;
}),
);
await commitAssets('module icons', changes, production);
}
+31
View File
@@ -0,0 +1,31 @@
import { readdir } from 'fs/promises';
import { readBase64DVPL } from '../../src/core/blitz/readBase64DVPL';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA, POI } from './constants';
export async function scratchedFlags(production: boolean) {
console.log('Building scratched flags...');
const flags = await readdir(`${DATA}/${POI.flags}`);
const changes = await Promise.all(
flags
.filter(
(flag) =>
flag.startsWith('flag_tutor-tank_') &&
!flag.endsWith('@2x.packed.webp.dvpl'),
)
.map(async (flag) => {
const content = await readBase64DVPL(`${DATA}/${POI.flags}/${flag}`);
const name = flag.match(/flag_tutor-tank_(.+)\.packed\.webp/)![1];
return {
content,
encoding: 'base64',
path: `flags/scratched/${name}.webp`,
} satisfies FileChange;
}),
);
await commitAssets('scratched flags', changes, production);
}
+49
View File
@@ -0,0 +1,49 @@
import { readdir } from 'fs/promises';
import sharp from 'sharp';
import { readDVPLFile } from '../../src/core/blitz/readDVPLFile';
import { readStringDVPL } from '../../src/core/blitz/readStringDVPL';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA, POI } from './constants';
export async function shellIcons(production: boolean) {
console.log('Building shell icons...');
const image = sharp(
await readDVPLFile(
`${DATA}/${POI.bigShellIcons}/texture0.packed.webp.dvpl`,
),
);
const changes = await Promise.all(
(await readdir(`${DATA}/${POI.bigShellIcons}`))
.filter((file) => file.endsWith('_l.txt.dvpl'))
.map(async (file) => {
const name = file.match(/(.+)_l\.txt\.dvpl/)![1];
const sizes = (
await readStringDVPL(`${DATA}/${POI.bigShellIcons}/${file}`)
)
.split('\n')[4]
.split(' ')
.map(Number);
return {
content: (
await image
.clone()
.extract({
left: sizes[0],
top: sizes[1],
width: sizes[2],
height: sizes[3],
})
.toBuffer()
).toString('base64'),
encoding: 'base64',
path: `icons/shells/${name}.webp`,
} satisfies FileChange;
}),
);
await commitAssets('shell icons', changes, production);
}
+51
View File
@@ -0,0 +1,51 @@
import sharp from 'sharp';
import { TankClass } from '../../src/components/Tanks';
import { readDVPLFile } from '../../src/core/blitz/readDVPLFile';
import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA } from './constants';
interface SkillIcon {
name: string;
state: number;
}
export interface Avatar {
roles: unknown;
skillsByClasses: Record<TankClass, string>;
skills: {
[name: string]: {
userString: string;
effectDescription: string;
tipDescription: string;
icon: SkillIcon | SkillIcon[];
type: 'continuous' | 'trigger';
};
};
}
export async function skillIcons(production: boolean) {
console.log('Building skill icons...');
const avatar = await readXMLDVPL<{ root: Avatar }>(
`${DATA}/XML/item_defs/tankmen/avatar.xml.dvpl`,
);
const changes = await Promise.all(
Object.values(avatar.root.skills).map(async (skill) => {
const icon = Array.isArray(skill.icon) ? skill.icon[0] : skill.icon;
const name = icon.name.split('/').at(-1)!.replace(/_\d$/, '');
const path = `${DATA}${icon.name.replace('~res:', '')}.packed.webp.dvpl`;
const image = sharp(await readDVPLFile(path)).trim();
const content = (await image.toBuffer()).toString('base64');
return {
content,
encoding: 'base64',
path: `icons/skills/${name}.webp`,
} satisfies FileChange;
}),
);
commitAssets('skill icons', changes, production);
}
+46
View File
@@ -0,0 +1,46 @@
import { NodeIO } from '@gltf-transform/core';
import { readdir } from 'fs/promises';
import { extractArmor } from '../../src/core/blitz/extractArmor';
import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL';
import { toUniqueId } from '../../src/core/blitz/toUniqueId';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA, POI } from './constants';
import { VehicleDefinitionList } from './definitions';
export async function tankArmors(production: boolean) {
console.log('Building tank armors...');
const changes: FileChange[] = [];
const nodeIO = new NodeIO();
const nations = await readdir(`${DATA}/${POI.vehicleDefinitions}`).then(
(nations) => nations.filter((nation) => nation !== 'common'),
);
await Promise.all(
nations.map(async (nation) => {
const tanks = await readXMLDVPL<{ root: VehicleDefinitionList }>(
`${DATA}/${POI.vehicleDefinitions}/${nation}/list.xml.dvpl`,
);
await Promise.all(
Object.entries(tanks.root).map(async ([tankKey, tank]) => {
if (tankKey.includes('tutorial_bot')) return;
const id = toUniqueId(nation, tank.id);
const model = await extractArmor(DATA, `${nation}-${tankKey}`);
changes.push({
path: `3d/tanks/armor/${id}.glb`,
encoding: 'base64',
content: Buffer.from(await nodeIO.writeBinary(model)).toString(
'base64',
),
});
}),
);
}),
);
await commitAssets('tank armor', changes, production);
}
+101
View File
@@ -0,0 +1,101 @@
import { readdir } from 'fs/promises';
import sharp from 'sharp';
import { Vector3Tuple } from 'three';
import { NATION_IDS } from '../../src/constants/nations';
import { readDVPLFile } from '../../src/core/blitz/readDVPLFile';
import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL';
import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA, POI } from './constants';
import { VehicleDefinitionList } from './definitions';
export interface TankParameters {
resourcesPath: {
smallIconPath: string;
bigIconPath: string;
blitzModelPath: string;
};
collision: {
[key: string]: {
points: Vector3Tuple;
bbox: {
min: Vector3Tuple;
max: Vector3Tuple;
};
averageThickness?: Record<string, number>;
};
};
maskSlice?: {
[key: string]:
| {
enabled: boolean;
planePosition: Vector3Tuple;
planeNormal: Vector3Tuple;
planeAxis: Vector3Tuple;
frustumConeBaseRadius: number;
frustumConeAngleDegrees: number;
planeSliceMode: number;
frustumConeSliceMode: number;
}
| undefined;
};
}
export async function tankIcons(production: boolean) {
console.log('Building tank icons...');
const changes: FileChange[] = [];
const nations = await readdir(`${DATA}/${POI.vehicleDefinitions}`).then(
(nations) => nations.filter((nation) => nation !== 'common'),
);
await Promise.all(
nations.map(async (nation) => {
const tanks = await readXMLDVPL<{ root: VehicleDefinitionList }>(
`${DATA}/${POI.vehicleDefinitions}/${nation}/list.xml.dvpl`,
);
await Promise.all(
Object.entries(tanks.root).map(async ([tankKey, tank]) => {
if (tankKey.includes('tutorial_bot')) return;
const nationVehicleId = tank.id;
const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1;
const parameters = await readYAMLDVPL<TankParameters>(
`${DATA}/${POI.tankParameters}/${nation}/${tankKey}.yaml.dvpl`,
);
const smallPath = `${DATA}/${parameters.resourcesPath.smallIconPath
.replace(/~res:\//, '')
.replace(/\..+/, '')}.packed.webp.dvpl`;
const bigPath = `${DATA}/${parameters.resourcesPath.bigIconPath
.replace(/~res:\//, '')
.replace(/\..+/, '')}.packed.webp.dvpl`;
const big = await sharp(await readDVPLFile(bigPath))
.trim()
.toBuffer();
const small = await sharp(await readDVPLFile(smallPath))
.trim()
.toBuffer();
if (big) {
changes.push({
content: big.toString('base64'),
encoding: 'base64',
path: `icons/tanks/big/${id}.webp`,
});
}
if (small) {
changes.push({
content: small.toString('base64'),
encoding: 'base64',
path: `icons/tanks/small/${id}.webp`,
});
}
}),
);
}),
);
await commitAssets('tank icons', changes, production);
}
+55
View File
@@ -0,0 +1,55 @@
import { NodeIO } from '@gltf-transform/core';
import { readdir } from 'fs/promises';
import { extractModel } from '../../src/core/blitz/extractModel';
import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL';
import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL';
import { toUniqueId } from '../../src/core/blitz/toUniqueId';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA, POI } from './constants';
import { VehicleDefinitionList } from './definitions';
import { TankParameters } from './tankIcons';
export async function tankModels(production: boolean) {
console.log('Building tank models...');
const nodeIO = new NodeIO();
const nations = await readdir(`${DATA}/${POI.vehicleDefinitions}`).then(
(nations) => nations.filter((nation) => nation !== 'common'),
);
for (const nationIndex in nations) {
const nation = nations[nationIndex];
const changes: FileChange[] = [];
const tanks = await readXMLDVPL<{ root: VehicleDefinitionList }>(
`${DATA}/${POI.vehicleDefinitions}/${nation}/list.xml.dvpl`,
);
console.log(`Building models for ${nation}`);
await Promise.all(
Object.entries(tanks.root).map(async ([tankKey, tank]) => {
if (tankKey.includes('tutorial_bot')) return;
const id = toUniqueId(nation, tank.id);
const parameters = await readYAMLDVPL<TankParameters>(
`${DATA}/${POI.tankParameters}/${nation}/${tankKey}.yaml.dvpl`,
);
const model = await extractModel(
DATA,
parameters.resourcesPath.blitzModelPath.replace(/\.sc2$/, ''),
);
changes.push({
path: `3d/tanks/models/${id}.glb`,
content: Buffer.from(await nodeIO.writeBinary(model)).toString(
'base64',
),
encoding: 'base64',
});
}),
);
await commitAssets(`tank models ${nation}`, changes, production);
}
}
+124
View File
@@ -0,0 +1,124 @@
import { readdir } from 'fs/promises';
import { google } from 'googleapis';
import { cloneDeep, uniqBy } from 'lodash';
import { parse as parseYaml } from 'yaml';
import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL';
import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL';
import { toUniqueId } from '../../src/core/blitz/toUniqueId';
import { commitAssets } from '../../src/core/blitzkit/commitAssets';
import {
VideoDefinitions,
videoDefinitions,
} from '../../src/core/blitzkit/videos';
import { DATA, POI } from './constants';
import { BlitzStrings, botPattern, VehicleDefinitionList } from './definitions';
const youtubers = [
'UCKBYXp4Xn2I2tL1UL4fpbhw', // droodles
'UCrQ-Dy8lVsm11u8pCJ8W7Tw', // fatness
];
export async function videos(production: boolean) {
console.log('Building videos...');
const currentVideos = await videoDefinitions;
const auth = await google.auth.getClient({
scopes: ['https://www.googleapis.com/auth/youtube.readonly'],
});
const youtube = google.youtube({ version: 'v3', auth });
const nations = await readdir(`${DATA}/${POI.vehicleDefinitions}`).then(
(nations) => nations.filter((nation) => nation !== 'common'),
);
const stringsPreInstalled = await readYAMLDVPL<BlitzStrings>(
`${DATA}/${POI.strings}/en.yaml.dvpl`,
);
const stringsCache = await fetch(POI.cachedStrings)
.then((response) => response.text())
.then((string) => parseYaml(string) as BlitzStrings);
const strings = {
...stringsPreInstalled,
...stringsCache,
};
const tanks: { id: number; name: string; tier: number }[] = [];
await Promise.all(
nations.map(async (nation) => {
const tankList = await readXMLDVPL<{ root: VehicleDefinitionList }>(
`${DATA}/${POI.vehicleDefinitions}/${nation}/list.xml.dvpl`,
);
await Promise.all(
Object.entries(tankList.root).map(async ([tankKey, tank]) => {
if (botPattern.test(tankKey)) return null;
const id = toUniqueId(nation, tank.id);
const name =
(tank.shortUserString
? strings[tank.shortUserString]
: undefined) ?? strings[tank.userString];
const tier = tank.level;
tanks.push({ id, name, tier });
}),
);
}),
);
const tanksSanitized = tanks
.sort((a, b) => b.tier - a.tier)
.sort((a, b) => {
const lastUpdatedA = currentVideos[a.id]?.lastUpdated ?? 0;
const lastUpdatedB = currentVideos[b.id]?.lastUpdated ?? 0;
return lastUpdatedA - lastUpdatedB;
});
const videos: VideoDefinitions = cloneDeep(currentVideos);
let done = 0;
for (const tank of tanksSanitized) {
try {
const results = await youtube.search.list({
part: ['snippet'],
q: `World of Tanks Blitz ${tank.name}`,
});
if (!results.data.items || results.data.items.length === 0) continue;
const items = uniqBy(
results.data.items.filter(
(item) =>
item.snippet?.channelId &&
item.id?.videoId &&
youtubers.includes(item.snippet.channelId),
),
(item) => item.snippet!.channelId,
);
videos[tank.id] = {
lastUpdated: Math.round(Date.now() / 1000),
videos: items.map((item) => item.id!.videoId!),
};
console.log(
`${++done} / ${tanks.length} (${Math.round(100 * (done / tanks.length))}%) done; found ${items.length} for ${tank.name}`,
);
await new Promise((resolve) => setTimeout(resolve, 1000 / 5));
} catch (error) {
console.warn('An error occurred, safely exiting prematurely...', error);
break;
}
}
const content = Object.entries(videos)
.map(
([id, { videos, lastUpdated }]) =>
`${id},${lastUpdated},${videos.join(',')}`,
)
.join('\n');
await commitAssets(
'videos',
[{ content, encoding: 'utf-8', path: 'definitions/videos.csv' }],
production,
);
}
+199
View File
@@ -0,0 +1,199 @@
import { chunk } from 'lodash';
import { argv } from 'process';
import {
RatingInfo,
RatingNeighbors,
RatingPlayer,
} from '../src/commands/ratingLeaderboard';
import { RegionSubdomain } from '../src/constants/regions';
import { getAccountInfo } from '../src/core/blitz/getAccountInfo';
import regionSubdomainToRegion from '../src/core/blitz/regionSubdomainToRegion';
import { commitAssets } from '../src/core/blitzkit/commitAssets';
import { FileChange } from '../src/core/blitzkit/commitMultipleFiles.js';
import { patientFetchJSON } from '../src/core/blitzkit/patientFetchJSON';
import { superCompress } from '../src/core/blitzkit/superCompress';
import {
BkrlBaseEntry,
BkrlFormat,
BkrlSuperset1Entry,
BkrlWriteStream,
} from '../src/core/streams/bkrl';
import { CdonValue, CdonWriteStream } from '../src/core/streams/cdon';
/*
* Central North American Time (UTC-5): use 0 5 * * *.
* Central European Time (UTC+1): use 0 23 * * *.
* Central Asia Standard Time (UTC+7): use 0 17 * * *.
*/
const production = argv.includes('--production');
const target = argv
.find((arg) => arg.startsWith('--target='))
?.split('=')[1] as 'midnight' | 'latest' | undefined;
const regionSubdomains = argv
.find((arg) => arg.startsWith('--region='))
?.split('=')[1];
if (!target) throw new Error('Target parameter not specified');
if (!regionSubdomains) throw new Error('Region parameter not specified');
regionSubdomains.split(',').forEach(async (regionSubdomain) => {
const region = regionSubdomainToRegion(regionSubdomain as RegionSubdomain);
console.log(`Building ${target} rating leaderboard for ${region}`);
const NEIGHBORS = 2 ** 8;
const PLAYERS = await patientFetchJSON<RatingInfo>(
`https://${regionSubdomain}.wotblitz.com/en/api/rating-leaderboards/season/`,
).then((data) => (data.detail === undefined ? data.count : undefined));
if (PLAYERS === undefined) {
throw new Error('No current rating season running');
}
const players: Record<number, RatingPlayer> = {};
const leaderboard: BkrlBaseEntry[] = [];
let registered = 0;
async function branchFromPlayer(id: number) {
const { neighbors } = await patientFetchJSON<RatingNeighbors>(
`https://${regionSubdomain}.wotblitz.com/en/api/rating-leaderboards/user/${id}/?neighbors=${NEIGHBORS}`,
);
const firstPlayer = neighbors[0];
const lastPlayer = neighbors[neighbors.length - 1];
const branches: Promise<void>[] = [];
if (!players[firstPlayer.number])
branches.push(branchFromPlayer(firstPlayer.spa_id));
if (!players[lastPlayer.number])
branches.push(branchFromPlayer(lastPlayer.spa_id));
neighbors.forEach((neighbor) => {
if (players[neighbor.number]) return;
players[neighbor.number] = neighbor;
registered++;
});
console.log(
`Registered ${registered} / ${PLAYERS} (${(
(registered / PLAYERS!) *
100
).toFixed(2)}%)`,
);
await Promise.all(branches);
}
async function branchFromLeague(id: number) {
const { result } = await patientFetchJSON<{ result: RatingPlayer[] }>(
`https://${regionSubdomain}.wotblitz.com/en/api/rating-leaderboards/league/${id}/top/`,
);
const firstPlayer = result[0];
const lastPlayer = result.at(-1)!;
await Promise.all([
branchFromPlayer(firstPlayer.spa_id),
branchFromPlayer(lastPlayer.spa_id),
]);
}
console.log('Branching from leagues...');
await Promise.all([
branchFromLeague(0),
branchFromLeague(1),
branchFromLeague(2),
branchFromLeague(3),
branchFromLeague(4),
]);
console.log('Converting to an array...');
for (let index = 0; index < PLAYERS; index++) {
const listing = players[index + 1];
if (listing) {
leaderboard[index] = { id: listing.spa_id, score: listing.score };
} else {
console.warn(`Position ${index + 1} had no player`);
leaderboard[index] = { id: 0, score: 0 };
}
}
console.log('Requesting further stats...');
const comprehensiveLeaderboard: BkrlSuperset1Entry[] = [];
let chunkIndex = 0;
for (const leaderboardChunk of chunk(leaderboard, 100)) {
console.log(
`Chunk ${chunkIndex + 1} of ${Math.ceil(leaderboard.length / 100)}`,
);
const stats = await getAccountInfo(
region,
leaderboardChunk.map(({ id }) => id),
['statistics.rating'],
);
stats.forEach((stat, index) => {
const trueIndex = chunkIndex * 100 + index;
comprehensiveLeaderboard[trueIndex] =
leaderboardChunk[index].id === 0 ||
stat?.statistics.rating === undefined
? {
battles: 0,
damage: 0,
id: 0,
kills: 0,
score: 0,
survived: 0,
wins: 0,
}
: {
id: leaderboardChunk[index].id,
score: leaderboardChunk[index].score,
battles: stat.statistics.rating.battles,
damage: stat.statistics.rating.damage_dealt,
kills: stat.statistics.rating.frags,
survived: stat.statistics.rating.survived_battles,
wins: stat.statistics.rating.wins,
};
});
chunkIndex++;
}
const info = await patientFetchJSON<RatingInfo & { detail: undefined }>(
`https://${regionSubdomain}.wotblitz.com/en/api/rating-leaderboards/season/`,
);
const normalizedServer = regionSubdomain === 'na' ? 'com' : regionSubdomain;
const infoContent = new CdonWriteStream().cdon(
info as unknown as CdonValue,
).uint8Array;
const leaderboardWriteStream = new BkrlWriteStream();
leaderboardWriteStream.bkrl({
format: BkrlFormat.Superset1,
entries: comprehensiveLeaderboard,
});
const changes: FileChange[] = [
{
path: `regions/${normalizedServer}/rating/${info.current_season}/info.cdon.lz4`,
content: superCompress(infoContent),
encoding: 'base64',
},
{
path: `regions/${normalizedServer}/rating/${info.current_season}/${target}.bkrl`,
content: Buffer.from(leaderboardWriteStream.uint8Array).toString(
'base64',
),
encoding: 'base64',
},
];
commitAssets(
`rating leaderboard ${regionSubdomain} ${target}`,
changes,
production,
);
});
-142
View File
@@ -1,142 +0,0 @@
import { Octokit } from '@octokit/rest';
import { rm, writeFile } from 'fs/promises';
import { argv, env } from 'process';
import {
RatingsInfo,
RatingsNeighbors,
RatingsPlayer,
} from '../src/commands/ratings';
import commitMultipleFiles from '../src/core/blitzkrieg/commitMultipleFiles.js';
import { patientFetchJSON } from '../src/core/blitzkrieg/patientFetchJSON';
/*
* Central North American Time (UTC-5): use 0 5 * * *.
* Central European Time (UTC+1): use 0 23 * * *.
* Central Asia Standard Time (UTC+7): use 0 17 * * *.
*
* [region]/ratings/[season]/info.json: season info like rewards, start & end time, etc.
* [region]/ratings/[season]/latest.json: the absolute latest leaderboard recorded at UTC+0 midnight
* [region]/ratings/[season]/midnight.json: last midnight's leaderboard relative to the region
*/
export type BlitzkriegRatingsLeaderboardEntry = { id: number; score: number };
export type BlitzkriegRatingsLeaderboard = BlitzkriegRatingsLeaderboardEntry[];
const publish = argv.includes('--publish');
const target = argv
.find((arg) => arg.startsWith('--target='))
?.split('=')[1] as 'midnight' | 'latest' | undefined;
const server = argv.find((arg) => arg.startsWith('--region='))?.split('=')[1];
if (!target) throw new Error('Target parameter not specified');
if (!server) throw new Error('Region parameter not specified');
const NEIGHBORS = 2 ** 8;
const PLAYERS = await patientFetchJSON<RatingsInfo>(
`https://${server}.wotblitz.com/en/api/rating-leaderboards/season/`,
).then((data) => (data.detail === undefined ? data.count : undefined));
if (PLAYERS === undefined) {
throw new Error('No current ratings season running');
}
const players: Record<number, RatingsPlayer> = {};
const leaderboard: BlitzkriegRatingsLeaderboard = [];
let registered = 0;
async function branchFromPlayer(id: number) {
const { neighbors } = await patientFetchJSON<RatingsNeighbors>(
`https://${server}.wotblitz.com/en/api/rating-leaderboards/user/${id}/?neighbors=${NEIGHBORS}`,
);
const firstPlayer = neighbors[0];
const lastPlayer = neighbors[neighbors.length - 1];
const branches: Promise<void>[] = [];
if (!players[firstPlayer.number])
branches.push(branchFromPlayer(firstPlayer.spa_id));
if (!players[lastPlayer.number])
branches.push(branchFromPlayer(lastPlayer.spa_id));
neighbors.forEach((neighbor) => {
if (players[neighbor.number]) return;
players[neighbor.number] = neighbor;
registered++;
});
console.log(
`Registered ${registered} / ${PLAYERS} (${(
(registered / PLAYERS!) *
100
).toFixed(2)}%)`,
);
await Promise.all(branches);
}
async function branchFromLeague(id: number) {
const { result } = await patientFetchJSON<{ result: RatingsPlayer[] }>(
`https://${server}.wotblitz.com/en/api/rating-leaderboards/league/${id}/top/`,
);
const firstPlayer = result[0];
const lastPlayer = result[result.length - 1];
await Promise.all([
branchFromPlayer(firstPlayer.spa_id),
branchFromPlayer(lastPlayer.spa_id),
]);
}
console.log('Branching from leagues...');
await Promise.all([
branchFromLeague(0),
branchFromLeague(1),
branchFromLeague(2),
branchFromLeague(3),
branchFromLeague(4),
]);
console.log('Converting to an array...');
for (let index = 0; index < PLAYERS; index++) {
const listing = players[index + 1];
if (!listing) {
console.warn(`Position ${index + 1} had no player`);
continue;
}
leaderboard[index] = {
id: listing.spa_id,
score: listing.score,
};
}
const leaderboardJSON = JSON.stringify(leaderboard);
if (publish) {
const octokit = new Octokit({ auth: env.GH_TOKEN });
const info = await patientFetchJSON<RatingsInfo & { detail: undefined }>(
`https://${server}.wotblitz.com/en/api/rating-leaderboards/season/`,
);
const normalizedServer = server === 'na' ? 'com' : server;
const infoPath = `regions/${normalizedServer}/ratings/${info.current_season}/info.json`;
const leaderboardPath = `regions/${normalizedServer}/ratings/${info.current_season}/${target}.json`;
const infoJSON = JSON.stringify(info);
console.log(`Publishing to season ${info.current_season}...`);
commitMultipleFiles(
'tresabhi',
'blitzkrieg-assets',
'main',
new Date().toString(),
[
{ path: infoPath, content: infoJSON, encoding: 'utf-8' },
{ path: leaderboardPath, content: leaderboardJSON, encoding: 'utf-8' },
],
);
} else {
console.log('Writing to disk...');
await rm('dist.json', { force: true });
await writeFile('dist.json', leaderboardJSON);
}
-46
View File
@@ -1,46 +0,0 @@
import { writeFile } from 'fs/promises';
import { Region } from '../src/constants/regions';
import { getRatingsNeighbors } from '../src/core/blitz/getRatingsNeighbors';
const REGION: Region = 'com';
const PLAYER = 1041988373;
const ITERATIONS = 2 ** 4;
const MAX_NEIGHBORS = 2 ** 7;
const data: [number, number][] = [];
let finished = 0;
for (let index = 0; index < ITERATIONS; index++) {
const neighbors = Math.round((Math.random() * MAX_NEIGHBORS) / 2) * 2;
const start = Date.now();
console.log(`🟡 Iteration ${index} with ${neighbors} neighbors`);
try {
await getRatingsNeighbors(REGION, PLAYER, neighbors);
finished++;
console.log(
`🟢 (${Math.round(
100 * (finished / ITERATIONS),
)}%) Iteration ${index} with ${neighbors} neighbors`,
);
const end = Date.now();
const time = end - start;
data.push([neighbors, time]);
} catch (error) {
console.log(
`🔴 Iteration ${index} with ${neighbors} neighbors\n\n${error}`,
);
}
}
console.log('🟢 Done, sorting');
data.sort(([neighborsA], [neighborsB]) => neighborsA - neighborsB);
console.log('🟢 Writing');
writeFile(
'dist/ratingsPlot.csv',
data.map(([neighbors, time]) => `${neighbors},${time}`).join('\n'),
);
+33
View File
@@ -0,0 +1,33 @@
import decompress from 'decompress';
import { existsSync } from 'fs';
import { mkdir, readdir, writeFile } from 'fs/promises';
if (!existsSync('temp')) {
console.log('Creating temp directory...');
await mkdir('temp');
}
console.log('Downloading depot downloader...');
await fetch(
'https://api.github.com/repos/SteamRE/DepotDownloader/releases/latest',
)
.then(
(response) =>
response.json() as Promise<{
assets: { browser_download_url: string; name: string }[];
}>,
)
.then(({ assets }) => {
const asset = assets.find(({ name }) => name.includes('windows-x64'));
if (!asset) throw new Error('No asset found');
return fetch(asset.browser_download_url);
})
.then((response) => response.arrayBuffer())
.then((arrayBuffer) =>
writeFile('temp/depotDownloader.zip', Buffer.from(arrayBuffer)),
);
console.log('Unzipping...');
await decompress('temp/depotDownloader.zip', 'temp/depotDownloader');
console.log('Download complete; files:', await readdir('temp/depotDownloader'));
+26
View File
@@ -0,0 +1,26 @@
import { tankDefinitions } from '../src/core/blitzkit/tankDefinitions';
// random vercel bug forces require import
const { writeFileSync } = require('fs');
console.log('Building sitemap...');
const awaitedTankDefinitions = await tankDefinitions;
const values = Object.values(awaitedTankDefinitions);
const txt = values
.map((tank) => `https://blitzkit.vercel.app/tools/tankopedia/${tank.id}/`)
.join('\n');
const xml = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
${values
.map(
(tank) =>
`<url><loc>https://blitzkit.vercel.app/tools/tankopedia/${tank.id}/</loc></url>`,
)
.join('\n')}
</urlset>`;
writeFileSync('public/sitemap.txt', txt);
writeFileSync('public/sitemap.xml', xml);
console.log(`Built sitemap for ${values.length} tanks`);
+96
View File
@@ -0,0 +1,96 @@
import { chunk, times } from 'lodash';
import { compress } from 'lz4js';
import { argv } from 'process';
import { Region, REGIONS } from '../src/constants/regions';
import getTankStats from '../src/core/blitz/getTankStats';
import { idToRegion } from '../src/core/blitz/idToRegion';
import { commitAssets } from '../src/core/blitzkit/commitAssets';
import { FileChange } from '../src/core/blitzkit/commitMultipleFiles';
import {
RtscWritePlayer,
RtscWriteStream,
RtsmWriteStream,
} from '../src/core/streams/rts';
import usersRaw from '../test.users.json';
const PLAYERS_PER_CHUNK = 256;
const CHUNKS_PER_BATCH = 128;
const production = argv.includes('--production');
const region = argv
.find((argument) => argument.startsWith('--region'))
?.split('=')[1] as Region | undefined;
if (!region || !REGIONS.includes(region)) {
throw new Error('No valid region specified');
}
const today = new Date();
const todayPath = `${today.getUTCFullYear()}/${today.getUTCMonth() + 1}/${today.getUTCDate()}`;
const users = usersRaw.filter(({ blitz }) => idToRegion(blitz) === region);
const base = Math.ceil(users.length / PLAYERS_PER_CHUNK);
const chunks = times(base, (offset) => ({
offset,
users: users.filter((user) => user.blitz % base === offset),
}));
const batches = chunk(chunks, CHUNKS_PER_BATCH);
const manifestWriteStream = new RtsmWriteStream();
console.log(`Found ${users.length} players in ${region}`);
await commitAssets(
`regular tank stats manifests ${todayPath}`,
[
{
encoding: 'base64',
path: `regions/${region}/regular/tanks/${todayPath}/manifest.rtsm`,
content: Buffer.from(
compress(manifestWriteStream.rtsm(base).uint8Array),
).toString('base64'),
},
],
production,
);
let batchesDone = 0;
for (const batch of batches) {
console.log(`Batch ${++batchesDone} of ${batches.length}`);
const changes: FileChange[] = [];
let chunksDone = 0;
for (const chunk of batch) {
console.log(`Chunk ${++chunksDone} of ${chunks.length}`);
let playersDone = 0;
const players = await Promise.all(
chunk.users.map(async (user) => {
const tanks = await getTankStats(region, user.blitz);
console.log(`Player ${++playersDone} of ${chunk.users.length}`);
if (tanks === null) return null;
return {
id: user.blitz,
tanks,
} satisfies RtscWritePlayer;
}),
).then((players) => players.filter((player) => player !== null));
const writeStream = new RtscWriteStream();
writeStream.rtsc(players);
changes.push({
encoding: 'base64',
content: Buffer.from(compress(writeStream.uint8Array)).toString('base64'),
path: `regions/${region}/regular/tanks/${todayPath}/${chunk.offset}.rtsc.lz4`,
});
}
// do not await; commit in background
commitAssets(
`regular tank stats ${todayPath} batch ${batches.indexOf(batch) + 1}`,
changes,
production,
);
}
+18
View File
@@ -0,0 +1,18 @@
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "Node",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true,
"noEmit": true,
"resolveJsonModule": true,
"jsx": "preserve",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"incremental": true,
"isolatedModules": true
}
}
@@ -1,10 +1,10 @@
import { NextResponse } from 'next/server';
import { Region } from '../../../../../../constants/regions';
import getRatingsInfo from '../../../../../../core/blitz/getRatingsInfo';
import getRatingInfo from '../../../../../../core/blitz/getRatingInfo';
export async function GET(
request: Request,
{ params }: { params: { region: Region } },
) {
return NextResponse.json(await getRatingsInfo(params.region));
return NextResponse.json(await getRatingInfo(params.region));
}
@@ -1,12 +1,12 @@
import { NextResponse } from 'next/server';
import { Region } from '../../../../../../../constants/regions';
import { getRatingsLeague } from '../../../../../../../core/blitz/getRatingsLeague';
import { getRatingLeague } from '../../../../../../../core/blitz/getRatingLeague';
export async function GET(
request: Request,
{ params }: { params: { region: Region; league: number } },
) {
return NextResponse.json(
await getRatingsLeague(params.region, params.league, true),
await getRatingLeague(params.region, params.league, true),
);
}
@@ -1,12 +1,12 @@
import { NextResponse } from 'next/server';
import { Region } from '../../../../../../../constants/regions';
import { searchCurrentRatingsPlayers } from '../../../../../../../core/blitz/searchCurrentRatingsPlayers';
import { searchCurrentRatingPlayers } from '../../../../../../../core/blitz/searchCurrentRatingPlayers';
export async function GET(
request: Request,
{ params }: { params: { region: Region; username: string } },
) {
return NextResponse.json(
await searchCurrentRatingsPlayers(params.region, params.username),
await searchCurrentRatingPlayers(params.region, params.username),
);
}
+29 -21
View File
@@ -3,25 +3,28 @@
import { ContextMenu } from '@radix-ui/themes';
import { useEffect, useState } from 'react';
import * as Breakdown from '../../../components/Breakdown';
import { TreeTypeEnum } from '../../../components/Tanks';
import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID';
import fetchBlitz from '../../../core/blitz/fetchBlitz';
import { resetSession } from '../../../core/blitzkit/resetSession';
import {
BlitzkriegTankDefinition,
TankDefinition,
tankDefinitions,
} from '../../../core/blitzkrieg/definitions/tanks';
} from '../../../core/blitzkit/tankDefinitions';
import { tankAverages } from '../../../core/blitzstars/tankAverages';
import calculateWN8 from '../../../core/statistics/calculateWN8';
import { deltaTankStats } from '../../../core/statistics/deltaTankStats';
import getWN8Percentile from '../../../core/statistics/getWN8Percentile';
import { resetSession, useSession } from '../../../stores/session';
import mutateSession, { useSession } from '../../../stores/session';
import { IndividualTankStats, TanksStats } from '../../../types/tanksStats';
import { CustomColumnDisplay } from '../../tools/session/components/CustomColumn';
import { Menu } from '../../tools/session/components/Menu';
const REFRESH_RATE = 1 / 5;
export default function SessionPage() {
interface SessionPageProps {
naked?: boolean;
}
export default function SessionPage({ naked = true }: SessionPageProps) {
const session = useSession();
const since = session.isTracking ? new Date(session.time) : undefined;
const [diff, setDiff] = useState<
@@ -30,7 +33,7 @@ export default function SessionPage() {
list: {
stats: IndividualTankStats;
tankDefinitions?: BlitzkriegTankDefinition;
tankDefinitions?: TankDefinition;
career: IndividualTankStats;
currentWN8?: number;
careerWN8?: number;
@@ -72,14 +75,22 @@ export default function SessionPage() {
0,
) / careerBattles;
useEffect(() => {
if (session.title === 'Untitled session') {
mutateSession((draft) => {
if (draft.isTracking) draft.title = draft.nickname;
});
}
}, [session.title]);
useEffect(() => {
async function recalculateDiff() {
if (session.isTracking) {
const { id, region } = session;
const careerRaw = await fetchBlitz<TanksStats>(
`https://api.wotblitz.${region}/wotb/tanks/stats/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`,
);
const career = careerRaw[id].reduce<
const careerRaw = await fetchBlitz<TanksStats>(region, 'tanks/stats', {
account_id: id,
});
const career = careerRaw[id]!.reduce<
Record<number, IndividualTankStats>
>(
(accumulator, curr) => ({
@@ -91,7 +102,7 @@ export default function SessionPage() {
const awaitedTankDefinitions = await tankDefinitions;
const awaitedTankAverages = await tankAverages;
const careerWN8 =
careerRaw[id].reduce(
careerRaw[id]!.reduce(
(accumulator, { tank_id, all }) =>
accumulator +
(awaitedTankAverages[tank_id] && all.battles > 0
@@ -100,7 +111,7 @@ export default function SessionPage() {
: 0),
0,
) /
careerRaw[id].reduce(
careerRaw[id]!.reduce(
(accumulator, { tank_id, all }) =>
accumulator +
(awaitedTankAverages[tank_id] && all.battles > 0
@@ -114,7 +125,7 @@ export default function SessionPage() {
list: (
Object.values(
deltaTankStats(session.tankStats, career),
deltaTankStats(session.tankStats, career, session.time / 1000),
) as IndividualTankStats[]
).map((stats) => {
return {
@@ -207,6 +218,7 @@ export default function SessionPage() {
since !== undefined &&
diff !== undefined && (
<Breakdown.Row
naked={naked}
color={session.color}
minimized={!session.showCareer}
title={session.title}
@@ -288,6 +300,7 @@ export default function SessionPage() {
return (
<Breakdown.Row
naked={naked}
color={session.color}
key={stats.tank_id}
minimized={!session.showCareer}
@@ -295,13 +308,8 @@ export default function SessionPage() {
tankDefinitions?.name ?? `Unknown tank ${stats.tank_id}`
}
type="tank"
tankType={tankDefinitions?.type}
treeType={(() => {
if (tankDefinitions?.tree_type === 'collector')
return TreeTypeEnum.Collector;
if (tankDefinitions?.tree_type === 'premium')
return TreeTypeEnum.Premium;
})()}
tankType={tankDefinitions?.class}
treeType={tankDefinitions?.treeType}
stats={session.customColumns.map((customColumn) => {
const rowStat = rowStats[customColumn.display];
+85 -15
View File
@@ -1,15 +1,24 @@
'use client';
import { Flex, Theme } from '@radix-ui/themes';
import { AlertDialog, Button, Flex, Theme } from '@radix-ui/themes';
import '@radix-ui/themes/styles.css';
import { config } from 'dotenv';
import { Roboto_Flex } from 'next/font/google';
import { usePathname } from 'next/navigation';
import { ReactNode } from 'react';
import { ReactNode, Suspense, useEffect, useState } from 'react';
import { Footer } from '../components/Footer';
import { Loader } from '../components/Loader';
import Navbar from '../components/Navbar';
import { Party3 } from '../components/Party3';
import isDev from '../core/blitzkit/isDev';
import { isLocalhost } from '../core/blitzkit/isLocalhost';
import { useFullScreen } from '../hooks/useFullScreen';
import { useApp } from '../stores/app';
config();
const DEV_BUILD_AGREEMENT_COOLDOWN = 8 * 24 * 60 * 60 * 1000;
interface RootLayoutProps {
children: ReactNode;
}
@@ -22,36 +31,97 @@ const robotoFlex = Roboto_Flex({
export default function RootLayout({ children }: RootLayoutProps) {
const pathname = usePathname();
const isEmbed = pathname.split('/')[1] === 'embeds';
const isRoot = pathname === '/';
const darkMode = useApp((state) => state.darkMode);
const [showDevBuildAlert, setShowDevBuildAlert] = useState(false);
const isFullScreen = useFullScreen();
useEffect(() => {
setShowDevBuildAlert(
isDev() &&
!isLocalhost() &&
Date.now() - useApp.getState().devBuildAgreementTime >=
DEV_BUILD_AGREEMENT_COOLDOWN,
);
}, []);
return (
<html lang="en" className={robotoFlex.className}>
<head>
<title>Blitzkrieg</title>
<meta
name="description"
content="🎉 Tools for everything World of Tanks Blitz"
/>
{isRoot && (
<>
<title>BlitzKit</title>
<meta
name="description"
content="🎉 Tools for everything World of Tanks Blitz"
/>
</>
)}
<meta property="og:site_name" content="BlitzKit" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<Party3 />
</head>
<body
style={{
margin: 0,
paddingTop: isEmbed ? 0 : '3.25rem',
background: isEmbed
? 'transparent'
: 'url(https://i.imgur.com/PhS06NJ.png)',
backgroundColor: isEmbed ? 'transparent' : undefined,
}}
>
<Theme
appearance="dark"
panelBackground="translucent"
appearance={darkMode ? 'dark' : 'light'}
panelBackground="solid"
radius="full"
suppressHydrationWarning
suppressContentEditableWarning
>
{!isEmbed && <Navbar />}
<Flex
direction="column"
style={{ minHeight: '100vh', paddingTop: isEmbed ? undefined : 64 }}
>
{!isEmbed && <Navbar />}
<AlertDialog.Root open={showDevBuildAlert}>
<AlertDialog.Content>
<AlertDialog.Title>Experimental version!</AlertDialog.Title>
<AlertDialog.Description>
This version may have a lot of issues. Report issues to{' '}
<a href="https://discord.gg/nDt7AjGJQH" target="_blank">
the official Discord server
</a>
. Also consider using{' '}
<a href="https://blitzkit.vercel.app/">
the more stable release version
</a>
. You will be asked again in 8 days.
</AlertDialog.Description>
<Flex direction="column">{children}</Flex>
<Flex justify="end">
<Button
variant="solid"
onClick={() => {
setShowDevBuildAlert(false);
useApp.setState({ devBuildAgreementTime: Date.now() });
}}
>
Continue
</Button>
</Flex>
</AlertDialog.Content>
</AlertDialog.Root>
<Suspense
fallback={
<div style={{ flex: 1 }}>
<Loader />
</div>
}
>
{children}
</Suspense>
{!isEmbed && !isFullScreen && <Footer />}
</Flex>
</Theme>
</body>
</html>
+1 -1
View File
@@ -3,7 +3,7 @@ import { theme } from '../stitches.config';
export const tool = styleVariants({
enabled: {
boxShadow: `inset 0 -192px 128px -128px ${theme.colors.appBackground1}`,
boxShadow: `inset 0 -200px 128px -128px ${theme.colors.appBackground1}`,
':hover': {
boxShadow: `inset 0 -160px 128px -128px ${theme.colors.appBackground1}`,
+75 -78
View File
@@ -1,94 +1,91 @@
'use client';
import { CaretRightIcon, MagnifyingGlassIcon } from '@radix-ui/react-icons';
import { Flex, Text, TextField } from '@radix-ui/themes';
import { CaretRightIcon } from '@radix-ui/react-icons';
import { Button, Flex, Link as LinkRadix } from '@radix-ui/themes';
import Link from 'next/link';
import { useRef } from 'react';
import { Search, SearchItem } from 'react-fuzzysort';
import PageWrapper from '../components/PageWrapper';
import { TOOLS } from '../constants/tools';
import { PatreonIcon } from '../icons/Patreon';
import { theme } from '../stitches.config';
import * as styles from './page.css';
export default function Page() {
const input = useRef<HTMLInputElement>(null);
return (
<PageWrapper>
<TextField.Root>
<TextField.Slot>
<MagnifyingGlassIcon height="16" width="16" />
</TextField.Slot>
<TextField.Input ref={input} placeholder="Search tools..." />
</TextField.Root>
<Flex
direction="column"
gap="5"
justify="center"
align="center"
style={{ flex: 1 }}
>
<LinkRadix href="https://www.patreon.com/tresabhi" target="_blank">
<Button
color="ruby"
style={{
boxShadow: `0 0 8px ${theme.colors.solidBackground_ruby}f0`,
}}
>
<PatreonIcon style={{ width: '1em', height: '1em' }} /> Consider
donating on Patreon
</Button>
</LinkRadix>
<Flex gap="3" wrap="wrap" align="center" justify="center">
<Search
input={input}
list={TOOLS.map(
(tool) =>
({
node: (
<Link
href={`/tools/${tool.id}`}
className={
tool.disabled ? styles.tool.disabled : styles.tool.enabled
}
style={{
backgroundImage: `url(/assets/banners/${tool.id}.webp)`,
cursor: tool.disabled ? 'default' : 'pointer',
opacity: tool.disabled ? 0.25 : 1,
height: 128,
minWidth: 256,
flex: 1,
borderRadius: 8,
textDecoration: 'none',
backgroundSize: 'cover',
backgroundPosition: 'center',
overflow: 'hidden',
display: 'flex',
flexDirection: 'column',
alignItems: 'flex-start',
justifyContent: 'flex-end',
padding: 16,
gap: 4,
transition: `box-shadow ${theme.durations.regular}`,
}}
onClick={(event) => {
if (tool.disabled) event.preventDefault();
}}
>
<span
style={{
fontSize: 32,
color: theme.colors.textHighContrast,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}}
>
{tool.title}
<CaretRightIcon style={{ width: '1em', height: '1em' }} />
</span>
<span
style={{
color: theme.colors.textLowContrast,
fontSize: 16,
}}
>
{tool.disabled ? 'Coming soon!' : tool.description}
</span>
</Link>
),
query: `${tool.title} ${tool.description}`,
}) satisfies SearchItem,
)}
/>
<Flex gap="3" wrap="wrap" align="center" justify="center">
{TOOLS.map((tool) => (
<Link
href={tool.href ?? `/tools/${tool.id}`}
target={tool.href ? '_blank' : undefined}
className={
tool.disabled ? styles.tool.disabled : styles.tool.enabled
}
style={{
backgroundImage: `url(/assets/banners/${tool.id}.webp)`,
cursor: tool.disabled ? 'default' : 'pointer',
opacity: tool.disabled ? 0.25 : 1,
height: 128,
minWidth: 256,
flex: 1,
borderRadius: 8,
textDecoration: 'none',
backgroundSize: 'cover',
backgroundPosition: 'center',
overflow: 'hidden',
display: 'flex',
flexDirection: 'column',
alignItems: 'flex-start',
justifyContent: 'flex-end',
padding: 16,
transition: `box-shadow ${theme.durations.regular}`,
}}
onClick={(event) => {
if (tool.disabled) event.preventDefault();
}}
>
<span
style={{
fontSize: 32,
color: theme.colors.textHighContrast,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}}
>
{tool.title}
<CaretRightIcon style={{ width: '1em', height: '1em' }} />
</span>
<span
style={{
color: theme.colors.textLowContrast,
fontSize: 16,
}}
>
{tool.disabled ? 'Coming soon!' : tool.description}
</span>
</Link>
))}
</Flex>
</Flex>
<Text size="1" color="gray" align="center">
Images courtesy of Wargaming Art Department
</Text>
</PageWrapper>
);
}
Loaded 100 of 477 files, more files were not shown because too many files have changed in this diff. Show more