diff --git a/.efrocachemap b/.efrocachemap index 5c14db1d..f676f1b1 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -420,7 +420,7 @@ "assets/build/ba_data/audio/zoeOw.ogg": "https://files.ballistica.net/cache/ba1/d5/f8/de3b22ac60d0caee44369117c8db", "assets/build/ba_data/audio/zoePickup01.ogg": "https://files.ballistica.net/cache/ba1/c7/37/660e2ceca8b9b2db2cfce5a9f6f0", "assets/build/ba_data/audio/zoeScream01.ogg": "https://files.ballistica.net/cache/ba1/d9/82/92157cb4f21fdd8c911eec910ad4", - "assets/build/ba_data/data/langdata.json": "https://files.ballistica.net/cache/ba1/d0/6f/c2718eee7a68ac8acc1b884db2b3", + "assets/build/ba_data/data/langdata.json": "https://files.ballistica.net/cache/ba1/50/bb/39239d1860008e70b3205f2d4767", "assets/build/ba_data/data/languages/arabic.json": "https://files.ballistica.net/cache/ba1/ec/97/713007418488dd543cf6edcdd9d2", "assets/build/ba_data/data/languages/belarussian.json": "https://files.ballistica.net/cache/ba1/61/03/89070ca765e06da3a419a579f503", "assets/build/ba_data/data/languages/chinese.json": "https://files.ballistica.net/cache/ba1/6f/88/b74dac280d4dbd07dea74abb5fc6", @@ -431,8 +431,8 @@ "assets/build/ba_data/data/languages/dutch.json": "https://files.ballistica.net/cache/ba1/68/93/da8e9874f41a786edf52ba4ccaad", "assets/build/ba_data/data/languages/english.json": "https://files.ballistica.net/cache/ba1/c0/03/106450033fe01fba06d733b6b107", "assets/build/ba_data/data/languages/esperanto.json": "https://files.ballistica.net/cache/ba1/4c/c7/0184b8178869d1a3827a1bfcd5bb", - "assets/build/ba_data/data/languages/filipino.json": "https://files.ballistica.net/cache/ba1/10/45/197ea6179209f0aa440fe5366a95", - "assets/build/ba_data/data/languages/french.json": "https://files.ballistica.net/cache/ba1/b1/71/34760e818883dfec12b9dde3deab", + "assets/build/ba_data/data/languages/filipino.json": "https://files.ballistica.net/cache/ba1/69/ee/bd7ab2f7da13e65efc46a9e5f78e", + "assets/build/ba_data/data/languages/french.json": "https://files.ballistica.net/cache/ba1/49/42/328c5ed7a47a5e9c44a1c11bb2f4", "assets/build/ba_data/data/languages/german.json": "https://files.ballistica.net/cache/ba1/7e/9c/11e9717282006b4cd8cfc02f0764", "assets/build/ba_data/data/languages/gibberish.json": "https://files.ballistica.net/cache/ba1/23/b6/8f7175147d8a6d5de45c2147e294", "assets/build/ba_data/data/languages/greek.json": "https://files.ballistica.net/cache/ba1/82/eb/37ff44af76812097f9c98f05c730", @@ -443,7 +443,7 @@ "assets/build/ba_data/data/languages/korean.json": "https://files.ballistica.net/cache/ba1/07/37/ab65ccee3a555bd40e9661860c58", "assets/build/ba_data/data/languages/persian.json": "https://files.ballistica.net/cache/ba1/bf/71/11141b8a8c92604da47c7c575034", "assets/build/ba_data/data/languages/polish.json": "https://files.ballistica.net/cache/ba1/76/be/84e567de0aabd9f9145b62179c2c", - "assets/build/ba_data/data/languages/portuguese.json": "https://files.ballistica.net/cache/ba1/a6/ad/7ee52772db14f9008044bb877ed1", + "assets/build/ba_data/data/languages/portuguese.json": "https://files.ballistica.net/cache/ba1/23/18/33f3364310ccc4c03930e2ac50b0", "assets/build/ba_data/data/languages/romanian.json": "https://files.ballistica.net/cache/ba1/d7/06/9d70642d0a4d1e3b1c2149d7a17c", "assets/build/ba_data/data/languages/russian.json": "https://files.ballistica.net/cache/ba1/8d/8a/dc288451eb6a1120a5868d64b771", "assets/build/ba_data/data/languages/serbian.json": "https://files.ballistica.net/cache/ba1/4e/91/6f2a9a3ce733908e91377a6ddb9a", @@ -452,8 +452,8 @@ "assets/build/ba_data/data/languages/swedish.json": "https://files.ballistica.net/cache/ba1/91/0a/35c4baf539d5951fc03a794c0e0b", "assets/build/ba_data/data/languages/tamil.json": "https://files.ballistica.net/cache/ba1/41/a4/841ab82927c41a6bc8fc9ae5ea11", "assets/build/ba_data/data/languages/thai.json": "https://files.ballistica.net/cache/ba1/9d/51/f699dbd4beb88bc3cff699a287a7", - "assets/build/ba_data/data/languages/turkish.json": "https://files.ballistica.net/cache/ba1/c0/4e/c8a66ed415b8b0ce3ff30462b2a2", - "assets/build/ba_data/data/languages/ukrainian.json": "https://files.ballistica.net/cache/ba1/7f/bb/6239adeb551be5e09f3457d7b411", + "assets/build/ba_data/data/languages/turkish.json": "https://files.ballistica.net/cache/ba1/37/30/ba543ac18fa6c7f9721942d6984f", + "assets/build/ba_data/data/languages/ukrainian.json": "https://files.ballistica.net/cache/ba1/ab/35/644e4239cfa62a597a905412b90c", "assets/build/ba_data/data/languages/venetian.json": "https://files.ballistica.net/cache/ba1/7c/98/c0f7c965a3ac36d86cc17f55428f", "assets/build/ba_data/data/languages/vietnamese.json": "https://files.ballistica.net/cache/ba1/f2/af/afd1503c7a10cacaa15bc02369b2", "assets/build/ba_data/data/maps/big_g.json": "https://files.ballistica.net/cache/ba1/47/0a/a617cc85d927b576c4e6fc1091ed", @@ -3995,50 +3995,50 @@ "assets/src/ba_data/python/ba/_generated/__init__.py": "https://files.ballistica.net/cache/ba1/ee/e8/cad05aa531c7faf7ff7b96db7f6e", "assets/src/ba_data/python/ba/_generated/enums.py": "https://files.ballistica.net/cache/ba1/b2/e5/0ee0561e16257a32830645239f34", "ballisticacore-windows/Generic/BallisticaCore.ico": "https://files.ballistica.net/cache/ba1/89/c0/e32c7d2a35dc9aef57cc73b0911a", - "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/a4/c9/4b7f9effbe8c100648900eaa3261", - "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/00/9b/eaa284f779a3de4213b79cd92107", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/42/55/3cb41badd1d45910283e0b64df88", - "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/95/ff/5c57780407fcb6b7feb0764706df", - "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/d8/40/839b1117d4f93b054eb85cb1b0d5", - "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/bc/15/56d8be246fe39a106db0439833b3", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a9/05/27ca686143f14394c1b8837d7cb2", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a5/86/afe3eee3898e9c9fb189f3b77e85", - "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/ff/95/de9839cdfec8f326131aa05384c3", - "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/e2/26/17c4ae54581e4b5c0330b0719224", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a4/4c/b89ec4327945297f4d72f9d80d94", - "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/4c/c6/55b8ba4e0b5c8975712fa0fd1767", - "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/0b/8b/05d548a8a72955c0cb386d9d60b3", - "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/60/27/721444bbebc52a864d8a04b2208c", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e2/f2/25cff5d0e4f918a9f6d57dfa5285", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/da/82/ec893df8e6ee94feed9ddb759e6e", - "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/46/6c/eb3d14ac4a6c363962a8066e39e5", - "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/54/b4/4f9767d0cea37f328844507e8ea7", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/ff/b6/401674aa0a886de14f437947b728", - "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/2d/6d/5f1c3004f2bf9258162379e26054", - "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/05/99/3cadc83ce9288f9352a3a4a5559c", - "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/7a/c2/1c132470c13fc8af1f5d94dfbf6c", - "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/98/a6/42ee7341d4a75c5d58f80d2f4dbc", - "build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3a/b9/f01ad696e634735773da5f841407", - "build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/06/8d/27bfcaedab349160f55ce618384e", - "build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/e3/74/6c47384a303b68378a80e6d00bac", - "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3c/2c/7eb58e0a6678fe13271ec4e1689f", - "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ce/a4/37f7da427da665e42b23689ee2b1", - "build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/aa/d3/c1f6f9b2487397ff3b8deacdfb88", - "build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a0/d1/065efb021ade658501fe3ccbd238", - "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/7c/6e/116acc4f5c4d51608f56a74a1a35", - "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a3/59/9765f24b69af3382eb1ba72a175e", - "build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/23/e7/978c348d104ad002d3cc0cef17e9", - "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d1/27/1635e8fd16e9e21e673f5cba7eb3", - "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/fa/f1/9f93bc6fa9bbdc6547414528b22c", - "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/4d/a7/b764b6fc1ac50a426e8fec3238df", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/91/d3/9689394fc2464ae3b0be6fb662ca", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/15/2c/29c2e9c783211c5184dc012a7e2a", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/30/84/1b5e42cc51d43c7c0ad256a5d0b8", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/5e/9c/726f930f02dece54d7f1e9be1565", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/c5/9b/fab63617403f92c0eb3af53c5ceb", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/92/b1/79f2c94d070fa8d5a279f67429c8", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/ab/72/2f6f56a9a47658b1b8ffbdd323ca", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/a7/82/3943a555db1dc3e2ca1ac281248b", + "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/76/4a/06e99575caeee5cf7273599ec9f0", + "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/4c/af/00c9c503d3f33bdadfb87a14095b", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/74/1c/2ba86b3d3de80ed1d15f0d326260", + "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/77/f5/604119cad298810d443e696ee4a3", + "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/a3/87/4528de33dd1076f2a3bf535b8508", + "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/8a/c1/c6d51855fe24f16dad77cc45ef47", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/7f/5e/8897da98948c320f17faf8ea0656", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/63/30/a032035c499475cd0d55e281a7d7", + "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/ae/06/59efc32e87d3283c7de7e7e85888", + "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/e3/48/b1d8a1628c5d28237d52f8759c48", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/32/1b/f4acb08ea6b95129bd23e703ca49", + "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/0a/fc/6a216a4dd65d0e824f9fdf2244c9", + "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/6c/cf/453f32b097cf9265a884842ac405", + "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/58/92/6b1a58f3ba98a938f1dd6ca004dd", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/40/5f/6004485ca667cb2eef90095d3dbb", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d5/51/6049fc3c679136584cbf5ad75d02", + "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/c4/11/9107ce942c7271450ecacdd422df", + "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/e2/86/5c5ebf6c9ee05c38e3d426625ebf", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/1a/85/3fe1abb3209341ef039725477a51", + "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/77/10/9c8e7c5e6be88532ca2819690d39", + "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/98/21/935d1bb99fd8bb84b012028759ec", + "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a4/c1/3cb0db41ee9daccb07aa525d3a71", + "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/47/e0/0dbe6c9fb6c31c4826b2d9243ed8", + "build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/16/d0/dd7a518e6fd1e022d77c036fffde", + "build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a8/c9/257b60004447d6ceb5b8ad1f902c", + "build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/93/95/9f971fe4eed57cccf67e3f575a18", + "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/56/42/4ccb8b84ef56f2741520c5b1271a", + "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/46/1f/efb3c908285041971a0000a3fbba", + "build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/47/3a/f8335b21bdbf5069c4b46e154306", + "build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/98/99/0a5eb773681f20b08aa22e487804", + "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/9e/ea/c6a322e0ea311fd586c96e84d5db", + "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/19/3e/8ae66894c429a5a31bb278f2ae23", + "build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d8/40/24d727e0a25c6e3254f168b89602", + "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d5/f6/e235ab00e48d060949896936ea45", + "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/fe/59/c4f1e0815cdd4bf52399bc8b9ac8", + "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d8/4e/4e2e9eb401e21118b543cc267bc7", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/96/16/a5eaac79ea7ca52f963deaa39787", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/7e/80/44ea5ce953d612b27031f0d9ef3b", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/44/ef/1d29afdaaa33d39f67a3daffc34b", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/ac/8e/aa6977c496137c902695cf1953af", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/e1/5f/2c08ba18c967621fcc297982885c", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/9a/ab/1539aa9be0ad2ab44d0d85f20818", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/b5/e8/3519ffee6476c14130b658c63931", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/d2/55/eeb0bc76a02454ca14fb70775a68", "src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/7d/3e/229a581cb2454ed856f1d8b564a7", "src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/d3/db/e73d4dcf1280d5f677c3cf8b47c3" } \ No newline at end of file diff --git a/.idea/inspectionProfiles/Default.xml b/.idea/inspectionProfiles/Default.xml index 9b9ab7b0..dfbc3464 100644 --- a/.idea/inspectionProfiles/Default.xml +++ b/.idea/inspectionProfiles/Default.xml @@ -109,6 +109,7 @@ diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f12be64..253842d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.5 (20653, 2022-07-15) +### 1.7.5 (20654, 2022-07-18) - Android build now uses the ReLinker library to load the native main.so, which will (hopefully) avoid some random load failures on older Android versions. - Android Google Play build now prints a message at launch if the billing library isn't available or needs to be updated (explaining why purchases won't work in that case). - Various minor bug fixes (mostly cleaning up unnecessary error logging) diff --git a/src/ballistica/ballistica.cc b/src/ballistica/ballistica.cc index b8446a2a..9a837d22 100644 --- a/src/ballistica/ballistica.cc +++ b/src/ballistica/ballistica.cc @@ -21,7 +21,7 @@ namespace ballistica { // These are set automatically via script; don't modify them here. -const int kAppBuildNumber = 20653; +const int kAppBuildNumber = 20654; const char* kAppVersion = "1.7.5"; // Our standalone globals. diff --git a/tests/test_efro/test_message.py b/tests/test_efro/test_message.py index e5a2222c..185ca140 100644 --- a/tests/test_efro/test_message.py +++ b/tests/test_efro/test_message.py @@ -9,9 +9,10 @@ import asyncio from typing import TYPE_CHECKING, overload from dataclasses import dataclass +from typing_extensions import assert_type import pytest -from efrotools.statictest import static_type_equals +# from efrotools.statictest import static_type_equals from efro.error import CleanError, RemoteError, CommunicationError from efro.dataclassio import ioprepped from efro.message import (Message, Response, MessageProtocol, MessageSender, @@ -898,8 +899,10 @@ def test_full_pipeline() -> None: # Make sure static typing lines up with what we expect. if os.environ.get('EFRO_TEST_MESSAGE_FAST') != '1': - assert static_type_equals(response1, _TResp1) - assert static_type_equals(response3, None) + # assert static_type_equals(response1, _TResp1) + assert_type(response1, _TResp1) + # assert static_type_equals(response3, None) + assert_type(response3, None) assert isinstance(response1, _TResp1) assert isinstance(response2, (_TResp1, _TResp2)) @@ -935,7 +938,8 @@ def test_full_pipeline() -> None: # Make sure static typing lines up with what we expect. if os.environ.get('EFRO_TEST_MESSAGE_FAST') != '1': - assert static_type_equals(response6, _TResp1) + # assert static_type_equals(response6, _TResp1) + assert_type(response6, _TResp1) # Now test adding extra data to messages. This should be transferred # into the encoded message, copied to the response, and again back diff --git a/tools/batools/build.py b/tools/batools/build.py index 8d70913b..e55bb035 100644 --- a/tools/batools/build.py +++ b/tools/batools/build.py @@ -38,8 +38,8 @@ class PipRequirement: # installing it. And as far as manually-installed bits, pip itself must # have some way to allow for that, right?... PIP_REQUIREMENTS = [ - PipRequirement(modulename='pylint', minversion=[2, 14, 4]), - PipRequirement(modulename='mypy', minversion=[0, 961]), + PipRequirement(modulename='pylint', minversion=[2, 14, 5]), + PipRequirement(modulename='mypy', minversion=[0, 971]), PipRequirement(modulename='yapf', minversion=[0, 32, 0]), PipRequirement(modulename='cpplint', minversion=[1, 6, 0]), PipRequirement(modulename='pytest', minversion=[7, 1, 2]), @@ -49,10 +49,10 @@ PIP_REQUIREMENTS = [ PipRequirement(modulename='requests'), PipRequirement(modulename='pdoc'), PipRequirement(pipname='typing_extensions', minversion=[4, 3, 0]), - PipRequirement(pipname='types-filelock', minversion=[3, 2, 6]), - PipRequirement(pipname='types-requests', minversion=[2, 27, 29]), - PipRequirement(pipname='types-pytz', minversion=[2021, 3, 8]), - PipRequirement(pipname='types-PyYAML', minversion=[6, 0, 7]), + PipRequirement(pipname='types-filelock', minversion=[3, 2, 7]), + PipRequirement(pipname='types-requests', minversion=[2, 28, 2]), + PipRequirement(pipname='types-pytz', minversion=[2022, 1, 2]), + PipRequirement(pipname='types-PyYAML', minversion=[6, 0, 10]), PipRequirement(pipname='certifi', minversion=[2022, 6, 15]), PipRequirement(pipname='types-certifi', minversion=[2021, 10, 8, 3]), ] diff --git a/tools/efrotools/statictest.py b/tools/efrotools/statictest.py deleted file mode 100644 index e7f55414..00000000 --- a/tools/efrotools/statictest.py +++ /dev/null @@ -1,229 +0,0 @@ -# Released under the MIT License. See LICENSE for details. -# -"""Functionality for harnessing mypy for static type checking in unit tests.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING -import tempfile -import os -import subprocess -import logging - -if TYPE_CHECKING: - from typing import Any - -# Global state: -# We maintain a single temp dir where our mypy cache and our temp -# test files live. Every time we are asked to static-check a line -# in a file we haven't seen yet, we copy it into the temp dir, -# filter it a bit to add reveal_type() statements, and run mypy on it. -# The temp dir should tear itself down when Python exits. -_tempdir: str | None = None -_statictestfiles: dict[str, StaticTestFile] = {} -_nextfilenum: int = 1 - - -class StaticTestFile: - """A file which has been statically tested via mypy.""" - - def __init__(self, filename: str): - # pylint: disable=global-statement, invalid-name - global _tempdir, _nextfilenum - # pylint: enable=global-statement, invalid-name - - from efrotools import PYTHON_BIN - - self._filename = filename - self.modulename = f'temp{_nextfilenum}' - _nextfilenum += 1 - - # Types we *want* for lines - self.linetypes_wanted: dict[int, str] = {} - - # Types Mypy gave us for lines - self.linetypes_mypy: dict[int, str] = {} - - print(f'Running Mypy static testing on "{filename}"...') - with open(filename, 'r', encoding='utf-8') as infile: - fdata = infile.read() - - # Make sure we're running where the config is.. - if not os.path.isfile('.mypy.ini'): - raise RuntimeError('.mypy.ini not found where expected.') - - # Create a single shared temp dir - # (so that we can recycle our mypy cache). - if _tempdir is None: - # Eww; not cleaning up this temp dir (though the - # OS should eventually). Using TemporaryDirectory() gives us - # a warning though because we don't explicitly clean it up. - _tempdir = tempfile.mkdtemp() - # print(f"Created temp dir at {_tempdir.name}") - - # Copy our file into the temp dir with a unique name, find all - # instances of static_type_equals(), and run mypy type checks - # in those places to get static types. - tempfilepath = os.path.join(_tempdir, self.modulename + '.py') - with open(tempfilepath, 'w', encoding='utf-8') as outfile: - outfile.write(self.filter_file_contents(fdata)) - results = subprocess.run( - [ - PYTHON_BIN, '-m', 'mypy', '--no-error-summary', - '--config-file', '.mypy.ini', '--cache-dir', - os.path.join(_tempdir, '.mypy_cache'), tempfilepath - ], - capture_output=True, - check=False, - ) - - # HMM; it seems we always get an errored return code due to - # our use of reveal_type() so we can't look at that. - # However we can look for error notices in the output and fail there. - lines = results.stdout.decode().splitlines() - for line in lines: - if ': error: ' in line: - print('Full mypy output:\n', results.stdout.decode()) - raise RuntimeError('Errors detected in mypy output.') - if 'Revealed type is ' in line: - finfo = line.split(' ')[0] - fparts = finfo.split(':') - assert len(fparts) == 3 - linenumber = int(fparts[1]) - linetype = line.split('Revealed type is ')[-1][1:-1] - self.linetypes_mypy[linenumber] = linetype - - def filter_file_contents(self, contents: str) -> str: - """Filter the provided file contents and take note of type checks.""" - import ast - lines = contents.splitlines() - lines_out: list[str] = [] - for lineno, line in enumerate(lines): - if 'static_type_equals(' not in line: - lines_out.append(line) - else: - - # Find the location of the end parentheses. - assert ')' in line - endparen = len(line) - 1 - while line[endparen] != ')': - endparen -= 1 - - # Find the offset to the start of the line. - offset = 0 - while line[offset] == ' ': - offset += 1 - - # Parse this line as AST - we should find an assert - # statement containing a static_type_equals() call - # with 2 args. - try: - tree = ast.parse(line[offset:]) - except Exception: - raise RuntimeError( - f'{self._filename} line {lineno+1}: unable to ' - f'parse line (static_type_equals() call cannot' - f' be split across lines).') from None - assert isinstance(tree, ast.Module) - if (len(tree.body) != 1 - or not isinstance(tree.body[0], ast.Assert)): - raise RuntimeError( - f'{self._filename} line {lineno+1}: expected ' - f' a single assert statement.') - assertnode = tree.body[0] - # noinspection PyUnresolvedReferences - callnode = assertnode.test - if (not isinstance(callnode, ast.Call) - or not isinstance(callnode.func, ast.Name) - or callnode.func.id != 'static_type_equals' - or len(callnode.args) != 2): - raise RuntimeError( - f'{self._filename} line {lineno+1}: expected ' - f' a single static_type_equals() call with 2 args.') - - # Use the column offsets for the 2 args along with our end - # paren offset to cut out the substrings representing the args. - arg1 = line[callnode.args[0].col_offset + - offset:callnode.args[1].col_offset + offset] - while arg1[-1] in (' ', ','): - arg1 = arg1[:-1] - arg2 = line[callnode.args[1].col_offset + offset:endparen] - - # In our filtered file, replace the assert statement with - # a reveal_type() for the var, and also take note of the - # type they want it to equal. - self.linetypes_wanted[lineno + 1] = arg2 - lines_out.append(' ' * offset + f'reveal_type({arg1})') - - return '\n'.join(lines_out) + '\n' - - -def static_type_equals(value: Any, statictype: type | str | None) -> bool: - """Check a type statically using mypy. - - If a string is passed as statictype, it is checked against the mypy - output for an exact match. - If a type is passed, various filtering may apply when searching for - a match (for instance, if mypy outputs 'builtins.int*' it will match - the 'int' type passed in as statictype). - """ - import platform - from inspect import getframeinfo, stack - - # NOTE: don't currently support windows here; just going to always - # pass so we don't have to conditionalize all our individual test - # locations. - if platform.system() == 'Windows': - logging.debug('static_type_equals not supported on windows;' - ' will always pass...') - return True - - # We don't actually use there here; we pull them as strings from the src. - del value - - # Get the filename and line number of the calling function. - caller = getframeinfo(stack()[1][0]) - filename = caller.filename - linenumber = caller.lineno - - if filename not in _statictestfiles: - _statictestfiles[filename] = StaticTestFile(filename) - testfile = _statictestfiles[filename] - - mypytype = testfile.linetypes_mypy[linenumber] - - if isinstance(statictype, str): - # If they passed a string value as the statictype, - # do a comparison with the exact mypy value. - wanttype = statictype - else: - # If they passed a type object, things are a bit trickier because - # mypy's name for the type might not match the name we pass it in with. - # Try to do some filtering to minimize these differences... - wanttype = testfile.linetypes_wanted[linenumber] - del statictype - - # Do some filtering of Mypy types so we can compare - # to simple python ones. - - # (ie: 'builtins.list[builtins.int*]' -> int) - # Note to self: perhaps we'd want a fallback form where we can pass a - # type as a string if we want to match the exact mypy value?... - mypytype = mypytype.replace('*', '') - mypytype = mypytype.replace('?', '') - mypytype = mypytype.replace('builtins.int', 'int') - mypytype = mypytype.replace('builtins.float', 'float') - mypytype = mypytype.replace('builtins.list', 'List') - mypytype = mypytype.replace('builtins.bool', 'bool') - mypytype = mypytype.replace('typing.Sequence', 'Sequence') - - # So classes declared in the test file can be passed using base names. - # ie: temp3.FooClass -> FooClass - mypytype = mypytype.replace(testfile.modulename + '.', '') - - if wanttype != mypytype: - print(f'Mypy type "{mypytype}" does not match ' - f'the desired type "{wanttype}" on line {linenumber}.') - return False - - return True