lang testing works again

This commit is contained in:
Eric 2024-07-31 16:08:35 -07:00
parent 57e59fb859
commit 121a8c5ae6
No known key found for this signature in database
GPG Key ID: 89C93F0F8D6D5A98
11 changed files with 363 additions and 150 deletions

158
.efrocachemap generated
View File

@ -421,43 +421,43 @@
"build/assets/ba_data/audio/zoeOw.ogg": "74befe45a8417e95b6a2233c51992a26", "build/assets/ba_data/audio/zoeOw.ogg": "74befe45a8417e95b6a2233c51992a26",
"build/assets/ba_data/audio/zoePickup01.ogg": "48ab8cddfcde36a750856f3f81dd20c8", "build/assets/ba_data/audio/zoePickup01.ogg": "48ab8cddfcde36a750856f3f81dd20c8",
"build/assets/ba_data/audio/zoeScream01.ogg": "2b468aedfa8741090247f04eb9e6df55", "build/assets/ba_data/audio/zoeScream01.ogg": "2b468aedfa8741090247f04eb9e6df55",
"build/assets/ba_data/data/langdata.json": "a49e8187178effbd077426d31f7d92ff", "build/assets/ba_data/data/langdata.json": "99ad02cbe90ab3e46168ddf277633c68",
"build/assets/ba_data/data/languages/arabic.json": "dcb913b3d89fe665adbf35e697d2e5d0", "build/assets/ba_data/data/languages/arabic.json": "dcb913b3d89fe665adbf35e697d2e5d0",
"build/assets/ba_data/data/languages/belarussian.json": "3d5523d0004293aa2df02f3f6f3b84f8", "build/assets/ba_data/data/languages/belarussian.json": "3d5523d0004293aa2df02f3f6f3b84f8",
"build/assets/ba_data/data/languages/chinese.json": "2c0105deead2412543323564bbbca749", "build/assets/ba_data/data/languages/chinese.json": "d4a89bf007a0624c6852c512d1d38cdc",
"build/assets/ba_data/data/languages/chinesetraditional.json": "319565f8a15667488f48dbce59278e39", "build/assets/ba_data/data/languages/chinesetraditional.json": "319565f8a15667488f48dbce59278e39",
"build/assets/ba_data/data/languages/croatian.json": "e671b9d0c012be1a30f9c15eb1b81860", "build/assets/ba_data/data/languages/croatian.json": "b23619cb396ac16640c47458f884b16a",
"build/assets/ba_data/data/languages/czech.json": "74219f9b06ff098387b40f85a5b0124e", "build/assets/ba_data/data/languages/czech.json": "61bcfce75c0d53d2f2af709cee42187a",
"build/assets/ba_data/data/languages/danish.json": "8e57db30c5250df2abff14a822f83ea7", "build/assets/ba_data/data/languages/danish.json": "8e57db30c5250df2abff14a822f83ea7",
"build/assets/ba_data/data/languages/dutch.json": "b0900d572c9141897d53d6574c471343", "build/assets/ba_data/data/languages/dutch.json": "b0900d572c9141897d53d6574c471343",
"build/assets/ba_data/data/languages/english.json": "b88cb9e8035e238ccf327d62bde1d190", "build/assets/ba_data/data/languages/english.json": "eae3a17af2efc2388f96c1e05c024455",
"build/assets/ba_data/data/languages/esperanto.json": "0e397cfa5f3fb8cef5f4a64f21cda880", "build/assets/ba_data/data/languages/esperanto.json": "0e397cfa5f3fb8cef5f4a64f21cda880",
"build/assets/ba_data/data/languages/filipino.json": "f8d101b436fcf8f92f20a9983fb9fdee", "build/assets/ba_data/data/languages/filipino.json": "fabaedeefc28cf02ec365ef37046ec0b",
"build/assets/ba_data/data/languages/french.json": "b7d11199756f0eb4f1a745ceee652b2a", "build/assets/ba_data/data/languages/french.json": "b7d11199756f0eb4f1a745ceee652b2a",
"build/assets/ba_data/data/languages/german.json": "198b9860c5b9df7b8e3e30b03d8755cb", "build/assets/ba_data/data/languages/german.json": "198b9860c5b9df7b8e3e30b03d8755cb",
"build/assets/ba_data/data/languages/gibberish.json": "becbb2e96a0d85661c1af9ebbf6bb2fb", "build/assets/ba_data/data/languages/gibberish.json": "085f438ccdb7553bbb7cf5d68e9cd300",
"build/assets/ba_data/data/languages/greek.json": "ad3c0d38f34d809824892d6f22808dbf", "build/assets/ba_data/data/languages/greek.json": "ad3c0d38f34d809824892d6f22808dbf",
"build/assets/ba_data/data/languages/hindi.json": "e56f0ffb57321660aa415e97c2dacfc2", "build/assets/ba_data/data/languages/hindi.json": "54cd56bade6922b40989a8ac5e0c17f6",
"build/assets/ba_data/data/languages/hungarian.json": "6b08fea24b72cc805ed0dc59e11c4cd6", "build/assets/ba_data/data/languages/hungarian.json": "0cf994bf9fedf004c9a1011bee179a07",
"build/assets/ba_data/data/languages/indonesian.json": "ed9038bf4b9216f93eb73e753e162706", "build/assets/ba_data/data/languages/indonesian.json": "ed9038bf4b9216f93eb73e753e162706",
"build/assets/ba_data/data/languages/italian.json": "017f2b20584838d9f5ad88822a4caf62", "build/assets/ba_data/data/languages/italian.json": "017f2b20584838d9f5ad88822a4caf62",
"build/assets/ba_data/data/languages/korean.json": "4e3524327a0174250aff5e1ef4c0c597", "build/assets/ba_data/data/languages/korean.json": "4e3524327a0174250aff5e1ef4c0c597",
"build/assets/ba_data/data/languages/malay.json": "f6ce0426d03a62612e3e436ed5d1be1f", "build/assets/ba_data/data/languages/malay.json": "f6ce0426d03a62612e3e436ed5d1be1f",
"build/assets/ba_data/data/languages/persian.json": "8e3a88cbb729570ffc8e0b06b3337a8f", "build/assets/ba_data/data/languages/persian.json": "87f9dfc085f0ff715b17a8082fc79483",
"build/assets/ba_data/data/languages/polish.json": "6585f57b1a389b8331b06f610bd8cc6f", "build/assets/ba_data/data/languages/polish.json": "3ce5635118b34ea89d6e0f83c8c7e9df",
"build/assets/ba_data/data/languages/portuguese.json": "615a59bd03f84659158d9f2608a4ab21", "build/assets/ba_data/data/languages/portuguese.json": "0accd9462f0acbc5f869f33a2a7a24cd",
"build/assets/ba_data/data/languages/romanian.json": "ef68520f749cf3641d4e4225a6166349", "build/assets/ba_data/data/languages/romanian.json": "ef68520f749cf3641d4e4225a6166349",
"build/assets/ba_data/data/languages/russian.json": "64f0b7347af86f8c4bec8ba8e781378d", "build/assets/ba_data/data/languages/russian.json": "e7b90ce1eee8247e164ed7d1470f76bd",
"build/assets/ba_data/data/languages/serbian.json": "d7452dd72ac0e51680cb39b5ebaa1c69", "build/assets/ba_data/data/languages/serbian.json": "d7452dd72ac0e51680cb39b5ebaa1c69",
"build/assets/ba_data/data/languages/slovak.json": "3c08c748c96c71bd9e1d7291fb8817b6", "build/assets/ba_data/data/languages/slovak.json": "3c08c748c96c71bd9e1d7291fb8817b6",
"build/assets/ba_data/data/languages/spanish.json": "63f80b2c37a1d8092304db1a10ecf789", "build/assets/ba_data/data/languages/spanish.json": "63f80b2c37a1d8092304db1a10ecf789",
"build/assets/ba_data/data/languages/swedish.json": "5142a96597d17d8344be96a603da64ac", "build/assets/ba_data/data/languages/swedish.json": "5142a96597d17d8344be96a603da64ac",
"build/assets/ba_data/data/languages/tamil.json": "b9fcc523639f55e05c7f4e7914f3321a", "build/assets/ba_data/data/languages/tamil.json": "b9fcc523639f55e05c7f4e7914f3321a",
"build/assets/ba_data/data/languages/thai.json": "1d665629361f302693dead39de8fa945", "build/assets/ba_data/data/languages/thai.json": "1d665629361f302693dead39de8fa945",
"build/assets/ba_data/data/languages/turkish.json": "babd1ea2ac160cc9253e836c41674fff", "build/assets/ba_data/data/languages/turkish.json": "60691e93b58e1612901e8558b967697b",
"build/assets/ba_data/data/languages/ukrainian.json": "3f9ee9567a068b760bbf25433177db89", "build/assets/ba_data/data/languages/ukrainian.json": "6207f0e4048f9391526321d879a5d61e",
"build/assets/ba_data/data/languages/venetian.json": "9bb01eea11d1627c0ceb876d26d86d0c", "build/assets/ba_data/data/languages/venetian.json": "9bb01eea11d1627c0ceb876d26d86d0c",
"build/assets/ba_data/data/languages/vietnamese.json": "0b3bcd0be6d0a138316ad1a1d2553962", "build/assets/ba_data/data/languages/vietnamese.json": "4bc1ba96ef291fed6d6409ad8cf7357f",
"build/assets/ba_data/data/maps/big_g.json": "1dd301d490643088a435ce75df971054", "build/assets/ba_data/data/maps/big_g.json": "1dd301d490643088a435ce75df971054",
"build/assets/ba_data/data/maps/bridgit.json": "6aea74805f4880cc11237c5734a24422", "build/assets/ba_data/data/maps/bridgit.json": "6aea74805f4880cc11237c5734a24422",
"build/assets/ba_data/data/maps/courtyard.json": "4b836554c8949bcd2ae382f5e3c1a9cc", "build/assets/ba_data/data/maps/courtyard.json": "4b836554c8949bcd2ae382f5e3c1a9cc",
@ -945,11 +945,45 @@
"build/assets/ba_data/meshes/zoeTorso.bob": "26a1007e98902178d8c62fd7069d5da5", "build/assets/ba_data/meshes/zoeTorso.bob": "26a1007e98902178d8c62fd7069d5da5",
"build/assets/ba_data/meshes/zoeUpperArm.bob": "a8a881010ac1ee9ec5ca872d5c5e853a", "build/assets/ba_data/meshes/zoeUpperArm.bob": "a8a881010ac1ee9ec5ca872d5c5e853a",
"build/assets/ba_data/meshes/zoeUpperLeg.bob": "95b2502f74c70f934927f67cd505c3ad", "build/assets/ba_data/meshes/zoeUpperLeg.bob": "95b2502f74c70f934927f67cd505c3ad",
"build/assets/ba_data/python-site-packages/certifi/__init__.py": "c935c5aee4052f1c76954ace35723dfe", "build/assets/ba_data/python-site-packages/certifi/__init__.py": "8133ab2f7828219b186d4cecb2d5443b",
"build/assets/ba_data/python-site-packages/certifi/__main__.py": "ef02e73f8581609df189a9f61aca365b", "build/assets/ba_data/python-site-packages/certifi/__main__.py": "ef02e73f8581609df189a9f61aca365b",
"build/assets/ba_data/python-site-packages/certifi/cacert.pem": "47f35c87a8abc6ace093db7c215f1eab", "build/assets/ba_data/python-site-packages/certifi/cacert.pem": "072b2f0da8254144432a91d068fa6fb1",
"build/assets/ba_data/python-site-packages/certifi/core.py": "c1b8c102093ea26587619677c7ec6016", "build/assets/ba_data/python-site-packages/certifi/core.py": "c1b8c102093ea26587619677c7ec6016",
"build/assets/ba_data/python-site-packages/typing_extensions.py": "1f6b4db70adb7ca05dff2b74f6cde8aa", "build/assets/ba_data/python-site-packages/typing_extensions.py": "1f6b4db70adb7ca05dff2b74f6cde8aa",
"build/assets/ba_data/python-site-packages/urllib3/__init__.py": "06cffcf88c8024218069f628c9938c50",
"build/assets/ba_data/python-site-packages/urllib3/_base_connection.py": "4404e529dbd3db128d9a2e60c6ed9243",
"build/assets/ba_data/python-site-packages/urllib3/_collections.py": "14963d7d43c0e51e777851c0e2868928",
"build/assets/ba_data/python-site-packages/urllib3/_request_methods.py": "87d6a7a77db1324e81d02f919c134f1a",
"build/assets/ba_data/python-site-packages/urllib3/_version.py": "46e3fbaaf7d02c2e55fcecc98deb5af8",
"build/assets/ba_data/python-site-packages/urllib3/connection.py": "3b49efceb61dfab0587286686e0e5ada",
"build/assets/ba_data/python-site-packages/urllib3/connectionpool.py": "e891fe6cdff0c03a3b670e225c0c4d88",
"build/assets/ba_data/python-site-packages/urllib3/contrib/__init__.py": "340c83beff7dcff8f5c7b87cd43cedaf",
"build/assets/ba_data/python-site-packages/urllib3/contrib/emscripten/__init__.py": "33531b60d1ff8b9073567240f2a1745f",
"build/assets/ba_data/python-site-packages/urllib3/contrib/emscripten/connection.py": "e9474e964b3feb3a523ccfab2b4b8f70",
"build/assets/ba_data/python-site-packages/urllib3/contrib/emscripten/fetch.py": "be8618e1c9a004108bf9f82f706503d7",
"build/assets/ba_data/python-site-packages/urllib3/contrib/emscripten/request.py": "da01c66ef924f2a2875d46adb87d7507",
"build/assets/ba_data/python-site-packages/urllib3/contrib/emscripten/response.py": "11208e765d5e9a1d481ded597e58c7d3",
"build/assets/ba_data/python-site-packages/urllib3/contrib/pyopenssl.py": "7a14ef1c58c55511581043ed25aebba3",
"build/assets/ba_data/python-site-packages/urllib3/contrib/socks.py": "bd5fed33c678f750ad9d1c754a26faf0",
"build/assets/ba_data/python-site-packages/urllib3/exceptions.py": "c346a13d762dcdff2f9cccc1d06c92d6",
"build/assets/ba_data/python-site-packages/urllib3/fields.py": "e24ef9e64962ca25322c0216cc4bc923",
"build/assets/ba_data/python-site-packages/urllib3/filepost.py": "d0a96fd7614fcaa368b26d8a769ff848",
"build/assets/ba_data/python-site-packages/urllib3/http2.py": "c307bd4c486d10070770c320145eb33c",
"build/assets/ba_data/python-site-packages/urllib3/poolmanager.py": "6dd72a45419efb9a2ab4e58c527d84d5",
"build/assets/ba_data/python-site-packages/urllib3/response.py": "f9f74417b5c2b4e5812b473435e3f455",
"build/assets/ba_data/python-site-packages/urllib3/util/__init__.py": "3ef2c56aa3ccfc25f466dc767f191b2c",
"build/assets/ba_data/python-site-packages/urllib3/util/connection.py": "888aa8c2f0a4a76749e6c3fd0df597e2",
"build/assets/ba_data/python-site-packages/urllib3/util/proxy.py": "2de685261596886eb8e2655e1af9ce7b",
"build/assets/ba_data/python-site-packages/urllib3/util/request.py": "a1fb665c16fa443eef15db73c5e29917",
"build/assets/ba_data/python-site-packages/urllib3/util/response.py": "e6a942417aa97215e358ae97b53bafe6",
"build/assets/ba_data/python-site-packages/urllib3/util/retry.py": "4eeffe54c7d400c4af731f02ef3fb074",
"build/assets/ba_data/python-site-packages/urllib3/util/ssl_.py": "c1b929bdfba831479f4b2d1538954536",
"build/assets/ba_data/python-site-packages/urllib3/util/ssl_match_hostname.py": "cbb28520c901282629d47375af2dd717",
"build/assets/ba_data/python-site-packages/urllib3/util/ssltransport.py": "0a51cd95ce75673b6c1117cb22da18b1",
"build/assets/ba_data/python-site-packages/urllib3/util/timeout.py": "e3bc037067fd6aaed823955be6f1792d",
"build/assets/ba_data/python-site-packages/urllib3/util/url.py": "6a37bafe6598aecba9e034be2085f583",
"build/assets/ba_data/python-site-packages/urllib3/util/util.py": "95e6d2fa1b0f310a991612421f1a29a1",
"build/assets/ba_data/python-site-packages/urllib3/util/wait.py": "0fe73d2b5515a9c1ff2d43a83d5a419a",
"build/assets/ba_data/textures/achievementBoxer.dds": "5b5c461e67f3a92105b56fe264a7dd28", "build/assets/ba_data/textures/achievementBoxer.dds": "5b5c461e67f3a92105b56fe264a7dd28",
"build/assets/ba_data/textures/achievementBoxer.ktx": "1055e009423ea1d0bc3b172f9d7328bb", "build/assets/ba_data/textures/achievementBoxer.ktx": "1055e009423ea1d0bc3b172f9d7328bb",
"build/assets/ba_data/textures/achievementBoxer.pvr": "48f212189a6d83d29be410613b4f0005", "build/assets/ba_data/textures/achievementBoxer.pvr": "48f212189a6d83d29be410613b4f0005",
@ -4062,50 +4096,50 @@
"build/assets/windows/Win32/ucrtbased.dll": "2def5335207d41b21b9823f6805997f1", "build/assets/windows/Win32/ucrtbased.dll": "2def5335207d41b21b9823f6805997f1",
"build/assets/windows/Win32/vc_redist.x86.exe": "b08a55e2e77623fe657bea24f223a3ae", "build/assets/windows/Win32/vc_redist.x86.exe": "b08a55e2e77623fe657bea24f223a3ae",
"build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599", "build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599",
"build/prefab/full/linux_arm64_gui/debug/ballisticakit": "221f834ebd057ef663585d6ceef6806d", "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "f3045ecce09d6b02aa1143a63379f376",
"build/prefab/full/linux_arm64_gui/release/ballisticakit": "a2d8de14f13d4c3685fcaa317a7b27dc", "build/prefab/full/linux_arm64_gui/release/ballisticakit": "b2b23e2c86a0d8855047d39e4ce100f2",
"build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "39882077657944b36cf5491d43689329", "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "b0f07ceab1293255ba793bfcd8d9ce68",
"build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "7b0fd21a0cba86a1edfc41fa7f5b0336", "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "bf6c4be5753337a3a0ed32eac9081a41",
"build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "e652b60f054852cf0dd7efcafea4998d", "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "a2b3ed524a6355287303b5775ff11334",
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "5deab4167830ac91daac9146c3768e04", "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "4b90056bfa99a1816a56f9b53de33832",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "53171f039acbcb69a64983bc78cc3af9", "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "ca006356e178979499ce55f53c273218",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "bc906b8824309daab45cfdd64f4f75cc", "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "dcf0f076fd0ea67540f43b4bd41e3060",
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "c9d66aa3f870b4820ccb00ad87edd30e", "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "b9cf3cacf64f9539c97ccdd08c6d9211",
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "d99eeb561df547c8228110d66a90fbee", "build/prefab/full/mac_arm64_gui/release/ballisticakit": "698c12289c1906613169297872b1e552",
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "663c7ebd76302a57eeef8574f2244a70", "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "6ff0e52c7467d0f62bbee293fbb0ac65",
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "e73ac0a48a7921d5407cbabaa005a03a", "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "c1bf97907381bd2e82d3c0290dfcbda1",
"build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "bf05c75c4991e13b9246d7638b6a276a", "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "e0874cef443a76f7fc7b33ab7801838a",
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "0edc9540a699d9b7af0916e0d8b286b3", "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "c4542ae04345c472aeef9fa411cad2c1",
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "15e24928603d9b31bfdabdcb1129535c", "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "d6bf17052772c041dda3a7d0048f5804",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "a15e467a1d7a9a080952ee02194a85f9", "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "e0018525599f2e5b0ce9d3091799b6da",
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "f09896f99981cd6af58257e4bfbffa73", "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "175db7f5d22fe1d8f1c80fef4f7679e9",
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "deb4cdf43592b785f417d9e3992803ad", "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "d1817c7e638914e0362d598527fd0a04",
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "a46ba814582aef26306eb0811cd22d3f", "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "2779fdf6b5968e55a2c056427dbce007",
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "2352638cf37627c0cf9d11f8686194b7", "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "952860758eb4ccc9422b911a69ad9f7b",
"build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "ffe8631c0ccc03751b4346fcf52d70ca", "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "273ffd46a618fe347a570e6bd01d54a4",
"build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "4241e93e1ea18414ee900046d1a62517", "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "fa659b5d6119acba6570c92ce4d35ae2",
"build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "ffe8631c0ccc03751b4346fcf52d70ca", "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "273ffd46a618fe347a570e6bd01d54a4",
"build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "4241e93e1ea18414ee900046d1a62517", "build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "fa659b5d6119acba6570c92ce4d35ae2",
"build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "cd90771128eda8880ac3f9d8d9fc530b", "build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "712db7e1fcd065a3a22faddc0def8670",
"build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "093ec692aa3c6039ccc322d74f2d4448", "build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "4a4c19120f810ff5b4c7afbf11c23cf6",
"build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "cd90771128eda8880ac3f9d8d9fc530b", "build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "712db7e1fcd065a3a22faddc0def8670",
"build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "093ec692aa3c6039ccc322d74f2d4448", "build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "4a4c19120f810ff5b4c7afbf11c23cf6",
"build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "40f3006295c57114c2b5c467f463dd79", "build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "bbee8acd115ca24fc14146a9fc47c676",
"build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "9049a93c01002bea0e6a580a106939c3", "build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "8b68b56dda9a9f421823e653b752445a",
"build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "40f3006295c57114c2b5c467f463dd79", "build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "bbee8acd115ca24fc14146a9fc47c676",
"build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "9049a93c01002bea0e6a580a106939c3", "build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "8b68b56dda9a9f421823e653b752445a",
"build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "07ee17e424c0ea754fd4ec9844063460", "build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "3108eb4d3a41bde33702e22fb893b218",
"build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "0f34f852bf368c787f41533230767b3a", "build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "3e5c5fd0a09f55ba7b05ce1e2ec7171e",
"build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "1dcd03f0cfc75a53c3e682a3a46c96a0", "build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "1659535e95e3047fda529543e265ac97",
"build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "0f34f852bf368c787f41533230767b3a", "build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "3e5c5fd0a09f55ba7b05ce1e2ec7171e",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "67f48c2af7ec20dc98e6423d3ff24d67", "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "7d60528bda9b3e6abc046462da6e3e96",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "0b0319aa1bbf146e14fe8103abb23bd3", "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "bbbb1509630e43ed6d9f15a003369427",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "9102b512eaf6bcf21d1dbcb9c597dbe4", "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "4f0d8de7fcc754e2443a1b52b476e5f7",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "5dbc7599675f5cae378fcc24b8908e20", "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "448b0ef8b5b27a87f5993e9f75e93efa",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "eab27e872b8c3950b6bf9044fa3a42a2", "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "130605828f3d97c90e195cccce392d4d",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "d9b13c6efc258a4dabf158df63673b22", "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "d548df51f78261788404040a1a2921b9",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "27050ecb092d111cf013a561cfbb8c05", "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "96fc6408bd113f219a2289c1f2829a8a",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "a4d3c5812734e5780859e21c7398844a", "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "c57f7d3676b8c4abe9ee887dbbb0cc21",
"src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c", "src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c",
"src/assets/ba_data/python/babase/_mgen/enums.py": "cb299985623bbcc86015cb103a424ae6", "src/assets/ba_data/python/babase/_mgen/enums.py": "cb299985623bbcc86015cb103a424ae6",
"src/ballistica/base/mgen/pyembed/binding_base.inc": "efa61468cf098f77cc6a234461d8b86d", "src/ballistica/base/mgen/pyembed/binding_base.inc": "efa61468cf098f77cc6a234461d8b86d",

View File

@ -1,5 +1,16 @@
### 1.7.37 (build 21945, api 8, 2024-07-27) ### 1.7.37 (build 21947, api 8, 2024-07-31)
- Finally got things updated so language testing works again, and made it a bit
spiffier while at it. You now simply point the game at your test language and
it will update dynamically as you make edits; no need to download any files.
Example: if you are editing PirateSpeak, you should see an id such as
'PirateSpeak_2248' in the website url. You can then go to the game and run
`import babase; babase.app.lang.testlanguage('PirateSpeak_2248')` and you
should instantly see some lovely pirate-speak. Also, any changes you make on
the website should show up in the game within a few seconds. Enjoy!
- Added `urllib3` to our bundled third party Python modules. The engine will be
doing more heavy downloading with Asset Packages coming online so its time to
upgrade to a more modern web client library than Python's basic built in
urllib stuff.
### 1.7.36 (build 21944, api 8, 2024-07-26) ### 1.7.36 (build 21944, api 8, 2024-07-26)
- Wired up Tokens, BombSquad's new purchasable currency. The first thing these - Wired up Tokens, BombSquad's new purchasable currency. The first thing these
can be used for is storage packs on ballistica.net, but this will expand to can be used for is storage packs on ballistica.net, but this will expand to

View File

@ -2,7 +2,7 @@ cpplint==1.6.1
dmgbuild==1.6.1 dmgbuild==1.6.1
filelock==3.15.4 filelock==3.15.4
furo==2024.7.18 furo==2024.7.18
mypy==1.11.0 mypy==1.11.1
pbxproj==4.2.0 pbxproj==4.2.0
pdoc==14.6.0 pdoc==14.6.0
pur==7.3.2 pur==7.3.2
@ -19,3 +19,4 @@ types-certifi==2021.10.8.3
types-filelock==3.2.7 types-filelock==3.2.7
types-requests==2.32.0.20240712 types-requests==2.32.0.20240712
typing_extensions==4.12.2 typing_extensions==4.12.2
urllib3==2.2.2

View File

@ -953,6 +953,74 @@
"ba_data/python-site-packages/certifi/cacert.pem", "ba_data/python-site-packages/certifi/cacert.pem",
"ba_data/python-site-packages/certifi/core.py", "ba_data/python-site-packages/certifi/core.py",
"ba_data/python-site-packages/typing_extensions.py", "ba_data/python-site-packages/typing_extensions.py",
"ba_data/python-site-packages/urllib3/__init__.py",
"ba_data/python-site-packages/urllib3/__pycache__/__init__.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/__pycache__/_base_connection.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/__pycache__/_collections.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/__pycache__/_request_methods.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/__pycache__/_version.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/__pycache__/connection.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/__pycache__/connectionpool.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/__pycache__/exceptions.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/__pycache__/fields.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/__pycache__/filepost.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/__pycache__/http2.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/__pycache__/poolmanager.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/__pycache__/response.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/_base_connection.py",
"ba_data/python-site-packages/urllib3/_collections.py",
"ba_data/python-site-packages/urllib3/_request_methods.py",
"ba_data/python-site-packages/urllib3/_version.py",
"ba_data/python-site-packages/urllib3/connection.py",
"ba_data/python-site-packages/urllib3/connectionpool.py",
"ba_data/python-site-packages/urllib3/contrib/__init__.py",
"ba_data/python-site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/contrib/__pycache__/socks.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/contrib/emscripten/__init__.py",
"ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/contrib/emscripten/connection.py",
"ba_data/python-site-packages/urllib3/contrib/emscripten/fetch.py",
"ba_data/python-site-packages/urllib3/contrib/emscripten/request.py",
"ba_data/python-site-packages/urllib3/contrib/emscripten/response.py",
"ba_data/python-site-packages/urllib3/contrib/pyopenssl.py",
"ba_data/python-site-packages/urllib3/contrib/socks.py",
"ba_data/python-site-packages/urllib3/exceptions.py",
"ba_data/python-site-packages/urllib3/fields.py",
"ba_data/python-site-packages/urllib3/filepost.py",
"ba_data/python-site-packages/urllib3/http2.py",
"ba_data/python-site-packages/urllib3/poolmanager.py",
"ba_data/python-site-packages/urllib3/response.py",
"ba_data/python-site-packages/urllib3/util/__init__.py",
"ba_data/python-site-packages/urllib3/util/__pycache__/__init__.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/util/__pycache__/connection.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/util/__pycache__/proxy.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/util/__pycache__/request.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/util/__pycache__/response.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/util/__pycache__/retry.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/util/__pycache__/ssl_.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/util/__pycache__/timeout.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/util/__pycache__/url.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/util/__pycache__/util.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/util/__pycache__/wait.cpython-312.opt-1.pyc",
"ba_data/python-site-packages/urllib3/util/connection.py",
"ba_data/python-site-packages/urllib3/util/proxy.py",
"ba_data/python-site-packages/urllib3/util/request.py",
"ba_data/python-site-packages/urllib3/util/response.py",
"ba_data/python-site-packages/urllib3/util/retry.py",
"ba_data/python-site-packages/urllib3/util/ssl_.py",
"ba_data/python-site-packages/urllib3/util/ssl_match_hostname.py",
"ba_data/python-site-packages/urllib3/util/ssltransport.py",
"ba_data/python-site-packages/urllib3/util/timeout.py",
"ba_data/python-site-packages/urllib3/util/url.py",
"ba_data/python-site-packages/urllib3/util/util.py",
"ba_data/python-site-packages/urllib3/util/wait.py",
"ba_data/textures/achievementBoxer.dds", "ba_data/textures/achievementBoxer.dds",
"ba_data/textures/achievementBoxer.ktx", "ba_data/textures/achievementBoxer.ktx",
"ba_data/textures/achievementBoxer.pvr", "ba_data/textures/achievementBoxer.pvr",

View File

@ -2706,6 +2706,40 @@ SCRIPT_TARGETS_PY_PRIVATE_COMMON = \
$(BUILD_DIR)/ba_data/python-site-packages/certifi/__main__.py \ $(BUILD_DIR)/ba_data/python-site-packages/certifi/__main__.py \
$(BUILD_DIR)/ba_data/python-site-packages/certifi/core.py \ $(BUILD_DIR)/ba_data/python-site-packages/certifi/core.py \
$(BUILD_DIR)/ba_data/python-site-packages/typing_extensions.py \ $(BUILD_DIR)/ba_data/python-site-packages/typing_extensions.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__init__.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/_base_connection.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/_collections.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/_request_methods.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/_version.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/connection.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/connectionpool.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/__init__.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/__init__.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/connection.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/fetch.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/request.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/response.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/pyopenssl.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/socks.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/exceptions.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/fields.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/filepost.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/http2.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/poolmanager.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/response.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__init__.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/connection.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/proxy.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/request.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/response.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/retry.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/ssl_.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/ssl_match_hostname.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/ssltransport.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/timeout.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/url.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/util.py \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/wait.py \
$(BUILD_DIR)/sphinx/static/conf.py $(BUILD_DIR)/sphinx/static/conf.py
SCRIPT_TARGETS_PYC_PRIVATE_COMMON = \ SCRIPT_TARGETS_PYC_PRIVATE_COMMON = \
@ -2713,6 +2747,40 @@ SCRIPT_TARGETS_PYC_PRIVATE_COMMON = \
$(BUILD_DIR)/ba_data/python-site-packages/certifi/__pycache__/__main__.cpython-312.opt-1.pyc \ $(BUILD_DIR)/ba_data/python-site-packages/certifi/__pycache__/__main__.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/certifi/__pycache__/core.cpython-312.opt-1.pyc \ $(BUILD_DIR)/ba_data/python-site-packages/certifi/__pycache__/core.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/__pycache__/typing_extensions.cpython-312.opt-1.pyc \ $(BUILD_DIR)/ba_data/python-site-packages/__pycache__/typing_extensions.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/__init__.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/_base_connection.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/_collections.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/_request_methods.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/_version.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/connection.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/connectionpool.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/__pycache__/socks.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/exceptions.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/fields.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/filepost.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/http2.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/poolmanager.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/response.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/__init__.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/connection.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/proxy.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/request.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/response.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/retry.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/ssl_.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/timeout.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/url.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/util.cpython-312.opt-1.pyc \
$(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/wait.cpython-312.opt-1.pyc \
$(BUILD_DIR)/sphinx/static/__pycache__/conf.cpython-312.opt-1.pyc $(BUILD_DIR)/sphinx/static/__pycache__/conf.cpython-312.opt-1.pyc
# Rule to copy src asset scripts to dst. # Rule to copy src asset scripts to dst.

View File

@ -6,6 +6,7 @@ from __future__ import annotations
import os import os
import json import json
import logging import logging
from functools import partial
from typing import TYPE_CHECKING, overload, override from typing import TYPE_CHECKING, overload, override
import _babase import _babase
@ -32,6 +33,7 @@ class LanguageSubsystem(AppSubsystem):
self._language: str | None = None self._language: str | None = None
self._language_target: AttrDict | None = None self._language_target: AttrDict | None = None
self._language_merged: AttrDict | None = None self._language_merged: AttrDict | None = None
self._test_timer: babase.AppTimer | None = None
@property @property
def locale(self) -> str: def locale(self) -> str:
@ -93,9 +95,44 @@ class LanguageSubsystem(AppSubsystem):
name for name in names if self._can_display_language(name) name for name in names if self._can_display_language(name)
) )
def testlanguage(self, langid: str) -> None:
"""Set the app to test an in-progress language.
Pass a language id from the translation editor website as 'langid';
something like 'Gibberish_3263'. Once set to testing, the engine
will repeatedly download and apply that same test language, so
changes can be made to it and observed live.
"""
print(
f'Language test mode enabled.'
f' Will fetch and apply \'{langid}\' every 5 seconds,'
f' so you can see your changes live.'
)
self._test_timer = _babase.AppTimer(
5.0, partial(self._update_test_language, langid), repeat=True
)
self._update_test_language(langid)
def _on_test_lang_response(
self, langid: str, response: None | dict[str, Any]
) -> None:
if response is None:
return
self.setlanguage(response)
print(f'Fetched and applied {langid}.')
def _update_test_language(self, langid: str) -> None:
if _babase.app.classic is None:
raise RuntimeError('This requires classic.')
_babase.app.classic.master_server_v1_get(
'bsLangGet',
{'lang': langid, 'format': 'json'},
partial(self._on_test_lang_response, langid),
)
def setlanguage( def setlanguage(
self, self,
language: str | None, language: str | dict | None,
print_change: bool = True, print_change: bool = True,
store_to_config: bool = True, store_to_config: bool = True,
) -> None: ) -> None:
@ -110,18 +147,6 @@ class LanguageSubsystem(AppSubsystem):
cfg = _babase.app.config cfg = _babase.app.config
cur_language = cfg.get('Lang', None) cur_language = cfg.get('Lang', None)
# Store this in the config if its changing.
if language != cur_language and store_to_config:
if language is None:
if 'Lang' in cfg:
del cfg['Lang'] # Clear it out for default.
else:
cfg['Lang'] = language
cfg.commit()
switched = True
else:
switched = False
with open( with open(
os.path.join( os.path.join(
_babase.app.env.data_directory, _babase.app.env.data_directory,
@ -134,32 +159,55 @@ class LanguageSubsystem(AppSubsystem):
) as infile: ) as infile:
lenglishvalues = json.loads(infile.read()) lenglishvalues = json.loads(infile.read())
# None implies default. # Special case - passing a complete dict for testing.
if language is None: if isinstance(language, dict):
language = self.default_language self._language = 'Custom'
try: lmodvalues = language
if language == 'English':
lmodvalues = None
else:
lmodfile = os.path.join(
_babase.app.env.data_directory,
'ba_data',
'data',
'languages',
language.lower() + '.json',
)
with open(lmodfile, encoding='utf-8') as infile:
lmodvalues = json.loads(infile.read())
except Exception:
logging.exception("Error importing language '%s'.", language)
_babase.screenmessage(
f"Error setting language to '{language}'; see log for details.",
color=(1, 0, 0),
)
switched = False switched = False
lmodvalues = None print_change = False
store_to_config = False
else:
# Ok, we're setting a real language.
self._language = language # Store this in the config if its changing.
if language != cur_language and store_to_config:
if language is None:
if 'Lang' in cfg:
del cfg['Lang'] # Clear it out for default.
else:
cfg['Lang'] = language
cfg.commit()
switched = True
else:
switched = False
# None implies default.
if language is None:
language = self.default_language
try:
if language == 'English':
lmodvalues = None
else:
lmodfile = os.path.join(
_babase.app.env.data_directory,
'ba_data',
'data',
'languages',
language.lower() + '.json',
)
with open(lmodfile, encoding='utf-8') as infile:
lmodvalues = json.loads(infile.read())
except Exception:
logging.exception("Error importing language '%s'.", language)
_babase.screenmessage(
f"Error setting language to '{language}';"
f' see log for details.',
color=(1, 0, 0),
)
switched = False
lmodvalues = None
self._language = language
# Create an attrdict of *just* our target language. # Create an attrdict of *just* our target language.
self._language_target = AttrDict() self._language_target = AttrDict()
@ -207,6 +255,7 @@ class LanguageSubsystem(AppSubsystem):
random_names = [n for n in random_names if n != ''] random_names = [n for n in random_names if n != '']
_babase.set_internal_language_keys(internal_vals, random_names) _babase.set_internal_language_keys(internal_vals, random_names)
if switched and print_change: if switched and print_change:
assert isinstance(language, str)
_babase.screenmessage( _babase.screenmessage(
Lstr( Lstr(
resource='languageSetText', resource='languageSetText',

View File

@ -4,11 +4,13 @@
from __future__ import annotations from __future__ import annotations
import ssl import ssl
import socket
import threading import threading
import ipaddress
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
if TYPE_CHECKING: if TYPE_CHECKING:
import socket pass
# Timeout for standard functions talking to the master-server/etc. # Timeout for standard functions talking to the master-server/etc.
DEFAULT_REQUEST_TIMEOUT_SECONDS = 60 DEFAULT_REQUEST_TIMEOUT_SECONDS = 60
@ -18,6 +20,10 @@ class NetworkSubsystem:
"""Network related app subsystem.""" """Network related app subsystem."""
def __init__(self) -> None: def __init__(self) -> None:
# Our shared SSL context. Creating these can be expensive so we
# create it here once and recycle for our various connections.
self.sslcontext = ssl.create_default_context()
# Anyone accessing/modifying zone_pings should hold this lock, # Anyone accessing/modifying zone_pings should hold this lock,
# as it is updated by a background thread. # as it is updated by a background thread.
self.zone_pings_lock = threading.Lock() self.zone_pings_lock = threading.Lock()
@ -27,8 +33,6 @@ class NetworkSubsystem:
# that a nearby server has been pinged. # that a nearby server has been pinged.
self.zone_pings: dict[str, float] = {} self.zone_pings: dict[str, float] = {}
self._sslcontext: ssl.SSLContext | None = None
# For debugging. # For debugging.
self.v1_test_log: str = '' self.v1_test_log: str = ''
self.v1_ctest_results: dict[int, str] = {} self.v1_ctest_results: dict[int, str] = {}
@ -36,42 +40,12 @@ class NetworkSubsystem:
self.transport_state = 'uninited' self.transport_state = 'uninited'
self.server_time_offset_hours: float | None = None self.server_time_offset_hours: float | None = None
@property
def sslcontext(self) -> ssl.SSLContext:
"""Create/return our shared SSLContext.
This can be reused for all standard urllib requests/etc.
"""
# Note: I've run into older Android devices taking upwards of 1 second
# to put together a default SSLContext, so recycling one can definitely
# be a worthwhile optimization. This was suggested to me in this
# thread by one of Python's SSL maintainers:
# https://github.com/python/cpython/issues/94637
if self._sslcontext is None:
self._sslcontext = ssl.create_default_context()
return self._sslcontext
def get_ip_address_type(addr: str) -> socket.AddressFamily: def get_ip_address_type(addr: str) -> socket.AddressFamily:
"""Return socket.AF_INET6 or socket.AF_INET4 for the provided address.""" """Return socket.AF_INET6 or socket.AF_INET4 for the provided address."""
import socket
socket_type = None version = ipaddress.ip_address(addr).version
if version == 4:
# First try it as an ipv4 address. return socket.AF_INET
try: assert version == 6
socket.inet_pton(socket.AF_INET, addr) return socket.AF_INET6
socket_type = socket.AF_INET
except OSError:
pass
# Hmm apparently not ipv4; try ipv6.
if socket_type is None:
try:
socket.inet_pton(socket.AF_INET6, addr)
socket_type = socket.AF_INET6
except OSError:
pass
if socket_type is None:
raise ValueError(f'addr seems to be neither v4 or v6: {addr}')
return socket_type

View File

@ -96,13 +96,9 @@ class MasterServerV1CallThread(threading.Thread):
self._data = babase.utf8_all(self._data) self._data = babase.utf8_all(self._data)
babase.set_thread_name('BA_ServerCallThread') babase.set_thread_name('BA_ServerCallThread')
if self._request_type == 'get': if self._request_type == 'get':
url = ( msaddr = plus.get_master_server_address()
plus.get_master_server_address() dataenc = urllib.parse.urlencode(self._data)
+ '/' url = f'{msaddr}/{self._request}?{dataenc}'
+ self._request
+ '?'
+ urllib.parse.urlencode(self._data)
)
assert url is not None assert url is not None
response = urllib.request.urlopen( response = urllib.request.urlopen(
urllib.request.Request( urllib.request.Request(
@ -114,7 +110,7 @@ class MasterServerV1CallThread(threading.Thread):
timeout=babase.DEFAULT_REQUEST_TIMEOUT_SECONDS, timeout=babase.DEFAULT_REQUEST_TIMEOUT_SECONDS,
) )
elif self._request_type == 'post': elif self._request_type == 'post':
url = plus.get_master_server_address() + '/' + self._request url = f'{plus.get_master_server_address()}/{self._request}'
assert url is not None assert url is not None
response = urllib.request.urlopen( response = urllib.request.urlopen(
urllib.request.Request( urllib.request.Request(

View File

@ -52,7 +52,7 @@ if TYPE_CHECKING:
# Build number and version of the ballistica binary we expect to be # Build number and version of the ballistica binary we expect to be
# using. # using.
TARGET_BALLISTICA_BUILD = 21945 TARGET_BALLISTICA_BUILD = 21947
TARGET_BALLISTICA_VERSION = '1.7.37' TARGET_BALLISTICA_VERSION = '1.7.37'

View File

@ -39,7 +39,7 @@ auto main(int argc, char** argv) -> int {
namespace ballistica { namespace ballistica {
// These are set automatically via script; don't modify them here. // These are set automatically via script; don't modify them here.
const int kEngineBuildNumber = 21945; const int kEngineBuildNumber = 21947;
const char* kEngineVersion = "1.7.37"; const char* kEngineVersion = "1.7.37";
const int kEngineApiVersion = 8; const int kEngineApiVersion = 8;

View File

@ -40,3 +40,15 @@ class LoginType(Enum):
return 'Google Play Games' return 'Google Play Games'
case cls.GAME_CENTER: case cls.GAME_CENTER:
return 'Game Center' return 'Game Center'
@property
def displaynameshort(self) -> str:
"""Human readable name for this value."""
cls = type(self)
match self:
case cls.EMAIL:
return 'Email'
case cls.GPGS:
return 'GPGS'
case cls.GAME_CENTER:
return 'Game Center'